    /**
     * 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;
