//-----------------------------------------------
// Initialize Map
//
// Author: Mathias Fischer <mathias.fischer@berlinonline.de>
// Created: 21.10.2008
//
// Requires:
//   - GMap2
//   - Prototype.js
//-----------------------------------------------
var debug = 0;

var KarteMarker = {
    json_url : false,
    map : false,
    dom_node : false,
    transport: false,
    InfoWindow: {
        width: 355
    },
    CatIcons: {
        210 : {
            image   : '/karte/_img/204.png',
            imageMap: false,
            highlight: '/karte/_img/204.hover.png',
            imageX  : 39,
            imageY  : 20,
            shadow  : '/karte/_img/204.shadow.png',
            shadowX : 39,
            shadowY : 20,
            iconAnchorX: 0,
            iconAnchorY: 20,
            infoWindowAnchorX: 20,
            infoWindowAnchorY: 0
        },
        211 : {
            image   : '/karte/_img/205.png',
            imageMap: false,
            highlight: '/karte/_img/205.hover.png',
            imageX  : 39,
            imageY  : 20,
            shadow  : '/karte/_img/205.shadow.png',
            shadowX : 39,
            shadowY : 20,
            iconAnchorX: 0,
            iconAnchorY: 20,
            infoWindowAnchorX: 20,
            infoWindowAnchorY: 0
        },
        213 : {
            image   : '/karte/_img/213.png',
            imageMap: false,
            highlight: '/karte/_img/213.hover.png',
            imageX  : 39,
            imageY  : 20,
            shadow  : '/karte/_img/205.shadow.png',
            shadowX : 39,
            shadowY : 20,
            iconAnchorX: 0,
            iconAnchorY: 20,
            infoWindowAnchorX: 20,
            infoWindowAnchorY: 0
        },
        cloud : {
            image   : '/karte/_img/cluster.png',
            imageMap: false,
            highlight: '/karte/_img/cluster.hover.png',
            imageX  : 43,
            imageY  : 31,
            shadow  : '/karte/_img/blank.png',
            shadowX : 56,
            shadowY : 30,
            iconAnchorX: 22,
            iconAnchorY: 15,
            infoWindowAnchorX: 0,
            infoWindowAnchorY: 0
        },
        marker : {
            image   : '/karte/_img/marker.png',
            imageMap: [0,0],
            highlight: '/karte/_img/marker.hover.png',
            imageX  : 37,
            imageY  : 37,
            shadow  : '/karte/_img/marker.shadow.png',
            shadowX : 37,
            shadowY : 37,
            iconAnchorX: 0,
            iconAnchorY: 37,
            infoWindowAnchorX: 19,
            infoWindowAnchorY: 0
        }
    },
    icon: function(category){
        var icon = new GIcon(G_DEFAULT_ICON);
        with(KarteMarker.CatIcons[category]){
            icon.image = image;
            icon.iconSize = new GSize(imageX,imageY);
            icon.shadow = shadow;
            icon.shadowSize = new GSize(shadowX,shadowY);
            icon.iconAnchor = new GPoint(iconAnchorX,iconAnchorY);
            icon.infoWindowAnchor = new GPoint(infoWindowAnchorX,infoWindowAnchorY);
            icon.imageMap = imageMap;
        }
        return icon;
    },


    //Function: loadMap
    //  Initialize Google-Map on a given KarteMarker in the DOM
    //
    //Parameters:
    //  options - Object
    //
    //Example:
    //  loadMap({id:'map',lat:51,lon:10,zoom:6,url:'json.php'});
    loadMap: function (options){
        if (GBrowserIsCompatible()) {
            KarteMarker.dom_node = $(options.id);
            KarteMarker.map = new GMap2(KarteMarker.dom_node);
            KarteMarker.json_url = options.url;
            with(KarteMarker.map){
                setCenter(new GLatLng(options.lat,options.lon), options.zoom);
                addControl(new GLargeMapControl());
                addMapType(G_PHYSICAL_MAP);
                var mapControl = new GHierarchicalMapTypeControl();
                addControl(mapControl);
                enableScrollWheelZoom();
            }
            GEvent.addListener(KarteMarker.map, "zoomend", function(){KarteMarker.checkAfterZoom();});
            GEvent.addListener(KarteMarker.map, "dragend", function(){KarteMarker.checkAfterPan();});
            KarteMarker.mode = 'start';
            KarteMarker.getLayer();
        }
    },

    //Function: updateBounds
    //  Write the Bounds into KarteMarker.bounds, KarteMarker.map has to exists
    //
    //Parameters:
    //  KarteMarker - DOM-KarteMarker
    //
    //Example:
    //  updateBounds(document.getElementById('map'));
    updateBounds: function (){
        if(typeof(KarteMarker.map) != -1){
            if((typeof(KarteMarker.bounds) != "undefined" && typeof(KarteMarker.outerbounds) == "undefined") || KarteMarker.mode=='zoom'){
                log('New outerbounds');
                KarteMarker.outerbounds = KarteMarker.bounds;
            }
            var bounds = KarteMarker.map.getBounds();
            KarteMarker.bounds = {
                s   :bounds.getSouthWest().lat(),
                w   :bounds.getSouthWest().lng(), 
                n   :bounds.getNorthEast().lat(),
                e   :bounds.getNorthEast().lng(),
                zoom:KarteMarker.map.getZoom()
            };
//             if(typeof(KarteMarker.outerbounds) != "undefined"){
//                 with(KarteMarker.outerbounds){
//                     s = Math.min(s,KarteMarker.bounds.s);
//                     w = Math.min(w,KarteMarker.bounds.w);
//                     n = Math.max(n,KarteMarker.bounds.n);
//                     e = Math.max(e,KarteMarker.bounds.e);
//                 }
//             }
        }
        else{
            log('No Map on Object defined!');
        }
    },


    //Function: getLayer
    //  Fetch Layers via JSON-URL
    //
    //Parameters:
    //  options - Object
    //
    //Example:
    getLayer: function (){
        KarteMarker.updateBounds();
        var site_parameters = location.href.toQueryParams();
        var json_parameters = KarteMarker.bounds;
        Object.extend(json_parameters,site_parameters);
        with(json_parameters){
            //if(typeof(zoom) == 'undefined')
                zoom = KarteMarker.map.getZoom();
        };
        var parameters = {
            onlyLatestOfClass:'getLayer',
            method:'get',
            parameters: json_parameters,
            onSuccess: KarteMarker.fetchAjax,
            onException: KarteMarker.ajaxException,
            asynchronous: false
        };
        new Ajax.Request(KarteMarker.json_url,parameters);
        cpReload();
    },


    checkAfterPan: function (options){
        KarteMarker.mode = 'pan';
        log(KarteMarker.bounds);
        log(KarteMarker.outerbounds);
        KarteMarker.updateBounds();
        with(KarteMarker){
            if (
                bounds.s < outerbounds.s
                || bounds.w < outerbounds.w
                || bounds.n > outerbounds.n
                || bounds.e > outerbounds.e
            )
                KarteMarker.getLayer();
        }
    },

    checkAfterZoom: function (options){
        KarteMarker.mode = 'zoom';
        KarteMarker.map.clearOverlays();
        KarteMarker.getLayer();
    },

    fetchTransport: function(transport){
        KarteMarker.transport = transport;
    },

    ajaxException: function (response,exception){
        log("Ajax Exception: ");
        log(exception);
    },

    fetchAjax: function(transport){
        var markers_data = transport.responseText.evalJSON();
        log(markers_data);
        if (KarteMarker.mode == 'pan') {
            with(KarteMarker.outerbounds){
                s = Math.min(s,markers_data.sw.latitude);
                w = Math.min(w,markers_data.sw.longitude);
                n = Math.max(n,markers_data.ne.latitude);
                e = Math.max(e,markers_data.ne.longitude);
            }
        }
        markers_data.markers.each(KarteMarker.addMarker);
    },

    addMarker: function(insert){
        var coords = new GLatLng(insert.latitude,insert.longitude);
        if(insert.category != 'cloud' && insert.category != 'marker') {
            var marker = new GMarker(coords, { icon:KarteMarker.icon(insert.category), title:insert.title });
            GEvent.addListener(marker, "click", function() {
                marker.openInfoWindowHtml(insert.html,{maxWidth:KarteMarker.InfoWindow.width});
                cpReload();
            });
        }
        else if(insert.category != 'cloud') {
            var marker = new GMarker(coords, { icon:KarteMarker.icon(insert.category), title:insert.title });
        }
        else {
            var marker = new GMarker(coords, { icon:KarteMarker.icon(insert.category), title:insert.title });
            GEvent.addListener(marker, "click", function() {
                KarteMarker.map.setCenter(new GLatLng(insert.latitude,insert.longitude), KarteMarker.map.getZoom() +1);
            });
        }
        GEvent.addListener(marker, "mouseover", function() {
            this.setImage(KarteMarker.CatIcons[insert.category].highlight);
        });
        GEvent.addListener(marker, "mouseout", function() {
            this.setImage(KarteMarker.CatIcons[insert.category].image);
        });
        KarteMarker.map.addOverlay(marker);
    },

    lastitem: 'Ende ohne Kommata!'

};//End Class



if(debug){
    //Sometimes console.log is not enabled if used in function-context
    console.log('Debugging with console.log enabled.');
}

//Function: log
//  Output Debug-Messages (Requires Firebug)
//
//Parameters:
//  msg - Message or Object
function log(msg){
    if(debug && typeof(console) != 'undefined'){
        console.log(msg);
    }
}

var cp;
function cpReload() {
    log("CP reloaded");
    if (!cp) {
        cp = $('cp');
    }
    if (cp) {
        var img = cp.getElementsByTagName('img');
        var date = new Date();
        var rnd  = (Math.random()*100000);
        for (var i=0; i<img.length; i++) {
        if (img[i].src.match(/ts=\d+&/)) {
            img[i].src = img[i].src.replace(/ts=\d+&/,'ts='+Math.round(date.getTime()/1000)+'&');
        }
        else if (img[i].src.match(/d=[0-9\.]+$/)) {
            img[i].src = img[i].src.replace(/d=[0-9\.]+$/,'d='+rnd);
        }
        }
    }
}

// Section: AJAX-Helpers
Ajax.currentRequests = {};
Ajax.Responders.register({
    onCreate: function(request) {
        if (request.options.onlyLatestOfClass && Ajax.currentRequests[request.options.onlyLatestOfClass]) {
        try { Ajax.currentRequests[request.options.onlyLatestOfClass].transport.abort(); } catch(e) {}
        }
        Ajax.currentRequests[request.options.onlyLatestOfClass] = request;
    },
    onComplete: function(request) {
        if (request.options.onlyLatestOfClass) {
        Ajax.currentRequests[request.options.onlyLatestOfClass] = null;
        }
    }
});
