var defaultLong = -0.074458122253418;
var defaultLat = 51.4266813930895;
var defaultZoom = 2;

var clusterer;

function showPopup(marker, loc) {
		//console.log(loc);
		var qs = location.search;
		if (qs.charAt(0) != "?") qs = "?" + qs;
		if (qs.indexOf("val=geo:") == -1) qs += "&val=geo:" + loc.getAttribute("g")
		
		var articles = loc.getAttribute("a");
		
		Ext.Ajax.request({
			url: '/xqueries/google-popup-top100.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);
						
						//map.setCenter(new GLatLng(defaultLat,defaultLong), defaultZoom);
                        
						var uri = parent.document.URL.split("?");
						/* 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);
						}					
                if (uri[1] == "val=pubname:PubMed+Central")
                    {
						var qs = "val=pubname%3aPubMed+Central";
						GDownloadUrl("/xqueries/google.xqy?" + qs,
								function(data, responseCode) {
							
								    //read from xml
								    var xml = GXml.parse(data);
									try{
										var locs = xml.documentElement.getElementsByTagName("l");
									}catch(e){
									}
								    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")))
								        }
								        var zoom = map.getBoundsZoomLevel(bounds);
								        if (zoom > 11) zoom = 11;
								        map.setCenter(bounds.getCenter(), zoom);
								    }
								    else {
								        map.setCenter(new GLatLng(defaultLat, defaultLong), defaultZoom);
								    }
								}
						);
					}
					else
					{
						GDownloadUrl("/xqueries/google-top100.xqy?" + qs, 
										function(data, responseCode) {
										//read from xml
										var xml = GXml.parse(data);
										var locs = xml.documentElement.getElementsByTagName("l"); 
										GMapEventHandler.MapMarkers = new Array(locs.length);
										
										//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")))
											}
											var zoom = map.getBoundsZoomLevel(bounds);
											if (zoom > 11) zoom = 11;
											map.setCenter(bounds.getCenter(), zoom);
										}
										else {
											map.setCenter(new GLatLng(defaultLat,defaultLong), defaultZoom);
										}
										
										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);
										}
								}
						);
					}
				}
		},
		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);
}

