var ck_zipcode = /^[0-9-\s]{5,11}$/;
var ck_sname = /^[A-Za-z\'\-\s.]{3,50}$/;
var ck_email = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var ck_TEL = /^[0-9]{10,10}$/;
var ck_EXT = /^[0-9]{0,6}$/;

var request = createXMLHTTPObject();
var logger_request = createXMLHTTPObject();

var form_errors = [];
var form_object = undefined;
var form_values = undefined;

function moveOnMax(field,nextFieldID){
  if(field.value.length >= field.maxLength){
    document.getElementById(nextFieldID).focus();
  }
}

function getFormValues(form) {
	var form_values = new Array();
	form_values["SZIP"] = form.moving_from_zip.value;
	form_values["RZIP"] = form.moving_to_zip.value;
	form_values["SNAME"] = form.name.value;
	form_values["EMAIL"] = form.email.value;
	form_values["STELH_AREA"] = trim(form.area_code.value);
	form_values["STELH_FIRST3"] = trim(form.xxx.value);
	form_values["STELH_LAST4"] = trim(form.xxxx.value);
	form_values["STELH"] = form_values["STELH_AREA"] + form_values["STELH_FIRST3"] + form_values["STELH_LAST4"];
	form_values["STELHEXT"] = trim(form.ext.value);
	form_values["STELO_AREA"] = trim(form.area_code_2.value);
	form_values["STELO_FIRST3"] = trim(form.xxx_2.value);
	form_values["STELO_LAST4"] = trim(form.xxxx_2.value);
	form_values["STELO"] = form_values["STELO_AREA"] + form_values["STELO_FIRST3"] + form_values["STELO_LAST4"];
	form_values["DD"] = form.day.value;
	form_values["MM"] = form.month.value;
	form_values["YY"] = form.year.value;
	form_values["ROOMS"] = form.number_of_rooms.value;
	form_values["SID"] = form.sid.value;
	return form_values;
}

function createHttpQuery(array) {
	var query = "";
	for(var parameter in array) {
		if(array[parameter].length > 0) {
			query += "&" + encodeURIComponent(parameter) + "=" + encodeURIComponent(array[parameter]);
		}
	}
	query = query.substr(1);
	return query;
}

function getFormErrors(response) {
	if (!ck_zipcode.test(form_values["SZIP"])) {
	form_errors[form_errors.length] = "Valid pickup zipcode";
	}
	
	if (!ck_zipcode.test(form_values["RZIP"])) {
	form_errors[form_errors.length] = "Valid delivery zipcode";
	}
	
	if (!ck_sname.test(form_values["SNAME"])) {
	form_errors[form_errors.length] = "Valid full name";
	}
	
	if (!ck_email.test(form_values["EMAIL"])) {
	form_errors[form_errors.length] = "Valid e-mail address";
	}
	if (form_values["STELH"].length != 0) {
		var new_STELH=/\d/g;
		var new_STELH_1 = form_values["STELH"].match(new_STELH);
		var new_STELH_2 = new_STELH_1.join('');

		if(new_STELH_2.length == 10){
            if(!response.isValid) {
	            form_errors[form_errors.length] = "Your phone number must be real";
            }
		}else{
			form_errors[form_errors.length] = 'Your phone number must be 10 digits';
		}
	}else{
		form_errors[form_errors.length] = 'Please provide your contact number';
	}
	
	
	if (!form_values["STELHEXT"].length == 0) {
		if (!ck_EXT.test(form_values["STELHEXT"])) {
		form_errors[form_errors.length] = "Valid primary phone extention";
		}
	}

	if (form_values["STELO"].length != 0) {
		var new_STELO=/\d/g;
		var new_STELO_1 = form_values["STELO"].match(new_STELO);
		var new_STELO_2 = new_STELO_1.join('');

		if(new_STELO_2.length == 10){
			if(!response.isValid2) {
				form_errors[form_errors.length] = 'Your additional phone number must be real';
			}
		} else {
			form_errors[form_errors.length] = 'Your additional phone number must be 10 digits';
		}
	}

	//date check
	if( form_values["MM"] == "" || form_values["YY"] == "" || form_values["DD"] == ""){
	    form_errors[form_errors.length] = "Please enter valid date";
	}else if( checkDate( form_values["DD"], form_values["MM"], form_values["YY"] ) === false ){
	    form_errors[form_errors.length] = "That is not a valid date";
	}
	else{
	    var InputDate = new Date();
	    var CurrentDate = new Date();
	
	    InputDate.setDate(form_values["DD"]);
	    InputDate.setMonth(form_values["MM"]-1);
	    InputDate.setFullYear(form_values["YY"]);
	
	    if(InputDate < CurrentDate){
	        form_errors[form_errors.length] = "Date entered has already passed"
	    }
	    else{
	    var SixMonthsAheadDateTime = new Date();
	    SixMonthsAheadDateTime.setDate(SixMonthsAheadDateTime.getDate()+180);
	
	    if(SixMonthsAheadDateTime < InputDate){
	        form_errors[form_errors.length] = "We only accept dates that are within 6 months"
	    }else{
	        //form_errors[form_errors.length] = InputDate;
	    }
		}
	}
	//end of date check
	
	if (form_values["ROOMS"] == "") {
	form_errors[form_errors.length] = "Please select number of rooms";
	}
	
	/*
	if(CMT.length > 140){
	form_errors[form_errors.length] = "Too much data in the comment box! Please remove "+
	    (CMT.length - 140)+ " characters";
	}
	*/
	if (form_errors.length > 0) {
		reportErrors(form_errors);
		form_errors = [];
		return false;
	}
	
	form_object.submit();
}

// Will be executed if submit button is pressed in Lightbox
function validate_form(form){
	form_object = form;
	// Pull relevant values in form to variables
	form_values = getFormValues(form);
    
    var post_string_values = {
        "name" : form_values["SNAME"],
        "email" : form_values["EMAIL"],
        "phone" : form_values["STELH"],
        "phone2" : form_values["STELO"],
        "from_zip" : form_values["SZIP"],
        "to_zip" : form_values["RZIP"],
        "move_date" : form_values["YY"] + "-" + form_values["MM"] + "-" + form_values["DD"],
        "move_size" : form_values["ROOMS"]
    }
    var post_string = createHttpQuery(post_string_values);
    var ajax_url = "http://www.freemovingquote.com/tasks/lead_logger.php";
    logger_request.open("POST", ajax_url, false);
    logger_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    logger_request.send(post_string);
    
	// Make a request to validate phone number
	var post_string_values = {
		"name" : form_values["SNAME"],
		"email" : form_values["EMAIL"],
		"phone_number" : form_values["STELH"],
		"phone_number2" : form_values["STELO"],
		"from_zip" : form_values["SZIP"],
		"to_zip" : form_values["RZIP"],
		"move_date" : form_values["YY"] + "-" + form_values["MM"] + "-" + form_values["DD"],
		"rooms" : form_values["ROOMS"],
		"sid" : form_values["SID"]		
	};
	var post_string = createHttpQuery(post_string_values);
	var ajax_url = "http://www.freemovingquote.com/tasks/p_validator.php";
	request.open("POST",ajax_url,true);
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			getFormErrors(eval("("+request.responseText+")"));
		}
	}
	request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	request.send(post_string);
	// Set an alternative function that will be executed if we don't have
	// phone number results within 2 seconds.
	window.setTimeout("byPassPhoneValidation()", "1000");
	// Return false, so we won't close lightbox just yet
	return false;
}

// Will be executed 2 seconds after HTTP Request is made
function byPassPhoneValidation() {
	// Make sure we already don't have HTTP response
	if(request.readyState == 4) {
		return false;
	}
	request.abort();
	// If we don't, mock a response and continue process
	getFormErrors(new function() {
		this.isValid = true;
		this.isValid2 = true;
		this.isSaved = false;	
	});
}

function fixDate(MM){
if(MM == "January"){MM = 0;}
if(MM == "February"){MM = 1;}
if(MM == "March"){MM = 2;}
if(MM == "April"){MM = 3;}
if(MM == "May"){MM = 4;}
if(MM == "June"){MM = 5;}
if(MM == "July"){MM = 6;}
if(MM == "August"){MM = 7;}
if(MM == "September"){MM = 8;}
if(MM == "October"){MM = 9;}
if(MM == "November"){MM = 10;}
if(MM == "December"){MM = 11;}

return MM;
}

function reportErrors(errors){
 var msg = "Please Enter Valid Data for:\n";
 for (var i = 0; i<errors.length; i++) {
  var numError = i + 1;
  msg += "\n" + numError + ". " + errors[i];
 }
 alert(msg);
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

function checkDate(day,month,year){
	days_in_month = new Date(year, month, 0).getDate();
	
	if(day > 0 && day <= days_in_month){
		return true;
	}else{
		return false;
	}
}

