/*********************************************************************
File:		flights.js
Type:		Utility javascript.
Author:		Chris McHugh
Version:	1.0

This script provides all functions for flights calculator.
**********************************************************************/

var flight_legs = 2;

function addFlightLeg() {
	flight_legs++;
	var nr = "<div class='calcLabel'>Connection</div>";
	nr += "<div class='calcLayoverField'>";
	nr += "<input type='text' id='airport" + flight_legs + "' class='closeableField' value='' onKeyUp='airportKeyUP(event,this);' onBlur='blurAirport();'/>";
	nr += "<img id='layoverRem-" + flight_legs + "' src='images/button_delete2.gif' height='20' width='20' border='0' onClick=\"removeLayover(this)\"/>";
	nr += "<input type='hidden' id='airportcode" + flight_legs + "' value=''/>";
	nr += "</div>";
	var newrow = document.createElement("DIV");
	newrow.id = "calcAirport" + flight_legs + "Row";
	newrow.className = (flight_legs % 2) ? "layoverCol" : "layoverCol2";
	newrow.innerHTML = nr;
	var guessrow = document.createElement("DIV");
	guessrow.id = "airportGuesser" + flight_legs;
	guessrow.className = "airportGuessDivs";
	document.body.appendChild(guessrow);
	document.getElementById('layoversRow').style.display = "block";
	document.getElementById('layoversRow').appendChild(newrow);
}

function removeLayover(el) {
	var torem = el.id.split("-")[1];
	var remflag = false;
	var im;
	for (var i=3; i < (flight_legs + 1); i++) {
		if (remflag) {
			im = i - 1;
			document.getElementById('calcAirport' + i + 'Row').className = (document.getElementById('calcAirport' + i + 'Row').className == "layoverCol") ? "layoverCol2" : "layoverCol";
			document.getElementById('calcAirport' + i + 'Row').id = "calcAirport" + im + "Row";
			document.getElementById('airport' + i).id = 'airport' + im;
			document.getElementById('layoverRem-' + i).id = 'layoverRem-' + im;
			document.getElementById('airportcode' + i).id = 'airportcode' + im;
		} else {
			if (i == torem) {
				var toremDiv = document.getElementById('calcAirport' + torem + "Row");
				document.getElementById('layoversRow').removeChild(toremDiv);
				remflag = true;
			}
		}
	}
	flight_legs--;
}

var curr_child = -1;
var curr_field = 0;
var guessTO;

function airportKeyDown(e,el) {
	//Quick hack to autoselect on tab.
	if (e.keyCode==9) {
		//If guess has been selected via arrow-down or mouse hover
		var ghRows = getElementsByClassName(document, "div", "guessRowHover");
		if (ghRows.length>0) { 
			acceptGuess(ghRows[0]); 
		}
		else
		{
			//None selected so go with first on list, if any.
			var gRows = getElementsByClassName(document, "div", "guessRow");
			if (gRows.length>0) acceptGuess(gRows[0]);
		}
	}
}

function airportKeyUP(e,el) {
	curr_field = el.id.replace(/\D*/, "");
	//document.getElementById('quantity').value = curr_field; 
	//alert("curr_field: " + curr_field);
	//alert(e.keyCode);
	var gd = document.getElementById('airportGuesser' + curr_field);
	var cf = document.getElementById('airportcode' + curr_field);
	
	// Left = 37
	// Up = 38
	// Right = 39
	// Down = 40

	if (e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 13) {
		e.preventDefault;
		if (gd.style.display == "block" && gd.innerHTML != "") {
			switch (e.keyCode) {
				case (37,39,13):
					if (curr_child >= 0) {
						var code = gd.childNodes[curr_child].id.split("-")[1];
						var txt = gd.childNodes[curr_child].innerHTML;
						el.value = txt;
						cf.value = code;
						killAllDrops();
					}
					break;
				case 38:
					// UP
					if (curr_child > -1) {
						var cn = gd.childNodes[curr_child];
						cn.className = "guessRow";
						curr_child--;
						if (curr_child != -1) {
							var cn = gd.childNodes[curr_child];
							cn.className = "guessRowHover";
						}
					}
					break;
				case 40:
					// Down
					if (curr_child < (gd.childNodes.length - 1)) {
						if (curr_child != -1) {
							var cn = gd.childNodes[curr_child];
							cn.className = "guessRow";
						}
						curr_child++;
						var cn = gd.childNodes[curr_child];
						cn.className = "guessRowHover";
					}					
					break;
			}
		}
	} else {
		if (typeof(guessTO) == "number") window.clearTimeout(guessTO);
		guessTO = window.setTimeout("guessAirport()", 100);
	}
}

function guessAirport() {
	if (curr_field) {
		var guess = document.getElementById('airport' + curr_field).value;
		if (guess != "") {
			var req = "action=guessAirport&text=" + guess;
			//alert(ajax_root + 'carbon_calc.php?'+req);
			enqueueRequest(ajax_root + 'carbon_calc.php',req,"guessAirportResult");
		}
	}
}

var guessDivsPositions = [];

function guessAirportResult() {
	if (http.responseText) {
		var resp = processResult();
		if (resp.status == "success") {
			var guess_block = "";
			if (resp.result) {
				var rlen = (resp.result.length >= 16) ? 15 : resp.result.length;
				for (var i=0; i < rlen; i++) {
					var r = resp.result[i];
					guess_block += "<div id='guessrow-" + r.code + "' class='guessRow' onmouseover=\"this.className='guessRowHover'\" onmouseout=\"this.className='guessRow'\" onClick='acceptGuess(this)'>" + r.city;
					if (r.state != "null" && r.state != "" && r.country == "US") guess_block += ", " + r.state;
					if (r.country != "US") guess_block += ", " + r.country;
					guess_block += " (" + r.code + ")</div>";
				}
				if (!guessDivsPositions[curr_field]) {
					guessDivsPositions[curr_field] = getXYLoc('airport' + curr_field);
				}
				xy = guessDivsPositions[curr_field];
				document.getElementById('airportGuesser' + curr_field).innerHTML = guess_block;
				if (isIE7) {
					xCompensation = -8;
					yCompensation = -15;
				} else {
					xCompensation = 0;
					yCompensation = 0;
				}
				document.getElementById('airportGuesser' + curr_field).style.left = (xy[0] + xCompensation) + "px";
				document.getElementById('airportGuesser' + curr_field).style.top = (xy[1] + 22 + yCompensation) + "px";
				document.getElementById('airportGuesser' + curr_field).style.display = "block";
			} else {
				killAllDrops();
			}
		}
	}
}

function acceptGuess(el) {
	var code = el.id.split("-")[1];
	var txt = el.innerHTML;
	//alert(el.innerHTML);
	document.getElementById('airport' + curr_field).value = txt;
	document.getElementById('airportcode' + curr_field).value = code;
	killAllDrops();
}

function doRTChecks(x) {
	switch (x.id) {
		case "oneWayCheckBox":
			document.getElementById('roundtrip').value = "no";
			document.getElementById('tripCheckMark').style.marginLeft = "2px";
			break;
		case "rndTripCheckBox":
			document.getElementById('roundtrip').value = "yes";
			document.getElementById('tripCheckMark').style.marginLeft = "102px";
			break;
	}
}

function blurAirport() {
	window.setTimeout("killAllDrops()", 200);
}

function killAllDrops() {
	for (var k=1; k < (flight_legs + 1); k++) {
		document.getElementById('airportGuesser' + k).innerHTML = "";
		document.getElementById('airportGuesser' + k).style.display = "none";
	}
	curr_child = -1;
	//curr_field = 0;
}

function calculateFlight() {
	var goes_somewhere = false;
	if (document.getElementById('airportcode1').value != "" && document.getElementById('airportcode2').value != "") {
		if (document.getElementById('airportcode1').value != document.getElementById('airportcode2').value) {
			goes_somewhere = true;
		}
		var layovers = "";
		if (flight_legs >= 3) {
			for (var i = 3; i < (flight_legs + 1); i++) {
				layovers += "&airport[]=" + document.getElementById('airportcode' + i).value;
				if (!goes_somewhere) {
					if (document.getElementById('airportcode' + i).value != document.getElementById('airportcode1').value && document.getElementById('airportcode' + i).value != document.getElementById('airportcode2').value) {
						goes_somewhere = true;
					}
				}
			}
		}
		if (goes_somewhere) {
			var roundtrip = document.getElementById('roundtrip').value;
			var seatclass = document.getElementById('seatclass').value;
			var air1 = document.getElementById('airportcode1').value;
			var air2 = document.getElementById('airportcode2').value;
			var qty = document.getElementById('quantity').value;
			var calc_id = document.getElementById('calculationid').value;
			var req = "action=calculateFlight&airport[]=" + air1 + layovers + "&airport[]=" + air2 + "&quantity=" + qty + "&roundtrip=" + roundtrip + "&seatclass=" + seatclass + "&calc_id=" + calc_id;
			//alert(ajax_root + 'carbon_calc.php?'+req);
			enqueueRequest(ajax_root + 'carbon_calc.php',req,"flightCO2Result");
		} else {
			alert("Please enter a trip that goes somewhere.");
		}
	} else {
		alert("Please enter departing and arriving airports.");
	}
}

function flightCO2Result() {
	if (http.responseText) {
		var resp = processResult();
		if (resp.status == "success") {
			document.getElementById('calcFlightCO2Value').value = resp.result;
			var rt = document.getElementById('roundtrip').value;
			var qty = document.getElementById('quantity').value;
			addFlightResult(resp.newcalcid,resp.journey,rt,qty,resp.result);
			clearFlightsCalc();
			document.getElementById('flightAddAnother').style.display = "block";
			document.getElementById('flightNextStepButton').style.display = "inline";
		}
	}
}

function addFlightResult(fid,journey,rt,qty,co2) {
	var curr_total_co2 = document.getElementById('totalFlightCO2Value').value;
	var nr = document.createElement("DIV");
	var journey = journey.replace(/\-/g, " > ");
	thetotals[curr_totals_row] = co2;
	nr.id = "totalsRow-" + curr_totals_row;
	nr.className = 'totalsRow';
	var newrow = "<div class='flightTotalCol_Trip'>" + journey + "</div>";
	newrow += "<div class='flightTotalCol_RT'>" + rt + "</div>";
	newrow += "<div class='flightTotalCol_Qty'>" + qty + "</div>";
	newrow += "<div class='flightTotalCol_CO2'>" + co2 + "</div>";
	newrow += "<div class='flightTotalCol_Remove'><img src='images/button_delete.gif' height='17' width='17' border='0' onClick=\"removeEmission(this,'flight')\"/></div>";
	newrow += "<div class='clearer'></div><input type='hidden' id='remotedata-" + curr_totals_row + "' value='" + fid + "'/>";
	nr.innerHTML = newrow;
	document.getElementById('flightTotalsRows').appendChild(nr);
	var new_total_co2 = (curr_total_co2 * 1) + (co2 * 1);
	new_total_co2 = new_total_co2.toFixed(3);
	document.getElementById('totalFlightCO2Value').value = new_total_co2;
	addUpTotalCO2();
	setTotalText('flight',new_total_co2);
	curr_totals_row++;
}


function clearFlightsCalc() {
	document.getElementById('airport1').value = "";
	document.getElementById('airportcode1').value = "";
	document.getElementById('airport2').value = "";
	document.getElementById('airportcode2').value = "";
	document.getElementById('quantity').value = "1";
	document.getElementById('seatclass').options[0].selected = true;
	document.getElementById('layoversRow').innerHTML = "";
	flight_legs = 2;
}

function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}