/*
   	dragDiv.js
	Sandra Marciniak
	01.11.2007

   1.2.4
   * Der onmove Funktion wird die neu Position übergeben.
   1.2.3
   * onstart Event hinzugefügt
   1.2.2
   * gibt die onDrag Funktion false zurück,
     kann das draggen verhindert werden
   * Doku überarbeitet, Quellcode übersichtlicher gemacht
   1.2.1
   * e.preventDefault() hinzugefügt,
     verhindert das markieren von Text währned des Dragvorgangs

  =========================================================
    DragDiv()
  =========================================================

  Syntax:
  ---------------------------------------------------------
  new DragDiv( Object, Object )

  Das 1. Objekt ist das mit dem man ziehen kann,
  dass zweite ist das was bewegt wird.
  Es muss also in der Hirachie oberhalb des ersten stehen.

  new DragDiv( Object )

  Hier ist das Drag und das bewegte Objekt identisch

  new DragDiv( )

  Es wird ein "leeres" DragObjekt erzeugt ohne Funkionalität.
  Mit dem Aufruf der ini() Funktion könne die Objekten
  nachträgliche zugeordnet werden.
  (in erster Linie wird dies benötigt, bei Objekten,
  die von DragDiv erben)

  DragObjekt.ini( Object [, Object] );
  ---------------------------------------------------------
  Die Parameter haben die gleiche Bedeutung wie bei new.
  Tatsächlich ruft new() die ini Funktion auf,
  wenn ein oder zwei Parameter vorhanden sind.

  Das erzeugte Objekt kennt folgende Methoden:
  ---------------------------------------------------------

  .getPos()          - aktuelle Position des Objektes das bewegt wird
  .setPos(top, left) - positionieren
  .start(e)          - wird intern verwendet
  .move(e)           - wird während des Dragvorganges aufgerufen
  .end(e)            - Ende des Drags

  .ondrag		- Funktionsreferenz, die während des Dragvorganges aufgerufen wird
  .onend		- Funktionsreferenz, am Ende des Dragvorganges aufgerufen wird
  .onstart		- Funktionsreferenz, am Anfang des Dragvorganges aufgerufen wird

  ---------------------------------------------------------
*/

/*	Laedt die DragFunction */
function ladeDrag()	{
	
	/* 	Neues DragDIV-Object.
	 *	Erstes Objekt = Object mit dem das DIV gezogen wird
	 *	Zweites Objekt = Object, das gezogen wird
	 */
	var o = new DragDiv(document.getElementById('accessdrag'), document.getElementById('accessbg'));
	
	/* 	Limit wie weit das DIV gezogen werden kann, in diesem Fall die Fenstergroesse */
    var limit_top = document.body.clientHeight;
    var limit_left = document.body.clientWidth ;
	
	/* 	Funktion ondrag wird waehrend des Dragvorgangs aufgerufen. */
    o.ondrag = function(e, new_top, new_left) {
		/* Wenn das Limit ueberschritten wird, wird der Dragvorgang abgebrochen. */ 
   		if( new_top > limit_top  - document.getElementById('accessbg').offsetHeight || 
			new_left > limit_left  - document.getElementById('accessbg').offsetWidth) { 
			return false;
		}
	}
}

(function() {
		  
	window.DragDiv = function (e_o, o) {

	/* Objekt, dass das Event empfaengt */
    var obj;
	/* Objekt, dass bewegt wird */
    var move;
	/* Startposition des Objekts */
    var start_pos = [];
	
    var zIndex;
    
	// private Funktionen
    var Index = function(z) { 
		move.style.zIndex = z; 
	};

    this.ini = function(e_o, o) {
		if(!e_o) {
			return alert('kein Objekt');
		}
		obj = e_o;
		move = o || e_o;
		zIndex = move.style.zIndex || 0;
		move.style.position = 'absolute';
		obj.style.cursor = 'move';
		
		// Event aktivieren
		var self = this;
		obj.onmousedown = function(e) { 
			DragDiv = self; 
			drag_start(e); 
		};
	};
	
    this.ondrop = function() {
		return true;
	};
	
    this.ondrag = function() {
		return true;
	};
	
	this.onstart = function() {
		return true;
	};
	
    this.getPos = function() {
		var o = move;
		var t = l = 0;
		if(typeof o.offsetTop != 'undefined') {
			t += o.offsetTop;
			l += o.offsetLeft;
		}
		return [t, l];
	};
	
    this.setPos = function(t, l) {
		if(typeof t != 'undefined' && t != null) {
			move.style.top = t + 'px';
		}
		if(typeof l != 'undefined' && l != null) {
			move.style.left = l + 'px';
		}
	};
	
	this.start = function(e) {
		start_pos = this.getPos();
		var evt_pos = getEvtPos(e);
		start_pos[0] -= evt_pos[0];
		start_pos[1] -= evt_pos[1];
		Index(999);
		this.onstart(e);
	};
	
	this.move = function(e) {
		var evt_pos = getEvtPos(e);
		var new_top = evt_pos[0] + start_pos[0];
		var new_left = evt_pos[1] + start_pos[1];
		if( this.ondrag(e, new_top, new_left) != false) {
			this.setPos( new_top, new_left);
		}
    };
	
    this.end  = function (e) { 
		Index(zIndex); 
		this.ondrop(e); 
	};
	
    if(e_o) {
		this.ini(e_o, o);
	}
}

var DragDiv = null;

function drag_start(e) {
	
	if(!DragDiv) {
		return true;
	}
	
	DragDiv.start(e);
	
	document.onmouseup = function (e) {
		document.onmouseup = document.onmousemove = null;
		DragDiv.end(e);
		DragDiv = null;
		return false;
	};
	
	document.onmousemove = function(e) {
		if(!DragDiv) return end_drag(e);
		DragDiv.move( e );
		return false;
	};
	
	if(e && e.preventDefault) {
		e.preventDefault()
	}
	
	return false;
}

/*
 * Hilfsfunktion:
 *
 * getEvtPos(e)
 * ermittelt die Position des Events
 * */
function getEvtPos(e)
{
    if(!e) {
		e = window.event;
	}
    var t = e.pageY ? e.pageY : e.clientY + window.document.body.scrollTop;
    var l = e.pageX ? e.pageX : e.clientX + window.document.body.scrollLeft;
    return [t, l];
}

// Ende und Aufruf der anonymen Funktion
})();
