// map constants
var mapId = 1;
var zoomMax = 5, zoomDefault = 3;
var pointDefault = [-36.5, -73.5];

function getLabelTileUrl(a,b)
{
	// z: zoom out ratio, e.g. 1:1, 1:2, ... 1:5
	// b ranges from 0 to 4, so z=b+1
	var z = b + 1;

	// a: map point (a.x, a.y)
	// x, y start at (0, 0), so col=x+1, row=y+1
	var col = a.x + 1;
	var row = a.y + 1;

	var cMax = new Array(0, 0, 1, 2 ,4, 7);

	var file = "";
	if (col > cMax[z])
		file = "blank.png";
	else
		file = "z"+z+"_"+row+"x"+col+".png";

	var s = ((row + col) % 2) + 1;

	var path = "http://"+s+".mts.towerofthehand.com/1/labels/";

	return path + file;
}

function getBaseTileUrl(a,b)
{
	// z: zoom out ratio, e.g. 1:1, 1:2, ... 1:5
	// b ranges from 0 to 4, so z=b+1
	var z = b + 1;

	// a: map point (a.x, a.y)
	// x, y start at (0, 0), so col=x+1, row=y+1
	var col = a.x + 1;
	var row = a.y + 1;

	var cMax = new Array(0, 1, 1, 2 ,4, 7);

	var file = "";
	if (col > cMax[z])
		file = "blank.jpg";
	else
		file = "z"+z+"_"+row+"x"+col+".jpg";

	var s = ((row + col) % 3) + 1;

	var path = "http://"+s+".mts.towerofthehand.com/1/tiles/";

	return path + file;
}

function loadCities()
{
	// read the markers from the XML
	GDownloadUrl("http://www.towerofthehand.com/maps/markersets/cities.php?map=1",
	function (doc)
	{
		if (!map) return;

		var cities = [[], [], [], [], []];

		var mgrOptions = { borderPadding: 50, maxZoom: 5, trackMarkers: false };
		mgr = new MarkerManager(map, mgrOptions);

		var xmlDoc = GXml.parse(doc);

		var markers = xmlDoc.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++)
		{
			// obtain attributes of each marker
			var lat = parseFloat(markers[i].getAttribute("lat"));
			var lng = parseFloat(markers[i].getAttribute("lng"));
			var point = new GLatLng( lat, lng );

			var id = markers[i].getAttribute("id");
			var name = markers[i].getAttribute("name");
			var html = '<p class="subject">' + name + '<\/p>' +
				'<p class="teaser">' + GXml.value(markers[i].getElementsByTagName("html")[0]) + '<\/p>' +
				'<p class="link"><a href="/reference/k/' + id + '/index.html">View Reference<\/a><\/p>';

			var clock = parseInt(markers[i].getAttribute("clock"));

			// create markers, labels
			var marker = null, label = null;
			var type = parseFloat(markers[i].getAttribute("type"));
			if (type == 16)
			{
				label = createLabel( point, name, "capital", clock );
				mgr.addMarker( label, 3, 4 );

				marker = createMarker( point, name, html, "smallcircle" );
				mgr.addMarker( marker, 2, 2 );

				marker = createShield( point, name, html, name );
				mgr.addMarker( marker, 3, 4 );
				cities[3].push( marker );
				cities[4].push( marker );
			}
			else if (type == 11)
			{
				label = createLabel( point, name, "city_in", clock );
				mgr.addMarker( label, 3, 4 );

				marker = createMarker( point, name, html, "smallcircle" );
				mgr.addMarker( marker, 2, 2 );

				marker = createMarker( point, name, html, "whiteflag" );
				mgr.addMarker( marker, 3, 4 );
				cities[3].push( marker );
				cities[4].push( marker );
			}
			else if (type >= 11 && type <= 18)
			{
				label = createLabel( point, name, "city_out", clock );
				mgr.addMarker( label, 3, 3 );

				marker = createMarker( point, name, html, "smallcircle" );
				mgr.addMarker( marker, 3, 3 );

				label = createLabel( point, name, "city_in", clock );
				mgr.addMarker( label, 4, 4 );

				marker = createMarker( point, name, html, "whiteflag" );
				mgr.addMarker( marker, 4, 4 );
				cities[4].push( marker );
			}
		}

		gMarkers.push( {group: "cities", markers: cities} );

		mgr.refresh();
	});
}

function loadSightings ()
{
	// skip the first character, we are not interested in the "?"
	var query = location.search.substring(1);

	// split by & to give a list of "argname=value" pairs
	var pairs = query.split("&");

	var bSighted = false, index = 0;
	for (var i=0; i<pairs.length; i++)
	{
		// use = to separate argname from value
		var pos = pairs[i].indexOf("=");
		var argname = pairs[i].substring(0,pos).toLowerCase();
		var value = pairs[i].substring(pos+1).toLowerCase();

		if (argname == "character")
		{
			bSighted = true;
			getCharacterData(value, index);
			index++;
			if (index >= 3) break;
		}
	}

	return bSighted;
}

function getCharacterData (character, index)
{
	var colors = ["#FF0000", "#C0C0C0", "#000000"];

	var cities;
	for (var i = 0; i < gMarkers.length; i++)
	{
		if (gMarkers[i].group == "cities")
		{
			cities = gMarkers[i].markers;
			break;
		}
	}

	// initialize marker group
	if (!cities)
	{
		gMarkers.push( {group: "cities", markers: [[], [], [], [], []]} );
		cities = gMarkers[gMarkers.length - 1].markers;
	}

	// read the markers and lines from the XML
	GDownloadUrl("http://www.towerofthehand.com/maps/markersets/sightings.php?id=" + character,
	function (doc)
	{
		if (!map) return;

		var mgrOptions = { borderPadding: 50, maxZoom: 5, trackMarkers: false };
		mgr = new MarkerManager(map, mgrOptions);

		var xmlDoc = GXml.parse(doc);

		var markers = xmlDoc.documentElement.getElementsByTagName("marker");

		for (var i = 0; i < markers.length; i++)
		{
			// obtain the attributes of each marker
			var lat = parseFloat(markers[i].getAttribute("lat"));
			var lng = parseFloat(markers[i].getAttribute("lng"));
			var point = new GLatLng( lat, lng );
			var location = markers[i].getAttribute("location");

			var chapterId = markers[i].getAttribute("id");
			var chapterTitle = markers[i].getAttribute("chapter");
			var info = GXml.value(markers[i].getElementsByTagName("html")[0]);

			var marker;
			if (gLocations[location] == undefined)
			{
				marker = createTimeMarker( point, location, "whiteflag" );
				mgr.addMarker( marker, 3, 4 );
				cities[3].push( marker );
				cities[4].push( marker );

				gLocations[location] = marker;
				gLocations[location][chapterId] = { chapter: chapterTitle, info: info };
			}
			else
			{
				marker = gLocations[location];

				if (gLocations[location][chapterId] == undefined)
					gLocations[location][chapterId] = { chapter: chapterTitle, info: info };
				else
					gLocations[location][chapterId].info += " ... " + info;
			}

			gTimeline[chapterId] = marker;
		}

		mgr.refresh();

		var lines = xmlDoc.documentElement.getElementsByTagName("line");

		// read each line
		for (var a = 0; a < lines.length; a++)
		{
			// read each point on that line
			var points = lines[a].getElementsByTagName("point");
			var pts = [];

			for (var i = 0; i < points.length; i++)
			{
				pts[i] = new GLatLng(parseFloat(points[i].getAttribute("lat")),
							   parseFloat(points[i].getAttribute("lng")));
			}

			map.addOverlay(new GPolyline(pts, colors[index], 4));
		}
	});
}