/**
Javascript to handle ajax communication between the admin page and the
airline db.
*/

var dep_par_name = 'Airport departure categories';
var dest_par_name = 'Airport destination categories';
var rule_par_name = 'Rules';
var term_par_name = 'Search terms';

/* Create a new XMLHttpRequest object to talk to the Web server */
function makeXmlHttpRequest() {
	var ajaxRequest;
	
	try {					// Opera 8.0+, Firefox, Safari
		ajaxRequest = new XMLHttpRequest();
	} catch (e) {			// Internet Explorer Browsers
		try {
			ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try{
				ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {	// Something went wrong
				alert("Browser not supported");
				return null;
			}
		}
	}
	return ajaxRequest;
}

function search_apt(input_elem_id,output_elem_id) {
	// lookup and return airport code or a list of options?
	var apt_name = document.getElementById(input_elem_id).value;
	if (apt_name.length > 0) {
		var url = "ajax_categories.php?doop=srch_apt&apt_name=" + escape(apt_name);
		var xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_apt_data(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function update_apt_data(xmlHttp, apt_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		// Exact match or list of options?
		if ((apt_elem_id.length > 0) && (response.length > 0)) {
			document.getElementById(apt_elem_id).value = response;
		}
	}
}

function clear_listbox(elem_id) {
	var lb = document.getElementById(elem_id);
	
	for(i=lb.length; i>=0; i--) {
		lb.remove(i);
	}
}
   
function add_cat(par_cat_name,output_elem_id,elem_id) {
	var cat_name = document.getElementById(elem_id).value;
	if (cat_name.length > 0) {
		var url = "ajax_categories.php?doop=add_cat&cat_name=" + escape(cat_name) +
			"&par_cat_name=" + escape(par_cat_name);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_cat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function del_cat(par_cat_name,output_elem_id) {
	var cat = document.getElementById(output_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	if (cat_id.length > 0) {
		//clear_listbox(output_elem_id);
		var url = "ajax_categories.php?doop=del_cat&cat_id=" + escape(cat_id) +
			"&par_cat_name=" + escape(par_cat_name);
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_cat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function list_cat(par_cat_name,output_elem_id) {
	xmlHttp = makeXmlHttpRequest();
	xmlHttp.open("GET",
		"ajax_categories.php?doop=list_cat&par_cat_name=" + escape(par_cat_name), true);
	xmlHttp.onreadystatechange = function() {
		update_cat_list(xmlHttp, output_elem_id);
	}
	xmlHttp.send(null);
}

function update_cat_list(xmlHttp, cat_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		if (response.length > 0) {
			var cat = document.getElementById(cat_elem_id);
			//alert(response);
			// Empty current listbox contents and then refill it
			clear_listbox(cat_elem_id);
			var ary = response.split("\n");
			while (str = ary.shift()) {
				//alert(str);
				var opt_ary = str.split(",", 2);
				cat.options.add(new Option(opt_ary[1], opt_ary[0]));
			}
		}
	}
}

function add_aptcat(cat_elem_id,output_elem_id,elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var apt_name = document.getElementById(elem_id).value;

	if ((apt_name.length > 0) && (cat_id.length > 0)) {
		var url = "ajax_categories.php?doop=add_aptcat&cat_id=" + escape(cat_id) +
			"&apt_name=" + escape(apt_name);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_aptcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function del_aptcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var apt = document.getElementById(output_elem_id);
	var apt_id = apt.options[apt.selectedIndex].value;
	if ((cat_id.length > 0) && (apt_id > 0)) {
		var url = "ajax_categories.php?doop=del_aptcat&cat_id=" + escape(cat_id) +
			"&apt_id=" + escape(apt_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_aptcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function list_aptcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	if (cat_id.length > 0) {
		var url = "ajax_categories.php?doop=list_aptcat&cat_id=" + escape(cat_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_aptcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function update_aptcat_list(xmlHttp, apt_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		// Empty current listbox contents and then refill it
		clear_listbox(apt_elem_id);
		if (response.length > 0) {
			var aptcat = document.getElementById(apt_elem_id);
			var ary = response.split("\n");
			while (str = ary.shift()) {
				//alert(str);
				var opt_ary = str.split(",", 2);
				aptcat.options.add(new Option(opt_ary[1], opt_ary[0]));
			}
		}
	}
}

function add_rulcat(cat_elem_id,output_elem_id,elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var rul_name = document.getElementById(elem_id).value;

	if ((rul_name.length > 0) && (cat_id.length > 0)) {
		var url = "ajax_categories.php?doop=add_rulcat&cat_id=" + escape(cat_id) +
			"&rul_name=" + escape(rul_name);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_rulcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function del_rulcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var rul = document.getElementById(output_elem_id);
	var rul_id = rul.options[rul.selectedIndex].value;
	if ((cat_id.length > 0) && (rul_id > 0)) {
		var url = "ajax_categories.php?doop=del_rulcat&cat_id=" + escape(cat_id) +
			"&rul_id=" + escape(rul_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_rulcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function list_rulcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	if (cat_id.length > 0) {
		var url = "ajax_categories.php?doop=list_rulcat&cat_id=" + escape(cat_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_rulcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function update_rulcat_list(xmlHttp, rul_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		// Empty current listbox contents and then refill it
		clear_listbox(rul_elem_id);
		if (response.length > 0) {
			var rulcat = document.getElementById(rul_elem_id);
			var ary = response.split("\n");
			while (str = ary.shift()) {
				//alert(str);
				var opt_ary = str.split(",", 2);
				rulcat.options.add(new Option(opt_ary[1], opt_ary[0]));
			}
		}
	}
}

function add_trmcat(cat_elem_id,output_elem_id,elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var trm_name = document.getElementById(elem_id).value;

	if ((trm_name.length > 0) && (cat_id.length > 0)) {
		var url = "ajax_categories.php?doop=add_trmcat&cat_id=" + escape(cat_id) +
			"&trm_name=" + escape(trm_name);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_trmcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function del_trmcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	var trm = document.getElementById(output_elem_id);
	var trm_id = trm.options[trm.selectedIndex].value;
	if ((cat_id.length > 0) && (trm_id > 0)) {
		var url = "ajax_categories.php?doop=del_trmcat&cat_id=" + escape(cat_id) +
			"&trm_id=" + escape(trm_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_trmcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function list_trmcat(cat_elem_id,output_elem_id) {
	var cat = document.getElementById(cat_elem_id);
	var cat_id = cat.options[cat.selectedIndex].value;
	if (cat_id.length > 0) {
		var url = "ajax_categories.php?doop=list_trmcat&cat_id=" + escape(cat_id);
		xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_trmcat_list(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function update_trmcat_list(xmlHttp, trm_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		// Empty current listbox contents and then refill it
		clear_listbox(trm_elem_id);
		if (response.length > 0) {
			var trmcat = document.getElementById(trm_elem_id);
			var ary = response.split("\n");
			while (str = ary.shift()) {
				//alert(str);
				var opt_ary = str.split(",", 2);
				trmcat.options.add(new Option(opt_ary[1], opt_ary[0]));
			}
		}
	}
}

function get_form_values(thisform) {
	var str = "";

	for (i = 0; i < thisform.elements.length; i++) {
		fobj = thisform.elements[i];
		switch (fobj.type) {
			case 'text':
			case 'hidden':
			case 'password':
			case 'textarea':
				str += fobj.name + '=' + escape(fobj.value) + '&';
				break;
			case "checkbox":
			case "radio":
				if (fobj.checked && !fobj.disabled) {
					str += fobj.name + "=" + escape(fobj.value) + "&";
				}
				break;
			case 'select-one':
				if (fobj.selectedIndex >= 0) {
					var fsel = fobj[fobj.selectedIndex];
					var val = (fsel.value.length > 0) ? fsel.value : fsel.text;
					str += fobj.name + '=' + escape(val) + '&';
				}
				break;
		}
	}
	str = str.substr(0,(str.length - 1));
	return str;
}
    
function lookup_flights(thisform,output_elem_id) {
	var str = get_form_values(thisform);
	
	xmlHttp = makeXmlHttpRequest();
	xmlHttp.open("POST", "ajax_flights.php", true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	xmlHttp.setRequestHeader("Content-length", str.length);
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			var response = xmlHttp.responseText;
			document.getElementById(output_elem_id).innerHTML = response;
		}
	}
	xmlHttp.send(str);
}

function update_flights_list(xmlHttp, output_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		document.getElementById(output_elem_id).innerHTML = response;
	}
}

function lookup_airport(input_elem_id,output_elem_id) {
	
	// lookup and return airport code or a list of options?
	airport_elem_id = output_elem_id;

	var airport_name = document.getElementById(input_elem_id).value;
	if (airport_name.length > 0) {
		var url = "ajax_flights.php?search_airport=" + escape(airport_name);
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = update_airport_data;
		xmlHttp.send(null);
	}
}

function update_airport_data() {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		// Exact match or list of options?
		if ((airport_elem_id.length > 0) && (response.length > 0)) {
			document.getElementById(airport_elem_id).value = response;
		}
	}
}

function lookup_hotels(thisform,output_elem_id) {
	var str = get_form_values(thisform);

	xmlHttp = makeXmlHttpRequest();
	xmlHttp.open("POST", "ajax_hotels.php", true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	xmlHttp.setRequestHeader("Content-length", str.length);
	xmlHttp.onreadystatechange = function() {
		update_hotel_data(xmlHttp, output_elem_id);
	}
	xmlHttp.send(str);
}

function find_hotels(apt_id,output_elem_id) {
	if (apt_id.length > 0) {
		var url = "ajax_hotels.php?srch_hotellink=true&apt_id=" + escape(apt_id);
		var xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_hotel_data(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function update_hotel_data(xmlHttp, output_elem_id) {
	if (xmlHttp.readyState == 4) {
		var response = xmlHttp.responseText;
		document.getElementById(output_elem_id).innerHTML = response;
		var xmlHttp = makeXmlHttpRequest();
		xmlHttp.open("GET", url, true);
		xmlHttp.onreadystatechange = function() {
			update_hotel_data(xmlHttp, output_elem_id);
		}
		xmlHttp.send(null);
	}
}

function toggleElemDetail(elem_id) {
	var htl = document.getElementById(elem_id);
	
	// Show or hide?
	if (htl.style.display == "block") {
		htl.style.display = "none";
	} else {
		htl.style.display = "block";
	}
	return false;
}

function toggleHotelDetail(elem_id) {
	var htl = document.getElementById(elem_id);
	
	// Show or hide?
	if (htl.style.display == "block") {
		htl.style.display = "none";
		return false;
	}

	// Need to fetch hotel data?
	if (htl.innerHTML.length > 0) {	// No
		htl.style.display = "block";
		return false;
	}
	
	// Get the hotel details
	var url = "ajax_hotels.php?get_hotel_data=true&htl_id=" + escape(elem_id);
	var xmlHttp = makeXmlHttpRequest();
	xmlHttp.open("GET", url, true);
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			var response = xmlHttp.responseText;
			//alert(response);
			if (response.length > 0) {
				htl.innerHTML = response;
				htl.style.display = "block";
			}
		}
	}
	xmlHttp.send(null);
}

function addToItinerary(item_elem_id) {
	var list = document.getElementById('tabItinerary');
	var item = document.getElementById(item_elem_id);
	var itemkids = item.childNodes;
	var detailkids;
	var strHdr, strDesc, strTariff, dCost, str;
	var itin_elem_id = 'itin' + item_elem_id;
	var itin_elem = document.getElementById(itin_elem_id);

	if (itin_elem) {
		return;	// already exists in itinerary
	}
	
	// If the list is empty then initialise it
	if (list.innerHTML.length <=0) {
		list.innerHTML = '<div class="itin_list" id="itinerary_list"></div>' +
			'<div class="itin_total" id="itinerary_total"></div>';
	}

	// Find the fields of the given item
	for (var i=0; i<itemkids.length; i++) {
		switch (itemkids[i].className) {
			case 'itin_hdr':
				strHdr = itemkids[i].innerHTML;
				break;
			case 'itin_detail':
				detailkids = itemkids[i].childNodes;
				break;
		}
	}
	
	if (detailkids) {
		for (var i=0; i<detailkids.length; i++) {
			switch (detailkids[i].className) {
				case 'itin_description':				
					strDesc = detailkids[i].innerHTML;
					break;
				case 'itin_tariff':
					strTariff = detailkids[i].innerHTML;
					break;
				case 'itin_item_cost':
					//str = str.substr(str.indexOf("£")+1);
					//alert(detailkids[i].innerHTML);
					dCost = Number(detailkids[i].innerHTML);
					dCost = isNaN(dCost) ? 0 : dCost;
					break;
			}
		}
	}
	
		
	// Add item to the itinerary section
	var itemtext = '<a href="javascript:void(0)" onclick="toggleElemDetail(' +
		"'" + itin_elem_id + "'" + ');">' + strHdr + '</a>';

	var str = '<div class="itin_listitem">' + itemtext +
		'<div class="itin_detail" id="itin' + item_elem_id + '">' +
		'<div class="itin_description">' + strDesc + '</div>' +
		'<div class="itin_date">' + '</div>' +
		'<div class="itin_tariff">' + strTariff + '</div>' +
		'<div class="itin_item_cost">' + dCost + '</div>' +
		'</div></div>';
	list.innerHTML = list.innerHTML + str;
	calcItineraryTotal();
	
	var tab = document.getElementById('tabItineraryLabel');
	showTab(tab, 'tabItinerary');
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function calcItineraryTotal() {
	var list = document.getElementById('tabItinerary');
	var total_item = document.getElementById('itinerary_total');
	var itemkids = getElementsByClass('itin_item_cost', list, 'div');
	var total = 0;

	// Run through the items in the itinerary and sum them for total cost
	for (var i=0; i<itemkids.length; i++) {
		//switch (itemkids[i].className) {
		//	case 'itin_tariff':
				total = total + Number(itemkids[i].innerHTML);
		//		break;
		//}
	}
	total_item.innerHTML = 'Total: &pound;' + total;
}

function add_dep_cat() { add_cat(dep_par_name, 'dep_cats', 'dep_cat'); }
function del_dep_cat() { del_cat(dep_par_name, 'dep_cats'); }
function list_dep_cat() { list_cat(dep_par_name, 'dep_cats'); }

function add_dest_cat() { add_cat(dest_par_name, 'dest_cats', 'dest_cat'); }
function del_dest_cat() { del_cat(dest_par_name, 'dest_cats'); }
function list_dest_cat() { list_cat(dest_par_name, 'dest_cats'); }

function add_dep_aptcat() { add_aptcat('dep_cats', 'dep_apts', 'dep_apt'); }
function del_dep_aptcat() { del_aptcat('dep_cats', 'dep_apts'); }
function list_dep_aptcat() { list_aptcat('dep_cats', 'dep_apts'); }

function add_dest_aptcat() { add_aptcat('dest_cats', 'dest_apts', 'dest_apt'); }
function del_dest_aptcat() { del_aptcat('dest_cats', 'dest_apts'); }
function list_dest_aptcat() { list_aptcat('dest_cats', 'dest_apts'); }

function add_rule_cat() { add_cat(rule_par_name, 'rule_cats', 'rule_cat'); }
function del_rule_cat() { del_cat(rule_par_name, 'rule_cats'); }
function list_rule_cat() { list_cat(rule_par_name, 'rule_cats'); }

function add_rule_rulcat() { add_rulcat('rule_cats', 'rules', 'rule_name'); }
function del_rule_rulcat() { del_rulcat('rule_cats', 'rules'); }
function list_rule_rulcat() { list_rulcat('rule_cats', 'rules'); }

function add_term_cat() { add_cat(term_par_name, 'term_cats', 'term_cat'); }
function del_term_cat() { del_cat(term_par_name, 'term_cats'); }
function list_term_cat() { list_cat(term_par_name, 'term_cats'); }

function add_term_trmcat() { add_trmcat('term_cats', 'terms', 'term_name'); }
function del_term_trmcat() { del_trmcat('term_cats', 'terms'); }
function list_term_trmcat() { list_trmcat('term_cats', 'terms'); }

