var alreadyLoaded = 0;
var alreadyChanged=0;
var xmlSrcDestPair;
var xmlTopCities;
var xmlTopDestinations ;
if (document.implementation && document.implementation.createDocument)
{	
	var xmlhttp = new window.XMLHttpRequest();
	xmlhttp.open("GET","/BusIntegration/xmls/Routes.xml",false);
	xmlhttp.send(null);
	xmlSrcDestPair = xmlhttp.responseXML.documentElement;
	xmlhttp.open("GET","/BusIntegration/xmls/Top_Cities.xml",false);
	xmlhttp.send(null);
	xmlTopCities = xmlhttp.responseXML.documentElement;
}



/**
 * function to load the CityList.xml <br>
 * sets the alreadyloaded flag to save reloading the XML file every time the
 * source changes
 * 
 * @param cityCode
 * @return
 */


function loadSrcDestXml(cityCode) {

	 if (window.ActiveXObject) {
		xmlSrcDestPair = new ActiveXObject("Microsoft.XMLDOM");
		xmlSrcDestPair.async = "false";
		xmlSrcDestPair.onreadystatechange = verifySrcDestPair;
		xmlSrcDestPair.load('/BusIntegration/xmls/Routes.xml');
	}
	alreadyLoaded = 1;
}

/**
 * function to check whether the source city code is valid or not <br>
 * and whether the XML has already been loaded or not<br>
 * if all is well then it calls loadCityDest function
 * 
 * @param cityNameCode
 * @return
 */

function loadcity(cityNameCode, destDropDownId) {
	var browserName = navigator.appName;
	var commaIndex = cityNameCode.indexOf(",");
	var originalDestCityNameCode=document.getElementById("seldestination").value;
	
	if (commaIndex != -1) {
		var cityCode = cityNameCode.substring(0, commaIndex);
	}

	if (cityNameCode == '0') {
		var cityDefaultList = '<select name=\"arrival\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"4\" id=\"' + destDropDownId + '\">';
		cityDefaultList += '<option value="0">----------------------</option>';
		cityDefaultList += '</select>';

		document.getElementById("displaycitylist").innerHTML = cityDefaultList;
		return true;

	} else {
		if (alreadyLoaded == 0) {
			loadSrcDestXml(cityCode);
		}

		if (browserName == "Microsoft Internet Explorer") {
			loadCityDestIE(originalDestCityNameCode,cityCode, destDropDownId);
		} else
			loadCityDestFireFox(originalDestCityNameCode,cityCode, destDropDownId);
		
		return true;
	}
}

/**
 * function to prepare destination list by reading the SrcDestPair.xml for non-IE browsers
 * 
 * @param cityCode
 *            (source city code)
 * @return
 */

function loadCityDestFireFox(origDest,cityCode, destDropDownId) {

	var srcDestNodes = xmlSrcDestPair.getElementsByTagName("sd");
	var cityNodes = xmlSrcDestPair.getElementsByTagName("c");

	//removedMMTCCcityCode = cityCode.substr(5);
	
	
	for (i = 0; i < srcDestNodes.length; i++) {

	//	var pairsNodes = srcDestNodes;
//		var xmlCode = pairsNodes[1].getAttribute("c");
	xmlCode = srcDestNodes[i].getAttribute("oc");
		if (xmlCode == cityCode) {

			var citylist = '<select name=\"arrival\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"4\" id=\"' + destDropDownId + '\">';

			var nameArr = new Array();
			var codeArr = new Array();
			var rawNameArr = new Array();
			var destins = srcDestNodes[i].getAttribute("d").split(',');
			for (j = 0; j < destins.length; j++) {

					var origId = destins[j];
					if(cityNodes[origId] != null){
					var codeName = cityNodes[origId].getAttribute("cn").split(',');

				var destN = codeName[1];
				var destC = codeName[0];
				nameArr[j] = destN;
				rawNameArr[j] = destN;
				codeArr[j] = destC;
					}

			}

			citylist += generateDestListFireFox(nameArr, codeArr,
					rawNameArr,'2');
			citylist += '</select>';

			break;
		}

	}

	if (citylist == null) {
		var blankList = '<select name=\"arrival\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"4\" id=\"' + destDropDownId + '\">';
		blankList += '<option value="0">----------------------</option>';
		blankList += '</select>';
		document.getElementById("displaycitylist").innerHTML = blankList;

	} else {
		document.getElementById("displaycitylist").innerHTML = citylist;
		if(origDest!="" && origDest!=null && origDest!='0')
		document.getElementById("seldestination").value=origDest;

	}
	
}



/**
 * function to prepare destination list by reading the SrcDestPair.xml for IE
 * @param cityCode
 * @param destDropDownId
 * @return
 */

function loadCityDestIE(origDest,cityCode, destDropDownId) {
	var srcDestNodes = xmlSrcDestPair
			.getElementsByTagName("sd");
	var cityNodes = xmlSrcDestPair.getElementsByTagName("c");

	for (i = 0; i < srcDestNodes.length; i++) {
	
	xmlCode = srcDestNodes[i].getAttribute("oc");
	if (xmlCode == cityCode) {

			var citylist = '<select name=\"arrival\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"4\" id=\"' + destDropDownId + '\">';
			var nameArr = new Array();
			var codeArr = new Array();
			var rawNameArr = new Array();
			var destins = srcDestNodes[i].getAttribute("d").split(',');
			for (j = 0; j < destins.length; j++) {

				var origId = destins[j];
				if(cityNodes[origId] != null){
					var codeName = cityNodes[origId].getAttribute("cn").split(',');

				var destN = codeName[1];
				var destC = codeName[0];
				nameArr[j] = destN;
				rawNameArr[j] = destN;
				codeArr[j] = destC;
				}

			}

			citylist += generateDestList(nameArr, codeArr,
					rawNameArr,'2');
			citylist += '</select>';

			break;
		}

	}
	if (citylist == null) {
		var blankList = '<select name=\"arrival\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"4\" id=\"' + destDropDownId + '\">';
		blankList += '<option value="0">----------------------</option>';
		blankList += '</select>';
		document.getElementById("displaycitylist").innerHTML = blankList;

	} else {
		document.getElementById("displaycitylist").innerHTML = citylist;
		for (i = 0; i < document.getElementById("seldestination").options.length; i++) {
			if (document.getElementById("seldestination").options[i].value == origDest && origDest!='0')
				document.getElementById("seldestination").value = origDest;
		}
	}

}

/**
 * function to verify whether the XML has been loaded or not
 * 
 * @return
 */

function verifySrcDestPair() {
	if (xmlSrcDestPair.readyState != 4) {
		return false;
	}
}

function verifyTopCitiesXML()
{
	if (xmlTopCities.readyState != 4) {
		return false;
	}
}
function verifyTopDestinationXML(){

	if (xmlTopDestinations.readyState != 4) {
		return false;
	}
	
}

/**
 * returns the sorted destination List
 * 
 * @param city_nameArr
 *            (destination names )
 * @param city_codeArr
 *            (destination codes )
 * @param cityNameArrUnsorted
 *            (required in the logic )
 * @return
 */

function generateDestList(nameArr, codeArr, arrOrig ,listFlag) {
	var citylist = "";
	var topDest="";
	var topSource="";
	var topDestN;
	var topSrcN;
	nameArr.sort();
	
	if(xmlTopCities !=null){
		 topDestN =  xmlTopCities.getElementsByTagName("TopDestinations")[0].childNodes;
			}
	if(xmlTopCities !=null){
		 topSrcN = xmlTopCities.getElementsByTagName("TopCities")[0].childNodes;		
	}
	var topDestNo=0;
	var destNo=0;
	for ( var i = 0; i < nameArr.length; i++) {
		var destN = nameArr[i];
				
		var destC = "";
		for ( var j = 0; j < arrOrig.length; j++) {
			if (arrOrig[j] == destN) {
				destC = codeArr[j];
				break;
			}

		}
		
		if (listFlag == '2' && topDestN != null) {
			for (k = 0; k < topDestN.length; k++) {
				var nameXml = topDestN[k].getAttribute("n");
				if (nameXml == destN) {
					topDestNo++;
					topDest += '<option value="' + destC + ','
							+ destN + '">' + nameXml
							+ '</option>';

				}
				if (topDestNo == 10) {
					break;
				}

			}
		}
		
		if(listFlag == '1' && topSrcN != null){
			
			for (n = 0; n < topSrcN.length; n++) {
				var nameXml = topSrcN[n].getAttribute("n");
				if (nameXml == destN) {
					topSource += '<option value="' + destC + ',' + destN + '">'
						+ destN + '</option>';
				}
			}
			
		}
		
		
		if (destN != "" && destN!=null) {
			destNo++;
			citylist += '<option value="' + destC + ','
					+ destN + '">' + destN + '</option>';
		}

	}
	topDest+='<OPTGROUP label=\"more cities\"></OPTGROUP>' + '<option value=\"0\">----------------------</option>';
	topDest+=citylist;
	
	
	if(listFlag=='2' && destNo > 10 && topDestN !=null)
	return topDest;
	else if(listFlag=='2'){
		topSource +=citylist; 
		return topSource;
	}else {
		topSource+='<OPTGROUP label=\"more cities\"></OPTGROUP>' + '<option value=\"0\">----------------------</option>';
		topSource +=citylist; 
		return  topSource;
	}

}


function generateDestListFireFox(nameArr, codeArr, arrOrig ,listFlag) {
	var citylist = "";var topDest="";
	var topSource="";var topDestN;
	var topSrcN;
	nameArr.sort();
	
	if(xmlTopCities !=null){
		 topDestN =  xmlTopCities.getElementsByTagName("TopDestinations")[0].childNodes;
			}
	if(xmlTopCities !=null){
		 topSrcN = xmlTopCities.getElementsByTagName("TopCities")[0].childNodes;		
	}
	var topDestNo=0;
	var destNo=0;
	for ( var i = 0; i < nameArr.length; i++) {
		var destN = nameArr[i];
				
		var destC = "";
		for ( var j = 0; j < arrOrig.length; j++) {
			if (arrOrig[j] == destN) {
				destC = codeArr[j];
				break;
			}

		}
		
		if (listFlag == '2' && topDestN != null) {
			for (k = 1; k < topDestN.length; k+=2) {
				
				var nameXml = topDestN[k].getAttribute("n");
				
				if (nameXml == destN) {
					topDestNo++;
					topDest += '<option value="' + destC + ','
							+ destN + '">' + nameXml
							+ '</option>';

				}
				if (topDestNo == 10) {
					break;
				}

			}
		}
		
		if(listFlag == '1' && topSrcN != null){
			
			for (n = 1; n < topSrcN.length; n+=2) {
				var nameXml = topSrcN[n].getAttribute("n");
				if (nameXml == destN) {
					topSource += '<option value="' + destC + ',' + destN + '">'
						+ destN + '</option>';
				}
			}
			
		}
		
		
		if (destN != "" && destN!=null) {
			destNo++;
			citylist += '<option value="' + destC + ','
					+ destN + '">' + destN + '</option>';
		}

	}
	topDest+='<OPTGROUP label=\"more cities\"></OPTGROUP>' + '<option value=\"0\">----------------------</option>';
	topDest+=citylist;
	
	
	if(listFlag=='2' && destNo > 10 && topDestN !=null && topDestNo > 0)
	return topDest;
	else if(listFlag=='2'){
		topSource +=citylist; 
		return topSource;
	}else {
		topSource+='<OPTGROUP label=\"more cities\"></OPTGROUP>' + '<option value=\"0\">----------------------</option>';
		topSource +=citylist; 
		return  topSource;
	}
	
	

}
/**
 * generates the origin list from the CityList.xml  
 * @return
 */

function generateSourceList(selectedCity) {
	var browserName = navigator.appName;
		
	if (window.ActiveXObject && alreadyChanged!=1) {
		xmlSrcDestPair = new ActiveXObject("Microsoft.XMLDOM");
		xmlTopCities = new ActiveXObject("Microsoft.XMLDOM");
		xmlSrcDestPair.async = "false";
		xmlTopCities.async = "false";
		xmlSrcDestPair.onreadystatechange = verifySrcDestPair;
		xmlTopCities.onreadystatechange = verifyTopCitiesXML;
		xmlSrcDestPair.load('/BusIntegration/xmls/Routes.xml');
		xmlTopCities.load('/BusIntegration/xmls/Top_Cities.xml');
		
	}
	if(alreadyChanged==1){return true;}else{alreadyChanged=1;}
	
	var srcDestNodes = xmlSrcDestPair.getElementsByTagName("sd");
	var cityNodes = xmlSrcDestPair.getElementsByTagName("c");
	  
	var cityList = '<select name=\"departure\" Style=\"width: 130px; font-size: 12px; display: block;\" tabindex=\"3\" id=\"selorigin\" onchange=\"loadcity(this.value,\'seldestination\')\">';
	var name_arr = new Array();
	var code_arr = new Array();
	var arrOrig = new Array();
	
	for (i = 0; i <= srcDestNodes.length - 1; i++) {

	var origId = srcDestNodes[i].getAttribute("o");
	if(cityNodes[origId] !=null){
	var codeName = cityNodes[origId].getAttribute("cn");
	   var codeNameArr = codeName.split(',');
		if (codeName != null && codeName != "") {
			name_arr[i] = codeNameArr[1];
			arrOrig[i] = codeNameArr[1];
			code_arr[i] =   codeNameArr[0];

			}
		}
	}
	if (browserName == "Microsoft Internet Explorer") {
		cityList += generateDestList(name_arr, code_arr, arrOrig,'1');
	} else
		cityList += generateDestListFireFox(name_arr, code_arr, arrOrig,'1');
	document.getElementById("departureCityList").innerHTML = cityList;
	for (var i = 0; i < document.getElementById("selorigin").options.length; i++) {
		if (document.getElementById("selorigin").options[i].value == selectedCity)
			document.getElementById("selorigin").value = selectedCity;
	}
	return true;

}


