{defer, dispatch} = Turbolinks handleEvent = (eventName, handler) -> document.addEventListener(eventName, handler, false) translateEvent = ({from, to}) -> handler = (event) -> event = dispatch(to, target: event.target, cancelable: event.cancelable, data: event.data) event.preventDefault() if event.defaultPrevented handleEvent(from, handler) translateEvent from: "turbolinks:click", to: "page:before-change" translateEvent from: "turbolinks:request-start", to: "page:fetch" translateEvent from: "turbolinks:request-end", to: "page:receive" translateEvent from: "turbolinks:before-cache", to: "page:before-unload" translateEvent from: "turbolinks:render", to: "page:update" translateEvent from: "turbolinks:load", to: "page:change" translateEvent from: "turbolinks:load", to: "page:update" loaded = false handleEvent "DOMContentLoaded", -> defer -> loaded = true handleEvent "turbolinks:load", -> if loaded dispatch("page:load") jQuery?(document).on "ajaxSuccess", (event, xhr, settings) -> if jQuery.trim(xhr.responseText).length > 0 dispatch("page:update")