var checkboxlists = {
  init: function() {
    // Run the replace script on page load
    checkboxlists.addEvent(window, 'load', checkboxlists.replace, false);
  },
  replace: function() {
    var lists = document.getElementsByTagName("select");
    for (var i=0; i<lists.length; i++) {
      if (lists[i].getAttribute('multiple')) {
        if (lists[i].getElementsByTagName('optgroup').length == 0) {
          checkboxlists.initList(lists[i]);
        }
      }
    }
  },
  initList : function(list) {
    var holder = document.createElement("div");
    holder.className = 'checkboxlist';
    
    var items = list.getElementsByTagName("option");
    var link, label;
    for (var i=0; i<items.length; i++) {
      link = document.createElement("a");
      // Add the label (visible part)
      label = document.createElement("span");
      label.className = 'cb-label';
      label.appendChild(document.createTextNode(items[i].text));
      // Set the appropriate class name
      link.className = items[i].selected ? 'cb-checkbox cb-checked' : 'cb-checkbox';
      link.href = "#";
      link.appendChild(label);
      // Sink the event
      checkboxlists.addEvent(link, 'click', checkboxlists.makeClickHandler(link, items[i]), false);
      // Add to holder
      holder.appendChild(link);
    }
    
    list.parentNode.insertBefore(holder, list);
    list.style.display = 'none';
  },
  makeClickHandler : function(link, item) {
    return function(e) {
      item.selected = !item.selected;
      if (item.selected) {
        checkboxlists.addClassName(link, 'cb-checked');
      }
      else {
        checkboxlists.removeClassName(link, 'cb-checked');
      }
      checkboxlists.cancelClick(e);
    };
  },
  removeClassName : function(el, cls) {
    var old_classes = el.className.split(' ');
    var new_classes = [];
    for (var i=0; i<old_classes.length; i++) {
      if (old_classes[i] != cls) {
        new_classes[new_classes.length] = old_classes[i];
      }
    }
    el.className = new_classes.join(' ');
  },
  addClassName : function(el, cls) {
    var old_classes = el.className.split(' ');
    var new_classes = [];
    for (var i=0; i<old_classes.length; i++) {
      if (old_classes[i] == cls) { return; }
      new_classes[new_classes.length] = old_classes[i];
    }
    new_classes[new_classes.length] = cls;
    el.className = new_classes.join(' ');
  },
	getTarget:function(e){
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target){return false;}
		while(target.nodeType!=1 && target.nodeName.toLowerCase()!='body'){
			target=target.parentNode;
		}
		return target;
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener)
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	}
};
checkboxlists.init();