// JavaScript validation routines
// Web Techniques

var validated=true;  // global
// call this from onchange
function valid(fld,errm) // varying number of arguments
  {
  var i;
  validated=true;
// scan regular expressions
  for (i=2;i<valid.arguments.length;i++) 
    {
    var rx;
    rx=new RegExp(valid.arguments[i]);
    if (rx.exec(fld.value)!=null ) 
       return true;  // ok
    }
// no matches...
  alert(errm);
  fld.focus();   // put focus back
  validated=false;  // tell onsubmit if necessary
  return false;
  }


// This scans all the onchanged routines
function onsubmit(frm)
  {
  // force validation of all fields
  var l;
  var i;
  validated=true;
  for (i=0; i < frm.elements.length && validated; i++)
  	{
    if (frm.elements[i].onchange!=null)
      frm.elements[i].onchange();  // fake change
    }
  return validated;
  }

function validUSphone(fld)
  {
  rv=valid(fld,"Please enter your phone number with area code",
    "^ *\\(? *([0-9][0-9][0-9]) *\\)? *[-.]? *([0-9][0-9][0-9]) *[-.]? *([0-9][0-9][0-9][0-9]) *$");
  if (rv)
    fld.value="(" + RegExp.$1 + ") " + RegExp.$2 + "-" + RegExp.$3;
  return rv;
  }
  
  


function validUSphoneID(fld)
  {
  rv=valid(fld,"Please enter your U.S. phone number with area code in the " + fld.name + " field",
    "^ *\\(? *([0-9][0-9][0-9]) *\\)? *[-.]? *([0-9][0-9][0-9]) *[-.]? *([0-9][0-9][0-9][0-9]) *$");
  if (rv)
    fld.value="(" + RegExp.$1 + ") " + RegExp.$2 + "-" + RegExp.$3;
  return rv;
  }
  

var ccArray = new Array;
ccArray["Visa"] = ["Visa","4,4,4,4;4,4,4,1","4000,4999"];
ccArray["MasterCard"] = ["MasterCard","4,4,4,4","5100,5599"];
ccArray["Discover"] = ["DiscoverCard","4,4,4,4","6011"];
ccArray["Amex"] = ["American Express","4,6,5","3400,3499;3700,3799"];
ccArray["Diners"] = ["Diners Club","4,6,4","3000,3059;3600,3699;3800,3889"];
ccArray["Carte"] = ["Carte Blanche","4,6,4","3890,3899"];

function validRadio(radiobj,errm) {
	var selected = false;
	var group = eval("document." + radiobj.form.name + "." + radiobj.name);
/*
	alert("group.length: " + group.length);
*/
	for (var i = 0; i < group.length; i++) {
		if (group[i] != "") {selected = true;}
	}
	if (selected == false) {alert(errm);}
	radiobj.focus();
	return selected;
}
function validEmail(fld,otherfld) {
	var retcode = false;
	if (otherfld.value != "") {
		if (fld.value != "")  {
			var fldstatus = valid(fld,'Please enter a valid e-mail address','^ *[-a-zA-Z0-9_]+@[-a-zA-Z0-9_]+\\.[a-zA-Z][a-zA-Z][a-zA-Z]?$');
			if (fldstatus) {
				if (fld.value != otherfld.value) {
					alert('Please verify the email address ' + fld.value + '.');
					otherfld.focus();
				}
				else {
					retcode = true;
				}
			}
		}
		else {
			alert('Please re-enter the email address.');
			fld.value='';
			fld.focus();
		}
	}
	else {
		fld.value = "";
		retcode = true;
	}
	validated = retcode;
	return retcode;
}
function CCvalidate(obj) {
	var retcode = "";
	var oldval = obj.value
	var rv = valid(obj,'Only numeric characters allowed.','^[0-9-]+$');
	if (rv) {
		// validate number of digits
		var cctype = obj.form.card_type;
		var ccard = cctype.options[cctype.selectedIndex].value;
		// build validation string
		var ccnumValArray = ccArray[ccard][1].split(";");
		var ccnumarray = new Array;
		var reformstrArray = new Array;
		var numvalstr;
		var valstr = "";
		for (var va=0; va < ccnumValArray.length;va++) {
			ccnumarray[va] = ccArray[ccard][1].split(",");
			
			reformstr[va] = "";
			numvalstr = "^";
			for  (var i=0; i < ccnumarray[va].length; i++) {
				if (i != 0) {
					numvalstr = numvalstr + "[- ]?"; 
					reformstr[va] += ' + "-" + ';
				}
				numvalstr += "(\\d{" + ccnumarray[va][i] + "})";
				reformstr[va] += "RegExp.$" + (i+1);
			}
			numvalstr[va] += "$";
		// build validation string
			if (va !=0) {valstr += ",";} // prepend comma if more than one validation string
			valstr += numvalstr[va];
		}
		// validate/reformat creditcard number
		// strip out "[- ]"
		var replx = /[- ]/g;
		obj.value = obj.value.replace(replx,"")
		
		// check number of numbers in number
		var msg = "Wrong number of digits in your " + ccard + " credit card number";
		var rv2 = eval("valid(obj,msg," + valstr + ")");
		if (rv2) {
			// check for correct first four numbers for card type
			var firstfourarray = new Array;
			firstfourarray = ccArray[ccard][2].split(";");
			var firstfour = "";
			var firstfournumb = obj.value.substr(0,4);
			for (var firstfour in firstfourarray) {
				var first4pair = firstfour.split(",");
				var compstring = "";
				if (first4pair.length == 2) {
					compstring = "(firstfournumb >= first4pair[0]) && (firstfournumb <= first4pair[1])";
				}
				else {
					compstring = "firstfournumb == first4pair[0]";
				}
				if (compstring) {
					// check for valid card number
					if (LuhnCheck(obj.value,obj.value.length)) {obj.value= eval(reformstr);return true;}
					else {alert("Invalid " + ccArray[ccard][0] + " number."); return false;}
				}
				else {alert("Invalid " + ccArray[ccard][0] + " number.");	return false;}
			}
		}
		else {
			obj.value = oldval;
		}
		validated = rv2;
		return rv2;
	}
	obj.value = oldval;
	validated = false;
	return false
}
function LuhnCheck(num,len) {
/* Performs the Luhn modulo 10 checksum on num. Used for credit card validation
num is string of cc digits, len is the required length
*/
	/*verify num.length and len match*/
	if (num.length != len) {
		alert("Length of number " + num + " is " + num.length + ", not len: " + len);
		return false;
	}
	var sum = 0;
	var temp = 0;
	var tempdnum = 0;
	var tempdbl = "";
	for (i = 0; i < len; i+2){
		temp = Number(num.charAt(len-(i+1)));
		if ((len - i -1) >= 0) {tempdnum = num.charAt(len-i-1) * 2;} else {tempdnum = 0;}
		if (tempdnum > 9) {
			tempdbl = tempdnum.toString();
			tempdnum = Number(tempdbl.charAt(0)) + Number(tempdbl.charAt(1));
		}
		sum += temp + tempdnum;
	}
	if ((sum % 10) != 0) {return false;} else {return true;}
}

