(function() {

var SOURCES = window.TEXT_VARIABLES.sources;
function queryString() {
  // This function is anonymous, is executed immediately and
  // the return value is assigned to QueryString!
  var i = 0, queryObj = {}, pair;
  var queryStr = window.location.search.substring(1);
  var queryArr = queryStr.split('&');
  for (i = 0; i < queryArr.length; i++) {
    pair = queryArr[i].split('=');
    // If first entry with this name
    if (typeof queryObj[pair[0]] === 'undefined') {
      queryObj[pair[0]] = pair[1];
      // If second entry with this name
    } else if (typeof queryObj[pair[0]] === 'string') {
      queryObj[pair[0]] = [queryObj[pair[0]], pair[1]];
      // If third or later entry with this name
    } else {
      queryObj[pair[0]].push(pair[1]);
    }
  }
  return queryObj;
}

var setUrlQuery = (function() {
  var baseUrl =  window.location.href.split('?')[0];
  return function(query) {
    if (typeof query === 'string') {
      window.history.replaceState(null, '', baseUrl + query);
    } else {
      window.history.replaceState(null, '', baseUrl);
    }
  };
})();

window.Lazyload.js(SOURCES.jquery, function() {
  var $tags = $('.js-tags');
  var $articleTags = $tags.find('button');
  var $tagShowAll = $tags.find('.tag-button--all');
  var $result = $('.js-result');
  var $sections = $result.find('section');
  var sectionArticles = [];
  var $lastFocusButton = null;
  var sectionTopArticleIndex = [];
  var hasInit = false;

  $sections.each(function() {
    sectionArticles.push($(this).find('.item'));
  });

  function init() {
    var i, index = 0;
    for (i = 0; i < $sections.length; i++) {
      sectionTopArticleIndex.push(index);
      index += $sections.eq(i).find('.item').length;
    }
    sectionTopArticleIndex.push(index);
  }

  function searchButtonsByTag(_tag/*raw tag*/) {
    if (!_tag) {
      return $tagShowAll;
    }
    var _buttons = $articleTags.filter('[data-encode="' + _tag + '"]');
    if (_buttons.length === 0) {
      return $tagShowAll;
    }
    return _buttons;
  }
  function buttonFocus(target) {
    if (target) {
      target.addClass('focus');
      $lastFocusButton && !$lastFocusButton.is(target) && $lastFocusButton.removeClass('focus');
      $lastFocusButton = target;
    }
  }

  function tagSelect (tag/*raw tag*/, target) {
    var result = {}, $articles;
    var i, j, k, _tag;

    for (i = 0; i < sectionArticles.length; i++) {
      $articles = sectionArticles[i];
      for (j = 0; j < $articles.length; j++) {
        if (tag === '' || tag === undefined) {
          result[i] || (result[i] = {});
          result[i][j] = true;
        } else {
          var tags = $articles.eq(j).data('tags').split(',');
          for (k = 0; k < tags.length; k++) {
            if (tags[k] === tag) {
              result[i] || (result[i] = {});
              result[i][j] = true; break;
            }
          }
        }
      }
    }

    for (i = 0; i < sectionArticles.length; i++) {
      result[i] && $sections.eq(i).removeClass('d-none');
      result[i] || $sections.eq(i).addClass('d-none');
      for (j = 0; j < sectionArticles[i].length; j++) {
        if (result[i] && result[i][j]) {
          sectionArticles[i].eq(j).removeClass('d-none');
        } else {
          sectionArticles[i].eq(j).addClass('d-none');
        }
      }
    }

    hasInit || ($result.removeClass('d-none'), hasInit = true);

    if (target) {
      buttonFocus(target);
      _tag = target.attr('data-encode');
      if (_tag === '' || typeof _tag !== 'string') {
        setUrlQuery();
      } else {
        setUrlQuery('?tag=' + _tag);
      }
    } else {
      buttonFocus(searchButtonsByTag(tag));
    }
  }

  var query = queryString(), _tag = query.tag;
  init(); tagSelect(_tag);
  $tags.on('click', 'button', function() {
    tagSelect($(this).data('encode'), $(this));
  });

});

})();