/*
	driver for PxMap
	
	v 0.2

*/

var ID      = 0;
var NAME    = 1;
var SPECIES = 2;
var BREED   = 3;
var TYPE    = 4;
var LAT     = 5;
var LNG     = 6;
var AREA    = 7;
var REGION  = 8;

var map;
var regions;
var areas;
function onLoad() {
	document.getElementById('species').selectedIndex = 0;
	document.getElementById('name').value = '';
	document.getElementById('type').selectedIndex = 0;
	document.getElementById('postcode').selectedIndex = 0;
	document.getElementById('start_date').value = 'DD/MM/YYYY';

	map = new PxMap(document.getElementById('map'));
	map.setCenter(new GLatLng(53.448806,-3.098144),6);
	map.setMode('region');

	areas   = createAreas();
	regions = createRegions(areas);

	for(var i = 0; i < regions.length; i++)
		map.addOverlay(regions[i]);
}

// when the "View reports as a list" link is clicked
function viewList() {
	var markers = map.getMarkers();
	var ids = [];
	for (var i = 0; i < markers.length; i++)
		ids.push(markers[i].getUserData()[ID]);

	if (ids.length > 0)
		window.open('http://www.pawtrax.co.uk/map/locations/listview/'+ids.join(','),'viewList');
	else
		alert('There are currently no mapped reports.');
}

function searchButtonClicked() {
	map.removeOverlays();
	map.setPreviousBounds(null);

	// if they're searching a postcode, let's recenter the map
	var postcode = document.getElementById('postcode').value
	if (postcode != '') {
		for (var i = 0; i < areas.length; i++) {
			if (areas[i].getUserData().area == postcode) {
				areas[i].whenClicked();
				break;
			}
		}
	}
	// else get data
	else {
		map.requestData();
	}
}

function manageCrumbs(what, which) {
	var bc = document.getElementById('crumbs');
	var ukLink = '<a href="javascript:void(0)" onclick="map.setCenter(new GLatLng(53.448806,-3.098144),6)">UK</a>';
	if (what == 'UK' || map.getZoom() <= 6) {
		bc.innerHTML = 'UK';
	}
	else if (what == 'region') {
		bc.innerHTML = ukLink + ' > ' + which.getUserData().region;
	}
	else if (what == 'area') {
		// clear out the old
		bc.innerHTML = '';
		
		// add the UK link
		var uk  = document.createElement('a');
		uk.href = 'javascript:void(0)';
		uk.onclick = function(){ map.setCenter(new GLatLng(53.448806,-3.098144),6) };
		uk.innerHTML = 'UK';

		bc.appendChild(uk);
		bc.appendChild(document.createTextNode(' > '));

		// add the region link
		var ud = which.getUserData();
		var ra = document.createElement('a');
		ra.href = 'javascript:void(0)';
		ra.onclick = function(){ clickRegionCrumb(ud.region) };
		ra.innerHTML = ud.region;

		bc.appendChild(ra);

		// add the area name
		bc.appendChild(document.createTextNode(' > ' + ud.area));
	}
	// else this is based on a moveEnd, so let's find the region or area which is most central
	else {
		var center = map.getCenter();
		if (map.getMode() == 'region' || map.getZoom() <= 6) {
			// find the "closest" region to the center of the map
			var closest = regions[0];
			var closest_diff  = Math.abs(center.lat() - closest.getPoint().lat()) +
					Math.abs(center.lng() - closest.getPoint().lng());

			for (var i = 1; i < regions.length; i++) {
				var this_diff = Math.abs(center.lat() - regions[i].getPoint().lat()) +
					Math.abs(center.lng() - regions[i].getPoint().lng());
				if (closest_diff > this_diff) {
					closest = regions[i];
					closest_diff = this_diff;
				}
			}
			manageCrumbs('region', closest);
		}
		// if we're not in region mode, and not zoomed out, then we'll always show the area crumb
		else {
			// find the "closest" area to the center of the map
			var closest = areas[0];
			var closest_diff  = Math.abs(center.lat() - closest.getPoint().lat()) +
					Math.abs(center.lng() - closest.getPoint().lng());

			for (var i = 1; i < areas.length; i++) {
				var this_diff = Math.abs(center.lat() - areas[i].getPoint().lat()) +
					Math.abs(center.lng() - areas[i].getPoint().lng());
				if (closest_diff > this_diff) {
					closest = areas[i];
					closest_diff = this_diff;
				}
			}
			manageCrumbs('area', closest);
		}
	}
}

function clickRegionCrumb(region) {
	for (var i = 0; i < regions.length; i++) {
		if (regions[i].getUserData().region == region) {
			regions[i].onClick();
			return;
		}
	}
}

