//
//
//
//
//
ECTYPE.display.DraggableObject = function(element, a, b, c, d)
{
    element = element || new ECTYPE.display.HTMLElement(document.createElement('div'));

    // Make the element an HTMLElement so we have access to the
    // EventDispatcher function and getStyle method.
    new ECTYPE.display.HTMLElement(element);

    // If the element is statically positioned, position it relatively
    // so as not to mess up the document flow.
    if (element.getStyle('position') == 'static')
    {
        element.style.position = 'relative';
    }

    // Objects for storing the objects origin relative to the screen
    // and its initial "left" and "top" style attributes.
    var screenOrigin = {};
    var styleOrigin = {};
    var styleHome = {
        x: parseInt(element.getStyle('left')) || 0,
        y: parseInt(element.getStyle('top')) || 0
    };
    var mouseDisp = {};
    var netObjDisp = {};

    var move = function(e)
    {
        e.preventDefault();

        mouseDisp.x = e.nativeEvent.screenX - screenOrigin.x;
        mouseDisp.y = e.nativeEvent.screenY - screenOrigin.y;

        var hasMoved = false;

        if ((a != null) && (netObjDisp.y + mouseDisp.y < -a))
        {
            element.style.top = -a + 'px';
            hasMoved = true;
        }
        else if ((c != null) && (netObjDisp.y + mouseDisp.y > c))
        {
            element.style.top = c + 'px';
            hasMoved = true;
        }
        else
        {
            element.style.top = styleOrigin.y + mouseDisp.y + 'px';
            hasMoved = true;
        }

        if ((d != null) && (netObjDisp.x + mouseDisp.x < -d))
        {
            element.style.left = -d + 'px';
            hasMoved = true;
        }
        else if ((b != null) && (netObjDisp.x + mouseDisp.x > b))
        {
            element.style.left = b + 'px';
            hasMoved = true;
        }
        else
        {
            element.style.left = styleOrigin.x + mouseDisp.x + 'px';
            hasMoved = true;
        }
        
        if (hasMoved)
        {
            var e = new ECTYPE.events.Event('move', false, false);
            element.dispatchEvent(e);
        }
    }

    var startDrag = function(e)
    {
        e.preventDefault();

        screenOrigin.x = e.nativeEvent.screenX;
        screenOrigin.y = e.nativeEvent.screenY;
        styleOrigin.x = parseInt(element.getStyle('left')) || 0;
        styleOrigin.y = parseInt(element.getStyle('top')) || 0;
        netObjDisp.x = styleOrigin.x - styleHome.x;
        netObjDisp.y = styleOrigin.y - styleHome.y;

        document.addEventListener('mouseMove', move);
    }
        
    var stopDrag = function(e)
    {
        document.removeEventListener('mouseMove', move);
    }
    
    element.addEventListener('mouseDown', startDrag);
    document.addEventListener('mouseUp', stopDrag);
    
    return element;
}
