/**
 * @author msalla
 */
jQuery.fn.absolutize = function()
{
    return this.each(function()
    {
        var element = jQuery(this);
        if (element.css('position') == 'absolute') 
        {
            return element;
        }
        var offsets = element.offset();
        var top = offsets.top;
        var left = offsets.left;
        var width = element[0].clientWidth;
        var height = element[0].clientHeight;
        element._originalLeft = left - parseFloat(element.css("left") || 0);
        element._originalTop = top - parseFloat(element.css("top") || 0);
        element._originalWidth = element.css("width");
        element._originalHeight = element.css("height");
        element.css("position", "absolute");
        element.css("top", top + 'px');
        element.css("left", left + 'px');
        element.css("width", width + 'px');
        element.css("height", height + 'px');
        return element;
    });
};
jQuery.fn.relativize = function()
{
    return this.each(function()
    {
        var element = jQuery(this);
        if (element.css('position') == 'relative') 
        {
            return element;
        }
        element.css("position", "relative");
        var top = parseFloat(element.css("top") || 0) - (element._originalTop || 0);
        var left = parseFloat(element.css("left") || 0) - (element._originalLeft || 0);
        element.css("top", top + 'px');
        element.css("left", left + 'px');
        element.css("height", element._originalHeight);
        element.css("width", element._originalWidth);
        return element;
    });
};
jQuery.fn.extend({
    viewportOffset: function()
    {
        var element = jQuery(this);
        var valueT = 0, valueL = 0;
        var elementaux = element;
        do 
        {
            valueT += (elementaux[0] ? elementaux[0].offsetTop : 0) || 0;
            valueL += (elementaux[0] ? elementaux[0].offsetLeft : 0) || 0;
            // Safari fix
            if (elementaux.offsetParent &&
            elementaux.offsetParent[0] == document.body &&
            elementaux.css("position") == 'absolute') 
            {
                break;
            }
        } while ((elementaux = elementaux.offsetParent));
        elementaux = element;
        do 
        {
            if (!jQuery.browser.opera || elementaux[0].tagName == 'BODY') 
            {
                valueT -= (elementaux[0] ? elementaux[0].scrollTop : 0) || 0;
                valueL -= (elementaux[0] ? elementaux[0].scrollLeft : 0) || 0;
            }
        } while ((elementaux = elementaux.parent));
        var result = [valueL, valueT];
        result.left = valueL;
        result.top = valueT;
        return result;
    },
    clonePosition: function(aTarget, aOptions)
    {
        var options = aOptions ||
        {
            setLeft: true,
            setTop: true,
            setWidth: true,
            setHeight: true,
            offsetTop: 0,
            offsetLeft: 0
        };
        // find page position of Target
        var p = jQuery(aTarget).viewportOffset();
		
        // find coordinate system to use
        var element = jQuery(this);
        var delta = [0, 0];
        var parent = null;

        // delta [0,0] will do fine with position: fixed elements,
        // position:absolute needs offsetParent deltas
        if (element.css("position") == 'absolute') 
        {
            parent = element.offsetParent();
            delta = parent.viewportOffset();
        }
        // correct by body offsets (fixes Safari)
        if (parent && (parent[0] == document.body)) 
        {
            delta[0] -= document.body.offsetLeft;
            delta[1] -= document.body.offsetTop;
        }
        // set position
        if (options.setLeft) 
        {
            element.css("left", (p[0] - delta[0] + options.offsetLeft) + 'px');
        }
        if (options.setTop) 
        {
            element.css("top", (p[1] - delta[1] + options.offsetTop) + 'px');
        }
        if (options.setWidth) 
        {
            element.css("width", (element[0] ? element[0].offsetWidth : 0) + 'px');
        }
        if (options.setHeight) 
        {
            element.css("height", (element[0] ? element[0].offsetHeight:0) + 'px');
        }
        return element;
    }
});
