// 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 gestisciRuolo() {
	realtimeValidation();
    if ($('[name=ruolo]:checked').val() != null) {
		$('#txtAssistente').attr('disabled', null).css('opacity', null).css('-moz-opacity', null).css('filter', null);
		if ($('[name=ruolo]:checked').val() == '1')
			$('#txtFonico').attr('disabled', null).css('opacity', null).css('-moz-opacity', null).css('filter', null);
		else
			$('#txtFonico').attr('disabled', 'disabled').css('opacity', '0.60').css('-moz-opacity', '0.60').css('filter', 'alpha(opacity=60)');
    }
}

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 dati = {
        nome: $('#txtNome').val(),
        cognome: $('#txtCognome').val(),
        email: $('#txtEmail').val(),
        casaDoppiaggio: $('#txtCasa').val(),
	ENPALS: $('#txtENPALS').val(),
        ruolo: $('[name=ruolo]:checked').val(),
        votoAssistente: $('#txtAssistente').val(),
        votoFonico: $('#txtFonico').val()
    };
	
	// valido
    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.casaDoppiaggio))
    //    return { success: false, errore: { Campo: '#divCasa', Tipo: TipoErroreValidazione.Obbligatorio} };
	if (!validaCampo('strict', dati.casaDoppiaggio))
        return { success: false, errore: { Campo: '#divCasa', Tipo: TipoErroreValidazione.NonValido} };

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

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

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

    if ($('[name=ruolo]:checked').val() == '1' && !validaCampo('mandatory', dati.votoFonico))
		return { success: false, errore: { Campo: '#divFonico', Tipo: TipoErroreValidazione.Obbligatorio} };
    if ($('[name=ruolo]:checked').val() == '1' && !validaCampo('strict', dati.votoFonico))
		return { success: false, errore: { Campo: '#divFonico', Tipo: TipoErroreValidazione.NonValido} };

	// 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',
            contentType: 'application/json; charset=utf-8',
            data: { Method: 'Vota', 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() {
	$('#divNome, #divCognome, #divEmail, #divCasa, #divENPALS, #divRuolo, #divAssistente, #divFonico').html('');
}

function votaRetry() {
	$('#votako').css('display', 'none');
	$('#votaform').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 è in un formato riconosciuto.');
			break;
        case '#divCasa':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il nome della casa di doppiaggio.' : 'Il nome contiene caratteri non validi.');
			break;
        case '#divENPALS':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Inserire il proprio codice ENPALS.' : 'Il codice contiene caratteri non validi.');
			break;
        case '#divRuolo':
			msg = 'Specificare il proprio ruolo.';
			break;
        case '#divAssistente':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Indicare la propria preferenza per l\'assistente.' : 'Il nome contiene caratteri non validi.');
			break;
        case '#divFonico':
			msg = (errore.Tipo == TipoErroreValidazione.Obbligatorio ? 'Indicare la propria preferenza per il fonico.' : 'Il nome contiene caratteri non validi.');
			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('Il tuo voto è stato registrato con successo.');
				$('#votaok').css('display', 'block');
                break;
            case TipoEsitoVotazione.ErroreGenerico:
                $('#votaform').css('display', 'none');
				$('#votako').html('Si è verificato un errore. Si prega di <a href="javascript:votaRetry();">riprovare</a>.');
				$('#votako').css('display', 'block');
                break;
            case TipoEsitoVotazione.ErroreValidazione:
                callback_Validazione(data.Dettagli);
                break;
            case TipoEsitoVotazione.ErroreGiaVotato:
				$('#votaform').css('display', 'none');
				$('#votako').html('Hai già votato.');
				$('#votako').css('display', 'block');
                break;
        }
    } else {
		$('#votaform').css('display', 'none');
		$('#votako').html('Si è verificato un errore. Si prega di <a href="javascript:votaRetry();">riprovare</a>.');
		$('#votako').css('display', 'block');
    }
}