function goto(q) {
	search(q);
}

var id;

var idleTimeout;
function resetIdle() {
	idleTimeout && clearTimeout(idleTimeout);
	idleTimeout = setTimeout(function() {
		window.location = 'http://kubus.mailspool.nl/spoorkaart/idle/';
	}, 3600000);
}

var center = new OpenLayers.LonLat(5.11010, 52.08952);

var messages = [];
function log(message) {
	messages.push(message);
	if (messages.length > 10)
		messages.shift();
	$('log').innerHTML = '';
	for (var i = messages.length - 1; i >= 0; i--) {
		$('log').innerHTML += '<div>' + messages[i] + '</div>';
	}
}

var stm;
var pq;
function initSearch(e) {
	stm && clearTimeout(stm);
	var q = $F('search');
	if (q.length && ((q != pq) || (e.keyCode == 13))) {
		var timeout = (e.keyCode == 13) ? 0 : 1000;
		stm = setTimeout('search("' + q + '")', timeout);
	}
}

function search(q) {
	pq = q;
	$('result').style.display = 'block';
	$('result').style.color = 'black';
	$('result').innerHTML = 'Bezig met zoeken...';

	new Ajax.Request('./', {
		method: 'GET',
		parameters: {
			op: 'search',
			q: q,
			id: id
		},
		onSuccess: function(response) {
			if (response.responseText) {
				var data = response.responseText.evalJSON();
				if (data.station) {
					$('result').innerHTML = 'Zoekresultaat: <strong>' + data.station + '</strong>';
					// disable tracing when station found
					trace && toggleTrace();
				} else if (data.ref) {
					$('result').innerHTML = 'Zoekresultaat: <strong>' + data.refname + '</strong>';
					ref = data.ref;
					initTrace(data.ref);
				} else {
					$('result').style.color = '#c1121c';
					$('result').innerHTML = 'Niet gevonden';
				}
				if (data.lon && data.lat) {
					map.moveTo(new OpenLayers.LonLat(
						data.lon,
						data.lat
					).transform(
						new OpenLayers.Projection('EPSG:4326'),
						map.getProjectionObject()
					), 11);
				}
			}
		}
	});
}

var layerTrains;
var tm;

function setFilter(f) {
	layerTrains.protocol.params.filter = f;
	tm = setTimeout('layerTrains.refresh()', 0);
//	map.zoomTo(f ? 8 : 11);
}

var layerRoute;

var ref;
var trace;
var lasttraceresponse;

var updaterTrace;
function initTrace(ref) {
	lasttraceresponse = '';

	layerTrains.redraw();

	updaterTrace && updaterTrace.stop();
	updaterTrace = new Ajax.PeriodicalUpdater('trace', './', {
		method: 'GET',
		frequency: 10,
		parameters: {
			op: 'trace',
			ref: ref,
			id: id
		},
		onSuccess: function(response) {
			if (response.responseText.length < 10) {
//				log('Stopped trace: ' + ref);
				updaterTrace.stop();
				$('trace').innerHTML = '';
				layerRoute.setVisibility(false);
			} else if (lasttraceresponse && (response.responseText != lasttraceresponse)) {
				layerRoute.refresh();
			}
			lasttraceresponse = response.responseText;
		}
	});

	$('toggle').disabled = false;
	$('logo').style.display = 'none';

	layerRoute.protocol.params.ref = ref;
	layerRoute.refresh();
	layerRoute.setVisibility(true);
}

function toggleTrace() {
	trace = trace ? 0 : 1;
	$('toggle').checked = trace;
	if (trace)
		search(ref);
}

var help;
function toggleHelp() {
	help = help ? 0 : 1;
	$('help').style.display = help ? 'block' : 'none';
}

function showNL() {
	// disable tracing
	trace && toggleTrace();

	map.zoomToExtent(
		new OpenLayers.Bounds(3.5, 50.5, 7.5, 53.5).transform(
			new OpenLayers.Projection('EPSG:4326'),
			map.getProjectionObject()
		),
		true
	);

	var c = center.clone();
	map.setCenter(c.transform(
		new OpenLayers.Projection('EPSG:4326'),
		map.getProjectionObject()
	));
//	), 8);
}

var layerHistory;

var updaterAV;
function initAV(loc) {
	if (trace) {
		updaterAV.options.parameters.loc = loc.toShortString();
	} else {
		updaterAV && updaterAV.stop();
		updaterAV = new Ajax.PeriodicalUpdater('av', './', {
			method: 'GET',
			frequency: 10,
			parameters: {
				op: 'av',
				loc: loc.toShortString(),
				id: id
			},
			onSuccess: function() {
				if (layerHistory.getVisibility()) {
					layerHistory.refresh();
				}
			}
		});
	}
}

var map;

function setPref(name, value) {
	new Ajax.Request('./', {
		method: 'GET',
//		parameters: {
//			op: 'pref',
//			id: id
//		},
		parameters: 'op=pref&' + name + '=' + value + '&id=' + id,
		onSuccess: function(response) {
			id = response.responseText;

			layerTrains.protocol.params.id = id;
			if (updaterAV) {
				updaterAV.stop();
				updaterAV.options.parameters.id = id;
				updaterAV.start();
			}
			if (updaterTrace) {
				updaterTrace.stop();
				updaterTrace.options.parameters.id = id;
				updaterTrace.start();
			}
		}
	});
}

function redirectURL(r, n, v) {
	var form = document.createElement('form');
	form.action = r;
	form.method = 'POST';

	var input = document.createElement('input');
	input.type = 'hidden';
	input.name = n;
	input.value = v;
	form.appendChild(input);

	document.body.appendChild(form);
	form.submit();
}

function initMap(session) {
	id = session;

	var loc = center.clone();
	var bbox = new OpenLayers.Bounds(loc.lon - 0.1, loc.lat - 0.1, loc.lon + 0.1, loc.lat + 0.1);

	map = new OpenLayers.Map('map', {
		controls: [
			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.PanZoomBar(),
			new OpenLayers.Control.Attribution()
		],
		layers: [
			new OpenLayers.Layer.OSM('OpenStreetMap', [
				"http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
				"http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
				"http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
			], {
				transitionEffect: 'resize'
			})
		],
		eventListeners: {
			'moveend': function() {
				if (layerTrains) {
					layerTrains.protocol.params.bbox = map.getExtent().transform(
						map.getProjectionObject(),
						new OpenLayers.Projection('EPSG:4326')
					).toBBOX();
				}
				initAV(map.getCenter().transform(
					map.getProjectionObject(),
					new OpenLayers.Projection('EPSG:4326')
				));
				resetIdle();
			}
		}
	});

	layerHistory = new OpenLayers.Layer.Vector('Station updates', {
		strategies: [
			new OpenLayers.Strategy.Fixed()
		],
		protocol: new OpenLayers.Protocol.HTTP({
			url: './',
			params: {
				op: 'history',
				id: id
			},
			format: new OpenLayers.Format.GeoJSON()
		}),
		styleMap: new OpenLayers.StyleMap({
			'default': {
				pointRadius: 25,
				fillColor: 'red',
				fillOpacity: 0.25,
				stroke: false
			}
		}),
		visibility: false,
		displayInLayerSwitcher: false
	});
	map.addLayer(layerHistory);

	layerRoute = new OpenLayers.Layer.Vector('Train route', {
		strategies: [
			new OpenLayers.Strategy.Fixed()
		],
		protocol: new OpenLayers.Protocol.HTTP({
			url: './',
			params: {
				op: 'route',
				ref: ref,
				id: id
			},
			format: new OpenLayers.Format.GeoJSON()
		}),
		styleMap: new OpenLayers.StyleMap({
			'default': {
				strokeWidth: 8,
				strokeColor: 'blue',
				strokeOpacity: 0.5
			}
		}),
		visibility: false
	});
	map.addLayer(layerRoute);

	layerTrains = new OpenLayers.Layer.Vector('Trains', {
		strategies: [
			new OpenLayers.Strategy.Fixed()
		],
		protocol: new OpenLayers.Protocol.HTTP({
			url: './',
			params: {
				op: 'trains',
				bbox: bbox.toBBOX(),
				id: id
			},
			format: new OpenLayers.Format.GeoJSON()
		}),
		styleMap: new OpenLayers.StyleMap(new OpenLayers.Style({
			externalGraphic: 'img/${icon}.png',
			graphicTitle: '${getTitle}',
			graphicWidth: 20,
			graphicHeight: 14,
//			backgroundGraphic: 'img/bg.png',
			backgroundGraphic: '${getBackground}',
//			backgroundWidth: 100,
			backgroundWidth: '${getBackgroundWidth}',
			backgroundHeight: 12,
			backgroundXOffset: 10,
//			label: '${label}',
			label: '${getLabel}',
			labelAlign: 'lm',
			labelXOffset: 13,
			fontColor: '${getLabelColor}',
			fontSize: '8px',
			labelSelect: true,
			cursor: 'pointer'
		}, {
			context: {
				getBackground: function(feature) {
//					return(feature.layer.map.getZoom() >= 12 ? 'img/bg.png' : '');
					return(((feature.layer.map.getZoom() >= 15) || (ref == feature.attributes.ref)) ? 'img/bg.png' : '');
				},
				getBackgroundWidth: function(feature) {
					return(5 * feature.attributes.label.length);
				},
				getLabel: function(feature) {
//					return(feature.layer.map.getZoom() >= 12 ? feature.attributes.label : '');
					return(((feature.layer.map.getZoom() >= 15) || (ref == feature.attributes.ref)) ? feature.attributes.label : '');
				},
				getLabelColor: function(feature) {
					return((feature.attributes.delay || feature.attributes.remark) ? '#c1121c' : 'black');
				},
				getTitle: function(feature) {
					if (ref) {
					return(feature.layer.map.getZoom() < 15 ? feature.attributes.label : '');
					} else {
						return('Klik voor details');
					}
				}
			}
		}))
	});
	map.addLayer(layerTrains);

	layerTrains.events.register('loadend', layerTrains, function(e) {
		if (trace && ref) {
			for (var i = 0; i < layerTrains.features.length; i++) {
				if (ref == layerTrains.features[i].attributes.ref) {
					var point = layerTrains.features[i].geometry.getCentroid();
					map.moveTo(new OpenLayers.LonLat(point.x, point.y));
/*
					var bounds = map.getExtent().toArray();
					var l = (bounds[0] + ((bounds[0] + bounds[2]) / 2)) / 2;
					var b = (bounds[1] + ((bounds[1] + bounds[3]) / 2)) / 2;
					var r = (bounds[2] + ((bounds[0] + bounds[2]) / 2)) / 2;
					var t = (bounds[3] + ((bounds[1] + bounds[3]) / 2)) / 2;
					if ((point.x < l) || (point.x > r) || (point.y < b) || (point.y > t))
						map.moveTo(new OpenLayers.LonLat(point.x, point.y));
*/
				}
			}
		}

		$('trains').innerHTML = 'Weergegeven treinen: ' + layerTrains.features.length;
		$('loading').style.display = 'none';

		var r = 500 * (11 - map.getZoom()) + 2000;
		if (r < 2000)
			r = 2000;
		if (r > 5000)
			r = 5000;
		tm && clearTimeout(tm);
		tm = setTimeout('layerTrains.refresh()', r);
	});

	var layerTracks = new OpenLayers.Layer.Vector('Tracks', {
		strategies: [
//			new OpenLayers.Strategy.Fixed()
			new OpenLayers.Strategy.BBOX({ ratio: 4 })
		],
		protocol: new OpenLayers.Protocol.HTTP({
//			url: 'tracks.json',
			url: './',
			params: {
				op: 'tracks',
				id: id
			},
			format: new OpenLayers.Format.GeoJSON()
		}),
		styleMap: new OpenLayers.StyleMap({
			'default': {
				strokeWidth: 2,
				strokeColor: 'black',
//				strokeWidth: 8,
//				strokeColor: 'blue',
				strokeOpacity: 0.5,
				pointRadius: 2,
				fillColor: 'black',
				graphicName: 'square'
			}
		})
	});
	map.addLayer(layerTracks);

	if (!map.getCenter()) {
		map.setCenter(loc.transform(
			new OpenLayers.Projection('EPSG:4326'),
			map.getProjectionObject()
		), 11);
	}

	var control = new OpenLayers.Control.SelectFeature(layerTrains, {
		onSelect: function(feature) {
			ref = feature.attributes.ref;
			initTrace(feature.attributes.ref);
			resetIdle();
		}
	});
	map.addControl(control);
	control.activate();

	var updaterTweets = new Ajax.PeriodicalUpdater('tweets', './', {
		method: 'GET',
		frequency: 60,
		parameters: {
			op: 'tweets',
			id: id
		}
	});
}

