/**
 * Utilities
 * Creates URL's for common web service calls, general functions, handles some JSON processing, 
 * and errors
 * 
 * @version 	v3.0.0  20 October 2009
 * @author 		Rajendra Sarangi for SatNav
 * 
 */

/**
Vertigo Tip by www.vertigo-project.com
Requires jQuery
*/
this.vtip=function(){this.xOffset=-10;this.yOffset=10;$(".vtip").unbind().hover(function(a){this.t=this.title;this.title="";this.top=(a.pageY+yOffset);this.left=(a.pageX+xOffset);$("body").append('<p id="vtip"><img id="vtipArrow" />'+this.t+"</p>");$("p#vtip #vtipArrow").attr("src","images/vtip_arrow.png");$("p#vtip").css("top",this.top+"px").css("left",this.left+"px").fadeIn("slow")},function(){this.title=this.t;$("p#vtip").fadeOut("slow").remove()}).mousemove(function(a){this.top=(a.pageY+yOffset);this.left=(a.pageX+xOffset);$("p#vtip").css("top",this.top+"px").css("left",this.left+"px")})};jQuery(document).ready(function(a){vtip()});


/**
 * Takes a string a URL encodes it
 * @param {string} str
 * return s.replace(/~/g,'%7E').replace(/%20/g,'+');
 */
function urlencode(str) {
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}

/**
 * Decodes a url encoded string
 * @param {string} str
 */
function urldecode(str) {
	str = str.replace('+', ' ');
	str = unescape(str);
	return str;
}

/**
 * PNG Transparcency hack for IE 6. Lots of people are still using IE 6. Nobody is sure why.
 */
if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7) {

      for(var i=0; i<document.images.length; i++)
      {
         var img = document.images[i]
         var imgName = img.src.toUpperCase()
         if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
         {
            var imgID = (img.id) ? "id='" + img.id + "' " : ""
            var imgClass = (img.className) ? "class='" + img.className + "' " : ""
            var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
            var imgStyle = "display:inline-block;" + img.style.cssText 
            if (img.align == "left") imgStyle = "float:left;" + imgStyle
            if (img.align == "right") imgStyle = "float:right;" + imgStyle
            if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
            var strNewHTML = "<span " + imgID + imgClass + imgTitle
            + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
            + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
            + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
            img.outerHTML = strNewHTML
            i = i-1
         }
      }
}

/**
 * Finds a value from the auto suggest box. Used to get master address table ID on address search.
 * @param {Object} li
 */
function findValue(li) {
	if (li == null) 
		return false;
	else {
		if (!!li.extra) 
			var sValue = li.extra[0];
		else 
			var sValue = li.selectValue;
		
		url = wsbase + addressnum +'?format=json&callback=ws_addressnum&jsonp=?&addressnum=' + sValue;
		$.getJSON(url);
	}
}
// Find Start Point from address enetered 
function findValueStartPoint(li) {
	$('#debugmsg').html("");
	if (li == null) 
		return false;
	else {
		if (!!li.extra) 
			{
			var sValue = li.extra[0];
			url = wsbase + addressnum+'?format=json&callback=getStartPoint&jsonp=?&addressnum=' + sValue;
			}
		else 
			{
			 var sValue = li.selectValue;
			 url = wsbase + findaddress+'?format=json&callback=getStartPoint&jsonp=?&address=' + urlencode(sValue);
			}
		$('#start_address').addClass("ac_loading");	
		$.getJSON(url);
		$('#start_address').removeClass("ac_loading");	
	}
}
// Find End Point from address enetered
function findValueEndPoint(li) {
	$('#debugmsg').html("");
	if (li == null) 
		return false;
	else {
		if (!!li.extra) 
			{
			var sValue = li.extra[0];
			url = wsbase + addressnum +'?format=json&callback=getEndPoint&jsonp=?&addressnum=' + sValue;
			}
		else 
			{
			 var sValue = li.selectValue;
			 url = wsbase + findaddress+'?format=json&callback=getEndPoint&jsonp=?&address=' + urlencode(sValue);
			}		
		
		$.getJSON(url);
	}
}

/**
 * Error handler for Google Street View. If no street view is available near a latlong it throws an error.
 * @param {integer} errorCode
 */
function StreetViewError(errorCode) {
  if (errorCode == 603) {
    alert("Error: Flash doesn't appear to be supported by your browser");
    return;
  }
  if (errorCode == 600) {
	$("#streetview").html("Street View Not Available For This Location");
	return;
  }
}  

/**
 * Table pager function. The table pager is a major cludgy hack, but it works.
 * @param {integer} page
 */
function page(page) {
	if (page=="previous") {
		if (pager_index > 1) {
			pager_index = pager_index - 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#page > tbody > tr').show();
			$('#page > tbody > tr:gt(' + max_page + ')').hide();
			$('#page > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
	else if (page=="next") {
		if (pager_index < pager_max) {
			pager_index = pager_index + 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#page > tbody > tr').show();
			$('#page > tbody > tr:gt(' + max_page + ')').hide();
			$('#page > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
}
// Start Point Page Function
function stpage(page) {
	if (page=="previous") {
		if (pager_index > 1) {
			pager_index = pager_index - 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#stpage > tbody > tr').show();
			$('#stpage > tbody > tr:gt(' + max_page + ')').hide();
			$('#stpage > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
	else if (page=="next") {
		if (pager_index < pager_max) {
			pager_index = pager_index + 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#stpage > tbody > tr').show();
			$('#stpage > tbody > tr:gt(' + max_page + ')').hide();
			$('#stpage > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
}
// Go To POI Page Function
function enpage(page) {
	if (page=="previous") {
		if (pager_index > 1) {
			pager_index = pager_index - 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#enpage > tbody > tr').show();
			$('#enpage > tbody > tr:gt(' + max_page + ')').hide();
			$('#enpage > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
	else if (page=="next") {
		if (pager_index < pager_max) {
			pager_index = pager_index + 1;
			max_page = pager_index * 5 - 1;
			min_page = max_page - 4;
			$('#enpage > tbody > tr').show();
			$('#enpage > tbody > tr:gt(' + max_page + ')').hide();
			$('#enpage > tbody > tr:lt(' + min_page + ')').hide();
		}
	}
}

/**
 * This function makes generic tables to display on the page. When I started this, I thought it would replace
 * all of my table generation code, but it turns out I'm doing a lot of crazy crap in those tables (headers on the
 * side, images, form widgets, etc.), that can't be abstracted easily. But it does some of it, which is nice.
 * @param {Object} tbtitle   		Table title (in h5 tag)
 * @param {Object} tbclass			Table css class
 * @param {Object} tbnumcolumns		The number of columns in the table
 * @param {Object} tbcolheaders		The table column headers
 * @param {Object} data 			The json data object
 * @param {Object} tbfields			The fields to grab out of the JSON return
 * @param {Object} tbpopulate		The DIV tag to populate with the resulting table
 */
function tableGenny(tbtitle, tbclass, tbnumcolumns, tbcolheaders,  data, tbfields, tbpopulate) {
	writebuffer = "";
	// Write Title
	if (tbtitle.length > 0) writebuffer ="<h5>" + tbtitle + "</h5>";
	// Start Table
	writebuffer += '<table class="' + tbclass + '"><tbody>';
	// Write table header
	writebuffer += '<tr>';
	for (i = 0; i < tbnumcolumns; i++) {
		writebuffer += '<th>' + tbcolheaders[i] + '</th>';
	}
	writebuffer += '</tr>';
	// Write table records
	if (data.total_rows > 0) {
		$.each(data.rows, function(j, item){
			writebuffer += '<tr>';
			for (i = 0; i < tbnumcolumns; i++) {
				writebuffer += '<td>' + eval(tbfields[i]) + '</td>';		
			}
			writebuffer += '</tr>';
		});
	}
	// End Table
	writebuffer += '</tbody></table>'
	tbpopulate.append(writebuffer);
}


/**
 * Web sevrice handler for point overlay operation
 * @param {float} x
 * @param {float} y
 * @param {integer} srid
 * @param {string} geotable
 * @param {string} fields
 * @param {string} parameters
 * @param {string} format
 * @param {string} jsonp_callback
 */
function pointOverlay (x, y, srid, geotable, fields, parameters, format, jsonp_callback) {
	url = wsbase;
	url += "ws_roi_pointoverlay.php";
	url += "?x=" + x;
	url += "&y=" + y;
	url += "&srid=" + srid;
	url += "&geotable=" + geotable;
	url += "&fields=" + urlencode(fields);
	url += "&parameters=" + urlencode(parameters);
	url += "&format=" + format;
	url += "&callback=" + jsonp_callback;
	
	return url;
}

/**
 * Web service handler for point buffer operation
 * @param {float} x
 * @param {float} y
 * @param {integer} srid
 * @param {string} geotable
 * @param {string} fields
 * @param {string} parameters
 * @param {float} distance
 * @param {string} format
 * @param {string} jsonp_callback
 */
function pointBuffer (x, y, srid, geotable, fields, parameters, distance, format, jsonp_callback) {
	url = wsbase;
	url += "ws_geo_bufferpoint.php";
	url += "?x=" + x;
	url += "&y=" + y;
	url += "&srid=" + srid;
	url += "&geotable=" + geotable;
	url += "&fields=" + urlencode(fields);
	url += "&parameters=" + urlencode(parameters);
	url += "&distance=" + distance;
	url += "&format=" + format;
	url += "&callback=" + jsonp_callback;
	return url;
}

/**
 * Web service handler for feature overlay operation
 * @param {string} from_geotable
 * @param {string} to_geotable
 * @param {string} fields
 * @param {string} parameters
 * @param {string} format
 * @param {string} jsonp_callback
 */
function featureOverlay (from_geotable, to_geotable, fields, parameters, format, jsonp_callback) {
	url = wsbase;
	url += "ws_geo_featureoverlay.php";
	url += "?from_geotable=" + from_geotable;
	url += "&to_geotable=" + to_geotable;
	url += "&fields=" + urlencode(fields);
	url += "&parameters=" + urlencode(parameters);
	url += "&format=" + format;
	url += "&callback=" + jsonp_callback;
	return url;
}

/**
 * Web service handler for feature buffer operation
 * @param {string} from_geotable
 * @param {string} to_geotable
 * @param {string} fields
 * @param {string} parameters
 * @param {float} distance
 * @param {string} format
 * @param {string} jsonp_callback
 */
function featureBuffer (from_geotable, to_geotable, fields, parameters, distance, format, jsonp_callback) {
	url = wsbase;
	url += "ws_geo_bufferfeature.php";
	url += "?from_geotable=" + from_geotable;
	url += "&to_geotable=" + to_geotable;
	url += "&fields=" + urlencode(fields);
	url += "&parameters=" + urlencode(parameters);
	url += "&distance=" + urlencode(distance);
	url += "&format=" + format;
	url += "&callback=" + jsonp_callback;
	return url;
}

/**
 * Create URL to SatGuide Maps for routing
 * @param {string} fromAddress
 * @param {string} toAddress
 */
function getRoute (fromAddress, toAddress) {
	url = "http://maps.google.com/maps?hl=en";
	url += "&saddr=" + urlencode(fromAddress);
	url += "&daddr=" + urlencode(toAddress);
	return url;
}

/**
 * Set the selected address
 * @param {integer} objectid
 * @param {float} x_coordinate
 * @param {float} y_coordinate
 * @param {string} parcel_id1
 * @param {string} parcel_id2
 * @param {string} address
 * @param {string} postal_city
 * @param {float} longitude
 * @param {float} latitude
 */
function setSelected (objectid, x_coordinate, y_coordinate, longitude,latitude,name, locality, city, address ) {
		//set selectedArray
		selectedArray[0] = objectid;
		selectedArray[1] = x_coordinate;
		selectedArray[2] = y_coordinate;
		selectedArray[3] = longitude; 
		selectedArray[4] = latitude; 
		selectedArray[5] = name;// Name
		selectedArray[6] = locality;// Locality
		selectedArray[7] = city; //City
		selectedArray[8] = address; //Address
		//Add marker to the map
		selectedAddressMarker(longitude,latitude);
		//empty the accordion
		// $('.accordion_data').empty();
		$('.accordion_data').show();
		//Clear out no records message.
    //	$('.accordion_msg').html('<center><a href="#" class="small" onclick="map.setCenter(new OpenLayers.LonLat(' + selectedArray[3] + ',' + selectedArray[4] + '), '+fzoom+')">' + selectedArray[8] + '</a><br /></center>');
}

/**
 * Set the attributes for the identified Point of Interest, so you don't have to refetch data if user sets it as selected.
 * @param {integer} objectid
 * @param {float} x_coordinate
 * @param {float} y_coordinate
 * @param {string} Name
 * @param {string} Locality
 * @param {string} Address - House no, Building No, roadname or landmark, sublocality, zipcode
 * @param {string} city
 * @param {float} longitude
 * @param {float} latitude
 */
function setIdentify (objectid, x_coordinate, y_coordinate, longitude,latitude,name, locality, city, address) {
		//set selectedArray
		identifyArray[0] = objectid;
		identifyArray[1] = x_coordinate;
		identifyArray[2] = y_coordinate;
		identifyArray[3] = longitude; // Name
		identifyArray[4] = latitude; // Locality
		identifyArray[5] = name;
		identifyArray[6] = locality;
		identifyArray[7] = city;
		identifyArray[8] = address;
		//Add marker to the map
		identifyMarker(longitude, latitude);
}

/**
 * Set selected facility and zoom to it.
 * @param {Object} long
 * @param {Object} lat
 * @param {Object} label
 */
function setFacility(long, lat, label) {
	facilityArray[0] = long;
	facilityArray[1] = lat;
	facilityArray[2] = label;
	facilityMarker(long, lat);
	map.setCenter(new OpenLayers.LonLat(long, lat), fzoom);
}
function setStartPoint(objectid, x_coordinate, y_coordinate, longitude,latitude,name, locality, city, address)
	{
	//set selected startPointArray
		startPointArray[0] = objectid;
		startPointArray[1] = x_coordinate;
		startPointArray[2] = y_coordinate;
		startPointArray[3] = longitude; // Name
		startPointArray[4] = latitude; // Locality
		startPointArray[5] = name;
		startPointArray[6] = locality;
		startPointArray[7] = city;
		startPointArray[8] = address;
	//Add marker to the map		
	startPointMarker(longitude, latitude);
	//$('#topmenu-tabs ul').tabs("select","#mapdirection");
	//$('#right-tabs ul').tabs("select","#directions");
	setStartPoint_Address(address);
	//$('#right-accordion-routes').accordion('activate',0);
	//var activetab = $('#left-accordion').accordion('option', 'active');
	//alert(activetab);
	// $('#left-accordion').accordion('option', 'active', false);
	$('#left-accordion').accordion('activate', 1);
	}
function setEndPoint(objectid, x_coordinate, y_coordinate, longitude,latitude,name, locality, city, address)
	{
	//set selected endPointArray
		endPointArray[0] = objectid;
		endPointArray[1] = x_coordinate;
		endPointArray[2] = y_coordinate;
		endPointArray[3] = longitude; // Name
		endPointArray[4] = latitude; // Locality
		endPointArray[5] = name;
		endPointArray[6] = locality;
		endPointArray[7] = city;
		endPointArray[8] = address;
		//Add marker to the map	
	   endPointMarker(longitude, latitude);
	 //  $('#topmenu-tabs ul').tabs("select","#mapdirection");
	//   $('#right-tabs ul').tabs("select","#directions");
    	setEndPoint_Address(address);	  
	 //  $('#getdirection').attr("disabled",""); 
	// var activetab = $('#left-accordion').accordion('option', 'active');
	// alert(activetab);
	  $('#left-accordion').accordion('activate',1); 
	//$('#left-accordion').activate(1);  
}
/**
* Set the Start Point input text box with the Start Address. 
* Prefill the Start Point Message/Label Area with Start point address.
*/
function setStartPoint_Address(address)
{
	$('#start_address').val(startPointArray[5]+','+startPointArray[6]+','+startPointArray[7]);
	$('#start_coord').val(startPointArray[3]+' '+startPointArray[4]);
	var clickStartPoint = '<table class="datatable"><tr><td><img src="images/start.png" alt="Start" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + startPointArray[3] + ',' + startPointArray[4] + '), '+fzoom+')" /></td><td><a href="#" class="small" onclick="map.setCenter(new OpenLayers.LonLat(' + startPointArray[3] + ',' + startPointArray[4] + '), '+fzoom+')">' + address + '</a><br /></td><td class=tdlast><img id="stPOI" src="style/images/222222_11x11_icon_arrows_updown.gif" border="0" onclick="showhide(\'#similar_start_points\')" /></td></tr></table>';
	$('#start_point').html(clickStartPoint);
	$('#goto_address').focus();	
}
/**
* Set the Start Point input text box with the Start Address. 
* Prefill the Start Point Message/Label Area with Start point address.
*/
function setEndPoint_Address(address)
{
	$('#goto_address').val(endPointArray[5]+','+endPointArray[6]+','+endPointArray[7]);
	$('#goto_coord').val(endPointArray[3]+' '+endPointArray[4]);
var clickEndPoint = '<table class="datatable"><tr><td><img src="images/stop.png" alt="Stop" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + endPointArray[3] + ',' + endPointArray[4] + '), '+fzoom+')" /></td><td><a href="#" class="small" onclick="map.setCenter(new OpenLayers.LonLat(' + endPointArray[3] + ',' + endPointArray[4] + '), '+fzoom+')">' + address + '</a><br /></td><td class=tdlast><img id="enPOI" src="style/images/222222_11x11_icon_arrows_updown.gif" border="0" onclick="showhide(\'#similar_end_points\')" /></td></tr></table>';
	$('#end_point').html(clickEndPoint);
	
}
/**
 * Geocode address input (JSON). Called from page.js
 * @param {Object} data
 */
function ws_geocode(data) {  // For Street Names
	if (data.total_rows > 0 ) {
	  html = '<table class="datatable" id="page"><tbody>';// <thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>SEARCH RESULTS</th></tr><thead>
	  $.each(data.rows, function(i, item){
	    if (item.row.x_coordinate > 0) {
			if (i == 0) map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), fzoom);
			var address = trim(item.row.name) + ',' + trim(item.row.locality) + ',' + trim(item.row.city);
			
			address = address.replace(/,,/g,",");
			
			var clickaddress =  item.row.name.replace(/'/g, "\\'") + ',' + item.row.locality + ','  + item.row.city;
			clickaddress = clickaddress.replace(/,,/g,",");
			var selectclick = item.row.objectid + "," + item.row.x_coordinate + "," + item.row.y_coordinate + "," +item.row.longitude  + "," + item.row.latitude+ ",'" + item.row.name + "','" + item.row.locality + "','" + item.row.city +"','" + clickaddress+"'";
			// selectclick = selectclick.replace(/,,/g,",");
			radio = '<input type="radio" name="selectresult" value="' + item.row.objectid + '" onClick="setSelected(' + selectclick + ');" />';
		    html += '<tr><td width="10px">' + radio + '</td><td width="16px"><img src="images/find.gif" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '),'+ fzoom+');" /></td><td>' + address + '</td></tr>';
	    }
	  });
	  html += '</tbody><tfoot><td colspan="3"><a href="#" onclick="page(\'previous\'); return false;">&lt;&lt; Previous</a> <a href="#" onclick="page(\'next\'); return false;">Next &gt;&gt;</a></td></tfoot></table>';
	  
	  $('#searchresults').html(html);
	  $('#page > tbody > tr:gt(4)').hide();
	  pager_max = Math.ceil(data.total_rows / 5);
	  pager_index = 1;
	  $('#page > tbody > tr:eq(0) > td:eq(0) > input:eq(0)').click();
	}
	else if (data.total_rows == 0 ) {
			$('#searchresults').html("<p>No records found.</p>");
	}
	else {
			$('#searchresults').html("<p>The search returned an error.</p>");
	}
	// $('#ajaxLoading').hide(); 
	$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
	//$('#right-tabs ul').tabs("select","#SEARCH");
	
}



/**
/**
 * Geocode address input (JSON). Called from page.js
 * @param {Object} data
 */
function ws_addressnum(data) {  // For Address Names
	if (data.total_rows > 0 ) {
	   	
	  html = '<table class="datatable" id="page"><tbody>';
	  //<thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>SEARCH RESULTS</th><th>&nbsp;</th><th>&nbsp;</th></tr><thead>
	  $.each(data.rows, function(i, item){
	    if (item.row.x_coordinate > 0) {
			if (i == 0) map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), fzoom);
			var address = item.row.name.replace(/'/g, "\\'") + ',' + item.row.roadname.replace(/'/g, "\\'") + ',' + item.row.locality + ',' + item.row.city;
			address = address.replace(/,,/g,",");			
			var clickaddress =  item.row.name.replace(/'/g, "\\'") +','+ item.row.roadname.replace(/'/g, "\\'")+','+ item.row.locality + ','+ item.row.city;
			clickaddress.replace(/,,/g,",");
            //clickaddress.replace(/,/g,";");
			var selectclick = item.row.objectid + "," + item.row.x_coordinate + "," + item.row.y_coordinate + "," +item.row.longitude  + "," + item.row.latitude+ ",'" + item.row.name.replace(/'/g, "\\'") + "','" + item.row.locality + "','" + item.row.city +"','" + clickaddress+"'";
			// selectclick.replace(/,,/g,",");
			radio = '<input type="radio" name="selectresult" value="' + item.row.objectid + '" onClick="setSelected(' + selectclick + ');" />';
			
		    html += '<tr><td width="10px">' + radio + '</td><td width="16px"><img src="images/find.gif" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '),'+ fzoom+');" /></td><td>' + address.replace(/\\/g, "") + '</td>';
			html += '<td><img src="images/start.png" alt="Set as Start Point" style="margin: 0px" onclick="setStartPoint('+selectclick +');" /></td><td><img src="images/stop.png" alt="Set as End Point" style="margin: 0px" onclick="setEndPoint('+selectclick +');" /></td></tr>';	
		
	    }
	  });
	  html += '</tbody><tfoot><td colspan="5" align="right"><a href="#" onclick="page(\'previous\'); return false;">&lt;&lt; Previous</a> <a href="#" onclick="page(\'next\'); return false;">Next &gt;&gt;</a></td></tfoot></table>';
     if (data.total_rows > 1)
     {
		 html = '<div id="searchmsg" class="accordion_msg" >Following matching addresses have been found. Map is centered around the first address. Select the approriate address to view on the map.</div>' + html;
     }
      
	  $('#searchresults').html(html);
	  $('#page > tbody > tr:gt(4)').hide();
	  pager_max = Math.ceil(data.total_rows / 5);
	  pager_index = 1;
	  $('#page > tbody > tr:eq(0) > td:eq(0) > input:eq(0)').click();
	}
	else if (data.total_rows == 0 ) {
			$('#searchresults').html("<p>No records found.</p>");
	}
	else {
			$('#searchresults').html("<p>The search returned an error.</p>");
	}
	// 
	//$('#ajaxLoading').removeClass("ac_loading");
   // $('#right-tabs ul').tabs("select","#SEARCH");
	$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
	//$('#right-accordion').accordion('option','active',0);
	//$('.ternMask').hideElapsor();
}

/**
/**
 * Geocode address input (JSON). Called from page.js
 * @param {Object} data
 * For getting the Start Point
 */
function getStartPoint(data) {  // For getting the Start Address
	if (data.total_rows > 0 ) {
	  html = '<table class="datatable" id="stpage"><thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>SELECT A START POINT</th><th>&nbsp;</th><th>&nbsp;</th></tr><thead><tbody>';
	  $.each(data.rows, function(i, item){
	    if (item.row.x_coordinate > 0) {
			if (i == 0) map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), fzoom);
			var address = item.row.name + ',' + item.row.roadname.replace(/'/g, "\\'") + ',' + item.row.locality + ',' + item.row.city;
			address = address.replace(/,,/g,",");			
			var clickaddress =  item.row.name +','+ item.row.roadname.replace(/'/g, "\\'")+','+ item.row.locality + ','+ item.row.city;
			clickaddress.replace(/,,/g,",");
            //clickaddress.replace(/,/g,";");
			var selectclick = item.row.objectid + "," + item.row.x_coordinate + "," + item.row.y_coordinate + "," +item.row.longitude  + "," + item.row.latitude+ ",'" + item.row.name + "','" + item.row.locality + "','" + item.row.city +"','" + clickaddress+"'";
			// selectclick.replace(/,,/g,",");
			
			radio = '<input type="radio" name="startresult" value="' + item.row.objectid + '" onClick="setStartPoint(' + selectclick + ');"';
			if(i == 0) { 
				// setSelected(item.row.objectid ,  item.row.x_coordinate,item.row.y_coordinate,item.row.longitude ,item.row.latitude,item.row.name, item.row.locality,item.row.city,clickaddress); 
				 setStartPoint(item.row.objectid ,  item.row.x_coordinate,item.row.y_coordinate,item.row.longitude ,item.row.latitude,item.row.name, item.row.locality,item.row.city,clickaddress);
				 radio += ' checked ';
				}
			radio +='/>';	
		   html += '<tr><td width="10px">' + radio + '</td><td width="16px"><img src="images/find.gif" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '),'+ fzoom+');" /></td><td>' + address + '</td>';
			html += '<td><img src="images/start.png" alt="Set as Start Point" style="margin: 0px" onclick="setStartPoint('+selectclick +');" /></td><td><img src="images/stop.png" alt="Set as End Point" style="margin: 0px" onclick="setEndPoint('+selectclick +');" /></td></tr>';	
	    }
	  });
	  html += '<tfoot><td colspan="5" align="right"><a href="#" onclick="stpage(\'previous\'); return false;">&lt;&lt; Previous</a> <a href="#" onclick="stpage(\'next\'); return false;">Next &gt;&gt;</a></td></tfoot></tbody></table>';
	  $('#similar_start_points').html(html);
	  $('#stpage > tbody > tr:gt(4)').hide();
	  pager_max = Math.ceil(data.total_rows / 5);
	  pager_index = 1;
	  $('#stpage > tbody > tr:eq(0) > td:eq(0) > input:eq(0)').click();
	}
	else if (data.total_rows == 0 ) {
			$('#similar_start_points').html("<p>No records found.</p>");
	}
	else {
			$('#similar_start_points').html("<p>The search returned an error.</p>");
	}
	$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
}

/**
/**
 * Geocode address input (JSON). Called from page.js
 * @param {Object} data
 * For getting the End Point
 */
function getEndPoint(data) {  // For getting the End Point Address
	if (data.total_rows > 0 ) {
	  html = '<table class="datatable" id="enpage"><thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>SELECT A GO TO POINT</th><th>&nbsp;</th><th>&nbsp;</th></tr><thead><tbody>';
	  $.each(data.rows, function(i, item){
	    if (item.row.x_coordinate > 0) {
			if (i == 0) map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), fzoom);
			var address = item.row.name + ',' + item.row.roadname.replace(/'/g, "\\'") + ',' + item.row.locality + ',' + item.row.city;
			address = address.replace(/,,/g,",");			
			var clickaddress =  item.row.name +','+ item.row.roadname.replace(/'/g, "\\'")+','+ item.row.locality + ','+ item.row.city;
			clickaddress.replace(/,,/g,",");
            //clickaddress.replace(/,/g,";");
			var selectclick = item.row.objectid + "," + item.row.x_coordinate + "," + item.row.y_coordinate + "," +item.row.longitude  + "," + item.row.latitude+ ",'" + item.row.name + "','" + item.row.locality + "','" + item.row.city +"','" + clickaddress+"'";
			// selectclick.replace(/,,/g,",");
			radio = '<input type="radio" id="endresult" name="endresult" value="' + item.row.objectid + '" onClick="setEndPoint(' + selectclick + ');"';
			if(i == 0) { setEndPoint(item.row.objectid ,  item.row.x_coordinate,item.row.y_coordinate,item.row.longitude ,item.row.latitude,item.row.name, item.row.locality,item.row.city,clickaddress); 
			radio += ' checked ';}
			radio +='/>';	
		    html += '<tr><td width="10px">' + radio + '</td><td width="16px"><img src="images/find.gif" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '),'+ fzoom+');" /></td><td>' + address + '</td>';
			html += '<td><img src="images/start.png" alt="Set as Start Point" style="margin: 0px" onclick="setStartPoint('+selectclick +');" /></td><td><img src="images/stop.png" alt="Set as End Point" style="margin: 0px" onclick="setEndPoint('+selectclick +');" /></td></tr>';	
	    }
	  });
	  html += '<tfoot><td colspan="5" align="right"><a href="#" onclick="enpage(\'previous\'); return false;">&lt;&lt; Previous</a> <a href="#" onclick="enpage(\'next\'); return false;">Next &gt;&gt;</a></td></tfoot></tbody></table>';
	  $('#similar_end_points').html(html);
	  $('#enpage > tbody > tr:gt(4)').hide();
	  pager_max = Math.ceil(data.total_rows / 5);
	  pager_index = 1;
	  $('#enpage > tbody > tr:eq(0) > td:eq(0) > input:eq(0)').click();
	}
	else if (data.total_rows == 0 ) {
			$('#similar_end_points').html("<p>No location found.</p>");
	}
	else {
			$('#similar_end_points').html("<p>The search returned an error.</p>");
	}
	// 
	//$('#ajaxLoading').removeClass("ac_loading");
	$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
   // $('#left-accordion').accordion('activate',1);
}
/** -------------------------------- */


/**
 * Geocode based on the address identifier. Called from page.js
 * @param {Object} data
 */
function ws_pid_geocode(data) {
	if (data.total_rows > 0 ) {
	  html = '<table class="datatable" id="page"><tbody>';
	  // <thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>SEARCH RESULTS</th></tr></thead>
	  $.each(data.rows, function(i, item){
	    if (item.row.x_coordinate > 0) {
	    if (i == 0) map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), fzoom);
	    var address = item.row.house_number + ' ' + item.row.prefix + ' ' + item.row.street_name + ' ' + item.row.road_type + ' ' + item.row.suffix + ' ' + item.row.unit + ', ' + item.row.postal_city;
		clickaddress =  item.row.house_number + ' ' + item.row.prefix + ' ' + item.row.street_name.replace(/'/, "\\'") + ' ' + item.row.road_type + ' ' + item.row.suffix + ' ' + item.row.unit + ', ' + item.row.postal_city;
		selectclick = item.row.objectid + "," + item.row.x_coordinate + "," + item.row.y_coordinate + ",'" + item.row.parcel_id + "','" + item.row.parcel_id + "','" + clickaddress + "','" + item.row.postal_city + "'," + item.row.longitude + "," + item.row.latitude;
		radio = '<input type="radio" name="selectresult" value="' + item.row.objectid + '" onClick="setSelected(' + selectclick + ');" />';
	    html += '<tr><td width="10px">' + radio + '</td><td width="16px"><img src="image/find.gif" style="margin: 0px" onclick="map.setCenter(new OpenLayers.LonLat(' + item.row.longitude + ',' + item.row.latitude + '), '+fzoom+');" /></td><td>PID: ' + item.row.parcel_id + '<br />' + address + '</td></tr>';
	 	}
	  });
	  html += '</tbody><tfoot><td colspan="3"><a href="#" onclick="page(\'previous\'); return false;">&lt;&lt; Previous</a> <a href="#" onclick="page(\'next\'); return false;">Next &gt;&gt;</a></td></tfoot></table>';
	  $('#searchresults').html(html);
	  $('#page > tbody > tr:gt(4)').hide();
	  pager_max = Math.ceil(data.total_rows / 5);
	  pager_index = 1;
	  $('#page > tbody > tr:eq(0) > td:eq(0) > input:eq(0)').click();
	}
	else if (data.total_rows == 0 ) {
			$('#searchresults').html("<p>No records found.</p>");
	}
	else {
			$('#searchresults').html("<p>The search returned an error.</p>");
	}
}
//Function to trim the space in the left side of the string
function ltrim ( s ){
  return s.replace( /^\s*/, "" );
}

//Function to trim the space in the right side of the string
function rtrim ( s ){
   return s.replace( /\s*$/, "" );
}

//*Function to trim the space in the  string
function trim(s) {
   var temp = s;
   return temp.replace(/^\s+/,'').replace(/\s+$/,'');
}

/* / --------------------------Routing Functions ------------------------------------/ */

function compute(startp,gotop,rtype) {
            var qpar = "startpoint="+ startp+"&endpoint="+gotop+"&routetype="+rtype;			
			url = wsbase + 'ws_roi_routing.php?format=xml&callback=displayRoute&' +qpar;
			$.getJSON(url);
}

// Display Route

function displayRoute(data){
	routepath.removeFeatures(routepath.features);	
  //	street_markers.removeFeatures(street_markers.features);
	routeDirection.removeFeatures(routeDirection.features);
	var routeText="<table class='datatable'><tr><td>St Point:- </td><td>" + startPointArray[5] +"," + startPointArray[6] +"," + startPointArray[7] +" </td><tr><td>End Point:-</td><td>"+ endPointArray[5]+","+ endPointArray[6]+","+ endPointArray[7]+"</td></tr></table>";
	var features = [];
	var streetMarks = [];
	var routeMarks = [];
	
	if (data.total_rows > 0 ) {
					  routeText += '<table class="datatable"><tbody><tr><th colspan=4>Driving Directions | <a href="#" onclick="clearRoute();">Clear Route</a> | <a href="#" onclick="reverseRoute();">Reverse Route</a></th></tr>';
					  var street_length = 0;
					  var total_distance=0;
				      var routeTable = [];
					  var j=0;
					  var 	street_length_cm=0;
					  var DEGREE_PER_RADIAN = 57.2957795;
					  var turn_angle=0;
					  var orientation=0;
					  var street_start ="";
					  var street_end="";
					  var street_mid="";
					  var stp1="";
					  var stp2="";
					  var tp2="";
                      var turn_angle="";
					  var textDirection= "";
					  var street_name_prev="";
					  var street_length_prev=0;
					  var text_direction_prev ="";
					  var turn_angle_prev = 0;
					  $.each(data.rows, function(i, item){
					  		street_length = 111.123*item.row.length;
							street_name = trim(item.row.streetname);
							turn_angle= Math.round(item.row.turnangle);
							parser = new OpenLayers.Format.WKT();							
							street_start = item.row.vertexpoint;						
							street_end = item.row.streetend;
							street_mid = item.row.streetmid;
							// alert (street_start);
							var snl = "";
							streetsegment = [];
							if (street_name.length == "")
							{
								street_name = "local road";
							} 
							else
							{ 	var snl = street_name.toUpperCase();
								if (!snl.match("ROAD") && !snl.match("RD")) 	street_name = street_name + " RD";
							}
							
						if (i>0){
								 orientation =  turn_angle_prev - turn_angle; 
								}
						textDirection = directionText(orientation);
						// for road segments with same name (street_name != "local road") && && (textDirection == text_direction_prev) 
							if ((i>0) && (((street_name != "local road") && (street_name == street_name_prev))|| ((street_name == "local road") && (textDirection == text_direction_prev) && (street_name == street_name_prev))) )
						
							{								
									street_length_cm = street_length_prev + street_length;								
									routeTable[j-1].streetlength = routeTable[j-1].streetlength + street_length;	street_length_prev = street_length_cm;									
							}
							else { 
								
								if( street_length > 0.001) {

								streetsegment['id']= j; // j
								streetsegment['gid']=  item.row.gid;
								streetsegment['streetname']= street_name;
								streetsegment['streetlength']=street_length;	
								streetsegment['turnangle']= turn_angle;
								streetsegment['orientation']= orientation;
								streetsegment['streetStart']=street_start;
							//	streetsegment['streetEnd']=street_end;
								streetsegment['streetMid']=street_mid;
								streetsegment['streetMidX']=getX(street_mid);
								streetsegment['streetMidY']=getY(street_mid);

								// Prepare Text Direction
								// textDirection = directionText(orientation);
								streetsegment['textDirection']= textDirection;
								routeTable.push(streetsegment); 
								j++;
								street_length_prev = street_length;
								}
							}
							
							street_name_prev = street_name;
							turn_angle_prev = turn_angle;
							text_direction_prev = textDirection;
							
							wkt=parser.read(item.row.wkt);
							features.push(wkt);	
							routeMarks.push( new OpenLayers.Feature.Vector(getPoint(street_mid),{angle:turn_angle}));
							street_length = street_length * 1.0;
							total_distance = total_distance + street_length;
						});
						routeText += '<tr><td colspan=4>Total Distance:'+total_distance.toFixed(2)+' km</td></tr>';
						routeText += '<tr><th>ID</th><th>Movement/Direction</th><th>Road Name</th><th>Distance</th></tr>';
							var streetNameLink="";
							var n=0;
							for (n in routeTable)
							{
							   streetNameLink = '<a href="#" class="small" onclick="setFacility('+routeTable[n].streetMidX+','+ routeTable[n].streetMidY+',\''+ routeTable[n].streetname +'\')">' + routeTable[n].streetname + '</a>';
								routeText += "<tr><td>" +parseInt(n*1.0+1) + ".</td><td>";
								if (n==0) 
									{
										routeText += "Start and "+routeTable[n].textDirection + " ";
									} else {
										routeText += routeTable[n].textDirection+ " ";
									}
								routeText += "</td><td><b>" +  streetNameLink + "</b></td>";
								
								//	if (n==routeTable.length-1) 
								//	{
								//		routeText += " Stop to look out.";
								//	}
									routeText +="</td><td> " +routeTable[n].streetlength.toFixed(2)+ " km";
									routeText += " </td></tr>";
							}
                            routeText += "<tr><td colspan='4'> Stop to look around for <b>"+ endPointArray[5]+","+ endPointArray[6]+","+ endPointArray[7]+"</b>.</td></tr>";
							routeText += '<tr><td colspan=4>Total Distance:'+total_distance.toFixed(2)+' km</td></tr>';
							routeText +="</table>";

				}
				else {
						routeText += "<p>No Routes found.</p>";
					}
			
			$('#route_info').html(routeText);
			routepath.addFeatures(features);
		//	routepath.addFeatures(streetMarks);
			routeDirection.addFeatures(routeMarks);
			map.zoomToExtent(new OpenLayers.Bounds(
						Math.min(startPointArray[3],endPointArray[3]),
						Math.min(startPointArray[4],endPointArray[4])-0.004,
						Math.max(startPointArray[3],endPointArray[3]),
						Math.max(startPointArray[4],endPointArray[4])+0.004
						));			
			$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
			showhide('#similar_start_points');
			showhide('#similar_end_points');
}

function clearRoute(){
	routepath.removeFeatures(routepath.features);	
	routeDirection.removeFeatures(routeDirection.features);
	$('#route_info').html(""); 
}
function reverseRoute(){
    var tmp = startPointArray;
	startPointArray = endPointArray;
    endPointArray = tmp;
	//set selected startPointArray		
	var sp_longitude = startPointArray[3] ; // Name
	var sp_latitude = startPointArray[4] ; // Locality
	var sp_name = startPointArray[5];
	var sp_locality= startPointArray[6];
	var sp_city= startPointArray[7];
	var sp_address = startPointArray[8];
 // alert( "SP: " + sp_address + "("+sp_longitude +","+sp_latitude+")");
	//Add marker to the map		
	startPointMarker(sp_longitude, sp_latitude);	
	setStartPoint_Address(sp_address);
	//set selected endPointArray		
	var	ep_longitude = endPointArray[3]; // Name
	var	ep_latitude = endPointArray[4] ; // Locality
	var ep_name = endPointArray[5] ;
	var ep_locality = endPointArray[6] ;
	var ep_city = endPointArray[7];
	var	ep_address = endPointArray[8];
	//Add marker to the map	
	endPointMarker(ep_longitude, ep_latitude);	
	setEndPoint_Address(ep_address);
// alert( "EP: " + ep_address + "("+ep_longitude +","+ep_latitude+")");
// $('#directionbtn').click(); 
	findDirection();
}

function getMethodText(theMethod){
	switch(theMethod){
		case"SAFER":
			methodText='<span style="color: #76b643;">Safest route</span>';
			break;
		case"SAFE":
			methodText='<span style="color: #fed047;">Safe route</span>';
			break;
		case"DIRECT":
			methodText='<span style="color: #ff7241;">Most direct route</span>';
			break;
		}
	return methodText;
}
// Function to Check Input field value and display default
// Usage : $("#s").chcekinput();
$.fn.checkinput = function() {
	return this.focus(function() {
		if( this.value == this.defaultValue ) {
			this.value = "";
		}
	}).blur(function() {
		if( !this.value.length ) {
			this.value = this.defaultValue;
		}
	});
};

function getX(pwkt) {
	var wkt_parser = new OpenLayers.Format.WKT(); 
	var f = wkt_parser.read(pwkt); 
	var geom = f.geometry;
	return geom.x;
}
function getY(pwkt) {
	var wkt_parser = new OpenLayers.Format.WKT(); 
	var f = wkt_parser.read(pwkt); 
	var geom = f.geometry;
	return geom.y;
}
function findAngle(x1,y1, x2,y2) {
      var DEGREE_PER_RADIAN = 57.2957795;
      var RADIAN_PER_DEGREE = 0.017453;

      var dlat = y2 - y1;
      var dlng = x2 - x1;
      // We multiply dlng with cos(endLat), since the two points are very closeby,
      // so we assume their cos values are approximately equal.
      var yaw = Math.atan2(dlng * Math.cos(x2 * RADIAN_PER_DEGREE), dlat)
             * DEGREE_PER_RADIAN;
      return wrapAngle(yaw);
}
function wrapAngle(angle) {
    if (angle >= 360) {
      angle -= 360;
    } else if (angle < 0) {
     angle += 360;
    }
    return angle;
}
function getPoint(pwkt) {
	var wkt_parser = new OpenLayers.Format.WKT(); 
	var f = wkt_parser.read(pwkt); 
	var geom = f.geometry;
	return geom;
}
// Prepare Direction Text - takes teh turn angle in dgrees between two roads and outputs the direction text
function directionText(turn){
	var tua = turn; // Orientation
	var textDir =" continue "; // Direction Text
	// Prepare Text Direction -VE Orientation
							if ((tua >= -10) && (tua <= 10))
								{
									textDir = " continue on"; 
								}
								if ((tua <= -350) || (tua >= 350))
								{
									textDir = " continue on"; 
								}

								if ((tua < -350) || (tua > 350))
								{
									textDir = " continue on"; 
								}
// Right Turns
								if ((tua >= -45)  && (tua < -10))
									{
											textDir = " turn slight right on to"; 
									}
								if ((tua >= -135)  && (tua < -45))
									{
											textDir = " turn right on to"; 
									}
								if ((tua >= -180)  && (tua < -135))
									{
											textDir = " U-turn right on to"; 
									}
// Left trurns
								if ((tua >= -350)  && (tua < -315))
									{
											textDir = " turn slight left on to"; 
									}
								if ((tua >= -315)  && (tua < -225))
									{
											textDir = " turn left on to"; 
									}
								if ((tua >= -225)  && (tua < -180))
									{
											textDir = " U-turn left on to"; 
									}
// Right Turns +ve
								if ((tua <= 45)  && (tua > 10))
									{
											textDir = " turn slight left on to"; 
									}
								if ((tua > 45)  && (tua < 135))
									{
											textDir = " turn left on to"; 
									}
								if ((tua >= 135)  && (tua < 180))
									{
											textDir = " U-turn left on to"; 
									}
// Left trurns +ve
								if ((tua > 315)  && (tua < 350))
									{
											textDir = " turn slight right on to"; 
									}
								if ((tua >= 225)  && (tua < 315))
									{
											textDir = " turn right on to"; 
									}
								if ((tua >= 180)  && (tua < 225))
									{
											textDir = " U-turn right on to"; 
									}
return textDir;

}
// Customised Alert Function
$.fn.alert = function () {
			var $alert = $('#alert');
			if($alert.length)
			{
				var alerttimer = window.setTimeout(function () {
					$alert.trigger('click');
				}, 3000);
				$alert.animate({height: $alert.css('line-height') || '50px'}, 200)
				.click(function () {
					window.clearTimeout(alerttimer);
					$alert.animate({height: '0'}, 200);
				});
			}
	};

function findgotopoint(){
	// find end address point and set end point coordinate to it.
		// Display in Direction Results panel 
		// Ask Customer to select or refine end address and set one as the goto point.
		var gotoAddress = trim($('#goto_address').val());
//		var url = wsbase + findaddress + '?format=json&callback=getEndPoint&jsonp=?&address=' + urlencode(gotoAddress);
		var turl = wsbase + findaddress + '?format=json&jsonp=getEndPoint&address=' + urlencode(gotoAddress);
		 $('#ajaxLoading').elapsor({});// .html("Loading..."+ ajaxImage).addClass("dataLoading");
		//$.getJSON(url);
		// $("#debugmsg").html(ajaxImage + " loading data...");
		// testing AJAX GET
		$.ajax({
			   type: "GET",
			   "url": turl,     			
			    data: "&roadtype=&suffix=&zipcode=&city=&unit=&prefix=",
			    timeout: 10000,
				dataType: "json",				
			    error: function(){ $("#debugmsg").html("ERROR!!! Contact Site Admin.").css("color","red");
									   $('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");	
									  },
			    success: function(data){
					var num_rec = data.total_rows;
					if (num_rec == 0 ){
					$("#debugmsg").html("<b>"+ num_rec + "</b> matching results found. Please check the address spelling and try again.").css('color','red');
						
						$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");							
					}
					else if (num_rec == 1 ) {
				    getEndPoint(data);
					$("#debugmsg").html("<b>"+ num_rec + "</b> matching result found.")
								  .css('background-color','yellow');
						
					}
					else if(num_rec <= 50 ) {
						 getEndPoint(data);
						$("#debugmsg").html("<b>"+ num_rec + "</b> matching results have  been found. Please select one as <b>END</b> point.")
								  .css('background-color','yellow');
						
					}
					else if(num_rec > 50 ) {
						 getEndPoint(data);
						$("#debugmsg").html("More than <b>"+ 50 + "</b> matching results have  been found. Please select one as <b>END</b> point.").css('background-color','yellow');
						
					}
							    
				   }
				});	
		
}

function findstartpoint(){
	// find start address point and set start point coordinate to it.
		// Display in Direction Results panel 
		// Ask Customer to select or refine start address and set one as teh start point.
	
		 var startAddress = trim($('#start_address').val()); 
		 url = wsbase + findaddress + '?format=json&callback=getStartPoint&jsonp=?&address=' + urlencode(startAddress);
		 var turl = wsbase + findaddress + '?format=json&jsonp=getStartPoint&address=' + urlencode(startAddress);
		// $('#ajaxRLoading').addClass("rt_loading");
		 $('#ajaxLoading').elapsor({}); //.html("Loading..."+ ajaxImage).addClass("dataLoading");		
		// $.getJSON(url);			
		$.ajax({
			   type: "GET",
			   "url": turl,     			
			    data: "&roadtype=&suffix=&zipcode=&city=&unit=&prefix=",
			    timeout: 10000,
				dataType: "json",
				
			    error: function(){ $("#debugmsg").html("ERROR!!! Contact Site Admin.").css("color","red");
									$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");	
									},
			    success: function(data){
					var num_rec = data.total_rows;
					if (num_rec == 0 ){
					$("#debugmsg").html("<b>"+ num_rec + "</b> matching results found. Please check the address and try again.").css('color','red');
					$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");						
					}
					else if (num_rec == 1 ) {
					$("#debugmsg").html("<b>"+ num_rec + "</b> matching result found.")
								  .css('background-color','yellow');
					getStartPoint(data);						
					}
					else if(num_rec <= 50 ) {						
						$("#debugmsg").html("<b>"+ num_rec + "</b> matching results have  been found. Please select one as <b>START</b> point.").css('background-color','yellow');
						getStartPoint(data);						
					}
					else if(num_rec > 50 ) {						 
						$("#debugmsg").html("More than <b>"+ 50 + "</b> matching results have  been found. Please select one as <b>START</b> point.").css('background-color','yellow');						
						getStartPoint(data);
					}								    
				   }
				});	
				//$('.ternMask').hideElapsor();
}

// Find Direction Function
function findDirection(){
$("#debugmsg").html("");		
		var startAddress = trim($('#start_address').val());        
		var startPoint = $('#start_coord').val();
		var gotoAddress = trim($('#goto_address').val());
		var gotoPoint = $('#goto_coord').val();		
		var prevStartAddress = startPointArray[5] +','+startPointArray[6]+','+startPointArray[7];
		var prevGotoAddress = endPointArray[5] +','+endPointArray[6]+','+endPointArray[7];
		if ((startAddress == "") || (startAddress == "Enter Start Address"))
		{
		  $('#start_address').focus();
		  return false;
		}
		else if (((startAddress != "") && (startAddress != prevStartAddress)) || (startPointArray.toString() == "")) 
		{
			findstartpoint();
		}

		if ((gotoAddress == "" ) || (gotoAddress == "Enter GOTO Address"))
		{      
		 $('#goto_address').focus();
		 $('#debugmsg').html("<font color=red>Please Enter <b>Go To</b> Address</font>");
		   return false;
		}
		else if (((gotoAddress != "") && (gotoAddress != prevGotoAddress)) || (endPointArray.toString() == ""))
		{
			findgotopoint();
		}
		if(gotoAddress !== startAddress) {
		var rtype = $('#rtype').val();
		if (rtype == "*") rtype = "SPA";			
		 var qpar = "stadr="+urlencode(startAddress)+"&goadr="+urlencode(gotoAddress)+"&startpoint="+ startPoint+"&endpoint="+gotoPoint+"&routetype="+rtype;	
         url = wsbase +roi_routing+ '?format=json&callback=displayRoute&' +qpar;
		var turl = wsbase +roi_routing+ '?format=json&jsonp=displayRoute&' +qpar;
		$('#ajaxLoading').elapsor({}); // .html("Loading..."+ ajaxImage).addClass("dataLoading");	
		//$.getJSON(url); // Simple get method       
		// Using AJAX full
		  $.ajax({
			   type: "GET",
			   "url": turl,     			
			    data: "",
			    timeout: 180000,
				dataType: "json",				
			    error: function(){ $("#debugmsg").html("ERROR!!! Request Timed out. Contact Site Admin.").css("color","red");
				$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");
				},
			    success: function(data){
					var num_rec = data.total_rows;
					if (num_rec == 0 ){
					$("#debugmsg").html("No Route found. Please check the address and try again.")
						//.css('background-color','#FFFF00')
						.css('color','red');
						$('#ajaxLoading').html("").hideElapsor();//.removeClass("dataLoading");	
					}
					else if(num_rec > 0 ) {						 
						$("#debugmsg").html("Route found.")
								  .css('background-color','yellow');
						displayRoute(data);						
					}								    
				   }
				});         
		}
		else {
			$('#debugmsg').html("<font color=red>Error!!! Start & GOTO address are same.</font>");
			$('#alert').html( "Start Address and Destination address are same. \nPlease choose different address.").alert();
			
		}
}
// Function to Print the webpage
//----------------------------------
$.fn.printpage = function() {
  return this.each(function(){
    $('.printme').click(function(){window.print();});
     // .appendTo(this);
  });
}
