//addEvent(window, 'load', function(){initSelectbox('list1','list2','lockedItems','addItemBtn','removeItemBtn','itemUpBtn','itemDownBtn')});

//add event function
function addEvent(obj, evType, fn){ 
 if (obj.addEventListener){ 
   obj.addEventListener(evType, fn, true); 
   return true; 
 } else if (obj.attachEvent){ 
   var r = obj.attachEvent("on"+evType, fn); 
   return r; 
 } else { 
   return false; 
 } 
}
function removeEvent(obj, evType, fn){
  if(obj.removeEventListener){
    obj.removeEventListener(evType, fn, false);
    return true;
  }
  else if(obj.detachEvent){
    return obj.detachEvent("on" + evType, fn);
  }
  else{
    return false;
  }
}

function initSelectbox(list1_,list2_,lockedItems,addItemBtn,removeItemBtn,itemUpBtn,itemDownBtn){	
	var list1 = Selectbox.$(list1_)
	var list2 = Selectbox.$(list2_)
	var lockedItems = Selectbox.$(lockedItems)		
	Selectbox.$(addItemBtn).onclick = function(){Selectbox.moveSelectedOptions(list1,list2,false,lockedItems.value)}
	Selectbox.$(removeItemBtn).onclick = function(){Selectbox.moveSelectedOptions(list2,list1,true,lockedItems.value)}
	Selectbox.$(list1_).ondblclick = function(){Selectbox.moveSelectedOptions(list1,list2,false,lockedItems.value)}
	Selectbox.$(list2_).ondblclick = function(){Selectbox.moveSelectedOptions(list2,list1,false,lockedItems.value)}
	Selectbox.$(itemUpBtn).onclick = function(){Selectbox.moveOptionUp(list2)}
	Selectbox.$(itemDownBtn).onclick = function(){Selectbox.moveOptionDown(list2)}
};

var Selectbox = {};

Selectbox.$ = function (strId){
	return document.getElementById(strId);
}

Selectbox.hasOptions = function(obj) {
  return (obj!=null && typeof(obj.options)!="undefined" && obj.options!=null);
}

Selectbox.selectUnselectMatchingOptions = function(obj,regex,which,only) {
  if (window.RegExp) {
    if (!this.hasOptions(obj)) { return false; }
    if (typeof(only)=="undefined" || only==null) { var only = false; }
    var re = new RegExp(regex);
    for (var i=0; i<obj.options.length; i++) {
      if (re.test(obj.options[i].text)) {
        obj.options[i].selected = (which=="select");
      }
      else if (only) {
        obj.options[i].selected = (which=="unselect");
      }
    }
    return true;
  }
  return false;
}

Selectbox.unselectOptions = function(obj,regex) {
  return this.selectUnselectMatchingOptions(obj,regex,"unselect",false);
}

Selectbox.sort = function(obj) {
  var o = new Array();
  if (!this.hasOptions(obj)) { return false; }
  for (var i=0; i<obj.options.length; i++) {
    o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
  }
  if (o.length==0) { return true; }
  o = o.sort( 
    function(a,b) { 
      if ((a.text+"") < (b.text+"")) { return -1; }
      if ((a.text+"") > (b.text+"")) { return 1; }
      return 0;
    } 
  );

  for (var i=0; i<o.length; i++) {
    obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
  }
  return true;
}

Selectbox.swapOptions = function(obj,i,j) {
  if (!this.hasOptions(obj)) { return false; }
  var o = obj.options;
  if (i<0 || i>=o.length || j<0 || j>=o.length) { return false; }
  var i_selected = o[i].selected;
  var j_selected = o[j].selected;
  var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
  var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
  o[i] = temp2;
  o[j] = temp;
  o[i].selected = j_selected;
  o[j].selected = i_selected;
  return true;
}

Selectbox.moveSelectedOptions = function(from,to) {
  if (!this.hasOptions(from)) { return false; }
  // Unselect matching options, if required
  if (arguments.length>3) {
    var regex = arguments[3];
    if (regex != "") {
      if (!this.unselectOptions(from,regex)) {
        return false;
      }
    }
  }
  // Move them over
  for (var i=0; i<from.options.length; i++) {
    var o = from.options[i];
    if (o.selected) {
      if (!this.hasOptions(to)) { 
        var index = 0; 
      } 
      else { 
        var index=to.options.length; 
      }
      to.options[index] = new Option(o.text, o.value, false, false);
    }
  }
  // Delete them from original
  for (var i=(from.options.length-1); i>=0; i--) {
    var o = from.options[i];
    if (o.selected) {
      from.options[i] = null;
    }
  }
  if (arguments[2] == true) {
    //this.sort(from);
    this.sort(to);
  }
  from.selectedIndex = -1;
  to.selectedIndex = -1;

  return true;
}

Selectbox.moveOptionUp = function(obj) {
  if (!this.hasOptions(obj)) { return false; }
  for (i=0; i<obj.options.length; i++) {
    if (obj.options[i].selected) {
      if (i>0 && !obj.options[i-1].selected) {
        this.swapOptions(obj,i,i-1);
        obj.options[i-1].selected = true;
      }
    }
  }
  return true;
}

Selectbox.moveOptionDown = function(obj) {
  if (!this.hasOptions(obj)) { return false; }
  for (i=obj.options.length-1; i>=0; i--) {
    if (obj.options[i].selected) {
      if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
        this.swapOptions(obj,i,i+1);
        obj.options[i+1].selected = true;
      }
    }
  }
  return true;
}
