﻿(function($){
    $.fn.snrImagePreloader = function(options){
        // extend default options with those provided
        var settings = $.extend({}, $.fn.snrImagePreloader.defaults, options);   
        //caching
        settings.root = this.hide();  
        settings.images = settings.root.find("img");
        settings.imageArray = new Array();    
        settings.loader = $.fn.snrImagePreloader.buildLoader(settings);                 
        
        var ImagePreloader = (function(){
            var init = function(){
                //insert loader
                settings.loader.insertBefore(settings.root);
        		
		        // populate array with image urls
                settings.images.each(function(){
                    settings.imageArray.push($(this).attr('src'));
                });
                                
                loadPage();
            },
            loadPage = function(){
                // fired when images are loaded
                $.when(loadImages()).done(function(){
                    $.when(showImages()).done(function(){
                        onComplete();
                    });
                });   
            },
            showImages = function(){
                return $.Deferred(
                    function(dfd){
                        settings.loader.hide();
                        // check if transition supplied is a valid function
                        var initFx = $.fn.snrImagePreloader.transitions[settings.fx];
                        if ($.isFunction(initFx)) 
                            // run fx passing in settings and dfd
                            initFx(settings, dfd);
                        else {
                            // log error message
                            window.console.log('unknown transition: ' + settings.fx, '; slideshow terminating');
                            return false;
                        }
                    }
				).promise();
            },
            onComplete = function(){
                settings.onComplete();
                return settings.root; // return root for chainability
            },
            loadImages = function(){ // load images function
                return $.Deferred(
                    function(dfd){
	                    var total_images = settings.imageArray.length,
	                    loaded = 0;
	                    for(var i = 0; i < total_images; ++i){
		                    $('<img/>').load(function(){
			                    ++loaded;
			                    if(loaded === total_images)
				                    dfd.resolve();
		                    }).attr('src' , settings.imageArray[i]).error(function(){
		                        ++loaded;
		                        window.console.log("broken image: "); //settings.imageArray[i]
		                    });
	                    }
                    }
                ).promise();
            }; 
            
            return {
                init: init
            }
            
        })();
        
        ImagePreloader.init();
    }; 
    
    $.fn.snrImagePreloader.defaults = {
        loaderClass: "loading",
        loaderText: "loading...",
        fx: "fade",
        fxSpeed: "slow",
        onComplete: function(){return true}
    };
    
    $.fn.snrImagePreloader.buildLoader = function(settings){
        return $("<div />").addClass(settings.loaderClass)
                           .html(settings.loaderText);
    };
    
    // transition definitions - only fade is defined here, transition pack defines the rest
    $.fn.snrImagePreloader.transitions = {
        fade: function (settings, dfd) {
            settings.root.fadeIn('slow', dfd.resolve); 
        }
    };
           
})(jQuery);

// Transition Pack 
(function ($) {
    // no transition
    $.fn.snrImagePreloader.transitions.none = function (settings, dfd) {
        settings.root.show();
        dfd.resolve;
    };
    // slide down fx
    $.fn.snrImagePreloader.transitions.slideDown = function (settings, dfd) {
        settings.root.slideDown(settings.fxSpeed, dfd.resolve);
    };
    // slide up fx
    $.fn.snrImagePreloader.transitions.slideUp = function (settings, dfd) {
        settings.root.slideUp(settings.fxSpeed, dfd.resolve);
    };
})(jQuery);
