/*
 * para algum custom javascript da code, que o template original não possui ou não realiza
 */
$(document).ready(function() {
  setupAnimsition();
  // refaz o scroll do pagewrap
  refazScrollPagewrap();
  atualizarScrollbarsQuandoPrecisar();
  setupMenuAtalho();
  $("#body").attr('class', '');
  // se algum modal não estiver no body, pode dar problema, então move pra lá
  moverModalsParaBody();
  setupTinymce();
  setupHelperModal();
  setupFormComDatatable();
  setupYoutubeModal();
  setupCodeDatatable();
  setupImgPreview();
  setupBtnVoltar();
  setupLinkTema();
  setupItens();
  setupMaskCodeFields();
});

// atualiza os scrollbars quando algo muda na tela
function atualizarScrollbarsQuandoPrecisar() {
  $('#pagewrap .dataTable').on('draw.dt length.dt search.dt', function () {
    $('#pagewrap').mCustomScrollbar("update");
    //console.log('draw.dt length.dt search.dt update');
  });
  $('.sidebar-nav').on('shown.bs.dropdown hidden.bs.dropdown', function () {
    //console.log('dropdown');
    $('.sidebar-nav').mCustomScrollbar("update");
  });
  $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    $('#pagewrap').mCustomScrollbar("update");
    //console.log('shown.bs.tab update');
  });
  $('.stepy_buttons').on('click', function(e) {
    $('#pagewrap').mCustomScrollbar("update");
    //console.log('stepy update');
  });
  $('div.alert-dismissible').on('closed.bs.alert', function() {
    $('#pagewrap').mCustomScrollbar("update");
  });
  $(document).on('table-itens.change', function() {
    console.log('custom event');
    $('#pagewrap').mCustomScrollbar("update");
  });
}

// setup para os botões helper, das lupas
function setupHelperModal() {
  // procura os links de lupa para adicionar evento de change nos inputs de valor, para pesquisar a descrição via ajax
  $('.input-helper').each(function () {
    var valueSelector = $(this).data('value');
    var descriptionSelector = $(this).data('description');
    //console.log(valueSelector);
    var input = $(valueSelector);
    var description = $(descriptionSelector);
    var url = this.href;
    input.on('change', '', {'url': url, 'description': description}, _inputModalOnChange);
  });
  // on show modal
  var modal = $('#helper-modal-div');
  modal.on("show.bs.modal", function(e) {
    // atualiza o conteúdo
    var thelink = $(e.relatedTarget);
    var url = e.relatedTarget.href;
    $(this).data('href', url);
    $(this).data('value', thelink.data('value'));
    $(this).data('description', thelink.data('description'));
    var titulo = thelink.data('title');
    if (titulo === undefined || titulo === '') {
      titulo = 'Helper';
    }
    $('#helper-modal-label').text(thelink.data('title'));
    // desabilita o selecionar, pois no início não tem nada selecionado
    $('#modalOk').prop("disabled", true);

    // carrega o body do modal e executa função após o carregamento
    $(this).find(".modal-body").load(url, modalBodyLoaded);
  });

  // captura evento ao clicar no botão selecionar
  $('#modalOk').on('click', function (e) {
    var table = $('#helperTable');
    // clicou no 'ok', então pega o valor, coloca na tela e fecha o modal
    // usando a api do datatable
    var selecao = table.DataTable().row('.selected');
    if (selecao.length > 0) {
      var data = selecao.data();
      //console.log(data);
      var id = data[0];
      var desc = data[1];
      var valueSelector = modal.data('value');
      var descriptionSelector = modal.data('description');
      $(valueSelector).val(id);
      //$(descriptionSelector).text(desc);
      var description = $(descriptionSelector);
      console.log('modalok');
      console.log(description);
      if (description.prop('value') === undefined) {
        description.text(desc);
      } else {
        description.val(desc);
      }
    }
    modal.modal('hide');
  });
}

function _inputModalOnChange(e) {
  //return;
  var value = e.currentTarget.value;//input.val();
  // console.log('value:'+ e.data);
  var url = e.data.url;//?
  var description = e.data.description;
  // console.log('descri:' + value);
  //console.log(url);
  if (value !== '') {
    $.ajax({
      method: 'GET',
      url: url,
      data: 'key=' + encodeURIComponent(value),
      dataType: 'json',
      success: function(data, textStatus, jqXHR) {
        if (data.error) {
          noty({text: data.error, type: 'error', timeout: 5000});
        }
        /* Substiuir o Valor do Campo, caso seja diferente do informado */
        if(data.id !== undefined){
          var valID = data.id;
          //  console.log('id:' + val);
          if(value!=valID){
            e.currentTarget.value = valID;
            e.currentTarget.focus();
            // e.currentTarget.trigger("change");
          }
        }


        if (description.prop('value') === undefined) {
          description.text(data.value);
        } else {
          description.val(data.value);
        }
      },
      error: function(jqXHR, textStatus, errorThrown) {
        // AWWW... JSON parse error?
        noty({text: 'Erro(' + textStatus + '): ' + errorThrown, type: 'error', timeout: 5000});
      }
    });
  } else {
    if (description.prop('value') === undefined) {
      description.text('-');
    } else {
      description.val('-');
    }
  }
}

// callback quando o corpo do modal do helper for carregado
function modalBodyLoaded() {
  var modal = $('#helper-modal-div');
  // plugin datatable na lista
  $("#helperTable").dataTable({
    iDisplayLength: 5,
    aLengthMenu: [5, 10, 25, 50, 100],
    sPaginationType: "full_numbers",
    "language": {
      // url com caminho referente ao html que inclui este script, não ao desse script
      "url": "js/plugins/datatables/Portuguese-Brasil.json",
      
      select: {
        rows: {
          _: " %d linhas selecionadas",
          0: "",
          1: " 1 linha selecionada"
        }
      }
    },
    select: 'single'
  });
  
  $('#helperTable').on('select.dt', function () {
    $('#modalOk').prop("disabled", false);
  });
  $('#helperTable').on('deselect.dt', function () {
    $('#modalOk').prop("disabled", true);
  });
  // plugin scroll personalizado
  var $scroll = modal.find(".scroll");
  if ($scroll.length > 0) {
    $scroll.mCustomScrollbar({
      scrollInertia: 0
    });
    // atualiza o scroll em determinados eventos
    modal.on('draw.dt length.dt search.dt shown.bs.tab', '.dataTable, a[data-toggle="tab"]', function () {
      //console.log('fire event');
      $scroll.mCustomScrollbar("update");
    });
  }
  // helperform deve ser enviado por ajax
  $('#helper-form-div').on('submit', 'form', function (e) {
    e.preventDefault();
    $('#helper-form-div').find(':button').prop("disabled",true);
    //console.log(e);
    $.ajax({
      method: 'POST',
      url: this.action,
      data: $(this).serialize(),
      dataType: 'json',
      success: function(data, textStatus, jqXHR) {
        noty({text: data.text, type: data.type, timeout: 5000});
        // recarrega o modal
        //console.log(modal.find(".modal-body"));
        //console.log(modal.data('href'));
        // inception?
        modal.find(".modal-body").load(modal.data('href'), modalBodyLoaded);
        //console.log(data);
        //console.log('aqui faço a notificação e daria um refresh no modal-body');
      },
      error: function(jqXHR, textStatus, errorThrown) {
        // AWWW... JSON parse error?
        noty({text: 'Erro(' + textStatus + '): ' + errorThrown, type: 'error', timeout: 5000});
      }
    });
    return false;
  });
  
}

// move os modals para o body da página, caso eles tenham sido declarados dentro de algum outro div
function moverModalsParaBody() {
  $('.modal').each(function () {
    var $this = $(this);
    var tagParent = $this.parent()[0].tagName;
    if (tagParent !== 'BODY') {
      $this.detach().appendTo('body');
    }
  });
}

// recria o scroll do pagewrap, para não fazer o autofocus
function refazScrollPagewrap() {
  $("#pagewrap").mCustomScrollbar('destroy');
  $("#pagewrap").mCustomScrollbar({
    scrollInertia: 0, advanced:{ autoScrollOnFocus: false }
  });
}

// ao incluir um tinymce, também atualiza o scroll da página
function setupTinymce() {
  if ($("textarea.tinymce").length > 0) {
    tinymce.init({
      selector: "textarea.tinymce",
      language: 'pt_BR',
      height: 400,
      setup: function(ed) {
        ed.on('init', function() {
          $(ed.getWin()).bind('resize', function(e){
            $('#pagewrap').mCustomScrollbar("update");
          })
        });
      }
    })
  }
}

// prepara o atalho do menu topo e suas funcionalidades
function setupMenuAtalho() {
  if ($("#menu-atalho").length > 0) {
    var $menuAtalho = $("#menu-atalho").select2({
      placeholder: "Atalho",
      language: "pt-BR"
    });
    $menuAtalho.data('select2').$container.addClass("menu-atalho");
    $menuAtalho.data('select2').$dropdown.addClass("menu-atalho");
    $('#menu-atalho').on('change', function () {
      var atalho = $(this).val();
      //console.log(atalho);
      if (atalho !== '') {
        atalho = atalho.split(';');
        //console.log(atalho);
        var modulo = atalho[0];
        var funcionalidade = atalho[1];
      }
    });
  }
}

// chama o plugin Animsition
function setupAnimsition() {
  //$("#pagewrap.animsition").animsition({
  //  linkElement: 'a:not([target="_blank"]):not([href^="#"]):not([data-value])'
  //});
}

// quando o form tem algum input oculto pelo datatable, ele não é enviado, então esta função se encarrega de adicionar ao form em questão os campos
function setupFormComDatatable() {
  $('form').on('submit', function (e) {
    //e.preventDefault();
    var seletor = 'input:checked';
    var oForm = $(this);
    oForm.find('.dataTable').each(function () {
      var oTable = $(this).DataTable();
      var todos = $(oTable.rows().nodes()).find(seletor);
      var atual = $(oTable.rows({page:'current'}).nodes()).find(seletor);
      // adiciona os inputs que não estão visíveis ao form, escondendo eles
      var oDivOculto = $('<div>').attr('style', 'display: none');
      oDivOculto.append(todos.not(atual));
      oForm.append(oDivOculto);
    });
  });
}

function setupYoutubeModal() {
  // cliques nos links com data-rel="youtube-modal" chamam a função
  $('#pagewrap').on('click', 'a[data-rel="youtube-modal"]', function (e) {
    e.preventDefault();
    // regex para pegar o id do vídeo no youtube
    var regexV = /(?:youtube\.com.*(?:\?|&)(?:v)=|youtube\.com.*embed\/|youtube\.com.*v\/|youtu\.be\/)((?!videoseries)[a-zA-Z0-9_]*)/g;
    // regex muito mais simples para pegar a lista de vídeos, é seguro usar assim pois só quando encontra o id do vídeo executa este também
    var regexList = /\?(?:list)=([a-zA-Z0-9_]*)/g;
    var url = this.href;
    var matchV = regexV.exec(url);
    // se deu match no vídeo, é um link youtube válido
    if (matchV !== null) {
      var youtubeUrl = 'https://www.youtube.com/embed/';
      var idV = matchV[1];
      youtubeUrl += idV;
      // se também deu match na lista, adiciona o id dela também na url
      var matchList = regexList.exec(url);
      if (matchList !== null) {
        var idList = matchList[1];
        youtubeUrl += '?list=' + idList;
      }
      // coloca a url no atributo src do iframe e abre o modal por aqui
      var modal = $('#youtube-modal-div');
      modal.find('iframe').attr('src', youtubeUrl);
      modal.modal();
    } else {
      console.log('não achou youtube id');
    }
  });
  // ao fechar o modal, retira o atributo src do iframe para parar o vídeo
  $('#youtube-modal-div').on('hidden.bs.modal', function (e) {
    $(this).find('iframe').attr('src', '');
  });
}

// datatable customizada para a code
function setupCodeDatatable() {
  var codeSortable = $("table.code-sortable");
  if (codeSortable.length > 0) {
    var targets = [];
    var order = codeSortable.data('order-by');
    codeSortable.find('th').each(function (i, el) {
      if ($(el).hasClass('no-sort')) {
        targets[targets.length] = i;
      }
    });
    codeSortable.dataTable({
      iDisplayLength: 100,
      aLengthMenu: [5, 10, 25, 50, 100],
      sPaginationType: "full_numbers",
      "language": {
        // url com caminho referente ao html que inclui este script, não ao desse script
        "url": "js/plugins/datatables/Portuguese-Brasil.json"
      },
      "columnDefs": [{ "targets": targets, "orderable": false }],
      "order": [[ order, 'asc' ]]
    })
  }
}

// preview de imagens como dos ícones de módulos
function setupImgPreview() {
  var previews = $('img[data-imgpreview-from]');
  if (previews.length > 0) {
    previews.each(function (i, el) {
      var seletor = $(el).data('imgpreview-from');
      $(el).attr('src', $(seletor).val());
      $(seletor).on('change', function () {
        $(el).attr('src', $(this).val());
      });
    });
  }
}

// botão voltar dos forms
function setupBtnVoltar() {
  $('#btn-voltar').click(function (e) {
    e.preventDefault();
    window.history.go(-1);
  });
}

// mostra o form para troca de temas
function setupLinkTema() {
  $('#link-site-tema').click(function (e) {
    e.preventDefault();
    $('.site-settings').addClass('active');
  });
}

// setup dos botões das tabelas de itens
function setupItens() {
  var tabItens = $('.itens-1-n');
  if (tabItens.length > 0) {
    tabItens.on('click', '.item-delete', function (e) {
      var table = $(this).closest('table');
      if (table.hasClass('dataTable')) {
        table = table.DataTable();
        if (table.rows().count() > 1) {
          table.row($(this).parents('tr')).remove().draw();
        } else {
          var tr = $(this).closest('tr');
          tr.find('input:text, input:password, input:file, select, textarea').val('');
          tr.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
        }
      } else {
        var tbody = $(this).closest('tbody');
        var trs = tbody.find('tr');
        if (trs.length > 1) {
          e.preventDefault();
          var target = $(this).closest('table');
          $(this).closest('tr').remove();
          target.trigger('table-itens.change');
        } else {
          trs.find('input:text, input:password, input:file, select, textarea').val('');
          trs.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
        }
      }
    });
  }
  $('.item-add').on('click', function(e) {
    var target = $($(this).data('target'));
    var tbody = $($(this).data('target')).find('tbody');
    if (tbody.length > 0) {
      var linha = tbody.find('tr:last');
      if (linha) {
        linha = linha.clone();
        var n = target.data('n');
        n = parseInt(n);
        n++;
        linha.find('input:text, input:password, input:file, select, textarea').val('');
        linha.find('input:radio, input:checkbox').each(function (idx, el) {
          var td = $(el).closest('td');
          var x = $(el).detach();
          td.empty().append(x);
        });
        linha.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected').uniform();
        linha.find('input:checkbox[name*="st_ativo"]').attr("checked", "checked");
        linha.find('input:radio, input:checkbox').uniform();
        // troca o índice dos nomes pelo n
        linha.find('input').each(function (idx, el) {
          var name = $(el).attr('name');
          var newName = name.replace(/\[\d*\]/, '[' + n + ']');
          $(el).attr('name', newName);
        });
        setupMaskCodeFields(linha);
        if (target.hasClass('dataTable')) {
          var dataTable = target.DataTable();
          dataTable.row.add(linha).draw();
        } else {
          tbody.append(linha);
        }
        linha.find('a.input-helper').each(function (idx, el) {
          var dataValue = $(el).data('value');
          var newDataValue = dataValue.replace(/\[\d*\]/, '[' + n + ']');
          $(el).data('value', newDataValue);
          var dataDescription = $(el).data('description');
          var newDataDescription = dataDescription.replace(/\[\d*\]/, '[' + n + ']');
          $(el).data('description', newDataDescription);
          var url = el.href;
          console.log($(newDataValue));
          $(newDataValue).on('change', '', {'url': url, 'description': $(newDataDescription)}, _inputModalOnChange);
        });
        target.data('n', n);
        target.trigger('table-itens.change');
      }
    }
  });
}

function setupMaskCodeFields(el) {
  if (el === undefined) {
    el = document;
  }
  $(el).find('input.mask_money').maskMoney({
    prefix:'R$ ',
    allowNegative: true,
    thousands:'.',
    decimal:',',
    affixesStay: true,
    allowZero: true,
  });
  $(el).find('input.mask_money').maskMoney('mask');
  $(el).find('input.mask_decimal').maskMoney({
    prefix:'',
    allowNegative: true,
    thousands:'.',
    decimal:',',
    affixesStay: true,
    allowZero: true,
  });
  $(el).find('input.mask_decimal').maskMoney('mask');
}

$( "input:text" ).keyup(function(){
    var classe = $(this).attr("class");
    //alert(classe.indexOf("nouppercase"));
    if (classe.indexOf("nouppercase") < 0){
    //if(classe != "nouppercase"){
        $(this).val($(this).val().toUpperCase());
    }
});