
/**
 * File contains JS Library for MessageBox Control
 *
 * JavaScript  version 1
 * @category   JavaScript Libraries
 * @author     NULL <null.is.not.0@gmail.com>
 * @copyright  (c) 2007-2008 by NULL
 * @version    SVN: $Id: 206$
 * @link       NULL <null.is.not.0@gmail.com>
 * @since      File available since Release 2.3.0
 */

/**
 * htmlWindow is the namespace for HTML Window JavaScript functions.
 *
 * @author   NULL <null.is.not.0@gmail.com>
 * @version  $Id: HTMLWindow.js, v 2.3.0 2006/09/18 $
 * @access   public
 * @package  php2
 */
var HTMLWindow = new Object();

    /**
     * Reference to the Dragged Object
     */
    HTMLWindow.draggedObject = null;

    /**
     * Reference to the Dragged Area Object
     */
    HTMLWindow.draggedAreaObject = null;

    /**
     * X Position where drag started
     */
    HTMLWindow.startDPositionX = 0;

    /**
     * Y Position where drag started
     */
    HTMLWindow.startDPositionY = 0;

    /**
     * Max Z Index in current Document
     */
    HTMLWindow.maxDocZIndex = 50;

    /**
     * Object being blinked before start dragging
     */
    HTMLWindow.blinkingObject = null;

    /**
     * Set the object as draggable (mode = true) or not (mode = false), or switch the current mode (mode = 'switch')
     *
     * @var DomElement draggedObject Object To drag
     * @var DomElement draggedAreaObject Object Header which controls Drag
     * @var boolean    dragMode
     * @var boolean    blinkMode Flag indicates - Blink or Not before dragging
     * @var float      objectOpacity Object Opacity
     */
    HTMLWindow.setDraggable = function(draggedObject, draggedAreaObject, dragMode, blinkMode, objectOpacity)
    {
        // HTMLWindow.draggedObject     = draggedObject;
        // HTMLWindow.draggedAreaObject = draggedAreaObject;

    	var dragMode      = ((dragMode == undefined) ? true : dragMode);
    	var blinkMode     = ((blinkMode == undefined) ? true : blinkMode);
    	var objectOpacity = ((objectOpacity == undefined) ? '0.85' : objectOpacity);
    	
    	// --- Checking Is Object Draggable --- //
    	if (String(this.dragMode).toLowerCase() == 'switch')
    	{
    	    draggedObject.isDraggable = (((draggedObject.isDraggable == undefined) || (!draggedObject.isDraggable)) ? true : false);
    	}
    	else
    	{
    	    draggedObject.isDraggable = dragMode;
    	}
    	
    	if (HTMLWindow.isDraggable(draggedObject))
    	{
    		if (draggedObject.style.position != "absolute")
    		{			
    			posX = HTMLElement.findPosX(draggedObject);
    			posY = HTMLElement.findPosY(draggedObject);
    			
    			draggedObject.style.top  = posY + 'px';
    			draggedObject.style.left = posX + 'px';
    			
    			// --- Set transparency --- //
    			draggedObject.style.filter      = "alpha(opasity="+ (objectOpacity * 100) +")";
    			draggedObject.style.MozOpacity  = objectOpacity;
    			draggedObject.style.opasity     = objectOpacity;
    			draggedObject.style.position    = "absolute";
    			
    		}
    		
    		// --- Focusing the Dragging object --- //
    		draggedObject.style.zIndex = ++HTMLWindow.maxDocZIndex;
    		// --- Setting drag-and-drop functions to Dragged object events --- //
    		HTMLWindow.setDragAndDropFunctions(draggedObject, draggedAreaObject);
    		draggedObject.title = "To start drag Click on Window header";
    		
    	}
    	else
    	{
    		HTMLWindow.unsetDraggable(draggedObject, draggedAreaObject);
    	}

    	// --- Blinking Object borders after setDraggable method --- //
    	if (blinkMode)
    	{
    		HTMLWindow.blinkingObject = draggedObject;
    		HTMLWindow.blinkBorder(7, '#ffffff', '#000000', draggedObject.style.border);
    	}

    }

    /**
     * Blink the defined blinkingObject x times
     *
     * @var integer blinkTimes Count of blink times
     * @var string color1 First blink color
     * @var string color2 Second blink color
     * @var string actualBorder Source Borber style
     */
    HTMLWindow.blinkBorder = function (blinkTimes, color1, color2, actualBorder)
    {

    	if (HTMLWindow.blinkingObject == null)	return;
    	
    	if (!blinkTimes)
    	{
    		HTMLWindow.blinkingObject.style.border = actualBorder;
    		// HTMLWindow.blinkingObject = null;
    		return;
    	}
    	
    	if (blinkTimes % 2)
    	{
    	    HTMLWindow.blinkingObject.style.border = "1px solid "+ color1;
    	}
    	else
    	{
    	    HTMLWindow.blinkingObject.style.border = "1px solid "+ color2;
    	}
    		
    	setTimeout('HTMLWindow.blinkBorder ('+ (blinkTimes - 1) + ', "' + color1 + '", "' + color2 + '", "' + actualBorder + '")', 100);
    	
    }
    
    /**
     * Closes Window
     *
     * @var DomElement draggedObject Object To drag
     * @var DomElement draggedAreaObject Object Header which controls Drag
     */
    HTMLWindow.unsetDraggable = function(draggedObject, draggedAreaObject)
    {
        // --- Setting Object as not draggable --- //
		HTMLWindow.unsetDragAndDropFunctions(draggedObject, draggedAreaObject);
		
		/*draggedObject.style.zIndex      = "0";
		draggedObject.style.position    = "relative";
		draggedObject.style.top         = "";
		draggedObject.style.left        = "";
		draggedObject.title             = "";
		
		draggedObject.style.MozOpacity  = "";
		draggedObject.style.opasity     = "";
		draggedObject.style.filter      = "";*/

		// --- Scrolling window to the object position --- //
		// window.scrollTo(HTMLElement.findPosX(draggedObject) - 60, HTMLElement.findPosY(draggedObject) - 60);
    }

    /**
     * Tests if current Object is draggable
     *
     * @var DomElement draggedObject Object To drag
     * @return  boolean
     */
    HTMLWindow.isDraggable = function (draggedObject)
    {
    	return ((draggedObject.isDraggable != undefined) && (draggedObject.isDraggable));
    }


    /**
     * Checks if object can be dragged. If can't, try to drag parent objects
     *
     * @var DomElement draggedObject Object To drag
     */
    HTMLWindow.startDragToObject = function (draggedObject)
    {
    	if (HTMLWindow.isDraggable(draggedObject))
    	{
    	    // --- Object is draggable --- //
    	    HTMLWindow.draggedObject = draggedObject;
    	}
    	else if (draggedObject.parentNode != undefined)
    	{
    	    // --- Parent Object is draggable --- //
    	    HTMLWindow.startDragToObject(draggedObject.parentNode);
    	}
    }


    /**
     * Start a Drag Event
     *
     * @var event onDragEvent Event Structure
     */
    HTMLWindow.startDrag = function (onDragEvent)
    {
    	currentEvent = onDragEvent ? onDragEvent : event;
    	src = currentEvent.srcElement ? currentEvent.srcElement : currentEvent.target;
    	
    	HTMLWindow.startDragToObject(src);
    	if (HTMLWindow.draggedObject != null)
    	{
    		HTMLWindow.startDPositionX = (currentEvent.clientX - HTMLWindow.draggedObject.style.left.replace('px', '') );
    		HTMLWindow.startDPositionY = (currentEvent.clientY - HTMLWindow.draggedObject.style.top.replace('px', '') );
    		HTMLWindow.draggedObject.style.zIndex = ++HTMLWindow.maxDocZIndex;
    	}
    	
    	// --- Fixing Mouse Select --- //
    	HTMLWindow.fixMouseSelect();
    }


    /**
     * Stops a drag event
     *
     * @var event onDragEvent Event Structure
     */
    HTMLWindow.stopDrag = function (onDragEvent)
    {
    	HTMLWindow.draggedObject    = null;
    	HTMLWindow.startDPositionX  = 0;
    	HTMLWindow.startDPositionY  = 0;
    }

    /**
     * Move Dragging Objects though the document
     *
     * @var event onDragEvent Event Structure
     */
    HTMLWindow.doMove = function (onDragEvent)
    {
    	currentEvent = onDragEvent ? onDragEvent : event;
    	src = currentEvent.srcElement ? currentEvent.srcElement : currentEvent.target;

    	if (HTMLWindow.draggedObject != null)
    	{
    		HTMLWindow.draggedObject.style.position  = "absolute";
    		HTMLWindow.draggedObject.style.top       = (currentEvent.clientY - HTMLWindow.startDPositionY) + "px";
    		HTMLWindow.draggedObject.style.left      = (currentEvent.clientX - HTMLWindow.startDPositionX) + "px";
    		
    		/*if (!HTMLWindow.onMMoveID) HTMLWindow.onMMoveID = 1;
    		document.getElementById('tmpContent').innerHTML = 'On Mouse Move: ' + HTMLWindow.onMMoveID++ + " " + HTMLWindow.draggedObject.style.top + " " + HTMLWindow.draggedObject.style.left;*/
    		
    		if (typeof(HTMLWindow.draggedObject.onMove) == 'function') HTMLWindow.draggedObject.onMove();
    		
    		// --- Fixing Mouse Select Bug In IE, Opera and Mozilla --- //
    		HTMLWindow.fixMouseSelect();
    	}
    }
    
    /**
     * If currentEvent.keyCode == ESC key code, then Stop Dragging
     *
     * @var event onDragEvent Event Structure
     */
    HTMLWindow.stopDragOnEsc = function (onDragEvent)
    {
    	currentEvent = onDragEvent ? onDragEvent : event;
    	
    	key = (currentEvent.which == undefined) ? currentEvent.keyCode : currentEvent.which;
    	if (key == 27)
    	{
    	    // --- "ESC" key is Pressed --- //
    	    HTMLWindow.stopDrag(currentEvent);
    	}
    		
    }

    /**
     * Associates the Object events to Drag-And-Drop functions
     *
     * @var DomElement draggedObject Object To drag
     * @var DomElement draggedAreaObject Object Header which controls Drag
     */
    HTMLWindow.setDragAndDropFunctions = function (draggedObject, draggedAreaObject)
    {
        currentDraggedAreaObject = ((draggedAreaObject) ? draggedAreaObject : draggedObject);
    	if (document.all != undefined)
    	{
    	    // --- IE model --- //
    	    currentDraggedAreaObject.attachEvent('onmouseup', HTMLWindow.stopDrag);
		    currentDraggedAreaObject.attachEvent('onmousedown', HTMLWindow.startDrag);
    	}
    	else
    	{
    	    // --- W3C model --- //
    		currentDraggedAreaObject.addEventListener('mouseup', HTMLWindow.stopDrag, false);
		    currentDraggedAreaObject.addEventListener('mousedown', HTMLWindow.startDrag, false);
    	}
    }

    /**
     * Remove associations between objct events and drag 'n' drop functions
     *
     * @var DomElement draggedObject Object To drag
     * @var DomElement draggedAreaObject Object Header which controls Drag
     */
    HTMLWindow.unsetDragAndDropFunctions = function (draggedObject, draggedAreaObject)
    {
        currentDraggedAreaObject = ((draggedAreaObject) ? draggedAreaObject : draggedObject);

    	if (document.all != undefined)
    	{
    	    // --- IE model --- //
    		currentDraggedAreaObject.detachEvent('onmouseup', HTMLWindow.stopDrag);
    		currentDraggedAreaObject.detachEvent('onmousedown', HTMLWindow.startDrag);
    	}
    	else
    	{
    	    // --- W3C model --- //
    		currentDraggedAreaObject.removeEventListener('mouseup', HTMLWindow.stopDrag, false);
    		currentDraggedAreaObject.removeEventListener('mousedown', HTMLWindow.startDrag, false);
    	}
    }

    /**
     * Attaching Drag-And-Drop Events to Document Object
     */
    HTMLWindow.attachDragAndDropEventsToBrowser = function ()
    {
        if (document.all != undefined)
        {
            // --- IE Model --- //
        	document.attachEvent('onmousemove', HTMLWindow.doMove);
        	document.attachEvent('onkeypress', HTMLWindow.stopDragOnEsc);
        }
        else
        {
            // --- W3C Model --- //
        	document.addEventListener('mousemove', HTMLWindow.doMove, false);
        	document.addEventListener('keypress', HTMLWindow.stopDragOnEsc, false);
        }
    }
    
    /**
     * Mouse select Protection Element
     *
     * @var DomElement
     */
    HTMLWindow.mouseSelectProtector = null;
    
    /**
     * Disables mouse selection during drag
     */
    HTMLWindow.fixMouseSelect = function ()
    {
        if (!HTMLWindow.mouseSelectProtector)
        {
            var createString = '<input type="text" id="mouseSelectInputFixx" border="0" style="width: 0px; height: 0px; padding: 0px; margin: 0px; font-size: 0px; border: 0px; display: inline; position: absolute;" />';
            
            if (HTMLWindow.draggedObject != null)
            {
                HTMLWindow.draggedObject.insertAdjacentHTML("afterBegin", createString);
            }
            else
            {
                document.body.insertAdjacentHTML("afterEnd", createString);
            }
            
            HTMLWindow.mouseSelectProtector = document.getElementById('mouseSelectInputFixx');
            HTMLWindow.mouseSelectProtector.disabled = true;
        }
        
        // --- Triyng to fix Mouse Select Bug --- //
        try
        {
            HTMLWindow.mouseSelectProtector.focus();
        }
        catch(e)
        {
            HTMLWindow.mouseSelectProtector.disabled = false;
            HTMLWindow.mouseSelectProtector.focus();
            HTMLWindow.mouseSelectProtector.disabled = true
        }
    }
    
    // --- Attaching Drag-And-Drop Events to Document Object --- //
    HTMLWindow.attachDragAndDropEventsToBrowser();
