/**
 * PSlide
 */

(function($){
	
	$.pslide = true;
	
	$.fn.pslide = function(config) {
		
		// Estendo la configurazione di base con i valori predefinit.
		config = $.extend({
			
			scriptName:			'PSlide'
			
			// Databse locale degli urls delle immagini da visualizzare.
			,db:				Array()
			,idx:				0
			,prevIdx:			0
			
			// Temporizzazione in millisecondi dello slide
			,delay:				5000
			
			// Oggetto che contiene il markup con le immagini da ciclare.
			,target:			$(this)
			
			// Indirizzo per il caricamento AJAX delle immagini.
			,loaded:			false
			,url:				''
			
			,onInitFirstImage:	function( obj, config ) {}
			,onInitImage:		function( obj, config ) { obj.hide(); }
			,onChange: 			function( prev, next, config ) { _pslideChangeImage( prev, next, config ); }
			,loadJSON:			function( config ) { return _pslideLoadJSON( config ); }
			
		},config);
		
		
		// Compongo l'array delle immagini.
		config = _pslideInitArray( config );
		
		// Inizializzo lo slideshow.
		_splideStart( config );
		
	} // EndOf: "pslide()" ###
	
	
	
	/**
	 * Inizializza l'array delle immagini da visualizzare.
	 */
	function _pslideInitArray( config ) {
		
		if ( config.url != "" && config.loaded == false ) {
			
			config.loadJSON( config );
			
			return false;
			
		} // -- fine caricamento ajax --
		
		// Caricamento da markup locale.
		if ( config.url == "" || config.loaded == true ) {
			
			config.db = Array();			
			
			config.target.find('img').each(function(){
				
				img = $(this);
				
				if ( config.db.length == 0 ) {
					config.onInitFirstImage( img, config );
					
				} else {
					config.onInitImage( img, config );
					
				}
				
				config.db[config.db.length] = img;
				
			});
			
			// Configuro l'indice di base.
			config.idx = 0;
			
		}
		
		return config;
		
	} // EndOf: "_pslideInitArray()" ###
	
	
	/**
	 * Inizializzatore dello slide show
	 */
	function _splideStart( config ) {
		
		if ( config == false ) return;
		if ( config.db.length > 1 ) setTimeout(function(){_pslideSlide(config)},config.delay);
		
	} // EndOf: "_pslideStart()" ### 
	
	
	/**
	 * Lancia il cambio dell'immagine correttamente temporizzata.
	 */
	function _pslideSlide( config ) {
		
		config.prevIdx = config.idx;
		
		// Calcolo l'indice dell'immagine da visualizzare.
		config.idx++;
		if ( config.idx >= config.db.length ) config.idx = 0;
		
		// Lancio il cambio di immagine nello slide show.
		config.onChange( config.db[config.prevIdx], config.db[config.idx], config );
		
		// Lancia la ricorsione sull'immagine.
		setTimeout(function(){_pslideSlide(config)},config.delay);
		
	} // EndOf: "_pslideSlide()" ###
	
	
	/**
	 * Funzione di base per il cambio dell'immagine.
	 */
	function _pslideChangeImage( prev, next, config ) {
		
		
		prev.fadeOut('slow',function(){
			next.fadeIn('slow');
		});
		
	} // EndOf: "_pslideChangeImage()" ###
	
	
	/**
	 * Funzione di base per il caricamento JSON della gallery.
	 */
	function _pslideLoadJSON( config ) {
		
		$.getJSON( config.url, function(data) {
				
			$.each(data.images,function(i,item){
				config.target.append('<img src="'+item.Media.url+'" />');
			});
			
			// Inizializzazione del database da markup locale.
			config.loaded = true;
			config = _pslideInitArray( config );
			
			_splideStart(config);
			
		});
		
	} // EndOf: "_pslideLoadJSON" ###
	

})(jQuery);
