// vim: et:ts=4:sw=4:sts=4:ft=javascript

/*@
Ox.JQueryElement <function> Wrapper for jQuery
    # Usage
    ($element) -> <object> Wrapped jQuery DOM element
    # Arguments
    $element <object> jQuery DOM Element
@*/

// fixme: it seems that children(), find() etc. don't work directly,
// and still have to be called on the $element

Ox.JQueryElement = function($element) {
    var that = this;
    //@ id <number> Unique id
    that.id = Ox.uid(); // fixme: rename to oxid!
    //@ ox <string> OxJS version
    that.ox = Ox.VERSION; // fixme: remove!
    //@ $element <object> The jQuery-wrapped DOM element
    that.$element = $element.data({
        oxid: that.id
    });
    // FIXME: the following two lines should make it possible to do
    // $('<div>').appendTo($element) ... check if it works, then replace all
    //@ 0 <element> The DOM element
    that[0] = that.$element[0];
    //@ length <number> 1 (for compatibility with jQuery)
    that.length = 1;
    Ox.UI.elements[that.id] = that;
    return that;
};

// add all jQuery functions to the prototype of Ox.JQueryElement
Ox.forEach($('<div>'), function(val, key) {
    if (Ox.isFunction(val)) {
        Ox.JQueryElement.prototype[key] = function() {
            var args = arguments, id, ret, that = this;
            Ox.forEach(args, function(arg, i) {
                // FIXME: with the changes above, is this still needed?
                // if an ox object was passed
                // then pass its $element instead
                // so that we can do oxObj.jqFn(oxObj)
                if (arg && arg.ox) {
                    args[i] = arg.$element;
                }
            });
            ret = that.$element[key].apply(that.$element, args);
            // if the $element of an ox object was returned
            // then return the ox object instead
            // so that we can do oxObj.jqFn().oxFn()
            return ret && ret.jquery && Ox.UI.elements[id = ret.data('oxid')]
                ? Ox.UI.elements[id] : ret;
        };
    }
}, true);
