/**
	To implement check all, add the following your page:
	
	<script type="text/javascript" src="/js/forms.js"></script>
	<script type="text/javascript">
	//<![CDATA[
		var checkHandler = new CheckAllHandler(checkallID,childCheckboxName...);
	//]]>
	</script>

where:
checkallID is the id attribute of the <input> tag that defines the "check all" checkbox (the one that when checked will check all child checkboxes)
childCheckboxName is the name attribute of the <input> that defines a checkbox which is to be kept in sync with the "check all" checkbox.  N names can be passed in. 

Note:
all of the above checkboxes need to be in the same form.
*/
function CheckAllHandler(checkAllCheckboxID, checkboxName) {
	CheckAllHandler.handlers[checkAllCheckboxID] = this;
	this.checkAllCheckbox = null;
	this.checkAllCheckboxID = checkAllCheckboxID;
	this.childCheckboxeNames = new Array();
	for (var i=1;i<arguments.length;i++) {
		this.childCheckboxeNames.push(arguments[i]);
	}
	this.childCheckboxes = new Array();

	var checkAllHandlerWindowOnload = window.onload;
	window.onload = function() {
		if (checkAllHandlerWindowOnload) {
			checkAllHandlerWindowOnload();
		}
		
		var instance = CheckAllHandler.handlers[checkAllCheckboxID];
		instance.initialize();
	}

	this.initialize = function(checkAllCheckboxID) {
		checkAllCheckboxID = checkAllCheckboxID || this.checkAllCheckboxID;
		this.checkAllCheckbox = document.getElementById(checkAllCheckboxID);

		if (!this.checkAllCheckbox) return;
		
		//variable length arguments
		for (var i=0;i<this.childCheckboxeNames.length;i++) {
			var name = this.childCheckboxeNames[i];
			var elements = this.checkAllCheckbox.form[name];
			if (! elements) {
					elements = new Array();
			}
			if (! elements["length"]) {
				//if this is not array-oid
				elements = new Array(elements);
			}
			for (var j=0;j<elements.length;j++) {
				this.childCheckboxes.push(elements[j]);
			}
		}
		
		//add handler to checkAllCheckbox
		var checkAllCheckboxonclick = this.checkAllCheckbox.onclick;
		this.checkAllCheckbox.onclick = function() {
			if (checkAllCheckboxonclick) {
				checkAllCheckboxonclick();
			}
			checkAllHandler = CheckAllHandler.handlers[checkAllCheckboxID];
			checkAllHandler.checkAll();
		}
		
		//add handler to each child checkbox
		for (var i=0;i<this.childCheckboxes.length;i++) {
			var childCheckbox = this.childCheckboxes[i]
			var childCheckboxonclick = childCheckbox.onclick;
			childCheckbox.onclick = function() {
				if (childCheckboxonclick) {
					childCheckboxonclick();
				}
				checkAllHandler = CheckAllHandler.handlers[checkAllCheckboxID];
				checkAllHandler.checkAll(true);
			}
		}
		this.checkAll(true);	
	}
	this.checkAll = function(otherCheckbox) {
		if (this.childCheckboxes.length) {
			if (otherCheckbox) {
				var allChecked = true;
				for(var i=0;i<this.childCheckboxes.length;i++) {
					var el = this.childCheckboxes[i];
					if (el.type == "checkbox" && !el.checked) {
						allChecked = false;
						break;
					}
				}
				this.checkAllCheckbox.checked = allChecked;
			} else {
				for(var i=0;i<this.childCheckboxes.length;i++) {
					var el = this.childCheckboxes[i];
					if (el.type == "checkbox") {
						el.checked = this.checkAllCheckbox.checked;
					}
				}
			}
		}
	}
}	
CheckAllHandler.handlers = new Array();
