function trim(str){
	return str.replace(/^\s*|\s*$/g,"");
}

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

dojo.addOnLoad(
			   function () 
			   {
				try{
						for(var j=0;j<document.forms.length;j++)
						{
						   var fields = _GenerateFormFields(document.forms[j]);
						   for(var i=0;i<fields.length;++i)
						   {
								var field=fields[i];
								if(field.required || field.regexp)
								{
									addEvent(field.element,'blur',  function(){validateField(document.forms[j], this, 'error', 0); });
								}
						   }
						 }
					}
					catch(e)
					{
						alert(e);
					}
				  }
			   
			   );

function resetFormClass(formObj)
{
	var fields = _GenerateFormFields(formObj);
	for(var k=0;k<fields.length;k++)
	{
		fields[k].ResetClass();
		if(fields[k].element.type=='text' || fields[k].element.type=='select-one')
		{
			fields[k].element.value='';
		}
		//fields[k].value='';
	}
}
function validateCompleteForm(objForm,strErrorClass)
{
	return _validateInternal(objForm,strErrorClass,0);
};
function validateStandard(objForm,strErrorClass){
return _validateInternal(objForm,strErrorClass,1);
};

function validateField(form, element,strErrorClass,nErrorThrowType){
	var strErrorMessage="";
	var objFirstError=null;
	//if(nErrorThrowType==0){
	//	strErrorMessage=(form.err)?form.err:_getLanguageText("err_form");
	//};
	var field = new Field(element,form);
		//var field=fields[i];
		var fields = new Array(field);
		if(!field.IsValid(fields)){
			field.SetClass(strErrorClass);
			if(nErrorThrowType==1){
				_throwError(field);
				return false;
			}
			else
			{
				if(objFirstError==null){
					objFirstError=field;
				}
	
				strErrorMessage=_handleError(field,'');
				if(!field.err)
				{
					field.err = 'Required';
				}
				field.element.title=field.err;
				bError=true;
			}
		}
		else
		{
			field.ResetClass();
			field.element.title='';
		}

	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 _validateInternal(form,strErrorClass,nErrorThrowType)
{
	var strErrorMessage="";
	var objFirstError=null;
	if(nErrorThrowType==0)
	{
		strErrorMessage=(form.err)?form.err:_getLanguageText("err_form");
	};
	var fields=_GenerateFormFields(form);
	for(var i=0;i<fields.length;++i)
	{
		var field=fields[i];
		field.SetClass(strErrorClass);
		if(!field.IsValid(fields))
		{
			
			if(nErrorThrowType==1)
			{
				_throwError(field);
				return false;
			}
			else
			{
				if(objFirstError==null)
				{
					objFirstError=field;
				}
				//strErrorMessage = field.err+"\n"; 
				strErrorMessage=_handleError(field,strErrorMessage);
				if(!field.err)
				{
					field.err = 'Required';
				}
				field.element.title=field.err;
				bError=true;
			}
		}
		else
		{
			field.ResetClass();
		}
	};
	if(objFirstError!=null)
	{
	alert(strErrorMessage);
		objFirstError.element.focus();
		return false;
	};
	return true;
};

function getSelectActualValue(value)
{
	var values = value.split("#");
	return values[values.length -1];
}

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/select correct values for the following fields:\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.filetype=element.filetype||element.getAttribute('filetype');
	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=trim(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.exclude=element.exclude||element.getAttribute('exclude');
			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)
			{
				var elementValue = getSelectActualValue(element.options[i].value);
				if (element.options[i].selected) {
					if (!this.exclude) {
						if (elementValue != '-2' && elementValue != '-1') {
							this.values[this.values.length] = element.options[i].value;
						}
					}
					else {
						if (elementValue != 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
		{
			var newClass;
			if (this.element.oldClassName  =='')
			{
				newClass = newClassName;
			}
			else
			{
				newClass = this.element.oldClassName + ' '+ newClassName;
			}
		
			if(this.element.className!=newClass)
			{
				this.element.oldClassName=this.element.className;
				this.element.className=this.element.oldClassName + ' ' +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=this.element.oldClassName;//"";
				}
			}
		}
		else
		{
			if(this.elements.oldClassName)
			{
				this.element.className=this.element.oldClassName;
			}
			else
			{
				this.element.className=this.element.oldClassName;//"";
			}
		};
	};
};

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=0;
		if(regex.charAt(0)=="/")
			nBegin=1;
		if(regex.charAt(regex.length-1)=="/")
			nEnd=0;
		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.value == this.exclude)
		{
			return false;
		};
		if(this.value && this.filetype=='image')
		{
			if( ! checkValidImage(this.value)){
				this.value='';
				return false;
			}else{
			return true;
			}
		};
		
		
			
		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.value)  // Right now it will check for strict numeric only ..
		{
			var isInt=IsStrictNumeric(this.value);
			var fValue=parseFloat(this.value);
			
			if((this.minValue||this.maxValue)&&(!isInt))
			{
				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)
{
	var obj=field.element;
	strNewMessage=strErrorMessage+((field.err)?field.err:((obj.id)?obj.id:obj.err))+"\n";
	return strNewMessage;
};
function checkValidImage(fileName)
{
	var ext = fileName.substring(fileName.lastIndexOf('.') + 1);
	if(ext == "gif" || ext == "GIF" || ext == "JPEG" || ext == "jpeg" || ext == "jpg" || ext == "JPG")
	{
		return true;
	}        
	else
	{
		return false;
	}
};
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((/^[A-z0-9][\w.-]*@[A-z0-9][\w\-\.]+\.[A-z0-9]{2,6}$/).test(value));
			
		case "JSVAL_RX_TEL":
			return checkInternationalPhone(value);
			//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((/^[a-zA-Z0-9]+$/).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));
	};
};

// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;

var maxDigitsInIPhoneNumber = 15;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
function trim(s)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not a whitespace, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (c != " ") returnString += c;
    }
    return returnString;
}
function stripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkInternationalPhone(strPhone){
var bracket=3
strPhone=trim(strPhone)
if(strPhone.indexOf("+")>1) return false
if(strPhone.indexOf("-")!=-1)bracket=bracket+1
if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)return false
var brchr=strPhone.indexOf("(")
if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")return false
if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)return false
s=stripCharsInBag(strPhone,validWorldPhoneChars);
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber && s.length <= maxDigitsInIPhoneNumber);
}
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		alert("The Birth Date format should be : dd/mm/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month for your Birth Date")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day for your Birth Date")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear+" for Birth Date")
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid Birth Date")
		return false
	}
return true
}

function IsStrictNumeric(strString)
   //  check for valid numeric strings	
   {
   
   var strValidChars = "0123456789";
   var strChar;
   var blnResult = true;

   if (strString.length == 0) return false;

   //  test strString consists of valid characters listed above
   for (i = 0; i < strString.length && blnResult == true; i++)
      {
      strChar = strString.charAt(i);
      if (strValidChars.indexOf(strChar) == -1)
         {
         blnResult = false;
         }
      }
   return blnResult;

   }


