// ENGINE DESIGNED BY Iulian Cristea
// v. 0.1.0.0.0

// Known issues
//		If user refresh the page on Firefox, informations are kept, but validation on ajax inputs its not trigger so, at submit event, the submission system won't know if any ajax validations has occur.


// WHY USING UT VALIDATOR?
//    * very easy to use and implement
//    * flexibily of error messages which allows you to generate them directly in the html page, this will be usefull for multilanguage websites
//    * custom error messages, field (mandatory/optional) selection, data type field checking, field size, ajax files names
//    * multiple validation methods
//    	- SSN
//    	- ZIP Code
//    	- Punctuation
//    	- File
//    	- IP
//    	- Time
//    	- URL
//    	- Alpha
//    	- Alpha Numerics
//    	- CNP
//    	- Integer
//    	- Integer Positive
//    	- Float
//    	- CUI
//    	- Email
//    	- Date
//    	- Decimal
//    	- IBAN
//    	- CIF
//    * ajax validation
//    * checking identity between two fields like password matching or email matching
//    * simultaneously validation, on blur, focus, change events and at submit also
//    * posibility of generating a hidden input text which may be shown by a dropdown element when you select let's say "other" value. When selecting appears the input text and may complete your data. That field supports validation also.
//    * multiple field type validation like: input text, password, textarea, radio buttons, checkboxes
//    * a pleasant visibility of validation mode
//    * validation of multiple forms in a single page support without conflicting between fields and/or forms



//  NOT YET IMPLEMENTED. THESE FUNCTIONS EXISTS BUT ARE NOT ATTACHED TO THE ENGINE. STAU TUNED.
//    * validate-alpha (letters only) X
//    * validate-alphanum (only letters and numbers) X

//    * validate-url (a valid URL) X

//    * Date 		must be yyyy-mm-dd X
//    * Time X

//    * URL X	
//    * IP address X

//    * Integer X	
//    * Decimal X
//    * Real number X

//    * Punctuation X
//	  * Postal Code X
//	  * SSN X
//	  * File X



//	REQUIREMENTS
//	yui connection files: yahoo-min.js, event-min.js, connection-min.js
//	validateForm.js (this file)
//  arrays populated outside this file, in the html file or in another primary javascript file. This arrays must be initiated before onload event, otherwise validation will fail.
//	css classes with _Focus and _Blur labels as sufix
//	containers with the same name of id as the validated inputs but with a sufix _msg.



//  DOCUMENTATION
//	# 	every field must have an adiacent container with an id identical with the control one but with a _msg sufix for example: my_obj must have an my_obj_msg container
//	# 	every control must have classes with sufix _Blur on normal state and _Focus on focus state, for example: name_frm_Focus and name_frm_Blur
//	# 	vector __val_fields data population
//
//	# 	if want to check for consistency between 2 fields you need to use __same_fields variable which holds vectors with fields that you want to be the same. 
//		Pointer 0 of each subvector will contain the error message and afterwards you can add as many inputs as you want. 
//		You can validate more then one block of inputs at the same time, specifing on the next vector in the master one as well.
//	
//	#	if you want to use dropdown fields with a hidden input text, in case you have an other option you need to set X as value for dropdown record, where you want to syncronize with the text input. The hidden text input must have the same id like the select has and with a sufix _X.
//  #	for ajax validation you must include those three files: yahoo-min.js, event-min.js, connection-min.js, in order specified from yahoo utilities. This type of validation works only on a server not standalone.

__myForm 				= new Array;
__mySameFields 			= new Array;

function __checkSSN (ssn)
{
	var matchArr 	= ssn.match(/^(\d{3})-?\d{2}-?\d{4}$/);
	var numDashes 	= ssn.split('-').length - 1;

	if (matchArr == null || numDashes == 1)
		return false;
	else
	{
		if (parseInt(matchArr[1],10)==0)
			return false;
		else 
			return true;
	}
}

function __checkZip(zip)
{
	len		= zip.length;
	digits	= "0123456789";
	
	if (len != 5)
		return false;
	
	for (i=0; i<5; i++)
	{
		if (digits.indexOf(zip.charAt(i))<0)
			return false; 
	}
	return true;
}


var __checkPunctuation = function(sText)
{
	var ValidChars = "`~!@#$%^&*()-_=+;:'\",./<>?";
	var isPunctuation=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && isPunctuation==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			isPunctuation = false;
	}
	return isPunctuation;
}

var __checkFile = function(__File)
{
	filter = /^([a-zA-Z0-9\-\:\/\. \!\'\;\+\=\&\(\)\^\%\$\#\@\~\`\,])$/;
	if (filter.test(__URL))
		return true;
	else
		return false;
}



var __checkIP = function(__IP)
{
	ipArr = __IP.split(".");
	
	if (ipArr.length != 4)
		return false;
	
	if (!__checkIntegerPositive(timeArr[0]))
		return false;
	if (!__checkIntegerPositive(timeArr[1]))
		return false;
	if (!__checkIntegerPositive(timeArr[2]))
		return false;
	if (!__checkIntegerPositive(timeArr[3]))
		return false;
	
	if (timeArr[0].length<1 || timeArr[0].length>3)
		return false;
	if (timeArr[1].length<1 || timeArr[1].length>3)
		return false;
	if (timeArr[2].length<1 || timeArr[2].length>3)
		return false;
	if (timeArr[3].length<1 || timeArr[3].length>3)
		return false;

	if (timeArr[0]>255)
		return false;
	if (timeArr[1]>255)
		return false;
	if (timeArr[2]>255)
		return false;
	if (timeArr[3]>255)
		return false;
	
	return true;
}

var __checkTime = function(__time)
{
	timeArr = __time.split(":");
	
	if (timeArr.length != 3)
		return false;
	
	if (!__checkIntegerPositive(timeArr[0]))
		return false;
	if (!__checkIntegerPositive(timeArr[1]))
		return false;
	if (!__checkIntegerPositive(timeArr[2]))
		return false;
	
	if (timeArr[0].length!=2)
		return false;
	if (timeArr[1].length!=2)
		return false;
	if (timeArr[2].length!=2)
		return false;

	if (timeArr[0]>12)
		return false;
	if (timeArr[1]>60)
		return false;
	if (timeArr[2]>60)
		return false;
	
	return true;
}


var __checkURL = function(__URL)
{
	filter = /^(http|https)(\:\/\/www\.)?([a-zA-Z0-9\-])+([a-z]){2,4}$/;
	if (filter.test(__URL))
		return true;
	else
		return false;
}


var __checkAlpha = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var isLetter=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && isLetter==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			isLetter = false;
	}
	return isLetter;
}


var __checkAlphaNum = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	var isLetter=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && isLetter==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			isLetter = false;
	}
	return isLetter;
}


var browserDetection = function()
{
	var browser = "IE";
	
	var browserString=navigator.userAgent ;
	if (browserString.indexOf("Gecko")!=-1)
		browser = "FF";
	if (browserString.indexOf("Opera")!=-1)
		browser = "Opera";
	if (browserString.indexOf("Netscape")!=-1)
		browser = "Netscape";
	if (browserString.indexOf("Chrome")!=-1)
		browser = "Chrome";
	if (browserString.indexOf("Safari")!=-1)
		browser = "Safari";
	if (browserString.indexOf("MSIE")!=-1)
		browser = "IE";
	
	return browser;
}

__ajax_checkControl = new Array();

var validateAsType = function(elemId)
{
	//alert(elemId)
	for (i=0;i<__controlsEventsArray.length;i++)
	{
		if (__controlsEventsArray[i][0]==elemId)
			rs_vector = __controlsEventsArray[i];
	}
	switch (rs_vector[3])
	{
		case "text":
			return true;
		break;
		case "cnp":
			return __validateCNP(document.getElementById(elemId).value);
		break;
		case "email":
			return __checkEmail(document.getElementById(elemId).value);
		break;
		case "select":
			return __checkSelected(document.getElementById(elemId).value, elemId, "objEvent");
		break;
	}
}

var validateAsSize = function(elemId, validatePlace)
{
	if (validatePlace=="objEvent")
	{
		for (i=0;i<__controlsEventsArray.length;i++)
		{
			if (__controlsEventsArray[i][0]==elemId)
				rs_vector = __controlsEventsArray[i];
		}
	}
	else
	{
		for (i=0;i<__myForm.length;i++)
		{
			if (__myForm[i][0]==elemId)
				rs_vector = __myForm[i];
		}
	}
	if (document.getElementById(elemId).value.length > rs_vector[4])
		return false;
	else
		return true;
}



var __constructRsData = function(state, response)
{
	if (state=="ok")
	{
		var imgState = "Ok";
		var lblState = "ok";
	}
	else if (state=="error")
	{
		var imgState = "Error";
		var lblState = "error";
	}
	else
		return "send state error";

	var errContainer  = '<div class="frm_validator_container">';
		errContainer += '<div class="frm_validator_image"><img src="'+__icons_path+'frm'+imgState+'.png" /></div>';
		errContainer += '<div class="frm_validator_'+lblState+'_label">'+response+'</div>';
		errContainer += '</div>';
	return errContainer;
}

var __ajaxValidationCheck = false;

var __responseSuccessAjaxValidation = function(o)
{
	__ajaxValidationCheck = true;
	var rs = o.responseText;
	rs = rs.split("|");
	if (rs[0]=="ok")
	{
		document.getElementById(rs[1]+"_msg").innerHTML =  __constructRsData("ok", rs[2]);
		var tmp_ajax_checkControl = new Array();
		if (__ajax_checkControl.length!=0)
		{
			var j = 0;
			for (i=0;i<__ajax_checkControl.length;i++)
			{
				if (__ajax_checkControl[i]!=rs[1])
					tmp_ajax_checkControl[j] = __ajax_checkControl[i];
				j++;
			}
			__ajax_checkControl = tmp_ajax_checkControl;
		}
	}
	else
	{
		document.getElementById(rs[1]+"_msg").innerHTML = __constructRsData("error", rs[2]);
		if (__ajax_checkControl.length==0)
			__ajax_checkControl[0] = rs[1];
		else
			__ajax_checkControl[__ajax_checkControl.length] = rs[1];
	}
};

var __responseFailureAjaxValidation = function(o)
{
	alert('Ajax Validation Failed. Possible reasons: You may not used a server and tried to access this directly.');
}
var __callbackAjaxValidation =
{
	success:__responseSuccessAjaxValidation,
	failure:__responseFailureAjaxValidation
};




function __ajaxValidation(__ajaxCheck, elemId)
{
	var cObj = YAHOO.util.Connect.asyncRequest('GET', __ajax_file_validation+'?action='+__ajaxCheck+'&field='+elemId+'&value='+document.getElementById(elemId).value, __callbackAjaxValidation);

	//alert("function executed")
//	if (document.getElementById("username").value=="Iulian")
//		return true;
//	else
//		return false;
}




var postStates = function(fieldOK, fieldMsg, elemId, fieldType, __ajaxCheck)
{
	if (fieldOK && __ajaxCheck!="")
	{
		//fieldOK = 
//		if (__ajax_file_validation==undefined)
//			alert("Ajax Validation File Was Not Specified !!!");
//		else
			__ajaxValidation(__ajaxCheck, elemId);
		//alert(fieldOK)
	}

	if (fieldType!="checkbox" && fieldType!="radio")
	{
		var result = validateAsType(elemId);
		if (!result)
			fieldOK = false;
		
		if (fieldType=="select")
		{
//			if (document.getElementById(elemId).value=="X" && document.getElementById(elemId+"_X").value=="")
	//			fieldOK = false;
		}
		else
		{
			result = validateAsSize(elemId, "objEvent");
			if (!result)
				fieldOK = false;
		}
	}
	if (fieldOK)
	{
		var imgSrc 		= "Ok";
		var labelColor 	= __okColor;
	}
	else
	{
		for (i=0;i<__controlsEventsArray.length;i++)
		{
			if (__controlsEventsArray[i][0]==elemId)
				rs_vector = __controlsEventsArray[i];
		}
		fieldMsg = rs_vector[1];

		var imgSrc 		= "Error";
		var labelColor 	= __errColor;
	}

	var errContainer  = '<div class="frm_validator_container">';
		errContainer += '<div class="frm_validator_image"><img src="'+__icons_path+'frm'+imgSrc+'.png" /></div>';
		errContainer += '<div class="frm_validator_unknown_label" style="color:#'+labelColor+';">'+fieldMsg+'</div>';
		errContainer += '</div>';

	if (document.getElementById(elemId+"_msg"))
		document.getElementById(elemId+"_msg").innerHTML = errContainer;
	else
		document.getElementById(__shortID(elemId)+"_msg").innerHTML = errContainer;
}

var __shortID = function(requestedValue)
{
	var shortLabel = requestedValue;
	shortLabelArr = shortLabel.split("_");
	shortLabel = "";
	for (_xx=0;_xx<shortLabelArr.length;_xx++)
	{
		if (_xx!=shortLabelArr.length-1)
			shortLabel += shortLabelArr[_xx]+"_";
	}
	shortLabel = shortLabel.substr(0, shortLabel.length-1);
	return shortLabel;
}

var triggerEvents = function(evt)
{
	if (__val_browser=="IE")
		elemProperties = evt.srcElement;
	if (__val_browser=="FF")
		elemProperties = evt.target;

//	window.status = elemProperties.className
	var elem = document.getElementById(elemProperties.id);
	var elemCls	= elemProperties.className;
	
	__val_control_requests = "";
	//alert(elemProperties.id)

	
	for (__val_i=0;__val_i<__controlsEventsArray.length;__val_i++)
	{
		if (__controlsEventsArray[__val_i][0]==elemProperties.id || __controlsEventsArray[__val_i][0]==__shortID(elemProperties.id))
			__val_control_requests = __controlsEventsArray[__val_i];
	}

	if (evt.type=="focus")
	{
		var baseCls 	= elemCls.replace("_Blur", "");
		baseCls 		= baseCls.replace("_Focus", "");
		elem.className	= baseCls+'_Focus';
	}
	
	if (evt.type=="change")
	{
		if (elem.value=="X")
			document.getElementById(elemProperties.id+"_X_Container").style.display = '';
		else
			document.getElementById(elemProperties.id+"_X_Container").style.display = 'none';
	}
	
	
	var elemStateOK = true;
	var elemMessage = "";
	
	if (evt.type=="blur")
	{
		if (document.getElementById(elemProperties.id+"_msg"))
			document.getElementById(elemProperties.id+"_msg").innerHTML = 'checking...';
		else
		{
			document.getElementById(__shortID(elemProperties.id)+"_msg").innerHTML = 'checking...';
		}

		if (__val_control_requests[3]=="checkbox" && __val_control_requests[2]=="mandatory" && document.getElementById(elemProperties.id).checked==false)
		{
			elemMessage = __val_control_requests[1];
			elemStateOK = false;
		}
		else if (document.getElementById(elemProperties.id).value.trim()=="" && (__val_control_requests[2]=="mandatory" || __val_control_requests[2]=="mandatory_conditional"))
		{
			elemMessage = __val_control_requests[1];
			elemStateOK = false;
		}
		//alert(__val_control_requests)
		if (elemStateOK)
		{
			
			
			//if (shortLabel)
			//{
				//alert(__val_control_requests)
				//postStates(elemStateOK, "Ok", shortLabel, __val_control_requests[3]);
				//alert(__val_control_requests[3])
			//}
			//else
				postStates(elemStateOK, "Ok", elemProperties.id, __val_control_requests[3], __val_control_requests[5]);
		}
		else
		{
			//if (shortLabel)
			//	postStates(elemStateOK, __val_control_requests[1], shortLabel, __val_control_requests[3]);
			//else
				postStates(elemStateOK, __val_control_requests[1], elemProperties.id, __val_control_requests[3], __val_control_requests[5]);
		}
		var baseCls 	= elemCls.replace("_Focus", "");
		baseCls 		= baseCls.replace("_Blur", "");
		elem.className	= baseCls+'_Blur';
	}
	
	if (evt.type=="keyup")
	{
		var currentNrOfChars = document.getElementById(elemProperties.id).value.length
		var maximumNrOfChars = __val_control_requests[4];
		var leftNrOfChars	 = parseInt(maximumNrOfChars - currentNrOfChars)
		var charsLeftMessage = "";
		if (leftNrOfChars==1)
			charsLeftMessage = leftNrOfChars + " character left"
		else if (leftNrOfChars==0)
			charsLeftMessage = "No more characters left"
		else if (leftNrOfChars>1)
			charsLeftMessage = leftNrOfChars + " characters left"
		else
		{
			var overLeftNrOfChars = leftNrOfChars * -1;
			charsLeftMessage = '<span class="frm_validator_chars_over">Error: You have '+overLeftNrOfChars + ' characters over limit</span>';
		}
			
		document.getElementById(elemProperties.id+"_msg").innerHTML = charsLeftMessage;
	}
}

__val_browser = browserDetection();

__controlsEventsArray = new Array();

var __setEvents = function()
{
	__tmp_pos = 0;
	for (i=0;i<__val_fields.length;i++)
	{
		for (j=0;j<__val_fields[i].length;j++)
		{
			__controlsEventsArray[__tmp_pos] = __val_fields[i][j];
			__tmp_pos++;
		}
	}
	
	__val_myElem = new Array;
	__val_i = 0;
	for (var __x_i=0;__x_i < __controlsEventsArray.length; __x_i++)
	{
		//alert(__controlsEventsArray[__x_i][0])
		if (document.getElementById(__controlsEventsArray[__x_i][0]))
		{
			__val_frmCurrentElem = __controlsEventsArray[__x_i][0];
			__val_myElem[__val_i] = document.getElementById(__val_frmCurrentElem);
			
			if (__val_browser=="FF")
			{
				if (__val_myElem[__val_i])
				{
					__val_myElem[__val_i].addEventListener("focus", function(event) {triggerEvents(event);}, false);
					__val_myElem[__val_i].addEventListener("blur",  function(event) {triggerEvents(event);}, false);
					__val_myElem[__val_i].addEventListener("keyup", function(event) {triggerEvents(event);}, false);
					if (__controlsEventsArray[__x_i][3]=="select")
						__val_myElem[__val_i].addEventListener("change", function(event) {triggerEvents(event);}, false);
				}
			}
			if (__val_browser=="IE")
			{
				if (__val_myElem[__val_i])
				{
					__val_myElem[__val_i].attachEvent("onfocus", function(event) {triggerEvents(event);} );
					__val_myElem[__val_i].attachEvent("onblur",  function(event) {triggerEvents(event);} );
					__val_myElem[__val_i].attachEvent("onkeyup", function(event) {triggerEvents(event);} );
					if (__controlsEventsArray[__x_i][3]=="select")
						__val_myElem[__val_i].attachEvent("change", function(event) {triggerEvents(event);} );
				}
			}
			__val_i++;
		}
		else if (document.getElementById(__controlsEventsArray[__x_i][0]+"_0"))
		{
			__val_frmCurrentElem = __controlsEventsArray[__x_i][0];
			__exist_radio 	= true;
			__ji_init		= 0;
			while (__exist_radio)
			{
				//alert("radio found")
				if (document.getElementById(__val_frmCurrentElem+"_"+__ji_init))
				{
					__val_myElem[__val_i] = document.getElementById(__val_frmCurrentElem+"_"+__ji_init);
					if (__val_browser=="FF")
					{
						if (__val_myElem[__val_i])
						{
							__val_myElem[__val_i].addEventListener("focus", function(event) {triggerEvents(event);}, false);
							__val_myElem[__val_i].addEventListener("blur",  function(event) {triggerEvents(event);}, false);
							__val_myElem[__val_i].addEventListener("keyup", function(event) {triggerEvents(event);}, false);
						}
					}
					if (__val_browser=="IE")
					{
						if (__val_myElem[__val_i])
						{
							__val_myElem[__val_i].attachEvent("onfocus", function(event) {triggerEvents(event);} );
							__val_myElem[__val_i].attachEvent("onblur",  function(event) {triggerEvents(event);} );
							__val_myElem[__val_i].attachEvent("onkeyup", function(event) {triggerEvents(event);} );
						}
					}
					__val_i++;
				}
				else
					__exist_radio = false;
				__ji_init++;
			}
		}
	}
}




var __validateCNP = function(myValue)
{
	var goodCNP = true;
	var keyTest = "279146358279";
	var keyProdArr = new Array();
	var keyProd = 0;
	var ArrKeyTest  = keyTest.split("");
	if (myValue.length!=13)
		goodCNP = false;
	else
	{
		ArrCNP  = myValue.split("");
		month = ArrCNP[3]+""+ArrCNP[4]
		if (month>12)
			goodCNP = false;
		day   = ArrCNP[5]+""+ArrCNP[6]
		if (day>31)
			goodCNP = false;

		for (i=0;i<12;i++)
			keyProdArr[i] = parseInt(ArrCNP[i]) * parseInt(ArrKeyTest[i]);

		for (i=0;i<12;i++)
			keyProd += parseInt(keyProdArr[i]);

		var keyControl = keyProd%11;

		if (keyControl==10)
			keyControl = 1;

		if (keyControl!=ArrCNP[12])
			goodCNP = false;
	}
	return goodCNP;
}




String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g,"");
}

//var __notEmptyCheck = function(idToCheck)
//{
//	var __myValue = document.getElementById(idToCheck).value;
//	if (__myValue.trim()=="")
//		return false;
//	else
//		return true;
//}

var __getErrorForField = function(fdlToCheck, validatePlace)
{
	if (validatePlace=="objEvent")
	{
		for (i=0;i<__controlsEventsArray.length;i++)
		{
			if (__controlsEventsArray[i][0]==fdlToCheck)
				return __controlsEventsArray[i][1];
		}
	}
	else if (validatePlace=="submit")
	{
		for (i=0;i<__myForm.length;i++)
		{
			if (__myForm[i][0]==fdlToCheck)
				return __myForm[i][1];
		}
	}
}

var __checkSelected = function(valueToCheck, idToCheck, validatePlace)
{
	if (valueToCheck=="0")
		return false;
	else if (valueToCheck=="X")
	{
		if (document.getElementById(idToCheck+"_X") && document.getElementById(idToCheck+"_X").value=="")
		{
//			document.getElementById(idToCheck+"_X_msg").innerHTML = __constructRsData("error", "Please complete field")
			//return false;
			document.getElementById(idToCheck+"_X_msg").innerHTML = __constructRsData("error", __getErrorForField(idToCheck+"_X", validatePlace) )
			return true;
		}
		else
			return true;
	}
	else
		return true;
}

var __checkInteger = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "0123456789-";
	var IsNumber=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && IsNumber==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			IsNumber = false;
	}
	return IsNumber;
}

var __checkIntegerPositive = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "0123456789";
	var IsNumber=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && IsNumber==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			IsNumber = false;
	}
	return IsNumber;
}

var __checkFloat = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "0123456789.-";
	var IsNumber=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && IsNumber==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			IsNumber = false;
	}
	return IsNumber;
}

var __checkCUI = function(idToCheck)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "0123456789";
	var IsNumber=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && IsNumber==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			IsNumber = false;
	}
	if (IsNumber)
	{
		if (sText.length < 8)
			return false;
		else
			return true;
	}
	else
		return false;
}

var __checkEmail = function(__Email)
{
	filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(__Email))
		return true;
	else
		return false;
}

var __checkDate = function(data)
{
	var buff=data.split("/");

	if(buff.length != 3)
		return false;
	if( (buff[0].length != 1 || buff[0].length != 2) && buff[1].length != 2 && buff[2].length != 4)
		return false;
	data=buff[0]+buff[1]+buff[2];
		
	var k=true;	
 	var size = data.length;
    if(size > 0 && size < 7)
		k=false;
    if(size > 6)
    {
		var anNormal = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		var anBisectFeb = 29;
		var isBisect = true;

		if (size == 7)
			data = '0'+data;
		var zi = Number(data.substring(0,2));
		var luna = Number(data.substring(2,4));
		var an = Number(data.substring(4,8));

		if(isNaN(zi) || isNaN(luna) || isNaN(an))
			k = false;
		else
		{ 
			if( parseInt(an) < 1700)
				k = false;
			else
			{
				if( parseInt(an) % 4 == 0 )
				{
					if( (parseInt(an) % 100 == 0) && (parseInt(an) % 400 != 0) )
						isBisect = false;
					else
						isBisect = true;
				}
				else
					isBisect = false;
				if((parseInt(luna) > 12) || (parseInt(luna) < 1))
					k=false;
				else
				{
					if(parseInt(luna) == 2)
					{
						if(isBisect)
						{
							if((parseInt(zi) < 1) || (parseInt(zi) > anBisectFeb))
								k=false;
						}
						else
						{
							if((parseInt(zi) < 1) || (parseInt(zi) > anNormal[parseInt(luna)-1]))
								k=false;
						}
					}
					else
					{
						if((parseInt(zi) < 1) || (parseInt(zi) > anNormal[parseInt(luna)-1]))
							k=false;
					}
				}
			}
	   	}
  	}
	return k;
}

var __checkDecimal = function(idToCheck,number)
{
	var sText = document.getElementById(idToCheck).value;
	var ValidChars = "0123456789-.";
	var IsDecimal=true;
	var Char;
	
	for (x__i=0; x__i<sText.length && IsDecimal==true; x__i++) 
	{ 
		Char = sText.charAt(x__i);
		if (ValidChars.indexOf(Char) == -1) 
			IsDecimal = false;
	}
	
	var buff = sText.split('.');
	if(buff.length >2)
		IsDecimal = false;
	else
		if(buff.length==2)
		{
			//if(!__checkInteger(buff[1]))
			//	IsDecimal = false;
			if(buff[1].length > number)
				IsDecimal = false;
		}
	
	var buff = sText.split('-');
	if(buff.length >2)
		IsDecimal = false;
	else
		if(buff.length==2)
		{
			if(trim(buff[0])!='')
				IsDecimal = false;
		}
	return IsDecimal;
}

var __validate = function(myId, validateMode, mandatory_state)
{
	isValid = true;
	if (document.getElementById(myId))
		__myValue = document.getElementById(myId).value;
	else
		__myValue = document.getElementById(myId+"_0").value;
	//for (var __xx=0;__xx<validateMode.length;__xx++)
	//{


//alert(myId)
		if ((mandatory_state=="mandatory" || mandatory_state=="mandatory_conditional") && ((__myValue=="") || (__myValue=="0")))
			return false;
		else
		{
			switch (validateMode)
			{
				case "checkbox":
					if (mandatory_state=="mandatory" && document.getElementById(myId).checked==false)
						return false;
					else
						return true;
				break;
				case "radio":
					if (mandatory_state=="mandatory")
					{
						__exist_radio = true;
						__radio_checked = false;
						__ji=0;
//						alert("radio detection levels in progress...")
						while (__exist_radio)
						{
//							alert(__exist_radio)
							if (document.getElementById(myId+"_"+__ji))
							{
//								alert(document.getElementById(myId+"_"+__ji).checked)
								if (document.getElementById(myId+"_"+__ji).checked==true)
									__radio_checked = true;
							}
							else
								__exist_radio = false;
							__ji++;
						}
						return __radio_checked;
					}
					else
						return true;
				break;
				case "!empty":
					if (__myValue!="")
						return __notEmptyCheck(myId);
					else
						return true;
				break;
				case "select":
					if (__myValue!="0")
						return __checkSelected(document.getElementById(myId).value, myId, "submit");
					else
						return true;
				break;
				case "integer":
					if (__myValue!="")
						return __checkInteger(myId);
					else
						return true;
				break;
				case "alphanumeric":
					if (__myValue!="")
						return __checkAlphanumeric(myId);
					else
						return true;
				break;
				case "float":
					if (__myValue!="")
						return __checkFloat(myId);
					else
						return true;
				break;
				case "cnp":
					if (__myValue!="")
						return __validateCNP(document.getElementById(myId).value);
					else
						return true;
				break;
				case "cui":
					if (__myValue!="")
						return __checkCUI(myId);
					else
						return true;
				break;
				case "email":
					if (__myValue!="")
						return __checkEmail(document.getElementById(myId).value);
					else
						return true;
				break;
				case "date":
					if (__myValue!="")
						return __checkDate(myId);
					else
						return true;
				break;
				case "decimal2":
					if (__myValue!="")
						return __checkDecimal(myId,2);
					else
						return true;
				break;
				default:
					return true;
				break;
			}
		}
	//}
}

var array_search = function(needle, arrayMixed)
{
	var has_found = false;
	for (i=0;i<arrayMixed.length;i++)
	{
		if (arrayMixed[i]==needle)
			has_found = true;
	}
	return has_found;
}
function __checkForm(frmToValidate)
{
//	var __inputOK = "1px solid #000000";
//	var __inputError = "3px double #ff0000";

//	var __generalMsgTxt = __controlData["general_message"];
	
	
	__formValid = true;
	__myForm 				= __val_fields[frmToValidate];
	__mySameFields 			= __same_fields[frmToValidate];

	for (__i=0;__i<__myForm.length;__i++)
	{
		if (__myForm[__i])
		{
			var errContainer  = '<div class="frm_validator_container">';
				errContainer += '<div class="frm_validator_image"><img src="'+__icons_path+'frmOk.png" /></div>';
				errContainer += '<div class="frm_validator_ok_label">Ok</div>';
				errContainer += '</div>';
			
			if (document.getElementById(__myForm[__i][0]))
			{
				if (!array_search(__myForm[__i][0], __ajax_checkControl))
					document.getElementById(__myForm[__i][0]+"_msg").innerHTML = errContainer;
			}
			else if (document.getElementById(__myForm[__i][0]+"_1"))
				document.getElementById(__myForm[__i][0]+"_msg").innerHTML = errContainer; // check compatibility with radio buttons
				
		}
	}

	for (__i=0;__i<__myForm.length;__i++)
	{
		var __checkTypes = [];
//		var __x_contor = 0;
//		for (__j=3;__j<__myForm[__i].length;__j++)
	//	{
		//	alert(__myForm[__i][__j])
			//__checkTypes[__x_contor] = __myForm[__i][__j];
		__checkTypes = __myForm[__i][3];
			//__x_contor++;
		//}
		
		if (__myForm[__i][3]!="checkbox" && __myForm[__i][3]!="radio" && __myForm[__i][3]!="select")
			__response = validateAsSize(__myForm[__i][0], "submit");
		else
			__response = true;
		
		if (__response)
		{
			//alert(__myForm[__i][0]+"~"+ __checkTypes+"~"+__myForm[__i][2]);
			__response = __validate(__myForm[__i][0], __checkTypes, __myForm[__i][2]);
		}

		if (!__response)
		{
			if ((__myForm[__i][1]!="") && (document.getElementById(__myForm[__i][0]+"_msg")))
			{
				var errContainer  = '<div class="frm_validator_container">';
					errContainer += '<div class="frm_validator_image"><img src="'+__icons_path+'frmError.png" /></div>';
					errContainer += '<div class="frm_validator_error_label">'+__myForm[__i][1]+'</div>';
					errContainer += '</div>';

				document.getElementById(__myForm[__i][0]+"_msg").innerHTML = errContainer;
//				document.getElementById(__myForm[__i][0]).style.border = __inputError;
			}
			__formValid = false;
		}
	}
	
	if (__formValid)
		__formValid = __validateForDifference();
	
	if (__formValid)
	{
		if (__ajax_checkControl.length > 0)
		{
			document.getElementById(__ajax_checkControl[0]).focus();
			return false;
		}
	}
	
	if (!__formValid)
	{
		//if (__generalMsgTxt!="")
		//{
			//if (document.getElementById(__generalMsgTxt))
				//document.getElementById(__generalMsgTxt).style.display='';
		//}
		return false;
	}
}

var __validateForDifference = function()
{
	__is_different = false;
	if (__mySameFields)
	{
		if (__mySameFields.length > 0)
		{
			for (i=0;i<__mySameFields.length;i++)
			{
				current_fields_set 	= __mySameFields[i];
				__default_value 	= "";
				for (j=1;j<current_fields_set.length;j++)
				{
					if (__default_value=="")
						__default_value = document.getElementById(current_fields_set[j]).value;

					if (__default_value!=document.getElementById(current_fields_set[j]).value)
						__is_different = true;
				}
				if (__is_different)
				{
					for (j=1;j<current_fields_set.length;j++)
					{
						var errContainer  = '<div class="frm_validator_container">';
							errContainer += '<div class="frm_validator_image"><img src="'+__icons_path+'frmError.png" /></div>';
							errContainer += '<div class="frm_validator_error_label">'+current_fields_set[0]+'</div>';
							errContainer += '</div>';
		
						document.getElementById(current_fields_set[j]+"_msg").innerHTML = errContainer;
					}
					return false;
				}
				//__is_different = false;
			}
		}
	}
	return true;
}



function __checkIBAN(vibanini)
{
	var vibanini 	= vibanini.toUpperCase(); 
	var vibantrimed = vibanini.replace(/^\s+|\s+$/g, '') ;
	
	if (vibantrimed.length==0)
		return true;
	
	var viban;
	var vibanconv = '';
	var nr;
	var snr;
	var rest;
	var srest;
	var i;

	if (vibantrimed.length != 24)
		return false;
	else
	{
		viban = vibantrimed.substr(4, vibantrimed.length) + vibantrimed.substr(0, 4);

		for ( i = 0; i < viban.length ; i++)
		{
			nr = 0;
			if ( viban.substr( i, 1) == "A")
				nr = 10;
			else if ( viban.substr(i, 1) == "B")
				nr = 11;
			else if ( viban.substr(i, 1) == "C")
				nr = 12;
			else if ( viban.substr(i, 1) == "D")
				nr = 13;
			else if ( viban.substr(i, 1) == "E")
				nr = 14;
			else if ( viban.substr(i, 1) == "F")
				nr = 15;
			else if ( viban.substr(i, 1) == "G")
				nr = 16;
			else if ( viban.substr(i, 1) == "H")
				nr = 17;
			else if ( viban.substr(i, 1) == "I")
				nr = 18;
			else if ( viban.substr(i, 1) == "J")
				nr = 19;
			else if ( viban.substr(i, 1) == "K")
				nr = 20;
			else if ( viban.substr(i, 1) == "L")
				nr = 21;
			else if ( viban.substr(i, 1) == "M")
				nr = 22;
			else if ( viban.substr(i, 1) == "N")
				nr = 23;
			else if ( viban.substr(i, 1) == "O")
				nr = 24;
			else if ( viban.substr(i, 1) == "P")
				nr = 25;
			else if ( viban.substr(i, 1) == "Q")
				nr = 26;
			else if ( viban.substr(i, 1) == "R")
				nr = 27;
			else if ( viban.substr(i, 1) == "S")
				nr = 28;
			else if ( viban.substr(i, 1) == "T")
				nr = 29;
			else if ( viban.substr(i, 1) == "U")
				nr = 30;
			else if ( viban.substr(i, 1) == "V")
				nr = 31;
			else if ( viban.substr(i, 1) == "W")
				nr = 32;
			else if ( viban.substr(i, 1) == "X")
				nr = 33;
			else if ( viban.substr(i, 1) == "Y")
				nr = 34;
			else if ( viban.substr(i, 1) == "Z")
				nr = 35;

			if ( nr >= 10 && nr <= 35)
			{
				snr = nr+'';		
				vibanconv = vibanconv+snr;	
			}
			else
				vibanconv = vibanconv + viban.substr(i,1);
		}

		while ( vibanconv.length >= 5)
		{
			rest = parseInt( vibanconv.substr(0, 5)) % 97;
			srest = rest+'';
			vibanconv = srest + vibanconv.substring( 5, vibanconv.length );
		}

		rest = parseInt( vibanconv)% 97;
		if (rest == 1)
			return true;
		else
			return false;
	}	
}


function __checkCIF(vcifini)
{
	vcifini 	= vcifini.toUpperCase(); 
	vcifini 	= vcifini.replace(/^\s+|\s+$/g, '');
	
	if (vcifini.length==0)
		return true;

	var vcif;
	if (vcifini.substr(0,2)=="RO")
		vcif = vcifini.substr(2, vcifini.length);
	else
		vcif= vcifini;
	
	var i;
	var nr;		
	var nuenr = false;
	var cifinv = '';
	
	for( i = 0; i < vcif.length ; i++)
	{
		nr = parseInt(vcif.substr(i,1));
		if ( !(nr>=0 && nr<=9) )
			nuenr = true;
	}			
	if (nuenr)
		return false;

	for( i = vcif.length-1 ; i>=0; i--)
		cifinv=cifinv + vcif.substr(i,1);
	
	var ciffaraprimul 	= cifinv.substr(1, cifinv.length);
	var cheie			= '235712357';
	var total=0;
	var nr1;
	var nr2;
	
	for (i=0; i<ciffaraprimul.length; i++)
	{
		nr1 	= parseInt(ciffaraprimul.substr(i,1));
		nr2 	= parseInt(cheie.substr(i,1));	  
		total 	= total + nr1 * nr2;
	}
	
	total 		= total * 10;
	var rest 	= total % 11;
	var cc;
	
	if (rest==10)
		cc=0;
	else
		cc = rest + '';	
	
	if (cifinv.substr(0,1)==cc)
		return true;
	else
		return false;
}