/*
 * jQuery Backstretch
 * Version 1.1.2
 * http://srobbin.com/jquery-plugins/jquery-backstretch/
 *
 * Add a dynamically-resized background image to the page
 *
 * Copyright (c) 2010 Scott Robbin (srobbin.com)
 * Dual licensed under the MIT and GPL licenses.
*/

(function ($) {

	$.backstretch = function (src, options, callback) {
		var settings = {
			centeredX: true,         // Should we center the image on the X axis?
			centeredY: true,         // Should we center the image on the Y axis?
			speed: 0,                // fadeIn speed for background after image loads (e.g. "fast" or 500)
			direction: 'right'
		},
		rootElement = ("onorientationchange" in window) ? $(document) : $(window), // hack to acccount for iOS position:fixed shortcomings
		imgRatio, bgImg, bgWidth, bgHeight, bgOffset, bgCSS;
	    
		// Extend the settings with those the user has provided
		if (options && typeof options === "object") {
			$.extend(settings, options);
		}
		
	    function adjustBG(fn) {
			try {
				bgCSS = { left: 0, top: 0 };
				bgWidth = rootElement.width();
				bgHeight = bgWidth / imgRatio;
				
				// Make adjustments based on image ratio
				// Note: Offset code provided by Peter Baker (http://ptrbkr.com/). Thanks, Peter!
				if (bgHeight >= rootElement.height()) {
					bgOffset = (bgHeight - rootElement.height()) / 2;
					if (settings.centeredY) {
						$.extend(bgCSS, {top: "-" + bgOffset + "px"});
					}
				} else {
					bgHeight = rootElement.height();
					bgWidth = bgHeight * imgRatio;
					bgOffset = (bgWidth - rootElement.width()) / 2;
					if (settings.centeredX) {
						$.extend(bgCSS, {left: "-" + bgOffset + "px"});
					}
				}
			
				$(".backstretch.current img").width(bgWidth).height(bgHeight).css(bgCSS);
			} catch (err) {
				// IE7 seems to trigger adjustBG before the image is loaded.
				// This try/catch block is a hack to let it fail gracefully.
			}
			
			// Executed the passed in function, if necessary
			if (typeof fn === "function") {
				fn();
			}
	    }
	
		function init() {
		    // Prepend image, wrapped in a DIV, with some positioning and zIndex voodoo
			if (src) {
				
				// show loading animation
				var loading_timeout = setTimeout(function () {
			        $('#loading').jani.play();					
				}, 300);
		        
				var container = $("<div />").attr("class", "backstretch"),
					img = $("<img />").css({display: "none", left: 0, top: 0, position: "fixed", overflow: "hidden", zIndex: -9998 })
						.bind("load", function (e) {
			
							// hide loading animation			
					        $('#loading').jani.stop();
				        	clearTimeout(loading_timeout);
	        
							var self = $(this);
							imgRatio = $(e.target).width() / $(e.target).height();
							
							$('.backstretch.current').removeClass('current');
							container.addClass('current');

							adjustBG(function () {
								if (settings.direction === 'fade') {
									self.fadeIn(settings.speed, function () {
										self.css({ zIndex: -9999 });									  
										if (typeof callback === "function") {
											callback();
										}
									});
									
									$('.backstretch:not(.current) img').fadeOut(settings.speed, function () {
										$('.backstretch:not(.current)').remove();
									});
								} else {
									self.show('slide', { direction: settings.direction }, settings.speed, function () {
										self.css({ zIndex: -9999 });
										if (typeof callback === "function") {
											callback();
										}
									});
									
									// reverse direction
									var reverseDirection = settings.direction === 'left' ? 'right' : 'left';
									
									$('.backstretch:not(.current) img').hide('slide', { direction: reverseDirection }, settings.speed, function () {
										$('.backstretch:not(.current)').remove();
									});
								}
							});
						})
						.appendTo(container);
				  
				$("body").prepend(container);
				img.attr("src", src); // Hack for IE img onload event
				
				// Adjust the background size when the window is resized or orientation has changed (iOS)
				$(window).resize(adjustBG);
			}
		}
	    
		// Initialize
		$(document).ready(init);
	
		// For chaining
		return this;
	};
  
})(jQuery);
