(function($) {
	
	// JavaScript Document
	$.fn.preload = function(options) {

		if ( $.browser.msie ) {
			return false;
		}

		var defaults = {
			delay: 50,
			preload_parent: "a",
			check_timer: 300,
			ondone: function () {},
			oneachload: function( image ) {},
			fadein: 500 
		};

		// variables declaration and precaching images and parent container
		var options = $.extend(defaults, options),
				root = $(this), images = root.find('img:not("#zoom_area")').css({'visibility':'hidden',opacity:0}), 
				timer, counter = 0, i = 0, checkFlag = [], delaySum = options.delay,

		init = function() {

			timer = setInterval(function() {

				if ( counter >= checkFlag.length ) {
					clearInterval(timer);
					options.ondone();
					return;
				}

				for ( i = 0; i < images.length; i++ ) {
					if ( images[i].complete == true ) {
						if ( checkFlag[i] == false ) {
							checkFlag[i] = true;
							options.oneachload(images[i]);
							counter++;
							delaySum = delaySum + options.delay;
						}

						$(images[i]).css("visibility","visible").delay(delaySum).animate({
							opacity:1
						}, options.fadein, function() { 
							$(this).parent().removeClass("preload");
						});
					}
				}

			}, options.check_timer) 

		};

		images.each(function() {
			if( $(this).parent(options.preload_parent).length == 0 ) {
				$(this).wrap("<a class='preload' />");
			} else {
				$(this).parent().addClass("preload");
				checkFlag[i++] = false;
			}
		}); 

		images = $.makeArray(images); 

		var icon = jQuery( "<img />", {
			id : 'loading_icon',
			src : '/images/ploader.gif'
		}).hide().appendTo("body");

		timer = setInterval(function() {
			if ( icon[0].complete == true ) {
				clearInterval(timer);
				init();
				icon.remove();
				return;
			}
		}, 100 );

	};
	
})(jQuery);
