	/* CONSTANTS */
	zoom1 = 5;  
	zoom2 = 9;
	zoom3 = 12;
	zoom4 = 14;
	zIn = "in";
	zOut = "out";
	
	postcode = unescape(gup('postcode'));
	placename = unescape(gup('placename'));
	maptypeForm = unescape(gup('maptypeForm'));
	/* END CONSTANTS */

	/* Initialise Map*/
	
	
	var map;
	var zoomLevel = zoom1;
	var tileLayerOverlayMobile;
	var tileLayerOverlayMBB;
	var tileLayerOverlay;
	var marker = "temp";
	var geocoder = new GClientGeocoder();
	geocoder.setBaseCountryCode("uk");
	var coverageTypeToSearch = 'mobile';
	
	var activeResultList = [null, null, null];
	
	var googleajaxcomplete;
	var coverageajaxcomplete;
	var congestionText = false;
	

	

	
	/**********************************************************************
	 *
	 *		Coverage Checker Column Controls
	 *
	 **********************************************************************/ 
	

	
	
	
	
	$(document).ready(function(){
				
		var location = null;
		if (postcode != null && postcode.length > 0) {
			location = postcode;
		}
		else if (placename != null && placename.length > 0) {
			location = placename;
		}
		else if(readCookie("CoveragePostcode")){
			location = readCookie("CoveragePostcode");
		}
		else if(readCookie("CoverageAddress")){
			location = readCookie("CoverageAddress");
		}
		
		//This enables the correct radio box to be selected before a value is inputted.
		if(maptypeForm && maptypeForm!='mobile'){
			$('input[name="infoChoice"]').filter('[value=voice]').attr('checked', false);
			$('input[name="infoChoice"]').filter('[value=mbb]').attr('checked', true);
		}		
			
		if(location){
			$("input#inputBox").val(location);
			var type = 'voice';
			$('input[name="infoChoice"]').filter('[value=voice]').attr('checked', true);

			if(maptypeForm && maptypeForm!='mobile'){
				$('input[name="infoChoice"]').filter('[value=voice]').attr('checked', false);
				$('input[name="infoChoice"]').filter('[value=mbb]').attr('checked', true);
				type = 'mbb';
			}
			showLocation(location, type, true);
		}
		
		var firstFocus = true;
		$("#inputBox").bind('click',function(){
			if(firstFocus){
				firstFocus = false;
				$(this).val('');
			}
		});
		$("#inputBox").bind('keypress',  function(event){
			if(event.which == 13){
				searchClicked();
				return false;
			}
			
		});
		
		$('.checkCoverageLink').bind('click', function(){
			var location = $(this).parent().siblings('.mainPanel').find('.location').html();
			var coverageType = $(this).find('.altCoverageType').html();
			if(coverageType == "phone"){
				coverageType = 'voice';
			}
			else {
				coverageType = 'mbb';
			}
			showLocation(location, coverageType, true);
			return false;
		});
		$('.CSElement-CovCheckBlueRateButton a').bind('click', function(){loadRatingsForm();return false;});
		
		
		$('#searchResultPanel_0 .deleteButton').bind('click', function(){deleteResult(0);});
		$('#searchResultPanel_1 .deleteButton').bind('click', function(){deleteResult(1);});
		$('#searchResultPanel_2 .deleteButton').bind('click', function(){deleteResult(2);});
		
		$('#searchResultPanel_0 .expandButton').bind('click', function(){openResultPanelAndCentreMap(0);});
		$('#searchResultPanel_1 .expandButton').bind('click', function(){openResultPanelAndCentreMap(1);});
		$('#searchResultPanel_2 .expandButton').bind('click', function(){openResultPanelAndCentreMap(2);});
		
		$('#searchResultPanel_0 .locationBox .location').bind('click', function(){openResultPanelAndCentreMap(0)});
		$('#searchResultPanel_1 .locationBox .location').bind('click', function(){openResultPanelAndCentreMap(1)});
		$('#searchResultPanel_2 .locationBox .location').bind('click', function(){openResultPanelAndCentreMap(2)});
		
		$('#searchResultPanel_0 .shrinkButton').bind('click', function(){closeResultPanel(0);});
		$('#searchResultPanel_1 .shrinkButton').bind('click', function(){closeResultPanel(1);});
		$('#searchResultPanel_2 .shrinkButton').bind('click', function(){closeResultPanel(2);});
		
		$('#resultsPanel .mainPanel .locationBox .location').addClass('linkPointer');
		$('#resultsPanel .mainPanel .locationBox .location').addClass('underline');
		$('#searchPanel').append('<div id="loadingCoverage">Loading coverage information...</div>');
		$('#searchPanel #loadingCoverage').hide();
		setUpHelp();
		
		$('.Functional_App-CoverageChecker2010 #heading .subText').html('Come back here regularly to see what\'s happening on our network');
		
		
	});
	

	
	function loadRatingsForm(){
		$('html, body').animate({
		scrollTop: $("#innerCenter").offset().top
		}, 750);
		$("iframe").src("/_standalone/Ratings", function(iframe, duration) {
			$('#rateNetworkDrop').slideDown('slow', function() {
		  });
		}, {
		  timeoutDuration: 10000
		});

	}
	
	function closeRatingsForm(){
		$('#rateNetworkDrop').slideUp('slow', function() {
		  });
	}
	
	function searchClicked(){
			hideSearchError();
			if(hasNullValues(activeResultList)){
					showLocation($("input#inputBox").val(), $("input[name='infoChoice']:checked").val(), true);
			} else{
				disableSearchPanel();
				$('#loadingCoverage').hide();
			}
			
			
	}

	
	
	function alreadySearched(newSearch){
		var searchExists = -1;
		for(var i in activeResultList){
			var result = activeResultList[i];
			if(result){
				if(result.locationValue == newSearch){
					searchExists = i;
					break;
				}
			}else{
				break;
			}
		}
		return searchExists;
	}

	function getNetworkCoverage(searchValue, searchType){
		$('#loadingCoverage').show();
		//alert("You search for '" + searchValue +"' in a '" + searchType +"' search.");
		
		//ajax call to web service to get location coverage details
		var searchResponse = false;
		$.ajax({
				type: "GET",
				url: "/maintenance/coveragechecker?postcode="+searchValue+"&text=json&channel="+searchType,
				dataType: "json",
				success: function(json) {
					searchResponse = json;
					if(searchResponse != false && !searchResponse.error){
						
						//searchResponse.locationValue = searchValue;
						searchResponse.coverageType = searchType;
						var activeSearchPosition = alreadySearched(searchResponse.locationValue);
						if(googleajaxcomplete)
						{
							if(searchResponse.congestion)
							{
								marker.openExtInfoWindow(
								  map,
								  "customMapInfo",
								  searchResponse.congestion.bodytext,
								  {beakOffset: 0}
								);
								congestionText = searchResponse.congestion.bodytext;
							}
							
						}
						coverageajaxcomplete = true;
						
						if(activeSearchPosition==-1){
							addNewResult(searchResponse);
						} else{
							updateExistingResult(activeSearchPosition, searchResponse);
						}
						$('#loadingCoverage').hide();
					} else{
						setCoverageMessage(searchValue, searchType, "Please check the map for coverage information for this location.");
						$('#loadingCoverage').hide();
					}
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					setCoverageMessage(searchValue, searchType, "Please check the map for coverage information for this location.");
					$('#loadingCoverage').hide();
				}
			});
	}
	function setCoverageMessage(searchValue, searchType, message){
		//alert("You search for '" + searchValue +"' in a '" + searchType +"' search.");
		
		if(searchValue!=null && validateFullPostCode(searchValue)!=null)
		{
			searchValue = formatPostcode(searchValue);
		}
		
		//ajax call to web service to get location coverage details
		var searchResponse = { 
			coverageType: searchType,
			locationValue: searchValue,
			error: false,
			coverage: { 
				headline: "", 
				bodytext: message
			}
		};
		
		if(searchResponse != false && !searchResponse.error){
			searchResponse.locationValue = searchValue;
			searchResponse.coverageType = searchType;
			var activeSearchPosition = alreadySearched(searchResponse.locationValue);
			if(activeSearchPosition==-1){
				addNewResult(searchResponse);
			} else{
				updateExistingResult(activeSearchPosition, searchResponse);
			}
		} else{
			showSearchError();
		}
	}
	
	function trim(stringToTrim) {
		return stringToTrim.replace(/^\s+|\s+$/g,"");
	}

	
	function formatPostcode(searchValue) {
		searchValue = trim(searchValue);
		
		var pos = searchValue.indexOf(" ");
		var length = searchValue.length;
		var postcodeStr = searchValue;

		if(pos<0)
		{
			postcodeStr = searchValue.substring(0,length-3) + " " + searchValue.substring(length-3,length);
		}
		
		return postcodeStr.toUpperCase();
	}
	
	function updateExistingResult(position, result){
		populateResultPanel(position, result);
		openResultPanel(position);
	}
	function addNewResult(result){
		$("#resultsPanel").show();
		for(var i = activeResultList.length - 2; i>=0; i--){
			var currentResult = activeResultList[i];
			if(currentResult){
				populateResultPanel(i+1, currentResult);
			} else{
				hideResultPanel(i+1);
			}
		}
		populateResultPanel(0, result);
		openResultPanel(0);
		checkActiveResultsLength();
	}
	function deleteResult(index){
		var resultPanel = "#searchResultPanel_" + index;
		for(var i = index; i< activeResultList.length -1; i++){
			var resultToDisplay = activeResultList[i+1];
			if(resultToDisplay){
				populateResultPanel(i, resultToDisplay);
			} else{
				hideResultPanel(i);
			}
		}
		hideResultPanel(activeResultList.length -1);
		checkActiveResultsLength();
	}
	function checkActiveResultsLength(){
		if(!hasNullValues(activeResultList)){
			disableSearchPanel();
		} else {
			var enabledMessage = 'Enter a postcode or place name to check coverage in your area.';
			var defaultBackground = true;
			if(hasAnyValues(activeResultList)){
				enabledMessage = "You can search up to 3 postcodes or place names.";
				defaultBackground = false;
			}
			enableSearchPanel(enabledMessage, defaultBackground);
		}
	}
	function disableSearchPanel(){
		$("#inputBox").val('');
		$("#inputBox").attr('disabled', 'disabled');
		$("input[name='infoChoice']").attr('disabled', 'disabled');
		$("#userInformationText").removeClass('greenBackground');
		$("#userInformationTriangle").removeClass('greenTriangle');
		$("#userInformationText").addClass('yellowBackground');
		$("#userInformationTriangle").addClass('yellowTriangle');
		$("#userInformationText").html('You can only have 3 searches please delete one first.');
		$("#userInformationTriangle").removeClass('greenTriangle');
		$("#state").addClass('disabled');
		$("#state").removeClass('normal');
	}

	function enableSearchPanel(userInformationText, defaultBackground){
		$("#inputBox").removeAttr('disabled');
		$("input[name='infoChoice']").removeAttr('disabled');
		$("#state").addClass('normal');
		$("#state").removeClass('disabled');
		if(defaultBackground){
			$("#userInformationText").addClass('greenBackground');
			$("#userInformationTriangle").addClass('greenTriangle');
			$("#userInformationText").removeClass('yellowBackground');
			$("#userInformationTriangle").removeClass('yellowTriangle');
		} else{
			$("#userInformationText").removeClass('greenBackground');
			$("#userInformationTriangle").removeClass('greenTriangle');
			$("#userInformationText").addClass('yellowBackground');
			$("#userInformationTriangle").addClass('yellowTriangle');
		}
		$("#userInformationText").html(userInformationText)
	}
	function openResultPanelAndCentreMap(index){
		for(var i = 0; i < 3; i++){
			if(i!=index){
				closeResultPanel(i);
			}
		}
		var resultPanel = "#searchResultPanel_" + index;
		$(resultPanel + " .expandButton").hide();
		$(resultPanel + " .topExpansionPanel").slideDown('slow');
		$(resultPanel + " .bottomExpansionPanel").slideDown('slow');
		var location =  $(resultPanel +  ' .location').html();
		var coverageType = $(resultPanel +  ' .coverageType').html();
		if(coverageType == "phone"){
			coverageType = 'voice';
		}
		else {
			coverageType = 'mbb';
		}
		showLocation(location, coverageType, false);
		
	}
	function openResultPanel(index){
		for(var i = 0; i < 3; i++){
			if(i!=index){
				closeResultPanel(i);
			}
		}
		var resultPanel = "#searchResultPanel_" + index;
		$(resultPanel + " .expandButton").hide();
		$(resultPanel + " .topExpansionPanel").slideDown('slow');
		$(resultPanel + " .bottomExpansionPanel").slideDown('slow');		
	}
	function closeResultPanel(index){
		var resultPanel = "#searchResultPanel_" + index; 
		$(resultPanel + " .bottomExpansionPanel").slideUp('slow');
		$(resultPanel + " .topExpansionPanel").slideUp('slow', function(){
			$(resultPanel + " .expandButton").show();
		});
		
	}
	function hideResultPanel(index){
		var resultPanel = "#searchResultPanel_" + index;
		activeResultList[index] = null;
		$(resultPanel).hide();
	}
	function populateResultPanel(index, result){
	
		activeResultList[index] = result;
		
		var resultPanel = "#searchResultPanel_" + index;
		var altCoverageType = "phone";
		var coverageType = "Broadband";
		if(result.coverageType != "mbb"){
			altCoverageType = "Broadband";
			coverageType = "phone";
		}
		$(resultPanel + " .coverageType").html(coverageType);
		
		$(resultPanel + " .altCoverageType").html(altCoverageType);
		$(resultPanel + " .location").html(result.locationValue);
		
		if(result.coverage){
			$(resultPanel + " .coverageTitle").html(result.coverage.headline);
			$(resultPanel + " .coverageDetails").html(result.coverage.bodytext);
			$(resultPanel + " .coveragePanel").show();
		} else{
			$(resultPanel + " .coveragePanel").hide();
		}
		if(result.congestion){
			$(resultPanel + " .congestionText").html(result.congestion.bodytext);
			$(resultPanel + " .congestionPanel").show();
		}else{
			$(resultPanel + " .congestionPanel").hide();
		}
		if(result.maintenance){
			$(resultPanel + " .maintenanceTitle").html(result.maintenance.headline);
			$(resultPanel + " .maintenanceDetails").html(result.maintenance.bodytext);
			$(resultPanel + " .maintenancePanel").show();
		}else{
			$(resultPanel + " .maintenancePanel").hide();
		}
		$(resultPanel + " .topExpansionPanel").hide();
		$(resultPanel + " .bottomExpansionPanel").hide();
		$(resultPanel + " .expandButton").show();
		$(resultPanel).show();
	}

	function showSearchError(){
		$('#searchError').css('visibility','visible');
	}

	function hideSearchError(){
		$('#searchError').css('visibility','hidden');
	}

	function hasNullValues(array){
		var hasNull = false;
		for(var i in array){
			var element = array[i];
			if(!element && element==null){
				hasNull = true;
				break;
			}
		}
		return hasNull;
	}
	function hasAnyValues(array){
		var hasValues = false;
		for(var i in array){
			var element = array[i];
			if(element){
				hasValues = true;
				break;
			}
		}
		return hasValues;
	}
	
	/**********************************************************************
	 *
	 *		Coverage Checker Map Functionality
	 *
	 **********************************************************************/ 
	
	function gup( name )
	{
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp( regexS );
	  var results = regex.exec( window.location.href );
	  if( results == null )
	    return "";
	  else
	    return results[1];
	}

	function validatePostCode( postCode )
	{
		var regexS_Full = "[a-zA-Z]{1,2}[0-9]{1,2}[0-9a-zA-Z]?[0-9][a-zA-Z]{2}$";
		var regexS_Half = "[a-zA-Z]{1,2}[0-9]{1,2}$";
		var regex_Full = new RegExp( regexS_Full );
		var regex_Half = new RegExp( regexS_Half );
		var cleanPostCode = postCode.replace(new RegExp(" ", "g" ), '');
	  var results1 = regex_Full.exec( cleanPostCode );
	  var results2 = regex_Half.exec( cleanPostCode );
	  if( results2 == null && results1 == null )
			return null;
		else
		  return 'valid';
	}
	
	function validateFullPostCode( postCode )
	{
		var regexS_Full = "[a-zA-Z]{1,2}[0-9]{1,2}[0-9a-zA-Z]?[0-9][a-zA-Z]{2}$";
		var regex_Full = new RegExp( regexS_Full );
		var cleanPostCode = postCode.replace(new RegExp(" ", "g" ), '');
	  var results1 = regex_Full.exec( cleanPostCode );
	  if(results1 == null )
			return null;
		else
		  return 'valid';
	}
	
	function TextualZoomControl() {
	}
	TextualZoomControl.prototype = new GControl();
	TextualZoomControl.prototype.initialize = function(map) {
		var container = document.createElement("div");

		var panDiv = document.createElement("img");
		panDiv.src = "/static/images/functional_apps/coverage/panZoomControls.png";
		panDiv.style.width = "59px";
		panDiv.style.height = "110px";
		container.appendChild(panDiv);

		var panNdiv = document.createElement("div");
		panNdiv.style.width = "18px";
		panNdiv.style.height = "15px";
		panNdiv.style.position = "absolute";
		panNdiv.style.left = "20px";
		panNdiv.style.top = "3px";
		panNdiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			panNdiv.style.backgroundColor = "white";
			panNdiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(panNdiv);
		GEvent.addDomListener(panNdiv, "click", function() {panN();});
		
		var panSdiv = document.createElement("div");
		panSdiv.style.width = "18px";
		panSdiv.style.height = "15px";
		panSdiv.style.position = "absolute";
		panSdiv.style.left = "20px";
		panSdiv.style.top = "37px";
		panSdiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			panSdiv.style.backgroundColor = "white";
			panSdiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(panSdiv);
		GEvent.addDomListener(panSdiv, "click", function() {panS();});
		
		var panEdiv = document.createElement("div");
		panEdiv.style.width = "12px";
		panEdiv.style.height = "18px";
		panEdiv.style.position = "absolute";
		panEdiv.style.left = "40px";
		panEdiv.style.top = "19px";
		panEdiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			panEdiv.style.backgroundColor = "white";
			panEdiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(panEdiv);
		GEvent.addDomListener(panEdiv, "click", function() {panE();});
		
		var panWdiv = document.createElement("div");
		panWdiv.style.width = "12px";
		panWdiv.style.height = "18px";
		panWdiv.style.position = "absolute";
		panWdiv.style.left = "7px";
		panWdiv.style.top = "19px";
		panWdiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			panWdiv.style.backgroundColor = "white";
			panWdiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(panWdiv);
		GEvent.addDomListener(panWdiv, "click", function() {panW();});
		
		var zoomInDiv = document.createElement("div");
		zoomInDiv.style.width = "19px";
		zoomInDiv.style.height = "21px";
		zoomInDiv.style.position = "absolute";
		zoomInDiv.style.left = "20px";
		zoomInDiv.style.top = "65px";
		zoomInDiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			zoomInDiv.style.backgroundColor = "white";
			zoomInDiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(zoomInDiv);
		GEvent.addDomListener(zoomInDiv, "click", function() {zoom("in");});

		var zoomOutDiv = document.createElement("div");
		zoomOutDiv.style.width = "19px";
		zoomOutDiv.style.height = "21px";
		zoomOutDiv.style.position = "absolute";
		zoomOutDiv.style.left = "20px";
		zoomOutDiv.style.top = "87px";
		zoomOutDiv.style.cursor = "pointer";
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			zoomOutDiv.style.backgroundColor = "white";
			zoomOutDiv.style.filter = "alpha(opacity=1)";
		}
		container.appendChild(zoomOutDiv);
		GEvent.addDomListener(zoomOutDiv, "click", function() {zoom("out");});

		map.getContainer().appendChild(container);
		return container;
	}
	TextualZoomControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
	}

	function initMap() {
		google.load("search", "1");
	
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map"));
			map.setCenter(new GLatLng(55.5, -4.0), zoom1);
			map.disableDoubleClickZoom();
	
			var tileLayer = new GTileLayer(new GCopyrightCollection("3"), zoom1, zoom4);
			tileLayer.getOpacity = function () { return 1.0; };
			tileLayer.isPng = function () { return true; };
			tileLayer.getTileUrl = function (tile, zoom) { 
				var coverageTypeFolder = "Mobile/";
				if(coverageTypeToSearch != 'voice'){
					coverageTypeFolder = "MBB/"
				}
				var coveragePath = "/static/images/functional_apps/coverage/" + coverageTypeFolder;
				var ymax = 1 << zoom;
				var y = ymax - tile.y -1;
			    if (zoom == 5 && tile.x >= 14 && tile.x <= 16 && y >= 20 && y <= 22) {
			      return coveragePath + zoom + "/" + tile.x + "/" + y + ".png";
			    } else if (zoom == 9 && tile.x >= 242 && tile.x <= 260 && y >= 337 && y <= 366) {
			      return coveragePath + zoom + "/" + tile.x + "/" + y + ".png";
			    } else if (zoom == 12 && tile.x >= 1940 && tile.x <= 2083 && y >= 2702 && y <= 2929) {
			      return coveragePath + zoom + "/" + tile.x + "/" + y + ".png";
			    } else if (zoom == 14 && tile.x >= 7765 && tile.x <= 8335 && y >= 10810 && y <= 11718) {
			      return coveragePath + zoom + "/" + tile.x + "/" + y + ".png";
			    } else {
			      return "/static/images/functional_apps/coverage/transparentTile.gif";
			    }
			};
			tileLayerOverlay = new GTileLayerOverlay(tileLayer);
			map.addOverlay(tileLayerOverlay);
	
			/* Go through the zoom levels to force some of the layers */
			map.setCenter(new GLatLng(55.5, -4.0), zoom4);
			map.setCenter(new GLatLng(55.5, -4.0), zoom3);
			map.setCenter(new GLatLng(55.5, -4.0), zoom2);
			map.setCenter(new GLatLng(55.5, -4.0), zoom1);
			map.addControl(new TextualZoomControl());
			GEvent.addListener(map, "dragstart", function() {
					closeError();
				});
			}
			//TODO create help overlay same as previously
			//setUpHelp();
	  }

	function removeLayer()
	{
		map.removeOverlay(tileLayerOverlay);
	}
	
	function showLayer()
	{
		map.addOverlay(tileLayerOverlay);
	}
	  
	function zoom(direction) {
		var currentLat = map.getCenter();
		setZoomLevel(direction);
		map.setCenter(currentLat, zoomLevel);
	}
	
	function zoomTo(level) {
		map.setCenter(map.getCenter(), level);
		zoomLevel = level;
	}
	
	function setZoomLevel(direction)
	{
		//Get the map's actual zoom in case it's not at one of the four presets
		var currentZoom = map.getZoom();
		if (direction == zIn)
		{
			if (currentZoom < zoom1) {
				zoomLevel = zoom1;
			}
			else if (currentZoom < zoom2) {
				zoomLevel = zoom2;
			}
			else if (currentZoom < zoom3) {
				zoomLevel = zoom3;
			}
			else if(currentZoom < zoom4){
				zoomLevel = zoom4;
			}
			else{
				showErrorFade("It's not possible to zoom any further");
			}
		}
		else if (direction == zOut) {
			if (currentZoom > zoom4) {
				zoomLevel = zoom4;
			}
			else if (currentZoom > zoom3) {
				zoomLevel = zoom3;
			}
			else if (currentZoom > zoom2) {
				zoomLevel = zoom2;
			}
			else if (currentZoom > zoom1){
				zoomLevel = zoom1;
			}
			else{
				showErrorFade("It's not possible to zoom any further");
			}
		}
	}
    
	function panN ()
	{
		map.panDirection(0,+1);
	}
    
	function panS ()
	{
		map.panDirection(0,-1);
	}
    
	function panE ()
	{
		map.panDirection(-1,0);
	}
    
	function panW ()
	{
		map.panDirection(+1,0);
	}

	function overlayNone() {
		currentmarker = marker;
		map.clearOverlays();

		if (marker != "temp")
		{
			map.addOverlay(currentmarker);
		}
	}

	function overlayMobile() {
		currentmarker = marker;
		map.clearOverlays();

		if (marker != "temp") {
			map.addOverlay(currentmarker);
		}
		map.addOverlay(tileLayerOverlayMobile);
	}

	function overlayMBB() {
		currentmarker = marker;
		map.clearOverlays();

		if (marker != "temp") {
			map.addOverlay(currentmarker);
		}
		map.addOverlay(tileLayerOverlayMBB);
	}

	function markPoint(point) {
		if (marker != "temp")
		{
			map.removeOverlay(marker);
		}
		map.setCenter(point, zoomLevel);
		zoomTo(zoom4);
		marker = new GMarker(point);
		map.addOverlay(marker);
		if(coverageajaxcomplete)
		{
			if(congestionText != false)
			{
				marker.openExtInfoWindow(
				  map,
				  "customMapInfo",
				  "congestionText",
				  {beakOffset: 0}
				);
			}
			
		}
		googleajaxcomplete = true;
	}

	function showPointFromMulti(lat, lon, address, type) {
		var point = new GLatLng(lat, lon);
		markPoint(point);
		document.getElementById("multi-addresses").style.display="none";
		document.getElementById("multi-addresses").innerHTML="";
		setCoverageMessage(address, type, "To get more detailed information please search again for a specific postcode.");
	}

	function showAddress(address, type, lookup) {
		if (geocoder) {
			geocoder.getLocations(address + ",uk",function(response) {
				var addresses = "";
				var point;
				if (response && response.Status.code == 200) {
					/*-- Set Omniture Tracking for tool completion --*/
					s.events = "event6";
					s.eVar14 = address;
					s.t();
					
					if (response.Placemark.length == 1) {
						if(lookup){
							setCoverageMessage(address, type, "To get more detailed information please search again for a specific postcode.");
						}
						point = new GLatLng(response.Placemark[0].Point.coordinates[1], 
						response.Placemark[0].Point.coordinates[0]);
						markPoint(point);
						geocoder.getLocations(point,function(jsonResp) {
							var partialPostcode = jsonResp.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
							eraseCookie("CoverageAddress");
							eraseCookie("CoveragePostcode");
							createCookie("CoverageAddress",address,0);
						});
					} else {
						for (var i=0;i<response.Placemark.length;i++) {
							addresses += "<a href=\"#\" onclick=\"javascript:showPointFromMulti(" + 
							response.Placemark[i].Point.coordinates[1] + "," +
							response.Placemark[i].Point.coordinates[0] + ",'"+response.Placemark[i].address+"','"+type+"')\" >" +
							response.Placemark[i].address + "</a><br/>";
						}
						$("#multi-addresses").html(addresses);
						$('#multi-addresses').fadeIn();
					}
				} else {
					showSearchError();
				}
			});
		}
	}    

	function showPostcode(location,type, full, lookup) {
		var postcode = location.replace(/^\s*|\s*$/,"");
   		localSearch = new google.search.LocalSearch();
		localSearch.setSearchCompleteCallback(null,
			function() {
				
				if (localSearch.results[0]) {
					if(!full)
					{
						if(lookup){
							setCoverageMessage(location, type, "To get more detailed information please search again for a specific postcode.");
						}
					}
					else
					{
						if(lookup){
							getNetworkCoverage(location, type);
						}
					}
					/*-- Set Omniture Tracking for tool completion --*/
					s.events = "event6";
					s.eVar14 = postcode;
					s.t();
					
					
					var resultLat = localSearch.results[0].lat;
					var resultLng = localSearch.results[0].lng;
					var point = new GLatLng(resultLat,resultLng);
					markPoint(point);
					eraseCookie("CoverageAddress");
					eraseCookie("CoveragePostcode");
					createCookie("CoveragePostcode",postcode,0);
				}else{
					geocoder.getLatLng(
						postcode + ",uk",
						function(point) {
							if (point) {
								if(!full)
								{
									if(lookup){
									setCoverageMessage(location, type, "To get more detailed information please search again for a specific postcode.");}
								}
								else
								{
									if(lookup){
									getNetworkCoverage(location, type);}
								}
								/*-- Set Omniture Tracking for tool completion --*/
								s.events = "event6";
								s.eVar14 = postcode;
								s.t();
								
								markPoint(point);
								eraseCookie("CoverageAddress");
								eraseCookie("CoveragePostcode");
								createCookie("CoveragePostcode",postcode,0);
							}
							else {
								showSearchError();
							}
						}
					);
				}
			}
		);
		localSearch.execute(postcode + ",uk");
		
	}

	function showLocation(location, coverageType, lookup){
		
		map.closeExtInfoWindow();
		googleajaxcomplete = false;
		coverageajaxcomplete = false;
		congestionText = false;
		$("#multi-addresses").css('display', 'none');
		$("#error-text").css('display', 'none');
		$("input#inputBox").val(location);
		if(coverageType == 'mbb')
		{
			$("#outdoorCovSubText").html("For your Mobile Broadband.");
			$("#indoorCovSubText").html("For your Mobile Broadband.");
		}
		else
		{
			$("#outdoorCovSubText").html("For your mobile phone.");
			$("#indoorCovSubText").html("For your mobile phone.");
		}
		coverageTypeToSearch = coverageType;
		if(validateFullPostCode(location) == 'valid')
		{
			showPostcode(location, coverageType, true, lookup);
		}
		else if (validatePostCode(location) == 'valid') {
			showPostcode(location, coverageType, false, lookup);
		} else {
			showAddress(location, coverageType, lookup);
		}
	}
	
	function showError(msg)
	{
		$("#error-text").html(msg);
		$('#error-text').fadeIn();
	}
	
	function showErrorFade(msg)
	{
		$('#error-text').fadeIn();
		$("#error-text").html(msg);
		setTimeout("$('#error-text').fadeOut()", 5000);
	}
	
	function closeError()
	{
		$('#error-text').fadeOut();
	}
	
	function createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}

	function eraseCookie(name) {
		createCookie(name,"",-1);
	}
	
	function showMapOnly()
	{
		removeLayer();
		$('#coverageView').html("<a href='#' onClick='showCoverage();return false;'>Coverage information.</a>");
		$('#mapView').html("Map only.");
	}
	
	function showCoverage()
	{
		showLayer();
		$('#mapView').html("<a href='#' onClick='showMapOnly();return false;'>Map only.</a>");
		$('#coverageView').html("Coverage information.");
	}
	
	function setUpHelp() {
		$('.Functional_App-CoverageChecker2010 .helpLink a').click(function(){
			$('#content-boxed').prepend("<div id='help-shroud'></div>");
			$('#help-shroud').css({
				'background-color' : '#000',
				'opacity' : 0.7,
				'color' : 'rgb(0,40,244)',
				'width' : '940px',
				'height' : '555px',
				'position' : 'absolute',
				'zIndex' : 970,
				'left' : '0px',
				'top' : '95px',
				'display' : 'none'
			});
			$('#content-boxed').prepend("<a href='#' title='close the help overlay' id='help-close'><img src='/static/images/functional_apps/coverage/overlay-close.gif' alt='close'></a>");
			
			$('#help-close').click(function(){
				$('.helpMarker').fadeOut();
				$('.helpText').fadeOut();
				$('#help-shroud').fadeOut();
				$('#help-close').remove();
				return false;
			});

			$("#helpMarker1").click(function () {
				$('#helpText5').fadeOut();
				$('#helpText2').fadeOut();
				$('#helpText3').fadeOut();
				$('#helpText4').fadeOut();
				$('#helpText1').fadeIn();
			});
			$("#helpMarker2").click(function () {
				$('#helpText1').fadeOut();
				$('#helpText5').fadeOut();
				$('#helpText3').fadeOut();
				$('#helpText4').fadeOut();
				$('#helpText2').fadeIn();
			});
			$("#helpMarker3").click(function () {
				$('#helpText1').fadeOut();
				$('#helpText2').fadeOut();
				$('#helpText5').fadeOut();
				$('#helpText4').fadeOut();
				$('#helpText3').fadeIn();
			});
			$("#helpMarker4").click(function () {
				$('#helpText1').fadeOut();
				$('#helpText2').fadeOut();
				$('#helpText3').fadeOut();
				$('#helpText5').fadeOut();
				$('#helpText4').fadeIn();
			});
			$("#helpMarker5").click(function () {
				$('#helpText1').fadeOut();
				$('#helpText2').fadeOut();
				$('#helpText3').fadeOut();
				$('#helpText4').fadeOut();
				$('#helpText5').fadeIn();
			});
			
			$("#helpText1 a.close").click(function () {
				$('#helpText1').fadeOut();
				return false;
			});
			$("#helpText2 a.close").click(function () {
				$('#helpText2').fadeOut();
				return false;
			});
			$("#helpText3 a.close").click(function () {
				$('#helpText3').fadeOut();
				return false;
			});
			$("#helpText4 a.close").click(function () {
				$('#helpText4').fadeOut();
				return false;
			});
			$("#helpText5 a.close").click(function () {
				$('#helpText5').fadeOut();
				return false;
			});
			$("#helpText6 a.close").click(function () {
				$('#helpText6').fadeOut();
				return false;
			});
			
			$('#help-shroud').fadeIn();
			$('#helpText6').fadeIn();
			$('.helpMarker').fadeIn();
			
			return false;
		});
	}
