var map;
var gmarkers = new Array();
var gicons = new Hash();
var solutionMarkers = new Hash();
var xmlDoc;
var popupHtml;

if (typeof zoom == 'undefined') {
	zoom = 4;
}
if (typeof centerLat == 'undefined') {
	centerLat = -27.804398;
}
if (typeof centerLong == 'undefined') {
	centerLong = 133.775136;
}

if (typeof minZoom == 'undefined') {
	minZoom = zoom;
}

// enforce minZoom
G_NORMAL_MAP.getMinimumResolution = function () { return minZoom };

function map_init() {

	if (GBrowserIsCompatible() && xmlUrl) {
		
		map = new GMap2(document.getElementById("map_canvas"));
		map.setCenter(new GLatLng(centerLat, centerLong), zoom);
		map.addControl(new GLargeMapControl());
		GEvent.addListener(map, "click", mapClickListener);

		var request = GXmlHttp.create();
		request.open("GET", xmlUrl, true);
		request.onreadystatechange = function() {

			if (request.readyState == 4) {

				xmlDoc = GXml.parse(request.responseText);

				loadIcons(xmlDoc);

				loadMarkers(xmlDoc);

				drawMarkers();

				if (popupUrl) {

					popupRequest = GXmlHttp.create();
					popupRequest.open("GET", popupUrl, true);
					popupRequest.onreadystatechange = function() {

						if (popupRequest.readyState == 4) {

							popupHtml = popupRequest.responseText;

						}

					}
					popupRequest.send(null);

				}

			}

		}
		request.send(null);

	}

}

function drawMarkers() {

	map.clearOverlays();

	var markerArray;

	if (typeof solution == 'undefined') {

		markerArray = gmarkers;

	} else {

		markerArray = solutionMarkers.getItem(solution);

		if (typeof markerArray == 'undefined') {
			markerArray = gmarkers;
		}

	}

	for (var i = 0; i < markerArray.length; i++) {
		map.addOverlay(markerArray[i]);
	}

}

function loadIcons(xmlDoc) {

	var iconTags = xmlDoc.documentElement.getElementsByTagName("Type");

	for (var i = 0; i < iconTags.length; i++) {

		var codeTags = iconTags[i].getElementsByTagName("Code");
		var imageTags = iconTags[i].getElementsByTagName("Icon");

		if (codeTags.length > 0 && imageTags.length > 0) {

			var code = GXml.value(codeTags[0]);
			var image = GXml.value(imageTags[0]);
			var width = getTagValue(iconTags[i], "IconWidth");
			var height = getTagValue(iconTags[i], "IconHeight");
			var iconObj = new GIcon(G_DEFAULT_ICON);
			iconObj.image = image;
			iconObj.shadow = null;
			if (code != "" && image != "") {
				if (width != "" && height != "") {
					iconObj.iconSize = new GSize(width, height);
				}
				iconObj.itemName = getTagValue(iconTags[i], "ItemName");
				iconObj.typeName = getTagValue(iconTags[i], "Name");
				gicons.setItem(code, iconObj);
			}

		}

	}

}

function loadMarkers(xmlDoc) {

	var markerTags = xmlDoc.documentElement.getElementsByTagName("Marker");

	for (var i = 0; i < markerTags.length; i++) {

		var point = getPoint(markerTags[i]);
		
		if (point != null) {
			var icon = getIcon(markerTags[i]);
			var marker = new GMarker(point, { icon: icon });
			marker.xml = markerTags[i];
			addToSolutions(marker);
			gmarkers.push(marker);
		}
	
	}

}

function addToSolutions(marker) {

	var solutionsTags = marker.xml.getElementsByTagName("Solutions");
	
	if (solutionsTags.length > 0) {

		var solutions = GXml.value(solutionsTags[0]).split(",");
		
		for (var i = 0; i < solutions.length; i++) {
			addMarkerToSolution(marker, solutions[i].replace(/^\s+|\s+$/g, ''));
		}

	}

}

function addMarkerToSolution(marker, solution) {

	var markerArray;

	if (solutionMarkers.hasItem(solution)) {

		markerArray = solutionMarkers.getItem(solution);

	} else {

		markerArray = new Array();

	}

	markerArray.push(marker);
	solutionMarkers.setItem(solution, markerArray);

}

function getPoint(markerTag) {

	var coordsTags = markerTag.getElementsByTagName("Coords");
	if (coordsTags.length > 0) {
		var coordVals = GXml.value(coordsTags[0]).split(",");
		if (coordVals.length == 2) {
			return new GLatLng(
				parseFloat(coordVals[0]),
				parseFloat(coordVals[1]));
		}
	}

	return null;

}

function getIcon(markerTag) {

	var typeTags = markerTag.getElementsByTagName("Type");
	if (typeTags.length > 0) {
		var typeVal = GXml.value(typeTags[0]).replace(/^\s+|\s+$/g, '');
		return gicons.getItem(typeVal);
	}

	return null;

}		

function getTagValue(markerTag, tagName) {

	var tags = markerTag.getElementsByTagName(tagName);
	if (tags.length > 0) {
		return GXml.value(tags[0]).replace(/^\s+|\s+$/g, '');
	} else {
		return "";
	}

}	

GEvent.addDomListener(window, "load", map_init);
GEvent.addDomListener(window, "unload", GUnload);

function Hash() {

	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	}
   
	this.removeItem = function(in_key) {
		var tmp_value;
		if (typeof(this.items[in_key]) != 'undefined') {
			this.length--;
			var tmp_value = this.items[in_key];
			delete this.items[in_key];
		}
	   
		return tmp_value;
	}

	this.getItem = function(in_key) {
		return this.items[in_key];
	}

	this.setItem = function(in_key, in_value) {
		if (typeof(in_value) != 'undefined') {
			if (typeof(this.items[in_key]) == 'undefined') {
				this.length++;
			}

			this.items[in_key] = in_value;
		}
	   
		return in_value;
	}

	this.hasItem = function(in_key) {
		return typeof(this.items[in_key]) != 'undefined';
	}

}

function updateSolutions() {

	var select = document.getElementById("map_solutions");
	solution = select.options[select.selectedIndex].value;
	
	drawMarkers();

}

function mapClickListener(overlay, point) {

	if (overlay) {

		if (overlay.xml) {

			map.closeInfoWindow();
			overlay.openInfoWindowHtml(parseMasks(popupHtml, overlay));
	
		}

	}

}

function parseMasks(htmlStr, point) {

	var parsedStr = htmlStr.replace(/<Name>/g, getTagValue(point.xml, "Name"));
	parsedStr = parsedStr.replace(/<Source>/g, getTagValue(point.xml, "Source"));
	parsedStr = parsedStr.replace(/<Topic>/g, getTagValue(point.xml, "Topic"));
	parsedStr = parsedStr.replace(/<Link>/g, getTagValue(point.xml, "Link"));
	parsedStr = parsedStr.replace(/<Town>/g, getTagValue(point.xml, "Town"));
	parsedStr = parsedStr.replace(/<TypeName>/g, point.getIcon().typeName);
	parsedStr = parsedStr.replace(/<TypeItemName>/g, point.getIcon().itemName);
	return parsedStr;

}

function updateElement(elId, content) {

	var el = document.getElementById(elId);

	if (el) {

		el.innerHTML = content;

	}

}

function updateLink(linkId, href) {

	var link = document.getElementById(linkId);
	
	if (link) {

		link.href = href;

	}

}

