/**
* @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,
        schoolList: 'schoolList'
    };

    /**
    * 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, '<strong>' + name + '</strong><br /><br /><a href="' + url + '">' + options.XMLMarkerLinkText + '</a>');
        };
        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.schoolList) {
            var linkContainer = document.getElementById(options.schoolList);
            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()) {
            // 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
    };
} ();
