
function GoogleMapManager() {};
GoogleMapManager.prototype =
{
	map_container: null, map: null,  center_latlng: null,

	map_info_window: null,
	map_info_window_domready: false,
	map_info_window_html: '',
	center_marker_info_window: null,

	dot_markerImage: null,
	blank_markerImage: null,
	iconSize: null,
	iconHotSpotOffset: null,
	iconPosition: null,
	markerShadow: null,

	map_results: null,
	map_dots: null,

	result_product_numbers: null,
	dot_product_numbers: null,

	result_markers: null,
	dot_markers: null,

	circle_overlay_showing: false,
	circle_overlay: null,
	circle_overlay_radius_miles: 1,
	circle_overlay_center_latlng: null,

	state_overlays_showing: false,
	state_overlays: null,

	idle_callback_function: null,
	zoom_changed_callback_function: null,
	drag_end_callback_function: null,
	bounds_changed_callback_function: null,

	last_clicked_marker: null,
	result_marker_click_callback_function: null,
	dot_marker_click_callback_function: null,

	num_boxes_drawn: 0,



	initialize : function(map_container_id, init_lat, init_lng, init_zoom)
	{
 if(google == undefined)
 {
 alert('Google Maps Failed to load. Please Refresh and try again.');
 }
 else
 {
 this.map_container = document.getElementById(map_container_id);
 this.center_latlng = new google.maps.LatLng(init_lat, init_lng);

 this.map_results = new Array();
 this.map_dots = new Array();
 this.result_product_numbers = new Array();
 this.dot_product_numbers = new Array();
 this.result_markers = new Array();
 this.dot_markers = new Array();

 this.loadMarkerIcons();
 this.loadMap(init_zoom);
 }
	},

	loadMarkerIcons : function()
	{
 var dot_iconSize = new google.maps.Size(10, 10);
 var dot_iconHotSpotOffset = new google.maps.Point(3, 5);  var dot_iconPosition = new google.maps.Point(0, 0);
 var dot_iconImageUrl = "/themes/default/product_search/product_search/markers/reddot.png";
 this.dot_markerImage = new google.maps.MarkerImage(dot_iconImageUrl, dot_iconSize, dot_iconPosition, dot_iconHotSpotOffset);

 this.iconSize = new google.maps.Size(20, 34);
 this.iconHotSpotOffset = new google.maps.Point(9, 34);  this.iconPosition = new google.maps.Point(0, 0);
 var iconImageUrl = "/themes/default/product_search/product_search/markers/Empty.png";
 this.blank_markerImage = new google.maps.MarkerImage(iconImageUrl, this.iconSize, this.iconPosition, this.iconHotSpotOffset);

 var iconShadowSize = new google.maps.Size(37, 34);
 var iconShadowUrl = "/themes/default/product_search/images/search_shadow50.png";
 this.markerShadow = new google.maps.MarkerImage(iconShadowUrl, iconShadowSize, this.iconPosition, this.iconHotSpotOffset);

 },

	loadMap : function(init_zoom)
	{
 var adbucketMapType = new google.maps.ImageMapType({
 getTileUrl: function(coord, zoom) {
  if(load_map_images == 0)
 {
  return "/themes/default/product_search/images/blanktile256.png";
 }
 else
 {
  var mod = (1 << zoom);
 if(coord.y < 0 || coord.y >= mod)
 {
   return "/themes/default/product_search/images/blanktile256.png";
 }
 else
 {
   var x = ((coord.x % mod) + mod) % mod;
 	var y = ((coord.y % mod) + mod) % mod;
 	if(zoom <= 3)
 	{
  var url = "/themes/default/product_search/maps/roadmap_tiles/"+zoom+"_"+y+"_"+x+".png";
   return url;
 	}
 	else
 	{
  var url = "http://mt"+((x+y)%3)+".google.com/vt?lyrs=m@132" + "&src=apiv3" + "&hl=en-US" + "&apistyle=" + "s.t:33|p.v:off" + "&x=" + x + "&y=" + y + "&z=" + zoom + "&s=Galileo";
   return url;
 	}
 }
 }
 },
 tileSize: new google.maps.Size(256, 256),
 isPng: true,
 alt: "AdBucket Map Layer",
 name: "MyMap",
 maxZoom: 20
 });

 var myOptions = {
 zoom: init_zoom,
 center: this.center_latlng,
 scaleControl: true,  mapTypeId: 'MyMap',
 mapTypeControl: false,  mapTypeControlOptions: {
 mapTypeIds: ['MyMap', google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID],
 style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
 position: google.maps.ControlPosition.TOP_RIGHT
 },
 streetViewControl: false
 }

 this.map = new google.maps.Map(this.map_container, myOptions);
 this.map.mapTypes.set('MyMap',adbucketMapType);
 this.map.setMapTypeId('MyMap');
 this.zoomAndCenterMap();

 var self = this;

 google.maps.event.addListener(this.map, 'dragend', function() {
 self._eventDragEnd();
 });
 google.maps.event.addListener(this.map, 'zoom_changed', function() {
 self._eventZoomChanged();
 });
 google.maps.event.addListener(this.map, 'bounds_changed', function() {
 self._eventBoundsChanged();
 });
	},



	setIdleCallback : function(callback_function)
	{
 this.idle_callback_function = callback_function;
	},
	setZoomChangedCallback : function(callback_function)
	{
 this.zoom_changed_callback_function = callback_function;
	},
	setBoundsChangedCallback : function(callback_function)
	{
 this.bounds_changed_callback_function = callback_function;
	},
	setDragEndCallback : function(callback_function)
	{
 this.drag_end_callback_function = callback_function;
	},
	setResultMarkerClickCallback : function(callback_function)
	{
 this.result_marker_click_callback_function = callback_function;
	},
	setDotMarkerClickCallback : function(callback_function)
	{
 this.dot_marker_click_callback_function = callback_function;
	},
	refreshMap : function()
	{

 google.maps.event.trigger(this.map, 'resize');
	},

	setCenter : function(center_latlng)
	{
 this.map.setCenter(center_latlng);
	},
	getCenter : function()
	{
 this.map.getCenter();
	},
	fitBounds : function(bounds)
	{
 this.map.fitBounds(bounds);
	},

	zoomAndCenterMap : function()
	{
 var bounds = new google.maps.LatLngBounds();
 if(this.result_markers != undefined)
 {
 for(var index=0; index < this.result_markers.length; index++)
 {
 var marker = this.result_markers[index];
 bounds.extend(marker.getPosition());
 }
 }
 if(bounds.isEmpty()) {
 this.map.setCenter(this.center_latlng);
 }
 else
 {
  this.map.fitBounds(bounds);
 this.map.setCenter(bounds.getCenter());
 }
	},

	drawBoundsBoxMarkers : function(bounds, title_prefix, box_color)
	{
 if(title_prefix == undefined) title_prefix = "";
 if(box_color == undefined) box_color = "#00FF00";

 var ne = bounds.getNorthEast();
 var sw = bounds.getSouthWest();
 if(sw.lng() < -175 || sw.lng() > ne.lng())
 sw = new google.maps.LatLng(sw.lat(), -175);
 if(ne.lng() > 0 || ne.lng() < sw.lng())
 ne = new google.maps.LatLng(ne.lat(), 0);
 var se = new google.maps.LatLng(sw.lat(), ne.lng());
 var nw = new google.maps.LatLng(ne.lat(), sw.lng());

 var box_markers = new Array();
 box_markers[0] = this.plotMarker(ne.lat(), ne.lng(), title_prefix+"NE: "+ne.toString(), title_prefix+"NE: "+ne.toString());
 box_markers[1] = this.plotMarker(sw.lat(), sw.lng(), title_prefix+"SW: "+sw.toString(), title_prefix+"SW: "+sw.toString());
 box_markers[2] = this.plotMarker(se.lat(), se.lng(), title_prefix+"SE: "+se.toString(), title_prefix+"SE: "+se.toString());
 box_markers[3] = this.plotMarker(nw.lat(), nw.lng(), title_prefix+"NW: "+nw.toString(), title_prefix+"NW: "+nw.toString());

 var rectCoordinates = [ne, se, sw, nw, ne];
 var polyline = new google.maps.Polyline({
 path: rectCoordinates,
 strokeColor: box_color,
 strokeOpacity: 1.0,
 strokeWeight: 2
 });
 polyline.setMap(this.map);
 box_markers_obj = {box_markers:box_markers, polyline:polyline};
 return box_markers_obj;
	},

	clearBoundsBoxMarkers : function(box_markers_obj)
	{
 if(box_markers_obj == null) return;
 var box_markers = box_markers_obj.box_markers;
 box_markers[0].setMap(null);
 box_markers[1].setMap(null);
 box_markers[2].setMap(null);
 box_markers[3].setMap(null);
 box_markers_obj.polyline.setMap(null);
	},

	drawPolygonMarkers : function(polygon_latlngs, title_prefix, box_color)
	{
 if(title_prefix == undefined) title_prefix = "";
 if(box_color == undefined) box_color = "#00FF00";

 var polygon_markers = new Array();
 var show_polygon_markers = false;
 if(show_polygon_markers)
 {
 for(var i=0; i<polygon_latlngs.length; i++)
 {
 var latlng = polygon_latlngs[i];
 if(latlng.lng() < -175)
 latlng = new google.maps.LatLng(latlng.lat(), -175);
 if(latlng.lng() > 0)
 latlng = new google.maps.LatLng(latlng.lat(), 0);
 polygon_markers[i] = this.plotMarker(latlng.lat(), latlng.lng(), title_prefix+", Point #"+(i+1)+": "+latlng.toString(), title_prefix+", Point #"+(i+1)+": "+latlng.toString());
 }
 }
 var polyline = new google.maps.Polyline({
 path: polygon_latlngs,
 strokeColor: box_color,
 strokeOpacity: 1.0,
 strokeWeight: 2
 });
 polyline.setMap(this.map);
 polygon_markers_obj = {polygon_markers:polygon_markers, polyline:polyline};
 return polygon_markers_obj;
	},

	clearPolygonMarkers : function(polygon_markers_obj)
	{
 if(polygon_markers_obj == null) return;
 var polygon_markers = polygon_markers_obj.polygon_markers;
 for(var i=0; i<polygon_markers.length; i++)
 {
 polygon_markers[i].setMap(null);
 }
 polygon_markers_obj.polyline.setMap(null);
	},



	setMapResults : function(map_results)
	{
 this.map_results = new Array();
 for(var index=0; index < map_results.length; index++)
 {
 var result_obj = {};
 result_obj.prodnum = map_results[index][0];
 result_obj.lat = map_results[index][1];
 result_obj.lng = map_results[index][2];
 result_obj.address = map_results[index][3];
 result_obj.bgcolor = map_results[index][4];
 result_obj.textcolor = map_results[index][5];
 result_obj.valid = false;
 result_obj.plotted = false;
 this.map_results[index] = result_obj;
 this.result_product_numbers[result_obj.prodnum] = index;
 }
	},

	checkMapResults : function()
	{
 if(this.map_results != undefined && this.map_results.length && this.map_results.length > 0)
 {
 for(var index=0; index < this.map_results.length; index++)
 {
 var result_obj = this.map_results[index];
 if(result_obj.lat!=0 && result_obj.lng!=0)
 {
  this.map_results[index].valid = true;
  this._plotResult(index);
 }
 }
 	//this.zoomAndCenterMap();
 }
	},

	clearResultMarkers : function()
	{
 if(this.map_results != undefined)
 {
 if(this.map_results.length && this.map_results.length>0)
 {
 for(var i=0; i < this.map_results.length; i++)
 {
 this.map_results[i].plotted = false;
  if(this.result_markers != undefined && this.result_markers[i] != undefined)
 {
 	this.result_markers[i].setMap(null);  }
 }
 }
 this.closeInfoWindow();
 }
 this.result_markers = new Array();
 this.result_product_numbers = new Array();
	},

	plotResultMarkers : function()
	{
 if(this.map_results.length && this.map_results.length>0)
 {
 for(var i=0; i < this.map_results.length; i++)
 {
 var result_obj = this.map_results[i];
 var marker = this.result_markers[i];
 if(result_obj.plotted == true)
 {
  }
 else
 {
 if(result_obj.marker && typeof result_obj.marker == 'object')
 {
   marker.setMap(this.map);
 	result_obj.plotted = true;
 }
 else
 {
   this._plotResult(index);
 }
 }
 }
 }
	},

	_plotResult : function(index)
	{
 var result_obj = this.map_results[index];
 if(index > 25) index = 26;
 var markerLetter = String.fromCharCode(65 + index);  var markerBGColor = this.map_results[index].bgcolor;
 var markerTextColor = this.map_results[index].textcolor;
 var iconImageUrl = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld="+markerLetter+"|"+markerBGColor+"|"+markerTextColor;
 var iconMarkerImage = new google.maps.MarkerImage(iconImageUrl, this.iconSize, this.iconPosition, this.iconHotSpotOffset);

 if(result_obj.lat != 0 && result_obj.lng != 0)
 {
 var latlng = new google.maps.LatLng(result_obj.lat, result_obj.lng);
 var markerOptions = {
  icon: iconMarkerImage,
 shadow: this.markerShadow,
 position: latlng,
 map: this.map,
 zIndex: 100
 }
 var marker = this._createMarker(markerOptions, latlng, result_obj.prodnum, 0);
 this.result_markers[index] = marker;
 this.map_results[index].plotted = true;
 }
	},



	setMapDots : function(records)
	{
 this.map_dots = new Array();
 for(var index=0; index < records.length; index++)
 {
 var dot_obj = {};
 dot_obj.prodnum = records[index][0];
 dot_obj.lat = records[index][1];
 dot_obj.lng = records[index][2];
 dot_obj.valid = false;
 dot_obj.plotted = false;
 this.map_dots[index] = dot_obj;
 }
	},

	syncNewMapDots : function(records, dots_bounds)
	{
 	for(var prodnum in this.dot_product_numbers)
 {
 this.dot_product_numbers[prodnum][1] = false;
 }
 for(var record_index=0; record_index < records.length; record_index++)
 {
 var prodnum = records[record_index][0];
 if(this.dot_product_numbers[prodnum] == undefined)
 {
  if(this.result_product_numbers[prodnum] == undefined)
 {
   var lat = records[record_index][1];
 var lng = records[record_index][2];
 var city = records[record_index][3];
 if(lat != 0 && lng != 0)
 {
 	var new_dot_index = this.map_dots.length;
 	this.dot_product_numbers[prodnum] = [new_dot_index,true];

 	var dot_obj = {};
 	dot_obj.prodnum = prodnum;
 	dot_obj.lat = lat;
 	dot_obj.lng = lng;
 	dot_obj.city = city;
 	dot_obj.valid = false;
 	dot_obj.plotted = false;
 	this.map_dots[new_dot_index] = dot_obj;
 	this._plotDot(new_dot_index);
  	}
 }
 else
 {
   }
 }
 else
 {
   this.dot_product_numbers[prodnum][1] = true;
 var dot_index = this.dot_product_numbers[prodnum][0];
  }

 }



 var dots_count = 0;
 var num_dots_removed = 0;
 var dot_latlng = null;
 var remove_dot = false;
 var dot_index = -1;

 var dots_bounds_ne = dots_bounds.getNorthEast();
 var dots_bounds_sw = dots_bounds.getSouthWest();
 var dots_bounds_ne_lat = dots_bounds_ne.lat();
 var dots_bounds_ne_lng = dots_bounds_ne.lng();
 var dots_bounds_sw_lat = dots_bounds_sw.lat();
 var dots_bounds_sw_lng = dots_bounds_sw.lng();

 var check_remove_dot_by_bounds = true;
 if(check_remove_dot_by_bounds)
 {
 	for(var prodnum in this.dot_product_numbers)
 {
 dot_index = this.dot_product_numbers[prodnum][0];
 if(this.dot_product_numbers[prodnum][1] == false)
 {
  if(this.map_dots[dot_index] != undefined)
 {
 	var dot_lat = this.map_dots[dot_index].lat;
 	var dot_lng = this.map_dots[dot_index].lng;
 	dot_latlng = new google.maps.LatLng( dot_lat, dot_lng );
   if(dots_bounds.contains(dot_latlng))
 	{
    	dots_count++;
   }
 	else  	{
    	this.removeDot(dot_index, prodnum);
  num_dots_removed++;
 	}
 }
 else
 {
  	}
 }
 else
 {
  dots_count++;
 }
 }
 }

 var check_remove_dots_by_max = true;
 if(check_remove_dots_by_max)
 {
 for(var prodnum in this.dot_product_numbers)
 {
 dot_index = this.dot_product_numbers[prodnum][0];
 if(this.dot_product_numbers[prodnum][1] == false)
 {
 if(dots_count > 300)
 {
   this.removeDot(dot_index, prodnum);
 	num_dots_removed++;
 	dots_count--;
 }
 }
 }
 }

 var prod_nums_count = 0;
 dots_count = 0;
 for(var i in this.map_dots)
 {
 dots_count++;
 }
 if(this.map_dots.length > dots_count)
 {
 	var new_map_dots = new Array();
 var new_dot_product_numbers = new Array();
 var new_dot_markers = new Array();
 var index = 0, prodnum = '';
 for(var i in this.map_dots)
 {
  new_map_dots[index] = this.map_dots[i];
 new_dot_markers[index] = this.dot_markers[i];
 prodnum = this.map_dots[i].prodnum;
 new_dot_product_numbers[prodnum] = [index,true];
 index++;
 prod_nums_count++;
 }
 dots_count = index;
 prod_nums_count = index;
 this.map_dots = new_map_dots;
 this.dot_markers = new_dot_markers;
 this.dot_product_numbers = new_dot_product_numbers;
 }
 },

	removeDot : function(dot_index, prodnum)
	{
 this.clearMapDot(dot_index);
 eval("delete this.dot_product_numbers['"+prodnum+"']");
 eval("delete this.map_dots["+dot_index+"]");
 eval("delete this.dot_markers["+dot_index+"]");
 },

	checkMapDots : function()
	{
 if(this.map_dots != undefined && this.map_dots.length && this.map_dots.length>0)
 {
 var dot_obj = {}, lat = 0, lng = 0;
 for(var index=0; index < this.map_dots.length; index++)
 {
 dot_obj = this.map_dots[index];
 if(dot_obj.lat!=0 && dot_obj.lng!=0)
 {
  this.map_dots[index].valid = true;
  this._plotDot(index);
 }
 }
 }
	},

	clearMapDots : function()
	{
 if(this.map_dots != undefined)
 {
 if(this.map_dots.length && this.map_dots.length>0)
 {
 for(var i=0; i < this.map_dots.length; i++)
 {
 this.map_dots[i].plotted = false;
  if(this.dot_markers != undefined && this.dot_markers[i] != undefined)
 {
 	this.dot_markers[i].setMap(null);  }
 }
 }
 this.closeInfoWindow();
 }
 this.dot_markers = new Array();
	},

	clearMapDot : function(index)
	{
 if(this.dot_markers != undefined && this.dot_markers[index] != undefined && this.dot_markers[index].setMap != undefined)
 {
 this.dot_markers[index].setMap(null);  }
	},

	updateDotMarkers : function()
	{
 if(this.map_dots.length && this.map_dots.length>0)
 {
 for(var i=0; i < this.map_dots.length; i++)
 {
 var map_dot = this.map_dots[i];
 var marker = this.dot_markers[i];
 if(map_dot.plotted == true)
 {
  }
 else
 {
 if(map_dot.marker && typeof map_dot.marker == 'object')
 {
   marker.setMap(this.map);
 	map_dot.plotted = true;
 }
 else
 {
   this._plotDot(index);
 }
 }
 }
 }
	},

	_plotDot : function(index)
	{
 var dot = this.map_dots[index];
 if(dot.lat != 0 && dot.lng != 0)
 {
 var latlng = new google.maps.LatLng(dot.lat, dot.lng);
 var markerOptions = {
  icon: this.dot_markerImage,
 position: latlng,
 map: this.map,
 zIndex: 1
 }
 var dot_marker = this._createMarker(markerOptions, latlng, dot.prodnum, 1);
 this.dot_markers[index] = dot_marker;
 this.map_dots[index].plotted = true;
 }
	},




	plotMarker : function(lat, lng, title)
	{
 if(title == undefined) title = lat+", "+lng;
 var latlng = new google.maps.LatLng(lat, lng);
 var iconMarkerImage = this.blank_markerImage;
 var markerOptions = {
 title: title,
 icon: iconMarkerImage,
 shadow: this.markerShadow,
 position: latlng,
 map: this.map,
 zIndex: 100
 }
 var marker = this._createMarker(markerOptions, latlng, '', 0);
 return marker;
	},

	plotCenterMarker : function(lat, lng, title)
	{
 if(title == undefined) title = '';
 lat = parseFloat(lat);
 lng = parseFloat(lng);
 var latlng_str = "("+lat.toFixed(6)+", "+lng.toFixed(6)+")";
 var html = "<b>Search Location Center:</b><br/>"+title+"<br/>";
 if(title.substring(0,1) != '(')
 {
 title += " "+latlng_str;
 html += latlng_str;
 }
 var latlng = new google.maps.LatLng(lat, lng);

 var iconImageUrl = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=home|518D2F|000000";
 var iconSize = new google.maps.Size(20, 34);
 var iconPosition = new google.maps.Point(0, 0);
 var iconHotSpotOffset = new google.maps.Point(9, 34);  var markerImage = new google.maps.MarkerImage(iconImageUrl, iconSize, iconPosition, iconHotSpotOffset);

 var markerOptions = {
 title: title,
 html: html,
 icon: markerImage,
 shadow: this.markerShadow,
 position: latlng,
 map: this.map,
 zIndex: 101
 }
 var marker = this._createMarker(markerOptions, latlng, '', 0);
 var self = this;
 google.maps.event.addListener(marker, "click", function()
 {
 self.closeInfoWindow();
 self.closeCenterMarkerInfoWindow();
 var infoWindowOptions = {content: this.html};
 self.center_marker_info_window = new google.maps.InfoWindow(infoWindowOptions);
 self.center_marker_info_window.open(this.map, this);
 });

 this.closeCenterMarkerInfoWindow();

 return marker;
	},
	closeCenterMarkerInfoWindow : function()
	{
 if(this.center_marker_info_window != undefined)
 this.center_marker_info_window.close();
	},



 _createMarker : function(markerOptions, latlng, prodnum, reddot)
	{
 if(reddot == undefined || reddot != 1) reddot = 0;
 var marker = new google.maps.Marker(markerOptions);
 marker.prodnum = prodnum;
 marker.reddot = reddot;
 if(prodnum != '')
 {
 var self = this;
 google.maps.event.addListener(marker, "click", function()
 {
 self._markerClicked(marker);
 });
 }
 return marker;
	},

	_markerClicked : function(marker)
	{
 this.last_clicked_marker = marker;
 if(marker.reddot == 1)
 var function_call = this.dot_marker_click_callback_function+"('"+marker.prodnum+"')";
 else
 var function_call = this.result_marker_click_callback_function+"('"+marker.prodnum+"')";
 if(function_call != null)
 eval(function_call);
	},

	openInfoWindow : function(width, height)
	{
 this.closeCenterMarkerInfoWindow();
 this.map_info_window_html = '';
 this.map_info_window_domready = false;
 var infoWindowOptions = {
 content: "<div id='map_info_window_contents' style='width:"+width+"px;height:"+height+"px;overflow:hidden;'></div>",
 	disableAutoPan: true
 }
 this.closeInfoWindow();
 this.map_info_window = new google.maps.InfoWindow(infoWindowOptions);
 var self = this;
 google.maps.event.addListener(this.map_info_window, 'domready', function() {
 self.map_info_window_domready = true;
 self.updateInfoWindowReady();
 });
 this.map_info_window.open(this.map, this.last_clicked_marker);
 this.fitInfoWindowToMap();
	},
	fitInfoWindowToMap : function()
	{
 var marker_latlng = this.last_clicked_marker.getPosition();
 var cur_map_bounds = this.map.getBounds();
 var cur_map_ne_lat = cur_map_bounds.getNorthEast().lat();
 var cur_map_sw_lat = cur_map_bounds.getSouthWest().lat();
 var cur_map_ne_lng = cur_map_bounds.getNorthEast().lng();
 var cur_map_sw_lng = cur_map_bounds.getSouthWest().lng();
 var lat_height = Math.abs(cur_map_ne_lat - cur_map_sw_lat);
 var lng_width = Math.abs(cur_map_sw_lng - cur_map_ne_lng);
 var pan_to_lat = marker_latlng.lat() + (lat_height / 4);
 var pan_to_lng = marker_latlng.lng() + (lng_width / 12);
 var pan_to_latlng = new google.maps.LatLng(pan_to_lat, pan_to_lng);
 this.map.panTo(pan_to_latlng);
	},
	updateInfoWindow : function(map_info_window_html)
	{
 this.map_info_window_html = map_info_window_html;
 if(this.map_info_window_domready)
 {
 this.updateInfoWindowReady();
 }
 },
	isInfoWindowReady : function()
	{
 return this.map_info_window_domready;
	},
	updateInfoWindowReady : function()
	{
 $('#map_info_window_contents').html(this.map_info_window_html);
	},
	closeInfoWindow : function()
	{
 $('#map_info_window_contents').html('');
 if(this.map_info_window != undefined)
 this.map_info_window.close();
	},

	selectMapResult : function(index)
	{
 var marker = this.result_markers[index];
 google.maps.event.trigger(marker, 'click');
	},



	setCircleOverlayRadius : function(new_radius_miles)
	{
 if(new_radius_miles < 0) new_radius_miles = 1;
 else if(new_radius_miles > 2000) new_radius_miles = 2000;
 this.circle_overlay_radius_miles = new_radius_miles;
	},
	setCircleOverlayCenter : function(new_center_lat, new_center_lng)
	{
 this.circle_overlay_center_latlng = new google.maps.LatLng(new_center_lat, new_center_lng);
	},
	renderCircleOverlay : function()
	{
 this._destroyCircleOverlay();
 this._createCircleOverlay();
 this.circle_overlay_showing = true;
	},
	showCircleOverlay : function()
	{
 if(!this.circle_overlay_showing)
 {
 this._createCircleOverlay();
 this.circle_overlay_showing = true;
 }
	},
	hideCircleOverlay : function()
	{
 if(this.circle_overlay_showing)
 {
 this._destroyCircleOverlay();
 this.circle_overlay_showing = false;
 }
	},
	_createCircleOverlay : function()
	{
 var radius_meters = (this.circle_overlay_radius_miles * 1.609 * 1000);
 	if(this.circle_overlay_center_latlng != null)
 {
 this.circle_overlay = new google.maps.Circle({
 map: this.map,
 radius: radius_meters,  center: this.circle_overlay_center_latlng,
   	fillColor: "transparent",
 fillOpacity: 0.0,
 strokeOpacity: 0.5,
 strokeWeight: 3,
 strokeColor: "#0000FF"
 });
 }
	},
	_destroyCircleOverlay : function()
	{
 if(this.circle_overlay != undefined)
 {
 this.circle_overlay.setMap(null);
 this.circle_overlay = null;
 }
	},


 renderStateOverlay : function(polygons_array)
	{
 this._destroyStateOverlay();
 this._createStateOverlay(polygons_array);
 this.state_overlays_showing = true;
	},
	showStateOverlay : function()
	{
 if(!this.state_overlays_showing)
 {
 this._createStateOverlay();
 this.state_overlays_showing = true;
 }
	},
	hideStateOverlay : function()
	{
 if(this.state_overlays_showing)
 {
 this._destroyStateOverlay();
 this.state_overlays_showing = false;
 }
	},
	_createStateOverlay : function(polygons_array)
	{
 this.state_overlays = new Array();
 for(var i=0; i<polygons_array.length; i++)
 {
 var lat_coords = polygons_array[i][0];
 var lng_coords = polygons_array[i][1];
 var polygonCoords = new Array();
 for(var j=0; j<lat_coords.length; j++)
 {
 polygonCoords[j] = new google.maps.LatLng(lat_coords[j], lng_coords[j]);
 }
 var statePolygon = new google.maps.Polygon({
 paths: polygonCoords,
 strokeColor: "#00AAFF",
 strokeOpacity: 0.8,
 strokeWeight: 1,
 fillColor: "#00AAFF",
 fillOpacity: 0.1,
 map: this.map
 });
 this.state_overlays[i] = statePolygon;
 }
	},
	_destroyStateOverlay : function()
	{
 if(this.state_overlays != undefined)
 {
 for(var i=0; i<this.state_overlays.length; i++)
 {
 this.state_overlays[i].setMap(null);
 }
 this.state_overlays = null;
 }
	},



	_eventIdle : function()
	{
 },
	_eventZoomChanged : function()
	{
 var new_center = this.map.getCenter();
 var new_center_lat = new_center.lat();
 var new_center_lng = new_center.lng();
 var new_zoom = this.map.getZoom();
 var function_call = this.zoom_changed_callback_function+"("+new_center_lat+","+new_center_lng+","+new_zoom+")";
 if(function_call != null)
 eval(function_call);
	},

	_eventCenterChanged : function()
	{
 },
	_eventBoundsChanged : function()
	{
 if(this.bounds_changed_callback_function != null)
 {
 var function_call = this.bounds_changed_callback_function;
 if(function_call != null) eval(function_call);
 }
	},
	_eventDragEnd : function()
	{
 var new_center = this.map.getCenter();
 var new_center_lat = new_center.lat();
 var new_center_lng = new_center.lng();
 var new_zoom = this.map.getZoom();
 var function_call = this.drag_end_callback_function+"("+new_center_lat+","+new_center_lng+","+new_zoom+")";
 if(function_call != null) eval(function_call);
	},
	_eventTilesLoaded : function()
	{
 }

	};

