// JavaScript Document
//this will hold the all properties of every form element in the web
var fieldMap = new Object();


//error division set
var  backgroundDiv, messageDiv;

var errorElements=new Object();

//characters to check
var validChars = "!@#%^&*()+=-[]\\\;./{}|\":<>?0123456789";
var specialCharacterSet1 = "#%^*=[]\\\;{}|\<>";
var specialCharacterSet2 = "!@#%^&*()+=-[]\\\;./{}|\":<>?0123456789";
var validPhoneCharsSet = "0123456789-+[] ";


//will hold the messages for blank valid maxchars etc
var errorMessages=new Object();
	errorMessages["blank"] = "Please enter ";
	errorMessages["common"]="";
var errorString="";

/********************** Validation Of Form Elements Start ************************/
function validation(formObject)
{
	errorString="";
	//Get the mapField for the supplied form
	var mapedField = fieldMap[formObject.name];
	
	//As we have to display all the error at time, once there is error at any element this get set to true
	var noError = true;
	
	//Get Error Division, so that we can play with its properties and style
	getErrorDiv();
	
	//Loop through form elements and do testing
	for(var i=0;i<formObject.elements.length;i++)
	{

		if(formObject.elements[i].name != undefined)
		{
			
			var fieldObj =formObject.elements[i];
			
			//Check wheather the element is defined for test, check does it has blank property
			if( mapedField[fieldObj.name] != undefined && fieldObj.disabled==false && mapedField[fieldObj.name]["blank"] != undefined  && mapedField[fieldObj.name].blank && fieldObj.value == "")
			{
				errorString+=errorMessages["blank"]+mapedField[fieldObj.name]["label"]+"\n";
				noError = false;
			}
			
			//check does it has valid property then use validateFunction
			if( mapedField[fieldObj.name] != undefined && fieldObj.disabled==false && mapedField[fieldObj.name]["valid"] != undefined  && fieldObj.value != "" && typeof(mapedField[fieldObj.name].validateFunction)=="function" && !mapedField[fieldObj.name].validateFunction(fieldObj))
			{
				if(mapedField[fieldObj.name].errmessage != undefined)
					errorString+=mapedField[fieldObj.name].errmessage+"\n";
				else
					errorString+=errorMessages["common"]+ mapedField[fieldObj.name].label+"\n";
								
				noError=false;
				
			}
			
			//check does it has valid property then use validateFunction
			if( mapedField[fieldObj.name] != undefined && fieldObj.disabled==false && mapedField[fieldObj.name]["valid"] != undefined  && fieldObj.value != "" && typeof(mapedField[fieldObj.name].validateFunction)=="object" && !checkValidationArray(mapedField[fieldObj.name].validateFunction,fieldObj,mapedField[fieldObj.name].param,mapedField[fieldObj.name].label))
			{
				if(mapedField[fieldObj.name].errmessage != undefined ){
					errorString+=mapedField[fieldObj.name].errmessage+"\n";
				}
				else{
					errorString+=errorMessages["common"]+"\n";	
				}
			
				noError=false;
			}
			
		}
	}
	if(!noError)
	{
		alert(errorString);  // Display Javascript Messages.
	}
	return noError;	
}
/********************** Validation Of Form Elements End ************************/

/******************* Check Array Of Validation Function Start***************/
function checkValidationArray(validateFunctionArray,element,param,lable)
{
	
	for(var i=0;i<validateFunctionArray.length;i++)
	{
		if(!validateFunctionArray[i](param,element,lable))
		{
			return false;
		}
	}
	return true;
}
/******************* Check Array Of Validation Function End***************/

/******************* Select Options Validation Start ************/
function selectValidation(param,element,lable)
{
	
	if(element.value =="0"){
		errorString+=" Please specify the " +lable;
		return false;
	}
	
	return true;
}
/******************* Select Options Validation End *************/

/******************* Digit Validation Start ********************/
function digitValidation(param,element,lable)
{
	
	var regex = /^[\d]+$/;

	if(!regex.test(element.value))
	{
		errorString+="Please Enter only number for " + lable;
		return false;
	}
	return true;
}
/******************* Digit Validation End **********************/

/******************* String Length Validation Start ************/
function stringLengthValidation(param,element,lable)
{
		var len=element.value.length;
	if(len!=param.stringLen)
	{
		errorString+="Please enter only "+param.stringLen+" digit for "+lable;
		return false;
	}
	return true;
}
/******************* String Length Validation End ***************/

/******************* Thousand Character Length Validation Start *************/
function thousandCharValidation(param,element,lable)
{
	if(element.value!=""){	
		if(element.value.length>1000)
		{
			errorString+="Please Enter less than 1000 characters in "+lable;
			return false;
		}
	}
	return true;
}
/******************* Thousand Character Length Validation End ***************/

/******************* Character Length Validation Start ***************/
function fivehundredCharValidation(param,element,lable)
{
	if(element.value!=""){	
		if(element.value.length>500)
		{
			errorString+="Please Enter less than 500 characters in "+lable;
			return false;
		}
	}
	return true;
}
/******************* Character Length Validation End ***********/

/******************* First Name Validation Start ***************/
function firstnameValidation(param,element,lable)
{
	if(element.value!=""){
	var regex = /^[a-zA-Z]+$/;
	if(!regex.test(element.value))
	{

		errorString+="Please Enter Valid "+lable;
		
		return false;
	}
	}
	return true;
}
/******************* First Name Validation End ******************/

/******************* Employer Name Validation Start *************/
function empValidation(param,element,lable)
{
	if(element.value!=""){
	//var regex = /^[a-zA-Z]+[\s\.]*[a-zA-Z]+[\s\.]*[a-zA-Z]+$/;
	var regex = /^[a-zA-Z]+([\s\.]{1}[a-zA-Z]+)*$/;
	if(!regex.test(element.value))
	{
		
		errorString+="Please enter "+lable;
		
		return false;
	}
	}
	return true;
}
/******************* Employer Name Validation End ***************/

/******************* Full Name Validation Start *****************/
function fullNameValidation(param,element,lable)
{
	if(element.value!=""){
	var regex = /^[a-zA-Z]+[\s\.]*[a-zA-Z]+[\s\.]*[a-zA-Z]+$/;
	//var regex = /[\w]$/;
	
	if(!regex.test(element.value))
	{
		
		errorString+="Please enter "+lable;
		
		return false;
	}
	}
	return true;
}
/******************* Full Name Validation End*****************/

/******************* Mobile Number Validation Start***********/
function mobilenumberValidation(param,element,lable)
{
	var regex2 = /^[\d]{10}$/;	
	if(param.isNRI=='Y' && param.isNRI!=undefined)
	{
		regex2 = /^[\d]+$/;
	}
	if(!regex2.test(element.value))
	{
				errorString+="Please enter "+lable+" without any spaces or hyphens";
				return false;
	}else
	 {
			if(param.isNRI=='N')
			{
				if(element.value.charCodeAt(0)!=57){
				errorString+="Please enter "+lable+" starting with 9";
				return false;
				}
			}
			
	 }
	return true;
}
/******************* Mobile Number Validation End***************/

/******************* Zip/Pin Code Validation Start***************/
function zipValidation(param,element,lable)
{
	if(param.isNRI!='Y')
	{
	
	if(element.value!=""){
	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(element.value))
	{
		errorString+="Please Enter Valid "+lable;
		return false;
	}
	}
	return true;
	
	}
	else
	{	
		return true;
	}
	
}
/******************* Zip/Pin Code Validation End***************/

/******************* Email Address Validation Start***************/
function emailValidation(param,element,lable)
{
if(element.value!=""){
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-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}$/;
}
}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-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(element.value))
	{

		errorString+="Please enter a valid "+ lable;
		return false;
		
	}
	}
	return true;
}
/******************* Email Address Validation End***************/

/******************* Range Validation Start***************/
function rangeValidation(param,element,lable)
{
	
	var regex = /^\d*(\.\d{1,2})?$/;
 
	if(!regex.test(element.value))
	{
		errorString+="Please enter the " +lable+" without commas in 999999 format";
		return false;
	}
	if(element.value <param.min || element.value >param.max){
		errorString+="Please enter the " +lable+" without commas in 999999 format, between range "+param.min+" and "+param.max;
		return false;
	}
	
	return true;
	
	
}
/******************* Range Validation End***************/

/******************* Date Validation Start***************/
function DateValidation(param,element,lable)
{
  	var myDayStr = param.day;
  	var myMonthStr = param.month;
	var myYearStr = param.year;
	myMonthStr = myMonthStr-1;
	var myMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); 
	var myDateStr = myDayStr + '' + myMonth[myMonthStr] + '' + myYearStr;
	/* Using form values, create a new date object
	using the setFullYear function */
	var myDate = new Date();
	
	myDate.setFullYear( myYearStr, myMonthStr, myDayStr );
	if ( myDate.getMonth() != myMonthStr || myYearStr =="0")
	{
	  errorString+="Please enter valid "+lable;
	  return false;
	} 
	return true;
}
/******************* Date Validation End***************/

/******************* Interest Rate Validation Start***************/
function interestRateValidation(param,element,lable)
{
	
	var regex =  /^\d*(\.\d{1,2})?$/;
	if(!regex.test(element.value))
	{
		errorString+="Please enter the applicable Annual Interest Rate as a percentage";
		return false;
	}
	if(element.value <param.min || element.value >param.max){
		errorString+="Please enter the applicable Annual Interest Rate as a percentage";
		return false;
	}
	
	return true;
	
}
/******************* Interest Rate Validation End***************/

/////////////// Old Code in Validation //////////////////////////
function validateFormElementDates(formObject)
{
	var mapedField = fieldMap[formObject.name];
	
	//Loop through form elements and do testing
	for(var i=0;i<formObject.elements.length;i++)
	{
		var fieldObj =formObject.elements[i];
		if(formObject.elements[i].name != undefined)
		{
			
			//Check If date validation is true
			if( mapedField[fieldObj.name] != undefined  && mapedField[fieldObj.name]["date"] != undefined  && fieldObj.value != "" && !mapedField[fieldObj.name].validateFunction(formObject[mapedField[fieldObj.name]["startDate"]].value, formObject[mapedField[fieldObj.name]["endDate"]].value))
			{
				if(mapedField[fieldObj.name]["message"]!=undefined)
					alert(mapedField[fieldObj.name]["message"]);
				return false;
			}
		}
	}
	return true;
}
function formatDate(date)
{
	var date = date.replace("  "," ");
	var dateFormArray = date.split(" ");
	var dateArray = dateFormArray[0].split("-");
	dateArray = dateArray.reverse() ;
	var dateNumber = dateArray.join("");
	
	var hourPart = dateFormArray[1].split(":");
		
	if(dateFormArray[2]=="PM" && parseInt(hourPart[0]) < 12 )
		hourPart[0] =parseInt(hourPart[0])+12;
	else if(dateFormArray[2]=="AM" && parseInt(hourPart[0]) == 12)
		hourPart[0] =parseInt(hourPart[0])-12;
	
	hourPart[0]=(hourPart[0]==0)?"":hourPart[0]+"";
	
	dateFormArray[1] = parseInt(hourPart.join(""));
		
	var dateTimeArray=new Object();

	dateTimeArray["date"] = parseInt(dateNumber);
	dateTimeArray["time"] = parseInt(dateFormArray[1]);
	dateTimeArray["meridian"] = dateFormArray[2];

	return dateTimeArray;
		
}
function printVars(obj)
{
		var str="";
		for(prop in obj)
		{
			str+=prop + " value :"+ obj[prop]+"\n";
		}
		
}

function dateCompare(startDate,endDate)
{
	var startDate = formatDate(startDate);
	printVars(startDate);
	var endDate =formatDate(endDate);
	printVars(endDate);
	
	try
	{
		
		if(startDate.date==endDate.date && startDate.time>endDate.time )
		{
			return false;
		}
		else if(startDate.date==endDate.date && startDate.time==endDate.time && (startDate.meridian=="PM" && endDate.meridian=="AM"))
		{
			return false;
		}
		else if(startDate.date>endDate.date)
		{
			return false;
		}		
		return true;
	}
	catch(e)
	{
		return false;
	}
}

//Displaying error in new format
function display(element)
{
	setPos(element)
	if(errorElements[element.name].error)
	{
		backgroundDiv.style.display="block";
		messageDiv.style.display="block";
		messageDiv.innerHTML = errorElements[element.name].errorMessage;
	}
}
function hide(element)
{
	setPos(element)
	if(!errorElements[element.name].error)
	{
		backgroundDiv.style.display="none";
		messageDiv.style.display="none";
	}
}

function setPos(element)
{
	var temp=findPos(element);
		
	backgroundDiv.style.left=""+eval(temp[0]+element.offsetWidth+10)+"px";
	backgroundDiv.style.top=""+eval(temp[1])+"px";
	messageDiv.style.left=""+eval(temp[0]+element.offsetWidth+10)+"px";
	messageDiv.style.top=""+eval(temp[1])+"px";
}

function getErrorDiv()
{
	backgroundDiv= document.getElementById("backgroundDiv");
	messageDiv = document.getElementById("messageDiv");
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function setErrorMessage(message)
{
	//document.getElementById("messageDiv").innerHTML = message;
}

