﻿/**
* @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: [],
        bubbleMarkers: [],
        markersXML: '',
        XMLMarkerNodeName: 'point',
        XMLMarkerLinkText: 'Visa information',
        HTMLList: null,
        loadComplete: null
    };

    /**
    * 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, description, 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"><a href="' + url + '"><strong>' + name + '</strong></a><br />' + description + '</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.HTMLList) {
            var linkContainer = document.getElementById(options.HTMLList);
            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'), point.getAttribute('description'), linkURLs, point.getAttribute('markericon')));
        }
    }

    /**
    * Creates markers from bubbleMarkers variable on map
    * @param markers The markers
    */
    function createBubbleMarkers(markers) {
        if (markers != null && markers.length > 0) {
            for (var i = 0, len = markers.length; i < len; i++) {
                marker = markers[i];
                map.addOverlay(createMarker(marker.latitude, marker.longitude, marker.URL, marker.name, marker.description, []));
            }
        }
    }

    /**
    * Loads map into element with id from options.mapContainerId
    */
    function load() {
        if (GBrowserIsCompatible()) {
            // Create element
            var mapContainer = document.getElementById(options.mapContainerId);
            if (mapContainer != null) {
                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);
                if (options.defaultCenter != null && options.defaultCenter.length > 0) {
                    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;
                }

                // Init map controls (normal, satellite, hybrid)
                //				map.setMapType( G_NORMAL_MAP ); // G_NORMAL_MAP, G_HYBRID_MAP or G_SATELLITE_MAP
                //				var mapControl = new GMapTypeControl();
                //				map.addControl(mapControl);
                //    			
                // 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.bubbleMarkers && options.bubbleMarkers.length > 0) {
                    createBubbleMarkers(options.bubbleMarkers);
                }

                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
    };
} ();
