/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * LastChangedDate: 2007-07-21 18:44:59 -0500 (Sat, 21 Jul 2007) 
 * Rev: 2446 
 *
 * Version 2.1.1
 */

( function(jQuery) {

	/**
	 * The bgiframe is chainable and applies the iframe hack to get 
	 * around zIndex issues in IE6. It will only apply itself in IE6 
	 * and adds a class to the iframe called 'bgiframe'. The iframe
	 * is appeneded as the first child of the matched element(s) 
	 * with a tabIndex and zIndex of -1.
	 * 
	 * By default the plugin will take borders, sized with pixel units,
	 * into account. If a different unit is used for the border's width,
	 * then you will need to use the top and left settings as explained below.
	 *
	 * NOTICE: This plugin has been reported to cause perfromance problems
	 * when used on elements that change properties (like width, height and
	 * opacity) a lot in IE6. Most of these problems have been caused by 
	 * the expressions used to calculate the elements width, height and 
	 * borders. Some have reported it is due to the opacity filter. All 
	 * these settings can be changed if needed as explained below.
	 *
	 * @example jQuery('div').bgiframe();
	 * @before <div><p>Paragraph</p></div>
	 * @result <div><iframe class="bgiframe".../><p>Paragraph</p></div>
	 *
	 * @param Map settings Optional settings to configure the iframe.
	 * @option String|Number top The iframe must be offset to the top
	 * 		by the width of the top border. This should be a negative 
	 *      number representing the border-top-width. If a number is 
	 * 		is used here, pixels will be assumed. Otherwise, be sure
	 *		to specify a unit. An expression could also be used. 
	 * 		By default the value is "auto" which will use an expression 
	 * 		to get the border-top-width if it is in pixels.
	 * @option String|Number left The iframe must be offset to the left
	 * 		by the width of the left border. This should be a negative 
	 *      number representing the border-left-width. If a number is 
	 * 		is used here, pixels will be assumed. Otherwise, be sure
	 *		to specify a unit. An expression could also be used. 
	 * 		By default the value is "auto" which will use an expression 
	 * 		to get the border-left-width if it is in pixels.
	 * @option String|Number width This is the width of the iframe. If
	 *		a number is used here, pixels will be assume. Otherwise, be sure
	 * 		to specify a unit. An experssion could also be used.
	 *		By default the value is "auto" which will use an experssion
	 * 		to get the offsetWidth.
	 * @option String|Number height This is the height of the iframe. If
	 *		a number is used here, pixels will be assume. Otherwise, be sure
	 * 		to specify a unit. An experssion could also be used.
	 *		By default the value is "auto" which will use an experssion
	 * 		to get the offsetHeight.
	 * @option Boolean opacity This is a boolean representing whether or not
	 * 		to use opacity. If set to true, the opacity of 0 is applied. If
	 *		set to false, the opacity filter is not applied. Default: true.
	 * @option String src This setting is provided so that one could change 
	 *		the src of the iframe to whatever they need.
	 *		Default: "javascript:false;"
	 *
	 * @name bgiframe
	 * @type jQuery
	 * @cat Plugins/bgiframe
	 * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
	 */
	jQuery.fn.bgIframe = jQuery.fn.bgiframe = function(s) {
		// This is only for IE6
		if (jQuery.browser.msie && /6.0/.test(navigator.userAgent)) {
			s = jQuery.extend( {
				top : 'auto', // auto == .currentStyle.borderTopWidth
				left : 'auto', // auto == .currentStyle.borderLeftWidth
				width : 'auto', // auto == offsetWidth
				height : 'auto', // auto == offsetHeight
				opacity : true,
				src : 'javascript:false;'
			}, s || {});
			var prop = function(n) {
				return n && (n.constructor == Number) ? n + 'px' : n;
			}, html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'
					+ s.src
					+ '"'
					+ 'style="display:block;position:absolute;z-index:-1;'
					+ (s.opacity !== false ? 'filter:Alpha(Opacity=\'0\');'
							: '')
					+ 'top:'
					+ (s.top == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')'
							: prop(s.top))
					+ ';'
					+ 'left:'
					+ (s.left == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')'
							: prop(s.left))
					+ ';'
					+ 'width:'
					+ (s.width == 'auto' ? 'expression(this.parentNode.offsetWidth+\'px\')'
							: prop(s.width))
					+ ';'
					+ 'height:'
					+ (s.height == 'auto' ? 'expression(this.parentNode.offsetHeight+\'px\')'
							: prop(s.height)) + ';' + '"/>';
			return this.each( function() {
				if (jQuery('> iframe.bgiframe', this).length == 0) {
					this.insertBefore(document.createElement(html),
							this.firstChild);
				}
			});
		}
		return this;
	};

})(jQuery);

