/*
This is a quick and dirty way to gather all the address info
will probably be used more efficiently in venue_entry_form.js later
in development.
*/
var mapper;
var showBubble;
var markers = new Array();

var emptyFn = function(){}
var bubbleTemplate = "<b>{venue}</b><br>{address}<br>{city}, {state} {zip}<div class='bubbleArrow'></div>";

function parseTemplate(template,vars){
    var ret = template;
    for(key in vars){
        ret = ret.replace(new RegExp("{"+key+"}","g"), vars[key]);
    }
    return ret;
}

function showBubble(marker,html,checkBounds){
    if(checkBounds === true){
        var bounds = gm.getMap().getBounds();
        if( !bounds.containsLatLng(marker.getLatLng()) ){
            gm.getMap().setCenter(marker.getLatLng());
        }
    }

    var bubble = jQuery("#floatingBubble");
    if( bubble.length < 1 ){
        jQuery('body').append("<div id='floatingBubble'></div>");
        bubble = jQuery("#floatingBubble");
    }

    var i = jQuery(marker.V[0]);
    var o = i.offset();

    bubble.html(html);
    bubble.show();
    bubble.css({
      top:(o.top - bubble.height() + 18 ),
      left:( o.left - bubble.width() - 35 )
    });
}

function hideBubble(){
    var bubble = jQuery("#floatingBubble");
    if( bubble.length > 0 ){
        bubble.html("");
        bubble.hide();
    }
}

function onMarkerAdd(marker){
    marker.proto.bubbleHTML = parseTemplate(bubbleTemplate,marker.proto.bubbleVars);
    GEvent.addListener(marker,"mouseover",function(point){
        this.setImage(this.proto.overIcon || this.proto.icon);
        showBubble(this,this.proto.bubbleHTML);
    });
    
    GEvent.addListener(marker,"mouseout",function(point){
        this.setImage(this.proto.icon);
        hideBubble();
    });
    
    var liElem = document.getElementById("map_"+marker.proto.event_id);

    if( !!liElem ){
        GEvent.addDomListener(firstChild(liElem),"mouseover",function(){
            marker.setImage(marker.proto.overIcon || marker.proto.icon);
            showBubble(marker,marker.proto.bubbleHTML,true);
        });

        GEvent.addDomListener(firstChild(liElem),"mouseout",function(){
           marker.setImage(marker.proto.icon);
           hideBubble();
        });
    }

    GEvent.addListener(marker,"click",function(point){
        top.location.href = this.proto.url;
    });   
}


function googleMap(opts){
    if(!GBrowserIsCompatible()) return;
    
    var _container         = opts.container;
    var _width             = opts.width;
    var _height            = opts.height;
    var _defZoom           = opts.zoom;
    var _centerBounds      = (typeof(opts.centerBounds)!='undefined') ? opts.centerBounds : null;
    var _centerLat         = (typeof(opts.centerLat)!='undefined') ? opts.centerLat : 0;
    var _centerLon         = (typeof(opts.centerLon)!='undefined') ? opts.centerLon : 0;
    var _markerAddCallback = opts.markerAddCallback || emptyFn
    var _markers           = [];

    var _map = new GMap2(
      document.getElementById(_container),
      { size:new GSize(_width,_height),backgroundColor:"white" }
    ); 
    
    if (_centerBounds) {
        _map.setCenter(_centerBounds.getCenter() ,_map.getBoundsZoomLevel(_centerBounds));
    } else {
        _map.setCenter(new GLatLng(_centerLat,_centerLon),_defZoom);
    }
    _map.addControl(new GSmallMapControl());

    return {
        populate : function populate( pts,clear ){ 
            if(clear) this.clear();
            for(var i=0, c=pts.length; i<c; i++){
                if(pts[i].lat === 0 && pts[i].lon === 0) continue;
                var point = new GLatLng(pts[i].lat,pts[i].lon);
                var markerOpts = {};
                if(!!pts[i].icon){
                    var cstIcon = new GIcon();
                    cstIcon.image = pts[i].icon.src || pts[i].icon;
                    cstIcon.iconSize = new GSize(pts[i].icon.width || 21, pts[i].icon.height || 25);
                    cstIcon.iconAnchor = new GPoint(pts[i].icon.offsetX || 10, pts[i].icon.offsetY || 25);
                    markerOpts.icon = cstIcon;
                }
         
                var marker = new GMarker(point,markerOpts);

                if(!!marker){
                    _map.addOverlay( marker );
                    marker.proto = pts[i];
                
                    if(pts[i].centerOn === true){
                        _map.setCenter(point,pts[i].zoom || _defZoom);
                    }

                    _markers.push(marker);
                    _markerAddCallback(marker);
                }
            }
        },
        
        clear : function clear( leave ){
            leave = leave || 0;
            while(_markers.length > leave){
                var marker = _markers.pop();
                _map.removeOverlay( marker );
            }
        },

        markerCallback : function markerCallback(){
        },

        markerCount : function markerCount(){
            return _markers.length;
        },

        getMarker : function getMarker(idx){
            if( idx >= 0 && idx < _markers.length ){
                return _markers[idx];
            } else {
                return;
            }
        },

        getMap : function getMap(){
            return _map;
        }
    }
}
function mapLoad(ps, map_id, zoom, width, height){
        /*forcing zoom to 15 per big person */
        var added;
        if (GBrowserIsCompatible()) {
            mapper = new GMap2(document.getElementById(map_id),{size:new GSize(width||499,height||441)});
            //mapper.addControl(new GSmallMapControl());
            //mapper.addControl(new GMapTypeControl());
            //var i = ps.length;
            //while(i--){
            var centered=false;
            for(i=0; i<ps.length; i++){
                if(ps[i].lat != 0 && ps[i].lon != 0){
                    if(!centered){
                        point = new GLatLng(ps[i].lat, ps[i].lon);
                        mapper.setCenter(point, zoom ? zoom : 15);
                        centered=true;
                        added = addPoint(ps[i],document.getElementById(map_id+'_'+ps[i].event_id),true,ps[i].icon);
                    } else {
                        point = new GLatLng(ps[i].lat,ps[i].lon);
                        added = addPoint(ps[i],document.getElementById(map_id+'_'+ps[i].event_id),true,ps[i].icon)
                    }
                }
            }
        }
        return added;
}
                 

function mapLoad2(ps, id) {
    if (GBrowserIsCompatible()) {
        mapper = new GMap2(document.getElementById(id));
        mapper.addControl(new GSmallMapControl());
        mapper.addControl(new GMapTypeControl());
        
        for(i=0; i<ps.length; i++){
            point = new GLatLng(ps[i].lat, ps[i].lon);
            if(i==0) mapper.setCenter(point, 16);
            mapper.setCenter(point,16);
            var customIcon = new GIcon();
			    customIcon.image = ps[i].icon;
				customIcon.iconSize = new GSize(21, 25);
				customIcon.iconAnchor = new GPoint(10, 25);
				customIcon.infoWindowAnchor = new GPoint(10, 2);
			    markerOptions = { icon:customIcon };
            var marker = new GMarker(point, markerOptions);
            mapper.addOverlay(marker);
            marker.openInfoWindowHtml(ps[i].bubble);
        }
        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(points[0].bubble);
        });
        GEvent.addDomListener(document.getElementById("venTitle"),"mouseover", function() {
            marker.openInfoWindowHtml(points[0].bubble);
        });
    }
}

function addPoint(p,element,addToMap,icon, addToArray){
            point = new GLatLng(p.lat, p.lon);
            if(icon){
                var customIcon = new GIcon();
                customIcon.iconSize = new GSize(21, 25);
		customIcon.iconAnchor = new GPoint(10, 25);
		customIcon.infoWindowAnchor = new GPoint(10, 2);
	        customIcon.image = icon;
	        markerOptions = { icon:customIcon };
            }
            var marker = new GMarker(point, markerOptions);

            if(marker != null){
                GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(p.bubble); });
            }
            if(element != null){
                GEvent.addDomListener(firstChild(element),"mouseover", function() { marker.openInfoWindowHtml(p.bubble); });
            }

            if(addToArray){ markers.push(marker) };
            if (addToMap){
                 mapper.addOverlay(marker);
            };
            //if(showBubble == p.lat+","+p.lon){
            //    marker.openInfoWindowHtml(p.bubble);
            //}
            return {p:point,m:marker};
}
function clearPoints(){
       for(i=0; i<markers.length; i++){
            mapper.removeOverlay(markers[i]);
        }
    markers = new Array();
}

function firstChild(elem){
    elem = elem.firstChild;
    while(elem.nodeType != 1) 
       elem = elem.nextSibling;
    return elem;
}
