/*
File: jquery.imagePreloader.js
Description: image preloading methods
*/
(function ($) {	
		
	/*
	 * jquery extension to preload image from a selector	  
	 * usage ex: $("img").preloadImg();	 
	 * 
	 * @param function $callback (optional) callback function to call when image/s have been loaded
	 * @return void 
	 */
	$.fn.preloadImg = function(callback){
		
		//create an array of image src's
		var all_src_arr = [];
		$(this).each(function()
		{		
			var src_val = $(this).attr('src');
			if(src_val !== undefined)
			{
				all_src_arr.push(src_val);
			}
		});
		
		//pass the array to preloadImgPath
		if(all_src_arr.length > 0)
		{
			$.preloadImgPath(all_src_arr,callback);
		}
		//make sure we call the callback even if there was no img srcs
		else if ($.isFunction(callback)) 
		{
			callback();
		}		
	}; 
	
	/*
	 * jquery function to load images given a path
	 * 
	 * usage ex: 	$.preloadImgPath('/img/myimage.jpg');
	 * 				$.preloadImgPath(['/img/myimage.jpg','/img/myimage2.jpg']);
	 * 
	 * @param string|array $imgs list of images to load
	 * @param function $callback callback function to call when all images are loaded
	 * @return void
	 */
	
	$.preloadImgPath = function(imgs,callback)
	{	
		var pic = [], i, total, loaded = 0;
		if (typeof imgs != 'undefined') {
			if ($.isArray(imgs)) {
				total = imgs.length; // used later
					for (i=0; i < total; i++) {
						pic[i] = new Image();
						pic[i].onload = function() {
							loaded++; // should never hit a race condition due to JS's non-threaded nature
							if (loaded == total) {
								if ($.isFunction(callback)) {
									callback();
								}
							}
						};
						pic[i].src = imgs[i];
					}
			}
			else {
				pic[0] = new Image();
				pic[0].onload = function() {
					if ($.isFunction(callback)) {
						callback();
					}
				};
				pic[0].src = imgs;
			}
		}
		//invalid or null input, still exe callback
		else
		{			
			if ($.isFunction(callback)) 
			{
				callback();
			}
		}
		pic = undefined;		
	};

	
	//this method will preload all the background images referenced in CSS	
	$.preloadSMImgs = function() {
		var imgs_to_load = [
		                    //sm_header_nav
		                    '/images/sm_logo_header.jpg',
		                    '/images/navigation/images/Website_Subscribe_buttons_1_01.png',
		                    '/images/navigation/images/Website_Subscribe_buttons_1_over_01.png',
		                    '/images/navigation/images/Website_Subscribe_buttons_1_02.png',
		                    '/images/navigation/images/Website_Subscribe_buttons_1_over_02.png',
		                    '/images/navigation/subnav/navoff_01.png',
		                    '/images/navigation/subnav/navoff_02.png',
		                    '/images/navigation/subnav/navoff_04.png',
		                    '/images/navigation/subnav/navoff_05.png',
		                    '/images/navigation/subnav/navon_01.png',
		                    '/images/navigation/subnav/navon_02.png',
		                    '/images/navigation/subnav/navon_04.png',
		                    '/images/navigation/subnav/navon_05.png',
		                    
		                    //sm_gallery
		                    '/images/gallery_arrow_right_sm.png',
		                    '/images/gallery_arrow_left_sm.png',
		                    
		                    //sm_generic
		                    '/images/tab.png',
		                    '/images/dropshadow/upperrightfade.png',
		                    '/images/dropshadow/lowerleftfade.png',
		                    '/images/dropshadow/shadow.png',
		                    
		                    //sm_home_carousel
		                    '/images/big_transparent.gif',
		                    '/images/gallery_arrow_left.png',
		                    '/images/big_transparent.gif',
		                    '/images/gallery_arrow_right.png',
		                    '/images/spanbg.png',
		                    
		                    
		                    //sm_mainnav
		                    '/images/nav_gradient.jpg',
		                    '/images/navigation/images/nav_off_01.png',
		                    '/images/navigation/images/nav_on_01.png',
		                    '/images/navigation/images/nav_off_02.png',
		                    '/images/navigation/images/nav_on_02.png',
		                    '/images/navigation/images/nav_off_03.png',
		                    '/images/navigation/images/nav_on_03.png',
		                    '/images/navigation/images/nav_off_04.png',
		                    '/images/navigation/images/nav_on_04.png',
		                    
		                    //sm_page
		                    '/images/sm_page_print_s1.gif',
		                    '/images/sm_page_pdf_s1.gif',
		                    
		                    
		                    //sm_photog
		                    '/images/li_button.png',		                    
		                    '/images/about_divider.jpg',
		                    '/images/h2_divider.jpg',
		                    //'/images/photog_photo.png',
		                    '/images/photog_media.png',
		                    '/images/navigation/subnav_toggle_left_off.png',
		                    '/images/navigation/subnav_toggle_left_on.png',
		                    '/images/navigation/subnav_toggle_right_off.png',
		                    '/images/navigation/subnav_toggle_right_on.png',
		                    
		                    '/images/btn_fullscreen_ret.png',
		                    
		                    //sm_scroll
		                    '/images/basic_arrow_up.gif',
		                    '/images/basic_arrow_down.gif'
		                    
		                    ];
		
		$.preloadImgPath(imgs_to_load);
		
	};


})(jQuery);


