ZINDEX_OFFSET = 1000;


function fix_event(event) {
    if (!event) {
        event = window.event;
    }
    if (event.target) {
	    if (event.target.nodeType == 3) event.target = event.target.parentNode;
    } else if (event.srcElement) {
	    event.target = event.srcElement;
    }
    return event;
}



Drag = function(win, caption, size_btn) {

    var div = win;
    var dragging = false;

    var offset = {left: 0, top: 0};
    var oldSize =  {width: 0, height: 0};


    function calcOffset(event) {
        event = fix_event(event);

        var pos = getElPos(div);
        offset.left = event.clientX - pos.left;
        offset.top = event.clientY - pos.top;
    }

    function drag(event) {
        event = fix_event(event);
    	
        if(dragging) {
            var l = event.clientX - offset.left;
            var h = event.clientY - offset.top;

            div.style.left = l + "px";
            div.style.top = h + "px";
        }
    }


    function resize(event) {
        event = fix_event(event);
        if(dragging) {
            var w = oldSize.width + event.clientX - offset.left;
            var h = oldSize.height + event.clientY - offset.top;
            if(w >= kernel.getWidget(div.wid).cfg.minSize.width) {
                div.style.width = w + "px";
            }
            if(h >= kernel.getWidget(div.wid).cfg.minSize.height) {
                div.style.height = h + "px";
            }
            kernel.getWidget(div.wid).resizeContent();           
        }
    }


    function stopDrag(event) {
        event = fix_event(event);

        dragging = false;
        
        document.onmousemove = null;
        document.onmouseup = null;
        document.ondrag = null;
        document.body.onselectstart = null;
        document.onselectstart = null;

        kernel.getWidget(div.wid).savePosition();
    }


    function startDrag(event, mode) {
        event = fix_event(event);

        document.ondrag = function () { return false; }
        document.onselectstart = function () { return false; }
        document.body.onselectstart = function () { return false; }   
        
        dragging = true;

//        calcOffset(event);
        
        if(mode == "drag") {
            offset.left = event.clientX - div.offsetLeft;
            offset.top = event.clientY - div.offsetTop;

            document.onmousemove = function(event) { drag(event) }
            document.onmouseup = function(event) { stopDrag(event) }
        } else {
            offset.left = event.clientX;
            offset.top = event.clientY;

            oldSize.width = div.offsetWidth;
            oldSize.height = div.offsetHeight;

            document.onmousemove = function(event) { resize(event) }
            document.onmouseup = function(event) { stopDrag(event) }
        }
        
        kernel.getWidget(div.wid).putOnTop();

        if(div.onDragStart)
            div.onDragStart(event.clientX, event.clientY);
    }



    this.drag = drag;
    this.stopDrag = stopDrag;    
    this.startDrag = startDrag;
    this.calcOffset = calcOffset;

    caption.onmousedown = function(event) { 
        event = fix_event(event);
        if(dragging) {
            stopDrag(event);
        } else {
            var e = event.target;
            
            while(e.onclick == null && e != this) {
                e = e.parentNode;
            }
            if(e == this) startDrag(event, "drag"); 
        }
    }

    size_btn.onmousedown = function(event) { 
        event = fix_event(event);
        if(dragging) {
            stopDrag(event);
        } else {
            var e = event.target;
            
            while(e.onclick == null && e != this) {
                e = e.parentNode;
            }
            if(e == this) startDrag(event, "resize"); 
        }
    }

}




// mode: drag, menu, all
EntityHandler = function(el, mode, menu) {
    var div = el;
    var menu = menu ? menu : null;
    var divClone = null;
    var dragging = false;

    var offset = {left: 0, top: 0};
    var startPos = {left: 0, top: 0};

    function waitForDrag(event) {
        event = fix_event(event);
        if( (Math.abs(event.clientX - startPos.left) > 4) || (Math.abs(event.clientY - startPos.top) > 4)) {
            desktop.isFileDrag = true;
            
            dragging = true;
            
            offset = {left: Math.round(div.offsetWidth / 2),
                      top: Math.round(div.offsetHeight / 2)};

            document.onmousemove = function(e) { drag(e) }
            document.onmouseup = function(e) { stopDrag(e) }

            divClone = div.cloneNode(true);
            divClone.style.cssText = "opacity: 0.75; -moz-opacity: 0.75; -khtml-opacity: 0.75; filter: alpha(opacity=75);";
            document.body.appendChild(divClone);
            divClone.style.position = 'absolute';
            desktop.maxZIndex++;        
            divClone.style.zIndex = desktop.maxZIndex;
        }
    }


    function drag(event) {
        if(dragging) {
            event = fix_event(event);
            divClone.style.left = (event.clientX - offset.left) + "px";
            divClone.style.top = (event.clientY - offset.top) + "px";
        }
    }



    function startDrag(event) {
        event = fix_event(event);
        document.ondrag = function () { return false; }
        document.body.ondrag = function () { return false; }
        document.onselectstart = function () { return false; }
        document.body.onselectstart = function () { return false; }   
        
        document.onmousemove = function(e) { waitForDrag(event) }
        document.onmouseup = function(e) { stopDrag(event) }

        startPos = {left: event.clientX, top: event.clientY};
        return false;
    }


    function stopDrag(event) {
        event = fix_event(event);
        dragging = false;

        document.onmousemove = null;
        document.onmouseup = null;
        document.ondrag = null;
        document.body.onselectstart = null;
        document.onselectstart = null;

        desktop.isFileDrag = false;

        if(div.onmouseout) {
            div.onmouseout();
        }

        if(divClone) {
            deleteEl(divClone);
        }

        if(isPosInObj({left: event.clientX, top: event.clientY}, desktop.elements["trash"])) {
            desktop.deleteEntity(div.entityInfo);
            deleteEl(div);
        }
    }

 

    if(mode == "all" || mode == "menu") {
        if(menu) {
            div.oncontextmenu = function(event) { 
                event = fix_event(event);
                desktop.activeEntity = div.entityInfo;
                var s = mozilla_nav ? getWindowScroll() : { left: 0, top: 0};
                desktop.showMenu(menu, {left: event.clientX + s.left, top: event.clientY + s.top});

                if (event.stopPropagation) {
                    event.stopPropagation();
                    event.preventDefault();
                } else if(window.event) {
                    window.event.cancelBubble = true;
                    window.event.returnValue = false;			
                }

                return false;
            }
        }
    }


    if(mode == "all" || mode == "drag") {
        div.onmousedown = function(event) { 
            desktop.hideActiveMenu();
            desktop.hideActivePopup();
            desktop.activeEntity = div.entityInfo;
            event = fix_event(event);
            if(dragging) {
                stopDrag(event);
            } else {
                startDrag(event);
            }
            return false;
        }
    }


}
