summaryrefslogtreecommitdiff
path: root/js/dojo-1.7.2/dojox/rails.js
diff options
context:
space:
mode:
authorTristan Zur <tzur@web.web.ccwn.org>2014-03-27 22:27:47 +0100
committerTristan Zur <tzur@web.web.ccwn.org>2014-03-27 22:27:47 +0100
commitb62676ca5d3d6f6ba3f019ea3f99722e165a98d8 (patch)
tree86722cb80f07d4569f90088eeaea2fc2f6e2ef94 /js/dojo-1.7.2/dojox/rails.js
Initial commit of intern.ccwn.org contentsHEADmaster
Diffstat (limited to 'js/dojo-1.7.2/dojox/rails.js')
-rw-r--r--js/dojo-1.7.2/dojox/rails.js148
1 files changed, 148 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/rails.js b/js/dojo-1.7.2/dojox/rails.js
new file mode 100644
index 0000000..4e0a79e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/rails.js
@@ -0,0 +1,148 @@
+//>>built
+// wrapped by build app
+define("dojox/rails", ["dijit","dojo","dojox","dojo/require!dojo/NodeList-traverse"], function(dijit,dojo,dojox){
+dojo.provide("dojox.rails");
+dojo.require("dojo.NodeList-traverse");
+
+dojox.rails.live = function(selector, evtName, fn){
+ if (dojo.isIE && evtName.match(/^(on)?submit$/i)){
+ dojox.rails.live(selector, "click", function(evt){
+ var target = evt.target, tag = target.tagName.toLowerCase();
+ if ((tag == "input" || tag == "button") && dojo.attr(target, "type").toLowerCase() == "submit"){
+ var form = dojo.query(target).closest("form");
+ if (form.length){
+ var h = dojo.connect(form[0], "submit", function(evt){
+ dojo.disconnect(h);
+ fn.call(evt.target, evt);
+ });
+ }
+ }
+ });
+ }else{
+ dojo.connect(dojo.body(), evtName, function(evt){
+ var nl = dojo.query(evt.target).closest(selector);
+ if (nl.length){
+ fn.call(nl[0], evt);
+ }
+ });
+ }
+};
+
+dojo.ready((function(d, dr, dg){
+ return function() {
+ var q = d.query, live = dr.live,
+ csrfToken = q("meta[name=csrf-token]").attr("content"),
+ csrfParam = q("meta[name=csrf-param]").attr("content");
+
+ var createFormForLink = function(url, method){
+ var form = '<form style="display:none" method="post" action="'+ url +'">' +
+ '<input type="hidden" name="_method" value="'+ method +'" />' +
+ '<input type="hidden" name="'+ csrfParam +'" value="'+ csrfToken +'" />' +
+ '</form>';
+ return dojo.place(form, dojo.body());
+ };
+
+ var disable = function(elements){
+ d.forEach(elements, function(node){
+ if (!d.attr(node, "disabled")){
+ var attr = node.tagName.toLowerCase() == "input" ? "value" : "innerHTML";
+ var message = d.attr(node, "data-disable-with");
+ var originalValue = d.attr(node, attr);
+ d.attr(node, "disabled", true);
+ d.attr(node, "data-original-value", originalValue);
+ d.attr(node, attr, message);
+ }
+ });
+ };
+
+ var typeMap = {
+ "text": "text",
+ "json": "application/json",
+ "json-comment-optional": "text",
+ "json-comment-filtered": "text",
+ "javascript": "application/javascript",
+ "xml": "text/xml"
+ };
+
+ var handleRemote = function(evt){
+ var el = evt.target, tag = el.tagName.toLowerCase();
+ var content = tag.toLowerCase() == "form" ? d.formToObject(el) : {},
+ type = d.attr(el, "data-type") || "javascript",
+ method = (d.attr(el, "method") || d.attr(el, "data-method") || "get").toLowerCase(),
+ url = d.attr(el, "action") || d.attr(el, "href");
+
+ if (tag != "form" && method != "get"){
+ el = createFormForLink(url, method);
+ method = "POST";
+ }
+ evt.preventDefault();
+
+
+ // ajax:loading, ajax:loaded, and ajax:interactive are not supported
+ d.publish("ajax:before", [el]);
+ var deferred = d.xhr(method, {
+ url: url,
+ headers: { "Accept": typeMap[type] },
+ content: content,
+ handleAs: type,
+ load: function(response, ioArgs) {d.publish("ajax:success", [el, response, ioArgs]);},
+ error: function(response, ioArgs) {d.publish("ajax:failure", [el, response, ioArgs]);},
+ handle: function(response, ioArgs) {d.publish("ajax:complete", [el, response, ioArgs]);}
+ });
+ d.publish("ajax:after", [el]);
+ };
+
+ var handleEnable = function(el){
+ q("*[data-disable-with][disabled]", el).forEach(function(node){
+ var attr = node.tagName.toLowerCase() == "input" ? "value" : "innerHTML";
+ var value = d.attr(node, "data-original-value");
+ d.attr(node, "disabled", false);
+ d.attr(node, "data-original-value", null);
+ d.attr(node, attr, value);
+ });
+ };
+
+ var handleDataMethod = function(evt){
+ var el = evt.target, form = createFormForLink(el.href, dojo.attr(el, "data-method"));
+ evt.preventDefault();
+ form.submit();
+ };
+
+ var handleFormSubmit = function(evt){
+ var el = evt.target, elements = q("*[data-disable-with]", el);
+ if (elements.length){ disable(elements); }
+ if (d.attr(el, "data-remote")){
+ evt.preventDefault();
+ handleRemote(evt);
+ }
+ };
+
+ var handleConfirm = function(evt){
+ var proceed = dg.confirm(d.attr(evt.target, "data-confirm"));
+ if (!proceed){
+ evt.preventDefault();
+ }else if (d.attr(evt.target, "data-remote")){
+ handleRemote(evt);
+ }
+ };
+
+ // Register data-{action} elements. Order is important since the return values
+ // from previously called functions in the connect chain influence whether
+ // or not the next function in the chain is called.
+
+ // Register data-confirm elements
+ live("*[data-confirm]", "click", handleConfirm);
+
+ // data-disable-with only applies to forms
+ d.subscribe("ajax:complete", handleEnable);
+
+ // Register data-remote elements
+ live("a[data-remote]:not([data-confirm])", "click", handleRemote);
+ live("a[data-method]:not([data-remote])", "click", handleDataMethod);
+
+ // Handle form submits
+ live("form", "submit", handleFormSubmit);
+ };
+})(dojo, dojox.rails, dojo.global));
+
+});