var defaultLong = -0.074458122253418;
var defaultLat = 51.4266813930895;
var defaultZoom = 2;
var userZoom = 0;

var clusterer;

function showPopup(marker, loc) {
		var qs = location.search;
		if (qs.charAt(0) != "?") qs = "?" + qs;
		qs += "&map=" + loc.getAttribute("g");
		
		var articles = loc.getAttribute("a");
				
		Ext.Ajax.request({
			url: '/xqueries/google-popup-embed.xqy' + qs,
			disableCaching : false,
			success: function(r) {
				try {
					var arts = articles.toString() + " Article" + ((articles > 1)? "s" : "");
					marker.openInfoWindowHtml(r.responseText.replace("#articles#", arts));
				}
				catch(e) {}
			}
		});
}



function addMarker(point, icon, loc)
{
	var marker = new GMarker(point, {icon: icon});	
	GEvent.addListener(marker, "click", function() { 
		showPopup(marker, loc);
	});
	return marker;
}

var map;

var GMapEventHandler = {
    addEvent: function(elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        }
        else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            return r;
        }
        else {
            elm['on' + evType] = fn;
        }
    },

    load: function(qs) {
        if (GBrowserIsCompatible()) {
            map = new GMap2(document.getElementById("map"));
            map.addControl(new GSmallMapControl());

            map.enableDoubleClickZoom();
            map.enableContinuousZoom();
            map.enableScrollWheelZoom();
            map.getContainer().style.overflow = "hidden";

            GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", GMapEventHandler.wheelevent);
            GMapEventHandler.addEvent(map.getContainer(), 'mousewheel', GMapEventHandler.wheelevent);
						
						//get zoom from querystring
						var qsarray = Ext.urlDecode((location.search.length > 1)? location.search.substring(1) : '');
						if (qsarray.zoom) {
							try {	
								userZoom = parseInt(qsarray.zoom);
							} catch(e) {}
						}
						
						//console.log(userZoom);
            /* Icon array for colour coding*/
            var icons = []
            for (var i = 1; i < 6; i++) {
                var icon = new GIcon();
                icon.image = "/images/gmap/clusters/" + i + "s.png";
                icon.smallImage = "/images/gmap/clusters/" + i + "s.png";
                icon.shadow = "/images/gmap/small_shadow.png";
                icon.iconSize = new GSize(16,27); //small
                icon.shadowSize = new GSize(37,35);
                icon.iconAnchor = new GPoint(13, 20);
                icon.infoWindowAnchor = new GPoint(12, 0);
                icons.push(icon);
            }

            GDownloadUrl("/xqueries/google.xqy" + qs,
								function(data, responseCode) {
								    //read from xml
								    var xml = GXml.parse(data);
								    var locs = xml.documentElement.getElementsByTagName("l");
										
										//console.log(data);
								    GMapEventHandler.MapMarkers = new Array(locs.length);

								    clusterer = new Clusterer(map);

								    for (var i = 0; i < locs.length; i++) {
								        var geo = locs[i].getAttribute("g").split(",");
								        var articles = locs[i].getAttribute("a");
								        var heat = parseInt(locs[i].getAttribute("h"));

								        var m = addMarker(new GLatLng(geo[1], geo[0]), icons[heat - 1], locs[i]);
								        GMapEventHandler.MapMarkers = m;
								        clusterer.AddMarker(m, heat);
												
												if (i == 0) {
													defaultLat = geo[1];
													defaultLong = geo[0];
												}
												
								    }
										
										//calc bounds of points
								    var points = xml.documentElement.getElementsByTagName("p");

								    if (points.length > 0) {
								        var bounds = new GLatLngBounds();
								        for (var p = 0; p < points.length; p++) {
								            bounds.extend(new GLatLng(points[p].getAttribute("lat"), points[p].getAttribute("long")))
								        }
												
												//calc zoom level. userZoom has priority, then calc from points, then default.
												var zoom = defaultZoom;
												if (userZoom === 0) {
													zoom = map.getBoundsZoomLevel(bounds);
													if (zoom > 11) zoom = 11;  //max zoom at 11
												}
												else {
													zoom = userZoom;
												}
								        map.setCenter(bounds.getCenter(), zoom);
								    }
								    else {
												map.setCenter(new GLatLng(defaultLat, defaultLong), (userZoom===0)? defaultZoom : userZoom);
								    }
										//console.log('zoomLevel=', (userZoom===0)? defaultZoom : userZoom);
								}
						);
        }
    },
    wheelevent: function(e) {
        if (!e) e = window.event;
        if (e.preventDefault) e.preventDefault();
        e.returnValue = false;
    }

}

//GMapEventHandler.addEvent(window, 'load', GMapEventHandler.load, false);
GMapEventHandler.addEvent(window, 'unload', GUnload, false);

/* override Clusterer functions*/
Clusterer.PopUp = function(cluster) {
  map.setCenter(cluster.marker.getPoint(), map.getZoom()+1);
}

