/*=============================================================================
'//	This file contains Validation scripts for HTML forms.
'//	Designed by Ehsan Elahi Malik  on  12th June 2007
'//
'//	file contains complex Javascript and one small mistake can cause problems 
'//	at all pages wherever it is being used. Be very careful if you must edit it.
'//
'//
'//	This whole script mainly uses the main function "setValidation()" and all
'//	other functions are eventually helping this function to work.
'//	Syntax of setValidation...
'//
'//	setValidation( ctrl, valCtrl, eventType, ValidationType, ErrMsg, ErrTarget, CancelEvent, chkValue )
'//	  ctrl			This is the control who will be triggering the event.
'//	  valCtrl		This is the control whose value will be checked on event.
'//	  eventType		All valid JavaScript events can be passed to set this event for given "ctrl".
'//					Sample values...	onClick, onBlur, onDblClick, onMouseOver
'//	  ValidationType	Name of validation function will be passed here.
'//					Following functions are currently available...
'//					IsInputEmpty	Checks if value in INPUT or TEXTAREA is empty
'//					IsMinLength		Checks if value in INPUT or TEXTAREA has minimum required length.
'//					IsMaxLength		Checks if value in INPUT or TEXTAREA has maximum allowed length.
'//					HasValidChars	Checks if the value of target element contains only the given characters.
'//					MatchValue		Compares two controls for same values (Controls be provided in "Control1|Control2" format)
'//					IsValidEmail	Checks if value in INPUT or TEXTAREA is a valid email address
'//					IsMaxValue		Checks and fails if value in a field is more than a given value
'//					IsMinValue		Checks and fails if value in a field is less than a given value
'//	  ErrMsg		Error Message to be displayed is case of failed validation
'//	  ErrTarget		Target element of Error Message where it will be displayed.
'//					DIV and SPAN are valid targets at the moment
'//					in case of invalid target object, Message will be placed in an Alert box
'//	  CancelEvent	If the value is one, current event will be cancelled.
'//	  chkValue		optional field used in some of the ValidationType functions as extra parameter
'//
'//=============================================================================
'//	Last updated by Ehsan on 6th Dec 2007
'//=============================================================================
*/
//=============================================================================
//	This function binds each control to relative event validation.
//=============================================================================
function setValidation( ctrl, valCtrl, eventType, ValidationType, ErrMsg, ErrTarget, CancelEvent, chkValue, fnSuccess )
{
	var ev, func, control = document.getElementById( ctrl );

	eval("ev = control." + eventType + ";");
	if (typeof(ev) == "function")
	{
	    ev = ev.toString();
	    ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
	}
	else
	    ev = "";

	if (navigator.appName.toLowerCase().indexOf('explorer') > -1)
		func = new Function( ev + " if( " + ValidationType + "(event, '" + valCtrl + "', '" + ErrMsg + "', '" + ErrTarget + "', '" + chkValue + "', '"+ fnSuccess +"' ) == false && " + CancelEvent + " == 1 ) { event.returnValue = false; return false;}" );
	else
		func = new Function("event", ev + " if( " + ValidationType + "(new IECompatibleEvent( event ), '" + valCtrl + "', '" + ErrMsg + "', '" + ErrTarget + "', '" + chkValue + "', '"+ fnSuccess +"' ) == false && " + CancelEvent + " == 1 ){ event.preventDefault(); return false; }" );

//	alert(func);
	eval("control." + eventType + " = func;");
}

//=============================================================================
//	Function checks if the value of given control is empty or not.
//=============================================================================
function IsInputEmpty( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);
	if( valCtrl.tagName == "INPUT" || valCtrl.tagName == "TEXTAREA" || valCtrl.tagName == "SELECT")
	{
		if( valCtrl.value == "" )
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}

//=============================================================================
//	Function checks if length of value in given control mets minumum length.
//=============================================================================
function IsMinLength( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);
	if( chkValue != "undefined" && (valCtrl.tagName == "INPUT" || valCtrl.tagName == "TEXTAREA") )
	{
		if( valCtrl.value.length < chkValue )
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}
//=============================================================================
//	Function checks if length of value in given control is within maximum length.
//=============================================================================
function IsMaxLength( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);
	if( chkValue != "undefined" && (valCtrl.tagName == "INPUT" || valCtrl.tagName == "TEXTAREA") )
	{
		if( valCtrl.value.length > chkValue )
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}
//=============================================================================
//	Function checks if value in two of the controls is the same.
//=============================================================================
function MatchValue( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	if( chkValue == '' || chkValue == 'undefined' )
		chkValue = 1;

	valCtrl = valCtrl.split("|");
	valCtrl1 = document.getElementById( valCtrl[0] );
	valCtrl2 = document.getElementById( valCtrl[1] );

	if( (valCtrl1.tagName == "INPUT" || valCtrl1.tagName == "TEXTAREA") && (valCtrl2.tagName == "INPUT" || valCtrl2.tagName == "TEXTAREA") )
	{
		if( ( (valCtrl1.value != valCtrl2.value) && chkValue == 1) || ( (valCtrl1.value == valCtrl2.value) && chkValue != 1))
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}
//=============================================================================
//	Function checks if value in given control is a valid Number value.
//=============================================================================
function HasValidChars( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	var RNum = "0123456789";
	var Nums = "0123456789.-";
	var AlphaUp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var AlphaLr = "abcdefghijklmnopqrstuvwxyz";
	var Alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	var Name = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz .-'";
	var Email = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@-_";
	var Phone = "0123456789-().";
	var Pwd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@-_;!'`";
	var UserID = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
	
	var ValidChars
	
	switch( chkValue.toLowerCase() )
	{
		case	"rnum"	:	ValidChars = RNum;		break;
		case	"num"	:	ValidChars = Nums;		break;
		case	"alphaup":	ValidChars = AlphaUp;	break;
		case	"alphalr":	ValidChars = AlphaLr;	break;
		case	"alpha"	:	ValidChars = Alpha;		break;
		case	"name"	:	ValidChars = Name;		break;
		case	"email"	:	ValidChars = Email;		break;
		case	"phone"	:	ValidChars = Phone;		break;
		case	"pwd"	:	ValidChars = Pwd;		break;
		case	"user"	:	ValidChars = UserID;		break;
		default			:	ValidChars = chkValue;
	}
	
	var IsValid = true;
	valCtrl = document.getElementById(valCtrl);
	if( valCtrl.tagName == "INPUT" || valCtrl.tagName == "TEXTAREA" )
	{
		for( i = 0; i < valCtrl.value.length; i++ )
		{
			if( ValidChars.indexOf( valCtrl.value.charAt(i) ) == -1)	IsValid = false;
		}

		if( IsValid == false )
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}
//=============================================================================
//	Function checks if value in given control is a valid Email address.
//=============================================================================
function IsValidEmail( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	var EmailFilter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

	valCtrl = document.getElementById(valCtrl);
	if( (valCtrl.tagName == "INPUT" || valCtrl.tagName == "TEXTAREA") && valCtrl.value != "" )
	{
		if( ! EmailFilter.test( valCtrl.value ) )
		{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
		}
		else
		{
			ShowError( ErrMsg, ErrTarget, 0 );
			if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
		}
	}
	else
	{
		return false;
	}
}

//=============================================================================
//	Function checks if value in given control is more than a minumum value.
//=============================================================================
function IsMinValue( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);

	if( valCtrl.value < chkValue )
	{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
	}
	else
	{
		ShowError( ErrMsg, ErrTarget, 0 );
		if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
	}	
}

//=============================================================================
//	Function checks if value in given control is less than a maxiumum value.
//=============================================================================
function IsMaxValue( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);

	if( valCtrl.value > chkValue )
	{
			ShowError( ErrMsg, ErrTarget, 1 );
			return false;
	}
	else
	{
		ShowError( ErrMsg, ErrTarget, 0 );
		if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
	}	
}

//=============================================================================
//	Function checks and fails if the given control is not empty.
//=============================================================================
function ErrorNotEmpty( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	valCtrl = document.getElementById(valCtrl);

	if( valCtrl.innerHTML != "" )
	{
		ShowError( ErrMsg, ErrTarget, 1 );
		return false;
	}
	else
	{
		ShowError( ErrMsg, ErrTarget, 0 );
		if( fnSuccess != 'undefined' && fnSuccess != 'null' )	eval( fnSuccess );
	}
}

//=============================================================================
//	Sample validation function.
//=============================================================================
function ValidationFunction( event, valCtrl, ErrMsg, ErrTarget, chkValue, fnSuccess )
{
	ShowError( ErrMsg, ErrTarget, 1 );
		
	return false;
}

//=============================================================================
//	Function displays the given error message on the given target.
//=============================================================================
function ShowError( ErrMsg, ErrTarget, IsError )
{
	ErrTarget = document.getElementById(ErrTarget);
	if(IsError == 1 )
	{
		if( ErrTarget != null && (ErrTarget.tagName == "DIV" || ErrTarget.tagName == "SPAN") )
			ErrTarget.innerHTML = ErrMsg;
		else
			alert(ErrMsg);
	}
	else
	{
		if( ErrTarget != null && (ErrTarget.tagName == "DIV" || ErrTarget.tagName == "SPAN") )
			if( ErrTarget.innerHTML == ErrMsg )	ErrTarget.innerHTML = "";
	}
}

//=============================================================================
//	Function makes Mozilla's "event" object compatible with IE.
//=============================================================================
function IECompatibleEvent( event )
{
	if (navigator.appName.toLowerCase().indexOf('explorer') < 0 )
	{
	    this.srcElement = event.target;
	    this.altKey = event.altKey;
	    this.ctrlKey = event.ctrlKey;
	    this.shiftKey = event.shiftKey;
	    this.button = EqualizeToIEButton( event.button );
	    this.fromElement = event.relatedTarget;
	    this.toElement = event.relatedTarget;
	    this.keyCode = event.charCode;
	    this.clientX = event.clientX;
	    this.clientY = event.clientY;
	    this.type = event.type;
	}
}

//=============================================================================
//	Function makes the value of Mozilla's "button" propert in event object
//	compatible with IE button propert's values.
//=============================================================================
function EqualizeToIEButton( button )
{
	switch( button )
	{
		case 0:	return 1;	break;	//	Left Button
		case 1:	return 4;	break;	//	Middle Button
		case 2:	return 2;	break;	//	Right Button
	}
}


