/********************* Global Constants*********************/
//	var VALIDATE_ALPHA_NUM  		= /^[a-zA-Z0-9]*$/;
    var VALIDATE_ANYTHING			= /^[a-z|A-Z|0-9|\w]*$/i; 
	var VALIDATE_ALPHA_NUM			= /^[a-z][a-z0-9]*$/i; 
	var VALIDATE_ALPHA_NUM_W_SPACE  = /^[a-z][a-z0-9\s]*$/i; 
	var VALIDATE_ALPHA_NUM_W_SPACE_N_HIFIN = /^[a-z][a-z\-0-9\s]*$/i;
	var VALIDATE_CHAR 				= /^[A-Za-z]*$/;
	var VALIDATE_CHAR_W_SPACE		= /^[A-Z\s\-\,\.a-z]*$/;
	var VALIDATE_FLOAT      		= /^[0-9\.]*$/;
	var VALIDATE_INTEGER			= /^[0-9]*$/;
	var VALIDATION_MONEY 			= /^\d+([\.]\d\d)?$/;
	var VALIDATION_TELEPHONE 		= /^1?[\-]?\(?\d{3}\)?[\-]?\d{3}[\-]?\d{4}$/;
	var VALIDATION_POSTALCODE 		= /^[a-z]\d[a-z]?\d[a-z]\d$/i;
	var VALIDATION_ZIPCODE 			= /^\d{5}$/;
	var VALIDATION_EMAIL 			= /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,5})+$/;
	//var VALIDATION_MULTI_EMAILS    =/((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*/;
	var VALIDATION_MULTI_EMAILS    =/^[\w\.-]+@[A-Z0-9.-]+\.(?:[A-Z]{2}|com|org|net|biz|info|name|aero|jobs|museum)((,|;)[\w\.-]+@[A-Z0-9.-]+\.(?:[A-Z]{2}|com|org|net|biz|info|name|aero|jobs|museum))*$/i;
	var VALIDATION_TEL_W_COMMA		= /^[0-9\-\s\,]*$/;
	var VALIDATION_WEBSITE			= /^[a-zA-Z0-9\.]*$/;
//	var VALIDATION_HOURS			= /(\b([1-9])\b)|(\b[0-1][1-2]\b)|(\b[0-0][1-9]\b)|(\b[1-1][0-0]\b)/;
	var VALIDATION_HOURS			= /(\b^[1-9]$\b)|(\b^[0-1][1-2]$\b)|(\b^[0-0][1-9]$\b)|(\b^[1-1][0-0]$\b)/;
//	var VALIDATION_MINS				= /((\b([0-9])\b)|(\b[0-5][0-9]\b))/g; 
	var VALIDATION_MINS				= /((\b^[0-9]$\b)|(\b^([0-5][0-9])$\b))/; 
    var VALIDATE_ADDRESS			= /^[A-Z\s\-\,a-z\.0-9\/]*$/;
    var VALIDATE_DATE				= /^[0-9\-]*$/;
	var VALIDATE_NAME				= /^[a-zA-Z\.\-]*$/;
	var VALIDATE_COMBO				= /^[a-z0-9][a-z0-9\s\-\,\.]*$/i;
	var VALIDATE_PLEASE_SELECT		= /[^Please Select]/;
    var VALIDATION_TEL              = /^1?[\-]?\(?\d{3}\)?[\-]?\d{3}[\-]?\d{4}$/; ///^(\d{3}-\d{7}$\b)|(\d{4}-\d{7}$\b)/;
    var VALIDATE_CONTACT_NAME		= /^[a-zA-Z]*$/;
    var VALIDATE_CONTACT_NAME_W_HIFEN_NOT_AT_END = /^[a-zA-Z\s]*$/;
        
    var VALIDATE_CONTACT_NAME_W_HIFEN_NOT_AT_END_SPACE =/^[a-zA-Z][^\s]+[\s]+[a-zA-Z][^\s]|[^\s][a-zA-Z]*$/;
    var VALIDATE_SIGNATURE          = /^[a-z][a-z\-0-9\.\@\,\-\_\\\/\#\s]*$/i;
	var VALIDATE_PASS               = /^[a-z0-9\s]*$/i; 
	var VALIDATE_FILE_NAME          = /^[a-zA-Z0-9\s]*$/;
	var VALIDATE_PASS               = /^[a-zA-Z0-9]*$/;
	var ACHRNONUM                   = /^[a-zA-z0-9]|[_]|[.]+[a-zA-z0-9] *$/;
	//var VALIDATION_URL			    = /^[a-zA-Z0-9\.\]*$/;

		
	var MESSAGE_REQUIRED			= " is required";	
	var MESSAGE_ALPHA_NUM_W_SPACE	= " does not contain any special characters" ;
	var MESSAGE_ALPHA_NUM_W_SPACE_N_HIFIN = " does not contain any special character except hiphen (-)";
	var MESSAGE_ALPHA_NUM			= " does not contain any spaces and special characters.";
	var MESSAGE_CHAR				= " does not contain numbers or special characters or any spaces.";
    var MESSAGE_CHAR_W_SPACE		= " does not contain numbers or special characters";
	var MESSAGE_FLOAT				= " does not contain character values or any space.";
	var MESSAGE_INTEGER				= " does not contain character values or decimal point or any space.";
	var MESSAGE_TEL_W_COMMA			= " does not contain character values or any other special character except comma(.) and hifen(-)";
	var MESSAGE_WEBSITE				= " does not contain any special characters";
	var MESSAGE_EMAIL				= " is not valid.";
	var MESSAGE_ADDRESS				= " does not contain any special characters";
	var VALIDATE_CUSTOM_SEARCH      = /^[a-z][a-z\-0-9\.\@\,\-\_\\\/\#\s]*$/i;
	var VALIDATE_DOMAIN_OPTION      = /^[a-z][a-z\-0-9\.\@\,\-\_\\\/\#\s]*$/i;
	var VALIDATE_COMP_INFO          = /^[a-z][a-z\-0-9\.\@\,\-\_\\\/\#\s]*$/i;
	//var VALIDATE_EXTENSION          = /^\b\d{4}\b;
	var VALIDATE_EXTENSION          = /^\d{4}$/;
	var VALIDATION_UAN 		        = /^[\d]{3}-[\d]{2,3}-([\d]{3,4}|[\a-zA-Z]{3,4})$/;
/***********************************************************/

function validateCompleteForm(objForm,strErrorClass){
	return _validateInternal(objForm,strErrorClass,0);
}
function validateStandard(objForm,strErrorClass){	
	return _validateInternal(objForm,strErrorClass,1);
}
function _validateInternal(form,strErrorClass,nErrorThrowType){
	var strErrorMessage="";
	var objFirstError=null;
	if(nErrorThrowType==0){
		strErrorMessage=(form.err)?form.err:_getLanguageText("err_form");
	}
	var fields=_GenerateFormFields(form);
	var iCount = 0;
	for(var i=0;i<fields.length;++i){
		var field=fields[i];
		if(!field.IsValid(fields)){
			field.SetClass(strErrorClass);
			if(nErrorThrowType==1){
				_throwError(field);
				return false;
			}else{
				if(objFirstError==null){
					objFirstError=field;
				}
				
				strErrorMessage=_handleError(field,strErrorMessage,++iCount);
				bError=true;
			}
		}else{
			field.ResetClass();
		}
	}
	if(objFirstError!=null){
		alert(strErrorMessage);
		objFirstError.element.focus();
		return false;
	}
	return true;
}
function _getLanguageText(id){
	objTextsInternal=new _jsVal_Language();
	objTexts=null;
	try{
		objTexts=new jsVal_Language();
	}catch(ignored){};
		switch(id){
			case "err_form":strResult=(!objTexts||!objTexts.err_form)?objTextsInternal.err_form:objTexts.err_form;break;
			case "err_enter":strResult=(!objTexts||!objTexts.err_enter)?objTextsInternal.err_enter:objTexts.err_enter;break;
			case "err_select":strResult=(!objTexts||!objTexts.err_select)?objTextsInternal.err_select:objTexts.err_select;break;
		}
		return strResult;
	}
	function _GenerateFormFields(form){
		var arr=new Array();
		for(var i=0;i<form.length;++i){
			var element=form.elements[i];
			var index=_getElementIndex(arr,element);
			if(index==-1){
				arr[arr.length]=new Field(element,form);
			}else{
				arr[index].Merge(element)
			}
		}
		return arr;
	}
	function _getElementIndex(arr,element){
		if(element.name){
			var elementName=element.name.toLowerCase();
			for(var i=0;i<arr.length;++i){
				if(arr[i].element.name){
					if(arr[i].element.name.toLowerCase()==elementName){
						return i;
					}
				}
			}
		}
		return -1;
	}
	function _jsVal_Language(){
		this.err_form="Please enter/correct values for the following field(s):\n\n";
		this.err_select="Please select a valid \"%FIELDNAME%\"";
		this.err_enter="Please enter a valid \"%FIELDNAME%\"";
	}
	function Field(element,form){
		this.type=element.type;
		this.element=element;
		this.exclude=element.exclude||element.getAttribute('exclude');
		this.err=element.err||element.getAttribute('err');
		this.required=_parseBoolean(element.required||element.getAttribute('required'));
		this.realname=element.realname||element.getAttribute('realname');
		this.elements=new Array();
		switch(this.type){
			case "textarea":
			case "password":
			case "text":
			case "file":
			this.value=element.value;
			this.minLength=element.minlength||element.getAttribute('minlength');
			this.maxLength=element.maxlength||element.getAttribute('maxlength');
			this.regexp=this._getRegEx(element);
			this.minValue=element.minvalue||element.getAttribute('minvalue');
			this.maxValue=element.maxvalue||element.getAttribute('maxvalue');
			this.equals=element.equals||element.getAttribute('equals');
			this.callback=element.callback||element.getAttribute('callback');
			break;
			case "select-one":
			case "select-multiple":
			this.values=new Array();
			for(var i=0;i<element.options.length;++i){
				if(element.options[i].selected&&(!this.exclude||element.options[i].value!=this.exclude)){
					this.values[this.values.length]=element.options[i].value;
				}
			}
			this.min=element.min||element.getAttribute('min');
			this.max=element.max||element.getAttribute('max');
			this.equals=element.equals||element.getAttribute('equals');
			break;
			case "checkbox":
			this.min=element.min||element.getAttribute('min');
			this.max=element.max||element.getAttribute('max');
			case "radio":
			this.required=_parseBoolean(this.required||element.getAttribute('required'));
			this.values=new Array();
			if(element.checked){
				this.values[0]=element.value;
			}
			this.elements[0]=element;
			break;
		}
	}
	Field.prototype.Merge=function(element){
		var required=_parseBoolean(element.getAttribute('required'));
		if(required){
			this.required=true;
		}
		if(!this.err){
			this.err=element.getAttribute('err');
		}
		if(!this.equals){
			this.equals=element.getAttribute('equals');
		}
		if(!this.callback){
			this.callback=element.getAttribute('callback');
		}
		if(!this.realname){
			this.realname=element.getAttribute('realname');
		}
		if(!this.max){
			this.max=element.getAttribute('max');
		}
		if(!this.min){
			this.min=element.getAttribute('min');
		}
		if(!this.regexp){
			this.regexp=this._getRegEx(element);
		}
		if(element.checked){
			this.values[this.values.length]=element.value;
		}
		this.elements[this.elements.length]=element;
	}
	Field.prototype.IsValid=function(arrFields){
		switch(this.type){
			case "textarea":
			case "password":
			case "text":
			case "file":
			return this._ValidateText(arrFields);
			case "select-one":
			case "select-multiple":
			case "radio":
			case "checkbox":
			return this._ValidateGroup(arrFields);
			default:
			return true;
		}
	}
	Field.prototype.SetClass=function(newClassName){
		if((newClassName)&&(newClassName!="")){
			if((this.elements)&&(this.elements.length>0)){
				for(var i=0;i<this.elements.length;++i){
					if(this.elements[i].className!=newClassName){
						this.elements[i].oldClassName=this.elements[i].className;
						this.elements[i].className=newClassName;
					}
				}
			}else{
				if(this.element.className!=newClassName){
					this.element.oldClassName=this.element.className;
					this.element.className=newClassName;
				}
			}
		}
	}
	Field.prototype.ResetClass=function(){
		if((this.type!="button")&&(this.type!="submit")&&(this.type!="reset")){
			if((this.elements)&&(this.elements.length>0)){
				for(var i=0;i<this.elements.length;++i){
					if(this.elements[i].oldClassName){
						this.elements[i].className=this.elements[i].oldClassName;
					}
				else{
					this.element.className="";
				}
			}
		}else{
			if(this.elements.oldClassName){
				this.element.className=this.element.oldClassName;
			}
		else{
			this.element.className="";
		}
	}
}
}
Field.prototype._getRegEx=function(element){
	regex=element.regexp||element.getAttribute('regexp')
	if(regex==null)return null;
	retype=typeof(regex);
	if(retype.toUpperCase()=="FUNCTION")
	return regex;
else if((retype.toUpperCase()=="STRING")&&!(regex=="JSVAL_RX_EMAIL")&&!(regex=="JSVAL_RX_TEL")
	&&!(regex=="JSVAL_RX_PC")&&!(regex=="JSVAL_RX_ZIP")&&!(regex=="JSVAL_RX_MONEY")
	&&!(regex=="JSVAL_RX_CREDITCARD")&&!(regex=="JSVAL_RX_POSTALZIP"))
	{
		nBegin=0;nEnd=regex.length-1;
		if(regex.charAt(0)=="/")nBegin=1;
		if(regex.charAt(regex.length-1)=="/")nEnd=regex.length-2;
		return new RegExp(regex.slice(nBegin,nEnd));
	}
else{
	return regex;
}
}
Field.prototype._ValidateText=function(arrFields){

	if((this.required)&&(this.callback)){	
		nCurId=this.element.id?this.element.id:"";
		nCurName=this.element.name?this.element.name:"";
		eval("bResult = "+this.callback+"('"+nCurId+"', '"+nCurName+"', '"+this.value+"');");
		if(bResult==false){
			return false;
		}
	}else{	
		if(this.required&&!this.value){
		
			return false;
		}
		if(this.value&&(this.minLength&&this.value.length<this.minLength)){
		
			return false;
		}
		if(this.value&&(this.maxLength&&this.value.length>this.maxLength)){
		
			return false;
		}
		if(this.regexp){		
			if(!_checkRegExp(this.regexp,this.value))
			{			
				if(!this.required&&this.value){
					return false;
				}
				if(this.required){
					return false;
				}
			}
		else
			{
				return true;
			}
		}
		if(this.equals){
			for(var i=0;i<arrFields.length;++i){
				var field=arrFields[i];
				if((field.element.name==this.equals)||(field.element.id==this.equals)){
					if(field.element.value!=this.value){
						return false;
					}
					break;
				}
			}
		}
		if(this.required){
			var fValue=parseFloat(this.value);
			if((this.minValue||this.maxValue)&&isNaN(fValue)){
				return false;
			}
			if((this.minValue)&&(fValue<this.minValue)){
				return false;
			}
			if((this.maxValue)&&(fValue>this.maxValue)){
				return false
			}
		}
	}
	return true;
}
Field.prototype._ValidateGroup=function(arrFields){
	if(this.required&&this.values.length==0){
		return false;
	}
	if(this.required&&this.min&&this.min>this.values.length){
		return false;
	}
	if(this.required&&this.max&&this.max<this.values.length){
		return false;
	}
	return true;
}
function _handleError(field,strErrorMessage,riCount){
	var obj=field.element;
	strNewMessage=strErrorMessage+ riCount + ". " + ((field.realname)?field.realname:((obj.id)?obj.id:obj.name))+"\n";
	return strNewMessage;
}
function _throwError(field){
	var obj=field.element;
	switch(field.type){
		case "text":
		case "password":
		case "textarea":
		case "file":
		alert(_getError(field,"err_enter"));
		try{
			obj.focus();
		}
		catch(ignore){}
		break;
		case "select-one":
		case "select-multiple":
		case "radio":
		case "checkbox":
		alert(_getError(field,"err_select"));
		break;
	}
}
function _getError(field,str){
	var obj=field.element;
	strErrorTemp=(field.err)?field.err:_getLanguageText(str);
	idx=strErrorTemp.indexOf("\\n");
	while(idx>-1){
		strErrorTemp=strErrorTemp.replace("\\n","\n");
		idx=strErrorTemp.indexOf("\\n");
	}
	return strErrorTemp.replace("%FIELDNAME%",(field.realname)?field.realname:((obj.id)?obj.id:obj.name));
}
function _parseBoolean(value){
	return !(!value||value==0||value=="0"||value=="false");
}
function _checkRegExp(regx,value){
	switch(regx){
		case "JSVAL_RX_EMAIL":
		return((/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,5})+$/).test(value));
		case "JSVAL_RX_TEL":
		return((/^1?[\-]?\(?\d{3}\)?[\-]?\d{3}[\-]?\d{4}$/).test(value));
		case "JSVAL_RX_PC":
		return((/^[a-z]\d[a-z]?\d[a-z]\d$/i).test(value));
		case "JSVAL_RX_ZIP":
		return((/^\d{5}$/).test(value));
		case "JSVAL_RX_MONEY":
		return((/^\d+([\.]\d\d)?$/).test(value));
		case "JSVAL_RX_CREDITCARD":
		return(!isNaN(value));
		case "JSVAL_RX_POSTALZIP":
		if(value.length==6||value.length==7)
		return((/^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/).test(value));
		if(value.length==5||value.length==10)
		return((/^\d{5}(\-\d{4})?$/).test(value));		
		break;		
		default:
		return(regx.test(value));
	}
}