﻿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: "",
    extraItems: new Array(),
    extraFunctions: new Array(),
    currentAsyncExtraFunction: null,

    preloadExtraImages: function(extraImages) {
        if (extraImages != null) {
            for (var i = 0; i < extraImages.length; i++)
                QueryLoader.extraItems.push(extraImages[i]);
        }
    },

    addFunction: function(f) {
        QueryLoader.extraFunctions.push(f);
    },

    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 :)
        if ($.browser.msie)
            QueryLoader.ieTimeout = setTimeout("QueryLoader.ieLoadFix()", QueryLoader.ieLoadFixTime);
    },

    ieLoadFix: function() {
        var ie = navigator.userAgent.match(/MSIE (\d+(?:\.\d+)+(?:b\d*)?)/);
        if (ie != null && ie.length > 0) {
            if (ie[0].match("MSIE")) {
                //while ((100 / QueryLoader.doneStatus) * QueryLoader.doneNow < 100) {
                //    QueryLoader.imgCallback();
                //}
            }
        }
    },

    imgCallback: function() {
        QueryLoader.doneNow++;
        QueryLoader.animateLoader();
    },

    notifyExtraFuncComplete: function() {
        //        if (QueryLoader.doneNow >= (QueryLoader.items.length + QueryLoader.extraItems.length)) {
        //            var idx = QueryLoader.doneNow - (QueryLoader.items.length + QueryLoader.extraItems.length);
        //            if (idx < QueryLoader.extraFunctions.length)
        //                setTimeout("QueryLoader.extraFunctions[" + idx + "]();", 50);
        //        }
        if (QueryLoader.extraFunctions.length > 0) {
            if (QueryLoader.currentAsyncExtraFunction != null)
                QueryLoader.imgCallback();

            QueryLoader.currentAsyncExtraFunction = QueryLoader.extraFunctions.shift();
            setTimeout("QueryLoader.currentAsyncExtraFunction();", 50);
        } else {
            QueryLoader.items = new Array();
            QueryLoader.getImages(QueryLoader.selectorPreload);
            QueryLoader.doneStatus = QueryLoader.items.length + QueryLoader.extraFunctions.length;
            QueryLoader.createPreloading();
        }
    },

    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) {
                var found = false;
                url = url.toLowerCase();
                for (var i = 0; !found && i < QueryLoader.items.length; i++) {
                    var idx = QueryLoader.items[i].indexOf(url);
                    if (idx >= 0) {
                        var ck = QueryLoader.items[i].substring(0, idx) + url;
                        found = ck == QueryLoader.items[i];
                    }
                }
                if (!found)
                    QueryLoader.items.push(url.toLowerCase());
            }
        });

        for (var j = 0; j < QueryLoader.extraItems.length; j++) {
            var found = false;
            url = QueryLoader.extraItems[j].toLowerCase();
            for (var i = 0; !found && i < QueryLoader.items.length; i++) {
                var idx = QueryLoader.items[i].indexOf(url);
                if (idx >= 0) {
                    var ck = QueryLoader.items[i].substring(0, idx) + url;
                    found = ck == QueryLoader.items[i];
                }
            }
            if (!found)
                QueryLoader.items.push(url);
        }

        var x = 0;
    },

    createPreloading: function() {

        var length = QueryLoader.items.length;

        if (QueryLoader.preloader == "") {
            QueryLoader.preloader = $("<div></div>").appendTo(QueryLoader.selectorPreload);
            $(QueryLoader.preloader).css({
                height: "0px",
                width: "0px",
                overflow: "hidden"
            });

            QueryLoader.doneStatus = length + QueryLoader.extraFunctions.length;
        }

        if (QueryLoader.extraFunctions.length > 0) {
            QueryLoader.notifyExtraFuncComplete();
            return;
        }

        for (var i = 0; i < length; i++) {
            var imgLoad = "<img src=\"" + QueryLoader.items[i] + "\" onload=\"QueryLoader.imgCallback();\" onerror=\"QueryLoader.imgCallback()\"/>";
            QueryLoader.preloader.append(imgLoad);
            //            var imgLoad = $("<img></img>");
            //            $(imgLoad).attr("src", QueryLoader.items[i]);
            //            $(imgLoad).unbind("load");
            //            $(imgLoad).bind("load", function() {
            //                QueryLoader.imgCallback();
            //            });
            //            $(imgLoad).unbind("error");
            //            $(imgLoad).bind("error", function() {
            //                QueryLoader.imgCallback();
            //            });
            //$(imgLoad).appendTo(QueryLoader.preloader);
        }
    },

    spawnLoader: function() {
        if (QueryLoader.selectorPreload == "body") {
            var height = "100%"; //$(window).height();
            var width = "100%"; //$(window).width();
            var position = "fixed";
        } else {
            var height = $(QueryLoader.selectorPreload).outerHeight() + "px";
            var width = $(QueryLoader.selectorPreload).outerWidth() + "px";
            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,
            height: height
        });

        QueryLoader.loadBar = $("<div></div>").appendTo($(QueryLoader.overlay));
        $(QueryLoader.loadBar).addClass("QLoader");

        $(QueryLoader.loadBar).css({
            position: "fixed",
            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
        if ($.browser.msie)
            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
        if ($.browser.msie && $.browser.version.substr(0, 3) < "8.0") {
            $(QueryLoader.overlay).fadeOut(800, function() {
                $(QueryLoader.preloader).remove();
                if (QueryLoader.doneComplete != undefined && QueryLoader.doneComplete != null)
                    QueryLoader.doneComplete();
            });
        } else {
            $(QueryLoader.loadBar).animate({
                height: height + "px",
                top: "0%"
            }, 500, "linear", function() {
                $(QueryLoader.overlay).fadeOut(800, function() {
                    $(QueryLoader.preloader).remove();
                    if (QueryLoader.doneComplete != undefined && QueryLoader.doneComplete != null)
                        QueryLoader.doneComplete();
                });
            });
        }
    },

    doneComplete: undefined
}

