/* ################################################################
#####                                                         #####
#####   DropDownMenu v 1.01 | Copyright by Stefan Kahremann   #####
#####                                                         #####
################################################################ */

var ddm = new Array();
ddm['current'] = null; // Name des aktuellen Menüs; null, wenn kein Menü sichtbar
ddm['mouse_over'] = false; // gibt an, ob die Maus sich über dem Button oder dem Menü befindet
ddm['time_till_hide'] = 0; // wenn die Maus das Menü verlassen hat, Countdown der Zeit, bis das Menü ansgebendet wird
ddm['menus'] = new Array();

/* ## ddmCreate ##
    Möglich Parameter:
  idSourceObj: ID des Objektes, das das Ereignis zum Anzeigen des Menüs auslöst
  idMenuObj: ID des Menü-Objektes
  event: Art des Ereignisses, bei der das Menü angezeigt wird [click;move]
  specialMoveX: zusätzliches Verschieben des Menüs (x-Achse bzw. horizontal)
  specialMoveY: zusätzliches Verschieben des Menüs (y-Achse bzw. vertikal)
  pointSourceObj: Punkt des Objektes, an dem das Menü ansgerichtet werden soll (Default: lb) => zugelassene Werte: {[lcr][tcb]}, bsp: lb = LeftBottom, cc = CenterCenter)
  pointMenuObj: Punkt des Menüs, mit dem das Menü ausgerichtet werden soll (Default: lt) => zugelassene Werte: {[lcr][tcb]}, bsp: lt = LeftTop (Menü geht nach RechtsUnten), rb = RightBottom (Menü geht nach LinksOben)) */
function ddmCreate() {
  // Parameter auslesen
  if(arguments.length < 2) { return; }
  var idSourceObj = arguments[0];
  var idMenuObj = arguments[1];
  var event = arguments[2];
  var specialMoveX = arguments[3]; if(!specialMoveX) { specialMoveX = 0; }
  var specialMoveY = arguments[4]; if(!specialMoveY) { specialMoveY = 0; }
  var pointSourceObj = arguments[5]; if(!pointSourceObj || pointSourceObj.length != 2) { pointSourceObj = "lb"; }
  var pointMenuObj = arguments[6]; if(!pointMenuObj || pointMenuObj.length != 2) { pointMenuObj = "lt"; }
  
  
  // internen Namen für das Menü festlegen
  var name = ""; var counter = 1;
  while(counter <= 10) { name = "";
    for(var i = 1; i <= 20; i++) { var number = Math.floor(Math.random()*10); name += number.toString(); }
    if(!ddm['menus'][name]) { counter = 99; } counter++; }

  // Variablen in Menü-Array speichern
  ddm['menus'][name] = new Array();
  ddm['menus'][name]['objSource'] = ddmGetObj(idSourceObj);
  ddm['menus'][name]['objMenu'] = ddmGetObj(idMenuObj);
  ddm['menus'][name]['specialMove'] = new Array;
  ddm['menus'][name]['specialMove']['x'] = specialMoveX;
  ddm['menus'][name]['specialMove']['y'] = specialMoveY;
  
  // Event in Menü-Array speichern
  if(event == "click") {
    ddm['menus'][name]['event'] = "click";
    ddm['menus'][name]['objSource'].onclick = function () { ddmShowMenu(name); } }
  else { // move
    ddm['menus'][name]['event'] = "move";
    ddm['menus'][name]['objSource'].onmouseover = function () { ddmShowMenu(name); }
    ddm['menus'][name]['objSource'].onmouseout = function () { ddmHideMenu(name, "time"); }
    ddm['menus'][name]['objMenu'].onmouseover = function () { ddmShowMenu(name); }
    ddm['menus'][name]['objMenu'].onmouseout = function () { ddmHideMenu(name, "time"); } }
  
  // Points in Menü-Array speichern
  var p = new Array(pointSourceObj.substr(0,1), pointSourceObj.substr(1,1));
  if((p[0] != "l" && p[0] != "c" && p[0] != "r") || (p[1] != "t" && p[1] != "c" && p[1] != "b")) { var p = new Array("l", "b"); }
  ddm['menus'][name]['pointSourceObj'] = new Array(p[0], p[1]);

  var p = new Array(pointMenuObj.substr(0,1), pointMenuObj.substr(1,1));
  if((p[0] != "l" && p[0] != "c" && p[0] != "r") || (p[1] != "t" && p[1] != "c" && p[1] != "b")) { var p = new Array("l", "t"); }
  ddm['menus'][name]['pointMenuObj'] = new Array(p[0], p[1]);
  
  // damit Menü richtig positioniert wird
  ddm['menus'][name]['objMenu'].style.position = "absolute";
  //ddmShowMenu(name);
  //ddmHideMenu(name, "now")
  
  //if(document.getElementsByTagName("body")[0].onclick) { alert(document.getElementsByTagName("body")[0].onclick); }
} // End ddmCreate

function ddmShowMenu(name) {
  if(ddm['current'] != null && ddm['current'] != name) { ddmHideMenu(ddm['current'], 'now'); } // ggf. angezeigtes Menü ausblenden
  if(!ddm['menus'][name]) { return; } // Prüfen, ob dieser Eintrag existiert; wenn nicht, abbrechen
  
  if(ddm['menus'][name]['event'] == "move") { ddm['mouse_over'] = true; }
  if(ddm['menus'][name]['event'] == "click" && ddm['current'] == name) { ddmHideMenu(name, "now"); return; }

  ddm['current'] = name;

  // Menü einblenden und Offset auslesen
  ddmToggleVisibility(ddm['menus'][name]['objMenu'], true);
  var sOffset = ddmFetchObjOffset(ddm['menus'][name]['objSource']);
  var mOffset = ddmFetchObjOffset(ddm['menus'][name]['objMenu']);

  // X-Koordinate bestimmen
    // Position an Hand von SourceObj
    var posLeft = sOffset['left'];
    if(ddm['menus'][name]['pointSourceObj'][0] == "c") { posLeft += (sOffset['width']/2); }
    if(ddm['menus'][name]['pointSourceObj'][0] == "r") { posLeft += sOffset['width']; }
    posLeft += ddm['menus'][name]['specialMove']['x'];
  
    // Position an Hand von MenuObj
    if(ddm['menus'][name]['pointMenuObj'][0] == "c") { posLeft -= (mOffset['width']/2); }
    if(ddm['menus'][name]['pointMenuObj'][0] == "r") { posLeft -= mOffset['width']; }

  var diff = ddmGetWindowWidth()-(posLeft+mOffset['width']); if(diff < 0) { posLeft += diff; }
  if(posLeft < 0) { posLeft = 0; }

  // X-Koordinate bestimmen
    // Position an Hand von SourceObj
    var posTop = sOffset['top'];
    if(ddm['menus'][name]['pointSourceObj'][1] == "c") { posTop += (sOffset['height']/2); }
    if(ddm['menus'][name]['pointSourceObj'][1] == "b") { posTop += sOffset['height']; }
    posTop += ddm['menus'][name]['specialMove']['y'];

    // Position an Hand von MenuObj
    if(ddm['menus'][name]['pointMenuObj'][1] == "c") { posTop -= (mOffset['height']/2); }
    if(ddm['menus'][name]['pointMenuObj'][1] == "b") { posTop -= mOffset['height']; }

  if(posTop < 0) { posTop = 0; }

  ddm['menus'][name]['objMenu'].style.position = "absolute";
  ddm['menus'][name]['objMenu'].style.left = posLeft+"px";
  ddm['menus'][name]['objMenu'].style.top = posTop+"px";

} // End ddmShowMenu

function ddmHideMenu(name, when) {
  var hide = false;

  switch(when) {
    case "now": hide = true; break;
    
    case "time":
      ddm['mouse_over'] = false; ddm['time_till_hide'] = 1.25;
      window.setTimeout("ddmHideMenu('"+name+"', 'time_timer')", 250);
      break;
      
    case "time_timer":
      if(ddm['mouse_over'] == false) {
        if(ddm['time_till_hide'] <= 0) { hide = true; }
        else { ddm['time_till_hide'] = ddm['time_till_hide'] - 0.25;
          window.setTimeout("ddmHideMenu('"+name+"', 'time_timer')", 250); } }
      break;
  } // End Switch
  
  if(hide == true) {
    ddmToggleVisibility(ddm['menus'][name]['objMenu'], false);
    if(ddm['current'] == name) { ddm['current'] = null; } }
} // End ddmHideMenu

function ddmHideCurrentMenu() { if(ddm['current'] != null) { ddmHideMenu(ddm['current'], "now"); } }

function ddmToggleVisibility(obj, objVisibility) {
  if(!obj) { return; }
  if(objVisibility != true && objVisibility != false) {
    if(obj.style.display != 'none') { obj.style.display = 'none'; }
    else { obj.style.display = ''; } }
  else {
    if(objVisibility == true) { obj.style.display = ''; }
    else { obj.style.display = 'none'; } }
} // End ddmToggleVisibility

function ddmGetObj(id) { if(document.getElementById(id)) { return document.getElementById(id); } else { return; } }

function ddmFetchObjOffset(obj) {
  var offset = new Array();
  offset['left'] = obj.offsetLeft;   offset['top'] = obj.offsetTop;
  offset['width'] = obj.offsetWidth; offset['height'] = obj.offsetHeight;

  var offsetParent = obj.offsetParent;
  while(offsetParent) {
    offset['left'] += offsetParent.offsetLeft; offset['top'] += offsetParent.offsetTop;
    offsetParent = offsetParent.offsetParent;
  } return offset;
} // End ddmFetchObjOffset

function ddmGetWindowWidth() { if(window.innerWidth) { return window.innerWidth; }
  else { return document.body.clientWidth+document.body.offsetLeft; } }

