Ozein.ListBuilder = Class.create();
Ozein.ListBuilder.prototype = {
  _baseNode : null,
  initialize: function(node, options) {
    this.setOptions(options);
    this._baseNode = $('memCntSec');
    var parts = document.getElementsByAttribute('ozein_listbuilder', '*', node);
    if (node.getAttribute('ozein_listbuilder')) {
      parts.push(node);
    }
    for(var i=0; i<parts.length; ++i) {
      var partsName = parts[i].getAttribute('ozein_listbuilder');
      var funcName = 'set'+partsName;
      if (this[funcName]) this[funcName](parts[i]);
    }
    node.ListBuilder = this;
  },
  setOptions: function(options) {
    this.options = {
        closeEffect: Effect.Fade
    }
    Object.extend(this.options, options || {});
  },
  setSelected: function(node) {
    this.selected = node;
  },
  setAvailable: function(node) {
    this.available = node;
  },
  setUpMover: function(node) {
    Event.observe(node, 'click', this.moveItem.bindAsEventListener(this, -1));
  },
  setDownMover: function(node) {
    Event.observe(node, 'click', this.moveItem.bindAsEventListener(this, 1));
  },
  setSelector: function(node) {
    Event.observe(node, 'click', this.selectItem.bindAsEventListener(this));
  },
  setEliminator: function(node) {
    Event.observe(node, 'click', this.eliminateItem.bindAsEventListener(this));
  },
  setSetup: function(node) {
    Event.observe(node, 'click', this.setUpExec.bindAsEventListener(this, node));
  },
  setUpExec: function(e, node) {
    if (this.getListCount()<=0) {
        alert('少なくとも1項目は表示するように設定して下さい');
        return false;
    }
    var cols = this.getListItems().join(',');
    var bids = [];
    var bidNodes = this._baseNode.getElementsByClassName('b')
    for (var i= 0;i<bidNodes.length;i++) {
      bids.push(bidNodes[i].value);
    }
    if (this.options.closeEffect) {
      new this.options.closeEffect($('itemChange'));
    }else{
      $('itemChange').close();
    }
    MyList.Sidebar._evGetCompare(null, cols);
  },
  
  
  getListItems: function() {
    var items = new Array();
    for (var i=0; i<this.selected.length; ++i) {
      items.push(this.selected.options[i].value);
    }
    return items;
  },
  getListCount: function() {
    return this.selected.length;
  },
  moveItem: function(e, vector) {
    Event.stop(e);
    var node = this.selected;
    if (node.selectedIndex < 0) return;
    var swapIndex = node.selectedIndex + vector;
    if (swapIndex >= 0 && swapIndex < node.length) {
      var swapNode = node.options[swapIndex].cloneNode(true);
      node.remove(swapIndex);
      node.insertBefore(swapNode, node.options[swapIndex - vector]);
      setTimeout(this._setPos.bind(this, node, swapIndex), 1);
    }
  },
  _setPos: function(node, pos) {
    node.selectedIndex = pos;
  },
  selectItem: function(e) {
    Event.stop(e);
    this._jumpA2B(this.available, this.selected);
  },
  eliminateItem: function(e) {
    Event.stop(e);
    this._jumpA2B(this.selected, this.available);
  },
  _jumpA2B: function(a, b) {
    var selCnt = 0;
    var baseLen = b.length - 1;
    for (var i=0; i<b.length; ++i) {
      b.options[i].selected = false;
    }
    for (var i=0; i<a.length; ++i) {
      if (a.options[i].selected) {
        var item = a.options[i].cloneNode(true);
        item.setAttribute('selected', 'selected');
        try {
          b.add(item, null);
        } catch(ex) {
          b.appendChild(item);
        }
        selCnt++;
      }
    }
    if (selCnt) {
      for (var i=a.length-1; i>=0; --i) {
        if (a.options[i].selected) {
          a.remove(i);
        }
      }
    }
  }
}

