var vdtDispatch = new Array();
vdtDispatch["isNotEmpty"] = new Dispatcher(isNotEmpty);
vdtDispatch["isSelected"] = new Dispatcher(isSelected);
vdtDispatch["isDate"] = new Dispatcher(isDate);
vdtDispatch["isPosInteger"] = new Dispatcher(/^\d+$/);
vdtDispatch["isInteger"] = new Dispatcher(/^-?\d+$/);
vdtDispatch["isNumber"] = new Dispatcher(/(^-?\d+\.\d*$)|(^-?\d+$)|(^-?\.\d+$)/);
//vdtDispatch["isEmail"] = new Dispatcher(/^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/);
vdtDispatch["isEmail"] = new Dispatcher(/^[\'a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/);
vdtDispatch["isPhone"] = new Dispatcher(/^\(?\d{3}\)?([-. ]?)\d{3}[-. ]?\d{4}$/);
vdtDispatch["isSSN"] = new Dispatcher(/^\d{3}([- ]?)\d{2}\1\d{4}$/);
vdtDispatch["isZipCode"] = new Dispatcher(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
vdtDispatch["isCurrency"] = new Dispatcher(/(^\$?\d+\.\d{2}$)|(^\$?\d+$)|(^\$?\.\d{2}$)/);
//vdtDispatch["isMilEmail"] = new Dispatcher(/^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[mil]/);
vdtDispatch["isMilEmail"] = new Dispatcher(/^[\'a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[mil]/);
vdtDispatch["isValidDate"] = new Dispatcher(isEmpty,isDate);
vdtDispatch["isValidPosInteger"] = new Dispatcher(isEmpty,"isPosInteger");
vdtDispatch["isValidNumber"] = new Dispatcher(isEmpty,"isNumber");
vdtDispatch["isValidEmail"] = new Dispatcher(isEmpty,"isEmail");
vdtDispatch["isValidPhone"] = new Dispatcher(isEmpty,"isPhone");
vdtDispatch["isValidSSN"] = new Dispatcher(isEmpty,"isSSN");
vdtDispatch["isValidZipCode"] = new Dispatcher(isEmpty,"isZipCode");
vdtDispatch["isValidCurrency"] = new Dispatcher(isEmpty,"isCurrency");
vdtDispatch["isValidMilEmail"] = new Dispatcher(isEmpty,"isMilEmail");

function Dispatcher() {
	this.vldtProc = arguments;
	this.applyValidate = dspExecute;

	function dspExecute(objRef) {
		with(this) {
			var ret = false;
			for(i=0;i < this.vldtProc.length;i++) {
				if(vldtProc[i].compile && vldtProc[i].test(objRef.value) || vldtProc[i].substring && vdtDispatch[vldtProc[i]].applyValidate(objRef) || vldtProc[i].call && vldtProc[i](objRef)) ret = true;
			}
			return ret;
		}
	}
}

function validate(objRef,method) {
	var args = validate.arguments;
	for (i = 1;i < args.length;i++) { if(!vdtDispatch[args[i]].applyValidate(objRef)) return false;}
	return true;
}

function isEmpty(objRef){ return (objRef.value == null || objRef.value == "");}

function isNotEmpty(objRef){ return !isEmpty(objRef);}

function isSelected(objRef) {
	if(objRef.selectedIndex != null) return ((objRef.selectedIndex == 0 && !objRef.multiple) || (objRef.selectedIndex == -1 && objRef.multiple)? false : true);
	if(objRef.length == null) return objRef.checked;
	for(var i = 0;i < objRef.length;i++) {if(objRef[i].checked == true) return true;}
	return false;
}

function isDate(objRef) {
	if(/[^a-zA-Z0-9]+/.test(objRef.value) && !isNaN(Date.parse(objRef.value)) ) {
		var dateRef = new Date(objRef.value);
		if (dateRef.getFullYear() > 1754)
			return true;
		else
			return false;
	}
	return false;
}
/*function isDate(objRef) {
	if(/[^a-zA-Z0-9]+/.test(objRef.value) && !isNaN(Date.parse(objRef.value)) ) return true;
	return false;
}*/



var zChar = new Array(' ', '(', ')', '-', '.');
var maxphonelength = 13;
var phonevalue1;
var phonevalue2;
var cursorposition;

function ParseForNumber1(object){
	phonevalue1 = ParseChar(object.value, zChar);
}
function ParseForNumber2(object){
	phonevalue2 = ParseChar(object.value, zChar);
}

function backspacerUP(object,e) { 
if(e){ 
	e = e 
	} else {
	e = window.event 
	} 
	if(e.which){ 
	var keycode = e.which 
	} else {
	var keycode = e.keyCode 
	}
	
	ParseForNumber1(object)
	
	if(keycode >= 48){
	ValidatePhone(object)
	}
}

function backspacerDOWN(object,e) { 
if(e){ 
	e = e 
	} else {
	e = window.event 
	} 
	if(e.which){ 
	var keycode = e.which 
	} else {
	var keycode = e.keyCode 
	}
	ParseForNumber2(object)
	} 
	
	function GetCursorPosition(){
	
	var t1 = phonevalue1;
	var t2 = phonevalue2;
	var bool = false
	for (i=0; i<t1.length; i++)
	{
	if (t1.substring(i,1) != t2.substring(i,1)) {
	if(!bool) {
	cursorposition=i
	bool=true
	}
}
}
}

function ValidatePhone(object){
	
	var p = phonevalue1
	
	p = p.replace(/[^\d]*/gi,"")
	
	if (p.length < 3) {
	object.value=p
	} else if(p.length==3){
	pp=p;
	d4=p.indexOf('(')
	d5=p.indexOf(')')
	if(d4==-1){
	pp="("+pp;
	}
	if(d5==-1){
	pp=pp+")";
	}
	object.value = pp;
	} else if(p.length>3 && p.length < 7){
	p ="(" + p; 
	l30=p.length;
	p30=p.substring(0,4);
	p30=p30+")"
	
	p31=p.substring(4,l30);
	pp=p30+p31;
	
	object.value = pp; 

} else if(p.length >= 7){
	p ="(" + p; 
	l30=p.length;
	p30=p.substring(0,4);
	p30=p30+")"
	
	p31=p.substring(4,l30);
	pp=p30+p31;
	
	l40 = pp.length;
	p40 = pp.substring(0,8);
	p40 = p40 + "-"
	
	p41 = pp.substring(8,l40);
	ppp = p40 + p41;
	
	object.value = ppp.substring(0, maxphonelength);
}

GetCursorPosition()

if(cursorposition >= 0){
	if (cursorposition == 0) {
		cursorposition = 2
		} else if (cursorposition <= 2) {
		cursorposition = cursorposition + 1
		} else if (cursorposition <= 5) {
		cursorposition = cursorposition + 2
		} else if (cursorposition == 6) {
		cursorposition = cursorposition + 2
		} else if (cursorposition == 7) {
		cursorposition = cursorposition + 4
		e1=object.value.indexOf(')')
		e2=object.value.indexOf('-')
		if (e1>-1 && e2>-1){
		if (e2-e1 == 4) {
		cursorposition = cursorposition - 1
	}
}
} else if (cursorposition < 11) {
	cursorposition = cursorposition + 3
} else if (cursorposition == 11) {
	cursorposition = cursorposition + 1
} else if (cursorposition >= 12) {
	cursorposition = cursorposition
}

var txtRange = object.createTextRange();
	txtRange.moveStart( "character", cursorposition);
	txtRange.moveEnd( "character", cursorposition - object.value.length);
	txtRange.select();
	}

}

function ParseChar(sStr, sChar)
	{
	if (sChar.length == null) 
	{
	zChar = new Array(sChar);
	}
	else zChar = sChar;
	
	for (i=0; i<zChar.length; i++)
	{
	sNewStr = "";
	
	var iStart = 0;
	var iEnd = sStr.indexOf(sChar[i]);
	
	while (iEnd != -1)
	{
	sNewStr += sStr.substring(iStart, iEnd);
	iStart = iEnd + 1;
	iEnd = sStr.indexOf(sChar[i], iStart);
	}
	sNewStr += sStr.substring(sStr.lastIndexOf(sChar[i]) + 1, sStr.length);
	
	sStr = sNewStr;
	}
	
	return sNewStr;
}


// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

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 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++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

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 strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if(dtStr=="")
		{		
		return true
		}
	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 date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid date")
		return false
	}
return true
}

function ValidateForm(){
	var dt=document.form1.dob
	if (isDate(dt.value)==false){
		dt.focus()
		return false
	}
    return true
 }
 

function ValidPhone(aphone)
{
	var valid = "0123456789";

		if(aphone=="")
		{
		alert("Phone number is required field!")
		return false
		}
		
		if(aphone.length != 10)
		{
		alert("Invalid phone number! Please try again.")
		return false
		}
		
		
		for (var i=0; i < aphone.length; i++)
		{
		temp = "" + aphone.substring(i, i+1);
		
		
			if (valid.indexOf(temp) == "-1") 
			{
			alert("Invalid characters in your phone.  Please try again.")
			return false;
			}
		}
		
	
		return true;
}






function valid_date(field)
{
	//if(field=="")
	//{
	//alert("Date of Birth required field!")
	//return false;
	//}
	
	var valid = "0123456789/";
	var slashcount = 0;

	if (field.length!=10 && field.length!='' && field != '01/01/1900') 
	{
	alert("Invalid date! The correct date format is like '01/01/2004'.   Please try again.")
	return false;
	}
		for (var i=0; i < field.length; i++)
		 {
		temp = "" + field.substring(i, i+1);
		if (temp == "/") 
		slashcount++;
			if (valid.indexOf(temp) == "-1") 
			{
			alert("Invalid characters in your date.  Please try again.")
			return false;
			}
		if (slashcount > 2) 
		{
		alert("Invalid Date!  The slash character should be used with a properly formatted 8 digits like  '01/01/2004'.   Please try again.")
		return false;
  		 }
		if((field.charAt(2)!= '/')||(field.charAt(5) != '/'))
		{
		alert("Invalid date! The slash character should be used with a properly formatted 8 digits like  '01/01/2004'.   Please try again.")
		return false;
		}
	}
	return true;

}

function valid_required(field)
{
	if(field=="") 
	{
	return false;
	}

	return true;
}


function EmailValid(email)
	{
		if(email=="")
		{
		alert("Email is required field!")
		return false
		}
		len = email.length
		
		if((email.charAt(1)=='@')||(email.charAt(1)=='.'))
		{
		alert("Invalid Email Please try again!")
		return false
		}
		if((email.charAt(len-2)=='@')||(email.charAt(len-2)=='.'))
		{
		alert("Invalid Email Please try again!")
		return false
		}
		
				

		count=0
		dotcount=0
	for (i=0; i< email.length; i++)
		{
			if(email.charAt(i)=='@')
			count++
			if(email.charAt(i)=='.')
			dotcount++
		 }
		
			 if((count !=1)||(dotcount !=1))
			 	{
			 	alert("Invalid Email Please try again!")
			 	return false
			 	}
		
		
	return true
	}

function validcc(field)
{
	if(field=="")
	{
	return true;
	}
	
	var valid = "0123456789/";
	var slashcount = 0;
	
	if ((field.charAt(0) > '2') ||  (field.charAt(3)!= '2')) 
	{
	alert("Invalid date! The correct date format is like '01/2004'.   Please try again")
	return false;
	}
		
	if (field.length!=7 && field.length!='' && field != '01/1900') 
	{
	alert("Invalid date! The correct date format is like '01/2004'.   Please try again.")
	return false;
	}
		
		for (var i=0; i < field.length; i++)
		 {
		temp = "" + field.substring(i, i+1);
		if (temp == "/") 
		slashcount++;
			if (valid.indexOf(temp) == "-1") 
			{
			alert("Invalid characters in your date.  Please try again.")
			return false;
			}
		if (slashcount > 1) 
		{
		alert("Invalid Date! The correct date format is like '01/2004'. Please try again.")
		return false;
  		 }
		if((field.charAt(2)!= '/'))
		{
		alert("Invalid Date! The correct date format is like '01/2004'. Please try again.")
		return false;
		}
	}
	return true;

}

function isNumberKey(evt)
      {
         var charCode = (evt.which) ? evt.which : event.keyCode
         if (charCode > 31 && (charCode < 48 || charCode > 57 ) )
            return false;

         return true;
      }
	  
function isAlphaKey(e) {
	var k;
	document.all ? k = e.keyCode : k = e.which;
	return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8);
	}
	
function extractAlpha(str) {
	return str.replace(/[^a-z]/gi,"");
	}	