/**
 * @author Flurin
 */

function ReadCookie(cookieName)
{
    var theCookie = ""+document.cookie;
    var ind       = theCookie.indexOf(cookieName);
    
    if (ind == -1 || cookieName == "")
    {
        return "";
    }
    
    var ind1 = theCookie.indexOf(';',ind);
    
    if (ind1 == -1)
    {
        ind1 = theCookie.length;
    }
    return unescape(theCookie.substring(ind+cookieName.length+1,ind1));
}


function SetCookie(cookieName,cookieValue,nDays)
{
    var today  = new Date();
    var expire = new Date();
    
    if (nDays == null || nDays == 0)
    {
        nDays = 1;
    }
    expire.setTime(today.getTime() + 3600000*24*nDays);
    document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString();
}




Map = {
    FIELD_MAP:               'map_canvas',
    FIELD_SEARCH:            'map_search',
    MAP_CENTER_LAT:          47,
    MAP_CENTER_LNG:          8,
    MAP_START_MAGNIFICATION: 8,
    MAP_FOUND_MAGNIFICATION: 15,
    map: null,
    geocoder: null,
    markers: [],
    loaded: false,
    icon: null,
    isFetchingEntries: false,
    myLng: 0,
    myLat: 0,
    maxEntries: 50,
    load: function()
    {

        
        if (! Map.loaded && GBrowserIsCompatible())
        {
            // GEOCODER
            Map.geocoder = new GClientGeocoder();
    
            // ICON
            Map.Icon = new GIcon(G_DEFAULT_ICON, "http://www.barolino.ch/bilder/icons/icon_barolino.png");
            Map.Icon.shadow = "";
            Map.Icon.iconSize = new GSize(24, 24);
            Map.Icon.iconAnchor = new GPoint(9, 14);
            Map.Icon.infoWindowAnchor = new GPoint(9, 2);
            
            // MAP
            Map.map = new GMap2($(Map.FIELD_MAP));
            // add listeners
            GEvent.addListener(Map.map, "load", function() {
                Map.fetchEntries(Map.maxEntries);
            });
            GEvent.addListener(Map.map, "moveend", function() {
                // set cookie values
                var center = Map.map.getCenter();
                SetCookie('maplat',  center.lat(),      366);
                SetCookie('maplng',  center.lng(),      366);
                SetCookie('zoom', Map.map.getZoom(), 366);
                SetCookie('max',  Map.maxEntries,    366);
                
                if (Map.maxEntries > 0)
                {
                    Map.fetchEntries(Map.maxEntries);
                }
            });
            
            var lat  = ReadCookie('maplat');
            var lng  = ReadCookie('maplng');
            var zoom = ReadCookie('zoom');
            if (isNaN(lat)  || lat  == 0) lat  = Map.MAP_CENTER_LAT;
            if (isNaN(lng)  || lng  == 0) lng  = Map.MAP_CENTER_LNG;
            if (isNaN(zoom) || zoom == 0) zoom = Map.MAP_START_MAGNIFICATION;
            //alert([lat, lng, zoom]);
            // set center
            Map.myLat = parseFloat(lat);
            Map.myLng = parseFloat(lng);
            Map.map.setCenter(new GLatLng(Map.myLat, Map.myLng), parseFloat(zoom));
             
            //Map.map.addControl(new GLargeMapControl());
            //Map.map.setUIToDefault();
            Map.map.addControl(new GSmallMapControl());
            //Map.map.setMapType(G_SATELLITE_MAP);
        }
        Map.loaded = true;
    },

    search: function () {
        var search = $(Map.FIELD_SEARCH).value;

        if(search.length > 0)
        {
            Map.geocoder.getLatLng(search, function(point) {
                if (!point)
                {
                    //$(Map.FIELD_STATUS).update(Language.MAP_LOCATION_NOT_FOUND);
                }
                else
                {
                    Map.map.setCenter(point, Map.MAP_FOUND_MAGNIFICATION);
                }
            });
        }
    },
    fetchEntries: function(maxNr) {
        Map.maxEntries = maxNr;
        $("link20").className = "link";
        $("link50").className = "link";
        $("link100").className = "link";
        $("link" + Map.maxEntries).className = "link selectedLink";
        if (! Map.isFetchingEntries)
        {
            Map.isFetchingEntries = true;
            var bounds = Map.map.getBounds();
            var sw = bounds.getSouthWest();
            var ne = bounds.getNorthEast();
            
            
            var link = "/php/google.php?a=json&s=" + sw.lat()
                                                                 + "&w=" + sw.lng()
                                                                 + "&n=" + ne.lat()
                                                                 + "&e=" + ne.lng()
                                                                 + "&x=" + Map.maxEntries;
            new Ajax.Request(link, {
                onSuccess: function(r){
                    eval("var newMarkers = " + r.responseText);
                    uids = {};
                    // add all new markers
                    for (var i in newMarkers)
                    {
                        markerVO = newMarkers[i]
                        uids[markerVO.uid] = markerVO;
                        if (markerVO.uid && ! (markerVO.uid in Map.markers))
                        {
                            Map.addMarker(markerVO);
                        }
                    }
                    // remove markers that are no longer in the view
                    for (var j in Map.markers)
                    {
                        if (! (j in uids))
                        {
                            Map.map.removeOverlay(Map.markers[j]);
                            delete Map.markers[j];
                        }
                    }
                    Map.isFetchingEntries = false;
                }
            });
        }
    },
    addMarker: function(markerVO) {
        var point = new GLatLng(markerVO.lat, markerVO.lng);
        
        var marker = new GMarker(point, { icon:Map.Icon });
        
        GEvent.addListener(marker, 'click', function() {
            marker.openInfoWindowHtml('<div class="map-infowindow"><a href="http://www.barolino.ch/' + markerVO.bar + '.html" style="float:left;margin-right: 5px">' + 
                '<img src="http://www.barolino.ch/' + markerVO.tmb + '" alt="' + markerVO.bar + '" style="border:0" />' +
                '</a>' +
                '<a href="http://www.barolino.ch/' + markerVO.bar + '.html" style="text-decoration:none">' + markerVO.bar + '</a>' + '<br/>' + markerVO.dsc + '</div>'
            );
        });
        Map.map.addOverlay(marker);
        Map.markers[markerVO.uid] = marker;
    }
};

Event.observe(window, 'load', function() {
    Map.load();
});