/*----------------------------------------------------------------------------\
|                               MyMap:                                        |
|-----------------------------------------------------------------------------*/


var map;
var centre; 
var zoom; 
var points_downloaded = [];
var points_on_map = [];
var point_set;
var point_set_name; 
var zoomevent; 
var panevent; 
var twIcon;
var owIcon; 
var side_bar_html;
var gmarkers; 
var last_icon_id = 0; 
var last_list_id = 0; 
var center_lng; 
var center_lat; 
var total_matches; 
var page; 
var load_page = 1; 
var pagination = 25; 
var replace_points = true; 
var pan_result = false; 
var COOKIE_NAME = "twg_search"; 
var options = { path: '/', expires: 1 }; 

function initialize() {

	if (GBrowserIsCompatible()) 
	{
		map = new GMap2(document.getElementById("map"),{mapTypes:[G_NORMAL_MAP]} );
		map.addControl(new GLargeMapControl());
		 
		map.setCenter(center, zoom);
		bounds = new GLatLngBounds();
		
		//Create Icons - TOP WORKPLACE: 
		twIcon = new GIcon();
		twIcon.image = '/images/icons/map/tw_image.png';
		twIcon.printImage = '/images/icons/map/tw_printImage.gif';
		twIcon.mozPrintImage = '/images/icons/map/tw_mozPrintImage.gif';
		twIcon.iconSize = new GSize(16,32);
		twIcon.shadow = '/images/icons/map/tw_shadow.png';
		twIcon.transparent = '/images/icons/map/tw_transparent.png';
		twIcon.shadowSize = new GSize(32,32);
		twIcon.printShadow = '/images/icons/map/tw_printShadow.gif';
		twIcon.iconAnchor = new GPoint(8,32);
		twIcon.infoWindowAnchor = new GPoint(8,0);
		twIcon.imageMap = [5,0,7,1,10,2,13,3,15,4,15,5,15,6,15,7,15,8,15,9,15,10,15,11,15,12,15,13,15,14,15,15,15,16,15,17,15,18,15,19,14,20,14,21,13,22,13,23,12,24,12,25,11,26,11,27,10,28,10,29,9,30,8,31,8,31,7,30,6,29,5,28,4,27,4,26,3,25,2,24,1,23,1,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,1,0];
		
		//Create Icons - OTHER WORKPLACE:
		owIcon = new GIcon();
		owIcon.image = '/images/icons/map/ow_image.png';
		owIcon.printImage = '/images/icons/map/ow_printImage.gif';
		owIcon.mozPrintImage = '/images/icons/map/ow_mozPrintImage.gif';
		owIcon.iconSize = new GSize(32,32);
		owIcon.shadow = '/images/icons/map/ow_shadow.png';
		owIcon.transparent = '/images/icons/map/ow_transparent.png';
		owIcon.shadowSize = new GSize(48,32);
		owIcon.printShadow = '/images/icons/map/ow_printShadow.gif';
		owIcon.iconAnchor = new GPoint(0,32);
		owIcon.infoWindowAnchor = new GPoint(16,0);
		owIcon.imageMap = [15,0,18,1,21,2,23,3,26,4,28,5,31,6,31,7,31,8,31,9,31,10,31,11,31,12,31,13,31,14,31,15,31,16,31,17,31,18,31,19,31,20,31,21,31,22,31,23,31,24,31,25,31,26,31,27,31,28,30,29,29,30,28,31,0,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,1,13,2,12,3,11,5,10,6,9,6,8,6,7,6,6,6,5,6,4,6,3,7,2,8,1,10,0];

		//Add move actions for search map: 
		if(map_type === 'search') 
		{
			//Setup Event handlers: 
			setupMapMoveEvents();
			//Load Points for Search Map only
			loadPoints();
		}
		
		//Update Markers: 
		updateMarkers(false);
		
		$("input[type=text]").focus(function(){
    // Select field contents
    this.select();
		});
	} 
}

function setupMapMoveEvents()
{
	zoomEventAll = GEvent.addListener(map, 'zoomend', function(){
		$.cookie(COOKIE_NAME + '_zoom', map.getZoom(), options); 
		return false; 
	});
	panEventAll = GEvent.addListener(map, 'moveend', function(){
		$.cookie(COOKIE_NAME + '_center', map.getCenter(), options);	
		return false; 
	});
	
//	zoomevent = GEvent.addListener(map, 'zoomend', function(){
//	});
	
		panevent = GEvent.addListener(map, 'moveend', function(){
		if($('#last_location').val() === $('#location').val())
		{
			$('#location').val("");
		}
	});
}

function clearMapMoveEvents()
{
//	if(zoomevent)
//	{
//		GEvent.removeListener(zoomevent); 
//		zoomevent = null; 
//}
	
	if(panevent)
	{
		GEvent.removeListener(panevent);
		panevent = null; 
	}
	
}

//function setCentre(map, centre_x, centre_y, zoom) {
//		var center = new GLatLng(centre_y, centre_x);
//		map.setCenter(center, zoom);	
//}


function myclick(i) {
  GEvent.trigger(points_on_map[i][0], "click");
}



function updateMarkers(autozoom){
	
	var mapBounds = map.getBounds();
	var markerBounds = new GLatLngBounds();
	
	if(map_type === 'search')
	{
		//side_bar_html = "";
		//GLog.write("Center Lat: " + center_lat + "Center Long: " + center_lng);
		//map.setCenter(new GLatLng(center_lat, center_lng));

 }
	 
	if(replace_points)
	{
		//Remove any existing points that are no longer on map: 
		for(k in points_on_map) {
		//if((!mapBounds.contains(points_on_map[k][0].getPoint()) || !(points_downloaded[k])) && (k != last_icon_id)) {
			map.removeOverlay(points_on_map[k][0]);
			delete points_on_map[k];
			//GEvent.removeListener(myEventListener)
			if(map_type === 'search')
			{
				$('#sitelist_' + k).remove();
				if(k === last_list_id)
				{
					last_list_id = 0; 
				}
			}
		//} 
	}
	//Remove Last Icon record: 
	//last_icon_id = 0; 
	}
	
	for (k in points_downloaded){
		//if(!points_on_map[k] && mapBounds.contains(points_downloaded[k][0])) {
			points_on_map[k] = new Array();
			points_on_map[k][0] = createSimpleMarker(points_downloaded[k][0], points_downloaded[k][1], points_downloaded[k][2], points_downloaded[k][6], points_downloaded[k][7], points_downloaded[k][5], points_downloaded[k][8], points_downloaded[k][9], points_downloaded[k][10], points_downloaded[k][11], points_downloaded[k][3], points_downloaded[k][4]);
			
			map.addOverlay(points_on_map[k][0]);
			markerBounds.extend(points_downloaded[k][0]);
			if(map_type === 'search')
			{
				//last_icon_id = k;
				//Add point to list:
				$('tr#sitelist_' + last_list_id).after(
						'<tr id="sitelist_' + k + '">' +
						'<td class="company_logo"><a href="/index.php/company/' + points_downloaded[k][4] + '"><img src="' + points_downloaded[k][13] + '" align="left" width="120px" height="50px" /></a></td>' + 
						'<td class="company_name"><a href="/index.php/company/' + points_downloaded[k][4] + '">' + points_downloaded[k][2] + '</a></td>' + 
						'<td class="site_address"><a href="javascript:myclick(' + points_downloaded[k][1] + ')">' + points_downloaded[k][5] + '</a></td>' + 
						'<td class="employees">' + points_downloaded[k][9] + '</td>' + 
						'<td class="company_sector">' + points_downloaded[k][11] + '</td>' + 
						'</tr>'
					);
			}
		//}
		last_list_id = k;
	}
	 
	if(autozoom | pan_result)
	{
		//Only autozoom if this won't take us out unreasonably 

		if(((map.getBoundsZoomLevel(markerBounds)) > 2) & (map.getBoundsZoomLevel(markerBounds) <= 13))
		{ 
	 		map.setZoom(map.getBoundsZoomLevel(markerBounds));
	 	}
	 	//Only center if this wouldn't take us out into the pacific...
	 	if(markerBounds.getCenter() != "(0, 180)")
	 	{
	 		map.setCenter(markerBounds.getCenter());
	 	}
	}
	pan_result = false; 
}

function createSimpleMarker(point, sid, company_name, image, awards, address, url, employee_no, surveyed_no, sector, description, permalink){
	if(awards)
	{
		icon = twIcon; 
	}
	else
	{
		icon = owIcon; 
	}
	
	var marker = new GMarker(point, icon);
	
	GEvent.addListener(marker, "click", function() {
	  marker.openInfoWindowHtml("<div class='ginfowindow'>" +
	  	"<table class='ginfowindow_table' border='0'>" + 
	  		"<tr>" + 
	  			"<td valign='top'><div class='image'><a href='/index.php/company/" + permalink + "'><img src='" + image + "' align='left' width='100px' width='70px' /></a></div>" +
//	  				"<div class='award'><img src='/images/icons/awards/" + awards + ".png' align='left' width='45px' height='45px' /></div>" +
	  			"</td>" + 
	  			"<td valign='top' style='padding-left: 5px;' rowspan='2'>" + 
	  				"<div class='title'><a href='/index.php/company/" + permalink + "'>" + company_name + "</a></div>" + 
			  		"<div class='address'>" + address + "</div>" + 
//				  	"<div class='url'><a href='" + url + "' target='_blank'>" + url + "</a></div>" + 
				  	"<div class='employees'>Employees in Region: <span class='answer'>" + employee_no + "</span><br />Surveyed Employees: <span class='answer'>" + surveyed_no + "</span></div>" + 
				  	"<div class='sector'>Sector: <span class='answer'>" + sector + "</span></div>" +
				  "</td>" + 
				 "</tr>" + 
				 "<tr>" + 
				 	"<td>" + 
//				 		"<div class='description'>" + description + "</div>" + 
		  			"<div class='link'><a href='/index.php/company/" + permalink + "'>Find out more.</a>" + "</div>" + 
		  		"</td>" + 
		  	"</tr>" + 
		  "</table>");

	  if(map_type === 'search')
		{
	  
		  if(last_icon_id > 0) {
		  	document.getElementById("sitelist_" + last_icon_id).style.background="#fff";
		  }
		  document.getElementById("sitelist_" + sid).style.background="#fc0";
		  last_icon_id = sid;
		} 
	    
	});
	
	return marker;
}



function loadPoints(){
	//Load Points: map_type === 'search' | 'survey'
	if(map_type === 'survey') 
	{
		updateMarkers(false);
	}
	else
	{
		//Clear Map Pan and Zoom events: 
		clearMapMoveEvents();
		//Disable Search Button: 
		$('#btnsearch').attr('disabled', 'disabled'); 
		//Raise Activity Indicator: 
		$('#activity_indicator').show(); 
		//Boundary info:
		var bounds = map.getBounds();
		var bounds_sw = bounds.getSouthWest();
		var bounds_ne = bounds.getNorthEast();
		
		//Prepare Querystring:
		var getVars = 'ne=' + bounds_ne.toUrlValue() + 
									'&sw=' + bounds_sw.toUrlValue() + 
									'&survey=' + survey_id + 
									'&keyword=' + escape($('#keyword').val()) + 
									'&location=' + escape($('#location').val()) + 
									'&last_location=' + escape($('#last_location').val()) + 
									'&page=' + load_page;
		
		//Write some of this to cookies: 
		$.cookie(COOKIE_NAME + '_keyword', escape($('#keyword').val()), options);	
		$.cookie(COOKIE_NAME + '_location', escape($('#location').val()), options);	
		
		var request = GXmlHttp.create();
		
		request.open('GET', '/index.php/map_points_xml/surveySearch?'+getVars, true);
		
		//GLog.write(getVars); 
		
		request.onreadystatechange = function() {
			
			if(request.readyState === 4) {
				if(request.status === 200){
					//Clear existing points_downloaded:
					points_downloaded = []; 
						
					var xmlDoc = GXml.parse(request.responseText);
					
					var markers = xmlDoc.documentElement.getElementsByTagName("marker");
					
					for (var i = 0; i < markers.length; i++) {
						pk = markers[i].getAttribute("sid");
						var lat = parseFloat(markers[i].getAttribute("lat"));
						var lng = parseFloat(markers[i].getAttribute("lng"));
						var point = new GLatLng(lat,lng);
				
						points_downloaded[pk] = new Array(
							point, markers[i].getAttribute("sid"), 
							urldecode(markers[i].getAttribute("company_name")), 
							urldecode(markers[i].getAttribute("company_description")), 
							markers[i].getAttribute("permalink"), 
							markers[i].getAttribute("site_address"), 
							markers[i].getAttribute("image"), 
							markers[i].getAttribute("awards"), 
							markers[i].getAttribute("url"), 
							markers[i].getAttribute("employee_no"), 
							markers[i].getAttribute("surveyed_no"), 
							markers[i].getAttribute("sector"), 
							markers[i].getAttribute("site_score"), 
							markers[i].getAttribute("logo"));
					} 
				}
				//document.getElementById('map_title_name').innerHTML = xmlDoc.documentElement.getElementsByTagName('dataset')[0].getAttribute('name');
				
				center_lat = xmlDoc.documentElement.getElementsByTagName('map')[0].getAttribute('center_lat');
				center_lng = xmlDoc.documentElement.getElementsByTagName('map')[0].getAttribute('center_lng');
				$('#last_location').val(xmlDoc.documentElement.getElementsByTagName('map')[0].getAttribute('location'));
				$('#location').val(xmlDoc.documentElement.getElementsByTagName('map')[0].getAttribute('location'));
				total_matches =  parseInt(xmlDoc.documentElement.getElementsByTagName('dataset')[0].getAttribute('total_matches'));
				page = parseInt(xmlDoc.documentElement.getElementsByTagName('dataset')[0].getAttribute('page'));
				
				updateMarkers(xmlDoc.documentElement.getElementsByTagName('map')[0].getAttribute('pan_map'));
				
								
				//Recreate Pan and Zoom events: 
				setupMapMoveEvents(); 
				//Disable Indicator: 
				$('#activity_indicator').hide();
				$('#btnsearch').attr('disabled', '');
				
				document.getElementById('feedback').innerHTML=generateLoadNextString(page, total_matches);
				 
			}
			else
			{
			//document.getElementById('sidebar').innerHTML="Unable to Connect to Server ";
			}
		}
	
		request.send(null);	
		

	}
}

function generateLoadNextString(page, total)
{
	var page_end = Math.min(Math.ceil(total_matches / pagination), 3);
	var str;
	
	if(page < page_end)
	{
		str = "<a href='#' onclick='gotoPage(" + (page+1) + ")'>Load next " + pagination + " Matches</a> ";
		str = "<input type='submit' name='btnload' value='Load Next " + pagination + " Matches' id='btnLoad' onclick='gotoPage(" + (page+1) + ");'/>";
		
	}
	else
	{
		str = "&nbsp;"; 
	}
	return str; 
}

function generatePaginationString(page, total)
{
	
	var page_range = 2; 
	var page_start_record = ((page - 1)* pagination) + 1; 
	var page_end_record = page_start_record + (pagination -1); 
	var page_end = Math.ceil(total_matches / pagination); 
	str = 'Matching ' + total_matches + ' Sites. Showing Records ' + page_start_record + ' to ' + Math.min(page_end_record, total) + ".";

	if(total > pagination)
	{
		str += " Jump to page "; 
		if(page != 1)
		{
			str += "<a href='#' onclick='gotoPage(1)'>&laquo;</a> "; 
		}
		for(page_link = Math.max(1, page-page_range); page_link <= Math.min( (page + page_range), page_end); page_link++)
		{
			if(page === page_link)
			{
				str += "<strong>" + page_link + "</strong> " ;		
			}
			else
			{
				str += "<a href='#' onclick='gotoPage(" + page_link + ")'>" + page_link + "</a> " ;
			} 
		}
		if(page != page_end)
		{
			str += "<a href='#' onclick='gotoPage(" + page_end + ")'>&raquo;</a>"; 
		}		
	}	
	return str; 
}

function runNewSearch()
{
	replace_points = true; 
	load_page = 1; 
	loadPoints(); 
}	


function gotoPage(i)
{
	replace_points = false; 
	load_page = i; 
	loadPoints();
	pan_result = true; 
}

function urldecode(encodedString) {
	var output = unescape(encodedString);
	
  var binVal, thisString;
  var myregexp = /(%[^%]{2})/;
  

  while ((match = myregexp.exec(output)) != null
             && match.length > 1
             && match[1] != '') {
    binVal = parseInt(match[1].substr(1),16);
    thisString = String.fromCharCode(binVal);
    output = output.replace(match[1], thisString);
  }
  return output;
//return unescape(str.replace('/+/g', ' '));
}


