MediaWiki:Script/Filter.js : Différence entre versions

Ligne 1 : Ligne 1 :
function handleDropdowns(form) {
+
function hideElement(element) {
 +
  element.classList.add("tabber-noactive");
 +
}
 +
 
 +
 
 +
function showElement(element) {
 +
  element.classList.remove("tabber-noactive");
 +
}
 +
 
 +
 
 +
function removeAccent(str) {
 +
  return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()
 +
}
 +
 
 +
 
 +
function toNormalForm(str) {
 +
    return removeAccent(str).replace(/[^a-zA-Z0-9 ]/g, '');;
 +
}
 +
 
 +
 
 +
function loading() {
 +
 
 +
  var mainContainer = document.getElementById("hide-all");
 +
  var loadingAnimation = document.getElementById("loading-animation");
 +
 
 +
  mainContainer.classList.remove("tabber-noactive");
 +
  loadingAnimation.classList.add("tabber-noactive");
 +
}
 +
 
 +
 
 +
function handleDropdowns(filterInformation) {
 +
 
 +
  var form = filterInformation.form;
 
   var activeButton = null;
 
   var activeButton = null;
  
Ligne 47 : Ligne 79 :
  
  
function isObjectValuesIncludedInFilter(obj, filter) {
+
function filterItems(filterInformation, cardInformation) {
  return Object.keys(filter).every(function(prop) {
+
 
    return obj[prop].split(' ').some(function(val) {
+
  function isObjectValuesIncludedInFilter(parameters, filter) {
      return filter[prop].indexOf(val) !== -1;
+
    return Object.keys(filter).every(function(property) {
 +
      return parameters[property].split(' ').some(function(value) {
 +
        return filter[property].indexOf(value) !== -1;
 +
      });
 
     });
 
     });
   });
+
   }
}
+
 
 +
  function filterByName(parameters, filterName) {
 +
    if (filterName) {
 +
      return parameters.name.indexOf(filterName) !== -1;
 +
    }
 +
    return true;
 +
  }
 +
 
 +
  function isObjectValuesIncludedInFilterWithRange(parameters, filter, rangeFilter, filterName) {
 +
    return isObjectValuesIncludedInFilter(parameters, filter) && filterByName(parameters, filterName) && Object.keys(rangeFilter).every(function(property) {
 +
      var propertyValue = parameters[property];
 +
      return rangeFilter[property].min <= propertyValue && rangeFilter[property].max >= propertyValue;
 +
    });
 +
  }
  
 
+
  var filter = filterInformation.filters.filter;
function isObjectValuesIncludedInFilterWithRange(obj, filter, rangeFilter) {
+
   var rangeFilter = filterInformation.filters.rangeFilter;
   return isObjectValuesIncludedInFilter(obj, filter) && Object.keys(rangeFilter).every(function(prop) {
+
  var filterName = filterInformation.filters.filterName;
    var propValue = Number(obj[prop]);
+
  var listToFilter = cardInformation.listToFilter;
    return rangeFilter[prop]["min"] <= propValue && rangeFilter[prop]["max"] >= propValue;
+
   var cardData = cardInformation.data;
   });
+
 
}
 
 
 
 
 
function filterItems(filter, listToFilter, rangeFilter, dataObject) {
 
 
   for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
 
   for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
 
     var card = listToFilter[cardIndex];
 
     var card = listToFilter[cardIndex];
     if (isObjectValuesIncludedInFilterWithRange(dataObject[cardIndex], filter, rangeFilter)) {
+
    var cardParameters = cardData[cardIndex];
       card.classList.remove("tabber-noactive");
+
     if (isObjectValuesIncludedInFilterWithRange(cardParameters, filter, rangeFilter, filterName)) {
 +
       showElement(card);
 
     } else {
 
     } else {
       card.classList.add("tabber-noactive");
+
       hideElement(card);
 
     }
 
     }
 
   }
 
   }
Ligne 76 : Ligne 121 :
  
  
function createInitialRangeObject(form) {
+
function updateFilterObject(filterInformation, cardInformation) {
 
 
  var initialRange = {}
 
 
 
  form.querySelectorAll('[id$="-range"]').forEach(function(e) {
 
    var minMax = {min: 0, max: 0}
 
    e.querySelectorAll('input').forEach(function(input){
 
      var extrem = input.id.split('-')[1];
 
      minMax[extrem] = Number(input[extrem]);
 
    });
 
    initialRange[e.id.split("-")[0]] = minMax;
 
  });
 
 
 
  return initialRange
 
}
 
  
 +
  function incrementCounter(counterElement, counterValue) {
 +
   
 +
    if (counterValue === 0) {
 +
      showElement(counterElement);
 +
    }
 +
   
 +
    counterElement.textContent = counterValue + 1;
 +
  }
  
function incrementCounter(counter, count) {
+
  function decrementCounter(counterElement, counterValue) {
  if (count === 0) {
+
   
     counter.classList.remove("tabber-noactive");
+
    if (counterValue === 1) {
 +
      hideElement(counterElement);
 +
    }
 +
   
 +
     counterElement.textContent = counterValue - 1;
 
   }
 
   }
   counter.textContent = count + 1;
+
    
}
+
  function updateFilter(event, filterByName = false) {
 
 
 
 
function decrementCounter(counter, count) { 
 
  if (count === 1) {
 
    counter.classList.add("tabber-noactive");
 
  }
 
  counter.textContent = count - 1;
 
}
 
  
 
+
     function handleNumberType(target) {
function updateFilterObject(form, listToFilter, filter, rangeFilter, initialRange, dataObject) {
 
 
 
  form.addEventListener("submit", function(e) {
 
     e.preventDefault();
 
  });
 
 
 
  form.addEventListener("change", function(e) {
 
    var target = e.target;
 
    var value = target.dataset.filter;
 
    var type = target.type;
 
    var grandParent = target.parentElement.parentElement;
 
    var key = grandParent.id;
 
    var counter = grandParent.nextElementSibling;
 
    var count = Number(counter.textContent);
 
 
 
    if (type === "number") {
 
 
        
 
        
       var key = key.split("-range")[0];
+
       var [filterName, extremum] = target.id.split("-");
     
 
      var extremum = target.id.split(key + "-")[1];
 
 
       var currentValue = Number(target.value);
 
       var currentValue = Number(target.value);
 +
      var counterElement = filterInformation.range[filterName].counter;
 +
      var counterValue = Number(counterElement.textContent);
 +
      var initialRange = filterInformation.range[filterName].init;
 +
      var rangeFilter = filterInformation.filters.rangeFilter;
 
        
 
        
       if (rangeFilter[key]) {
+
       if (rangeFilter[filterName]) {
 +
        rangeFilter[filterName][extremum] = currentValue;
 +
      } else {
 +
        var range = {min: initialRange.min, max: initialRange.max};
 
          
 
          
        rangeFilter[key][extremum] = currentValue;
+
         incrementCounter(counterElement, counterValue);
 
 
      } else {
 
         incrementCounter(counter, count);
 
        var range = {"min": initialRange[key]["min"], "max": initialRange[key]["max"]};
 
 
         range[extremum] = currentValue;
 
         range[extremum] = currentValue;
         rangeFilter[key] = range;
+
         rangeFilter[filterName] = range;
 
       }
 
       }
     
+
       if ((rangeFilter[filterName].max === initialRange.max) && (rangeFilter[filterName].min === initialRange.min)) {
       if ((rangeFilter[key]["max"] === initialRange[key]["max"]) && (rangeFilter[key]["min"] === initialRange[key]["min"])) {
+
         decrementCounter(counterElement, counterValue);
         decrementCounter(counter, count);
+
         delete rangeFilter[filterName];
         delete rangeFilter[key];
 
 
       }
 
       }
 +
    }
 +
   
 +
    function handleCheckbox(target) {
 
        
 
        
    } else if (type === "checkbox") {
+
      var filterName = target.id.split("-")[0];
 +
      var filter = filterInformation.filters.filter;
 +
      var filterValue = target.dataset.filter;
 +
      var counterElement = filterInformation.checkbox[filterName].counter;
 +
      var counterValue = Number(counterElement.textContent);
 
        
 
        
 
       if (target.checked) {
 
       if (target.checked) {
       
+
         incrementCounter(counterElement, counterValue);
         incrementCounter(counter, count);
+
         if (filter[filterName]) {
       
+
           filter[filterName].push(filterValue);
         if (filter[key]) {
 
           filter[key].push(value);
 
 
         } else {
 
         } else {
           filter[key] = [value];
+
           filter[filterName] = [filterValue];
 
         }
 
         }
 
       } else {
 
       } else {
       
+
         decrementCounter(counterElement, counterValue);
         decrementCounter(counter, count);
+
         var index = filter[filterName].indexOf(filterValue);
       
 
         var index = filter[key].indexOf(value);
 
 
         if (index !== -1) {
 
         if (index !== -1) {
           if (filter[key].length === 1) {
+
           if (filter[filterName].length === 1) {
             delete filter[key];
+
             delete filter[filterName];
 
           } else {
 
           } else {
             filter[key].splice(index, 1);
+
             filter[filterName].splice(index, 1);
 
           }
 
           }
 
         }
 
         }
       }  
+
       }
 
     }
 
     }
 
    filterItems(filter, listToFilter, rangeFilter, dataObject);
 
  });
 
}
 
 
 
function keyboard(form) {
 
 
 
  var focusableElements = form.querySelectorAll('a[href], button, textarea, input[type="text"], input[type="radio"], input[type="checkbox"], input[type="number"], select');
 
  var buttons = form.querySelectorAll("button");
 
 
 
  form.addEventListener("keydown", function(e) {
 
 
      
 
      
     var target = e.target;
+
     var target = event.target;
 
+
   
     if (target.tagName === "INPUT") {
+
     if (filterByName) {
 +
      filterInformation.filters.filterName = toNormalForm(target.value);
 +
    } else {
 +
      var type = target.type;
 
        
 
        
       if (e.key === "Enter") {
+
       if (type === "number") {
 
+
         handleNumberType(target);
         target.click();
+
      } else if (type === "checkbox") {
          
+
         handleCheckbox(target);
 
       }
 
       }
     
 
    } else if (target.tagName === "BUTTON") {
 
     
 
      if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
 
        var currentElement = document.activeElement;
 
        var currentIndex = Array.prototype.indexOf.call(buttons, currentElement);
 
        var nextIndex = e.key === "ArrowRight" ? (currentIndex + 1) % buttons.length : (currentIndex - 1 + buttons.length) % buttons.length;
 
        buttons[nextIndex].focus();
 
      }
 
     
 
 
     }
 
     }
      
+
     filterItems(filterInformation, cardInformation);
    if (target.type !== "number") {
+
  }
      if (e.key === "ArrowDown" || e.key === "ArrowUp") {
+
 
        var currentElement = document.activeElement;
+
  var form = filterInformation.form;
        var currentIndex = Array.prototype.indexOf.call(focusableElements, currentElement);
+
  var debounceTimer;
        var nextIndex = e.key === "ArrowDown" ? (currentIndex + 1) % focusableElements.length : (currentIndex - 1 + focusableElements.length) % focusableElements.length;
+
 
         focusableElements[nextIndex].focus();
+
  form.addEventListener("submit", function(event) {
       }
+
    event.preventDefault();
 +
  });
 +
 
 +
  form.addEventListener("change", function(event) {
 +
    updateFilter(event);
 +
  });
 +
 
 +
  form.addEventListener("input", function(event) {
 +
    if (event.target.id === "filter-name") {
 +
      clearTimeout(debounceTimer);
 +
      debounceTimer = setTimeout(function() {
 +
         updateFilter(event, true);
 +
       }, 500);
 
     }
 
     }
 
   });
 
   });
Ligne 218 : Ligne 233 :
  
  
function filterWithURL(form, url, listToFilter, dataObject) {
+
function filterInitialization() {
 +
  function createSpan() {
 +
    var span = document.createElement("span");
 +
    span.style.color = '#9F9F9F';
 +
    span.style.fontSize = '12px';
 +
    return span;
 +
  }
 +
 
 +
  var form = document.getElementById("filter-form");
 +
  var filters = { filterName: "", filter: {}, rangeFilter: {} };
 +
  var filterInformation = { form: form, filters: filters, range: {}, checkbox: {} };
 +
  var allButton = form.querySelectorAll("button");
 +
 
 +
  allButton.forEach(function(button) {
 +
    var buttonSibling = button.nextElementSibling;
 +
    if (!buttonSibling) return;
  
  var params = new URLSearchParams(url.search);
+
    var filterName = buttonSibling.id;
  var filter = {}
+
    var counter = buttonSibling.nextElementSibling;
  var initialRange = createInitialRangeObject(form);
+
    if (!filterName || !counter) return;
  var rangeFilter = {}
 
  
  for (var [key, value] of params.entries()) {
+
     var infoType = filterName.endsWith("-range") ? "range" : "checkbox";
   
+
     var filterObj = filterInformation[infoType][filterName.replace("-range", "")] = { counter: counter };
     var input = form.querySelector("[id^='" + key + "'][data-filter='" + value + "']");
 
      
 
    if (input) {
 
      input.checked = true;
 
      filter[key] = params.getAll(key);
 
     
 
    } else {
 
  
       var checkbox = form.querySelector("#" + key);
+
    if (infoType === "checkbox") {
        
+
      filterObj.values = {};
      if (checkbox) {
+
       var allInput = buttonSibling.querySelectorAll("input");
       
+
       allInput.forEach(function(input) {
         var [filterKey, extremum] = key.split("-");
+
         var filterValue = input.dataset.filter;
           
+
         if (!filterValue) return;
         if (rangeFilter[filterKey]) {
 
       
 
          rangeFilter[filterKey][extremum] = Number(value);
 
       
 
        } else {
 
  
          var range = {"min": initialRange[filterKey]["min"], "max": initialRange[filterKey]["max"]};
+
        var span = createSpan();
         
+
        input.parentElement.appendChild(span);
          range[extremum] = Number(value);
+
        filterObj.values[filterValue] = { value: 0, span: span };
          rangeFilter[filterKey] = range;
+
      });
           
+
    } else if (infoType === "range") {
        }
+
      filterObj.init = {}
       
+
      filterObj.init.min = Number(buttonSibling.children[0].firstChild.min);
        checkbox.value = value;
+
       filterObj.init.max = Number(buttonSibling.children[0].firstChild.max);
       }
 
 
     }
 
     }
   }
+
   });
  
   filterItems(filter, listToFilter, rangeFilter, dataObject);
+
   return filterInformation;
 
 
  return [filter, rangeFilter, initialRange]
 
 
}
 
}
  
  
function loading() {
+
function getCardInformation(filterInformation) {
 
    
 
    
   window.addEventListener("load", function() {
+
   var listToFilter = document.getElementById("list-to-filter").children;
 +
  var allCardInformation = [];
 +
  var filterNames = Object.keys(filterInformation.checkbox).concat(Object.keys(filterInformation.range));
 +
 
 +
  for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
 +
    var card = listToFilter[cardIndex];
 +
    var cardInformation = {};
 +
    var cardName = card.querySelector("[data-name]").textContent;
 +
    cardInformation.name = toNormalForm(cardName);
 
      
 
      
     var mainContainer = document.getElementById("hide-all");
+
     if (filterNames.indexOf("e0") !== -1) {
    var loadingAnimation = document.getElementById("loading-animation");
+
      var e0Element = card.querySelector("[data-e0]");
 +
      var [e0Value, e1Value] = e0Element.textContent.slice(1, -1).split(", ");
 +
      cardInformation.e0 = Number(e0Value);
 +
      cardInformation.e1 = removeAccent(e1Value);
 +
    }
 
      
 
      
     mainContainer.classList.remove("tabber-noactive");
+
     if (filterNames.indexOf("e2") !== -1) {
    loadingAnimation.classList.add("tabber-noactive");
+
      var e2Element = card.querySelector("[data-e2]").children;
  });
+
      var e2Value = "";
}
+
      if (e2Element.length) {
 
+
        for (var e2ValueIndex = 0; e2ValueIndex < e2Element.length; e2ValueIndex++) {
 
+
          e2Value += e2Element[e2ValueIndex].title + " ";
function createDataObject(listToFilter) {
+
        }
  var dataObject = []
 
  for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
 
    var item = listToFilter[cardIndex];
 
    var levelData = item.querySelector("[data-e0]");
 
    var [level, rank] = levelData.textContent.slice(1, -1).split(",");
 
    var elementData = item.querySelector("[data-e2]").children;
 
    if (elementData.length) {
 
      var element = "";
 
      for (var elementIndex = 0; elementIndex < elementData.length; elementIndex++) {
 
        element += elementData[elementIndex].title + " ";
 
 
       }
 
       }
     } else {
+
      e2Value = e2Value.trim() || "Aucun";
       var element = "Aucun";
+
      cardInformation.e2 = removeAccent(e2Value);
 +
    }
 +
     
 +
    if (filterNames.indexOf("e3") !== -1) {
 +
      var e3Value = card.querySelector("[data-e3]").textContent.replace(" type", "");
 +
      cardInformation.e3 = removeAccent(e3Value);
 +
     }
 +
     
 +
    if (filterNames.indexOf("e4") !== -1) {
 +
       var e4Value = card.querySelector("[data-e4]").textContent.replace('+ ', '');
 +
      cardInformation.e4 = removeAccent(e4Value);
 
     }
 
     }
    var typeData = item.querySelector("[data-e3]");
+
     
     var type = typeData.textContent.replace("Aucun type", "Aucun");
+
     allCardInformation.push(cardInformation);
    var damageData = item.querySelector("[data-e4]");
 
    var damage = damageData.textContent.replace("DC", "Compétence");
 
    dataObject.push({e0: level, e1: rank, e2: element, e3: type, e4: damage})
 
 
   }
 
   }
   return dataObject
+
  allCardInformation = { listToFilter: listToFilter, data: allCardInformation };
 +
 
 +
   return allCardInformation;
 
}
 
}
  
 
+
   
 
(function(){
 
(function(){
 +
  var filterInformation = filterInitialization();
 +
  var cardInformation = getCardInformation(filterInformation);
 
    
 
    
   var listToFilter = document.getElementById("list-to-filter").children;
+
   handleDropdowns(filterInformation)
  var form = document.getElementById("filter-form");
+
   updateFilterObject(filterInformation, cardInformation);
  var url = new URL(window.location.href);
 
   var dataObject = createDataObject(listToFilter);
 
  var [filter, rangeFilter, initialRange] = filterWithURL(form, url, listToFilter, dataObject);
 
 
 
 
   loading();
 
   loading();
  keyboard(form);
 
  handleDropdowns(form);
 
  updateFilterObject(form, listToFilter, filter, rangeFilter, initialRange, dataObject);
 
 
 
 
})();
 
})();

Version du 28 août 2023 à 22:25

function hideElement(element) {
  element.classList.add("tabber-noactive");
}


function showElement(element) {
  element.classList.remove("tabber-noactive");
}


function removeAccent(str) {
  return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()
}


function toNormalForm(str) {
    return removeAccent(str).replace(/[^a-zA-Z0-9 ]/g, '');;
}


function loading() {
  
  var mainContainer = document.getElementById("hide-all");
  var loadingAnimation = document.getElementById("loading-animation");

  mainContainer.classList.remove("tabber-noactive");
  loadingAnimation.classList.add("tabber-noactive");
}


function handleDropdowns(filterInformation) {
  
  var form = filterInformation.form;
  var activeButton = null;

  function toggleDropdown(button, dropdownMenu) {
    if (button === activeButton) {
      dropdownMenu.classList.add('tabber-noactive');
      activeButton = null;
    } else {
      if (activeButton) {
        activeButton.nextElementSibling.classList.add('tabber-noactive');
      }
      dropdownMenu.classList.remove('tabber-noactive');
      activeButton = button;
    }
  }

  
  function closeDropdowns() {
    if (activeButton) {
      activeButton.nextElementSibling.classList.add('tabber-noactive');
      activeButton = null;
    }
  }

  form.addEventListener('click', function(event) {

    var target = event.target;
    var button = target.closest('button');
    
    if (button) {
      
      var dropdownMenu = button.nextElementSibling;
      
      toggleDropdown(button, dropdownMenu);
      
    } else if (!target.closest('.dropdown-menu')) {
      closeDropdowns();
    }
  });

  document.addEventListener('click', function(event) {
    if (!form.contains(event.target)) {
      closeDropdowns();
    }
  });
}


function filterItems(filterInformation, cardInformation) {

  function isObjectValuesIncludedInFilter(parameters, filter) {
    return Object.keys(filter).every(function(property) {
      return parameters[property].split(' ').some(function(value) {
        return filter[property].indexOf(value) !== -1;
      });
    });
  }
  
  function filterByName(parameters, filterName) {
    if (filterName) {
      return parameters.name.indexOf(filterName) !== -1;
    }
    return true;
  }
  
  function isObjectValuesIncludedInFilterWithRange(parameters, filter, rangeFilter, filterName) {
    return isObjectValuesIncludedInFilter(parameters, filter) && filterByName(parameters, filterName) && Object.keys(rangeFilter).every(function(property) {
      var propertyValue = parameters[property];
      return rangeFilter[property].min <= propertyValue && rangeFilter[property].max >= propertyValue;
    });
  }

  var filter = filterInformation.filters.filter;
  var rangeFilter = filterInformation.filters.rangeFilter;
  var filterName = filterInformation.filters.filterName;
  var listToFilter = cardInformation.listToFilter;
  var cardData = cardInformation.data;
  
  for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
    var card = listToFilter[cardIndex];
    var cardParameters = cardData[cardIndex];
    if (isObjectValuesIncludedInFilterWithRange(cardParameters, filter, rangeFilter, filterName)) {
      showElement(card);
    } else {
      hideElement(card);
    }
  }
}


function updateFilterObject(filterInformation, cardInformation) {

  function incrementCounter(counterElement, counterValue) {
    
    if (counterValue === 0) {
      showElement(counterElement);
    }
    
    counterElement.textContent = counterValue + 1;
  }

  function decrementCounter(counterElement, counterValue) {
    
    if (counterValue === 1) {
      hideElement(counterElement);
    }
    
    counterElement.textContent = counterValue - 1;
  }
  
  function updateFilter(event, filterByName = false) {

    function handleNumberType(target) {
      
      var [filterName, extremum] = target.id.split("-");
      var currentValue = Number(target.value);
      var counterElement = filterInformation.range[filterName].counter;
      var counterValue = Number(counterElement.textContent);
      var initialRange = filterInformation.range[filterName].init;
      var rangeFilter = filterInformation.filters.rangeFilter;
      
      if (rangeFilter[filterName]) {
        rangeFilter[filterName][extremum] = currentValue;
      } else {
        var range = {min: initialRange.min, max: initialRange.max};
        
        incrementCounter(counterElement, counterValue);
        range[extremum] = currentValue;
        rangeFilter[filterName] = range;
      }
      if ((rangeFilter[filterName].max === initialRange.max) && (rangeFilter[filterName].min === initialRange.min)) {
        decrementCounter(counterElement, counterValue);
        delete rangeFilter[filterName];
      }
    }
    
    function handleCheckbox(target) {
      
      var filterName = target.id.split("-")[0];
      var filter = filterInformation.filters.filter;
      var filterValue = target.dataset.filter;
      var counterElement = filterInformation.checkbox[filterName].counter;
      var counterValue = Number(counterElement.textContent);
      
      if (target.checked) {
        incrementCounter(counterElement, counterValue);
        if (filter[filterName]) {
          filter[filterName].push(filterValue);
        } else {
          filter[filterName] = [filterValue];
        }
      } else {
        decrementCounter(counterElement, counterValue);
        var index = filter[filterName].indexOf(filterValue);
        if (index !== -1) {
          if (filter[filterName].length === 1) {
            delete filter[filterName];
          } else {
            filter[filterName].splice(index, 1);
          }
        }
      }
    }
    
    var target = event.target;
    
    if (filterByName) {
      filterInformation.filters.filterName = toNormalForm(target.value);
    } else {
      var type = target.type;
      
      if (type === "number") {
        handleNumberType(target);
      } else if (type === "checkbox") {
        handleCheckbox(target);
      }
    }
    filterItems(filterInformation, cardInformation);
  }
  
  var form = filterInformation.form;
  var debounceTimer;
  
  form.addEventListener("submit", function(event) {
    event.preventDefault();
  });
  
  form.addEventListener("change", function(event) {
    updateFilter(event);
  });
  
  form.addEventListener("input", function(event) {
    if (event.target.id === "filter-name") {
      clearTimeout(debounceTimer);
      debounceTimer = setTimeout(function() {
        updateFilter(event, true);
      }, 500);
    }
  });
}


function filterInitialization() {
  function createSpan() {
    var span = document.createElement("span");
    span.style.color = '#9F9F9F';
    span.style.fontSize = '12px';
    return span;
  }
  
  var form = document.getElementById("filter-form");
  var filters = { filterName: "", filter: {}, rangeFilter: {} };
  var filterInformation = { form: form, filters: filters, range: {}, checkbox: {} };
  var allButton = form.querySelectorAll("button");

  allButton.forEach(function(button) {
    var buttonSibling = button.nextElementSibling;
    if (!buttonSibling) return;

    var filterName = buttonSibling.id;
    var counter = buttonSibling.nextElementSibling;
    if (!filterName || !counter) return;

    var infoType = filterName.endsWith("-range") ? "range" : "checkbox";
    var filterObj = filterInformation[infoType][filterName.replace("-range", "")] = { counter: counter };

    if (infoType === "checkbox") {
      filterObj.values = {};
      var allInput = buttonSibling.querySelectorAll("input");
      allInput.forEach(function(input) {
        var filterValue = input.dataset.filter;
        if (!filterValue) return;

        var span = createSpan();
        input.parentElement.appendChild(span);
        filterObj.values[filterValue] = { value: 0, span: span };
      });
    } else if (infoType === "range") {
      filterObj.init = {}
      filterObj.init.min = Number(buttonSibling.children[0].firstChild.min);
      filterObj.init.max = Number(buttonSibling.children[0].firstChild.max);
    }
  });

  return filterInformation;
}


function getCardInformation(filterInformation) {
  
  var listToFilter = document.getElementById("list-to-filter").children;
  var allCardInformation = [];
  var filterNames = Object.keys(filterInformation.checkbox).concat(Object.keys(filterInformation.range));

  for (var cardIndex = 0; cardIndex < listToFilter.length; cardIndex++) {
    var card = listToFilter[cardIndex];
    var cardInformation = {};
    var cardName = card.querySelector("[data-name]").textContent;
    cardInformation.name = toNormalForm(cardName);
    
    if (filterNames.indexOf("e0") !== -1) {
      var e0Element = card.querySelector("[data-e0]");
      var [e0Value, e1Value] = e0Element.textContent.slice(1, -1).split(", ");
      cardInformation.e0 = Number(e0Value);
      cardInformation.e1 = removeAccent(e1Value);
    }
    
    if (filterNames.indexOf("e2") !== -1) {
      var e2Element = card.querySelector("[data-e2]").children;
      var e2Value = "";
      if (e2Element.length) {
        for (var e2ValueIndex = 0; e2ValueIndex < e2Element.length; e2ValueIndex++) {
          e2Value += e2Element[e2ValueIndex].title + " ";
        }
      }
      e2Value = e2Value.trim() || "Aucun";
      cardInformation.e2 = removeAccent(e2Value);
    }
      
    if (filterNames.indexOf("e3") !== -1) {
      var e3Value = card.querySelector("[data-e3]").textContent.replace(" type", "");
      cardInformation.e3 = removeAccent(e3Value);
    }
      
    if (filterNames.indexOf("e4") !== -1) {
      var e4Value = card.querySelector("[data-e4]").textContent.replace('+ ', '');
      cardInformation.e4 = removeAccent(e4Value);
    }
      
    allCardInformation.push(cardInformation);
  }
  allCardInformation = { listToFilter: listToFilter, data: allCardInformation };
  
  return allCardInformation;
}

    
(function(){
  var filterInformation = filterInitialization();
  var cardInformation = getCardInformation(filterInformation);
  
  handleDropdowns(filterInformation)
  updateFilterObject(filterInformation, cardInformation);
  loading();
})();