#= require ./dom
{ matches } = Rails
# Polyfill for CustomEvent in IE9+
# https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
CustomEvent = window.CustomEvent
if typeof CustomEvent isnt 'function'
CustomEvent = (event, params) ->
evt = document.createEvent('CustomEvent')
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)
evt
CustomEvent.prototype = window.Event.prototype
# Fix setting `defaultPrevented` when `preventDefault()` is called
# http://stackoverflow.com/questions/23349191/event-preventdefault-is-not-working-in-ie-11-for-custom-events
{ preventDefault } = CustomEvent.prototype
CustomEvent.prototype.preventDefault = ->
result = preventDefault.call(this)
if @cancelable and not @defaultPrevented
Object.defineProperty(this, 'defaultPrevented', get: -> true)
result
# Triggers a custom event on an element and returns false if the event result is false
# obj::
# a native DOM element
# name::
# string that corrspends to the event you want to trigger
# e.g. 'click', 'submit'
# data::
# data you want to pass when you dispatch an event
fire = Rails.fire = (obj, name, data) ->
event = new CustomEvent(
name,
bubbles: true,
cancelable: true,
detail: data,
)
obj.dispatchEvent(event)
!event.defaultPrevented
# Helper function, needed to provide consistent behavior in IE
Rails.stopEverything = (e) ->
fire(e.target, 'ujs:everythingStopped')
e.preventDefault()
e.stopPropagation()
e.stopImmediatePropagation()
# Delegates events
# to a specified parent `element`, which fires event `handler`
# for the specified `selector` when an event of `eventType` is triggered
# element::
# parent element that will listen for events e.g. document
# selector::
# css selector; or an object that has `selector` and `exclude` properties (see: Rails.matches)
# eventType::
# string representing the event e.g. 'submit', 'click'
# handler::
# the event handler to be called
Rails.delegate = (element, selector, eventType, handler) ->
element.addEventListener eventType, (e) ->
target = e.target
target = target.parentNode until not (target instanceof Element) or matches(target, selector)
if target instanceof Element and handler.call(target, e) == false
e.preventDefault()
e.stopPropagation()