/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ 194:
/***/ (() => {



/*
 * This file handles accordian behavior on the Supports page with the various question/answer panels.
 *
 * The functionality includes keyboard and accessibility functionality to help those who need it.
 */
(() => {
  // Toggles help/support accordions.
  const supportQuestions = document.querySelectorAll('#support .question');
  Array.from(supportQuestions).forEach(function (question, index) {
    let next = function (elem, selector) {
      let nextElem = elem.nextElementSibling;
      if (!selector) {
        return nextElem;
      }
      if (nextElem && nextElem.matches(selector)) {
        return nextElem;
      }
      return null;
    };
    let state = false;
    let answer = next(question, 'div');
    answer.style.display = 'none';
    ['click', 'keydown'].forEach(theEvent => {
      question.addEventListener(theEvent, e => {
        // Helps with accessibility and keyboard navigation.
        let keys = ['Space', 'Enter'];
        if (e.type === 'keydown' && !keys.includes(e.code)) {
          return;
        }
        e.preventDefault();
        state = !state;
        answer.style.display = state ? 'block' : 'none';
        e.currentTarget.classList.toggle('active');
        e.currentTarget.setAttribute('aria-expanded', state.toString());
        e.currentTarget.focus();
      });
    });
  });
})();

/***/ }),

/***/ 213:
/***/ (() => {



/*
 * This file handles storing the panel state for the post type and taxonomy edit screens.
 *
 * The open/closed state gets stored into localstorage and is remembered on future page refreshes.
 */
postboxes.add_postbox_toggles(pagenow);
(() => {
  // Toggle Panels State.
  // @todo. Localize the list of panel selectors so that we can filter in the CPTUI-Extended panel without hardcoding here.
  const all_panels = ["#cptui_panel_pt_basic_settings", "#cptui_panel_pt_additional_labels", "#cptui_panel_pt_advanced_settings", "#cptui_panel_tax_basic_settings", "#cptui_panel_tax_additional_labels", "#cptui_panel_tax_advanced_settings"];
  all_panels.forEach((element, index) => {
    const panel_id_item = document.querySelector(element);
    if (panel_id_item) {
      const panel_id = panel_id_item.getAttribute('id');
      const panel = document.querySelector('#' + panel_id);

      // check default state on page load
      if (!localStorage.getItem(panel_id) || localStorage.getItem(panel_id) === null) {
        panel.classList.remove('closed');
      } else {
        panel.classList.add('closed');
      }
      const postbox = panel_id_item.querySelectorAll('.postbox-header');
      Array.from(postbox).forEach((el, i) => {
        el.addEventListener('click', e => {
          if (!localStorage.getItem(panel_id)) {
            localStorage.setItem(panel_id, '1');
          } else {
            localStorage.removeItem(panel_id);
          }
        });
      });
    }
  });
})();

/***/ }),

/***/ 285:
/***/ (() => {



/*
 * This file handles confirming the deletion of a content type before continuing.
 *
 * @todo Finish converting away from jQuery.
 */
($ => {
  // NOT DONE
  /*['.cptui-delete-top', '.cptui-delete-bottom'].forEach( (element,index) => {
  	let theDialog = document.querySelector('#cptui-content-type-delete');
  	let theelement = document.querySelector(element);
  	theelement.addEventListener('click', async (e) => {
  		e.preventDefault();
  		const doPerformAction = await confirm();
  		if ( doPerformAction ) {
  			let thing = document.querySelector('#cpt_submit_delete');
  			console.log(thing);
  			thing.click();
  			thing.submit();
  			theDialog.close();
  		} else {
  			theDialog.close();
  		}
  	});
  });
  	let closeBtnConfirm = document.querySelector('.cptui-confirm-deny-delete button');
  let closeBtnDeny = document.querySelector('#cptui-content-type-deny-delete');
  function confirm() {
  	return new Promise((resolve, reject) => {
  		document.querySelector('#cptui-content-type-delete').showModal();
  		closeBtnConfirm.focus();
  			closeBtnConfirm.addEventListener("click", () => {
  			resolve(true);
  			document.querySelector('#cptui-content-type-delete').close()
  		});
  		closeBtnDeny.addEventListener("click", () => {
  			resolve(false);
  			document.querySelector('#cptui-content-type-delete').close()
  		});
  	});
  }*/

  // Confirm our deletions
  $('.cptui-delete-top, .cptui-delete-bottom').on('click', function (e) {
    e.preventDefault();
    let msg = '';
    if (typeof cptui_type_data !== 'undefined') {
      msg = cptui_type_data.confirm;
    } else if (typeof cptui_tax_data !== 'undefined') {
      msg = cptui_tax_data.confirm;
    }
    let submit_delete_warning = $('<div class="cptui-submit-delete-dialog">' + msg + '</div>').appendTo('#poststuff').dialog({
      'dialogClass': 'wp-dialog',
      'modal': true,
      'autoOpen': true,
      'buttons': {
        "OK": function () {
          $(this).dialog('close');
          $(e.target).off('click').click();
        },
        "Cancel": function () {
          $(this).dialog('close');
        }
      }
    });
  });
})(jQuery);

/***/ }),

/***/ 376:
/***/ (() => {



/*
 * This file provides a dialog box to alert the user that at least one post type must be chosen
 * before they can save a taxonomy.
 *
 * This was added because taxonomies need to have a post type, meanwhile post types do NOT need
 * to have a taxonomy.
 */
(() => {
  // Handles checking if a post type has been chosen or not when adding/saving a taxonomy.
  // Post type associations are a required attribute.
  const taxSubmit = document.querySelectorAll('.cptui-taxonomy-submit');
  const taxSubmitSelectCPTDialog = document.querySelector('#cptui-select-post-type-confirm');
  Array.from(taxSubmit).forEach((element, i) => {
    element.addEventListener('click', e => {
      // putting inside event listener to check every time clicked. Defining outside lost re-checking.
      let taxCPTChecked = document.querySelectorAll('#cptui_panel_tax_basic_settings input[type="checkbox"]:checked');
      if (taxCPTChecked.length === 0) {
        e.preventDefault();
        taxSubmitSelectCPTDialog.showModal();
      }
    });
  });
  let taxSubmitSelectCPTConfirmCloseBtn = document.querySelector('#cptui-select-post-type-confirm-close');
  if (taxSubmitSelectCPTConfirmCloseBtn) {
    taxSubmitSelectCPTConfirmCloseBtn.addEventListener('click', e => {
      e.preventDefault();
      taxSubmitSelectCPTDialog.close();
    });
  }
})();

/***/ }),

/***/ 464:
/***/ (() => {



/*
 * This file handles the automatic population as well as the automatic clearing of the label
 * fields, based on the provided singular and plural label values.
 */
(() => {
  let nameField = document.querySelector('#name');
  let autoPopulate = document.querySelector('#auto-populate');
  const autoLabels = document.querySelector('#autolabels');
  if (autoLabels) {
    autoLabels.style.display = 'table-row';
  }
  if (autoPopulate) {
    ['click', 'tap'].forEach((eventName, index) => {
      autoPopulate.addEventListener(eventName, e => {
        e.preventDefault();
        let slug = nameField.value;
        let plural = document.querySelector('#label').value;
        let singular = document.querySelector('#singular_label').value;
        let fields = document.querySelectorAll('.cptui-labels input[type="text"]');
        if ('' === slug) {
          return;
        }
        if ('' === plural) {
          plural = slug;
        }
        if ('' === singular) {
          singular = slug;
        }
        Array.from(fields).forEach(field => {
          let newval = field.getAttribute('data-label');
          let plurality = field.getAttribute('data-plurality');
          if (typeof newval !== 'undefined') {
            // "slug" is our placeholder from the labels.
            if ('plural' === plurality) {
              newval = newval.replace(/item/gi, plural);
            } else {
              // using an else statement because we do not
              // want to mutate the original string by default.
              newval = newval.replace(/item/gi, singular);
            }
            if (field.value === '') {
              field.value = newval;
            }
          }
        });
      });
    });
  }
  let autoClear = document.querySelector('#auto-clear');
  if (autoClear) {
    ['click', 'tap'].forEach((eventName, index) => {
      autoClear.addEventListener(eventName, e => {
        e.preventDefault();
        const fields = document.querySelectorAll('.cptui-labels input[type="text"]');
        Array.from(fields).forEach(field => {
          field.value = '';
        });
      });
    });
  }
})();

/***/ }),

/***/ 643:
/***/ (() => {



/*
 * This file handles automatically toggling the "Page attributes" option in the "Supports" section
 * when a user chooses to have their post type be hierarchical.
 *
 * The purpose is to help ensure that the "parent" and "template" metabox option shows up by default,
 * but we do not force that to remain checked. The user can still toggle it off after the fact.
 */
(() => {
  // Automatically toggle the "page attributes" checkbox if
  // setting a hierarchical post type.
  const hierarchicalSetting = document.querySelector('#hierarchical');
  if (hierarchicalSetting) {
    hierarchicalSetting.addEventListener('change', e => {
      let pageAttributesCheck = document.querySelector('#page-attributes');
      if (e.currentTarget && e.currentTarget.value === '1') {
        pageAttributesCheck.checked = true;
      } else {
        pageAttributesCheck.checked = false;
      }
    });
  }
})();

/***/ }),

/***/ 698:
/***/ (() => {



/*
 * This file handles setting the menu icon preview for a given post type.
 */
(() => {
  let _custom_media;
  let _orig_send_attachment;
  if (undefined !== wp.media) {
    _custom_media = true;
    _orig_send_attachment = wp.media.editor.send.attachment;
  }
  const maybeHasPicker = document.querySelector('#cptui_choose_dashicon');
  if (!maybeHasPicker) {
    return;
  }

  // Trigger the modal and load our icons.
  const icons = cptuiIconPicker.iconsJSON;
  const iconPicker = new IconPicker('#cptui_choose_dashicon', {
    theme: 'default',
    iconSource: [{
      key: 'dashicons',
      prefix: 'dashicons-',
      url: icons
    }],
    closeOnSelect: true,
    i18n: {
      'input:placeholder': cptuiIconPicker.iconsPlaceholder,
      'text:title': cptuiIconPicker.iconsTitle,
      'text:empty': cptuiIconPicker.iconsEmpty,
      'text:loading': cptuiIconPicker.iconsLoading,
      'btn:save': cptuiIconPicker.iconsSave
    }
  });
  const menuIconField = document.querySelector('#menu_icon');
  const menuIconPreview = document.querySelector('#menu_icon_preview');
  const regIcon = document.querySelector('#cptui_choose_icon');
  const dashIcon = document.querySelector('#cptui_choose_dashicon');
  const origText = dashIcon.value;
  iconPicker.on('select', icon => {
    menuIconField.value = icon.value;
    menuIconPreview.innerHTML = '';
    let div = document.createElement('div');
    div.classList.add('dashicons', icon.value);
    menuIconPreview.insertAdjacentElement('afterbegin', div);
  });
  iconPicker.on('hide', () => {
    dashIcon.value = origText;
  });
  if (regIcon) {
    regIcon.addEventListener('click', e => {
      e.preventDefault();
      let button = e.currentTarget;
      _custom_media = true;
      wp.media.editor.send.attachment = function (props, attachment) {
        if (_custom_media) {
          menuIconField.value = attachment.url;
          menuIconPreview.innerHTML = '';
          let img = document.createElement('img');
          img.src = attachment.url;
          menuIconPreview.insertAdjacentElement('afterbegin', img);
        } else {
          return _orig_send_attachment.apply(this, [props, attachment]);
        }
      };
      wp.media.editor.open(button);
      return false;
    });
  }
})();

/***/ }),

/***/ 706:
/***/ (() => {



/*
 * This file handles automatically switching to a chosen content type when selecting from the
 * dropdown listing.
 */
(() => {
  // Switch to newly selected post type or taxonomy automatically.
  const postTypeDropdown = document.querySelector('#post_type');
  const taxonomyDropdown = document.querySelector('#taxonomy');
  if (postTypeDropdown) {
    postTypeDropdown.addEventListener('change', () => {
      const postTypeSelectPostType = document.querySelector('#cptui_select_post_type');
      if (postTypeSelectPostType) {
        postTypeSelectPostType.submit();
      }
    });
  }
  if (taxonomyDropdown) {
    taxonomyDropdown.addEventListener('change', () => {
      const taxonomySelectPostType = document.querySelector('#cptui_select_taxonomy');
      if (taxonomySelectPostType) {
        taxonomySelectPostType.submit();
      }
    });
  }
})();

/***/ }),

/***/ 710:
/***/ (() => {



/*
 * This file visually removes the submit button to change content type being edited.
 *
 * If by chance javascript is disabled or somehow breaking, the button would show by default,
 * preventing issues with switching content types.
 */
(() => {
  const cptSelectSubmit = document.querySelector('#cptui_select_post_type_submit');
  if (cptSelectSubmit) {
    cptSelectSubmit.style.display = 'none';
  }
  const taxSelectSubmit = document.querySelector('#cptui_select_taxonomy_submit');
  if (taxSelectSubmit) {
    taxSelectSubmit.style.display = 'none';
  }
})();

/***/ }),

/***/ 864:
/***/ (() => {



/*
 * This file handles the back to top functionality as the user scrolls, for quick return to top.
 *
 * This includes some debouncing to prevent excessive scroll event listening.
 */
(() => {
  const back_to_top_btn = document.querySelector('.cptui-back-to-top');
  if (back_to_top_btn) {
    document.addEventListener('scroll', () => {
      cptuiDebounce(backToTop, 500);
    });
    back_to_top_btn.addEventListener('click', e => {
      e.preventDefault();
      window.scrollTo({
        top: 0,
        behavior: "smooth"
      });
    });
  }
  function backToTop() {
    if (window.scrollY > 300) {
      back_to_top_btn.classList.add('show');
    } else {
      back_to_top_btn.classList.remove('show');
    }
  }
  function cptuiDebounce(method, delay) {
    clearTimeout(method._tId);
    method._tId = setTimeout(function () {
      method();
    }, delay);
  }
})();

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/

;// ./src/js/partials/utils.js


// Retrieve URL parameters by requested parameter name.
function getParameterByName(name, url) {
  if (!url) url = window.location.href;
  name = name.replace(/[\[\]]/g, "\\$&");
  const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
  if (!results) return null;
  if (!results[2]) return '';
  return decodeURIComponent(results[2].replace(/\+/g, " "));
}

// Split, translate cyrillic characters, and then re-join the final result.
function transliterate(word) {
  return word.split('').map(function (char) {
    return cyrillic[char] || char;
  }).join("");
}

//Character encode special characters.
function htmlEncode(str) {
  return String(str).replace(/[^-\w. ]/gi, function (c) {
    return '&#' + c.charCodeAt(0) + ';';
  });
}

// Constructs miniture versions of uploaded media for admnin menu icon usage,
// or displays the rendered dashicon.
function composePreviewContent(value) {
  const re = /(http|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/;
  const isURL = re.test(value);
  if (!value) {
    return '';
  } else if (0 === value.indexOf('dashicons-')) {
    const dashDiv = document.createElement('div');
    dashDiv.classList.add('dashicons-before');
    dashDiv.innerHTML = '<br/>';
    dashDiv.classList.add(htmlEncode(value));
    return dashDiv;
  } else if (isURL) {
    const imgsrc = encodeURI(value);
    const theimg = document.createElement('IMG');
    theimg.src = imgsrc;
    return theimg;
  }
}

// Replace diacritic characters with latin characters.
function replaceDiacritics(s) {
  const diacritics = [/[\300-\306]/g, /[\340-\346]/g,
  // A, a
  /[\310-\313]/g, /[\350-\353]/g,
  // E, e
  /[\314-\317]/g, /[\354-\357]/g,
  // I, i
  /[\322-\330]/g, /[\362-\370]/g,
  // O, o
  /[\331-\334]/g, /[\371-\374]/g,
  // U, u
  /[\321]/g, /[\361]/g,
  // N, n
  /[\307]/g, /[\347]/g // C, c
  ];
  let chars = ['A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', 'N', 'n', 'C', 'c'];
  for (let i = 0; i < diacritics.length; i++) {
    s = s.replace(diacritics[i], chars[i]);
  }
  return s;
}

// Converts non-alphanumeric or space characters to an underscore. Should ignore dashes, to allow
// using dashes in slugs.
function replaceSpecialCharacters(s) {
  s = s.replace(/[^a-z0-9\s-]/gi, '_');
  return s;
}

// List of available cyrillic characters and the value to translate to.
const cyrillic = {
  "Ё": "YO",
  "Й": "I",
  "Ц": "TS",
  "У": "U",
  "К": "K",
  "Е": "E",
  "Н": "N",
  "Г": "G",
  "Ш": "SH",
  "Щ": "SCH",
  "З": "Z",
  "Х": "H",
  "Ъ": "'",
  "ё": "yo",
  "й": "i",
  "ц": "ts",
  "у": "u",
  "к": "k",
  "е": "e",
  "н": "n",
  "г": "g",
  "ш": "sh",
  "щ": "sch",
  "з": "z",
  "х": "h",
  "ъ": "'",
  "Ф": "F",
  "Ы": "I",
  "В": "V",
  "А": "a",
  "П": "P",
  "Р": "R",
  "О": "O",
  "Л": "L",
  "Д": "D",
  "Ж": "ZH",
  "Э": "E",
  "ф": "f",
  "ы": "i",
  "в": "v",
  "а": "a",
  "п": "p",
  "р": "r",
  "о": "o",
  "л": "l",
  "д": "d",
  "ж": "zh",
  "э": "e",
  "Я": "Ya",
  "Ч": "CH",
  "С": "S",
  "М": "M",
  "И": "I",
  "Т": "T",
  "Ь": "'",
  "Б": "B",
  "Ю": "YU",
  "я": "ya",
  "ч": "ch",
  "с": "s",
  "м": "m",
  "и": "i",
  "т": "t",
  "ь": "'",
  "б": "b",
  "ю": "yu"
};
// EXTERNAL MODULE: ./src/js/partials/hide-submit.js
var hide_submit = __webpack_require__(710);
// EXTERNAL MODULE: ./src/js/partials/toggle-hierarchical.js
var toggle_hierarchical = __webpack_require__(643);
// EXTERNAL MODULE: ./src/js/partials/autoswitch.js
var autoswitch = __webpack_require__(706);
// EXTERNAL MODULE: ./src/js/partials/confirm-delete.js
var confirm_delete = __webpack_require__(285);
// EXTERNAL MODULE: ./src/js/partials/support-toggles.js
var support_toggles = __webpack_require__(194);
;// ./src/js/partials/namefield.js




/*
 * This file handles all of the normalization of the name/slug field for a post type
 * or taxonomy being registered.
 *
 * That way we are only allowing latin characters and dashes/underscores.
 *
 * It also shows a hidden alert if the slug has been changed in some way when editing an existing
 * content type.
 *
 * Lastly it will also show a warning if the attempted slug has already been registered elsewhere,
 * to help avoid clashes. The only exception is if the checkbox is checked indicating that the user
 * is trying to convert TO using CPTUI, and the conflicting slug elsewhere will be removed soon.
 */

(() => {
  let nameField = document.querySelector('#name');
  let original_slug;
  if ('edit' === getParameterByName('action')) {
    if (nameField) {
      // Store our original slug on page load for edit checking.
      original_slug = nameField.value;
    }
  }
  if (nameField) {
    // Use the `input` event so we catch paste, autofill, drag-drop, and
    // any programmatic value change — not just keystrokes. The previous
    // `keyup` listener missed paste/autofill, which is how invalid
    // uppercase slugs ("People") could slip past client-side normalization.
    nameField.addEventListener('input', e => {
      let value, original_value;
      value = original_value = e.currentTarget.value;
      value = value.replace(/ /g, "_");
      value = value.toLowerCase();
      value = replaceDiacritics(value);
      value = transliterate(value);
      value = replaceSpecialCharacters(value);
      if (value !== original_value) {
        e.currentTarget.value = value;
      }

      //Displays a message if slug changes.
      if (typeof original_slug !== 'undefined') {
        let slugchanged = document.querySelector('#slugchanged');
        if (value !== original_slug) {
          slugchanged.classList.remove('hidemessage');
        } else {
          slugchanged.classList.add('hidemessage');
        }
      }
      let slugexists = document.querySelector('#slugexists');
      let override = document.querySelector('#override_validation');
      let override_validation = override ? override.checked : false;
      if (typeof cptui_type_data != 'undefined') {
        if (cptui_type_data.existing_post_types.hasOwnProperty(value) && value !== original_slug && override_validation === false) {
          slugexists.classList.remove('hidemessage');
        } else {
          slugexists.classList.add('hidemessage');
        }
      }
      if (typeof cptui_tax_data != 'undefined') {
        if (cptui_tax_data.existing_taxonomies.hasOwnProperty(value) && value !== original_slug) {
          slugexists.classList.remove('hidemessage');
        } else {
          slugexists.classList.add('hidemessage');
        }
      }
    });
  }
})();
// EXTERNAL MODULE: ./src/js/partials/menu-icon.js
var menu_icon = __webpack_require__(698);
// EXTERNAL MODULE: ./src/js/partials/tax-required-post-type.js
var tax_required_post_type = __webpack_require__(376);
// EXTERNAL MODULE: ./src/js/partials/autopopulate.js
var autopopulate = __webpack_require__(464);
// EXTERNAL MODULE: ./src/js/partials/back-to-top.js
var back_to_top = __webpack_require__(864);
// EXTERNAL MODULE: ./src/js/partials/toggle-panels.js
var toggle_panels = __webpack_require__(213);
;// ./src/js/cptui.js












/******/ })()
;
//# sourceMappingURL=cptui.js.map