$.fn.preloader = function(options) {
	var defaults = {
		delay: 200,
		preload_parent: "img",
		check_timer: 300,
		ondone: function() {},
		oneachload: function(image) {},
		fadein: 1000 
	};
	
	
	// variables declaration and precaching images and parent container
	var options = $.extend(defaults, options),
	root = $(this) , images = root.find("img").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('preloader').find('div').remove();
						$(".controls").animate({opacity: 1});
					});
				}
			}
	}, options.check_timer)};
	
	
	
	images.each(function() {
		if ($(this).parent(options.preload_parent).length == 0)
			$(this).wrap("<div class='preloader' />");
		else
			$(this).parent().addClass("preloader");
		
		checkFlag[i++] = false;
	}); 
	
	
	images = $.makeArray(images); 
	var icon = jQuery("<img />", {
		id : 'loadingicon' /*,
		src : 'images/loader.gif'*/
	}).hide().appendTo("body");
	
	
	timer = setInterval(function() {
		if (icon[0].complete == true) {
			clearInterval(timer);
			init();
			icon.remove();
			return;
		}
	}, 100);
}
