function Validator(frmname) {
  this.formobj=document.forms[frmname];
	if(!this.formobj) {
		alert("BUG: could not get Form object "+frmname);
		return;
	}

	if(this.formobj.onsubmit) {
		this.formobj.old_onsubmit = this.formobj.onsubmit;
		this.formobj.onsubmit=null;
	}

	else {
		this.formobj.old_onsubmit = null;
	}

	this.formobj.onsubmit=form_submit_handler;
	this.addValidation = add_validation;
	this.setAddnlValidationFunction=set_addnl_vfunction;
	this.clearAllValidations = clear_all_validations;
}

function set_addnl_vfunction(functionname) {
	this.formobj.addnlvalidation = functionname;
}

function clear_all_validations() {
	for(var itr=0;itr < this.formobj.elements.length;itr++) {
		this.formobj.elements[itr].validationset = null;
	}
}

function form_submit_handler() {
	for(var itr=0;itr < this.elements.length;itr++)	{
		if(this.elements[itr].validationset && !this.elements[itr].validationset.validate()) {
		  return false;
		}
	}

	if(this.addnlvalidation) {
		str =" var ret = "+this.addnlvalidation+"()";
		eval(str);
		if(!ret) return ret;
	}
	return true;
}


function add_validation(itemname,descriptor,errstr) {
	if(!this.formobj) {
		alert("BUG: the form object is not set properly");
		return;
	}//if

	var itemobj = this.formobj[itemname];

	if(!itemobj) {
		alert("BUG: Could not get the input object named: "+itemname);
		return;
	}

	if(!itemobj.validationset) {
		itemobj.validationset = new ValidationSet(itemobj);
	}

	itemobj.validationset.add(descriptor,errstr);
}



function ValidationDesc(inputitem,desc,error) {
	this.desc=desc;
	this.error=error;
	this.itemobj = inputitem;
	this.validate=vdesc_validate;
}


function vdesc_validate() {
	if(!V2validateData(this.desc,this.itemobj,this.error)) {
		this.itemobj.focus();
		return false;
	}
	return true;
}



function ValidationSet(inputitem) {
	this.vSet=new Array();
	this.add= add_validationdesc;
	this.validate= vset_validate;
	this.itemobj = inputitem;
}



function add_validationdesc(desc,error) {
	this.vSet[this.vSet.length]=
	new ValidationDesc(this.itemobj,desc,error);
}


function vset_validate() {
	for(var itr=0;itr<this.vSet.length;itr++) {
		if(!this.vSet[itr].validate()) {
		   return false;
		 }
	}
	return true;
}







function validateEmailv2(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 V2validateData(strValidateStr,objValue,strError) {
	var epos = strValidateStr.search("=");
	var  command  = "";
	var  cmdvalue = "";

if(epos >= 0) {
	command  = strValidateStr.substring(0,epos);
	cmdvalue = strValidateStr.substr(epos+1);
}
else {
	    command = strValidateStr;
}


switch(command) {
	case "req":
	case "required": {
	    if(eval(objValue.value.length) == 0) {
		    if(!strError || strError.length ==0) {
			    strError = objValue.name + " : Required Field";
	    	}//if
	    	alert(strError);
	    	return false;
	    }//if
		break;
	}//case required


	case "maxlength":
	case "maxlen":{
	    if(eval(objValue.value.length) >  eval(cmdvalue)){
		    if(!strError || strError.length ==0) {
			    strError = objValue.name + " : "+cmdvalue+" characters maximum ";
		    }//if
		    alert(strError);
		    return false;
	    }//if
		break;
	}//case maxlen


	case "minlength":
	case "minlen":	{
	    if(eval(objValue.value.length) <  eval(cmdvalue)) {
	        if(!strError || strError.length ==0) {
	            strError = objValue.name + " : " + cmdvalue + " characters minimum  ";
	        }//if
	        alert(strError);
	        return false;
	    }//if
		break;
	}//case minlen

	case "alnum":
	case "alphanumeric": {
		var charpos = objValue.value.search("[^A-Za-z0-9]");
		if(objValue.value.length > 0 &&  charpos >= 0) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Only alpha-numeric characters allowed ";
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//case alphanumeric

	case "num":
	case "numeric":	{
		var charpos = objValue.value.search("[^0-9]");
		if(objValue.value.length > 0 &&  charpos >= 0) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Only digits allowed ";
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//numeric
	
	case "dec":
	case "decimal":	{
		var charpos = objValue.value.search("[^0-9.]");
		if(objValue.value.length > 0 &&  charpos >= 0) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Only digits allowed ";
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//numeric


	case "alphabetic":
	case "alpha": {
		var charpos = objValue.value.search("[^A-Za-z]");
		if(objValue.value.length > 0 &&  charpos >= 0) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Only alphabetic characters allowed ";
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//alpha


	case "phone": {
		var charpos = objValue.value.search("[^0-9\-()+ ]");
		if(objValue.value.length > 0 &&  charpos >= 0) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": characters allowed are 0-9,- and ()";
			}//if
			alert(strError);
			return false;
		}//if
		break;
	} //case phone


    case "time": {
		var regEx=/^(([0-9])|([0-1][0-9])|([2][0-3])):(([0-9])|([0-5][0-9]))$/
      	if (!objValue.value.match(regEx)){
	  	     alert (strError);
             return false;
        }else {
        	    return	true;
        }
		break;
	} //case time




    case "money": {

		var regExa=/(^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\d*\.\d*$)/

        if (!objValue.value.match(regExa)){
        	alert (strError);
        	return false;
       }
       else{
       	return true;
       }
 		break;
	} //case money

    case "duration": {

		var regExa=/^[0-9]?[0-9]:[0-5][0-9]:[0-5][0-9]$/

        if (!objValue.value.match(regExa)){
        	alert (strError);
        	return false;
       }
       else{
       	return true;
       }
 		break;
	} //case duration







    case "words": {

		var regExa=/^[a-zA-Z\s.\-_']+$/


        if (!objValue.value.match(regExa)){
        	alert (strError);
        	return false;
       }
       else{
       	return true;
       }
 		break;
	} //case money





    case "wordsnumbers": {

		var regExa=/^[a-zA-Z0-9\s.\-_']+$/


        if (!objValue.value.match(regExa)){
        	alert (strError);
        	return false;
       }
       else{
       	return true;
       }
 		break;
	} //case money




    case "eventCode": {
	 return	check_mask(objValue.value, "E#######", false, strError);
		break;
	} //case eventCode



	case "dateOptional":
		if(objValue.value == "")
		{
			return true;
		}
		var regEx  = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/

        if (objValue.value.match(regEx)){
			return true;
	    }
        else{
   			alert (strError);
	       	return false;
    	}
 		break;
    case "date": {

	    var regEx  = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/

        if (objValue.value.match(regEx)){
			var datePos=DatePosition(objValue.value);
            if (datePos==1){
	   			return true;
            }
		    else {
        	   	alert ("Date entered has already passed (dd/mm/yyyy)");
	            return false;
            }
	    }
        else{
   			alert (strError);
	       	return false;
    	}
 		break;
	} //case date



    case "dob": {

	    var regEx  = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/

        if (objValue.value.match(regEx)){
			var datePos=DatePosition(objValue.value);
//            if (datePos==-1){
//	   			return true;
//          }
//		    else {
//        	   	alert ("Not a valid birth date");
//	            return false;
//            }
	    }
        else{
   			alert (strError);
	       	return false;
    	}
 		break;
	} //case dob













	case "email": {
		if(!validateEmailv2(objValue.value)) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Enter a valid Email address ";
			}//if
			alert(strError);
			return false;
		}//if
	break;
	}//case email

	case "lt":
	case "lessthan": {
		if(isNaN(objValue.value)) {
			alert(objValue.name+": Should be a number ");
			return false;
		}//if

        if(eval(objValue.value) >=  eval(cmdvalue)) {
			if(!strError || strError.length ==0) {
				strError = objValue.name + " : value should be less than "+ cmdvalue;
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//case lessthan

	case "gt":
	case "greaterthan": {
		if(isNaN(objValue.value)) {
			alert(objValue.name+": Should be a number ");
			return false;
		}//if

		if(eval(objValue.value) <=  eval(cmdvalue))	{
			if(!strError || strError.length ==0) {
				strError = objValue.name + " : value should be greater than "+ cmdvalue;
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//case greaterthan
	
	case "gtet":
	case "greaterthanequalto": {
		if(isNaN(objValue.value)) {
			alert(objValue.name+": Should be a number ");
			return false;
		}//if

		if(eval(objValue.value) =  eval(cmdvalue))	{
			if(!strError || strError.length ==0) {
				strError = objValue.name + " : value should be greater than "+ cmdvalue;
			}//if
			alert(strError);
			return false;
		}//if
		break;
	}//case greaterthan

	case "regexp": {
		if(objValue.value.length > 0) {
			if(!objValue.value.match(cmdvalue)) {
				if(!strError || strError.length ==0) {
					strError = objValue.name+": Invalid characters found ";
				}//if
				alert(strError);
				return false;
			}//if
		}
		break;
	}//case regexp


	case "dontselect": {
		if(objValue.selectedIndex == null) {
			alert("BUG: dontselect command for non-select Item");
			return false;
		}

		if(objValue.selectedIndex == eval(cmdvalue)) {
			if(!strError || strError.length ==0) {
				strError = objValue.name+": Please Select one option ";
			}//if

    		alert(strError);
			return false;
		}
		break;
	}//case dontselect

}//switch

return true;

}



function check_mask(field_value, mask, case_sensitive, str_error) {

    if (field_value.length != mask.length) {
	    alert (str_error);
		return false;
    }

    for (var counter = 0; counter < mask.length; counter++) {
	   current_mask = mask.charAt(counter);
	   current_char = field_value.charAt(counter);
	   if (current_mask == "@") {
 		  if (!its_a_letter(current_char)) {
	         alert (str_error);
 	    	 return false;
 	      }
       }
	   else if (current_mask == "#") {
	      if (!its_a_digit(current_char)) {
   	         alert (str_error);
		     return false;
	      }
	   }
	   else {
    	  if (!case_sensitive) {

		      current_mask = current_mask.toUpperCase();
		      current_char = current_char.toUpperCase();
		  }
		  if (current_mask != current_char) {
	          alert (str_error);
		      return false;

		  }
	   }
	}
    return true;
}


function its_a_letter(character) {

    var lowercase_letters = "abcdefghijklmnopqrstuvwxyz"
    var uppercase_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    // If it's not in the lowercase_letters string or the
    // uppercase_letters string, then it's not a letter,
    // so return false

    if (lowercase_letters.indexOf(character) == -1 &&
   uppercase_letters.indexOf(character) == -1) {
   return false
    }

    // Otherwise, it's a letter, so return true
    return true
}
function its_a_upletter(character) {

    var uppercase_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    // If it's not in the lowercase_letters string or the
    // uppercase_letters string, then it's not a letter,
    // so return false

    if (uppercase_letters.indexOf(character) == -1) {
   return false
    }

    // Otherwise, it's a letter, so return true
    return true
}
function its_a_digit(character) {

    var digit_characters = "0123456789"

    // If it's not in the digit_characters string,
    // then it's not a digit so return false

    if (digit_characters.indexOf(character) == -1) {
   return false
    }

    // Otherwise, it's a digit, so return true
    return true
}












function DatePosition(dateString) {
    var now = new Date();
    var today = new Date(now.getYear(),now.getMonth(),now.getDate());
    var century = parseInt(now.getYear()/100)*100;
    var date = new Date(dateString.substring(6,10),
        					dateString.substring(3,5)-1,
                            dateString.substring(0,2));

    if (date < today)
    {
        return -1;
    }
    else if (date > today)
    {

        return 1;

    }
    else
    {

        return 0;
    }
}






