//
// Google Map With Custom Markers
//
// Author: Geoffrey Richey
// Date: September 2008
//

EI.namespace('ProfileMap');

EI.ProfileMap = function(mapElem,resetMapElem,locationData) {

    var self = this;

    var _mapElem = $(mapElem);
    var _resetMapElem = $(resetMapElem);
    var _markerData = locationData;
    
    var _mapObj = null;
    var _mapDefaultSize = { height: '525px', width: '660px' };
    var _mapOriginalPos = null;
    var _mapOriginalZoom = null;
    var _mapBounds = new GLatLngBounds();

    var _markerObjs = new Array();
    var _markerDefaultOptions = {};

    var createMapMarkers = function() {
        if( _markerData ) {
            for( var i = 0; i < _markerData.length; i++ ) {
                if( _markerData[i] ) {
                    var marker = new GMarker( new GLatLng(_markerData[i].lat,_markerData[i].lng));
                    _markerObjs.push(marker);
                    _mapBounds.extend(marker.getPoint());
                    addMapListener(marker,i);
                }
            }
            return true;
        }
    }

    var addMapListener = function (marker,i) {
        GEvent.addListener(marker, "click", function() {
            if(( _markerObjs[i] ) && ( _markerData[i].title )) {
                var encgeoaddr = encodeURIComponent(_markerData[i].geoaddr);
                var markerHtml = "<div id=\"mapevent\">";
                markerHtml += "<div class=\"eventinfo\">";
                markerHtml += "<h3>" + _markerData[i].title + "</h3>";
                markerHtml += "<p>" + _markerData[i].address + "</p>";
                markerHtml += "<p style=\"text-align:center\">" + "<a href=\"http://maps.google.com/?iwloc=addr&amp;iwstate1=dir&amp;q=" + encgeoaddr + "\" target=\"none\">Get Directions &raquo;</a>";
                markerHtml += "</div></div>";
                _mapObj.openInfoWindowHtml(_markerObjs[i].getPoint(), markerHtml);
            }
        });
    }

    var createMapObj = function() {
        if (_mapElem) {
            if (_mapObj) {
                return true;
            }

            if (GBrowserIsCompatible()) {
                _mapElem.style.height = _mapDefaultSize.height;
                _mapElem.style.width = _mapDefaultSize.width;
                _mapObj = new GMap2($(_mapElem));
                var tmpMapCenter = new GLatLng(-118.00,34.00);
                _mapObj.setCenter(tmpMapCenter,1);
                _mapObj.addMapType(G_PHYSICAL_MAP);
                _mapObj.addControl(new GMapTypeControl());
                _mapObj.addControl(new GLargeMapControl());
                _mapObj.addControl(new GScaleControl());

                for( var i=0; i<_markerObjs.length; i++ ) {
                    if( _markerObjs[i] ) {
                       _mapObj.addOverlay(_markerObjs[i]);
                    }
                }
            }
            return true;
        }
    }

    var setOriginalMapPosZoom = function() {
        var zoomOverride = setMapZoomOverride();
        if (( _mapObj ) && (_mapBounds)) {
            if (!_mapOriginalZoom) {
                if (_markerData.length > 1 ) {
                    _mapOriginalZoom = _mapObj.getBoundsZoomLevel(_mapBounds) - 1;
                } else {
                    _mapOriginalZoom = 14;
                }
                if( zoomOverride && ( zoomOverride < _mapOriginalZoom )){
                    _mapOriginalZoom = zoomOverride;
                }
            }
            if (!_mapOriginalPos) {
                _mapOriginalPos = _mapBounds.getCenter();
            }
            _mapObj.closeInfoWindow();
            _mapObj.setCenter(_mapOriginalPos,_mapOriginalZoom);
        }
    }

    var setMapZoomOverride = function(){
        var zoomOverride = null;
        for( var i = 0; i < _markerData.length; i++ ) {
            if( _markerData[i] ){
                if( _markerData[i].zoom_override ){
                    if(!zoomOverride || (zoomOverride > _markerData[i].zoom_override)){
                        zoomOverride = _markerData[i].zoom_override;
                    }
                }
            }
        }
        return zoomOverride;
    }

    var addMapResetLink = function() {
        if ((_markerData) && ( _resetMapElem )) {
            if( _markerData.length > 1 ) {
                _resetMapElem.update('<a href="#" title="Reset Map Position"><span>View All Locations</span></a>');
                _resetMapElem.down('a',0).observe('click',function(e) {
                    self.resetMapPos();
                    Event.stop(e);
                });
            }    
        }
    }

    this.resetMapPos = function() {
        return setOriginalMapPosZoom();
    }

    var initialize = function() {
        createMapMarkers();
        if (createMapObj()) {
            setOriginalMapPosZoom();
            addMapResetLink();
        }
    }();
}
