/**
 * goseetell/Geo.js:
 *
 **/
var goseetell;
if (!goseetell) goseetell = {};
goseetell.Geo = {}

// Now populate the namespace with our utility methods
goseetell.Geo.define = function(data) { /* code here */ };
goseetell.Geo.provides = function(o, c) { /* code here */ };

goseetell.Geo.categoryIcon = function(category, rating) {
    var categoryIcon = new GIcon(goseetell.Geo.baseIcon());
    categoryIcon.image = "http://goseetell.s3.amazonaws.com/pins/pin_" + rating + "_" + category + ".png";
    categoryIcon.printImage = "http://goseetell.s3.amazonaws.com/pins/pin_" + rating + "_" + category + ".gif";
    return categoryIcon;
}

goseetell.Geo.baseIcon = function() {
    var baseIcon = new GIcon();
    baseIcon.iconSize = new GSize(20, 40);
    baseIcon.iconAnchor = new GPoint(0, 40);
    baseIcon.shadow = "http://goseetell.s3.amazonaws.com/pins/shadow.png";
    baseIcon.shadowSize = new GSize(29, 32);
    baseIcon.printShadow = "http://goseetell.s3.amazonaws.com/pins/shadow_print.gif";
    baseIcon.infoWindowAnchor = new GPoint(10, 10);
    baseIcon.transparent = "http://goseetell.s3.amazonaws.com/pins/transparent_pin.png";
    baseIcon.imageMap = [0,0, 0,36, 4,19, 19,19, 19,0];
    baseIcon.imageMapType = "poly";
    baseIcon.infoShadowAnchor = new GPoint(18, 25);
    return baseIcon;
}

goseetell.Geo.createCategoryMarker = function(options) {
    var point = options.point;
    var info_window = options.info_window;
    var category = options.category || 1;
    var rating = options.rating || 0;
    var event = options.event || "click";
    var place_id = options.place_id;
    var marker = new GMarker(point, goseetell.Geo.categoryIcon(category, rating));
    GEvent.addListener(marker, event, function() {
        marker.openInfoWindowHtml(info_window);
    });
    if (typeof gmarkers != "undefined") {
      //alert("adding marker " + place_id);
      gmarkers[place_id] = marker;
    }
    
    return marker;
}

goseetell.Geo.showMarkers = function(url, map) {
    GDownloadUrl(url, function(data, responseCode) {
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                    parseFloat(markers[i].getAttribute("lng")));
            var category = markers[i].getElementsByTagName("category")[0].firstChild.data;
            // var rating   = markers[i].getElementsByTagName("rating")[0].firstChild.data;
            var info_window = markers[i].getElementsByTagName("info_window")[0].firstChild.data;
            map.addOverlay(goseetell.Geo.createCategoryMarker({ point: point, info_window: info_window, category: category, rating: 0 }));
        }
    });
}


goseetell.Geo.showMarkersAndZoom = function(url, map) {
    GDownloadUrl(url, function(data, responseCode) {
        var bounds = new GLatLngBounds();
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        var waypoints = [];
        for (var i = 0; i < markers.length; i++) {
            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                    parseFloat(markers[i].getAttribute("lng")));
            var category = markers[i].getElementsByTagName("category")[0].firstChild.data;
            // var rating   = markers[i].getElementsByTagName("rating")[0].firstChild.data;
            var info_window = markers[i].getElementsByTagName("info_window")[0].firstChild.data;
            var place_id = parseInt(markers[i].getAttribute("place_id"));
            map.addOverlay(goseetell.Geo.createCategoryMarker({ point: point, info_window: info_window, category: category, rating: 0, place_id: place_id }));
            bounds.extend(point);
            waypoints.push(point);
        }
        
        // Zoom the map to the correct level as to fit all waypoints
        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
        
        // Get Directions: Once loaded a polyline will be drawn onto our map.
        //var directions = new GDirections();
        //GEvent.addListener(directions, 'load', function() {
        //    map.addOverlay(directions.getPolyline());
        //});
        
        //directions.loadFromWaypoints(waypoints, { "getPolyline": true });
    });
}
