// Global vars
var $E,$D,$,map,myMap,geocoder,baseIcon, markers, linkMarkerMapping;

YAHOO.namespace('IEDesign');

YAHOO.IEDesign.map = function () {

    // Default config
    var config = {
        mapElementId : 'map_canvas',
        center: 'fixed',
        centerLat: 37.4419,
        centerLong: -122.1419,
        zoom: 6
    }

    // aSyncRequest callback
    /*var getJSON = {

        success: function(o) {

            alert('here');

            // Parse JSON
            try {

                var json = YAHOO.lang.JSON.parse(o.responseText);

            } catch (e) {

                alert("ERROR: Invalid JSON string provided from json_url: " + config['json_url']);

            }

            // Replace any values in local config with loaded json config values
            for (attrname in json.config) { config[attrname] = json.config[attrname]; }

            // Initialise map
            if (GBrowserIsCompatible()) {

                // Create map from config params
                map = new google.maps.Map2($(config['mapElementId']));
                map.setCenter(new GLatLng(config['centerLat'], config['centerLong']), config['zoom']);
                map.setUIToDefault();

                // Set base icon for markers
                baseIcon = new GIcon(G_DEFAULT_ICON);
                baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
                baseIcon.iconSize = new GSize(20, 34);
                baseIcon.shadowSize = new GSize(37, 34);
                baseIcon.iconAnchor = new GPoint(9, 34);
                baseIcon.infoWindowAnchor = new GPoint(9, 2);

                // Ensure the map is cleared of markers before continuing
                clearAllMarkers();

                // Set markers global
                markers = json.markers;

                if (markers.length > 0) {

                    createMarker(markers[0],0);

                } else {

                    alert('No markers to display');

                }

            } else {

                alert('You are not using a browser which is compatible with google maps');

            }

        },

        failure: function(o) { alert('ERROR: Could not retrieve from json_url'); },
        timeout: 5000

	}*/

    // Load JSON
    function init(m) {

        // JSON is already parsed
        markers = m;
        
        // to link markers and links
        // linkMarkerMapping = mapMarkerLinks();
        
        if (GBrowserIsCompatible()) {

            map = new GMap2(document.getElementById("map_canvas"));
            map.setCenter(new GLatLng(52.9663214, -1.5242192), 6);

            map.setUIToDefault();

            map.disableScrollWheelZoom();

            baseIcon = new GIcon(G_DEFAULT_ICON);
            baseIcon.image = "/img/search/location_flag.png";
            baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
            baseIcon.iconSize = new GSize(20, 34);
            baseIcon.shadowSize = new GSize(37, 34);
            baseIcon.iconAnchor = new GPoint(9, 34);
            baseIcon.infoWindowAnchor = new GPoint(9, 2);

            // Ensure the map is cleared of markers before continuing
            clearAllMarkers();

            // linkMarkerMapping = mapMarkerLinks();
            
            if (markers.length>0) {

                for (i = 0; i < markers.length; i++)
                {
                    createMarker(markers[i], i);
                }

            }
            
            

        } else {

            alert('You are not using a browser which is compatible with google maps');

        }

    }

    function mapMarkerLinks()
    {
    	var flagEls = $D.getElementsByClassName('active-flags');
    	
    	var result = new Array(flagEls.length);

    	for (var i = 0; i < flagEls.length; i++)
    	{
    		var id = flagEls[i].id;
    		id_array = id.split('_');
    		id_ref = id_array[2];
    		
    		var refArray = new Array();
    		
    		for (var j = 0; j < markers.length; j++)
    		{
    			var ref = markers[j]['ref'];
    			
    			if (id_ref == ref)
    			{    				
    				refArray.push(id);
    			}
    		}
    		
    		result[i] = refArray;
    	}
    	
    	return result;
    }
    
    function clearAllMarkers() {

        map.clearOverlays();

    }

    function createMarker(marker, index)
    {

    	var coords = new GLatLng(marker.latitude, marker.longitude);
		
        addMarker(coords, index, marker.toolTip, marker.multi, marker.markerId);

    }

    // @TODO: Integrate with MarkerManager (open source) in order to provide added functionality of dynamic viewports
    function addMarker(coords,index,toolTip,multi,markerId) {
    	

       var letteredIcon = new GIcon(baseIcon);
       var flagNumber = index + 1;
       
       // Check for multiple
       if (multi) {
           letteredIcon.image = "/img/map/location_flag_multiple.png";
       } else {
           // letteredIcon.image = "/img/map/location_flag_" + flagNumber + ".png";
    	   letteredIcon.image = "/img/map/location_flag.png";
       }
        
        var markerOptions = { icon:letteredIcon };
        var marker = new GMarker(coords,markerOptions)

        // Add the marker
        map.addOverlay(marker);

        // Add a listener to the marker
        GEvent.addListener(marker, "click", function() {
            var tooltipHTML = toolTip;
            map.openInfoWindowHtml(coords, tooltipHTML);
        });
        
        var linkEls = $D.getElementsByClassName('active_flag_' + markerId);
        
        for (var j = 0; j < linkEls.length; j++)
        {
        	$E.on(linkEls[j], 'click', function(e){
        		var tooltipHTML = toolTip;
                map.openInfoWindowHtml(coords, tooltipHTML);
        	});
        }
        
        // find links with class with active_flag_ + markerId
        
        // attach event

        // Set the new center coordinates if the map is dynamic
        if ('dynamic'==config['center']) map.panTo(calculateNewCenter(coords,index));

        return coords;

    }

    function setMarkers(newMarkers)
    {
        markers = newMarkers;
    }

    function showMarkers()
    {
        if (markers.length>0) {
            createMarker(markers[0],0);
        }
        else
            {
                alert('still no markers');
            }
    }

    function calculateNewCenter(coords,index) {

        // If this is the first marker, set center at this coordinate
        if (0==index) return coords;

        // Get current center coordinates
        var centerLat = map.getCenter().lat(), centerLng = map.getCenter().lng();

        // Get new marker coordinates
        var newLat = coords.lat(), newLng = coords.lng();

        // Calculate latitude
        var min = Math.min(Math.abs(centerLat),Math.abs(newLat));
        var max = Math.max(Math.abs(centerLat),Math.abs(newLat));
        var diff = Math.abs(min-max);
        var latitude = Math.min(centerLat,newLat)+(Math.abs(diff/2));

        // Calculate longitude
        min = Math.min(Math.abs(centerLng),Math.abs(newLng));
        max = Math.max(Math.abs(centerLng),Math.abs(newLng));
        var diff = Math.abs(min-max);
        var longitude = Math.min(centerLng,newLng)+(Math.abs(diff/2));

        return new GLatLng(latitude,longitude);

    }

    return {
        init: init,
        createMarker: createMarker,
        setMarkers: setMarkers,
        showMarkers: showMarkers,
        mapMarkerLinks: mapMarkerLinks
    }

}();

//////////////////

// Instantiate and configure Loader
var loader = new YAHOO.util.YUILoader({

    // Identify the components you want to load.  Loader will automatically identify
    // any additional dependencies required for the specified components.
    require: ["dom", "event", "json", "connection"],

    // Configure loader to pull in optional dependencies.  For example, animation
    // is an optional dependency for slider.
    loadOptional: true,

    // The function to call when all script/css resources have been loaded
    onSuccess: function() {

        $E = YAHOO.util.Event;
        $D = YAHOO.util.Dom;
        $ = YAHOO.util.Dom.get;

        geocoder = new GClientGeocoder();

        // Parse JSON created on page load
        /*try {

            var results = YAHOO.lang.JSON.parse(onPageLoad_markers);
            
        } catch (e) {



            alert("ERROR: Invalid JSON");

        }*/
        
        bennison = [];

        for (var i in onPageLoad_markers) {
            bennison.push(onPageLoad_markers[i]);
        }

        YAHOO.IEDesign.map.init(bennison);

    },

    // Configure the Get utility to timeout after 10 seconds for any given node insert
    timeout: 10000,

    // Combine YUI files into a single request (per file type) by using the Yahoo! CDN combo service.
    combine: true

});

loader.insert();
