var baseUrl = '';
var googleMap = {
    
    loadMap: function(options)
    {    
        var xml = options.xml;
        var mapContainer = options.mapContainerId;
        var mapSidebar = options.mapSidebarExpr;
        var image = options.iconImage;
        var showSidebar = options.showSidebar;
        baseUrl = options.baseUrl;
        
        data = this.getData(xml);
        
        // Set center point Kansas... middle of nowhere... 
        var latlng = new google.maps.LatLng('38.479395', '-98.876953');
        var options = {
          zoom: 3,
          center: latlng,
          mapTypeId: google.maps.MapTypeId.TERRAIN
        };
        var map = new google.maps.Map(document.getElementById(mapContainer), options);
        
        this.setMarkers(map, data);
        
        if(showSidebar){ 
            this.loadSidebar(map, data, mapSidebar);
        }
    },

    setMarkers: function(map, data)
    {
        var self = this;
        var fluster = new Fluster2(map);
        
        $(data).each(function(i){
            var location = data[i];
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(location.lat, location.lng),
                map: map,
                title: location.title,
                zIndex: i
            });
        
            self.setInfoWindow(map, marker, location);
            fluster.addMarker(marker);
        });
        
        
        fluster.styles = {
            // This style will be used for clusters with more than 0 markers
            0: {
                image: baseUrl + 'assets/images/design/gmap_cluster_m1.png',
                textColor: '#FFFFFF',
                width: 53,
                height: 52
            },
            // This style will be used for clusters with more than 10 markers
            10: {
                image: baseUrl + 'assets/images/design/gmap_cluster_m1.png',
                textColor: '#FFFFFF',
                width: 56,
                height: 55
            },
            20: {
                image: baseUrl + 'assets/images/design/gmap_cluster_m1.png',
                textColor: '#FFFFFF',
                width: 66,
                height: 65
            }
        };

        // Initialize Fluster
        // This will set event handlers on the map and calculate clusters the first time.
        fluster.initialize();
    },

    setInfoWindow: function(map, marker, location)
    {
        /*
        address: ""
        amount: "$$10,000"
        city: "Bellingham"
        lat: "48.747578"
        lng: "-122.485080"
        organization: "Whatcom Council of Governments"
        season: "Spring"
        state: "WA"
        title: "Coast Millennium Trail Link"
        type: "Bike Path"
        year: "2008"
        zip: ""
        */
        
        delete location.address;
        delete location.lat;
        delete location.lng;
        
        var location_content = '';        
        for(var key in location) { 
            if(location[key] != '' && key != 'content')
                location_content += '<b>'+ key.titleCase() +'</b>: '+ location[key] +'<br />';
        }
        
        var content = '<div class="google_map_content">'+
              '<h3>'+ location.title +'</h3>'+
              '<div class="body">'+ location_content + location.content
              '</div>'+
              '</div>';

        var infowindow = new google.maps.InfoWindow({
            content: content,
            maxWidth: '300'
        });

        var listener = google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map, marker);
        });
    },

    loadSidebar: function(map, data, selector)
    {
        var self = this;
        
        $(data).each(function(i){
            $(selector).append( self.createLink(map, data[i]) );
        });
    },

    createLink: function(map, location){
        var self = this;
        
        return $('<li></li>')
                    .append($('<a></a>').html(location.title).attr('href', '#').click(function(){
                                self.setMapCenter(map, location.lat, location.lng); return false;
                            }))
                    .append(
                        '<address>'+ location.address +'</address>'+
                        '<p><span>Phone:</span> '+ location.phone +'</p>'+
                        '<p><span>Fax:</span> '+ location.fax +'</p>'+
                        '<p><span>Email:</span> '+ location.email +'</p>'+
                        '<p><span>Web:</span> '+ location.url +'</p>'
                    )
    },

    setMapCenter: function(map, lat, lng)
    {
        map.setCenter(new google.maps.LatLng(lat, lng));
    },

    getLocation: function(xml, zeroIndex)
    {
        var obj = {};
        var location = $(xml).find('location:eq('+ zeroIndex +')');
        location.children().each(function(){
            var node = $(this);
            var nodeName = node[0].nodeName;
            obj[nodeName] = node.text();
        });

        return obj;
    },

    getData: function(xml)
    {
        var arr = [];
        $(xml).find('grant').each(function(i){
            var obj = {};
            $(this).children().each(function(){
                var node = $(this);
                var nodeName = node[0].nodeName;
                obj[nodeName] = node.text();
            });
            arr[i] = obj;
        });
        
        return arr;
    }
}
