/*
       ________________________________________________________________________________________________________
     _|
   _|
  |
  | @CREATE BY : Uttam Kumar
  | @CREATE DATE: 21 Dec, 10:41 PM
  |
  | -----------------------------------------------------------------------------------------------------------
  | @LAST MODIFIED DATE:              || MODIFIED REASION:
  | (1)   Karishma Shah            || (1)
  | -----------------------------------------------------------------------------------------------------------
  |
  | @DESCRIPTION:
  |        (1)JavaScript Document which will hold the all properties of every form element in the web and will
  |  validate the form fields of any form as per the properties specified for form element using JSON.
  |_
    |_
      |________________________________________________________________________________________________________

*/

//////////////////////////////////// Global Variables used in the script //////////////////////////////////////////
var fieldMap = new Object();
var flagFormSubmit = false;
var divErrorMessages = "";
var alertErrorMessage="";
var divFlag = false;
var elementValue='';
/////////////////////////////////// Global Variables Declaration ends here ///////////////////////////////////////
/********************** Validation Of Form Elements Start ************************/
function validation(formObject)
{	var noError = true;
	errorString = "";
	var mapedField = fieldMap[formObject.id];  	        //Get the mapField for the supplied form
	for(var i=0; i<formObject.elements.length; i++)
	{
		if(formObject.elements[i].id != undefined)
		{
			var fieldObj = formObject.elements[i];
			elementValue=fieldObj.value;
			elementValue = elementValue.replace("<", "&lt;").replace(">", "&gt;");
			elementValue = elementValue.replace("eval\\((.*)\\)", "");
			elementValue = elementValue.replace("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
			elementValue = elementValue.replace("script", "");
			//check does it has valid property then use validateFunction
			if( mapedField[fieldObj.id] != undefined && fieldObj.disabled==false && typeof(mapedField[fieldObj.id].validateFunction)=="object" && !checkValidationArray(mapedField[fieldObj.id].validateFunction,fieldObj,mapedField[fieldObj.id]))
			{
				noError=false;
			}

		}
	}
	if(!noError)
	{

		if(!divFlag)
		{
			alert(alertErrorMessage);  // Display Javascript Messages.
		}
	}
	if(flagFormSubmit)
	{
		return noError;
	}
	else
	{
		return flagFormSubmit;
	}
}
/********************** Validation Of Form Elements End ************************/
/********************** function to hide  div *****************/
function hideDiv(element)
{

	document.getElementById(element.div).style.display = "none";

}
/********************** function to hide  div *****************/
/********************** function to display error message in div *****************/
function display(element)
{
	if(divErrorMessages)
	{
		document.getElementById(element.div).style.display = "block";
		document.getElementById(element.div).innerHTML = divErrorMessages;
	}
}
/********************** function to display error message in div finished *****************/
/********************** function for deciding error display type...can be shown in alert/div **********************/
function displayError(element, errMsg)
{
	if(element.div != undefined && element.div != "")
	{

		if(errMsg != "")
		{

			divErrorMessages = errMsg;
			display(element);
			divFlag = true;
		}
		else
			hideDiv(element);
	}
	else
	{
		alertErrorMessage += errMsg;
		divFlag = false;
	}
}
/******************************** function of deciding error display type ends ************************************/
/******************* Check Array Of Validation Function Start***************/
function checkValidationArray(validateFunctionArray, element, fieldMapElement)
{
	for(var i=0; i<validateFunctionArray.length; i++)
	{

		if(validateFunctionArray[i].errMsg!=undefined)
		{
			//alert(validateFunctionArray[i].funName);
			if(!validateFunctionArray[i].funName(fieldMapElement, element,validateFunctionArray[i].errMsg))
			{
				return false;
			}
		}
		else
		{
			if(!validateFunctionArray[i].funName(fieldMapElement, element,''))
			{
				return false;
			}
		}
	}
	return true;
}
/******************* Check Array Of Validation Function End***************/
/******************* function for trimming string starts here ***********/
function trim(strValue)
{
	var j = strValue.length-1;
	var i = 0;
	while(strValue.charAt(i++) == ' ');
	while(strValue.charAt(j--) == ' ');
	return strValue.substr(--i, ++j-i+1);
}
/******************* function for trimming string starts here ***********/
function getError(defaultError,fieldMapElement,errMsg)
{
	if(errMsg=='')
	{
		if(fieldMapElement.label!= undefined)
		{
			errMsg=defaultError+" for "+fieldMapElement.label;
		}
		else
		{
			errMsg="Please define label property or error message in your javascript";
		}
	}
	return errMsg;
}
/******************* Select Options Validation Start ************/
function selectValidation(fieldMapElement, element,errMsg)
{

	if(elementValue == "0" || elementValue=='')
	{
		errMsg=getError("Please select atleast one value",fieldMapElement,errMsg);
		displayError(fieldMapElement, errMsg);
		return false;
	}
		displayError(fieldMapElement,'');
	return true;
}

function isBlank(fieldMapElement, element, errMsg)
{

	if(element.disabled==false && elementValue == "")
	{
		errMsg=getError("Please enter value",fieldMapElement,errMsg);
		displayError(fieldMapElement,errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;
}
/////////////////// function 2 check 4 atleast on option selected from group of radiobox or checkbox.
function atleastOneRadChk(fieldMapElement, element, errMsg)
{
	var noneFlag = true;

	if(fieldMapElement.others != undefined)
	{
		for(optionCount=0; optionCount<fieldMapElement.others.length; optionCount++)
		{
			if(document.getElementById(fieldMapElement.others[optionCount]).checked!=false)
			{
				noneFlag = false;
				divFlag = true;
			}
		}
				if(noneFlag && (element.checked == false))
		{
			errMsg=getError("Please select option",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
		else
		{
			displayError(fieldMapElement,'');
			divFlag = true;
			return true;
		}
	}
	else
	{
		errMsg="Please define other property for "+element.name+" in your javascript";
		displayError(fieldMapElement, errMsg);
		return false;
	}
	//alert('hi');
	displayError(fieldMapElement,'');
	return true;
}



//////////////// This function is used for entering/selecting atleast one value from the options given ///////////
function atleastOne(fieldMapElement, element, errMsg)
{
	var noneFlag = true;
	if(fieldMapElement.others != undefined)
	{
		for(optionCount = 0; optionCount<fieldMapElement.others.length; optionCount++)
		{
			if(document.getElementById(fieldMapElement.others[optionCount]).value != "")
			{
				noneFlag = false;
				break;
			}
		}

		if(noneFlag && (elementValue == ""))
		{
			errMsg=getError("Please select option",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	else
	{
		errMsg="Please define other property for "+element.name+" in your javascript";
		displayError(fieldMapElement, errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;
}
/******************* Select Options Validation End *************/




function isNumeric(fieldMapElement, element, errMsg)
{
       var txtString = trim(elementValue);
       var charPos = txtString.search(/[^\d]/);
       if((txtString.length > 0) && (charPos >= 0))
       {
              errMsg=getError("Please enter only numbers",fieldMapElement,errMsg);
               displayError(fieldMapElement, errMsg);
               return false;
       }
	displayError(fieldMapElement,'')
       return true;
}



/******************* Email Address Validation Start***************/
function emailValidation(fieldMapElement, element, errMsg)
{
	if(elementValue!="")
	{
		var regex;
		var RFC = element.getAttribute("rfc");
		if(RFC){
		if(RFC.toUpperCase() == "yes" || RFC.toUpperCase() == "true"){

		// Pattern Suggested and provided by Fred Schenk <f.a.schenk [at] gmail [dot] com>
		regex = /^(([a-z0-9!#$%&*+-=?^_`{|}~][a-z0-9!#$%&*+-=?^_`{|}~.]*[a-z0-9!#$%&*+-=?^_`{|}~])|[a-z0-9!#$%&*+-?^_`{|}~]|("[^"]+"))[@]([-a-z0-9]+\.)+([a-z]{2}|com|net|edu|org|gov|mil|int|biz|pro|info|arpa|aero|coop|name|museum)$/
		}else{
		//regex = /^[A-Za-z]+(\.[\w]+)*@([\w\-]+\.)+([a-z]{2}|com|net|edu|org|gov|mil|int|biz|pro|info|arpa|aero|coop|name|museum)$/ ;
		regex = /^[A-Za-z0-9]{1}[a-zA-Z0-9]*((\.|\_|-|\'){1}[a-zA-Z0-9]+)*@([a-zA-Z0-9]+([\-]{1}[a-zA-Z0-9]+)*[\.]{1})+[a-zA-Z]{2,4}$/;
		}
		}else{
		//regex = /^[A-Za-z]+(\.[\w]+)*@([\w\-]+\.)+([a-z]{2}|com|net|edu|org|gov|mil|int|biz|pro|info|arpa|aero|coop|name|museum)$/ ;
		regex = /^[A-Za-z0-9]*[a-zA-Z]{1}[a-zA-Z0-9]*((\.|\_|-|\'){1}[a-zA-Z0-9]+)*@([a-zA-Z0-9]+([\-]{1}[a-zA-Z0-9]+)*[\.]{1})+[a-zA-Z]{2,4}$/;
		}


		if(!regex.test(elementValue))
		{

			errMsg=getError("Please enter valid value",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;

		}
	}
	displayError(fieldMapElement,'');
	return true;
}
/******************* Email Address Validation End***************/



function minLength(fieldMapElement, element, errMsg)
{
	if(elementValue.length < fieldMapElement.min)
	{
		errMsg=getError("length should be atleast of "+fieldMapElement.min,fieldMapElement,errMsg);
		displayError(fieldMapElement, errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;
}



function maxLength(fieldMapElement, element, errMsg)
{
	var txtString = trim(elementValue);
	if(txtString.length > fieldMapElement.max)
	{
		errMsg=getError("length should be atmost of "+fieldMapElement.min,fieldMapElement,errMsg);
		displayError(fieldMapElement, errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;
}


function phoneValdation(fieldMapElement, element, errMsg)
{
            patternMatch=0;
	var txtString = trim(elementValue);
	if(txtString!='')
	{
		var country=fieldMapElement.country;
		var typeRegEx=availType(country);
		for(i in typeRegEx)
		{
			if(typeRegEx[i].test(txtString))
				patternMatch=1;
		}
		if(patternMatch==0)
		{
			errMsg=getError("Please enter valid phone no.",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;

}
function availType(country)
{
	regex=new Array();
	switch(country)
	{
		case "in":
			regex[0]  = /^[0-9]{7,8}$/;
			// (+91)[022]111111
			regex[1]  = /^[\(][\+][0-9]{2}[\)][\[][0-9]{3,5}[\]][0-9]{6,11}$/;
			// +91022111111
			regex[2]  = /^[\+][0-9]{2}[0-9]{3,5}[0-9]{6,11}$/;
			// 91-111111
			regex[3]  = /^[0-9]{2}[\-][0-9]{6,11}$/;
			break;
		case "br": // Brazil
			$type[0] = /^([0-9]{2})?(\([0-9]{2})\)([0-9]{3}|[0-9]{4})-[0-9]{4}$/;
			break;

		case "fr": // France
			regex[0] = /^([0-9]{2})?(\([0-9]{2})\)([0-9]{3}|[0-9]{4})-[0-9]{4}$/;
			break;

		case "us": // US
			regex[0] = /^[\(][0-9]{3}[\)][0-9]{3}[\-][0-9]{4}$/;
			regex[1] = /^[0-9]{3}[\-][0-9]{3}[\-][0-9]{4}$/;
			break;

		case "sw": // Swedish
			regex[0] = /^(([+][0-9]{2}[ ][1-9][0-9]{0,2}[ ])|([0][0-9]{1,3}[-]))(([0-9]{2}([ ][0-9]{2}){2})|([0-9]{3}([ ][0-9]{3})*([ ][0-9]{2})+))$/;
			break;
	}
	return regex;
}
/***************** Confirm Password Validation ********************/
function confirmPassword(fieldMapElement, element, errMsg)
{
	if(elementValue != fieldMapElement.other.value)
	{
		errMsg=getError("confirm password is not matched"+fieldMapElement.min,fieldMapElement,errMsg);
		displayError(fieldMapElement, errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;
}
/************************* confirm Password Validation Ends Here ***********/



/****************** Range Validation Starts ******************/
function rangeValidation(fieldMapElement, element, errMsg)
{

	var regex = /^\d*(\.\d{1,2})?$/;

	if(!regex.test(elementValue))
	{
		//error="Please enter the " +errMsg+" without commas in 999999 format";
		displayError(element, errMsg);
		return false;
	}

	if(elementValue <fieldMapElement.min || elementValue >fieldMapElement.max)
	{
		errMsg=getError("length should be atleast of "+fieldMapElement.min+" and atmot of "+fieldMapElement.max,fieldMapElement,errMsg);
		displayError(fieldMapElement, errMsg);
		return false;
	}
	displayError(fieldMapElement,'');
	return true;

}
/*************** Range Validation Ends here ***************/



/*************** Zip Validation Start here ****************/
function zipValidation(fieldMapElement, element, errMsg)
{
	var theZip = trim(elementValue);
	if(theZip != "")
	{
		var regex;
		var country = element.getAttribute("country");
		if(country)
		{
			switch(country.toUpperCase())
			{
				case "BE":regex = /^[1-9]{1}[0-9]{3}$/;break;
				case "BR":regex = /^\d{5}-\d{3}$|^\d{8}$/;break;
				case "CA":regex = /^[a-zA-Z][0-9][a-zA-Z]\s?[0-9][a-zA-Z][0-9]$/;break;
				case "DU":regex = /^[0-9]{4}\s{0,1}[a-zA-Z]{2}$/;break;
				case "IN":regex = /^[\d]{6}$/;break;
				case "US":regex = /^[0-9]{5}\-[0-9]{4}$/;break;
				case "UK":regex = /^[A-Za-z]{1,2}[0-9A-Za-z]{1,2}[ ]?[0-9]{0,1}[A-Za-z]{2}$/;break;

				/* Add more country here */
				//	case "COUNTRY CODE":regex = /pattern/;break;

				default:regex = /^[\d]{5,6}$/;
			}
		}
		else
		{
			regex = /^[\d]{5,6}$/;
		}

		if(!regex.test(theZip))
		{
			errMsg=getError("Please enter valid value",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}
/******************* Zip/Pin Code Validation End***************/




function nameValidation(fieldMapElement, element, errMsg)
{
	//alert(errMsg+"dsk");
	var theName = trim(elementValue);
	if(theName.length > 0)
	{
		var regex = /^[a-zA-Z\s\.]+$/;
		if(!regex.test(theName))
		{
			errMsg=getError("Please enter value"+fieldMapElement.min+" and atmost of "+fieldMapElement.max,fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}

function alphaNum(fieldMapElement, element, errMsg)
{
	//alert(errMsg+"dsk");
	var theVal = trim(elementValue);
	if(theVal.length > 0)
	{
		var regex = /^[A-za-z0-9\s\.]+$/;
		if(!regex.test(theVal))
		{
			errMsg=getError("Please enter value"+fieldMapElement.min+" and atmost of "+fieldMapElement.max,fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}

/////////////////username validation

function userName(fieldMapElement, element, errMsg)
{
	//alert(errMsg+"dsk");
	var theUserName = trim(elementValue);
	if(theUserName.length > 0)
	{
		var regex = /^[A-za-z0-9\_\s\.]+$/;
		if(!regex.test(theUserName))
		{
			errMsg=getError("Please enter value"+fieldMapElement.min+" and atmost of "+fieldMapElement.max,fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}


function address(fieldMapElement, element, errMsg)
{
	//alert(errMsg+"dsk");
	var theAdd = trim(elementValue);
	if(theAdd.length > 0)
	{
		var regex = /^[a-zA-Z0-9]+.*$/;
		if(!regex.test(theAdd))
		{
			errMsg=getError("Please enter valid "+fieldMapElement.max,fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}

/******************** Mobile Number Validation ****************/
function mobilenumberValidation(fieldMapElement,element,errMsg)
{
	var theNo = trim(elementValue);
	if(theNo.length>0)
	{
		var regex2 = /^[0-9]{10}$/;
		if(fieldMapElement.isNRI=='Y' && fieldMapElement.isNRI!=undefined)
		{
			regex2 = /^[\d]{1,10}$/;
		}

		if(!regex2.test(elementValue))
		{
			errMsg=getError("Please enter valid value",fieldMapElement,errMsg);
			displayError(fieldMapElement, errMsg);
			return false;
		}
	}
	displayError(fieldMapElement,'');
	return true;
}
/****************** Mobile Number Validation ends ************/




/******************* get key event keycode *******************/
function getKeyCode(e)
{
   if (window.event)
   	return window.event.keyCode;
   else
    	if (e)
      		return e.which;
    	else
      		return null;
}
/***************** get key event keycode ends ***********/
/****************** Key Restriction function Start here *************/
function keyRestrict(e, validchars)
{
	var key='', keychar='';
	key = getKeyCode(e);
   	if (key == null)
		return true;

	keychar = String.fromCharCode(key);
   	keychar = keychar.toLowerCase();
   	validchars = validchars.toLowerCase();

   	if (validchars.indexOf(keychar) != -1)
   		return true;

    	if ( key==null || key==0 || key==8 || key==9 || key==13 || key==27 )
    		return true;

    	return false;
}
/****************** Key Restriction function end here *************/