var filterArrayChecked = {
  'color': {},
  'specification': {},
  'size': {},
  'brand': {},
  'range': {}
};

/**
 * createArrayCheckedProperties - Monta um array com os filtros que estão ativos no estado inicial
 *
 * @param  {string} classFilterCheckbox Obrigatório Classe do checkbox do tipo
 * @return {array}                                  Array com os filtros que estão ativos no estado inicial
 */
function createArrayCheckedProperties(classFilterCheckbox) {
  var arrayCheckedProperties = {};

  $('#refine-content .' + classFilterCheckbox + ':checked').each(function() {
    var name = $(this).attr('name'),
        color = $(this).closest('.js-aside-filter-item').find('.squared-color').attr('style');

    arrayCheckedProperties[$(this).val()] = {
      'id': $(this).val(),
      'title': $(this).siblings('.js-checkbox-text').text(),
      'inputName': name.substr(0, name.indexOf('[')), // Remove os [ids]
      'color': (typeof color !== "undefined") ? color : false
    };
  });
  return arrayCheckedProperties;
}

/**
 * filterInterations - Atribui os comportamentos e interações dos checkbox e dos botões de aplicar dos filtros
 *
 * @param  {string} idContainer         Obrigatório Id do container para pegar apenas os checkbox de filtro do tipo (ex.: cor, marca etc) selecionada
 * @param  {string} classFilterCheckbox Obrigatório Classe do checkbox do tipo
 * @param  {string} typeFilterName      Obrigatório Nome que define o tipo do filtro (ex.: filcolor, filmarca etc)
 */
function filterInterations(idContainer, classFilterCheckbox, typeFilterName) {
  if ($('#' + idContainer).length > 0) {
    $('.' + classFilterCheckbox).live('change', function() {
      $(this).closest('#' + idContainer).find('.js-aside-filter-apply-button').removeClass('hidden');
      $('[name="' + $(this).attr('name') + '"]').prop('checked', $(this).prop('checked'));// Espelha os checkbox de filtros da sidebar e do refinar
    });

    $('#' + idContainer + ' .js-aside-filter-apply-button').on('click', function() {
      var property = idContainer.slice(13);
      // Compara as chaves(ids) dos filtros carregados inicialmente (estado inicial), com os filtros modificados.

      if (compareArrays( Object.keys(createArrayCheckedProperties('js-check-' + property)), Object.keys(filterArrayChecked[property]) )) {
        $(this).addClass('hidden');
      } else {
        $(this).find('.btn-default').addClass('btn-loading').prop('disabled', true);
        var dataUrl = $(this).closest('.aside-filter').data('url');
        reloadPageApplyingFilter([getIdFilterSelected(classFilterCheckbox)], [typeFilterName], dataUrl);
      }
    });

    // Limpa o campo de busca do filtro
    $('#' + idContainer + ' .js-aside-filter-clean-search').on('click', function() {
      cleanSearch($(this), idContainer);
    });
    // Filtra os checkbox abaixo do campo de busca
    $('#' + idContainer + ' .js-aside-filter-search').live('keyup', function() {
      searchFilterCheckbox($(this), idContainer);
    });
  }
}

/**
 * getIdFilterSelected - Retorna os ids dos filtros selecionados
 *
 * @param  {string} classFilterCheckbox Obrigatório Classe do checkbox do tipo
 * @return {string}                                 Os ids dos filtros selecionados
 */
function getIdFilterSelected(classFilterCheckbox) {
  var idChecked = '';
  $('#refine-content .' + classFilterCheckbox).each(function() {
    if ($(this).is(':checked')) {
      idChecked += ',' + $(this).val();
    }
  });
  idChecked = idChecked.substring(1); //Remove a primeira virgula / primeiro caracter
  return idChecked;
}

/**
 * getArrayValuesFilterPrice - Retorna os valores preenchido dos inputs iniciais e finais do filtro de preços
 *
 * @param  {int} initial Obrigatório Classe do input do preço inicial
 * @param  {int} laste   Obrigatório Classe do input do preço final
 * @return {array}                   Valores do preço inicial e final
 */
function getArrayValuesFilterPrice(initial, laste) {
  var
  classInitial = $('#refine-content .' + initial),
  classLaste = $('#refine-content .' + laste);

  if ( (classInitial.val() != '') && (classLaste.val() != '') && (parseFloat(classInitial.val().replace(/[.]/g, "").replace(",", ".")) > parseFloat(classLaste.val().replace(/[.]/g, "").replace(",", "."))) ) {
    $('.js-aside-filter-price-error').removeClass('hidden');
    $('.js-aside-filter-price-button').removeClass('btn-loading');
    $('.price_initial, .price_laste').one('keydown', function() {
      $('.js-aside-filter-price-error').addClass('hidden');
    });
  } else {
    return [classInitial.val(), classLaste.val()];
  }
}

/**
 * cleanSearch - Limpa o input de pesquisar filtros
 *
 * @param  {string} searchField Obrigatório Classe do input de pesquisar filtros
 * @param  {string} idContainer Obrigatório Id do container para pegar o input de pesquisar filtros
 */
function cleanSearch(searchField, idContainer) {
  searchField.addClass('hidden').siblings('.js-aside-filter-search').val('');
  $('#' + idContainer + ' .js-aside-filter-item').removeClass('hidden');
}

/**
 * searchFilterCheckbox - Pesquisa as opções de filtros
 *
 * @param  {type} searchField Obrigatório Classe do input de pesquisar filtros
 * @param  {type} idContainer Obrigatório Id do container para pegar o input de pesquisar filtros
 */
function searchFilterCheckbox(searchField, idContainer) {
  var texto = searchField.val(),
      items = searchField.closest('#' + idContainer).find('.js-aside-filter-item'),
      closeIcon = searchField.siblings('.js-aside-filter-clean-search');
  items.removeClass('hidden');
  items.each(function() {
    if($(this).text().toUpperCase().indexOf(texto.toUpperCase()) < 0) {
      $(this).addClass('hidden');
    }
  });
  if (texto.length > 0) {
    closeIcon.removeClass('hidden');
  } else {
    closeIcon.addClass('hidden');
  }
}

/**
 * showButtonPrice - Mostra o botão aplicar do filtro modificado
 */
function showButtonPrice() {
  $('.price_initial, .price_laste').one('keydown', function() {
    $('#aside-filter-price .js-aside-filter-apply-button').removeClass('hidden');
  });
}

/**
 * reloadPageApplyingFilter - Recarrega a página passando os parametros usados como filtro
 *
 * @param  {array} idsFilterCheckeds   Obrigatório Array com os ids selecionados
 * @param  {array} arrayTypeFilterName Obrigatório Array com os nomes que define o tipo do filtro (ex.: filcolor, filmarca etc)
 */
function reloadPageApplyingFilter(idsFilterCheckeds, arrayTypeFilterName, url) {
  var arrayProperties = getGetToJsonObject();
  arrayProperties['route2'] = arrayProperties['route'];
  delete arrayProperties['route'];
  // Subistitui os ids dos filtros iniciais pelos modificados
  for (var i = 0; i < arrayTypeFilterName.length; i++) {
    if (idsFilterCheckeds) {
      if ($.isArray(idsFilterCheckeds) && idsFilterCheckeds[i]) {
        arrayProperties[arrayTypeFilterName[i]] = idsFilterCheckeds[i];
      } else {
        delete arrayProperties[arrayTypeFilterName[i]];
      }
    }
  }

  // Data url é usado devido a url amigavel.
  // Se a url amigavel estiver desativada o 'var data' ficara duplicado, mas esta certo, é o jeitão dele mesmo.
  // Se a url amigavel estiver ativada o 'var data' ficara com a url original concatenada com a url amigavel
  var data = $.param(arrayProperties) + '&' + url; // formata para URL
  $.ajax({ /* Ajax que retorna e retireciona para a url completa do filtro aplicado */
    url: 'index.php?route=product/product/getProductGridLink',
    type: 'GET',
    data: data,
    dataType: 'text',
    contentType: 'text/plain',
    success: function(url) {
      var currentUrl = window.location.href;
      if (url != '' && url != currentUrl) {
        window.location.href = url;
      }
    },
    error: function (xhr, ajaxOptions, thrownError) {
      console.log(xhr.status);
      console.log(thrownError);
    }
  });
}

/**
 * selectedFilters - Monta o html dos filtros selecionados
 */
function selectedFilters() {
  var hasSelectedFilters = false ;
  var html = '';
  html += '<div class="top-padding-small bottom-margin-medium border-gray hidden-overflow text-word-wrap aside-filter cc-sm-bg cc-sm-bd" id="aside-filter-selected">';
    html += '<div class="full-width vertical-padding-small horizontal-padding-medium">';
      html += '<div class="flex between-xs middle-xs">';
        html += '<span class="visible-inline-block text-medium cc-sm-tt"><b>Selecionados</b></span>';
        html += '<span class="text-small cursor-pointer cc-sm-tt js-aside-filter-selected-clean-all">';
          html += '<span>Limpar</span>';
        html += '</span>';
      html += '</div>';
    html += '</div>';
    html += '<hr class="bottom-border-gray top-margin-small cc-sm-bd">';
    html += '<div class="vertical-padding-small horizontal-padding-medium aside-filter-selected-content">';
      for (key in filterArrayChecked) {
        for (filter in filterArrayChecked[key]) {
          if (filterArrayChecked[key][filter]['title'].length > 0) {
            hasSelectedFilters = true;
          }
          html += '<div class="visible-block">';
            html += '<div class="flex between-xs middle-xs rel">';
              html += '<label class="checkbox checkbox-small js-aside-filter-item">';
                html += '<input class="checkbox-entry js-check-selected" type="checkbox" name="' + filterArrayChecked[key][filter]['inputName'] + '[' + filterArrayChecked[key][filter]['id'] + ']" value="' + filterArrayChecked[key][filter]['id'] + '" checked >';
                html += '<span class="checkbox-text js-checkbox-text cc-sm-ck cc-sm-tx">' + filterArrayChecked[key][filter]['title'] + '</span>';
                if (filterArrayChecked[key][filter]['color']) {
                  html += '<div style="position:absolute;top:4px;right:0;' + filterArrayChecked[key][filter]['color'] + '"></div>';
                }
              html += '</label>';
            html += '</div>';
          html += '</div>';
        }
      }
    html += '</div>';
  html += '</div>';
  if (hasSelectedFilters) {
    $('.js-aside-filter-container').prepend(html);
  }
}

$(document).ready(function() {
  if ($('.js-aside-filter-container').length > 0) {
    for (property in filterArrayChecked) {
      filterArrayChecked[property] = createArrayCheckedProperties('js-check-' + property);
      filterInterations('aside-filter-' + property, 'js-check-' + property, 'fil' + property);
    }

    if ($('#aside-filter-price').length > 0) {
      var
      startPriceInitial = $('.price_initial').val(),
      startPriceLaste = $('.price_laste').val();

      showButtonPrice();
      $('.js-aside-filter-price-button').on('click', function() {
        if (startPriceInitial == $('.price_initial').val() && startPriceLaste == $('.price_laste').val()) {
          $('#aside-filter-price .js-aside-filter-apply-button').addClass('hidden');
          showButtonPrice();
        } else {
          $('.js-aside-filter-price-button').addClass('btn-loading');
          var dataUrl = $(this).closest('.aside-filter').data('url');
          reloadPageApplyingFilter(getArrayValuesFilterPrice('price_initial', 'price_laste'), ['price_initial', 'price_laste'], dataUrl);
        }
      });
      $('.price_initial, .price_laste').blur(function() {
        if ($(this).hasClass('price_initial')) {
          $('.price_initial').val($(this).val()); // Deixa os dois inputs.price_initial com o mesmo o valor
        } else {
          $('.price_laste').val($(this).val()); // Deixa os dois inputs.price_laste com o mesmo o valor
        }
      });
    }
    $('.js-aside-filter-selected-clean-all').live('click', function(){
      var dataUrl = $('#data-selected-url').data('selected-url');
      reloadPageApplyingFilter([''], ['filbrand', 'filcolor', 'filsize', 'filspecification', 'filrange'], dataUrl);
    });
    selectedFilters();
    $('.js-check-selected').live('change', function() {
      var
      name = $(this).attr('name'),
      property = name.substr(0, name.indexOf('[')).replace('chk','');
      $('[name="' + name + '"]').prop('checked', false);
      var dataUrl = $('#aside-filter-' + property).data('url');
      reloadPageApplyingFilter([getIdFilterSelected('js-check-' + property)], ['fil' + property], dataUrl);
    });
  } // Final js-aside-filter-container.length
}); // Final document.ready
