// JavaScript Document

//BEGIN FORM VALIDATOR
// Empty String regular expression (to test if a string is empty).
var emptyString = /^\s*$/ ;

function validateField(field,origClass,required,type) {
	// Decide if the optionally shown fields are required or not (depends on whether they are selected or not)
	if(field.id == 'VISCurrentGasPrice' || field.id == 'VISVehicleType') {
		var GasOption = document.getElementById('GASByGasPrice');
		if (GasOption.checked == false) { required = false; }
		else { required = true; }
	}
	
	// Go about validating and requiring
	if (required == true) { // Field is required
		if(emptyString.test(field.value)) { // Field is empty
			updateStyle(field, origClass, false);
			return false;
		} else { // Field is not empty, check if it should be validated. If so, validate it.
			if (emptyString.test(type)) { // Field does not need to be validated
				updateStyle(field, origClass, true);
				return true;
			}
			else { // Field must be validated, return the results of the validation
				return regExValidator(field, origClass, type);
			}
		}
	} else { // Field is NOT required, but may need validated
		if (emptyString.test(type)) { // Field does not need to be validated
			updateStyle(field, origClass, true);
			return true;
		} else { // Field must be validated, return the results of the validation
			if (emptyString.test(field.value)) { // The field is empty, so don't validate it
				updateStyle(field, origClass, true);
				return true;
			} else { // Now there's a value in the field, so return the results of the validation.
				return regExValidator(field, origClass, type);
			}
		}
	}
}
function validateForm(thisForm,submitButton) {
	var errors = 0;
	var errmsg = '';
	
	if (thisForm.id == 'APCPriceParkForm') {
		if(validateField(thisForm.DAYPrice,'ticketPrice',false,'ticketprice') == false){
			errors += 1
			; errmsg=errmsg+'    - Invalid ticket price for the Dayton Airport       \n';
		}
		if(validateField(thisForm.CMHPrice,'ticketPrice',false,'ticketprice') == false){
			errors += 1;
			errmsg=errmsg+'    - Invalid ticket price for the Columbus Airport       \n';
		}
		if(validateField(thisForm.CVGPrice,'ticketPrice',false,'ticketprice') == false){
			errors += 1;
			errmsg=errmsg+'    - Invalid ticket price for the Cincinnati Airport       \n';
		}
		if(validateField(thisForm.INDPrice,'ticketPrice',false,'ticketprice') == false){
			errors += 1;
			errmsg=errmsg+'    - Invalid ticket price for the Indianapolis Airport       \n';
		}
	}
	
	if (thisForm.id == 'APCFinishForm') {
		if(validateField(thisForm.VISCity,           'textBox',true,'')            == false){
			errors += 1;
			errmsg=errmsg+'    - Please enter your city       \n';
		}
		if(validateField(thisForm.VISState,          'textBox',true,'state')       == false){
			errors += 1;
			errmsg=errmsg+'    - Please enter your state       \n';
		}
		if(validateField(thisForm.VISZip,            'textBox',true,'zip')         == false){
			errors += 1;
			errmsg=errmsg+'    - Please enter your zip code       \n';
		}
		if(validateField(thisForm.LeavingOn,         'textBox',true,'date')        == false){
			errors += 1;
			errmsg=errmsg+'    - Please select the date you will be leaving       \n';
		}
		if(validateField(thisForm.ReturningOn,       'textBox',true,'date')        == false){
			errors += 1;
			errmsg=errmsg+'    - Please select the date you will be returning       \n';
		}
		if(validateField(thisForm.VISHourlyWorth,    'textBox',false,'hourlyworth')== false){
			errors += 1;
			errmsg=errmsg+'    - Please enter your estimated hourly worth       \n';
		}
		if(validateField(thisForm.VISCurrentGasPrice,'textBox',true,'gasprice')    == false){
			errors += 1;
			errmsg=errmsg+'    - Please enter the estimated current gas price       \n';
		}
		if(validateField(thisForm.VISVehicleType,    'textBox',false,'dropdown')   == false){
			errors += 1;
			errmsg=errmsg+'    - Please select your vehicle type       \n';
		}
//		if(validateField(thisForm.VISVehicleMPG,     'textBox',true,'MPG')         == false){
//			errors += 1;
//			errmsg=errmsg+'    - Please enter your vehicle\'s estimated miles per gallon (MPG)       \n';
//		}
		if(document.getElementById('GASByMileage').checked == false &&
		   document.getElementById('GASByGasPrice').checked == false                       ){
			errors += 1;
			errmsg=errmsg+'    - Please select a gas calculation method       \n';
		}
	}
	
	if(errors == 0) {
		submitButton.disabled = true;
		return true;
	} else {
		if(errors == 1) {
			errmsg='\nPlease correct the following error:\n\n'+errmsg;
		} else {
			errmsg='\nPlease correct the following errors:\n\n'+errmsg;
		}
		alert(errmsg);
		return false;
	}
}
function regExValidator(field,origClass,type) {
	var regExpr;
	
	// Validate the ticket prices
	if(type == 'ticketprice') {
		regExpr = /^\d{0,4}(\.\d{2})?$/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			updateStyle(field, origClass, false);
			return false;
		}
	}
	
	// Validate the state
	if(type == 'state') {
		regExpr = /^(?:(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY]))$/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			regExpr = /^(?:(a[klrz]|c[aot]|d[ce]|fl|ga|hi|i[adln]|k[sy]|la|m[adeinost]|n[cdehjmvy]|o[hkr]|p[ar]|ri|s[cd]|t[nx]|ut|v[ait]|w[aivy]))$/ ;
			if (regExpr.test(field.value)) { // User entered lowercase state, make it uppercase
				field.value = field.value.toUpperCase();
				return true;
			} else {
				updateStyle(field, origClass, false);
				return false;
			}
		}
	}
	
	// Validate the zip code
	if(type == 'zip') {
		regExpr = /\d{5}/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			updateStyle(field, origClass, false);
			return false;
		}
	}
	
	// Validate the date fields
	if(type == 'date') {
		regExpr = /(mm\/dd\/yyyy)/ ;
		if (regExpr.test(field.value)) { // No date was selected
			updateStyle(field, origClass, false);
			return false;
		} else { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		}
	}
	
	// Validate the Hourly Worth
	if(type == 'hourlyworth') {
		regExpr = /^\d{1,3}(\.\d{2})?$/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			updateStyle(field, origClass, false);
			return false;
		}
	}
	
	// Validate the Gas Price
	if(type == 'gasprice') {
		regExpr = /^\d{0,1}(\.\d{2,3})?$/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			updateStyle(field, origClass, false);
			return false;
		}
	}
	
	// Validate the Vehicle type drop-down
	if(type == 'dropdown') {
		var GasOption = document.getElementById('GASByGasPrice');
		if(field.options[field.selectedIndex].value == "Please Select") { // Field did not validate successfully
			if (GasOption.checked == false) { // If the Gas By Gas Price box isn't checked
				updateStyle(field, origClass, true);
				return true;
			} else { // If the Gas By Gas Price box IS checked
				updateStyle(field, origClass, false);
				return false;
			}
		} else { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		}		
	}
	
	// Validate the MPG
	if(type == 'MPG') {
		regExpr = /^\d{2}$/ ;
		if (regExpr.test(field.value)) { // Field is OK
			updateStyle(field, origClass, true);
			return true;
		} else { // Field did not validate successfully
			updateStyle(field, origClass, false);
			return false;
		}
	}
}
function updateStyle(field,origClass,status) {
	if (status == false) {
		field.className = origClass+'Error';
	} else {
		field.className = origClass;
	}
}
//END FORM VALIDATOR

//BEGIN WATERMARK CODE
function removeWmark(id,def) {
	var nput = document.getElementById(id)
	var text = nput.value;
	if (text == def) {
		nput.style.color = "#000000";
		nput.value = '';
	}
	return true;
}

function addWmark(id,def) {
	var nput = document.getElementById(id)
	var text = nput.value;
	if (text == '') {
		nput.style.color = "#907755";
		nput.value = def;
	}
	return true;
}
//END WATERMARK CODE

//BEGIN DATE DIFFERENCE CODE
function dateDiff(leaveDate,returnDate) {
	//Split the date strings and conver them to dates
	var splDate1 = leaveDate.split('/');
	var LeavingOn = new Date(splDate1[2], (splDate1[0]*1)-1, splDate1[1]); //Month is 0-11 in JavaScript
	var splDate2 = returnDate.split('/');
	var ReturningOn = new Date(splDate2[2], (splDate2[0]*1)-1, splDate2[1]); //Month is 0-11 in JavaScript
	
	//Set 1 day in milliseconds
	var One_Day = 1000 * 60 * 60 * 24;
	
	//Convert the dates to milliseconds
	var LeavingOn_ms = LeavingOn.getTime();
	var ReturningOn_ms = ReturningOn.getTime();
	
	//Calculate difference btw the two dates in milliseconds
	var Difference_ms =	Math.abs(ReturningOn_ms - LeavingOn_ms);

	//Convert to days
	var Difference = (Difference_ms * 1) / One_Day;

	//Error checking
	if (Difference < 1) {
		//DO SOME ERROR CODE AND PUT REF HERE!!!!!!!!
		alert('Please select the correct dates!');
	} else {
		return Difference;
	}
}
//END DATE DIFFERENCE CODE

//BEGIN SHOW/HIDE ADDITIONAL GAS OPTIONS
function ShowHideGasPrice(trigger) {
	var GASByMileage = document.getElementById('GASByMileage');
	var GASByGasPrice = document.getElementById('GASByGasPrice');
	var GasPriceDiv = document.getElementById('GasPriceGasOption');
	var MileageDiv = document.getElementById('MileageGasOption');
	
	if (trigger == 'GASByMileage') {
		if (GASByMileage.checked == true) { // If GASByMileage was UNchecked before the user clicked on it.
			GASByGasPrice.checked = false;
			MileageDiv.style.display = '';
			GasPriceDiv.style.display = 'none';
		}
		else { // If GASByMileage was checked before the user clicked on it.
			GASByGasPrice.checked = true;
			MileageDiv.style.display = 'none';
			GasPriceDiv.style.display = '';
		}
	}
	if (trigger == 'GASByGasPrice') {
		if(GASByGasPrice.checked == true) { // If GASByGasPrice was UNchecked before the user clicked on it.
			GASByMileage.checked = false;
			GasPriceDiv.style.display = '';
			MileageDiv.style.display = 'none';
		}
		else { // If GASByGasPrice was checked before the user clicked on it.
			GASByMileage.checked = true;
			GasPriceDiv.style.display = 'none';
			MileageDiv.style.display = '';
		}
	}
}
//END SHOW/HIDE ADDITIONAL GAS OPTIONS

//BEGIN DISTANCE CALCULATIONS --YUCKY--
function calcDistances() {
	if (document.getElementById('VISCity').value != '' &&
		document.getElementById('VISState').value != '' &&
		document.getElementById('VISZip').value != '') {
//		var VISAddress = document.getElementById('VISAddress').value;
		var VISCity = document.getElementById('VISCity').value;
		var VISState = document.getElementById('VISState').value;
		var VISZip = document.getElementById('VISZip').value;
	
		var DAYAddress = document.getElementById('DAYAddress').value;
		var CMHAddress = document.getElementById('CMHAddress').value;
		var CVGAddress = document.getElementById('CVGAddress').value;
		var INDAddress = document.getElementById('INDAddress').value;
	
		var fullVISAddress = /*VISAddress + ', ' + */VISCity + ', ' + VISState + ' ' + VISZip;
	
		getDAYDistance(fullVISAddress, DAYAddress);
		getCMHDistance(fullVISAddress, CMHAddress);
		getCVGDistance(fullVISAddress, CVGAddress);
		getINDDistance(fullVISAddress, INDAddress);
	}
}

function ERRLookupByZip(start,end,airport) {
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		var VISCity = document.getElementById('VISCity').value;
		var VISState = document.getElementById('VISState').value;
		ERRLookupByCityState(VISCity+', '+VISState, end, airport);
		//document.getElementById('DAYDistance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById(airport+'Distance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}

function ERRLookupByCityState(start,end,airport) {
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		document.getElementById(airport+'Distance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById(airport+'Distance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}

function getDAYDistance(start,end){
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		var VISZip = document.getElementById('VISZip').value;
		ERRLookupByZip(VISZip, end, 'DAY');
		//document.getElementById('DAYDistance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById('DAYDistance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}

function getCMHDistance(start,end){
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		var VISZip = document.getElementById('VISZip').value;
		ERRLookupByZip(VISZip, end, 'CMH');
		//document.getElementById('CMHDistance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById('CMHDistance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}

function getCVGDistance(start,end){
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		var VISZip = document.getElementById('VISZip').value;
		ERRLookupByZip(VISZip, end, 'CVG');
		//document.getElementById('CVGDistance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById('CVGDistance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}

function getINDDistance(start,end){
	var dirn = new GDirections();
	GEvent.addListener(dirn,"error", function() {
		var VISZip = document.getElementById('VISZip').value;
		ERRLookupByZip(VISZip, end, 'IND');
		//document.getElementById('INDDistance').value = "Failed: "+dirn.getStatus().code;
	});
	GEvent.addListener(dirn,"load", function() {
		var distance = dirn.getDistance().html;
		distance = distance.replace('&nbsp;mi','');
		var time = dirn.getDuration().html;
		var splTime = time.split(" ");
		var arrLeng = splTime.length;
		var days = 0;
		var hour = 0;
		var mins = 0;
		for(var i=1; i < arrLeng; i=i+2) {
			var thisnumVar = i - 1;
			if (splTime[i] == 'days' || splTime[i] == 'day') {
				days = (splTime[thisnumVar] * 24) * 60;
			}
			if (splTime[i] == 'hours' || splTime[i] == 'hour') {
				hour = splTime[thisnumVar] * 60;
			}
			if (splTime[i] == 'mins' || splTime[i] == 'min') {
				mins = splTime[thisnumVar];
			}
		}
		time = (days * 1) + (hour * 1) + (mins * 1);
		document.getElementById('INDDistance').value = distance + ',' + time;
	});
	dirn.loadFromWaypoints([start,end],{getSteps:true});
}
//END DISTANCE CALCULATIONS --YUCKY--

//BEGIN AJAX SUBMISSIONS
function createRequestObject() {
	var ro;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer"){
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		ro = new XMLHttpRequest();
	}
	return ro;
}

var http = createRequestObject();

function sndReq(action) {
	if (action == 'APCPriceParkForm') {
		var price = '';
		var park = '';
//		// Dayton price & parking
		price = price + 'DAY-' + document.getElementById('DAYPrice').value + ':';
		if (document.getElementById('DAYPark').checked == true) {
			park = park + 'DAY-Y:';
		}
		else { park = park + 'DAY-N:'; }
		// Columbus price & parking
		price = price + 'CMH-' + document.getElementById('CMHPrice').value + ':';
		if (document.getElementById('CMHPark').checked == true) {
			park = park + 'CMH-Y:';
		}
		else { park = park + 'CMH-N:'; }
		// Cincinnati price & parking
		price = price + 'CVG-' + document.getElementById('CVGPrice').value + ':';
		if (document.getElementById('CVGPark').checked == true) {
			park = park + 'CVG-Y:';
		}
		else { park = park + 'CVG-N:'; }
		// Indianapolis price & parking
		price = price + 'IND-' + document.getElementById('INDPrice').value + ':';
		if (document.getElementById('INDPark').checked == true) {
			park = park + 'IND-Y:';
		}
		else { park = park + 'IND-N:'; }
		http.open('get', 'uploads/calculator/APCHandler.php?action='+action+'&price='+price+'&park='+park);
	}
	if (action == 'APCFinishForm') {
		// Gather the necessary variables (they have already been validated
//		var VISAddress = document.getElementById('VISAddress').value;
		var VISCity = document.getElementById('VISCity').value;
		var VISState = document.getElementById('VISState').value;
		var VISZip = document.getElementById('VISZip').value;
		var LeavingOn = document.getElementById('LeavingOn').value;
		var ReturningOn = document.getElementById('ReturningOn').value;
		var VISDaysGone = dateDiff(LeavingOn, ReturningOn);
		var VISHourlyWorth = document.getElementById('VISHourlyWorth').value;
		if (VISHourlyWorth == '') {
			VISHourlyWorth = 0;
		}
		var GASByGasPrice = '';
		var GASByMileage = '';
		var VISCurrentGasPrice = '';
		var VISVehicleMPG = '';
		var VISVehicleType = document.getElementById('VISVehicleType');
		var SessionID = document.getElementById('SessionID').value;

		var DAYAddress = document.getElementById('DAYAddress').value;
		var CMHAddress = document.getElementById('CMHAddress').value;
		var CVGAddress = document.getElementById('CVGAddress').value;
		var INDAddress = document.getElementById('INDAddress').value;

		if (document.getElementById('GASByGasPrice').checked == true) { // This one is checked
			GASByGasPrice = 'Y';
			GASByMileage = 'N';
			VISCurrentGasPrice = document.getElementById('VISCurrentGasPrice').value;
			VISVehicleMPG = VISVehicleType.options[VISVehicleType.selectedIndex].value;
		}
		if (document.getElementById('GASByMileage').checked == true) { // This one is checked
			GASByGasPrice = 'N';
			GASByMileage = 'Y';
			VISCurrentGasPrice = '0';
			VISVehicleMPG = '0';
		}
		
		// Get the distances
		var DAYDistance = document.getElementById('DAYDistance').value;
		var CMHDistance = document.getElementById('CMHDistance').value;
		var CVGDistance = document.getElementById('CVGDistance').value;
		var INDDistance = document.getElementById('INDDistance').value;
		
		if(DAYDistance == '' || CMHDistance == '' || CVGDistance == '' || INDDistance == ''){
			alert('An error occured while processing your location\ninformation.  Please try again later.\n\nThank You');
			return sndReq('CloseRestart');
		}
		
		http.open('get', 'uploads/calculator/APCHandler.php?action='+action/*+'&VISAddress='+VISAddress*/+'&VISCity='+VISCity+'&VISState='+VISState+'&VISZip='+VISZip+'&VISDaysGone='+VISDaysGone+'&VISHourlyWorth='+VISHourlyWorth+'&GASByGasPrice='+GASByGasPrice+'&GASByMileage='+GASByMileage+'&VISCurrentGasPrice='+VISCurrentGasPrice+'&VISVehicleMPG='+VISVehicleMPG+'&DAYDistance='+DAYDistance+'&CMHDistance='+CMHDistance+'&CVGDistance='+CVGDistance+'&INDDistance='+INDDistance+'&SessionID='+SessionID);
	}
	if (action == 'CloseRestart') {
		http.open('get', 'uploads/calculator/APCHandler.php?action='+action);
	}
	http.onreadystatechange = handleResponse;
	http.send(null);
}

function handleResponse() {
	if(http.readyState == 4){
		var response = http.responseText;
		var update = new Array();

		if(response.indexOf('|' != -1)) {
			update = response.split('|');
			document.getElementById(update[0]).innerHTML = update[1];
			
			// Add thickbox to updated content
			tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
			
			if(update[0] == 'APCResDiv') {
				// Show Greybox w/ results!!!
				// overlayEffect('APCResCont');
				tb_show('', '#TB_inline?height=333&width=672&inlineId=APCResCont&modal=true');
			}
		}
	}
}
//END AJAX SUBMISSIONS

//BEGIN OVERLAY EFFECT
function overlayEffect(div) {
	// Hide the select boxes if they're there
	if(document.getElementById('VISVehicleType')){
		document.getElementById('VISVehicleType').style.visibility = 'hidden';
	}
	
	var arrayPageSize = getPageSize();
	
	var objAPCOverlay = document.getElementById('APCOverlay');
	objAPCOverlay.style.width = arrayPageSize[0]+10;
	objAPCOverlay.style.height = arrayPageSize[1];
	objAPCOverlay.style.display = '';

	var objAPCResCont = document.getElementById(div);
	objAPCResCont.style.width = arrayPageSize[0]+10;
	objAPCResCont.style.height = arrayPageSize[1];
	objAPCResCont.style.display = '';
}

function endResults(div,next) {
	var objAPCOverlay = document.getElementById('APCOverlay');
	var objAPCOverlayDiv = document.getElementById(div);
	objAPCOverlay.style.display = 'none';
	objAPCOverlayDiv.style.display = 'none';

	// Hide the select boxes if they're there
	if(document.getElementById('VISVehicleType')){
		document.getElementById('VISVehicleType').style.visibility = '';
	}

	if(next == 'restart') {
		sndReq('CloseRestart');
	}
}

function getPageSize(){
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	
//	console.log(self.innerWidth);
//	console.log(document.documentElement.clientWidth);

	if (self.innerHeight) {	// all except Explorer
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

//	console.log("xScroll " + xScroll)
//	console.log("windowWidth " + windowWidth)

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}
//	console.log("pageWidth " + pageWidth)

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}
//END OVERLAY EFFECT

//BEGIN CALENDAR CODE
function positionInfo(object) {

  var p_elm = object;

  this.getElementLeft = getElementLeft;
  function getElementLeft() {
    var x = 0;
    var elm;
    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    while (elm != null) {
      x+= elm.offsetLeft;
      elm = elm.offsetParent;
    }
    return parseInt(x);
  }

  this.getElementWidth = getElementWidth;
  function getElementWidth(){
    var elm;
    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    return parseInt(elm.offsetWidth);
  }

  this.getElementRight = getElementRight;
  function getElementRight(){
    return getElementLeft(p_elm) + getElementWidth(p_elm);
  }

  this.getElementTop = getElementTop;
  function getElementTop() {
    var y = 0;
    var elm;
    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    while (elm != null) {
      y+= elm.offsetTop;
      elm = elm.offsetParent;
    }
    return parseInt(y);
  }

  this.getElementHeight = getElementHeight;
  function getElementHeight(){
    var elm;
    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    return parseInt(elm.offsetHeight);
  }

  this.getElementBottom = getElementBottom;
  function getElementBottom(){
    return getElementTop(p_elm) + getElementHeight(p_elm);
  }
}

function CalendarControl() {

  var calendarId = 'CalendarControl';
  var currentYear = 0;
  var currentMonth = 0;
  var currentDay = 0;

  var selectedYear = 0;
  var selectedMonth = 0;
  var selectedDay = 0;

  var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
  var dateField = null;

  function getProperty(p_property){
    var p_elm = calendarId;
    var elm = null;

    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    if (elm != null){
      if(elm.style){
        elm = elm.style;
        if(elm[p_property]){
          return elm[p_property];
        } else {
          return null;
        }
      } else {
        return null;
      }
    }
  }

  function setElementProperty(p_property, p_value, p_elmId){
    var p_elm = p_elmId;
    var elm = null;

    if(typeof(p_elm) == "object"){
      elm = p_elm;
    } else {
      elm = document.getElementById(p_elm);
    }
    if((elm != null) && (elm.style != null)){
      elm = elm.style;
      elm[ p_property ] = p_value;
    }
  }

  function setProperty(p_property, p_value) {
    setElementProperty(p_property, p_value, calendarId);
  }

  function getDaysInMonth(year, month) {
    return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1];
  }

  function getDayOfWeek(year, month, day) {
    var date = new Date(year,month-1,day)
    return date.getDay();
  }

  this.clearDate = clearDate;
  function clearDate() {
    dateField.value = '';
    hide();
  }

  this.setDate = setDate;
  function setDate(year, month, day) {
    if (dateField) {
      if (month < 10) {month = "0" + month;}
      if (day < 10) {day = "0" + day;}

      var dateString = month+"/"+day+"/"+year;
	  dateField.style.color = "#000000";
      dateField.value = dateString;
	  if(dateField.className == 'textBoxError') {
		  dateField.className = 'textBox';
	  }
      hide();
//	  if(dateField.id == 'LeavingOn'){
//		  showCalendarControl(document.getElementById('ReturningOn'));
//	  }
//	  if(dateField.id == 'ReturningOn'){
//		  document.getElementById('VISHourlyWorth').focus();
//	  }
    }
    return;
  }

  this.changeMonth = changeMonth;
  function changeMonth(change) {
    currentMonth += change;
    currentDay = 0;
    if(currentMonth > 12) {
      currentMonth = 1;
      currentYear++;
    } else if(currentMonth < 1) {
      currentMonth = 12;
      currentYear--;
    }

    calendar = document.getElementById(calendarId);
    calendar.innerHTML = calendarDrawTable();
  }

  this.changeYear = changeYear;
  function changeYear(change) {
    currentYear += change;
    currentDay = 0;
    calendar = document.getElementById(calendarId);
    calendar.innerHTML = calendarDrawTable();
  }

  function getCurrentYear() {
    var year = new Date().getYear();
    if(year < 1900) year += 1900;
    return year;
  }

  function getCurrentMonth() {
    return new Date().getMonth() + 1;
  } 

  function getCurrentDay() {
    return new Date().getDate();
  }

  function calendarDrawTable() {

    var dayOfMonth = 1;
    var validDay = 0;
    var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth);
    var daysInMonth = getDaysInMonth(currentYear, currentMonth);
    var css_class = null; //CSS class for each day

    var table = "<table cellspacing='0' cellpadding='0' border='0'>";
    table = table + "<tr class='header'>";
    table = table + "  <td colspan='2' class='previous'><a href='javascript:changeCalendarControlMonth(-1);'>&lt;</a><!-- <a href='javascript:changeCalendarControlYear(-1);'>&laquo;</a>--></td>";
    table = table + "  <td colspan='3' class='title'>" + months[currentMonth-1] + "<br>" + currentYear + "</td>";
    table = table + "  <td colspan='2' class='next'><!--<a href='javascript:changeCalendarControlYear(1);'>&raquo;</a> --><a href='javascript:changeCalendarControlMonth(1);'>&gt;</a></td>";
    table = table + "</tr>";
    table = table + "<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>";

    for(var week=0; week < 6; week++) {
      table = table + "<tr>";
      for(var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++) {
        if(week == 0 && startDayOfWeek == dayOfWeek) {
          validDay = 1;
        } else if (validDay == 1 && dayOfMonth > daysInMonth) {
          validDay = 0;
        }

        if(validDay) {
          if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) {
            css_class = 'current';
          } else if (dayOfWeek == 0 || dayOfWeek == 6) {
            css_class = 'weekend';
          } else {
            css_class = 'weekday';
          }
		  
		  var todaysDateIs = new Date();
		  var currentYearIs = todaysDateIs.getFullYear();
		  var currentMonthIs = todaysDateIs.getMonth()+1;
		  var currentDayIs = todaysDateIs.getDate();
		  todaysDateIs = new Date(currentYearIs, currentMonthIs, currentDayIs);
		  var currentCalDate = new Date(currentYear, currentMonth, dayOfMonth);
          
          //Set 1 day in milliseconds
          var One_Day_Span = 1000 * 60 * 60 * 24;
          
          //Convert the dates to milliseconds
          var todaysDateIs_ms = todaysDateIs.getTime();
          var currentCalDate_ms = currentCalDate.getTime();
          
		  if(currentCalDate_ms < todaysDateIs_ms) {
			  // Don't display the link
			  table = table + "<td class='previousDate'><a>"+dayOfMonth+"</a></td>";
		  } else {
			  if(dateField.id == 'ReturningOn') {
				  // Get the LeavingOn date, and remove links to previous days
				  var leaveDate = document.getElementById('LeavingOn');
				  if(leaveDate.value != 'mm/dd/yyyy') {
					  var leaveDateString = new String(leaveDate.value);
					  var leaveDateArray = leaveDateString.split('/');
					  var leavingDate = new Date(leaveDateArray[2], leaveDateArray[0], leaveDateArray[1]);
					  var leavingDate_ms = leavingDate.getTime();
					  if(currentCalDate_ms < leavingDate_ms) {
						  // Don't display the link if the current day is before the leaving date
						  table = table + "<td class='previousDate'><a>"+dayOfMonth+"</a></td>";
					  } else {
						  // Display the link if the date is after or on the leaving date
						  table = table + "<td><a class='"+css_class+"' href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+");document.getElementById('VISHourlyWorth').focus();\">"+dayOfMonth+"</a></td>";
					  }
				  } else {
					  // Display the link if the leaving date is still 'mm/dd/yyyy'
					  table = table + "<td><a class='"+css_class+"' href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+");showCalendarControl(document.getElementById('LeavingOn'));\">"+dayOfMonth+"</a></td>";
				  }
			  }
			  if(dateField.id == 'LeavingOn') {
				  // Get the ReturningOn date, and remove links to later days
				  var returnDate = document.getElementById('ReturningOn');
				  if(returnDate.value != 'mm/dd/yyyy') {
					  var returnDateString = new String(returnDate.value);
					  var returnDateArray = returnDateString.split('/');
					  var returningDate = new Date(returnDateArray[2], returnDateArray[0], returnDateArray[1]);
					  var returningDate_ms = returningDate.getTime();
					  if(currentCalDate_ms > returningDate_ms) {
						  // Don't display the link if the current day is before the leaving date
						  table = table + "<td class='previousDate'><a>"+dayOfMonth+"</a></td>";
					  } else {
						  // Display the link if the date is after or on the leaving date
						  table = table + "<td><a class='"+css_class+"' href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+");document.getElementById('VISHourlyWorth').focus();\">"+dayOfMonth+"</a></td>";
					  }
				  } else {
					  // Display the link if the leaving date is still 'mm/dd/yyyy'
					  table = table + "<td><a class='"+css_class+"' href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+");showCalendarControl(document.getElementById('ReturningOn'));\">"+dayOfMonth+"</a></td>";
				  }
			  }
		  }
         dayOfMonth++;
        } else {
          table = table + "<td class='empty'>&nbsp;</td>";
        }
      }
      table = table + "</tr>";
    }

    table = table + "<tr class='header'><th colspan='7' style='padding: 3px;' class='CalendarFooter'><!--<a href='javascript:clearCalendarControl();'>Clear</a> | --><a href='javascript:hideCalendarControl();'><b>Close</b></a></td></tr>";
    table = table + "</table>";

    return table;
  }

  this.show = show;
  function show(field) {
    can_hide = 0;
  
    // If the calendar is visible and associated with
    // this field do not do anything.
    if (dateField == field) {
      return;
    } else {
      dateField = field;
    }

    if(dateField) {
      try {
        var dateString = new String(dateField.value);
        var dateParts = dateString.split("/");
        
        selectedMonth = parseInt(dateParts[0],10);
        selectedDay = parseInt(dateParts[1],10);
        selectedYear = parseInt(dateParts[2],10);
      } catch(e) {}
    }

    if (!(selectedYear && selectedMonth && selectedDay)) {
	  if(dateField.id == 'ReturningOn') {
		  var LeavingOn = document.getElementById('LeavingOn');
		  if(LeavingOn.value != 'mm/dd/yyyy') {
			  // Get the date from the LeavingOn date
			  try {
				var dateString = new String(LeavingOn.value);
				var dateParts = dateString.split("/");
				
				selectedMonth = parseInt(dateParts[0],10);
				selectedDay = parseInt(dateParts[1],10);
				selectedYear = parseInt(dateParts[2],10);
			  } catch(e) {}
		  } else {
			  selectedMonth = getCurrentMonth();
			  selectedDay = getCurrentDay();
			  selectedYear = getCurrentYear();
		  }
	  } else {
		  selectedMonth = getCurrentMonth();
		  selectedDay = getCurrentDay();
		  selectedYear = getCurrentYear();
	  }
    }

    currentMonth = selectedMonth;
    currentDay = selectedDay;
    currentYear = selectedYear;

    if(document.getElementById){

      calendar = document.getElementById(calendarId);
      calendar.innerHTML = calendarDrawTable(currentYear, currentMonth, dateField.id);

      setProperty('display', 'block');

      var fieldPos = new positionInfo(dateField);
      var calendarPos = new positionInfo(calendarId);

      var x = fieldPos.getElementLeft();
      var y = fieldPos.getElementBottom();

      setProperty('left', x + "px");
      setProperty('top', y + "px");
 
      if (document.all) {
        setElementProperty('display', 'block', 'CalendarControlIFrame');
        setElementProperty('left', x + "px", 'CalendarControlIFrame');
        setElementProperty('top', y + "px", 'CalendarControlIFrame');
        setElementProperty('width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame');
        setElementProperty('height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame');
      }
    }
  }

  this.hide = hide;
  function hide() {
    if(dateField) {
      setProperty('display', 'none');
      setElementProperty('display', 'none', 'CalendarControlIFrame');
      dateField = null;
    }
  }

  this.visible = visible;
  function visible() {
    return dateField
  }

  this.can_hide = can_hide;
  var can_hide = 0;
}

var calendarControl = new CalendarControl();

function showCalendarControl(textField) {
  // textField.onblur = hideCalendarControl;
  calendarControl.show(textField);
}

function clearCalendarControl() {
  calendarControl.clearDate();
}

function hideCalendarControl() {
  if (calendarControl.visible()) {
    calendarControl.hide();
  }
}

function setCalendarControlDate(year, month, day) {
  calendarControl.setDate(year, month, day);
}

function changeCalendarControlYear(change) {
  calendarControl.changeYear(change);
}

function changeCalendarControlMonth(change) {
  calendarControl.changeMonth(change);
}

document.write("<iframe id='CalendarControlIFrame' src='javascript:false;' frameBorder='0' scrolling='no'></iframe>");
document.write("<div id='CalendarControl'></div>");
//END CALENDAR CODE
