/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

if(!window.console){
    window.console = {};
    window.console.log = function(){}
}

Array.prototype.has = function(needle){
        if (new RegExp('^(' + this.join('|') + ')$').test(needle))return true;
        return false;
}


var BMap = {

    GOOGLE_MAP_DIV : null,
    GOOGLE_MAP : null,
    THE_LANGUAGE : 'it',
    flagPrepareUpdate : 0,
    INFO_LABEL : null,
    icon : null,
    searchMsg : "Ricerca in corso...",
    markers:[],
    points:[],
    bubbles:[],
    listID : '#__LIST__',
    listElement : null,
   

    init: function(){
        var country = DB.selectMenu;
        DB.selectMenu.change(BMap.onCountryChange);

        BMap.listElement = $(BMap.listID);

        var selectedCountry = country.val();
     
        var cMap = BMap.getStartingPointObj(selectedCountry);


        BMap.GOOGLE_MAP_DIV = $('#'+DB.selectMenu.attr('googleMap'));

        BMap.GOOGLE_MAP_DIV.jmap('init', {
            'language':'IT',
            'mapType':G_NORMAL_MAP,
            'mapCenter':[cMap.lat, cMap.long],
            'mapZoom':cMap.zoom,
            'mapControl':'none'
        }, function(){
            var thisMap = Mapifies.MapObjects.Get(BMap.GOOGLE_MAP_DIV);
            thisMap.addControl(new GLargeMapControl3D());
            BMap.GOOGLE_MAP = thisMap;
        });

        /*BMap.setIcon();

        BMap.addSearchLoader();

        $('#submit').click(BMap.searchStores);*/
    },


    removeAllBubbles: function(){

        for(i=0; i< BMap.bubbles.length ; i++){
            var elem = BMap.bubbles[i];
           
            elem.hide();
        }
    },


    onCountryChange: function(evt){

        var selectedCountry = $(this).val();
        var cMap = BMap.getStartingPointObj(selectedCountry);
        
        BMap.flagPrepareUpdate = 1;
        BMap.GOOGLE_MAP_DIV.jmap('MoveTo',{
            'mapCenter':[cMap.lat, cMap.long],
            'mapZoom':cMap.zoom
        } , BMap.updateMap );
    },

    setIcon: function(){
        var baseIcon = new GIcon();
        baseIcon.image = 'images/marker.png';
        baseIcon.iconSize = new GSize(32,37);
        baseIcon.iconAnchor = new GPoint(16,37);
        baseIcon.infoWindowAnchor = new GPoint(16,0);
        BMap.icon = baseIcon;
    },

    addSearchLoader: function(){
        BMap.INFO_LABEL = new ELabel(BMap.GOOGLE_MAP.getCenter(), BMap.searchMsg, "overlayBox" ,new GSize(-100,+25), 85);
        BMap.INFO_LABEL.hide();
        BMap.GOOGLE_MAP.addOverlay(BMap.INFO_LABEL);
    },

    showSearchLoader: function(){
        BMap.hideSearchLoader();
        BMap.INFO_LABEL.setPoint(BMap.GOOGLE_MAP.getCenter());
        BMap.INFO_LABEL.show();
    },

    hideSearchLoader: function(){
        BMap.INFO_LABEL.hide();
    },

    searchStores: function(){

        BMap.showSearchLoader();

        BMap.GOOGLE_MAP_DIV.jmap('SearchAddress', {
            'query': $('#address').val(),
            'returnType': 'getLocations'
        }, function(result, options) {

            var valid = Mapifies.SearchCode(result.Status.code);
            if (valid.success) {

                $.each(result.Placemark, function(i, point){
                    
                    BMap.GOOGLE_MAP_DIV.jmap('MoveTo',{
                        'mapCenter':[point.Point.coordinates[1], point.Point.coordinates[0]],
                        'mapZoom':15
                    }, function(){
                        /*var box = point.ExtendedData.LatLonBox;
                        BMap.addStores(box);*/
                        BMap.updateMap();
                    });
                });

                BMap.bindEvents();

            } else {
   
                BMap.hideSearchLoader();
                $('#address').val(valid.message);
            }
        });
        return false;
    },


    getHTML: function(obj){
        /*var text = obj.text.replace('[','<');
        text = obj.text.replace(']','>');*/
        var text = new String( obj.text );
        text = text.replace(/{/g,"<");
        text = text.replace(/}/g,">");
        var cssclass = "bubble";
        cssclass += (obj.cssclass=="") ? "" : " "+obj.cssclass;
        text = text.substr(0, text.length-1);
      
        var html = '<div class="'+cssclass+'" id="tip'+ obj.id +'"><h3>'+obj.name+'</h3><p>'+text+'</p></div>';
        return html;
    },

    getIcon: function(obj){
        obj.iconwidth = parseInt(obj.iconwidth);
        obj.iconheight = parseInt(obj.iconheight);
        var baseIcon = new GIcon();
        baseIcon.image = obj.icon;
        baseIcon.iconSize = new GSize(obj.iconwidth,obj.iconheight);
        baseIcon.iconAnchor = new GPoint( obj.iconwidth/2  ,obj.iconheight);
        baseIcon.infoWindowAnchor = new GPoint(obj.iconwidth/2,0);
        return baseIcon;
    },
    
    
    getMarkerById: function(id){
       
        for(i=0 ; i<BMap.points.length; i++){
            var marker = BMap.points[i];
            if(id == marker.myid)return marker;
        }
        return null;
    },


    openMarker: function(id){
        var marker = BMap.getMarkerById(id);
 
        marker.openHtml();
    },


    addStores: function(box){
            
            BMap.listElement.html("");
        
            BMap.GOOGLE_MAP.clearOverlays();
          
            BMap.markers = [];

            

            var markers = DB.getMarkers(box);

           

            for(var i=0; i < markers.length; i++){
                    var marker = markers[i];

                   

                    if(!BMap.markers.has(marker.id)){
                        BMap.GOOGLE_MAP_DIV.jmap('AddMarker',{
                            'pointLatLng':[marker.latitude, marker.longitude],
                            'pointHTML':BMap.getHTML(marker),
                            'centerMap':false,
                            'pointIcon': BMap.getIcon(marker)
                        }, function(googleMarker){
                           
                            googleMarker.myid = marker.id;
                            BMap.points.push(googleMarker);
                        });

                        
                        var li = $('<li></li>').addClass('marker'+marker.id);
                        var anchor = $('<a></a>').attr({
                            title: marker.name,
                            href: 'javascript:BMap.openMarker('+marker.id+');'
                        }).html(marker.name);
                        anchor.appendTo(li);
                        li.appendTo(BMap.listElement);

                        
                        BMap.markers.push(marker.id);
                    }else console.log('skipped:='+marker.id)
                }
       
/*
        Rest.post('stores/markers/proximity', box , function(data){
            console.log(data);
            console.log(BMap.markers);
            
            if(data.status==200){
                for(var i=0; i < data.markers.length; i++){
                    var marker = data.markers[i];

                    if(!BMap.markers.has(marker.id)){
                        BMap.GOOGLE_MAP_DIV.jmap('AddMarker',{
                            'pointLatLng':[marker.lat, marker.long],
                            'pointHTML':marker.html,
                            'centerMap':false,
                            'pointIcon': BMap.icon
                        });
                        BMap.markers.push(marker.id);
                    }else console.log('skipped:='+marker.id)
                }

            }
        });
        BMap.hideSearchLoader();*/
    },

    

    getStartingPointObj: function(literal){
        var tokens = literal.split("|");
        var point = {
            lat: parseFloat(tokens[1]),
            long: parseFloat(tokens[2]),
            zoom: parseInt(tokens[3])
        }

        return point;
    },


    bindEvents: function(){
        var map = BMap.GOOGLE_MAP;
        var ltxtd = "Ricerca in corso...";

        GEvent.addListener(map, "zoomend", function() {

            if(BMap.flagPrepareUpdate==0) {
                BMap.showSearchLoader();

                window.setTimeout(BMap.updateMap,1000);
                BMap.flagPrepareUpdate = 1;
            }
        });

        GEvent.addListener(map, "dragend", function() {

            BMap.showSearchLoader();

            if (BMap.flagPrepareUpdate==0){
                window.setTimeout(BMap.updateMap,1000);
                BMap.flagPrepareUpdate = 1;
            }
        });
    },



    getBounds: function(){
         var map = BMap.GOOGLE_MAP;
        //map.disableDragging();

        var bounds1 = map.getBounds();



        var southWest = bounds1.getSouthWest();

        var northEast = bounds1.getNorthEast();

        var lngSpan = northEast.lng() - southWest.lng();

        var latSpan = northEast.lat() - southWest.lat();

        var box = {
            "east": parseFloat( northEast.lng() ),
            "west": parseFloat(southWest.lng() ),
            "north": parseFloat(northEast.lat() ),
            "south": parseFloat(southWest.lat() )
        }

        return box;
    },



    updateMap: function(){

 
        var map = BMap.GOOGLE_MAP;
        //map.disableDragging();

        var bounds1 = map.getBounds();

       

        var southWest = bounds1.getSouthWest();

        var northEast = bounds1.getNorthEast();

        var lngSpan = northEast.lng() - southWest.lng();

        var latSpan = northEast.lat() - southWest.lat();

        var box = {
            "east": parseFloat( northEast.lng() ),
            "west": parseFloat(southWest.lng() ),
            "north": parseFloat(northEast.lat() ),
            "south": parseFloat(southWest.lat() )
        }

     

        BMap.addStores(box);

        // map.enableDragging();
        BMap.flagPrepareUpdate = 0;
    }

}



































