last_selected = '';
accomms = [];
accomm_markers = [];

initMap();
initTimeline();

loadLocationsXml('/locations/getLocationsEventsXml');
loadEventsXml('/events/getEventsXml');
//loadVhAccommXml('/vh/getAccomByIslandXml');

window.onload = function() {

	$('div.nav_control').click();
	// need to refresh the timeline once it's all loaded in
	// not sure why this is ...

	tl.layout();
	$('#data_overlay').fadeOut('slow');

};

function initMap() {
	var start_loc = new GLatLng(57.9, -6.65);
	var start_zoom = 9;

	map = new GMap2(document.getElementById("ah_map"));
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	map.setCenter(start_loc, start_zoom, G_HYBRID_MAP);
	//map.setCenter(start_loc, start_zoom, G_NORMAL_MAP);

	icon = new GIcon();
	icon.image = "/img/ah_pin_off.png";
	icon.iconSize = new GSize(18, 23);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);
}

function initTimeline() {
	eventSource = new Timeline.DefaultEventSource();

	var theme = Timeline.ClassicTheme.create();
	theme.event.bubble.width = 500;
	theme.event.bubble.height = 250;

	theme.event.track.height = 2.0;
	theme.event.duration.color = '#8A889D';
	theme.event.track.gap = 0.8;
	theme.ether.highlightColor = '#C9C9B0';
	theme.ether.highlightOpacity = 100;
	theme.ether.backgroundColors = ['#C9C9B0', '#F2F2E8'];

	var d = Timeline.DateTime.parseGregorianDateTime("-4500");

	var bands = [
		Timeline.createBandInfo({
			eventSource: eventSource,
			width: "100%",
			intervalUnit: Timeline.DateTime.CENTURY,
			intervalPixels: 100,
			trackHeight: 1.2,
			trackGap: 0,
			date: d,
			multiple: 3,
			theme: theme
		})

		//Timeline.createBandInfo({
		//	showEventText: false,
		//	eventSource: eventSource,
		//	width: "35%",
		//	intervalUnit: Timeline.DateTime.MILLENNIUM,
		//	intervalPixels: 200,
		//	trackHeight: 1.0,
		//	trackGap: 0.5,
		//	date: d,
		//	multiple: 1,
		//	theme: theme
		//})
	];

	//bands[1].syncWith = 0;
	//bands[1].highlight = true;

	tl = Timeline.create(document.getElementById("timeline"), bands);

	Timeline.DurationEventPainter.prototype._showBubble = function(x, y, evt) {
		// if this timeline event is associated with a map location, zoom to it and show the
		// relevant info, otherwise show the default InfoBubble

		if(!evt.marker) {
			var div = this._band.openBubbleForPoint(x, y, this._theme.event.bubble.width, this._theme.event.bubble.height);
			evt.fillInfoBubble(div, this._theme, this._band.getLabeller());
		} else {
			var div = this._band.openBubbleForPoint(x, y, this._theme.event.bubble.width, this._theme.event.bubble.height);
			evt.fillInfoBubble(div, this._theme, this._band.getLabeller());
			GEvent.trigger(evt.marker, 'click');
			evt.marker.showTooltip();
			map.panTo(evt.point);
		}
	}
}

function loadLocationsXml(xmlFile) {
	$.ajax({
		type: "GET",
		url: xmlFile,
		dataType: "xml",
		success: function(xmlData)	{
			xmlDataSet = xmlData;
			parseXml(xmlDataSet);
		}
	});
}

function parseXml(doc) {
	var points = $('/data/location', doc);

	points.each(function(i) {
		var events = $('event', points[i]);

		var lng = $('lng', points[i]).text();
		var lat = $('lat', points[i]).text();
		var title = $('title', points[i]).text();
		var desc = $('desc', points[i]).text();
		var html = '<div class="infopop"><h2>' + title + '</h2><div>' + desc + '</div>';

 		var location = new GLatLng(parseFloat(lat), parseFloat(lng));

		var marker = new PdMarker(new GLatLng(parseFloat(lat), parseFloat(lng)), icon);
		marker.setTooltip('<strong>' + title + '</strong>');
		marker.setHoverImage("/img/ah_pin_on.png");

		events.each(function(j) {
			var start = $('eventstart', events[j]).text();
			var end = $('eventend', events[j]).text();

			if(!end) {
				end = start;
			}

			if(end == start) {
				var instant = true;
			} else {
				var instant = false;
			}

			var e_title = $('eventtitle', events[j]).text();
			var e_html = $('eventdesc', events[j]).text();

			var e_start = Timeline.DateTime.parseGregorianDateTime(start);
			var e_end = Timeline.DateTime.parseGregorianDateTime(end);

			var evt = new Timeline.DefaultEventSource.Event(e_start, e_end, null, null, instant, e_title, e_html, null, null, null, null, null);
			evt.point = location;
			evt.marker = marker;
			evt.html = html;
			eventSource.add(evt);
		});

		GEvent.addListener(marker, 'click', function() {
			if(last_selected == '')	{
				map.panTo(marker.getPoint())
				marker.setImage("/img/ah_pin_on.png");
				marker.setMouseOutEnabled(false);
				$('#map_desc').html(html);
				$('#vh_data').fadeIn('slow');

				last_selected = marker;
			} else {
				if (marker.getMouseOutEnabled())
				{
					map.panTo(marker.getPoint());
					marker.setImage("/img/ah_pin_on.png");
					marker.setMouseOutEnabled(false);
					$('#map_desc').html(html);
					$('#vh_data').fadeIn('slow');

					last_selected.setMouseOutEnabled(true);
					last_selected.setImage("/img/ah_pin_off.png");
					last_selected.hideTooltip();
					last_selected = marker;
				}
				else
				{
					marker.setMouseOutEnabled(true);
					marker.setImage("/img/ah_pin_off.png");
				}
			}
		});

		map.addOverlay(marker);
	});
}

function loadEventsXml(xmlFile) {
	$.ajax({
		type: "GET",
		url: xmlFile,
		dataType: "xml",
		success: function(xmlData)	{
			xmlDataSet = xmlData;
			parseEventsXml(xmlDataSet);
		}
	});
}

function parseEventsXml(doc) {
	// messy way of adding events with no map info
	// will fix, sorry, refactor, this one day

	var events = $('/data/event', doc);
	arLen = events.length;

	for (var i = 0, len = arLen; i<len; ++i ) {
		var location = $('location', events[i]).text();
		if(location.length == 0)
		{
			var start = $('eventstart', events[i]).text();
			var end = $('eventend', events[i]).text();

			if(!end) {
				end = start;
			}

			if(end == start) {
				var instant = true;
			} else {
				var instant = false;
			}

			var e_title = $('eventtitle', events[i]).text();
			var e_html = $('eventdesc', events[i]).text();

			var e_start = Timeline.DateTime.parseGregorianDateTime(start);
			var e_end = Timeline.DateTime.parseGregorianDateTime(end);

			var evt = new Timeline.DefaultEventSource.Event(e_start, e_end, null, null, instant, e_title, e_html, null, null, null, null, null);
			eventSource.add(evt);
		}
	}
}

function loadVhAccommXml(xmlFile) {
	$.ajax({
		type: "GET",
		url: xmlFile,
		dataType: "xml",
		success: function(xmlData)	{
			xmlDataSet = xmlData;
			parseVhAccommXml(xmlDataSet);
		}
	});
}

function parseVhAccommXml(doc) {

	var accs = $('/data/accommodation', doc);
	arLen = accs.length;

	for (var i = 0, len = arLen; i<len; ++i ) {
		var title = $('title', accs[i]).text();
		var phone = $('phone', accs[i]).text();
		var url = $('url', accs[i]).text();
		var lat = $('lat', accs[i]).text();
		var lng = $('lng', accs[i]).text();

		var marker = [];
		marker['title'] = title;
		marker['phone'] = phone;
		marker['url'] = url;
		marker['lat'] = lat;
		marker['lng'] = lng;

		accomms.push(marker);
	}
}

function showAccomm(lat1, lng1, distance) {
	// hide all existing markers
	if(accomm_markers.length > 0)
	{
		var arLen=accomm_markers.length;
		for (var i = 0, len = arLen; i<len; ++i ) {
			accomm_markers[i].remove();
		}
		accomm_markers.length = 0;
	}

	if(accomms.length > 0)
	{
		var arLen=accomms.length;
		for (var i = 0, len = arLen; i<len; ++i ) {
			var dist = getDistance(lat1, lng1, accomms[i]['lat'], accomms[i]['lng']);
			if(dist < distance)
			{
				//alert(accomms[i]['title']);
				//alert(accomms[i]['lat']);
				//alert(accomms[i]['lng']);

				var thislat = accomms[i]['lat'];
				var thislng = accomms[i]['lng'];

				thistitle = accomms[i]['title'];

				var thislocation = new GLatLng(thislat, thislng);
            var thismarker = new PdMarker(thislocation, icon2);
				thismarker.setTooltip('<strong>' + accomms[i]['title'] + '</strong><br />Phone: ' + accomms[i]['phone']);
				//marker.setHoverImage("/img/mm_20_red.png");
				thismarker.setHoverImage("/img/mm_20_red.png");
				map.addOverlay(thismarker);

				accomm_markers.push(thismarker);
			}
		}
	}
}

function getDistance(lat1, lng1, lat2, lng2) {
	var R = 6371;
	var dLat = (lat2 - lat1) * Math.PI / 180;
	var dLon = (lng2 - lng1) * Math.PI / 180;
	lat2 = lat2 * Math.PI / 180;
	lat1 = lat1 * Math.PI / 180;

	var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2);
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
	var d = R * c;
	return d;
}