shim-plugin.js revision 466200308787f6369797d65cec3597a92e7e6c39
YUI.add('shim-plugin', function(Y) {
/**
* 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 Shim.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 Shim.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 from the DOM
* @method destroy
*/
destroy: function() {
var shim = this._shim;
if (shim) {
shim.get('parentNode').removeChild(this._shim);
shim = null;
}
this._resizeHandle.detach();
}
};
Shim.NAME = 'Shim';
Shim.NS = 'shim';
Y.namespace('Plugin');
Y.Plugin.Shim = Shim;
}, '@VERSION@' ,{requires:['node-style', 'node-pluginhost']});