



//map objects
var aaObjTraffic={}, aaObjParking={}, aaObjWeather={};

//var gMarkers = [];
//var placeElements = [];	
//var htmlMarkers = [];
//var routeOverlay;
//var gdir;
var aaMapPage='maphomepage';
var tileOverlayLocation = "http://www.theaa.com/images/route-planner/raster/";
	
//traffic vars
aaObjTraffic.name="traffic";
aaObjTraffic.map="";
aaObjTraffic.AATrafficData="/aaservlet/traffic";
aaObjTraffic.errorDivID="#errorMsg";
aaObjTraffic.trafficDateDivID="#dateTraffic";
aaObjTraffic.processingError=false;
aaObjTraffic.confirmID="confirmPlace";
aaObjTraffic.searchID="trafficPlace";

//parking vars
aaObjParking.name="parking";
aaObjParking.map="";
//aaObjParking.AATrafficData="/aaservlet/traffic";
aaObjParking.errorDivID="#errorParkingMsg";
//aaObjParking.trafficDateDivID="#dateTraffic";
aaObjParking.processingError=false;
aaObjParking.confirmID="confirmParkingPlace";
aaObjParking.searchID="parkingPlace";

//weather cars
aaObjWeather.name="weather";
aaObjWeather.map="";
aaObjWeather.searchID="weatherPlace";
aaObjWeather.confirmID="confirmWeatherPlace";
aaObjWeather.weatherContID="weatherList";
aaObjWeather.msgID="weatherMsg";


bolRedirectToRP=true; //infowindow links

parkingDisplayed=true;

//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";


//arrays of images for traffic markers
 trafficoverlay["0"] = "ov-0.png";
 trafficoverlay["5"] = "ov-5.png";
 trafficoverlay["10"] = "ov-10.png";
 trafficoverlay["15"] = "ov-15.png"; 
 trafficoverlay["20"] = "ov-20.png";
 trafficoverlay["25"] = "ov-25.png";
 

 //start locations (lat/lng/place/easting/northing)
var arrStartLocations=new Array(new Array('52.482905','-1.893298','Birmingham',407344,287229),new Array('53.7937','-1.752084','Bradford',416429,433072),new Array('51.45549','-2.59127','Bristol',359016,173117),new Array('51.481269','-3.180473','Cardiff',318125,176479),new Array('52.92175','-1.476021','Derby',435326,336168),new Array('55.949946','-3.187447','Edinburgh',325945,673622),new Array('55.866037','-4.256703','Glasgow',258878,665949),new Array('53.799607','-1.549116','Leeds',429795,433795),new Array('53.410841','-2.977593','Liverpool',335116,390894),new Array('51.50781','-0.12441','London',530129,179589),new Array('53.480724','-2.23448','Manchester',384537,398249),new Array('54.977869','-1.612398','Newcastle',424906,564873),new Array('51.587751','-2.998537','Newport',330920,188133),new Array('52.951886','-1.152471','Nottingham',457039,339728),new Array('53.757709','-2.703641','Preston',353707,429269),new Array('51.454954','-0.968722','Reading',471752,173396),new Array('53.383107','-1.464661','Sheffield',435706,387497),new Array('50.898134','-1.396814','Southampton',442516,111142));
 
var arrStartLocLength=arrStartLocations.length;
var selectedLoc=Math.floor((Math.random()*arrStartLocations.length));
var selectedStartLat=arrStartLocations[selectedLoc][0];
var selectedStartLng=arrStartLocations[selectedLoc][1];
var selectedStartPlace=arrStartLocations[selectedLoc][2];
var selectedStartE=arrStartLocations[selectedLoc][3];		
var selectedStartN=arrStartLocations[selectedLoc][4];	


//FUNCTIONS

	
$(document).ready(function() {				   
	 //$("#mapTab > ul").tabs();
	 // $("#mapTab > ul").tabs('disable', 1);
	 //$("#trafficPlace").keypress(searchFieldKeypress);
	 
	 $("a#newtrafficsearch").click(function() {
		//resetInputFields();
		$('#fragment-1').attr("class","map-tabs-panel");
		$('#confirmPlace').focus();
		$('#fragment-2').attr("class","map-tabs-panel map-tabs-hide");
		return false;
	}); 
	
	$("a#newparkingsearch").click(function() {
		//resetInputFields();
		$('#pkfragment-1').attr("class","map-tabs-panel");
		$('#confirmParkingPlace').focus();
		$('#pkfragment-2').attr("class","map-tabs-panel map-tabs-hide");
		return false;
	}); 
	
	$("a#newWeathersearch").click(function() {
		//resetInputFields();
		$('#wfragment-1').attr("class","map-tabs-panel");
		$('#confirmWeatherPlace').focus();
		$('#wfragment-2').attr("class","map-tabs-panel map-tabs-hide");
		return false;
	}); 
	
	 $("#closeChecks img").click(function() {
		$("#aa-parkinfo-container").toggle();
		$("#aa-parkinfo").html("<p>Loading...</p>");
		forceRepaint("hpRightCol");
		return false;
	}); 


if (GBrowserIsCompatible()) { 

      // Function to return the map tile
      var SbSTiles = function (a,b) { return TileToQuadKey(a.x,a.y,b); }

	   // 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
	 // aaMapTraffic = new GMap2(document.getElementById("map"), {mapTypes:[SbSMapType,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP]});
      aaObjTraffic.map = new GMap2(document.getElementById("mapTraffic"),{mapTypes:[SbSMapType]});
	  aaObjParking.map = new GMap2(document.getElementById("mapParking"),{mapTypes:[SbSMapType]});

     hc1 = new GHierarchicalMapTypeControl();

	 aaObjTraffic.map.addControl(new GSmallZoomControl3D);
	 aaObjTraffic.map.addControl(hc1);
	 aaObjParking.map.addControl(new GSmallZoomControl3D);
	 aaObjParking.map.addControl(hc1);
	 
	 //use cookie location if available
	 var cookieLoc=	$.cookie("trafficmap-loc");

	 if(cookieLoc!=""&&cookieLoc!=undefined&&cookieLoc!=null)
	 {
		var cookieZ=cookieLoc.substring(2,cookieLoc.indexOf("&"));
		var cookieLng=cookieLoc.substring(cookieLoc.indexOf("lng")+4,cookieLoc.length);
		var cookieLat=cookieLoc.substring(cookieLoc.indexOf("lat")+4,cookieLoc.indexOf("lng")-1);
		
		aaObjTraffic.map.setCenter(new GLatLng(cookieLat,cookieLng),parseInt(cookieZ,10));
	 }
	else {
		//random
		aaObjTraffic.map.setCenter(new GLatLng(selectedStartLat,selectedStartLng), 10);
	}

	aaObjParking.map.setCenter(new GLatLng(selectedStartLat,selectedStartLng), 10);
	
	aaObjTraffic.map.enableScrollWheelZoom();
	aaObjParking.map.enableScrollWheelZoom();
	
	//show traffic
	$poiTrafficMsgID=$("#overlayTrafficMapMessage"); 
	var overlayTrafficMapMessage= $poiTrafficMsgID[0];
	if (overlayTrafficMapMessage != null) {
		var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0,0));
		pos.apply(overlayTrafficMapMessage);
		aaObjTraffic.map.getContainer().appendChild(overlayTrafficMapMessage);
	} 
	
	$poiParkingMsgID=$("#overlayParkingMapMessage"); 
	var overlayParkingMapMessage=$poiParkingMsgID[0];
	if (overlayParkingMapMessage != null) {
		var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0,0));
		pos.apply(overlayParkingMapMessage);
		aaObjParking.map.getContainer().appendChild(overlayParkingMapMessage);
	} 
	
	
	getTrafficData(aaObjTraffic.AATrafficData,aaObjTraffic.map,$poiTrafficMsgID);


	//set up poi overlays
	 parkingmgr=new MarkerManager(aaObjParking.map);

	/*update/add parks on scroll or zoom*/
	
	/*remove any existing calls to car parks*/
	 GEvent.addListener(aaObjParking.map,"dragstart",function() {
		clearTimeout(parkingCallTimer);
	 }); 
	 
	GEvent.addListener(aaObjParking.map, "dragend", function() {
		if(aaObjParking.map.getZoom()>=11)
		{
			callCarParks(aaObjParking.map);
		}
	});
	
	GEvent.addListener(aaObjParking.map, "zoomend",function(oldLevel,newLevel) {
		clearTimeout(parkingCallTimer);
		if(newLevel>=11 && newLevel>oldLevel )
		{
		callCarParks(aaObjParking.map);
		}
	});


	 $(document).unload(GUnload); 
	
    } //end GBrowserCompatible
    //hide maps if the browser was not compatible with GMAPS
    else {
      $("#mapParking, #mapTraffic").css("display","none");
	  
    }
    
   
   
}); 




	
	
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,map)
{
	//inputs
	//zoom level arbitrary here?
	 map.setCenter(new GLatLng(lat, lon), zoom);	
}

function setMapLocation(area,aaobj)
{
	//clear overlays
	if(aaobj.map!="")
	{
		aaobj.map.clearOverlays();
	}
	doGazSearch(aaobj);
}




//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	
				containsError = true;
				error="Error finding place - try again later.";
			}
		}
}

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(aaObj)
{
	if(aaObj.name=="traffic")
	{
		var $routeBtn = $('.getTraffic','#fragment-1');
		processingError=false; // reset
		$('#confirmPlace').html("");
		//display loading gif
		
		showLoading($routeBtn);
		// search from and to
		if(searchPlace("#trafficPlace")){
			//go to first location
			populateField('#' + aaObj.confirmID);
			goToGazResult(aaObj.map);

			 $('#fragment-1').attr("class","map-tabs-panel map-tabs-hide");
			 $('#fragment-2').attr("class","map-tabs-panel");
			 $('#confirmPlace').focus();
		};
		hideLoading($routeBtn);
	}
	else if (aaObj.name=="parking")
	{
		var $routeBtn = $('.getParking','#pkfragment-1');
		processingError=false; // reset
		$('#pkconfirmPlace').html("");
		//display loading gif
		
		showLoading($routeBtn);
		// search from and to
		if(searchPlace("#parkingPlace")){
			//go to first location
			populateField('#' + aaObj.confirmID);
			goToGazResult(aaObj.map);

			 $('#pkfragment-1').attr("class","map-tabs-panel map-tabs-hide");
			 $('#pkfragment-2').attr("class","map-tabs-panel");
			 $('#confirmParkingPlace').focus();
		};
		hideLoading($routeBtn);
	}
	else if (aaObj.name=="weather")
	{
		var $routeBtn = $('.getWeather','#wfragment-1');
		processingError=false; // reset
		$('#wconfirmPlace').html("");
		
		//display loading gif
		
		showLoading($routeBtn);
		
		$('#weatherCarousel').css("display","none");
		$('#weatherList').html("");
		$('#weatherMsg').html("<p>Finding location...</p>").css("display","block");


		// search from and to
		if(searchPlace("#weatherPlace")){
			//go to first location
			populateField('#' + aaObj.confirmID);
			
			//getWeather
			getWeatherResult();
			//goToGazResult(aaObj.map);

			 $('#wfragment-1').attr("class","map-tabs-panel map-tabs-hide");
			 $('#wfragment-2').attr("class","map-tabs-panel");
			 $('#confirmWeatherPlace').focus();
		}
		else {
			$('#weatherMsg').html('<p><a href="" onclick="hideElem(event,' + "'weatherMsg'" + ');return false;" id="closeWeatherMsg"><img width="10" height="10" src="/images/traffic/btn-10-close.gif" alt="Close message"></a>Please try another location.</p>');
		}
		hideLoading($routeBtn);
	}
	
	
}


function searchPlace(searchID)
{
	//clear any errors
	$search=$(searchID);
	$search.css("background-color","#FFFFFF");
	
	getNewValues($search.val());

	if(hasError())
	{
		$search.val(getError());
		$search.css("background-color","#FF9900");
		processingError=true;

		return false;
	} else {
		// clear any error colours
		//setWhiteBG(searchField);
	}
	//return boolean if search ok
	return true;
}

function goToGazResult(map)
{
		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)
		map.setCenter(newGLocation, 13);
		
		//and zoom to...
		addLocationMarker(newGLocation,placeName,map);

}

function populateField(resField)
{
	//reset options
	//resField.options.length=0;
	var res = getResults();
	var options="";
	var strShortPlace='';
	for(cnt = 0; cnt < res.length; cnt++)
	{
		var optn = new Option();
		strShortPlace=res[cnt][0];
		if(strShortPlace.length>30) strShortPlace=strShortPlace.substring(0,27)+'...';
		optn.text = strShortPlace;
		optn.value = res[cnt][1];
		options += '<option value="' + optn.value + '">' + optn.text  + '</option>';
	}
	$(resField).html(options);
}


function goToDropDown(aaObj)
{
	//currently assuming only one pair EN
	//var selectedOption=$("#confirmPlace").val().split("|");
	var selectedOption=$("#" + aaObj.confirmID).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)
	aaObj.map.setCenter(newGLocation, 13);	
	
	//
	addLocationMarker(newGLocation,placeName,aaObj.map);
}

function getWeatherDropDown(aaObj)
{
	var selectedOption=$("#" + aaObj.confirmID).val().split("|");
	var placeName=selectedOption[1];
	var placeEasting=selectedOption[3];
	var placeNorthing=selectedOption[4];
	
	getWeatherByLocation(placeNorthing,placeEasting,placeName)
	
}


/** 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($submitBtn) {
	$submitBtn.css({"background-position": 'center -20px'}); 
}

/** hide the swirl image and show the Get Route button **/
function hideLoading($submitBtn) {
	$submitBtn.css({"background-position": 'center top'}); 
}


/** Keypress event handler for map search */
/*
function searchFieldKeypress(e) {
 if(e.which == 13) {
	 //clear overlays
  	aaObjTraffic.map.clearOverlays();
 	doGazSearch();
 }
}
*/

function resetInputFields()
{
	 // Delete the place text
	$("#trafficPlace").css("background-color","#FFFFFF");
	$("#trafficPlace").val("");
}


function addLocationMarker(point,loctitle,map)
{
 var locMarker=new GMarker(point,{title:loctitle});
 /*if(loctitle!='')
 {
  GEvent.addListener(locMarker, 'click', function() {  
            // When clicked, open an Info Window  
            locMarker.openInfoWindowHtml("<div style='width:100px;'>" + loctitle + "</div>",{maxWidth:"160"}); 
          });       
  }*/
  map.addOverlay(locMarker);
} 

function forceRepaint(selectedID)
{
 //force IE to repaint
 if (navigator.appName == 'Microsoft Internet Explorer')
 {
 $("#" + selectedID).removeClass("repaint").addClass("repaint");
 }
} 

function findMe()
{
	
	if (navigator.geolocation) {
			// navigator.geolocation.getCurrentPosition(success, fail, options);
			navigator.geolocation.getCurrentPosition(function(position) {
				aaObjParking.map.setCenter(new GLatLng(position.coords.latitude,position.coords.longitude), 10);
				
				if(cookieLoc==""||cookieLoc==undefined||cookieLoc==null)
				{
					aaObjTraffic.map.setCenter(new GLatLng(position.coords.latitude,position.coords.longitude), 10);
				}
			});
	}
}

function getWeatherResult()
{
		var res = getResults();
  		var resOutput=res[0][1];
		var gazOutput=resOutput.split("|");
		var placeName=gazOutput[1];
		var placeEasting=gazOutput[3];
		var placeNorthing=gazOutput[4];

	getWeatherByLocation(placeNorthing,placeEasting,placeName)
		
}

function getXMLHttpRequest() {
  var xmlHttpRequest=null;
  try {
	if (window.XMLHttpRequest){
		// Firefox, Opera 8.0+, Safari, Internet Explorer 7
		xmlHttpRequest=new XMLHttpRequest();
	} else {
    // Other Internet Explorer
    xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
	}
  } catch (e) {
	xmlHttpRequest=null;
  }

return xmlHttpRequest;
}

