DHTMLCheckbox = function(nodeObj,boxType) {
//alert("DHTMLCheckbox(" + nodeObj.nodeName + "," + boxType + ")");
  if ((nodeObj.nodeName.toLowerCase() == "img") && ((DHTMLCheckbox.caller === DHTMLCheckbox.addElement) || (window.opera) || (navigator.userAgent.toLowerCase().indexOf("safari") != -1))) {
    var styleName, styleList = [];
    for (styleName in DHTMLCheckbox.style) {
      if (!DHTMLCheckbox.prototype[styleName]) {
        styleList[styleList.length] = [styleName,nodeObj.className.lastIndexOf(" " + styleName)];
      }
    }
    styleList.sort(function(a,b){return(a[1]-b[1]);}).reverse();

    this.constructor = arguments.callee; // not only due to safari that does not expose an objects konstructor if it was not explicitely set, but also because its a more defense programming style;
    this.setSelfReference();

    this.node = nodeObj;
    this.type = boxType;
    this.style = (((styleList.length === 0) || (styleList[0][1] == -1)) ? (boxType) : (styleList[0][0]));

    styleName = null; styleList = null;
    delete styleName; delete styleList;

    var getParentFormNode = function(currNode) {
      while (currNode && currNode.nodeType && (currNode.nodeType == 1) && currNode.nodeName && (currNode.nodeName.toLowerCase() != "form")) {
        currNode = currNode.parentNode;
      }
      return currNode;
    };
    var titleValue = this.node.title.basicTrim();
    var formNode;
    var formName = ((/^([a-zA-Z0-9_]{1,})\./.test(titleValue)) ? (/^([a-zA-Z0-9_]{1,})\./.exec(titleValue)[1]) : (null));
    var collectorName = ((/\b([a-zA-Z0-9_]{1,})\s*\=/.test(titleValue)) ? (/\b([a-zA-Z0-9_]{1,})\s*\=/.exec(titleValue)[1]) : (null));
    if (collectorName) {
    //var elementValue = ((/\=\s*([a-zA-Z0-9_ \t'"-]{1,})/.test(titleValue)) ? (/\=\s*([a-zA-Z0-9_ \t'"-]{1,})/.exec(titleValue)[1]) : (""));
	  var elementValue = ((/\=\s*([^\[]{1,})/.test(titleValue)) ? (/\=\s*([^\[]{1,})/.exec(titleValue)[1]) : (""));
      var elementName = null;
    } else {
    //var elementValue = ((/([a-zA-Z0-9_ \t'"-]{1,})/.test(titleValue)) ? (/([a-zA-Z0-9_ \t'"-]{1,})/.exec(titleValue)[1]) : (""));
      var elementValue = ((/([^\[]{1,})/.test(titleValue)) ? (/([^\[]{1,})/.exec(titleValue)[1]) : (""));
      var elementName = this.node.name;
    }
    elementValue = elementValue.replace(/''/g,"");
    elementValue = elementValue.replace(/""/g,"");
    var elementStatus = ((/\[([a-zA-Z, \t]{1,})\]$/.test(titleValue)) ? (/\[([a-zA-Z, \t]{1,})\]$/.exec(titleValue)[1].replace(/,/g," ").superTrim().toLowerCase().split(" ").sort().getNormalized().join(" ")) : (""));
    var deselection = ((/\bnodeselect\b/.test(elementStatus)) ? (false) : (true));
    elementStatus = elementStatus.replace(/\bnodeselect\b/,"").superTrim();
    var carryOver = ((elementStatus == "checked disabled") ? (true) : (false));
    elementStatus = elementStatus.replace(/\bchecked disabled\b/,"disabled");
    elementStatus = (((elementStatus == "checked") || (elementStatus == "disabled")) ? (elementStatus) : ("regular"));
    carryOver = (carryOver || (elementStatus != "disabled"));

    if (formName) {
      formNode = document.forms[formName];
      formNode = ((isNode(formNode)) ? (formNode) : (getParentFormNode(this.node.parentNode)));
    } else {
      formNode = getParentFormNode(this.node.parentNode);
    }
    this.formNode = formNode;

    if (arguments.length == 6) {
      var elementNode = ((isNode(arguments[2])) ? (arguments[2]) : (null));
    } else {
      var elementNode = this.getInputElementsByName(elementName?elementName:collectorName);
    }
    if (!elementNode && this.formNode.appendChild && document.createElement) {
      elementNode = document.createElement("input");
      elementNode.setAttribute("name",(elementName?elementName:collectorName));
      elementNode.setAttribute("type","hidden");
      elementNode.setAttribute("value","");
      elementNode.name = (elementName?elementName:collectorName);
      elementNode.type = "hidden";
      elementNode.value = "";

      this.formNode.appendChild(elementNode);
    }
    this.elementNode = elementNode;
    this.elementValue = elementValue;
    this.elementStatus = elementStatus;
    this.accumulateValues = ((collectorName) ? (true) : (false));
    this.deselection = deselection;
    this.carryOver = carryOver;

    titleValue = null; getParentFormNode = null; formNode = null; formName = null; elementNode = null; elementName = null; elementValue = null; elementStatus = null; collectorName = null; deselection = null; carryOver = null;
    delete titleValue; delete getParentFormNode; delete formNode; delete formName; delete elementNode; delete elementName; delete elementValue; delete elementStatus; delete collectorName; delete deselection; delete carryOver;

    if (this.elementStatus != "regular") {
      if (this.accumulateValues) {
        this.elementNode.value = (this.elementNode.value + "," + this.elementValue).basicTrim().replace(/,+/g,",").replace(/^,/,"").replace(/,$/,"").split(",").sort().getNormalized().join(",");
      } else {
        this.elementNode.value = this.elementValue;
      }
    }
  //alert("DHTMLCheckbox.style[" + this.style + "][" + this.elementStatus +"] = " + DHTMLCheckbox.style[this.style][this.elementStatus] + "\nDHTMLCheckbox.style[" + this.style + "][" + this.elementStatus +"].src = " + DHTMLCheckbox.style[this.style][this.elementStatus].src);
    // this.node.src = DHTMLCheckbox.style[this.style][this.elementStatus].src;
    // this.node.style.width = DHTMLCheckbox.style[this.style].regular.width + "px";
    // this.node.style.height = DHTMLCheckbox.style[this.style].regular.height + "px";
    this.node.id = "";
    this.node.name = "";
    // this.node.className = (this.node.className.superTrim() + " " + this.style).split(" ").getNormalized().join(" ");

    this.additionalMouseoverTasks = ((isFunction(this.node.onmouseover)) ? (this.node.onmouseover) : (null));
    this.additionalMouseoutTasks = ((isFunction(this.node.onmouseout)) ? (this.node.onmouseout) : (null));
    this.additionalClickTasks = ((isFunction(this.node.onclick)) ? (this.node.onclick) : (null));
    if (arguments.length == 6) {
      this.additionalMouseoverTasks = ((isString(arguments[3])) ? (new Function(arguments[3])) : (null));
      this.additionalMouseoutTasks = ((isString(arguments[4])) ? (new Function(arguments[4])) : (null));
      this.additionalClickTasks = ((isString(arguments[5])) ? (new Function(arguments[5])) : (null));
    }
    this.node.onmouseover = null;
    this.node.onmouseout = null;
    this.node.onclick = null;

    if (document.all || window.opera) {
      this.node.attachEvent("onmouseover",DHTMLCheckbox.mouseOver);
      this.node.attachEvent("onmouseout",DHTMLCheckbox.mouseOut);
      this.node.attachEvent("onclick",DHTMLCheckbox.click);
    } else {
      this.node.addEventListener("mouseover",DHTMLCheckbox.mouseOver,true);
      this.node.addEventListener("mouseout",DHTMLCheckbox.mouseOut,true);
      this.node.addEventListener("click",DHTMLCheckbox.click,true);
    }
  } else {
    return null;
  }
};
DHTMLCheckbox.prototype.getInputElementsByName = function(elementName) {
  var elementNode = this.formNode.elements[elementName];
  var currentNode;
  var nodeCollection = [];
  if (elementNode) {
    if (elementNode.length) {
      for (var i=0; i<elementNode.length; i++) {
        currentNode = elementNode[i];
        if (currentNode.type && ((/text/i).test(currentNode.type) || (/password/i).test(currentNode.type) || (/hidden/i).test(currentNode.type) || (/radio/i).test(currentNode.type) || (/checkbox/i).test(currentNode.type))) {
          nodeCollection[nodeCollection.length] = currentNode;
        }
      }
    } else {
      if (elementNode.type && ((/text/i).test(elementNode.type) || (/password/i).test(elementNode.type) || (/hidden/i).test(elementNode.type) || (/radio/i).test(elementNode.type) || (/checkbox/i).test(elementNode.type))) {
        nodeCollection[nodeCollection.length] = elementNode;
      }
    }
  }
  if (document.all && !window.opera) {
    var boxName,boxObj;
    for (boxName in DHTMLCheckbox.elements) {
      boxObj = DHTMLCheckbox.elements[boxName];
      if (boxObj.length) {
        for (i = 0; i<boxObj.length; i++) {
          if (boxObj[i].elementNode && (boxObj[i].elementNode.name == elementName)) {
            nodeCollection[nodeCollection.length] = boxObj[i].elementNode;
          }
        }
      } else if (boxObj.elementNode && (boxObj.elementNode.name == elementName)) {
        nodeCollection[nodeCollection.length] = boxObj.elementNode;
      }
    }
    nodeCollection.normalize();
  }
  return ((nodeCollection.length >= 2) ? (nodeCollection) : ((nodeCollection.length == 1) ? (nodeCollection[0]) : (null)));
};
DHTMLCheckbox.prototype.getRadioCollection = function() {
  var i,boxName,boxObj,isCollection = false;
  if (this.type == "radiobox") {
    for (boxName in DHTMLCheckbox.elements) {
      boxObj = DHTMLCheckbox.elements[boxName];
      if (boxObj.length) {
        for (i=0; i<boxObj.length; i++) {
          if (boxObj[i] === this) {
            isCollection = true;
            break;
          }
        }
        if (isCollection) {
          break;
        }
      }
    }
  }
  return ((boxObj) ? (boxObj) : (null));
};
DHTMLCheckbox.getObjectByEvent = function(evt) {
  evt = ((window.event) ? (window.event) : (evt));
  var boxNode = ((evt.target) ? (evt.target) : (evt.srcElement));
  var boxObj = null;
  for (var i=0; i<Object.selfReferences.length; i++) {
    if (Object.selfReferences[i].node == boxNode) {
      boxObj = Object.selfReferences[i];
      break;
    }
  }
  return boxObj;
};
DHTMLCheckbox.mouseOver = function(evt) {
  var boxObj = DHTMLCheckbox.getObjectByEvent(evt);
  if ((boxObj.elementStatus != "disabled") && ((boxObj.elementStatus != "checked") || boxObj.deselection)) {
    boxObj.node.src = DHTMLCheckbox.style[boxObj.style][((boxObj.elementStatus == "checked") ? ("disabled") : ("hover"))].src;
    if (isFunction(boxObj.additionalMouseoverTasks)) {
      boxObj.additionalMouseoverTasks();
    }
  }
};
DHTMLCheckbox.mouseOut = function(evt) {
  var boxObj = DHTMLCheckbox.getObjectByEvent(evt);
  if ((boxObj.elementStatus != "disabled") && ((boxObj.elementStatus != "checked") || boxObj.deselection)) {
    boxObj.node.src = DHTMLCheckbox.style[boxObj.style][boxObj.elementStatus].src;
    if (isFunction(boxObj.additionalMouseoutTasks)) {
      boxObj.additionalMouseoutTasks();
    }
  }
};
DHTMLCheckbox.click = function(evt) {
  var boxObj = DHTMLCheckbox.getObjectByEvent(evt);
  if (boxObj.elementStatus != "disabled") {
    var radioCollection = boxObj.getRadioCollection();
    var clickTaskProof = (((boxObj.elementStatus != "checked") && !boxObj.deselection) || boxObj.deselection);
    var i, removeValue = "";
    if ((boxObj.elementStatus == "checked") && boxObj.deselection) {
      removeValue = boxObj.elementValue;
      if (radioCollection) {
        for (i=0; i<radioCollection.length; i++) {
          if (radioCollection[i].elementStatus != "disabled") {
            radioCollection[i].elementStatus = "regular";
            radioCollection[i].node.src = DHTMLCheckbox.style[radioCollection[i].style].regular.src;
          }
        }
      } else {
        boxObj.elementStatus = "regular";
        boxObj.node.src = DHTMLCheckbox.style[boxObj.style].regular.src;
      }
      if (boxObj.accumulateValues && !radioCollection) {
        boxObj.elementNode.value = boxObj.elementNode.value.basicTrim().replace(new RegExp("((\\b" + removeValue + "\\b)|(" + removeValue + "\\b))","g"),"").replace(/,+/g,",").replace(/^,/,"").replace(/,$/,"").split(",").sort().getNormalized().join(",");
      } else {
        boxObj.elementNode.value = "";
      }
    } else {
      if (radioCollection) {
        for (i=0; i<radioCollection.length; i++) {
          if ((radioCollection[i].elementStatus == "checked") && clickTaskProof) {
            removeValue = radioCollection[i].elementValue;
          }
          if (radioCollection[i].elementStatus != "disabled") {
            radioCollection[i].elementStatus = "regular";
            radioCollection[i].node.src = DHTMLCheckbox.style[radioCollection[i].style].regular.src;
          }
        }
      }
      boxObj.elementStatus = "checked";
      boxObj.node.src = DHTMLCheckbox.style[boxObj.style].checked.src;
      if (boxObj.accumulateValues && !radioCollection) {
        boxObj.elementNode.value = (boxObj.elementNode.value + "," + boxObj.elementValue).basicTrim().replace(new RegExp("((\\b" + removeValue + "\\b)|(" + removeValue + "\\b))","g"),"").replace(/,+/g,",").replace(/^,/,"").replace(/,$/,"").split(",").sort().getNormalized().join(",");
      } else {
        boxObj.elementNode.value = boxObj.elementValue;
      }
    }
    if (radioCollection) {
      for (i=0; i<radioCollection.length; i++) {
        if (radioCollection[i].elementStatus == "checked") {
          radioCollection.selectedIndex = i;
        }
      }
    }
    if (isFunction(boxObj.additionalClickTasks) && clickTaskProof) {
      boxObj.additionalClickTasks();
    }
  }
};
DHTMLCheckbox.elements = {};

DHTMLCheckbox.addElement = function(nodeObj) {
  if ((document.forms.length >= 1) && isNode(nodeObj) && isString(nodeObj.className) && (/\bdhtmlCheckbox\b/.test(nodeObj.className)) && isString(nodeObj.name) && (nodeObj.name !== "") && isString(nodeObj.title) && (nodeObj.title !== "")) {
    var boxObj = DHTMLCheckbox.elements[nodeObj.name];
    if (isConstructedObject(boxObj) && (boxObj.constructor === DHTMLCheckbox)) {
      var existingInputElement, additionalMouseoverTasks, additionalMouseoutTasks, additionalClickTasks;
      if (isNode(boxObj.elementNode)) {
        existingInputElement = boxObj.elementNode;
      }
      if (isFunction(boxObj.additionalMouseoverTasks)) {
        additionalMouseoverTasks = boxObj.additionalMouseoverTasks.toString().superTrim();
        additionalMouseoverTasks = ((/\{(.*)\}/.test(additionalMouseoverTasks)) ? (/\{(.*)\}/.exec(additionalMouseoverTasks)[1]) : (null));
      }
      if (isFunction(boxObj.additionalMouseoutTasks)) {
        additionalMouseoutTasks = boxObj.additionalMouseoutTasks.toString().superTrim();
        additionalMouseoutTasks = ((/\{(.*)\}/.test(additionalMouseoutTasks)) ? (/\{(.*)\}/.exec(additionalMouseoutTasks)[1]) : (null));
       }
      if (isFunction(boxObj.additionalClickTasks)) {
        additionalClickTasks = boxObj.additionalClickTasks.toString().superTrim();
        additionalClickTasks = ((/\{(.*)\}/.test(additionalClickTasks)) ? (/\{(.*)\}/.exec(additionalClickTasks)[1]) : (null));
      }
      if (document.all || window.opera) {
        boxObj.node.detachEvent("onmouseover",DHTMLCheckbox.mouseOver);
        boxObj.node.detachEvent("onmouseout",DHTMLCheckbox.mouseOut);
        boxObj.node.detachEvent("onclick",DHTMLCheckbox.click);
      } else {
        boxObj.node.removeEventListener("mouseover",DHTMLCheckbox.mouseOver,true);
        boxObj.node.removeEventListener("mouseout",DHTMLCheckbox.mouseOut,true);
        boxObj.node.removeEventListener("click",DHTMLCheckbox.click,true);
      }
      boxObj.removeSelfReference();
      DHTMLCheckbox.elements[nodeObj.name] = [new DHTMLCheckbox(boxObj.node,"radiobox",existingInputElement,additionalMouseoverTasks,additionalMouseoutTasks,additionalClickTasks)];
      DHTMLCheckbox.elements[nodeObj.name][DHTMLCheckbox.elements[nodeObj.name].length] = new DHTMLCheckbox(nodeObj,"radiobox");
    } else if (isArray(boxObj)) {
      DHTMLCheckbox.elements[nodeObj.name][DHTMLCheckbox.elements[nodeObj.name].length] = new DHTMLCheckbox(nodeObj,"radiobox");
    } else {
      DHTMLCheckbox.elements[nodeObj.name] = new DHTMLCheckbox(nodeObj,"checkbox");
    }
  }
};

DHTMLCheckbox.initElements = function() {
  var dhtmlCheckBoxStyles = document.getElementsByTagName("div")["dhtmlCheckBoxStyles"];
  if (dhtmlCheckBoxStyles) {
    var currentImageNode, currentStyleNode = dhtmlCheckBoxStyles.firstChild;
    while (currentStyleNode) {
      if (currentStyleNode.nodeName && (currentStyleNode.nodeName.toLowerCase() == "div") && currentStyleNode.id && (currentStyleNode.id !== "")) {
        if (!DHTMLCheckbox.style[currentStyleNode.id]) {
          DHTMLCheckbox.style[currentStyleNode.id] = {};
        }
        currentImageNode = currentStyleNode.firstChild;
        while (currentImageNode) {
          if (currentImageNode.nodeName && (currentImageNode.nodeName.toLowerCase() == "img") && currentImageNode.name && (currentImageNode.name !== "")) {
            DHTMLCheckbox.style[currentStyleNode.id][currentImageNode.name] = importImage(currentImageNode.src);
          }
          currentImageNode = currentImageNode.nextSibling;
        }
      }
      currentStyleNode = currentStyleNode.nextSibling;
    }
  }
  var i, nodeCollection = document.getElementsByClassNames("dhtmlCheckbox");
  if (nodeCollection) {
    for (i=0; i<nodeCollection.length; i++) {
      if (nodeCollection[i].nodeName && (nodeCollection[i].nodeName.toLowerCase() == "img")) {
      //alert("DHTMLCheckbox.addElement(" + nodeCollection[i].nodeName +")");
        DHTMLCheckbox.addElement(nodeCollection[i]);
      }
    }
  }
  var boxName, boxObj, deselection;
  for (boxName in DHTMLCheckbox.elements) {
    boxObj = DHTMLCheckbox.elements[boxName];
    if (isArray(boxObj)) {
      deselection = true;
      boxObj.selectedIndex = -1;
      for (i=0; i<boxObj.length; i++) {
        deselection = (deselection && boxObj[i].deselection);
        boxObj[i].node.title = "";
        boxObj[i].node.alt = "";
        if (boxObj[i].elementStatus == "checked") {
          boxObj.selectedIndex = i;
        }
      }
      if (!deselection) {
        for (i=0; i<boxObj.length; i++) {
          boxObj[i].deselection = false;
        }
      }
      for (i=0; i<boxObj.length; i++) {
        if (!boxObj[i].carryOver) {
          if (boxObj[i].accumulateValues) {
            boxObj[i].elementNode.value = boxObj[i].elementNode.value.basicTrim().replace(new RegExp("\\b" + boxObj[i].elementValue + "\\b","g"),"").replace(/,+/g,",").replace(/^,/,"").replace(/,$/,"").split(",").sort().getNormalized().join(",");
          } else if (isNode(boxObj[i].elementNode) && boxObj[i].elementNode.parentNode && boxObj[i].elementNode.parentNode.removeChild) {
            boxObj[i].elementNode.parentNode.removeChild(boxObj[i].elementNode);
          }
        }
      }
    } else if (boxObj.constructor === DHTMLCheckbox) {
      boxObj.node.title = "";
      boxObj.node.alt = "";
      if (!boxObj.carryOver) {
        if (boxObj.accumulateValues) {
          boxObj.elementNode.value = boxObj.elementNode.value.basicTrim().replace(new RegExp("\\b" + boxObj.elementValue + "\\b","g"),"").replace(/,+/g,",").replace(/^,/,"").replace(/,$/,"").split(",").sort().getNormalized().join(",");
        } else if (isNode(boxObj.elementNode) && boxObj.elementNode.parentNode && boxObj.elementNode.parentNode.removeChild) {
          boxObj.elementNode.parentNode.removeChild(boxObj.elementNode);
        }
      }

    }
  }
};


if (document.all || window.opera) {
  window.attachEvent("onload",DHTMLCheckbox.initElements);
} else {
  window.addEventListener("load",DHTMLCheckbox.initElements,true);
}


DHTMLCheckbox.style = {
};
