/**
 * BuoniPasto.it
 * marco(dot)pegoraro(at)gmail(dot)com
 * 8/1/10
 */

/* Start jQuery wrapper */
(function($){
	
	
	/**
	 * Project's Object
	 * Classe che contiene tutte le funzionalitˆ espresse dal progetto.
	 */
	var BuoniPastoClass = 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();
			
			// DropDown Menu.                                                                      #
			instance.menu = new DropDown({
				target: $('#main-menu ul')
			}).init();
			
			// OverLabel.                                                                          #
			instance.overLabel = new OverLabel({
				target: $('#research .fld1, #research .fld2')
			}).init();
			
			
			// Porta il footer dentro alla colonna del contenuto.                                  #
			$('#content').append($('#footer-wrapper'));
			$('#footer-wrapper').css('font-size','0.85em');
			
			// Tabella "società emettitrici".                                                      #
			$('.emit-table tr').find('td:last').addClass('last');
			$('.emit-table tr:last').addClass('last');
			$('.emit-table tbody').prepend('<tr><td colspan="5" class="last spacer">&nbsp;</td></tr>');
			$('.emit-table a').attr('target','_blank');
			
			
			// Inizializzo la gestione della PopUp sulle immagini di tickets info.                 #
			instance.ticketsPopup();
			
			// Gestione popup ajax di un qualsiasi link nel sito.                                  #
			$('a.popup').colorbox({e:null
				,href: $(this).attr('href')
				,opacity: 0.50
			});
			
			// Gestione del form dell'elemento "Calcola Fattura".                                  #
			instance.AjaxForm({
				target:		'.ftf-info',
				model:		'Fattura'
			});
			
			// Gestione del form dell'elemento "Richiesta iscrizione motore".                      #
			instance.AjaxForm({
				target:		'.ftf-motore',
				model:		'FormMotore'
			});
			
			// Gestione del form dell'elemento "Richiesta Convenzionamento".                       #
			instance.AjaxForm({
				target:		'.ftf-convenzionamento',
				model:		'FormConvenzionamento'
			});
		
		} // EndOf: "init()" #######################################################################
		
		
		/**
		 * Workaround di stile da applicare al famoso browser IE!
		 */
		this.IEHacks = function() {
			
			
		} // EndOf: "IEHacks()" ####################################################################
		
		
		/**
		 * Gestione dei pop-up dei tickets.
		 */
		this.ticketsPopup = function() {
			
			/*
			$('.ticket-popup a').colorbox({e:null
				,href: $(this).attr('href')
				,opacity: 0.50
			});
			*/
		
		} // EndOf: "ticketsPopup()" ###############################################################
		
		
		
		
		
		/**
		 * Gestisce la validazione AJAX di un form compatibile e quindi lo invia.
		 */
		this.AjaxForm = function( cfg ) {

			var cfg = $.extend({foo:''
				,target:		'form'
				,model:			'Form'
				,msg:			"ATTENZIONE:\n\nAlcune informazioni sono state omesse o sono state\ninserite in modo non corretto.\n\nSi prega di controllare i campi evidenziati.\n\nGrazie."
			},cfg);
			
			$(cfg.target).bind('submit',function(){
			
				
				$(this).find('.error').removeClass('error');
				
				var data = $(this).formSerialize();
				
				var status = $.ajax({
					type:		"POST",
					url:		$(this).attr('action'),
					data:		data,
					async:		false
				}).responseText;
				
				if ( status == '+OK' ) return true;
				
				eval( "var status = " + status + ";" );
				//console.log(status);
				
				for ( i=0; i<status.length; i++ ) {
					
					var field_id 	= cfg.model + status[i];
					var field_rif	= '#' + field_id;
					//console.log(field_rif);
					$(field_rif).addClass('error');
					$(field_rif).parent().addClass('error');
				}
				
				alert(cfg.msg);
				
				return false;
				
			});
			
		} // EndOf: "AjaxForm()" ###################################################################
		
	
	} // EndOf: "Project's Class Object" --------------------------------------------------------- #

	
	
	$(document).ready(function(){
		
		var tmp = new BuoniPastoClass({});
		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').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" ---------------------------------------------------------- #

	
	
	
	var OverLabel = 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
			
		},config);
		
		
		
		this.init = function() {
			
			if ( config.target == false ) return;
			
			config.target.each(function(){
				
				instance.initMarkup( $(this) );
				
				instance.initActions( $(this) );
				
			});
			
		} // EndOf: "init()" #######################################################################
		
		
		this.initMarkup = function( obj ) {
			
			obj.wrap('<div class="OverLabel"></div>');
			
		} // EndOf: "initMarkup()" #################################################################
		
		
		this.initActions = function( obj ) {
			
			var field	= obj.find('input');
			var label	= obj.find('label');
			
			if ( field.val() != "" ) {
				label.hide();
			}
			
			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: "initActions()" ################################################################
		
		
	} // EndOf: "OverLabel Class Object" --------------------------------------------------------- #
	

/* End jQuery wrapper */
})(jQuery);