/**
 * Copyright 2006 Jeffrey Palm.
 */

Jeff.Map = Class.create();
Jeff.Map.prototype = {

	initialize: function() {
		//
		// Set up the map
		//
		this.map = new GMap2(document.getElementById("map"));
		this.map.addControl(new GLargeMapControl());
		this.map.addControl(new GMapTypeControl());
		this.map.addControl(new GScaleControl());
		//
		// Set up the arrays
		//
		this.centerMap(-94.926791,36.863917,0);
		this.locs2markers = new Array();
		this.markers2html = new Array();
		//
		// Finish up the map
		//
		var thiz = this;
		GEvent.addListener(this.map, 'click', 
											 function(overlay,point) {thiz.showDates(overlay,point);});
	},

	showDates: function(overlay,point) {
		if (!point) return;
		
		var lon = point.lng();
		var lat = point.lat();
		
		this.showDatesForCoords(lon,lat);
	},

	showBand: function(band) {
		//
		// First clear everything
		//
		this.clearOverlays();
		//
		// Make the request
		//
		var thiz = this;
		var url = '/cgi-bin/pollstar2.pl';
		var params = 'band=' + band;
		var callback = function(res) {
			if (!res) return;
			var doc = res.responseXML.documentElement;
			
			var results = doc.getElementsByTagName("result");
			var result = results[0];
			var query = result.getAttribute("query");
			
			//
			// For every show make a marker
			//
			var shows = doc.getElementsByTagName('show');
			for (var i=0; i<shows.length; i++) {
				var show = shows[i];
				thiz.showShow(band,show,query);
			}
			
		}
		db("Looking up " + this.em(band));
		new Ajax.Request (url,
											{   method: 'get', 
													parameters: params, 
													onSuccess: callback
													});		
	},

/**
 * DOM -> _
 */
	showShow: function(band,show,query) {

		var date = show.getAttribute("date");
		var city = show.getAttribute("city");
		var cityLink = show.getAttribute("cityLink");
		var venue = show.getAttribute("venue");
		var venueLink = show.getAttribute("venueLink");
		
		var thiz = this;
		var url = '/cgi-bin/geocode2.pl';
		var params = 'loc=' + city;
		var callback = function(res) {


			
			if (!res) return;
			var doc = res.responseXML.documentElement;
			
			try {
				var lat = getText(getElementByTagName(doc,"Latitude"));
				var lon = getText(getElementByTagName(doc,"Longitude"));

				if (!lat) return;
				if (!lon) return;
				
				var txt ="<a href='"+query+"'><b>" + band + "</b></a>";
				txt += "<p>";
				var linkStart = "http://pollstar.com/tour/";
				var googleLink = "http://local.google.com/?q=" + urlencode(city);
				txt += "<a href='"+linkStart+venueLink+"'>"+venue + "</a>" 
					+    " [<a href='"+googleLink+"'>google</a>]<br/>" + city + "<br/>" + date;
				txt += "</p>";
				
				db("Showing " + thiz.em(band) + " in " + city);
				
				var point = new GLatLng(lat,lon);
				var marker = new GMarker(point);
				
				thiz.addOverlay(marker);
			
				thiz.closeInfoWindow();
				var text = thiz.html(txt);
				thiz.markers2html[marker] = text;
				var ff = function() {marker.openInfoWindowHtml(text);};
				GEvent.addListener(marker, 'click', ff);
		} catch (e) {db(e);}		
		}
		db("Looking up " + this.em(band) + " in " + city);
		new Ajax.Request (url,
											{   method: 'get', 
													parameters: params, 
													onSuccess: callback
													});		
	},

	em: function(s) {return "<b>" + s + "</b>";},

	locHash: function(city,state) {return city + ":" + state;},

	showDatesForCoords: function(lon,lat) {
		//
		// Find the city and state
		//
		var point = new GLatLng(lat,lon);
		var marker = new GMarker(point);
		this.addOverlay(marker);
		marker.openInfoWindowHtml(this.html("<center>loading...</center>"));
		
		var thiz = this;
		var url = '/cgi-bin/zipcodes/index.pl';
		var params = 'lon=' + lon + '&lat=' + lat;
		var callback = function(res) {
			if (!res) return;
			var doc = res.responseXML.documentElement;
			
			var infos = doc.getElementsByTagName('info');
			var info = infos[0];
			
			var city = info.getAttribute('city');
			var state = info.getAttribute('state');
			
			//
			// First see if we have a marker for this location
			//
			var cachedMarker = thiz.locs2markers[thiz.locHash(city,state)];
			if (cachedMarker) {
				//
				// center on the other marker
				//
				thiz.removeOverlay(marker);
				thiz.openHTML(cachedMarker);
				return;
			}
			
			thiz.locs2markers[thiz.locHash(city,state)] = marker;
			
			thiz.closeInfoWindow();
			marker.openInfoWindowHtml(thiz.html("<center>Found " + city + ", " + 
																					state + "...</center>"));

			thiz.showLocation(marker,city,state);
			
		}
		new Ajax.Request (url,
											{   method: 'get', 
													parameters: params, 
													onSuccess: callback
													});		
	},

	showLocation: function(marker,city,state) {
		var thiz = this;
		var url = '/cgi-bin/pollstar.pl';
		var params = 'city=' + city + '&state=' + state;
		var callback = function(res) {
			if (!res) return;
			var doc = res.responseXML.documentElement;
			
			var results = doc.getElementsByTagName("result");
			var result = results[0];
			var query = result.getAttribute("query");
			
			var txt ="<a href='"+query+"'><b>" + city + ", " + state + "</b></a>";
			txt += "<div style='max-height: 250px; max-width: 350px; overflow:auto'>";
			
			var shows = doc.getElementsByTagName('show');
			if (shows.length>0) {
				txt += "<table border=0 cellpadding=1 cellspacing=1>";
				var lastDate;
				for (var i=0; i<shows.length; i++) {
					var show = shows[i];
					var date = show.getAttribute("date");
					var artist = show.getAttribute("artist");
					var artistLink = show.getAttribute("artistLink");
					var venue = show.getAttribute("venue");
					var venueLink = show.getAttribute("venueLink");
					var linkStart = "http://pollstar.com/tour/";
					var googleLink = "http://local.google.com/?q=" + urlencode(venue+" "+city+" "+state);
					txt += "<tr>";
					if (!lastDate || lastDate != date) {
						txt += "<td colspan=2>";
						if (lastDate) txt += "<br/>";
						txt += date + "</td>";
						lastDate = date;
					}
					else {
						txt += "<td>" + "<a href='"+linkStart+artistLink+"'>"+artist + "</a></td>";
						txt += "<td>" + "<a href='"+linkStart+venueLink+"'>"+venue + "</a>"
							+ " [<a href='"+googleLink+"'>google</a>]</td>";
					}
					txt += "</tr>";
				}
				txt += "</table>";
			} else {
				txt += "No shows found.";
			}
			txt += "</div>";
			
			txt += "<p>[<a href='javascript:top.main.getView().centerMap(" + marker.getPoint().lng() + "," +
			marker.getPoint().lat() + ",1)'>zoom</a>]</p>";
			
			thiz.closeInfoWindow();
			var text = thiz.html(txt);
			thiz.markers2html[marker] = text;
			marker.openInfoWindowHtml(text);
			GEvent.addListener(marker, 'click', function() {marker.openInfoWindowHtml(text);});
			
		}
		new Ajax.Request (url,
											{   method: 'get', 
													parameters: params, 
													onSuccess: function(res) {try{callback(res);}catch(e){alert(e);}}
													});		
	},

	openHTML: function(marker) {
		marker.openInfoWindowHtml(this.markers2html[marker]);
	},

	html: function(txt) {
		return this.htmlStart() + txt + this.htmlEnd();
	},
	
	htmlStart: function() {
		return "<div id='mainInfoDiv' style='padding: 2px; white-space: nowrap;' >";
	},
	
	htmlEnd: function() {
		return "</div>";
	},

// --------------------------------------------------
// Map interface
// --------------------------------------------------

	getZoom: function() {
		return this.map.getZoom();
	},

	/**
	 * zoom:  0 zoom to 4
	 *       >0 zoom in
	 *       <0 no zoom
	 */
	centerMap: function(lon,lat,zoom) {
		//map.centerAtLatLng(newPoint(lon,lat));
		var toZoom;
		if (!zoom || zoom==0) {
			toZoom = 4;
		} else if (zoom>0) {
			if (this.getZoom()<12) {
			toZoom = 12;
		} else {
				toZoom = this.getZoom()+2;
			}
		} else if (zoom<0) {
			toZoom = this.getZoom();
		}
		this.map.setCenter(this.newPoint(lon,lat),toZoom);
	},
	
	newPoint: function(lon,lat) {
		return new GLatLng(lat,lon);
	},
	
	addOverlay: function(marker) {
		this.map.addOverlay(marker);
	},

	clearOverlays: function() {
		this.map.clearOverlays();
	},

	removeOverlay: function(marker) {
		this.map.removeOverlay(marker);
	},
	
	closeInfoWindow: function() {
		this.map.closeInfoWindow();
	},

	// --------------------------------------------------
	// View interface
	// --------------------------------------------------

	viewBand: function(band) {
		this.showBand(band);
	},

	viewName: function() {
		return "map";
	},

	toString: function() {
		return "Schedule";
	}

};


