/**
* @fileoverview Wrapper for Google Maps API. 
*/

// Create NetR namespace if it doesn't exist
if (typeof(NetR) === 'undefined') { 
	var NetR = {}; 
}

NetR.GMaps = function () {
	var map = null;
	// Default options
	var options = {
		defaultCenter: [62.81712382315854, 15.167114897638328],
		defaultZoom: 4,
		mapControl: 'large',
		mapContainerId: 'map-container',
		mapElementId: 'map',
		mapClass: '',
		markerAtCenter: false,
		markers: [],
		markersXML: '',
		XMLMarkerNodeName: 'point',
		XMLMarkerLinkText: 'Visa information',
		loadComplete: null,
		restaurantList: 'restaurantList'
	};

	/**
	* Creates a marker on the map, with info bubble displaying on mouseover
	* @param lat Latitude for marker location
	* @param lon Longitude for marker location
	* @param url URL for more info about marker location
	* @param name Name of location
	* @param linkURLs URLs of links that have corresponding map markers
	*/
	function createMarker(lat, lon, url, name, linkURLs) {
		var point = new GLatLng(lat, lon);
		var marker = new GMarker(point);
	    var domain = "http://" + document.domain;
	    var bubble = function () {
			map.openInfoWindowHtml(point, '<div class="bubble"><strong>' + name + '</strong><br /><br /><a href="' + url + '">' + options.XMLMarkerLinkText + '</a></div>');
		};
	    GEvent.addListener(marker, 'mouseover', bubble);
	    if (linkURLs[domain + url]) {
	        NetR.GMapsUtil.addEvent(linkURLs[domain + url], 'mouseover', bubble);
	    }
	    return marker;
    }

	/**
	* Creates markers from XML document on map
	* @param xml The XML document returned by an Ajax request
	*/
	function createMarkers(xml) {
		var points = xml.getElementsByTagName(options.XMLMarkerNodeName);
		var linkURLs = {};
		if (options.restaurantList) {
		    var linkContainer = document.getElementById(options.restaurantList);
		    if (linkContainer) {
		        var links = linkContainer.getElementsByTagName("a");
		        for (var i = 0, len = links.length; i < len;i++) {
		            linkURLs[links[i].href] = links[i];
		        }
		    }
		}
		var point;
		for (var i = 0, len = points.length; i < len; i++) {
			point = points[i];
	        map.addOverlay(createMarker(point.getAttribute('latitude'), point.getAttribute('longitude'), point.getAttribute('URL'), point.getAttribute('name'), linkURLs));
		}
	}

	/**
	* Loads map into element with id from options.mapContainerId
	*/
    function load() {
		if (GBrowserIsCompatible() && document.getElementById(options.mapContainerId)) {
			// Create element
			var mapContainer = document.getElementById(options.mapContainerId);
			var mapElement = document.createElement('div');
			mapElement.id = options.mapElementId;
			if (options.mapClass && options.mapClass.length > 0) {
				mapElement.className = options.mapClass;
			}
			mapContainer.innerHTML = '';
			mapContainer.appendChild(mapElement);
	        
			// Init map
			map = new GMap2(mapElement);
			var centerPoint = new GLatLng(options.defaultCenter[0], options.defaultCenter[1]); 
			map.setCenter(centerPoint, options.defaultZoom);
	        
			// Add map controls
			switch (options.mapControl) {
			case "large":
				map.addControl(new GLargeMapControl());
				break;
			case "small":
				map.addControl(new GSmallMapControl());
				break;
			}
			
			// Marker at center point?
			if (options.markerAtCenter) {
				map.addOverlay(new GMarker(centerPoint));
			}
			
			// Add additional markers?
			if (options.markers && options.markers.length > 0) {
				for (var i = 0, len = options.markers.length; i < len; i++) {
					map.addOverlay(new GMarker(new GLatLng(options.markers[i][0], options.markers[i][1])));
				}
			}

			if (options.markersXML && options.markersXML.length > 0) {
				NetR.GMapsUtil.loadMarkersFromXML(options.markersXML, createMarkers);
			}
			
			// Execute loadComplete function (if it exists)
			if (typeof(options.loadComplete) === "function") {
				options.loadComplete(map);
			}
		}
    }

	/**
	* Accessor function for map object
	*/
	function getMap() {
		return map;
	}

	/**
	* Initialization
	*/
	function init(opts) {
		if (!document.getElementById || !document.createElement || (typeof(NetR.GMapsUtil) === 'undefined')) {
			return;
		} 
		// If options were supplied, apply them to the option Object.
		for (var key in opts) {
			if (options.hasOwnProperty(key)) {
				options[key] = opts[key];
			}
		}

		load();
		NetR.GMapsUtil.addEvent(window, 'unload', GUnload);
	}

	return {
		init: init,
		createMarkers: createMarkers,
		getMap: getMap
	};
}();
