{"version":3,"sources":["jsdelivr-header.js","/npm/openseadragon-opacity-slider@1.0.0/src/plugin.js"],"names":[],"mappings":"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","file":"/npm/openseadragon-opacity-slider@1.0.0/src/plugin.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/openseadragon-opacity-slider@1.0.0/src/plugin.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const pluginName = \"OpenSeadragon Opacity Slider\";\n(function ($) {\n  /*\n   * Check OSD Version\n   */\n  if (!$.version || $.version.major < 2) {\n    throw new Error(\n      `This version of ${pluginName} requires OpenSeadragon version 2.0.0+`\n    );\n  }\n\n  /**\n   * Add method to Openseadragon viewer class\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  $.Viewer.prototype.opacityslider = function (options) {\n    if (!this.Instance) {\n      options = options || {};\n      options.viewer = this;\n      this.opacitysliderInstance = new $.OpacitySlider(options);\n    }\n  };\n\n  /**\n   * Construct the Plugin\n   * @constructor\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  $.OpacitySlider = function (options) {\n    /* Check if layerInformation is given and is an array */\n    if (!options.layerInformation || !Array.isArray(options.layerInformation)) {\n      throw new Error(`${pluginName} requires options.layerInformation`);\n    }\n\n    /* Check if a div with the id 'opacitySliderWrapper' is added in the markup. */\n    if (!document.getElementById(\"opacitySliderWrapper\")) {\n      throw new Error(\n        `${pluginName} requires a div with an id of 'opacitySliderWrapper'`\n      );\n    }\n\n    /* Set inital hidden values */\n    options.layerInformation.forEach((el) => {\n      if (!el.hidden) el.hidden = false;\n    });\n\n    /* Set layerPickerHeading */\n    options.layerPickerHeading = options.layerPickerHeading\n      ? options.layerPickerHeading\n      : \"Choose layers:\";\n\n    /* Add div into the given div for the sliders */\n    let opacitySliderDiv = document.createElement(\"div\");\n    opacitySliderDiv.id = \"opacitySliderWrapperContent\";\n    document\n      .getElementById(\"opacitySliderWrapper\")\n      .appendChild(opacitySliderDiv)\n      .classList.add(\"osdos-opacity-layer-slider-wrapper\");\n\n    /* Check if the layerPicker is wanted, if yes build it */\n    if (options.showLayerPicker || options.showLayerPicker === undefined) {\n      buildCheckboxMarkup(options);\n    }\n\n    /* Build the markup when items are added to OSD */\n    options.viewer.world.addHandler(\"add-item\", function (event) {\n      /*\n       * Set inital hidden value right at osd image instance:\n       * 1. Check type (tileimage or simpleimage)\n       * 2. Filter options.layerInformation based on tilesUrl or Url\n       * 3. Build markup\n       */\n      let itemUrl = event.item.source.tilesUrl\n        ? `${event.item.source.tilesUrl.slice(0, -7)}.dzi`\n        : event.item.source.url;\n      let affiliatedLayerInformation = options.layerInformation.filter(\n        (el) => el.source === itemUrl\n      );\n      event.item.osdosHidden = affiliatedLayerInformation.length\n        ? affiliatedLayerInformation[0].hidden\n        : false;\n      buildMarkup(options);\n    });\n    console.log(\"Plugin Initialized\");\n  };\n\n  /**\n   * Builds the markup for the layerpicker\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function buildCheckboxMarkup(options) {\n    /* Build the markup */\n    const checkboxWrapper = document.createElement(\"div\");\n    checkboxWrapper.classList.add(\"osdos-layer-picker-wrapper\");\n    checkboxWrapper.style = \"display: none;\";\n    checkboxWrapper.id = \"checkboxWrapperContent\";\n    let h2 = document.createElement(\"h2\");\n    h2.textContent = options.layerPickerHeading;\n    checkboxWrapper.appendChild(h2);\n    let ul = document.createElement(\"ul\");\n    options.layerInformation.forEach((el) => {\n      let li = document.createElement(\"li\");\n      let explanation =\n        options.showLayerInformation ||\n        options.showLayerInformation === undefined\n          ? `<p>${el.layerNameExplanation}</p>`\n          : \"\";\n      li.innerHTML = `\n        <input data-osdos='visibility-checkbox' type=\"checkbox\" name=\"${\n          el.layerName\n        }\" id=\"${el.layerName}\" ${\n        el.hidden ? \"\" : \"checked\"\n      } data-osdos-source=\"${el.source}\"/>\n        <label for=\"${el.layerName}\">${el.layerName}</label>\n        ${explanation}\n      `;\n      ul.appendChild(li);\n    });\n    checkboxWrapper.appendChild(ul);\n    document.querySelector(\"#opacitySliderWrapper\").prepend(checkboxWrapper);\n\n    /* Add visibility toggle functionality */\n    document\n      .querySelectorAll(\"[data-osdos='visibility-checkbox']\")\n      .forEach((el) => {\n        el.addEventListener(\"click\", (event) => {\n          toggleVisibility(event, options);\n        });\n      });\n  }\n\n  /**\n   * Builds the markup for the sliders.\n   * @param {Object} options  - The options-object given at plugin-setup\n   */\n  function buildMarkup(options) {\n    let orderedLayerInformation = getLayerOrder(options);\n    let opacitySliderWrapper = document.getElementById(\n      \"opacitySliderWrapperContent\"\n    );\n    opacitySliderWrapper.innerHTML = \"\"; //reset\n\n    orderedLayerInformation.forEach((el, index) => {\n      const sliderWrapper = document.createElement(\"div\");\n      sliderWrapper.className = \"osdos-layer-slider\";\n      sliderWrapper.setAttribute(\"data-osd-index\", index);\n      const layerControlsWrapper = document.createElement(\"div\");\n      layerControlsWrapper.className = \"osdos-layer-controls-wrapper\";\n\n      /* Remove button markup */\n      if (options.showRemove || options.showRemove === undefined) {\n        let removeButton = document.createElement(\"button\");\n        removeButton.setAttribute(\"data-osdos\", \"remove-button\");\n        removeButton.classList.add(\"osdos-layer-slider-remove-button\");\n        removeButton.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\" class=\"osdos-layer-slider-remove-button-icon\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path></svg>`;\n        removeButton.addEventListener(\"click\", () =>\n          removeLayer(el.source, options)\n        );\n        layerControlsWrapper.appendChild(removeButton);\n      }\n\n      /* Up- and down-button markup */\n      if (options.sortable || options.sortable === undefined) {\n        const buttonWrapper = document.createElement(\"div\");\n        buttonWrapper.className = \"osdos-position-controls-wrapper\";\n\n        /* Up button markup */\n        let buttonUp = document.createElement(\"button\");\n        buttonUp.setAttribute(\"data-osdos\", \"up-button\");\n        buttonUp.classList.add(\"osdos-layer-slider-up-button\");\n        buttonUp.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\" class=\"osdos-layer-slider-up-button-icon\" ><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\"></path></svg>`;\n        buttonUp.addEventListener(\"click\", () =>\n          layerForward(el.source, options)\n        );\n        buttonWrapper.appendChild(buttonUp);\n\n        /* Down button markup */\n        let buttonDown = document.createElement(\"button\");\n        buttonDown.setAttribute(\"data-osdos\", \"down-button\");\n        buttonDown.classList.add(\"osdos-layer-slider-down-button\");\n        buttonDown.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\" class=\"osdos-layer-slider-down-button-icon\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path></svg>`;\n        buttonDown.addEventListener(\"click\", () =>\n          layerBackward(el.source, options)\n        );\n        buttonWrapper.appendChild(buttonDown);\n        layerControlsWrapper.appendChild(buttonWrapper);\n      }\n\n      /* Layername markup  */\n      let layerName = document.createElement(\"span\");\n      layerName.innerHTML = el.layerName;\n      layerName.classList.add(\"osodos-layer-name-wrapper\");\n      layerControlsWrapper.appendChild(layerName);\n\n      /* Element for the opacitycontrols */\n      let opacityControlsWrapper = document.createElement(\"div\");\n      opacityControlsWrapper.classList.add(\"osodos-opacity-controls-wrapper\");\n      sliderWrapper.appendChild(layerControlsWrapper);\n\n      /* Opacity rangeslider markup  */\n      if (options.showRangeSlider || options.showRangeSlider === undefined) {\n        let layerOpacitySlider = document.createElement(\"input\");\n        const attributes = {\n          \"data-osdos\": \"layer-opacity-slider\",\n          type: \"range\",\n          min: \"0\",\n          max: \"100\",\n          name: \"opacity-slider\",\n          class: \"osdos-layer-slider-range-input\",\n        };\n        Object.keys(attributes).forEach((attr) => {\n          layerOpacitySlider.setAttribute(attr, attributes[attr]);\n        });\n        opacityControlsWrapper.appendChild(layerOpacitySlider);\n      }\n\n      /* Opacity numberinput markup */\n      if (options.showNumberInput || options.showNumberInput === undefined) {\n        let layerOpacitySliderValue = document.createElement(\"input\");\n        const attributes = {\n          \"data-osdos\": \"layer-opacity-slider-value\",\n          type: \"number\",\n          min: \"0\",\n          max: \"100\",\n          name: \"opacity-slider-value\",\n          class: \"osdos-layer-slider-number-input\",\n        };\n        Object.keys(attributes).forEach((attr) => {\n          layerOpacitySliderValue.setAttribute(attr, attributes[attr]);\n        });\n        opacityControlsWrapper.appendChild(layerOpacitySliderValue);\n      }\n\n      sliderWrapper.appendChild(opacityControlsWrapper);\n\n      let currentIndex = findIndexBySource(el.source, options);\n      if (options.viewer.world.getItemAt(currentIndex).osdosHidden) {\n        sliderWrapper.style = \"display: none;\";\n        setOpacity(currentIndex, 0, options);\n      }\n      opacitySliderWrapper.appendChild(sliderWrapper);\n    });\n\n    document\n      .querySelector(\"#opacitySliderWrapper\")\n      .appendChild(opacitySliderWrapper);\n\n    /* Add opacity functionality to the rangeslider */\n    document\n      .querySelectorAll(\"[data-osdos='layer-opacity-slider']\")\n      .forEach((el, index) => {\n        el.setAttribute(\"data-osd-index\", index);\n        [\"change\", \"input\"].forEach((eventName) => {\n          el.addEventListener(eventName, (event) => {\n            setOpacity(index, event.target.value / 100, options);\n            if (\n              options.showNumberInput ||\n              options.showNumberInput === undefined\n            ) {\n              document.querySelector(\n                `[data-osdos='layer-opacity-slider-value'][data-osd-index='${index}']`\n              ).value = event.target.value;\n            }\n          });\n        });\n      });\n\n    /* Add opacity functionality to the numberinput */\n    document\n      .querySelectorAll(\"[data-osdos='layer-opacity-slider-value']\")\n      .forEach((el, index) => {\n        el.setAttribute(\"data-osd-index\", index);\n        el.addEventListener(\"input\", (event) => {\n          setOpacity(index, event.target.value / 100, options);\n          if (\n            options.showRangeSlider ||\n            options.showRangeSlider === undefined\n          ) {\n            document.querySelector(\n              `[data-osdos='layer-opacity-slider'][data-osd-index='${index}']`\n            ).value = event.target.value;\n          }\n        });\n      });\n\n    /* Set opacity in slider and input based on the current OSD layer opacity */\n    orderedLayerInformation.forEach((el, index) => {\n      let currentOpacity = options.viewer.world.getItemAt(index).getOpacity();\n      if (options.showNumberInput || options.showNumberInput === undefined) {\n        document.querySelector(\n          `[data-osdos='layer-opacity-slider-value'][data-osd-index='${index}']`\n        ).value = currentOpacity * 100;\n      }\n      if (options.showRangeSlider || options.showRangeSlider === undefined) {\n        document.querySelector(\n          `[data-osdos='layer-opacity-slider'][data-osd-index='${index}']`\n        ).value = currentOpacity * 100;\n      }\n    });\n\n    /* Add layerpicker toggle button  */\n    if (options.showLayerPicker || options.showLayerPicker === undefined) {\n      const checkboxToggleButton = document.createElement(\"button\");\n      checkboxToggleButton.className = \"osdos-layer-picker-button\";\n      checkboxToggleButton.innerHTML =\n        options.layerPickerButtonText || \"Layer Picker\";\n      checkboxToggleButton.addEventListener(\n        \"click\",\n        toggleLayerPickerVisibility\n      );\n      opacitySliderWrapper.appendChild(checkboxToggleButton);\n    }\n\n    /* Disable first up- and last down-button */\n    disableButtons(options);\n  }\n\n  /**\n   * Toggles the visibility of the layerpicker\n   */\n  function toggleLayerPickerVisibility() {\n    let picker = document.getElementById(\"checkboxWrapperContent\");\n    picker.style.display = picker.style.display === \"block\" ? \"none\" : \"block\";\n  }\n\n  /**\n   * Orders the layers in options object as they are ordered in OSD\n   * @param {Object} options - The options-object given at plugin-setup\n   * @returns {Array} - Orderd array with all layers\n   */\n  function getLayerOrder(options) {\n    let itemAmount = options.viewer.world.getItemCount();\n    let tempLayerInformation = [];\n    for (let i = 0; i < itemAmount; i++) {\n      /*\n       * An Openseadragon tile stores only the tilesUrl, not the .dzi Url.\n       * Therefore we have to map these to compare and reorder our layerInformation Array.\n       * Every tileUrl ends with _files -> cut and replace it with .dzi and we have the providet source\n       * If no tileUrl is given we have a simple image, therefor we only use .url\n       */\n      let currentOsdItem = options.viewer.world.getItemAt(i);\n      let itemUrl = currentOsdItem.source.tilesUrl\n        ? `${currentOsdItem.source.tilesUrl.slice(0, -7)}.dzi`\n        : currentOsdItem.source.url;\n      let temp = options.layerInformation.filter((el) => el.source === itemUrl);\n      tempLayerInformation[i] = temp[0];\n    }\n    return tempLayerInformation;\n  }\n\n  /**\n   * Finds the Index of an image by the given source\n   * @param {String} source - The sourcepath of a layer\n   * @param {Object} options - The options-object given at plugin-setup\n   * @returns {number} - Index of the layer\n   */\n  function findIndexBySource(source, options) {\n    let itemAmount = options.viewer.world.getItemCount();\n    for (let i = 0; i < itemAmount; i++) {\n      let currentOsdItem = options.viewer.world.getItemAt(i);\n      let itemUrl = currentOsdItem.source.tilesUrl\n        ? `${currentOsdItem.source.tilesUrl.slice(0, -7)}.dzi`\n        : currentOsdItem.source.url;\n      if (source === itemUrl) return i;\n    }\n    return -1;\n  }\n\n  /**\n   * Changes the opacity to the given value based of the index\n   * @param {number} index - Index of the layer which will get the new opacity\n   * @param {number} opacity - New opacity for the layer\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function setOpacity(index, opacity, options) {\n    options.viewer.world.getItemAt(index).setOpacity(opacity);\n  }\n\n  /**\n   * Moves the image by the given values based of the index\n   * @param {number} index - Index of the layer which will get moved\n   * @param {number} x - Delta of the movement in x-direction\n   * @param {number} y - Delta of the movement in y-direction\n   */\n  function moveLayer(index, x, y) {\n    let currentPos = viewer.world.getItemAt(index).getBounds();\n    viewer.world\n      .getItemAt(index)\n      .setPosition(\n        new OpenSeadragon.Point(currentPos.x + x, currentPos.y + y),\n        true\n      );\n    // TODO: Rebuild the movement Tool\n  }\n\n  /**\n   * Moves the layer backwards if possible\n   * @param {String} source - The sourcepath of the layer\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function layerBackward(source, options) {\n    let currentIndex = findIndexBySource(source, options);\n    if (currentIndex !== 0) {\n      options.viewer.world.setItemIndex(\n        options.viewer.world.getItemAt(currentIndex),\n        currentIndex - 1\n      );\n      buildMarkup(options);\n      // Call this function again when the switched item is hidden\n      if (options.viewer.world.getItemAt(currentIndex).osdosHidden) {\n        layerBackward(source, options);\n      }\n    }\n  }\n\n  /**\n   * Moves the layer forward if possible\n   * @param {String} source - The sourcepath of the layer\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function layerForward(source, options) {\n    let currentIndex = findIndexBySource(source, options);\n    if (options.viewer.world.getItemCount() > currentIndex + 1) {\n      options.viewer.world.setItemIndex(\n        options.viewer.world.getItemAt(currentIndex),\n        currentIndex + 1\n      );\n      buildMarkup(options);\n      // Call this function again when the switched item is hidden\n      if (options.viewer.world.getItemAt(currentIndex).osdosHidden) {\n        layerForward(source, options);\n      }\n    }\n  }\n\n  /**\n   * Remove a layer, by setting the opacity to zero and therefore not rendering the corresponding markup\n   * @param {String} source - The sourcepath of the layer\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function removeLayer(source, options) {\n    let currentIndex = findIndexBySource(source, options);\n    setOpacity(currentIndex, 0, options);\n    options.viewer.world.getItemAt(currentIndex).osdosHidden = true;\n    buildMarkup(options);\n    if (options.showLayerPicker || options.showLayerPicker === undefined) {\n      document.querySelector(`[data-osdos-source=\"${source}\"]`).checked = false;\n    }\n  }\n\n  /**\n   * Adding a layer, by setting the opacity to max(1)\n   * @param {String} source - The sourcepath of the layer\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function addLayer(source, options) {\n    let currentIndex = findIndexBySource(source, options);\n    setOpacity(currentIndex, 1, options);\n    options.viewer.world.getItemAt(currentIndex).osdosHidden = false;\n    buildMarkup(options);\n    document.querySelector(`[data-osdos-source=\"${source}\"]`).checked = true;\n  }\n\n  /**\n   * Toggles the visibility of a layer based on a given event\n   * @param {Event} event - The clickevent of a checkbox\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function toggleVisibility(event, options) {\n    let index = findIndexBySource(\n      event.target.getAttribute(\"data-osdos-source\"),\n      options\n    );\n    if (event.target.checked && index != -1) {\n      addLayer(event.target.getAttribute(\"data-osdos-source\"), options);\n    } else if (!event.target.checked && index != -1) {\n      removeLayer(event.target.getAttribute(\"data-osdos-source\"), options);\n    }\n  }\n\n  /**\n   * Sets the disabled class for the first up-button and the last down button\n   * @param {Object} options - The options-object given at plugin-setup\n   */\n  function disableButtons(options) {\n    // Get all disabled buttons and remove disabled\n    document.querySelectorAll(\".opacity-slider-disabled\").forEach((el) => {\n      el.classList.remove(\"osdos-curser-not-allowed\");\n      el.disabled = false;\n    });\n    // Get last down button and set disabled\n    let firstElement = document.querySelector(\n      \"[data-osd-index='0'] [data-osdos='down-button']\"\n    );\n    if (firstElement !== null) {\n      firstElement.classList.add(\"osdos-curser-not-allowed\");\n      firstElement.disabled = true;\n    }\n    // Get first up button and set disabled\n    let lastElement = document.querySelector(\n      `[data-osd-index='${\n        options.viewer.world.getItemCount() - 1\n      }'] [data-osdos='up-button']`\n    );\n    if (lastElement !== null) {\n      lastElement.classList.add(\"osdos-curser-not-allowed\");\n      lastElement.disabled = true;\n    }\n  }\n})(OpenSeadragon);\n"]}