var TabellaEventi = function(options){
	var self = this;
	var eventi = []; //array di eventi
	var $boxTabella, $boxRisultati, $toolbarRicerca, $campoRicerca, $selectAnni;
	var $tabs = $([]); // i tab con i tipi di eventi
	var lingua;
	var target;
	var parametriRicerca = {}; //valori da usare per caricare i dati
	var timeoutQuery;
	
	var creaTabella = function(tipi) {
		$boxTabella = $('<div/>')
			.addClass('tabellaEventi')
			.appendTo(target);
		$boxRisultati = $('<div/>')
			.addClass('risultati')
			.appendTo($boxTabella);
		/* AGGIUNGO TABS E BARRA DELLA RICERCA */
		addTabs(tipi);
		addRicerca(tipi);
	};
	
	var addTabs = function (tipi){
		var $tabsEventi = $('<div/>')
			.addClass('tabsEventi')
			.prependTo($boxTabella);
		for(var i in tipi){
			var tipo = tipi[i];
			var modulo = new self.Template(tipo);
			
			var $tab = $('<div />')
				.html(modulo.titolo[lingua])
				.data('tipo',[tipo])
				.addClass(tipo)
				.addClass('tab')
				.appendTo($tabsEventi);
			$tabs.push($tab.get(0));
		}
		var $tabMostraTutti = $('<div/>')
			.html(self.labels['vediTutti'][lingua])
			.data('tipo',tipi)
			.addClass('tutti')
			.addClass('tab')
			.appendTo($tabsEventi);
		$tabs.push($tabMostraTutti.get(0));
		
		$($tabs[0]).addClass('corners-top-left'); //per bordo arrotondato
		$($tabs[$tabs.length-1]).addClass('corners-top-right'); //per bordo arrotondato
	};
	
	var addRicerca = function(tipi){
		$toolbarRicerca = $('<div/>')
			.addClass('boxRicerca')
			.css({display: 'none'})
			.insertBefore($boxRisultati);
		$campoRicerca = $('<input/>',{
					id:'query_string',
					name:'query_string',
					type: 'text'
				})
			.appendTo($toolbarRicerca);
		var $labelRicerca = $('<label/>',{
					'for': 'query_string'
				})
			.html(self.labels['cercaArchivio'][lingua])
			.insertBefore($campoRicerca);
		$selectAnni = $('<select/>',{
					id: 'annoArchivio',
					name: 'annoArchivio'
				})
			.appendTo($toolbarRicerca);
		var $labelAnno = $('<label/>',{
					'for': 'annoArchivio'
				})
			.html(self.labels['anno'][lingua])
			.insertBefore($selectAnni);
		$.when(getAnni({tipi:tipi})).done(function(data, textStatus, jqXHR){
			stampaAnni(data,$selectAnni);
		});
	};
	
	var showRicerca = function(){
		$toolbarRicerca.show();
	};
	
	var hideRicerca = function(){
		$toolbarRicerca.hide();
	};
	
	/*
	* carica gli anni in cui ci sono stati eventi
	*/
	var getAnni = function(options){
		parametriRicerca.tipi = options.tipi || [];
		return $.ajax({
			url: "/include/API/Eventi/AJAX-Controller.php",
			type: "POST",
			data: {
				task:'getAnni',
				params: JSON.stringify(parametriRicerca)
			},
			context: $('#annoArchivio'),
			dataType: 'json',
			cache: false,
			success: function(data, textStatus, jqXHR){
				
			}
		});
	};
	
	var stampaAnni = function(data, target){
		$(target).empty();
		//per prima inserisco l'option con 'tutti'
		var $option = $('<option/>',{value: ''})
				.text(self.labels['inCorso'][lingua])
				.appendTo(target);
		for(var i  in data) {
			var anno = data[i];
			if(typeof anno == 'string'){
				var $option = $('<option/>',{value: anno})
					.text(anno)
					.appendTo(target);
			}
		}
	}
	
	
	
	var formattaData = function(data){
		if(!isNaN(data) && data){
			var newData = new Date(data);
			var anno = newData.getFullYear();
			var mese = newData.getMonth()+1;
			var giorno = newData.getDate();
			var arrayData;
			switch (lingua){
				case 'it':
					arrayData = new Array(giorno,mese,anno);
					break;
				case 'en':
					arrayData = new Array(mese,giorno,anno);
					break;
				default:
					arrayData = new Array(mese,giorno,anno);
					break;
			}
			return arrayData.join('-');
		}else {
			return false;
		}
	};
	
	var resetRisultati = function(){
		eventi = [];
		$boxRisultati.empty(); //elimino i risultati precedenti
	};
	
	var stampaRisultati = function(){
		var dfd = new $.Deferred();
		var totaleEventi = eventi.length;
		if(totaleEventi>0){
			for(var i in eventi){
				var evento = eventi[i];
				$.when(stampaEvento(evento)).done(function(status){
					if(--totaleEventi==0) {
						dfd.resolve('eventi stampati');
					}
				});
			}
		}else {
			var $nessunRisultato = $('<div/>')
				.addClass('warning')
				.html(self.labels.nessunRisultato[lingua])
				.appendTo($boxRisultati);
			dfd.resolve('eventi stampati');
		}
		return dfd.promise();
	};
	
	var stampaEvento = function(evento){
		var dfd = new $.Deferred();
		var idEvento = evento._id.$id;
		
		// HELPER FUNCTION PER GESTIRE GLI events
		var gestioneClickEvento = function(event){
			if(!( $(this).hasClass('evento') || $(this).hasClass('mostra') )){
				//con questo if non cattura i click destinati alle anchor:
				if( !($(event.target).is('a') && (event.target!=event.currentTarget)) ){
					event.stopImmediatePropagation();
					event.preventDefault();
					var $this = $(this);
					// var $thisDescrizione = $this.find('.descrizione').slideDown(0);
					// $('.descrizione').not($thisDescrizione).slideUp(0);
					$this.find('.descrizione').slideDown(0).end().siblings().find('.descrizione').slideUp(0);
				}
			}
		};
		
		var urlEvento = evento.Tipo=='mostra'?"/mostre/mostra.php?t=":"/eventi/evento.php?t=";
		var $boxEvento = $('<a/>',{
				href: "/"+lingua+urlEvento+idEvento
			})
			.addClass('risultato')
			.addClass(evento.Tipo)
			.css({
				display: 'block'
			})
			.click(gestioneClickEvento)
			.dblclick(function(event){
				location.href= this.href;
			})
			.appendTo($boxRisultati);
			
		var tipo = evento.Tipo.toLowerCase();
		var templateEvento = new self.Template(tipo);
		
		/*
		* GESTIONE TITOLI LOCALIZZATI VUOTI:
		* sostitisce con la versione italiana che
		* dovrebbe esserci sempre...
		*/
		if($.trim(evento[lingua].Titolo)=='')
			evento[lingua].Titolo = evento['it'].Titolo;
		
		var $boxTipo = $('<div/>')
			.html(templateEvento.titolo[lingua])
			.addClass('categoria')
			.appendTo($boxEvento);
			
		var $boxTitolo = $('<div/>')
			.html(evento[lingua].Titolo||'')
			.addClass('titolo')
			.appendTo($boxEvento);
			
		
		/*
		* componiData: HELPER FUNCTION
		*/
		var componiData = function(dataObj){
			var data = [];
			var $Da, $A, $Proroga;
			if(dataObj.Da && dataObj.A && (dataObj.Da == dataObj.A)){
				$Il = $('<span/>')
					.addClass('dataIl')
					.html(dataObj.Da);
				data.push($Il.get(0));
			}else{
				
				if(dataObj.Da){
					$Da = $('<span/>')
						.addClass('dataDa')
						.html(self.labels.dal[lingua] + ' ' + dataObj.Da);
					data.push($Da.get(0));
				}
				if(dataObj.A){
					$A = $('<span/>')
						.addClass('dataA')
						.html(self.labels.fino[lingua] + ' ' + dataObj.A);
					if(dataObj.Da){
						var $separatore = $('<span/>').html(' ');
						data.push($separatore.get(0));
					}
					data.push($A.get(0));
				}
				
			}
			
			if(dataObj.Proroga){
				$Proroga = $('<span/>')
					.addClass('dataProroga')
					.html(dataObj.Proroga);
				if(dataObj.A){
					$A.addClass('prorogata');
					var $separatore = $('<span/>').html(', ' + self.labels.prorogata[lingua] + ' ');
					data.push($separatore.get(0));
				}
				data.push($Proroga.get(0));
			}
			return data;
		};
		
		//-> GESTIONE DATE
		evento.Da_ = formattaData(evento.Da);
		evento.A_ = formattaData(evento.A);
		evento.Proroga_ = formattaData(evento.Proroga);
		var dateEvento = {};
		//non sovrascrivo le date originali (in millisecondi) con quelle formattate:
		if(evento.Da_) dateEvento.Da = evento.Da_;
		if(evento.A_) dateEvento.A = evento.A_;
		if(evento.Proroga_) dateEvento.Proroga = evento.Proroga_;
		// FINE GESTIONE DATE <-//
		
		var $boxData = $('<div/>')
			.html(componiData(dateEvento))
			.addClass('data')
			.appendTo($boxEvento);
		
		if(templateEvento.descrizione){
			$boxEvento.addClass('espandibile');
			var $boxDescrizione = $('<div/>')
				.html(evento[lingua].Testo||'')
				.addClass('descrizione')
				.css({
					display: 'none'
				})
				.appendTo($boxEvento);
		}
			
		var $separatore = $('<div/>')
			.addClass('separatore')
			.insertBefore($boxEvento);
			
		dfd.resolve('box evento stampato');
		return dfd.promise();
	};

	
	var registraEventi = function(){
		$tabs.bind('click',function(event){
			$tab = $(this);
			parametriRicerca.tipi = $tab.data('tipo');
			// CARICAMENTO DATI
			self.cerca(parametriRicerca);
		});
		
		
		$campoRicerca.keyup(function (event) {
			var value = $(this).val();
			value = $.trim(value);
			if (value.length > 2 || value.length == 0){
				clearTimeout(timeoutQuery);
				timeoutQuery = setTimeout(function(){
					$(this).val(value);
					parametriRicerca.query_string = value;
					// CARICAMENTO DATI
					self.cerca(parametriRicerca);
				},1000);
			}
		});
		
		$selectAnni.change(function(event){
			var anno = $('option:selected',this).val();
			parametriRicerca.anno = anno;
			if(anno==''){
				delete parametriRicerca.anno;
			}
			// CARICAMENTO DATI
			self.cerca(parametriRicerca);
		});
		
	};
	
	this.cerca = function(options){
		resetRisultati();
		
		if(typeof options.tipi!='undefined') parametriRicerca.tipi = options.tipi || [];
		if(typeof options.musei!='undefined') parametriRicerca.musei = options.musei || [];
		if(typeof options.inCorso!='undefined') parametriRicerca.inCorso = options.inCorso || false;
		if(typeof options.inProgramma!='undefined') parametriRicerca.inProgramma = options.inProgramma || false;
		if(typeof options.Didattica!='undefined') parametriRicerca.Didattica = options.Didattica;
		
		return $.ajax({
			url: '/include/API/Eventi/AJAX-Controller.php',
			type: "POST",
			data: {
				task: 'cerca',
				params: JSON.stringify(parametriRicerca)
			},
			dataType: 'json',
			cache: false,
			success: function(data, textStatus, jqXHR){
				eventi = eventi.concat(data);
				stampaRisultati();
				$(target).trigger('load',data);
			}
		});

	};
	
	this.aggiornaParametriRicerca = function(params){
		return $.extend(parametriRicerca,params);
	};
	
	this.selezionaTab = function(tipo){
		var $tab = $tabs.filter('.'+tipo);
		$tab.trigger('click');
	};
	
	var init = function(){
		//variabili globali private;
		lingua = options.lingua || 'it';
		target = options.target || 'body';
		var mostraRicerca = options.mostraRicerca || false;
		var tipi = options.tipi || [];
		
		// CREAZIONE ELEMENTI
		creaTabella(tipi);
		if(mostraRicerca) showRicerca();
				
		// REGISTRAZIONE EVENTI
		registraEventi();
		
	}();
};

/*
* etichette localizzate
*/
TabellaEventi.prototype.labels = {
	vediTutti: {
		it: 'Vedi Tutti',
		en: 'Show All'
	},
	cercaArchivio: {
		it: 'Cerca in archivio',
		en: 'Search the archive'
	},
	anno: {
		it: 'Anno',
		en: 'Year'
	},
	inCorso: {
		it: 'in corso',
		en: 'current'
	},
	prorogata: {
		it: 'prorogata al',
		en: 'extended until'
	},
	dal: {
		it: 'dal',
		en: 'from'
	},
	fino: {
		it: 'fino al',
		en: 'until'
	},
	nessunRisultato: {
		it: 'nessun risultato',
		en: 'no results'
	}
};

/*
* la tabella viene composta da moduli
*/
TabellaEventi.prototype.Template = function(tipo){
	var templates = {
		segnalazione: {
			tipo: 'segnalazione',
			titolo: {
				it:'Segnalazioni',
				en:'Reports'
			},
			descrizione: true
		},
		evento: {
			tipo: 'evento',
			titolo: {
				it: 'Eventi speciali',
				en: 'Special Events'
			},
			descrizione: false
		},
		avviso: {
    		tipo: 'avviso',
			titolo: {
				it: 'Ultime notizie',
				en: 'Latest News'
			},
			descrizione: true
		},
		mostra: {
    		tipo: 'mostra',
			titolo: {
				it: 'Mostre',
				en: 'Exhibitions'
			},
			descrizione: false
		}
	}
	return templates[tipo];
}
