// associa máscaras de preenchimento a campos do formulário
$(document).ready(function($) {
  $.each($('input[data-method=mask]'), function() {
      $(this).mask($(this).attr('data-message'));
   });
});

/**
 * Script para iniciar uma contagem regressiva (por segundos).
 * Recebe como parâmetro:
 * @param g_iCount_ número de segundos
 * @param my_div_ id do div a atualizar
 * @param message_ mensagem a ser exibida ao final do countdown
 */
function initiateCountdown(g_iCount_, my_div_, message_)
{
  g_iCount = g_iCount_ + 1;
  my_div = my_div_;
  message = message_;
  startCountdown();
}

/**
 * Atualiza o countdown
 */
var g_iCount, my_div, message;
function startCountdown()
{
  if((g_iCount - 1) > 0)
  {
    g_iCount = g_iCount - 1;
    $(my_div).html(g_iCount);
    setTimeout("startCountdown()",1000);
  }
  else
  {
    $(my_div).html(message);
    return;
  }
}

/**
 * Abre todos ou fecha todos os cards de uma página:
 * @param boolean_val com o valor true se for para abrir todos os
 * cards e false se for para fechar todos os cards
 */
function open_cards(boolean_val)
{
  var open  = "card-opened";
  var close = "card-closed";
  if(boolean_val != true)
  {
    open  = "card-closed";
    close = "card-opened";
  }
  $('div.' + open).show();
  $('div.' + close).hide();
}

/**
 * Abre ou fecha um card de uma página:
 * @param id do card a abrir ou fechar
 * @param model nome do modelo
 * @param boolean_open com o valor true se for para abrir o
 * card ou false se for para fechar card.
 */
function toggle_one_card_by_id(id, model, boolean_open)
{
  var to_show = "card";
  var to_hide = "title";
  if(boolean_open != true)
  {
    to_show = "title";
    to_hide = "card";
  }
  $('#' + model + '_' + to_show + id).show();
  $('#' + model + '_' + to_hide + id).hide();
}

/**
 * Para usar em filtros. Se clicar no link de fechar o filtro,
 * esconde o div e esvazia o campo texto / preenchido de todos
 * os filhos do tipo input
 */
function hide_and_clear_fields(id)
{
  id = '#' + id
  $(id).find('input').val('');
  $(id).find('select').val('');
  $(id).hide();
}

/**
 * Abre ou fecha o submenu, alternando entre as
 * classes de lista aberta e lista fechada.
 */
function tree_list_toggle_node(id, current)
{
  /** a > span > div > li */
  obj = $(current).parent().parent().parent();
  if(obj.hasClass('list-closed'))
    tree_list_open_or_close(id, obj, true);
  else
    tree_list_open_or_close(id, obj, false);
}

/**
 * Abre ou fecha o submenu, de acordo com a
 * variável bopen setada. Alterna as classes de
 * lista aberta e lista fechada.
 *
 * @id do sublist a abrir ou fechar
 * @obj objeto que deve trocar de classe
 * @bopen true para abrir e false para fechar
 */
function tree_list_open_or_close(id, obj, bopen)
{
  /* alterna entre a lista de classes do menu superior */
  if(bopen)
  {
    obj.removeClass('list-closed').addClass('list-opened');
    $(id).show();
  }
  else
  {
    obj.removeClass('list-opened').addClass('list-closed');
    $(id).hide();
  }
}

function tree_list_open_all_parents(my_array)
{
  if(my_array == null || my_array == [])
    return;

  $.each(my_array, function(){
    $("#item" + this).addClass("highlight");
    /** span > div > li > ul */
    obj = $("#item" + this).parent().parent().parent();
    open_parent(obj);
  });
}

function open_parent(obj)
{
  if(obj.get(0).id != "tree")
  {
     open_parent(obj.parent());
     if(obj.hasClass('sublist'))
     { obj.show(); }
     if(obj.hasClass('list-closed'))
     { obj.removeClass("list-closed").addClass("list-opened"); }
  }
}

// mostra um spinner automagicamente em qualquer chamada ajax
$(document).ready(function(){
  $(document).ajaxSend(function(event, request, settings){
    $('body > div.container').fadeTo('normal', 0.33);
    $('#loading').show();
  });
  $(document).ajaxComplete(function(event, request, settings){
    $('body > div.container').fadeTo('normal', 1);
    $('#loading').hide();
  });
});


// escolhe uma imagem e atualiza o formulário de edição
// de bens, fechando o facebox
function select_image(image_url, image_id)
{
  $('#asset_image').get(0).src= image_url;
  $('#asset_image_id').get(0).value= image_id;
  jQuery(document).trigger('close.facebox');
}

// highlight de linha selecionada de tabela com classe .grid
$(document).ready(function(){
  $('table.grid tr td input[type=checkbox]').click(function(){
    $(this).parents('tr').toggleClass('selected');
  });
});

function asset_total_value()
{
  valor = 0.0;
  if($("input#asset_purchase_price").val() != '')
    valor += parseFloat(clear_numeric_input_value( $("input#asset_purchase_price").val() ) );
  if($("input#asset_pis_value").val() != null && $("input#asset_pis_value").val() != '')
    valor += parseFloat(clear_numeric_input_value( $("input#asset_pis_value").val() ) );
  if($("input#asset_icms_value").val() != null && $("input#asset_icms_value").val() != '')
    valor += parseFloat($("input#asset_icms_value").val().replace(',','.'));
  if($("input#asset_cofins_value").val() != null && $("input#asset_cofins_value").val() != '')
    valor += parseFloat(clear_numeric_input_value( $("input#asset_cofins_value").val() ) );
  valor_str = '' + valor.toFixed(2);
  $("span#total_value").html(valor_str.replace('.', ','));
}


/**
 * Atualiza um campo com uma data no formato dd/MM/yyyy ou d/M/yy
 * para um formato yyyy-mm-dd.
 * busca o campo por um id.
 * FIXME refatorar para pegar o field_text_id do objeto this.
 */
function format_date_ptbr_to_db(field_id, field_text_id)
{
  field = "#" + field_id;
  if($('#' + field_text_id).val() == '')
  {
    $(field).val('');
    return;
  }
  tempText = $('#' + field_text_id).val().split("/");
  if(tempText.length == 3)
    { $(field).val(tempText[2] + "-" + tempText[1] + "-" + tempText[0]); }
  if(tempText.length == 2)
    { $(field).val(tempText[1] + "-" + tempText[0]); }
  if(tempText.length == 1)
    { $(field).val(tempText[0]); }
}


function verify_select_with_json(changed_field, value_to_validate, url, field_to_change) {
  if(changed_field.value == value_to_validate) {
    update_select_with_json(url, field_to_change, '');
  }
}

function update_select_with_json(url, field_to_change, selected_value) {
  if($('#' + field_to_change)[0].options.length != 1)
    return;
  var new_options = "<option value=\"\"></option>";
  jQuery.getJSON(url, function(data){ $.each(data,
    function(i,item){
        new_options += "<option ";
        if(selected_value==item.id)
          new_options += "selected=\"selected\" ";
        new_options +="value=\""+item.id+"\">"+ (item.name != null ? item.name : item.description)+"</option>";
    });
    $('#' + field_to_change).html(new_options);
  });
}

/*
 * Recebe um número decimal (float) em formato de texto
 * e limpa ele de forma que fique apenas o formato americano
 * (separação decimal por ponto) sem um delimitador de milhar
 */
function clear_numeric_input_value(value)
{
  var new_value = value;
  if(new RegExp("[.]{1}[0-9]{0,}[,]{1}","g").test(value))
  {
    new_value = new_value.replace(/\./g, '');
    return new_value.replace(',', '.');
  }
  if(new RegExp("[,]{1}[0-9]{0,}[.]{1}","g").test(value))
  {
    new_value = new_value.replace(/,/g, '');
    return new_value;
  }
  if(new RegExp(",","g").test(value))
  {
    return new_value.replace(',', '.');
  }
  return value;
}

// Upload de arquivo via ajax. Espera um form com id 'uploadForm' e com um botão submit com id 'uploadFormSubmit'. A
// action deve retornar código javascript a ser executado no navegador (via render :js => "..."). Em geral esse código
// será um redirect (window.location.href = 'http://foo/bar'), mas pode ser qualquer coisa.
//
// Bug atual: a action não reconhece o formulário enviado como sendo recebido via ajax, isto é, format.js não funfa.
//
// Adaptado de:
//  * http://www.williambharding.com/blog/rails/rails-ajax-image-uploading-made-simple-with-jquery/
//  * http://jquery.malsup.com/form/#json
//  * http://jquery.malsup.com/form/#file-upload
$(document).ready(function() {
  $('#uploadForm').ajaxForm({
    beforeSubmit: function(a,f,o) {
      $('#uploadFormSubmit').attr('value', 'Enviando...');
      $('#uploadFormSubmit').attr('disabled', true);

      // TODO mostrar spinner

      o.dataType = 'script'; // para que o texto retornado pela action seja executado no navegador
    }
  });
});

function confirmCloseNotification(div_to_hide, url_to_call, downloaded)
{
  if (downloaded) {
    closeNotification(div_to_hide, url_to_call)
  }
  else {
    if ( confirm('Você já baixou o relatório?') ) {
      closeNotification(div_to_hide, url_to_call)
    }
  }
}

function closeNotification(div_to_hide, url_to_call)
{
  $(div_to_hide).hide();
  $.post(url_to_call, {_method:'delete'}, null, "script");
}

function move_filter_in(row_name) {
  if(row_name != '') {
    $('#filters table:first').append( $('tr#' + row_name) );
    $('tr#' + row_name + ' :input:visible:first').focus();
    clear_filters();
  }
}

function move_filter_out(row_name) {
  if(row_name != '') {
    $('#waiting_filters table:first').append( $('tr#' + row_name) );
    clear_filters();
    $('form#search_form :input').trigger('change'); // dispara evento 'change' dos inputs para notificar o contador dos reports
  }
}

function clear_filters() {
  var active_filter_count = $('#filters table:first').find('tr').size();
  if(active_filter_count == 0) {
    $('#filters input.button-apply').disable();
  } else {
    $('#filters input.button-apply').enable();
  }
}

function update_report_counts(url) {
  $('input.report_submit_button').disable();
  $('#counts').html('<p>Carregando informações...</p>');
  $.ajax({
    url: url,
    data: $('form#search_form').serialize(),
    dataType: 'script',
    type: 'get',
    success: function() { $('input.report_submit_button').enable(); }
  });
}

