/* Functions to handle browser incompatibilites */
function isSafari() {
    if (navigator.userAgent.indexOf("Safari") > 0) return true;
    else return false;
}

function isMozilla() {
    if (navigator.product == "Gecko") return true;
    else return false;
}

function eventElement(event) {
    if(isMozilla())
        return event.currentTarget;
    else
        return event.srcElement;
}

function addKeyListener(element, listener) {

//	element.onkeydown = listener;
//	return;

    if (isSafari())
        element.addEventListener("keydown", listener, false);
    else if (isMozilla())
        element.addEventListener("keypress", listener, false);
    else
        element.attachEvent("onkeydown", listener);
}

function addBlurListener(element, listener) {
    if(isSafari() || isMozilla())
        element.addEventListener("blur", listener, false);
    else
        element.attachEvent("onblur", listener);
}

function addListener(element, type, listener) {
	if(element.addEventListener) {
		element.addEventListener(type, listener, false);
	}
	else {
		element.attachEvent('on' + type, listener);
	}
}

function removeListener(element, type, listener) {
	if(element.removeEventListener) {
		element.removeEventListener(type, listener, false);
	}
	else {
		element.detachEvent('on' + type, listener);
	}
}

function flatten(node) {
	if(node.nodeType == 1) 	{
		return '<' + node.nodeName + flattenAttributes(node) + '>' + flattenChildren(node.childNodes) + '</' + node.nodeName + '>';
	}
	else if(node.nodeType == 3) {
		return node.nodeValue;
	}
}

function flattenAttributes(node) {
	var buffer = ''
	for (var i=0; i < node.attributes.length; i++) {
		var attribute = node.attributes[i];
		buffer += ' ' + attribute.name + '="' + attribute.value + '"';
	}
	return buffer;
}

function flattenChildren(nodes) {
	var buffer = '';
	if(nodes.length > 0) {
		for (var i=0; i < nodes.length; i++) {
			buffer += flatten(nodes[i]);
		}
	}
	return buffer;
}

function autocomplete(pref, tp)
{
    var prefix = pref;
	var ac_type = tp;
    var current = 0;
    var matches;
    var inputField;
    var popup;
	var populated = false;
	var old_zip = "";

	switch (ac_type) {
		case 'poi':
			inputField = document.getElementById(prefix + "_name");
			popup = document.getElementById(prefix + "_popup");
			break;
		case 'station':
			inputField = document.getElementById(prefix + "_station_name");
			popup = document.getElementById(prefix + "_station_popup");
			addListener(inputField, 'blur', checkValue);
			break;
		case 'city':
			inputField = document.getElementById(prefix + "_city");
			popup = document.getElementById(prefix + "_city_popup");
			break;
		case 'zip':
			inputField = document.getElementById(prefix + "_zip");
			popup = document.getElementById(prefix + "_zip_popup");
			addListener(inputField, 'focus', getData);
			addListener(inputField, 'blur', zipBlur);
			break;
		case 'airport':
			inputField = document.getElementById(prefix + "_arriving_from");
			popup = document.getElementById(prefix + "_airport_popup");
			break;
	}

	var originalPopupTop = popup.offsetTop;
    var originalPopupLeft = popup.offsetLeft;

	function checkValue() {
		if (0 == popup.firstChild.childNodes.length) {
			if (2 == document.getElementById("edit_metro").value)
				inputField.value = old_metro_name;
			else if (old_metro_name)
				station_cancel(prefix);
		}
	}

    function hidePopup() {
		popup.style.visibility = 'hidden';
    }

    function handlePopupOver() {
		removeListener(inputField, 'blur', hidePopup);
    }
    
    function handlePopupOut() {
		if(popup.style.visibility == 'visible') {
			addListener(inputField, 'blur', hidePopup);
		}
    }

    function handleClick(e) {
		populateFields(current);
        popup.style.visibility = 'hidden';
		if ('station' != ac_type)
	        inputField.focus();
    }

    function handleOver(e) {
		if (-1 < current)
			popup.firstChild.childNodes[current].className = popup.firstChild.childNodes[current].getAttribute('type');
        current = eventElement(e).index;
		popup.firstChild.childNodes[current].className = 'selected_' + popup.firstChild.childNodes[current].getAttribute('type');
    }

	var lastCityUrl = "";

	function getStations() {
        var ajax = new Ajax();
        ajax.doGet(lastCityUrl + "&st",
                function (xml) {
					var mts = xml.getElementsByTagName("location");
					for (i = 0; i < mts.length; i++) {
						var zip = mts[i].getElementsByTagName("zip")[0].childNodes[0].nodeValue;
						var li = document.getElementById(prefix + "zip_" + zip);
						if (li)
							li.innerHTML = zip + " " + mts[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
					}
                }
        );
	}

    function post(xml) {
        matches = xml.getElementsByTagName("location");
        var html = "<ul class=\"" + ac_type + "\">";

//		if ('zip' == ac_type) {
//			if (1 == matches.length) {
//				populateFields_zip(0);
//				return;
//			}
//		}

		for (i = 0; i < matches.length; i++) {
            var mch = matches[i].getElementsByTagName("name")[0].childNodes[0];
			var name = mch.nodeValue;
			var style = "";
			var state = "";
			var zip = "";
			var metro = "";
			var others = "";
			var node_type = "";

			switch (ac_type) {
				case 'poi':
					node_type = matches[i].getElementsByTagName("poi_type")[0].childNodes[0].nodeValue;
					style = " type=\"" + node_type + "\" class=\"" + node_type + "\"";
					poiSelected = false;
					break;
				case 'station':
					node_type = matches[i].getElementsByTagName("type")[0].childNodes[0].nodeValue;
					style = " type=\"" + node_type + "\" class=\"" + node_type + "\" metro=\"" + matches[i].getElementsByTagName("metro_record_id")[0].childNodes[0].nodeValue + "\"";

					state = matches[i].getElementsByTagName("state")[0].childNodes[0].nodeValue;
					metro = " [" + matches[i].getElementsByTagName("metro_name")[0].childNodes[0].nodeValue + "]";

					if (matches[i].getElementsByTagName("zip")[0].childNodes.length > 0)
						zip = matches[i].getElementsByTagName("zip")[0].childNodes[0].nodeValue + " ";

					if (matches[i].getElementsByTagName("others")[0].childNodes.length > 0)
						others = " " + matches[i].getElementsByTagName("others")[0].childNodes[0].nodeValue;

					if ("metro" == node_type)
						name = name + metro + ", " + state + " " + others;
					else
						name = zip + name + others + metro + ", " + state;

					break;
				case 'city':
					style = " type=\"city\" class=\"city\" metro=\"" + matches[i].getElementsByTagName("metro_record_id")[0].childNodes[0].nodeValue + "\"";
					break;
				case 'zip':
					style = " type=\"zip\" class=\"zip\" id=\"" + prefix + "zip_" + name + "\" ";

					//if (matches[i].getElementsByTagName("others")[0].childNodes.length > 0)
					//	others = " " + matches[i].getElementsByTagName("others")[0].childNodes[0].nodeValue;

					//zip = matches[i].getElementsByTagName("zip")[0].childNodes[0].nodeValue + " ";
					
					//name = zip + name + others;
					//tmout = window.setTimeout(getStations, 300);
					break;
				case 'airport':
					style = " type=\"airport\" class=\"airport\" ";
					if (matches[i].getElementsByTagName("country")[0].childNodes.length > 0)
						name += ", " + matches[i].getElementsByTagName("country")[0].childNodes[0].nodeValue;
					break;
			}
            html += "<li" + style + ">" + name + "</li>";
        }
		html += "</ul>";
        popup.innerHTML = html;
		if ('zip' == ac_type)
			getStations();
        current = -1;
        var options = popup.firstChild.childNodes;
        if((options.length > 1) || (options.length == 1 && options[0].innerHTML != inputField.value)) {
            setPopupStyles();
            for (var i = 0; i < options.length; i++) {
                options[i].index = i;
                addOptionHandlers(options[i]);
            }
			if (('station' == ac_type) || (('city' == ac_type) && (options.length == 1))) {
				current = 0;
				options[0].className = 'selected_' + popup.firstChild.childNodes[current].getAttribute('type');
			}
			//options[0].className = 'selected_' + options[0].getAttribute('type');
			popup.style.visibility = 'visible';
        }
        else {
            popup.style.visibility = 'hidden';
        }
    }

    function setPopupStyles() {
        var maxHeight;

        maxHeight = 200;

        if(popup.offsetHeight < maxHeight) {
            popup.style.overflow = 'hidden';
        }
        else if(isMozilla()) {
            popup.style.maxHeight = maxHeight + 'px';
            popup.style.overflow = '-moz-scrollbars-vertical';
        }
        else {
            popup.style.height = maxHeight + 'px';
            popup.style.overflowY = 'auto';
        }

        popup.scrollTop = 0;
        //popup.style.visibility = 'visible';
    }

    function addOptionHandlers(option) {
		addListener(option, "click", handleClick);
		addListener(option, "mouseover", handleOver);
    }

    var ajax = new Ajax();
    var timeout = false;
	var getDataInProgress = false;

    function start(e) {
		if ((ac_type == 'station') && (inputField.value == inputField.title)) {
			inputField.value = "";
			inputField.style.color = "#000";
			inputField.style.fontStyle = "normal";
		}
		//while (getDataInProgress);

        //up arrow
        if(e.keyCode == 38) {
            if(current > 0) {
				popup.firstChild.childNodes[current].className = popup.firstChild.childNodes[current].getAttribute('type');
                current--;
                popup.firstChild.childNodes[current].className = 'selected_' + popup.firstChild.childNodes[current].getAttribute('type');
                popup.firstChild.childNodes[current].scrollIntoView(false);
            }

    		if(isSafari() || isMozilla()) {
    			e.preventDefault();
    		}
    		else {
    			event.returnValue = false;
    		}
        }
        //down arrow
        else if(e.keyCode == 40) {
            if(current < popup.firstChild.childNodes.length - 1) {
				if (-1 < current)
					popup.firstChild.childNodes[current].className = popup.firstChild.childNodes[current].getAttribute('type');
                current++;
                popup.firstChild.childNodes[current].className = 'selected_' + popup.firstChild.childNodes[current].getAttribute('type');
                popup.firstChild.childNodes[current].scrollIntoView(false);
            }

    		if(isSafari() || isMozilla()) {
    			e.preventDefault();
    		}
    		else {
    			event.returnValue = false;
    		}
        }
        //enter or tab
        else if((e.keyCode == 13 || e.keyCode == 9)) {
			if (popup.style.visibility == 'visible') {
				if (-1 < current)
					populateFields(current);
				popup.style.visibility = 'hidden';
				if (ac_type == 'poi')
					inputField.focus();
				if(isSafari() || isMozilla()) {
					e.preventDefault();
				}
				else {
					event.returnValue = false;
				}
			}
        }
        else {
            timeout = window.setTimeout(getData, 300);
        }

    }

    function getData() {
		getDataInProgress = true;
		var objVal = inputField.value;

        if ((objVal.length > 2) || ('zip' == ac_type)) {
			switch (ac_type) {
				case 'poi':
					var metro_code = document.getElementById(prefix + "_metro_code").value;
					ajax.doGet("locName.php?lname=" + objVal + "&metro=" + metro_code, post, "xml");
					poiSelected = false;
					break;
				case 'station':
					var obj = document.getElementById(prefix + "_country_code");
					var country_code = obj.options[obj.selectedIndex].value;
					ajax.doGet("stationName.php?st_name=" + objVal + "&country=" + country_code, post, "xml");
					break;
				case 'city':
					var obj = document.getElementById(prefix + "_country_code");
					var country_code = obj.options[obj.selectedIndex].value;
					var metro_code = document.getElementById(prefix + "_metro_code").value;
//alert ("cityName.php?name=" + objVal + "&country=" + country_code + "&metro=" + metro_code);
					ajax.doGet("cityName.php?name=" + objVal + "&country=" + country_code + "&metro=" + metro_code, post, "xml");
					break;
				case 'zip':
					var obj = document.getElementById(prefix + "_country_code");
					var country_code = obj.options[obj.selectedIndex].value;
					var city = document.getElementById(prefix + "_city_code").value;
					old_zip = objVal;
					lastCityUrl = "cityZips.php?zip=" + objVal + "&city=" + city;
//alert(lastCityUrl);
					if (!isNaN(city) && city)
						ajax.doGet(lastCityUrl, post, "xml");
					break;
				case 'airport':
					ajax.doGet("airportName.php?name=" + objVal, post, "xml");
					break;
			}
        }
        else {
            hidePopup();
			popup.innerHTML = "<ul></ul>";
        }

		window.clearTimeout(timeout);
		getDataInProgress = false;
    }

    function populateFields(i) {
		switch (ac_type) {
			case 'poi':
				populateFields_poi(i);
				break;
			case 'station':
				populateFields_station(i);
				break;
			case 'city':
				populateFields_city(i);
				break;
			case 'zip':
				populateFields_zip(i);
				break;
			case 'airport':
				populateFields_airport(i);
				break;
		}
	}

	function clearLocation() {
		document.getElementById(prefix + "_city").value = "";
		document.getElementById(prefix + "_city_code").value = 0;
		document.getElementById(prefix + "_zip").value = "";
		document.getElementById(prefix + "_state").value = "";
		document.getElementById(prefix + "_directions").value = "";

		document.getElementById(prefix + "_location_type").selectedIndex = 0;
		document.getElementById(prefix + "_dtls_1").style.display = "none";
		document.getElementById(prefix + "_dtls_2").style.display = "none";
		document.getElementById(prefix + '_poi_ext').style.display = "none";
		var items = document.getElementById(prefix + '_airline');
		while (items.length > 1)
			items.remove(items.length - 1);
		check_indoor();
	}

	function getZipMainStation(code) {
		if ("" != code) {
			var ajax = new Ajax();
			ajax.doGet("cityZips.php?zip=" + code,
					function (xml) {
						if (xml.getElementsByTagName("code")[0].hasChildNodes()) {
							var code = xml.getElementsByTagName("code")[0].childNodes[0].nodeValue;
							var name = xml.getElementsByTagName("mainst")[0].childNodes[0].nodeValue;
							var metro = xml.getElementsByTagName("metro")[0].childNodes[0].nodeValue;
							var mname = xml.getElementsByTagName("mname")[0].childNodes[0].nodeValue;
							var state = xml.getElementsByTagName("state")[0].childNodes[0].nodeValue;

							var cityc = document.getElementById(prefix + "_city_code");
							var cityn = document.getElementById(prefix + "_city");
							var stateabbr = document.getElementById(prefix + "_state");

							var metrotxt = document.getElementById(prefix + "_station_name");
							var metrocode = document.getElementById(prefix + "_metro_code");

							if ("pkp" == prefix)
								clear_airport_radio();

							if (metrocode.value == metro) {
								if (!isNaN(cityc.value) && cityc.value && (cityc.value != code)) {
									var ct = document.getElementById(prefix + "_city").value;
									var pos = ct.indexOf(" (");
									if (0 < pos)
										ct = ct.substr(0, pos);
									document.getElementById(prefix + "_city").value = ct + " (" + name + ")";
								}
								else {
									if (poiSelected)
										document.getElementById(prefix + "_name").value = "";
									cityc.value = code;
									cityn.value = name;
									stateabbr.value = state;
								}
							}
							else {
								clearLocation();
								if (poiSelected)
									document.getElementById(prefix + "_name").value = "";
								document.getElementById(prefix + "_street").value = "";
								document.getElementById(prefix + "_station_span").innerHTML = mname;
								document.getElementById(prefix + "_zip").value = xml.getElementsByTagName("zipcode")[0].childNodes[0].nodeValue;
								metrotxt.value = mname;
								metrocode.value = metro
								cityc.value = code;
								cityn.value = name;
								stateabbr.value = state;
							}

							var street = document.getElementById(prefix + "_street");
							if ("" == street.value)
								street.focus();
							else
								document.getElementById(prefix + "_directions").focus();
						}
						else {
							alert("Invalid ZIP Code!");
							document.getElementById(prefix + "_zip").focus();
						}
					}
			);
		}
	}

	function zipOnBlur() {
		if (!populated) {
			var code = inputField.value;
			if (code != old_zip)
				getZipMainStation(code);
		}
		else 
			populated = false;
		hidePopup();
	}

	function zipBlur() {
		timeout = window.setTimeout(zipOnBlur, 300);
	}

	function checkZipCount(code) {
        var ajax = new Ajax();
        ajax.doGet("cityZips.php?city=" + code,
                function (xml) {
					if (xml.getElementsByTagName("code")[0].hasChildNodes()) {
						var code = xml.getElementsByTagName("code")[0].childNodes[0].nodeValue;
						document.getElementById(prefix + "_zip").value = code;
						getZipMainStation(code);
						document.getElementById(prefix + "_directions").focus();
					}
					else
						document.getElementById(prefix + "_zip").focus();
                }
        );
	}

    function populateFields_zip(i) {
		populated = true;
		code = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
		inputField.value = code;
		getZipMainStation(code);
	}

    function populateFields_city(i) {
		clearLocation();
		var code = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
		if (poiSelected)
			document.getElementById(prefix + "_name").value = "";
        inputField.value = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
		document.getElementById(prefix + "_station_code").value = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
		document.getElementById(prefix + "_city_code").value = code;
		document.getElementById(prefix + "_state").value = matches[i].getElementsByTagName("state")[0].childNodes[0].nodeValue;
		//document.getElementById(prefix + "_station_span").innerHTML = matches[i].getElementsByTagName("metro_name")[0].childNodes[0].nodeValue;
		//document.getElementById(prefix + "_metro_code").value = matches[i].getElementsByTagName("metro_record_id")[0].childNodes[0].nodeValue;
		//document.getElementById(prefix + "_zip").value = matches[i].getElementsByTagName("zip")[0].childNodes[0].nodeValue;
		//document.getElementById(prefix + "_zip").focus();
		checkZipCount(code);
	}

    function populateFields_airport(i) {
        inputField.value = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
	}

    function populateFields_station(i) {
		clearLocation();
		document.getElementById(prefix + "_street").value = "";
		document.getElementById(prefix + "_name").value = "";
        inputField.value = matches[i].getElementsByTagName("metro_name")[0].childNodes[0].nodeValue;
		document.getElementById(prefix + "_metro_code").value = matches[i].getElementsByTagName("metro_record_id")[0].childNodes[0].nodeValue;
		document.getElementById(prefix + "_station_span").innerHTML = matches[i].getElementsByTagName("metro_name")[0].childNodes[0].nodeValue;
		if ("airport" == matches[i].getElementsByTagName("type")[0].childNodes[0].nodeValue) {
			var poiId = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
			var lt = document.getElementById(pref + "_location_type");
			lt.selectedIndex = 1;
			loc_type_div_wait(lt, prefix, poiId);
		}
		else if ("zip" == matches[i].getElementsByTagName("type")[0].childNodes[0].nodeValue) {
			document.getElementById(prefix + "_station_code").value = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_zip").value = matches[i].getElementsByTagName("zip")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_state").value = matches[i].getElementsByTagName("state")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_city").value = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_city_code").value = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_street").focus();
		}
		else if ("station" == matches[i].getElementsByTagName("type")[0].childNodes[0].nodeValue) {
			var code = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_station_code").value = matches[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_state").value = matches[i].getElementsByTagName("state")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_city").value = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
			document.getElementById(prefix + "_city_code").value = code;
			//document.getElementById(prefix + "_zip").focus();
			checkZipCount(code);
		}
		else if ("metro" == matches[i].getElementsByTagName("type")[0].childNodes[0].nodeValue)	{
			inputField.blur();
		}

		if (1 == document.getElementById("edit_metro").value)
			station_hide(prefix);
		//country_hide(prefix);
	}

    function populateFields_poi(i) {
        inputField.value = matches[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
        var locId = matches[i].getElementsByTagName("loc_id")[0].childNodes[0].nodeValue;
        var poiType = matches[i].getElementsByTagName("poi_type")[0].childNodes[0].nodeValue;
        var poiId = matches[i].getElementsByTagName("poi_id")[0].childNodes[0].nodeValue;

        var ajax = new Ajax();
        var url = 'locDetails.php?loc_id=' + locId;
        ajax.doGet(url,
                function (xml) {
                    var lt = document.getElementById(prefix + "_location_type");
					lt.selectedIndex = 0;
                    if (poiType == 'airport') {
                        lt.selectedIndex = 1;
						loc_type_div_wait(lt, prefix, poiId);
                    }
                    if (poiType == 'fbo') {
                        lt.selectedIndex = 2;
						fbo_div_wait(lt, prefix, poiId);
                    }
                    else {
                        document.getElementById(pref + "_dtls_1").style.display = "none";
                    }
                    document.getElementById(pref + "_dtls_2").style.display = "none";
                    document.getElementById(pref + '_poi_ext').style.display = "none";
                    var items = document.getElementById(pref + '_airline');
                    while (items.length > 1)
                        items.remove(items.length - 1);
					check_indoor();

                    if (xml.getElementsByTagName("street")[0].hasChildNodes())
                        document.getElementById(prefix + "_street").value = xml.getElementsByTagName("street")[0].childNodes[0].nodeValue;
                    if (xml.getElementsByTagName("city")[0].hasChildNodes())
                        document.getElementById(prefix + "_city").value = xml.getElementsByTagName("city")[0].childNodes[0].nodeValue;
                    if (xml.getElementsByTagName("zip")[0].hasChildNodes()) {
                        document.getElementById(prefix + "_zip").value = xml.getElementsByTagName("zip")[0].childNodes[0].nodeValue;
                        calc_price(true);
						check_times();
                    }
                    if (xml.getElementsByTagName("state")[0].hasChildNodes())
                        document.getElementById(prefix + "_state").value = xml.getElementsByTagName("state")[0].childNodes[0].nodeValue;
                    if (xml.getElementsByTagName("dir")[0].hasChildNodes())
                        document.getElementById(prefix + "_directions").value = xml.getElementsByTagName("dir")[0].childNodes[0].nodeValue;
                    if (xml.getElementsByTagName("code")[0].hasChildNodes())
                        document.getElementById(prefix + "_city_code").value = xml.getElementsByTagName("code")[0].childNodes[0].nodeValue;
					poiSelected = true;
                }
        );
    }

  addKeyListener(inputField, start);
  addListener(popup, 'mouseover', handlePopupOver);
  addListener(popup, 'mouseout', handlePopupOut);
}
