/*************************************
Thiess Google Map Project page:
Written by::Troy Thompson (tyronomo--at--gmail.com)
with help from examples by ESA  http://esa.ilmari.googlepages.com
**************************************/

var cm_map;
var cm_mapMarkers = [];
var cm_mapHTMLS = [];
var markerGroups = { "BU": [], "CIV": [], "PRO": [], "MIN": []  , "BUI": [], "TS": [] , "TUN": [] , "RAI": [], "SER": []};
var side_htmlStore = "";

function cm_load() {  
  if (GBrowserIsCompatible()) {
	cm_map = new GMap2(document.getElementById("cm_map"));
	cm_map.addControl(new GLargeMapControl());
	cm_map.addControl(new GMapTypeControl());
	//cm_map.setCenter(new GLatLng(-28,135), 4);
	cm_map.setCenter(new GLatLng(-22.5,130), 4);
	cm_map.enableContinuousZoom();
	cm_map.enableDoubleClickZoom();
	cm_map.enableScrollWheelZoom();

	cm_map.enableGoogleBar();
	G_DEFAULT_ICON.image = markerImage[0];	
	checkBoxes(true);	
    projectLoader();
    
  } else {
    alert("Sorry, the Thiess Project Map is not compatible with this browser");
  } 
}

  
/**
 * Creates marker with ranked Icon or blank icon,
 * depending if rank is defined. Assigns onclick function.
 * @param {GLatLng} point Point to create marker at
 * @param {String} html HTML to display in InfoWindow
 * @param {Number} rank Number rank of marker
 * @param {String} disc Discipline(s) groups the project is to be added too
 * @return {GMarker} Marker created
 */
 
function cm_createMarker(point, html, rank, disc) {
	var newPoint = point;
	var marker = new GMarker(point);
	marker.value = rank;
	marker.visited = false;
	
	//TT: add this marker to the marker array(s - if multi disc)
	if(disc.indexOf(',') > 0){ 
		var allDisc = disc.split(',');
		for(t = 0; t < allDisc.length; t++){
			var bonusDisc = allDisc[t];
			try {	
				markerGroups[bonusDisc].push(marker);
			} catch (err) {
		        	//no marker group for you	
			}
		}
	} else {
		try {	
			markerGroups[disc].push(marker);
		} catch (err) {
	        	//no marker group for you	
		}
	}
	
	GEvent.addListener(marker, "click", function() {
		marker.setImage(markerImage[2]);
		marker.openInfoWindowHtml(html);
	});
	
	GEvent.addListener(marker, "mouseover", function() {
		marker.setImage(markerImage[1]);
		var elem = document.getElementById("sidebar").getElementsByTagName("div")[rank];
		elem.style.color ="#EC6513";
		elem.style.background = "#e7e7e7";
	});
	
	GEvent.addListener(marker, "mouseout", function() {
		if(marker.visited)
			marker.setImage(markerImage[2]);
		else
			marker.setImage(markerImage[0]);
		
		var elem = document.getElementById("sidebar").getElementsByTagName("div")[rank];
		elem.style.color ="black";
		elem.style.background ="white";
	});
	
	GEvent.addListener(marker, "infowindowclose", function() {
		marker.setImage(markerImage[0]);
		marker.visited = false;		
	});
	
	GEvent.addListener(marker, "infowindowopen", function() {
		marker.setImage(markerImage[2]);
		marker.visited = true;
	});

  	return marker;
}

/**********************************************************************************************************************************************/

function trim(str) {
	s = str.replace(/^(\s)*/, '');
	s = s.replace(/(\s)*$/, '');
	return s;
}

function getXMLtagString(tag, data){
	return trim(data.substring(data.indexOf("<"+tag+">") + tag.length + 2, data.indexOf("</"+tag+">")));
}

function projectLoader() {
	//TT: Map data is read in from a CDF file attatched to the Project Data page.	
	GDownloadUrl(xmlURL, function(data, responseCode) {
		// Check status code is equal to 200 before processing the data, to find HTTP errors that result in null or bad data
		if(responseCode == 200) {
			data = getXMLtagString("prj_data_list", data);
			var endTag = "</cExtra>";	//Closing tag of table Row
			var xmlArray = data.split(endTag);
						
			for (var i = 0; i < xmlArray.length-1; i++) {
				var thisLine = xmlArray[i]+endTag;
				var gProjectName 	 = getXMLtagString("cName", thisLine);
				var gLattitude   	 = getXMLtagString("cLat", thisLine);
				var gLongitude   	 = getXMLtagString("cLng", thisLine);
				var gContent 		= getXMLtagString("cStreet", thisLine);
				var gLinks 		 = getXMLtagString("cLink", thisLine);
				var gDisc 		 = getXMLtagString("cExtra", thisLine);
				var point = new GLatLng(gLattitude, gLongitude);

				var html = "<div id=infoBox>" + "<B>"+ gProjectName +"</B><BR>"+ gContent +"<BR>"+ gLinks + "</div>";
				//html = html.replace(/\[!--\$ssServerRelativeSiteRoot--\]/, "<!--$ssServerRelativeSiteRoot-->");
				html = html.replace(/\[!--\$ssServerRelativeSiteRoot--\]/, serverRoot);
				var marker = cm_createMarker(point,html,i,gDisc);
				cm_map.addOverlay(marker);
				cm_mapMarkers.push(marker);
				cm_mapHTMLS.push(html);

				sideBarFill(gProjectName, i);
			}
			
			for (groupName in markerGroups) {
				if(markerGroups[groupName].length < 0)
					document.getElementById("tsCheckbox").disabled = true;
			}
			
		} else if(responseCode == -1) {
			alert("Data request timed out. Please try later.");
		} else {
			alert("Request resulted in error. Check XML file is retrievable.");
			//TODO: A static fallback/list if the XML file is broken/unavailable for all errors?
		}
	});
}


/******************************************** CUT TWO ********************************************/

function sideBarFill(line, j){
	side_htmlStore += "<span class='indexbar'";
	side_htmlStore += "onclick='GEvent.trigger(cm_mapMarkers["+j+"],\"click\")' ";
	side_htmlStore += "onmouseover='GEvent.trigger(cm_mapMarkers["+j+"],\"mouseover\")' ";
	side_htmlStore += "onmouseout='GEvent.trigger(cm_mapMarkers["+j+"],\"mouseout\")' ";
	side_htmlStore += ">";
	side_htmlStore += "<div id=sideLine>";
	side_htmlStore += line;
	side_htmlStore += "</div>";
	side_htmlStore += "</span>";
	document.getElementById("sidebar").innerHTML = side_htmlStore;
}

/**************************************************** EXTRAS ***************************************************/

	function toggleMaker(marker, showMe){
		var rank = marker.value;
		if (showMe) {
			marker.show();
			//document.getElementById("sideLine" + rank).style.display = "block";
			document.getElementById("sidebar").getElementsByTagName("div")[rank].style.display = "block";
		} else {
			marker.closeInfoWindow();
			marker.hide();
			//document.getElementById("sideLine" + rank).style.display = "none";
			document.getElementById("sidebar").getElementsByTagName("div")[rank].style.display = "none";
		}	
	}

    function toggleGroup(disc) {
		var showMark = document.getElementById(disc+"Checkbox").checked;    	
		for (var i = 0; i < markerGroups[disc].length; i++) {
			var marker = markerGroups[disc][i];
			toggleMaker(marker, showMark);
		} 
	}

    function toggleMultiDisc(disc) {
		var showMark = document.getElementById(disc+"Checkbox").checked;
		toggleGroup(disc);
		
		if(!showMark){
			for (groupName in markerGroups) {
				if(disc != groupName){
					var boxOn = document.getElementById(groupName+"Checkbox").checked;
					if(boxOn)
						toggleGroup(groupName);
				}
			}
		}
	}


    function toggleMarkerButton(showMark) {
      for (groupName in markerGroups) {
        for (var i = 0; i < markerGroups[groupName].length; i++) {
          	var marker = markerGroups[groupName][i];
			toggleMaker(marker, showMark);
        }
      }
    }

	function resetMap(){
		//cm_map.setCenter(new GLatLng(-28,135), 4);
		cm_map.setCenter(new GLatLng(-22.5,130), 4);
		toggleMarkerButton(true);
		checkBoxes(true);
	}
	
	function checkBoxes(status){
		for (groupName in markerGroups) {
			//TT: For some reason this link breaks firefox : TODO - Fix it somehow :(
			try	{
				document.getElementById(groupName+"Checkbox").checked = status;
			} catch(err) {
			//Handle errors here
			}
		}
	}