/**
 * Costantino Toniolo
 * marco(dot)pegoraro(at)gmail(dot)com
 * 31/12/09
 */

/* Start jQuery wrapper */
(function($){
	
	/**
	 * Project's Object
	 * Classe che contiene tutte le funzionalitˆ espresse dal progetto.
	 */
	var TonioloClass = function( config ) {
		
		// Riferimento globale all'istanza medesima.                                               #
		// Utile all'interno dei metodi di callback utilizzati con jQuery.                         #
		var instance = this;
		
		// Project's Class main configuration rules goes here...
		var config = $.extend({foo:''
			
		},config);	
		
		/**
		 * Inizializzazione del componente.
		 */
		this.init = function() {
			
			instance.IEHacks();
			instance.mainForm();
			
			
			// DropDown Menu.                                                                      #
			instance.menu = new DropDown({ target: $('#main-menu ul') }).init();
			
			
			instance.CalendarAjax();
			
			// Applicazione degli effetti LightBox alle immagini di paragrafo e di photogallery.   #
			$('.jcms-photogallery-images-item-icon a').addClass('jqLightbox');
			$('.jqLightbox').prettyPhoto();
			
			// Gestione dei link da aprire in target blank.                                        #
			$('.tblank, .tblank a').attr('target', '_blank' );
		
		} // EndOf: "init()" #######################################################################
		
		
		/**
		 * Workaround di stile da applicare al famoso browser IE!
		 */
		this.IEHacks = function() {
			
			// Il testo della submit non si elimina con un semplice "text-indent..."               #
			$('.main-search-submit').attr('value','');
			
		} // EndOf: "IEHacks()" ####################################################################
		
		
		/**
		 * Gestione delle funzionalità avanzate per il form di ricerca principale.
		 * Queste funzionalità si riferiscono principalmente all'utilizzo della label come
		 * falso testo predefinito per il form di ricerca.
		 */
		this.mainForm = function() {
			
			var form 	= $('#main-search');
			var field	= form.find('.main-search-field');
			var label	= form.find('label');
			
			if ( field.val() != "" ) {
				label.hide();
			}
			
			label.addClass('main-search-label').bind('click',function(){
				
				field.focus();
			});
			
			field.bind('focus',function(){
				label.fadeOut();
			});
			
			field.bind('blur',function(){
				if ( field.val() == "" ) {
					label.fadeIn();
				}
			});
			
			field.bind('dblclick',function(){
				field.val('');
			});
			
			
			
		} // EndOf: "mainForm()" ###################################################################
		
		
		
		
		/**
		 * Gestione AJAX del calendario nella sidebar.
		 */
		this.CalendarAjax = function() {
			
			// Predisposizione del contenitore dei risultati.                                      #
			$('.agenda-calendar').append('<div class="engadgements"></div>');
			
			
			// Gestione del caricamento degli impegni giornalieri.                                 #
			$('.agenda-calendar td.calendar a, .agenda-calendar td.calendarToday a').live('click',function(){
				
				$('.engadgements').slideUp();
				
				var url = __appBase__ + $(this).attr('href');
				
				$('.engadgements').load( url, null, function(){
					$(this).slideDown();
				} );
				
				return false;
			});
			
			
			// Gestione del cambio di calendario.                                                  #
			$('.agenda-calendar td.tdLeft a, .agenda-calendar td.tdRight a').live('click',function(){
				
				var calendar = $(this).parent().parent().parent().parent().parent();
				var url = $(this).attr('href').replace('/agenda/','/cms/ajaxcal/');
				var url = __appBase__ + url;
				
				$('.engadgements').slideUp();
				calendar.find('table').fadeOut(function(){
					
					calendar.load( url, null, function(){
						calendar.find('table').fadeIn();
					} );
					
				});
				
				
				return false;
				
			});
			
			
		} // EndOf: "CalendarAjax()" ###############################################################
		
		
	
	} // EndOf: "Project's Class Object" --------------------------------------------------------- #

	
	
	$(document).ready(function(){
		
		var tmp = new TonioloClass({});
		tmp.init();
		
	});
	
	
	
	
	
	
	
	
	
	var DropDown = function( config ) {
		
		// Riferimento globale all'istanza medesima.                                               #
		// Utile all'interno dei metodi di callback utilizzati con jQuery.                         #
		var instance = this;
		
		// Project's Class main configuration rules goes here...
		var config = $.extend({foo:''
			,target: 		false
			,activeClass:	'selected'
			,activeChain:	true
			,fixZindex:		true
			
			// Internal use only
			,isSelected:	false
		},config);
		
		
		
		this.init = function() {
			
			if ( config.target == false ) return;
			
			// Propaga la catena dell'elemento attivo ai genitori del menu.                        #
			if ( config.activeChain == true ) {
				config.target.find('li.'+config.activeClass).children('a').addClass(config.activeClass);
			}
			
			
			// Fix IE bug with z-index.                                                            #
			if ( config.fixZindex == true && $.browser.msie == true ) {
				
				var zIndexNumber = 1000;
				$('div').each(function() {
					$(this).css('zIndex', zIndexNumber);
					zIndexNumber -= 10;
				});
				
			}
			
			
			// Inizializzalizzazione dei comportamenti del menu.                                   #
			config.target.each(function(){
			
				instance.initMenu($(this));
				
			});
			
			
		} // EndOf: "init()" #######################################################################
		
		
		this.initMenu = function( obj ) {
			
			obj.find('ul>li').addClass('children');
			
			obj.find('li[class!=children]').each(function(){
				
				$(this).find('ul').hide();
				
				$(this).hover(function(){
					
					instance.onMouseIn( $(this) );
					
				},function(){
					
					instance.onMouseOut( $(this) );
				});
				
			});
			
			
		} // EndOf: "initMenu()" ###################################################################
		
		
		this.onMouseIn = function( obj ) {
			
			obj.find('ul').css('zIndex',9999999).show();
			
			if( obj.hasClass(config.activeClass) ) {
				config.isSelected = true;
			}
			
			obj.find('ul').prev().addClass(config.activeClass);
		
		} // EndOf: "onMouseIn()" ##################################################################
		
		this.onMouseOut = function( obj ) {
			
			obj.find('ul').hide();
			
			if ( !config.isSelected ) {
				obj.find('ul').prev().removeClass(config.activeClass);
			}
			
			config.isSelected = false;
			
		} // EndOf: "onMouseOut()" #################################################################
		
		
	} // EndOf: "DropDown Class Object" ---------------------------------------------------------- #

	

/* End jQuery wrapper */
})(jQuery);
