/*
 * Copyright (c) 2008 FIZON GmbH
 * All rights reserved.
 *
 * $Id: pddcontroller.js 1739 2008-08-04 07:50:26Z as $
 */

PDDController = function()
{
	/**
	 * construct()
	 */
	this.construct = function()
	{
		if (typeof PDDController.SingletonObj != 'undefined')
			return;
		PDDController.SingletonObj = this;

		this.initMouseX = 0;
		this.initMouseY = 0;
		this.initObjX = 0;
		this.initObjX = 0;

		this.dragObjs = {}
		this.resizeObjs = {};

		this.ddID = null;
	}


	/**
	 * addObj()
	 *
	 * fuegt ein Object zum bewegen und groesseveraendern dem ddController hinzu.
	 *
	 * @para	doom-obj	zu handhabende Object
	 * @para	doom-obj	object was zum bewegen angefasst werden soll
	 * @para	doom-obj	object was zum groesseaendern angefasst werden soll
	 * @para	function	optional	function die nach bewegen aufgerufen wird
	 * @para	function	optional	function die nach groessenveraenderung aufgerufen wird
	 */
	this.addObj = function(ddObj, dragHandler, resizeHandler, dragCallbackFunction, resizeCallbackFunction)
	{
		this.addDragObj(ddObj, dragHandler, dragCallbackFunction);
		this.addResizeObj(ddObj, resizeHandler, resizeCallbackFunction);
	}


	/**
	 * addDragObj()
	 *
	 * fuegt ein object zum bewegen dem ddController hinzu.
	 *
	 * @para	doom-obj	zu handhabende Object
	 * @para	doom-obj	object was zum bewegen angefasst werden soll
	 * @para	function	optional	function die nach bewegen aufgerufen wird
	 */
	this.addDragObj = function(dragObj, dragHandler, callbackFunction)
	{
		var id = dragObj.id;
		this.dragObjs[id] = {
				dragObj:dragObj,
				dragHandler:dragHandler,
				callbackFunction:callbackFunction};

		dragHandler.setAttribute('ddID', id);
		dragHandler.onmousedown = PDDController.DragStart;
	}


	/**
	 * addResizeObj()
	 *
	 * fuegt ein object zum groesseveraendern dem ddController hinzu.
	 *
	 * @para	doom-obj	zu handhabende Object
	 * @para	doom-obj	object was zum groesseaendern angefasst werden soll
	 * @para	function	optional	function die nach groessenveraenderung aufgerufen wird
	 */
	this.addResizeObj = function(resizeObj, resizeHandler, callbackFunction)
	{
		var id = resizeObj.id;
		this.resizeObjs[id] = {
				resizeObj:resizeObj,
				resizeHandler:resizeHandler,
				callbackFunction:callbackFunction}

		resizeHandler.setAttribute('ddID', id);
		resizeHandler.onmousedown = PDDController.ResizeStart;
	}


	/**
	 * dragStart()
	 *
	 * startet das bewegen eines Objectes
	 *
	 * @para	doom-obj	das object was hinzugefuegt wurde und nun bewegt werden soll.
	 * @para	event		JS-Event
	 */
	this.dragStart = function(objToDrag, e)
	{
		var dd = PDDController.SingletonObj;

		dd.ddID = objToDrag.getAttribute('ddID');
		var e = window.event || e;

		dd.initMouseX = e.clientX;
		dd.initMouseY = e.clientY;

		dd.initObjX = dd.dragObjs[dd.ddID].dragObj.offsetLeft;
		dd.initObjY = dd.dragObjs[dd.ddID].dragObj.offsetTop;

		document.onmousemove = PDDController.SingletonObj.dragMove;
		document.onmouseup = PDDController.SingletonObj.ddStop;
	}

	
	/**
	 * dragMove()
	 *
	 * bewegt das vorher mit dragStart() markierte object.
	 *
	 * @para	event		JS-Event
	 */
	this.dragMove = function(e)
	{
		var dd = PDDController.SingletonObj;
		var obj = dd.dragObjs[dd.ddID].dragObj;

		var e = window.event || e;

		var dX = e.clientX - dd.initMouseX;
		var dY = e.clientY - dd.initMouseY;

		if (obj.offsetLeft + dX + dd.initObjX > 0
		&& obj.parentNode.clientWidth - obj.clientWidth - dX - dd.initObjX > 0)
			dd.dragObjs[dd.ddID].dragObj.style.left = (dX + dd.initObjX)+'px';
		if (obj.offsetTop + dY + dd.initObjY > 0)
		//&& obj.parentNode.clientHeight - obj.clientHeight - dY - dd.initObjY > 0)
			dd.dragObjs[dd.ddID].dragObj.style.top = (dY + dd.initObjY)+'px';

		if (typeof dd.dragObjs[dd.ddID].callbackFunction == 'function')
			dd.dragObjs[dd.ddID].callbackFunction(e);
	}


	/**
	 * ddStop()
	 *
	 * beendet eine ddController action
	 */
	this.ddStop = function()
	{
		document.onmousemove = null;
		document.onmouseup = null;
	}


	/**
	 * resizeStart()
	 *
	 * startet das groessenveraendern eines objects
	 *
	 * @para	doom-obj	das zu veraendernde object
	 * @para	event		JS-Event
	 */
	this.resizeStart = function(objToResize, e)
	{
		this.ddID = objToResize.getAttribute('ddID');

		var e = window.event || e;
	
		this.initMouseX = e.clientX;
		this.initMouseY = e.clientY;

		this.initObjX = this.resizeObjs[this.ddID].resizeObj.clientWidth;
		this.initObjY = this.resizeObjs[this.ddID].resizeObj.clientHeight;

		document.onmousemove = PDDController.SingletonObj.resizeMove;
		document.onmouseup = PDDController.SingletonObj.ddStop;
	}


	/**
	 * resizeMove()
	 *
	 * veraendert die groesse vom object was vorher von resizeStart() markiert wurde.
	 *
	 * @para	event		JS-Event
	 */
	this.resizeMove = function(e)
	{
		var dd = PDDController.SingletonObj;

		var e = window.event || e;

		dd.resizeObjs[dd.ddID].resizeObj.style.width = (e.clientX - dd.initMouseX + dd.initObjX)+'px';
		dd.resizeObjs[dd.ddID].resizeObj.style.height = (e.clientY - dd.initMouseY + dd.initObjY)+'px';

		if (typeof dd.resizeObjs[dd.ddID].callbackFunction == 'function')
			dd.resizeObjs[dd.ddID].callbackFunction(e);
	}

	
	this.construct();
}


/**
 * PDDController.Get()
 *
 * liefert das Controller-Object
 */
PDDController.Get = function()
{
	if (typeof PDDController.SingletonObj == 'undefined')
		new PDDController();

	return PDDController.SingletonObj;
}


/**
 * PDDController.DragStart()
 *
 * startet das bewgen eines hinzugefuegten Objectes
 *
 * @para	event		JS-Event
 */
PDDController.DragStart = function(e)
{
	PDDController.SingletonObj.dragStart(this, e);
}


/**
 * PDDController.ResizeStart()
 *
 * startet das groessenveraendern eines hinzugefuegten objectes
 *
 * @para	event		JS-Event
 */
PDDController.ResizeStart = function(e)
{
	PDDController.SingletonObj.resizeStart(this, e);
}
