var mapMain = function()
{
    var options = {
        emapId : 'emap',
        icons  : {
            office : {
                file     : '/zfp/templates/vashpiter/images/gicon_office.png',
                size     : [19, 24],
                anchor   : [9, 24],
                imageMap : [0,0, 18,0, 18,23, 0,23]
            },
            miniHotel : {
                file     : '/zfp/templates/vashpiter/images/gicon_minihotel.png',
                size     : [31, 40],
                anchor   : [15, 40],
                imageMap : [0,0, 30,0, 30,39, 0,39]
            },
            flat : {
                file     : '/zfp/templates/vashpiter/images/gicon_flat.png',
                size     : [19, 24],
                anchor   : [7, 24],
                imageMap : [0,0, 18,0, 18,23, 0,23]
            }
        },
        domain : document.domain,
        overlayClass : 'gmap_info_overlay'
    };
    
    var markers = {}, eLabels = {}, activeOverlay = null;
    
    var groups = {
        office : {
            status : 'off',
            ids    : []
        },
        'mini-hotel' : {
            status : 'off',
            ids    : []
        },
        flat : {
            status : 'off',
            ids    : []
        }
    };
    
    var iconOffice, iconMiniHotel, iconFlat;
    
    function setupMap(center)
    {
        var mapProps = {mapShowjMapIcon : false,
                        mapCenter       : [center.y, center.x],
                        mapZoom         : 14};
        
        $('#' + options.emapId).jmap('init', mapProps);
    }
    
    function setupMarkers(points)
    {
        setupIcons();

        $.each(points, function(key, value) {
            var i = 0;
            groups[key].status = 'on';
            for (i = 0; i<value.length; i++) {
                var curIcon;
                switch (key) {
                    case 'flat':
                        curIcon = iconFlat;
                        break;
                    case 'office':
                        curIcon = iconOffice;
                        break;
                    case 'mini-hotel':
                        curIcon = iconMiniHotel;
                        break;
                }
                
                groups[key].ids.push(value[i].id);
                
                markers[value[i].id] = value[i];
                
                $('#' + options.emapId).jmap('addMarker',
                                             {pointLatLng : [value[i].y, value[i].x],
                                              pointIcon   : curIcon},
                                              function (marker) {
                                                  markers[value[i].id].marker = marker;
                                                  var markerId = value[i].id;
                                                  
                                                  if (value[i].link != '') {
                                                      var markerLink = value[i].link;
                                                      GEvent.addListener(marker, "click", function() {
                                                          window.open(markerLink);
                                                          return false;
                                                      });
                                                  }
                                                  
                                                  GEvent.addListener(marker, "mouseover", function() {
                                                      showOverlay(markerId);
                                                  });
                                                  
                                                  GEvent.addListener(marker, "mouseout", function() {
                                                      hideActiveOverlay();
                                                  });
                                              });

                var eLabel = new ELabel(new GLatLng(value[i].y, value[i].x), obtainPointHtml(value[i]), options.overlayClass, new GSize(20, 0));
                eLabel.hide();
                eLabels[value[i].id] = eLabel;

                $('#' + options.emapId).jmap('getGMap', function(GMap) {GMap.addOverlay(eLabel);});               
            }
        })        
    }
    
    function showOverlay(id)
    {
        hideActiveOverlay();
        
        activeOverlay = id;
        eLabels[id].show();
    }
    
    function hideActiveOverlay()
    {        
        if (null !== activeOverlay) {
            eLabels[activeOverlay].hide();
            activeOverlay = null;
        }        
    }
    
    function obtainPointHtml(point)
    {
        var out = '<h5 class="header">' + point.name + '</h5>' + point.text;
        
        /*if (point.link != '') {
            out += '<a href="' + point.link + '">Подробнее</a>';    
        }*/
        
        return out;
    }
    
    function setupIcons()
    {   
        iconOffice = $.jmap.createIcon({iconImage  : 'http://' + options.domain + options.icons.office.file,
                                        iconSize   : new GSize(options.icons.office.size[0], options.icons.office.size[1]),
                                        iconAnchor : new GPoint(options.icons.office.anchor[0], options.icons.office.anchor[1]),
                                        iconShadow : '',
                                        imageMap   : options.icons.office.imageMap});
        
        iconMiniHotel = $.jmap.createIcon({iconImage  : 'http://' + options.domain + options.icons.miniHotel.file,
                                           iconSize   : new GSize(options.icons.miniHotel.size[0], options.icons.miniHotel.size[1]),
                                           iconAnchor : new GPoint(options.icons.miniHotel.anchor[0], options.icons.miniHotel.anchor[1]),
                                           iconShadow : '',
                                           imageMap   : options.icons.miniHotel.imageMap});
        
        iconFlat = $.jmap.createIcon({iconImage  : 'http://' + options.domain + options.icons.flat.file,
                                      iconSize   : new GSize(options.icons.flat.size[0], options.icons.flat.size[1]),
                                      iconAnchor : new GPoint(options.icons.flat.anchor[0], options.icons.flat.anchor[1]),
                                      iconShadow : '',
                                      imageMap   : options.icons.flat.imageMap});
    }
    
    function toggleGroup(group, show)
    {
        if ((groups[group].status == 'off' && !show) || (groups[group].status == 'on' && show)) {
            return;
        }
        
        for (var i=0;i<groups[group].ids.length;i++) {
            if (show) {
                showMarkerById(groups[group].ids[i]);
            } else {
                hideMarkerById(groups[group].ids[i]);
            }
        }
        
        groups[group].status = (show) ? 'on' : 'off';
    }
    
    function showMarkerById(id)
    {
        markers[id].marker.show();
    }
    
    function hideMarkerById(id)
    {
        markers[id].marker.closeInfoWindow();
        markers[id].marker.hide();
    }
    
    return {
        init : function(points, center)
        {
            setupMap(center);
            setupMarkers(points);
        },
        checkboxOnClick : function(group, checked)
        {
            toggleGroup(group, checked);
        }
    }
} ();
