/*
	Maps functionality
	Dependencies:
		Google maps API
*/

/* Constants */
var map_width_results = 538;
var map_height_results = 230;
var map_width_details = 510;
var map_height_details = 300;
var map_latitude_default = 44.1225930649;
var map_longitude_default = -72.6891732216;
var map_zoom_default = 7;
var map_zoom_close = 15;
var map_type_default = G_NORMAL_MAP; /* G_SATELLITE_MAP, G_HYBRID_MAP */
var map_polygon_color = '#FF0000';
var map_polygon_weight = 2;
var map_polygon_opacity = 0.2;

/* Initialization routines */
function map_create_for_results() {
	var map = null;
	var canvas = document.getElementById('map');
	if(canvas && GBrowserIsCompatible()) {
		map = new GMap2(canvas, { size: new GSize(map_width_results, map_height_results) });
		map.setCenter(
			new GLatLng(map_latitude_default, map_longitude_default),
			map_zoom_default,
			map_type_default);
		map.addControl(new GMapTypeControl());
		map.addControl(new GSmallMapControl());
		
		map.user_points = new Array();
		GEvent.addListener(map, 'click',
			function(m, p) {
				if(!m) {
					var toggle = document.getElementById('mapDrawPolygon');
					if(toggle && toggle.checked) {
						map.user_points.push(p);
						map_results(map);
					}
				}
			}
		);
		
		map.avg_lat_lng = {};
	}
	
	return map;
}

function map_create_for_details(data) {
	var map = null;
	var canvas = document.getElementById('map');
	if(canvas && GBrowserIsCompatible()) {
		var coords = new GLatLng(data.latitude, data.longitude);
		map = new GMap2(canvas, { size: new GSize(map_width_details, map_height_details) });
		map.setCenter(
			coords,
			map_zoom_close,
			map_type_default);
		map.addControl(new GMapTypeControl());
		map.addControl(new GSmallMapControl());
		
		var icon = (data.icon ? map_create_icon(data.icon) : G_DEFAULT_ICON);
		var marker = new GMarker(coords, icon);
		var html = '<div class="mapInfoWindow">' + data.html + '</div>';
		
		GEvent.addListener(marker, 'click',
			function() {
				marker.openInfoWindowHtml(html);
			}
		);
		
		map.addOverlay(marker);
	}
	return map;
}

/* Mapping managers */
function map_results(map) {
	map.clearOverlays();
	
	map_draw_user_polygon(map);
	
	map.avg_lat_lng.avg_lat = 0;
	map.avg_lat_lng.avg_lng = 0;
	map.avg_lat_lng.count = 0;
	
	if(window.map_lodging_results) { map_lodging_results(map); }
	if(window.map_event_results) { map_event_results(map); }
	
	if(map.avg_lat_lng.count != 0) {
		map.setCenter(new GLatLng(map.avg_lat_lng.avg_lat, map.avg_lat_lng.avg_lng));
	}
}

function map_reset_results(map) {
	map.user_points = new Array();
	map_results(map);
}

/* Mapping utility functions */

/* Point Inclusion in Polygon Test
	Original C code by W. Randolph Franklin
	Ported to JS by John Peloquin
*/
function pnpoly(npol, xp, yp, x, y) {
	var i, j, c = 0;
	for (i = 0, j = npol - 1; i < npol; j = i++) {
		if ((((yp[i] <= y) && (y < yp[j])) ||
			((yp[j] <= y) && (y < yp[i]))) &&
			(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
		{
      		c = !c;
		}
	}
	return c;
}

function map_point_in_user_polygon(map, point) {
	if(map.user_points && map.user_points.length > 2) {
		var proj = map.getCurrentMapType().getProjection();
		var zoom = map.getZoom();
		var pixel = proj.fromLatLngToPixel(point, zoom);
		var xp = new Array();
		var yp = new Array();
		var p;
		for(var i = 0; i < map.user_points.length; i++) {
			p = proj.fromLatLngToPixel(map.user_points[i], zoom);
			xp.push(p.x);
			yp.push(p.y);
		}
		return pnpoly(map.user_points.length, xp, yp, pixel.x, pixel.y);
	}
	return false;
}

function map_draw_user_polygon(map) {
	if(map.user_points && map.user_points.length > 1) {
		var points = map.user_points.slice(0);
		if(points.length > 2) {
			points.push(points[0]);
		}
		var polygon = new GPolygon(points,
									map_polygon_color,
									map_polygon_weight, 1,
									map_polygon_color,
									map_polygon_opacity);
		
		map.addOverlay(polygon);
	}
}

function map_create_icon(info) {
	var icon = new GIcon();
	icon.image = info.image;
	icon.iconSize = new GSize(info.icon_size[0], info.icon_size[1]);
	icon.iconAnchor = new GPoint(info.icon_anchor[0], info.icon_anchor[1]);
	icon.shadow = info.shadow;
	icon.shadowSize = new GSize(info.shadow_size[0], info.shadow_size[1]);
	icon.infoWindowAnchor = new GPoint(info.info_window_anchor[0], info.info_window_anchor[1]);
	icon.infoShadowAnchor = new GPoint(info.info_shadow_anchor[0], info.info_shadow_anchor[1]);
	return icon;
}

function map_add_result(map, data) {
	var icon = (data.icon ? map_create_icon(data.icon) : G_DEFAULT_ICON);
	var coords = new GLatLng(data.latitude, data.longitude);
	var marker = new GMarker(coords, icon);
	var html = '<div class="mapInfoWindow">' + data.html + '</div>';
	
	GEvent.addListener(marker, 'click',
		function () {
			marker.openInfoWindowHtml(html);
		}
	);
		
	map.addOverlay(marker);
	
	var n = map.avg_lat_lng.count++;
	map.avg_lat_lng.avg_lat = ((n * map.avg_lat_lng.avg_lat) + data.latitude) / (n+1);
	map.avg_lat_lng.avg_lng = ((n * map.avg_lat_lng.avg_lng) + data.longitude) / (n+1);
	
	/* Update listing */
	YAHOO.util.Dom.getElementsByClassName('mapIcon', 'img', data.id,
		function(i) {
			i.src = icon.image;
		}
	);
	YAHOO.util.Dom.getElementsByClassName('mapLink', 'a', data.id,
		function(a) {
			YAHOO.util.Event.addListener(a, 'click',
				function(e) {
					YAHOO.util.Event.preventDefault(e);
					
					map.closeInfoWindow();
					map.setCenter(coords, map_zoom_close);
					marker.openInfoWindowHtml(html);
					
					if(window.g_mapit_event) {
						g_mapit_event.fire();
					}
					
					return false;
				}
			);
		}
	);
	YAHOO.util.Dom.getElementsByClassName('mapLinkContainer', 'span', data.id,
		function(s) {
			YAHOO.util.Dom.setStyle(s, 'display', 'inline');
		}
	);
	
	if(map_point_in_user_polygon(map, coords)) {
		YAHOO.util.Dom.addClass(data.id, 'resultInMapPolygon');
	}
	else {
		YAHOO.util.Dom.removeClass(data.id, 'resultInMapPolygon');
	}
}

