/*Google maps / traffic feed */
//VARS


// global "map" variable
var mapGoogle;
var gMarkers = [];
var placeElements = [];	
var htmlMarkers = [];
var routeOverlay;
var gdir;


//gaz search vars
var ajaxRequest = getXMLHttpRequest();
var output = new Array();
var error;
var containsError = false;
var database="B"; //default to UK

//traffic vars
var AATraffic="/aaservlet/traffic";
var errorDivID="#errorMsg";
var trafficDateDivID="#dateTraffic";
var aaMapPage='trafficnews';

var SbSLayer;
var SbSMapType;
var boundsSbS;
var hc1;    // Hierarchical map control

var metresToKilometres = 1000;
var metresToMiles = 1609.344;
var distanceConversion = metresToKilometres;	// Default to km
var loadingImageURI = "/images/routes/ajax-loader.gif";

// ====== Array for decoding the Google failure codes ======
var reasons=[];
reasons[G_GEO_SUCCESS]            = "Success";
reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
reasons[G_GEO_UNKNOWN_DIRECTIONS] = "Unable to generate route between specified locations.";


//arrays of images for markers
  var overlay = [];
	  overlay["0"] = "ov-0.png";
	  overlay["5"] = "ov-5.png";
	  overlay["10"] = "ov-10.png";
	  overlay["15"] = "ov-15.png";
	  overlay["20"] = "ov-20.png";
	  overlay["25"] = "ov-25.png";

//FUNCTIONS

	
$(document).ready(function() {				   

	 $("#trafficPlace").keypress(searchFieldKeypress);

		

if (GBrowserIsCompatible()) { 
      // Display the map, with some controls and set the initial location 
     // Set up the AA mapping layers
      // Function to return the map tile
      var SbSTiles = function (a,b) { return TileToQuadKey(a.x,a.y,b); }
      
	  //mapGoogle.addControl(new GMapTypeControl());
	
	   // SbS/Map Hybrid layer map
	   boundsSbS = new GLatLngBounds(new GLatLng(49.9,-6.0), new GLatLng(60.9,2.0));
	   SbSLayer = new Array();
	   SbSLayer[0] = G_NORMAL_MAP.getTileLayers()[0];
       SbSLayer[1] = new GTileLayer(new GCopyrightCollection('') , 15, 16);
       //SbSLayer[1].opacity = 1.0;
	   SbSLayer[1].getTileUrl = SbSTiles;
	   SbSLayer[1].getCopyright = function(a,b) { if (b >= 15 && b <= 16 && a.intersects(boundsSbS))
	                                            	return "&copy; Crown Copyright Lic. No. 100021153";
	                                            else
	                                                return "";}; 
	   SbSLayer[1].getOpacity = function () {return 1.0;};
	   SbSLayer[1].isPng = function() {return false;};
	   
       SbSMapType = new GMapType(SbSLayer, 
		                         G_NORMAL_MAP.getProjection(), 
		                         'Map',{shortName:"Map", errorMessage:"", alt:"Show street map"}); 
	   SbSMapType.getTextColor = function() {return "#000000";};

	  // Display the map, with our selection of map types
	  mapGoogle = new GMap2(document.getElementById("map"), {mapTypes:[SbSMapType,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP]});
      

	   mapGoogle.addMapType(SbSMapType); 
       //mapGoogle.addMapType(G_PHYSICAL_MAP);

      hc1 = new GHierarchicalMapTypeControl();
	  //hc1.addRelationship(G_NORMAL_MAP, SbSMapType , "Street By Street");


	 mapGoogle.addControl(new GLargeMapControl3D());
	 mapGoogle.addControl(new GScaleControl());
	 mapGoogle.addControl(hc1);
	  
	 mapGoogle.setCenter(new GLatLng(54.522005, -3.083582), 5);
	//mapGoogle.setCenter(new GLatLng(51.50781,-0.12441), 10);

		

      /*mapGoogle.enableContinuousZoom();*/
	  mapGoogle.enableScrollWheelZoom();


		var overlayMapAd= document.getElementById("overlayMapAd");
		if (overlayMapAd != null) {
			var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(0,0));
			pos.apply(overlayMapAd);
			mapGoogle.getContainer().appendChild(overlayMapAd); 
			overlayMapAd.style.display='block';
		}	  
		
		var overlayMapMessage= document.getElementById("overlayMapMessage");
		if (overlayMapMessage != null) {
			var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0,0));
			pos.apply(overlayMapMessage);
			mapGoogle.getContainer().appendChild(overlayMapMessage); 
		}	 


	
	//initialize
	clearAndReloadTraffic(AATraffic,mapGoogle);
	//set to reoccur
	//disabled
	//var trafficInterval=setInterval("clearAndReloadTraffic(trafficFeedUrl,mapGoogle)", 180000 );
	
	GEvent.addListener(mapGoogle,"zoomend",function(oldLevel, newLevel){
		
			//images/traffic/trafficalerticon-small.gif 
			var zoomLevel=newLevel;
			$keyTrafficAlert=$("#keytrafficalert");
			var currentTAImg=$keyTrafficAlert.attr("src");
			
			if(zoomLevel>=7&&zoomLevel<=9 && currentTAImg!="/images/traffic/key-traffic-alert-sm.gif")
			{
				$keyTrafficAlert.attr({src:"/images/traffic/key-traffic-alert-sm.gif",width:"27",height:"23"});
			}
			else if((zoomLevel<7||zoomLevel>9) && currentTAImg!="/images/traffic/key-traffic-alert.gif")
			{
				$keyTrafficAlert.attr({src:"/images/traffic/key-traffic-alert.gif",width:"27",height:"23"});
			}
		
	});

	

    }
    // display a warning if the browser was not compatible with GMAPS
    else {
      //put in an alert...
    }
	


	
}); //end document ready


$(document).unload(GUnload);


function clearAndReloadTraffic(url,map)
{
	//default to alerts only
	//displayTrafficOverlay(map,true,'overlayMapMessage');
	displayTrafficAlertOverlay(map,true,'overlayMapMessage');
}
	
	
function TileToQuadKey ( x, y, zoom)
{ 
    var quad = ""; 
    var fullPath = "";
    if (zoom >= 15 && zoom <= 16)
    {
	    for (var i = zoom; i > 0; i--){
	        var mask = 1 << (i - 1); 
	        var cell = 0; 
	        if ((x & mask) != 0) 
	            cell++; 
	        if ((y & mask) != 0) 
	            cell += 2; 
	        quad += cell; 
	    }
	    
	    fullPath = tileOverlayLocation + quad + ".gif";
	} 
    return fullPath; 
}


//set zoom and extents
function setMapExtentsByRegion(lat,lon,zoom)
{
	//inputs
	//zoom level arbitrary here?
	 mapGoogle.setCenter(new GLatLng(lat, lon), zoom);

	
}

function setTrafficMapLocation(area)
{
	
	//use search first, then city, then city
	var selectedRegion =$("#region").val();
	var selectedCity=$("#city").val();
	var searchLocation=$("searchTrafficLocation").val();
	
	//do search first
	if(area=="search")
	{
		//get gaz co-ordinates lat/long
		
		doGazSearch();

	}
	if(area=="city")
	{
		//if city selected then
		//split city into place,lat,long
		var arrNamePos=selectedCity.split(":");
		var placeName=arrNamePos[0];
		var arrLatLon=arrNamePos[1].split(",");
		var zoomLevel=arrNamePos[2];
		mapGoogle.setCenter(new GLatLng(arrLatLon[0], arrLatLon[1]),parseInt(zoomLevel,10));
	}
	else if(area=="region")
	{
		//if region selected then	
		//split region into place,lat,long
		var arrNamePos=selectedRegion.split(":");
		var placeName=arrNamePos[0];
		var arrLatLon=arrNamePos[1].split(",");
		var zoomLevel=arrNamePos[2];
		mapGoogle.setCenter(new GLatLng(arrLatLon[0], arrLatLon[1]),parseInt(zoomLevel,10));

	}
	
	


}




//gaz search functions

function getNewValues(thePlace) {
  output.length = 0;
  params = "place="+escape(thePlace)+"&amp;database="+database;
  var ie7 = (document.all && !window.opera && window.XMLHttpRequest) ? true : false;
  if (ajaxRequest!=null){
	ajaxRequest.open("POST", "/aaservlet/PopulateGazList", false);
	ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajaxRequest.setRequestHeader("Content-length", params.length);
	ajaxRequest.setRequestHeader("Connection", "close");
	if (window.XMLHttpRequest){
	   if(ie7)
	   {
		  ajaxRequest.onreadystatechange= function(){updateValues();};
		  ajaxRequest.send(params);
	   }
	   else
	   {
		  ajaxRequest.send(params);
		  ajaxRequest.onreadystatechange= updateValues();
	   }
	} else {
	   ajaxRequest.onreadystatechange= function(){updateValues();};
	   ajaxRequest.send(params);
	}
 }

}

function updateValues() {

		containsError = false;
		error="";

		if (ajaxRequest!=null && ajaxRequest.readyState==4)
		{
			if (ajaxRequest.status == 200){
				
				var result = eval("("+ajaxRequest.responseText+")");
				if(result.errors.length > 0)
				{
					error = result.errors;
					containsError = true;
				}
				else
				{
					for (i=0; i < result.placeResults.length; i++)
					{
						var entry = new Array();
						//each entry as a display and value
						entry[0] = result.placeResults[i][0];
						entry[1] = result.placeResults[i][1];
						output[i] = entry;
					}
				}
			}
			if(ajaxRequest.status!=200)
			{
				//error getting reponse	
				
				$(errorDivID).html("<p class='error'>Sorry, there was a problem finding your location. Please try again later.</p>");
			}
		}
}

function setDatabase(db){ database=db; }
function getDatabase(){ return database }
function getResults(){ return output; }
function hasError(){
	return containsError;
}

function getError(){return error;}



//taken from route-gaz.js
function doGazSearch()
{

	processingError=false; // reset

	$('#confirmPlace').html("");
	
	//display loading gif
	showLoading();
	
	// search from and to
	if(searchPlace("#trafficPlace")){
	
		//go to first location
		populateField('#confirmPlace');
		goToGazResult();

        	 $('#fragment-1').attr("class","map-tabs-panel map-tabs-hide");
         	 $('#fragment-2').attr("class","map-tabs-panel");


	};
	hideLoading();
;
}


function searchPlace(searchID)
{
	//clear any errors
	$("#trafficPlace").css("background-color","#FFFFFF");
	
	getNewValues($(searchID).val());

	if(hasError())
	{
		$("#trafficPlace").val(getError());
		$("#trafficPlace").css("background-color","#FF9900");
		//setErrorBG(searchField);
		processingError=true;

		return false;
	} else {
		// clear any error colours
		//setWhiteBG(searchField);
	}
	//return boolean if search ok
	return true;
}

function goToGazResult()
{
		var res = getResults();
  		var resOutput=res[0][1];
		var gazOutput=resOutput.split("|");
		var placeName=gazOutput[1];
		var placeEasting=gazOutput[3];
		var placeNorthing=gazOutput[4];
	
		var geo=ConvertBNGtoWGS84(placeEasting,placeNorthing);
		var newGLocation=new GLatLng(geo.latitude, geo.longitude)
		mapGoogle.setCenter(newGLocation, 11);

}

function populateField(resField)
{
	//reset options
	//resField.options.length=0;
	var res = getResults();
	var options="";
	for(cnt = 0; cnt < res.length; cnt++)
	{
		var optn = new Option();
		optn.text = res[cnt][0];
		optn.value = res[cnt][1];
		options += '<option value="' + optn.value + '">' + optn.text  + '</option>';
	}
	$(resField).html(options);
}


function goToDropDown()
{
	//currently assuming only one pair EN
	var selectedOption=$("#confirmPlace").val().split("|");
	var placeName=selectedOption[1];
	var placeEasting=selectedOption[3];
	var placeNorthing=selectedOption[4];
	
	var geo=ConvertBNGtoWGS84(placeEasting,placeNorthing);
	var newGLocation=new GLatLng(geo.latitude, geo.longitude)
	mapGoogle.setCenter(newGLocation, 11);
	
}


/** convenience function for setting the background to errorCol on the given widget **/
function setErrorBG(widget) {
	//widget.setAttribute("style", "background-color: " + errorCol);
	widget.style.cssText = "background-color: " + errorCol;
}

/** convenience function for setting the background white on the given widget **/
function setWhiteBG(widget) {
	//widget.setAttribute("style", "background-color: #FFFFFF;");
	widget.style.cssText = "background-color: #FFFFFF;";
}

/** hide the "Get route" button and show the swirl image **/
function showLoading() {
 var routeBtn = $('.nextTraffic',$('#mapTab'));
 routeBtn.hide();
 routeBtn.parent().append($("<img id='ldImg' src='" + loadingImageURI + "' />"));
}

/** hide the swirl image and show the Get Route button **/
function hideLoading() {
 var routeBtn = $('.nextTraffic',$('#mapTab'));
 routeBtn.show();
 $('#ldImg').remove();
}


/** Keypress event handler for route search */
function searchFieldKeypress(e) {
 if(e.which == 13) {
 	doGazSearch();
 }
}


function resetInputFields()
{
	 // Delete the place text
	$("#trafficPlace").css("background-color","#FFFFFF");
	$("#trafficPlace").val("");
}


function showAADataLayer(checked,cbName)
{
  //var $trafficAlertCB=$("#" + trafficAlertCBID);
  if(cbName=='dispTraffic')
  {
	if ($("#dispTraffic").is(':checked')){ 
		//show markers
		displayTrafficOverlay(mapGoogle,true,'overlayMapMessage');
	}
	else {
		//hide markers
		displayTrafficOverlay(mapGoogle,false,'overlayMapMessage');
	}
  }
  else if (cbName=='dispTrafficAlert')
  {
	if ($("#dispTrafficAlert").is(':checked')){ 
		displayTrafficAlertOverlay(mapGoogle,true,'overlayMapMessage');
	}
	else {
		displayTrafficAlertOverlay(mapGoogle,false,'overlayMapMessage');
	}
  }
}



function goToAndShowMarker(map,inpLat,inpLon,inpZoom,inpPOIid,inpPOIType,inpPOIName)
{
//check for float
  inpLat=parseFloat(inpLat) || null;
  inpLon=parseFloat(inpLon) || null;
  inpZoom=parseInt(inpZoom) || 13;
  inpPOIid=parseInt(inpPOIid) || null;
  inpPOIType=inpPOIType||null;
  inpPOIName=inpPOIName||'';
  
  if(inpZoom>17||inpZoom<0) inpZoom=13;
  //if got a POIID then do lookup and show on map
    
    if(inpLat!=null&&inpLon!=null)
    {

      if(inpPOIid!=null&&inpPOIType!=null)
      {
        var poiTypeID=getPOIIDFromType(inpPOIType);
        //get poitype and name
        showSinglePOI(map,inpLat,inpLon,inpPOIid,poiTypeID,true,true,inpPOIName);

      }
      else if(inpPOIName!=''){
			var newGLocation=new GLatLng(inpLat, inpLon);
          map.setCenter(newGLocation, inpZoom);
          addLocationMarker(map,newGLocation,inpPOIName);
		}
	else {
          var newGLocation=new GLatLng(inpLat, inpLon);
          map.setCenter(newGLocation, inpZoom);
          addLocationMarker(map,newGLocation,'' + inpLat + ', ' + inpLon);
        }
    }
}


function addLocationMarker(map,point,loctitle)
{
 var locMarker=new GMarker(point,{title:loctitle});
 if(loctitle!='')
 {
  GEvent.addListener(locMarker, 'click', function() {  
            // When clicked, open an Info Window  
            locMarker.openInfoWindowHtml(loctitle); 
          });       
  }
  map.addOverlay(locMarker);
} 

