/*
Plugin: crossfade v 1.0.1
Author: paolo rosi (doc@netsnap.it)
Tools: PSPad
*/

(function($){

	// constructor
	$.fn.crossfade = function(options){
		$.fn.crossfade.defaults =
		{
			display_time: 5000,						// numero di millisendi di attesa prima di passare alla prossima immagine
			transition_speed: 'normal',  	// velocità di fade (jquery)
			firstnotfade: false,          // la prima immagine viene visualizzata di botto, senza fade
			auto_run: true, 							// se true l'ambaradan parte automaticamente
			scrollfps: 18,								// la velocità (frame al secondo) con cui l'immagine verrà scrollata
			auto_motion: true 						// se true l'immagine viene "pannata"
		};

		var opts = $.extend({}, $.fn.crossfade.defaults, options);

		return this.each(function()	{
			// variaibili
			var $this = $(this), 									// velocizza un pochino il $(this)
					currentimg=0,                     // il tag <img> corrente su cui visualizzare l'immagine
	        oldimage=null,
					actualimage=null,
					loadedimages=new Array(),
					isfirst=true,
					start_tick=0,
					imagescount = opts.images.length; // il numero globale di immagini

			// setuppa il tutto
			setup();

			// run scroller timer
      setInterval (scrollImage, 1000/opts.scrollfps);

			// parte visualizzando la prima immagine
      if (opts.auto_run)
				nextImage();

			// setup
			function setup(){
				$this.css({position:'relative',width:opts.width,height:opts.height, overflow:'hidden'});
				currentimg=0;
			}

			// sroll actual image
			function scrollImage(){
				if (actualimage){
					var ticks_elapsed = new Date().getTime() - start_tick;
					var pos=ticks_elapsed / opts.display_time;
					actualimage.ypos= actualimage.height_delta*pos;
					//actualimage.xpos= actualimage.width_delta*pos;
					if (actualimage.ypos>actualimage.height_delta)actualimage.ypos=actualimage.height_delta;
					if (actualimage.xpos>actualimage.width_delta)actualimage.xpos=actualimage.width_delta;
					//alert ('image.ypos ='+actualimage.ypos);
					actualimage.css('top', -Math.round(actualimage.ypos));
					actualimage.css('left', Math.round(actualimage.xpos));
				}
			}

			// do fade
			function dofade(img, speed){
				img.xpos=0.0;
				img.ypos=0.0;
				img.ticks=0;
				img.height_delta=img.height()-opts.height;
				img.width_delta=img.width()-opts.width;
				start_tick=new Date().getTime();
				actualimage=img;

				img.fadeIn(speed, function() {
					if (oldimage){
						// turn off back image and reset his position
						//alert ('ticks='+oldimage.ticks);
	          oldimage.css('z-index', 1).hide();
						oldimage.xpos=0;
						oldimage.ypos=0;
					}
					oldimage=img;
		      setTimeout (nextImage, opts.display_time);
				});
			}

			// next image
			function nextImage()	{
				if (!loadedimages[currentimg]){
				  loadedimages[currentimg]=$('<img />').appendTo($this).css({position:'absolute',top:0,left:0,'z-index':2}).hide();
					img=loadedimages[currentimg];
					if (oldimage)oldimage.css('z-index', 1);
					// setup event 'load'
					img.load(function(){
						if (isfirst && opts.firstnotfade){
							isfirst=false;
							dofade(img, 1);
						}else
							dofade(img,opts.transition_speed);
					 });

					// load image
				  img.attr('src',opts.images[currentimg]);
				}else{
					img=loadedimages[currentimg];
          oldimage.css('z-index', 1);
          img.css('z-index', 2).hide();
					dofade(img,opts.transition_speed);
				}
				currentimg=++currentimg % imagescount;

			}


		});
	}

	// start
	$.fn.start = function(){
		nextImage();
	}


})(jQuery);


