var blankList = new Array(); // entries that the user hasn't clicked 

function emailCheck (formObj) {
	var emailPat=/^(.+)@(.+)$/
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var validChars="\[^\\s" + specialChars + "\]"
	var quotedUser="(\"[^\"]*\")"
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom=validChars + '+'
	var word="(" + atom + "|" + quotedUser + ")"
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
		
	for (var i = 0; i < formObj.elements.length; i++ ){
		if (formObj.elements[i].email) {
			var emailStr = formObj.elements[i].value;
			var matchArray=emailStr.match(emailPat);
	
			if (matchArray==null) {
				alert("An email address seems incorrect (check @ and .'s)");
				return false;
			}
			var user=matchArray[1]
			var domain=matchArray[2]
			if (user.match(userPat)==null) {
   				alert("An email address doesn't seem to be valid.")
   				return false;
			}
			var IPArray=domain.match(ipDomainPat)
			if (IPArray!=null) {
  				for (var i=1;i<=4;i++) {
    				if (IPArray[i]>255) {
        				alert("An email IP address is invalid!")
						return false;
    				}
   				}
   				return true;
			}
			var domainArray=domain.match(domainPat)
		
			if (domainArray==null) {
				alert("An email domain name doesn't appear to be valid.")
   				return false
			}
			var atomPat=new RegExp(atom,"g");
			var domArr=domain.match(atomPat);
			var len=domArr.length;
	
			if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>4) {
				alert("Email addresses must end in a valid top level domain.");
				return false;
			}
		
			if (len < 2) {
				var errStr="An email address is missing a hostname!"
				alert(errStr);
				return false;
			}
		}
	}
		
	return true;
}

function isBlank(s) {
	for (var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if ((c != ' ') && (c != '\n') && (c != '\t'))
			return false;
	}
	
	return true;
}

function isJunk(formObj) {
	
	for (var i = 0; i < formObj.elements.length; i++ )
		if (formObj.elements[i].noJunk) {
				var result = formObj.elements[i].value.match(/[\*!\@\$\%~\|\\\?\/<>\^\]\[;:=\+_\{\}`]/);
				if (result != null) {
					alert(formObj.elements[i].name + ' contains an invalid character');
					return true;
				}
		}
	
	return false;						
}

function isPhone(formObj) {
	var result;
	
	for (var i = 0; i < formObj.elements.length; i++ ) {
		
		if (formObj.elements[i].isPhone) {
			//var result = formObj.elements[i].value.match(/^\d{7,11}$/);
			var result = formObj.elements[i].value.match(/[\*!#\@\$\%~\|\\\?\/<>\^\]\[;:=\+_\{\}`]/);
			
			if (result != null) {
				alert(formObj.elements[i].name + ' contains invalid characters');
	  			return false;
			}
			else if (formObj.elements[i].value.length < 7){
				alert(formObj.elements[i].name + ' is incorrect');
				return false;
			}
			else {
				//result = formObj.elements[i].value.match(/[a-zA-Z]/); // doesn't work!
				result = formObj.elements[i].value.match(/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQUSTUVWXYZ]/);
				
				if (result != null) {
					alert(formObj.elements[i].name + ' contains invalid characters');
					return false;
				}	
			}
		}
	}	
			
	return true;  
}

function validAge(formObj) {
	for (var i = 0; i < formObj.elements.length; i++ ) {
		
		if (formObj.elements[i].validAge) {
			var result = formObj.elements[i].value.match(/^\d{1,2}$/);
			if (result) {
				if (formObj.elements[i].value < 18) {
					alert(formObj.elements[i].name + ': Sorry, but you must be 18.');
					return false;
				}	
			}
			else {
				alert(formObj.elements[i].name + ' is not valid.');
				return false;
			}		
		}
	}
	
	return true;	
}

function validLength(formObj) {
	for (var i = 0; i < formObj.elements.length; i++ ) {
		
		if (formObj.elements[i].validLength) {
			var len = formObj.elements[i].validLength;
			if (formObj.elements[i].value.length < len) {
			   	alert(formObj.elements[i].name + ' must be at least ' + len + ' characters long.');
				return false;
			}		
		}
	}
	
	return true;	
}

function formEmpties(formObj) {
	var element;
	for (var i = 0; i < formObj.elements.length; i++ ){
		element = formObj.elements[i];
		if (((element.type == "text") || (element.type=="textarea") || (element.type=="password")) && !element.optional) {
			if (blankList[element.value]) {
				alert(element.value + " is blank" );
				return true;
			}
			else if (element.value == null || element.value == "" || isBlank(element.value)) {
				alert("Please complete all required fields");
				return true;
			}	
		}
		else if (((element.type == "text") || (element.type=="textarea")) && element.optional && blankList[element.value]) {
			
			// insert a blank in the field. This prevents storing prompts in the database!
			
			formObj.elements[i].value = '';
			
		}	 
	}
	
	return false;
}


// slurp up the initial values of the form. These are the empty values, if the form has the
// prompts built into the text fields.

function slurp () {
	for (var i = 0; i < document.forms[0].elements.length; i++ ) 
		if (((document.forms[0].elements[i].type == "text") || (document.forms[0].elements[i].type=="textarea"))
	 		&& !document.forms[0].elements[i].optional) 
	 		blankList[document.forms[0].elements[i].value] = document.forms[0].elements[i].name;
}

function verify(formObj) {
	if (!formEmpties(formObj) && !isJunk(formObj) && isPhone(formObj) && validAge(formObj) && goodFormat(formObj) && validLength(formObj))
		return emailCheck(formObj);
	else
		return false;	
}
			
function verifyAndSquat(formObj) {
	if (verify(formObj)) {
		writeUserNameCookie(formObj.username.value);
		writeMemberCookie(0);
		return true;
	}
	return false;
}

function goodFormat(formObj) {
		
	var badFormatStr = "";
	var msgStr = "";
		
	// Safari can't handle error checking. For now, leave this to the server.
		
    	var agt=navigator.userAgent.toLowerCase();
	
	if (agt.indexOf('safari') != -1) {
		return true;
	}
	else { 
		
		// check for missing info
			
		for (var i = 0; i < formObj.elements.length; i++) {
			var e = formObj.elements[i];
			
			if (e.optional == "true") continue;
					
				// check for incorrect format
		
			if ((typeof(e.correctFormat) == "function") && !e.correctFormat())
				if (badFormatStr.length)
					badFormatStr += ", " + e.name;
				else
					badFormatStr += e.name;				
		}
		
		if (badFormatStr.length)
			msgStr += " Please correct: " + badFormatStr + ".";
		
		if (msgStr.length) {
			alert(msgStr);
			return false;
		}
	}
	
	return true;
}


// For use with card submissions	
// Make dynamic changes to element properties in
// the shippingInfo form.

function conditionalShipInfo(formObj){
	// if the user decides to send a check, don't require credit card info
	
	//if (formObj.paymthd[3].checked){
		//formObj.cardnumb.optional = "true";
		//formObj.expiry.optional = "true";
		//formObj.cardowner.optional = "true";
		//formObj.billaddr.optional = "true";
	//}
	
	
	// give everyone a clean bill of health
	
	for (var i = 0; i < formObj.elements.length; i++) 
			formObj.elements[i].correctFormat = new Function("return true");
			
	// then, make exceptions for some fields; do some special format checks
	
	//formObj.email.correctFormat = new Function("return isMailAddress(this);");
	formObj.cardowner.correctFormat = new Function("return isNotJunk(this);");
	formObj.frstname.correctFormat = new Function("return isNotJunk(this);");
	formObj.surname.correctFormat = new Function("return isNotJunk(this);");
	formObj.city.correctFormat = new Function("return isNotJunk(this);");
	formObj.state.correctFormat = new Function("return isNotJunk(this);");
	formObj.country.correctFormat = new Function("return isNotJunk(this);");
	formObj.cardnumb.correctFormat = new Function("return isCardNumb(this);");
	formObj.expyear.correctFormat = new Function("return isInt(this);");
	formObj.expmonth.correctFormat = new Function("return isCardMonthExpNumb(this);");
}

function isCardNumb(element) {
	//var result = element.value.match(/^[\d+(\-)?]+[\d]+$/);
	var result = element.value.match(/^[\d]+$/);
	if (result == null)
		return false;
	else
		return true;
}

function isCardMonthExpNumb(element) {
	var result = element.value.match(/^1{1}[0-2]{1}|0{1}[1-9]{1}$/);
	
	if (result == null)
		return false;
	else
		return true;
}

function isNotJunk(element) {
	var result = element.value.match(/[\*!\@\$\%~\|\\\?\/<>\^\]\[;:=\+_\{\}`]/);
		
	if (result == null && (element.value.length > 1))
		return true;
	else
		return false;
}

function isInt(element) {
	var result = element.value.match(/^[\d]+$/);
	
	if (result == null)
		return false;
	else
		return true;
}
