<!--
/* ---------------- vertikaler Scroller mit Schieberegler. By Thomas Bayer, 2005/2009
Die Reihenfolge der DIVs:
	1.div_sichtbar (das ganze Ding)
		2.div_regler(Regelbereich)
			3.div_drag(der Knopf)
				4.div_inhalt(der Inhalt, beschnitten vom Untergrund)
Die DIVs können/sollen relativ sein für beliebige Position in der Seite
Der Drag-Knopf darf auch in der Mitte positioniert werden
Die Angabe des Parameters "dragover" bestimmt den Abstand des Drag-Knopfs vom Ende des Regelbereichs, 
	damit können End-Grafiken im Regelbereich benutzt werden.

*/

// Browsercheck
var iex = document.all ? true:false;	// IE6, IE7, hat Vorrang vor ebenfalls erkennbarer DOM Eigenschaft des IE !!
var dom = document.getElementById ? true:false;	// Firefox, Opera, (IE6, IE7 eingeschränkt)
var nn4 = document.layers ? true:false;	// absolut veraltet für Netscape 4

// Koordinaten und Parameter, dynamische Ermittlung aus CSS/Positionierung
var yTopRegler;	// absolute Y-Position des Reglers
var hRegler;	// Höhe des Reglers

// Schiebereglerknopf, halbe Breite und volle Höhe (alt)
var xDragMiddle;   // absolute X Koordinate der Reglerschienenmitte (?) = x des Layers + Regler-gif/2 
var wDrag;
var hDrag;

// dynamische Layerkoordinaten div_drag und div_inhalt, oben
var yPageOffset; // Offset des Untergrundlayers in Seite zur Transformation absoluter Mauskoordinaten in relative Koordinaten
var maxTopDrag;	// relative oberste Position des Drag-Knopfs
var maxLowDrag;	// relative unterste Position des Drag-Knopfs
var topInhalt;
var topDrag;	  // relative Y-Position des Drag-Knopfs in übergeordnetem Layer
var yDragTop;  // absolute Y-Position des Drag-Knopfs 
var scale;		// Scrollmaßstab: 1 Pixel des Schiebereglers = x Pixel im Inhaltslayer, dynamisch berechnet

// dynamische Mouseparameter
var mDown=false;
var mYold=0;
var mX=0;
var mY=0;

var debug=false;	// zur anzeige von alerts und sonstigen spezialanweisungen

function findObj(n, d) { //v4.01
  var p,i,x;
  if(!d) d=document;
  if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document;
	n=n.substring(0,p);
  }
  if(!(x=d[n])&&d.all) x=d.all[n];
  for(i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n);
  return x;
}

function getY(oElement) {
   var iReturnValue = 0;
   while (oElement != null) {
     iReturnValue += oElement.offsetTop;
     oElement = oElement.offsetParent;
   }
   return iReturnValue;
}
		
function getX(oElement) {
   var iReturnValue = 0;
   while (oElement != null) {
       iReturnValue += oElement.offsetLeft;
       oElement = oElement.offsetParent;
   }
   return iReturnValue;
}

function showdebug(a,d,i,s) {
	tmp=findObj('aktion'); if(tmp) tmp.value=a;
	tmp=findObj('d'); if(tmp) tmp.value=d;
	tmp=findObj('i'); if(tmp) tmp.value=i;
	tmp=findObj('s'); if(tmp) tmp.value=s;
}

// MouseHandler
function getMouse(e){
	mYold=mY;
	if(iex){
		mX=event.clientX;
		mY=event.clientY;
	}
	else {
		mX=e.pageX;
		mY=e.pageY;
	}
	if (debug) {
		tmp=findObj('xx'); tmp.value=mX;
		tmp=findObj('yy'); tmp.value=mY;		
	}
}

// Eventhandler
function evt_mouse_up(e){
	mDown=false;
	if(iex) document.erzeugefehler();
	/* ein Scriptfehler bringt das Script zum halten und der Internet Explorer reagiert anschließend auf weitere Navigationsklicks normal 
	   Andernfalls passiert folgendes: Wenn man den Reglerknopf über das Ende weiterschiebt, sind die Menü-MouseOvers "tot", scheinbar weil hier irgendwas endlos blockiert.
	   Die Koordinaten stimmen jedoch alle, es muß ein Bug im IE sein, der hier Probleme macht. */
	else return true;
}

function evt_mouse_down(e){
	getMouse(e);
	getTops();	
	// MouseX innerhalb Reglerbreite und MouseY innerhalb gesamter Reglerhöhe
	if((mX>xDragMiddle-wDrag)&&(mX<xDragMiddle+wDrag)&&(mY>yTopRegler)&&(mY<yTopRegler+hRegler)){
		mDown=true;
		// wenn Klick in Reglerschiene, dann Sprung nach oben/unten durchführen
		if(mY<yDragTop) {
			if (debug) showdebug("pageup",topDrag,mY,yDragTop);
			MoveUp(Math.abs(mY-yDragTop-10));   // wieso 10??? ist das die Schrittweite beim scrollen für 10 pixel hohe Schrift z.B. ?
		}	
		else if(mY>yDragTop+hDrag) {
			if (debug) showdebug("pagedown",topDrag,mY,yDragTop);
			MoveDown(Math.abs(mY-yDragTop-10));
		}
		return false;
	}
	else return true;
}

function evt_mouse_move(e){
	getMouse(e);
	return Move(mX,mY);
}

/* Position des Inhalts merken/setzen bei onLoad/onUnload */
function setzen() {
	if (document.cookie) {
		tmp=document.cookie.split(";");
		tmp=tmp[0].split("#");
		//alert(document.cookie+" tmp0:"+tmp[0]+" tmp1:"+tmp[1]);
		topDrag=eval(tmp[0]); // OK
		topInhalt=eval(tmp[1]);  // fehler...?
		MoveItems(0);
	}
}
function merken() {
	getTops();
	//tmp=topDrag+"#"+topInhalt+";";
	//alert(document.getElementById('div_inhalt').style.top+"\n"+topInhalt);
	document.cookie=topDrag+"#"+topInhalt+";"; //+" expires=Thu, 01-Jan-70 00:00:01 GMT;";
}

// Bewegungsfunktionen
function getTops(){
	topDrag=parseInt(document.getElementById('div_drag').style.top);
	topInhalt=parseInt(document.getElementById('div_inhalt').style.top);
	tmp=findObj('div_drag');
	yDragTop=getY(tmp);
}

function MoveItems(step){ 	// Drag-Div und Inhalt-Div relativ positionieren
	document.getElementById("div_drag").style.top = topDrag - step;
	document.getElementById("div_inhalt").style.top = topInhalt + (scale*step);
}

function MoveUp(step){
	// Bregrenzung des Drag-Buttons
	if(topDrag-step<maxTopDrag) step=Math.abs(topDrag-maxTopDrag);	
	MoveItems(step);
}

function MoveDown(step){
	// Bregrenzung des Drag-Buttons
	if(topDrag+step>maxLowDrag) step=Math.abs(maxLowDrag-topDrag);	
	MoveItems(-step);
}

function Move(mX,mY){
	getTops();
	if (debug && mDown) showdebug("move",topDrag,mY,maxLowDrag);
	if(mDown) {
		if(mY<mYold){
			MoveUp(Math.abs(mY-mYold));
		}
		else if(mY>mYold){
			MoveDown(Math.abs(mY-mYold));
		}	
	}
	return false;
}

// Initialisierung des Scrollers, .top Werte sind relative Style-Definitionen !!!!
function initscr(dragover){

	// relative Positionen/Masse
    yPageOffset = parseInt(document.getElementById("div_sichtbar").style.top);
	wDrag = parseInt(document.getElementById("div_drag").style.width);
	hDrag = parseInt(document.getElementById("div_drag").style.height);
	hRegler = parseInt(document.getElementById("div_regler").style.height);
	hInhalt = parseInt(document.getElementById("div_inhalt").style.height);
	
	getTops();
	tmp=findObj('div_drag');
	xDragMiddle=getX(tmp);	// absoluter Wert im Browser für Vergleich mit Mausposition

	tmp=findObj('div_regler');
	yTopRegler=getY(tmp);	// absoluter Wert im Browser für Vergleich mit Mausposition

	// die relative Position  der Oberkante des Drag-Buttons im rollbaren Bereich feststellen 
	maxTopDrag = dragover-hRegler; // plus weil die Koordinaten oben anfangen !!
	maxLowDrag = -(hDrag+dragover);	// oberkante des Drag-Buttons wenn er "unten" anschlägt
	
	// wenn der Schieberegler nicht komplett genutzt wird, wird angenommen, dass der Knopf am obersten Punkt anwo der Knopf anfängt und den freien Bereich abziehen
	// ScrollLaenge = Länge des Reglers + Höhe des Knopfs, wenn der Knopf am Ende über den Regler drüberschaut wie in Realität auch 
	scrollMax = hRegler-dragover; 
	scale =  hInhalt / scrollMax;
	scale = Math.round(scale-0.5); // auf ganze Zahl runden

	if (debug) showdebug("initscr",maxLowDrag,topInhalt,yDragTop);
	
	//events Initialisieren
	document.onmousedown = evt_mouse_down;
	document.onmouseup   = evt_mouse_up;
	document.onmousemove = evt_mouse_move;
}	
//-->
