$(document).ready(function(){
    var args = {region:region,zip:zip,distance:distance}
    map.load(args);
});

function formatWindow (input) {
	return '<div class="bubble">'
					+ '<h3><a href="#site'+input.id+'">'+input.name+'</a></h3>' 
					+ '<p>' + input.body + '</p>'
					+ ((input.region=='') ? '' : '<p class="map_meta_region">Region: <a href="?region='+input.region+'">'+input.region+'</a></p>')
					+ '</div>';
}

var map = {

    storesPlotted: null,
    api_key:    'ABQIAAAAMwdxgAqXzpdAWJT_nAd5dBRwz5Cqt_RTyZakh3aFADKHYTzbLhSzfI-XQ4OpYH3qQrz6AD3jwZh26Q',
    url:        'data/points.json.php',
    address:    null,
    map:        null,
    flag:       null,
    zoom:       0,
    region:     '',
    distance:   null,
    zip:        null,
    firstLoad:  true,
    
    setRegion:function(region){
        this.region = region;
        this.url += "?region="+region;
    },
    
    setZip:function(zip,lat,lng,distance){
        this.zip = zip;
        this.distance = distance;
        this.url += "?zip="+zip+"&lat="+lat+"&lng="+lng+"&distance="+distance;
    },
    
   load:function(args){
    
      var self = this;
            
      if (args.zip && args.distance) {
         var geocoder = new GClientGeocoder();
         geocoder.getLocations(args.zip,function(response){
            var place = response.Placemark[0];
            args.lat = place.Point.coordinates[1];
            args.lng = place.Point.coordinates[0];
            self.init(args);
         });
      } else {
         self.init(args);
      }
    
   },

    init:function(args){
        
        if (!GBrowserIsCompatible()) return;
        var self = this;
        this.storesPlotted = new Object();
        
        if (args.region!='') this.setRegion(args.region);
        if (args.zip!='' && args.distance!='') this.setZip(args.zip,args.lat,args.lng,args.distance);
        
        // create a base marker icon
        this.flag = new GIcon();
        this.flag.image = "data/marker.png";
        this.flag.shadow = "data/marker_shadow.png";
        this.flag.iconSize = new GSize(34,32);
        this.flag.shadowSize = new GSize(40,32);
        this.flag.iconAnchor = new GPoint(8,30);
        this.flag.infoWindowAnchor = new GPoint(18,15);
        
        // create the map
        if (!$("#map").get(0)) return;
        this.map = new GMap2(document.getElementById("map"));
        this.map.addControl(new GSmallMapControl());
        this.map.addControl(new GMapTypeControl());
        this.map.setCenter(new GLatLng(0,0),0);
        
        this.showPoints();

    },
    
    showPoints:function(address){
        
        var self = this;
        
        var bounds = new GLatLngBounds;
        var markers = [];
        
        $.get(self.url,function(data){
        
            var json = eval("("+data+")");
            
            if (json.length==undefined) {
                var msg = '<p class="error">No dealers found within the range you selected.</p>';
                $("#map").hide();
                $("#map").before(msg);
            }

            for (s in json) {
                var loc = json[s];
                
                var point = new GLatLng(loc.lat,loc.lon);
                bounds.extend(point);
                
                var marker = self.createMarker(point,loc,loc.name);
                //self.addMarker(marker);
                markers.push(marker);
                
            }
            
            var cluster = new ClusterMarker(self.map,{markers:markers,fitMapMaxZoom:9});
            cluster.fitMapToMarkers();
            
            self.showOuttaboundsPoints(cluster);
            
        });
    },
    
    showOuttaboundsPoints:function(cluster){
        
        var self = this;
        
        var bounds = new GLatLngBounds;
        var markers = [];
        
        $.get(self.url+'&mode=not',function(data){
            var json = eval("("+data+")");

            for (s in json) {
                var loc = json[s];
                
                var point = new GLatLng(loc.lat,loc.lon);
                bounds.extend(point);
                
                var marker = self.createMarker(point,loc,loc.name);
                //self.addMarker(marker);
                markers.push(marker);
                
            }
            
            cluster.addMarkers(markers);
            //cluster.fitMapToMarkers();
            
        });        
    
    },
    
    createMarker:function(point,info,region) {
    
        var self = this;
                        
        var marker = new GMarker(point,{title:region,icon:this.flag});
        GEvent.addListener(marker,"click",function(){
            if (info) {
               marker.openInfoWindowHtml(formatWindow(info));
            } else {
                self.map.zoomIn(point);
            }
        });
        
        return marker;

    },
    
    addMarker:function(marker) {
    
        this.map.addOverlay(marker);
        
    }
    
    

}

