
/******************************/
/**** IDFormFunctionsClass ****/
function IDFormFunctionsClass() {

}


IDFormFunctionsClass.prototype.trim = function(s) {
	var rx = /^\s+|\s+$/g;
	return s.replace(rx, "");
}


IDFormFunctionsClass.prototype.isInteger = function(s) {
	var rx = /^-?\d+$/;
	return s.match(rx);
}


IDFormFunctionsClass.prototype.isEmail = function(s) {
	var rx = /^[a-z0-9\-_\.]*[a-z0-9\-_]@([a-z0-9\-\.])+\.[a-z]{2,4}$/i;
	return s.match(rx);
}


IDFormFunctionsClass.prototype.isUrl = function(s) {
	var rx = /^([a-z]+:\/\/)?([^\s\/\.]+\.)+([a-z0-9]{2,4})(:\d+)?(\/.*)?$/i;
	return s.match(rx);
}



IDFormFunctionsClass.prototype.hasClassName = function(obj, cname) {
	if (obj != null) {
		if (obj.className != null) {
			var aCname = obj.className.split(" ");
			for (var i = 0; i < aCname.length; i++) {
				if (aCname[i] == cname) {
					return true;
					break;
				}
			}
		}
	}
	return false;
}


IDFormFunctionsClass.prototype.addClassName = function(obj, cname) {
	if (obj != null) {
		if (!this.hasClassName(obj, cname)) {
			obj.className += (obj.className.length  > 0 ? " " + cname : cname);
		}
	}
}


IDFormFunctionsClass.prototype.removeClassName = function(obj, cname) {
	if (obj != null) {
		if (obj.className != null) {
			var res = "";
			var aCname = obj.className.split(" ");
			for (var i = 0; i < aCname.length; i++) {
				res += (aCname[i] == cname ? "" : " "+aCname[i]);
			}
			res = this.trim(res);
			obj.className = res;
		}
	}
}


/*
IDFormFunctionsClass.prototype.getLabel = function(obj) {
	var oLabel = null;
	if (obj != null) {
		var oForm = obj.form;
		if (oForm != null) {
			
			var aLabel = oForm.getElementsByTagName("LABEL");
			if (aLabel.length > 0) {
				for (var i = 0; i < aLabel.length; i++) {
					if (aLabel[i].htmlFor == obj.id) {
						oLabel = aLabel[i];
						break;
					}
				}				
			}
		}
	}
	return oLabel;
}
*/

/**** IDFormFunctionsClass ****/
/******************************/




/*********************/
/**** IDFormClass ****/
function IDFormClass() {
	this.id = null;
	this.obj = null;
	this.submitObj = null;
	this.elements = Array();
}



IDFormClass.prototype.addElement = function(obj, id, type, required, maxlength) {
	var oElement = new IDFormElementClass();
	oElement.obj = obj;
	oElement.id = id;
	oElement.type = type;
	oElement.required = required;
	oElement.maxlength = maxlength;


	oElement.setValidation();

	
	if (obj.nodeName == "SELECT") {
		var aOption = obj.getElementsByTagName("OPTION");	
		if (aOption.length > 0) {
			var oOption = null;
			for (var i = 0; i < aOption.length; i++) {
				oOption = aOption[i];
				oElement.addElement(oOption, "IDFormE" + oOption.value, "", false, 0);
			}
		}
	}
	else if (obj.nodeName == "INPUT") {
		//do nothing
	}
	else if (obj.nodeName == "TEXTAREA") {
		//do nothing
	}
	else {
		
		var aInput = obj.getElementsByTagName("INPUT");
		if (aInput.length > 0) {
			var oInput = null;
			for (var i = 0; i < aInput.length; i++) {
				if (aInput[i].type != "hidden") {
					oInput = aInput[i];
					oElement.addElement(oInput, "IDFormE" + oInput.value, "", false, 0);
				}
			}
		}

	}

	this.elements[this.elements.length] = oElement;
}



IDFormClass.prototype.submit = function() {
	if (this.submitObj != null) {
		
		if (this.submitObj.name == "IDfnext") {
			return this.validate();
		}
		
		else {
			return true;
		}
	}
	else {
		return this.validate();
	}
}


IDFormClass.prototype.validate = function() {
	var res = true;
	var msg = "";
	for (var i = 0; i < this.elements.length; i++) {
		if (!this.elements[i].validate()) {
			var oLabel = this.elements[i].getLabel();
			msg += (oLabel != null ? "- "+ oLabel.innerHTML + "\n" : "");
			res = false;
		}
	}
	if (!IDFormFunctions.hasClassName(this.obj, "IDFormPoll")) {
		if (!res) {
			msg = "Please enter:\n\n" + msg; 
			alert(msg);
		}
	}
	return res;
}


IDFormClass.prototype.reset = function() {
	var defaultFound = false;
	for (var i = 0; i < this.elements.length; i++) {
		if (this.elements[i].reset()) {
			defaultFound = true;
		}
	}

	if (defaultFound) {
		return false; 
	}
	return true;
}

/**** IDFormClass ****/
/*********************/




/****************************/
/**** IDFormElementClass ****/
function IDFormElementClass() {
	this.id = null;
	this.obj = null;
	this.type = null;
	this.required = false;
	this.elements = Array();
	this.parent = null;
}



IDFormElementClass.prototype.reset = function() {
	var res = false;
	var oDefault = null;
	
	if ((this.type == "radiogroup") || (this.type == "checkboxgroup")) {
		for (var i = 0; i < this.elements.length; i++) {
			var oElm = this.elements[i];
			var oInp = oElm.obj;
			var oDef = oInp.form.elements.namedItem(oElm.id + "Default");

			oInp.checked = (oDef == null ? false : (oDef.value == "true"));
			res = true;
		}
		this.warning(false);
	}
	else if (this.obj.nodeName == "SELECT") {
		for (var i = 0; i < this.elements.length; i++) {
			var oElm = this.elements[i];
			var oOpt = oElm.obj;
			var oDef = this.obj.form.elements.namedItem(oElm.id + "Default");

			oOpt.selected = (oDef == null ? false : (oDef.value == "true"));
			res = true;
		}
		this.warning(false);
	}
	else if (this.obj.nodeName == "INPUT") {
		switch (this.obj.type) {
			case "text" :
				oDefault = this.obj.form.elements.namedItem(this.id + "Default");
				if (oDefault != null) {
					this.obj.value = oDefault.value;
					res = true;
				}
				break;

			default :
				break;
		}
		this.warning(false);
	}
	else if (this.obj.nodeName == "TEXTAREA") {
		oDefault = this.obj.form.elements.namedItem(this.id + "Default");
		if (oDefault != null) {
			this.obj.value = oDefault.value;
			res = true;
		}
		this.warning(false);
	}

	return res;
}


IDFormElementClass.prototype.getLabel = function() {
	var oLabel = null;

	switch (this.type) {
		case "radiogroup" :
		case "checkboxgroup" :
			oLabel = document.getElementById(this.id + "title");
			break;

		default :

			var aLabel = this.obj.form.getElementsByTagName("LABEL");
			if (aLabel.length > 0) {
				for (var i = 0; i < aLabel.length; i++) {
					if (aLabel[i].htmlFor == this.id) {
						oLabel = aLabel[i];
						break;
					}
				}
			}
			break;
	}

	return oLabel;
}



IDFormElementClass.prototype.warning = function(b) {
	if (!ua["iemac"]) {
		var self = this;
		var oLabel = this.getLabel();

		if (!b) {
			IDFormFunctions.removeClassName(self.obj, "incomplete");
			IDFormFunctions.removeClassName(oLabel, "incomplete");
		}
		else {
			IDFormFunctions.addClassName(self.obj, "incomplete"); 
			IDFormFunctions.addClassName(oLabel, "incomplete"); 
		}
	}
}



IDFormElementClass.prototype.liveValidate = function(e) {
	var self = this;

	if (self != null) {
		var rx = /^\s+/i;

		var val = self.obj.value;
		var newval = val;
		newval = (val.match(rx) ? val.replace(rx, "") : newval);

		switch(self.obj.nodeName) {
			case "INPUT" :

				switch (self.type) {
					case "email" :
						var rx = /\s|,/g;
						newval = (newval.match(rx) ? newval.replace(rx, "") : newval);
						break;

					case "integer" :
						var rx = /[^\d\-]/g;
						newval = (newval.match(rx) ? newval.replace(rx, "") : newval);

						var rx = /^(-?)\D*(\d*)\D*$/;
						newval = (newval.match(rx) ? newval.replace(rx, "$1$2") : newval);
						break;

					default :
						break;
				}


				if (val != newval) {
					self.obj.value = newval;
				}
				break;



			case "TEXTAREA" :
				if (val != newval) {
					self.obj.value = newval;
				}
				break;
		}
	}
}


IDFormElementClass.prototype.validate = function() {
	var self = this;

	var res = true;

	if (self != null) {
		switch(self.obj.nodeName) {
			case "INPUT" : 

				if (self.obj.type == "text") {

					var val = IDFormFunctions.trim(self.obj.value);
					val = (self.maxlength > 0 ? val.substring(0, self.maxlength) : val);

					switch (self.type) {
						case "email" :
							if (IDFormFunctions.isEmail(val)) {
								self.warning(false);
							}
							else {
								if (self.required) {
									self.warning(true);
									res = false;
								}
								else {
									if (val == "") {
										self.warning(false);
									}
									else {
										self.warning(true);
										res = false;
									}
								}
							}
							break;


						case "integer" :
							if (IDFormFunctions.isInteger(val)) {
								self.warning(false);
							}
							else {
								if (self.required) {
									self.warning(true);
									res = false;
								}
								else {
									if (val == "") {
										self.warning(false);
									}
									else {
										self.warning(true);
										res = false;
									}
								}
							}
							break;


						case "url" :
							var rx = /^([a-z]+):\/\//;
							var newval = val;
							if (!newval.match(rx)) {
								newval = "http://" + newval;
							}
							if (IDFormFunctions.isUrl(newval)) {
								val = newval;
								self.warning(false);
							}
							else {
								if (self.required) {
									self.warning(true);
									res = false;
								}
								else {
									if (val == "") {
										self.warning(false);
									}
									else {
										self.warning(true);
										res = false;
									}
								}
							}
							break;

						
						default :
							if (self.required) {
								if (val != "") {
									self.warning(false);
								}
								else {
									self.warning(true);
									res = false;
								}
							}
							break;
					}

					self.obj.value = val;
				}
				break;

			case "TEXTAREA" :
				var val = IDFormFunctions.trim(self.obj.value);
				val = (self.maxlength > 0 ? val.substring(0, self.maxlength) : val);
				self.obj.value = val;

				if (self.required) {
					if (self.obj.value != "") {
						self.warning(false);
					}
					else {
						self.warning(true);					
						res = false
					}
				}

				break;

			case "SELECT" :

				if (self.required) {
					var count = 0;
					for (var i = 0; i < self.elements.length; i++) {
						if (self.elements[i].obj.selected) {
							count++;
							break;
						}
					}
					if (count == 0) {
						self.warning(true);
						res = false;
					}
					else {
						self.warning(false);
					}
					
				
				}
				else {
					self.warning(false);
				}

				break;

			default :

				switch (self.type) {
					case "radiogroup" :
					case "checkboxgroup" :


						if (self.required) {
							var count = 0;
							for (var i = 0; i < self.elements.length; i++) {
								if (self.elements[i].obj.checked) {
									count++;
									break;
								}
							}
							if (count == 0) {
								self.warning(true);
								res = false;
							}
							else {
								self.warning(false);
							}
						}
						else {
							self.warning(false);
						}

						break;
					default :
						break;
				}
				break;
		}
	}
	else {
		res = false;
	}
	return res;
}



IDFormElementClass.prototype.trapKey = function(e) {
	var k = e.keyCode;
	switch (k) {
		case 8: //backspace
		case 9: //tab
		case 37: //left
		case 38: //up
		case 39: //right
		case 40: //down
			return true;
			break;
	}

	var res = true;
	var self = this;
	switch(self.obj.nodeName) {
		case "INPUT" :

			if (self.obj.type == "text") {
				switch(self.type) {
					case "email" :
						if (e.keyCode == 32) {
							res = false;
						}
						break;

					case "integer" :
						if (((k >= 48) && (k <= 57)) || ((k >= 96) && (k <= 105)) || ((k == 109) || (k == 189) || (k == 191))) {
							res = true;
						}
						else {
							res = false;
						}
						break;

					case "url" :
						break;

					default :
						break;
				}
			}

			break;

		default :
			break;
	}

	return res;
}



IDFormElementClass.prototype.setValidation = function() {
	var self = this;

	var oLabel = null;
	switch(self.obj.nodeName) {
		case "INPUT" : 
			
			switch(self.obj.type) {
				case "text" : //standard text input field
					self.obj.onblur = function() {
						self.validate();
					}

					self.obj.onkeyup = function(e) {
						if (!e) var e = window.event;
						self.liveValidate(e);
					}

					self.obj.onkeydown = function(e) {
						if (!e) var e = window.event;
						return self.trapKey(e);
					}

					break;

				case "radio" :
					self.obj.onchange = function() {
					
						self.parent.validate();
					}

					break;
				
				case "checkbox" :

					self.obj.onclick = function() {
						self.parent.validate();
					}
					break;
			}

			break;


		case "TEXTAREA" : //textarea field

			self.obj.onblur = function() {
				self.validate();
			}

			self.obj.onkeyup = function(e) {
				if (!e) var e = window.event;
				self.liveValidate(e);
			}

			break;


		case "SELECT" : //select, possibly multiple

			self.obj.onchange = function() {
				self.validate()
			}

			break;


		

		default : //radiogroup, checkboxgroup
			//do nothing here ...
			break;
	}
}


IDFormElementClass.prototype.addElement = function(obj, id, type, required, maxlength) {
	var oElement = new IDFormElementClass();
	oElement.obj = obj;
	oElement.id = id;
	oElement.type = type;
	oElement.required = required;
	oElement.maxlength = maxlength;
	oElement.parent = this;

	oElement.setValidation();

	this.elements[this.elements.length] = oElement;
}

/**** IDFormElementClass ****/
/****************************/




/***************************/
/**** IDFormHandlerClass ***/

function IDFormHandlerClass() {
	this.forms = Array();
}

IDFormHandlerClass.prototype.setSubmit = function(obj) {
	var self = this;
	if (obj != null) {
		var oForm = obj.form;
		if (oForm != null) {
			oForm = self.getForm(oForm.name);
			if (oForm) {
				oForm.submitObj = obj;
			}
		}
	}
}


IDFormHandlerClass.prototype.addForm = function(obj) {
	var self = this;
	var formExists = false;
	var oForm = null;


	for (var i = 0; i < self.forms.length; i++) {
		if (self.forms[i].id == obj.name) {
			formExists = true;
			oForm = self.forms[i];
			return oForm;
			break;
		}
	}

	if (!formExists) {
		oForm = new IDFormClass();
		oForm.obj = obj;
		oForm.id = obj.name;


		oForm.obj.onsubmit = function() {
			return oForm.submit();
		}

		oForm.obj.onreset = function() {
			return oForm.reset();
		}


		this.forms[self.forms.length] = oForm;
		return self.forms[self.forms.length - 1];
	}

}


IDFormHandlerClass.prototype.getForm = function(id) {
	var res = null;
	for (var i = 0; i < this.forms.length; i++) {
		if (this.forms[i].obj.name == id) {
			res = this.forms[i];
			break;
		}
	}
	return res;
}

IDFormHandlerClass.prototype.formExists = function(formId) {
	var res = false;
	for (var i = 0; i < this.forms.length; i++) {
		if (this.forms[i].id == formId) {
			res = true;
			break;
		}
	}
	return res;
}



IDFormHandlerClass.prototype.setValidation = function(id, type, required, maxlength) {
	var obj = document.getElementById(id);
	if (obj) {

		switch(obj.nodeName) {
			case "INPUT" :
				var oForm = this.addForm(obj.form);
				oForm.addElement(obj, id, type, required, maxlength);
				break;
			case "TEXTAREA" :
				var oForm = this.addForm(obj.form);
				oForm.addElement(obj, id, type, required, maxlength);
				break;
			case "SELECT" :
				var oForm = this.addForm(obj.form);
				oForm.addElement(obj, id, type, required, maxlength);
				break;
			default : 
				var aInput = obj.getElementsByTagName("INPUT");
				var oForm = null;
				if (aInput.length > 0) {
					oForm = this.addForm(aInput[0].form);
					oForm.addElement(obj, id, type, required, maxlength);
				}
				break;
		}
	}

}

/**** IDFormHandlerClass ***/
/***************************/


var IDFormFunctions = new IDFormFunctionsClass();


var IDFormHandler = new IDFormHandlerClass();
