function Validator(frmname, normalClass, errorClass)
{
	var validate = Array(); //array of fields to validate
	
	this.formobj=document.forms[frmname];
	if(!this.formobj) {
		alert("BUG: could not get Form object " + frmname);
		return;
	}
	//clear submit actions
	if(this.formobj.onsubmit) {
		this.formobj.old_onsubmit = this.formobj.onsubmit;
		this.formobj.onsubmit=null;
	} else {
		this.formobj.old_onsubmit = null;
	}
	//set submit actions
	this.formobj.onsubmit = function() {
		if(frmvalidator.doValidation() == false) { //don't validate as true just yet
			return false;
		}
		if(this.old_onsubmit) {//only validate when set
			return this.old_onsubmit();
		}
		return true;
	}
	
	//field to validate, errorstr of field for error string, type of validation
	this.addValidation = function(field,type,errorstr) { 
		var fieldobj = this.formobj[field];
		if(!fieldobj) {
			alert("BUG: Did not find the field: " + field);
			return;
		}
		//find if this field already has validation
		var pos = null;
		for(var i=0; i<validate.length; i++) {
			if(validate[i][0] == fieldobj) {
				pos = i;
				break;
			}
		}
		if(pos == null) {
			validate.push(Array(fieldobj,Array( Array(type,errorstr) ) ));//no validation
		} else {
			validate[pos][1].push(Array(type,errorstr));//add to existing validation
		}
	}
	
	this.addErrorSpan = function(field,spanid) {
		
		var fieldobj = this.formobj[field];
		if(!fieldobj) {
			alert("BUG: Did not find the field: " + field);
			return;
		}
		fieldobj.errorSpan = spanid;
	}
	
	this.doValidation = function () {
		
		var isValid = true;
		var errorString = "<h3>An error has occured:</h3>";
		var errorFields = Array();
		for(var i=0; i < validate.length; i++)
		{
			var errorStrings = "";
			//validate[i][0].className = normalClass; // reset class name
			for(var j=0; j < validate[i][1].length; j++) {
				type = validate[i][1][j][0];
				errorstr = validate[i][1][j][1];
				if(validate[i][0].errorSpan != null) {
					span = validate[i][0].errorSpan;
				} else {
					span = validate[i][0].name + "_error_msg";
				}
				//alert(check(validate[i][0],type)+type);
				if(!check(validate[i][0],type)) {
					isValid = false;

					
					
					document.getElementById(span).innerHTML = errorstr;
					
					break;
				} else {

					document.getElementById(span).innerHTML = '';
	
				}
			}
			if(errorStrings != "") {
				var name = validate[i][0].name;
				var upos = name.search("_");
				name = name.substring(upos+1,upos+2).toUpperCase() + name.substring(upos+2).toLowerCase().replace("_"," ");
				errorString += name + ":<br/><ul>";
				errorString += errorStrings;
				errorString += "</ul>";
			}
		}

		return isValid;
	}
	
	this.validate = function (obj) {
		var isValid = true;
	//	var errorString = "<h3>An error has occured:</h3>";
		//var errorFields = Array();
		var errorstr = "";
		for(var i=0; i < validate.length; i++)
		{
			if(validate[i][0] == obj) {
				for(var j=0; j < validate[i][1].length; j++) {
					type = validate[i][1][j][0];
					
					if(!check(validate[i][0],type)) {
						//alert("error"+errorstr);
						errorstr = validate[i][1][j][1];
						break;
					}
				}
				break;
			}
		}
		//alert(errorstr);
	
		span = "";
		if(obj.errorSpan != null) {
			span = obj.errorSpan;
		} else {
			span = obj.name + "_error_msg";
		}
		if(errorstr != '') {
			document.getElementById(span).innerHTML = errorstr;
		} else {
			document.getElementById(span).innerHTML = '';
		}
	}
}
function validateEmail(email)
{
    if(email.length <= 0) {
	  return true;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null ) {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null) {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
	return false;
}

function check(fieldobj, type) {
	var epos = type.search("="); 
    var  command  = ""; 
    var  cmdvalue = ""; 
    if(epos >= 0) { 
     command  = type.substring(0,epos); 
     cmdvalue = type.substr(epos+1); 
    } else { 
     command = type; 
    } 
	
	switch(command) 
    { 
        case "req": 
        case "required": 
         { 
           if(eval(fieldobj.value.length) == 0) 
           { 
              return false; 
           }//if 
           break;             
         }//case required 
        case "maxlength": 
        case "maxlen": 
          { 
             if(eval(fieldobj.value.length) >  eval(cmdvalue)) 
             { 
               return false; 
             }//if 
             break; 
          }//case maxlen 
        case "minlength": 
        case "minlen": 
           { 
             if(eval(fieldobj.value.length) <  eval(cmdvalue)) 
             { 
               return false;                 
             }//if 
             break; 
            }//case minlen 
        case "alnum": 
        case "alphanumeric": 
           { 
              var charpos = field.value.search("[^A-Za-z0-9]"); 
              if(field.value.length > 0 &&  charpos >= 0) 
              { 
                return false; 
              }//if 
              break; 
           }//case alphanumeric 
        case "num": 
        case "numeric": 
           { 
              var charpos = fieldobj.value.search("[^0-9 ]"); 
              if(fieldobj.value.length > 0 &&  charpos >= 0) 
              { 
                return false; 
              }//if 
              break;               
           }//numeric 
        case "alphabetic": 
        case "alpha": 
           { 
              var charpos = fieldobj.value.search("[^A-Za-z]"); 
              if(fieldobj.value.length > 0 &&  charpos >= 0) 
              { 
                return false; 
              }//if 
              break; 
           }//alpha 
		case "alnumhyphen":
			{
              var charpos = fieldobj.value.search("[^A-Za-z0-9\-_]"); 
              if(fieldobj.value.length > 0 &&  charpos >= 0) 
              { 
                return false; 
              }//if 			
			break;
			}
        case "email": 
          { 
               if(!validateEmail(fieldobj.value)) 
               { 
                 return false; 
               }//if 
           break; 
          }//case email 
        case "email_confirm": 
          { 
              if(fieldobj.value != document.getElementById('Email').value) {
				  return false; 
			  }
           break; 
          }//case email_confirm 	 
        case "lt": 
        case "lessthan": 
         { 
            if(isNaN(fieldobj.value)) 
            { 
              alert(fieldobj.name+": Should be a number "); 
              return false; 
            }//if 
            if(eval(fieldobj.value) >=  eval(cmdvalue)) 
            { 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "gt": 
        case "greaterthan": 
         { 
            if(isNaN(fieldobj.value)) 
            { 
              alert(fieldobj.name+": Should be a number "); 
              return false; 
            }//if 
             if(eval(fieldobj.value) <=  eval(cmdvalue)) 
             { 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
        case "comparedates": 
         { 
         var dateFrom=new Date()
         dateFrom = parseDate(document.getElementById('Check_In_Date').value,"MM/dd/yyyy")
         
         var dateTo=new Date()
         dateTo = parseDate(fieldobj.value,"MM/dd/yyyy")
             if (dateTo < dateFrom) 
             { 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
        case "comparewithtoday": 
         { 
         var dateFrom=new Date()
         
         var dateTo=new Date()
         dateTo = parseDate(fieldobj.value,"MM/dd/yyyy")
             if (dateTo < dateFrom) 
             { 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 

        case "regexp": 
         { 
		 	if(fieldobj.value.length > 0)
			{
	            if(!fieldobj.value.match(cmdvalue)) 
	            { 
	              return false;                   
	            }//if 
			}
           break; 
         }//case regexp 
        case "dontselect": 
         { 
            if(fieldobj.selectedIndex == null) 
            { 
              alert("BUG: dontselect command for non-select Item"); 
              return false; 
            } 
            if(fieldobj.selectedIndex == eval(cmdvalue)) 
            { 
              return false;                                   
             } 
             break; 
         }//case dontselect 
    }//switch 
	return true;
}
function writeError(errorString){
	document.getElementById("errorText").innerHTML = errorString;
	document.getElementById("error").style.display="block";
}

function selectDay(field_id) {
	var year = document.getElementById(field_id+"_year").value;
	var month = document.getElementById(field_id+"_month").value;
	var dayObj = document.getElementById(field_id+"_day");
	if(year != "" && month != "") {
		dayObj.style.display = "block";
		var currentSel = dayObj.value;
		var dim = days_in_month(year, month-1);
		dayObj.options.length = 0; //clear
		for(var i=1;i<=dim; i++) {
			dayObj.options[i] = new Option(i,i);
		}
		if(currentSel > dayObj.length) {
			dayObj.selectedIndex = dayObj.length-1;
		} else {
			dayObj.selectedIndex = currentSel;
		}
	
	} else {
		dayObj.style.display = "none";
	}
	updateDate(field_id);
}
function updateDate(field_id) {
	var year = document.getElementById(field_id+"_year").value;
	var month = document.getElementById(field_id+"_month").value;
	var day = document.getElementById(field_id+"_day").value;

	document.getElementById(field_id).value= year + "-" + month + "-" + day;
}

function days_in_month (year, month) {
     return 32 - new Date(year, month, 32).getDate();
}
