(function($){  


/**
 * PhotoTheme Plugin
 * Plugin funzionale per la gestione del layout.
 * ESEMPIO: $('body').photoTheme();
 */
$.fn.photoTheme = function( cfg ) {  
	
	
	var cfg = $.extend({ foo:''
		,gallery:			'#gallery'
		,menu:				'#menu'
		,contentWrapper:	'#cnt-w'
		,content:			'#cnt'
		,ajaxLink:			true				// Se impostato a "false" il sito viene gestito con un comune cambio pagina.
		,ajaxLoading:		false
		
		
		// Opzioni per la gestione dei link interni.
		,links:		{
			popup:			false				// Definisce se utilizzare FancyBOX per la visualizzazione dei likns interni.
		}
		
		// Opzioni per la gestione dello slide-show.
		,slide:		{}
		
		
		,onLoad:	function( cfg ) {}
		
	},cfg);
	
	
	return this.each(function() {
		
		// Identifico la presenza del plugin "FancyBOX" e sovrascrivo un'eventuale impostazione
		// nulla per la gestione dei links in popup.
		if ( cfg.links.popup == null ) {
			if ( $.fancybox ) cfg.links.popup = true; else cfg.links.popup = false;
		}
		
		// L'utilizzo dei links in popup elimina il contenuto dalla pagina visualizzata.
		if ( cfg.links.popup ) $(cfg.contentWrapper).hide();
		
		
		/**
		 * Gestione del caricamento di un link nel menu principale.
		 * Vengono ignorati i link con attributo ".jqLightbox"
		 */
		if ( cfg.ajaxLink ) {
			
			// Nascondo inizialmente l'elemento utilizzato per il loading.
			if ( cfg.ajaxLoading && $(cfg.ajaxLoading).length ) {
				$(cfg.ajaxLoading).hide();
				cfg.links.ajaxLoading = cfg.ajaxLoading;
			}
			
			$(cfg.menu+' a').not('.jqLightbox').photoThemeLinkBox( cfg.links );
			$(cfg.content+' a').not('.jqLightbox').photoThemeLinkBox( cfg.links );
		}
		
		
		
		
		
		/**
		 * Gestione della photogallery integrata nel layout principale.
		 * Inizializzo lo slideshow delle immagini se ce ne sono almeno 2.
		 */
		if ( $.pslide && $(cfg.gallery+' img').length > 1 ) {
			$( cfg.gallery+', .pslide').pslide(cfg.slide);
		}
		
		
		
		
		/**
		 * Gestione effetto lightbox con libreria PrettyPhoto (compatibile con immagini dinamiche)
		 */
		if ( $.prettyPhoto ) {
			$(cfg.gallery+' a.jqLightbox').prettyPhoto();
			
			// Imposto la gallery di immagini FancyBOX per le immagini di contenuto.
			$(cfg.content+' a.jqLightbox').attr('rel','prettyPhoto[jqLightbox]');
			$("a[rel^='prettyPhoto']").prettyPhoto();

		}
		
		
		
		cfg.onLoad.call( null, cfg );
		

	});
}; // EndOf: "fn.photoTheme()" -- 



/**
 * Associato ad un link ne gestisce l'apertura AJAX in una finestra modale (fancybox).
 */
$.fn.photoThemeLinkBox = function( cfg ) {
	
	
	var cfg = $.extend({ foo:''
		
		// Definizione degli attori della pagina che gestiscono i contenuti.
		,pageContent:			'#cnt'
		,destContent:			'#cnt'
		
		,popup:					null	// Definisce se aprire i links interni in popup o tramite FancyBOX
		,effect:				'slide' // [fade|slide]
		,ajaxLoading:			false
		
		// Gestione dell'errore di apertura AJAX del link.
		,onErrorFollowLink:		true
		,onErrorOpenNewWindow:	true
		,onAjaxError:			function( linkURL, cfg){}
		
		// Callbacks.
		,onContentLoads:		function( data, cfg ){ return data; }	// Riceve i dati caricati via AJAX
		,onContentParsed:		function( data, cfg ){ return data; }	// Riceve i dati elaborati (eventuale selezione di contenuto interno)
		,onContentInitiated:	function( cnt, cfg ){}	// Riceve il riferimento al contenitore dei dati visualizzati
		
		,scrollConfig:			{ duration:500 }
		,scrollOpen:			true
		,scrollClose:			true
		
	},cfg);
	
	
	return this.each(function(){
		
		
		/**
		 * Gestione del click sul link.
		 */
		$(this).bind('click',function(event){
		
			if ( $.scrollTo && cfg.scrollClose && !cfg.popup ) {
				$.scrollTo(0,cfg.scrollConfig);
			}
			
			var linkObj = this;
			var linkURL = $(this).attr('href');
			
			// Se il link risulta essere una risorsa esterna o un collegamento "_target" viene
			// annullata la gestione del lightbox.
			var isAsset = -1;
			if ( $(this).attr('_target') ) 	isAsset = 1;
			if ( $(this).is('.asset') )		isAsset = 1;
			if ( isAsset < 0 ) isAsset = linkURL.lastIndexOf('.jpg');
			if ( isAsset < 0 ) isAsset = linkURL.lastIndexOf('.jpeg');
			if ( isAsset < 0 ) isAsset = linkURL.lastIndexOf('.gif');
			if ( isAsset < 0 ) isAsset = linkURL.lastIndexOf('.png');
			if ( isAsset >= 0 ) return;
			
			
			event.preventDefault();
			
			
			// In assenza del fancyBox il contenuto pu subire effetti di transizione.
			if ( !cfg.popup ) {
				
				if ( cfg.ajaxLoading && $(cfg.ajaxLoading).length ) $(cfg.ajaxLoading).fadeIn();
				
				if ( cfg.effect == 'slide' && $(cfg.pageContent).is(':visible') ) 		$(cfg.pageContent+':visible').slideUp(photoThemeLinkBox_loadData);
				else if ( cfg.effect == 'fade' && $(cfg.pageContent).is(':visible') ) 	$(cfg.pageContent+':visible').fadeOut(photoThemeLinkBox_loadData);
				else photoThemeLinkBox_loadData();
				
			} else {
				photoThemeLinkBox_loadData();
				
			}
			
						
			function photoThemeLinkBox_loadData( linkOBJ ) {
				
				$.ajax({
					method:		'POST',
					cache:		false,
					url:		linkURL,
					success:	photoThemeLinkBox_displayData,
					error:		photoThemeLinkBox_dataError
				});
				
			} // EndOf: "photoThemeLinkBox_loadData()" --
			
			function photoThemeLinkBox_displayData( data ) {
			
				if ( cfg.ajaxLoading && $(cfg.ajaxLoading).length ) $(cfg.ajaxLoading).fadeOut();
				
				data = cfg.onContentLoads.call( null, data, cfg );
				
				var newContent = $(cfg.destContent,data).html();
				
				newContent = cfg.onContentParsed.call( null, newContent, cfg );
				
				
				// Utilizzo del plugin "fancybox" per la visualizzazione del contenuto linkato
				if ( cfg.popup ) {
					
					var fancyCfg = {
						onComplete:				function(){ photoThemeLink_initContent('#fancybox-inner'); }
					}
					
					var fancyCfg = $.extend( fancyCfg, cfg );
					
					$.fancybox( newContent, fancyCfg );
					
					
					return;
					
				} else {
				
					// Visualizzazione normale via AJAX su un elemento interno alla pagina.
					$(cfg.pageContent).html(newContent);
					
					if ( cfg.effect == 'slide' ) 	$(cfg.pageContent).slideDown( photoThemeLinkBox_displayDataCallback );
					if ( cfg.effect == 'fade' ) 	$(cfg.pageContent).fadeIn( photoThemeLinkBox_displayDataCallback );
				
				}
			
			} // EndOf: "photoThemeLinkBox_displayData()" --
			
			function photoThemeLinkBox_displayDataCallback(){
			
				photoThemeLink_initContent(cfg.pageContent);
				
			} // EndOf: "photoThemeLinkBox_displayDataCallback()" --
			
			function photoThemeLink_initContent( cnt ) {
				
				// Imposto la gallery di immagini PrettyPhoto per le immagini di contenuto.
				if ( $.prettyPhoto ) {
					$(cnt).find('a.jqLightbox').attr('rel','prettyPhoto[jqLightbox]');
					$(cnt).find("a[rel^='prettyPhoto']").unbind('click').prettyPhoto();
				}
				
				$(cnt).find('a').not('.jqLightbox').photoThemeLinkBox(cfg);
				
				// Scrolling
				if ( $.scrollTo && cfg.scrollOpen && !cfg.popup ) {
					$.scrollTo('#menu-w',cfg.scrollConfig);
				}
				
				cfg.onContentInitiated.call( null, cnt, cfg );
				
			} // EndOf: "photoThemeLink_initContent()" --
			
			
			/**
			 * In caso di errore caricamento AJAX il link  utilizzato normalmente.
			 */
			function photoThemeLinkBox_dataError() {
			
				cfg.onAjaxError.call( null, linkURL, cfg );
				
				if ( cfg.onErrorFollowLink ) {
					
					if ( cfg.onErrorOpenNewWindow ) {
						window.open( linkURL );

					} else {				
						document.location.href = linkURL;
					}
				}
			
			} // EndOf: "photoThemeLinkBox_dataError()" --
		
		}); // -- Fine gestione click sul link --


	
	});
}; // EndOf: "fn.photoThemeLinkBox()" --

})(jQuery);  
