var AUTOCOMPLETE_URL = '/quotes/autocomplete';
var VALIDATE_FLIGHT_URL = '/quotes/validate_flight';
var AIRPLANE_SELECTOR_URL = '/quotes/airplane_selector';
var SEND_QUOTE_URL = '/quotes/send_quote';

var tramos = 0;
var editandose = 0;
var avion_seleccionado = '';

function inicializar() {
    crear_primer_tramo();
    $("#cotizador_nojs").hide();
    $("#cotizador").show();
}

function crear_primer_tramo() {
    agregar_tramo_despues("comienzo_tramos");
    var insertado = $("#tramo_0");
    insertado.find(".link_editar_tramo_cancelar").css('visibility','hidden');
    insertado.find(".link_eliminar_tramo").css('display','none');
}

function agregar_tramo_despues(tramo_padre) {
    var insertado;
    var tramo_anterior = $("#" + tramo_padre);
    var este_tramo = tramos;
    var este_tramo_id = "tramo_" + este_tramo;

    tramos = tramos + 1;
    push_editandose();

    insertado = $("#tramo_original").clone().hide();
    insertado.insertAfter(tramo_anterior).slideDown();
    insertado.attr('id','tramo_' + este_tramo);

    // Si el tramo_padre es un tramo valido, agrego como
    // origen por defecto el destino del tramo anterior.
    if (tramo_anterior.find('.span_destino').length > 0) {
        insertado.find('.input_origen').val(tramo_anterior.find('.span_destino').val());
    }
    insertado.find('.input_destino').val('');

    // bindeo los eventos apropiados
    insertado.find(".link_agregar_tramo").click(function() {
            return agregar_tramo_despues(este_tramo_id);
        }
    );
    insertado.find(".link_eliminar_tramo").click(function() {
            $("#" + este_tramo_id).slideUp('normal', function() { 
                    $("#" + este_tramo_id).remove();
                    deshabilitar_selector_aviones();
                    habilitar_selector_aviones();
                }
            );
            return false;
        }
    );
    insertado.find(".link_editar_tramo_ok").click(function() {
            return validar_tramo(este_tramo_id);
        }
    );
    insertado.find(".link_editar_tramo_cancelar").click(function() {
            // 2 acciones posibles al presionar la cruz:
            // - si hay datos válidos, se cancela la edición y se restauran
            // - si no hay datos válidos, se elimina fila
            if (insertado.find('.span_origen').val() != '' &&
                insertado.find('.span_destino').val() != '') {
                insertado.find('.editar_tramo').hide();
                insertado.find('.tramo_terminado').show();
                pop_editandose();
            }
            else {
                $("#" + este_tramo_id).slideUp('normal', function() { 
                        $("#" + este_tramo_id).remove()
                        pop_editandose();
                    }
                );
                return false;
            }
            return false;     
        }
    );
    insertado.find(".link_editar_tramo").click(function() {
           
            editar_tramo(este_tramo_id);

            // un poco de magia funcional para activar el
            // cuadro de input correspondiente al recuadro
            // donde cliqueo el usuario para activar la edición
            $(this).filter('.span_origen').each(function() {
                    insertado.find('.input_origen').focus();
                }
            );
            $(this).filter('.span_destino').each(function() {
                    insertado.find('.input_destino').focus();
                }
            );
            
            return false;
        }
    );

    // un poco de magia para lograr la apariencia de input disabled en IE
    insertado.find(".tramo_terminado_lugares").attr('readonly','true');
    insertado.find(".tramo_terminado_lugares").mousedown(function() {
            $(this).blur();
            return false;
        }
    );
    
    // activo el autocompletado
    insertado.find('input').autocomplete(AUTOCOMPLETE_URL, {cacheLength: 10,
                                                            matchSubset: false,
                                                            matchContains: false,
                                                            minChars: 2,
                                                            width: 200});
    return false;
}

function editar_tramo(tramo_id) {
    push_editandose();

    var tramo = $("#" + tramo_id);
    var origen_input = tramo.find('.input_origen');
    var destino_input = tramo.find('.input_destino');
    var origen_span = tramo.find('.span_origen');
    var destino_span = tramo.find('.span_destino');
    origen_input.val(origen_span.val());
    destino_input.val(destino_span.val());

    tramo.children('.editar_tramo').show();
    tramo.children('.tramo_terminado').hide();
    return false;
}

function validar_tramo(tramo_id) {
    var tramo = $("#" + tramo_id);
    var origen_input = tramo.find('.input_origen');
    var destino_input = tramo.find('.input_destino');
    var origen_span = tramo.find('.span_origen');
    var destino_span = tramo.find('.span_destino');

    tramo.find('.link_editar_tramo_ok').hide();
    tramo.find('.link_editar_tramo_cancelar').css('visibility','hidden');
    tramo.find('.editar_tramo_loading').show();


    // valido origen y destino con AJAX
    var data = { 'origen' : origen_input.val(),
                 'destino': destino_input.val()
               }
    $.getJSON(VALIDATE_FLIGHT_URL, data, function(data) {
            
            // oculto el mensaje de loading y restauro los iconos
            tramo.find('.editar_tramo_loading').hide();
        
            if (tramo_id != 'tramo_0') {
                tramo.find('.link_editar_tramo_cancelar').css('visibility','visible');
            }
            tramo.find('.link_editar_tramo_ok').show();

            
            // si hay errores, los muestro
            if (data.error) {
                if (data.error_origen) {
                    origen_input.addClass('input_lugares_error');
                } else {
                    origen_input.removeClass('input_lugares_error');
                }
                if (data.error_destino) {
                    destino_input.addClass('input_lugares_error');
                } else {
                    destino_input.removeClass('input_lugares_error');
                }
                
                tramo.find('.mensaje_error_tramo').html(data.mensaje_error);
                tramo.find('.caja_error_tramo').show();//slideDown();
            } 

            // si no hay errores, vuelvo al estado normal (sin inputs de edicion)
            else {
                // borro los posibles indicadores de error
                origen_input.removeClass('input_lugares_error');
                destino_input.removeClass('input_lugares_error');
                tramo.find('.caja_error_tramo').hide();

                // cargo los valores en los cuadros de estado normal
                //origen_span.val(origen_input.val());
                //destino_span.val(destino_input.val());
                origen_span.val(data.origen);
                destino_span.val(data.destino);
                
                tramo.children('.editar_tramo').hide();
                tramo.children('.tramo_terminado').show();
        
                pop_editandose();
            }
        }
    )

    return false;
}


/*************************************/
/* Funciones del selector de aviones */
/*************************************/


function push_editandose() {
    editandose += 1;
    if (editandose == 1) {
        deshabilitar_selector_aviones();
    }
}

function pop_editandose() {
    editandose -= 1;
    if (editandose == 0) {
        habilitar_selector_aviones()
    }
}

function habilitar_selector_aviones() {
    $("#overlay_aviones_msg").hide();
    $("#overlay_aviones_loading").show();
    cargar_selector_aviones(function() {
            mostrar_avion(avion_seleccionado);
            $("#overlay_aviones").fadeOut('slow', function() {
                    $("#overlay_aviones_msg").show();
                    $("#overlay_aviones_loading").hide();
                }
            );
        }
    );
}

function deshabilitar_selector_aviones() {
    $("#overlay_aviones").fadeIn();
    deshabilitar_contacto();
}


function cargar_selector_aviones(callback) {
    if (!callback) {
        callback = function () {};
    }
    var tramos = $('#tramos').find('.tramo');
    var tramos_form = Array();
    tramos.each(function(i) {
            tramos_form.push({'origen':  $(this).find('.span_origen').val(), 
                              'destino': $(this).find('.span_destino').val() 
                             });
        }
    );
    $('#tabla_aviones').load(AIRPLANE_SELECTOR_URL, 
                     {'tramos': JSON.stringify(tramos_form)},
                     callback
    );
    return false;
}

function mostrar_avion(i) {
    $("#tabla_selector").find(".info_avion").hide();
    $("#info_avion_" + i).show();
    avion_seleccionado = i;

    // me fijo si este avion esta habilitado
    var habilitado = $("#info_avion_" + i).hasClass("info_avion_habilitado");
    
    if (habilitado) {
        
        // cargo los tiempos
        var tiempos_cont = $("#tiempos_avion_" + i).children();
        var tramos = $('#tramos').find('.tiempos_tramo');
        tramos.each(function(i) {
                $(tramos[i]).html($(tiempos_cont[i]).html());
            }
        );
        habilitar_contacto();
    } else {
        $('#tramos').find('.tiempos_tramo').html('');
        deshabilitar_contacto();
    }

    return false;
}

/******************************************************/
/* Funciones para el recuadro de "guardar cotizacion" */
/******************************************************/

function habilitar_guardar() {
    $("#codigo_cotizacion").html($("#codigo_cotizacion_avion_" + avion_seleccionado).html());
    $("#permalink_cotizacion").html($("#permalink_cotizacion_avion_" + avion_seleccionado).html());
    $("#printlink_cotizacion").html($("#printlink_cotizacion_avion_" + avion_seleccionado).html());
    $("#imprimir_cotizacion").slideDown();
}

function deshabilitar_guardar() {
    $("#imprimir_cotizacion").slideUp();
}


/****************************************/
/* Funciones del formulario de contacto */
/****************************************/

function habilitar_contacto() {
    $("#overlay_contacto").fadeOut();
    $("#pasajeros_vuelo").css('visibility','visible');
    habilitar_guardar();

    
    // cargo las cantidades posibles de pasajeros en el form de contacto
    var pasajeros = parseInt($("#capacidad_avion_" + avion_seleccionado).html());
    var select = $("#pasajeros_vuelo");
    select.empty();
    
    for(var i = 1; i <= pasajeros; i++) {
        select.append('<option value="' + i + '">' + i + '</option>');
    }

    // cargo el id de cotizacion en el form de contacto
    $("#cotizacion_id").val($("#id_cotizacion_avion_" + avion_seleccionado).html());

}

function deshabilitar_contacto() {
    $("#overlay_contacto").fadeIn();
    $("#pasajeros_vuelo").css('visibility','hidden');
    deshabilitar_guardar();
}


function enviar_formulario_contacto() {
    var data = $("#form_contacto").serializeArray();
    $("#form_contacto_ok").hide();
    $("#form_contacto").find(".contacto_form_loading").css('visibility','visible');
    $("#form_contacto :input").attr('disabled','disabled');
    $.post(SEND_QUOTE_URL, data, function(jsonObj, exito) {

        if (jsonObj.error) {
            if (jsonObj.error_mail_cliente) {
                $("#mail_cliente").addClass('input_lugares_error');
            } else {
                $("#mail_cliente").removeClass('input_lugares_error');
            }
            if (jsonObj.error_nombre_cliente) {
                $("#nombre_cliente").addClass('input_lugares_error');
            } else {
                $("#nombre_cliente").removeClass('input_lugares_error');
            }
        }
        else {
            $("#mail_cliente").removeClass('input_lugares_error');
            $("#nombre_cliente").removeClass('input_lugares_error');
            $("#form_contacto_ok").show();
        }
        $("#form_contacto").find(".contacto_form_loading").css('visibility','hidden');
        $("#form_contacto :input").removeAttr('disabled');
    }, "json");
        
    return false;
}