| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.io.common"); |
| dojo.require("dojo.string"); |
| dojo.require("dojo.lang.extras"); |
| dojo.io.transports = []; |
| dojo.io.hdlrFuncNames = ["load", "error", "timeout"]; |
| dojo.io.Request = function (url, mimetype, transport, changeUrl) { |
| if ((arguments.length == 1) && (arguments[0].constructor == Object)) { |
| this.fromKwArgs(arguments[0]); |
| } else { |
| this.url = url; |
| if (mimetype) { |
| this.mimetype = mimetype; |
| } |
| if (transport) { |
| this.transport = transport; |
| } |
| if (arguments.length >= 4) { |
| this.changeUrl = changeUrl; |
| } |
| } |
| }; |
| dojo.lang.extend(dojo.io.Request, {url:"", mimetype:"text/plain", method:"GET", content:undefined, transport:undefined, changeUrl:undefined, formNode:undefined, sync:false, bindSuccess:false, useCache:false, preventCache:false, jsonFilter:function (value) { |
| if ((this.mimetype == "text/json-comment-filtered") || (this.mimetype == "application/json-comment-filtered")) { |
| var cStartIdx = value.indexOf("/*"); |
| var cEndIdx = value.lastIndexOf("*/"); |
| if ((cStartIdx == -1) || (cEndIdx == -1)) { |
| dojo.debug("your JSON wasn't comment filtered!"); |
| return ""; |
| } |
| return value.substring(cStartIdx + 2, cEndIdx); |
| } |
| dojo.debug("please consider using a mimetype of text/json-comment-filtered to avoid potential security issues with JSON endpoints"); |
| return value; |
| }, load:function (type, data, transportImplementation, kwArgs) { |
| }, error:function (type, error, transportImplementation, kwArgs) { |
| }, timeout:function (type, empty, transportImplementation, kwArgs) { |
| }, handle:function (type, data, transportImplementation, kwArgs) { |
| }, timeoutSeconds:0, abort:function () { |
| }, fromKwArgs:function (kwArgs) { |
| if (kwArgs["url"]) { |
| kwArgs.url = kwArgs.url.toString(); |
| } |
| if (kwArgs["formNode"]) { |
| kwArgs.formNode = dojo.byId(kwArgs.formNode); |
| } |
| if (!kwArgs["method"] && kwArgs["formNode"] && kwArgs["formNode"].method) { |
| kwArgs.method = kwArgs["formNode"].method; |
| } |
| if (!kwArgs["handle"] && kwArgs["handler"]) { |
| kwArgs.handle = kwArgs.handler; |
| } |
| if (!kwArgs["load"] && kwArgs["loaded"]) { |
| kwArgs.load = kwArgs.loaded; |
| } |
| if (!kwArgs["changeUrl"] && kwArgs["changeURL"]) { |
| kwArgs.changeUrl = kwArgs.changeURL; |
| } |
| kwArgs.encoding = dojo.lang.firstValued(kwArgs["encoding"], djConfig["bindEncoding"], ""); |
| kwArgs.sendTransport = dojo.lang.firstValued(kwArgs["sendTransport"], djConfig["ioSendTransport"], false); |
| var isFunction = dojo.lang.isFunction; |
| for (var x = 0; x < dojo.io.hdlrFuncNames.length; x++) { |
| var fn = dojo.io.hdlrFuncNames[x]; |
| if (kwArgs[fn] && isFunction(kwArgs[fn])) { |
| continue; |
| } |
| if (kwArgs["handle"] && isFunction(kwArgs["handle"])) { |
| kwArgs[fn] = kwArgs.handle; |
| } |
| } |
| dojo.lang.mixin(this, kwArgs); |
| }}); |
| dojo.io.Error = function (msg, type, num) { |
| this.message = msg; |
| this.type = type || "unknown"; |
| this.number = num || 0; |
| }; |
| dojo.io.transports.addTransport = function (name) { |
| this.push(name); |
| this[name] = dojo.io[name]; |
| }; |
| dojo.io.bind = function (request) { |
| if (!(request instanceof dojo.io.Request)) { |
| try { |
| request = new dojo.io.Request(request); |
| } |
| catch (e) { |
| dojo.debug(e); |
| } |
| } |
| var tsName = ""; |
| if (request["transport"]) { |
| tsName = request["transport"]; |
| if (!this[tsName]) { |
| dojo.io.sendBindError(request, "No dojo.io.bind() transport with name '" + request["transport"] + "'."); |
| return request; |
| } |
| if (!this[tsName].canHandle(request)) { |
| dojo.io.sendBindError(request, "dojo.io.bind() transport with name '" + request["transport"] + "' cannot handle this type of request."); |
| return request; |
| } |
| } else { |
| for (var x = 0; x < dojo.io.transports.length; x++) { |
| var tmp = dojo.io.transports[x]; |
| if ((this[tmp]) && (this[tmp].canHandle(request))) { |
| tsName = tmp; |
| break; |
| } |
| } |
| if (tsName == "") { |
| dojo.io.sendBindError(request, "None of the loaded transports for dojo.io.bind()" + " can handle the request."); |
| return request; |
| } |
| } |
| this[tsName].bind(request); |
| request.bindSuccess = true; |
| return request; |
| }; |
| dojo.io.sendBindError = function (request, message) { |
| if ((typeof request.error == "function" || typeof request.handle == "function") && (typeof setTimeout == "function" || typeof setTimeout == "object")) { |
| var errorObject = new dojo.io.Error(message); |
| setTimeout(function () { |
| request[(typeof request.error == "function") ? "error" : "handle"]("error", errorObject, null, request); |
| }, 50); |
| } else { |
| dojo.raise(message); |
| } |
| }; |
| dojo.io.queueBind = function (request) { |
| if (!(request instanceof dojo.io.Request)) { |
| try { |
| request = new dojo.io.Request(request); |
| } |
| catch (e) { |
| dojo.debug(e); |
| } |
| } |
| var oldLoad = request.load; |
| request.load = function () { |
| dojo.io._queueBindInFlight = false; |
| var ret = oldLoad.apply(this, arguments); |
| dojo.io._dispatchNextQueueBind(); |
| return ret; |
| }; |
| var oldErr = request.error; |
| request.error = function () { |
| dojo.io._queueBindInFlight = false; |
| var ret = oldErr.apply(this, arguments); |
| dojo.io._dispatchNextQueueBind(); |
| return ret; |
| }; |
| dojo.io._bindQueue.push(request); |
| dojo.io._dispatchNextQueueBind(); |
| return request; |
| }; |
| dojo.io._dispatchNextQueueBind = function () { |
| if (!dojo.io._queueBindInFlight) { |
| dojo.io._queueBindInFlight = true; |
| if (dojo.io._bindQueue.length > 0) { |
| dojo.io.bind(dojo.io._bindQueue.shift()); |
| } else { |
| dojo.io._queueBindInFlight = false; |
| } |
| } |
| }; |
| dojo.io._bindQueue = []; |
| dojo.io._queueBindInFlight = false; |
| dojo.io.argsFromMap = function (map, encoding, last) { |
| var enc = /utf/i.test(encoding || "") ? encodeURIComponent : dojo.string.encodeAscii; |
| var mapped = []; |
| var control = new Object(); |
| for (var name in map) { |
| var domap = function (elt) { |
| var val = enc(name) + "=" + enc(elt); |
| mapped[(last == name) ? "push" : "unshift"](val); |
| }; |
| if (!control[name]) { |
| var value = map[name]; |
| if (dojo.lang.isArray(value)) { |
| dojo.lang.forEach(value, domap); |
| } else { |
| domap(value); |
| } |
| } |
| } |
| return mapped.join("&"); |
| }; |
| dojo.io.setIFrameSrc = function (iframe, src, replace) { |
| try { |
| var r = dojo.render.html; |
| if (!replace) { |
| if (r.safari) { |
| iframe.location = src; |
| } else { |
| frames[iframe.name].location = src; |
| } |
| } else { |
| var idoc; |
| if (r.ie) { |
| idoc = iframe.contentWindow.document; |
| } else { |
| if (r.safari) { |
| idoc = iframe.document; |
| } else { |
| idoc = iframe.contentWindow; |
| } |
| } |
| if (!idoc) { |
| iframe.location = src; |
| return; |
| } else { |
| idoc.location.replace(src); |
| } |
| } |
| } |
| catch (e) { |
| dojo.debug(e); |
| dojo.debug("setIFrameSrc: " + e); |
| } |
| }; |
| |