/*
	dragObject
	Version: 1.3.0
	
	
	1.3.0 (23.08.2008)
	* Bugs beseitigt
	* ondrop erweitert, 
	  gibt dieser Event false zur�ck, 
	  wird das Objekt wieder an den Ausgangspunkt plaziert.
	* obj()-Methode eingef�gt. gibt das Objekt zur�ck.
	* getPos() verbessert.
	1.2.4 (02.09.2007)
	* 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

  =========================================================
    DragObject()
  =========================================================

  Syntax:
  ---------------------------------------------------------
  new DragObject( 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 DragObject( Object )

  Hier ist das Drag und das bewegte Objekt identisch

  new DragObject( )

  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 DragObject 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
  .obj()			- gibt das Objekt zur�ck.

  .ondrag			- Funktionsreferenz, die w�hrend des Dragvorganges aufgerufen wird
  .ondrop			- Funktionsreferenz, am Ende des Dragvorganges aufgerufen wird
  .onstart			- Funktionsreferenz, am Anfang des Dragvorganges aufgerufen wird

  ---------------------------------------------------------
  


*/

(function() {

window.DragObject = function (o_move, o_drag) {

	// private Variabeln
    var obj;            // Dieses Objekt empf�ngt den Event
    var move;           // Dieses Objekt wird bewegt
    var start_pos = []; // Die Startposition des Elements
	var restore_pos;
    var zIndex;
    
	// private Funktionen
    var Index = function(z) { move.style.zIndex = z; };

    this.ini = function(o_move, o_drag) {
		if(!o_move) return alert('kein Objekt');
		move = o_move;
		move.style.position = 'absolute';
		zIndex = move.style.zIndex || 0;

		obj = o_drag && o_drag.nodeType == 1 ? o_drag : o_move;
		obj.style.cursor = 'move';
		
		// Event aktivieren
		var self = this;
		obj.onmousedown = function(e) { dragObject = self; drag_start(e); };
	};
	this.obj = function() { return move;};
	
    this.ondrop = function() {return true;};
    this.ondrag = function() {return true;};
	this.onstart = function() {return true;};
    
	this.getPos = function() {
		return [move.offsetTop, move.offsetLeft, move.offsetHeight, move.offsetWidth];
	};
    
	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) {
		restore_pos = this.getPos();
		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); 
		if(false == this.ondrop(e)) this.setPos( restore_pos[0], restore_pos[1]);
	};
	
	
    if(o_move) this.ini(o_move, o_drag);
	
} // <-- DragObjekt



var dragObject = null;

function drag_start(e) {
	if( !dragObject ) return true;

	dragObject.start(e);
	document.onmouseup   = function (e) {
		document.onmouseup = document.onmousemove = null;
		dragObject.end(e);
		dragObject = null;
		return false;
	};
	document.onmousemove = function(e) {
		if(!dragObject) return end_drag(e);
		dragObject.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
})();