google.load("maps","3", {other_params:"sensor=false"});
google.load("jquery","1.3.2");

var map;
var table;
var infowindow;
var fafter;
var fbefore;

function openInfoWindow(m) {
	var nv = table.numVisible(m.loc);
	var ni = table.numItems(m.loc);
	var mult = "";
	if(nv > 1) {
		var ia = table.itemAfter(m);
		var ib = table.itemBefore(m);
		fafter = function() {openInfoWindow(table.items[m.loc][0][ia]);};
		fbefore = function() {openInfoWindow(table.items[m.loc][0][ib]);};
		mult = "<center><table width='90%'><tr><td align='left' class='button' onclick='fbefore()'>Prev</td><td width='150' align='center'>"+(ib+1)+" of "+ni+"</td><td align='right' class='button' onclick='fafter()'>Next</td></tr></table></center>";
	}
	if(typeof(infowindow)!="undefined") {infowindow.close();}
	infowindow = new google.maps.InfoWindow({maxWidth:300, pixelOffset:new google.maps.Size(0,35), content:mult+m.content});
	infowindow.open(map,m);
}

function Hash() {
	this.items = [];

	this.numItems = function(key) {
		return this.items[key][0].length;
	};
	
	this.itemAfter = function(m) {
		var key = m.loc;
		var len = this.numItems(key);
		//var grantvalue = document.getElementById("grant").value;
		var timeperiod = document.getElementById("timeperiod").value;
		for(var i=0; i<len; i++) {
			if(this.items[key][0][i] == m && i<len) {//found the current marker in array list
				var j = i+1;
				while(1) { //now starting from current marker, find next marker in the list which matches current grant
					if(j>len-1) {//if we hit the end of the list, start from beginning
						j=0;
					}
					//if((grantvalue == 0 || this.items[key][0][j].color == grantvalue) && (timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
					if((timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
						return j;
					}
					j++;
				}
			}
		}
	};
	
	this.itemBefore = function(m) {
		var key = m.loc;
		var len = this.numItems(key);
		//var grantvalue = document.getElementById("grant").value;
		var timeperiod = document.getElementById("timeperiod").value;
		for(var i=0; i<len; i++) {
			if(this.items[key][0][i] == m && i<len) {
				//return i-1;
				var j = i-1;
				while(1) { //now starting from current marker, find next marker in the list which matches current grant
					if(j<0) {//if we hit the end of the list, start from beginning
						j=len-1;
					}
					//if((grantvalue == 0 || this.items[key][0][j].color == grantvalue) && (timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
					if((timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
						return j;
					}
					j--;
				}
			}
		}
	};

	this.numVisible = function(key) {
		//var grantvalue = document.getElementById("grant").value;
		var timeperiod = document.getElementById("timeperiod").value;
		var len = this.numItems(key);
		var count = 0;
		for(var j=0; j<len; j++) {
			//if((grantvalue == 0 || this.items[key][0][j].color == grantvalue) && (timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
			if((timeperiod == 0 || this.items[key][0][j].tp == timeperiod)) {
				count++;
			}
		}
		return count;
	};

	this.addItem = function(key,m) {
		if(typeof(this.items[key]) == 'undefined') {//if new city
			this.items[key] = new Array(2);
			this.items[key][0] = [];
			this.items[key][1] = null;
		}
		this.items[key][0].push(m);
		var len = this.items[key][0].length;
		if(len == 2) {//if we already have a marker in that city
			var firstmarker = this.items[key][0][0];
			firstmarker.setVisible(false); //hide first and new markers
			m.setVisible(false);
			var latlng = firstmarker.getPosition();
			var newmarker = new google.maps.Marker({icon:"markers/2.png", position:latlng, map:map, title:"2 markers in "+m.loc});
			google.maps.event.addListener(newmarker,"click",function() {
				openInfoWindow(m);
			});
			this.items[key][1] = newmarker;
		} else if(len > 2) {
			m.setVisible(false);
			this.items[key][1].setTitle(len+" markers in "+m.loc);
			this.items[key][1].setIcon("markers/"+((len<10) ? len : 9)+".png");
		}
	};
}

table = new Hash();

function initialize() {
	var myLatlng = new google.maps.LatLng(20,25);
	var myOptions = {
		zoom: 2,
		mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
		center: myLatlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	
	google.maps.event.addListener(map,'zoom_changed',function() {
		if(typeof(infowindow)!="undefined") {infowindow.close();}
	});

	$.ajax({
		type:"GET",
		url:"markers.cfm",
		dataType: ($.browser.msie) ? "text" : "xml",
		success: function(data) {
			if($.browser.msie && typeof data == "string") {
				var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(data);
				data = xmlDoc;
			}
			$(data).find("marker").each(function() {
				var marker = jQuery(this);
				var mname = marker.find("name").text();
				//var mgrant = marker.find("grant").text()+"<br>";
				var color;
				switch(marker.find("timeperiod").text()) {
					case "2011-2012": color = "blue"; break;
					case "2010-2011": color = "yellow"; break;
					case "2009-2010": color = "green"; break;
				}
				var mextra = (marker.find("extra").text() === "") ? "" : marker.find("extra").text()+"<br>";
				var mcountry = marker.find("country").text();
				var mcity = marker.find("city").text();
				var mdate = (marker.find("date").text() === "") ? "" : marker.find("date").text()+"<br>";
				var murl = (marker.find("url").text() === "") ? "" : "<a href=\""+marker.find("url").attr("href")+"\">"+marker.find("url").text()+"</a>";
				var mlat = marker.attr("lat");
				var mlong = marker.attr("lng");
				var latlng = new google.maps.LatLng(parseFloat(mlat), parseFloat(mlong));
				var themarker = new google.maps.Marker({icon:"markers/"+color+".png", position:latlng, map:map, title:mname+" - "+mcity+", "+mcountry});
				themarker.color = color;
				themarker.tp = marker.find("timeperiod").text();
				themarker.loc = mcity+mcountry;
				themarker.content = "<div style='line-height:1.3em; text-align:center;'><b>"+mname+"</b><br>Department of "+marker.find('dept').text()+"<br>"+mextra+mcity+", "+mcountry+"<br>"+mdate+murl+"</div>";
				table.addItem(mcity+mcountry,themarker);
				google.maps.event.addListener(themarker,"click",function() {
					openInfoWindow(themarker);
				});
			});
		}
	});
}
google.setOnLoadCallback(initialize);

/*
function showGrant() {
	if(typeof(infowindow)!="undefined") {infowindow.close();}
	var num; var i; var j;
	//var grantvalue = document.getElementById("grant").value;
	var timeperiod = document.getElementById("timeperiod").value;
	for(i in table.items) {
		if(table.items[i][1]) {
			table.items[i][1].setMap(null);
			table.items[i][1] = null;
		}
		num = table.numItems(i);
		for(j=0; j<num; j++) {
			table.items[i][0][j].setVisible((grantvalue == 0 || table.items[i][0][j].color == grantvalue) && (timeperiod == 0 || table.items[i][0][j].tp == timeperiod));
		}
	}
	//old combineMarkers function
	for(i in table.items) {
		var numV = table.numVisible(i);//only do for markers that need grouping/splitting
		if(numV > 1) {
			num = table.numItems(i);
			var firstj = -1;
			for(j=0; j<num; j++) {
				if((grantvalue == 0 || table.items[i][0][j].color == grantvalue) && (timeperiod == 0 || table.items[i][0][j].tp == timeperiod)) {
					table.items[i][0][j].setVisible(false);
					if(firstj<0) {
						firstj = j;
					}
				}
			}
			var newmarker = new google.maps.Marker({icon:"markers/"+((numV<10) ? numV : 9)+".png", position:table.items[i][0][firstj].getPosition(), map:map, title:numV+" markers in "+table.items[i][0][firstj].loc});
			var isStupid = function(dumb,er) {
				google.maps.event.addListener(table.items[dumb][1],"click",function() {
					openInfoWindow(table.items[dumb][0][er]);
				});
			};
			table.items[i][1] = newmarker;
			isStupid(i,firstj);
		}
	}
}*/

//http://www.google.com/chart?chst=d_map_pin_letter&chld=3|ffff00|000000
