﻿// Coded by Andrea Usai

var TipoEsitoVotazione = {
    Successo: 1,
    ErroreGenerico: 10,
    ErroreValidazione: 11,
    ErroreGiaVotato: 12
};

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

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

function realtimeValidation() {
	var esito = validaForm();
	if (!esito.success) {
		callback_Validazione(esito.errore);
		$('#btnVota').attr('disabled', 'disabled').attr('class', 'button disabled');
	} else {
		clearValidazione();
		$('#btnVota').attr('disabled', null).attr('class', 'button');
	}
}

function validaCampo(tipo, valore) {
    switch (tipo) {
		case 'privacy':
			return (valore == 1);
        case 'mandatory':
            return !stringIsNullOrEmpty(valore);
        case 'strict':
            var r = /^[a-zA-Zàèéìòù'",\s\.]*$/;
            return r.test(valore);
		case 'numbers':
			var r = /^[\d]*$/;
			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 dati = {
		nomeVotato: $('#txtNomeVotato').val(),
        cognomeVotato: $('#txtCognomeVotato').val(),
        nome: $('#txtNome').val(),
        cognome: $('#txtCognome').val(),
        email: $('#txtEmail').val(),
		telefono: $('#txtTelefono').val(),
        privacy: $('[name=privacy]:checked').val()
    };
	
	// valido
	if (!validaCampo('mandatory', dati.nomeVotato))
        return { success: false, errore: { Campo: '#divNomeVotato', Tipo: TipoErroreValidazione.Obbligatorio} };
    if (!validaCampo('strict', dati.nomeVotato))
        return { success: false, errore: { Campo: '#divNomeVotato', Tipo: TipoErroreValidazione.NonValido} };

    if (!validaCampo('mandatory', dati.cognomeVotato))
        return { success: false, errore: { Campo: '#divCognomeVotato', Tipo: TipoErroreValidazione.Obbligatorio} };
    if (!validaCampo('strict', dati.cognomeVotato))
        return { success: false, errore: { Campo: '#divCognomeVotato', Tipo: TipoErroreValidazione.NonValido} };

	if (!validaCampo('mandatory', dati.nome))
        return { success: false, errore: { Campo: '#divNome', Tipo: TipoErroreValidazione.Obbligatorio} };
    if (!validaCampo('strict', dati.nome))
        return { success: false, errore: { Campo: '#divNome', Tipo: TipoErroreValidazione.NonValido} };

    if (!validaCampo('mandatory', dati.cognome))
        return { success: false, errore: { Campo: '#divCognome', Tipo: TipoErroreValidazione.Obbligatorio} };
    if (!validaCampo('strict', dati.cognome))
        return { success: false, errore: { Campo: '#divCognome', Tipo: TipoErroreValidazione.NonValido} };

    if (!validaCampo('mandatory', dati.email))
        return { success: false, errore: { Campo: '#divEmail', Tipo: TipoErroreValidazione.Obbligatorio} };
    if (!validaCampo('email', dati.email))
        return { success: false, errore: { Campo: '#divEmail', Tipo: TipoErroreValidazione.NonValido} };

    //if (!validaCampo('mandatory', dati.telefono))
    //    return { success: false, errore: { Campo: '#divTelefono', Tipo: TipoErroreValidazione.Obbligatorio} };
	if (!validaCampo('numbers', dati.telefono))
        return { success: false, errore: { Campo: '#divTelefono', Tipo: TipoErroreValidazione.NonValido} };

	if (!validaCampo('privacy', dati.privacy))
		return { success: false, errore: { Campo: '#divPrivacy', Tipo: TipoErroreValidazione.Obbligatorio} };

	// restituisco i dati del form
    return { success: true, dati: dati };
}

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

function clearValidazione() {
	$('#divNomeVotato, #divCognomeVotato, #divNome, #divCognome, #divEmail, #divTelefono, #divPrivacy').html('');
}

function votaRetry() {
	$('#votako').css('display', 'none');
	$('#votaform').css('display', 'block');
}

function callback_Validazione(errore) {
	clearValidazione();
	var msg;
	switch (errore.Campo) {
		case '#divNomeVotato':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il nome del doppiatore.' : 'Il nome contiene caratteri non validi.');
			break;
        case '#divCognomeVotato':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il cognome del doppiatore.' : 'Il cognome contiene caratteri non validi.');
			break;
		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 è in un formato riconosciuto.');
			break;
		case '#divTelefono':
			msg = 'Il numero di telefono<br />contiene caratteri non validi.';
			break;
		case '#divPrivacy':
			msg = 'Per poter votare è necessario fornire<br />il proprio consenso al trattamento dei dati personali.';
			break;
	}
    $(errore.Campo).html(msg);
}

function callback_Votazione(success, textStatus, data) {
    if (success) {
        switch (data.Tipo) {
            case TipoEsitoVotazione.Successo:
                $('#votaform').css('display', 'none');
				$('#votaok').html('<span style="font-weight:bold;font-size:16px;color:#7b9f04;">Il tuo voto è stato registrato con successo.</span>');
				$('#votaok').css('display', 'block');
                break;
            case TipoEsitoVotazione.ErroreGenerico:
                $('#votaform').css('display', 'none');
				$('#votako').html('<span style="font-weight:bold;font-size:16px;color:red;">Si è verificato un errore. Si prega di <a href="javascript:votaRetry();">riprovare</a>.</span>');
				$('#votako').css('display', 'block');
                break;
            case TipoEsitoVotazione.ErroreValidazione:
                callback_Validazione(data.Dettagli);
                break;
            case TipoEsitoVotazione.ErroreGiaVotato:
				$('#votako').html('<span style="font-weight:bold;font-size:16px;">Hai già votato. Ti ricordiamo che è possibile esprimere la propria preferenza una sola volta.</span>');
				$('#votaform').css('display', 'none');
				$('#votako').css('display', 'block');
                break;
        }
    } else {
		$('#votaform').css('display', 'none');
		$('#votako').html('<span style="font-weight:bold;font-size:16px;color:red;">Si è verificato un errore. Si prega di <a href="javascript:votaRetry();">riprovare</a>.</span>');
		$('#votako').css('display', 'block');
    }
}
