﻿//<![CDATA[
// JScript File

/*********************************************
Javascript SOAP Library

Copyright 2006 
Mark Plascencia

http://www.geodistance.com
http://www.step5software.com
*********************************************/

var req;
var xmlObj;
 
var totalRoutes = -1; //Total number of routes returned from the Web Service. -1 = uninitialized
var totalPages = -1; //Total number of "pages" (totalRoutes/totalPages) + (totalRoutes%pageDataRange?1:0);
var pageDataRange = 15;	//number of routes to display per page
var pageDisplayRange = 15; //number of pages that are available to click on
var currentPage = 0;	//0 means that the page control has not yet been initialized
var sortField = "";		//"Route Name"
var sortDirection = 1;	//1 = sort ascending -1=sort descending

function fillTable()
{
	if(!req)
	{
		req = createXmlRequestObject2();
	}
	getWS_getNumberOfRoutes();
}

function findPrevious()
{
	if(currentPage > 1)
	{
		currentPage--;
		getWS_getNumberOfRoutes();
	}
}

function findNext()
{
	if(currentPage < totalPages)
	{
		currentPage++;
		getWS_getNumberOfRoutes();
	}
	
}

function findFirst()
{
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function findLast()
{
	currentPage = totalPages;
	getWS_getNumberOfRoutes();
}

function sortByRouteName()
{
	sortField = "RouteName";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function sortByRouteCity()
{
	sortField = "RouteCity";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function sortByRouteState()
{
	sortField = "RouteState";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function sortByRoutePostalCode()
{
	sortField = "RoutePostalCode";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function sortByRouteCountry()
{
	sortField = "RouteCountry";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}

function sortByRouteDistance()
{
	sortField = "RouteDistance";
	currentPage = 1;
	getWS_getNumberOfRoutes();
}





function callWebService(service)
{
	//debugger;
	req = createXmlRequestObject2();
	if(req) {
		req.onreadystatechange = processReqChange;
	}
	//getWS_HelloWorld('myString');
	getWS_RoutePagedData(sortField, 0, pageDataRange)
}

function createXmlRequestObject2()
{
	var reqObj = false;
	// branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
    	try {
			reqObj = new XMLHttpRequest();
        } catch(e) {
			reqObj = false;
        }
    // branch for IE/Windows ActiveX version
    } 
    else if(window.ActiveXObject) 
    {
			try	{
          		reqObj = new ActiveXObject("MSXML2.XMLHttp.5.0");
        	} 
        	catch(e) {
          		reqObj = false;
        	}
        if(!reqObj)
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.XMLHttp.4.0");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.XMLHttp.3.0");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.XMLHttp");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
       	 	try 
       	 	{
          		reqObj = new ActiveXObject("Microsoft.XMLHTTP");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
    }
    
    return reqObj;
}

function createXmlObject()
{
	var reqObj = false;
	// branch for native XMLHttpRequest object
    if(document.implementation && document.implementation.createDocument) 
    {
    	try {
			//reqObj = document.implementation.createDocument("","",null);;
			reqObj = new DOMParser();
        } catch(e) {
			reqObj = false;
        }
    // branch for IE/Windows ActiveX version
    } 
    else if(window.ActiveXObject) 
    {
			try	{
          		reqObj = new ActiveXObject("MSXML2.DOMDocument.6.0");
        	} 
        	catch(e) {
          		reqObj = false;
        	}
        if(!reqObj)
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.DOMDocument.5.0");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.DOMDocument.4.0");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
        	try 
       	 	{
          		reqObj = new ActiveXObject("MSXML2.DOMDocument.3.0");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
        if(!reqObj) 
        {
       	 	try 
       	 	{
          		reqObj = new ActiveXObject("Microsoft.XMLDOM");
        	} 
        	catch(e) 
        	{
          		reqObj = false;
        	}
        }
    }
    return reqObj;
}

function getWS_HelloWorld(param)
{
	if(!req)
	{
		req = createXmlRequestObject2();
	}
	req.abort();
	var SOAPEnvelope = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><HelloWorld xmlns='http://geodistance.com/'><query>myString</query></HelloWorld></soap:Body></soap:Envelope>";
	//req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
	if(window.location.href.search(/http:\/\/geodistance.com/i) > -1)
    {
	    req.open("POST", "http://geodistance.com/geodistance_ws.asmx", true);
    }
    else if(window.location.href.search(/http:\/\/www.geodistance.com/i) > -1)
    {
	    req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
    }
	//req.open("POST", "http://localhost:1644/GeoDistance/geodistance_ws.asmx", true);
	req.setRequestHeader('Content-Type',  "text/xml");
	req.send(SOAPEnvelope);
}

function getWS_DataByRouteID(routeID)
{
	if(!req)
	{
		req = createXmlRequestObject2();
	}
	req.abort();
	var SOAPEnvelope = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><getRouteDataByID xmlns='http://geodistance.com/'><routeID>" + routeID + "</routeID></getRouteDataByID></soap:Body></soap:Envelope>";
	req.onreadystatechange = cb_getDataByRouteID;
	//req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
	if(window.location.href.search(/http:\/\/geodistance.com/i) > -1)
    {
	    req.open("POST", "http://geodistance.com/geodistance_ws.asmx", true);
    }
    else if(window.location.href.search(/http:\/\/www.geodistance.com/i) > -1)
    {
	    req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
    }	
	//req.open("POST", "http://localhost:1644/GeoDistance/geodistance_ws.asmx", true);
	req.setRequestHeader('Content-Type',  "text/xml");
	req.send(SOAPEnvelope);
}

function getWS_RoutePagedData(sortParam, startRecord, endRecord)
{
	if(!req)
	{
		req = createXmlRequestObject2();
	}
	var SOAPEnvelope = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><getPagedData xmlns='http://geodistance.com/'><sortExpression>" + sortParam + "</sortExpression><startRow>" + startRecord + "</startRow><numberOfRows>" + endRecord + "</numberOfRows></getPagedData></soap:Body></soap:Envelope>";
	req.abort();
	req.onreadystatechange = processReqChange;
	//req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
	if(window.location.href.search(/http:\/\/geodistance.com/i) > -1)
    {
	    req.open("POST", "http://geodistance.com/geodistance_ws.asmx", true);
    }
    else if(window.location.href.search(/http:\/\/www.geodistance.com/i) > -1)
    {
	    req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
    }
	//req.open("POST", "http://localhost:1644/GeoDistance/geodistance_ws.asmx", true);
	req.setRequestHeader('Content-Type',  "text/xml");
	//req.setRequestHeader('SOAPAction', 'http://geodistance.com/GetPagedRouteData');
	req.send(SOAPEnvelope);
}

function getWS_getNumberOfRoutes()
{
	if(!req)
	{
		req = createXmlRequestObject2();
	}
	req.abort();
	var SOAPEnvelope = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><getNumberOfRoutes xmlns='http://geodistance.com/' /></soap:Body></soap:Envelope>";
	req.onreadystatechange = cb_getNumberOfRoutes;
	//req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
	if(window.location.href.search(/http:\/\/geodistance.com/i) > -1)
    {
	    req.open("POST", "http://geodistance.com/geodistance_ws.asmx", true);
    }
    else if(window.location.href.search(/http:\/\/www.geodistance.com/i) > -1)
    {
	    req.open("POST", "http://www.geodistance.com/geodistance_ws.asmx", true);
    }
	//req.open("POST", "http://localhost:1644/GeoDistance/geodistance_ws.asmx", true);
	req.setRequestHeader('Content-Type',  "text/xml");
	//req.setRequestHeader('SOAPAction', 'http://geodistance.com/GetPagedRouteData');
	req.send(SOAPEnvelope);
}

function cb_getNumberOfRoutes()
{
	if (req.readyState == 4) {
    // only if "OK"
		if (req.status == 200) {
			totalRoutes = getNumberOfRoutes();
			totalPages = getTotalNumberOfPages(totalRoutes,pageDataRange);
			buildTableFooter();
			getWS_RoutePagedData(sortField,(currentPage*pageDataRange)-pageDataRange,pageDataRange);
			
		} 
		else {
			alert("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function getNumberOfRoutes()
{
			var routeData;
			var numRoutes;
			
			//do IE specific XML processing
			if(window.ActiveXObject)
			{
				req.responseXML.setProperty("SelectionNamespaces", "xmlns:temp='http://geodistance.com/'");
				routeData = req.responseXML.selectNodes("//temp:getNumberOfRoutesResult");
				numRoutes = routeData[0].text;
			}
			
			//do Firefox, Netscape processing
			else if(window.XMLHttpRequest)
			{
				routeData = req.responseXML.getElementsByTagNameNS("http://geodistance.com/", "getNumberOfRoutesResult");
				numRoutes = routeData[0].textContent;
			}
			
			return numRoutes;
}

function getTotalNumberOfPages(nRoutes, pageSize)
{
	var tempTotalPages = 0;
	//calculate the number of pages
	tempTotalPages = ((parseInt(nRoutes,10)) / pageSize);
	tempTotalPages = Math.floor(tempTotalPages);
	if( (parseInt(nRoutes,10) % pageSize) )
	{
		tempTotalPages += 1;
	}
	return tempTotalPages;
}

function buildTableFooter()
{
			var startRow = 0;
			var pStart = 1;
			var pEnd = totalPages;
			
			if(currentPage == 0)
			{
				currentPage = 1;
				firstPage = 1;
				lastPage = firstPage+(totalPages-1);
			}
			
			//create moving range of pages to click on
			if (totalPages > pageDisplayRange)
			{
				var range = Math.floor(pageDisplayRange/2);
				if(currentPage - range >= 1)
				{
					pStart = currentPage-range;
				}
				else
				{
					pStart = 1;
				}
				
				if(pStart + (pageDisplayRange-1) <= totalPages)
				{
					pEnd = pStart + (pageDisplayRange-1);
				}
				else
				{
					pEnd = totalPages;
				}
			}
			
			
			var tdObj = document.getElementById("tableFooter");
			var pages = "<a href='javascript:findFirst()'>First</a>&nbsp;<a href='javascript:findPrevious()'>Previous</a>&nbsp;&nbsp;";
			startRow = (pStart-1)* pageDataRange;
			for(var x=pStart;x<=pEnd;x++)
			{
				if(x == currentPage)
				{
					pages = pages + x + "&nbsp&nbsp"
				}
				else
				{
					//pages = pages + "<a href=\"javascript:getWS_RoutePagedData('Route Name'," + startRow + ", " + pageDataRange + ")\">" + x + "</a>&nbsp";
					pages = pages + "<a href=\"javascript:displayPage('" + sortField + "'," + startRow + "," + pageDataRange + "," + x + ")\">" + x + "</a>&nbsp;&nbsp;";
				}
				//currentPage += 1;
				startRow = (x * pageDataRange);
			}
			
			//currentPage = 1;
			pages = pages + "<a href='javascript:findNext()'>Next</a>&nbsp<a href='javascript:findLast()'>Last</a>";
			
			tdObj.innerHTML = pages;
}

function displayPage(sortParam, startRow, numRecords, pageClicked)
{
	currentPage = pageClicked;
	getWS_RoutePagedData(sortParam, startRow, numRecords);
}

function cb_getDataByRouteID()
{
	if (req.readyState == 4) {
    // only if "OK"
		if (req.status == 200) {
		
			if(req.responseText.match("ERROR!"))
			{
				return;
			}
			xmlObj = createXmlObject();
			if(xmlObj)
			{
				parseRouteData();
			}
		} 
		else {
			alert("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function parseRouteData()
{
	var routeData;
	//IE only
	if(window.ActiveXObject)
	{
		req.responseXML.setProperty("SelectionNamespaces", "xmlns:temp='http://geodistance.com/'");
		routeData = req.responseXML.selectNodes("//temp:getRouteDataByIDResult");
		var t = routeData[0].childNodes[0].text; 
		xmlObj.async = false;
		xmlObj.loadXML(t);
		//xmlObj.setProperty("SelectionNamespaces","xmlns:temp='http://geodistance.com/'");
		var x = xmlObj.getElementsByTagName('point');
		var iZoom = xmlObj.getElementsByTagName('zoomlevel');
		var iMapType = xmlObj.getElementsByTagName('maptype');

		loadRouteData(x,iZoom,iMapType);
	}
	//Mozilla
	else if(window.XMLHttpRequest)
	{
		routeData = req.responseXML.getElementsByTagNameNS("http://geodistance.com/", "getRouteDataByIDResult");
		var t2 = "";
                var ctr = 0;
                for(ctr=0;ctr<routeData[0].childNodes.length;ctr++)
                {

                   t2 = t2 + routeData[0].childNodes[ctr].textContent;
                }
		//xmlObj.load(t2);
		var myXML = (new DOMParser()).parseFromString(t2, "application/xml");
		var x2 = myXML.getElementsByTagName('point');
		var mZoom = myXML.getElementsByTagName('zoomlevel');
		var mMapType = myXML.getElementsByTagName('maptype');
		loadRouteData(x2,mZoom,mMapType);
		var crap = 0; //only used to let the debugger step past the previous instruction
	}
}

function loadRouteData(xmlData,xmlZoom,xmlMapType)
{
	clearTrack();
	for(var x=0; x<xmlData.length; x++)
	{
		addPointToRoute(xmlData[x].attributes[0].value,xmlData[x].attributes[1].value);
	}
	
	if (window.ActiveXObject)
	{
		displayPolylines((!xmlMapType[0]?'Map':xmlMapType[0].text),(!xmlZoom[0]?'16':xmlZoom[0].text));
	}
	else
	{
		displayPolylines((!xmlMapType[0]?'Map':xmlMapType[0].textContent),
						 (!xmlZoom[0]?'16':xmlZoom[0].textContent));
	}
}


function processGetRoutes()
{
	if (req.readyState == 4) {
    // only if "OK"
		if (req.status == 200) {
			getNumberOfRoutes();
		} 
		else {
			alert("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function processReqChange() {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
			processXML();

        } else {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}

function processXML()
{
            // ...processing statements go here...
            //alert(req.responseText);
            
            var routeData;
			
			//do IE specific XML processing
			if(window.ActiveXObject)
			{
				req.responseXML.setProperty("SelectionNamespaces", "xmlns:temp='http://geodistance.com/'");
				routeData = req.responseXML.selectNodes("//temp:geoDataListItem");
				//alert("IE: " + myNodes[0].childNodes[0].text + "," + myNodes[0].childNodes[1].text + "," + myNodes[0].childNodes[2].text);
			}
			
			//do Firefox, Netscape processing
			else if(window.XMLHttpRequest)
			{
				//DOMParser::setDoNamespaces(true);
				routeData = req.responseXML.getElementsByTagNameNS("http://geodistance.com/", "geoDataListItem");
				//alert("FF: " + myNodes[0].childNodes[0].textContent + "," + myNodes[0].childNodes[1].nodeValue + "," + myNodes[0].childNodes[2].nodeValue);
				//alert("FF: " + myNodes.length);
			}
			
			if(routeData)
			{
				buildTableFooter();
				loadFindRouteTable(routeData);
				
			}
			else
			{	
				alert("Error retrieving route data!");
			}
			
}

function loadFindRouteTable(routeData)
{
	var row = 1;
	var col = 1;
	//Get the route data from each ListItem retreived from the server
	for(var x=0; x < pageDataRange; x++)
	{
		var rID = "r"+(x+1); //+"c1";
		
		
		//IE browser
		if(window.ActiveXObject)
		{
		
		  if(x < routeData.length)
		  {
			var t = routeData[x].childNodes[0].text;
			var myRows = document.getElementById('findTable').rows;
			myRows[x+1].onclick = makeRowOnClickHandler(t);
			//myRows[x+1].setAttribut(onclick,"alert('click')");
			document.getElementById(rID+"c1").innerHTML = routeData[x].childNodes[1].text;
			document.getElementById(rID+"c2").innerHTML = routeData[x].childNodes[2].text;
			document.getElementById(rID+"c3").innerHTML = routeData[x].childNodes[4].text;
			document.getElementById(rID+"c4").innerHTML = routeData[x].childNodes[3].text;
			document.getElementById(rID+"c5").innerHTML = routeData[x].childNodes[5].text;
			document.getElementById(rID+"c6").innerHTML = routeData[x].childNodes[6].text;
			document.getElementById(rID+"c7").innerHTML = routeData[x].childNodes[0].text;
		  }
		  else
		  {
			myRows = document.getElementById('findTable').rows;
			myRows[x+1].onclick = "";
			document.getElementById(rID+"c1").innerHTML = " ";
			document.getElementById(rID+"c2").innerHTML = " ";
			document.getElementById(rID+"c3").innerHTML = " ";
			document.getElementById(rID+"c4").innerHTML = " ";
			document.getElementById(rID+"c5").innerHTML = " ";
			document.getElementById(rID+"c6").innerHTML = " ";
			document.getElementById(rID+"c7").innerHTML = " ";
		  }
		}
		//Mozilla
		else if(window.XMLHttpRequest)
		{
		  
		  if(x < routeData.length)
		  {
			var t = routeData[x].childNodes[0].textContent;
			var myRows = document.getElementById('findTable').rows;
			myRows[x+1].onclick = makeRowOnClickHandler(t);
			var rowCells = document.getElementById('findTable').rows[x+1].cells;	
			rowCells[0].innerHTML = routeData[x].childNodes[1].textContent;
			rowCells[1].innerHTML = routeData[x].childNodes[2].textContent;
			rowCells[2].innerHTML = routeData[x].childNodes[4].textContent;
			rowCells[3].innerHTML = routeData[x].childNodes[3].textContent;
			rowCells[4].innerHTML = routeData[x].childNodes[5].textContent;
			rowCells[5].innerHTML = routeData[x].childNodes[6].textContent;
			rowCells[6].innerHTML = routeData[x].childNodes[0].textContent;
		  }
		  else
		  {
			//t = routeData[x].childNodes[0].textContent;
			myRows = document.getElementById('findTable').rows;
			myRows[x+1].onclick = "";
			rowCells = document.getElementById('findTable').rows[x+1].cells;
			rowCells[0].innerHTML = "&nbsp";
			rowCells[1].innerHTML = "&nbsp";
			rowCells[2].innerHTML = "&nbsp";
			rowCells[3].innerHTML = "&nbsp";
			rowCells[4].innerHTML = "&nbsp";
			rowCells[5].innerHTML = "&nbsp";
			rowCells[6].innerHTML = "&nbsp";
		  }
		}	
	}
	
	//addPageIndexes();
}

function addPageIndexes()
{
	getWS_getNumberOfRoutes()
}

function makeRowOnClickHandler(param)
{
	//return function(){alert(param);};
	return function(){
	                  document.getElementById("routeURL").innerHTML="The URL for this route is <b>http://www.geodistance.com/?id=" + param + "</b>";
	                  getWS_DataByRouteID(param);
	                 };
}

function eMouseOver(el)
{
	el.style.backgroundColor='silver';
	el.style.cursor='pointer';
	el.style.textDecoration = 'underline';
}

function eMouseOut(el)
{
	el.style.backgroundColor='white';
	el.style.cursor='default';
	el.style.textDecoration = 'none';
}

function setXmlRequestHandler(handler)
{
	if(req != false)
	{
		req.onreadystate=handler;
	}
}
//]]>
