if(typeof Map == 'undefined' || !Map) var Map = {};

/**
 * Google map base class
 * @author Tsuyoshi Saito <tsuyoshi@on-idle.com>
 * @version 1.0
 */
Map.google = (function() {
    var _map;
    var _mgr;
    var _markers;
    var _currentMarker = {}
    
    /**
     * Return google latlang point object
     * @param {Object} lat
     * @param {Object} lng
     */
    var getPoint = function(lat, lng){
        return new GLatLng(parseFloat(lat), parseFloat(lng));
    }
        
    /**
     * Create icon instance
     * @param {Object} options
     */
    icon = function(options){
        var icon = new GIcon();
        icon.image = options.src;
        icon.iconSize = new GSize(22, 34);
        icon.iconAnchor = new GPoint(11, 34);
        return icon;
    }
    
    return {
        /**
         * Reset map to default
         */
        resetMap: function(){
            var d = Map.Config.read('defaultMap');
            _map.setMapType(d.type);
            return this.gotoPoint(d.lat, d.lng, d.zoom);
        },
        
        /**
         * Return google latlang point object
         * @param {Object} lat
         * @param {Object} lng
         */
        getPoint: function(lat, lng){
            return getPoint(lat, lng);
        },
        
        /**
         * Go to location on the map
         * @param {integer} lat
         * @param {integer} lng
         * @param {integer} zoom
         */
        gotoPoint: function(lat, lng, zoom){
            return _map.setCenter(this.getPoint(lat, lng), parseInt(zoom));
        },
        
        /**
         * Pan to the marker
         * @param {Object} lat
         * @param {Object} lng
         */
        panTo: function(lat, lng) {
            return _map.panTo(this.getPoint(lat, lng));
        },
        
        /**
         * Create marker
         * @param {Object} point
         * @param {Object} options
         * @param {Object} icon
         */
        createMarker: function(point, options, icon){
            var marker = new GMarker(point, icon);
            
            $.extend(marker, options);
            
            GEvent.addListener(marker, 'mouseover', function(){
            });
            
            GEvent.addListener(marker, 'mouseout', function(){
            });
            
            GEvent.addListener(marker, 'click', function(){
                _map.panTo(this.getPoint(marker.lat, marker.lng));
            });
            
            return marker;
        },
        
        /**
         * Create google map object
         */
        setup: function() {
            // Check if compatible
            if (!GBrowserIsCompatible()) 
                return false;
            
            // Create google _map object
            _map = new GMap2(document.getElementById("map-canvas"));
            
            // Reset map to default state
            this.resetMap();
            
            // Setting map's UI options
            var uiOptions = _map.getDefaultUI();
            uiOptions.zoom.scrollwheel = false;
            _map.setUI(uiOptions);
            
            // Placing overview map in corner
            //_map.addControl(new GOverviewMapControl());
            
            // Context menu class
            Map.ContextMenu.init(_map);
            
            // Marker manager class
            _mgr = new MarkerManager(_map);
        },
        
        markers: function() {
            return _markers;
        },
        
        /**
         * Clear markers
         */
        clearMarkers: function() {
            _mgr.clearMarkers();
        },
        
        /**
         * Add markers to map
         * @param {Object} markers
         */
        addMarkers: function(markers) {
            _markers = markers;
            _mgr.addMarkers(markers, 0);
            return _mgr.refresh();
        }
    }
}());