
function moveOption(source,dest) {
  var index = source.options.selectedIndex;
  if(index > -1) {
    var newpos = binarySearch(dest,source.options[index].text);
    rightShift(dest,newpos,dest.options.length);
    addOptionAt(dest,source.options[index].text,source.options[index].value,newpos);
    deleteOption(source,index);
  }
}

function moveAllOptions(which,source,dest) {
  var max = source.options.length;
  while (source.options.length > 0) {
    addOption(dest,source.options[0].text,source.options[0].value);
    deleteOption(source,0);
  }
  sortOptions(dest);
  sortOptions(source);
}

function deleteOption(object,index) {
  //if(index < object.options.length - 1) object.selectedIndex = index + 1;
  object.options[index] = null;
  if(object.options.length > 0) object.selectedIndex = index;
}

function addOption(object,text,value) {
  var defaultSelected = false;
  var selected = false;
  var optionName = new Option(text,value,defaultSelected,selected)
  object.options[object.length] = optionName;
  object.options[object.length - 1].selected = false;
}

function addOptionAt(object,text,value,pos) {
  var defaultSelected = false;
  var selected = false;
  var optionName = new Option(text,value,defaultSelected,selected)
  object.options[pos] = optionName;
  object.selectedIndex = pos;
}

function sortOptions(what) {
  var copyOption = new Array();
  for (var i = 0; i < what.options.length; i++) copyOption[i] = new Array(what[i].text,what[i].value);
  copyOption.sort();
  for (var i = what.options.length - 1; i > -1; i--) deleteOption(what,i);
  for (var i = 0; i < copyOption.length; i++) addOption(what,copyOption[i][0],copyOption[i][1])
}

function selectAllOptions(which) {
  var max = which.options.length;
  for (var i = 0; i < max; i++) which.options[i].selected = true;
}

function binarySearch(what,elem) {
  var left = 0;
  var right = what.options.length;
  for (var pos = Math.floor((left + right) / 2); left < right; pos = Math.floor((left + right) / 2)) {
    if (elem >= what.options[pos].text) left = pos + 1;
    else right = pos;
  }
  return left;
}

function rightShift(array,left,right) {
  var optionName = new Option('empty','0',false,false);
  array.options[right] = optionName;
  array.options[right].selected = false;
  for (j = right; j > left; j--) {
    array.options[j].text = array.options[j - 1].text;
    array.options[j].value = array.options[j - 1].value;
  }
}
