var googlemap;
var markerLoader;

var markers = new Array();
var homemarker;

//var areas_cache = new Object();
var areas = new Array();


var request_variables = new Object();


function parseUrlVars()
{
  var qs = location.search.substring(1);
  var nv = qs.split('&');
  for(i = 0; i < nv.length; i++)
  {
    eq = nv[i].indexOf('=');
    request_variables[nv[i].substring(0,eq).toLowerCase()] = unescape(nv[i].substring(eq + 1));
  }
}

function markersLoaded()
{
    // if xmlhttp shows "loaded"
    if (markerLoader.readyState==4)
    {
        // if "OK"
        if (markerLoader.status==200)
        {
            var markerdata = eval(markerLoader.responseText);
            buildMarkers(markerdata);
        } else
        {
            alert("Problem retrieving XML data");
        }
    }
}

function loadMarkers()
{
    var bounds = googlemap.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();
    var url = "@@geo_getObjectsBoundedBy?lat_min=" + sw.lat() +
                                       "&lng_min=" + sw.lng() +
                                       "&lat_max=" + ne.lat() +
                                       "&lng_max=" + ne.lng();


    markerLoader = GXmlHttp.create();
    markerLoader.onreadystatechange=markersLoaded;

    markerLoader.open("GET",url,true);
    markerLoader.send(null);
}

function buildMarkers(markerdata)
{

    markerOptions = {};

    /// Because of grouping we have to delete all markers before adding new ones
    for (var j = 0; j < markers.length; j++)
    {
        var marker = markers[j];
        googlemap.removeOverlay(marker);

    }

    /// now create new markers
    for (var i = 0; i < markerdata.length; i++)
    {
        var m = markerdata[i];

        var markerIcon = new GIcon(G_DEFAULT_ICON);

        if (m.objects.length == 1)
        {
            markerIcon.image = m.objects[0].geoicon;
        } else
        {
            markerIcon.image = "geo_icons/geo_multi_icon.png";
        }

        // Set up our GMarkerOptions object
        markerOptions = { icon:markerIcon };

        var marker = new GMarker(new GLatLng(m.lat, m.lng), markerOptions)

        marker.objectData = m;
        googlemap.addOverlay(marker);
        GEvent.addListener( marker, "click", showLocationInfo );
        markers.push(marker);
      /*  }*/
    }
}

function loadAreaFromURL(url)
{
    var areaLoader = GXmlHttp.create();
    areaLoader.onreadystatechange=function() {
    // if xmlhttp shows "loaded"
    if (areaLoader.readyState==4)
    {
        // if "OK"
        if (areaLoader.status==200)
        {
            var area_data = eval(areaLoader.responseText);

            var a = area_data[0];
            /// since we always have just one area, we'll perform a zoom here
            var b = a.bounds;
            geo_zoomTo(b.lat1, b.lng1, b.lat2, b.lng2);
            buildArea(a);

        } else
        {
            alert("Problem retrieving data for area from "+ url);
        }
    }
    };

    areaLoader.open("GET",url,true);
    areaLoader.send(null);

}


function buildArea(area_data)
{
    var polyPoints = new Array();

    for (var i = 0; i < area_data.points.length; i++)
    {
        var p = area_data.points[i];
        polyPoints.push(new GLatLng(p[0],p[1]));
    }

    var lineColor = area_data.lineColor;
    var lineWeight= area_data.lineWidth;
    var opacity = area_data.opacity;
    var fillColor = area_data.fillColor;
    var polyShape = new GPolygon(polyPoints,lineColor,lineWeight,opacity,fillColor,opacity);

    googlemap.addOverlay(polyShape);
}

function showAreaInfo()
{
    var maxContentDiv = document.createElement('div');
    maxContentDiv.innerHTML = 'Loading...';
    var opts = {};
    var html = "<p>No additional information</p>";

    if (this.objectData.objects.length == 1) // single object
    {
        var obj = this.objectData.objects[0];
        html='<h1><img src="'+obj.icon+'" /> '+obj.title+'</h1>';
        html += '<p>';
        if (obj.description) { html +=  "<p>"+obj.description+"</p>"; }
        if (obj.url) { html +=  '<a href="'+obj.url+'">more</a>'; }

        var bounds = ' ' + this.objectData.bounds.lat1 +', '+
                            this.objectData.bounds.lng1 +', '+
                            this.objectData.bounds.lat2 +', '+
                            this.objectData.bounds.lng2 ;

        html += '&nbsp; &nbsp; <a href="javascript:geo_zoomTo('+ bounds + ')">zoom into view</a> ';
        html += '</p>';
        opts = { maxContent: maxContentDiv, maxTitle: "More Info" };

    }

    googlemap.openInfoWindowHtml(this.getLatLng(), html, opts);

    var iw = googlemap.getInfoWindow();

    iw.objectId = this.objectId;

    GEvent.addListener(iw, "maximizeclick", function() {
        GDownloadUrl(this.objectData.objects[0].url, function(data) {
            maxContentDiv.innerHTML = data;
        } )
    } )
}


function showLocationInfo()
{
    var maxContentDiv = document.createElement('div');
    maxContentDiv.innerHTML = 'Loading...';
    var opts = {};
    var html = "<p>No additional information</p>";

    if (this.objectData.objects.length == 1) // single object
    {
        var obj = this.objectData.objects[0];
        html='<h1><img src="'+obj.icon+'" />'+obj.title+'</h1>';
        if (obj.description) { html +=  "<p>"+obj.description+"</p>"; }
        if (obj.url) { html +=  '<p><a href="'+obj.url+'">more</a></p>'; }

        opts = { maxContent: maxContentDiv, maxTitle: "More Info" };

    } else if (this.objectData.objects.length > 1) // more than one object at the same location
    {
        var html="<h1>Multiple items</h1>";

        if (this.objectData.count > this.objectData.objects.length)
        {
            html += '<p>First <b>' + this.objectData.objects.length + '</b> items are:</p>';
        }

        html+="<ul>";
        for (var i = 0; i<this.objectData.objects.length; i++)
        {
            var obj = this.objectData.objects[i];
            html+='<li style="list-style:none;"><a href="'+obj.url+'"><img src="'+obj.icon+'" /> '+obj.title+"</a></li>";
        }

        html += '</ul>';
        if (this.objectData.count > this.objectData.objects.length)
        {
            /// check if the objects are all share the same spot,
            /// so zooming makes no sense - give a link to display them as a list then
            if (( this.objectData.bounds.lat_min == this.objectData.bounds.lat_max) &&
                ( this.objectData.bounds.lat_min == this.objectData.bounds.lat_max))
            {
                html+='<p><b>' + this.objectData.count +
                '</b> items share the same spot. <a href="search?geoLocation.lat1:records=' +
                this.objectData.bounds.lat_min +
                '&geoLocation.lat2:records=' + this.objectData.bounds.lat_max +
                '&geoLocation.lng1:records=' + this.objectData.bounds.lng_min +
                '&geoLocation.lng2:records=' + this.objectData.bounds.lng_max +
                '">Click here</a> to see them as a list</p>';
            } else
            {
                /// Objects are close enough to be snapped but not at the same spot
                var bounds = ' ' + this.objectData.bounds.lat_min +', '+
                                    this.objectData.bounds.lng_min +', '+
                                    this.objectData.bounds.lat_max +', '+
                                    this.objectData.bounds.lng_max ;
                html += '<p><a href="javascript:geo_zoomTo('+ bounds + ')">Zoom in</a> to see all <b>' + this.objectData.count + '</b> items in this area</p>';
            }
        } else
        {
           // html += '<p><a href="javascript:geo_zoomTo('+ bounds + ')">Zoom in</a> to see these items</p>';
        }
    }

    googlemap.openInfoWindowHtml(this.getLatLng(), html, opts);

    var iw = googlemap.getInfoWindow();

    iw.objectId = this.objectId;
    iw.objectData = this.objectData;

    GEvent.addListener(iw, "maximizeclick", function() {
        GDownloadUrl(this.objectData.objects[0].url, function(data) {
            maxContentDiv.innerHTML = data;
        } )
    } )
}

function geo_zoomTo(lat_min, lng_min, lat_max, lng_max)
{
    var zoom = googlemap.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(lat_min, lng_min), new GLatLng(lat_max,lng_max)));
    var lat = (lat_min+lat_max)/2;
    var lng = (lng_min+lng_max)/2;
    googlemap.setCenter(new GLatLng(lat, lng), zoom);
    googlemap.closeInfoWindow();
}


/// ENTRY POINT
function initGeoMap(wname, initLat, initLng, initZoom, info_text, json_url, icon) {

    if (GBrowserIsCompatible()) {

        mapdiv = document.getElementById(wname + "_map");

        googlemap = new GMap2(mapdiv);
        var center = new GLatLng(initLat, initLng);
        if (json_url)
        {
            /// if there's an area we don't
            /// call googlemap.setCenter to avoid requesting
            /// two sets of tiles
            loadAreaFromURL(json_url);
        } else {
            /// we need to call this beafore calling loadMarkers
            googlemap.setCenter(center, initZoom);
            loadMarkers();
        }

        googlemap.addControl(new GLargeMapControl());
        googlemap.enableDoubleClickZoom();
        googlemap.enableContinuousZoom();
        var handle = GEvent.addListener(googlemap, "moveend", loadMarkers);

        /// create no icon if we have no image name
        if (icon != '')
        {
            var homeIcon = new GIcon(G_DEFAULT_ICON);
            homeIcon.image = icon;

            // Set up our GMarkerOptions object
            markerOptions = { icon:homeIcon };
            homemarker = new GMarker(center, markerOptions);
            googlemap.addOverlay(homemarker);
            homemarker.openInfoWindowHtml(info_text);
        }

    } else
    {
        var mapdiv = document.getElementById(wname + "_map");
        mapdiv.style.display = "none";
    }
}

