// Coded by Andrea Usai

var TipoErroreValidazione = {
    Obbligatorio: 1,
    NonValido: 2
};

var TipoEsitoPrenotazione = {
    Successo: 1,
    ErroreGenerico: 10,
    ErroreValidazione: 11,
    ErroreDisponibilita: 12,
	ErrorePrenotazioneEsistente: 13,
	ErroreEventoTerminato: 14
};

function stringIsNullOrEmpty(string) {
    return string == null || string == '';
}

var options = {
	height: 500,
	width: 550,
	navHeight: 25,
	labelHeight: 25,
	firstDayOfWeek: 1,
	calendarStartDate: new Date(),
	dragableEvents: false,
	activeDroppableClass: false,
	hoverDroppableClass: false,
	navLinks: {
		enableToday: true,
		enableNextYear: true,
		enablePrevYear: true,
		p: '&laquo;',
		n: '&raquo;',
		t: 'Oggi'
	},
	onEventLinkClick: eventClickHandler,
	onEventBlockClick: eventClickHandler,
	locale: {
		days: ['Domenica', 'Luned&igrave;', 'Marted&igrave;', 'Mercoled&igrave;', 'Gioved&igrave;', 'Venerd&igrave;', 'Sabato', 'Domenica'],
		daysShort: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'],
		daysMin: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa', 'Do'],
		months: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
		monthsShort: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'],
		weekMin: 'wk'
	}
};

caricaCalendario();

var current_event = null;

function eventClickHandler(event) {
	current_event = event;

	$('#bookok').css('display', 'none');
	
	$('#eventTitle').html(event.Title);
	$('#eventDesc').html(event.Description);
	
	if (event.CssClass == 'terminato') {
		$('#bookform').css('display', 'none');
		$('#bookko').css('display', 'block');
		$('#eventAvailability').html('');
		$('#bookkomsg').html('L\'evento &egrave; terminato, non &egrave; pi&ugrave; possibile effettuare prenotazioni.');
	} else {
		if (event.PostiLiberi > 0) {
			$('#bookform').css('display', 'block');
			$('#bookko').css('display', 'none');
			$('#eventAvailability').html(' (' + event.PostiLiberi + ' posti disponibili su ' + event.numeroPosti + ')');
		} else {
			$('#bookform').css('display', 'none');
			$('#bookko').css('display', 'block');
			$('#eventAvailability').html('');
			$('#bookkomsg').html('Tutti i posti disponibili per questo evento sono stati gi&agrave; riservati.');
		}
	}
	
	$('#hidIdEvento').val(event.EventID);
	$('#txtNome, #txtCognome, #txtEmail, #txtPartecipante').val('');
	$('#ddlPartecipanti').empty();
	$('#btnDelP').css('display', 'none');
	
	$.blockUI({ message: $('#bookEvent') });
	
	return false;
}

function updateEventAvailability(postiPresi) {
	$('#eventAvailability').html(' (' + parseInt(current_event.PostiLiberi - postiPresi) + ' posti disponibili su ' + current_event.numeroPosti + ')');
}

function aggiungiPartecipante() {
	var par = $('#txtPartecipante').val();
	if (!validaCampo('mandatory', par)) {
		callback_Validazione({ Campo: '#divPartecipante', Tipo: TipoErroreValidazione.Obbligatorio});
		return;
	}
	if (!validaCampo('strict', par)) {
		callback_Validazione({ Campo: '#divPartecipante', Tipo: TipoErroreValidazione.NonValido});
		return;
	}
	$('#ddlPartecipanti').append('<option value="' + par + '">' + par + '</option>');
	$('#txtPartecipante').val('');
	$('#btnDelP').css('display', 'inline');
	clearValidazione();
}

function eliminaPartecipante() {
	$('#ddlPartecipanti > option').remove(':selected');
	if ($('#ddlPartecipanti > option').length == 0)
		$('#btnDelP').css('display', 'none');
}

function validaCampo(tipo, valore) {
	switch (tipo) {
		case 'mandatory':
			return !stringIsNullOrEmpty(valore);
		case 'strict':
			var r = /^[a-zA-Z'",\s\.]*$/;
			return r.test(valore);
		case 'email':
			var r = /^[_a-zA-Z0-9+-]+(\.[_a-zA-Z0-9+-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/;
			return r.test(valore);
		default:
			return false;
	}
}

function validaForm() {
	// leggo i dati del form
	var pars = $('#ddlPartecipanti > option');
	var parts = new Array();
	for (var i = 0; i < pars.length; i++) {
		parts.push({ nome: $('#ddlPartecipanti > option').get(i).value });
	}
	var dati = {
		idEvento: $('#hidIdEvento').val(),
		nome: $('#txtNome').val(),
		cognome: $('#txtCognome').val(),
		email: $('#txtEmail').val(),
		partecipanti: parts
	};
	// controllo i campi obbligatori
	if (!validaCampo('mandatory', dati.nome))
		return { success: false, errore: { Campo: '#divNome', Tipo: TipoErroreValidazione.Obbligatorio} };
	if (!validaCampo('mandatory', dati.cognome))
		return { success: false, errore: { Campo: '#divCognome', Tipo: TipoErroreValidazione.Obbligatorio} };
	if (!validaCampo('mandatory', dati.email))
		return { success: false, errore: { Campo: '#divEmail', Tipo: TipoErroreValidazione.Obbligatorio} };
	// controllo i campi validi
	if (!validaCampo('strict', dati.nome))
		return { success: false, errore: { Campo: '#divNome', Tipo: TipoErroreValidazione.NonValido} };
	if (!validaCampo('strict', dati.cognome))
		return { success: false, errore: { Campo: '#divCognome', Tipo: TipoErroreValidazione.NonValido} };
	if (!validaCampo('email', dati.email))
		return { success: false, errore: { Campo: '#divEmail', Tipo: TipoErroreValidazione.NonValido} };
	// restituisco i dati del form
	return { success: true, dati: dati };
}

function prenota() {
	var esito = validaForm();
	if (esito.success) {
		$('#btnBook, #btnCloseBook').attr('disabled', 'disabled').attr('class', 'button disabled');
		$('#imgLoading').css('display', 'inline');
		$.ajax({
			url: 'http://service.premiodeldoppiaggio.com/GPD.asmx/JSONP',
			contentType: 'application/json; charset=utf-8',
			data: { Method: 'Prenota', Data: JSON.stringify(esito.dati) },
			dataType: 'jsonp',
			success: function(data, textStatus) {
				$('#imgLoading').css('display', 'none');
				$('#btnBook, #btnCloseBook').attr('disabled', null).attr('class', 'button');
				callback_Prenotazione(true, textStatus, data);
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				$('#imgLoading').css('display', 'none');
				$('#btnBook, #btnCloseBook').attr('disabled', null).attr('class', 'button');
				callback_Prenotazione(false, textStatus, errorThrown);
			}
		});
	} else {
		callback_Validazione(esito.errore);
	}
}

function caricaCalendario(replace) {
	$.ajax({
		url: 'http://service.premiodeldoppiaggio.com/GPD.asmx/JSONP',
		contentType: 'application/json; charset=utf-8',        
		data: { Method: 'EventiMese', Data: JSON.stringify({}) },
		dataType: 'jsonp',
		success: function(events, textStatus) {
			if (replace) {
				$.jMonthCalendar.ReplaceEventCollection(new Array());
				$.jMonthCalendar.AddEvents(events);
			} else {
				$.jMonthCalendar.Initialize(options, events);                
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			//
		}
	});
}

function clearValidazione() {
	$('#divNome, #divCognome, #divEmail, #divPartecipante').html('');
	$('#divNome, #divCognome, #divEmail, #divPartecipante').css('display', 'none');
}

function prenotaRetry() {
	$('#bookko').css('display', 'none');
	$('#bookform').css('display', 'block');
}

function callback_Validazione(errore) {
	clearValidazione();
	switch (errore.Campo) {
		case '#divNome':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il proprio nome.' : 'Il nome contiene caratteri non validi.');
			break;
		case '#divCognome':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il proprio cognome.' : 'Il cognome contiene caratteri non validi.');
			break;
		case '#divEmail':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il proprio indirizzo email.' : 'L\'indirizzo non &egrave; in un formato riconosciuto.');
			break;
		case '#divPartecipante':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire nome e cognome di un partecipante.' : 'Il nome contiene caratteri non validi.');
			break;
	}
	$(errore.Campo).html(msg);
	$(errore.Campo).css('display', 'block');
}

function callback_Prenotazione(success, textStatus, data) {
	if (success) {
		switch (data.Tipo) {
			case TipoEsitoPrenotazione.Successo:
				$('#bookform').css('display', 'none');
				$('#bookok').css('display', 'block');
				updateEventAvailability(data.Dettagli);
				caricaCalendario(true);
				break;
			case TipoEsitoPrenotazione.ErroreGenerico:
				$('#bookform').css('display', 'none');
				$('#bookkomsg').html('Si &egrave; verificato un errore. Si prega di <a href="javascript:prenotaRetry();">riprovare</a>.');
				$('#bookko').css('display', 'block');
				break;
			case TipoEsitoPrenotazione.ErroreValidazione:
				callback_Validazione(data.Dettagli);
				break;
			case TipoEsitoPrenotazione.ErroreDisponibilita:
				$('#bookform').css('display', 'none');
				if (data.Dettagli > 0)
					$('#bookkomsg').html('Siamo spiacenti, ma per questo evento non &egrave; disponibile il numero di posti richiesti. Sono ancora disponibili ' + data.Dettagli + ' posti, si desidera <a href="javascript:prenotaRetry();">modificare la richiesta</a>?');
				else
					$('#bookkomsg').html('Siamo spiacenti, ma non vi &egrave; pi&ugrave; disponibilit&agrave; per questo evento.');
				$('#bookko').css('display', 'block');
				break;
			case TipoEsitoPrenotazione.ErrorePrenotazioneEsistente:
				$('#bookform').css('display', 'none');
				$('#bookkomsg').html('Esiste gi&agrave; una prenotazione per questo evento associata all\'indirizzo email specificato.');
				$('#bookko').css('display', 'block');
				break;
			case TipoEsitoPrenotazione.ErroreEventoTerminato:
				$('#bookform').css('display', 'none');
				$('#bookkomsg').html('Le prenotazioni per questo evento sono terminate.');
				$('#bookko').css('display', 'block');
				break;
		}
	} else {
		$('#bookform').css('display', 'none');
		$('#bookkomsg').html('Si &egrave; verificato un errore. Si prega di <a href="javascript:prenotaRetry();">riprovare</a>.');
		$('#bookko').css('display', 'block');
	}
}