/*
$Id: list.js,v 1.6 2004/03/09 16:54:04 fifa2k Exp $
m:多选方式
0不能多选,1ctrl shift多选,2拖选
r:是否能够重复
s:是否排序
*/
function xyList(o, m, r){
  this.item = new xyItemCollection;
  this.element = o;
  this.element.instance = this;
  this.type = "list";
  this.multiSelect = m || 0;this.repeatable = r || false;
  if(2 == this.multiSelect){
    this.element.onmousemove = xyList.eventHandlers.onmousemove;
    this.element.onmouseup = xyList.eventHandlers.onmouseup;
  }
  this.element.onmousedown = xyList.eventHandlers.onmousedown;
  this.element.ondblclick = xyList.eventHandlers.ondblclick;
  o.oncontextmenu = o.onselectstart = o.onselect = function(){return false;};
  this.string = "";
  this.lastClickedIndex = -1;
  this.enabled = true;
  this.eventListener = {
    onselectchange:null,
    ondblclick:null
  };
}
xyList.prototype.addEventListener = function(s,cb){
  var retval = false;
  switch(s){
    case "onselectchange":
    this.eventListener.onselectchange = cb; 
    break;
    case "ondblclick":
    this.eventListener.ondblclick = cb;
    break;
    default:break;
  }
  return true;
}

xyList.regAddslashes = function(s1){
  var repreg = /(\:|\\|\.|\(|\)|\[|\]\{|\}|\?|\^)/g;
  s1 = s1.replace(repreg,"\\$1");
  return s1;
}

xyList.prototype.enable = function(f){
  f = f || false;
  this.enabled = f;
  if(f){
    this.element.className = String(this.element.className).replace(/disabled/g, "");
  }else{
    this.element.className += " disabled";
  }
}

xyList.prototype.addItem = function(label, userData, icon){
  if("" == label) return false; 
  userData = userData || "";icon = icon || "";
  var reg = new RegExp(xyList.regAddslashes("," + label + ","),"g");
  if(!reg.test(this.string)){
    var o = new xyListItem(this, label, userData, icon);
    this.item.add(o);
    this.element.appendChild(o.element);
    o = null;
    this.string += "," + label + ",";
  }
}

xyList.prototype.removeItem = function(index){
  var o = this.item.item(index);
  if(null != o){
    var lastSelected = this.item.selectedIndex.toString();
    var reg = new RegExp(xyList.regAddslashes("," + o.label + ","), "g");
    this.string = this.string.replace(reg,",");
    this.item.remove(index);
    if(lastSelected != this.item.selectedIndex.toString() && 
		"function" == typeof this.eventListener.onselectchange){
      this.eventHandler.onselectchange(this);
    }
  }
}

xyList.prototype.clear = function(){
  this.item.clear();
  this.string = "";
}

function xyListItem(list, label, userData, icon){
  this.list = list;
  this.type = "listItem";
  this.element = new xyListItem.createElement(icon, label);
  this.element.className = "listItem";
  this.element.instance = this;
  this.index = -1;
  this.label = label;
  this.eventListener = {};
  this.userData = userData;
}

xyListItem.createElement = function(icon, label){
  var a = document.createElement("A");
  var br = document.createElement("NOBR");
  var t = document.createTextNode(label);
  if("" != icon){
    var img = document.createElement("IMG");
    br.appendChild(img);img = null;
  }
  br.appendChild(t);
  a.appendChild(br);
  t = null;
  return a;
}

xyListItem.prototype.onindexchange = function(n){
  this.index = n;
}

xyListItem.prototype.onselect = function(){
  this.element.className += " listItemSelected";
}

xyListItem.prototype.onblur = function(){
  this.element.className = "listItem";
}

xyListItem.prototype.destroy = function(){
  this.element.parentNode.removeChild(this.element);
  this.element = null;this.userData = null;
}

xyList.getReal = function(o){
  var e = o;
  while(null != e && "undefined" == typeof e.instance){
    e = e.parentNode;
  }
  return e;
}

xyList.eventHandlers = {
  //code from www.web-fx.info start
	// helpers to make events a bit easier
	getEvent:	function (e, el) {
		if (!e) {
			if (el)
				e = el.document.parentWindow.event;
			else
				e = window.event;
		}
		if (!e.srcElement) {
			var el = e.target;
			while (el != null && el.nodeType != 1)
				el = el.parentNode;
			e.srcElement = el;
		}
		if (typeof e.offsetX == "undefined") {
			e.offsetX = e.layerX;
			e.offsetY = e.layerY;
		}
		
		return e;
	},
	
	getDocument:	function (e) {
		if (e.target)
			return e.target.ownerDocument;
		return e.srcElement.document;
	},
	// end helpers
  //code from www.web-fx.info end
  onmouseup:  function(e){
		e = xyList.eventHandlers.getEvent(e, this);
    var listInstance = this.instance;
    if(1 != e.button) return;
    if(false == listInstance.enabled || 2!= listInstance.multiSelect) return;
    var el =     xyList.getReal(e.srcElement);
    xyList._moving = false;
    var srcInstance = el.instance;
    if("listItem" == srcInstance.type && !e.ctrlKey){
      listInstance.item.selectRange(listInstance.lastClickedIndex, srcInstance.index);
    }
  },
  _moving: false,
  ondblclick: function(e){
    e = xyList.eventHandlers.getEvent(e,this);
    var el =     xyList.getReal(e.srcElement);
    var srcInstance = el.instance;
    var listInstance = this.instance;
    if("listItem" == srcInstance.type){
      if(listInstance.eventListener.ondblclick){
        listInstance.eventListener.ondblclick(srcInstance);
      }
    }
  },
  onmousemove:function(e){
    e = xyList.eventHandlers.getEvent(e,this);
    var listInstance = this.instance;
    if(1 != e.button) return;
    if(false == listInstance.enabled || 2!= listInstance.multiSelect || true == xyList._moving) return;
    xyList._moving = true;
    var el = xyList.getReal(e.srcElement);
    var srcInstance = el.instance;
    if("listItem" == srcInstance.type){
      listInstance.item.selectRange(listInstance.lastClickedIndex, srcInstance.index);
    }
    setTimeout(function(){xyList._moving = false;},0);
  },
  onmousedown:function(e){
    e = xyList.eventHandlers.getEvent(e,this);
    var el =     xyList.getReal(e.srcElement);
    var srcInstance = el.instance;
    var listInstance = this.instance;
    if(false == listInstance.enabled) return;
    var b = e.button;
    if(_moz_ && 0 == b){
      b = 1;
    }
    if("listItem" == srcInstance.type){
      var lastSelection = listInstance.item.selectedIndex.toString();
      if( 1 == b){
        if(1 == listInstance.multiSelect || 2 == listInstance.multiSelect){
          if(e.ctrlKey){
            listInstance.item.toggle(srcInstance.index);
            listInstance.lastClickedIndex = srcInstance.index;
          }else if(e.shiftKey){
            listInstance.item.selectRange(listInstance.lastClickedIndex, srcInstance.index);
          }else{
            listInstance.item.select(srcInstance.index);
            listInstance.lastClickedIndex = srcInstance.index;
          }
        }else if(0 == listInstance.multiSelect){
            listInstance.item.select(srcInstance.index);
        }
      }
    }
    if(lastSelection != listInstance.item.selectedIndex.toString()){
      if(listInstance.eventListener.onselectchange){
        listInstance.eventListener.onselectchange(listInstance);
      }
    }
  }
}

