(function() {
  'use strict'

  // Save a reference to the global object (window in the browser)
  var _root = this

  function dependsOn(pathSpec, url) {
    if (pathSpec === 'ignore') {
      return false
    }
    var dependencyPath = pathSpec.split('/')
    var urlPath = url.split('/')
    for (var i = 0; i < urlPath.length; i++) {
      var dependencyElement = dependencyPath.shift()
      var pathElement = urlPath[i]
      if (dependencyElement !== pathElement && dependencyElement !== '*') {
        return false
      }
      if (dependencyPath.length === 0 || (dependencyPath.length === 1 && dependencyPath[0] === '')) {
        return true
      }
    }
    return false
  }

  function refreshPath(path) {
    var eltsWithDeps = htmx.findAll('[path-deps]')
    for (var i = 0; i < eltsWithDeps.length; i++) {
      var elt = eltsWithDeps[i]
      if (dependsOn(elt.getAttribute('path-deps'), path)) {
        htmx.trigger(elt, 'path-deps')
      }
    }
  }

  htmx.defineExtension('path-deps', {
    onEvent: function(name, evt) {
      if (name === 'htmx:beforeOnLoad') {
        var config = evt.detail.requestConfig
        // mutating call
        if (config.verb !== 'get' && evt.target.getAttribute('path-deps') !== 'ignore') {
          refreshPath(config.path)
        }
      }
    }
  })

  /**
     *  ********************
     *  Expose functionality
     *  ********************
     */

  _root.PathDeps = {
    refresh: function(path) {
      refreshPath(path)
    }
  }
}).call(this)
