/* 	megalandynav.js 
	
	1. Release V 0.5
	1. Update V 0.6
		- ActivStyle und MouseoverStyle eingefügt
	2. Update V 0.7
		- Wenn mit Headline kein Link verknüpft, dann wird direkt der erste Unterpunkt aktiviert
	3. Update V 0.8
		- Neue Tree-Struktur, jetzt beliebig viele Unterebenen
	4. Update V 0.81
		- Fehler bei addItem beseitigt (_length stat _block.length)
	5. Update V 0.82
		- Beschleunigung auf ca. 60% bei IE durch reduzierte Objectreferenzen
	6. Update V 0.85
		- javascript:-Links und absolute Links werden erkannt
	7. Update V 0.9
		- Opera u. NS6 Anpassung, Beschleunigung bei IE4 durch Cachen des Visibility-Status
	
	Copyright 2001 David Bothe (wildpferd.de für is4b köln)
	
	Lizenziert für Hkav.
	
*/


/*
	Ab hier keine Änderungen notwendig
*/

// ============================ fuer 7. Update
// So, jetzt versorgen wir Netscape 4.x mal mit dem, was man in der neuen Browserwelt so braucht
// ============================

if (!document.getElementById) document.getElementById = landyGetElementById;

function landyGetElementById(_layerId) {
	var _layer = null;
	if (document.all) return document.all[_layerId]; // IE4 machts einfach
	if (document.layers) {
		// So, wir machen es uns einfach und vergessen alle moeglichen rekursiven Sachen :-(
		_layer = document.layers[_layerId];
		if (!_layer.style) _layer.style = _layer; // reicht fuer unsere Zwecke so
		return _layer;
	}
	return null;
}


// Caches, damit nicht immer der Style angegeben werden muss (die ".." Geschichte)
var zeit1 = 0;
var zeit2= 0;


var globalItemStyleCache1 = ""; // textStyle
var globalItemStyleCache2 = ""; // textStyleMouseover
var globalItemStyleCache3 = ""; // textStyleActive
var globalHeadStyleCache1 = ""; 
var globalHeadStyleCache2 = "";
var globalHeadStyleCache3 = "";
/*
var NS4 = (document.layers) ? true : false;
var IE4 = (document.all) ? true : false;
*/
function newNav(_id, _top, _left, _spacing, _target) {
	var _nav = new Array;
	_nav.id = _id;
	_nav.top = _top;
	_nav.left = _left;
	_nav.spacing = _spacing;
	_nav.target = _target;
	_nav.addBlock = addBlock;
	_nav.buildNav = buildNav;
	_nav.buildBlock = buildBlock;
	_nav.show = show;
	_nav.mouseover = mouseover;
	return _nav;
}

function buildNav() {
	// Shared Variablen, dürfen kein var davor haben
	_nav = this;
	_html = "";
	_left = _nav.left;
	_currentId = 1;
	//
	for (var _i=0; _i < _nav.length; _i++) {
		var _block = _nav[_i];		
		_block.buildBlock();
	}
	return _html;
}

function buildBlock() {
	var _block = this;
	_block.startId = _currentId; // Damit show später die Items wiederfindet
	for (var _j=0; _j < _block.length; _j++) {
		var _item = _block[_j];
		//alert(_j+" = "+_item.length)
		if (_item.length) {
			_item.buildBlock(); 
		} else {
			_item.id = _currentId;
			_currentId++;
			// Neue Funktion in V 0.7: Wenn Headline, aber kein Link und es ChildItems gibt, dann automatisch ersten aktivieren. Dafür müssen wir den Ziellink übergeben!
			var _activateFirstItem = false;
			if ((_j == 0) && (_item.link == "") && ( (_block.length > 1) && _block[1].link ) ) _activateFirstItem = _block[1].link;
			//
			if (_item.bg) _html += buildDiv(_nav.id, _item.id, _nav.id+_item.id+"bg", "<img src='"+_item.bg+"' border=0>", _item.link, _nav.target, "", _left, _j, ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);
			if (_item.bgActive) _html += buildDiv(_nav.id, _item.id,_nav.id+_item.id+"bgac", "<img src='"+_item.bgActive+"' border=0>", _item.link, _nav.target, "",_left, _j, ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);
			if (_item.bgMouseover) _html += buildDiv(_nav.id, _item.id,_nav.id+_item.id+"bgmo", "<img src='"+_item.bgMouseover+"' border=0>", _item.link, _nav.target, "",_left, _j,  ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);
			if (_item.text) _html += buildDiv(_nav.id, _item.id,_nav.id+_item.id+"text", _item.text, _item.link, _nav.target, _item.textStyle, _left + _item.textXoffset, _j, ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);
			if (_item.textStyleActive) _html += buildDiv(_nav.id,_item.id, _nav.id+_item.id+"textac", _item.text, _item.link, _nav.target, _item.textStyleActive,_left + _item.textXoffset, _j, ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);
			if (_item.textStyleMouseover) _html += buildDiv(_nav.id,_item.id, _nav.id+_item.id+"textmo", _item.text, _item.link, _nav.target, _item.textStyleMouseover,_left + _item.textXoffset, _j, ((_item.bgMouseover || _item.textStyleMouseover) ? _item.id : false), _activateFirstItem);	
		}
	}
	_block.endId = _currentId; // Damit show später die Items wiederfindet
}

function buildDiv(_navId, _itemId, _divId, _text, _link, _target, _textStyle, _left, _item, _mouseover, _activateFirstItem) {
	var _top = 0; // brauchen wir hier noch nicht, weil das bei show gesetzt wird!
	var _html = "";
	_html += "<div id='"+_divId+"' style='position: absolute;  visibility: hidden; top: "+_top+"px; left: "+_left+"px;'>";
	if (_link || (_item == 0) || _mouseover) { // _item == 0 heisst Headline!
			if (_activateFirstItem) {
				// So, wenn unsere neue Funktion genutzt wird, dann verbiegen wir für die Überschrift jetzt den Link und die Aktivierung!
				_link = _activateFirstItem; // Damit auch die Seite zum 1. Unterpunkt kommt
				_itemId++; // Für Highlite-Effekt auf 1. Unterpunkt
			}
			if (!_link) {
				_link = "#";
			} else if (_link.indexOf("http:") == 0) {
				// So, dann ist es ein externer Link!
				_target = "_new";
			} else if (_link.indexOf("javascript:") == 0) {
				_target = "";
			}
			_html += "<a href=\"" + _link + "\"";
			if (_target) _html += " target='"+_target+"' ";
			_html += " onclick='"+_navId+".show("+_itemId+");" + "return " + ((_link == "#") ? "false;'" : "true;' ");
			if (_mouseover) _html += " onmouseover=\""+_navId+".mouseover('"+_mouseover+"', true);\" onmouseout=\""+_navId+".mouseover('"+_mouseover+"', false);\" ";
			_html += ">";
	}
	_html += "<span style='"+_textStyle+"'>"+_text+"</span>";
	if (_link || (_headline == 0) || _mouseover ) _html += "</a>";
	_html += "</div>\n";
	return _html;
}

function addBlock() {
	var _menu = this;
	_menu[_menu.length] = new Array;
	var _block = _menu[_menu.length - 1]; // Tricky, ist ja jetzt einer mehr
	_block.addItem = addItem;
	_block.addHeadline = addHeadline;
	_block.addBlock = addBlock;
	_block.buildBlock = buildBlock;
	_block.showBlock = showBlock;
	return _block;
}

function addHeadline(_text, _link, _textStyle, _bg, _height, _textXoffset, _textYoffset,_bgMouseover, _bgActive, _textStyleMouseover, _textStyleActive) {
	_block = this;
	if (_textStyle == "..") _textStyle = globalHeadStyleCache1;
		else if (_textStyle) globalHeadStyleCache1 = _textStyle;
	if (_textStyleMouseover == "..") _textStyleMouseover = globalHeadStyleCache2;
		else if (_textStyleMouseover) globalHeadStyleCache2 = _textStyleMouseover;
	if (_textStyleActive == "..") _textStyleActive = globalHeadStyleCache3;
		else if (_textStyleActive) globalHeadStyleCache3 = _textStyleActive;
	_block[0] = new setAddItem(_text, _link, _textStyle, _bg, _height, _textXoffset,_textYoffset, _bgMouseover, _bgActive, _textStyleMouseover, _textStyleActive);
}

function addItem(_text, _link, _textStyle, _bg, _height, _textXoffset,_textYoffset, _bgMouseover, _bgActive, _textStyleMouseover, _textStyleActive) {
	_block = this;
	// So, wenn kein Style angegeben wurde, nehmen wir den letzten angegebenen! Nur um Einträge zu sparen!
	if (_textStyle == "..") _textStyle = globalItemStyleCache1;
		else if (_textStyle) globalItemStyleCache1 = _textStyle;	
	if (_textStyleMouseover == "..") _textStyleMouseover = globalItemStyleCache2;
		else if (_textStyleMouseover) globalItemStyleCache2 = _textStyleMouseover;
	if (_textStyleActive == "..") _textStyleActive = globalItemStyleCache3;
		else if (_textStyleActive) globalItemStyleCache3 = _textStyleActive;
	var _length = (_block.length > 0) ? _block.length : 1;
	_block[_length] = new setAddItem(_text, _link, _textStyle, _bg, _height, _textXoffset,_textYoffset, _bgMouseover, _bgActive, _textStyleMouseover, _textStyleActive);
}

function setAddItem(_text, _link, _textStyle, _bg, _height, _textXoffset, _textYoffset, _bgMouseover, _bgActive, _textStyleMouseover, _textStyleActive) {
	this.text = _text;
	this.link = _link;
	this.bg = _bg;
	this.textStyle = _textStyle;
	this.height = _height;
	this.textXoffset = _textXoffset;
	this.textYoffset = _textYoffset;
	this.bgMouseover = _bgMouseover;
	this.bgActive = _bgActive;
	this.textStyleActive = _textStyleActive;
	this.textStyleMouseover = _textStyleMouseover;
	//
	this.visibilityStatus = false;
	this.actVisibilityStatus = false;
	this.topStatus = 0;
}

function show(_itemNr) {
	//startTime();
	// Shared
	_itemNrEndOfBlockBefore = 0;
	_nav = this;
	_top = _nav.top;
	//
	for (var _i=0; _i < _nav.length; _i++) {
		var _block = _nav[_i];
		_block.showBlock(_itemNr, true);			
		_top += _nav.spacing;
	}
}


function showBlock(_itemNr, _headlineShow) {
	var _block = this;
	for (var _j=0; _j < _block.length; _j++) {
		var _item = _block[_j];
		if (_item.length) {
			_item.showBlock(_itemNr, ((_itemNr < _block.endId) && (_itemNr >= _block.startId)) );
		} else {			
			var _newVisibilityStatus = ( ((_itemNr < _block.endId) && (_itemNr >= _block.startId)) || ((_j == 0) && (_headlineShow) ) );
			var _visibility =  _newVisibilityStatus ? "visible" : "hidden"; // Entweder das Item befindet sich in einem Unterpunkt oder es ist eh eine Überschrift
			if (_item.bg) { 
			 //(NS4) ? document.layers[_nav.id+_item.id+"bg"] : document.all(_nav.id+_item.id+"bg").style
				if (_item.visibilityStatus != _newVisibilityStatus) document.getElementById(_nav.id+_item.id+"bg").style.visibility = _visibility ;
				if (_newVisibilityStatus) document.getElementById(_nav.id+_item.id+"bg").style.top = _top;			
			}
			if (_item.bgActive || _item.textStyleActive) { // Es gibt was Actives, was evtl. gezeigt werden sollte ...
				var _newActVisibilityStatus = ( ( (_itemNr < _block.endId) && (_itemNr >= _block.startId) ) && ((_item.id == _itemNr) || (_j == 0))); // Hier nur sichtbar, wenn auch aufgeklappt und Überschritf oder _item
				var _actVisibility =  _newActVisibilityStatus ? "visible" : "hidden";
				if (_item.bgActive) { // Ah, der Hintergruns!
					//_style = (NS4) ? document.layers[_nav.id+_item.id+"bgac"] : document.all(_nav.id+_item.id+"bgac").style
					if (_newActVisibilityStatus) document.getElementById(_nav.id+_item.id+"bgac").style.top = _top;			
					if (_item.actVisibilityStatus != _newActVisibilityStatus) document.getElementById(_nav.id+_item.id+"bgac").style.visibility = _actVisibility;
				}
				if (_item.textStyleActive) { // Ah, der TextStyle!
					//_style = (NS4) ? document.layers[_nav.id+_item.id+"textac"] : document.all(_nav.id+_item.id+"textac").style
					if (_newActVisibilityStatus) document.getElementById(_nav.id+_item.id+"textac").style.top = _top + _item.textYoffset;			
					if (_item.actVisibilityStatus != _newActVisibilityStatus) document.getElementById(_nav.id+_item.id+"textac").style.visibility = _actVisibility;
				}
				if (_item.actVisibilityStatus != _newActVisibilityStatus) _item.actVisibilityStatus = _newActVisibilityStatus;
			}
			if (_item.bgMouseover && (_newVisibilityStatus)) document.getElementById(_nav.id+_item.id+"bgmo").style.top = _top; //(NS4) ? document.layers[_nav.id+_item.id+"bgmo"].top = _top : document.all(_nav.id+_item.id+"bgmo").style.top = _top ;
			if (_item.textStyleMouseover && (_newVisibilityStatus)) document.getElementById(_nav.id+_item.id+"textmo").style.top = _top+ _item.textYoffset ;// (NS4) ? document.layers[_nav.id+_item.id+"textmo"].top = _top + _item.textYoffset : document.all(_nav.id+_item.id+"textmo").style.top = _top+ _item.textYoffset ;
			if (_item.text) { 
				//(NS4) ? document.layers[_nav.id+_item.id+"text"] : document.all(_nav.id+_item.id+"text").style
				if (_item.visibilityStatus != _newVisibilityStatus) document.getElementById(_nav.id+_item.id+"text").style.visibility = _visibility;
				if (_newVisibilityStatus) document.getElementById(_nav.id+_item.id+"text").style.top = _top + _item.textYoffset;
			}

			if (_item.visibilityStatus != _newVisibilityStatus) _item.visibilityStatus = _newVisibilityStatus;
			if (_item.topStatus != _top) _item.topStatus = _top;
//			else alert("Skip Item "+_item.text);
			_top += (_newVisibilityStatus) ? _item.height : 0;
		}
	}
/*	
	if (_block.endId == (_currentId)) {
		stopTime();
	}
*/
	
}

function mouseover(_itemNr, _over) {
			
	var _nav = this;
	//alert(_nav.id+_blockNr+"bg"+ ", "+_over);
	var _visible = (_over) ? "visible" : "hidden";
	//(NS4) ? document.layers[_nav.id+_blockNr+"bg"].visibility = "hidden" : document.all(_nav.id+_blockNr+"bg").style.visibility = "hidden" ;
	// brauchen wir nicht mehr, wir verlassen uns auf den Z-Index, dann wird das verdeckt
	if (document.getElementById(_nav.id+_itemNr+"bgmo")) document.getElementById(_nav.id+_itemNr+"bgmo").style.visibility = _visible;
	if (document.getElementById(_nav.id+_itemNr+"textmo")) document.getElementById(_nav.id+_itemNr+"textmo").style.visibility = _visible;
//		(NS4) ? document.layers[_nav.id+_blockNr+"bgmo"].visibility = "visible" : document.all(_nav.id+_blockNr+"bgmo").style.visibility = "visible" ;
}

// fuer Benchmarking

function startTime() {
	zeit = new Date();
	zeit1 = zeit.getTime()
}

function stopTime() {
//return;
	zeit = new Date();
	zeit2 = zeit.getTime()
	if (zeit1>0) alert((zeit2-zeit1));
	zeit1=0;
}

/////////////// POPUp Funktion

function popUp(_url, _width, _height) {
	open(_url, 'popup', 'width='+_width+',height='+_height+',hotkeys=no,locationbar=no,menubar=no,resizable=no,status=no');
}