(function($) {

	$.fn.preloader = function(variables) {
		
		var defaultValues = {
			fadeInTime: 1000,
			delay: 0
			};
		
		var options = $.extend( defaultValues, variables );
		
		return this.each( function() {	
		
			var imageContainer = $(this),
				images = imageContainer.find('img').css({opacity:0, visibility:'hidden'}),
				imagesCount = images.length;
								
			imageContainer.operations = {	

				preload: function()	{		
					images.each( function(i, event) {
						var image = $(this);
						if( event.complete == true ) {	
							imageContainer.operations.showImage(image);
						} else {
							image.bind('load error',{currentImage: image}, imageContainer.operations.showImage);
						}
					});
					return this;
				},
									
				showImage: function(image) {
					imagesCount --;
					if( image.data.currentImage != undefined ) image = image.data.currentImage;
					if ( options.delay <= 0 ) image.css('visibility','visible').animate({opacity:1}, options.fadeInTime);
					if( imagesCount == 0 ) {
						if( options.delay > 0 ) {
							images.each( function(i, event) {	
								var image = $(this);
								image.css({opacity:0, visibility:'hidden', display:'block'});
								setTimeout( function() {
									image.css({visibility : 'visible'}).animate({opacity:1}, options.fadeInTime);
								},
								options.delay * (i+1));
							});
						}
					}
				}

			};
				
			imageContainer.operations.preload();
			
		});
		
	};
	
})(jQuery);
