/*
 coded by Kae - kae@verens.com
 I'd appreciate any feedback.
 You have the right to include this in your sites.
 Please retain this notice.
*/

/* edit these variables to customise the multiselect */ {
 var show_toplinks=true;
}

/* global variables - do not touch */ {
 var isIE=window.attachEvent?true:false;
 var selectDefaults=[];
}
function addEvent(el,ev,fn){
 if(isIE)el.attachEvent('on'+ev,fn);
 else if(el.addEventListener)el.addEventListener(ev,fn,false);
}
function buildMultiselects(){
 //do{
  found=0;
  sels= $A(document.getElementsByTagName('select'));
	len = sels.length + 0;

  for(b=0;b<len;b++){
   //if(ms==null)break;
   if(sels[b].multiple && $(sels[b]).hasClassName('nomultiple') == false){
	  makeCheckbox(sels[b]);
	 }
  }
 //}while(found);
}
function multiselect_selectall(name,val){
 var els=document.getElementsByTagName('input'),found=0;
 for(var i=0;i<els.length;++i){
  if(els[i].name==name+'[]' || els[i].name==name){
   els[i].checked=val=='reset'?selectDefaults[name][found++]:val;
   highlight_label2(els[i]);
  }
 }
}

function makeCheckbox(ms){
 	var name=ms.name.substring(0,ms.name.length-2);
   /* common variables */ {
   selectDefaults[name]=[];
   var found=1,disabled=ms.disabled?1:0,width=$(ms).getWidth(),height=$(ms).getHeight();

		if (!height && ms.style.height){
			height = parseFloat(ms.style.height);
		}

		if (!width && ms.style.width){
			width = parseFloat(ms.style.width);
		}

   if(width<120)width=150;
   if(height<60)height=100;
  }
  /* set up wrapper */ {
   var wrapper=document.createElement('div');
   wrapper.style.width=width+"px";
   wrapper.style.height=height+"px";
   wrapper.style.position='relative';
   wrapper.style.border="2px solid #000";
   wrapper.style.borderColor="#333 #ccc #ccc #333";
   wrapper.style.font="10px sans-serif";
  }
  if(show_toplinks){ /* reset, all, none */
   wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','checked');"),'all'));
   wrapper.appendChild(document.createTextNode(', '));
   wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','');"),'none'));
   wrapper.appendChild(document.createTextNode(', '));
   wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','reset');"),'reset'));
  }
  /* setup multiselect */ {
   newmultiselect=document.createElement('div');
   newmultiselect.style.position='absolute';
   newmultiselect.style.top=show_toplinks?'15px':'0';
 newmultiselect.style.left='0';
   newmultiselect.style.overflow='auto';
   newmultiselect.style.width=(isIE?width-4:width)+"px";
   newmultiselect.style.height=show_toplinks?height-(isIE?19:15)+"px":height+'px';
  }
  c=ms.getElementsByTagName('option');
  for(d=0;d<c.length;d++){
 var label=document.createElement('label');
   label.style.display="block";
   label.style.padding="0px";
   label.style.border="1px solid #EEEEEE";
   label.style.borderWidth = "0 0 1px 0";
   //label.style.fontSize = "10pt";
 label.style.fontWeight = 'normal';
 label.style.paddingLeft = "20px";
 label.style.paddingRight = "3px";
   checkbox=document.createElement('input');
   checkbox.type="checkbox";
  addEvent(checkbox, 'click', highlight_label);
   if(c[d].selected){
    checkbox.checked="checked";
    checkbox.defaultChecked=true;
   }
   if(c[d].disabled){
    checkbox.disabled='disabled';
    label.style.color='#666666';
   }
   selectDefaults[name][d]=c[d].selected?'checked':'';
   if(disabled)checkbox.disabled="disabled";
   checkbox.value=c[d].value;
   checkbox.id=c[d].id;
 checkbox.className = "checkbox";
   checkbox.style.marginLeft="-16px";
   checkbox.name=ms.name;
   checkbox.style.verticalAlign = 'middle';
 label.htmlFor = checkbox.id;

   // escape the label
   var text=c[d].innerHTML;
   text=text.replace(/\&nbsp;?/g,' ');
   text=text.replace(/\&lt;?/g,'<');
   text=text.replace(/\&gt;?/g,'>');

   labelText=document.createTextNode(text);
   label.appendChild(checkbox);
   label.appendChild(labelText);
   newmultiselect.appendChild(label);

 // Highlight label when checkbox is checked
 highlight_label2(checkbox);

  }
 wrapper.appendChild(newmultiselect);
 ms.parentNode.insertBefore(wrapper,ms);

 //ms.name = 'obselete_' + ms.name;
 ms.parentNode.removeChild(ms);
}


function newLink(href,text){
 var e=document.createElement('a');e.href=href;e.appendChild(document.createTextNode(text));return e;
}

/**
 * Highlight parent element from event source.
 *
 * @param evt Event
 */
function highlight_label(pEvent) {

	pEvent = (pEvent) ? pEvent : ((window.event) ? window.event : "")
  	if (!pEvent) {
      return
  	}

	lElement = (pEvent.target) ? pEvent.target : pEvent.srcElement
	highlight_label2(lElement);
}

/**
 * Highlight parent element.
 *
 * @param pCheckbox Checkbox node
 */
function highlight_label2(pElement) {

	lCheckbox = '';
	lLabel = '';
	if (pElement.tagName == 'LABEL') {
		lCheckbox = pElement.firstChild;
		lLabel = pElement;
	}
	if (pElement.tagName == 'INPUT') {
		lCheckbox = pElement;
		lLabel = pElement.parentNode;
	}

	if (!lCheckbox || !lLabel || lCheckbox.tagName != 'INPUT' || lLabel.tagName != 'LABEL') {

		alert('Invalid element type!: ' + lCheckbox + ', ' + lLabel);
		return;
	}

    if (lCheckbox.checked) {
		lLabel.style.backgroundColor='#3195D1';
		lLabel.style.color='#FFFFFF';
	}
	else {
		lLabel.style.backgroundColor='#F4F4F4';
		lLabel.style.color='#000000';
	}
}

addEvent(window,'load',buildMultiselects);