﻿/*
	Comsite Ajax Library - http://www.ComSite.org
 	by Jay Kappel, founder of ComSite.

	Permission is freely granted to copy, modify, merge, publish, distribute,
	sublicense, and/or sell copies of this Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL 
	THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
	CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
	DEALINGS IN THE SOFTWARE.
*/

// Dependencies for csAjaxDrag.js:

/// <reference path="csAjax.js" />
/// <reference path="csAjaxEvent.js" />
/// <reference path="csAjaxUtils.js" />

    csAjax.drag = {};
    csAjax.drag.loaded              = true;
    csAjax.drag.items               = new Array();
    csAjax.drag.activeDragObject    = null;
    csAjax.drag.gridSize            = 1;
    csAjax.drag.minWidth            = '50px';
    csAjax.drag.minHeight           = '50px';
    
    csAjax.drag.instanciate = function() {
        // Nothing to do here
        if (csAjax.eventTracker) if (!csAjax.eventTracker('drag','afterInstanciate',this)) return;
        return true;
    }
    
    csAjax.drag.addDragItem = function(dragHandle,dragWindow,dragMode, options) {
        /// <summary> This function is used to register an object for dragging and resizing</summary>
        var oItem = new Function('');
        
        oItem.handle    = dragHandle;
        oItem.window    = dragWindow || dragHandle;
        oItem.mode      = dragMode+''.toLowerCase() || 'drag';
        
        options = options || {};
        oItem.minWidth  = options.minWidth || csAjax.drag.minWidth;
        oItem.minHeight = options.minHeight || csAjax.drag.minHeight;
        oItem.gridSize  = options.gridSize || csAjax.drag.gridSize;
        oItem.locked    = (typeof options.locked=='boolean')? options.locked : false;
        
        csAjax.drag.items.push(oItem);
        csAjax.event.add(dragHandle,'mousedown',csAjax.drag.dragStart,true);
        return oItem;
    }

    csAjax.drag.removeDragItem = function(handle) {
        var itms = csAjax.drag.items;
        
        for (var c=0; c < itms.length; c++) {
            if (itms[c].handle == handle) {
                csAjax.event.remove(itms[c].handle,'mousedown',csAjax.windows.drag.dragStart,true);
                itms.splice(c,1);
            }
        }
    }

    csAjax.drag.getDragObject = function(evnt) {
        var itms = csAjax.drag.items;
        
        for (var c=0; c < itms.length; c++) {
            //if (itms[c].window.id == evnt.target.id) return itms[c];
            if (itms[c].handle == evnt.target) return itms[c];
        }
    }

    csAjax.drag.dragStart = function(evnt) {
        evnt = csAjax.event.getHandler(evnt);
        if (evnt.target.tagName=='A') return;
        
        if (evnt.which==1) {
            var dragObj = csAjax.drag.getDragObject(evnt);
            if (dragObj.locked) return;
   		    var x,y;
            
            // Handle Drag Start
            var yReal = dragObj.window.style.top, xReal = dragObj.window.style.left;
            
   	        y = parseInt(yReal); x = parseInt(xReal);
            if (yReal.indexOf('%') > 0) y = parseInt((y/100) * csAjax.utils.getPageHeight());
            if (xReal.indexOf('%') > 0) x = parseInt((x/100) * csAjax.utils.getPageWidth());
            dragObj.window.style.zIndex = csAjax.drag.getMaxZindex();
            dragObj.window.style.left   = x +'px';
            dragObj.window.style.top    = y +'px';

            var dragMode = (dragObj.mode == 'drag')?'Drag':'Resize';
            if (csAjax.eventTracker) if (!csAjax.eventTracker('drag','before'+dragMode,dragObj)) return;
            
		    dragObj.lastMouseX	= evnt.screenX;
		    dragObj.lastMouseY	= evnt.screenY;
            
		    document.onmousemove	        = csAjax.drag.dragging;
		    document.onmouseup		        = csAjax.drag.dragEnd;
            csAjax.drag.activeDragObject    = dragObj;
            
            // display a transparent panel over the page so that we can drag over iframes
            csAjax.utils.utilityPanel(true,{ panelID: 'dragBackground', opacity: '0', cursor: 'default', zindex: csAjax.drag.getMaxZindex()+10 });
        }
        
		return false;        
    }
    
    
    csAjax.drag.dragging = function(evnt) {
        if (!csAjax.drag.activeDragObject) return;
		
		evnt = csAjax.event.getHandler(evnt);
        var dragObj = csAjax.drag.activeDragObject;
        var x,y,h,w,o = dragObj.window;
        
        // snap to grid support
        var gs = csAjax.drag.gridSize;
        var gsDiffY = parseInt(parseInt(evnt.screenY - dragObj.lastMouseY)/gs)*gs;
        var gsDiffX = parseInt(parseInt(evnt.screenX - dragObj.lastMouseX)/gs)*gs;
        
        h = parseInt(o.style.height); w = parseInt(o.style.width);
	    y = parseInt(o.style.top); x = parseInt(o.style.left);

        switch (dragObj.mode) {
            case 'resizeTL':
    	        o.style.top = (y + gsDiffY)+'px';
    	        o.style.left = (x + gsDiffX)+'px';
                o.style.width = (w - gsDiffX)+'px';
                o.style.height = (h - gsDiffY)+'px';
                break;
            case 'resizeT':
    	        o.style.top = (y + gsDiffY)+'px';
                o.style.height = (h - gsDiffY)+'px';
                break;
            case 'resizeTR':
    	        o.style.top = (y + gsDiffY)+'px';
                o.style.width = (w + gsDiffX)+'px';
                o.style.height = (h - gsDiffY)+'px';
                break;
            case 'resizeL':
    	        o.style.left = (x + gsDiffX)+'px';
                o.style.width = (w - gsDiffX)+'px';
                break;
            case 'resizeR':
                o.style.width = (w + gsDiffX)+'px';
                break;
            case 'resizeBL':
                o.style.left = (x + gsDiffX)+'px';
                o.style.width = (w - gsDiffX)+'px';
                o.style.height = (h + gsDiffY)+'px';
                break;
            case 'resizeB':
                o.style.height = (h + gsDiffY)+'px';
                break;
            case 'resizeBR':
                o.style.width = (w + gsDiffX)+'px';
                o.style.height = (h + gsDiffY)+'px';
                break;
            case 'drag':
                o.style.left = (x + gsDiffX)+'px';
                o.style.top = (y + gsDiffY)+'px';
                break;
        }
        
        if (dragObj.mode != 'drag') {
            // Ensure we dont allow resizing too small
            if (parseInt(o.style.width) <= parseInt(dragObj.minWidth)) {
                o.style.width = w+'px';
                o.style.left = x+'px';
            }
            if (parseInt(o.style.height) <= parseInt(dragObj.minHeight)) {
                o.style.height = h+'px';
                o.style.top = y+'px';
            }
        }
        
	    if (Math.abs(gsDiffX) >= gs) dragObj.lastMouseX = evnt.screenX;
	    if (Math.abs(gsDiffY) >= gs) dragObj.lastMouseY = evnt.screenY;
		return false;    
    }

    csAjax.drag.dragEnd = function(evnt) {
		if (!csAjax.drag.activeDragObject) return;
		evnt = csAjax.event.getHandler(evnt);

		document.onmousemove            = null;
		document.onmouseup              = null;
		csAjax.utils.utilityPanel(false,{ panelID: 'dragBackground' });
        var dragObj = csAjax.drag.activeDragObject;
        var dragMode = (dragObj.mode == 'drag')?'Drag':'Resize';

        if (csAjax.eventTracker) {
            csAjax.eventTracker('drag','stateChanged',dragObj);
            if (!csAjax.eventTracker('drag','after'+dragMode,dragObj)) return;
		}
		csAjax.drag.activeDragObject    = null;
    } 

    csAjax.drag.getMaxZindex = function() {
        var divs = document.getElementsByTagName('div');
        var maxIndex=0;
        
        for (var c=0; c < divs.length; c++) {
            var div = divs[c], zIndex=0;
            if (div.style) {
                if (div.style.zIndex) zIndex=div.style.zIndex;
                if (zIndex > maxIndex) maxIndex=zIndex;
            }
        }
        return ++maxIndex;
    }