var markerCluster = null, markers = [], mcOptions, buildermap, map, markersArray = [], infos = [], name = '', address = '', lat = '', long = '', point, marker, bounds;

mcOptions = {gmaxZoom: 15, styles: [{
    height: 58,
    url: "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m2.png",
    width: 58,
    },
    {
    height: 58,
    url: "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m2.png",
    width: 58,
    },
    {
    height: 58,
    url: "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m2.png",
    width: 58,
    },
    {
    height: 56,
    url: "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m2.png",
    width: 56,
    },
    {
    height: 56,
    url: "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m2.png",
    width: 56,
    }]};

var xzoom = readCookie('bb_xzoom');

buildermap = {
  zoom: parseInt(xzoom),
  image: "/wp-content/themes/Google%20Maps/images/marker.png",
  level: 14,
  lock: false,
  first_load: true
};

function initialize(xlat, xlng, zoomlevel){
    geocoder = new google.maps.Geocoder();
    var lat = readCookie('bb_xlat');
    var lng = readCookie('bb_xlng');
    if (typeof zoomlevel != undefined && zoomlevel != null) {
      buildermap.zoom = parseInt(zoomlevel);
    } else {
      buildermap.zoom = 12;
    }

  if (xlat != null && xlng != null){ 
	var latlng = new google.maps.LatLng(xlat, xlng); 
  }else{
    if (lat == "undefined" || lng == "undefined" || typeof lat == undefined || lat == null || typeof lng == undefined || lng == null) {
		var latlng = new google.maps.LatLng(39.7391667,-104.9841667);
      // DENVER ^
    } else {
      var latlng = new google.maps.LatLng(lat, lng);
    }
  }

  var myOptions = {
      zoom: buildermap.zoom,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.HYBRID,
      mapTypeControl: true,
      mapTypeControlOptions: {
          style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
          position: google.maps.ControlPosition.TOP_LEFT
      },
      panControl: true,
      panControlOptions: {
          position: google.maps.ControlPosition.TOP_RIGHT
      },
      zoomControl: true,
      zoomControlOptions: {
          style: google.maps.ZoomControlStyle.LARGE,
          position: google.maps.ControlPosition.RIGHT_CENTER
      },
      streetViewControl: true,
      streetViewControlOptions: {
          position: google.maps.ControlPosition.RIGHT_BOTTOM
      }
  }

  map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
  var bounds =  new google.maps.LatLngBounds();

    var swPoint = bounds.getSouthWest();
    var nePoint = bounds.getNorthEast();

    var swLat = swPoint.lat();
    var swLng = swPoint.lng();
    var neLat = nePoint.lat();
    var neLng = nePoint.lng();

	//mylat is defined in header js code
	if ((typeof mylat == undefined || typeof mylat == "object") && mylat == null) {
	     xinitializer(map);
	}
	
	if (jQuery.browser.msie) {
    	loadMapFromCurrentBounds(map, true); // Needs to be called twice - Thanks MSFT!
  	}

  google.maps.event.addListener(map,'idle',function(e){
    loadMapFromCurrentBounds(map);
  }); 

  google.maps.event.addListener(map,'zoom_changed',function(){
    deleteOverlays();
  });
}

google.load('maps', '3', { other_params: 'sensor=false' });

//google.setOnLoadCallback(initialize);
$(document).ready(function() {
	if ((typeof mylat == undefined || typeof mylat == "object") && mylat == null) {
     	initialize();
	}
});

function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
}

function showOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(map);
    }
  }

    if (jQuery.browser.msie) {
      setTimeout(function() {
        jQuery('#map_loading').hide();
      }, 3500);
    } else {
      jQuery('#map_loading').hide();
    }
}

function closeInfos(){
  if(infos.length > 0){
    infos[0].set("marker",null);
    infos[0].close();
    infos.length = 0;
  }
}

function loadMapFromCurrentBounds(map, bounds) {
  // First, determine the map bounds
  if (markerCluster) {
    markerCluster.clearMarkers();
  }

  if (buildermap.first_load == true) {
    jQuery('#map_loading').show();
  }

  if (bounds == undefined) {
    var bounds = map.getBounds();
  	
    // Then the points
    var swPoint = bounds.getSouthWest();
    var nePoint = bounds.getNorthEast();
  
    // Now, each individual coordinate
    var swLat = swPoint.lat();
    var swLng = swPoint.lng();
    var neLat = nePoint.lat();
    var neLng = nePoint.lng();
  }

  if (buildermap.lock === false) {
    buildermap.lock = true;
  jQuery.ajax({
    url: "markers.php?swLat="+swLat+"&swLng="+swLng+"&neLat="+neLat+"&neLng="+neLng,
    dataType: "XML",
    success: function(xml){
    jQuery(xml).find("marker").each(function(){
      name = jQuery(this).find('name').text();
      address = jQuery(this).find('address').text();
      // create a new LatLng point for the marker
      lat = jQuery(this).find('lat').text();
      lng = jQuery(this).find('lng').text();
      point = new google.maps.LatLng(parseFloat(lat),parseFloat(lng));

      // extend the bounds to include the new point
      bounds.extend(point);
  
      marker = new google.maps.Marker({
        position: point,
        map: map,
        icon: buildermap.image,
        title: name,
        content: '<strong>'+name+'</strong><br />'+address
      });
      markersArray.push(marker);

      google.maps.event.addListener(marker, 'click', function() {
        closeInfos();
        var info = new google.maps.InfoWindow({content: this.content});
        info.open(map,this);
        infos[0]=info;
      });
	jQuery('#map_loading').hide();
	});

    if (map.getZoom() < buildermap.level) {
      refresh_map(map);
    } else {
      showOverlays();
    }
      buildermap.lock = false;
   }
   });
   }    
}

function refresh_map(map) {
  if (markerCluster) {
    markerCluster.clearMarkers();
  }
  markerCluster = new MarkerClusterer(map, markersArray, mcOptions);
  if (buildermap.first_load == true && markersArray.length > 0) {
    buildermap.first_load = false;
    if (jQuery.browser.msie) {
      setTimeout(function() {
        jQuery('#map_loading').hide();
      }, 5500);
    } else {
      jQuery('#map_loading').hide();
    }
  }
  deleteOverlays();
}
