if(typeof widgets=="undefined") widgets = {};
widgets.gmaps = function(args)
{
	this.args = args;
	var self = this;
	var $ = jQuery;
	
	this.initWidgetMap = function(args)
	{	
		self.map = maps[self.args.mapName] = new Map(self.args.mapName, "map_" + self.args.mapName, self.args.defaultlat, self.args.defaultlng, self.args.defaultzoom);
		self.initOverlayCollections();
		self.map.create();
		self.map.widget = self;
		self.container = $("#map_" + self.map.name + "_container");
		
		$("a.streetView", self.container).click(function(){return self.toggleView("street")});
		$("a.mapView", self.container).click(function(){return self.toggleView("map")});
		
		//Make sure they are initialized with filter flags
		self.preparePlacemarks();
		
		if(self.args.streetview)
			self.initStreetView();
		
		if(typeof(DistanceFilter) != "undefined")
			self.distanceFilter = new DistanceFilter();
		
		//Set view to map
		self.toggleView(self.args.currentmode, true);
	}
	this.initStreetView = function()
	{
		client = new GStreetviewClient();
		client.getNearestPanorama(placemarks[self.map.name][0].point, self.streetViewResults);
	}
	this.streetViewResults = function(streetViewData)
	{
		if(streetViewData.code == GStreetviewClient.ReturnValues.SUCCESS)
		{
			self.container.find(".streetView").show();
			self.map.div.after("<div id=\"street_" + self.map.name + "\" class=\"add5pxAll\" style=\"display:none\"></div>");
			self.streetdiv = $("#street_" + self.map.name);
			self.streetdiv.css({width:parseInt(self.args.width),height:parseInt(self.args.height)});
			self.street = new GStreetviewPanorama(self.streetdiv.get(0), {latlng:placemarks[self.map.name][0].point});
		}
		else
			self.container.find(".streetView").hide();
	}
	this.initOverlayCollections = function()
	{
		//Initialize Variables and Event Handlers
		overlays.map = self.map;
		overlays.pagesize = 99;
		overlays.addHandler("showhide",overlays.markPlacemarkListings,true);
		overlays.addHandler("openinfobubble",overlays.updateBubble,true);
		overlays.addHandler("gotoplacemark",self.goToPlacemark,true);
		
		//Add Main overlay collection and set as default
		self.map.addCollection(overlays,true);
		
		overlays.getInfoHTML = function(placemark)
		{
			if (self.currentView == "mini" || self.args.width * self.args.height < 50000) 
				return null;
			else	
				return parsePlacemarkData(self.args.sampleinfohtml,placemark);					
		}
	}
	//Go to Marker and Open InfoWindow
	this.goToPlacemark = function(placemark)
	{
		$.scrollTo(self.map.div,400,{axis:'y',offset:-50});
		self.toggleView("map", false, true);
		placemark.marker.openInfoWindowHtml(placemark.marker.myInfoHTML);
		self.map.gmap.setCenter(placemark.marker.getLatLng(), self.args.defaultzoom);
		placemark.collection.execHandler("openinfobubble");
	}
	//Find a placemark in the placemarks collection
	this.findPlacemark = function(placemarkID)
	{
		for (var i = 0; i < placemarks[self.map.name].length; i++){
			if(placemarks[self.map.name][i].prikey == placemarkID)
				return placemarks[self.map.name][i];
		}
		return null;
	}
	//This function sets up the filter fields on each placemark
	this.preparePlacemarks = function(){
		var itinLookup = [];
	
		for (var i in placemarks){
			for (var j = 0; j < placemarks[i].length; j++){
				if(placemarks[i][j].latitude.length == 0 || placemarks[i][j].longitude.length == 0){
					placemarks[i].splice(j,1);
					j = j - 1;
				}
				else{
					placemarks[i][j].filteredBy = new Object();
					placemarks[i][j].filtered = false;
					placemarks[i][j].active = true;
					placemarks[i][j].point = new GLatLng(placemarks[i][j].latitude,placemarks[i][j].longitude);
					placemarks[i][j].itinerary = jQuery.inArray(placemarks[i][j].prikey, itinLookup) >= 0;
				}
			}
		}
	}
	//Runs whenever the filters are updated 
	this.updatedFilters = function(unfiltered){
		self.map.removePlacemarks(self.map.defaultCollection,true);
		self.map.addPlacemarks(unfiltered,self.map.defaultCollection);
		self.map.showPlacemarks(self.map.defaultCollection,1);
		self.map.setBoundsCenterAndZoom();
	}
	this.toggleView = function(view, firstLoad, recenter){
		firstLoad = typeof firstLoad == "undefined" ? false : firstLoad;
		recenter = typeof recenter == "undefined" ? true : recenter;
		if(firstLoad && self.map.name != "listingdetail")
			self.currentView = view = "mini";
		else if(self.currentView == view)
			return false;
		else if(self.currentView == "street")
		{
			self.streetdiv.hide();
			self.map.div.show();
			self.currentView = view;
			return false;
		}
		else if(view == "mini" || view == "map" || view == "street")
			self.currentView = view;
		else if(self.map.name != "listingdetail")
			view = self.currentView == "mini" ? "map" : "mini";
		
		self.map.cancelCentering = false;
		
		if(self.map.name == "listings")
			listingsContainer = self.container.siblings(".listingsContainer");
		else if(self.map.name == "events")
			listingsContainer = self.container.siblings(".evnt-container");
		
		if(firstLoad)
		{
			self.origTop = 0;
			self.map.gmap.addControl(new SVZoomControl());
			var mapTypesPosition = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(52, 10))
			if(self.args.mapName != "listingdetail")
				self.map.gmap.addControl(new SVToolbarControl({toggleView: self.toggleView}));
			else
				mapTypesPosition.offset = new GSize(10, 10);
			
			self.map.gmap.addControl(new GMapTypeControl(), mapTypesPosition);
			//else
				//self.map.gmap.addControl(new SVNearbyControl());
		}
		else if(view == "map" || view == "mini")
		{
			if(recenter)
				self.map.gmap.savePosition();
			finish = function() { self.map.gmap.checkResize();if(!firstLoad && recenter) self.map.gmap.returnToSavedPosition(); };
			if(view == "map")
				animate = {height: self.container.offset().top - self.container.outerHeight()};
			else
				animate = {height: self.args.miniheight};
			
			self.map.div.animate(animate, 1000, "swing", finish);
		}
		else if(view == "street")
		{
			self.map.div.hide();
			self.streetdiv.show();
			self.street.show();
		}
		
		self.currentView = view;
		self.updatedFilters(placemarks[self.map.name]);
		return false;
	}
	
	this.findNearby = function() {
		$(".nearbyContainer").show();
		self.distanceFilter.run();
		return false;
	}
	
	$(this.initWidgetMap);
}

//String.prototype.trim = function () {return this.replace(/^\s*/, "").replace(/\s*$/, "");}
