google.load("maps", "3", {"other_params": "sensor=false"}); // Use Google loader so that we know where the user is for map initialization
google.setOnLoadCallback(initApp);

$(document).ready(function() {
	$("#sportSel").change(function() {
		var sport_id = $("#locSearch").attr("sport_id");
		$("#loc_type").html(sports[sport_id].lt);
		$("#pageTitleHdr").html(sports[sport_id].nm+" "+sports[sport_id].lt+" Map");
		$("#createLink").attr("href",WEB_ROOT+"/members/location_edit.cfm?location_id=new&sport_id="+sport_id);
		$("#linkType").html(sports[sport_id].lt);
		fetchLocations();
	});
	$("#mapSportSwitch a,#mapSportSwitch em").bind("click", function(e) {
		$("#mapSportSwitch a").removeClass("currentSport");
		
		var sport_id = $(e.target).find("img").eq(0).attr("className");
		$("#locSearch").attr("sport_id",sport_id);
		$("#loc_type").html(sports[sport_id].lt);
		$("#pageTitleHdr").html(sports[sport_id].nm+" "+sports[sport_id].lt+"s Map");
		$("#createLink").attr("href",WEB_ROOT+"/members/location_edit.cfm?location_id=new&sport_id="+sport_id);
		$("#linkType").html(sports[sport_id].lt);
		
		if ($(e.target).attr("nodeName") == "A") {
			$(e.target).addClass("currentSport");
		}
		else {
			$(e.target).parents("a").addClass("currentSport");
		}
		
		fetchLocations();

		e.preventDefault();
	});
});

var map;
var mapMarkers = new Array();
var mapInfoWindow;

function initApp() {
	var mapOpts = {
		zoom: 11,
		mapTypeId: google.maps.MapTypeId.HYBRID
	};
	
	if (typeof coords != 'undefined' && coords.lat != 0 && coords.lng != 0) {
		mapOpts.center = new google.maps.LatLng(coords.lat,coords.lng);
	}
	else if (google.loader.ClientLocation) {
		mapOpts.center = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
	}
	else {
		mapOpts.center = new google.maps.LatLng(20,-30);
		mapOpts.zoom = 1;
	}

	map = new google.maps.Map(document.getElementById("locMap"), mapOpts);

	var timerCode = null;
	/* perform search after delay to prevent a bunch of repeated requests all at once
	 * as the map pans
	 */
	google.maps.event.addListener(map, 'bounds_changed', function() {
		if (timerCode != null) {
			window.clearTimeout(timerCode);
		}
		timerCode = window.setTimeout(fetchLocations, 250);
	});

	mapInfoWindow = new google.maps.InfoWindow({content:""});
}

function fetchLocations() {

	var reqNum = 0;
	var lastCompletedReqest = -1;
	var mapBounds = map.getBounds();
	var opts = {
		url: WEB_ROOT+"/common/locations_by_sport_json-v02.cfm",
		dataType: "json",
		data: {
			sport: $("#locSearch").attr("sport_id"),
			verbose: 1,
			s: mapBounds.getSouthWest().lat(),
			w: mapBounds.getSouthWest().lng(),
			n: mapBounds.getNorthEast().lat(),
			e: mapBounds.getNorthEast().lng(),
			reqnum: reqNum
		},
		error: function (req, textStatus, errorThrown) {
			if (req.status == 200) {
				msgTxt = "An error occurred when processing the search results.";
				if (typeof console == "object") console.log("fetchLocations: "+textStatus);
			}
			else {
				msgTxt = "A server error occurred when finding locations ("+req.status+")";
			}
			$("#msg").show().attr("className","smErrorBox").html(msgTxt);
		},
		success: function(result, status) {
			if ("reqnum" in result && result.reqnum > lastCompletedReqest) {
				lastCompletedReqest = result.reqnum;
				populateMap(result, status);
			}
		}
	};
	$.ajax(opts);
	$("#msg").show().attr("className", "smLoadingBox").html("Searching...");
}

function populateMap(result, status) {
	if (result.error) {
		$("#msg").show().attr("className","smErrorBox").html(result.msg);
	}
	else {
		////////
		//
		// Put found locations on the map; and in side list
		//
		////////
		$("#msg").show().attr("className","smSuccessBox").html(result.locs.length + " "+sports[$("#locSearch").attr("sport_id")].lt+(result.locs.length != 1?"s":""));
		
		$("#locList").empty();

		while (mapMarkers.length > 0) {
			mapMarkers.pop().setMap(null);
		}

		for (var i = 0; i < result.locs.length; i++) {
			var marker = new google.maps.Marker({
				position: new google.maps.LatLng(result.locs[i].lat, result.locs[i].lng),
				map: map,
				title: result.locs[i].name,
				icon: sdGetMapIconForSport($("#locSearch").attr("sport_id"), false),
				shadow: sdGetMapShadowForSport($("#locSearch").attr("sport_id"))
			});
			mapMarkers.push(marker);

			var html = '<a class="loc_profile_link" href="'+WEB_ROOT+'/location.cfm?location_id='+result.locs[i].id+'">'+result.locs[i].name+'</a>';
			html += '<div class="details"><strong>';
			html += result.locs[i].city;
			if (result.locs[i].st.length > 0) {
				html += ", "+result.locs[i].st;
			}
			html += '</strong>';
			
			var li = document.createElement("li");
			$(li).html(html);			
			$("#locList").append(li);
			attachMarkerEvents(marker, li, result.locs[i]);
		}
	}
}

function attachMarkerEvents(mk, li, loc) {
	$(li).bind("mouseenter", {mk:mk,makeActive:true}, listMouseEvent)
				.bind("mouseleave", {mk:mk,makeActive:false}, listMouseEvent);

	google.maps.event.addListener(mk, 'mouseover', function() {
		$(li).addClass("hilite");
		mk.setIcon(sdGetMapIconForSport($("#locSearch").attr("sport_id"), true));
		
		// If bottom of LI is below the list, then scroll so that it is in view
		if ($(li).position().top + $(li).outerHeight() > $("#locList").scrollTop() + $("#locList").height()) {
			$("#locList").animate({scrollTop: $(li).position().top - $(li).outerHeight() + $("#locList").height() });
		}

		// If top of LI is above the list, then scroll so that it is in view
		if ($(li).position().top < $("#locList").scrollTop()) {
			$("#locList").animate({scrollTop:$(li).position().top});
		}
	});

	google.maps.event.addListener(mk, 'mouseout', function() {
		$(li).removeClass("hilite");
		mk.setIcon(sdGetMapIconForSport($("#locSearch").attr("sport_id"), false));
	});

	var html = "";
	html += "<h1>"+loc.name+"</h1>";
	html += "<p>";
	if (loc.loc.length > 0) {
		html+= loc.loc+"<br>";
	}
	html += loc.city;
	if (loc.st.length > 0) {
		html += ", "+loc.st;
	}
	html += "</p>";
	
	html += '<p>';
	html += '<a href="'+WEB_ROOT+'/location.cfm?location_id='+loc.id+'">View '+sports[$("#locSearch").attr("sport_id")].lt.toLowerCase()+' profile</a>';
	if (!sports[$("#locSearch").attr("sport_id")].team) {
		html += '<br><a href="'+WEB_ROOT+'/members/'+sports[$("#locSearch").attr("sport_id")].dir+'/game_edit.cfm?location_id='+loc.id+'">'
				+'Enter new scores for this '+sports[$("#locSearch").attr("sport_id")].lt.toLowerCase()+'</a>';
	}
	html += '</p>';

	$(li).find(".loc_profile_link").bind("click", function(e) {
		mapInfoWindow.setContent(html);
		mapInfoWindow.open(map, mk);
		e.preventDefault();
	});

	google.maps.event.addListener(mk, 'click', function() {
		mapInfoWindow.setContent(html);
		mapInfoWindow.open(map, mk);
	});
}

function listMouseEvent(e) {
	e.data.mk.setIcon(sdGetMapIconForSport($("#locSearch").attr("sport_id"), e.data.makeActive));
}
function getLocationImage(color) {
	return WEB_ROOT+'/images/marker_'+color+'.png';
}

function sdGetMapIconForSport(sport_id, activeOrNot) {
	return new google.maps.MarkerImage(
		WEB_ROOT+'/images/MapIconSprite.png',
		new google.maps.Size(30,31),
		new google.maps.Point( (sport_id-1)*30, (activeOrNot ? 31 : 0)),
		new google.maps.Point( 4, 31)
	);
}

function sdGetMapShadowForSport(sport_id, activeOrNot) {
	return new google.maps.MarkerImage(
		WEB_ROOT+'images/MapIconShadow.png',
		new google.maps.Size(43,31),
		new google.maps.Point(0,0),
		new google.maps.Point(4,31)
	);
}


