//Handle mandatory fields in forms.

function KS_Form_MandatoryField(fieldName, fieldLabel, fieldType, isRequired,
		requiredErrorMsg, fieldPattern, fieldPatternErrorMsg, isUniqueRequired,
		uniqueRequiredErrormsg, isMinimum, minimumLength,
		minimumLengthErrorMsg, choicesChoosemsg) {
	this.fieldName = fieldName;
	this.fieldLabel = fieldLabel;
	this.fieldType = fieldType;

	this.isRequired = isRequired;
	this.requiredErrorMsg = requiredErrorMsg;

	this.fieldPattern = fieldPattern;
	this.fieldPatternErrorMsg = fieldPatternErrorMsg;
	this.isUniqueRequired = isUniqueRequired;
	this.uniqueRequiredErrormsg = uniqueRequiredErrormsg;

	this.isMinimum = isMinimum;
	this.minimumLength = minimumLength;
	this.minimumLengthErrorMsg = minimumLengthErrorMsg;

	this.choicesChoosemsg = choicesChoosemsg;
}

var ksFormMandatoryFields = new Array();

// do check validation on form submission
function validateForm() {
	try {
		var strError = "Error!";
		var bGotError = false;
		var bDuplicateFound = false;

		if (!ksFormMandatoryFields) {
			alert("Fatal Error! Array ksFormMandatoryFields is undefined. Please make sure that you include ksform.js. Please notify your System Administrator regarding this error.");
		}

		for ( var k = 0; k < ksFormMandatoryFields.length; k++) {

			var elem = getElementBy(ksFormMandatoryFields[k].fieldName);

			if (ksFormMandatoryFields[k].isRequired == "Yes") {
				switch (ksFormMandatoryFields[k].fieldType) {
				case "text":
				case "url":
					if (elem.value.length < 1) {
						if (ksFormMandatoryFields[k].requiredErrorMsg.length > 1) {
							strError += ("\n" + ksFormMandatoryFields[k].requiredErrorMsg);
						} else {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' cannot be blank!");
						}
						bGotError = true;
						elem.select();
						document.returnValue = false;
					} else if (ksFormMandatoryFields[k].fieldPattern.length > 0) {
						// fieldPattern is specified, then validate it

						var re = new RegExp(
								ksFormMandatoryFields[k].fieldPattern);
						var reResult = re.exec(elem.value);

						if (!reResult) {
							if (ksFormMandatoryFields[k].fieldPatternErrorMsg.length > 1) {
								var sPatternMessage = "\n"
										+ ksFormMandatoryFields[k].fieldPatternErrorMsg;
							} else {
								var sPatternMessage = "\nField '"
										+ ksFormMandatoryFields[k].fieldLabel
										+ "' is invalid. Valid fieldPattern is "
										+ re.source;
							}
							strError += sPatternMessage;
							bGotError = true;
							elem.select();
							document.returnValue = false;
						}
					}
					break;

				case "numeric":
					if (elem.value.length < 1) {
						if (ksFormMandatoryFields[k].requiredErrorMsg.length > 1) {
							strError += ("\n" + ksFormMandatoryFields[k].requiredErrorMsg);
						} else {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' cannot be blank!");
						}
						bGotError = true;
						elem.select();
						document.returnValue = false;
					} else if (isNaN(elem.value)) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a number!");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				case "lookup":
					if (elem.value.length < 1) {
						if (ksFormMandatoryFields[k].requiredErrorMsg.length > 1) {
							strError += ("\n" + ksFormMandatoryFields[k].requiredErrorMsg);
						} else {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' cannot be blank!");
						}
						bGotError = true;
						elem.focus();
						document.returnValue = false;
					}
					break;

				case "email":
					p = elem.value.indexOf('@');

					if (p < 1 || p == (elem.value.length - 1)) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid email address!");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				case "datetime":
					if (elem.value.length < 1) {
						if (ksFormMandatoryFields[k].requiredErrorMsg.length > 1) {
							strError += ("\n" + ksFormMandatoryFields[k].requiredErrorMsg);
						} else {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' cannot be blank!");
						}
						bGotError = true;
						elem.select();
						document.returnValue = false;
					} else {
						var re = /^[0-3]*[0-9]\/[0-1]*[0-9]\/\d{4}/;
						var reResult = re.exec(elem.value);

						if (!reResult) {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid date! Valid date: DD/MM/YYYY");
							bGotError = true;
							elem.select();
							document.returnValue = false;
						}
					}
					break;

				case "mynewic":
					if (elem.value.length < 1) {
						if (ksFormMandatoryFields[k].requiredErrorMsg.length > 1) {
							strError += ("\n" + ksFormMandatoryFields[k].requiredErrorMsg);
						} else {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' cannot be blank!");
						}
						bGotError = true;
						elem.select();
						document.returnValue = false;
					} else {
						var re = /^[0-9]{6}-[0-9]{2}-[0-9]{4}/;
						var reResult = re.exec(elem.value);

						if (!reResult) {
							strError += ("\nField '"
									+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid IC! Valid format: XXXXXX-XX-XXXX");
							bGotError = true;
							elem.select();
							document.returnValue = false;
						}
					}
				} // end of switch(type)
			} // end of if(isRequired == Yes)
			else if (elem.value.length > 0) { // then mandatory is No, just
				// validate IF data exists...
				switch (ksFormMandatoryFields[k].fieldType) {
				case "datetime":
					var re = /^[0-3]*[0-9]\/[0-1]*[0-9]\/\d{4}/;
					var reResult = re.exec(elem.value);

					if (!reResult) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid date! Valid date: DD/MM/YYYY");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				case "time":
					var re = /^\d{1,2}:\d{1,2}:\d{4}/;
					var reResult = re.exec(elem.value);

					if (!reResult) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid time! Valid time format: HH:MM:SS AM/PM");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				case "numeric":
					if (isNaN(elem.value)) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a number!");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;
				case "email":
					p = elem.value.indexOf('@');

					if (p < 1 || p == (elem.value.length - 1)) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid email address!");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				case "mynewic":
					var reIC = /^[0-9]{6}-[0-9]{2}-[0-9]{4}/;
					var reResultIC = reIC.exec(elem.value);

					if (!reResultIC) {
						strError += ("\nField '"
								+ ksFormMandatoryFields[k].fieldLabel + "' is not a valid IC! Valid format: XXXXXX-XX-XXXX");
						bGotError = true;
						elem.select();
						document.returnValue = false;
					}
					break;

				}
			}
			// now checks for unique data
			if (ksFormMandatoryFields[k].isUniqueRequired == "Yes") {
				// ksCheckUnique('0',ksFormMandatoryFields[k].fieldName,
				// elem.value, '');
				// alert("Checking unique value for " +
				// ksFormMandatoryFields[k].fieldLabel);
				// alert("bDuplicateFound is: " + bDuplicateFound);
				if (bGlobalDuplicateFound == true) {
					strError += ("\nField '"
							+ ksFormMandatoryFields[k].fieldLabel + "' exists. Please use other data!");
					bGotError = true;
					elem.select();
					document.returnValue = false;
				}
			}

		} // end of for...

		if (bGotError) {
			alert(strError);
			document.returnValue = false;
		} else {
			document.returnValue = true;
		}
	} catch (e) {
		alert("Javascript fatal error in validateForm(): " + e.message + "\n"
				+ e.name + "\n\nElement index (" + k + "), name: " + elem);
	}
}

/**
 * 
 * @param elemTag
 * @return
 */
function getElementBy(elemTag) {

	try {
		var elem = document.getElementById(elemTag);

		if (elem)
			return elem;

		var elems = document.getElementsByName(elemTag);

		if (elems.length > 0)
			return elems[0];

		return null;
	} catch (error) {
		var msg = "Fatal Error: " + error.description;
		msg += "in function getElementBy(), field.js";
		alert(msg);
	}
}

/**
 * This function make sure unchecked checkbox will always be submitted
 */
function handleHiddenCheckbox(frmElement) {
	try {

		var strStatus = frmElement.checked;
		var strName = frmElement.name;

		if (!strStatus) {
			var input = document.createElement('INPUT');
			input.type = "hidden";
			input.name = strName;
			input.value = 0;
			document.form1.appendChild(input);
		}
		return true;

	} catch (error) {
		var msg = "Fatal Error: " + error.description;
		msg += " in function handleHiddenCheckbox(), field.js";
		msg += " for element: " + frmElement.name;
		alert(msg);
	}
}

function getElementBy(elemTag) {

	try {
		var elem = document.getElementById(elemTag);

		if (elem)
			return elem;

		var elems = document.getElementsByName(elemTag);

		if (elems.length > 0)
			return elems[0];

		return null;
	} catch (error) {
		var msg = "Fatal Error: " + error.description;
		msg += "in function getElementBy(), field.js";
		alert(msg);
	}
}

function openCloseElem(elemName, doOpen) {
	try {
		var elem = getElementBy(elemName);

		if (!elem)
			return false;

		if (doOpen)
			elem.style.display = "";
		else
			elem.style.display = "none";

		return doOpen;
	} catch (error) {
		var msg = "Fatal Error: " + error.description;
		msg += "in function openCloseElem(), field.js";
		alert(msg);
	}
}
