﻿//GoogleMapsV2.js
// Doug Rathbone - Alpha Salmon

var homeTitle;
var homeInfoHtml;


var map = null;
var geocoder = new GClientGeocoder();
// Create a search control
var searchControl = new GSearchControl();

// Add in a full set of searchers
var localSearch = new GlocalSearch();

var options = new GsearcherOptions();

var station = true;
var app;
var prefix_image_file = "";

var icon_train_station = "/asset/img/googlemaps/icon_train_32.png";
var icon_shadow_train_station = "/asset/img/googlemaps/icon_shadow_32.png";
var icon_hotels = "/asset/img/googlemaps/icon_accommodation_32.png";
var icon_shadow_hotels = "/asset/img/googlemaps/icon_shadow_32.png";

//var icon_home = "/asset/img/layout/club_24.gif";
var icon_home = "/asset/img/googlemaps/icon_horseracing_32.png";


var icon_shadow_home = "/asset/img/googlemaps/icon_shadow_32.png";

var icon_shadow_default = "/asset/img/googlemaps/icon_shadow_32.png";

var main_marker;

function App(divObjectID, incomingAddress, incHomeTitle, incHomeInfoHtml, incShowTrains) {
	var divMap = document.getElementById(divObjectID);
	homeTitle = incHomeTitle;
	homeInfoHtml = incHomeInfoHtml;
	

	//Don't do anything when can't find the map
	if (divMap != null && GBrowserIsCompatible()) {

		map = new GMap2(divMap);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());

		//load the home address on the map and set the center point to it
		showHome(incomingAddress, homeTitle, homeInfoHtml, incShowTrains);

		options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
		
		searchControl.addSearcher(localSearch, options);

		// Set the Local Search center point
		localSearch.setCenterPoint(map);

		// tell the searcher to draw itself and tell it where to attach
		// Don't show search box
		searchControl.draw(document.getElementById("searchcontrol"));

		// tell the search control to call be on start/stop
		searchControl.setSearchStartingCallback(this, App.prototype.OnSearchStarting);
	}
	return;
}

function LoadInterests(searchControl) {
	
//		searchControl.setSearchCompleteCallback(this, App.prototype.OnHotelSearchComplete);
//		searchControl.execute("category: Hotel");

	if (station) {
		searchControl.setSearchCompleteCallback(this, App.prototype.OnStationSearchComplete);
		searchControl.execute("category: Train station");
	}

		//showTrio();
		//main_marker.openInfoWindowHtml(homeInfoHtml);
}

function createMarker(posn, title, icon_image, icon_image_shadow) {
	var icon = getIcon(icon_image, icon_image_shadow);
	var marker = new GMarker(posn, { title: title, icon: icon, draggable: false });
	return marker;
}

function addMarkerObjectToMap(app, markerObject) {
	if (app.markerList == null) {
		app.markerList = new Array();
	}
	app.markerList.push(markerObject);
}

function OnSearchCompleteCommon(searcher, icon_img, icon_shadow_img) {
	// if we have local search results, put them on the map
	if (searcher.results && searcher.results.length > 0) {
		for (var i = 0; i < searcher.results.length; i++) {
			var result = searcher.results[i];

			// if this is a local search result, then proceed...
			if (result.GsearchResultClass == GlocalSearch.RESULT_CLASS) {
				var markerObject = new Object();
				markerObject.result = result;
				markerObject.latLng = new GLatLng(parseFloat(result.lat), parseFloat(result.lng));
				markerObject.gmarker = new GMarker(markerObject.latLng, { icon: getIcon(icon_img, icon_shadow_img) });
				var clickHandler = method_closure(this, App.prototype.OnMarkerClick, [markerObject]);
				GEvent.bind(markerObject.gmarker, "click", this, clickHandler);
				addMarkerObjectToMap(this, markerObject);
				map.addOverlay(markerObject.gmarker);
				result.__markerObject__ = markerObject;
			}
		}
	}
}



App.prototype.OnHotelSearchComplete = function(sc, searcher) {
	OnSearchCompleteCommon(searcher, icon_hotels, icon_shadow_hotels);
	hotel = false;
	LoadInterests(sc);
}

App.prototype.OnStationSearchComplete = function(sc, searcher) {
	OnSearchCompleteCommon(searcher, icon_train_station, icon_shadow_train_station);
	station = false;
	LoadInterests(sc);
}


App.prototype.OnSearchStarting = function(sc, searcher, query) {
	map.closeInfoWindow();
	if (this.markerList) {
		for (var i = 0; i < this.markerList.length; i++) {
			var markerObject = this.markerList[i];
			//map.removeOverlay(markerObject.gmarker);
		}
	}
	else {
		this.markerList = new Array();
	}
}


App.prototype.OnMarkerClick = function(markerObject) {
	map.closeInfoWindow();

	var htmlNode = "<div class=gs-localResult gs-result>";
	htmlNode += "<div class=gs-title><a target=_blank class=gs-title href=";
	htmlNode += markerObject.result.url;
	htmlNode += ">";
	htmlNode += markerObject.result.title;
	htmlNode += "</a></div><div class=gs-address>";

	if (markerObject.result.streetAddress) {
		htmlNode += "<div class=gs-street>" + markerObject.result.streetAddress + "</div>";
	}

	if (markerObject.result.city) {
		htmlNode += "<div class=gs-city>" + markerObject.result.city + ", </div>";
	}

	if (markerObject.result.region) {
		htmlNode += "<div class=gs-region>" + markerObject.result.region + "</div>";
	}

	if (markerObject.result.country) {
		htmlNode += "<div class=gs-country>" + markerObject.result.country + "</div>";
	}

	htmlNode += "</div>";

	if (markerObject.result.phoneNumbers) {
		htmlNode += "<div class=gs-phone>" + markerObject.result.phoneNumbers[0].number + "</div>";
	}

	if (markerObject.result.ddUrl) {
		htmlNode += "<div class=gs-directions><a class=gs-directions target=_blank href=";
		htmlNode += markerObject.result.ddUrl;
		htmlNode += ">directions</a></div>"
	}
	htmlNode += "</div>";
	markerObject.gmarker.openInfoWindow(htmlNode);

}


function method_closure(object, method, opt_argArray) {
	return function() {
		return method.apply(object, opt_argArray);
	}
}

function getIcon(imgFile, shadowFile) {
	var icon = new GIcon();
	icon.image = prefix_image_file + imgFile;
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(16, 0);
	icon.iconSize = new GSize(32, 32);
	icon.shadow = prefix_image_file + shadowFile;
	icon.shadowSize = new GSize(59, 32);
	return icon;
}

function showAddress(description, address, icon) {
	searchAndShowAddress(address, icon, icon_shadow_default, description, address, false);
}


function searchAndShowAddress(address, icon, icon_shadow, html_title, address_title, showInfo) {
	if (address == null || address == "") return;
	if (geocoder) {
		geocoder.getLatLng(
          address,
          function(point) {
          	if (!point) {
          		//alert(address + " not found");
          	} else {
          		//var market = new GMarker(point);
          		var marker = new GMarker(point, { icon: getIcon(icon, icon_shadow), title: address_title });
          		GEvent.addListener(marker, "click",
                function() {
                	marker.openInfoWindowHtml(html_title);
                }
              );
          		map.addOverlay(marker);
          		if (showInfo) {
          			marker.openInfoWindowHtml(html_title);
          		}
          	}
          }
        );
	}
}

function showHome(address, title, infoHtml, showTrains) {
	if (address == null || address == "") return;
	if (geocoder) {
		geocoder.getLatLng(
          address,
          function(point) {
          	if (!point) {
          		//alert(address + " not found");
          	} else {
          		map.setCenter(point, 14);
          		//var marker = new GMarker(point,{title: address});

          		var icon_img, icon_shadow_img, homeTypeLower;
          		//alert("homeType: " + homeType);
          		icon_img = icon_home;
          		icon_shadow_img = icon_shadow_home;

          		var marker = new GMarker(point, { icon: getIcon(icon_img, icon_shadow_img), title: address });
          		GEvent.addListener(marker, "click",
                function() {
                	marker.openInfoWindowHtml("<b>" + title + "</b><br/>" + infoHtml);
                }
              );
          		//popup marker by default
          		//main_marker = marker;
          		map.addOverlay(marker);
          	}
          	// execute an inital search
          	if (showTrains) {
          		LoadInterests(searchControl);
          	}

          }
        );
	}
}