/*
 *  Copyright (C) 2006 Gaubatz Patrick <patrick@gaubatz.at>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

var map;
var fetchData;
var nodes = new Array();
var decMap = new Array();
var node2point = new Array();
var unVerifiedMap = new Array();
var clusterer;
var tooltip;
var fetchBegin;
var loadBegin;
/* var mapCenter = new GLatLng(43.61, 3.87); */
var mapCenter = new GLatLng(43.59, 3.92);
var iconDefault;
var iconDefaultMedium;
var iconDefaultLarge;
var iconBlue;
var iconGrey;
var iconDarkRed;
var iconRed;
var iconWhite;
var iconGreen;
var iconYellow;
var numActiveNodes = 0;
var control;
var geoXml;
var ZonesXml;

function log(msg) {
	if (_useDebug) {
		var date = new Date();
		var tmp = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
		document.getElementById("log").innerHTML += tmp + ": " + msg + "<br>";
		//GLog.write(msg);
	}
}

GMarker.prototype.setOwner = function(node) {
	this.node = node;
}
GMarker.prototype.getOwner = function() {
	return this.node;
}

GLatLng.prototype.latToString = function() {
	return convertCoords(this.lat());
}
GLatLng.prototype.lonToString = function() {
	return convertCoords(this.lng());
}

function MyControl() {
	this.element = document.getElementById("info");

	MyControl.prototype.setHtml = function (html) {
		this.element.innerHTML = html;
	}

	MyControl.prototype.show = function() {
		this.element.style.visibility = "visible";
	}

	MyControl.prototype.hide = function() {
		this.element.style.visibility = "hidden";
	}
}

function onLoad() {
	loadBegin = new Date();

	if(!checkBrowser()) {
		return;
	}
	if (_useDebug) {
		document.getElementById("log").style.visibility = "visible";
	}

	map = new GMap2(document.getElementById("map"), {mapTypes:[G_NORMAL_MAP,G_HYBRID_MAP, G_SATELLITE_MAP]});
	map.enableContinuousZoom();
	map.enableScrollWheelZoom();
	
	// log("Neues GMap2 Objekt wurde erzeugt.");
	log("nouveau GMap2 objet produit.");

	log("Chargement des données...");
	fetchBegin = new Date();
	GDownloadUrl("data.php?format=XML", onData);

	geoXml = new GGeoXml("http://auth.wireless-fr.org/hotspot_status.php?format=KML&network_id=mplwireless");

	ZonesXml = new GGeoXml("http://www.montpellier-wireless.com/googlemaps/zones.kml");

	//	geoXml = new GGeoXml("http://www.montpellier-wireless.com/googlemaps/data.php?format=KML");

	createIcons();

	if (_useClusterer) {
		clusterer = new Clusterer(map);
		log("Nouveau objet Cluster creer.");
		clusterer.maxVisibleMarkers = 100;
	}

	tooltip = document.createElement("div");
	document.getElementById("map").appendChild(tooltip);
	tooltip.style.visibility = "hidden";

	control = new MyControl();

	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
        map.addControl(new GScaleControl()) ;
        map.addControl(new GOverviewMapControl());
	map.setCenter(mapCenter, 12);
	map.setMapType(G_NORMAL_MAP);

	map.addOverlay(geoXml);

	map.addOverlay(ZonesXml);

	GEvent.addListener(map, "click", onMapClick);
	GEvent.addListener(map, "mousemove", onMouseMove);
}

function Link(fromDevice, toDevice, toNode, etx) {
	this.fromDevice = fromDevice;
	this.toDevice = toDevice;
	this.toNode = toNode;
	this.etx = etx;

	Link.prototype.getLinkColor = function() {
		if (this.etx < 1) {
			return "000000";
		} else if (this.etx >= 1 && this.etx < 2) {
			return "00FF00";
		} else if (this.etx >= 2 && this.etx < 3) {
			return "FFFF00";
		} else {
			return "FF0000";
		}
	}

	Link.prototype.isDrawable = function() {
		if (
			this.fromDevice.length &&
			this.toDevice.length &&
			this.toNode.length &&
			this.etx.length
		) {
			return true;
		} else {
			return false;
		}
	}
}

function addToNodeList(name) {
	document.getElementById("nodelist").innerHTML += '<a href="javascript:panToNode(\'' + name + '\', -1)">' + name + '</a><br />';
}

function Node(id, lat, lon, name, nickname, email, address, links, typ, devices, hardware, ip, mac, antenna, last_heartbeat_timestamp) {
	this.id = id;
	this.point = new GLatLng(lat, lon);
	this.name  = name;
	this.email = decrypt(email);
	this.nickname = nickname;
	this.address = decrypt(address);
	this.links = new Array();
	this.overlay = new Array();
	this.windowOpen = false;
	this.markerVisible = false;
	this.linksVisible = true;
	this.devices = devices.split('|');
	this.hardware = hardware;
	this.ip = ip;
	this.mac = mac;
	this.antenna = antenna;
	this.last_heartbeat_timestamp = last_heartbeat_timestamp;
	
	node2point[this.name] = this.point;
	
	addToNodeList(name);

	Node.prototype.showNode = function() {
		if (this.markerVisible) {
			return;
		}
		if (_useClusterer) {
			clusterer.AddMarker(this.marker, this.name);
		} else {
			map.addOverlay(this.marker);
		}
		this.markerVisible = true;
	}

	Node.prototype.hideNode = function() {
		if (!this.markerVisible) {
			return;
		}
		if (_useClusterer) {
			clusterer.removeMarker(this.marker);
		} else {
			map.removeOverlay(this.marker);
		}
		this.markerVisible = false;
	}

	Node.prototype.createLinks = function(str) {
		if (!str.length) {
			return;
		}
		var links = str.split("|");
		while (links.length) {
			var part = links[links.length - 1].split(",");
			this.links.push(new Link(part[0], part[1], part[2], part[3]));
			links.pop();
		}
	}

	Node.prototype.showLinks = function() {
		if (!this.links.length || this.linksVisible) {
			return;
		}
		for (var i = 0; i < this.links.length; i++) {
			if (!this.links[i].isDrawable()) {
				continue;
			}
			var node = this.links[i].toNode;
			var point = node2point[node];
			var color = this.links[i].getLinkColor();
			if (_mSvgEnabled && _mSvgForced) {
				color = "#" + color;
			}
			try {
				this.overlay.push(new GPolyline([this.point, point], color, 2, 0.8));
				map.addOverlay(this.overlay[this.overlay.length - 1]);
			} catch (e) {
				log("Ignoring link: " + this.name + " -> " + node + " (color: " + color + ")");
			}
		}
		this.linksVisible = true;
	}

	Node.prototype.hideLinks = function() {
		if (_showAllLinks) {
			return;
		}
		for (var i = 0; i < this.overlay.length; i++) {
			map.removeOverlay(this.overlay[i]);
		}
		this.linksVisible = false;
	}
	
		this.createLinks(links);
	
	var icon = iconDefault;
	if (typ == 'unverified') {
	  icon = iconWhite;
	  unVerifiedMap.push(id);
	} else if (typ == 'inactive') {
	  icon = iconRed ; // iconGrey
	} else if (typ == 'setup') {
		icon = iconYellow; //FIX THIS!
	} else {	
		/*	
		if (this.devices.length > 1 && this.devices.length < 5) {
			icon = iconDefaultMedium;
		} else if (this.devices.length > 4) {
			icon = iconDefaultLarge;
		}
		*/
	  icon = iconGreen;
		numActiveNodes++;
	}
	
	this.marker = new GMarker(this.point, icon);
	this.marker.tooltip = name;	

	GEvent.addListener(this.marker, "click", onMarkerClick);
	GEvent.addListener(this.marker, "infowindowclose", onMarkerClose);
	GEvent.addListener(this.marker, "mouseout", onMarkerOut);
	GEvent.addListener(this.marker, "mouseover", onMarkerOver);

	this.marker.setOwner(this);
	this.showNode();
	if (_showAllLinks) {
		this.showLinks();
	}
}

function checkBrowser() {
	if (GBrowserIsCompatible()) {
		return true;
	} else {
		var html = '<center><h3 style="color:red">';
		html += 'Votre navigateur n est malheureusement pas compatible avec Google Maps API!</h3>';
		html += 'Le navigateur conseillé est : '
		html += '<a href="http://www.mozilla.com/firefox/">http://www.mozilla.com/firefox/</a></center>';
		document.getElementById("map").innerHTML = html;
		return false;
	}
}

function createIcons() {
	iconDefault = new GIcon();
	iconDefault.image = "img/marker.png";
	iconDefault.shadow = "img/marker_shadow.png";
	iconDefault.iconSize = new GSize(12, 20);
	iconDefault.shadowSize = new GSize(22, 20);
	iconDefault.iconAnchor = new GPoint(6, 20);
	iconDefault.infoWindowAnchor = new GPoint(5, 1);

	iconBlue = new GIcon(iconDefault);
	iconBlue.image = "img/marker_blue.png";

	iconGrey = new GIcon(iconDefault);
	iconGrey.image = "img/marker_grey.png";

	iconDarkRed = new GIcon(iconDefault);
	iconDarkRed.image = "img/marker_darkred.png";

	iconRed = new GIcon(iconDefault);
	iconRed.image = "img/marker_red.png";

	iconWhite = new GIcon(iconDefault);
	iconWhite.image = "img/marker_white.png";
	
	iconGreen = new GIcon(iconDefault);
	iconGreen.image = "img/marker_green.png";

	iconYellow = new GIcon(iconDefault);
	iconYellow.image = "img/marker_yellow.png";
	
	iconDefaultMedium = new GIcon(iconDefault);
	iconDefaultMedium.image = "img/marker_white.png";
	
	iconDefaultLarge = new GIcon(iconDefault);
	iconDefaultLarge.image = "img/marker_blue.png";
}

function showTooltip(marker) {
	tooltip.innerHTML = '<div id="tooltip">' + marker.tooltip + '</div>';
	var point  = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
	var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor = marker.getIcon().iconAnchor;
	var width  = marker.getIcon().iconSize.width;
	var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width, -offset.y + point.y + anchor.y));
	pos.apply(tooltip);
	tooltip.style.visibility = "visible";
}

function onMouseMove(point) {
	document.getElementById("latitude").innerHTML = convertCoords(point.lat());
	document.getElementById("longitude").innerHTML = convertCoords(point.lng());
}

function panToCenter() {
	map.panTo(mapCenter);
}

function convertCoords(x) {
	var deg = Math.floor(x);
	var min = (x - deg) * 60;
	var sec = (min - Math.floor(min)) * 60;
	return deg + "° " + Math.floor(min) + "' " + sec.toFixed(0) + "\"";
}

function onMarkerClick() {
	var node = this.getOwner();
	node.windowOpen = true;

	var html = '';
	html += '<div class="marker">';
	html += '<table>';
	html += '<tr><td><b>Nom:</b></td><td>' + node.name + ' <small>(<a href="/wikini/wakka.php?wiki=Node' + node.name + '" target="_blank">Infos</a>)</small></td></tr>';
	html += '<tr><td><b>Lat.:</b></td><td>' + node.point.latToString() + '</td></tr>';
	html += '<tr><td><b>Lon.:</b></td><td>' + node.point.lonToString() + '</td></tr>';
	if (node.nickname) {
		html += '<tr><td><b>Pseudo:</b></td><td>' + node.nickname + '</td></tr>';
	}
	if (node.address) {
		html += '<tr><td><b>Adresse:</b></td><td>' + node.address + '</td></tr>';
	}
	if (node.email) {
		html += '<tr><td><b>E-Mail:</b></td><td><a href="mailto:' + node.email + '">' + node.email + '</a></td></tr>';
	}
	if (node.hardware) {
		html += '<tr><td><b>Mat&eacute;riel:</b></td><td>' + node.hardware + '</td></tr>';
	}
	if (node.ip) {
		html += '<tr><td><b>IP:</b></td><td>' + node.ip + '</td></tr>';
	}
	if (node.mac) {
		html += '<tr><td><b>Mac:</b></td><td>' + node.mac + '</td></tr>';
	}
	if (node.antenna) {
		html += '<tr><td><b>Antenne:</b></td><td>' + node.antenna + '</td></tr>';
	}
	html += '</table>';
	html += '</div>';

	var detail = '';
	detail += '<div class="marker"><center>';
	detail += '<table>';
	detail += '<tr><td><b>Dispositifs (' + node.devices.length + '):</b></td><td>&nbsp;</td></tr>';
	for (var i = 0; i < node.devices.length; i++) {
		detail += '<tr><td><a href="http://' + node.devices[i] + '.montpellier.fw" target="_blank">' + node.devices[i] + '</a></td></tr><tr><td></td></tr>';
	}
	detail += '<tr><td>&nbsp;</td><td>&nbsp;</td></tr>';
	detail += '<tr><td>Dernier heartbeat</td><td>' + node.last_heartbeat_timestamp + '</td></tr>';
	detail += '<tr><td><b>Liens (' + node.links.length + '):</b></td><td><b>ETX:</b></td></tr>';
	if (!node.links.length) {
		detail += '<tr><td><i>none</i></td></tr>';
	} else {
		var sum = 0;
		for (var i = 0; i < node.links.length; i++) {
			var link = node.links[i];
			sum += parseFloat(link.etx);
			detail += '<tr><td>';
			detail += '<a href="javascript:panToNode(\'' + link.toNode + '\', \'' + node.id + '\')">' + link.toDevice + '</a></td>';
			detail += '<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color:black; color:#' + link.getLinkColor() + '">' + link.etx + '</span>';
			detail += '</td></tr>';
		}
		detail += '<tr><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td><b>&Oslash;</b></td><td>';
		var tmp = new Link('','','',(sum / node.links.length).toFixed(2));
		detail += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color:black; color:#' + tmp.getLinkColor() + '">' + tmp.etx + '</span>';
		detail += '</td></tr>';
	}
	detail += '</table>';
	detail += '</center></div>';

	this.openInfoWindowTabsHtml([
		new GInfoWindowTab("Noeud", html), 
		new GInfoWindowTab("Detail", detail)
	]);
	node.showLinks();

}

function onMarkerClose() {
	this.getOwner().hideLinks();
	this.getOwner().windowOpen = false;
}

function onMarkerOver() {
	showTooltip(this);
	if (this.getOwner().windowOpen || _showAllLinks) {
		return;
	}
	this.getOwner().showLinks();
}

function onMarkerOut() {
	tooltip.style.visibility = "hidden";
	if (this.getOwner().windowOpen || _showAllLinks) {
		return;
	}
	this.getOwner().hideLinks();
}
/*
function onMapClick(clickedOverlay, point) {
	if (clickedOverlay) {
		return;
	}

	var marker = new GMarker(point, iconBlue);
	GEvent.addListener(marker, "infowindowclose", function() {
		map.removeOverlay(this);
	});
	GEvent.addListener(marker, "click", function() {
		var p = new GLatLng(this.getPoint().lat(), this.getPoint().lng());
		var html = '';
		html += '<center><b>Neuer Node:</b></center><br/>';
		html += '<div class="marker">';
		html += '<table>';
		html += '<tr><td><b>Lat.:</b></td><td>' + p.latToString() + '</td></tr>';
		html += '<tr><td><b>Lon.:</b></td><td>' + p.lonToString() + '</td></tr>';
		html += '<tr><td>&nbsp;</td><td><a href="javascript:registerNode(\'' + p.lat() + '\', \'' + p.lng() + '\')">neuen Node registrieren...</a></td></tr>';
		html += '</table>';
		html += '</div>';
		html += '<span id="registerbox"></span>';
		this.openInfoWindowHtml(html);
	});
	map.addOverlay(marker);
	GEvent.trigger(marker, "click");
}

function registerNode(lat, lon) {
	if (map.getZoom() < 15) {
		alert("Ein \"vernünftiger\" Zoom-Level wird nun geladen...");
		map.setCenter(new GLatLng(lat, lon));
		map.setZoom(16);
	} else {
		//window.open("register.php?lat=" + lat + "&lon=" + lon);
		document.getElementById("registerbox").innerHTML = "<br>hallo!";
	}
}
*/

function onMapClick(clickedOverlay, point) {
	if (clickedOverlay) {
		return;
	}

	var marker = new GMarker(point, iconBlue);
	GEvent.addListener(marker, "infowindowclose", function() {
		map.removeOverlay(this);
	});
	GEvent.addListener(marker, "click", function() {
		var p = new GLatLng(this.getPoint().lat(), this.getPoint().lng());
		var html = '';
		html += '<center><b>Cr&eacute;ation Nouveau Noeud</b></center><br/>';
		html += '<div class="marker">';
		html += '<table>';
		html += '<tr><td><b>Lat.:</b></td><td>' + p.latToString() + '</td></tr>';
		html += '<tr><td><b>Lon.:</b></td><td>' + p.lonToString() + '</td></tr>';
		html += '<tr><td>&nbsp;</td><td><a href="javascript:registerNode(\'' + p.lat() + '\', \'' + p.lng() + '\')">Enregistrement...</a></td></tr>';
		html += '</table>';
		html += '</div>';
		html += '<span id="registerbox"></span>';
		this.openInfoWindowHtml(html);
	});
	map.addOverlay(marker);
	GEvent.trigger(marker, "click");
}

function registerNode(lat, lon) {
	if (map.getZoom() < 15) {
		alert("Un niveau de zoom plus adapté va être chargé...");
		map.setCenter(new GLatLng(lat, lon));
		map.setZoom(16);
	} else {
		//window.open("register.php?lat=" + lat + "&lon=" + lon);
		map.disableInfoWindow();
		map.enableInfoWindow();

		var html = '';
		html += '<form name="registernode" action="#" method="POST" onsubmit="return onRegisterNodeSubmit()">';
		html += '<table>';
		html += '<tr><td><b>Pseudo</b></td><td><input type="text" maxlen="255" name="nickname" /></td></tr>';
		html += '<tr><td><b>Nom</b></td><td><input type="text" maxlen="255" name="realname" /></td></tr>';
		html += '<tr><td><b>Email</b></td><td><input type="text" maxlen="255" name="email" /></td></tr>';
		html += '<tr><td><b>Mot de passe</b></td><td><input type="password" maxlen="255" name="password" /></td></tr>';
		/* html += '<tr><td>&nbsp;</td><td><a href="register.php" target="_blank">Pas encore enregistré ?</a></td></tr>'; */
		/* html += '<tr><td>&nbsp;</td><td>&nbsp;</td></tr>'; */
		html += '<tr><td><b>Nom du noeud</b></td><td><input type="text" maxlen="255" name="nodename" /></td></tr>';
		html += '<tr><td><b>Mat&eacute;riel</b></td><td><textarea name="hardware" cols="20" rows="3"></textarea></td></tr>';
		html += '<tr><td><b>Mac</b></td><td><input name="mac" type="text" maxlen="20"></td></tr>';
		html += '<tr><td><b>Antenne</b></td><td><input name="antenna" type="text" maxlen="32"></td></tr>';

		/*
		html += '<tr><td>Straße:</td><td><input type="text" maxlen="255" name="street" /></td></tr>';
		html += '<tr><td>Hausnummer:</td><td><input type="text" maxlen="15" name="housenumber" /></td></tr>';
		html += '<tr><td>PLZ:</td><td><input type="text" maxlen="10" name="zip" /></td></tr>';
		html += '<tr><td>Ort:</td><td><input type="text" maxlen="255" name="town" /></td></tr>';
		*/

		html += '<tr><td></td><td><input type="submit" value="Enregistrer..." /><input type="reset" onclick="document.getElementById(\'newnode\').style.visibility=\'hidden\';" value="Annuler" /></td></tr>';
		html += '<input type="hidden" name="lat" value="' + lat + '" />';
		html += '<input type="hidden" name="lon" value="' + lon + '" />';
		html += '</table>';
		html += '</form>';

		var e = document.getElementById("newnode");
		var x = getWindowWidthHeight();
		e.innerHTML = html;
		e.style.top = ((x['height'] / 2) - 125) + "px";
		e.style.left = ((x['width'] / 2) - 140) + "px";
		e.style.visibility = "visible";
	}
}

function onRegisterNodeSubmit() {
	var e = document.registernode;
	//if (!e.nickname.value || !e.password.value || !e.nodename.value || !e.street.value || !e.housenumber.value || !e.zip.value || !e.town.value) {
	if (!e.nickname.value || !e.password.value || !e.nodename.value) {
		alert("Tous les champs doivent être remplis !");
		return false;
	}
	var url = 'registernode.php?';
	url += 'nickname='  + e.nickname.value;
	url += '&realname='  + decrypt(e.realname.value);
	url += '&password=' + MD5(e.password.value);
	url += '&nodename=' + e.nodename.value;
	url += '&lat='      + e.lat.value;
	url += '&lon='      + e.lon.value;
	url += '&hardware=' + e.hardware.value;
	url += '&mac='      + e.mac.value;
	url += '&antenna='  + e.antenna.value;

	url = encodeURI(url);

	GDownloadUrl(url, function(data, responseCode) {
		if (responseCode < 200 || responseCode > 299) {
			return alert("Erreur : Impossible de charger les données !\n(Code serveur : " + responseCode + ")");
		}
		var success = parseInt(data.substr(0, 1));
		data = data.substr(1);
		data = unescape(data);

		if (success) {
			document.getElementById("newnode").style.visibility = 'hidden';
		}

		alert(data);

		if (success) {
			window.location.reload();
		}
	});
	return false;
}

function onData(data, responseCode) {
	if (responseCode < 200 || responseCode > 299) {
		return alert("Erreur : Impossible de charger les données !\n(Code serveur : " + responseCode + ")");
	}
	fetchData = data;
	var fetchEnd = new Date();
	log("Die Daten wurden in " + (fetchEnd-fetchBegin) + "ms erfolgreich geladen.");
	createNodes();
}

function createNodes() {
	var xmlData = GXml.parse(fetchData);
	var element = xmlData.getElementsByTagName("node");
	log("Die Node Objekte werden erzeugt...");
	var start = new Date();
	for (var i = 0; i < element.length; i++) {
		var name = element[i].getAttribute("name");
		var nickname = element[i].getAttribute("nickname");
		var lat  = parseFloat(element[i].getAttribute("lat"));
		var lon  = parseFloat(element[i].getAttribute("lon"));
		var email = element[i].getAttribute("email");
		var address = element[i].getAttribute("address");
		var realname = element[i].getAttribute("realname");
		var links = element[i].getAttribute("links");
		var typ = element[i].getAttribute("type");
		var devices = element[i].getAttribute("devices");
		var hardware = element[i].getAttribute("hardware");
		var ip = element[i].getAttribute("ip");
		var mac = element[i].getAttribute("mac");
		var antenna = element[i].getAttribute("antenna");
		var last_heartbeat_timestamp = element[i].getAttribute("last_heartbeat_timestamp");

		if (
			(typ == 'unverified' && _showUnverifiedNodes) ||
			(typ == 'active'     && _showActiveNodes)     ||
			(typ == 'inactive'   && _showInactiveNodes)   ||
			(typ == 'setup'      && _showSetupNodes)   
		) {
		  nodes.push(new Node(i, lat, lon, name, nickname, email, address, links, typ, devices, hardware, ip, mac, antenna, last_heartbeat_timestamp));
		}
	}
	var end = new Date();
	log(nodes.length + " Nodes wurden erzeugt in " + (end-start) + "ms.");
	var loadEnd = new Date();
	log("GoogleMap wurde vollständig geladen in " + (loadEnd-loadBegin) + "ms.");
	document.getElementById("nodesinfo").innerHTML = '<b>' + nodes.length + '</b>, dont <b>' + numActiveNodes + '</b> actifs.<br /><br />';
}

function hideNodes() {
	for (var i = 0; i < nodes.length; i++) {
		nodes[i].hideNode();
	}
}

function showNodes() {
	for (var i = 0; i < nodes.length; i++) {
		nodes[i].showNode();
	}
}

function getNodeByName(name) {
	for (var i = 0; i < nodes.length; i++) {
		if (nodes[i].name == name) {
			return nodes[i];
		}
	}
}

function getNodeById(id) {
	return nodes[id];
}

function panToNode(name, fromNodeId) {
	var node = getNodeByName(name);
	if (!node) {
		log("\"" + name + "\": Node existiert nicht...");
		return;
	}
	GEvent.addListener(map, "moveend", function() {
		GEvent.clearListeners(map, "moveend");
		map.setCenter(node.point);
	});
	if (fromNodeId != -1) {
		GEvent.trigger(getNodeById(fromNodeId).marker, "infowindowclose");
	}
	GEvent.trigger(node.marker, "click");
}

function zoomToNode(name, fromNodeId) {
	panToNode(name, fromNodeId);
	var newZoom = map.getZoom() + 2;
	setTimeout("map.setZoom(" + newZoom + ")", 700);
}

function decrypt(str) {
	if (!decMap.length) {
		initDecryption();
	}
	if (!str.length) {
		return;
	}
	var s = "";
	for (i = 0; i < str.length; i++) {
		var b = str.charAt(i);
		s += ((b >= 'A' && b <= 'Z') || (b >= 'a' && b <= 'z') ? decMap[b] : b);
	}
	return s;
}

function initDecryption() {
	var s = "abcdefghijklmnopqrstuvwxyz";
	for (i = 0; i < s.length; i++) {
		decMap[s.charAt(i)] = s.charAt((i + 13) % 26);
	}
	for (i = 0; i < s.length; i++) {
		decMap[s.charAt(i).toUpperCase()] = s.charAt((i + 13) % 26).toUpperCase();
	}
}

function showUnVerified() {
	for (var i = 0; i < unVerifiedMap.length; i++) {
		nodes[unVerifiedMap[i]].showNode();
	}
}

function hideVerified() {
	for (var i = 0; i < unVerifiedMap.length; i++) {
		nodes[unVerifiedMap[i]].hideNode();
	}
}

function setMaxNumMarkers(val) {
	if (!_useClusterer) {
		return;
	}
	if (val < 1) {
		val = 150;
	}
	if (val == clusterer.maxVisibleMarkers) {
		return;
	}
	clusterer.maxVisibleMarkers = val;
	log("Zeige maximal " + clusterer.maxVisibleMarkers + " Markers auf dem Kartenausschnitt.");
	ClustererDisplay(clusterer);
}

function getWindowWidthHeight() {
	var x = new Array();
	if (self.innerHeight) {
		x['width'] = self.innerWidth;
		x['height'] = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		x['width'] = document.documentElement.clientWidth;
		x['height'] = document.documentElement.clientHeight;
	} else if (document.body) {
		x['width'] = document.body.clientWidth;
		x['height'] = document.body.clientHeight;
	}
	return x;
}

