var objValid;

function Validation(formName)
{
	this.form = formName

	this.elements = new Array()
	this.messages = new Array()

	Validation.prototype.registerElement = _Validation_registerElement
	Validation.prototype.validateFields = _Validation_validateFields
	Validation.prototype.isEmail = _Validation_isEmail
	Validation.prototype.isDate = _Validation_isDate
	Validation.prototype.resetMessages = _Validation_resetMessages
}


function _Validation_registerElement(elementName, dataType, required, longName)
{
	var obj = new Object()
	
	obj.name = elementName
	obj.dataType = dataType
	obj.required = required
	obj.longName = longName

	this.elements[this.elements.length] = obj
}

function _Validation_resetMessages()
{
	this.messages = new Array()
}

function _Validation_validateFields()
{	
	var blnCheck = true
	var strMessage = ""
	for (i=0; i < this.elements.length; i++)
	{
		var objFormElement = this.form[this.elements[i].name]
		var strDataType = this.elements[i].dataType
		var strData =   this.form[this.elements[i].name].value
		var blnRequired = this.elements[i].required

		var strTemp =""
		switch (strDataType) {
		case "date" :
			if (strData == "" && blnRequired == false ) 
				break 
	   		
			if (strData == "" && blnRequired == true ) 
				strMessage = " date is blank"
			else
			{ 
				if (!this.isDate(objFormElement)) 
					strMessage = " invalid date (format: mm/dd/yyyy)"
			}		
			break
		case "text" :
			//this is a bit tricky... !(not) to success the 
			//failure.
			if  ( (!strData.match(/\S/) ) && blnRequired == true)	
				strMessage = " is blank"
			//alert("in text: " + strMessage)
			break
        case "numeric" :
             if (strData == "" && blnRequired == true) {
			    strMessage = " is blank"
              }
              else if (strData != ""  ) {
                var matchData =  new String(strData.match(/\d+/));
                if ( matchData == "null")  matchData = "";
                // alert("len: " + strData.length + " match len: " + matchData.length + " result: " + matchData );
                if (strData.length != matchData.length )
        		      strMessage = " invalid numeric"
             }
			 break
		case "multi" :
			if (objFormElement.length == 0 && blnRequired == true)	
				strMessage = " is blank"
			break

		case "radio" :
		case "checkbox" :
			var mychecked = false
			if (typeof(this.form[this.elements[i].name].length) != 'undefined')
			{			
				for (k=0; k < this.form[this.elements[i].name].length; k++)
				{	
					var myTempobj = this.form[this.elements[i].name][k]
					if (myTempobj.checked == true )
						mychecked = true;
				}	
			}
			else
			{
				var myTempobj = this.form[this.elements[i].name]
				if (myTempobj.checked == true )
					mychecked = true
			}
					
			if (mychecked == false && blnRequired == true)
				strMessage = " was not selected"
				
			break	
		

		case "email" :
		
			if (strData == "" && blnRequired == false )
			      break 
			   	   		
		    if (strData == "" && blnRequired == true )	
				strMessage =  " is blank"
			else
				if (!this.isEmail(strData))
					strMessage = " is invalid"
			break
	   
		default :
			   strTemp +="nosuch"
			   
		} //end switch
		
		if (strMessage != "") 
		{
			blnCheck = false			
			this.elements[i].failed = true
			this.messages[this.messages.length] = this.elements[i].longName + strMessage
			strMessage = ""
		}
   	} //end for
	
	return blnCheck
}

function _Validation_isEmail(s)
{
	if (s.match(/\w+@\w+\.\w+/))
		return true
	else
		return false
}

function _Validation_isDate(myobj)
{
	var a = myobj.value
	var err=0

	//if (!a.match(/\d{2}\/\d{2}\/\d{4}/))
	//	return false
	
	//if (a.length < 6 || a.length > 10 ) return false
	s = a.split("/")
	if (s.length != 3) return false
	
	b = s[0]// month
	d = s[1]// day
	f = s[2] // year

	//basic error checking
	if (b<1 || b>12) return false
	if (d<1 || d>31) return false
	if (f<0 || f>2099) return false
	
	//advanced error checking
	//check year range.
	//dont allow any date that is not from 2000-3000
	if (f.length == 4 && (f < 1990 || f > 3000 ))
		return false
	// months with 30 days
	if (b==4 || b==6 || b==9 || b==11){
		if (d==31) return false
	}
	// february, leap year
	if (b==2){
		// feb
		var g=parseInt(f/4)
		if (isNaN(g)) {
			return false
		}

		if (d>29) return false
		if (d==29 && ((f/4)!=parseInt(f/4))) return false
	}
	
	//made it this far you are a happy date
	return true
}