
var MANDATORY_ERROR = "* Please [1] [2]";
var INTEGER_ERROR = "* Please Enter Only Integer Values in [1]";
var NAME_ERROR = "* Please Enter Only Alphabets,Numbers and Special Characters \ - ( , ) . / ' in [1]";
var REAL_ERROR = "* Please Enter Only Real Values in [1]";
var DATE_ERROR = "* Please Enter Valid Calendar Date in [1]. Format is DD/MM/YYYY";
var ALPHA_ERROR = "* Please Enter Only Alpha Numeric Characters in [1]";
var EMAIL_ERROR = "* Please Enter Valid Email Id";
var TIME_ERROR = "* [1] Accepts Alpha Numeric,Colon and Hyphen";
var SPECIAL_ERROR = "* Some of the Special Characters are not Allowed in [1]";

var IMAGE_FILE_ERROR = "* [1] Accepts Only Jpeg/Jpg/Bmp/gif Files";
var DOC_FILE_ERROR = "* Please Choose Only Pdf or Word Document File in [1]";
var HTML_FILE_ERROR = "* Please Choose Only Html File in [1]";

var IMAGE_FILE = /\.(gif|jpeg|jpg|bmp)$/gi;
var DOC_FILE = /\.(doc|pdf)$/gi;
var HTML_FILE = /\.(htm|html)$/gi;

var MAX_LENGTH_ERROR = "* Maximum No of Character is Allowed in [1] is [2]";
var MONEYVALUE_ERROR = " * [1]  Accepts Only Numbers and Two Decimal Points. Ex[XXXXXXXX.XX]."; 
var NAMEALPHABET_ERROR = " * [1] Accepts Alphabets and Space.It should start with Alphabet.";


/**
	This function takes user form as an input parameter and it traverse one by one form element according 
	to attributes it will pass the control to other functions. If any function returns false then it will display
	alert message to the user and control will return to the caller.
	
	@input	form		user form
	@output	false if it user enters any wrong character or true

*/

function jsfValidateForm(form) {
 	var attValid;
	var objElement;
	var controls = jsfChildElements(form);
	for(var i = 0; i < controls.length; i++) 
	{
		
		objElement = controls[i];
		attValid = objElement.getAttribute("valid");
		
		
		if (attValid)
		  {
		  
			if (!jsfCheckFormElement(objElement, attValid) ) 
			{
				return false;
			}
		  }
	}
	return true;
}

function jsfChildElements(inputCtl) {
	if(inputCtl.tagName == "FORM" )
	 {
		return inputCtl.elements;
	}
	else {
	
		var isSortNedded = (arguments.length > 1) ? arguments[1] : true;
		arrObject = new Array();
	
		var re = /INPUT|SELECT|TEXTAREA|hidden/gi;
		arrObject = jsfAddObjectToArray(arrObject, inputCtl.getElementsByTagName("INPUT"));
		arrObject = jsfAddObjectToArray(arrObject, inputCtl.getElementsByTagName("SELECT"));
		arrObject = jsfAddObjectToArray(arrObject, inputCtl.getElementsByTagName("TEXTAREA"));
		arrObject = jsfAddObjectToArray(arrObject, inputCtl.getElementsByTagName("HIDDEN"));
		if(arrObject.length > 0 && isSortNedded) {
			arrObject = jsfSortArrayElements(arrObject, arrObject[0].form.elements);
		}
		return arrObject;
	}
}

//	Sort elements in the form order by given 

function jsfSortArrayElements(divArr, formArr) {
	var arrElements = new Array();
	for(var i = 0; i < formArr.length; i++) {
		if( jsfIsArrayValueExist(divArr, formArr[i]) ) {
			arrElements[arrElements.length] = formArr[i];
		}
	}
	return arrElements;
}

function jsfAddObjectToArray(array, object) {
	for(var i=0; i < object.length; i++) {
		array[array.length] = object[i];
	}
	return array;
}

function jsfClearValues(inputCtl) {
 
	var controls = jsfChildElements(inputCtl);
	for(var i = 0; i < controls.length; i++) {
		if(controls[i].type == "text" || controls[i].type.match("^select")) {
			controls[i].value = "";
		}
	}
}

/**
	This function check the giving form element according to their valid parameter

	@input objElement Form element
	@input	attValid	Attribute in each form element
	@output	false if it user enters any wrong character or true

*/

function jsfCheckFormElement(objElement, attValid) {

	if ( attValid.match( /^m/i ) ) 
	 {
	
	
		if ( !jsfCheckMandatory(objElement) ) 
		{
			return false;
		}
	}
	
	if ( trim(objElement.value) != "" ) {
	
		var result = new String(attValid.match(/_\w+$/gi));
		 
		result = result.substr(1, result.length - 1);
		 
		switch (result) {
			case "i":
				if ( !jsfCheckInteger(objElement) ) {
					return false;
				}
				break;

			case "si":
				if ( !jsfCheckSignedInteger(objElement) ) {
					return false;
				}
				break;

		
			case "r":
				if ( !jsfCheckReal(objElement) ) {
					return false;
				}
				break;

			case "sr":
				if ( !jsfCheckSignedReal(objElement) ) {
					return false;
				}
				break;
			
			case "d":
				if ( !jsfCheckDate(objElement) ) {
					return false;
				}
				break;

			case "a":
				if ( !jsfCheckAlphaNumeric(objElement) ) {
					return false;
				}
				break;

			case "s":
				if ( !jsfCheckSpecialChar(objElement) ) {
					return false;
				}
				break;

			case "f":
		
				if ( !jsfCheckFile(objElement) ) {
					return false;
				}
				break;

			case "n":
				if ( !jsfCheckName(objElement) ) {
					return false;
				}
				break;

			case "e":
				if ( !jsfCheckEmail(objElement) ) {
					return false;
				}
				break;

			case "t":
				if ( !jsfCheckTime(objElement) ) {
					return false;
				}
				break;

			case "mo":
					if(!jsfCheckMoneyValue(objElement) ) {						
						return false;
					}
					break;
			case "et":
					if(!jsfCheckEstimatedTime(objElement) ) {						
						return false;
					}
					break;
			case "na":
					if(!jsfCheckAlphaName(objElement) ) {						
						return false;
					}
					break;
			

		}
	
	}

	if ( !jsfCheckMaxLength(objElement) ) {
		return false;
	}
	return true;
}

/**
	This function checks whether the given form element contains any value or not

	@input objElement as Form Element
	@output value boolean true if it contains any value otherwise false
*/

function jsfCheckMandatory(objElement) {

	if((objElement.type=="text")||(objElement.type=="textarea")||(objElement.type=="file"))
	{
	
	if(objElement.value=="")
	{
	 
	var type = "Enter";
		 jsfDisplayErrorMessage(MANDATORY_ERROR, type, objElement.getAttribute("errname"));
		 objElement.style.background = 'YELLOW'; 
		objElement.focus();
		return false;
    }
	}
	if(objElement.type=="select-one")
	{
	 type = "Select";
	 if(objElement.value=="Select")
	 {
	 	jsfDisplayErrorMessage(MANDATORY_ERROR, type, objElement.getAttribute("errname"));
		 objElement.style.background = 'YELLOW'; 
		objElement.focus();
		return false;
		}
	}
	return true;
}


/**
	This function checks the given value in the form is an integer

	@input objElement as Form Element
	@output value boolean true if it is an integer or false
*/

function jsfCheckInteger(objElement) {
	var re = /^[1-9]\d*|^0$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(INTEGER_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}


function jsfCheckSignedInteger(objElement) {
	var re = /^[+|\-]?[1-9]\d*|^0$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(INTEGER_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}
/**
	This function checks the given value in the form is an real

	@input objElement as Form Element
	@output value boolean true if it is an real or false
*/

function jsfCheckReal(objElement) {
	var re = /^[1-9]\d*\.?\d*|^0\.\d+|^0$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(REAL_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

function jsfCheckSignedReal(objElement) {
	var re = /^[+|\-]?[1-9]\d*\.?\d*|^0\.\d+|^0$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(REAL_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

/**
	This function checks the given value in the form is an valid calendar date

	@input objElement as Form Element
	@output value boolean true if it is an valid calendar date or false
*/

function jsfCheckDate(objElement) {
	if ( !jsfCheckDateByValue(objElement.value) ) {
		jsfDisplayErrorMessage(DATE_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	
	return true;
}

function jsfCheckDateByValue(strInput) {
	var re = /^((29-0?2-\d{2}([13579][26]|[02468][048]))|((0?[1-9]|[1-2]\d|3[0-1])-(0?[13578]|10|12)-\d{4})|((0?[1-9]|[1-2]\d|30)-(0?[469]|11)-\d{4})|((0?[1-9]|1\d|2[0-8])-0?2-\d{4}))/g;
	strInput = strInput.replace(/\-/g, ".");
	strInput = strInput.replace(/\//g,"-");
	if (strInput.match(re) == strInput) {
		return true;
	}
	return false;
}

/**
	This function checks the given value in the form is alpha numeric character

	@input objElement as Form Element
	@output value boolean true if it is alpha numeric characters or false
*/

function jsfCheckAlphaNumeric(objElement) {
	var re = /^[a-zA-Z0-9_\s]*/gi;
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(ALPHA_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

function jsfCheckName(objElement) {
	var re = /^[a-z][a-z0-9\(\)\-\'\.\,\/\\\s]*$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(NAME_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

function jsfCheckEmail(objElement) {
	var re = /^[a-zA-Z][a-zA-Z0-9\-_.]+[@][a-zA-Z0-9]+[.][a-zA-Z.]+$/gi;
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(EMAIL_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

function jsfCheckTime(objElement) {
//	var re = /^([01][0-9]|2[0-4]):[0-5][0-9]$/gi;
//	var re = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/gi;
	var re = /^[a-zA-Z0-9][a-zA-Z0-9\:\-\s]*/gi;

	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(TIME_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}
/**
	This function checks the given value in the form is special character

	@input objElement as Form Element
	@output value boolean true if it is special char or false
*/

function jsfCheckSpecialChar(objElement) {
	var re = /^[\w\W]*/gi;
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(SPECIAL_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}

/**
	This function checks the given file is in right format according to the file type attribute

	@input objElement as Form Element
	@output value boolean true if it is in correct format or false
*/

function jsfCheckFile(objElement) {
	var fileType = objElement.getAttribute("filetype");
		switch (fileType) {
		case "image":
			if ( !objElement.value.match(IMAGE_FILE) )  {
				jsfDisplayErrorMessage(IMAGE_FILE_ERROR, objElement.getAttribute("errname"));
				objElement.focus();
				return false;
			}
			break;
		case "doc":
			if ( !objElement.value.match(DOC_FILE) )  {
				jsfDisplayErrorMessage(DOC_FILE_ERROR, objElement.getAttribute("errname"));
				objElement.focus();
				return false;
			}
			break;
		
		case "html":
			if ( !objElement.value.match(HTML_FILE) )  {
				jsfDisplayErrorMessage(HTML_FILE_ERROR, objElement.getAttribute("errname"));
				objElement.focus();
				return false;
			}
			break;
	
	}
	return true;
}


/**
	This function check the maximum length of the particular element and it display error when maxlength is exceed.

	@input formElement 
	@output true if it does not exceed maxlength otherwise false
*/

function jsfCheckMaxLength(objElement) {
	var maxLength = objElement.getAttribute("maxlength");
	if ( !maxLength ) {
		maxLength = objElement.getAttribute("maxlen");
	}
	if (maxLength) {
		maxLength = parseInt(maxLength);
		var length = objElement.value.length;
		if (length > maxLength) {
			jsfDisplayErrorMessage(MAX_LENGTH_ERROR, objElement.getAttribute("errname"), maxLength);
			objElement.focus();
			return false;
		}
	}
	return true;
}


/**
	This function display error message in alert box to the user. This function takes n number of parameters.

	@input errorMsg string which error message has to be displayed
	@params n number of parameter will replace the place holder in the error message

*/

function jsfDisplayErrorMessage(errorMsg) {
	var argv = arguments;
	var argc = arguments.length;
	for ( var i = 0; i < argc ; i++ ) {
		var re = new RegExp("\\["+i+"\\]","g");
		errorMsg = errorMsg.replace(re, argv[i]);
	 
	}
	alert(errorMsg);
	return true;
}

/**
	This function replaces the leading and trailing whitespaces
	@input strInput any string value
	@output value after removing leading & trailing whitespaces
*/

function trim(strInput) {
	return strInput.toString().replace(/(^\s*|\s*$)/gi,"");
}

/**
	This function reset whole form parsing one by one element
	@input form to be resetted

*/

function jsfClearForm(form) {
	var type, objElement;
	for(var i=0; i < form.elements.length; i++) {
		objElement = form.elements[i];
		type = objElement.type;
		if  (type.match(/text|textarea/) )	{
			objElement.value = "";
		}
		if (type == "select" ) {
			objElement.selectedIndex = 0;
		}
	}
}

/**
	This function check the URL is correctly given or not
	@input URl to be checked
	@return true it the url is correctly formatted, otherwise false
*/

function jsfCheckUrl(url) {
	var re = /[\.\/\\]|http/gi
	if ( url.match(re) ) {
		return true;
	}
	return false;
}


/**
	This function change date to long
*/
function jsfGetLongDate(dd,mm,yy){
	dd=dd.toString()
	mm=mm.toString()
	yy=yy.toString()
	return parseInt(yy+mm+dd)
}
/**
	Extract date from given form date 
*/
function jsfGetFormDate (date) {
	var re = /^(0?\d{1,2})[\/-]0?\d{1,2}[\/-]\d{4}/g
	var arr= re.exec(date);
	var ret = false;
	for (i in arr) {
		if ( i==1) ret = true;
	}
	if (ret) return jsfCheckDateLength( arr[1] );
	return 0;
}

/**	
	Extract month from given form date 
*/
function jsfGetFormMonth (date) {
	var re = /^0?\d{1,2}[\/-](0?\d{1,2})[\/-]\d{4}/g
	var arr= re.exec(date);
	var ret = false;
	for (i in arr) {
		if ( i==1) ret = true;
	}
	if (ret) return jsfCheckDateLength( arr[1] );
	return 0;
}

/**
	Extract year from given form date 
*/

function jsfGetFormYear (date) {
	var re = /^0?\d{1,2}[\/-]0?\d{1,2}[\/-](\d{4})/g
	var arr= re.exec(date);
	var ret = false;
	for (i in arr) {
		if ( i==1) ret = true;
	}
	if (ret) return arr[1];
	return 0;
}
 
 /**
	This function compare two dates
 */
function jsfCompareDate (date1,date2) {
	var date1 = jsfGetLongDate ( jsfGetFormDate(date1), jsfGetFormMonth(date1), jsfGetFormYear(date1));
	var date2 = jsfGetLongDate ( jsfGetFormDate(date2), jsfGetFormMonth(date2), jsfGetFormYear(date2));
	if (date1 == date2) return 0;
	if (date1 > date2) return 1;
	if (date1 < date2) return -1;
}

function jsfDateToLong(date) {
	return jsfGetLongDate ( jsfGetFormDate(date), jsfGetFormMonth(date), jsfGetFormYear(date));
}

function jsfCheckDateLength (date) {
	var strDate = date.toString();
	if ( strDate.length == 1) strDate = "0"+strDate;
	return strDate;
}

function jsfIsArrayValueExist(arr, value) {
	for(var i = 0; i < arr.length; i++) {
		if(arr[i] == value)return true;
	}
	return false;
}

function jsfCancelClicked() {
	 location.href = location.href;
}

function getObject(id) {
	return document.getElementById(id);
}


function jsfReadOnly(inputCtl) {
	
	var controls = jsfChildElements(inputCtl);
	for(var i = 0; i < controls.length; i++) {
		if(controls[i].type == "text" || controls[i].type.match("^select") || controls[i].type.match("^checkbox") || controls[i].type.match("^textarea") ) {
			controls[i].disabled=true;
		}
	}
}

function jsfReleaseReadOnly(inputCtl) {
	var controls = jsfChildElements(inputCtl);
	for(var i = 0; i < controls.length; i++) {
		if(controls[i].type == "text" || controls[i].type.match("^select") || controls[i].type.match("^checkbox") || controls[i].type.match("^textarea") ) {
			controls[i].disabled=false;
		}
	}
}



/*  This Function Checks the Money Value . The Length is 11 for example (12345678.00) */
function jsfCheckMoneyValue(objElement){			
		var re = /^[1-9][0-9]{0,7}(\.[0-9]{2})?$/gi
		if(objElement.value.match(re) != objElement.value){
			jsfDisplayErrorMessage(MONEYVALUE_ERROR, objElement.getAttribute("errname"));
			objElement.focus();
			return false;
		}
	return true;
} 


function jsfCheckEstimatedTime(objElement) {
	var re = /^[0][1-9]|[1-5][0-9]|(^6[0])$/gi
	if ( objElement.value.match(re) != objElement.value ) {
		jsfDisplayErrorMessage(ET_ERROR, objElement.getAttribute("errname"));
		objElement.focus();
		return false;
	}
	return true;
}


/* This Function checks the valid Name. */

function jsfCheckAlphaName(objElement) {
		var re = /^[a-zA-Z][a-zA-Z\s]*/gi
		if(objElement.value.match(re) != objElement.value)	{				 
			jsfDisplayErrorMessage(NAMEALPHABET_ERROR, objElement.getAttribute("errname"));
			objElement.focus();
			return false;
		}
	return true;
}


function jsfGetMonthFirst(input) {
	var arr = input.split("/");	
	var strForm = arr[1]+"/"+arr[0]+"/"+arr[2];
	return strForm;	
}

function jsfGetDateFirst(input) {
	var arr = input.split("/");	
	var strForm = arr[0]+"/"+arr[1]+"/"+arr[2];
	return strForm;	
}

function jsfGetYearFirst(input) {
	var arr = input.split("/");	
	var strForm = arr[2]+"/"+arr[1]+"/"+arr[0];
	return strForm;	
}
//Multiline MaxLength...
function Count(text,long) 

{

	var maxlength = new Number(long); // Change number to your max length.

	if (text.value.length > maxlength)
	{

		text.value = text.value.substring(0,maxlength);

		alert(" Only " + long + " chars");

	}

}


