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 - 2222 Mock St.,  1 A St.,  555-1212
var addrExp = new RegExp(/^[a-zA-Z0-9\s.\-#]+$/);

//matches - asD1, asDF1234, ASPgo123
var passExp = new RegExp(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,12}$/);

//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|[^<>+?$%{}&])+$/);

function submitForm() {
	var ok = validate(allFields);
	var str = $("form[name=contactForm]").serialize();
	if(ok) {
		jQuery.ajax({
			type: "POST",
			url: "contactCon.php",
			dataType: "html",
			data: str,
			success: function(response){
				var serverCodes = $('.serverCode');
				var succeeded = true;
				serverCodes.each(function() {
					if($(this).text() == 'false') {
						succeeded = false;
						return false;
					} else {
						succeeded = true;
					}
				});
				if(succeeded) {
					$("div.contactForm").remove();
					$('div.width50C p')
						.empty()
						.append(response);
						resize();
				}
			},
			error: function(){
				alert("Error occured while sending your information");
			}
		});
		return true;
	} else {
		return false;
	}
}

function clearErrList() {
	for(var i = 0; i < allFields.length; i++) {
		errList[$(allFields[i]).attr("id")] = 0;
	}
}

function clearErrors() {
	$('label').removeClass('warning');
	$('span.error').remove();
	$('br.extra').remove();
}

function validate(field) {
	var count = field.length;
	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 != 'cell' && id != 'fax' && id != 'parCompName') {
			if (value == '') {
				errList[key]++;
				return invalid(id, true);
				break;
			}
		}
		if( !(htmlExp.test(value)) && !(colorCodeExp.test(value)) && !(jsExp.test(value)) ) {
			if(id == 'fName' || id == 'lName' || id == 'city') {
				if(!(nameExp.test(value))) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'address1') {
				if(!addrExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'state') {
				if(!stateAbrExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'country') {
				if(!countryAbrExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'zip') {
				if(!zipExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'phone') {
				if(!phExp.test(value)) {
					errList[key]++;
					return invalid(id, false);
					break;
				}
			}
			else if(id == 'email') {
				if(!emailExp.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(element == 'fName' || element == 'city' || element == 'zip' || element == 'lName' || element == 'state' || element == 'country') {
			var label = ($('#' + element).parents('div').prev().prev().children('label'));
		} else {
			var label = ($('#' + element).parents('div').prev().children('label'));
		}
		
		var errorMessage = '';
		var stateCountry = 'Please choose a ' + label.text();
		var $row = $('#' + element).parents('div.row');
		
		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 {
			errorMessage = label.text() + ' is not valid.';
		}
	
		clearErrors();
		$('#' + element).focus();
		if (element == 'lName' || element == 'state' || element == 'country'){
			var col = 'col2';
			$('<span></span>')
			.addClass('error floatL col1')
			.appendTo($row);
		} else {
			var col = 'col1';
		}
		
		$('<span></span>')
			.addClass('error floatL ' + col)
			.text(errorMessage)
			.appendTo($row);
		$('<br class="extra"><br class="extra"><br class="extra">').appendTo($row);
		label.addClass('warning');
		
		$('#' + element).val('');
		return false;
	}
}

$(function() {
	var form = $('#contactForm');
	//$('#contactForm :input:visible:enabled:first').focus();
	var phone = $('#phone');
	allFields = $('.field');
	clearErrList();
	
	phone.blur(function() {
		if(phExp.test(phone.val())) {
			var phoneNum = phone.val().replace(phExp, phReplace);
			phone.val(phoneNum);
		}
	});
	
	$('#reset').click(function(event) {
		event.preventDefault();
		clearErrors();
		$('.field').empty();
	});

	allFields.blur(function() {
		var id = $(this).attr("id");
		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'));
		}
        clearErrors();
		errList[id] = 0;
		validate($(this));
		resize();
    });
	
	form.submit(function(event) {
		//event.preventDefault();
		clearErrList();
		return validate(allFields);
	});					   
});
