// (C) Copyright 1998-2004 by Sven Weingartner (http://sveni.com)
// All Rights reserved !!!
// Freeware for any use
// for the latest Version of this file visit: http://sveni.com/m_stuff_sdo.php
//
// SD-Objects:
// -Moveable Objekt
// -Container für Objekte (Array ohne Doppelungen)
//
// Version:     3.05.01 : [14 KB]
// last change: 06.11.2004


// 3.05.01    /fixed: missing layer wont be alerted if layer tooltip does not exist (also no JS errors)
// 3.05.00    /changed: tooltip now works via CSS. Just define a "#tooltip" and a "#tooltip .content" in CSS file
// 3.04.02    /fixed: x and y location detection for IE6 was not correct
// 3.04.01    /fixed: problems with multiple lines tooltips
// 3.04.00    /fixed: toolstips sometimes are located at wrong position
//            /fixed: only show tooltip when initialized
//            /fixed: compatibilty problems with ie with multiple relative layers, inside each
//            /add: now opera 7 compatible
// 3.03.00    /add: layerWriteOuter(), layerReadOuter(), MObject.read()
//            /fixed: moveable now also works with empty Layers, only defined in size
// 3.02.00    /add: Animation Queue Functions
// 3.01.01    /add: erweiterte Debuginfo bei stopFollow
// 3.01.00    /changed: enableToolTips wird nun über die Funktion setToolTips gemacht
// 3.00.05    /fixed: toolTip kann nun ohne Params zum löschen aufgerufen werden
// 3.00.04    /fixed: initDevices als Prototyp eingebaut
// 3.00.03    /fixed: Tooltip war im NS4 ohne Hintergrund
// 3.00.02    /Tooltip nun auch im Mozialla transparent
// 3.00.01    /bug im Container behoben
// 3.00.00    /nun moveable, alle Funktionen komplett neu überarbeitet, Codeminimierung 17KB -> 10KB
// 2.15.01    /IE4 kompatibel gemacht
// 2.14.01    +setZIndex
// 2.13.02    /info1-info5 zum Object hinzugefügt
// 2.13.01    +initSDO_soft() für nicht browserkritische Funktionen
// 2.12.2002  /Listener im Init deaktiviert
// 2.11.2002  /Mozilla kompatibel gemacht
// 2.10.2002  /addTA gefixt, Listener arbeitet nun mit Strings, statt Objekten
// 2.09.2002  +getOffsetX, +getOffsetY, +pageHeight
// 2.08.2002  /Browsercheck Opera kompatibel gemacht
// 2.07.2002  +setPositionX, +setPositionY, +layerPositionX, +layerPositionY
// 2.06.2002  +screenWidth, +screenHeight, +moveTo
// 2.05.2002  +toolTip
// 2.04.2002  +MM_reload.. für NS4
// 2.03.2002  +Warnung für ältere Browser ausgeben
// 2.02.2002  +saveLayer, +restoreLayer, +add
// 2.01.2002  /setStylee bugfix


//////////////////////////////////////////////////////////////////////////////
// Interne Variablen

var debug=false;       //debugFehlermeldungen ausgeben?
var operaWarning=false;//Warnung für Opera ausgeben

var delay=20;   //Zeit zwischen Animationsschritten (z.B. moveTo)
var enableToolTips=true; //Tooltips ermöglichen mit toolTip(text) ->benötigt layer 'tooltip' !!!

// ab hier sollte man nix verändern oder nur wenn man wirklich
// Ahnung hat was man macht ;)
//////////////////////////////////////////////////////////////////////////////

var ie4=ie5=ie6=ns4=ns6=opera=mac=false;
var isHelp=false; //ob gerade Tooltip aktiv
var helpo;
var aList;
var followObj=false;
var followObjLyr='';
var followObjXo=followObjYo=0;
var maxZIndex=5
var sdox=sdoy=0;
var newX=newY=0;
var initialized=false; //für tooltip, ob schon initialisiert

//////////////////////////////////////////////////////////////////////////////
// Interne Funktionen

// müssen eigentlich nicht verändert werden

//Moveable Object
//= sehr komfortabel verwaltbarer Layer
function MObject(name,objn) {
  //interne änderbare Variablen definieren
  this.scrolling=false;   //soll bei setPosition Bildschirmscrollen einberechnet werden?
  this.info=new Array;    //für zusätzliche Infos
  this.moveable=false;    //verschiebbar
  this.updzi=true;        //zIndex beim verschieben erhöhen

  //interne Variablen definieren, welche nicht von ausen verändert werden sollten
  this.xc=this.yc=0;      //X,Y Koordinaten
  this.objn=objn;         //Name des Objects
  this.active=false;      //bin ich aktiv
  this.name=name;         //Name des Layers
  this.zIndex=1;          //zIndex des Objektes
  this.mma=false;         //activity Status für mouseMove
  this.width=this.height=0 //höhe und breite des Objektes
  this.animQueue=new Array //Queue für Animationen
  this.action=0;          //interner Zustand 0=nix, 1=activeAnimating
  this.valid=true;        //object coorect initialized


  if (!existLayer(name)) {
    this.valid=false;
    if (debug) {
      alert('SDO.MObject('+objn+'): Layer \''+name+'\' existiert nicht.');
    }
  } else {
    if (!ns4){
      this.content=layerRead(name);
      if (ie4||ie5||ie6) { //correct IE Bug - if empty Layer, height has no smaller min than 20px
        layerWrite(name,'<span>'+this.content+'</span>');
      }
      //now add moveable support
      c=layerReadOuter(name);
      layerWriteOuter(name,'<span onMouseOver="'+this.objn+'.active=true" onMouseOut="'+this.objn
        +'.active=false" onMouseDown="'+this.objn+'.startFollow()" onMouseUp="'+this.objn+'.stopFollow()">'
        +c+'</span>');
    }
  }
}

//internal object functions
MObject.prototype.moveTo=function(x1,y1,s){this.action=1;moveit(this.objn,this.xc,this.yc,x1,y1,s,0)}
MObject.prototype.saveLayer=function(){this.content=layerRead(this.name)}
MObject.prototype.restoreLayer=function(){layerWrite(this.name,this.content)}
MObject.prototype.setZIndex=function(num){this.zIndex=num;setStylee(this.name,'zIndex',num)}
MObject.prototype.setStyle=function(style,val){setStylee(this.name,style,val)}
MObject.prototype.isActive=function(){return this.active}
MObject.prototype.add=function(txt){this.write(this.content+txt)}
MObject.prototype.write=function(txt){this.content=txt;layerWrite(this.name,txt);}
MObject.prototype.read=function(){return layerRead(this.name);}
MObject.prototype.activeStart=function(){}
MObject.prototype.activeEnd=function(){}
MObject.prototype.show=function(){this.setStyle('visibility','visible');}
MObject.prototype.hide=function(){this.setStyle('visibility','hidden');}

MObject.prototype.resizeTo=function(w,h){
  if(!isNaN(w)){this.width=w;this.setStyle('width',w)}
  if(!isNaN(h)){this.height=h;this.setStyle('height',h)}
}

MObject.prototype.setPosition=function(x,y) {
  xOff=getOffsetX();yOff=getOffsetY();
  if (this.scrolling == true) {layerPosition(this.name,x+xOff,y+yOff);if(!isNaN(x))this.xc=x+xOff;if(!isNaN(y))this.yc=y+yOff;}
  else {layerPosition(this.name,x,y);if(!isNaN(x))this.xc=x;if(!isNaN(y))this.yc=y}
}

MObject.prototype.startFollow=function() {
  if (this.moveable) {
    if(debug)status='started moving window.'
    followObjLyr=this.name;
    if (this.updzi) {this.setZIndex(maxZIndex);maxZIndex++}
    followObjXo=sdox-this.xc;followObjYo=sdoy-this.yc;followObj=true;
  }
}

MObject.prototype.stopFollow=function() {
  if(debug)status='stopped moving window: '+newX+','+newY+'.';
  if (followObj) {this.xc=newX;this.yc=newY;followObj=false}
}

MObject.prototype.addAnimQueue=function(anim) {
  this.animQueue.push(anim);
}

MObject.prototype.startAnim=function() {
  this.checkAnim();
}

MObject.prototype.continueAnim=function() {
  action=this.animQueue.shift();
  eval(action);
}

MObject.prototype.checkAnim=function() {
  if (this.animQueue.length!=0) {
    if (this.action==0) {
      this.continueAnim();
    }
    setTimeout(this.objn+'.checkAnim()', delay);
  }
}

// Object Ende
//////////////


//Container Object
function Container() {this.list=new Array()}

Container.prototype.remove=function(remString){
  this.removePersonal(remString);
  myLength=this.list.length;var snum=null;
  for (i=0;i<myLength;i++){if(this.list[i]==remString) {snum=i;break}}
  if (snum) {this.list[snum]=this.list[myLength-1];this.list.length=this.list.length-1;}
}
Container.prototype.add=function(s){
  myLength=this.list.length;var snum=null;
  for (i=0;i<myLength;i++){if(this.list[i]==s) {snum=i;break}}
  if (!snum) {this.list[this.list.length]=s}
  this.addPersonal(s)
}
Container.prototype.addPersonal=function(s){}
Container.prototype.removePersonal=function(s){}

// Object Ende
//////////////

// jaja ist vom Macromedia Dreamweaver geklaut.
function MM_reloadPage(init) {  //lädt das Fenster neu, wenn Netscape 4 maximiert/ minimiert wird
  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();
}
MM_reloadPage(true);


function setToolTips(torf) {
  if (torf) {
    enableToolTips=true;
    helpo=new MObject('tooltip','helpo');
  } else {enableToolTips=false}
}

function screenWidth() {
  if (opera||ns4||ns6) {return window.innerWidth}
  else if (ie4||ie5||ie6) {return document.body.offsetWidth}
}

function screenHeight() {
  if (opera||ns4||ns6) {return window.innerHeight}
  else if (ie4||ie5||ie6) {return document.body.offsetHeight}
}

function getOffsetX() {
  if (ns4||ns6) {return window.pageXOffset}
  else if (ie4||ie5||ie6) {return document.body.scrollLeft}
}

function getOffsetY() {
  if (ns4||ns6) {return window.pageYOffset}
  else if (ie4||ie5||ie6) {return document.body.scrollTop}
}

function moveit(was,x1,y1,x2,y2,s,w){
  if(w) {setTimeout('moveit("'+was+'",'+x1+','+y1+','+x2+','+y2+','+s+','+(w-1)+')', delay)}
  else {
    eval(was+'.setPosition('+x1+','+y1+');');
    x1+=(x2-x1)/s;y1+=(y2-y1)/s;
    if(s>0) {setTimeout('moveit("'+was+'",'+x1+','+y1+','+x2+','+y2+','+(s-1)+')', delay)}
    else {eval(was+'.action=0;');}
  }
}

function existLayer(layer) {
  if (ie6||ns6||opera||dom) {return (document.getElementById(layer))? true:false}
  else if (ns4) {return (document.layers[layer])? true:false}
  else if (ie4||ie5) {return (document.all[layer])? true:false}
}

function setStylee(layer,style,val) {
  if (ie6||ns6||opera||dom) {
    if (document.getElementById(layer)) {
      eval('document.getElementById(\"'+layer+'\").style.'+style+'="'+val+'"');
    } else {if (debug){alert('SDO.setStylee: Layer \''+layer+'\' existiert nicht.')}}
  } else if (ie4||ie5) {
    if (document.all[layer]) {
      eval('document.all.'+layer+'.style.setAttribute("'+style+'","'+val+'","false");');
    } else {if (debug){alert('SDO.setStylee: Layer \''+layer+'\' existiert nicht.')}}
  }
}


function layerPosition(layer,x,y) {
  x=parseFloat(x);y=parseFloat(y);
  if (ie4||ie5||ie6||ns6||opera||dom) {
    if (!isNaN(x))setStylee(layer,'left',x);
    if (!isNaN(y))setStylee(layer,'top',y);
  } else if (ns4) {
    if (! document.layers[layer]) {if (debug){alert('SDO.layerPosition: Layer \''+layer+'\' existiert nicht.')}}
    if (!isNaN(x))document.layers[layer].left=x;
    if (!isNaN(y))document.layers[layer].top=y;
  }
}

function layerWrite(layer,txt) {
  if (ns6||ie6||dom) {document.getElementById(layer).innerHTML=txt;}
  else if (ns4) {var lyr=document.layers[layer].document;lyr.open();lyr.write(txt);lyr.close();}
  else if (ie4||ie5) {document.all[layer].innerHTML=txt;}
}

function layerRead(layer) {
  if (ns6||ie6||dom) {return document.getElementById(layer).innerHTML}
  else if (ie4||ie5) {return document.all[layer].innerHTML}
}

function layerWriteOuter(layer,txt) {
  if (ns6||ie6||dom) {document.getElementById(layer).outerHTML=txt;}
  else if (ie4||ie5) {document.all[layer].outerHTML=txt;}
}

function layerReadOuter(layer) {
  if (ns6||ie6||dom) {return document.getElementById(layer).outerHTML}
  else if (ie4||ie5) {return document.all[layer].outerHTML}
}

//Mausfunktionen erfassen
function mouseMove(e) {
  if (!e) var e = window.event;
  var xOff=getOffsetX();var yOff=getOffsetY();
  if (ns4||ns6) {sdox=e.pageX; sdoy=e.pageY;}
  if (ie4) {sdox=event.x; sdoy=event.y;}
  if (dom) {sdox=e.pageX; sdoy=e.pageY;}
  if (ie5||ie6) {sdox=event.x + xOff; sdoy=event.y + yOff;}
  //sdox und sdoy enthalten nun absolute Positionen im Dokument
  if (isHelp && enableToolTips && helpo.valid) {helpo.setPosition(sdox-4,sdoy+20)}
  if (debug)status=(event.x+','+event.y+','+xOff+','+yOff+','+e.pageX+','+e.pageY+','+e.clientX+','+e.clientY)
//  if (debug)status=(sdox+','+sdoy)
  for (i=0;i<aList.list.length;i++) {
    as=eval(aList.list[i]+'.isActive()');
    if (as != eval(aList.list[i]+'.mma')) {
      if (as) {eval(aList.list[i]+'.mma=true;');eval(aList.list[i]+'.activeStart()')}
      else {eval(aList.list[i]+'.mma=false;');eval(aList.list[i]+'.activeEnd()')}
    }
  }
  if (followObj) {
    newX=sdox-followObjXo;
    newY=sdoy-followObjYo;
    layerPosition(followObjLyr,newX,newY);
  }
}

// wenn text == '' wird toolTip gelöscht
// ansonsten wird er angezeigt
function toolTip(text) {
  if (helpo.valid) {
    if (text && initialized) {
      helpo.setPosition(sdox-4,sdoy+20);
      var txt = '<div class="content">'+text+'</div>';
      helpo.write(txt);
      isHelp=true;
    } else {
      helpo.write('');
      isHelp=false;
    }
  }
} 

function checkBrowser() {
  // Browsercheck
  dom = (document.getElementById)? true:false;
  ns4=(document.layers)? true:false;
  ns6=((navigator.userAgent.indexOf('Mozilla')>=0) && (navigator.appVersion.substring(0,1) >= "5"))? true:false;
  ie4=(document.all)? true:false;
  ie5=(ie4)? ((navigator.userAgent.indexOf('MSIE 5')>0)? true:false):false;
  ie6=(ie4)? ((navigator.userAgent.indexOf('MSIE 6')>0)? true:false):false;
  if (ie6 == true) {ie4=false;}
  opera=(navigator.userAgent.indexOf('Opera')>=0)? true:false;
  mac = navigator.platform == "Mac";
}

//SDO für nicht browserkritsche Funktionen initieren
function initSDO_soft() {
  checkBrowser();
}

//SDO mit dynamischen Elementen initieren
function initSDO() {
  checkBrowser();
  if (opera) {
    if(operaWarning) alert('Hallo Operabenutzer,\ndiese Webseite benutzt die SDO-Bibliothek für dynamische Webseiten. Falls es zu Problemen mit der Anzeige kommt oder Elemente nicht erscheinen, benutzen Sie bitte einen Netscape oder Internet-Explorer ab Version 4.\n\nDanke');
  } else if (! ((ns4)||(ns6)||(ie4)||(ie5)||(ie6))) { //wenn keiner der neueren Browser...
    alert('Sie verwenden leider einen älteren Browser.\nDamit können diese Seiten leider nicht korrekt dargestellt werden.\n\nWenn möglich verwenden Sie einen Netscape oder Internet-Explorer ab Version 4.\n\nDanke');
  }
  //Mausbewegungen erfassen
  document.onmousemove=mouseMove;
  if (ns4) document.captureEvents(Event.MOUSEMOVE);

  //Tooltip und activityList erzeugen
  aList=new Container();
  if (enableToolTips) {helpo=new MObject('tooltip','helpo');}
  initialized = true;
  setTimeout('initDevices()',10);
}

function initDevices() {}
