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;