
/******************************************************************************
*   Author:             Dada
*   E-Mail:             dada_dotnet@hotmail.com
*   Create Time:        2008.03.17.1435
*   Last Modify Time:   2008.03.17.1435
*   Version:            v1.0
*   Summary:            System.UI.Movable.js
*                       http://www.iamdada.com/jsfx/system.ui.movable
******************************************************************************/

// [Namespace]
var System; if (!System) System = {};
if(!System.UI) System.UI = {};

// [Class] Movable
System.UI.Movable = function(option)
{
    // [Private Variable]
    var copyright = 'http://www.iamdada.com';                                                                                               // 版权信息
    var version = 'v1.0';                                                                                                                   // 版本信息
    // 
    var self = this;                                                                                                                        // 
    
    // [Public Variale]
    this.MoveElement = null;                                                                                                                // 
    
    // 获取元素相对文档的绝对位置
    var getElementPosition = function(el)
    {
        var left = 0;
        var top  = 0;
        while (el.offsetParent)
        {
            left += el.offsetLeft;
            top  += el.offsetTop;
            el = el.offsetParent;
        }

        left += el.offsetLeft;
        top  += el.offsetTop;
        return {x:left, y:top};
    }
    
    // 
    this.MoveTo = function(left, top, speed, delay, callback)
    {
        System.UI.Movable.MoveTo(this.MoveElement.id, left, top, speed, delay, callback);
    };
    
    // 
    this.MoveBy = function(x, y, speed, delay, callback)
    {
        if(typeof(x) != 'number' || typeof(y) != 'number' || (speed && typeof(speed) != 'number') || (delay && typeof(delay) != 'number'))
        {
            if(typeof(this.OnErrorHandler) == 'function')
            {
                this.OnErrorHandler('Error: MoveBy(x, y, speed, delay, callback); parameters [x, y, speed, delay] must be number.');
            }
            return;
        }
        
        if((speed && speed < 0) || (delay && delay < 0))
        {
            if(typeof(this.OnErrorHandler) == 'function')
            {
                this.OnErrorHandler('Error: MoveBy(x, y, speed, delay, callback); parameters [speed, delay] must bigger than zero.');
            }
            return;
        }
        
        // 
        var left = 0, top = 0;
        if(this.MoveElement)
        {
            left = this.MoveElement.style.left ? parseInt(this.MoveElement.style.left.replace(System.UI.Movable.Unit, '')) : 0;
            top = this.MoveElement.style.top ? parseInt(this.MoveElement.style.top.replace(System.UI.Movable.Unit, '')) : 0;
            
            left += x;
            top += y;
            
            this.MoveTo(left, top, speed, delay, callback);
        }
    };
    
    // 
    if(typeof(option) == 'string' && option != '')
    {
        option = {
            'MoveElement': document.getElementById(option)
        };
    }
    
    if(typeof(option) == 'object' || typeof(option) == 'function')
    {
        if(typeof(option.MoveElement) == 'object') {this.MoveElement = option.MoveElement;}
    }
};

// [Static]
System.UI.Movable.MoveTo = function(id, left, top, speed, delay, callback)
{
    if((typeof(left) != 'number' && left != null) || (typeof(top) != 'number' && top != null) || (speed && typeof(speed) != 'number') || (delay && typeof(delay) != 'number'))
    {
        if(typeof(this.OnErrorHandler) == 'function')
        {
            this.OnErrorHandler('Error: MoveTo(left, top, speed, delay, callback); parameters [left, top, speed, delay] must be number.');
        }
        return;
    }
    
	if(speed <= 0)
    {
        return;
    }
    
	var obj = document.getElementById(id);
	if(obj)
	{
	    obj.style.position = "absolute";
	    if(delay > 0)
	    {
		    if(!obj.posLeft) {obj.posLeft = obj.style.left ? parseFloat(obj.style.left.replace(System.UI.Movable.Unit, '')) : 0;}
		    if(!obj.posTop) {obj.posTop = obj.style.top ? parseFloat(obj.style.top.replace(System.UI.Movable.Unit, '')) : 0;}
		    
		    // 
    		if(obj.posLeft != left || obj.posTop != top)
	        {
	            var diffX = left - obj.posLeft;
		        var diffY = top - obj.posTop;
		        var scale = 1;
		        
		        if(Math.abs(diffX) > Math.abs(diffY))
		        {
			        scale = Math.abs(diffY)/Math.abs(diffX);
			        // left
			        if(diffX < 0) {speed = -speed;}
			        if(Math.abs(diffX) > Math.abs(speed)) {obj.posLeft += speed;}
			        else {obj.posLeft += diffX;}
			        speed = Math.abs(speed);
        			// top
			        if(diffY < 0) {speed = -speed;}
			        if(Math.abs(diffY) > Math.abs(speed)) {obj.posTop += speed * scale;}
			        else {obj.posTop += diffY;}
			        speed = Math.abs(speed);
		        }
		        else
		        {
			        scale = Math.abs(diffX)/Math.abs(diffY);
			        // left
			        if(diffX < 0) {speed = -speed;}
			        if(Math.abs(diffX) > Math.abs(speed)) {obj.posLeft += speed * scale;}
			        else {obj.posLeft += diffX;}
			        speed = Math.abs(speed);
        			// top
			        if(diffY < 0) {speed = -speed;}
			        if(Math.abs(diffY) > Math.abs(speed)) {obj.posTop += speed;}
			        else {obj.posTop += diffY;}
			        speed = Math.abs(speed);
		        }
    			
                obj.style.left = obj.posLeft + System.UI.Movable.Unit;
                obj.style.top = obj.posTop + System.UI.Movable.Unit;
                
                // 
	            if(obj.posLeft != left || obj.posTop != top)
	            {
                    // 
		            setTimeout('System.UI.Movable.MoveTo("' + obj.id + '", ' + left + ',' + top + ',' + speed + ',' + delay + ',' + callback + ');', delay);
		        }
		    }
	    }
	    else
	    {
	        obj.posLeft = left;
	        obj.posTop = top;
		    obj.style.left = left + System.UI.Movable.Unit;
		    obj.style.top = top + System.UI.Movable.Unit;
	    }
	    
	    // Callback Function
        if(obj.posLeft == left && obj.posTop == top)
        {
            if(typeof(callback) == 'function')
            {
                callback();
            }
        }
	}
}

// 
System.UI.Movable.MoveBy = function(id, x, y, speed, delay, callback)
{
    if(typeof(x) != 'number' || typeof(y) != 'number' || (speed && typeof(speed) != 'number') || (delay && typeof(delay) != 'number'))
    {
        if(typeof(this.OnErrorHandler) == 'function')
        {
            this.OnErrorHandler('Error: MoveBy(x, y, speed, delay, callback); parameters [x, y, speed, delay] must be number.');
        }
        return;
    }
    
    if((speed && speed < 0) || (delay && delay < 0))
    {
        if(typeof(this.OnErrorHandler) == 'function')
        {
            this.OnErrorHandler('Error: MoveBy(x, y, speed, delay, callback); parameters [speed, delay] must bigger than zero.');
        }
        return;
    }
    
    // 
    var left = 0, top = 0;
    var obj = document.getElementById(id);
    if(obj)
    {
        left = obj.style.left ? parseInt(obj.style.left.replace(System.UI.Movable.Unit, '')) : 0;
        top = obj.style.top ? parseInt(obj.style.top.replace(System.UI.Movable.Unit, '')) : 0;
        
        left += x;
        top += y;
        
        System.UI.Movable.MoveTo(id, left, top, speed, delay, callback);
    }
};

// 
System.UI.Movable.MoveToDocument = function(id, left, top, speed, delay, callback)
{
    
};

// Static Variable
System.UI.Movable.Unit = 'px';
