/*
	dragObject
	Version: 1.3.0
  =========================================================
    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 Funkionalitaet.
  Mit dem Aufruf der ini() Funktion k?nne die Objekten
  nachtraegliche 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.
  Tatsaechlich 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
})();


//##############################################

//Das Objekt, das gerade bewegt wird.
var dragobjekt = null;

// Position, an der das Objekt angeklickt wurde.
var dragx = 0;
var dragy = 0;

// Mausposition
var posx = 0;
var posy = 0;


function draginit() {
 // Initialisierung der Überwachung der Events

  document.onmousemove = drag;
  document.onmouseup = dragstop;
}


function dragstart(element) {
   //Wird aufgerufen, wenn ein Objekt bewegt werden soll.

  dragobjekt = element;
  dragx = posx - dragobjekt.offsetLeft;
  dragy = posy - dragobjekt.offsetTop;
}


function dragstop() {
  //Wird aufgerufen, wenn ein Objekt nicht mehr bewegt werden soll.

  dragobjekt=null;
}


function drag(ereignis) {
  //Wird aufgerufen, wenn die Maus bewegt wird und bewegt bei Bedarf das Objekt.

  posx = document.all ? window.event.clientX : ereignis.pageX;
  posy = document.all ? window.event.clientY : ereignis.pageY;
  if(dragobjekt != null) {
    dragobjekt.style.left = (posx - dragx) + "px";
    dragobjekt.style.top = (posy - dragy) + "px";
  }
}
//-->



