/*
 DHTMLMenue.js - Dynamic HTML Menü

 Implementiert die Klasse 'DHTMLMenue' und stellt sie als Objekt zur Verfügung. Die Klasse ermöglicht die Implementation
 von dynamischen, auch überlappenden, Menüs. Die Menüs sind sowohl mit der Maus als auch mit der Tastatur bedienbar
 (deshalb müssen die Menütitel Hyperlinks sein). 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 der Name des 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. Das Erscheinungsbild kann mit Kontextselektoren
 individuell definiert werden. Für nicht kompatible Browser kann eine alternative URL angegeben 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. Ein Menüelement wird
 durch die Beschriftung und eine URL oder dem Namen eines Untermenüs beschrieben. Absolute URL's werden durch das Protokoll
 'http:', 'ftp:' oder 'javascript:' erkannt.
 Mit der Methode 'Inhaltsverzeichnis' kann das Inhaltsverzeichnis erzeugt werden.
 Benutzt die Klasse 'Browser' und die Formatvorlagendatei 'DHTMLMenue.css'.

 Menüdeklarationen
 - [Menü] = new Array()
   [Menü]['Daten'] = new Array([Nummer],'[Titel]','[Name Menü]',[OffsetX],[OffsetY],[DeltaY],[Alternative URL])
   [Menü]['[Name]'] = new Array({'[Beschriftung]¦[URL]|[[Name Untermenü]]',}..)

 Methoden
 - einbetten(in string Name{, in string Dokumente}): Menü einbetten
 - Inhaltsverzeichnis(in string Name): Inhaltsverzeichnis erzeugen

 Geschichte
 31.12.2001, MJung, Erstellung für Internet Explorer 5 und 6, Navigator 6 und 7
 19.03.2003, MJung, Erweiterung für überlappende Menüs
 19.12.2003, MJung, Neuer Browser Safari 1.0
 15.02.2005, MJung, Neuer Browser Firefox 1.0
 25.10.2005, MJung, Inkompatibilität in der Ereignisbehandlung beseitigen
 27.02.2006, MJung, Erweiterung für absolute URL's

 Copyright 2006 dezember und juli gmbh. Alle Rechte vorbehalten.
*/


// Installieren

DHTMLMenue = new DHTMLMenueKlasse()


// Konstruktor

function DHTMLMenueKlasse()
{

 // Konstanten
 this.Dokumente = '../'
this.Popup = false
 this.Variante = 2 // 1 href, 2 MouseOver, 3 href & MouseOver

 // Methoden
 this.einbetten = DHTMLMenueEinbetten
 this.Inhaltsverzeichnis = DHTMLMenueInhaltsverzeichnis

 // Private Variablen
 this.Menue = ''
 this.Hoverpfad = new Array()
 this.Menuepfad = new Array()

 // Private Methoden
 this.einbetten1 = DHTMLMenueEinbetten1
 this.ein = DHTMLMenueEin
 this.einaus = DHTMLMenueEinAus
 this.Inhaltsverzeichnis1 = DHTMLMenueInhaltsverzeichnis1
}


// Einbetten

function DHTMLMenueEinbetten(Name,Dokumente)
{

 this.Menue = eval(Name)
 if (Dokumente != null) this.Dokumente = Dokumente

 var Nummer = this.Menue['Daten'][0]
 var Titel = 'DHTMLMenueTitel' + Nummer
 var Menue = 'DHTMLMenue' + Nummer
 var onMouseOver = ''

 if (Browser.kompatibel() == false)
  document.write('<div class=DHTMLMenueTitel><a href='+this.Dokumente+this.Menue['Daten'][6]+'>'+this.Menue['Daten'][1]+'</a></div>')
 else
 {
  switch (this.Variante)
  {
   case 1:
    document.write('<div class=DHTMLMenueTitel id='+Titel+'><a href=javascript:DHTMLMenue.einaus("'+Titel+'","'+Menue+'")>'+this.Menue['Daten'][1]+'</a></div>')
    break
   case 2:
    if (this.Menue['Daten'][6] == '')
     document.write('<div class=DHTMLMenueTitel id='+Titel+'><a onMouseOver=DHTMLMenue.ein("'+Titel+'","'+Menue+'") style=cursor:default>'+this.Menue['Daten'][1]+'</a></div>')
    else
     document.write('<div class=DHTMLMenueTitel id='+Titel+'><a href='+this.Menue['Daten'][6]+' onMouseOver=DHTMLMenue.ein("'+Titel+'","'+Menue+'")>'+this.Menue['Daten'][1]+'</a></div>')
    break
   case 3:
    document.write('<div class=DHTMLMenueTitel id='+Titel+'><a href=javascript:DHTMLMenue.einaus("'+Titel+'","'+Menue+'") onMouseOver=DHTMLMenue.ein("'+Titel+'","'+Menue+'") style=cursor:default>'+this.Menue['Daten'][1]+'</a></div>')
    break
  }
  document.write('<div class=DHTMLMenue id='+Menue+'>')
  this.einbetten1(Nummer,this.Menue['Daten'][2])
  document.write('</div>')
 }
}

function DHTMLMenueEinbetten1(Nummer,id)
{

 var Menue,Untermenue,Menueelement,Menueelemente
 var i

 // Alle Menüelemente abarbeiten
 for (i = 0; i < this.Menue[id].length; i = i + 1)
 {

  // Menü, Untermenü und Menüelement(e) bestimmen
  Menue = 'DHTMLMenue' + Nummer
  Untermenue = 'DHTMLMenue' + Nummer + '-' + i
  Menueelement = 'DHTMLMenueElement' + Nummer + '-' + i
  Menueelemente = this.Menue[id][i].split('¦')

  // Menüelement einbetten
  if (/\[.+\]/.test(Menueelemente[1]) == true)
  {
   switch (this.Variante)
   {
    case 1:
     document.write('<span id='+Menueelement+'><a href=javascript:DHTMLMenue.einaus("'+Menueelement+'","'+Untermenue+'") onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Untermenue+'") style=cursor:default>'+Menueelemente[0]+'</a></span>')
     break
    case 2:
     document.write('<span id='+Menueelement+'><a href=javascript:DHTMLMenue.einaus("'+Menueelement+'","'+Untermenue+'") onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Untermenue+'") style=cursor:default>'+Menueelemente[0]+'</a></span>')
     break
    case 3:
     document.write('<span id='+Menueelement+'><a href=javascript:DHTMLMenue.einaus("'+Menueelement+'","'+Untermenue+'") onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Untermenue+'") style=cursor:default>'+Menueelemente[0]+'</a></span>')
     break
   }
   document.write('<div id='+Untermenue+' style="left: '+this.Menue['Daten'][3]+'px; top: '+(this.Menue['Daten'][4]+i*this.Menue['Daten'][5])+'px">')
   this.einbetten1(Nummer+'-'+i,Menueelemente[1].substring(1,Menueelemente[1].length-1))
   document.write('</div>')
  }
  else
  {
   if (Menueelemente[0] == 'Trennlinie')
    document.write('<hr noshade>')
   else
   {
    if (/^http:.+/.test(Menueelemente[1]) == false && /^ftp:.+/.test(Menueelemente[1]) == false && /^javascript:.+/.test(Menueelemente[1]) == false) Menueelemente[1] = this.Dokumente + Menueelemente[1]
    document.write('<span id='+Menueelement+'><a href="'+Menueelemente[1]+'" onMouseOver=DHTMLMenue.ein("'+Menueelement+'","'+Menue+'")>'+Menueelemente[0]+'</a></span>')
   }
  }
 }
}


// Ein

function DHTMLMenueEin(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 behandeln
 if (Menue == '') return

 // 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
  document.getElementById(Menue).style.visibility = 'visible'
  this.Menuepfad = /\d+[-\d+]*/.exec(Menue)[0].split('-')

//alert('Neuer Menupfad: '+DHTMLMenue.Menuepfad)
//alert('Neuer Hoverpfad: '+DHTMLMenue.Hoverpfad)

 // Alles aus, wenn Maus Dokument berührt
 document.body.onmouseover = DHTMLMenueAllesAus
}


// Alles Aus

function DHTMLMenueAllesAus(eventW3C)
{

 var Ereigniselement
 var i

 // Bedingungen prüfen
 switch (Browser.Name)
 {
  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)
 }

//alert('Neuer Menupfad: '+DHTMLMenue.Menuepfad)
//alert('Neuer Hoverpfad: '+DHTMLMenue.Hoverpfad)

 // Abschluss
 document.body.onmouseover = null
}


// Ein/Aus

function DHTMLMenueEinAus(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')
 {

  // Hover entfernen
  Hoverpfad = Hoverpfad.slice(0,Hoverpfad.length-1)
  for (i = DHTMLMenue.Hoverpfad.length; i > 0; i = i - 1)
  {
   if (DHTMLMenue.Hoverpfad[i-1] != Hoverpfad[i-1])
   {
    if (i == 1)
     document.getElementById('DHTMLMenueTitel' + DHTMLMenue.Hoverpfad.join('-')).className = 'DHTMLMenueTitel'
    else
     document.getElementById('DHTMLMenueElement' + DHTMLMenue.Hoverpfad.join('-')).className = ''
    DHTMLMenue.Hoverpfad = DHTMLMenue.Hoverpfad.slice(0,DHTMLMenue.Hoverpfad.length-1)
   }
  }

  // Menüs entfernen
  Menuepfad = Menuepfad.slice(0,Menuepfad.length-1)
  for (i = DHTMLMenue.Menuepfad.length; i > 0; i = i - 1)
  {
   if (DHTMLMenue.Menuepfad[i-1] != Menuepfad[i-1])
   {
    document.getElementById('DHTMLMenue' + DHTMLMenue.Menuepfad.join('-')).style.visibility = 'hidden'
    DHTMLMenue.Menuepfad = DHTMLMenue.Menuepfad.slice(0,DHTMLMenue.Menuepfad.length-1)
   }
  }
 }
 else
  this.ein(id,Menue)
}


// Inhaltsverzeichnis

function DHTMLMenueInhaltsverzeichnis(Name)
{

 this.Menue = eval(Name)

 // Inhaltsverzeichnis
 document.write('<div class=DHTMLMenueInhaltsverzeichnis>')
 this.Inhaltsverzeichnis1(this.Menue['Daten'][2])
 document.write('</div>')
}

function DHTMLMenueInhaltsverzeichnis1(id)
{

 var Menueelemente
 var i

 // Alle Menüelemente abarbeiten
 for (i = 0; i < this.Menue[id].length; i = i + 1)
 {

  // Menüelemente bestimmen
  Menueelemente = this.Menue[id][i].split('¦')

  // Menüelement einbetten
  if (/\[.+\]/.test(Menueelemente[1]) == true)
  {
   document.write('<span>'+Menueelemente[0]+'</span>')
   if (!document.layers) document.write('<div>')
   this.Inhaltsverzeichnis1(Menueelemente[1].substring(1,Menueelemente[1].length-1))
   if (!document.layers) document.write('</div>')
  }
  else
  {
   if (Menueelemente[0] == 'Trennlinie')
    document.write('<hr noshade>')
   else
   {
    Menueelemente[1] = this.Dokumente + Menueelemente[1]
    document.write('<span><a href="'+Menueelemente[1]+'">'+Menueelemente[0]+'</a></span>')
   }
  }
 }
}
