/**
 * MapManager constructor
 * 
 * @param string mapId
 * @param float centerLat
 * @param float centerLng
 * @param int centerZoom
 * @param string imagePath
 * @return void
 */
function MapManager(mapId, centerLat, centerLng, centerZoom, imagePath) {
    this.mapId        = mapId;
    this.lat        = centerLat;
    this.lng         = centerLng;
    this.zoom         = centerZoom;
    this.imagePath    = imagePath;
    
    this.setUp();
    this.loadMap();
}

MapManager.prototype = {
    map:            null,  
    mapContainer:   null,
    
    // map bounds
    minLat: null,    
    minLng: null,    
    maxLat: null,    
    maxLng: null,    

    // images
    images: [],

    setUp: function () {
        this.images['office'] = this.imagePath + 'map_icon.gif';
        this.images['branch'] = this.imagePath + 'map_icon.gif';
    },

    /**
     * Loads google map
     * @return void 
     */
    loadMap : function() {
      if (GBrowserIsCompatible()) {
        this.mapContainer = document.getElementById(this.mapId);
        if (this.mapContainer == null) {
            return;
        }    
   
        this.map = new GMap2(this.mapContainer);
        this.map.setCenter(new GLatLng(this.lat, this.lng), this.zoom);
        this.map.enableScrollWheelZoom();
        this.map.addControl(new GLargeMapControl());
        this.map.addControl(new GMapTypeControl());
        
        // get map bounds
        var bounds = this.map.getBounds();      
        this.minLat = bounds.getSouthWest().y;
        this.minLng = bounds.getSouthWest().x;
        this.maxLat = bounds.getNorthEast().y;
        this.maxLng = bounds.getNorthEast().x;
      }
    },
    
    /**
     * Adds markers to map
     * 
     * @param array markers
     * @return void
     */
    addMarkers: function(markers) {
        var i, marker;
        
        for (i in markers) {
            marker = markers[i];
            
            if (!this.inViewport(marker.lat, marker.lng)) continue;
            
            with(this) {
                map.addOverlay(getMarker(marker));                
            }
        }
    },
    
    /**
     * Returns type based marker
     * 
     * @param object marker     * 
     * @return GMarker type object
     */
    getMarker: function(marker) {
        var marker;        
                
        gMarker = new GMarker(
            new GLatLng(marker.lat, marker.lng), 
            this.getIcon(marker.type)
        );               
        
        with(this) {
            GEvent.addListener(gMarker, 'click', function() {
                map.openInfoWindowHtml(new GLatLng(marker.lat, marker.lng), getInfoWindowHtml(marker.infoData));    
            });
        }
                        
        return gMarker;           
    },
    
    /**
     * Returns formatted html content
     * 
     * @param object data
     * @return string
     */
    getInfoWindowHtml: function (data) {
        var contentWrapper, address, telFax, openHours;
        
        addressText   = document.createTextNode(data.address);
        //telFaxText    = document.createTextNode('Telefon/Fax: ' + data.telFax);
        //openHoursText = document.createTextNode('Godziny otwarcia: ' + data.openHours);
        
        contentWrapper   = document.createElement('div');
        addressWrapper   = document.createElement('p');
        //telFaxWrapper    = document.createElement('p');
        //openHoursWrapper = document.createElement('p');
        
        addressWrapper.appendChild(addressText);
        //telFaxWrapper.appendChild(telFaxText);
        //openHoursWrapper.appendChild(openHoursText);
        
        contentWrapper.appendChild(addressWrapper);
        //contentWrapper.appendChild(telFaxWrapper);
        //contentWrapper.appendChild(openHoursWrapper);
        
        return contentWrapper;
    },
    
    /**
     * Checks if marker is in viewport
     * 
     * @param float lat
     * @param float lng     * 
     * @return boolean
     */
    inViewport: function (lat, lng) {
        if (lat > this.minLat && lat < this.maxLat && lng > this.minLng && lng < this.maxLng) {
            return true;            
        } 
        
        return false;
    },
    
    /**
     * Returns icon depends on type
     * 
     * @param string type     * 
     * @return GIcon object
     */
    getIcon: function(type) {
        switch (type) {
            //case 'office': return new OfficeIcon(this.images['office']);
            //case 'branch': return new OfficeBranchIcon(this.images['branch']);
            
            default: return GIcon(G_DEFAULT_ICON);
        }
    }
}

