// --- BEGIN CONFIG ---

// Navibereich in Pixel
var RANGE_NAVI = new Range (185, 90, 645, 120);
var POINTER_ID = 'navi_level_1_pointer';

// --- END CONFIG ---
//---------------------------------------------------------------------------

var intervalPointer = false;
var d = document;
var offset = (d.all) ? 3 : 1;	// offset in x-Pos., damit man nicht auf den layer klickt


// Internet Explorer unterstützt die vom Node-Interface definierten Konstanten für Knotentypen nicht, daher:
if (!window.Node) {
	var Node = {				
		ELEMENT_NODE : 1,		
		ATTRIBUTE_NODE : 2,	
		TEXT_NODE : 3,			
		COMMENT_NODE : 8,		
		DOCUMENT_NODE : 9,
		DOCUMENT_FRAGMENT_NODE : 11
	}
} 

/**
* rekursiv maskierte E-Mail-Adressen ersetzen (@-Symbol ist durch [at] ersetzt worden);
* Fkt, durchsucht rekursiv den DOM-Baum; wenn aktueller Knoten 'currNode' ein Textknoten
* ist, wird per reg. Ausdruck ein String mit enthaltenem '[at]' gesucht;
* dieser wird durch einen neuen Link-Knoten mit korrektem mailto: ersetzt;
* soll auslesen von Spam-Robots eindämmen
* ACHTUNG: window.Node für IE definieren (siehe oben)
*
* @param object aktueller
* @return object Coord-Objekt
*/
function demaskEmail (currNode) {
	if (!d) var d = document;
	
	if (window.Node && d.createElement) {
		var ta = 0;
		// wenn Textknoten, dann auf maskierte E-Mail-Adresse checken;
		if (3 == currNode.nodeType) {
			// den Text per regEx auf eine maskierte E-Mail-Adresse durchsuchen
			var pattern = /[^\s\?\!,;:]+[\-_\.\w]+\[at\][\-_\.\w]+\.\w+[\s\.\?\!,;:]*/;
			var hits = pattern.exec(currNode.nodeValue);
			
			if (hits) {
				var newEMail = hits[0].replace(/\[at\]/, '@');			// [at] durch @ ersetzen
				newEMail = newEMail.replace(/\s+/g, '');					// überflüssige white spaces entfernen
				
				var nodeMailtoLink = d.createElement("a");				// neuen Mail-Link-Knoten erstellen
				var nodeLinkText = d.createTextNode(newEMail);			// Mailadresse als Textknoten einfügen; Leerzeichen entfernen
				
				var newTextNodeBefore = d.createTextNode(currNode.nodeValue.substr(0, currNode.nodeValue.indexOf(hits[0])) + " ");
				var newTextNodeAfter = d.createTextNode(" " + currNode.nodeValue.substr(currNode.nodeValue.indexOf(hits[0]) + hits[0].length, currNode.nodeValue.length));
				var currParent = currNode.parentNode;
				
				nodeMailtoLink.setAttribute("href", "mailto:" + newEMail);
				nodeMailtoLink.appendChild(nodeLinkText);
				
				currParent.appendChild(newTextNodeBefore);
				currParent.appendChild(nodeMailtoLink);
				currParent.appendChild(newTextNodeAfter);
				
				currNode.nodeValue = "";
			}
		}
		// sonst rekursiv weiter durch DOM-Tree
		else {
			var nodeChildren = currNode.childNodes;
			for (var i = 0; i < nodeChildren.length; i++) {
				demaskEmail (nodeChildren[i]);
			}
		}
	}
}


// Objekt fuer Koordinaten
function Coord (x, y) {
	this.x = (!x) ? 0 : parseInt(x);
	this.y = (!y) ? 0 : parseInt(y);
}

// Objekt fuer einen rechteckigen Bereich
function Range (x1, y1, x2, y2) {
	this.start = new Coord (x1, y1);
	this.end = new Coord (x2, y2);
}


/**
* ermittelt die abs. Position eines Objektes auf der Seite
*
* @param object Objektreferenz
* @return object Coord-Objekt
*/
function getPos (elem) { 
	var pos = new Coord; //{x:0, y:0}; 
	var o = elem; 
	while(o) { 
		pos.y += o.offsetTop; 
		pos.x += o.offsetLeft; 
		o = o.offsetParent; 
	} 
	return pos; 
}

/**
* cross-browser Objekterfassung
*
* @param string Html-ID des zu erfassenden Elements
*/
function crossObj (elemId) {
	// Microsoft IE (ab) Version 4
	if (d.all && d.all[elemId]) {
		this.obj = d.all[elemId];
		this.style = d.all[elemId].style;
		this.offsetHeight = this.obj.offsetHeight;
	}	
	// fuer Browser, die DOM unterstuetzen
	else if (d.getElementById && d.getElementById(elemId)) {
		this.obj = d.getElementById(elemId);
		this.style = d.getElementById(elemId).style;
		this.offsetHeight = this.obj.offsetHeight;
	}
	// Netscape Version 4
	else if (d.layers && d.layers[elemId]) {
		this.obj = d.layers[elemId];
		this.style = d.layers[elemId];
		this.offsetHeight = this.style.document.height;
	}
	else{
		this.obj = false;
		return false;
	}
	// Startposition ermitteln
	this.startPos = (this.startPos) ? this.startPos : getPos(this.obj);
}


/**
* ermittelt, ob sich der Mouse-Zeiger ueber einem definierten
* Bereich "range" befindet
*
* @param object Ereignis
* @param object Range-Objekt
* @return bool true, wenn Mouse ueber Range, osonst false
*/
function isMouseOver (evt, range) {
	var r = range
	var e = evt || window.event;
	if (!e) return null;
	
	var m = mousePos (evt);	
	return (	m.x >= r.start.x &&
				m.x <= r.end.x &&
				m.y >= r.start.y &&
				m.y <= r.end.y
			);
}

/**
* ermittelt aktuelle Mousezeiger-Koordinaten
*
* @param object Ereignis
* @return object Coord-Objekt mit Mouse-Koordinaten
*/
function mousePos(evt) {
	var e = evt || window.event;
	if(!e) return null;
	
	if (d.all ) return new Coord(e.clientX + d.body.scrollLeft, e.clientY + d.body.scrollTop);
	else if (window.opera) return new Coord(e.clientX, e.clientY);
	else if (d.layers) return new Coord(e.pageX, e.pageY);
	else if (d.getElementById) return new Coord(e.pageX , e.pageY );
	else return null;
}


function moveIt (targetX) {
	var timeOut, dist, currPos;
	var currX;
	
	if (d.pointer.style.left) {
		currX = parseInt(d.pointer.style.left);
	}
	else {
		currPos = getPos(d.pointer.obj);
		currX = currPos.x;
	}
	
	// Zeiger ist links vom Ziel (Mousezeiger)
	if (currX < targetX) {
		if (targetX - currX > 60) dist = 12;
		else if (targetX - currX > 30) dist = 7;
		else if (targetX - currX > 5) dist = 3;
		else dist = 1;
	}
	// Zeiger ist rechts vom Ziel (Mousezeiger)
	else if (currX > targetX) {
		if (currX - targetX > 60) dist = -12;
		else if (currX - targetX > 30) dist = -7;
		else if (currX - targetX > 5) dist = -3;
		else dist = -1;
	}
	else dist = 0;
	
	var newX = currX + dist;
	d.pointer.style.left = newX + "px";
	
	if (newX != targetX) {
		d.onthemove = true;
		setTimeout ("moveIt(" + targetX +")", 10);
	}
	else {
		d.pointer.style.left = parseInt(d.pointer.style.left) + offset + "px";
		d.onthemove = false;
	}
}


/**
* initialisiert Zeigerbewegung je nach dem, ob sich der Mousezeiger
* über dem in der Config angegebenen Seitenbereich befindet
*
* @param object Ereignis
* @param object Html-Objekt, welches bewegt werden soll (wird in Fkt. init erstellt)
* @return object Coord-Objekt mit Mouse-Koordinaten
*/
function initMove(evt, obj) {
	if (d.onthemove) return;
	
	var e = evt || window.event;
	if(!e) return null;
	
	if (isMouseOver (evt, RANGE_NAVI)) {
		var currMousePos = mousePos(evt);
		moveIt(currMousePos.x);
	}
	else {
		var currPointerPos = getPos(d.pointer.obj);
		if (d.pointer.startPos.x != currPointerPos.x - offset) moveIt(d.pointer.startPos.x);
	}
}

/**
* initialisiert Event-Capturing und erstellt zu bewegendes Objekt
*
* @param object Ereignis
*/
function init() {
	d.pointer = new crossObj(POINTER_ID);
	//alert(d.pointer);
	if (d.pointer.obj) {
		if (d.captureEvents) d.captureEvents(Event.MOUSEMOVE);
		d.onmousemove = initMove;
	}
	
	// maskierte E-Mail-Adressen ersetzen
	demaskEmail (document);
}

// Initialisierung, wenn komplett geladen
window.onload = init;
