
//VARS
/*restaurants	100	
pub	101	
hotel	102	
bandb	104	
hotel	118
bandb	118*/



// global "map" variable
var mapGoogle;
var gMarkers = [];
var placeElements = [];	
var htmlMarkers = [];
var routeOverlay;
var gdir;
var aaMapPage='mapfinder';

/*infowindow route links*/
bolRedirectToRP=true;
bolShowVia=false;

//gaz search vars
var ajaxRequest = getXMLHttpRequest();
var output = new Array();
var error;
var containsError = false;
var database="B"; //default to UK

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.";



//FUNCTIONS

	
$(document).ready(function() {				   
	 //$("#mapTab > ul").tabs();
	// $("#mapTab > ul").tabs('disable', 1);
	 $("#searchPlace").keypress(searchFieldKeypress);


  $("ul#poiTypeList li input[type='checkbox']").click(function(){
    //addPOIJsonData(mapGoogle,center.lat(),center.lng(),"overlayMapMessage",118,false,'');
    doPOIClick(mapGoogle.getCenter(),$(this).val(),$(this).is(':checked'));
  });
  
  	$("#mapFinderLink a").click(function(event){
      event.preventDefault();

      //get map link
      var mapCenter=mapGoogle.getCenter();
      var mapZoom=mapGoogle.getZoom();
      
      var maplat=Math.floor( mapCenter.lat() *1000000)/1000000;
      var maplon=Math.floor( mapCenter.lng() *1000000)/1000000;
      //update url
      strMapURL='<a href="http://www.theaa.com/maps/index.jsp?lat=' + maplat 
  + '&lon=' + maplon + '&z=' + mapZoom + '">http://www.theaa.com/maps/index.jsp?lat=' + maplat + 
  '&lon=' + maplon + '&z=' + mapZoom + '</a>';
      
      //show
      $("#mapFinderURL").html(strMapURL);
      $("#mapFinderLinkText").toggle();

		});
		
		





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 GLargeMapControl());
	 mapGoogle.addControl(new GScaleControl());
	 mapGoogle.addControl(hc1);
	 
	 //uk
	 mapGoogle.setCenter(new GLatLng(54.522005, -3.083582), 5);
	 //london
	 //mapGoogle.setCenter(new GLatLng(51.50781,-0.12441), 10);

		

      /*mapGoogle.enableContinuousZoom();*/
	  mapGoogle.enableScrollWheelZoom();
	  
	//set up poi overlays
	aaPOImgr=new MarkerManager(mapGoogle);

	
	  
	  /*update/add pois on scroll*/
  GEvent.addListener(mapGoogle, "dragend", function() {
    callAddMapFinderPOIs();
  });
  /*remove any existing calls to pois*/
  GEvent.addListener(mapGoogle,"dragstart",function() {
    clearTimeout(poiCallTimer);
  });



		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); 
		}	 

    }
    // display a warning if the browser was not compatible with GMAPS
    else {
      //put in an alert...
    }
    
   
    
});


$(document).unload(GUnload);
	
	
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 setMapLocation(area)
{
  //clear overlays
  mapGoogle.clearOverlays();
	doGazSearch();
	fetchDestinationSensitiveAds(false);

}




//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("#searchPlace")){
	
		//go to first location
		populateField('#confirmPlace');
		goToGazResult();

 		 $('#fragment-1').attr("class","map-tabs-panel map-tabs-hide");
		 $('#fragment-2').attr("class","map-tabs-panel");
		 
		 //for each poitype selected, show markers
    addMapFinderPOIs();
    
    //show hotels bar
    populateHotelsBarGaz()
    
	};
	hideLoading();
;
}

function goToAndShowMarker()
{
//check for float
  var inpLat=parseFloat($("#inpLat").val()) || null;
  var inpLon=parseFloat($("#inpLon").val()) || 13;
  var inpZoom=parseInt($("#inpZoom").val()) || null;
  var inpPOIid=parseInt($("#inpPOIid").val()) || null;
  var inpPOIType=$("#inpPOIType").val()||null;
  var inpPOIName=$("#inpPoiName").val()||'';
  
  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(mapGoogle,inpLat,inpLon,inpPOIid,poiTypeID,true,true,inpPOIName);

      }
      else {
          var newGLocation=new GLatLng(inpLat, inpLon);
          mapGoogle.setCenter(newGLocation, inpZoom);
          addLocationMarker(newGLocation,'');
        }
    }


  
  //now clear inputs
  $("inpLat").attr("value",'');
  $("inpLon").attr("value",'');
}

function searchPlace(searchID)
{
	//clear any errors
	$("#searchPlace").css("background-color","#FFFFFF");
	
	getNewValues($(searchID).val());

	if(hasError())
	{
		$("#searchPlace").val(getError());
		$("#searchPlace").css("background-color","#FF9900");
		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, 13);
		
		//show hotels
		 populateHotelsBarGaz();
		 
		//and zoom to...
    addLocationMarker(newGLocation,placeName);
    
   

}

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, 13);
	
	populateHotelsBarGaz();
	
}


/** 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 = $('.searchPlace',$('#mapTab'));
 routeBtn.hide();

 if(routeBtn.parent().find("#ldImg").length==0)
 {
 routeBtn.parent().append($("<img id='ldImg' src='" + loadingImageURI + "' />"));
 }

}

/** hide the swirl image and show the Get Route button **/
function hideLoading() {
 var routeBtn = $('.searchPlace',$('#mapTab'));
 routeBtn.show();
 $('#ldImg').remove();
}


/** Keypress event handler for map search */
function searchFieldKeypress(e) {
 if(e.which == 13) {
	 //clear overlays
  	mapGoogle.clearOverlays();
 	doGazSearch();
	fetchDestinationSensitiveAds(false);
 }
}


function resetInputFields()
{
  //mapGoogle.clearOverlays();
  
	 // Delete the place text
	$("#searchPlace").css("background-color","#FFFFFF");
	$("#searchPlace").val("");
}

var poiCallTimer=0;

function callAddMapFinderPOIs()
{
  //set timeout to reduce calls
  if(poiCallTimer!=0) clearTimeout(poiCallTimer);

  poiCallTimer=setTimeout("addMapFinderPOIs()",800);
}

function addMapFinderPOIs() {  
  var center = mapGoogle.getCenter();
  var arrSelectedPOIType=new Array();
  if($("input#chkhotels").is(':checked')) arrSelectedPOIType.push(118);

  if($("input#chkrestaurants").is(':checked')) arrSelectedPOIType.push(100);

  
  //only do this if something is ticked
    for(i=0;i<arrSelectedPOIType.length;i++)
    {
      addPOIJsonData(mapGoogle,center.lat(),center.lng(),"overlayMapMessage",arrSelectedPOIType[i],false,'',false);
    }
}

function doPOIClick(center,poiTypeID,bolIsSelected)
{
   if(bolIsSelected)
   {
      addPOIJsonData(mapGoogle,center.lat(),center.lng(),"overlayMapMessage",poiTypeID,false,'',false);
      //zoom in to show POIs
      var currentZoomLevel=mapGoogle.getZoom();
      if(currentZoomLevel<11)
      {
        mapGoogle.setZoom(currentZoomLevel+2);
      }
   }
   else {
      //hide markers by type?
      removePOIsByPOIType(poiTypeID);
   }
}




function addLocationMarker(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); 
          });       
  }
  mapGoogle.addOverlay(locMarker);
} 

function hideSidebar()
{
  $('#route').hide();

  
  var center = mapGoogle.getCenter();
    $('#map').css('margin-left','10px');
  mapGoogle.checkResize();
	mapGoogle.setCenter(center);

}

function showSidebar()
{
  $('#route').show();
 
  var center = mapGoogle.getCenter();
  $('#map').css('margin-left','37.4em');
  mapGoogle.checkResize();
	mapGoogle.setCenter(center);
}
