/**
*
* JavaScript knihovna implementující drag&drop
*
* @package		sllibs3
* @subpackage	jslibs
* @version		$Id: sl.image.js 5166 2008-09-30 09:41:50Z filip $
* @encoding		UTF-8
* @author		Michal Kouďa <michal.kouda@e4you.cz>
* @copyright	(c) e4you spol. s r.o. 2002-2008, <design@e4you.cz>
*
* Obsah tohoto souboru je majetkem e4you spol. s r.o. Jeho kopírování,
* pozměňování, šíření a jakékoli další využití je možné výhradně
* se souhlasem e4you spol. s r.o.
*
*/

/// pokud neexistuje jmenný prostor sl. vytvoříme ho
if(!sl) { var sl = {} };

/// definujeme modul a jeho metody
sl.dragAndDrop = {

	/**
	 * Počáteční X souřadnice myši
	 */
	initialMouseX: undefined,

	/**
	 * Počáteční Y souřadnice myši
	 */
	initialMouseY: undefined,

	/**
	 * Počáteční X souřadnice objektu
	 */
	startX: undefined,

	/**
	 * Počáteční Y souřadnice objektu
	 */
	startY: undefined,

	/**
	 * Pozicovaný objekt
	 */
	draggedObject: undefined,

	/**
	 * Pozicovaný objekt, pokud není detekován z události, ale je
	 * inicializován při volání funkce initElement
	 *
	 * v IE modelu detekce událostí mohou nastat u vnořených prvků problémy -
	 * nelze v něm správně určit, na kterém prvku událost nastala (tedy který prvek se má pozicovat)
	 */
	presetedDraggedObject: undefined,

	/**
	 * Inicializuje drag&drop na předaném objektu
	 *
	 * @param element string Objekt, kterému se má přiřadit drag&drop handler
	 * @param preset_dragged_object boolean Má-li se inicializovaný objekt nastavit jako přesouvaný (nebude detekován z události)
	 */
	initElement: function (element,preset_dragged_object) {
		sl.event.addHandler(element,'mousedown',sl.dragAndDrop.startDragMouse);
		/// pokud není zapnuta detekce přesouvaného objektu z události
		/// budeme přesouvat inicializovaný objekt
		if (preset_dragged_object == true) {
			sl.dragAndDrop.presetedDraggedObject = element;
		}
	},

	/**
	 * Ostraní drag&drop na předaném objektu
	 */
	detachElement: function (element) {
		sl.event.removeHandler(element,'mousedown',sl.dragAndDrop.startDragMouse);
	},

	/**
	 * Zahájí drag&drop
	 */
	startDragMouse: function (e) {
		var evt = e || window.event;
		/// pokud je inicializován přesouvaný objekt, použijeme ho
		if (sl.dragAndDrop.presetedDraggedObject) {
			sl.dragAndDrop.startDrag(sl.dragAndDrop.presetedDraggedObject);
		/// pokud není, detekujeme ho podle události
		} else {
			/// sl.dragAndDrop.startDrag(this);
			/// nalzeneme zdrojový element události - MSIE || Gecko
			var src_element = evt.srcElement || this;
			sl.dragAndDrop.startDrag(src_element);
		}
		sl.dragAndDrop.initialMouseX = evt.clientX;
		sl.dragAndDrop.initialMouseY = evt.clientY;
		sl.event.addHandler(document, 'mousemove', sl.dragAndDrop.dragMouse);
		sl.event.addHandler(document, 'mouseup', sl.dragAndDrop.releaseElement);
		return false;
	},

	/**
	 * @todo doplnit komentář
	 */
	startDrag: function (obj) {
		if (sl.dragAndDrop.draggedObject) {
			sl.dragAndDrop.releaseElement();
		}
		sl.dragAndDrop.startX = obj.offsetLeft;
		sl.dragAndDrop.startY = obj.offsetTop;
		sl.dragAndDrop.draggedObject = obj;
		sl.dom.addClass(obj,'slElementDragged');
	},

	/**
	 * Obsluhuje pohyb myši
	 */
	dragMouse: function (e) {
		var evt = e || window.event;
		var dX = evt.clientX - sl.dragAndDrop.initialMouseX;
		var dY = evt.clientY - sl.dragAndDrop.initialMouseY;
		sl.dragAndDrop.setPosition(dX,dY);
		return false;
	},

	/**
	 * Pozicuje element na předané souřadnice
	 */
	setPosition: function (dx,dy) {
		sl.dragAndDrop.draggedObject.style.left = sl.dragAndDrop.startX + dx + 'px';
		sl.dragAndDrop.draggedObject.style.top = sl.dragAndDrop.startY + dy + 'px';
	},

	/**
	 * Uvolní z objektu událostni drag&drop
	 */
	releaseElement: function() {
		sl.event.removeHandler(document, 'mousemove', sl.dragAndDrop.dragMouse);
		sl.event.removeHandler(document, 'mouseup', sl.dragAndDrop.releaseElement);
		sl.dom.removeClass(sl.dragAndDrop.draggedObject,'slElementDragged');
		sl.dragAndDrop.draggedObject = null;
	}

}

