

/**
 * @author Andrea Failli http://www.andreafailli.it
 * @date 02/04/2011
 * @require jQuery 1.5.1
 */

(function($) {
	
	
	jQuery.fn.rotator = function(options) {
		
		var elem = $(this);
		
		// settings
		var settings = {
			delay: 2000,
			duration:500,
			imageSelector : " > img",
			debug:false
		};
		if (options) { 
			$.extend(settings, options);
		}
		
		elem.rotator.options = settings;
		
		
		jQuery.fn.rotator.prepare = function(index,immediate) {
			
			var img = $(elem.rotator.options.imageSelector,elem).eq(index);
			
			if (img.attr("src")=="" || img.attr("src")=="about:blank") {
				elem.rotator.debug("image "+index+" needs to be loaded");
				
				img
					.load(function(){
						img.unbind()
						elem.rotator.debug("image "+index+" loaded!");
						elem.rotator.prepare(index,immediate)
					})
					/*.error(function(){		// cause error in IE due to src=""
						img.unbind()
						elem.rotator.debug("ERROR loading image "+index+"! skipping to next image...");
						elem.rotator.prepare( (index+1) % $(elem.rotator.options.imageSelector,elem).size() );
					});*/
				img.attr("src",img.attr("rel"));
			} else {
				if (immediate)
					elem.rotator.show(index);
				else
					setTimeout(function(){elem.rotator.show(index);},elem.rotator.options.delay);
			}
			
			
				
		};
		
		
		
		jQuery.fn.rotator.show = function(index) {
			elem.rotator.resize(index);
			
			elem.rotator.debug("showing image "+index);
			
			var oldImg = $("img.rotator-image-active",elem);
			oldImg
				.removeClass("rotator-image-active")
				.animate({opacity:0},elem.rotator.options.duration);
			
			var newImg = $(elem.rotator.options.imageSelector,elem).eq(index);
			newImg
				.addClass("rotator-image-active")
				.animate({opacity:1},elem.rotator.options.duration,function(){
					elem.rotator.prepare( (index+1) % $(elem.rotator.options.imageSelector,elem).size() );
				});
		};
		
		
		jQuery.fn.rotator.resize = function(index) {
			 
			if (typeof(index)!="undefined") {
				
				var img = $(elem.rotator.options.imageSelector,elem).eq(index);
				
				var oW = img.width();
				var oH = img.height();
				var ratio = oW / oH;
				
				var nW = elem.width(); // new larghezza pari alla larghezza del contenitore
				var nH = nW / ratio; // new altezza calcolata in funzione della larghezza
				if (nH < elem.height()) { // se la new altezza non copre tutta l'altezza del contenitore
					nH = elem.height(); // new larghezza pari all'altezza del contenitore
					nW = nH * ratio; // new larghezza calcolata in funzione dell'altezza
				}
					
				var nX = elem.width()/2 - nW/2;
				var nY = elem.height()/2 - nH/2;
				
				img.css({
					width : nW + "px",
					height: nH + "px",
					top	  : nY + "px",
					left  : nX + "px"
				});
				
				elem.rotator.debug("resized image "+index);
				
			}	else {
				var i = $(elem.rotator.options.imageSelector,elem).index($("img.rotator-image-active",elem));
				elem.rotator.debug("must resize image "+i+" & "+(i-1));
				elem.rotator.resize(i);
				elem.rotator.resize(i-1);
			}
			
		};
		
		jQuery.fn.rotator.debug = function(text) {
			
			if (elem.rotator.options.debug)
				console.log("[jQuery Rotator]: "+text);
			
		};
		
		
		
		
		jQuery.fn.rotator.add = function(src) {
			
			elem.rotator.debug("adding image "+src);
			
			var img = $("<img/>")
				.addClass("rotator-image")
				.fadeTo(0,0);
			img.attr("rel",src)
			img.attr("src","about:blank")
				
			var lastImg = $(elem.rotator.options.imageSelector,elem).filter(":last")
			if (lastImg.size()>0) {
				img.insertAfter(lastImg)
				elem.rotator.debug("Image "+src+" appended to the container because there was no image. Assumed imageSelector== ' > img'");
			} else {
				elem.append(img)
			}
		};
		
		
		
		
		jQuery.fn.rotator.remove = function(index) {
			
			if (index>=0) {
				elem.rotator.debug("removing image "+index);
				$(elem.rotator.options.imageSelector,elem).eq(index).remove()
			} else {
				elem.rotator.debug("removing ALL images");
				$(elem.rotator.options.imageSelector,elem).remove()
			}
			
			
		};
		
		
		
		
		
		
		// INIT
		
		elem.addClass("rotator");
		$(elem.rotator.options.imageSelector,elem)
			.addClass("rotator-image")
			.fadeTo(0,0);
		$(window).resize(function(){
			elem.rotator.debug("window resize event");
			elem.rotator.resize();
		});
		
		elem.rotator.prepare(0,true);
		
		
	};
	
	
})(jQuery);










