(function($) {
	$.fn.activityMap = function(options)
	{
		//Combine the passed in options with the default settings
		settings = $.extend({
			devDomainFlag: "",
			devAPIKey: "",
			prodAPIKey: "",
			map: null,
			gMap: null,
//			mapCenter: {lat: 37.0625, lng: -95.677068, zoom: 4},
			mapCenter: {lat: 28.41588, lng: -81.459074, zoom: 11},
			activityListingsId: null,
			propertyListingsId: null,
			propertyIcon: null,
			properties: null,
			activityGroups: null
		}, options);
		
		settings.map = this;
		BuildCollections();
		InitMap();
		
		function BuildCollections()
		{
			//Build the properties collection
			for(var i = 0; i < settings.properties.length; i++)
			{
				var oProperty = settings.properties[i];
				oProperty = $.extend({
					id: null,
					chkId: "",
					name: "",
					address: "",
					phone: "",
					website: "",
					lng: "",
					lat: "",
					marker: null,
					visible: true
				}, oProperty);
				oProperty.id = i;
				oProperty.chkId = "p"+oProperty.id;
				settings.properties[i] = oProperty;
			}
			
			//Build the activityGroups and activities collection
			for(var i = 0; i < settings.activityGroups.length; i++)
			{
				var oActivityGroup = settings.activityGroups[i];
				oActivityGroup = $.extend({
						id: null,
						name: "",
						toggleClass: "",
						icon: null,
						showOnload: true,
						activities: null
					}, oActivityGroup);
				oActivityGroup.id = i;
				settings.activityGroups[i] = oActivityGroup;
				
				var activities = oActivityGroup.activities;
				for(var x = 0; x < activities.length; x++)
				{
					var oActivity = activities[x];
					oActivity = $.extend({
						id: null,
						chkId: "",
						name: "",
						address: "",
						phone: "",
						website: "",
						lng: "",
						lat: "",
						marker: null,
						visible: true
					}, oActivity);
					oActivity.id = x;
					oActivity.chkId = "a"+oActivityGroup.id+"_"+oActivity.id;
					activities[x] = oActivity;
				}
			}
			
		}
		
		function InitMap()
		{
			var sKey = "";
			if (document.location.toString().indexOf(settings.devDomainFlag) > -1) {
				sKey = settings.devAPIKey;
			} else {
				sKey = settings.prodAPIKey;
			}
			
			$(document).bind("googleJavascriptAPILoadedEvent", function(event, msg) {
    		LoadMap();
			});

			var script = document.createElement("script");
			script.src = "http://www.google.com/jsapi?key="+sKey+"&callback=googleJavascriptAPILoaded";
			script.type = "text/javascript";
			document.getElementsByTagName("head")[0].appendChild(script);
		}
		
		function LoadMap()
		{
			google.load("maps", "2", {"callback" : LoadPoints});
		}
		
		function LoadPoints()
		{
			if (GBrowserIsCompatible()) {
				var map = new GMap2(settings.map[0]);
				settings.gMap = map;
				map.setCenter(new GLatLng(settings.mapCenter.lat, settings.mapCenter.lng), settings.mapCenter.zoom);
				map.addControl(new GSmallMapControl());
				map.addControl(new GMapTypeControl());			
				
				AddProperties();
				AddActivities();						
			}
		}
		
		function AddProperties()
		{
			//Add the close button
			$("#"+settings.propertyListingsId).append("<span id='closeProperties'>Close</span>");
			
			//Add the properties
			for(var i = 0; i < settings.properties.length; i++)
			{
				var oProperty = settings.properties[i];
				
				var gmWindowOptions = { maxWidth: 500 };
				var gmOptions = {};
				if (settings.propertyIcon != null){
					gmOptions.icon = GetIconFromObject(settings.propertyIcon);
				}
				
				var gm = new GMarker(new GLatLng(oProperty.lat, oProperty.lng), gmOptions);
				var sHTML = GetPropertyHTML(oProperty);
				gm.bindInfoWindowHtml(sHTML, gmWindowOptions);
				settings.gMap.addOverlay(gm);
				oProperty.marker = gm;
			}
			
			//Add the property listings
			var listingHTML = "<table>";
			for(var i = 0; i < settings.properties.length; i++)
			{
				var oProperty = settings.properties[i];
				listingHTML += "<tr><td><input type=\"checkbox\" id=\""+oProperty.chkId+"\" class=\"chkProperty\" checked> "+oProperty.name+"</td></tr>";
			}
			listingHTML += "</tr></table>"
			$("#"+settings.propertyListingsId).append(listingHTML);
			
			//Add the property checkbox click
			$("input.chkProperty").click(function()
			{
				var chkId = $(this).attr("id").replace("p", "");
				var oProperty = settings.properties[chkId];
				if (oProperty.visible == false)
				{
					ToggleProperty(oProperty, true);
				}
				else
				{
					ToggleProperty(oProperty, false);
				}
			});
			
			//Toggle properties by default
			$("input.chkProperty").each(function()
			{
				var chkId = $(this).attr("id").replace("p", "");
				var oProperty = settings.properties[chkId];
				if (oProperty.visible == false)
				{
					ToggleProperty(oProperty, false);
				}
			});
			
			$("#closeProperties").click(function()
      {
        $("#propertyToggle").click();
      });
		}
		
		function AddActivities()
		{
			//Add the close button
			$("#"+settings.activityListingsId).append("<span id='closeActivities'>Close</span>");
			
			//Add the activity group listings
			var listingHTML = "<table cellspacing=0 cellpadding=0><tr>";
			for(var i = 0; i < settings.activityGroups.length; i++)
			{
				var oActivityGroup = settings.activityGroups[i];
				listingHTML += "<td valign='top'><table cellspacing=0 cellpadding=0>";
				listingHTML += "<tr><th class='"+oActivityGroup.toggleClass+"'>"+oActivityGroup.name+"</th></tr>";
				
				var activities = oActivityGroup.activities;
				for(var x = 0; x < activities.length; x++)
				{
					var oActivity = activities[x];
					listingHTML += "<tr><td><input type=\"checkbox\" id=\""+oActivity.chkId+"\" class=\"chkActivity\" checked> "+oActivity.name+"</td></tr>";
				}
				
				listingHTML += "</table></td>";
			}
			listingHTML += "</tr></table>"
			$("#"+settings.activityListingsId).append(listingHTML);
			
			//Add the activities
			for(var i = 0; i < settings.activityGroups.length; i++)
			{
				var oActivityGroup = settings.activityGroups[i];
				
				var gmWindowOptions = { maxWidth: 500 };
				var gmOptions = {};
				if (oActivityGroup.icon != ""){
					gmOptions.icon = GetIconFromObject(oActivityGroup.icon);
				}
				
				//Add activity markers
				var activities = oActivityGroup.activities;
				for(var x = 0; x < activities.length; x++)
				{
					var oActivity = activities[x];
					var gm = new GMarker(new GLatLng(oActivity.lat, oActivity.lng), gmOptions);
					var sHTML = GetActivityHTML(oActivity);
					gm.bindInfoWindowHtml(sHTML, gmWindowOptions);
					settings.gMap.addOverlay(gm);
					oActivity.marker = gm;					
				}
				
				//Add toggle click to toggle links
				$("."+oActivityGroup.toggleClass)
				.data("activityGroup", oActivityGroup)
				.click(function()
				{
					var oActivityGroup = $(this).data("activityGroup");
					var activities = oActivityGroup.activities;
					var bShowActivities = true;
					if (AllActivitiesAreVisible(activities) == true)
					{
						bShowActivities = false;
					}

					//Toggle the group's activities
					for(var i = 0; i < activities.length; i++)
					{
						ToggleActivity(activities[i], bShowActivities);
					}
					
					return false;
				});
			}
			
			//Add the activity checkbox click
			$("input.chkActivity").click(function()
			{
				var chkId = $(this).attr("id").replace("a", "");
				var idPieces = chkId.split("_");
				var oActivity = settings.activityGroups[idPieces[0]].activities[idPieces[1]];
				if (oActivity.visible == false)
				{
					ToggleActivity(oActivity, true);
				}
				else
				{
					ToggleActivity(oActivity, false);
				}
			});
			
			//Set activity groups default display
			for(var i = 0; i < settings.activityGroups.length; i++)
			{
				var oActivityGroup = settings.activityGroups[i];
				if (oActivityGroup.showOnload == false)
				{
					var activities = oActivityGroup.activities;
					for(var x = 0; x < activities.length; x++)
					{				
						ToggleActivity(activities[x], false);
					}
				}
			}
			
			$("#closeActivities").click(function()
      {
        $("#activityToggle").click();
      });
			
		}
		
		function ToggleProperty(oProperty, bShow)
		{
			if (bShow == true)
			{
				oProperty.marker.show();
				oProperty.visible = true;
				$("#"+oProperty.chkId).attr("checked", "checked");
			}
			else
			{
				oProperty.marker.hide();
				oProperty.visible = false;
				$("#"+oProperty.chkId).removeAttr("checked");
			}
		}
		
		function ToggleActivity(oActivity, bShow)
		{
			if (bShow == true)
			{
				oActivity.marker.show();
				oActivity.visible = true;
				$("#"+oActivity.chkId).attr("checked", "checked");
			}
			else
			{
				oActivity.marker.hide();
				oActivity.visible = false;
				$("#"+oActivity.chkId).removeAttr("checked");
			}
		}
		
		function AllActivitiesAreVisible(activities)
		{
			for(var i = 0; i < activities.length; i++)
			{
				if (activities[i].visible == false){
					return false;
				}
			}			
			return true;
		}
		
		function GetPropertyHTML(oProperty)
		{
			var sHTML = "";
			sHTML += "Name: "+oProperty.name+"<br>";
			sHTML += "Address: "+oProperty.address+"<br>";
			sHTML += "Phone: "+oProperty.phone+"<br>";
			if (oProperty.website != ""){
				sHTML += "Website: <a href='"+oProperty.website+"' target='_blank'>"+oProperty.website+"</a><br>";
			}else{
				sHTML += "Website: <br>";
			}			
			sHTML += "Directions: (enter your starting address)<br>";
			sHTML += "<form action='http://maps.google.com/maps' method='get' target='_blank'>";
			sHTML += "<input type='text' name='saddr' id='saddr' value='' />";
			sHTML += "<input type='submit' value='Go' />";
			sHTML += "<input type='hidden' name='daddr' value='"+oProperty.address+"' />";
			sHTML += "<input type='hidden' name='hl' value='en' />";
			sHTML += "</form>";
			return sHTML;
		}
		
		function GetActivityHTML(oActivity)
		{
			var sHTML = "";
			sHTML += "Name: "+oActivity.name+"<br>";
			sHTML += "Address: "+oActivity.address+"<br>";
			sHTML += "Phone: "+oActivity.phone+"<br>";
			if (oActivity.website != ""){
				sHTML += "Website: <a href='"+oActivity.website+"' target='_blank'>"+oActivity.website+"</a><br>";
			}else{
				sHTML += "Website: <br>";
			}			
			sHTML += "Directions: (enter your starting address)<br>";
			sHTML += "<form action='http://maps.google.com/maps' method='get' target='_blank'>";
			sHTML += "<input type='text' name='saddr' id='saddr' value='' />";
			sHTML += "<input type='submit' value='Go' />";
			sHTML += "<input type='hidden' name='daddr' value='"+oActivity.address+"' />";
			sHTML += "<input type='hidden' name='hl' value='en' />";
			sHTML += "</form>";
			return sHTML;
		}
		
		function GetIconFromObject(object)
		{
			var icon=new GIcon(G_DEFAULT_ICON);
			icon.image=object.image;
			icon.shadow=object.shadow;
			icon.iconSize=new GSize(object.iconSize.w, object.iconSize.h);
			icon.shadowSize=new GSize(object.shadowSize.w, object.shadowSize.h);
			icon.iconAnchor=new GPoint(object.iconAnchor.x, object.iconAnchor.y);
			icon.infoWindowAnchor=new GPoint(object.infoWindowAnchor.x, object.infoWindowAnchor.y);
			if (object.imageMap != null){
				icon.imageMap=object.imageMap;
			}
			return icon
		}
		
		//Return original selection for chaining
		return this;
	};
})(jQuery);

function googleJavascriptAPILoaded(){
	$(document).trigger("googleJavascriptAPILoadedEvent");
}





