//define form field object
function CFormField(FieldName,FieldType,Min,Max,DispName)
{
    this.FieldName=FieldName;
    this.FieldType=FieldType;
    this.Min=Min;
    this.Max=Max;
    this.DispName=DispName;
}

CFormField.prototype.Validate=function(objField)
{
	var input=trim(objField.value);
	if(input.length==0)
	{
		alert("Please enter "+this.DispName);
		objField.focus();
		return false;
	}

    switch(this.FieldType)
    {
       case "STR":
            var val=input;
            var min=parseInt(this.Min);
            var max=parseInt(this.Max);
            if(!isNaN(min) && val.length < min)
            {
            	alert(this.DispName+" is too short. Minimum length is "+min);
				objField.focus();
            	return false;
            }
            if(!isNaN(max) && val.length > max)
            {
            	alert(this.DispName+" is too long. Maximum length is "+max);
				objField.focus();
            	return false;
            }
       		break;
       case "INT":
            var val=parseInt(input);
            if(isNaN(val))
            {
            	alert("Invalid "+this.DispName);
				objField.focus();
            	return false;
            }
            var min=parseInt(this.Min);
            var max=parseInt(this.Max);
            if(!isNaN(min) && val < min)
            {
            	alert(this.DispName+" is too small. Minimum value is "+min);
				objField.focus();
            	return false;
            }
            if(!isNaN(max) && val > max)
            {
            	alert(this.DispName+" is too large. Maximum value is "+max);
				objField.focus();
            	return false;
            }
       		break;
       case "FLOAT":
            var val=parseFloat(input);
            if(isNaN(val))
            {
            	alert("Invalid "+this.DispName);
				objField.focus();
            	return false;
            }
            var min=parseFloat(this.Min);
            var max=parseFloat(this.Max);
            if(!isNaN(min) && val < min)
            {
            	alert(this.DispName+" is too small. Minimum value is "+min);
				objField.focus();
            	return false;
            }
            if(!isNaN(max) && val > max)
            {
            	alert(this.DispName+" is too large. Maximum value is "+max);
				objField.focus();
            	return false;
            }
       		break;
       case "DATE":
            if(isNaN(Date.parse(input)))
            {
            	alert("Invalid "+this.DispName);
				objField.focus();
            	return false;
            }
            var val=new Date(input);
            var min=new Date(this.Min);
            var max=new Date(this.Max);
            if(!isNaN(min) && val.getTime() < min.getTime())
            {
            	alert(this.DispName+" is out of range. Minimum date is "+min.toDateString());
				objField.focus();
            	return false;
            }
            if(!isNaN(max) && val.GetTime() > max.getTime())
            {
            	alert(this.DispName+" is out of range. Maximum date is "+max.toDateString());
				objField.focus();
            	return false;
            }
       		break;
       case "URL":
       		if(!isUrl(input))
       		{
       			alert("Invalid "+this.DispName);
				objField.focus();
       			return false;
       		}
       		break;
       case "EMAIL":
       		if(!isEmail(input))
       		{
       			alert("Invalid "+this.DispName);
				objField.focus();
       			return false;
       		}
       		break;
    }

    return true;
}

//define form validator
function CFormValidator(objForm)
{
    this.objForm=objForm;
    this.aryFields=new Array();
}

CFormValidator.prototype.AddField=function(FieldName,FieldType,Min,Max,DispName)
{
    var field=new CFormField(FieldName,FieldType,Min,Max,DispName);
    this.aryFields[this.aryFields.length]=field;
}

CFormValidator.prototype.Validate=function()
{
    for(var i=0;i<this.aryFields.length;i++)
    {
    	var objField=eval('this.objForm.'+this.aryFields[i].FieldName);
		if(!this.aryFields[i].Validate(objField))
	  		return false;
    }

    return true;
}

function jsValidateForm(objForm)
{
	var objValidator=new CFormValidator(objForm);
	for(var i=0;i<objForm.length;i++)
	{
	    if(objForm[i].name=="?")
	    {
	  		//split it up
	  		var ary=objForm[i].value.split("|");
			objValidator.AddField(ary[0],ary[1],ary[2],ary[3],ary[4]);
	  	}
	}

	return	objValidator.Validate();
}

//utility functions
function trim(value)
{
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   return temp;
}

function isEmail(strEmail)
{
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return re.test(strEmail);
}

function isUrl(strUrl)
{
    var rs = "^((http://)|(https://)|(www\\.)).+\\.[a-zA-Z]{2,4}.*$";
    var reg = new RegExp(rs);
    return reg.test(strUrl);
}

