///////////////////////////////////////////////////////////////////
// ATG XML PARSER
///////////////////////////////////////////////////////////////////
// vars
// MUST be pulled from same domain!

var atg_feed = "/";
var count = 0;	
var manufacturersList;
var manufacturers = [];
var frequencies = [];
frequencies[0] = "3G Broadband";
frequencies[1] = "3G GSM";
frequencies[2] = "3G Extended Coverage";

// devices object - populated async
var devices = new Object();
devices.manufacturer = new Array();
devices.model = [];
devices.freq = [];
devices.img = [];

//get frequency path from summary
function getFreq(summary){
	for(var x=0; x<frequencies.length; x++){
		if(summary.indexOf(frequencies[x])!= -1){
			freq = frequencies[x].replace(/\s/g, "");							
			if(freq == "3GBroadband" || freq == "3GGSM")freq = "3G2100";
			if(freq == "3GExtendedCoverage")freq = "3G900";
			break;
		}
		else{			
			freq = "2G"
		}							
	}	
	return freq;
}

// get image path from summary - very hackey
function getImage(summary){
 var str  = summary.indexOf("img");								 
 var start = summary.substring(str, summary.length);
 var end = start.indexOf("' width");
 var image = start.substring(0, end);
 var image = image.split("img src='");
 return "http://www.vodafone.co.nz/"+image[1]; 
}

// check for array value uniqueness
Array.prototype.in_array = function(p_val) {
	for(var i = 0, l = this.length; i < l; i++) {
		if(this[i] == p_val) {
			return true;
		}
	}
	return false;
}

// array of device manufacturers
function buildManufacturers(manufacturer, count){	
	if(!manufacturers.in_array(manufacturer)){
		manufacturers.push(manufacturer);
	}
	return manufacturers;
}

// object to store manufacturer, device model, device frequency
function appendDeviceObj(manufacturer, model, freq, img, count){
	devices.manufacturer.push(manufacturer);
	devices.model.push(model);
	devices.freq.push(freq);
	devices.img[count] = new Image();
	devices.img[count].src = img;
}

//build select boxes
function buildSelects(){
	var manufacturer_select = document.getElementById("manufacturer");
	manufacturer_select.options[0] = new Option("--- please select ---", "null");
	
	for(var x = 0; x < manufacturersList.length; x++){
		var text = manufacturersList[x];
		var value = text;
		 manufacturer_select.options[manufacturer_select.options.length] = new Option(text, value);
	}
}

// update select boxes
function updateSelects(val){
	var img_index;	
	var freq;
	var model_select = document.getElementById("model");				
	
	// triggered when model is selected	
	if(val == "2G" || val == "3G2100" || val == "3G900"){
		freq = val;
	}	
	else{// triggered when manufacturer is selected
		model_select.options.length = 0;
		for(var x = 0; x < devices.model.length; x++){
			if(devices.manufacturer[x] == val){		
				var text = devices.model[x];
				var value = devices.freq[x];	
				model_select.options[model_select.options.length] = new Option(text, value);
				freq = $j("#model :selected").val();
			}			
		}		
	}	
	// get the image  index		
	var selected_model = $j("#model :selected").text();
	for(var y = 0; y < devices.model.length; y++){
		if(devices.model[y] == selected_model){		
			img_index = y;
		}
	}	
	// set image, show layers, show second select	
	$j("#device_img").attr("src", devices.img[img_index].src);
	toggleLayers(freq, "device");	
	$j("#model").removeClass("hidden").addClass("show");
	
	// track event
	if(document.getElementById("model")){
		gEventTrack("Coverage", "Device", $j("#manufacturer :selected").text(), $j("#model :selected").text());
	}	
}

// DOM ready
$j(document).ready(function(){	
	$j.ajax({
		type: "GET",
		url: atg_feed,
		//dataType: "xml",
		dataType: ($j.browser.msie) ? "text" : "xml",
		success: function(data){		
			// handle IE when pulling in local XML file
			var xml;
			if (typeof data == "string") {
       	xml = new ActiveXObject("Microsoft.XMLDOM");
       	xml.async = false;
       	xml.loadXML(data);
     	}
			else{
      	xml = data;
     	}
						
			$j(xml).find('entry').each(function(){
				var title = $j(this).find('title').text();
				var summary = $j(this).find('summary').text();
				var freq = null;
			
				var manufacturer_model = title.split(" ");
				
				manufacturer = manufacturer_model[0];			
				model = manufacturer_model[1];
				
				// hard coded hack to handle certain manufacturers / models
				if(manufacturer == "Sony"){
					manufacturer = manufacturer_model[0]+" "+manufacturer_model[1];
					model = manufacturer_model[2];
				}
				if(manufacturer == "Palm"){
					manufacturer = manufacturer_model[0];
					model = manufacturer_model[1]+" "+manufacturer_model[2];
				}
				
				manufacturersList = buildManufacturers(manufacturer, count);				 
				var img = getImage(summary);				
				var freq = getFreq(summary);		
				appendDeviceObj(manufacturer, model, freq, img, count);
				count++;
			});		
			buildSelects();					
			// hide ajax indicator
			setTimeout("hideShowSpinner('ajax_indicator_lg_device','device_selector');", anim_speed);
		}				
	});	
	
	$j("#manufacturer, #model").bind("keypress change",function(){
		if(!exceeding_max_zoom){
			
			// if first option in manufacturer is selected, hide model and reset placeholder image		
			if(this.id == "manufacturer"){
				if(this.selectedIndex != 0){
					updateSelects(this.value);	
				}	
				else{
					$j("#model").removeClass("show").addClass("hidden");
					$j("#device_img").attr("src", "/vf-apps/shop/css/1.2/img/placeholders/compare_wirframeSmall.gif");
				}		
			}
			// otherwise behave normally
			if(this.id == "model"){
				updateSelects(this.value);
			}
		}
		else{
			showError();
			this.selectedIndex = 0;	
		}	
	});	

	$j("#manufacturer").bind("keypress change",function(){
		device_selected_flag = true;
	});	
});

///////////////////////////////////////////////////////////////////
// GENERIC BEHAVIOUR
///////////////////////////////////////////////////////////////////

// vars
var map, geocoder, home_latlng, home_address, home_icon, home_marker, bounds_global, hierarchy;
var reasons = [];
var previous_address = "";

// configurables
// default coverage layer
var default_coverage_layer = "2G";
// layer stacking order
var zIndex2G = 1;
var zIndex3G2100 = 2;
var zIndex3G900 = 3;
// min zoom level
var min_coverage_zoom = 7;
// default animation speed (milliseconds)
var anim_speed = 500;

// tiles
var myTileLayer2G = null;
var myTileLayer3G2100 = null;
var myTileLayer3G900 = null;

// booleans
var show_animate = false;
var suppress_default_layer = false;
var device_selected_flag = false;
var exceeding_max_zoom = false;

// html
var json_meter_html = "";
var info_window_html = "";

// home marker images
var home_marker_image = new Image();
home_marker_image.src = "http://www.vodafone.co.nz/help/store-locations/img/home-marker.png";

var home_marker_shadow = new Image();
home_marker_shadow.src = "http://www.vodafone.co.nz/help/store-locations/img/home-marker-shadow.png";

// layer object
var layers = new Object();
	layers.name = [];
	layers.tile = [];
	layers.status = [];
	layers.selected = [];

// object to store layer name, layer tile(GTileLayer), layer status (default?), currently selected?
function appendLayerObj(name, tile, status, selected){	
	layers.name.push(name);
	layers.tile.push(tile);
	layers.status.push(status);
	layers.selected.push(selected);
}

// remove all coverage layers
function removeCoverageLayers(){
	for(var x = 0; x < layers.name.length; x++){
		$j("#chkToggle"+layers.name[x]).attr("checked", false);		
		map.removeOverlay(layers.tile[x]);	
		layers.selected[x] = false;
	}
}

//////////////////////////////////////////
// TOGGLE COVERAGE LAYERS
///////////////////////////////////////////////////////////////////
function toggleLayers(){
	if(map == null){return;}	

	// default layer behaviour
	if(arguments.length == 0){		
		var default_layer;
		for(x = 0; x < layers.name.length; x++){	
			if(layers.name[x] == default_coverage_layer){	
				default_layer = x;
				break;
			}
		}		
			
		if(layers.selected[default_layer] && true && suppress_default_layer == true){
			map.removeOverlay(layers.tile[default_layer]);	
			$j("#chkToggle"+layers.name[default_layer]).attr("checked", false);		
			layers.selected[default_layer] = false;	
			return;
		}				
		if(suppress_default_layer == true){
			map.removeOverlay(layers.tile[default_layer]);	
			$j("#chkToggle"+layers.name[default_layer]).attr("checked", false);		
			layers.selected[default_layer] = false;	
			return;
		}
		if(layers.selected[default_layer] == false){ 
			map.addOverlay(layers.tile[default_layer]);	
			$j("#chkToggle"+layers.name[default_layer]).attr("checked", true);		
			layers.selected[default_layer] = true;	
			// track
			gEventTrack("Coverage", "Layer toggled:", "On", layers.name[x]);	
		}
	return;
	}
			
	if(arguments.length == 2){						
		// this handles phone selection capabilities, based on hierarchy i.e. 3G2100 should also select 2G etc
		if(arguments[1] == "device"){				
			removeCoverageLayers();		
			for(x = 0; x < layers.name.length; x++){						
				if(arguments[0] == hierarchy[0]){
					if(layers.selected[x] == false){ 
						map.addOverlay(layers.tile[0]);	
						$j("#chkToggle"+layers.name[0]).attr("checked", true);			
						layers.selected[0] = true;	
						// track
						gEventTrack("Coverage", "Layer toggled:", "On", layers.name[i]);					
					}
				}
				if(arguments[0] == hierarchy[1]){
					for(i = 0; i <= 1; i++){
						if(layers.selected[i] == false){ 
							map.addOverlay(layers.tile[i]);	
							$j("#chkToggle"+layers.name[i]).attr("checked", true);			
							layers.selected[i] = true;
							// track
							gEventTrack("Coverage", "Layer toggled:", "On", layers.name[i]);								
						}					
					}
				}
				if(arguments[0] == hierarchy[2]){
					for(i = 0; i <=2; i++){
						if(layers.selected[i] == false){ 
							map.addOverlay(layers.tile[i]);	
							$j("#chkToggle"+layers.name[i]).attr("checked", true);			
							layers.selected[i] = true;	
							// track
							gEventTrack("Coverage", "Layer toggled:", "On", layers.name[i]);										
						}
					}
				}	
				break;
			}
		}			
		
		// this prevents default layer being selected on zoom IF it has been deselected
		if(arguments[1] == "clicked" && arguments[0] == default_coverage_layer){
			resetSelects();
			for(x = 0; x < layers.name.length; x++){	
				if(!$j("#chkToggle"+layers.name[x]).is(":checked")){
					map.removeOverlay(layers.tile[x]);	
					$j("#chkToggle"+layers.name[x]).attr("checked", false);		
					layers.selected[x] = false;	
					suppress_default_layer = true;
					// track
					gEventTrack("Coverage", "Layer toggled:", "Off", layers.name[x]);	
					return;
				}
				else{
					map.addOverlay(layers.tile[x]);	
					$j("#chkToggle"+layers.name[x]).attr("checked", true);		
					layers.selected[x] = true;	
					suppress_default_layer = false;
					// track
					gEventTrack("Coverage", "Layer toggled:", "On", layers.name[x]);
					return;
				}	
			}			
		}
		
		// normal toggle behaviour - checkbox interaction
		else if(arguments[1] == "clicked"){
			resetSelects();
			for(x = 0; x < layers.name.length; x++){	
				if(arguments[0] == layers.name[x]){
					if(layers.selected[x] == false){ 
						map.addOverlay(layers.tile[x]);	
						$j("#chkToggle"+layers.name[x]).attr("checked", true);			
						layers.selected[x] = true;	
						// track
						gEventTrack("Coverage", "Layer toggled:", "On", layers.name[x]);
						return;
					}
					else{		
						map.removeOverlay(layers.tile[x]);
						$j("#chkToggle"+layers.name[x]).attr("checked", false);		
						layers.selected[x] = false;	
						// track
						gEventTrack("Coverage", "Layer toggled:", "Off", layers.name[x]);
						return;
					}				
				}
			}
		}	
	}
}

///////////////////////////////////////////////////////////////////
// UI FUNCTIONS
///////////////////////////////////////////////////////////////////
// hide / show ajax indicator and related content
function hideShowSpinner(el_to_hide, el_to_show){
	if(el_to_hide != null){
		$j("#"+el_to_hide).removeClass("show").addClass("hidden");
	}
	if(el_to_show != null){
		$j("#"+el_to_show).removeClass("hidden").addClass("show");		
	}
}

// show the zoom error
function showError(){
	$j("#overlay h2").text("Please zoom in or search for an address.");
	//$j("#overlay p").text("");
	$j("#overlay").removeClass("hidden").addClass("show");
	this.selectedIndex = 0;
}

// hide the zoom error
function hideError(){
	$j("#overlay").removeClass("show").addClass("hidden");
}
		
// animate the sidebar
function animateSideBar(){	
	if(show_animate == true){		
		$j("#toggle_side_bar").css({backgroundImage: "URL(http://www.vodafone.co.nz/coverage/img/toggle_off.jpg)"});	
		$j("#side_bar").animate({
			left: 0
		}, anim_speed);	 
		$j("#map").animate({
			left: 200,
			width: 752
		}, anim_speed);
		$j("#toggle_side_bar").animate({
			width: 227    	
		}, anim_speed);
		show_animate = false;		
	}
	else{
		$j("#toggle_side_bar").css({backgroundImage: "URL(http://www.vodafone.co.nz/coverage/img/toggle_on.jpg)"});	
		$j("#side_bar").animate({
			left: -200
		}, anim_speed);	 
		$j("#map").animate({
			left: 0,
			width: 952
		}, anim_speed);
		$j("#toggle_side_bar").animate({
			width: 27    	   
		}, anim_speed);
		show_animate = true;
	}
}

function resetSelects(){
	document.getElementById("device_select").reset();
	$j("#model").removeClass("show").addClass("hidden");		
	$j("#device_img").attr("src", "http://www.vodafone.co.nz/vf-apps/shop/css/1.2/img/placeholders/compare_wirframeSmall.gif");
}

///////////////////////////////////////////////////////////////////
// MAP FUNCTIONS
///////////////////////////////////////////////////////////////////

// initialise the map
function initialiseMap(){
	if(GBrowserIsCompatible()){	
		map = new GMap2(document.getElementById("map"));		
		map.setCenter(new GLatLng(-40.7, 172.2), 6);  
		// set default map type		
		map.setMapType(G_PHYSICAL_MAP); 
		
		// set controls
		var ui = new GMapUIOptions();
  	ui.maptypes = {satellite:true, normal:true, physical:true}
  	ui.zoom = {doubleclick: true, scrollwheel: true};
  	ui.controls = {largemapcontrol3d:true, maptypecontrol:true};
  	ui.keyboard = false;
  	map.setUI(ui);

		//GEvent.addListener(map, "click", clicked);
		GEvent.addListener(map, "zoomend", zoomLevelCheck);
		GEvent.addListener(map, "zoomto", zoomLevelCheck);
		
		geocoder = new GClientGeocoder();	
		home_icon = new GIcon();		
		home_icon.image = home_marker_image.src;
		home_icon.shadow = home_marker_shadow.src;
		home_icon.iconSize = new GSize(32, 32);
		home_icon.shadowSize = new GSize(59, 32);
		home_icon.iconAnchor = new GPoint(25, 20);
		home_icon.infoWindowAnchor = new GPoint(31, 8);     
				
		// 2G		
		var tilelayer2G = new GTileLayer(null, null, null, {		
			tileUrlTemplate: 'http://www.optimap.co.nz/geowebcache/service/gmaps?layers=topp:VF2G&zoom={Z}&x={X}&y={Y}',
			isPng: true,
			opacity: 1.0
			} 
		);
		// 3G - 2100MHz		
		var tilelayer3G2100 = new GTileLayer(null, null, null, {			
			tileUrlTemplate: 'http://www.optimap.co.nz/geowebcache/service/gmaps?layers=topp:VF3G2100&zoom={Z}&x={X}&y={Y}',
			isPng: true,
			opacity: 1.0
			}
		);	
		// 3G Extended - 900MHz
		var tilelayer3G900 = new GTileLayer(null, null, null, {			
			tileUrlTemplate: 'http://www.optimap.co.nz/geowebcache/service/gmaps?layers=topp:VF3G900&zoom={Z}&x={X}&y={Y}',
			isPng: true,
			opacity: 1.0
			}		
		);			
	myTileLayer2G = new GTileLayerOverlay(tilelayer2G, {zPriority: zIndex2G});	
	myTileLayer3G2100 = new GTileLayerOverlay(tilelayer3G2100, {zPriority: zIndex3G2100});			
	myTileLayer3G900 = new GTileLayerOverlay(tilelayer3G900, {zPriority: zIndex3G900});
	
	appendLayerObj("2G", myTileLayer2G, true, false);
	appendLayerObj("3G2100", myTileLayer3G2100, false, false);
	appendLayerObj("3G900", myTileLayer3G900, false, false);
	hierarchy = [layers.name[0],layers.name[1],layers.name[2]];	
	}
	else{
		alert("Sorry your web browser does not support Gmaps");
	}	
}

// execute the address search, pulling back suggestions if multiple matches are found
function searchCoverage(){
	home_address = document.getElementById('addressInput').value;
	
	if(home_address != previous_address){
		previous_address = home_address;
		if(home_address != ""){
			$j("#overlay").removeClass("show").addClass("hidden");
			home_address += ", New Zealand";
			geocoder.getLocations(home_address, function(latlng){
				var suggestionsHtml = "";
				if (latlng.Status.code == G_GEO_SUCCESS) {
					// if there was more than one result
					if (latlng.Placemark.length > 1) { 
						// Loop through the results
						suggestionsHtml += "<ul class=\"link_list1Col\">";
						for (var i=0; i<latlng.Placemark.length; i++) {
							var p = latlng.Placemark[i].Point.coordinates;
							var r = latlng.Placemark[i].address;
							// heinous side bar links!								
							suggestionsHtml += "<li>";
							suggestionsHtml += "<a class='btnPetrol' id='suggestions_"+[i]+"' href='#' onclick='javascript:placeHomeMarker(" +p[1]+","+p[0]+",\""+latlng.Placemark[i].address+"\"); return false;'>"+ latlng.Placemark[i].address+"<\/a>";
							suggestionsHtml += "<\/li>";						
						}
						suggestionsHtml += "<\/ul>";
						document.getElementById("suggestions_content").innerHTML = suggestionsHtml;
						$j("#coverage_selector, #device_content, .bottom_text").removeClass("show").addClass("hidden");
						$j("#suggestions_content").removeClass("hidden").addClass("show");
					}
					// if there was a single result
					else {
						var p = latlng.Placemark[0].Point.coordinates;
						placeHomeMarker(p[1],p[0], home_address);
					}
				}
				// error status
				else {
					var reason="Code "+latlng.Status.code;
					if (reasons[latlng.Status.code]) {
						reason = reasons[latlng.Status.code]
					} 
					//alert('Could not find "'+home_address+ '" ' + reason);					
				}
			});
		}
		else{
			alert("Please enter an address.");
			}
		return false;
	}
	else{
		// previous address matches current search so do nothing
		return false;	
	}
}

// place the home marker on co-ords
function placeHomeMarker(lat, lng, suggested_address) {
	info_window_html = "";
	
	if(suggested_address != null){
		$j("#addressInput").val(suggested_address);
		previous_address = suggested_address;
	}	
	var latlng = new GLatLng(lat,lng);
	home_latlng = latlng;  	
	
	$j("#coverage_selector, #device_content, .bottom_text").removeClass("hidden").addClass("show");
	$j("#suggestions_content").removeClass("show").addClass("hidden"); 
	// extend bounds and update global var
	var bounds = new GLatLngBounds();
	bounds.extend(home_latlng);
	bounds_global = bounds;	
	if(home_marker != null){
		map.removeOverlay(home_marker);
	}
	home_marker = new GMarker(home_latlng, home_icon);
	map.addOverlay(home_marker);

	// build info window html
	info_window_html += "<div id=\"coverage_meters_header\"><p>"+previous_address+"<\/p><\/div>";
	info_window_html += "<div id=\"coverage_meters\">";
	info_window_html += "<img height=\"32\" width=\"32\" src=\"http://www.vodafone.co.nz/img/feedback/ajax-indicator-lg.gif\" alt=\"Loading...\" id=\"ajax_indicator_lg_meters\" \/>";
	info_window_html += "<\/div>";
	
	
	// display info window by default
	home_marker.openInfoWindowHtml(info_window_html, {onOpenFn: getJsonMeter(home_latlng)});
	
	// and if user clicks on marker	
	GEvent.addListener(home_marker, "click", function(){
		home_marker.openInfoWindowHtml(info_window_html, {onOpenFn: getJsonMeter(home_latlng)});
	});	 	
	
	// hard coded zoom level
	map.setCenter(bounds_global.getCenter(), map.getBoundsZoomLevel(bounds_global));
	map.setZoom(12);
	// check the zoom level to see if we need to display default layer
	zoomLevelCheck();
	if(suggested_address != null){
		gEventTrack("Coverage", "Address search", "Location:", suggested_address);
	}		
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

//check current zoom level
function zoomLevelCheck(){	
	var current_zoom = map.getZoom();
	// if we're zoomed in below allowed levels
	if(current_zoom >= min_coverage_zoom){ 
		hideError();
		toggleLayers();
		exceeding_max_zoom = false;
		return;
	}	
	// if we're zoomed too far out
	if(current_zoom < min_coverage_zoom){	
		resetSelects();	
		device_selected_flag = false;
		removeCoverageLayers();		
		// remove the info window
		if(home_marker){
			home_marker.closeInfoWindow();
		}
		exceeding_max_zoom = false;
		showError();
		suppress_default_layer = false;
		return;
	}
}

//////////////////////////////////////////////////////////////////
// COVERAGE METERS - XSITE XHR (JSON PADDING)
///////////////////////////////////////////////////////////////////

// get results from database (cross domain call)
function getJsonMeter(latlng){	
	// do our cross domain json call after a short delay  
	setTimeout(function(){        
		$j.ajax({
			dataType: 'jsonp',
			url: 'http://www.optimap.co.nz/MapProxy/MapService/signal.js?markers=' + latlng.lat() +',' + latlng.lng()+'&callback=coverageMeterJSON'
		});
	},500);
}

// json callback   
function coverageMeterJSON(signals){		
	json_meter_html = "";
	if (!signals){			
		alert("Sorry, no results found.");
		return;
	}
	else{		
		// build html for info window meters
		json_meter_html += "<div><img class=\"floatRight\" alt=\"2G &amp; 2.5G strength\" height=\"10px\" width=\"111px\" src=\"http://www.vodafone.co.nz/coverage/img/meters/signal2g_" + signals.VF2G + ".gif\" \/><span>Calling, 2G &amp; 2.5G<\/span><\/div>";     // 2G coverage result
    json_meter_html += "<div><img class=\"floatRight\" alt=\"3G Broadband strength\" height=\"10px\" width=\"111px\" src=\"http://www.vodafone.co.nz/coverage/img/meters/signal3g2100_" + signals.VF3G2100 + ".gif\" \/><span>3G Broadband<\/span><\/div>";     // 3G2100 coverage result
    json_meter_html += "<div><img class=\"floatRight\" alt=\"3G Broadband Extended strength\" height=\"10px\" width=\"111px\" src=\"http://www.vodafone.co.nz/coverage/img/meters/signal3g900_" + signals.VF3G900 + ".gif\" \/><span>3G Broadband Extended<\/span><\/div>";     // 3G900 coverage result
		// update the info window
		$j("#coverage_meters").html(json_meter_html);
	}
}

///////////////////////////////////////////////////////////////////
// PRINT & PDF
///////////////////////////////////////////////////////////////////
function printCurrentView() {
		var lb = map.getBounds().getSouthWest();
		var rt = map.getBounds().getNorthEast();
		var curZoom = map.getZoom();
		var curSize = map.getSize();
}

//////////////// print constants
var pdfMAXWidth = 520;
var pdfMaxHeight = 540;
var maxLength = 640;

//////////////// isPDF param is new
function getPrintQuery(isPDF) {

		//var URL = Optimaps.getMapBoundaryQuery(false, home_latlng, previous_address); 
		var query = "";
		var curCenter = map.getCenter();
		var lb = map.getBounds().getSouthWest();
		var rt = map.getBounds().getNorthEast();
		var curZoom = map.getZoom();
		var curSize = map.getSize();

		var lxP, rxP, tyP, byP;

		var curProjection = map.getCurrentMapType().getProjection();
		var maxWidth = isPDF ? pdfMAXWidth : maxLength;
		var maxHeight = isPDF ? pdfMaxHeight : maxLength;

		if ((curSize.width > maxWidth || curSize.height > maxHeight)) {
				var gCenterPoint = curProjection.fromLatLngToPixel(curCenter, curZoom);
				var curWidth = curSize.width;
				var curHeight = curSize.height;
				if (curSize.width > maxWidth) {
						lxP = gCenterPoint.x - (maxWidth / 2);
						rxP = gCenterPoint.x + (maxWidth / 2);
						curWidth = maxWidth;
				}
				else {
						lxP = curProjection.fromLatLngToPixel(lb, curZoom).x;
						rxP = curProjection.fromLatLngToPixel(rt, curZoom).x;
				}

				if (curSize.height > maxHeight) {
						tyP = gCenterPoint.y - (maxHeight / 2);
						byP = gCenterPoint.y + (maxHeight / 2);
						curHeight = maxHeight;
				}
				else {
						tyP = curProjection.fromLatLngToPixel(rt, curZoom).y;
						byP = curProjection.fromLatLngToPixel(lb, curZoom).y;
				}

			curSize = new GSize(curWidth, curHeight);
			var lbPoint = new GPoint(lxP, byP);
			var rtPoint = new GPoint(rxP, tyP);
			lb = curProjection.fromPixelToLatLng(lbPoint, curZoom);
			rt = curProjection.fromPixelToLatLng(rtPoint, curZoom);
		}

		query += "&center=" + curCenter.lat() + "," + curCenter.lng();
		query += "&zoom=" + curZoom;
		query += "&size=" + curSize.width + "x" + curSize.height;
		query += "&maptype=" + map.getCurrentMapType().getName().toLowerCase();
		query += "&ext=" + lb.lng() + "x" + lb.lat() + "x" + rt.lng() + "x" + rt.lat();   // Required for overlay image

		if (home_latlng != null) {
			query += "&markers=" + home_latlng.lat() + "," + home_latlng.lng();
		}
		var layer = "";
		// 2G has been selected
		if (layers.selected[0] == true) {
			layer += "VF2G"; // to be confirmed later
		}
		// 3G has been selected
		if (layers.selected[1] == true) {
			layer += (layer != "" ? "x" : "") + "VF3G2100"; // to be confirmed later
		}
		// 3G extended has been selected
		if (layers.selected[2] == true) {
			layer += (layer != "" ? "x" : "") + "VF3G900"; // to be confirmed later        
		}
		if(layer != ""){
			query += "&layers=" + layer;
		}
		if(previous_address != null){
			query += "&addr=" + previous_address;
		}
	return query;
}
///////////////////////////////////////////////////////////////////
// Tracking
///////////////////////////////////////////////////////////////////
function gEventTrack(category, action, opt_label, opt_val){
	if(typeof(firstTracker) != "undefined"){
		firstTracker._trackEvent(category, action, opt_label, opt_val);
	}
	else{
		return;
	}
}

///////////////////////////////////////////////////////////////////
// DOM ready
///////////////////////////////////////////////////////////////////
$j(document).ready(function(){			
	// initialise the map
	initialiseMap();
	// toggle side_bar
	$j("#toggle_side_bar").click(function(){
			animateSideBar();
			return false;
	});
	// hide overlay
	$j("#addressSearch, #addressInput, #overlay").click(function(){
		$j("#overlay").removeClass("show").addClass("hidden");
	});
	// submit address search - click
	$j("#addressSearch").click(function(){
		searchCoverage();
		return false;
	});
	// submit address search - enter key
	$j("#addressInput").keydown(function(e){
		if(e.keyCode == 13){
		searchCoverage();
		return false;
		}
	});
	// uncheck the checkboxes
	// 2G
	$j("#chkToggle2G, #chkToggle3G2100, #chkToggle3G900").attr("checked", false);
	// checkbox click events -first we check if zoom is exceeding max
	$j("#chkToggle2G").click(function(){
		if(!exceeding_max_zoom){
			toggleLayers("2G", "clicked");
		}
		else{
			showError();
			return false;	
		}		
	});	
	// 3G2100
	$j("#chkToggle3G2100").click(function(){
		if(!exceeding_max_zoom){
			toggleLayers("3G2100", "clicked");
		}
		else{
			showError();
			return false;	
		}		
	});	
	// 3G900
	$j("#chkToggle3G900").click(function(){
		if(!exceeding_max_zoom){
			toggleLayers("3G900", "clicked");
		}
		else{
			showError();
			return false;	
		}		
	});	
	// PDF
	$j("#save").click(function(){
		var URL = "http://www.optimap.co.nz/MapProxy/MapService/print.pdf?";
    URL += getPrintQuery(true);
	  window.open(URL)
  });	
	/*
	// tooltips
	$j(".tip").tooltip({ 
    bodyHandler: function() { 
        return $j($j(this).attr("href")).html(); 
    }, 
    showURL: false,
		left: 20,
		top:-40
	});
	// don't follow tooltip click
	$j(".tip").click(function(){
		return false;
	});	
	*/
}); 

// unload to prevent memory leaks
$j(window).unload(function(){
	GUnload();
});

// start redirect if protocol is https
function checkProto(){
	var current_proto = document.location.protocol;
	var proto = current_proto == "https:" ?  "https:" : "http:";
	if(proto == "https:"){
		var parts = document.location.href.split(proto);
		var redirectURL = "http:"+parts[1];
		document.location.href = redirectURL;
	}
}

checkProto();
// end redirect if protocol is https

