/* *********************************** API ****************************************
contructor MH_DRAGnDROP(windowTxtOrObj) //Konstruktor
  windowTxtOrObj: wenn eine Objekt oder eine ID übergeben wird, wird dieses eingehangen

function boot(windowTxtOrObj, outerWindowObj, show)
  booted das Drag'n'Drop Objekt. Muss immer ausgeführt werden, bevor es benutzt wird, kann nur einmal ausgeführt werden
  -windowTxtOrObj: wenn eine Objekt oder eine ID übergeben wird, wird dieses eingehangen
  -outerWindowObj: wenn eine Objekt oder eine ID übergeben wird, wird dieses als äußerer Rahmen verwendet. Sonst wird das Objekt einfach im Body eingehängt (Achtung, führt im IE zum Absturz)
  -show: Objekt wird (nicht) angezeigt; Standard: true

function minimize(bool)
  minimiert die anzeige bzw. maximiert sie
  -bool: bei true wird minimiert (std: true)

function setPosition(x,y)
  Setzt die Position des Objekts
  -x: vom linkem Rand (Möglich auch: LEFT, RIGHT, CENTER);
  -y: vom oberen Rand (Möglich auch: TOP, MIDDLE, BOTTOM);

function setMBcolor(std, dragged)
  Setzt die Farbe, die der MoveBar hat
  -std: normale Farbe (wenn nicht bewegt)
  -dragged: Farbe, wenn bewegt wird

function getMovebar()
function getDocument()
function getID()
function isBooted()
function isMinimized()
function show()
function hide()
function close()
  wie hide() nur dass entsprechender Funktor aufgerufen wird

function setClass = function (className)
  setzt die Klasse des Gesamtfensters

function refresh()
  muss bei Größenänderungen immer aufgerufen werden

function set[FunctorName]Functor(functor)
  setzt einen Functor/Listener, der Aufgerufen wird, falls das Ereigniss eintritt
  -functor: beliebige Funktion, die Aufgerufen wird

functor Drag:  sobald Objekt angeklickt wird
               Parameter1: das Ereigniss (Mauskoordinaten)
               Parameter2: das dragDropObjekt
functor Move:  sobald Objekt bewegt wird
               Parameter1: das dragDropObjekt
functor Drop:  sobald Objekt losgelassen wird
               Parameter1: das Ereigniss (Mauskoordinaten)
               Parameter2: das dragDropObjekt
functor Moved: sobald Objekt bewegt wurde (mit Veränderung)
               Parameter1: das dragDropObjekt
               Parameter2: X-Wert
               Parameter3: Y-Wert
functor Error: falls ein Fehler auftritt wird dieses Funktor aufgerufen. Wenn er nicht gesetzt wird, wird eine Standardmeldung abgesetzt
               Parameter1: Fehlernummer; (1: Zeitüberschreitung, 0: kann AJAX nicht ausfuhren)
               Parameter2: Standardfehlermeldung
               Parameter3: requestObject (this)
functor Minimize/Maximize: wird bei verkleinern, vergrößern aufgerufen
******************************************************************************** */

MH_DRAGnDROP_draggingObj=null;
MH_DRAGnDROP_zIndex=100;
(new Image).src = "images/icons/10close.gif";

function MH_DRAGnDROP(windowTxtOrObj) {
  var thisObject = this;
  var divInhalt = false; //internes Inhaltsobjekt
  var divMovebar = false;  //Titelleiste
  var divWindow = false;   //ganzes Objekt

  var left=0;
  var top=0;

  var saveCookie = false;

  var functor_drag= false;
  var functor_move = false;
  var functor_drop = false;
  var functor_moved = false;
  var functor_close = false;
  var functor_error = false;
  var functor_minimize = false;
  var functor_maximize = false;

  var netscape4=document.layers;
  var ie4=document.all;
  var netscape6=document.getElementById&&!document.all;
  var errorType = new Array();
  var idString = new Date().getTime();
  var booted=false;
  var dragapproved=false;
  var minimized=false;
  var tempx=0;
  var tempy=0;
  var offsetx=0;
  var offsety=0;
  var colorMenubar = "silver";
  var colorMenubarDrag = "gray";
  var classWindow = null;
  var maxSize = 640;

  this.boot = function(windowTxtOrObj, outerWindowObj, show) {
    if (!booted) {
      if (typeof(windowTxtOrObj)=='string') divInhalt=getElement('id',windowTxtOrObj); else divInhalt=windowTxtOrObj;
      if (divInhalt==null || !divInhalt) {
        drag_error(1, windowTxtOrObj+' (divInhalt) ist nicht bekannt!');
        return false;
      }

      if (typeof(outerWindowObj)=='string') divWindow=getElement('id',outerWindowObj); else divWindow=outerWindowObj;
      if (divWindow=='null' || !divWindow) {
        divWindow = document.createElement("div");
        //mh_tools.bodyAppend(divWindow);
        document.body.appendChild(divWindow);
      }

      if (divWindow==null || !divWindow) {
        drag_error(1, outerWindowObj+' (divWindow) ist nicht bekannt!');
        return false;
      }

      divWindow.id=idString+'dragndropWindow';
      divWindow.style.position='absolute';

      divMovebar = document.createElement("div");
      divMovebar.id = idString+'dragndropMovebar';
      divMovebar.className = 'mh_DRAGnDROP_movebar';
      divMovebar.windowObj = thisObject;
      this.refresh();

      divWindow.appendChild(divMovebar);
      divWindow.appendChild(divInhalt);

      divMovebar.onmousedown=drag_init_forward;
      divMovebar.ondblclick=dblClickMovebar;
      divWindow.onmousedown=thisObject.setFront;
      this.setFront();
      booted=true;
      if (show==null || show) this.show();
    }
  }

  this.setFront = function() {
    if (!divWindow.style.zIndex || divWindow.style.zIndex<MH_DRAGnDROP_zIndex) divWindow.style.zIndex=(++MH_DRAGnDROP_zIndex);
  }

  var drag_init_forward=function(e) {
    this.windowObj.drag_initialize(e);
  }

  this.drag_initialize=function(e){
    tempx=parseInt(divWindow.style.left);
    tempy=parseInt(divWindow.style.top);

    if (ie4&&event.srcElement.id==divMovebar.id||netscape6&&e.target.id==divMovebar.id){
      if (functor_drag) functor_drag(e, this.windowObj);
      offsetx=ie4? event.clientX : e.clientX;
      offsety=ie4? event.clientY : e.clientY;

      divMovebar.style.backgroundColor = colorMenubarDrag;
      MH_DRAGnDROP_draggingObj=thisObject;
      document.onmousemove=drag_move_forward;
      document.onmouseup=drag_release_forward;
    }
  }

  var drag_move_forward = function(e){
    if (MH_DRAGnDROP_draggingObj!=null && MH_DRAGnDROP_draggingObj ) return MH_DRAGnDROP_draggingObj.drag_move(e);
  }

  this.drag_move=function(e) {
    if (MH_DRAGnDROP_draggingObj!=null && (obj=MH_DRAGnDROP_draggingObj) && this.getID()==obj.getID()) {
      if (ie4){
        left=tempx+event.clientX-offsetx;
        top=tempy+event.clientY-offsety;
        moveToPos();
        return false
      } else if (netscape6){
        left=tempx+e.clientX-offsetx
        top=tempy+e.clientY-offsety
        moveToPos();
        return false
      } else return true;
    } else return true;
  }

  var drag_release_forward=function(e) {
    if (MH_DRAGnDROP_draggingObj!=null && (obj=MH_DRAGnDROP_draggingObj) && obj.getID()) {
      obj.drag_release(e);
    }
  }

  this.drag_release = function(e) {
    if (MH_DRAGnDROP_draggingObj==this) {
      MH_DRAGnDROP_draggingObj=false;
      divMovebar.style.backgroundColor = colorMenubar;
      if (tempx != parseInt(divWindow.style.left) || tempy != parseInt(divWindow.style.top)) if (functor_moved) functor_moved(thisObject,left,top);
      if (functor_drop) functor_drop(e,thisObject);
      document.onmousemove=null;
    }
  }

  var dblClickMovebar=function(e) {
    if (ie4&&event.srcElement.id==divMovebar.id||netscape6&&e.target.id==divMovebar.id) this.windowObj.minimize(!this.windowObj.isMinimized());
  }

  this.minimize = function(bool) {
    if (bool==null) bool=true;
    if (bool) {
      this.refresh();
      divInhalt.style.display="none";
      if (functor_minimize) functor_minimize(false);
    } else {
      divInhalt.style.display="block";
      this.refresh();
      if (functor_maximize) functor_maximize(true);
    }
    minimized=bool;
  }

  var check_pos = function() {
    if (divWindow.style.position=="absolute" || divWindow.style.position=="fixed") {
//      if (parseInt(left)<0) left=0;
      if (parseInt(top)<0) top=0;
    }
  }

  var moveToPos=function() {
    if (booted) {
      check_pos();
      divWindow.style.left=left;
      divWindow.style.top=top;
      if (functor_move) functor_move(left,top,thisObject);
    }
  }

  this.setStylePos = function (posName) {
    divWindow.style.position=posName;
  }

  this.setPosition = function (x,y) {
    if (divWindow.offsetWidth) width = divWindow.offsetWidth; else width=300;
    if (divWindow.offsetHeight) height = divWindow.offsetHeight; else height=60;
    if (x==null) x='CENTER';
    if (y==null) y='MIDDLE';

    if (!isNaN(x)) left=x; else switch(x.toUpperCase()) {
      case 'LEFT': left=0; break;
      case 'RIGHT': left=crossInnerWindowWidth()-width; break;
      case 'CENTER': left=Math.round(crossInnerWindowWidth()/2 + crossGetScroll("x") - width/2); break;
      default: drag_error(5, x+' nur Zahlen oder "RIGHT", "LEFT", "MIDDLE" für x erlaubt');
    }
    if (!isNaN(y)) top=y; else switch(y.toUpperCase()) {
      case 'TOP': top=0; break;
      case 'BOTTOM': top=crossInnerWindowHeight()-height; break;
      case 'MIDDLE': top=Math.round(crossInnerWindowHeight()/2 + crossGetScroll("y") - height/2); break;
      default: drag_error(5, y+' nur Zahlen oder "TOP", "MIDDLE", "BOTTOM" für y erlaubt');
    }

    if (functor_moved) functor_moved(thisObject,left,top);
    moveToPos();
  }

/*
  this.saveCookie = function (bool, cookieID) { ; }
  this.writeDocument = function (txt,overwrite) {
    if (overwrite==null) overwrite=true;

  }
*/
  this.setMBcolor = function(std, dragged) {
    if (dragged!=null && dragged) colorMenubarDrag=dragged;
    if (std!=null && std) {
      colorMenubar=std;
      divMovebar.style.backgroundColor=colorMenubar;
    }
  }

  this.show = function() {
    if (divWindow==null || !divWindow) {
      alert('divWindow ist nicht korrekt initalisiert!');
      return false;
    }
    divWindow.style.display="block";
    this.minimize(false);
    this.setFront();
  }

  this.hide = function() {
    divWindow.style.display="none";
  }
  this.close = function(e) {
    thisObject.hide();
    if (functor_close) functor_close(thisObject);
  }

  var drag_error = function(errno, txt) {
    if (functor_error) functor_error(errno, txt, thisObject); else alert(txt);
  }

  this.refresh = function() {
    if (!maxSize || divInhalt.offsetWidth<=maxSize) divMovebar.style.width = divInhalt.offsetWidth; else divMovebar.style.width=maxSize;
  }

  this.getMovebar = function () { return divMovebar; }
  this.getDocument = function () { return divInhalt; }
  this.getID = function () { return idString; }
  this.isBooted = function() { return booted;}
  this.isMinimized = function() { return minimized;}
  this.setClass = function (className) { divWindow.className=className; }
  this.setMaxSize = function (nMaxSize) {maxSize = nMaxSize;}
  this.addCloseButton = function() {
    tmp = document.createElement("img");
    tmp.src = "images/icons/10close.gif";
    tmp.onclick=thisObject.close;
    tmp.style.float="right";
    tmp.style.cursor="crosshair";
    tmp.title="Fenster schließen";
    if (divMovebar)divMovebar.appendChild(tmp); else alert("divMovebar noch nicht initalisiert");
  }

  this.setDragFunctor = function (functor) {functor_drag=functor;}
  this.setMoveFunctor = function (functor) {functor_move=functor;}
  this.setDropFunctor = function (functor) {functor_drop=functor;}
  this.setMovedFunctor = function (functor) {functor_moved=functor;}
  this.setCloseFunctor = function (functor) {functor_close=functor;}
  this.setErrorFunctor = function (functor) {functor_error=functor;}
  this.setMinFunctor = function (functor) {functor_minimize=functor;}
  this.setMaxFunctor = function (functor) {functor_maximize=functor;}
  if (windowTxtOrObj!=null) this.boot(windowTxtOrObj);
}
