diff --git a/priv/src/phoenix_html.js b/priv/src/phoenix_html.js
new file mode 100644
index 00000000..d905ba35
--- /dev/null
+++ b/priv/src/phoenix_html.js
@@ -0,0 +1,80 @@
+var PolyfillEvent = eventConstructor();
+
+function eventConstructor() {
+ if (typeof window.CustomEvent === "function") return window.CustomEvent;
+ // IE<=9 Support
+ function CustomEvent(event, params) {
+ params = params || {bubbles: false, cancelable: false, detail: undefined};
+ var evt = document.createEvent('CustomEvent');
+ evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
+ return evt;
+ }
+ CustomEvent.prototype = window.Event.prototype;
+ return CustomEvent;
+}
+
+function buildHiddenInput(name, value) {
+ var input = document.createElement("input");
+ input.type = "hidden";
+ input.name = name;
+ input.value = value;
+ return input;
+}
+
+function handleClick(element, targetModifierKey) {
+ var to = element.getAttribute("data-to"),
+ method = buildHiddenInput("_method", element.getAttribute("data-method")),
+ csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")),
+ form = document.createElement("form"),
+ submit = document.createElement("input"),
+ target = element.getAttribute("target");
+
+ form.method = (element.getAttribute("data-method") === "get") ? "get" : "post";
+ form.action = to;
+ form.style.display = "hidden";
+
+ if (target) form.target = target;
+ else if (targetModifierKey) form.target = "_blank";
+
+ form.appendChild(csrf);
+ form.appendChild(method);
+ document.body.appendChild(form);
+
+ // Insert a button and click it instead of using `form.submit`
+ // because the `submit` function does not emit a `submit` event.
+ submit.type = "submit";
+ form.appendChild(submit);
+ submit.click();
+}
+
+window.addEventListener("click", function(e) {
+ var element = e.target;
+ if (e.defaultPrevented) return;
+
+ while (element && element.getAttribute) {
+ var phoenixLinkEvent = new PolyfillEvent('phoenix.link.click', {
+ "bubbles": true, "cancelable": true
+ });
+
+ if (!element.dispatchEvent(phoenixLinkEvent)) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return false;
+ }
+
+ if (element.getAttribute("data-method")) {
+ handleClick(element, e.metaKey || e.shiftKey);
+ e.preventDefault();
+ return false;
+ } else {
+ element = element.parentNode;
+ }
+ }
+}, false);
+
+window.addEventListener('phoenix.link.click', function (e) {
+ var message = e.target.getAttribute("data-confirm");
+ if(message && !window.confirm(message)) {
+ e.preventDefault();
+ }
+}, false);
\ No newline at end of file