/**
 * 2007-2016 PrestaShop
 *
 * thirty bees is an extension to the PrestaShop e-commerce software developed by PrestaShop SA
 * Copyright (C) 2017-2024 thirty bees
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@thirtybees.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to https://www.thirtybees.com for more information.
 *
 * @author    thirty bees <contact@thirtybees.com>
 * @author    PrestaShop SA <contact@prestashop.com>
 * @copyright 2017-2024 thirty bees
 * @copyright 2007-2016 PrestaShop SA
 * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 *  PrestaShop is an internationally registered trademark & property of PrestaShop SA
 */

var ajax_running_timeout = null;

if (!id_language) {
  var id_language = Number(1);
}

function str2url(str, encoding, ucfirst) {
  str = str.toUpperCase();
  str = str.toLowerCase();
  if (PS_ALLOW_ACCENTED_CHARS_URL) {
    str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]\\u00A1-\\uFFFF/g, '');
  } else {
    // Lowercase
    str = str.replace(/[\u00E0\u00E1\u00E2\u00E3\u00E5\u0101\u0103\u0105\u0430]/g, 'a');
    str = str.replace(/[\u0431]/g, 'b');
    str = str.replace(/[\u00E7\u0107\u0109\u010D\u0446]/g, 'c');
    str = str.replace(/[\u010F\u0111\u0434]/g, 'd');
    str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u0113\u0115\u0117\u0119\u011B\u0435\u044D]/g, 'e');
    str = str.replace(/[\u0444]/g, 'f');
    str = str.replace(/[\u011F\u0121\u0123\u0433\u0491]/g, 'g');
    str = str.replace(/[\u0125\u0127]/g, 'h');
    str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u0129\u012B\u012D\u012F\u0131\u0438\u0456]/g, 'i');
    str = str.replace(/[\u0135\u0439]/g, 'j');
    str = str.replace(/[\u0137\u0138\u043A]/g, 'k');
    str = str.replace(/[\u013A\u013C\u013E\u0140\u0142\u043B]/g, 'l');
    str = str.replace(/[\u043C]/g, 'm');
    str = str.replace(/[\u00F1\u0144\u0146\u0148\u0149\u014B\u043D]/g, 'n');
    str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F8\u014D\u014F\u0151\u043E]/g, 'o');
    str = str.replace(/[\u043F]/g, 'p');
    str = str.replace(/[\u0155\u0157\u0159\u0440]/g, 'r');
    str = str.replace(/[\u015B\u015D\u015F\u0161\u0441]/g, 's');
    str = str.replace(/[\u00DF]/g, 'ss');
    str = str.replace(/[\u0163\u0165\u0167\u0442]/g, 't');
    str = str.replace(/[\u00F9\u00FA\u00FB\u0169\u016B\u016D\u016F\u0171\u0173\u0443]/g, 'u');
    str = str.replace(/[\u0432]/g, 'v');
    str = str.replace(/[\u0175]/g, 'w');
    str = str.replace(/[\u00FF\u0177\u00FD\u044B]/g, 'y');
    str = str.replace(/[\u017A\u017C\u017E\u0437]/g, 'z');
    str = str.replace(/[\u00E4\u00E6]/g, 'ae');
    str = str.replace(/[\u0447]/g, 'ch');
    str = str.replace(/[\u0445]/g, 'kh');
    str = str.replace(/[\u0153\u00F6]/g, 'oe');
    str = str.replace(/[\u00FC]/g, 'ue');
    str = str.replace(/[\u0448]/g, 'sh');
    str = str.replace(/[\u0449]/g, 'ssh');
    str = str.replace(/[\u044F]/g, 'ya');
    str = str.replace(/[\u0454]/g, 'ye');
    str = str.replace(/[\u0457]/g, 'yi');
    str = str.replace(/[\u0451]/g, 'yo');
    str = str.replace(/[\u044E]/g, 'yu');
    str = str.replace(/[\u0436]/g, 'zh');

    // Uppercase
    str = str.replace(/[\u0100\u0102\u0104\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u0410]/g, 'A');
    str = str.replace(/[\u0411]/g, 'B');
    str = str.replace(/[\u00C7\u0106\u0108\u010A\u010C\u0426]/g, 'C');
    str = str.replace(/[\u010E\u0110\u0414]/g, 'D');
    str = str.replace(/[\u00C8\u00C9\u00CA\u00CB\u0112\u0114\u0116\u0118\u011A\u0415\u042D]/g, 'E');
    str = str.replace(/[\u0424]/g, 'F');
    str = str.replace(/[\u011C\u011E\u0120\u0122\u0413\u0490]/g, 'G');
    str = str.replace(/[\u0124\u0126]/g, 'H');
    str = str.replace(/[\u0128\u012A\u012C\u012E\u0130\u0418\u0406]/g, 'I');
    str = str.replace(/[\u0134\u0419]/g, 'J');
    str = str.replace(/[\u0136\u041A]/g, 'K');
    str = str.replace(/[\u0139\u013B\u013D\u0139\u0141\u041B]/g, 'L');
    str = str.replace(/[\u041C]/g, 'M');
    str = str.replace(/[\u00D1\u0143\u0145\u0147\u014A\u041D]/g, 'N');
    str = str.replace(/[\u00D3\u014C\u014E\u0150\u041E]/g, 'O');
    str = str.replace(/[\u041F]/g, 'P');
    str = str.replace(/[\u0154\u0156\u0158\u0420]/g, 'R');
    str = str.replace(/[\u015A\u015C\u015E\u0160\u0421]/g, 'S');
    str = str.replace(/[\u0162\u0164\u0166\u0422]/g, 'T');
    str = str.replace(/[\u00D9\u00DA\u00DB\u0168\u016A\u016C\u016E\u0170\u0172\u0423]/g, 'U');
    str = str.replace(/[\u0412]/g, 'V');
    str = str.replace(/[\u0174]/g, 'W');
    str = str.replace(/[\u0176\u042B]/g, 'Y');
    str = str.replace(/[\u0179\u017B\u017D\u0417]/g, 'Z');
    str = str.replace(/[\u00C4\u00C6]/g, 'AE');
    str = str.replace(/[\u0427]/g, 'CH');
    str = str.replace(/[\u0425]/g, 'KH');
    str = str.replace(/[\u0152\u00D6]/g, 'OE');
    str = str.replace(/[\u00DC]/g, 'UE');
    str = str.replace(/[\u0428]/g, 'SH');
    str = str.replace(/[\u0429]/g, 'SHH');
    str = str.replace(/[\u042F]/g, 'YA');
    str = str.replace(/[\u0404]/g, 'YE');
    str = str.replace(/[\u0407]/g, 'YI');
    str = str.replace(/[\u0401]/g, 'YO');
    str = str.replace(/[\u042E]/g, 'YU');
    str = str.replace(/[\u0416]/g, 'ZH');

    str = str.toLowerCase();

    str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g, '');
  }
  str = str.replace(/[\u0028\u0029\u0021\u003F\u002E\u0026\u005E\u007E\u002B\u002A\u002F\u003A\u003B\u003C\u003D\u003E]/g, '');
  str = str.replace(/[\s\'\:\/\[\]-]+/g, ' ');

  // Add special char not used for url rewrite
  str = str.replace(/[ ]/g, '-');
  str = str.replace(/[\/\\"'|,;%]*/g, '');

  if (ucfirst) {
    var first_char = str.charAt(0);
    str = first_char.toUpperCase() + str.slice(1);
  }

  return str;
}

function copy2friendlyURL() {
  if (typeof($('#link_rewrite_' + id_language).val()) == 'undefined') {
    return;
  }
  if (typeof(id_product) == 'undefined') {
    id_product = false;
  }

  //check if user didn't type anything in rewrite field, to prevent overwriting
  if (ps_force_friendly_product || !$('#link_rewrite_' + id_language).val().length || !id_product) {
    const friendlyUrl = getFriendlyUrlFromName(getProductName(id_language));
    $('#link_rewrite_' + id_language).val(friendlyUrl);
    if ($('#friendly-url')) {
      $('#friendly-url').html(friendlyUrl);
    }
    // trigger onchange event to use anything binded there
    $('#link_rewrite_' + id_language).change();
  }

  if (!$('#meta_title_' + id_language).val().length || !id_product) {
    updateMetaTitleByName();
  }
}

function copyMeta2friendlyURL() {
  if (!$('input[name="id_cms"]').length) {
    $('#link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val().replace(/^[0-9]+\./, ''), 'UTF-8'));
  }
}

function updateCurrentText() {
  $('#current_product').html(getProductName(id_language));
}

function updateFriendlyURLByName() {
  var friendlyUrl = getFriendlyUrlFromName(getProductName(id_language));
  $('#link_rewrite_' + id_language).val(friendlyUrl);
  updateFriendlyURL();
}

function updateMetaTitleByName() {
  const productName = getProductName(id_language);
  const element = $('#meta_title_' + id_language);
  const val = productName.substr(0, 128);
  element.val(val);
  const counter = $('#meta_title_' + id_language + '_counter');
  counter.text(element.attr("data-maxchar") - val.length);
}

function updateMetaDescription() {
  const descriptionHtml = $('#description_short_' + id_language).val();
  const tempDivElement = document.createElement("div");
  tempDivElement.innerHTML = descriptionHtml;
  const descriptionTxt = tempDivElement.textContent || tempDivElement.innerText;
  const element = $('#meta_description_' + id_language);
  const val = descriptionTxt.trim().substr(0, 255);
  element.val(val);
  element.trigger('autosize.resize');
  const counter = $('#meta_description_' +id_language + '_counter');
  counter.text(element.attr("data-maxchar") - val.length);
}

function getFriendlyUrlFromName(name) {
  return str2url(name.replace(/^[0-9]+\./, '').replace('%', ''), 'UTF-8');
}

function getProductName(languageId) {
  return $.trim($('#name_' + languageId).val());
}

function updateFriendlyURL() {
  $('#friendly-url_' + id_language).text(str2url($('#link_rewrite_' + id_language).val(), 'UTF-8'));
}

function updateLinkRewrite() {
  $('#name_' + id_language).val($.trim($('#name_' + id_language).val()));
  $('#link_rewrite_' + id_language).val(str2url($.trim($('#link_rewrite_' + id_language).val()), 'UTF-8'));
  updateFriendlyURL();
}

function toggleLanguageFlags(elt) {
  $(elt).parents('.displayed_flag').siblings('.language_flags').toggle();
}

// Kept for retrocompatibility only (out of AdminProducts & AdminCategories)
function changeLanguage(field, fieldsString, id_language_new, iso_code) {
  $('div[id^=' + field + '_]').hide();
  var fields = fieldsString.split('¤');
  for (var i = 0; i < fields.length; ++i) {
    $('div[id^=' + fields[i] + '_]').hide();
    $('#' + fields[i] + '_' + id_language_new).show();
    $('#' + 'language_current_' + fields[i]).attr('src', '../img/l/' + id_language_new + '.jpg');
  }
  $('#languages_' + field).hide();
  id_language = id_language_new;
}

// kept for retrocompatibility - you should use hideOtherLanguage(id) since 1.6
function changeFormLanguage(id_language_new, iso_code, employee_cookie) {
  $('.translatable').each(function () {
    $(this).find('.lang_' + id_language_new)
      .show()
      .siblings('div:not(.displayed_flag):not(.clear)').hide();
    $(this).find('.language_current').attr('src', '../img/l/' + id_language_new + '.jpg');
  });

  // For multishop checkboxes
  $('.multishop_lang_' + id_language_new).show().siblings('div[class^=\'multishop_lang_\']').hide();
  id_language = id_language_new;
  changeEmployeeLanguage();
  updateCurrentText();
}

function displayFlags(languages, defaultLanguageID, employee_cookie) {
  if ($('.translatable')) {
    $('.translatable').each(function () {
      if (!$(this).find('.displayed_flag').length > 0) {
        $.each(languages, function (key, language) {
          if (language['id_lang'] == defaultLanguageID) {
            defaultLanguage = language;
            return false;
          }
        });
        var displayFlags = $('<div></div>')
          .addClass('displayed_flag')
          .append($('<img>')
            .addClass('language_current')
            .addClass('pointer')
            .attr('src', '../img/l/' + defaultLanguage['id_lang'] + '.jpg')
            .attr('alt', defaultLanguage['name'])
            .click(function () {
              toggleLanguageFlags(this);
            })
          );
        var languagesFlags = $('<div></div>')
          .addClass('language_flags')
          .html(choose_language_translate + ':<br /><br />');
        $.each(languages, function (key, language) {
          var img = $('<img>')
            .addClass('pointer')
            .css('margin', '2px 2px')
            .attr('src', '../img/l/' + language['id_lang'] + '.jpg')
            .attr('alt', language['name'])
            .click(function () {
              changeFormLanguage(language['id_lang'], language['iso_code'], employee_cookie);
            });
          languagesFlags.append(img);
        });
        if ($(this).find('p:last-child').hasClass('clear')) {
          $(this).find('p:last-child').before(displayFlags).before(languagesFlags);
        } else {
          $(this).append(displayFlags).append(languagesFlags);
        }
      }
    });
  }
}

function checkAll(pForm) {
  for (i = 0, n = pForm.elements.length; i < n; i++) {
    var objName = pForm.elements[i].name;
    var objType = pForm.elements[i].type;
    if (objType == 'checkbox' && objName != 'checkme') {
      box = eval(pForm.elements[i]);
      box.checked = !box.checked;
    }
  }
}

function checkDelBoxes(pForm, boxName, parent) {
  for (i = 0; i < pForm.elements.length; i++) {
    if (pForm.elements[i].name == boxName) {
      pForm.elements[i].checked = parent;
    }
  }
}

function checkPaymentBoxes(name, module) {
  setPaymentBoxes(name, module);
  current = $('input#checkedBox_' + name + '_' + module + '[type=hidden]');
  $('form#form_' + name + ' input[type=checkbox]').each(
    function () {
      if ($(this).attr('name') == module + '_' + name + '[]') {
        $(this).attr("checked", ((current.val() == 'checked') ? true : false));
      }
    }
  );
  current.val() == 'checked' ? current.val('unchecked') : current.val('checked');
}

function setPaymentBoxes(name, module) {
  current = $('input#checkedBox_' + name + '_' + module + '[type=hidden]');
  total = 0;
  checked = 0;
  $('form#form_' + name + ' input[type=checkbox]').each(
    function () {
      if ($(this).attr('name') == module + '_' + name + '[]') {
        ($(this).attr("checked") ? checked++ : '');
        total++;
      }
    }
  );
  (checked == total) ? current.val('unchecked') : current.val('checked');
}

function getE(name) {
  if (document.getElementById) {
    var elem = document.getElementById(name);
  } else if (document.all) {
    var elem = document.all[name];
  } else if (document.layers) {
    var elem = document.layers[name];
  }
  return elem;
}

function formSubmit(e, button) {
  var key;

  key = window.event ? window.event.keyCode : e.which;
  if (key == 13) {
    getE(button).focus();
    getE(button).click();
    e.preventDefault();
  }
}

/* Code generator for Affiliation and vouchers */
function gencode(size) {
  getE('code').value = '';
  /* There are no O/0 in the codes in order to avoid confusion */
  var chars = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";
  for (var i = 1; i <= size; ++i) {
    getE('code').value += chars.charAt(Math.floor(Math.random() * chars.length));
  }
}

var tpl_viewing_window = null;
function viewTemplates(id_select, lang, ext) {
  var loc = $(id_select).val();
  if (loc != 0) {
    if (tpl_viewing_window != null && !tpl_viewing_window.closed) {
      tpl_viewing_window.close();
    }
    var url_preview = $("option[value=" + loc + "]", id_select).data('preview');
    tpl_viewing_window = window.open(url_preview + lang + loc + ext, 'tpl_viewing', 'toolbar=0,location=0,directories=0,statfr=no,menubar=0,scrollbars=yes,resizable=yes,width=520,height=400,top=50,left=300');
    tpl_viewing_window.focus();
  }
}

function orderDeleteProduct(txtConfirm, txtExplain) {
  ret = true;
  $('table#cancelProducts input[type=checkbox]:checked').each(
    function () {
      totalCancel = parseInt($(this).parent().parent().find('td.cancelQuantity input[type=text]').val());
      totalQty = parseInt($(this).parent().find('input#totalQty[type=hidden]').val());
      totalQtyReturn = parseInt($(this).parent().find('input#totalQtyReturn[type=hidden]').val());
      productName = $(this).parent().find('input#productName[type=hidden]').val();
      totalAvailable = totalQty - totalQtyReturn;
      if (totalCancel > totalAvailable) {
        jAlert(txtConfirm + ' : \'' + ' ' + productName + '\' ! \n\n' + txtExplain + ' (' + totalCancel + ' > ' + totalAvailable + ')' + '\n ');
        ret = false;
      }
    }
  );
  return ret;
}

function selectCheckbox(obj) {
  $(obj).parent().parent().find('td.cancelCheck input[type=checkbox]').attr("checked", true);
}

function toggleShippingCost() {
  generateDiscount = $('#generateDiscount').attr("checked");
  generateCreditSlip = $('#generateCreditSlip').attr("checked");
  if (generateDiscount != 'checked' && generateCreditSlip != 'checked') {
    $('#spanShippingBack input[type=checkbox]').attr("checked", false);
    $('#spanShippingBack').css('display', 'none');
  }
  else {
    $('#spanShippingBack').css('display', 'block');
  }
}

function orderOverwriteMessage(sl, text) {
  var $zone = $('#txt_msg');
  var sl_value = sl.options[sl.selectedIndex].value;

  if (sl_value != '0') {
    if ($zone.val().length > 0 && !confirm(text)) {
      return;
    }
    $zone.val(sl_value);
  }

  $zone.trigger('autosize.resize');
}

function setCancelQuantity(itself, id_order_detail, quantity) {
  $('#cancelQuantity_' + id_order_detail).val($(itself).prop('checked') ? quantity : '');
}

function stockManagementActivationAuthorization() {
  if (getE('PS_STOCK_MANAGEMENT_on').checked) {
    getE('PS_ORDER_OUT_OF_STOCK_on').disabled = false;
    getE('PS_ORDER_OUT_OF_STOCK_off').disabled = false;
    getE('PS_DISPLAY_QTIES_on').disabled = false;
    getE('PS_DISPLAY_QTIES_off').disabled = false;
    getE('PS_ADVANCED_STOCK_MANAGEMENT_on').disabled = false;
    getE('PS_ADVANCED_STOCK_MANAGEMENT_off').disabled = false;
  }
  else {
    getE('PS_DISPLAY_QTIES_off').checked = true;
    getE('PS_DISPLAY_QTIES_on').disabled = 'disabled';
    getE('PS_DISPLAY_QTIES_off').disabled = 'disabled';
    getE('PS_ORDER_OUT_OF_STOCK_on').checked = true;
    getE('PS_ORDER_OUT_OF_STOCK_on').disabled = 'disabled';
    getE('PS_ORDER_OUT_OF_STOCK_off').disabled = 'disabled';
    getE('PS_ADVANCED_STOCK_MANAGEMENT_off').checked = true;
    getE('PS_ADVANCED_STOCK_MANAGEMENT_on').disabled = 'disabled';
    getE('PS_ADVANCED_STOCK_MANAGEMENT_off').disabled = 'disabled';
    getE('PS_FORCE_ASM_NEW_PRODUCT_off').checked = true;
    getE('PS_FORCE_ASM_NEW_PRODUCT_on').disabled = 'disabled';
    getE('PS_FORCE_ASM_NEW_PRODUCT_off').disabled = 'disabled';
    getE('PS_DEFAULT_WAREHOUSE_NEW_PRODUCT').disabled = 'disabled';
  }
}

function advancedStockManagementActivationAuthorization() {
  if (getE('PS_ADVANCED_STOCK_MANAGEMENT_on').checked) {
    getE('PS_FORCE_ASM_NEW_PRODUCT_on').disabled = false;
    getE('PS_FORCE_ASM_NEW_PRODUCT_off').disabled = false;
    getE('PS_DEFAULT_WAREHOUSE_NEW_PRODUCT').disabled = false;
  }
  else {
    getE('PS_FORCE_ASM_NEW_PRODUCT_off').checked = true;
    getE('PS_FORCE_ASM_NEW_PRODUCT_on').disabled = 'disabled';
    getE('PS_FORCE_ASM_NEW_PRODUCT_off').disabled = 'disabled';
    getE('PS_DEFAULT_WAREHOUSE_NEW_PRODUCT').disabled = 'disabled';
  }
}

function hookCheckboxes(id, opt, champ) {
  if (opt == 1 && champ.checked == false) {
    $('#Ghook' + id).attr('checked', false);
  } else if (opt == 0) {
    if (champ.checked) {
      $('.hook' + id).attr('checked', "checked");
    } else {
      $('.hook' + id).attr('checked', false);
    }
  }
}

function changeCMSActivationAuthorization() {
  if (getE('PS_CONDITIONS_on').checked) {
    getE('PS_CONDITIONS_CMS_ID').disabled = false;
  } else {
    getE('PS_CONDITIONS_CMS_ID').disabled = 'disabled';
  }
}

function disableZipFormat() {
  if ($('#need_zip_code_on').prop('checked') == false) {
    $('.zip_code_format').hide();
    $('#zip_code_format').val('');
  }
  else {
    $('.zip_code_format').show();
  }
}

function disableTAASC() {
  if ($('#iso_code').val() == 'US') {
    $('#TAASC').show();
  } else {
    $('#TAASC').hide();
  }
}

function spreadFees(id_range) {
  newVal = $('#fees_all_' + id_range).val().replace(/,/g, '.');
  $('.fees_' + id_range).val(newVal);
}

function clearAllFees(id_range) {
  $('#fees_all_' + id_range).val('');
}

function toggleDraftWarning(show) {
  if (show) {
    $('.draft').hide();
  } else {
    $('.draft').show();
  }
}

function showRedirectProductOptions(show) {
  if (show) {
    $('.redirect_product_options').fadeIn();
  } else {
    $('.redirect_product_options').fadeOut();
  }

  redirectSelectChange();
}

function redirectSelectChange() {
  if ($('#redirect_type :selected').val() == '404') {
    showRedirectProductSelectOptions(false);
  } else {
    showRedirectProductSelectOptions(true);
  }
}

function addRelatedProduct(id_product_to_add, product_name) {
  if (!id_product_to_add || id_product == id_product_to_add) {
    return;
  }
  $('#related_product_name').html(product_name);
  $('input[name=id_product_redirected]').val(id_product_to_add);
  $('#related_product_autocomplete_input').parent().hide();
  $('#related_product_remove').show();
}

function removeRelatedProduct() {
  $('#related_product_name').html(no_related_product);
  $('input[name=id_product_redirected]').val(0);
  $('#related_product_remove').hide();
  $('#related_product_autocomplete_input').parent().fadeIn();
}

function showRedirectProductSelectOptions(show) {
  if (show) {
    $('.redirect_product_options_product_choise').show();
  } else {
    $('.redirect_product_options_product_choise').hide();
    removeRelatedProduct();
  }

}

function showOptions(show) {
  if (show) {
    $('tr#product_options').show();
  } else {
    $('tr#product_options').hide();
  }
}

function submitAddProductAndPreview() {
  $('#fakeSubmitAddProductAndPreview').attr('name', 'submitAddProductAndPreview');
  $('#product_form').submit();
}

function submitAddcmsAndPreview() {
  $('#previewSubmitAddcmsAndPreview').attr('name', 'submitAddcmsAndPreview');
  $('#cms').submit();
}

function checkAllMultishopDefaultValue(item) {
  $(item).parent().find('input[name^=\'multishopOverrideOption\']').each(function (k, v) {
    $(v).attr('checked', item.checked);
    var name = $(v).attr('name');
    checkMultishopDefaultValue(v, name.substr(24, name.length - 25));
  })
}

function checkMultishopDefaultValue(obj, key) {
  if (!$(obj).prop('checked') || $('#' + key).hasClass('isInvisible')) {
    $('#conf_id_' + key + ' input, #conf_id_' + key + ' textarea, #conf_id_' + key + ' select, #conf_id_' + key + ' button').prop('disabled', true);
    $('#conf_id_' + key + ' label.conf_title').addClass('isDisabled');
    $(obj).prop('disabled', false);
  }
  else {
    $('#conf_id_' + key + ' input, #conf_id_' + key + ' textarea, #conf_id_' + key + ' select, #conf_id_' + key + ' button').prop('disabled', false);
    $('#conf_id_' + key + ' label.conf_title').removeClass('isDisabled');
  }
  $('#conf_id_' + key + ' .preference_default_multishop input').prop('disabled', false);
}

function toggleAllMultishopDefaultValue($container, value) {
  $container.find('input[name^=\'multishopOverrideOption\']').each(function (k, v) {
    $(v).attr('checked', value);
    var name = $(v).attr('name');
    toggleMultishopDefaultValue(v, name.substr(24, name.length - 25));
  })
}

function toggleMultishopDefaultValue(obj, key) {
  if (!$(obj).prop('checked') || $('#' + key).hasClass('isInvisible')) {
    $('#conf_id_' + key + ' input, #conf_id_' + key + ' textarea, #conf_id_' + key + ' select, #conf_id_' + key + ' button').attr('disabled', true);
    $('#conf_id_' + key + ' label.conf_title').addClass('isDisabled');
  }
  else {
    $('#conf_id_' + key + ' input, #conf_id_' + key + ' textarea, #conf_id_' + key + ' select, #conf_id_' + key + ' button').attr('disabled', false);
    $('#conf_id_' + key + ' label.conf_title').removeClass('isDisabled');
  }
  $('#conf_id_' + key + ' input[name^=\'multishopOverrideOption\']').attr('disabled', false);
}

function doAdminAjax(data, success_func, error_func) {
  $.ajax(
    {
      url: 'index.php',
      data: data,
      type: 'POST',
      success: function (data) {
        if (success_func) {
          return success_func(data);
        }

        data = $.parseJSON(data);
        if (data.confirmations.length != 0) {
          showSuccessMessage(data.confirmations);
        } else {
          showErrorMessage(data.error);
        }
      },
      error: function (data) {
        if (error_func) {
          return error_func(data);
        }

        alert("[TECHNICAL ERROR]");
      }
    });
}

//display a success/error/notice message
function showSuccessMessage(msg) {
  $.growl.notice({ title: "", message: msg });
}

function showErrorMessage(msg) {
  $.growl.error({ title: "", message: msg });
}

function showNoticeMessage(msg) {
  $.growl.notice({ title: "", message: msg });
}

$(document).ready(function () {
  if (typeof helper_tabs != 'undefined' && typeof unique_field_id != 'undefined') {
    $.each(helper_tabs, function (index) {
      $('#' + unique_field_id + 'fieldset_' + index + ' .form-wrapper').prepend('<div class="tab-content panel" />');
      $('#' + unique_field_id + 'fieldset_' + index + ' .form-wrapper').prepend('<ul class="nav nav-tabs" />');
      $.each(helper_tabs[index], function (key, value) {
        // Move every form-group into the correct .tab-content > .tab-pane
        $('#' + unique_field_id + 'fieldset_' + index + ' .tab-content').append('<div id="' + key + '" class="tab-pane" />');
        var elemts = $('#' + unique_field_id + 'fieldset_' + index).find("[data-tab-id='" + key + "']");
        $(elemts).appendTo('#' + key);
        // Add the item to the .nav-tabs
        if (elemts.length != 0) {
          $('#' + unique_field_id + 'fieldset_' + index + ' .nav-tabs').append('<li><a href="#' + key + '" data-toggle="tab">' + value + '</a></li>');
        }
      });
      // Activate the first tab
      $('#' + unique_field_id + 'fieldset_' + index + ' .tab-content div').first().addClass('active');
      $('#' + unique_field_id + 'fieldset_' + index + ' .nav-tabs li').first().addClass('active');
    });
  }

  if (typeof formToMove != 'undefined' && typeof formDestination != 'undefined') {
    $('<hr style="margin 24px 0;" />').appendTo('#' + formDestination)
    $('#theme_fieldset_' + formToMove + ' .form-wrapper').appendTo('#' + formDestination);
  }

  $('select.chosen').each(function (k, item) {
    $(item).chosen({ disable_search_threshold: 10, search_contains: true });
  });
  // Apply chosen() when modal is loaded
  $(document).on('shown.bs.modal', function (e) {
    $('select.chosen-modal').chosen();
  })

  $('.isInvisible input, .isInvisible select, .isInvisible textarea').attr('disabled', true);
  $('.isInvisible label.conf_title').addClass('isDisabled');

  // Disable options fields for each row with a multishop default checkbox
  $('.preference_default_multishop input[type=checkbox]').each(function (k, v) {
    var key = $(v).attr('name');
    var len = key.length;
    checkMultishopDefaultValue(v, key.substr(24, len - 25));
  });

  $('input[name^=\'multishopOverrideOption\']').each(function (k, v) {
    var key = $(v).attr('name');
    var len = key.length;
    toggleMultishopDefaultValue(v, key.substr(24, len - 25));
  });

  $(document).on('keyup change', '.copy2friendlyUrl', function (e) {
    if (!isArrowKey(e)) {
      return copy2friendlyURL();
    }
  });

  // on live will make this binded for dynamic content
  $(document).on('keyup change', '.updateCurrentText', function (e) {
    if (typeof e == KeyboardEvent) {
      if (isArrowKey(e)) {
        return;
      }
    }

    updateCurrentText();
  });

  $(document).on('keyup change', '.copyMeta2friendlyURL', function (e) {
    if (!isArrowKey(e)) {
      return copyMeta2friendlyURL()
    }
  });

  $('#ajax_running').ajaxStart(function () {
    ajax_running_timeout = setTimeout(function () {
      showAjaxOverlay()
    }, 1000);
  });

  $('#ajax_running').ajaxStop(function () {
    var element = $(this)
    setTimeout(function () {
      element.hide()
    }, 1000);
    clearTimeout(ajax_running_timeout);
  });

  $('#ajax_running').ajaxError(function () {
    var element = $(this)
    setTimeout(function () {
      element.hide()
    }, 1000);
    clearTimeout(ajax_running_timeout);
  });

  var message = $('.toolbarHead');
  var view = $(window);

  // bind only if message exists. placeholder will be its parent
  view.bind("scroll resize", function (e) {
    message.each(function (el) {
      if (message.length) {
        placeholder = $(this).parent();
        if (e.type == 'resize') {
          $(this).css('width', $(this).parent().width());
        }

        placeholderTop = placeholder.offset().top;
        var viewTop = view.scrollTop() + 15;
        // here we force the toolbar to be "not fixed" when
        // the height of the window is really small (toolbar hiding the page is not cool)
        window_is_more_than_twice_the_toolbar = view.height() > message.parent().height() * 2;
        if (!$(this).hasClass("fix-toolbar") && (window_is_more_than_twice_the_toolbar && (viewTop > placeholderTop))) {
          $(this).css('width', $(this).width());
          // fixing parent height will prevent that annoying "pagequake" thing
          // the order is important : this has to be set before adding class fix-toolbar
          $(this).parent().css('height', $(this).parent().height());
          $(this).addClass("fix-toolbar");
        }
        else if ($(this).hasClass("fix-toolbar") && (!window_is_more_than_twice_the_toolbar || (viewTop <= placeholderTop))) {
          $(this).removeClass("fix-toolbar");
          $(this).removeAttr('style');
          $(this).parent().removeAttr('style');
        }
      }
    });
  }); // end bind

  // if count errors
  $('#hideError').on('click', function (e) {
    e.preventDefault();
    $('.error').hide('slow', function () {
      $('.error').remove();
    });
    return false;
  });

  // if count warnings
  $(document).on('click', '#linkSeeMore', function (e) {
    e.preventDefault();
    $('#seeMore').show();
    $(this).hide();
    $('#linkHide').show();
    return false;
  });
  $(document).on('click', '#linkHide', function (e) {
    e.preventDefault();
    $('#seeMore').hide();
    $(this).hide();
    $('#linkSeeMore').show();
    return false;
  });
  $(document).on('click', '#hideWarn', function (e) {
    e.preventDefault();
    $('.warn').hide('slow', function () {
      $('.warn').remove();
    });
    return false;
  });

  /** make sure that all the swap id is present in the dom to prevent mistake **/
  if (typeof $('#addSwap') !== undefined && typeof $("#removeSwap") !== undefined &&
    typeof $('#selectedSwap') !== undefined && typeof $('#availableSwap') !== undefined) {
    bindSwapButton('add', 'available', 'selected');
    bindSwapButton('remove', 'selected', 'available');

    $('button:submit').click(bindSwapSave);
  }

  if (window['kpis']) {
    $.each(window['kpis'], function(id, kpi) {
      if (kpi.initRefresh) {
        refresh_kpi(id, kpi);
      }
    });
  }
});

function bindSwapSave() {
  if ($('#selectedSwap option').length !== 0) {
    $('#selectedSwap option').attr('selected', 'selected');
  } else {
    $('#availableSwap option').attr('selected', 'selected');
  }
}

function bindSwapButton(prefix_button, prefix_select_remove, prefix_select_add) {
  $('#' + prefix_button + 'Swap').on('click', function (e) {
    e.preventDefault();
    $('#' + prefix_select_remove + 'Swap option:selected').each(function () {
      $('#' + prefix_select_add + 'Swap').append("<option value='" + $(this).val() + "'>" + $(this).text() + "</option>");
      $(this).remove();
    });
    $('#selectedSwap option').prop('selected', true);
  });
}

// Delete all tags HTML
function stripHTML(oldString) {
  var newString = '';
  var inTag = false;
  for (var i = 0; i < oldString.length; i++) {
    if (oldString.charAt(i) == '<') {
      inTag = true;
    }
    if (oldString.charAt(i) == '>') {
      if (oldString.charAt(i + 1) != '<') {
        inTag = false;
        i++;
      }
    }
    if (!inTag) {
      newString += oldString.charAt(i);
    }
  }
  return newString;
}

/**
 * Display a loading bar while an ajax call is ongoing.
 *
 * To prevent the loading bar display for a specific ajax call, set the beforeSend event in your ajax declaration:
 *    beforeSend : function(data)
 {
   // don't display the loading notification bar
   clearTimeout(ajax_running_timeout);
 }
 */
function showAjaxOverlay() {
  $('#ajax_running').show('fast');
  clearTimeout(ajax_running_timeout);
}

function display_action_details(row_id, controller, token, action, params) {
  var id = action + '_' + row_id;
  var current_element = $('#details_' + id);
  if (!current_element.data('dataMaped')) {
    var ajax_params = {
      'id': row_id,
      'controller': controller,
      'token': token,
      'action': action,
      'ajax': true
    };

    $.each(params, function (k, v) {
      ajax_params[k] = v;
    });

    $.ajax({
      url: 'index.php',
      data: ajax_params,
      dataType: 'json',
      cache: false,
      context: current_element,
      success: function (data) {
        if (typeof(data.use_parent_structure) == 'undefined' || (data.use_parent_structure == true)) {
          if (current_element.parent().parent().hasClass('alt_row')) {
            var alt_row = true;
          } else {
            var alt_row = false;
          }
          current_element.parent().parent().after($('<tr class="details_' + id + ' small ' + (alt_row ? 'alt_row' : '') + '"></tr>')
            .append($('<td style="border:none!important;" class="empty"></td>')
              .attr('colspan', current_element.parent().parent().find('td').length)));
          $.each(data.data, function (it, row) {
            var bg_color = ''; // Color
            if (row.color) {
              bg_color = 'style="background:' + row.color + ';"';
            }

            var content = $('<tr class="action_details details_' + id + ' ' + (alt_row ? 'alt_row' : '') + '"></tr>');
            content.append($('<td class="empty"></td>'));
            var first = true;
            var count = 0; // Number of non-empty collum
            $.each(row, function (it) {
              if (typeof(data.fields_display[it]) != 'undefined') {
                count++;
              }
            });
            $.each(data.fields_display, function (it, line) {
              if (typeof(row[it]) == 'undefined') {
                if (first || count == 0) {
                  content.append($('<td class="' + current_element.align + ' empty"' + bg_color + '></td>'));
                } else {
                  content.append($('<td class="' + current_element.align + '"' + bg_color + '></td>'));
                }
              }
              else {
                count--;
                if (first) {
                  first = false;
                  content.append($('<td class="' + current_element.align + ' first"' + bg_color + '>' + row[it] + '</td>'));
                }
                else if (count == 0) {
                  content.append($('<td class="' + current_element.align + ' last"' + bg_color + '>' + row[it] + '</td>'));
                } else {
                  content.append($('<td class="' + current_element.align + ' ' + count + '"' + bg_color + '>' + row[it] + '</td>'));
                }
              }
            });
            content.append($('<td class="empty"></td>'));
            current_element.parent().parent().after(content.show('slow'));
          });
        }
        else {
          if (current_element.parent().parent().hasClass('alt_row')) {
            var content = $('<tr class="details_' + id + ' alt_row"></tr>');
          } else {
            var content = $('<tr class="details_' + id + '"></tr>');
          }
          content.append($('<td style="border:none!important;">' + data.data + '</td>').attr('colspan', current_element.parent().parent().find('td').length));
          current_element.parent().parent().after(content);
          current_element.parent().parent().parent().find('.details_' + id).hide();
        }
        current_element.data('dataMaped', true);
        current_element.data('opened', false);

        if (typeof(initTableDnD) != 'undefined') {
          initTableDnD('.details_' + id + ' table.tableDnD');
        }
      }
    });
  }

  if (current_element.data('opened')) {
    current_element.find('i.icon-collapse-top').attr('class', 'icon-collapse');
    current_element.parent().parent().parent().find('.details_' + id).hide('fast');
    current_element.data('opened', false);
  }
  else {
    current_element.find('i.icon-collapse').attr('class', 'icon-collapse-top');
    current_element.parent().parent().parent().find('.details_' + id).show('fast');
    current_element.data('opened', true);
  }
}

function quickSelect(elt) {
  var eltVal = $(elt).val();
  if (eltVal == "0") {
    return false;
  } else if (eltVal.substr(eltVal.length - 6) == '_blank') {
    window.open(eltVal.substr(0, eltVal.length - 6), '_blank');
  } else {
    location.href = eltVal;
  }
}

function changeEmployeeLanguage() {
  if (typeof allowEmployeeFormLang !== 'undefined' && allowEmployeeFormLang) {
    $.post("index.php", {
      action: 'formLanguage',
      tab: 'AdminEmployees',
      ajax: 1,
      token: employee_token,
      form_language_id: id_language
    });
  }
}

function hideOtherLanguage(id) {
  $('.translatable-field').hide();
  $('.lang-' + id).show();

  var id_old_language = id_language;
  id_language = id;

  if (id_old_language != id) {
    changeEmployeeLanguage();
  }

  updateCurrentText();
}

function updateAllLanguageFields(element) {
  var form_group = element.closest('.form-group');
  if (form_group) {
    var translatable_fields = form_group.querySelectorAll('.translatable-field');
    if (translatable_fields.length) {
      translatable_fields.forEach((translatable_field) => {
        if (!translatable_field.classList.contains('lang-0')) {
          translatable_field.querySelector('input').value = element.value;
        }
      });
    }
  }
}

function sendBulkAction(form, action) {
  String.prototype.splice = function (index, remove, string) {
    return (this.slice(0, index) + string + this.slice(index + Math.abs(remove)));
  };

  var form_action = $(form).attr('action');

  if (form_action.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, '').replace(/\s+/g, ' ') == '') {
    return false;
  }

  if (form_action.indexOf('#') == -1) {
    $(form).attr('action', form_action + '&' + action);
  } else {
    $(form).attr('action', form_action.splice(form_action.lastIndexOf('&'), 0, '&' + action));
  }

  $(form).submit();
}

function ajaxStates(id_state_selected) {
  $.ajax({
    url: "index.php",
    cache: false,
    data: "token=" + state_token + "&ajax=1&action=states&tab=AdminStates&no_empty=0&id_country=" + $('#id_country').val() + "&id_state=" + $('#id_state').val(),
    success: function (html) {
      if (html == 'false') {
        $("#contains_states").fadeOut();
        $('#id_state option[value=0]').attr("selected", "selected");
      }
      else {
        $("#id_state").html(html);
        $("#contains_states").fadeIn();
        $('#id_state option[value=' + id_state_selected + ']').attr("selected", "selected");
      }
    }
  });

  if (module_dir && vat_number) {
    $.ajax({
      type: "GET",
      url: window.location.origin + module_dir + "vatnumber/ajax.php?id_country=" + $('#id_country').val(),
      success: function (isApplicable) {
        if (isApplicable == 1) {
          $('#vat_area').show();
        } else {
          $('#vat_area').hide();
        }
      }
    });
  }
}

function check_for_all_accesses(tabsize, tabnumber) {
  var i = 0;
  var res = 0;
  var right = 0;
  var rights = new Array('view', 'add', 'edit', 'delete', 'all');

  while (i != parseInt(tabsize) + 1) {
    if ($('#view' + i).prop('checked') == false || $('#edit' + i).prop('checked') == false || $('#add' + i).prop('checked') == false || $('#delete' + i).prop('checked') == false) {
      $('#all' + i).attr('checked', false);
    } else {
      $('#all' + i).attr('checked', "checked");
    }
    i++;
  }
  right = 0;
  while (right != 5) {
    res = 0;
    i = 0;
    while (i != tabsize) {
      if ($('#' + rights[right] + i).prop('checked') == true) {
        res++;
      }
      i++;
    }
    if (res == tabnumber - 1) {
      $('#' + rights[right] + 'all').attr('checked', "checked");
    } else {
      $('#' + rights[right] + 'all').attr('checked', false);
    }
    right++;
  }
}

function perfect_access_js_gestion(src, action, id_tab, tabsize, tabnumber, table) {
  if (id_tab == '-1' && action == 'all') {
    $(table + ' .add').attr('checked', src.checked);
    $(table + ' .edit').attr('checked', src.checked);
    $(table + ' .delete').attr('checked', src.checked);
    $(table + ' .view').attr('checked', src.checked);
    $(table + ' .all').attr('checked', src.checked);
  }
  else if (action == 'all') {
    $(table + ' .' + id_tab).attr('checked', src.checked);
  } else if (id_tab == '-1') {
    $(table + ' .' + action).attr('checked', src.checked);
  }
  check_for_all_accesses(tabsize, tabnumber);
}

function checkLangPack(token) {
  if ($('#iso_code').val().length == 2) {
    $('#lang_pack_loading').show();
    $('#lang_pack_msg').hide();
    doAdminAjax(
      {
        controller: 'AdminLanguages',
        action: 'checkLangPack',
        token: token,
        ajax: 1,
        iso_lang: ($('#iso_code').val()).toLowerCase(),
        ps_version: $('#ps_version').val()
      },
      function (ret) {
        $('#lang_pack_loading').hide();
        ret = $.parseJSON(ret);
        if (ret.status == 'ok') {
          content = $.parseJSON(ret.content);
          message = langPackOk + ' <b>' + content['name'] + '</b>) :'
            + '<br />' + langPackVersion + ' ' + content['version']
            + ' <a href="http://www.prestashop.com/download/lang_packs/gzip/' + content['version'] + '/'
            + ($('#iso_code').val()).toLowerCase() + '.gzip" target="_blank" class="link">' + download + '</a><br />' + langPackInfo;
          $('#lang_pack_msg').html(message);
          $('#lang_pack_msg').show();
        }
        else {
          showErrorMessage(ret.error);
        }
      }
    );
  }
}

function redirect(new_page) {
  window.location = new_page;
}

function saveCustomerNote(customerId) {
  var noteContent = $('#noteContent').val();
  var data = 'token=' + token_admin_customers + '&tab=AdminCustomers&ajax=1&action=updateCustomerNote&id_customer=' + customerId + '&note=' + encodeURIComponent(noteContent);
  $.ajax({
    type: "POST",
    url: "index.php",
    data: data,
    async: true,
    success: function (r) {

      if (r == 'ok') {
        $('#submitCustomerNote').attr('disabled', true);
      }
      showSuccessMessage(update_success_msg);
    }
  });
}

function isCleanHtml(content) {
  var events = 'onmousedown|onmousemove|onmmouseup|onmouseover|onmouseout|onload|onunload|onfocus|onblur|onchange';
  events += '|onsubmit|ondblclick|onclick|onkeydown|onkeyup|onkeypress|onmouseenter|onmouseleave|onerror|onselect|onreset|onabort|ondragdrop|onresize|onactivate|onafterprint|onmoveend';
  events += '|onafterupdate|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditfocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onmove';
  events += '|onbounce|oncellchange|oncontextmenu|oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondeactivate|ondrag|ondragend|ondragenter|onmousewheel';
  events += '|ondragleave|ondragover|ondragstart|ondrop|onerrorupdate|onfilterchange|onfinish|onfocusin|onfocusout|onhashchange|onhelp|oninput|onlosecapture|onmessage|onmouseup|onmovestart';
  events += '|onoffline|ononline|onpaste|onpropertychange|onreadystatechange|onresizeend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onsearch|onselectionchange';
  events += '|onselectstart|onstart|onstop';

  var script1 = /<[\s]*script/im;
  var script2 = new RegExp('(' + events + ')[\s]*=', 'im');
  var script3 = /.*script\:/im;
  var script4 = /<[\s]*(i?frame|embed|object)/im;

  if (script1.test(content) || script2.test(content) || script3.test(content) || script4.test(content)) {
    return false;
  }

  return true;
}

function parseDate(date) {
  return $.datepicker.parseDate("yy-mm-dd", date);
}

/* Formatting should match Smarty function displayPriceValue. */
function displayPriceValue(price) {
  if (isNaN(price) || price == '') {
    price = 0;
  }

  priceDatabase = parseFloat(parseFloat(price).toFixed(priceDatabasePrecision));
  priceDisplay = ps_round(price, priceDisplayPrecision);

  var formatted;
  if (priceDatabase.toString() === priceDisplay.toString()) {
    formatted = priceDisplay.toFixed(priceDisplayPrecision);
  } else {
    formatted = priceDatabase.toString();
  }

  return formatted;
}

function refresh_kpis() {
  if (window['kpis']) {
    $.each(window['kpis'], refresh_kpi);
  }
}

function refresh_kpi(id, kpi) {
  if (kpi.source) {

    const $valueContainer = $('#' + id + ' .value');
    $valueContainer.html('<span class="icon icon-spin icon-spinner"></span>')

    $.ajax({
      url: kpi.source + '&rand=' + new Date().getTime(),
      dataType: 'json',
      type: 'GET',
      cache: false,
      headers: {'cache-control': 'no-cache'},
      success: function (jsonData) {
        if (! jsonData.has_errors) {

          if (jsonData.value !== undefined) {
            $valueContainer.html(jsonData.value);
          } else {
            $valueContainer.html('');
          }

          if (jsonData.data !== undefined) {
            const data = [];
            $.each(jsonData.data, function (index, value) {
              data.push(value);
            });

            const data_max = d3.max(data);

            const chart = d3.select("#" + id + " .boxchart").append("svg")
                .attr("class", "data_chart")
                .attr("width", data.length * 6)
                .attr("height", 45);

            const y = d3.scale.linear()
                .domain([0, data_max])
                .range([0, data_max * 45]);

            chart.selectAll("rect")
                .data(data)
                .enter().append("rect")
                .attr("y", d => 45 - d * 45 / data_max)
                .attr("x", (d, i) => i * 6)
                .attr("width", 4)
                .attr("height", y);
          }
        } else {
          $valueContainer.html('Error');
        }
      }
    });
  }
}

function createSqlQueryName() {
  var container = false;
  if ($('.breadcrumb-container')) {
    container = $('.breadcrumb-container').first().text().replace(/\s+/g, ' ').trim();
  }
  var current = false;
  if ($('.breadcrumb-current')) {
    current = $('.breadcrumb-current').first().text().replace(/\s+/g, ' ').trim();
  }
  var title = false;
  if ($('.page-title')) {
    title = $('.page-title').first().text().replace(/\s+/g, ' ').trim();
  }

  var name = false;
  if (container && current && container != current) {
    name = container + ' > ' + current;
  } else if (container) {
    name = container;
  } else if (current) {
    name = current;
  }

  if (title && title != current && title != container) {
    if (name) {
      name = name + ' > ' + title;
    } else {
      name = title;
    }
  }

  return name.trim();
}

function confirm_link(head_text, display_text, confirm_text, cancel_text, confirm_link, cancel_link) {
  $.alerts.okButton = confirm_text;
  $.alerts.cancelButton = cancel_text;
  jConfirm(display_text, head_text, function (confirm) {
    if (confirm === true) {
      document.location = confirm_link;
    } else {
      document.location = cancel_link;
    }
  });
}

function countDown($source, $target) {
  var max = $source.attr("data-maxchar");
  $target.html(max - $source.val().length);

  $source.keyup(function () {
    $target.html(max - $source.val().length);
  });
}

function toggleListFilters(listId) {
  const $filters = $("#list-filters-" + listId);
  const $filterIcon = $("#toolbar-filter-icon-" + listId);

  if ($filters.is(':hidden')) {
    $filters.show();
    $filterIcon
        .removeClass('icon-caret-down')
        .addClass('icon-caret-up');
  } else {
    $filters.hide();
    $filterIcon
        .removeClass('icon-caret-up')
        .addClass('icon-caret-down');
  }
  return false
}