﻿if (jQuery) (function ($) {

    $.extend($.fn, {

        preLoadImages: function (callback) {

            var images = $("img");
            var loaded = 0;
            var toLoad = images.length;

            var reg = new RegExp('/styles/');
            var asyncPreload = new Array();
            var syncLoad = new Array();

            var notifyComplete = function () {
                if (++loaded == toLoad) {
                    if (callback != undefined)
                        callback();

                    var syncLoadImages = function () {
                        $(asyncPreload).each(function () {
                            var $this = $(this);
                            var img = $(new Image());

                            $this.addClass('loadingImage');

                            img.load(function () {
                                $this.removeClass('loadingImage');
                            }).error(function () {
                                $this.removeClass('loadingImage');
                            }).attr('src', $this.attr('src'));
                        });
                    }

                    window.setTimeout(syncLoadImages, 2000);
                }
            }

            images.each(function () {
                if ($(this).attr('src').toLowerCase().match(reg) || $(this).hasClass('preload'))
                    syncLoad.push($(this));
                else
                    asyncPreload.push($(this));
            });

            toLoad = syncLoad.length;

            $(syncLoad).each(function () {
                var img = new Image();

                img.onload = function () {
                    notifyComplete();
                };

                img.onerror = function () {
                    notifyComplete();
                };

                img.src = $(this).attr('src');
            });

            notifyComplete();
        }
    });

})(jQuery);
