var QueryLoader = {

	/*

	 * QueryLoader		Preload your site before displaying it!

	 * Author:			Gaya Kessler

	 * Date:			23-09-09

	 * URL:				http://www.gayadesign.com

	 * Version:			1.0

	 * 

	 * A simple jQuery powered preloader to load every image on the page and in the CSS

	 * before displaying the page to the user.

	 */

	

	overlay: "",

	loadBar: "",

	preloader: "",

	items: new Array(),

	doneStatus: 0,

	doneNow: 0,

	selectorPreload: "body",

	ieLoadFixTime: 2000,

	ieTimeout: "",

		

	init: function() {

		if (navigator.userAgent.match(/MSIE (\d+(?:\.\d+)+(?:b\d*)?)/) == "MSIE 6.0,6.0") {

			//break if IE6			

			return false;

		}

		if (QueryLoader.selectorPreload == "body") {

			QueryLoader.spawnLoader();

			QueryLoader.getImages(QueryLoader.selectorPreload);

			QueryLoader.createPreloading();

		} else {

			$(document).ready(function() {

				QueryLoader.spawnLoader();

				QueryLoader.getImages(QueryLoader.selectorPreload);

				QueryLoader.createPreloading();

			});

		}

		

		//help IE drown if it is trying to die :)

		QueryLoader.ieTimeout = setTimeout("QueryLoader.ieLoadFix()", QueryLoader.ieLoadFixTime);

	},

	

	ieLoadFix: function() {

		var ie = navigator.userAgent.match(/MSIE (\d+(?:\.\d+)+(?:b\d*)?)/);

		if (ie[0].match("MSIE")) {

			while ((100 / QueryLoader.doneStatus) * QueryLoader.doneNow < 100) {

				QueryLoader.imgCallback();

			}

		}

	},

	

	imgCallback: function() {

		QueryLoader.doneNow ++;

		QueryLoader.animateLoader();

	},

	

	getImages: function(selector) {

		var everything = $(selector).find("*:not(script)").each(function() {

			var url = "";

			

			if ($(this).css("background-image") != "none") {

				var url = $(this).css("background-image");

			} else if (typeof($(this).attr("src")) != "undefined" && $(this).attr("tagName").toLowerCase() == "img") {

				var url = $(this).attr("src");

			}

			

			url = url.replace("url(\"", "");

			url = url.replace("url(", "");

			url = url.replace("\")", "");

			url = url.replace(")", "");

			

			if (url.length > 0) {

				QueryLoader.items.push(url);

			}

		});

	},

	

	createPreloading: function() {

		QueryLoader.preloader = $("<div></div>").appendTo(QueryLoader.selectorPreload);

		$(QueryLoader.preloader).css({

			height: 	"0px",

			width:		"0px",

			overflow:	"hidden"

		});

		

		var length = QueryLoader.items.length; 

		QueryLoader.doneStatus = length;

		

		for (var i = 0; i < length; i++) {

			var imgLoad = $("<img></img>");

			$(imgLoad).attr("src", QueryLoader.items[i]);

			$(imgLoad).unbind("load");

			$(imgLoad).bind("load", function() {

				QueryLoader.imgCallback();

			});

			$(imgLoad).appendTo($(QueryLoader.preloader));

		}

	},



	spawnLoader: function() {

		if (QueryLoader.selectorPreload == "body") {

			var height = $(window).height();

			var width = $(window).width();

			var position = "fixed";

		} else {

			var height = $(QueryLoader.selectorPreload).outerHeight();

			var width = $(QueryLoader.selectorPreload).outerWidth();

			var position = "absolute";

		}

		var left = $(QueryLoader.selectorPreload).offset()['left'];

		var top = $(QueryLoader.selectorPreload).offset()['top'];

		

		QueryLoader.overlay = $("<div></div>").appendTo($(QueryLoader.selectorPreload));

		$(QueryLoader.overlay).addClass("QOverlay");

		$(QueryLoader.overlay).css({

			position: position,

			top: top,

			left: left,

			width: width + "px",

			height: height + "px"

		});

		

		QueryLoader.loadBar = $("<div></div>").appendTo($(QueryLoader.overlay));

		$(QueryLoader.loadBar).addClass("QLoader");

		

		$(QueryLoader.loadBar).css({

			position: "relative",

			top: "50%",

			width: "0%"

		});

	},

	

	animateLoader: function() {

		var perc = (100 / QueryLoader.doneStatus) * QueryLoader.doneNow;

		if (perc > 99) {

			$(QueryLoader.loadBar).stop().animate({

				width: perc + "%"

			}, 500, "linear", function() { 

				QueryLoader.doneLoad();

			});

		} else {

			$(QueryLoader.loadBar).stop().animate({

				width: perc + "%"

			}, 500, "linear", function() { });

		}

	},

	

	doneLoad: function() {

		//prevent IE from calling the fix

		clearTimeout(QueryLoader.ieTimeout);

		

		//determine the height of the preloader for the effect

		if (QueryLoader.selectorPreload == "body") {

			var height = $(window).height();

		} else {

			var height = $(QueryLoader.selectorPreload).outerHeight();

		}

		

		//The end animation, adjust to your likings

		$(QueryLoader.loadBar).animate({

			height: height + "px",

			top: 0

		}, 500, "linear", function() {

			$(QueryLoader.overlay).fadeOut(800);

			$(QueryLoader.preloader).remove();

		});

	}

}
