﻿var validatorTypes = new Array("Required","Email","Regex","Compare");

function ValidForm(formID, messageSpanID) {
	var objForm = document.getElementById(formID);

	if (objForm && objForm.elements){
		var objElements, objElement;
		var allValid = true;
		var i,j;
		
		var objMessageSummary = document.getElementById(messageSpanID);
		if(!objMessageSummary) {
			objMessageSummary = document.getElementById("message");
		}

		var validators = new Array();
		for(i=0; i < validatorTypes.length; i++) {
			validators.push(new Array());
		}

		objElements = objForm.elements;
		for (i=0; i < objElements.length; ++i){
			objElement = objElements[i];
			if (objElement && objElement.type && objElement.type == "hidden"){
				for(j=0; j < validatorTypes.length; j++) {
					if(objElement.name == validatorTypes[j] + "Validator") {
						validators[j].push(objElement);
						break;
					}
				}
            }
        }
		
		var objValidator,objToControl, objInvalid, objMessage;
		var valid, visibility;
		var invalidType = 99;
		var strMessage = "";
		
		for(i=0; i<validators.length; i++) {
			for(j=0; j<validators[i].length; j++) {
				objValidator = validators[i][j];
				objToControl = document.getElementById(objValidator.value);
				objInvalid = null;
				valid = true;
				if(objToControl) {
					objInvalid = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Invalid");
					objMessage = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Message");
					if(invalidType >= i) {				
						switch(i) {
							case 0:	//Required
								if(isWhitespace(objToControl.value)) {
									valid = false;
								}
								break;
								
							case 1:	//Email
								if(!isEmail(objToControl.value)) {
									valid = false;
								}
								break;
								
							case 2:	//Regex
								var objExp = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Expression");
								if(objExp) {
									try {
										var regex = new RegExp("'" + objExp.value + "'");
										if(!regex.test(objToControl.value)) {
											valid = false;
										}
									}
									catch(e) {
										//alert(e.s)
									}
								}
								break;
									
							case 3:	//Compare
								var objFieldName = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Field");
								var objValue  = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Value");
								var valueToCompare = null;
								
								if(objFieldName) {
									var objField = document.getElementById(objFieldName.value);
									if(objField) {
										valueToCompare = objField.value;

									}
								}
								else if(objValue) {
									valueToCompare = objValue.value;
								}

								var operator = "Equal";
								var dataType = "String";
								
								var objOperator = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_Operator");
								if(objOperator) operator = objOperator.value;
								
								var objDataType = document.getElementById(objValidator.value + "_" + validatorTypes[i] + "_DataType");
								if(objDataType) dataType = objDataType.value;
								
								switch(operator) {
									case "Equal":
										if(valueToCompare != null && objToControl.value != valueToCompare) {
											valid = false;
										}
										break;
										
									case "DataTypeCheck":
										switch(dataType) {
											case "Integer":
												if(objToControl.value != parseInt(objToControl.value, 10)) {
													valid = false;
												}
												break;
											default: //not implented yet
												break;
										}
										break;
									
									case "GreaterThanEqual":
										switch(dataType) {
											case "Integer":
												if(objToControl.value == parseInt(objToControl.value, 10)
													&& valueToCompare == parseInt(valueToCompare, 10)) {
													
													valid = (parseInt(objToControl.value, 10) >= parseInt(valueToCompare, 10));
												}
												else {
													valid = false;
												}
												break;
											default: //not implented yet
												break;
										}
										break;

									default: //not implented yet
										break;
								}
								break;
						}
					}
					
					if(valid) {
						visibility = "hidden";
					}
					else {
						allValid = false;
						invalidType = i;
						visibility = "visible";
						if(objMessage && strMessage.indexOf(objMessage.value) == -1) {
							strMessage += objMessage.value + "<br />";
						}
					}
					
					if(objInvalid) 
						objInvalid.style.visibility = visibility;
				}
			}
		}

		if(objMessageSummary) {
			switch(invalidType) {
				case 0:
					objMessageSummary.innerHTML = 'Please fill field(s) marked with <span class="validateMessage">*</span>';
					break;
				case 1:
					if(strMessage.length > 0) {
						objMessageSummary.innerHTML = strMessage;
					}
					else {
						objMessageSummary.innerHTML = 'Invalid email address';
					}
					break;
				case 3:
					objMessageSummary.innerHTML = strMessage;
					break;
				default:
					objMessageSummary.innerHTML = '';
			}
		}
		
		return allValid;
    }
    else {
		return false;
    }
}


function isEmail(s) {
	var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
	var regex = new RegExp(emailReg);
	return regex.test(s);
}

function isEmpty(s)
{   
	return ((s == null) || (s.length == 0))
}

function isWhitespace (s)
{  
	var i;
	var whitespace = " \t\n\r";
    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.
    for (i = 0; i < s.length; i++) {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}