// Cross-browser, cross-platform, self-resizing // web page background images. JavaScript code// copyright 2006, 2007, 2008 Boutell.Com, Inc. //// See http://www.boutell.com/newfaq/ for more information.//// Permission granted to use, republish, sell and otherwise// benefit from this code as you see fit, provided you keep // this notice intact. You may remove comments below this line.//// END OF NOTICE//// INSTRUCTIONS: this WON'T WORK unless you do the following in the// document that includes it.//// 1. Specify the right doctype at the top of your page:////    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"//      "http://www.w3.org/TR/html4/strict.dtd">//// 2. In the <head> element of your page, bring in this code:////    <script src="resizing_background.js">//    </script>//// 3. Set the right event handlers in your body element//    (you may call other functions too, use semicolons to separate):////    <body onLoad="rbInit()" onResize="rbResize()">//// 4. Call rbOpen() immediately after your <body> element://// <script>// // For a centered image that scales up but keeps its proportions// // (be sure to also set a background-color style on body):// rbOpen(true);// // For an image that fills the entire window, distorting if necessary: // rbOpen(false);// </script>//// 5. If you have any absolutely positioned divs, put them//    BEFORE rbOpen(), and make VERY SURE you set z-index explicitly//    to 1 or higher for them, or the background will appear over//    them. Hint: use a style sheet to make that less painful.// // 6. Call rbClose() with the URL of YOUR background image,//    just before your </body> element (relative URLs are fine):////    <script>//      rbClose("background.jpg");//    </script>//// And that's all it takes! //// WARNINGS: //// 1. Internet Explorer versions prior to 7 will scroll jumpily.//   IE 7 beta 2 scrolls smoothly, just like Firefox, Safari, and Opera.//// 2. There's a very small "fudge factor" in use for Opera, because//   Opera doesn't support my Firefox trick to get the real size//   of the usable client area OR the Internet Explorer clientWidth//   method (Opera returns offsetWidth for clientWidth - that's//   not right, Opera). So I assume a 16 pixel scrollbar vertically//   and no scrollbar horizontally. Makes a very small difference.//// 3. Users with JavaScript disabled won't see a background.//   Set a reasonable background color in your <body> element//   as a fallback measure.function rbIsIE(){	if (navigator.appName == 'Microsoft Internet Explorer') {		return true;	}	return false;}function rbIsOpera(){	if (navigator.appName == 'Opera') {		return true;	}	return false;}function rbSupportsFixed(){	if (navigator.appName == 'Microsoft Internet Explorer') {		var agent = navigator.userAgent;		var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");		var version;		if (re.exec(agent) != null) {			version = parseFloat(RegExp.$1);		}		if (version < 7.0) {			return false;		}	}	return true;}var rbleft = false;function rbInit(){	if (rbSupportsFixed()) {		div = document.getElementById('rbBackgroundDiv');		div.style.position = 'fixed';	}		// I'd use onScroll, but that 	// doesn't exist in standards mode	setTimeout("rbReposition()", 50);	rbResize();}var rbLastScrollTop = null;var rbSimulateTop = 0; function rbResize(){	// We're in "standards mode," so we must use	// document.documentElement, not document.body, in IE.	var width;	var height;	var x, y, w, h;	if (rbIsIE()) {		// All modern versions of IE, including 7, give the		// usable page dimensions here.		width = parseInt(document.documentElement.clientWidth); 			height = parseInt(document.documentElement.clientHeight); 		} else if (rbIsOpera()) {		// This is slightly off: the width and height will include		// scrollbar space we can't really use. Compensate by		// subtracting 16 pixels of scrollbar space from the width		// (standard in Opera). Firefox has an equivalent but		// more serious problem because such a mistake in Firefox		// will break mouse clicks on the scrollbar in 		// Mac Firefox (yes, really!). Fortunately, in Firefox,		// we can use a third method that gives accurate results		// (see below).		width = parseInt(window.innerWidth) - 16;		// If there is a horizontal scrollbar this will be		// 16 pixels off in Opera. I can live with that.		// You don't design layouts with		// horizontal scrollbars, do you? (Shudder)		height = parseInt(window.innerHeight);	} else {		// Other non-IE browsers give the usable page dimensions here.		// We grab the info by discovering the visible dimensions 		// of a hidden 100% x 100% div. Opera doesn't like this		// method any more than IE does. Fun!		testsize = document.getElementById('rbTestSizeDiv');		width = testsize.scrollWidth;		height = testsize.scrollHeight;	}	div = document.getElementById('rbBackgroundDiv');	img = document.getElementById('rbBackground');	if (rbleft) {		if (img.width == 0) {			// We don't know the width yet, the image			// hasn't loaded. Set a timer to try again.			setTimeout("rbResize()", 1000);			return;		}		w = width;		h = width * (img.height / img.width);		x = 0;		y = (height - h) / 2;			if (y < 0) {			h = height;			w = height * (img.width / img.height);			y = 0;			x = (width - w) / 2;		}	} else {		x = 0;		y = 0;		w = width;		h = height;	}	// HTML 4.0 Strict makes the px suffix mandatory	// We have floating point numbers, trim them and add px	div.style.left = parseInt(x) + "px";	if (rbSupportsFixed()) {	  div.style.top = parseInt(y) + "px";        } else {          rbSimulateTop = parseInt(y);        }	img.style.width = parseInt(w) + "px";	img.style.height = parseInt(h) + "px";	div.style.visibility = 'visible';	rbLastScrollTop = null;	rbReposition();}function rbReposition(){	if (rbSupportsFixed()) {		return;	}	// Make sure we do this again	setTimeout("rbReposition()", 50);	// Standards mode, must use documentElement	body = document.documentElement;	var scrollTop = body.scrollTop;	// No scroll since last check	if (scrollTop == rbLastScrollTop) {		return;	}	rbLastScrollTop = scrollTop;	div = document.getElementById('rbBackgroundDiv');	var rbBodyDiv = document.getElementById('rbBodyDiv');	var pos = 0;	// Don't make the user scroll just to see the background itself	var max = rbBodyDiv.offsetHeight - rbBodyDiv.clientHeight;	if (max < 0) {		max = 0;	}	if (scrollTop <= max)	{		pos = scrollTop;	} else {		pos = max;	}	if (pos < 0) {		pos = 0;	}	div.style.top = pos + rbSimulateTop;}function rbOpen(left){	rbleft = left;	document.write("<div id='rbBodyDiv' style='position: relative; z-index: 2'>\n");}function rbClose(image){	document.write("</div>\n");	str = "<div " +		"id='rbBackgroundDiv' " +		"style='position: absolute; " +		"  visibility: hidden; " +		"  top: 0px; " +		"  left: 0px; " +		"  z-index: 0'>" +		"  <img src='" + image + "' id='rbBackground'>" +		"</div>\n";	document.write(str);	document.write("<div " +		"id='rbTestSizeDiv' " +		"style='width: 100%; " +		"  height: 100%; " +		"  position: fixed; " +		"  left: 0; " +		"  top: 0; " +		"  visibility: hidden; " +		"  z-index: -1'></div>\n");}
