(function ($) {    // Monkey patch jQuery 1.3.1+ css() method to support CSS 'transform'    // property uniformly across Safari/Chrome/Webkit, Firefox 3.5+, IE 9+, and Opera 11+.    // 2009-2011 Zachary Johnson www.zachstronaut.com    // Updated 2011.05.04 (May the fourth be with you!)    function getTransformProperty(element)    {        // Try transform first for forward compatibility        // In some versions of IE9, it is critical for msTransform to be in        // this list before MozTranform.        var properties = ['transform', 'WebkitTransform', 'msTransform', 'MozTransform', 'OTransform'];        var p;        while (p = properties.shift())        {            if (typeof element.style[p] != 'undefined')            {                return p;            }        }                // Default to transform also        return 'transform';    }        var _propsObj = null;        var proxied = $.fn.css;    $.fn.css = function (arg, val)    {        // Temporary solution for current 1.6.x incompatibility, while        // preserving 1.3.x compatibility, until I can rewrite using CSS Hooks        if (_propsObj === null)        {            if (typeof $.cssProps != 'undefined')            {                _propsObj = $.cssProps;            }            else if (typeof $.props != 'undefined')            {                _propsObj = $.props;            }            else            {                _propsObj = {}            }        }                // Find the correct browser specific property and setup the mapping using        // $.props which is used internally by jQuery.attr() when setting CSS        // properties via either the css(name, value) or css(properties) method.        // The problem with doing this once outside of css() method is that you        // need a DOM node to find the right CSS property, and there is some risk        // that somebody would call the css() method before body has loaded or any        // DOM-is-ready events have fired.        if        (            typeof _propsObj['transform'] == 'undefined'            &&            (                arg == 'transform'                ||                (                    typeof arg == 'object'                    && typeof arg['transform'] != 'undefined'                )            )        )        {            _propsObj['transform'] = getTransformProperty(this.get(0));        }                // We force the property mapping here because jQuery.attr() does        // property mapping with jQuery.props when setting a CSS property,        // but curCSS() does *not* do property mapping when *getting* a        // CSS property. (It probably should since it manually does it        // for 'float' now anyway... but that'd require more testing.)        //        // But, only do the forced mapping if the correct CSS property        // is not 'transform' and is something else.        if (_propsObj['transform'] != 'transform')        {            // Call in form of css('transform' ...)            if (arg == 'transform')            {                arg = _propsObj['transform'];                                // User wants to GET the transform CSS, and in jQuery 1.4.3                // calls to css() for transforms return a matrix rather than                // the actual string specified by the user... avoid that                // behavior and return the string by calling jQuery.style()                // directly                if (typeof val == 'undefined' && jQuery.style)                {                    return jQuery.style(this.get(0), arg);                }            }            // Call in form of css({'transform': ...})            else if            (                typeof arg == 'object'                && typeof arg['transform'] != 'undefined'            )            {                arg[_propsObj['transform']] = arg['transform'];                delete arg['transform'];            }        }                return proxied.apply(this, arguments);    };})(jQuery);
