var errList = {};
var key = '';
var allFields = '';
//matches - 3334445555, 333.444.5555, 333-444-5555, 333 444 5555, (333) 444 5555 and all combinations thereof
var phExp = new RegExp(/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/);
var phReplace = '($1) $2-$3';

//matches - 99999, 99999-9999, 99999 9999, 999999999, A9A 9A9, a9a 9a9
var zipExp = new RegExp(/\b[0-9]{5}(?:[- ]?[0-9]{4})?\b|\b[abceghjklmnprstvxyABCEGHJKLMNPRSTVXY][0-9][a-zA-Z] [0-9][a-zA-Z][0-9]\b/);

/*
//matches - 
//	AL (ALABAMA), AK (ALASKA), AS (AMERICAN SAMOA), AZ (ARIZONA), AR (ARKANSAS), CA (CALIFORNIA), CO (COLORADO), CT (CONNECTICUT), DE (DELAWARE), DC //(DISTRICT OF COLUMBIA), FM (FEDERATED STATES OF MICRONESIA), 
//	FL (FLORIDA), GA (GEORGIA), GU (GUAM), HI (HAWAII), ID (IDAHO), IL (ILLINOIS), IN (INDIANA), IA (IOWA), KS (KANSAS), KY (KENTUCKY), LA (LOUISIANA), //ME (MAINE), MH (MARSHALL ISLANDS), MD (MARYLAND), MA (MASSACHUSETTS), 
//	MI (MICHIGAN), MN (MINNESOTA), MS (MISSISSIPPI), MO (MISSOURI), MT (MONTANA), NE (NEBRASKA), NV (NEVADA), NH (NEW HAMPSHIRE), NJ (NEW JERSEY), NM //(NEW MEXICO), NY (NEW YORK), NC (NORTH CAROLINA), ND (NORTH DAKOTA), 
//	MP (NORTHERN MARIANA ISLANDS), OH (OHIO), OK (OKLAHOMA), OR (OREGON), PW (PALAU), PA (PENNSYLVANIA), PR (PUERTO RICO), RI (RHODE ISLAND), SC (SOUTH //CAROLINA), SD (SOUTH DAKOTA), TN (TENNESSEE), TX (TEXAS), UT (UTAH), 
//	VT (VERMONT), VI (VIRGIN ISLANDS), VA  (VIRGINIA), WA (WASHINGTON), WV (WEST VIRGINIA), WI (WISCONSIN), WY (WYOMING)
*/

var stateAbrExp = new RegExp(/\b(?:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY]|XX)\b/);
var countryAbrExp = new RegExp(/\b(?:A[DEFGILMNOQRSTUWZ]|B[ABDEFGHIJMNORSTVWYZ]|C[ACDFGHIKLMNORUVXYZ]|D[EJKMOZ]|E[CEGHRST]|F[JIKMORX]|G[ABDEFHILMNPQRSTUWY]|H[KMNRTU]|I[DELNOQRST]|J[MOP]|K[EGHIMNPRWYZ]|L[ABCIKRSTUVY]|M[ACDGHKLMNOPQRSTUVWXYZ]|N[ACEFGILOPRUZ]|OM|P[AEFGHKLMNRTWY]|QA|R[EOUW]|S[ABCDEGHIJKLMNORTVYZ]|T[CDFGHJKMNOPRTVWZ]|U[AGMSYZ]|V[ACEGINU]|W[FS]|Y[ETU]|Z[AMW])\b/);

//matches - asmith@mactec.com, foo12@foo.edu, bob.smith@foo.tv
var emailExp = new RegExp(/([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/);

//matches - <b>,  </b>,  <p><b>some text</b></p>
var htmlExp = new RegExp(/<\/?[a-z][a-z0-9]*[^<>]*>/);
var codeReplace = / /;

//matches - #FFFFFF, #FF3421, #00FF00
var colorCodeExp = new RegExp(/(#){1}([a-fA-F0-9]){3,6}/);

/*matches - <script language=javascript>document.write("one");</script>*/
var jsExp = new RegExp(/(<script[^>]*>[\w|\t|\r|\W]*<\/script>)/);

/*
//matches - 
//	(Visa) 4123456789012345, 4123 4567 8901 2345, 4123-4567-8901-2345 
//	(MasterCard) 5123456789012345, 5123-4567-8901-2345, 5123 4567 8901 2345 
//	(Discover) 6011123456789012, 6011-1234-5678-9012, 6011 1234 5678 9012 
//	(American Express) 341234567890123, 3412 345678 90123, 3412-345678-90123
*/
var ccExp = new RegExp(/^[ -]*(?:4[ -]*(?:\d[ -]*){11}(?:(?:\d[ -]*){3})?\d|5[ -]*[1-5](?:[ -]*[0-9]){14}|6[ -]*(?:0[ -]*1[ -]*1|5[ -]*\d[ -]*\d)(?:[ -]*[0-9]){12}|3[ -]*[47](?:[ -]*[0-9]){13})[ -]*$/);

/*
//matches - 
//	VisaCard or MasterCard or DiscoverCard
*/
var cardTypeExp = new RegExp(/^VisaCard|MasterCard|DiscoverCard|AmerExpressCard$/);

/*
//matches - 
//	333 or 5555
*/
var cvvExp = new RegExp(/^\d{3,4}$/);

/*
//matches - 
//	01, 02,03,04,05,06,07,08,09,10,11,12
*/
var monExp = new RegExp(/^(0{1}[123456789]{1}|1{1}[012]{1})$/);

/*
//matches - 
//	2xxx
*/
var yrExp = new RegExp(/^2{1}\d{3}$/);

//matches - 2222 Mock St.,  1 A St.,  555-1212
var addrExp = new RegExp(/^[a-zA-Z0-9\s.\-#]+$/);

//matches - aaaa1A, a_-a1A4, aaaAAA111
//Tests if the input consists of 6 or more letters, digits, underscores and hyphens.
//The input must contain at least one upper case letter, one lower case letter and one digit.
var passExp = new RegExp(/^(?=.*[A-Za-z])(?=.*[0-9])(?!.*[^A-Za-z0-9])(?!.*\s).{5,12}$/);

//var usernameExp = new RegExp(/^(?=.*[A-Za-z])(?=.*[0-9])(?!.*[^A-Za-z0-9])(?!.*\s).{5,12}$/);
var usernameExp = /^[a-zA-Z]{1}[a-zA-Z0-9_]{5,11}$/;

//matches - T.F. Johnson, John O'Neil, Mary-Kate Johnson
var nameExp = new RegExp(/^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ]*)?[a-zA-Z]*)*$/);

//matches - John Doe Sr., 100 Elm St., Suite 25, Valerie's Gift Shop
//simple expression for excluding a given list of characters. simply change the contents of [^] to suite your needs. 
var noSpecialExp = new RegExp(/^(\/w|\/W|[^<>+?$%{}&])+$/);

var waitId		=	'#wait';

function submitForm(name) {
	//alert('submitted, now process you fool!');
	var ok = validate(allFields);
	var str = $("form[name=" + name + "]").serialize();
	//alert(ok);
	if(ok) {
		if(name == 'signupForm') {
			var regAt = getQuerystring('site');
			var from = getQuerystring('fr');
			var moreVars = '&site=' + regAt;
			if(from != '') {
				moreVars = moreVars + '&fr=' + from;
			}
			//alert(str + moreVars);
			jQuery.ajax({
				type: "POST",
				url: "getSessionForm.php",
				dataType: "html",
				success: function(response){
					$("div#content").append(response);
				},
				error: function(){
					alert("Error occured while getting session form");
				}
			});
			jQuery.ajax({
				type: "POST",
				url: "registerCon.php",
				dataType: "json",
				data: str + moreVars,
				success: function(data){
					//alert(data);
					var sid = data.session;
					$('#s').val(sid);
					if(data.status==true){
						$(waitId).html('Redirecting...').fadeIn('fast', function(){
								//alert(SITE);
								if(data.user != 1) {
									if(SITE == 'www.greenlawnandhome.com') {
										$('#sessId').attr({'action': 'http://' + SITE});
										$('#sessId').submit();
									} else {
										$('#sessId').submit();
									}
								} else {
									
									if(SITE == 'www.biologicalservices.com') {
										window.location=CORP + 'userSiteSelect.php';
									} else {
										window.location=data.url;
									}
								}
						});
					} else {
						//alert('error');
						$(waitId).html(data.message).removeClass('loading').addClass('loginError').slideDown('fast', function(){ 
							$('#User').focus(); 
						});
					}
				},
				error: function(){
					alert("Error occured while creating your account");
				}
			});
		} else if(name == 'contactForm') {
			jQuery.ajax({
				type: "POST",
				url: "contactCon.php",
				dataType: "json",
				data: str + "&site=" + window.location.hostname,
				success: function(response){
					var succeeded = response.status;
					if(succeeded) {
						$("div.contactForm").remove();
						$('div.width50C')
							.empty()
							.append(response.message);
							resize();
					}
				},
				error: function(){
					alert("Error occured while sending your information request");
				}
			});
		} else if(name == 'checkoutForm') {
			var site = getQuerystring('site');
			var type = $('#transType').html();
			//alert(type);
			//alert(site);
			jQuery.ajax({
				type: "POST",
				url: "processOrder.php",
				dataType: "json",
				data: str + "&site=" + site + "&type=" + type,
				success: function(response){
					//alert(response);
					var succeeded = response.status;
					if(succeeded) {
						window.location = $('form[name="' + name + '"]').attr('action') + '&srit=' + SRIT;
						/*$("div.contactForm").remove();
						$('div.width50C')
							.empty()
							.append(response.message);
							resize();*/
					}
				},
				error: function(jsonObj){
					//alert(jsonObj.toSource());
					alert("An error occured while processing your order.");
					$('#processing').hide();
					$('#placeOrder').show();
				}
			});
		} /*else if(name == 'changePasswordForm') {
			var str = $('#' + name).serialize();
			$.post("updatePersonalInfo.php", str + '&clicked="account"', function(json) {
				var ok = json.status;
				if(ok) {
					$('#passMsg').html(json.message).fadeOut(5000);
					hide_overlay()
				} else {
					$('#passMsg').addClass('error').html(json.message).fadeOut(5000);
				}
			}, "json");	
		}*/
		return true;
	} else {
		return false;
	}
}

function clearErrList() {
	for(var i = 0; i < allFields.length; i++) {
		errList[$(allFields[i]).attr("id")] = 0;
	}
}

function clearErrors() {
	$('label, .label').removeClass('warning');
	$('span.error').remove();
	$('br.extra').remove();
}

function validate(field) {
	//alert("hello");
	var count = field.length;
	if(count > 1) {
		
	}
	for(var i = 0; i < count; i++) {
		var id = $(field[i]).attr("id");
		var value = $(field[i]).val();
		key = id;
		
		/*if($('#state').val() == 'XX' && $('#country').val() == 'US') {
			return verifyInternational('country');
			break;
		}
		else if($('#country').val() != 'US' && $('#state').val() != 'XX') {
			return verifyInternational('state');
			break;
		}*/
		
		if(id != 'address2' && id != 'ship_comp' && id != 'comp' && id != 'state' && id != 'country') {
			//alert('here');
			if (value == '') {
				//alert('empty');
				errList[key]++;
				return invalid(id, true);
				break;
			}
		}
		if( !(htmlExp.test(value)) && !(colorCodeExp.test(value)) && !(jsExp.test(value)) ) {
			if(id == 'User') {
				if(!(/^[a-zA-Z]{1}[a-zA-Z0-9_]{5,11}$/.test(value))) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'Password' || id == 'currentPassword' || id == 'newPassword') {
				if(!(passExp.test(value))) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'Confirm' || id == 'confirmNewPassword') {
				if(id == 'confirmNewPassword') 
					var passFieldId = 'new';
				else
					var passFieldId = '';
				if(value != $('#' + passFieldId + 'Password').val()) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'fName' || id == 'lName' || id == 'city' || id == 'ship_fName' || id == 'ship_lName' || id == 'ship_city') {
				if(!(nameExp.test(value))) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'address1' || id == 'ship_addr' || id == 'addr') {
				if(!addrExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'zip' || id == 'ship_zip') {
				if(!zipExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'phone' || id == 'ship_ph') {
				if(!phExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'email' || id == 'ship_eml') {
				if(!emailExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'cardNum') {
				if(!ccExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'cardType') {
				if(!cardTypeExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'cardCode') {
				if(!cvvExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'expMon') {
				if(!monExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			} else if(id == 'expYr') {
				if(!yrExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
		} else {
			errList[key]++;
			return invalid(id, false);
			break;
		}
	}
	return true;
}

/*function verifyInternational(scenario) {
	var stMsg = 'Please choose \'International\' as your state, or choose \'United States\' as your country.';
	var cntryMsg = 'Please choose your country, or choose an actual state in the \'United States\'.';
	if(scenario == 'state') {
		alert(stMsg);
		return false;
	}
	else if(scenario == 'country') {
		alert(cntryMsg);	
		return false;
	}
}*/

function invalid(element, empty) {
	if(errList[element] > 1) {
		return false;
	} else {
		if(page == 'contact.php' || page == 'register.php') {
			if(element == 'fName' || element == 'city' || element == 'zip' || element == 'lName' || element == 'state' || element == 'country' || element == 'Password' || element == 'Confirm') {
				var label = ($('#' + element).parents('div').prev().prev().children('label'));
			} else if(element == 'currentPassword' || element == 'newPassword' || element == 'confirmNewPassword') {
				var label = $('#' + element).parents('td').prev().children('label[for=' + element + ']')
			} else {
				var label = ($('#' + element).parents('div').prev().children('label'));
			}
			var row = $('#' + element).parents('div.row');
		}
		if(page == 'checkout.php'){
			var label = $('#' + element).parents('td').prev().children('.label');
			var row = $('#warnings');
		}
		
		var errorMessage = '';
		var stateCountry = 'Please choose a ' + label.text();
		
		
		if(empty) {
			errorMessage = label.text() + ' is required. ';
		} else if(element == 'state') {
			errorMessage = stateCountry + ' or if you live outside the United States, choose \'International\'.';
		} else if(element == 'country') {
			errorMessage = stateCountry;
		} else if(element == 'User') {
			if($('#' + element).val().length < 6 || $('#' + element).val().length > 12) {
				errorMessage = 'Usernames must be 6-12 characters long.';
			} else {
				errorMessage = 'Usernames may only contain A-Z,a-z,0-9,_ and must start with a letter.';
			}
		} else if(element == 'Password' || element == 'newPassword') {
			if($('#' + element).val().length < 6) {
				errorMessage = 'Passwords must be 6-13 characters long.';
			} else {
				errorMessage = 'Passwords may only contain A-Z,a-z,0-9 and must contain at least one letter and one digit.';
			}
		} else if(element == 'Confirm'|| element == 'confirmNewPassword') {
			errorMessage = 'Passwords do not match. Please reenter your password.';
		} else {
			errorMessage = label.text() + ' is not valid.';
		}
	
		clearErrors();
		$('#' + element).focus();
		if(page == 'contact.php' || page == 'register.php') {
			if (element == 'lName' || element == 'state' || element == 'country' || element == 'Confirm'){
				var col = 'col2';
				$('<span></span>')
				.addClass('error floatL col1')
				.appendTo(row);
			} else {
				var col = 'col1';
			}
			if(element == 'currentPassword' || element == 'newPassword' || element == 'confirmNewPassword') {
				//alert(errorMessage);
				//if($('#passMsg').is(':visible')
				$('#passMsg').stop().show('fast').html(errorMessage).addClass('warning').fadeOut(5000);
			} else {
				$('<span></span>')
					.addClass('error floatL ' + col)
					.text(errorMessage)
					.appendTo(row);
				$('<br class="extra"><br class="extra"><br class="extra"><br class="extra">').appendTo(row);
			}
		}
		if(page == 'checkout.php') {
			$('<span></span>')
				.addClass('error')
				.text(errorMessage)
				.appendTo(row);
		}
		label.addClass('warning');
		
		$('#' + element).val('');
		return false;
	}
}

$(function() {
	if(page == 'contact.php') {
		var form = $('#contactForm');
		//$('#contactForm :input:visible:enabled:first').focus();
		var phone = $('#phone');
		allFields = $('.field').not('input[name="haveDealer"],input[name^="interested"], #DIDN');
		
		$('#reset').click(function(event) {
			event.preventDefault();
			clearErrors();
			$('.field').empty();
		});
	}
	
	if(page == 'register.php') {
		var form = $('#signupForm');
		//$('#contactForm :input:visible:enabled:first').focus();
		var phone = $('#phone');
		allFields = $('.field').not('input[name^="interested"]');
	}
	
	if(page == 'checkout.php') {
		var form = $('#checkoutForm');
		//$('#contactForm :input:visible:enabled:first').focus();
		var phone = $('#ship_ph');
		allFields = $('.field');
	}
	
	if(page == 'checkout.php' || page == 'contact.php' || page == 'register.php') {
		clearErrList();
		
		phone.blur(function() {
			if(phExp.test(phone.val())) {
				var phoneNum = phone.val().replace(phExp, phReplace);
				phone.val(phoneNum);
			}
		});
	
		allFields.blur(function() {
			var id = $(this).attr("id");
			//alert(id);
			if(page == 'contact.php' || page == 'register.php') {
				if($(this).is('#fName') || $(this).is('#city') || $(this).is('#zip') || $(this).is('#lName') || $(this).is('#state') || $(this).is('#country')) {
					var label = ($(this).parents('div').prev().prev().children('label'));
				} else {
					var label = ($(this).parents('div').prev().children('label'));
				}
			}
			if(page == 'checkout.php') {
				var label = $(this).parents('td').prev().children('.label');
			}
			//if(!id) {
				//var name = $(this).attr('name');
				/*clearErrors();
				errList[name] = 0;
				validateRadio(name);*/
			//} else {
				clearErrors();
				errList[id] = 0;
				validate($(this));
			//}
			resize();
		});
		
		form.submit(function(event) {
			event.preventDefault();
			if(page == 'checkout.php') {
				$('#placeOrder').hide();
				$('#processing').show();
			}
			clearErrList();
			var name = $(this).attr('name');
			var clean = submitForm(name);
			if(clean) {
				/*if(name == 'checkoutForm') {
					window.location = $(this).attr('action');
				} else {*/
				return true;
				//}
			} else {
				if(page == 'checkout.php') {
					$('#processing').hide();
					$('#placeOrder').show();
				}
				return false;
			}
		});
	}
});
