﻿/*
 * jQuery HG.Drag v1.0 - http://jquery.holygrace.cn
 *
 * author : 蒋与杨(young.jiang)
 * email  : young18.j@gmail.com
 * Copyright (c) 2007 young.jiang
 *
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 *
 * parameter
 * @handle : 拖动助手 ( jquery 选择器，一个拖动对象可以有多个拖动助手 )
 * @range  : 拖动范围 ( 对象id，一个拖动对象只能遵循一个拖动范围 )
 * 都可以为空
 *
 *  Example:
 *  $("#drag").Drag();
 *       
 *  $("#dragObj").Drag({
 *      handle : "#dragHandle",  
 *      range  : "dragRange"
 *  })
 */


jQuery.fn.extend({
    Drag : function(options){
        options = $.extend({
            handle : "",
            range  : ""
        },options);
        
        var isMouseDown = false;
        var dragObj     = null;
        var dragHandle  = null;
	    var lastMouseX;
	    var lastMouseY;
	    var lastElemTop;
	    var lastElemLeft;
	    
	    
	    function updatePosition(e) {
            var pos=$.GetMousePosition(e);
		    var spanX = (pos.x - lastMouseX);
		    var spanY = (pos.y - lastMouseY);
		    var top   = lastElemTop + spanY;
		    var left  = lastElemLeft + spanX;
            if(options.range=="")
            {
		        dragObj.css({top:top,left:left});
		    }
		    else
		    {		        
		        var range=$("#"+options.range);
		        var rangeBottom=$.ToInt(range.css("height")) - $.ToInt(dragObj.css("height"))-$.ToInt(dragObj.css("borderTopWidth"),true)-$.ToInt(dragObj.css("borderBottomWidth"),true);
		        var rangeRight=$.ToInt(range.css("width")) - $.ToInt(dragObj.css("width"))-$.ToInt(dragObj.css("borderLeftWidth"),true)-$.ToInt(dragObj.css("borderRightWidth"),true);
                if(top>0 && top<rangeBottom){
                    dragObj.css("top",top);
                }
                else{
                    dragObj.css("top",top>0?rangeBottom:0);
                }
                
                if(left>0 && left<rangeRight){
                    dragObj.css("left",left); 
                }
		        else{
		            dragObj.css("left",left>0?rangeRight:0);
		        }
		    }
	    }
	    
	    $(document).mousemove(function(e){
		    if(isMouseDown){
			    updatePosition(e);
			    return false;
		    }
	    });
	    $(document).mouseup(function(e){
		    if(isMouseDown){
			    isMouseDown = false;
			    return false;
		    }
	    });
        return this.each(function(){            
            var dragDom=this;
            dragHandle=(options.handle==""?$(this):$(options.handle));            
            dragHandle.css("cursor","move");
                
            dragHandle.mousedown(function(e){
            
                dragObj = $(dragDom);
                dragObj.css("position","absolute");
                
                
                isMouseDown    = true;
                var pos    = $.GetMousePosition(e);
				lastMouseX = pos.x;
				lastMouseY = pos.y;

				lastElemTop  = dragDom.offsetTop;
				lastElemLeft = dragDom.offsetLeft;
				updatePosition(e);
            })
        })
    }
})