(function($) {
	$.fn.ultraFade = function(settings) {
		var config = {'delay': 3000, 'fadeStyle':1};
 
		if (settings) $.extend(config, settings);
		
		this.each(function() {		
			var slides=$(this).children('img');
			var currentslide=0;
			var intervalHook=null;
			var slots;
			
			function nextSlide() {
				lastslide=currentslide;
				currentslide++;
				if (currentslide>slides.length-1) currentslide=0;
				slides.eq(lastslide).css('z-index',1);
				for (i=0;i<slides.length;i++) {
					if (i!=lastslide) {
						slides.eq(i).hide()
					} else {
						slides.eq(i).show()
					}
				}
				
				for(i=0;i<slots.length;i++) {
					switch (config.fadeStyle) {
						case 1:
							slots.eq(i).css({backgroundImage:'url('+slides.eq(currentslide).attr('src')+')',opacity:0, display:'block'}).animate({opacity:1}, {duration: 600+Math.cos((i+1)*Math.PI/slots.length*2)*400});
							break;
						case 2:
							slots.eq(i).css({backgroundImage:'url('+slides.eq(currentslide).attr('src')+')',opacity:0, display:'block'}).animate({opacity:1}, {duration: 600-Math.cos((i+1)*Math.PI/slots.length*2)*400});
							break;
						case 3:
							slots.eq(i).css({backgroundImage:'url('+slides.eq(currentslide).attr('src')+')',width:0, display:'block'}).animate({width:20}, {duration: 400+Math.cos((i+1)*Math.PI/slots.length*2)*200});
							break;
						case 4:
							slots.eq(i).css({backgroundImage:'url('+slides.eq(currentslide).attr('src')+')',width:0, display:'block'}).animate({width:20}, {duration: 400-Math.cos((i+1)*Math.PI/slots.length*2)*200});
							break;
					}
				}								
			}
		
			if (slides.length>1) {
				for(var i=0;i<slides.length;i++) {
					if (i!=0) slides.eq(i).hide();
				}
				for(var i=0;i<48;i++) {
					var a = $(this).append("<div></div>");
				}
				
				slots=$(this).children("div");
				
				slots.each(function(j) {
					$(this).css({left:j*20+'px', backgroundPosition:-j*20+'px 0'});
				});
				
				$(window).load(function() {
					intervalHook=window.setInterval(nextSlide, config.delay);
				});
			}
			
		});
		return this;
	};
 })(jQuery);
