/*
 * 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; 
} 
} 