/*
 * This function parses &-separated name=value argument pairs from
 * the query string of the URL. It stores the name=value pairs in 
 * properties of an object and returns that object.
 */
var ActiveValidateOptions = false;
var validatorused = false;
function getArgs() 
{var query = location.search.substring(1);  // skip the ?
 return argArray("&", query, true);
}
function argArray(delimit, source, uesc) 
{var args = new Object();
 var pairs = source.split(delimit); // break into separate strings
 for(var i = 0; i < pairs.length; i++) 
    {var pos = pairs[i].indexOf('=');  // Look for "name=value".
     if (pos == -1)
		    {
				 var argname = pairs[i];
		     args[argname] = true;// store property = true
				}
		 else
		    {
         var argname = pairs[i].substring(0,pos); // Extract the name.
		     var value = pairs[i].substring(pos+1); 	// Extract the value.
    		 value = value.replace(/\+/g, " ");
		     args[argname] = (uesc)?unescape(value):value;// Store as a property.
				}
    }
 return args; // Return the object.
}
function nullfunc(){}
function validateForm(thisform, vOptions)
{var vOpts = argArray("|", vOptions, false);
 ActiveValidateOptions = vOpts;
 thisform.vOpts = vOpts; // save options in form.
 var isgood = true;
 var t = thisform.elements;
 for (var i = 0; i < t.length; i++)
    {if (validTag(t[i]) == false) isgood = false;
    }
 if (vOpts != null)
    if (vOpts.msg && vOpts.mclass)
       {var y = document.getElementById(vOpts.msg);
        if (y)
	       if (isgood)
		      y.className = vOpts.mclass;
   		   else
		      y.className = "";
   	   }
 return isgood;  
}
function validateTag(thistag, vOptions)
{var vOpts = getOptions(thistag, vOptions);
 var isgood = validTag(thistag);
 if (vOpts != null)
    if (vOpts.msg && vOpts.mclass)
       {var y = document.getElementById(vOpts.msg);
        if (y)
	       if (!isgood)
		      y.className = vOpts.mclass;
   		   else
		      y.className = "";
   	   }
 return isgood;  
}
function valTagb(tag){return validateTag(tag, "");}
function getOptions(frm, vOptions)
{vOpts = argArray("|", vOptions, false);
 if (frm.tagName != "FORM") {frm = frm.form;}
 if (frm.vOpts)
    {if (vOptions == "") vOpts = frm.vOpts;}
 return vOpts;
}
function clearForm(thisform, vOptions)
{
 var vOpts = getOptions(thisform, vOptions);
 
 var t = thisform.elements;
 for (var i = 0; i < t.length; i++)
    {clearTag(t[i]);
    }
 if (vOpts != null)
    if (vOpts.msg && vOpts.mclass)
       {var y = document.getElementById(vOpts.msg);
        if (y)
		      y.className = vOpts.mclass;
   	   }
 ActiveValidateOptions = false;
 thisform.vOpts = false;
 return;  
}
function validTag(thisTag)
{validatorused = false;
 var pn = thisTag.parentNode;
 while (pn.nodeName != "DIV" && pn.nodeName != "SPAN") 
    {if (pn.nodeName == "FORM" || pn.nodeName == "BODY")
		    {pn = false;
				 break;
				}
		 pn = pn.parentNode;
		}
 var pcls = getclassnames(pn);
 var cls = getclassnames(thisTag);
 var i = 0;
 for (i = 0; i < cls.length; i++)
    {if (cls[i] == "invalid") cls[i] = "";
		 if (cls[i] == "valid") cls[i] = "";
    }
 thisTag.className = classstring(cls);   
 for (i = 0; i < pcls.length; i++)
    {if (pcls[i] == "invalid") pcls[i] = "";
		 if (pcls[i] == "valid") pcls[i] = "";
    }
 pn.className = classstring(pcls);   
 if (checkclass(cls, "readonly")) 
    {validatorused=true;		 
		}
 else
    {for (i = 0; i < cls.length; i++)
				{if (!validClass(thisTag, cls[i])) 
						{if (ActiveValidateOptions && ActiveValidateOptions.UseInvalid)
						   {thisTag.className += " invalid";
						    pn.className += " invalid";
							 }
 				     return false;
						}
				}
		}
 if (validatorused && ActiveValidateOptions && ActiveValidateOptions.UseValid)
    {thisTag.className += " valid";
     pn.className += " valid";		 
		}
 return true;
}
function clearTag(thisTag)
{var pn = thisTag.parentNode;
 while (pn.nodeName != "DIV" && pn.nodeName != "SPAN") 
    {if (pn.nodeName == "FORM" || pn.nodeName == "BODY")
		    {pn = false;
				 break;
				}
		 pn = pn.parentNode;
		}
 var pcls = getclassnames(pn);
 var cls = getclassnames(thisTag);
 var i = 0;
 for (i = 0; i < cls.length; i++)
    {if (cls[i] == "invalid") cls[i] = "";
		 if (cls[i] == "valid") cls[i] = "";
    }
 thisTag.className = classstring(cls);   
 for (i = 0; i < pcls.length; i++)
    {if (pcls[i] == "invalid") pcls[i] = "";
		 if (pcls[i] == "valid") pcls[i] = "";
    }
 pn.className = classstring(pcls);   
 return;
}
/* To add your own validators, simply write a function that returns
true when the data is valid and false when it isn't.  Then add the
function to the case statement below. Watch out for reserved words 
in javascript (case in point 'fixed' & 'match" are reserved words). If you 
wish to automatically format the value, call the function to do this
before you call the testing function (see case ssan or phone) */
function validClass(thisTag, thisClass)
{switch (thisClass)
    {case "fixedw":     return validLengthw(thisTag);
     case "fixedl":     return validLength(thisTag);
     case "reqd":       validatorused = true;
		                    return (thisTag.value != "");
     case "state":      thisTag.value = formatState(thisTag.value);
		                    return validateState(thisTag.value);
     case "number":     return isnum(thisTag.value);
     case "range":      return testrange(thisTag);
     case "phone":      thisTag.value = formatphone(thisTag.value); 
		                    return validatePhone(thisTag.value);
     case "email":      return validEmail(thisTag.value);
     case "ssan":       thisTag.value = formatSSAN(thisTag.value); 
	  	                  return validateSSAN(thisTag.value);
     case "creditcard": thisTag.value = stripNonNum(thisTag.value); 
		                    return testcc(thisTag.value);
     case "zipcode":    return validateZip(thisTag.value);
     case "plus4":      return validateP4(thisTag.value);
		 case "match":      return testmatch(thisTag);
	}
 return true;
}
function validateZip(thisTag)
{validatorused = true;
 if (thisTag.length != 5) return false;
 if (!isnum(thisTag)) return false;
 return true;
}
function validateP4(thisTag)
{validatorused = true;
 if (thisTag.length != 4 && thisTag.length != 0) return false;
 if (!isnum(thisTag)) return false;
 return true;
}
function testmatch(thisTag)
{
 validatorused = true;
 var cls = getclassnames(thisTag);
 var matchname = "";
 try{
		 for (var i = 0; i < cls.length-1; i++)
				{if (cls[i] == "match") matchname = cls[i+1];
				}
		 var matchTag = document.getElementById(matchname);
		 if (thisTag.value == matchTag.value) return true;
    } catch(err) {}/**/
 return false;   
}
function testrange(thisTag)
{validatorused = true;
 var cls = getclassnames(thisTag);
 var xlower = 0;
 var xupper = 1;
 for (var i = 0; i < cls.length-1; i++)
    {if (cls[i] == "lower" && isnum(cls[i+1])) xlower = cls[i+1] * 1;
     if (cls[i] == "upper" && isnum(cls[i+1])) xupper = cls[i+1] * 1;
    }
 if (!isnum(thisTag.value)) return false;
 var val = thisTag.value * 1;
 if ((val >= xlower) && (val <= xupper)) return true;
 return false;   
}
function validLengthw(thisTag)
{var cls = getclassnames(thisTag);
 var xlength = 0;
 for (var i = 0; i < cls.length-1; i++)
    {if (cls[i] == "fixedl" && isnum(cls[i+1])) 
	    {xlength = cls[i+1] * 1;/**/
			}
    }
 if (thisTag.value.length == xlength) return true;
 return false;   
}
function validLength(thisTag)
{validatorused = true;
 return validLengthw(thisTag);
}
// support functions
function inserttext(theid, text)
{var t = document.getElementById(theid);
 t.innerHTML = text;
}
function checkclass(classlist, cls)
{if (classlist[0] == "no classes defined") return false;
 for (var i = 0; i < classlist.length; i++)
    {if (classlist[i] == cls) return true;
    }
 return false;    
}
function getclassnames(thistag)
{if (thistag.className)
     if (thistag.className != "")
        {var cls = thistag.className.split(" ");
         return cls;
        }
 var cls = new Array("no classes defined", "");
 return cls;
}
function checkisinclasslist(thistag, fclass)
{var cls = getclassnames(thistag);
 return checkclass(cls, fclass);
}
function classstring(classlist)
{if (classlist.length == 0) return "";
 var x = "";
 for (var i = 0; i < classlist.length; i++)
    {if (classlist[i] != "no classes defined" && classlist[i] != "")
        {x += " " + classlist[i];
        }
    }
 return x;
}
function addclass(classlist, newclass)
{if (classlist == "")
    {return newclass;
    }
 if (classlist.indexOf(newclass) > -1) return classlist;
 return (classlist + " " + newclass);
}
function removeclass(classlist, rclass)
{var cls = classlist.split(" ");
 for (var i = 0; i < cls.length; i++)
    {if (cls[i] == rclass)
        {cls[i] = "";
        }
    }
 var x = classstring(cls);   
 return x;
}
function validEmail(email)
{validatorused = true;
 var apos=email.indexOf("@");
 var dotpos=email.lastIndexOf(".");
 if (email.indexOf("..") > -1) return false;
 if (email.lastIndexOf("@") != apos) return false;
 return (!(apos<1||dotpos-apos<2));
}
function removechar(src, tc)
{var dest = "";
 for (var i = 0; i < src.length; i++) if (src.charAt(i) != tc) dest += src.charAt(i);
 return dest;
}
function isnum(src)
{for (var i = 0; i < src.length; i++) if (src.charAt(i) < "0" || src.charAt(i) > "9") return false;
 return true;
}
function stripNonNum(src)
{var dest = "";
 for (var i = 0; i < src.length; i++) if ((src.charAt(i) >= "0" && src.charAt(i) <= "9")) dest += src.charAt(i);
 return dest;
}
function stripNonAlpha(src)
{var dest = "";
 for (var i = 0; i < src.length; i++) if ((src.charAt(i) >= "a" && src.charAt(i) <= "z")||(src.charAt(i) >= "A" && src.charAt(i) <= "Z")) dest += src.charAt(i);
 return dest;
}
function formatphone(phone)
{var sphone = stripNonNum(phone);
 if (sphone.length == 8)
   sphone = sphone.substring(0, 1) + "   " + sphone.substring(1);
 switch (sphone.length)
    {case 7: sphone = "   " + sphone;
     case 10: sphone = " " + sphone;
     case 11: return sphone.substring(0,1) + " (" + sphone.substring(1,4) + ") " + sphone.substring(4,7) + "-" + sphone.substring(7);
     default: return (phone);
    }
}
function validatePhone(phone)
{validatorused = true;
 var sphone = stripNonNum(phone);
 switch (sphone.length)
    {case 11: // 19998887777
     case 10: // 9998887777
		 case 8: // 18887777
     case 7: //8887777
             return isnum(sphone);
     default: return false; // any other length is an invalid phone number
    }
 return true;
}
function isssan(src)
{for (var i = 0; i < src.length; i++) if ((src.charAt(i) < "0" || src.charAt(i) > "9") && src.charAt(i) != "-") return false;
 return true;
}
function formatSSAN(ssan)
{var x = stripNonNum(ssan);
 if (x.length == 9)
     return x.substring(0,3) + "-" + x.substring(3,5) + "-" + x.substring(5);
 return ssan;
}
function validateSSAN(ssan)
{validatorused = true;
 var x = stripNonNum(ssan);
 if (x.length == 9) return true;
 return false;
}
function formatState(state)
{var x = stripNonAlpha(state);
 return x.toUpperCase();
}
function validateState(state)
{validatorused = true;
 var x = stripNonAlpha(state);
 if (x.length == 2) return true;
 return false;
}
function testcc(ccnum)
{validatorused = true;
 var sum = 0;
 var scale = 1;
 var x = stripNonNum(ccnum);
 for (var i = x.length - 1; i >= 0; i--)
    {var z = x.charAt(i);
     z *= 1;
     z *= scale;
     if (z > 9) z -= 9;
     sum += z;
     scale = (3 - scale);
    }
 sum %= 10;
 if (sum == 0) return true; else return false;
}
/**************************\
| input limiting functions |
\**************************/
function checkkey(e, valkey)
{var keychar;
 var keynum;
 if(window.event) keynum = e.keyCode; // IE
 else if(e.which) keynum = e.which;   // Netscape/Firefox/Opera
 else return true;
 keychar = String.fromCharCode(keynum);
 return valkey.test(keychar);
}
function numbersOnly(event) { return checkkey(event, /[0-9\r]/); }
function ssanOnly(event) { return checkkey(event, /[0-9\r\-]/); }
function phoneOnly(event) { return checkkey(event, /[0-9\r\-\(\) ]/); }
function emailOnly(event) { return checkkey(event, 
								           /[a-zA-Z0-9@\.\-_\r]/); }
function commonOnly(event) { return checkkey(event, 
													 /[a-zA-Z0-9@#;\x27,\:\*\.\-_\r ]/); }
/**/
