Version 3.18.1
Show:

File: node/js/shim-plugin.js

                /**
                 * Provides shimming support for Node via a Plugin.
                 * This fixes SELECT bleedthrough for IE6 & Mac scrollbars
                 * @module shim-plugin
                 */
            
                /**
                 * Node plugin which can be used to add shim support.
                 *
                 * @class Plugin.Shim
                 * @param {Object} User configuration object
                 */
                function Shim(config) {
                    this.init(config);
                }
            
                /**
                 * Default class used to mark the shim element
                 *
                 * @property CLASS_NAME
                 * @type String
                 * @static
                 * @default "yui-node-shim"
                 */
                // TODO: use ClassNameManager
                Shim.CLASS_NAME = 'yui-node-shim';
            
                /**
                 * Default markup template used to generate the shim element.
                 *
                 * @property TEMPLATE
                 * @type String
                 * @static
                 */
                Shim.TEMPLATE = '<iframe class="' + Shim.CLASS_NAME +
                        '" frameborder="0" title="Node Stacking Shim"' +
                        'src="javascript:false" tabindex="-1" role="presentation"' +
                        'style="position:absolute; z-index:-1;"></iframe>';
            
                Shim.prototype = {
                    init: function(config) {
                        this._host = config.host;
                        this.initEvents();
                        this.insert();
                        this.sync();
                    },
            
                    initEvents: function() {
                        this._resizeHandle = this._host.on('resize', this.sync, this);
                    },
            
                    getShim: function() {
                        return this._shim || (
                            this._shim = Y.Node.create(
                                Shim.TEMPLATE,
                                this._host.get('ownerDocument')
                            )
                        );
                    },
            
                    insert: function() {
                        var node = this._host;
                        this._shim = node.insertBefore( this.getShim(),
                                node.get('firstChild'));
                    },
            
                    /**
                     * Updates the size of the shim to fill its container
                     * @method sync
                     */
                    sync: function() {
                        var shim = this._shim,
                            node = this._host;
            
                        if (shim) {
                            shim.setAttrs({
                                width: node.getStyle('width'),
                                height: node.getStyle('height')
                            });
                        }
                    },
            
                    /**
                     * Removes the shim and destroys the plugin
                     * @method destroy
                     */
                    destroy: function() {
                        var shim = this._shim;
                        if (shim) {
                            shim.remove(true);
                        }
            
                        this._resizeHandle.detach();
                    }
                };
            
                Shim.NAME = 'Shim';
                Shim.NS = 'shim';
            
                Y.namespace('Plugin');
                Y.Plugin.Shim = Shim;