/* * Navigation und Menüs BerlinOnline.de + Berlin.de * * Autor: Tom Anheyer (BerlinOnline GmbH & Co. KG) * Email: tom.anheyer@berlinonline.de * * Wiederverwendung und Verbesserungsvorschläge erwünscht * * Code sollte mit allen W3C kompatiblen Browsern, MS Internet Explorer * und Netscape 4.xx auf allen Plattformen laufen.  *  * Probleme:  *   - IE auf dem MAC ist langsam und verlängert unsinnig das Dokument *   - Konqueror und setTimeout() klappt nur manchmal *   - Konqueror liest die Postionen der Menü Anker nicht richtig *   - Opera hat Probleme mit CSS position fixed und funktioniert *     nur einigermaßen wenn er sich als Opera identifiziert *   - Opera macht kein Highlighting im Pulldown-Menü *   - NS4 benutzt die Stylesheets nur sehr eingeschänkt und scheint teilweise *     interne Strukturen zu zerstören (z.B. unvollständiges images-array) */var bo_ns4 = (document.layers) ? 1 : 0;		/* NS 4 */var bo_w3  = (document.getElementById) ? 1 : 0;	/* NS 6, newer IE versions */var bo_ie  = (document.all) ? 1 : 0;var bo_move = 0;var bo_static = 0;var bo_init = 0;var bo_navi_initialized = false;/*w = window.open('','debug','width=400,height=200');var dbg = w.document;dbg.open('text/plain');function debug(msg) { dbg.writeln(msg+"<br>"); }*/function bo_shownavi(e) {  if ("undefined" == typeof (bo_navi)) return;  var obj = null;  var inside = true;  if (! bo_ns4) {    if ("undefined" == typeof e) {      if ("undefined" == typeof window.event) {	bo_shownavi1();	return;      }      e = window.event;    }    if ("undefined" != typeof e.toElement)      obj = e.toElement;    if ("undefined" != typeof e.currentTarget)      obj = e.currentTarget;    for (; obj; obj=obj.parentNode) {      inside = false;      if (obj == bo_navi) {	inside = true;	break;      }    }    if (! inside) return;  }  bo_shownavi1();}function bo_shownavi1() {  window.clearTimeout (bo_move);  bo_pd_hide_all();  if (bo_ns4)    var left = bo_navi.left;  else    var left = parseInt(bo_navi.style.left);  if (left >= 0) return;  left -= (Math.round(left*0.2) + 1);  if (bo_ns4)    bo_navi.left = left;  else    bo_navi.style.left = left;  bo_move = setTimeout("bo_shownavi1()", 20);}function bo_hidenavi(e) {  if ("undefined" == typeof bo_navi) return;  if (! bo_ns4) {    if ("undefined" == typeof e) {      if ("undefined" == typeof window.event) {	clearTimeout (bo_move);	bo_move = setTimeout ("bo_hidenavi1();", 900);	return;      }      e = window.event;    }    if ("undefined" != typeof e.toElement)      var obj = e.toElement;    if ("undefined" != typeof e.relatedTarget)      var obj = e.relatedTarget;    for (; obj; obj=obj.parentNode) {      if (obj==bo_navi) {	return;      }    }  }  clearTimeout (bo_move);  bo_move = setTimeout ("bo_hidenavi1();", 900);}function bo_hidenavi1() {  clearTimeout (bo_move);  if (bo_ns4)    var left = bo_navi.left;  else    var left = parseInt(bo_navi.style.left);  if ((bo_navwidth+left) <= 0) return;  left -= Math.round((bo_navwidth+left)*0.2) + 1;  if (bo_ns4)    bo_navi.left = left;  else    bo_navi.style.left = left;  bo_move = setTimeout('bo_hidenavi1()', 20); }function bo_navi_openclose() {  var left = (bo_ns4) ? bo_navi.left : parseInt(bo_navi.style.left);  if ((bo_navwidth+left) <= 0)    bo_shownavi1();  else    bo_hidenavi1();}function bo_fadein() {  clearTimeout (bo_move);  if (bo_ns4)    var left = bo_navi.left;  else    var left = parseInt(bo_navi.style.left);  if ((bo_navwidth+left) >= 0) return;  left += 2;  if (bo_ns4)    bo_navi.left = left;  else    bo_navi.style.left = left;  bo_move = setTimeout('bo_fadein()', 100); }function bo_staticnavi() {  if (typeof bo_navi == "undefined") return;  if (bo_ie) {    bo_navi.style.top = document.body.scrollTop < bo_navtop ? bo_navtop : document.body.scrollTop;  } else if (bo_w3) {    clearTimeout (bo_static);    bo_static = setTimeout('bo_staticnavi()', 100);    bo_navi.style.top = pageYOffset < bo_navtop ? bo_navtop-pageYOffset : 0;  } else if (bo_ns4) {    clearTimeout (bo_static);    bo_static = setTimeout('bo_staticnavi()', 100);    bo_navi.top = pageYOffset < bo_navtop ? bo_navtop : pageYOffset;  }}function bo_initnavi() {  clearTimeout (bo_init);  if (typeof bo_navi == "undefined") {    bo_init = setTimeout("bo_initnavi()", 500);    return;  }  bo_initnavi1();}function bo_initnavi1() {  if (bo_navi_initialized) return;  bo_navi_initialized = true;  if (typeof bo_navi.addEventListener != "undefined") {//    bo_navi.addEventListener ("mouseover", bo_shownavi, true);    bo_navi.addEventListener ("mouseout", bo_hidenavi, true);  } else {//    bo_navi.onmouseover = bo_shownavi;    bo_navi.onmouseout = bo_hidenavi;  }  if (bo_ie)    document.body.onscroll = bo_staticnavi;  else if (bo_w3)//    window.onscroll = bo_staticnavi;    bo_static = setTimeout("bo_staticnavi()", 1000);  if (bo_ns4)    bo_static = setTimeout("bo_staticnavi()", 1000);  bo_fadein();}if ("undefined" != typeof bo_navi) {  bo_initnavi1();} else {  setTimeout("bo_initnavi();", 500);}/////////////////////////////////////////////////////// Menüs für die horizontale Navigation/////////////////////////////////////////////////////var bo_pd_store = new Array();		// Speicher für gerade sichtbare Menüsvar bo_pd_active_item = null;		// aktiver Menüpunkt//  menu object definieren//// id - id des menu-layers// node - DOM Object des menu-layers// anchor - Anker DOM Node des menu-layersfunction bo_pd (id, node, anchor){  this.id = id;  this.node = node;  this.anchor = anchor;}// objekt für menüitem definition//// inner - anker html// href - link url// sub - id des zu öffnenden submenüsfunction bo_item (inner, href, sub ){  this.inner = inner;  this.href = href;  this.sub = sub;}// Menüpunkt aktivieren/deaktivierenfunction bo_pd_activate(item,active){  if (typeof document.layers == "undefined") {    item.className = active ? "bopdactive" : "bopdinactive";  } else {    if (active) {      item.backgroundColor = "#426fd4";      item.color = "#ffffff";    } else {      item.backgroundColor = "#f0f5fb";      item.color = "#000000";    }  }  bo_pd_active_item = active ? item : null;}// einzelnes Menü verstecken//// menu - bo_pd menü objektfunction bo_pd_do_hide (menu){  if (bo_ns4) {    menu.node.visibility = "hide";  } else {    menu.node.style.visibility = "hidden";  }  bo_pd_activate (menu.anchor, false);}// alle menüs versteckenfunction bo_pd_hide_all (event){  if (bo_pd_active_item)    bo_pd_activate (bo_pd_active_item, false);  for (var i=0; i<bo_pd_store.length; i++)    bo_pd_do_hide (bo_pd_store[i]);  bo_pd_store = new Array();}// Menü bedingt bei mouseover öffnen//// anchor - anchor dom node// name - id des zu öffnenden menüsfunction bo_pd_over(anchor,name){  if (typeof bo_pd_store != "undefined" && bo_pd_store.length > 0)    bo_pd_show(anchor,name);}// Menü an der anker position öffnen//// anchor - anchor dom node// name - id des zu öffnenden menüsfunction bo_pd_show(anchor,name){  var menu = null;  var ax = 0;  var ay = 0;  var ayo = 19;  if (name == null) {    // keine Argumente    name = bo_pd_to_show;    anchor = bo_pd_to_show_anchor;  } else {    // Argumente merken    bo_pd_to_show = name;    bo_pd_to_show_anchor = anchor;  }  if (name == null)    return true;      // Nicht anzuzeigende Menüs ausblenden  var na = name.split("-");  var test = new Array();  var temp = new Array();  for (var i=0; i<bo_pd_store.length; i++) {    test[test.length] = na[i];    var x = test.join ("-");    if (x == bo_pd_store[i].id) {      temp[i] = bo_pd_store[i];    } else {      // ab der position alte menüs verstecken und neue anzeigen      for ( ; i < bo_pd_store.length; i++) {	bo_pd_do_hide (bo_pd_store[i]);      }      break;    }  }  bo_pd_store = temp;  if (bo_pd_store.length == 0 || bo_pd_store[bo_pd_store.length - 1].id != name) {    if (typeof bo_navi != "undefined")      bo_hidenavi1();    // Anker Position feststellen    if (bo_ns4) {      ax = anchor.x;      ay = anchor.y;      if (bo_pd_store.length > 0) {	ax += bo_pd_store[bo_pd_store.length - 1].node.pageX;	ay += bo_pd_store[bo_pd_store.length - 1].node.pageY;      }    } else {      ayo = anchor.offsetHeight;      for (var obj=anchor; obj != null; obj = obj.offsetParent) {	ay += parseInt(obj.offsetTop);	ax += parseInt(obj.offsetLeft);      }    }    if (name.match(/-/)) {      ax += bo_pd_width - 1;	// Submenü    } else {      ay += ayo - 3;		// Pulldown    }    // Neues Menü anzeigen    if (typeof document.getElementById != "undefined") {      var node = document.getElementById(name);      if (node != null) {	menu = new bo_pd (name, node, anchor);	with (node.style) { left = ax; top = ay; width = bo_pd_width; visibility = "visible"; zindex = 10 + bo_pd_store.length; }      }    } else if (typeof document.all != "undefined") {      var node = document.all.name;      if (node != null) {	menu = new bo_pd (name, node, anchor);	with (node.style) { left = ax; top = ay; width = bo_pd_width; visibility = "visible"; zindex = 10 + bo_pd_store.length; }      }    } else if (typeof document.layers != "undefined") {      var node = document.layers[name];      if (node != null) {	menu = new bo_pd (name, node, anchor);	with (node) { left = ax; top = ay; visibility = "show"; zIndex = 10 + bo_pd_store.length; }      }    }    if (menu != null) {      bo_pd_store[bo_pd_store.length] = (menu);      if (typeof document.captureEvents != "undefined") {	document.captureEvents(Event.MOUSEUP);	document.onmouseup = bo_pd_hide_all;      } else {	document.body.onmouseup = bo_pd_hide_all;      }    }  }  return false;}// aktuellen menüpunkt aktivieren und submenüs ein- und ausblenden//// anchor - anchor dom node// sub - anzuzeigendes menüfunction bo_pd_highlite(anchor,sub){  if (bo_pd_active_item)    bo_pd_activate (bo_pd_active_item, false);  if (bo_pd_store.length > 1) {    for (var i=1; i<bo_pd_store.length; i++) {      bo_pd_activate(bo_pd_store[i].anchor, true);    }  }  bo_pd_show(anchor, sub);  bo_pd_activate (anchor, true);}function MM_reloadPage(init){  if (init==true)     with (navigator) {    if ((appName=="Netscape")&&(parseInt(appVersion)==4))      {	document.MM_pgW=innerWidth; document.MM_pgH=innerHeight;	onresize=MM_reloadPage;      }  } else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH)    location.reload();}// Menüs initialisierenvar bo_pd_initialized = false;function bo_pd_init(){  if (bo_pd_initialized)    return;  var bo_use_div = (typeof document.all != "undefined" || typeof document.getElementById != "undefined" );  var mhtml = "";  for (var i in bo_pd_def) {    if (bo_use_div)      mhtml += '<div id="'+i+'" style="position:absolute;width:'+bo_pd_width+'px;visibility:hidden;z-index:10;color:#000000;background:#f0f5fb;">';    else      mhtml += '<layer name="'+i+'" visibility="hidden" top="0" left="0" width="'+bo_pd_width+'" z-index="10">';    mhtml +='<table width="100%" cellspacing="0" cellpadding="1" border="0" bgcolor="white"><tr><td>'+      '<table width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="#f0f5fb">';    for (var j=0; j<bo_pd_def[i].length; j++) {      with (bo_pd_def[i][j]) {	var hsub = (typeof sub != "undefined") ? sub : i;	var right = (typeof sub != "undefined") ? '»' : '&nbsp;';	if (href.match(/^https?:\/\//)) {	  var target = 'target="_self"';	  var onclick = 'onclick="window.open(\''+href+'\',\'_self\',\'\')"';	  inner += '<img src="/.img/ml/link_extern.gif" alt="" width="12" height="11" border="0">';	  	  var xhref = href;	} else {	  var target = 'target="_self"';	  var onclick = 'onclick="location.href=\''+href+'\'"';	  var xhref = location.protocol + '//' + location.host + href;	}	if (bo_use_div) {	  mhtml += '<tr class="bopdinactive" '+onclick+' onmouseover="bo_pd_highlite(this,\''+hsub+	    '\'); window.status=\''+xhref+'\'; return true;"><td>'+inner+'</td><td align="right">'+right+'</td></tr>';	} else {	  mhtml += '<tr class="bopdinactive"><td><a target="_self" class="bopdanchor" '+	    'onmouseover="bo_pd_highlite(this,\''+hsub+'\'); window.status=\''+xhref+'\'; return true;" '+	    target+' href="'+href+'">'+inner+'</a></td><td align="right">'+right+'</td></tr>';	}      }    }    mhtml += ('</table></td></tr></table>');    mhtml += bo_use_div ? '</div>' : '</layer>';    mhtml += "\n";  }  document.writeln(mhtml);  // Workaround: Resize BUG Netscape 4  if (typeof document.layers != "undefined") {    MM_reloadPage(true);  }  bo_pd_initialized = true;}if (typeof bo_pd_def != "undefined") {  bo_pd_init();}function neuesfenster() { top.name = "inhalt"; var popupURL = "../sound_deutsch.html"; var popup = window.open(popupURL,"sound",' toolbar=0,location=0,directories=0, status=0,menubar=0, scrollbars=0,resizable=0,width=240,height=110'); if( navigator.appName.substring(0,8) == "Netscape" ) { popup.location = popupURL; popup.opener = self; } } 