//Setup search source
var db_layer_query_collection = new MQDBLayerQueryCollection();
var db_layer_query = new MQDBLayerQuery();
db_layer_query_collection.add(db_layer_query);

//Proxy server settings
var proxy_server_name = "", proxy_server_port = "", proxy_server_path = "/mqproxy/JSReqHandler";
var server_port = "80", server_path = "mq";

var geo_exec = new MQExec("geocode.access.mapquest.com", server_path, server_port, proxy_server_name, proxy_server_path, proxy_server_port);
var spatial_exec = new MQExec("spatial.access.mapquest.com", server_path, server_port, proxy_server_name, proxy_server_path, proxy_server_port);
var route_exec = new MQExec("route.access.mapquest.com", server_path, server_port, proxy_server_name, proxy_server_path, proxy_server_port);

var map, map_center, search_results, route_results;
var max_matches = 20;
var search_radius = 10;

if(!example_address) {
	var example_address = "1001 S. Valley View Blvd,<br />Las Vegas, NV 89107";
}

//Centers the map on the POI
function center(e) {
	var id = e.currentTarget.id.split("Result")[1];
	var point = null;
	var map_pois = map.getPois();
	
	for(var i = 0; i < map_pois.getSize(); i++) {
		point = map_pois.getAt(i);
		if(point.getKey() == id) {
			map.setZoomLevel(12);
			map.panToLatLng(point.getLatLng());
			point.showInfoWindow();
			break;
		}
	}
	
	dojo.forEach(dojo.query(".ResultItem"),
		function(result) {
			dojo.removeClass(result, "Active");
		}
	);
	dojo.addClass(dojo.byId("ResultItem" + id), "Active");
	e.preventDefault();
}

function submitSearch(e) {
	var query = dojo.byId("Origin").value;
	dojo.byId("PreviousQuery").value = query;
	getRoute(e, null, "to", dojo.byId("Destination").value, query);
	e.preventDefault();
}

function spatialSearch(e, query) {
	map.hideStaticMap();
	
	var directions_list = dojo.byId("DirectionsList");
	if(directions_list) {
		dojo.removeClass(directions_list, "Print");
	}
	
	var back_results = dojo.byId("BackToSearchResults");
	if(back_results) {
		dojo.addClass(back_results, "Hidden");
	}
	
	var new_directions = dojo.byId("NewDirections");
	if(new_directions) {
		dojo.addClass(new_directions, "Hidden");
	}
	
	var print_directions = dojo.byId("PrintDirections");
	if(print_directions) {
		dojo.addClass(print_directions, "Hidden");
	}
	
	search_results = null;
	
	if(query != "") {
		loading();
		
		map.removeAllPois();
		map.removeRouteHighlight();
		
		var directions = dojo.byId("Directions");
		if(directions) {
			dojo.addClass(dojo.byId("Directions"), "Hidden");
		}
		
		var search_results = dojo.byId("SearchResults");
		if(search_results) {
			dojo.removeClass(dojo.byId("SearchResults"), "Hidden");
		}
		
		var reset_view = dojo.byId("ResetView");
		if(reset_view) {
			dojo.removeClass(dojo.byId("Reset"), "Hidden");
		}
		
		var collection = new MQLocationCollection("MQGeoAddress");
		var address = new MQSingleLineAddress();
		address.setAddress(query);
		
		geo_exec.geocode(address, collection);
		
		var origin = collection.get(0);
		var origin_geo = origin.getMQLatLng();
		
		//Get search results
		search_results = new doSearch(origin_geo);
		
		//Get additional information on each search result
		var more_info = getMoreInfo(search_results);
		
		var poi = null, poi_ll = null, poi_name = "", poi_content = "", poi_key = null, poi_label, poi_distance = 0, poi_address = "";
		
		var result_heading = dojo.byId("SearchResultsHeading");
		var result_list = dojo.byId("SearchResultsList");
		
		var num_results = max_matches;
		if(search_results.getSize() < num_results) {
			num_results = search_results.getSize();
		}
		
		if(search_results.getSize() > 0) {
			var result_heading_text = " nearest results";
			if(search_results.getSize() == 1) {
				result_heading_text = " result";
			}
			result_heading.innerHTML = "Showing " + search_results.getSize() + result_heading_text;
			result_list.innerHTML = "";
			
			for(var i = 0; i < num_results; i++) {
				poi_label = i + 1;
				while (!more_info.isEOF()) {
					if(search_results.get(i).getKey() == parseInt(more_info.getField("I"), 10)) {
						break;
					}
					more_info.moveNext();
				}
				result_point = search_results.get(i);
				poi_ll = result_point.getCenterLatLng();
				poi = new MQPoi(poi_ll);
				poi_name = result_point.getName();
				poi_distance = Math.round(result_point.getDistance() * 100) / 100;
				poi_key = result_point.getKey();
				poi_address = more_info.getField("address") + " " + more_info.getField("city") + ", " + more_info.getField("state") + " " + more_info.getField("postal");
				poi_content = more_info.getField("address") + "<br />" + more_info.getField("city") + ", " + more_info.getField("state") + " " + more_info.getField("postal") + "<br /> Distance: " + poi_distance + " mi<div class=\"DirectionOptions\">Get directions: <span id=\"DirectionTo" + poi_key + "\" class=\"DirectionTo\">To here</span> | <span id=\"DirectionFrom" + poi_key + "\" class=\"DirectionFrom\">From here</span> <input type=\"hidden\" id=\"Address" + poi_key + "\" value=\"" + poi_address + "\" /></div>";
				poi_result_content = more_info.getField("address") + "<br />" + more_info.getField("city") + ", " + more_info.getField("state") + " " + more_info.getField("postal") + " - <span class=\"Distance\">" + poi_distance + " mi</span>";
				
				//Set POI attributes
				poi.setInfoTitleHTML(poi_name);
				poi.setInfoContentHTML(poi_content);
				poi.setKey(poi_key);
				poi.setLabel(poi_label, "PoiLabel");
				var poi_icon = new MQMapIcon();
				var poi_icon_offset = new MQPoint;
				poi_icon_offset.setXY(-15, -30);
				poi_icon.setImage("images/red_poi.png", 30, 30, true, true);
				poi_icon.setAnchorOffset(poi_icon_offset);
				poi.setIcon(poi_icon);
				MQEventManager.addListener(poi, "infowindowopen", initPoiInfowindow);
				
				//Add POI info to results
				result_list.innerHTML += "<div id=\"ResultItem" + poi.key + "\" class=\"ResultItem\"><div class=\"ResultNumber\"><img src=\"images/red_poi.gif\" alt=\"\" class=\"NoBorder\" /><span class=\"PoiLabel\">" + poi_label + "</span></div><div class=\"ResultInfo\"><span id=\"Result" + poi.key + "\" class=\"ResultItemName\">" + poi_name + "</span><br />" + poi_result_content + "</div><div class=\"Spacer\"></div></div>";
				
				map.addPoi(poi);
				more_info.moveFirst();
			}
			
			//Add the search origin
			var origin_point = new MQPoi(origin_geo);
			var origin_icon = new MQMapIcon();
			origin_icon.setImage("images/yellow_poi.gif", 30, 30, true, false);
			origin_point.setIcon(origin_icon);
			origin_point.setInfoTitleHTML(origin.getStreet());
			origin_point.setInfoContentHTML(origin.getCity() + ", " + origin.getState() + " " + origin.getPostalCode());
			origin_point.setKey("Origin");
			map.addPoi(origin_point);
			map.setBestFitMargin(50);
			map.bestFit();
			
			dojo.forEach(dojo.query("#SearchResultsList .ResultItemName"),
				function(result) {
					dojo.connect(result, "onclick", null, "center");
				}
			);
		} else {
			result_heading_text = "Search Results";
			result_heading.innerHTML = result_heading_text;
			result_list.innerHTML = "<p class=\"NoMatches\"><strong>No matches found.</strong>For more accurate results,<br />enter a full address above.<br />Example:<br />&quot;" + example_address + "&quot;</p>";
			dojo.addClass(dojo.byId("Reset"), "Hidden");
		}
	}
	e.preventDefault();
}

function doSearch(ll) {
	var search_criteria = new MQRadiusSearchCriteria();
	search_criteria.setMaxMatches(max_matches);
	search_criteria.setRadius(search_radius);
	search_criteria.setCenter(ll);
	
	var results_collection = new MQFeatureCollection();
	
	spatial_exec.search(search_criteria, results_collection, "", db_layer_query_collection);
	
	return results_collection;
}

function getMoreInfo(result) {
	var ids = new MQStringCollection();
	var more_info = new MQRecordSet();
	var fields = new MQStringCollection();
	for(var i = 0; i < result.getSize(); i++) {
		ids.add(result.getAt(i).getKey());
	}
	spatial_exec.getRecordInfo(fields, db_layer_query, more_info, ids);
	
	return more_info;
}

function initPoiInfowindow(e) {
	var key = this.getKey();
	
	if(key) {
		var to = dojo.byId("DirectionTo" + key);
		if(to) {
			dojo.connect(to, "onclick", null, function (e) {getRoute(e, key, "to");});
		}
		
		var from = dojo.byId("DirectionFrom" + key);
		if(from) {
			dojo.connect(from, "onclick", null, function (e) {getRoute(e, key, "from");});
		}
	}
}

function getRoute(e, key, dir, to, from) {
	loading();
	
	var to_address = new MQSingleLineAddress();
	var from_address = new MQSingleLineAddress();
	var geo_col = new MQLocationCollection("MQGeoAddress");
	var route_col = new MQLocationCollection("MQGeoAddress");
	var geo_result_col = new MQLocationCollectionCollection();
	var route_opt = new MQRouteOptions();
	var session = new MQSession();
	var bounds = new MQRectLL(new MQLatLng(),new MQLatLng());
	var session_id = route_exec.createSessionEx(session);
	var from_geo, to_geo, from, to;
	
	if(key) {
		if(dir == "to") {
			from = dojo.byId("PreviousQuery").value;
			to = dojo.byId("Address" + key).value;
		} else {
			from = dojo.byId("Address" + key).value;
			to = dojo.byId("PreviousQuery").value;
		}
	}
	
	route_results = new MQRouteResults();
	from_address.setAddress(from);
	to_address.setAddress(to);
	
	//Geocode origin and destination addresses
	geo_col.add(from_address);
	geo_col.add(to_address);
	geo_exec.batchGeocode(geo_col, geo_result_col);
	
	//Route map overlay
	from_geo = geo_result_col.get(0).get(0);
	to_geo = geo_result_col.get(1).get(0);
	route_col.add(from_geo);
	route_col.add(to_geo);
	
	route_exec.doRoute(route_col, route_opt, route_results, session_id, bounds);
	displayDirections();
	
	map.removeAllPois();
	map.addRouteHighlight(bounds, "http://map.access.mapquest.com", session_id, true);
	
	var search_results = dojo.byId("SearchResults");
	if(search_results) {
		dojo.addClass(search_results, "Hidden");
	}
	
	var directions_address = dojo.byId("DirectionsAddress");
	if(directions_address) {
		dojo.addClass(directions_address, "Hidden");
	}
	
	var directions = dojo.byId("Directions");
	if(directions) {
		dojo.removeClass(directions, "Hidden");
	}
	
	//Add the search origin
	var origin_point = new MQPoi(from_geo.getMQLatLng());
	var origin_icon = new MQMapIcon();
	origin_icon.setImage("images/yellow_poi.gif", 30, 30, true, false);
	origin_point.setIcon(origin_icon);
	origin_point.setKey("Origin");
	map.addPoi(origin_point);
	
	var dest_point = new MQPoi(to_geo.getMQLatLng());
	var dest_icon = new MQMapIcon();
	var dest_icon_offset = new MQPoint;
	dest_icon_offset.setXY(-15, -30);
	dest_icon.setImage("images/red_poi.png", 30, 30, true, true);
	dest_icon.setAnchorOffset(dest_icon_offset);
	dest_point.setIcon(dest_icon);
	dest_point.setKey("Destination");
	map.addPoi(dest_point);
	
	var new_directions = dojo.byId("NewDirections");
	if(new_directions) {
		dojo.removeClass(new_directions, "Hidden");
	}
	
	var back_results = dojo.byId("BackToSearchResults");
	if(back_results) {
		dojo.removeClass(back_results, "Hidden");
	}
	
	var print_directions = dojo.byId("PrintDirections");
	if(print_directions) {
		dojo.removeClass(print_directions, "Hidden");
	}
	
	var reset_view = dojo.byId("Reset");
	if(reset_view) {
		dojo.addClass(reset_view, "Hidden");
	}
	
	var directions_list = dojo.byId("DirectionsList");
	if(directions_list) {
		directions_list.scrollTop = 0;
	}
	
	e.preventDefault();
}

function displayDirections() {
	var maneuvers = "", trek = "";
	var minutes;
	if(isNaN(route_results.getTime())) {
		minutes = 0;
	} else {
		minutes = route_results.getTime() / 60;
	}
	var total_time, dist, maneuver_dist;
	
	//Total time
	if(minutes > 60) {
		if(minutes / 60 == 1) {
			total_time = "1 hour";
		} else {
			total_time = Math.round((minutes / 60) * 100) / 100 + " hours";
		}
	} else {
		total_time = Math.round(minutes * 100) / 100 + " minutes";
	}
	
	//Total distance
	dist = Math.round(route_results.getDistance() * 100) / 100;
	if(isNaN(dist)) {
		dist = 0;
	}
	
	//Maneuvers
	var row = "Odd";
	var trek_count = 1;
	for(var x = 0; x < route_results.getTrekRoutes().get(0).getManeuvers().getSize(); x++) {
		maneuver_dist = Math.round(route_results.getTrekRoutes().get(0).getManeuvers().get(x).getDistance() * 100) / 100;
		maneuvers = route_results.getTrekRoutes().get(0).getManeuvers().get(x).getNarrative() + " (Distance: " + maneuver_dist + " mi)";
		if(row == "StripeColor") {
			row = "Odd";
		} else {
			row = "StripeColor";
		}
		
		trek += "<li class=\"" + row + "\">" + trek_count + ". " + maneuvers + "</li>";
		trek_count++;
	}
	var origin_loc = route_results.getLocations().get(0);
	var origin_address = origin_loc.getStreet() + "<br />" + origin_loc.getCity() + ", " + origin_loc.getState() + " " + origin_loc.getPostalCode();
	var dest_loc = route_results.getLocations().get(1);
	var dest_address = dest_loc.getStreet() + "<br />" + dest_loc.getCity() + ", " + dest_loc.getState() + " " + dest_loc.getPostalCode();
	var trek_points = "<div><div class=\"DirectionLabel\"><img src=\"images/yellow_poi.gif\" alt=\"From\" />from</div><div class=\"DirectionAddress\">" + origin_address + "</div></div><div><div class=\"DirectionLabel\"><img src=\"images/red_poi.gif\" alt=\"To\" />to</div><div class=\"DirectionAddress\">" + dest_address + "</div></div><span class=\"DirectionsInfo\">" + dist + " miles | " + total_time + "</span>";
	dojo.byId("DirectionsList").innerHTML = trek_points + "<ol>" + trek + "</ol>";
	
	dojo.byId("DirectionsHeading").innerHTML = "Driving directions";
}

function printable() {
	map.showStaticMap();
	dojo.addClass(dojo.byId("DirectionsList"), "Print");
	window.print();
}

function loading() {
	var loading = dojo.byId("Loading");
	if(dojo.hasClass(loading, "Hidden")) {
		dojo.removeClass(loading, "Hidden");
		setTimeout(function () {dojo.addClass(loading, "Hidden");}, 2000);
	} else {
		dojo.addClass(loading, "Hidden");
		setTimeout(function () {dojo.addClass(loading, "Hidden");}, 2000);
	}
}

