/*

 DHTMLMenue.js - Objekt zur Realisation von Dynamic HTML Menüs (Release 2.1)
 ===========================================================================

 Von Markus Jung

 Implementiert die Klasse 'DHTMLMenue' und stellt sie als Objekt zur Verfügung. Das Objekt ermöglicht die Implementation von dynamischen, auch überlappenden, Menüs. Das Popup-Verhalten kann mittels
 Konstante eingestellt werden. Die Menüs müssen lediglich deklariert werden, die Einbettung erfolgt zur Laufzeit. Es können dabei mehrere einzelne Menüs deklariert werden. Bei Bedarf können die
 entsprechenden Menüdateien eingebunden und das Variablenfeldes der Methode 'einbetten' übergeben werden. Die Einbettung der Menüs und Untermenüs erfolgt mit Div-Tags, die Menüelemente mit Span- resp.
 A-Tags (um eine Bedienung mit der Tastatur zu ermöglichen). Das Erscheinungsbild kann mit Kontextselektoren individuell definiert werden. Für nicht kompatible Browser kann eine alternative URL
 angegeben werden. Die alternative URL kann beim Popup-Verhalten 2 auch für eine Bereichsübersicht verwendet werden.
 Die Menüdeklaration besteht aus einem Variablenfeld von Menüs, welche durch einen im Variablenfeld eindeutigen Namen identifiziert werden. Ein einzelnes Menü besteht wiederum aus einem Variablenfeld
 von Menüelementen oder dem Tag 'Trennlinie'. Ein Menüelement wird durch die Beschriftung und dem Pfad oder dem Namen eines Untermenüs beschrieben. Absolute URL's und JavaScript-Anweisungen werden
 durch das vorangestellte Protokolle erkannt.
 Mit der Methode 'Inhalt' kann der Inhalt in Form eines Verzeichnissen dargestellt werden.

 Menüdeklaration
 - [Menü] = new Array()
   [Menü]['Daten'] = new Array(([Nummer],'[Titel]','[URL]')|([Nummer],'[Titel]','[Name Menü]',[OffsetX],[OffsetY],[DeltaY],[Alternative URL]))
   [Menü]['[Name]'] = new Array({'[Beschriftung]§[URL]|[[Name Untermenü]]',}..)

 Methoden
 - einbetten(in string Name): Menü einbetten
 - Inhalt(in string Name): Inhaltsverzeichnis erzeugen

 Abhängigkeiten
 - Benutzt Broswer.js (Release 3)

 Geschichte
 - 2.0: 29.09.06, MJung, Erstellung
 - 2.1: 23.11.06, MJung, Titel ohne Popup-Menüs

 Copyright 2006 dezember und juli gmbh (Schweiz). Alle Rechte vorbehalten.
*/


DHTMLMenue = new DHTMLMenueKlasse()


function DHTMLMenueKlasse()
{

 this.Release = 2.1


 // Konstanten
 this.Root = '../'
 this.Popup = 3 // 1 Nach Betätigen (mit Maus oder Tastatur), 2 Beim Zeigen, 3 Nach Betätigen oder beim Zeigen


 // Private Variablen
 this.Hoverpfad = new Array()
 this.Menuepfad = new Array()


 // Methode einbetten(in array Menuedeklartion)
 this.einbetten = function(Menuedeklartion)
 {

  var Nummer = Menuedeklartion['Daten'][0]
  var Titel = 'DHTMLMenueTitel' + Nummer
  var Menue = 'DHTMLMenue' + Nummer
  var Popup = !/.+[.]\w{3,4}/.test(Menuedeklartion['Daten'][2])
  var href,onMouseOver,style

  if (Browser.istKompatibel())
  {

   if (Popup) href = 'href=javascript:DHTMLMenue.einaus("'+Titel+'","'+Menue+'")'
   else href = 'href="'+this.Root+Menuedeklartion['Daten'][2]+'"'

   if (Popup) onMouseOver = 'onMouseOver=DHTMLMenue.ein("'+Titel+'","'+Menue+'")'
   else onMouseOver = 'onMouseOver=DHTMLMenue.ein("'+Titel+'","")'

   if (Popup) style = 'style="cursor: default"'
   else style = ''

   switch (this.Popup)
   {
    case 1:
     onMouseOver = ''
     style = ''
     break
    case 2: 
     if (Menuedeklartion['Daten'][6] == '')
      href = ''
     else
     {
      href = 'href='+Menuedeklartion['Daten'][6]
      style = ''
     }
     onMouseOver = 'onMouseOver=DHTMLMenue.ein("'+Titel+'","'+Menue+'")'
     break
    case 3:
     break
   }

   document.write('<div class=DHTMLMenueTitel id='+Titel+'><a '+href+' '+onMouseOver+' '+style+'>'+Menuedeklartion['Daten'][1]+'</a></div>')
   if (Popup)
   {
    document.write('<div class=DHTMLMenue id='+Menue+'>')
    this.einbetten1(Menuedeklartion,Nummer,Menuedeklartion['Daten'][2])
    document.write('</div>')
   }
  }
  else document.write('<div class=DHTMLMenueTitel><a href='+this.Root+Menuedeklartion['Daten'][6]+'>'+Menuedeklartion['Daten'][1]+'</a></div>')
 }


 this.einbetten1 = function(Menuedeklartion,Nummer,id)
 {

  var Menue,Untermenue,Menueelement,Menueelemente
  var i

  // Alle Menüelemente abarbeiten
  for (i = 0; i < Menuedeklartion[id].length; i = i + 1)
  {

   // Menü, Untermenü und Menüelement(e) bestimmen
   Menue = 'DHTMLMenue' + Nummer
   Untermenue = 'DHTMLMenue' + Nummer + '-' + i
   Menueelement = 'DHTMLMenueElement' + Nummer + '-' + i
   Menueelemente = Menuedeklartion[id][i].split('§')

   // Menüelement einbetten
   if (/\[.+\]/.test(Menueelemente[1]) == true)
   {
    document.write('<span id='+Menueelement+'><a href=javascript:DHTMLMenue.einaus("'+Menueelement+'","'+Untermenue+'") onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Untermenue+'") style=cursor:default>'+Menueelemente[0]+'</a></span>')
    document.write('<div id='+Untermenue+' style="left: '+Menuedeklartion['Daten'][3]+'px; top: '+(Menuedeklartion['Daten'][4]+i*Menuedeklartion['Daten'][5])+'px">')
    this.einbetten1(Menuedeklartion,Nummer+'-'+i,Menueelemente[1].substring(1,Menueelemente[1].length-1))
    document.write('</div>')
   }
   else
   {
    if (Menueelemente[0] == '<Trennlinie>') document.write('<hr noshade>')
    else
    {
     if (/^\w+[:]/.test(Menueelemente[1]) == false) Menueelemente[1] = this.Root + Menueelemente[1]
     document.write('<span id='+Menueelement+'><a href="'+Menueelemente[1]+'" onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Menue+'")>'+Menueelemente[0]+'</a></span>')
    }
   }
  }
 }


 // Interne Methode ein(in string id,in string Name)
 this.ein = function(id,Menue)
 {

  var Hoverpfad = (id == '') ? '' : /\d+[-\d+]*/.exec(id)[0].split('-')
  var Menuepfad = (Menue == '') ? '' : /\d+[-\d+]*/.exec(Menue)[0].split('-')
  var i

  // Hover entfernen
  for (i = this.Hoverpfad.length; i > 0; i = i - 1)
  {
   if (this.Hoverpfad[i-1] != Hoverpfad[i-1])
    if (i == 1) document.getElementById('DHTMLMenueTitel' + this.Hoverpfad.join('-')).className = 'DHTMLMenueTitel'
    else document.getElementById('DHTMLMenueElement' + this.Hoverpfad.join('-')).className = ''
   this.Hoverpfad = this.Hoverpfad.slice(0,this.Hoverpfad.length-1)
  }

  // Hover hinzufügen
  if (id != '')
  {
   if (/DHTMLMenueTitel/.test(id) == true) document.getElementById(id).className = 'DHTMLMenueTitelHover'
   else document.getElementById(id).className = 'Hover'
   this.Hoverpfad = /\d+[-\d+]*/.exec(id)[0].split('-')
  }

  // Menüs entfernen
  for (i = this.Menuepfad.length; i > 0; i = i - 1)
  {
   if (this.Menuepfad[i-1] != Menuepfad[i-1]) document.getElementById('DHTMLMenue' + this.Menuepfad.join('-')).style.visibility = 'hidden'
   this.Menuepfad = this.Menuepfad.slice(0,this.Menuepfad.length-1)
  }

  // Menü hinzufügen
  if (Menue != '')
  {
   document.getElementById(Menue).style.visibility = 'visible'
   this.Menuepfad = /\d+[-\d+]*/.exec(Menue)[0].split('-')
  }

  // Alles aus, wenn Maus Dokument berührt
  document.body.onmouseover = DHTMLMenue.aus
 }


 // Interne Methode aus(in object eventW3C)
 this.aus = function(eventW3C)
 {

  var Browsername = Browser.Name()
  var Ereigniselement
  var i

  // Bedingungen prüfen
  switch (Browsername)
  {
   case 'Internet Explorer': Ereigniselement = event.srcElement; break;
   case 'Navigator':
   case 'Safari':
   case 'Firefox': Ereigniselement = eventW3C.target; break;
  }

  if (Ereigniselement.className.substring(0,10) == 'DHTMLMenue') return
  if (Ereigniselement.parentNode.id.substring(0,10) == 'DHTMLMenue') return

  // Alle Menüs entfernen
  for (i = DHTMLMenue.Menuepfad.length; i > 0; i = i - 1)
  {
   document.getElementById('DHTMLMenue' + DHTMLMenue.Menuepfad.join('-')).style.visibility = 'hidden'
   DHTMLMenue.Menuepfad = DHTMLMenue.Menuepfad.slice(0,DHTMLMenue.Menuepfad.length-1)
  }

  // Alle Hovers entfernen
  for (i = DHTMLMenue.Hoverpfad.length; i > 0; i = i - 1)
  {
   if (i == 1) document.getElementById('DHTMLMenueTitel' + DHTMLMenue.Hoverpfad.join('-')).className = 'DHTMLMenueTitel'
   else document.getElementById('DHTMLMenueElement' + DHTMLMenue.Hoverpfad.join('-')).className = 'DHTMLMenueElement'
   DHTMLMenue.Hoverpfad = DHTMLMenue.Hoverpfad.slice(0,DHTMLMenue.Hoverpfad.length-1)
  }

  // Abschluss
  document.body.onmouseover = null
 }


 // Interne Methode einaus(id,Menue)
 this.einaus = function(id,Menue)
 {

  var Hoverpfad = (id == '') ? '' : /\d+[-\d+]*/.exec(id)[0].split('-')
  var Menuepfad = (Menue == '') ? '' : /\d+[-\d+]*/.exec(Menue)[0].split('-')
  var i

  // Ein oder Aus
  if (document.getElementById(Menue).style.visibility == 'visible')
  {

   // Menüs entfernen
   Menuepfad = Menuepfad.slice(0,Menuepfad.length-1)
   for (i = this.Menuepfad.length; i > 0; i = i - 1)
   {
    if (this.Menuepfad[i-1] != Menuepfad[i-1])
    {
     document.getElementById('DHTMLMenue' + this.Menuepfad.join('-')).style.visibility = 'hidden'
     this.Menuepfad = this.Menuepfad.slice(0,this.Menuepfad.length-1)
    }
   }

   // Hover entfernen
   Hoverpfad = Hoverpfad.slice(0,Hoverpfad.length-1)
   for (i = this.Hoverpfad.length; i > 0; i = i - 1)
   {
    if (this.Hoverpfad[i-1] != Hoverpfad[i-1])
    {
     if (i == 1) document.getElementById('DHTMLMenueTitel' + this.Hoverpfad.join('-')).className = 'DHTMLMenueTitel'
     else document.getElementById('DHTMLMenueElement' + this.Hoverpfad.join('-')).className = ''
     this.Hoverpfad = this.Hoverpfad.slice(0,this.Hoverpfad.length-1)
    }
   }
  }
  else this.ein(id,Menue)
 }


 // Methode Inhalt(in array Menuedeklartion)
 this.Inhalt = function(Menuedeklaration)
 {

  document.write('<div class=DHTMLMenueInhaltsverzeichnis>')
  this.Inhalt1(Menuedeklaration,Menuedeklaration['Daten'][2])
  document.write('</div>')
 }


 this.Inhalt1 = function(Menuedeklaration,id)
 {

  var Menueelemente
  var i

  // Alle Menüelemente abarbeiten
  for (i = 0; i < Menuedeklaration[id].length; i = i + 1)
  {

   // Menüelemente bestimmen
   Menueelemente = Menuedeklaration[id][i].split('§')

   // Menüelement einbetten
   if (/\[.+\]/.test(Menueelemente[1]) == true)
   {
    document.write('<span>'+Menueelemente[0]+'</span>')
    if (!document.layers) document.write('<div>')
    this.Inhalt1(Menuedeklaration,Menueelemente[1].substring(1,Menueelemente[1].length-1))
    if (!document.layers) document.write('</div>')
   }
   else
   {
    if (Menueelemente[0] == '<Trennlinie>') document.write('<hr noshade>')
    else
    {
     if (/^\w+[:]/.test(Menueelemente[1]) == false) Menueelemente[1] = this.Root + Menueelemente[1]
     document.write('<span><a href="'+Menueelemente[1]+'">'+Menueelemente[0]+'</a></span>')
    }
   }
  }
 }
}
