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