var HTMLWindow = new Object();
HTMLWindow.draggedObject = null;
HTMLWindow.draggedAreaObject = null;
HTMLWindow.startDPositionX = 0;
HTMLWindow.startDPositionY = 0;
HTMLWindow.maxDocZIndex = 50;
HTMLWindow.blinkingObject = null;
HTMLWindow.setDraggable = function(draggedObject, draggedAreaObject, dragMode, blinkMode, objectOpacity)
{
    var dragMode= ((dragMode == undefined) ? true : dragMode);
    var blinkMode = ((blinkMode == undefined) ? true : blinkMode);
    var objectOpacity = ((objectOpacity == undefined) ? '0.85' : objectOpacity);
    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';
            draggedObject.style.filter= "alpha(opasity="+ (objectOpacity * 100) +")";
            draggedObject.style.MozOpacity= objectOpacity;
            draggedObject.style.opasity = objectOpacity;
            draggedObject.style.position= "absolute";
        }
        draggedObject.style.zIndex = ++HTMLWindow.maxDocZIndex;
        HTMLWindow.setDragAndDropFunctions(draggedObject, draggedAreaObject);
        draggedObject.title = "To start drag Click on Window header";
    }
    else
    {
        HTMLWindow.unsetDraggable(draggedObject, draggedAreaObject);
    }
    if (blinkMode)
    {
        HTMLWindow.blinkingObject = draggedObject;
        HTMLWindow.blinkBorder(7, '#ffffff', '#000000', draggedObject.style.border);
    }

}
HTMLWindow.blinkBorder = function (blinkTimes, color1, color2, actualBorder)
{
    if (HTMLWindow.blinkingObject == null)	return;
    if (!blinkTimes)
    {
        HTMLWindow.blinkingObject.style.border = actualBorder;
        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);
}
HTMLWindow.unsetDraggable = function(draggedObject, draggedAreaObject)
{
        HTMLWindow.unsetDragAndDropFunctions(draggedObject, draggedAreaObject);
}
HTMLWindow.isDraggable = function (draggedObject)
{
    return ((draggedObject.isDraggable != undefined) && (draggedObject.isDraggable));
}
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);
    }
}
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;
    }
    HTMLWindow.fixMouseSelect();
}
HTMLWindow.stopDrag = function (onDragEvent)
{
    HTMLWindow.draggedObject= null;
    HTMLWindow.startDPositionX= 0;
    HTMLWindow.startDPositionY= 0;
}
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 (typeof(HTMLWindow.draggedObject.onMove) == 'function') HTMLWindow.draggedObject.onMove();
        HTMLWindow.fixMouseSelect();
    }
}
HTMLWindow.stopDragOnEsc = function (onDragEvent)
{
    currentEvent = onDragEvent ? onDragEvent : event;

    key = (currentEvent.which == undefined) ? currentEvent.keyCode : currentEvent.which;
    if (key == 27)
    {
    HTMLWindow.stopDrag(currentEvent);
    }
}
HTMLWindow.setDragAndDropFunctions = function (draggedObject, draggedAreaObject)
{
currentDraggedAreaObject = ((draggedAreaObject) ? draggedAreaObject : draggedObject);
    if (document.all != undefined)
    {
    currentDraggedAreaObject.attachEvent('onmouseup', HTMLWindow.stopDrag);
        currentDraggedAreaObject.attachEvent('onmousedown', HTMLWindow.startDrag);
    }
    else
    {
        currentDraggedAreaObject.addEventListener('mouseup', HTMLWindow.stopDrag, false);
        currentDraggedAreaObject.addEventListener('mousedown', HTMLWindow.startDrag, false);
    }
}
HTMLWindow.unsetDragAndDropFunctions = function (draggedObject, draggedAreaObject)
{
currentDraggedAreaObject = ((draggedAreaObject) ? draggedAreaObject : draggedObject);

    if (document.all != undefined)
    {
        currentDraggedAreaObject.detachEvent('onmouseup', HTMLWindow.stopDrag);
        currentDraggedAreaObject.detachEvent('onmousedown', HTMLWindow.startDrag);
    }
    else
    {
        currentDraggedAreaObject.removeEventListener('mouseup', HTMLWindow.stopDrag, false);
        currentDraggedAreaObject.removeEventListener('mousedown', HTMLWindow.startDrag, false);
    }
}
HTMLWindow.attachDragAndDropEventsToBrowser = function ()
{
if (document.all != undefined)
{
    document.attachEvent('onmousemove', HTMLWindow.doMove);
    document.attachEvent('onkeypress', HTMLWindow.stopDragOnEsc);
}
else
{
    document.addEventListener('mousemove', HTMLWindow.doMove, false);
    document.addEventListener('keypress', HTMLWindow.stopDragOnEsc, false);
}
}
HTMLWindow.mouseSelectProtector = null;
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;
}
try
{
HTMLWindow.mouseSelectProtector.focus();
}
catch(e)
{
HTMLWindow.mouseSelectProtector.disabled = false;
HTMLWindow.mouseSelectProtector.focus();
HTMLWindow.mouseSelectProtector.disabled = true
}
}
HTMLWindow.attachDragAndDropEventsToBrowser();
