
/*
 * Defines base functions for using google maps on site.
 * maplocation obj needs to be declared in a specific page
 */
var base_url = '/mapclient/google/finder.php?';
var map = null;

var lastzoom = null;
var lastbounds = null;
var om = null;
var highlightCircle;
var currentMarker;
var cats = [{type:'fishery', zoom:12, display: 0}, {type:'attraction', zoom:8, display: 0}, {type:'service', zoom:13, display: 0}, {type:'town', zoom:7, display: 0}];

function routeMapInit()
{
	if (GBrowserIsCompatible()) {
		om = new OverlayMessage(document.getElementById('map_canvas'));
		om.Set('Loading....');
		maplocation = {type: 1};
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT));
		
		rbox = getRouteBox();
		map.setCenter(rbox.getCenter());
		map.setZoom(map.getBoundsZoomLevel(rbox));
		box = map.getBounds();
		sw = box.getSouthWest();
		ne = box.getNorthEast();
		url = buildUrl(sw.lat(), ne.lng(), ne.lat(), sw.lng(), "route");
		
		function createRouteMarker(point, markeroptions, id)
		{
			var marker = new GMarker(point, markeroptions);
			  
			  // This line highlights the marker when it's clicked
			GEvent.addListener(marker, "click", function() {
				currentMarker = marker;
				highlightCurrentMarker();
                getRouteInfoWindowData(marker, id);				
			});

			  // This line highlights the marker when its moused over
			GEvent.addListener(marker, "mouseover", function() {
				currentMarker = marker;
				highlightCurrentMarker();	
			});

		 	  // This line highlights the marker while dragging
			GEvent.addListener(marker, "drag", function() {
				currentMarker = marker;
				highlightCurrentMarker();	
			});
			
			return marker;
		}
		
		GDownloadUrl(url, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			var i = 0;
			
			for (i; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var cat = markers[i].getAttribute("category");
				var type = markers[i].getAttribute("type");
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
				var id = markers[i].getAttribute("id");
				if (type !== undefined && type !== '') {
					//ico = ;
					map_icon = icons[type.replace(" ", "_", "gi") + "_icon"];
				} else {
					map_icon = icons[cat + '_icon'];	
				}
				var markeroptions = { icon:map_icon, title: name};

				map.addOverlay(createRouteMarker(point, markeroptions, id));
			}
		});
		GEvent.addListener(map, "zoomend", function() {
			  highlightCurrentMarker();	
		});
		om.Clear(); //all loaded so display
	}
}

function attractionMapInit()
{
	if (GBrowserIsCompatible()) {
		om = new OverlayMessage(document.getElementById('map_canvas'));
		om.Set('Loading....');
		maplocation = {type: 1};
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT));
		curcentre = getComponentCentre();
		map.setCenter(curcentre);
		map.setZoom(14);
		box = map.getBounds();
		sw = box.getSouthWest();
		ne = box.getNorthEast();
		
		url = buildUrl(sw.lat(), ne.lng(), ne.lat(), sw.lng(), "attractions");
		GDownloadUrl(url, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			var i = 0;
			
			for (i; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var cat = markers[i].getAttribute("category");
				var type = markers[i].getAttribute("type");
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
				var id = markers[i].getAttribute("id");
				
				if (type !== undefined && type !== '') {
					map_icon = eval(type.replace(" ", "_", "gi") + '_icon');
				} else {
					var map_icon = eval(cat + '_icon');	
				}
				
				var markeroptions = { icon:map_icon, title: name };
				var marker = new GMarker(point, markeroptions);
				map.addOverlay(marker);
			}
		});
		drawCircle(curcentre, 0.2, 40, '#c10728');
		om.Clear(); //all loaded so display
	}
}

function serviceproviderMapInit()
{
	if (GBrowserIsCompatible()) {
		om = new OverlayMessage(document.getElementById('map_canvas'));
		om.Set('Loading....');
		
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_LEFT));
		curcentre = getComponentCentre();
		map.setCenter(curcentre);
		map.setZoom(14);
		box = map.getBounds();
		sw = box.getSouthWest();
		ne = box.getNorthEast();
		
		url = buildUrl(sw.lat(), ne.lng(), ne.lat(), sw.lng(), "services");
		GDownloadUrl(url, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			var i = 0;
			
			for (i; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var cat = markers[i].getAttribute("category");
				var type = markers[i].getAttribute("type");
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
				var id = markers[i].getAttribute("id");
				
				if (type !== undefined && type !== '') {
					map_icon = eval(type.replace(" ", "_", "gi") + '_icon');
				} else {
					var map_icon = eval(cat + '_icon');	
				}
				
				var markeroptions = { icon:map_icon, title: name };
				var marker = new GMarker(point, markeroptions);
				map.addOverlay(marker);
			}
		});
		drawCircle(curcentre, 0.2, 40, '#427b1d');
		om.Clear(); //all loaded so display
	}
}

function fisheryMapInit() {
	if (GBrowserIsCompatible()) {
		om = new OverlayMessage(document.getElementById('map_canvas'));
		om.Set('Loading....');
		maplocation = {type: 1};
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT));
		curcentre = getComponentCentre();
		map.setCenter(curcentre);
		map.setZoom(14);
		box = map.getBounds();
		sw = box.getSouthWest();
		ne = box.getNorthEast();
		
		url = buildUrl(sw.lat(), ne.lng(), ne.lat(), sw.lng(), "fisheries");
		GDownloadUrl(url, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			var i = 0;
			
			for (i; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var cat = markers[i].getAttribute("category");
				var type = markers[i].getAttribute("type");
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
				var id = markers[i].getAttribute("id");
				
				if (type !== undefined && type !== '') {
					map_icon = eval(type.replace(" ", "_", "gi") + '_icon');
				} else {
					var map_icon = eval(cat + '_icon');	
				}
				
				var markeroptions = { icon:map_icon, title: name };
				var marker = new GMarker(point, markeroptions);
				map.addOverlay(marker);
			}
		});
		drawCircle(curcentre, 0.2, 40, '#000000');
		om.Clear(); //all loaded so display
	}
}

/*
 * IMPORTS
 * icon maps defined in icon_maps.js
 * markergroups defined in markergrps.js
 * 
 */
function mainMapInit() {
	if (GBrowserIsCompatible()) {
		om = new OverlayMessage(document.getElementById('map_canvas'));
		om.Set('Loading....');
		map = new GMap2(document.getElementById("map_canvas"));

		if (maplocation.type == 3) {
			box = getBoundingBox();
			map.setCenter(box.getCenter());
			mapzoom = map.getBoundsZoomLevel(box);
			map.setZoom(mapzoom);
			lastbounds = map.getBounds();
			lastzoom = mapzoom;
		}
		
		if (maplocation.type == 1 || maplocation.type == 2) {
			curcentre = getComponentCentre();
			map.setCenter(curcentre);
			if (getIsGeneralMap() === true) {
				mapzoom = 6;
			} else {
				mapzoom = (maplocation.type == 1) ? 10: 14;
			}
			map.setZoom(mapzoom);
			box = map.getBounds();
			lastbounds = box;
			lastzoom = mapzoom;
		}
		
		setCategoryCheckBoxes(mapzoom);
		
		map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT));
		
		sw = box.getSouthWest();
		ne = box.getNorthEast();
		getMarkers(sw.lat(), ne.lng(), ne.lat(), sw.lng());
		
		//no need to call zoomend as moveend is also called from zoomend event.
		GEvent.addListener(map, 'moveend', redrawMap);

		om.Clear(); //all loaded so display
	} else {
		var el = document.getElementById('map_canvas');
		el.innerHTML = '<p>Sorry, your browser is not currently able to support GoogleMaps.</p>';
	}
	
/*    need this to make sure the Tabs are rendered correctly	*/
    if (dojo.hasClass(dojo.body(), 'tundra') === false) {
        dojo.addClass(dojo.body(), 'tundra');
    }	
}

//checks the intial mapzoom and checks relevant categories for that zoom level
function setCategoryCheckBoxes(mapzoom)
{
    dojo.forEach(cats, function(item) {
        if (mapzoom >= item.zoom) {
            dojo.byId(item.type).checked = true;
        } else {
            dojo.byId(item.type).checked = false;
            toggleGroup(item.type);
        }
    });
}

function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa)
{
// Esa 2006
	//calculating km/degree
	var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
	var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

	//Loop 
	var points = [];
	var step = parseInt(360/nodes, 10)||10;
	for(var i=0; i<=360; i+=step)
	{
	var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
	(radius/lngConv * Math.sin(i * Math.PI/180)));
	points.push(pint);
	//bounds.extend(pint); //this is for fit function
	}
	points.push(points[0]); // Closes the circle, thanks Martin
	fillColor = fillColor||liColor||"#0055ff";
	liWidth = liWidth||2;
	var poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
	map.addOverlay(poly);
}

function highlightCurrentMarker(){
    var markerPoint = currentMarker.getPoint();

    var polyPoints = Array();

    if (highlightCircle) {
      map.removeOverlay(highlightCircle);
    }

    var mapNormalProj = G_NORMAL_MAP.getProjection();
    var mapZoom = map.getZoom();
    var clickedPixel = mapNormalProj.fromLatLngToPixel(markerPoint, mapZoom);

    var polySmallRadius = 20;

    var polyNumSides = 20;
    var polySideLength = 18;

    for (var a = 0; a<(polyNumSides+1); a++) {
	    var aRad = polySideLength*a*(Math.PI/180);
	    var polyRadius = polySmallRadius; 
     	var pixelX = clickedPixel.x + polyRadius * Math.cos(aRad);
	    var pixelY = clickedPixel.y + polyRadius * Math.sin(aRad);
	    var polyPixel = new GPoint(pixelX,pixelY);
	    var polyPoint = mapNormalProj.fromPixelToLatLng(polyPixel,mapZoom);
	    polyPoints.push(polyPoint);
    }
    // Using GPolygon(points,  strokeColor?,  strokeWeight?,  strokeOpacity?,  fillColor?,  fillOpacity?)
    highlightCircle = new GPolygon(polyPoints,"#000000",2,0.0,"#FF0000",.5);
    map.addOverlay(highlightCircle);
 }

function getMarkers(min_lat, min_lng, max_lat, max_lng)
{
	waterway = '';
	if (maplocation.type == 3) {
		waterway = maplocation.id;
	}
	mapzoom = map.getZoom();

	//get the visitor destinations
	if (mapzoom > 6) {
		url = buildUrl(min_lat, min_lng, max_lat, max_lng, 'destinations', waterway);
		getLayerData(url, 'town', 7);
	}

	if (mapzoom > 7) {
		url = buildUrl(min_lat, min_lng, max_lat, max_lng, 'attractions', waterway);
		getLayerData(url, 'attraction', 8);
	}
	
	if (mapzoom > 11) {
		url = buildUrl(min_lat, min_lng, max_lat, max_lng, 'fisheries', waterway);
		getLayerData(url, 'fishery', 12);
	}
	if (mapzoom > 12) {
		url = buildUrl(min_lat, min_lng, max_lat, max_lng, 'services', waterway);
		getLayerData(url, 'service', 13);
	}
}

function getLayerData(url, markercat, minzoom)
{
	om.Set('Loading....');
	GDownloadUrl(url, function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		var i = 0;
		
		for (i; i < markers.length; i++) {
			var name = markers[i].getAttribute("name");
			var cat = markers[i].getAttribute("category");
			var type = markers[i].getAttribute("type");
			var point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
	
			var id = markers[i].getAttribute("id");
			var marker = createMarker(point, name, cat, type, id);
			
			if (markercat === cat) {
				if (markergroups[cat][type] !== undefined) {
					markergroups[cat][type].push(marker);
				} 
			}

			map.addOverlay(marker);
			
			//check whether to show or hide markers according to sidebar selection.
			catchkbox = dojo.byId(cat);
            (catchkbox.checked) ? marker.show() : marker.hide();
		}
		om.Clear();
	});
}

//build a marker and add a click event
function createMarker(point, name, cat, type, id) 
{

    if (type !== undefined && type !== '') {
		map_icon = icons[type.replace(/\s+/g, "_") + "_icon"];
	} else {
		map_icon = icons[cat + '_icon'];	
	}

    var markeroptions = { icon:map_icon, title: name };
    var marker = new GMarker(point, markeroptions);
    var html = "<b>" + name + "</b><br/>";
    html +=  'Type: ' + type +'<br />';
    if (cat !== 'structure') {
	  GEvent.addListener(marker, 'click', function() {
	    getInfoWindowData(marker, cat, type, id);
	    });
    } else {
	  GEvent.addListener(marker, 'click', function() {
		  marker.openInfoWindowHtml('<strong>'+name+'</strong>');
	  });
    }

    return marker;
}

function getRouteInfoWindowData(marker, id)
{
    if (marker !== undefined && id !== undefined) {
        url = base_url + '&route_waypoint=1&waypoint_id='+id;
        GDownloadUrl(url, function(data) {
            var xml = GXml.parse(data);
            var waypoint = xml.documentElement.getElementsByTagName("waypoint");
            var i = 0;
            for (i; i < waypoint.length; i++) {
                var waypoint_name = waypoint[i].getAttribute("name");
                var position = waypoint[i].getAttribute("position");
                var description = (waypoint[i].getAttribute("description") !== null) ? waypoint[i].getAttribute("description") : '';
            }
            var hold_div = document.createElement('div');
            var hdr = document.createElement('h4');
            hdr.appendChild(document.createTextNode(position + '. ' + waypoint_name));
            hold_div.appendChild(hdr);
            var rdiv = document.createElement('p');
            rdiv.setAttribute('id', 'gwaypointdescription');
            rdiv.appendChild(document.createTextNode(description));
            hold_div.appendChild(rdiv);
            marker.openInfoWindow(hold_div, {maxWidth: 400});
        } );
    }
}

function getInfoWindowData(marker, cat, type, id)
{
	if (marker !== undefined && cat !== undefined && type !== undefined && id !== undefined) {
		url = base_url + '&detail=1&category='+cat+'&type='+type+'&id='+id;
		GDownloadUrl(url, function(data) {
			var xml = GXml.parse(data);
			var detail = xml.documentElement.getElementsByTagName("detail");
			var d=0;
			for (d; d < detail.length; d++) {
				var dname = detail[d].getAttribute("name");
				var description = (detail[d].getAttribute("description") !== null)? detail[d].getAttribute("description") : '';
				var web = detail[d].getAttribute("webaddress");
			}
			var holddiv = document.createElement('div');
			hdr = document.createElement('h4');
			hdr.appendChild(document.createTextNode(dname));
			holddiv.appendChild(hdr);
			p = document.createElement('p');
			p.appendChild(document.createTextNode(description));
			holddiv.appendChild(p);
			a = document.createElement('a');
			a.setAttribute('href', web);
			a.appendChild(document.createTextNode('More...'));
			holddiv.appendChild(a);
			holddiv.appendChild(document.createElement('br'));
			holddiv.appendChild(document.createElement('br'));
			marker.openInfoWindow(holddiv, {maxWidth: 200});
		});
	}
}

function buildUrl(min_lat, min_lng, max_lat, max_lng, type, waterway)
{
	url = base_url;
	if (min_lat !== undefined && min_lat !== '') {
		url += '&min_x=' + min_lat;
	}
	if (min_lng !== undefined && min_lng !== '') {
		url += '&min_y=' + min_lng;
	}
	if (max_lat !== undefined && max_lat !== '') {
		url += '&max_x=' + max_lat;
	}
	if (max_lng !== undefined && max_lng !== '') {
		url += '&max_y=' + max_lng;
	}
	if (type !== undefined && type !== '') {
		url += '&category=' + type;
	}
	if (waterway !== undefined && waterway !== '') {
		url += '&waterway=' + waterway;
	}
	if (type === 'route') {
		url += '&route_id=' + getRouteMapId();
	}
	return encodeURI(url);
}

function redrawMap() 
{
	newzoom = map.getZoom();
	newcentre = map.getCenter();
	newbounds = map.getBounds();
	
	sw = newbounds.getSouthWest();
	ne = newbounds.getNorthEast();
	min_lat = sw.lat();
	min_lng = ne.lng();
	max_lat = ne.lat();
	max_lng = sw.lng();
	
	
	//this gets fired whenever a zoom happens over level 11
	if ((newzoom !== lastzoom) && (newzoom > 7)) {
		mapzoom = map.getZoom();
		setCategoryCheckBoxes(mapzoom);
		getMarkers(min_lat, min_lng, max_lat, max_lng);
		lastzoom = mapzoom;
		lastbounds = newbounds;
	}
	
	//if map has been moved.
	if (!lastbounds.containsLatLng(newcentre)) {
		lastbounds = newbounds;
		getMarkers(min_lat, min_lng, max_lat, max_lng);
	}
}

function sanitiseString(str)
{
	str = str.replace(' ',  '_', "gi");
	str = str.replace('+','and',"gi");
	return str;
}

function sanitiseRouteString(str)
{
	str = str.toLowerCase();
	str = str.replace('(', '', 'gi');
	str = str.replace(')', '', 'gi');
	str = str.replace(new RegExp(" ", "gi"), '-');
	return str;
}

function toggleGroup(cat)
{
    cbx = dojo.byId(cat);
    for(var i in markergroups[cat]) {
        len = markergroups[cat][i].length;
        for (var j = 0; j < len; j++) {
            var marker = markergroups[cat][i][j];
            (cbx.checked) ? marker.show() : marker.hide();

        }
    }
}

