Array.prototype.shuffle = function() {
    var i = this.length;
    while(i){
        var j = Math.floor(Math.random()*i);
        var t = this[--i];
        this[i] = this[j];
        this[j] = t;
    }
    return this;
};

function shuffle(id, item_tag) {
  var list = $(id);
  var items = [];
  var indexes = [];
  var item_tag = item_tag || 'li';
  
  var tag_regexp = new RegExp(item_tag, 'i');
  
  while(list.hasChildNodes()) {
    if ((list.firstChild.tagName || "").match(tag_regexp)) {
      items.push(list.firstChild.cloneNode(true));
    }
    list.removeChild(list.firstChild);
  }

  var random = null;
  for(var i=0 ; i < items.length ; i++) {
    do {
      random = Math.floor(Math.random() * items.length);
    } while (indexes.contains(random))
    
    indexes.push(random);
  }
  
  for(var i=0 ; i < indexes.length ; i++) {
    list.appendChild(items[indexes[i]]);
  }
};

function choice(id, size, item_tag) {
  var list = $(id);
  var items = [];
  var indexes = [];
  var size = size || 1;
  var item_tag = item_tag || 'li';
  
  var tag_regexp = new RegExp(item_tag, 'i');
  
  while(list.hasChildNodes()) {
    if ((list.firstChild.tagName || "").match(tag_regexp)) {
      items.push(list.firstChild.cloneNode(true));
    }
    list.removeChild(list.firstChild);
  }

  items.shuffle();
  for (var i=0 ; i < size ; i++) {
    list.appendChild(items.pop());
  }
}

function shuffleTable(id, reject, generate, item_tag) {
  var top = $(id);
  
  var reject = reject || function(items) {return items};
  var fallback = fallback || '';
  var item_tag = item_tag || 'a';
  
  var tag_regexp = new RegExp(item_tag, 'i');

  // elm#getElements was not work
  var collect = function(parent, tag_regexp) {
    var ret = [];

    var children = parent.childNodes;
    for (var i=0 ; i < children.length ; i++) {
      var child = children[i];
      if ((child.tagName || "").match(tag_regexp)) {
        ret.push(child.cloneNode(true));
      }
      else {
        if (child.tagName) {
          var r = collect(child, tag_regexp);
          for(var j=0; j < r.length ; j++) {
            ret.push(r[j]);
          }
        }
      }
    };
    
    return ret;
  }
  
  var items = collect(top, tag_regexp);
  var length = items.length;
  
  items = reject(items);

  items = items.shuffle();
  
  while(top.hasChildNodes()) {
    top.removeChild(top.firstChild);
  }
  
  generate(top, length, items);
};

function reject_for_shuffle(items) {
  var ret = [];
  for (var i=0 ; i < items.length ; i++) {
    if (!items[i].href.match(/ad\.html$/)) {
      ret.push(items[i])
    }
  }
  return ret;
};

function generate_for_shuffle(cols, fallback) {
  return function(top, length, items) {
    var tbody = document.createElement('tbody');
    for (var i=0; i < Math.ceil(length / cols) ; i++) {
      var tr = document.createElement('tr');
      for (var c=0 ; c < cols ; c++) {
        var td = document.createElement('td');
        var item = items[(i * cols) + c];
        if (item) {
          td.appendChild(item);
        }
        else {
          td.innerHTML = fallback;
        }
        tr.appendChild(td);
      };
      tbody.appendChild(tr);
    }
    top.appendChild(tbody);
  };
}

function shuffleLargeMiddle(id) {
  var fb = '<a href="ad.html"><img src="images/banner/link_wanted_lm.jpg" width="400" height="40" alt="相互リンク募集中" /></a>';
  shuffleTable(id, reject_for_shuffle, generate_for_shuffle(2, fb));
}

function shuffleMiddle(id) {
  var fb = '<a href="ad.html"><img src="images/banner/link_wanted.jpg" width="200" height="40" alt="相互リンク募集中" /></a>';
  shuffleTable(id, reject_for_shuffle, generate_for_shuffle(4, fb));
};

function shuffleSmall(id) {
  var fb = '<a href="ad.html"><img src="images/banner/link_wanted_s.jpg" width="88" height="31" alt="相互リンク募集中" /></a>';
  shuffleTable(id, reject_for_shuffle, generate_for_shuffle(8, fb));
}
