Qva.DragDrop = { };

Qva.DragDrop.mouseOffset = null;
Qva.DragDrop.DropTargets = [];
Qva.DragDrop.DropFrames  = [];
Qva.DragDrop.DropDefault = null;
Qva.DragDrop.curDrag     = null;
Qva.DragDrop.dragHelper  = null;
Qva.DragDrop.curDrop     = null;
Qva.DragDrop.dragType    = null;
Qva.DragDrop.DragStarted = null;

Qva.DragDrop.GetDropTarget = function (mousePos) {
    // check each drop container to see if our target object is "inside" the container
    for(var i = 0; i < Qva.DragDrop.DropTargets.length; ++i){
        var dropTarget = Qva.DragDrop.DropTargets[i].Inside(mousePos, Qva.DragDrop.curDrag.Type);
        if(dropTarget) return dropTarget;
    }
    if (Qva.Unicorn) {
        for (var i = 0; i < Qva.DragDrop.DropFrames.length; ++i) {
            var dropTarget = Qva.DragDrop.DropFrames[i].Inside(mousePos, Qva.DragDrop.curDrag.Type);
            if (dropTarget) return dropTarget;
        }
        if (Qva.DragDrop.DropDefault) {
            return Qva.DragDrop.DropDefault.Inside(mousePos, Qva.DragDrop.curDrag.Type);
        }
    }   
    return null;
}
Qva.DragDrop.Inside = function(cell, mousePos) {
    var cellPos    = Qva.GetPageCoords(cell);
    var cellWidth  = parseInt(cell.offsetWidth);
    var cellHeight = parseInt(cell.offsetHeight);
    return (mousePos.x > cellPos.x && mousePos.x < cellPos.x + cellWidth &&
        mousePos.y > cellPos.y && mousePos.y < cellPos.y + cellHeight);
}

Qva.DragDrop.mouseMove = function (event) {

    event = event || window.event;
    if (event.preventDefault) 
        event.preventDefault();
    else
        event.returnValue = false;
    if (!Qva.DragDrop.curDrag) debugger;

    var d = new Date();
    if (d.getTime() - Qva.MouseDownStartTime < 200) return
    
    var mousePos = { 'x': event.clientX ,
                     'y': event.clientY };
//    if (Qva.DragDrop.curDrag) {
        var target = Qva.DragDrop.dragElement;
        // if the user is just starting to drag the element
        if(!Qva.DragDrop.DragStarted){
            Qva.DragDrop.DragStarted = true;
            // We remove anything that is in our dragHelper DIV so we can put a new item in it.
            while (Qva.DragDrop.dragHelper.firstChild) Qva.DragDrop.dragHelper.removeChild(Qva.DragDrop.dragHelper.firstChild);
            
            // Make a copy of the current item and put it in our drag helper.
            if (Qva.DragDrop.dragType == "cell") {
                Qva.DragDrop.dragHelper.appendChild(target.cloneNode(true));
                Qva.DragDrop.dragHelper.className = "QvDragRect";
                Qva.DragDrop.dragHelper.style.display = 'block';
                // disable dragging from our helper DIV (it's already being dragged)
                Qva.DragDrop.dragHelper.firstChild.dragObj = null;
            } else {
                // Create a table to hold the table row
                var dragRow = target.cloneNode(true);
                // selected index is not cloned
                var arr = target.getElementsByTagName("select");
                if (arr.length>0) {
                    var arrClone = dragRow.getElementsByTagName("select");
                    for (var i = 0; i < arr.length; i++) {
                       arrClone[i].selectedIndex = arr[i].selectedIndex ;
                    }
                }
                // remove any cursor on span elements (otherwise pointer cursor during drag and no drop allowed)
                var arrSpan = dragRow.getElementsByTagName("span");
                for (var i = 0; i < arrSpan.length; i++) {
                   arrSpan[i].style.cursor = "inherit" ;
                }
                // Get colgroup from target
                var tableTarget = target;
                while (tableTarget && tableTarget.nodeName != "TABLE") tableTarget = tableTarget.parentNode;
                if (tableTarget) {
                    var colgroupTarget = tableTarget.firstChild;
                    while (colgroupTarget && colgroupTarget.nodeName != "COLGROUP") colgroupTarget = colgroupTarget.nextSibling;
                }
                var dragTbody = document.createElement('tbody');
                var dragTable = document.createElement('table');
                dragTable.style.width=parseInt(target.offsetWidth) + 'px';
                dragTable.style.height=parseInt(target.offsetHeight) + 'px';
                dragTable.style.tableLayout="fixed";
                dragTbody.appendChild(dragRow);
                if (colgroupTarget) dragTable.appendChild(colgroupTarget.cloneNode(true));
                dragTable.appendChild(dragTbody);
                Qva.DragDrop.dragHelper.appendChild(dragTable);
                Qva.DragDrop.dragHelper.className = "QvDragRect";
                Qva.DragDrop.dragHelper.style.display = 'block';
                Qva.DragDrop.dragHelper.style.fontFamily = 'arial';
                Qva.DragDrop.dragHelper.style.fontSize = '10pt';
            
                 // disable dragging from our helper DIV (it's already being dragged)
                dragRow.dragObj = null;
           }                         
            
        }
//    }
    
    var curDrop = null;
    
    // If we get in here we are dragging something
//    if(Qva.DragDrop.curDrag){
        // move our helper div to wherever the mouse is (adjusted by mouseOffset)
        Qva.DragDrop.dragHelper.style.top  = mousePos.y - Qva.DragDrop.mouseOffset.y + "px";
        Qva.DragDrop.dragHelper.style.left = mousePos.x - Qva.DragDrop.mouseOffset.x + "px";
      
        curDrop = Qva.DragDrop.GetDropTarget(mousePos);
//    }
    
    if(Qva.DragDrop.curDrop != curDrop) {
        if (Qva.DragDrop.curDrop && Qva.DragDrop.curDrop.Element) {
            for (var rowElement = Qva.DragDrop.curDrop.Element.firstChild; rowElement != null; rowElement = rowElement.nextSibling) {
                if (rowElement.nodeName=="TD") {
                    rowElement.className = "";
                    rowElement.style.backgroundImage = "";
                }
            }
        }
        Qva.DragDrop.curDrop = curDrop;
        if(Qva.DragDrop.curDrop) {
            Qva.DragDrop.dragHelper.style.cursor = "";
            var url = Qva.GetBinder(this.BinderId).BuildBinaryUrl (null, null, "dropinsert");
            if (Qva.DragDrop.curDrop.VerticalPosition == "insertafter")
                var className = "DropTarget-Bottom";
            else if (Qva.DragDrop.curDrop.VerticalPosition == "insertbefore")
                var className = "DropTarget-Top";
            else    
                var className = "DropTarget-Open";

            if (Qva.DragDrop.curDrop.Element) {
                for (var rowElement = Qva.DragDrop.curDrop.Element.firstChild; rowElement != null; rowElement = rowElement.nextSibling) {
                    if (rowElement.nodeName=="TD"){
                        rowElement.className = className;
                        rowElement.style.backgroundImage = "url(" + url + ")";
                    } 
                }
            }
        }
    }
    if (!Qva.DragDrop.curDrop && Qva.DragDrop.dragType == "row")
        Qva.DragDrop.dragHelper.style.cursor = "not-allowed";

    
    // this helps prevent items on the page from being highlighted while dragging
    return false;

}

Qva.DragDrop.mouseUp = function (event) {
    if(Qva.DragDrop.curDrag) {
        // hide our helper object - it is no longer needed
        Qva.DragDrop.dragHelper.style.display = 'none';
        if(Qva.DragDrop.curDrop) {
            // restore className in TD elements on drop row
            for (var rowElement = Qva.DragDrop.curDrop.Element.firstChild; rowElement != null; rowElement = rowElement.nextSibling) {
                if (rowElement.nodeName=="TD") {
                    rowElement.className = "";
                    rowElement.style.backgroundImage = "";
               }
            }
            var binder = Qva.GetBinder(Qva.DragDrop.curDrop.Element.BinderId);
            if (binder.Enabled) {
                var target = Qva.DragDrop.curDrop.Element;
                if (typeof (target) != 'string') target = target.Name;
                var verb = Qva.DragDrop.curDrop.VerticalPosition;
                if (!verb) {
                    verb = "dropat";
                    event = event || window.event;
                    var mousePos = { 'x': event.clientX, 'y': event.clientY };
                    var factor = Math.PI;
                    var atY = Math.round(factor * (mousePos.y - Qva.DragDrop.mouseOffset.y)) - 132;
                    var atX = Math.round(factor * (mousePos.x - Qva.DragDrop.mouseOffset.x));
                    target = atX + ':' + atY + ':' + target;
                }
                binder.Set(Qva.DragDrop.curDrag.Name, verb, target, true);
            }
        } else if (Qva.DragDrop.curDrag.DropAt) {
            event = event || window.event;
            var mousePos = { 'x': event.clientX, 'y': event.clientY};
            if (!Qva.DragDrop.Inside(Qva.DragDrop.dragElement, mousePos)) {
                var factor = Math.PI;
                var atY = Math.round(factor * (mousePos.y - Qva.DragDrop.mouseOffset.y)) - 132;
                var atX = Math.round(factor * (mousePos.x - Qva.DragDrop.mouseOffset.x));
                var binder = Qva.GetBinder(Qva.DragDrop.curDrag.BinderId);
                if (binder.Enabled)
                    binder.Set (Qva.DragDrop.curDrag.Name, "dropat", atX + ':' + atY + ':' + Qva.DragDrop.curDrag.Value, true);
            }
        }
    } else if(Qva.DragDrop.curDrop) {
        debugger;
    }
    
    Qva.DragDrop.curDrop     = null;
    Qva.DragDrop.curDrag    = null;
    Qva.DragDrop.DragStarted = null;
    
    Qva.removeEvent(document,"mousemove",Qva.DragDrop.mouseMove);
    Qva.removeEvent(document,"mouseup",Qva.DragDrop.mouseUp);
    Qva.Select.Active = true;
}

Qva.DragDrop.mouseDown = function (event) {
    event = event || window.event;
    if (event.preventDefault) 
        event.preventDefault();
    else
        event.returnValue = false;
   /*
    We are setting target to whatever item the mouse is currently on
    Firefox uses event.target here, MSIE uses event.srcElement
    */
    var target   = event.target || event.srcElement;
    var dragObj = target.dragObj
    if (dragObj) {
        Qva.DragDrop.dragType = "cell";
        Qva.DragDrop.dragElement = target;
     } else {
            while (target && target.nodeName != "TR") target=target.parentNode;
            if (target) {
                var dragObj = target.dragObj;
                if (dragObj) {
                    Qva.DragDrop.dragType = "row";
                    Qva.DragDrop.dragElement = target;
                }
            }
    }
    Qva.DragDrop.curDrag = dragObj;
    Qva.DragDrop.DragStarted = null;
    if (dragObj) {
        var mousePos = {'x': event.clientX ,
                        'y': event.clientY };
        var rowPos = Qva.GetPageCoords(target);
        Qva.DragDrop.mouseOffset = {'x': mousePos.x - Qva.GetScrollLeft()- rowPos.x, 
                                    'y': mousePos.y - Qva.GetScrollTop()- rowPos.y };
        Qva.Select.Active = false;
        Qva.addEvent(document,"mousemove",Qva.DragDrop.mouseMove);
        Qva.addEvent(document,"mouseup",Qva.DragDrop.mouseUp);
        var d = new Date();
        Qva.MouseDownStartTime = d.getTime();

    }

    //prevents text selections in Firefox
    return false;
}

Qva.DragDrop.Init = function(){
	// Create our helper object that will show the item while dragging
	Qva.DragDrop.dragHelper = document.createElement('DIV');
	Qva.DragDrop.dragHelper.style.cssText = 'position:absolute; display:none;';
	Qva.DragDrop.dragHelper.style.zIndex  = 666;
	document.body.appendChild(Qva.DragDrop.dragHelper);
	
}
var old_QvaStart = Qva.Start;
Qva.Start = function() {
    old_QvaStart();
    Qva.DragDrop.Init();
}
Qva.Select = { };
Qva.Select.Active = true;
Qva.Select.mouseDown = function (event) {
    if (!Qva.Select.Active) return;
    
    event = event || window.event;
    var target   = event.target || event.srcElement;
    var cancel = target.disabled || (target.nodeName!="INPUT" && target.nodeName!="SELECT" && target.nodeName!="TEXTAREA");
    if (cancel) {
        if (event.preventDefault) 
            event.preventDefault();
        else
            event.returnValue = false;
        Qva.addEvent(document,"mousemove",Qva.Select.mouseMove);
        Qva.addEvent(document,"mouseup",Qva.Select.mouseUp);
        return false;
    }

}
Qva.Select.mouseMove = function (event) {
    event = event || window.event;
    if (event.preventDefault) 
        event.preventDefault();
    else
        event.returnValue = false;
    return false;
}
Qva.Select.mouseUp = function (event) {
    Qva.removeEvent(document,"mousemove",Qva.Select.mouseMove);
    Qva.removeEvent(document,"mouseup",Qva.Select.mouseUp);
}

document.onmousedown = Qva.Select.mouseDown

Qva.Move = { };
Qva.Move.mouseDown = function (event) {
    if (! event) event = window.event;
    var target   = event.target || event.srcElement;
    var cancel = target.disabled || (target.nodeName!="INPUT" && target.nodeName!="SELECT");
    if (cancel) {
        if (event.preventDefault) 
            event.preventDefault();
        else
            event.returnValue = false;
        if (!target.moveObj) while (!target.moveObj) target=target.parentNode;

        if (target.moveObj) {
            Qva.Move.old_cursor = document.body.style.cursor;
            document.body.style.cursor = "move";
            Qva.Move.moveElement = target;
            Qva.Move.MoveStarted = null;
            Qva.Move.StartX = event.clientX + Qva.GetScrollLeft();
            Qva.Move.StartY = event.clientY + Qva.GetScrollTop();

            Qva.Select.Active = false;
            Qva.addEvent(document,"mousemove",Qva.Move.mouseMove);
            Qva.addEvent(document,"mouseup",Qva.Move.mouseUp);
             var d = new Date();
            Qva.MouseDownStartTime = d.getTime();
            Qva.MouseDown2 = true;
           
        }
        //prevents text selections in Firefox
        return false;
    }
}
Qva.Move.mouseMove = function(event) {
    if (!Qva.MouseDown2) return;

    if (!Qva.Move.moveElement) debugger;
    if (! event) {
        event = window.event;
        event.returnValue = false;
    } else event.preventDefault ();
    var d = new Date();
    if (d.getTime() - Qva.MouseDownStartTime < 200) return

    if (!Qva.Move.MoveStarted) {
        // init move
        Qva.Move.MoveStarted = true;
         //get elements to move
        var arr = Qva.Move.moveElement.moveObj.split(":");
        Qva.Move.curMove = [];
        for (var i = 0; i < arr.length; i++) { 
            var element = (arr[i] != '*') ? document.getElementById(arr[i]) : Qva.Move.moveElement;
           
            Qva.Move.curMove[i] = { 'Element'       : element,
                                    'StartLeft'     : element.offsetLeft,
                                    'StartTop'      : element.offsetTop,
                                    'ActualZindex'  : element.style.zIndex,
                                    'ClassName'     : element.className};
            element.className += " QvMoveRect";
            element.style.zIndex = "";
       }
       
    }
    var deltaX = event.clientX + Qva.GetScrollLeft() - Qva.Move.StartX;
    var deltaY = event.clientY + Qva.GetScrollTop() - Qva.Move.StartY;
    for (var i = 0; i < Qva.Move.curMove.length; i++) {
        var newX = Qva.Move.curMove[i].StartLeft + deltaX;
        if (!isNaN(Qva.Move.moveElement.xMax)) newX = Math.min(newX, Qva.Move.moveElement.xMax);
        if (!isNaN(Qva.Move.moveElement.xMin)) newX = Math.max(newX, Qva.Move.moveElement.xMin);
        if (!Qva.Move.moveElement.xOnly) Qva.Move.curMove[i].Element.style.top = Qva.Move.curMove[i].StartTop + deltaY + "px";
        Qva.Move.curMove[i].Element.style.left = newX + "px";
    }
    return false
}

Qva.Move.mouseUp = function (event) {
    event = event || window.event;
    
    Qva.MouseDown2 = false;
    if (Qva.Move.MoveStarted) {
        var deltaX = event.clientX + Qva.GetScrollLeft() - Qva.Move.StartX;
        var deltaY = event.clientY + Qva.GetScrollTop() - Qva.Move.StartY;
        
        var y = Qva.Move.curMove[0].StartTop + deltaY;
        var x = Qva.Move.curMove[0].StartLeft + deltaX;
        
        for (var i = 0; i < Qva.Move.curMove.length; i++) {
            Qva.Move.curMove[i].Element.style.zIndex = Qva.Move.curMove[i].ActualZindex;
            Qva.Move.curMove[i].Element.className = Qva.Move.curMove[i].ClassName;
        }

        var binder = Qva.GetBinder(Qva.Move.moveElement.binderid);
        if (Qva.Move.moveElement.xOnly) {
            binder.Set (Qva.Move.moveElement.Name, "value", x * 2, true);
        } else {
            binder.Set (Qva.Move.moveElement.Name, "moveto", Math.round(x * Qva.Factor) + ':' + Math.round(y * Qva.Factor), true);
        }
      
        Qva.Move.curMove = null;
        Qva.Move.moveElement = null;
        Qva.Move.MoveStarted = null;
      
    }
    document.body.style.cursor = Qva.Move.old_cursor;
    Qva.removeEvent(document,"mousemove",Qva.Move.mouseMove);
    Qva.removeEvent(document,"mouseup",Qva.Move.mouseUp);
    Qva.Select.Active = true;

}
Qva.Resize = {}

Qva.Resize.mouseDown = function (event, frame) {
    if (! event) {
        event = window.event;
        event.returnValue = false;
    } else event.preventDefault ();
    event.cancelBubble = true;
    
    var target = event.target || event.srcElement;
    var at = Qva.GetPageCoords (frame);
    Qva.Resize.ResizeType = target.ResizeType;
    Qva.Resize.Frame = frame;
    var bkgid = frame.id.replace ("_frame", "_bkg");
    var bkgelem = window.document.getElementById (bkgid);
    if (bkgelem) {
        Qva.Resize.BkgElem = bkgelem;
    }
    Qva.Resize.StartX = event.clientX + Qva.GetScrollLeft();
    Qva.Resize.StartY = event.clientY + Qva.GetScrollTop();
    Qva.Resize.StartLeft = Qva.GetScrollLeft() + at.x - 1;
    Qva.Resize.StartTop = Qva.GetScrollTop() + at.y - 1;
    
    Qva.Resize.StartH = getClientHeight(frame);
    Qva.Resize.StartW = getClientWidth(frame);
    if (!Qva.Resize.SizeRect) {
        Qva.Resize.SizeRect = document.createElement ("div");
        Qva.Resize.SizeRect.className = "QvSizeRect";
        Qva.Resize.SizeRect.style.display = '';
        document.body.insertBefore (Qva.Resize.SizeRect, document.body.firstChild);
    } else {
        Qva.Resize.SizeRect.style.display = '';
    }
    Qva.Resize.SizeRect.style.left = this.StartLeft + "px";
    Qva.Resize.SizeRect.style.top = this.StartTop + "px";
    Qva.Resize.SizeRect.style.width = this.StartW + "px";
    Qva.Resize.SizeRect.style.height = this.StartH + "px";
    Qva.Resize.SizeRect.X = null;
    Qva.Resize.SizeRect.Y = null;
    Qva.Resize.SizeRect.W = null;
    Qva.Resize.SizeRect.H = null;
    
    Qva.Resize.old_cursor = document.body.style.cursor;
    document.body.style.cursor = target.style.cursor;
    Qva.Select.Active = false;
    Qva.addEvent(document,"mousemove",Qva.Resize.mouseMove);
    Qva.addEvent(document,"mouseup",Qva.Resize.mouseUp);
}
Qva.Resize.mouseMove = function (event) {

    var minsize = 20;
    if (!Qva.Resize.SizeRect) return;
    if (! event) {
        event = window.event;
        event.returnValue = false;
    } else event.preventDefault ();

    var deltaX = event.clientX + Qva.GetScrollLeft() - Qva.Resize.StartX;
    var deltaY = event.clientY + Qva.GetScrollTop() - Qva.Resize.StartY;
    // change top
    if (Qva.Resize.ResizeType.indexOf("t")!=-1) {
        Qva.Resize.SizeRect.Y = Math.max(minsize, Qva.Resize.StartTop + deltaY);
        Qva.Resize.SizeRect.H = Math.max(minsize, Qva.Resize.StartH - deltaY);
    }
    // change bottom
    if (Qva.Resize.ResizeType.indexOf("b")!=-1) {
        Qva.Resize.SizeRect.H = Math.max(minsize, Qva.Resize.StartH + deltaY);
    }
    // change left
    if (Qva.Resize.ResizeType.indexOf("l")!=-1) {
        Qva.Resize.SizeRect.X = Math.max(minsize, Qva.Resize.StartLeft + deltaX);
        Qva.Resize.SizeRect.W = Math.max(minsize, Qva.Resize.StartW - deltaX);
    }
    // change right
    if (Qva.Resize.ResizeType.indexOf("r")!=-1) {
        Qva.Resize.SizeRect.W = Math.max(minsize, Qva.Resize.StartW + deltaX);
    }

    if (Qva.Resize.SizeRect.Y) Qva.Resize.SizeRect.style.top = Qva.Resize.SizeRect.Y + "px";
    if (Qva.Resize.SizeRect.X) Qva.Resize.SizeRect.style.left = Qva.Resize.SizeRect.X + "px";
    if (Qva.Resize.SizeRect.W) Qva.Resize.SizeRect.style.width = Qva.Resize.SizeRect.W + "px";
    if (Qva.Resize.SizeRect.H) Qva.Resize.SizeRect.style.height = Qva.Resize.SizeRect.H + "px";

}

Qva.Resize.mouseUp = function (event) {
    document.body.style.cursor = Qva.Resize.old_cursor;
    var style = Qva.Resize.ResizeType;
    var width = Math.round((Qva.Resize.SizeRect.W ? Qva.Resize.SizeRect.W : Qva.Resize.StartW) * Qva.Factor);
    var height = Math.round((Qva.Resize.SizeRect.H ? Qva.Resize.SizeRect.H : Qva.Resize.StartH) * Qva.Factor);
    if (Qva.Resize.Frame.maxclientwidth) Qva.Resize.Frame.maxclientwidth = null;
    if (Qva.Resize.Frame.maxclientheight) Qva.Resize.Frame.maxclientheight = null;
    Qva.GetBinder(Qva.Resize.Frame.binderid).Set (Qva.Resize.Frame.Name + ".Caption", "resize", style + ':' + width + ':' + height, true);
    Qva.Resize.SizeRect.style.display = 'none';
    Qva.Resize.Frame = null;
    Qva.removeEvent(document,"mousemove",Qva.Resize.mouseMove);
    Qva.removeEvent(document,"mouseup",Qva.Resize.mouseUp);
    Qva.Select.Active = true;
}
