(function() {
  /** @type {import("../htmx").HtmxInternalApi} */
  var api

  htmx.defineExtension('multi-swap', {
    init: function(apiRef) {
      api = apiRef
    },
    isInlineSwap: function(swapStyle) {
      return swapStyle.indexOf('multi:') === 0
    },
    handleSwap: function(swapStyle, target, fragment, settleInfo) {
      if (swapStyle.indexOf('multi:') === 0) {
        var selectorToSwapStyle = {}
        var elements = swapStyle.replace(/^multi\s*:\s*/, '').split(/\s*,\s*/)

        elements.forEach(function(element) {
          var split = element.split(/\s*:\s*/)
          var elementSelector = split[0]
          var elementSwapStyle = typeof (split[1]) !== 'undefined' ? split[1] : 'innerHTML'

          if (elementSelector.charAt(0) !== '#') {
            console.error("HTMX multi-swap: unsupported selector '" + elementSelector + "'. Only ID selectors starting with '#' are supported.")
            return
          }

          selectorToSwapStyle[elementSelector] = elementSwapStyle
        })

        for (var selector in selectorToSwapStyle) {
          var swapStyle = selectorToSwapStyle[selector]
          var elementToSwap = fragment.querySelector(selector)
          if (elementToSwap) {
            api.oobSwap(swapStyle, elementToSwap, settleInfo)
          } else {
            console.warn("HTMX multi-swap: selector '" + selector + "' not found in source content.")
          }
        }

        return true
      }
    }
  })
})()
