Subversion Repositories Applications.papyrus

Compare Revisions

Ignore whitespace Rev 1317 → Rev 1318

/trunk/api/js/dojo/src/io/cookie.js
New file
0,0 → 1,102
/*
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.cookie");
dojo.io.cookie.setCookie = function (name, value, days, path, domain, secure) {
var expires = -1;
if ((typeof days == "number") && (days >= 0)) {
var d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
expires = d.toGMTString();
}
value = escape(value);
document.cookie = name + "=" + value + ";" + (expires != -1 ? " expires=" + expires + ";" : "") + (path ? "path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : "");
};
dojo.io.cookie.set = dojo.io.cookie.setCookie;
dojo.io.cookie.getCookie = function (name) {
var idx = document.cookie.lastIndexOf(name + "=");
if (idx == -1) {
return null;
}
var value = document.cookie.substring(idx + name.length + 1);
var end = value.indexOf(";");
if (end == -1) {
end = value.length;
}
value = value.substring(0, end);
value = unescape(value);
return value;
};
dojo.io.cookie.get = dojo.io.cookie.getCookie;
dojo.io.cookie.deleteCookie = function (name) {
dojo.io.cookie.setCookie(name, "-", 0);
};
dojo.io.cookie.setObjectCookie = function (name, obj, days, path, domain, secure, clearCurrent) {
if (arguments.length == 5) {
clearCurrent = domain;
domain = null;
secure = null;
}
var pairs = [], cookie, value = "";
if (!clearCurrent) {
cookie = dojo.io.cookie.getObjectCookie(name);
}
if (days >= 0) {
if (!cookie) {
cookie = {};
}
for (var prop in obj) {
if (obj[prop] == null) {
delete cookie[prop];
} else {
if ((typeof obj[prop] == "string") || (typeof obj[prop] == "number")) {
cookie[prop] = obj[prop];
}
}
}
prop = null;
for (var prop in cookie) {
pairs.push(escape(prop) + "=" + escape(cookie[prop]));
}
value = pairs.join("&");
}
dojo.io.cookie.setCookie(name, value, days, path, domain, secure);
};
dojo.io.cookie.getObjectCookie = function (name) {
var values = null, cookie = dojo.io.cookie.getCookie(name);
if (cookie) {
values = {};
var pairs = cookie.split("&");
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split("=");
var value = pair[1];
if (isNaN(value)) {
value = unescape(pair[1]);
}
values[unescape(pair[0])] = value;
}
}
return values;
};
dojo.io.cookie.isSupported = function () {
if (typeof navigator.cookieEnabled != "boolean") {
dojo.io.cookie.setCookie("__TestingYourBrowserForCookieSupport__", "CookiesAllowed", 90, null);
var cookieVal = dojo.io.cookie.getCookie("__TestingYourBrowserForCookieSupport__");
navigator.cookieEnabled = (cookieVal == "CookiesAllowed");
if (navigator.cookieEnabled) {
this.deleteCookie("__TestingYourBrowserForCookieSupport__");
}
}
return navigator.cookieEnabled;
};
if (!dojo.io.cookies) {
dojo.io.cookies = dojo.io.cookie;
}
 
/trunk/api/js/dojo/src/io/BrowserIO.js
New file
0,0 → 1,492
/*
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.BrowserIO");
dojo.require("dojo.io.common");
dojo.require("dojo.lang.array");
dojo.require("dojo.lang.func");
dojo.require("dojo.string.extras");
dojo.require("dojo.dom");
dojo.require("dojo.undo.browser");
if (!dj_undef("window")) {
dojo.io.checkChildrenForFile = function (node) {
var hasFile = false;
var inputs = node.getElementsByTagName("input");
dojo.lang.forEach(inputs, function (input) {
if (hasFile) {
return;
}
if (input.getAttribute("type") == "file") {
hasFile = true;
}
});
return hasFile;
};
dojo.io.formHasFile = function (formNode) {
return dojo.io.checkChildrenForFile(formNode);
};
dojo.io.updateNode = function (node, urlOrArgs) {
node = dojo.byId(node);
var args = urlOrArgs;
if (dojo.lang.isString(urlOrArgs)) {
args = {url:urlOrArgs};
}
args.mimetype = "text/html";
args.load = function (t, d, e) {
while (node.firstChild) {
dojo.dom.destroyNode(node.firstChild);
}
node.innerHTML = d;
};
dojo.io.bind(args);
};
dojo.io.formFilter = function (node) {
var type = (node.type || "").toLowerCase();
return !node.disabled && node.name && !dojo.lang.inArray(["file", "submit", "image", "reset", "button"], type);
};
dojo.io.encodeForm = function (formNode, encoding, formFilter) {
if ((!formNode) || (!formNode.tagName) || (!formNode.tagName.toLowerCase() == "form")) {
dojo.raise("Attempted to encode a non-form element.");
}
if (!formFilter) {
formFilter = dojo.io.formFilter;
}
var enc = /utf/i.test(encoding || "") ? encodeURIComponent : dojo.string.encodeAscii;
var values = [];
for (var i = 0; i < formNode.elements.length; i++) {
var elm = formNode.elements[i];
if (!elm || elm.tagName.toLowerCase() == "fieldset" || !formFilter(elm)) {
continue;
}
var name = enc(elm.name);
var type = elm.type.toLowerCase();
if (type == "select-multiple") {
for (var j = 0; j < elm.options.length; j++) {
if (elm.options[j].selected) {
values.push(name + "=" + enc(elm.options[j].value));
}
}
} else {
if (dojo.lang.inArray(["radio", "checkbox"], type)) {
if (elm.checked) {
values.push(name + "=" + enc(elm.value));
}
} else {
values.push(name + "=" + enc(elm.value));
}
}
}
var inputs = formNode.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type.toLowerCase() == "image" && input.form == formNode && formFilter(input)) {
var name = enc(input.name);
values.push(name + "=" + enc(input.value));
values.push(name + ".x=0");
values.push(name + ".y=0");
}
}
return values.join("&") + "&";
};
dojo.io.FormBind = function (args) {
this.bindArgs = {};
if (args && args.formNode) {
this.init(args);
} else {
if (args) {
this.init({formNode:args});
}
}
};
dojo.lang.extend(dojo.io.FormBind, {form:null, bindArgs:null, clickedButton:null, init:function (args) {
var form = dojo.byId(args.formNode);
if (!form || !form.tagName || form.tagName.toLowerCase() != "form") {
throw new Error("FormBind: Couldn't apply, invalid form");
} else {
if (this.form == form) {
return;
} else {
if (this.form) {
throw new Error("FormBind: Already applied to a form");
}
}
}
dojo.lang.mixin(this.bindArgs, args);
this.form = form;
this.connect(form, "onsubmit", "submit");
for (var i = 0; i < form.elements.length; i++) {
var node = form.elements[i];
if (node && node.type && dojo.lang.inArray(["submit", "button"], node.type.toLowerCase())) {
this.connect(node, "onclick", "click");
}
}
var inputs = form.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type.toLowerCase() == "image" && input.form == form) {
this.connect(input, "onclick", "click");
}
}
}, onSubmit:function (form) {
return true;
}, submit:function (e) {
e.preventDefault();
if (this.onSubmit(this.form)) {
dojo.io.bind(dojo.lang.mixin(this.bindArgs, {formFilter:dojo.lang.hitch(this, "formFilter")}));
}
}, click:function (e) {
var node = e.currentTarget;
if (node.disabled) {
return;
}
this.clickedButton = node;
}, formFilter:function (node) {
var type = (node.type || "").toLowerCase();
var accept = false;
if (node.disabled || !node.name) {
accept = false;
} else {
if (dojo.lang.inArray(["submit", "button", "image"], type)) {
if (!this.clickedButton) {
this.clickedButton = node;
}
accept = node == this.clickedButton;
} else {
accept = !dojo.lang.inArray(["file", "submit", "reset", "button"], type);
}
}
return accept;
}, connect:function (srcObj, srcFcn, targetFcn) {
if (dojo.evalObjPath("dojo.event.connect")) {
dojo.event.connect(srcObj, srcFcn, this, targetFcn);
} else {
var fcn = dojo.lang.hitch(this, targetFcn);
srcObj[srcFcn] = function (e) {
if (!e) {
e = window.event;
}
if (!e.currentTarget) {
e.currentTarget = e.srcElement;
}
if (!e.preventDefault) {
e.preventDefault = function () {
window.event.returnValue = false;
};
}
fcn(e);
};
}
}});
dojo.io.XMLHTTPTransport = new function () {
var _this = this;
var _cache = {};
this.useCache = false;
this.preventCache = false;
function getCacheKey(url, query, method) {
return url + "|" + query + "|" + method.toLowerCase();
}
function addToCache(url, query, method, http) {
_cache[getCacheKey(url, query, method)] = http;
}
function getFromCache(url, query, method) {
return _cache[getCacheKey(url, query, method)];
}
this.clearCache = function () {
_cache = {};
};
function doLoad(kwArgs, http, url, query, useCache) {
if (((http.status >= 200) && (http.status < 300)) || (http.status == 304) || (location.protocol == "file:" && (http.status == 0 || http.status == undefined)) || (location.protocol == "chrome:" && (http.status == 0 || http.status == undefined))) {
var ret;
if (kwArgs.method.toLowerCase() == "head") {
var headers = http.getAllResponseHeaders();
ret = {};
ret.toString = function () {
return headers;
};
var values = headers.split(/[\r\n]+/g);
for (var i = 0; i < values.length; i++) {
var pair = values[i].match(/^([^:]+)\s*:\s*(.+)$/i);
if (pair) {
ret[pair[1]] = pair[2];
}
}
} else {
if (kwArgs.mimetype == "text/javascript") {
try {
ret = dj_eval(http.responseText);
}
catch (e) {
dojo.debug(e);
dojo.debug(http.responseText);
ret = null;
}
} else {
if (kwArgs.mimetype == "text/json" || kwArgs.mimetype == "application/json") {
try {
ret = dj_eval("(" + http.responseText + ")");
}
catch (e) {
dojo.debug(e);
dojo.debug(http.responseText);
ret = false;
}
} else {
if ((kwArgs.mimetype == "application/xml") || (kwArgs.mimetype == "text/xml")) {
ret = http.responseXML;
if (!ret || typeof ret == "string" || !http.getResponseHeader("Content-Type")) {
ret = dojo.dom.createDocumentFromText(http.responseText);
}
} else {
ret = http.responseText;
}
}
}
}
if (useCache) {
addToCache(url, query, kwArgs.method, http);
}
kwArgs[(typeof kwArgs.load == "function") ? "load" : "handle"]("load", ret, http, kwArgs);
} else {
var errObj = new dojo.io.Error("XMLHttpTransport Error: " + http.status + " " + http.statusText);
kwArgs[(typeof kwArgs.error == "function") ? "error" : "handle"]("error", errObj, http, kwArgs);
}
}
function setHeaders(http, kwArgs) {
if (kwArgs["headers"]) {
for (var header in kwArgs["headers"]) {
if (header.toLowerCase() == "content-type" && !kwArgs["contentType"]) {
kwArgs["contentType"] = kwArgs["headers"][header];
} else {
http.setRequestHeader(header, kwArgs["headers"][header]);
}
}
}
}
this.inFlight = [];
this.inFlightTimer = null;
this.startWatchingInFlight = function () {
if (!this.inFlightTimer) {
this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();", 10);
}
};
this.watchInFlight = function () {
var now = null;
if (!dojo.hostenv._blockAsync && !_this._blockAsync) {
for (var x = this.inFlight.length - 1; x >= 0; x--) {
try {
var tif = this.inFlight[x];
if (!tif || tif.http._aborted || !tif.http.readyState) {
this.inFlight.splice(x, 1);
continue;
}
if (4 == tif.http.readyState) {
this.inFlight.splice(x, 1);
doLoad(tif.req, tif.http, tif.url, tif.query, tif.useCache);
} else {
if (tif.startTime) {
if (!now) {
now = (new Date()).getTime();
}
if (tif.startTime + (tif.req.timeoutSeconds * 1000) < now) {
if (typeof tif.http.abort == "function") {
tif.http.abort();
}
this.inFlight.splice(x, 1);
tif.req[(typeof tif.req.timeout == "function") ? "timeout" : "handle"]("timeout", null, tif.http, tif.req);
}
}
}
}
catch (e) {
try {
var errObj = new dojo.io.Error("XMLHttpTransport.watchInFlight Error: " + e);
tif.req[(typeof tif.req.error == "function") ? "error" : "handle"]("error", errObj, tif.http, tif.req);
}
catch (e2) {
dojo.debug("XMLHttpTransport error callback failed: " + e2);
}
}
}
}
clearTimeout(this.inFlightTimer);
if (this.inFlight.length == 0) {
this.inFlightTimer = null;
return;
}
this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();", 10);
};
var hasXmlHttp = dojo.hostenv.getXmlhttpObject() ? true : false;
this.canHandle = function (kwArgs) {
return hasXmlHttp && dojo.lang.inArray(["text/plain", "text/html", "application/xml", "text/xml", "text/javascript", "text/json", "application/json"], (kwArgs["mimetype"].toLowerCase() || "")) && !(kwArgs["formNode"] && dojo.io.formHasFile(kwArgs["formNode"]));
};
this.multipartBoundary = "45309FFF-BD65-4d50-99C9-36986896A96F";
this.bind = function (kwArgs) {
if (!kwArgs["url"]) {
if (!kwArgs["formNode"] && (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"] || kwArgs["watchForURL"]) && (!djConfig.preventBackButtonFix)) {
dojo.deprecated("Using dojo.io.XMLHTTPTransport.bind() to add to browser history without doing an IO request", "Use dojo.undo.browser.addToHistory() instead.", "0.4");
dojo.undo.browser.addToHistory(kwArgs);
return true;
}
}
var url = kwArgs.url;
var query = "";
if (kwArgs["formNode"]) {
var ta = kwArgs.formNode.getAttribute("action");
if ((ta) && (!kwArgs["url"])) {
url = ta;
}
var tp = kwArgs.formNode.getAttribute("method");
if ((tp) && (!kwArgs["method"])) {
kwArgs.method = tp;
}
query += dojo.io.encodeForm(kwArgs.formNode, kwArgs.encoding, kwArgs["formFilter"]);
}
if (url.indexOf("#") > -1) {
dojo.debug("Warning: dojo.io.bind: stripping hash values from url:", url);
url = url.split("#")[0];
}
if (kwArgs["file"]) {
kwArgs.method = "post";
}
if (!kwArgs["method"]) {
kwArgs.method = "get";
}
if (kwArgs.method.toLowerCase() == "get") {
kwArgs.multipart = false;
} else {
if (kwArgs["file"]) {
kwArgs.multipart = true;
} else {
if (!kwArgs["multipart"]) {
kwArgs.multipart = false;
}
}
}
if (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"]) {
dojo.undo.browser.addToHistory(kwArgs);
}
var content = kwArgs["content"] || {};
if (kwArgs.sendTransport) {
content["dojo.transport"] = "xmlhttp";
}
do {
if (kwArgs.postContent) {
query = kwArgs.postContent;
break;
}
if (content) {
query += dojo.io.argsFromMap(content, kwArgs.encoding);
}
if (kwArgs.method.toLowerCase() == "get" || !kwArgs.multipart) {
break;
}
var t = [];
if (query.length) {
var q = query.split("&");
for (var i = 0; i < q.length; ++i) {
if (q[i].length) {
var p = q[i].split("=");
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + p[0] + "\"", "", p[1]);
}
}
}
if (kwArgs.file) {
if (dojo.lang.isArray(kwArgs.file)) {
for (var i = 0; i < kwArgs.file.length; ++i) {
var o = kwArgs.file[i];
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + o.name + "\"; filename=\"" + ("fileName" in o ? o.fileName : o.name) + "\"", "Content-Type: " + ("contentType" in o ? o.contentType : "application/octet-stream"), "", o.content);
}
} else {
var o = kwArgs.file;
t.push("--" + this.multipartBoundary, "Content-Disposition: form-data; name=\"" + o.name + "\"; filename=\"" + ("fileName" in o ? o.fileName : o.name) + "\"", "Content-Type: " + ("contentType" in o ? o.contentType : "application/octet-stream"), "", o.content);
}
}
if (t.length) {
t.push("--" + this.multipartBoundary + "--", "");
query = t.join("\r\n");
}
} while (false);
var async = kwArgs["sync"] ? false : true;
var preventCache = kwArgs["preventCache"] || (this.preventCache == true && kwArgs["preventCache"] != false);
var useCache = kwArgs["useCache"] == true || (this.useCache == true && kwArgs["useCache"] != false);
if (!preventCache && useCache) {
var cachedHttp = getFromCache(url, query, kwArgs.method);
if (cachedHttp) {
doLoad(kwArgs, cachedHttp, url, query, false);
return;
}
}
var http = dojo.hostenv.getXmlhttpObject(kwArgs);
var received = false;
if (async) {
var startTime = this.inFlight.push({"req":kwArgs, "http":http, "url":url, "query":query, "useCache":useCache, "startTime":kwArgs.timeoutSeconds ? (new Date()).getTime() : 0});
this.startWatchingInFlight();
} else {
_this._blockAsync = true;
}
if (kwArgs.method.toLowerCase() == "post") {
if (!kwArgs.user) {
http.open("POST", url, async);
} else {
http.open("POST", url, async, kwArgs.user, kwArgs.password);
}
setHeaders(http, kwArgs);
http.setRequestHeader("Content-Type", kwArgs.multipart ? ("multipart/form-data; boundary=" + this.multipartBoundary) : (kwArgs.contentType || "application/x-www-form-urlencoded"));
try {
http.send(query);
}
catch (e) {
if (typeof http.abort == "function") {
http.abort();
}
doLoad(kwArgs, {status:404}, url, query, useCache);
}
} else {
var tmpUrl = url;
if (query != "") {
tmpUrl += (tmpUrl.indexOf("?") > -1 ? "&" : "?") + query;
}
if (preventCache) {
tmpUrl += (dojo.string.endsWithAny(tmpUrl, "?", "&") ? "" : (tmpUrl.indexOf("?") > -1 ? "&" : "?")) + "dojo.preventCache=" + new Date().valueOf();
}
if (!kwArgs.user) {
http.open(kwArgs.method.toUpperCase(), tmpUrl, async);
} else {
http.open(kwArgs.method.toUpperCase(), tmpUrl, async, kwArgs.user, kwArgs.password);
}
setHeaders(http, kwArgs);
try {
http.send(null);
}
catch (e) {
if (typeof http.abort == "function") {
http.abort();
}
doLoad(kwArgs, {status:404}, url, query, useCache);
}
}
if (!async) {
doLoad(kwArgs, http, url, query, useCache);
_this._blockAsync = false;
}
kwArgs.abort = function () {
try {
http._aborted = true;
}
catch (e) {
}
return http.abort();
};
return;
};
dojo.io.transports.addTransport("XMLHTTPTransport");
};
}
 
/trunk/api/js/dojo/src/io/IframeIO.js
New file
0,0 → 1,212
/*
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.IframeIO");
dojo.require("dojo.io.BrowserIO");
dojo.require("dojo.uri.*");
dojo.io.createIFrame = function (fname, onloadstr, uri) {
if (window[fname]) {
return window[fname];
}
if (window.frames[fname]) {
return window.frames[fname];
}
var r = dojo.render.html;
var cframe = null;
var turi = uri;
if (!turi) {
if (djConfig["useXDomain"] && !djConfig["dojoIframeHistoryUrl"]) {
dojo.debug("dojo.io.createIFrame: When using cross-domain Dojo builds," + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl" + " to the path on your domain to iframe_history.html");
}
turi = (djConfig["dojoIframeHistoryUrl"] || dojo.uri.moduleUri("dojo", "../iframe_history.html")) + "#noInit=true";
}
var ifrstr = ((r.ie) && (dojo.render.os.win)) ? "<iframe name=\"" + fname + "\" src=\"" + turi + "\" onload=\"" + onloadstr + "\">" : "iframe";
cframe = document.createElement(ifrstr);
with (cframe) {
name = fname;
setAttribute("name", fname);
id = fname;
}
dojo.body().appendChild(cframe);
window[fname] = cframe;
with (cframe.style) {
if (!r.safari) {
position = "absolute";
}
left = top = "0px";
height = width = "1px";
visibility = "hidden";
}
if (!r.ie) {
dojo.io.setIFrameSrc(cframe, turi, true);
cframe.onload = new Function(onloadstr);
}
return cframe;
};
dojo.io.IframeTransport = new function () {
var _this = this;
this.currentRequest = null;
this.requestQueue = [];
this.iframeName = "dojoIoIframe";
this.fireNextRequest = function () {
try {
if ((this.currentRequest) || (this.requestQueue.length == 0)) {
return;
}
var cr = this.currentRequest = this.requestQueue.shift();
cr._contentToClean = [];
var fn = cr["formNode"];
var content = cr["content"] || {};
if (cr.sendTransport) {
content["dojo.transport"] = "iframe";
}
if (fn) {
if (content) {
for (var x in content) {
if (!fn[x]) {
var tn;
if (dojo.render.html.ie) {
tn = document.createElement("<input type='hidden' name='" + x + "' value='" + content[x] + "'>");
fn.appendChild(tn);
} else {
tn = document.createElement("input");
fn.appendChild(tn);
tn.type = "hidden";
tn.name = x;
tn.value = content[x];
}
cr._contentToClean.push(x);
} else {
fn[x].value = content[x];
}
}
}
if (cr["url"]) {
cr._originalAction = fn.getAttribute("action");
fn.setAttribute("action", cr.url);
}
if (!fn.getAttribute("method")) {
fn.setAttribute("method", (cr["method"]) ? cr["method"] : "post");
}
cr._originalTarget = fn.getAttribute("target");
fn.setAttribute("target", this.iframeName);
fn.target = this.iframeName;
fn.submit();
} else {
var query = dojo.io.argsFromMap(this.currentRequest.content);
var tmpUrl = cr.url + (cr.url.indexOf("?") > -1 ? "&" : "?") + query;
dojo.io.setIFrameSrc(this.iframe, tmpUrl, true);
}
}
catch (e) {
this.iframeOnload(e);
}
};
this.canHandle = function (kwArgs) {
return ((dojo.lang.inArray(["text/plain", "text/html", "text/javascript", "text/json", "application/json"], kwArgs["mimetype"])) && (dojo.lang.inArray(["post", "get"], kwArgs["method"].toLowerCase())) && (!((kwArgs["sync"]) && (kwArgs["sync"] == true))));
};
this.bind = function (kwArgs) {
if (!this["iframe"]) {
this.setUpIframe();
}
this.requestQueue.push(kwArgs);
this.fireNextRequest();
return;
};
this.setUpIframe = function () {
this.iframe = dojo.io.createIFrame(this.iframeName, "dojo.io.IframeTransport.iframeOnload();");
};
this.iframeOnload = function (errorObject) {
if (!_this.currentRequest) {
_this.fireNextRequest();
return;
}
var req = _this.currentRequest;
if (req.formNode) {
var toClean = req._contentToClean;
for (var i = 0; i < toClean.length; i++) {
var key = toClean[i];
if (dojo.render.html.safari) {
var fNode = req.formNode;
for (var j = 0; j < fNode.childNodes.length; j++) {
var chNode = fNode.childNodes[j];
if (chNode.name == key) {
var pNode = chNode.parentNode;
pNode.removeChild(chNode);
break;
}
}
} else {
var input = req.formNode[key];
req.formNode.removeChild(input);
req.formNode[key] = null;
}
}
if (req["_originalAction"]) {
req.formNode.setAttribute("action", req._originalAction);
}
if (req["_originalTarget"]) {
req.formNode.setAttribute("target", req._originalTarget);
req.formNode.target = req._originalTarget;
}
}
var contentDoc = function (iframe_el) {
var doc = iframe_el.contentDocument || ((iframe_el.contentWindow) && (iframe_el.contentWindow.document)) || ((iframe_el.name) && (document.frames[iframe_el.name]) && (document.frames[iframe_el.name].document)) || null;
return doc;
};
var value;
var success = false;
if (errorObject) {
this._callError(req, "IframeTransport Request Error: " + errorObject);
} else {
var ifd = contentDoc(_this.iframe);
try {
var cmt = req.mimetype;
if ((cmt == "text/javascript") || (cmt == "text/json") || (cmt == "application/json")) {
var js = ifd.getElementsByTagName("textarea")[0].value;
if (cmt == "text/json" || cmt == "application/json") {
js = "(" + js + ")";
}
value = dj_eval(js);
} else {
if (cmt == "text/html") {
value = ifd;
} else {
value = ifd.getElementsByTagName("textarea")[0].value;
}
}
success = true;
}
catch (e) {
this._callError(req, "IframeTransport Error: " + e);
}
}
try {
if (success && dojo.lang.isFunction(req["load"])) {
req.load("load", value, req);
}
}
catch (e) {
throw e;
}
finally {
_this.currentRequest = null;
_this.fireNextRequest();
}
};
this._callError = function (req, message) {
var errObj = new dojo.io.Error(message);
if (dojo.lang.isFunction(req["error"])) {
req.error("error", errObj, req);
}
};
dojo.io.transports.addTransport("IframeTransport");
};
 
/trunk/api/js/dojo/src/io/cometd.js
New file
0,0 → 1,528
/*
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.require("dojo.io.common");
dojo.provide("dojo.io.cometd");
dojo.require("dojo.AdapterRegistry");
dojo.require("dojo.json");
dojo.require("dojo.io.BrowserIO");
dojo.require("dojo.io.IframeIO");
dojo.require("dojo.io.ScriptSrcIO");
dojo.require("dojo.io.cookie");
dojo.require("dojo.event.*");
dojo.require("dojo.lang.common");
dojo.require("dojo.lang.func");
cometd = new function () {
this.initialized = false;
this.connected = false;
this.connectionTypes = new dojo.AdapterRegistry(true);
this.version = 0.1;
this.minimumVersion = 0.1;
this.clientId = null;
this._isXD = false;
this.handshakeReturn = null;
this.currentTransport = null;
this.url = null;
this.lastMessage = null;
this.globalTopicChannels = {};
this.backlog = [];
this.tunnelInit = function (childLocation, childDomain) {
};
this.tunnelCollapse = function () {
dojo.debug("tunnel collapsed!");
};
this.init = function (props, root, bargs) {
props = props || {};
props.version = this.version;
props.minimumVersion = this.minimumVersion;
props.channel = "/meta/handshake";
this.url = root || djConfig["cometdRoot"];
if (!this.url) {
dojo.debug("no cometd root specified in djConfig and no root passed");
return;
}
var bindArgs = {url:this.url, method:"POST", mimetype:"text/json", load:dojo.lang.hitch(this, "finishInit"), content:{"message":dojo.json.serialize([props])}};
var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
var r = ("" + window.location).match(new RegExp(regexp));
if (r[4]) {
var tmp = r[4].split(":");
var thisHost = tmp[0];
var thisPort = tmp[1] || "80";
r = this.url.match(new RegExp(regexp));
if (r[4]) {
tmp = r[4].split(":");
var urlHost = tmp[0];
var urlPort = tmp[1] || "80";
if ((urlHost != thisHost) || (urlPort != thisPort)) {
dojo.debug(thisHost, urlHost);
dojo.debug(thisPort, urlPort);
this._isXD = true;
bindArgs.transport = "ScriptSrcTransport";
bindArgs.jsonParamName = "jsonp";
bindArgs.method = "GET";
}
}
}
if (bargs) {
dojo.lang.mixin(bindArgs, bargs);
}
return dojo.io.bind(bindArgs);
};
this.finishInit = function (type, data, evt, request) {
data = data[0];
this.handshakeReturn = data;
if (data["authSuccessful"] == false) {
dojo.debug("cometd authentication failed");
return;
}
if (data.version < this.minimumVersion) {
dojo.debug("cometd protocol version mismatch. We wanted", this.minimumVersion, "but got", data.version);
return;
}
this.currentTransport = this.connectionTypes.match(data.supportedConnectionTypes, data.version, this._isXD);
this.currentTransport.version = data.version;
this.clientId = data.clientId;
this.tunnelInit = dojo.lang.hitch(this.currentTransport, "tunnelInit");
this.tunnelCollapse = dojo.lang.hitch(this.currentTransport, "tunnelCollapse");
this.initialized = true;
this.currentTransport.startup(data);
while (this.backlog.length != 0) {
var cur = this.backlog.shift();
var fn = cur.shift();
this[fn].apply(this, cur);
}
};
this._getRandStr = function () {
return Math.random().toString().substring(2, 10);
};
this.deliver = function (messages) {
dojo.lang.forEach(messages, this._deliver, this);
};
this._deliver = function (message) {
if (!message["channel"]) {
dojo.debug("cometd error: no channel for message!");
return;
}
if (!this.currentTransport) {
this.backlog.push(["deliver", message]);
return;
}
this.lastMessage = message;
if ((message.channel.length > 5) && (message.channel.substr(0, 5) == "/meta")) {
switch (message.channel) {
case "/meta/subscribe":
if (!message.successful) {
dojo.debug("cometd subscription error for channel", message.channel, ":", message.error);
return;
}
this.subscribed(message.subscription, message);
break;
case "/meta/unsubscribe":
if (!message.successful) {
dojo.debug("cometd unsubscription error for channel", message.channel, ":", message.error);
return;
}
this.unsubscribed(message.subscription, message);
break;
}
}
this.currentTransport.deliver(message);
if (message.data) {
var tname = (this.globalTopicChannels[message.channel]) ? message.channel : "/cometd" + message.channel;
dojo.event.topic.publish(tname, message);
}
};
this.disconnect = function () {
if (!this.currentTransport) {
dojo.debug("no current transport to disconnect from");
return;
}
this.currentTransport.disconnect();
};
this.publish = function (channel, data, properties) {
if (!this.currentTransport) {
this.backlog.push(["publish", channel, data, properties]);
return;
}
var message = {data:data, channel:channel};
if (properties) {
dojo.lang.mixin(message, properties);
}
return this.currentTransport.sendMessage(message);
};
this.subscribe = function (channel, useLocalTopics, objOrFunc, funcName) {
if (!this.currentTransport) {
this.backlog.push(["subscribe", channel, useLocalTopics, objOrFunc, funcName]);
return;
}
if (objOrFunc) {
var tname = (useLocalTopics) ? channel : "/cometd" + channel;
if (useLocalTopics) {
this.globalTopicChannels[channel] = true;
}
dojo.event.topic.subscribe(tname, objOrFunc, funcName);
}
return this.currentTransport.sendMessage({channel:"/meta/subscribe", subscription:channel});
};
this.subscribed = function (channel, message) {
dojo.debug(channel);
dojo.debugShallow(message);
};
this.unsubscribe = function (channel, useLocalTopics, objOrFunc, funcName) {
if (!this.currentTransport) {
this.backlog.push(["unsubscribe", channel, useLocalTopics, objOrFunc, funcName]);
return;
}
if (objOrFunc) {
var tname = (useLocalTopics) ? channel : "/cometd" + channel;
dojo.event.topic.unsubscribe(tname, objOrFunc, funcName);
}
return this.currentTransport.sendMessage({channel:"/meta/unsubscribe", subscription:channel});
};
this.unsubscribed = function (channel, message) {
dojo.debug(channel);
dojo.debugShallow(message);
};
};
cometd.iframeTransport = new function () {
this.connected = false;
this.connectionId = null;
this.rcvNode = null;
this.rcvNodeName = "";
this.phonyForm = null;
this.authToken = null;
this.lastTimestamp = null;
this.lastId = null;
this.backlog = [];
this.check = function (types, version, xdomain) {
return ((!xdomain) && (!dojo.render.html.safari) && (dojo.lang.inArray(types, "iframe")));
};
this.tunnelInit = function () {
this.postToIframe({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"iframe"}])});
};
this.tunnelCollapse = function () {
if (this.connected) {
this.connected = false;
this.postToIframe({message:dojo.json.serialize([{channel:"/meta/reconnect", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])});
}
};
this.deliver = function (message) {
if (message["timestamp"]) {
this.lastTimestamp = message.timestamp;
}
if (message["id"]) {
this.lastId = message.id;
}
if ((message.channel.length > 5) && (message.channel.substr(0, 5) == "/meta")) {
switch (message.channel) {
case "/meta/connect":
if (!message.successful) {
dojo.debug("cometd connection error:", message.error);
return;
}
this.connectionId = message.connectionId;
this.connected = true;
this.processBacklog();
break;
case "/meta/reconnect":
if (!message.successful) {
dojo.debug("cometd reconnection error:", message.error);
return;
}
this.connected = true;
break;
case "/meta/subscribe":
if (!message.successful) {
dojo.debug("cometd subscription error for channel", message.channel, ":", message.error);
return;
}
dojo.debug(message.channel);
break;
}
}
};
this.widenDomain = function (domainStr) {
var cd = domainStr || document.domain;
if (cd.indexOf(".") == -1) {
return;
}
var dps = cd.split(".");
if (dps.length <= 2) {
return;
}
dps = dps.slice(dps.length - 2);
document.domain = dps.join(".");
return document.domain;
};
this.postToIframe = function (content, url) {
if (!this.phonyForm) {
if (dojo.render.html.ie) {
this.phonyForm = document.createElement("<form enctype='application/x-www-form-urlencoded' method='POST' style='display: none;'>");
dojo.body().appendChild(this.phonyForm);
} else {
this.phonyForm = document.createElement("form");
this.phonyForm.style.display = "none";
dojo.body().appendChild(this.phonyForm);
this.phonyForm.enctype = "application/x-www-form-urlencoded";
this.phonyForm.method = "POST";
}
}
this.phonyForm.action = url || cometd.url;
this.phonyForm.target = this.rcvNodeName;
this.phonyForm.setAttribute("target", this.rcvNodeName);
while (this.phonyForm.firstChild) {
this.phonyForm.removeChild(this.phonyForm.firstChild);
}
for (var x in content) {
var tn;
if (dojo.render.html.ie) {
tn = document.createElement("<input type='hidden' name='" + x + "' value='" + content[x] + "'>");
this.phonyForm.appendChild(tn);
} else {
tn = document.createElement("input");
this.phonyForm.appendChild(tn);
tn.type = "hidden";
tn.name = x;
tn.value = content[x];
}
}
this.phonyForm.submit();
};
this.processBacklog = function () {
while (this.backlog.length > 0) {
this.sendMessage(this.backlog.shift(), true);
}
};
this.sendMessage = function (message, bypassBacklog) {
if ((bypassBacklog) || (this.connected)) {
message.connectionId = this.connectionId;
message.clientId = cometd.clientId;
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"POST", mimetype:"text/json", content:{message:dojo.json.serialize([message])}};
return dojo.io.bind(bindArgs);
} else {
this.backlog.push(message);
}
};
this.startup = function (handshakeData) {
dojo.debug("startup!");
dojo.debug(dojo.json.serialize(handshakeData));
if (this.connected) {
return;
}
this.rcvNodeName = "cometdRcv_" + cometd._getRandStr();
var initUrl = cometd.url + "/?tunnelInit=iframe";
if (false && dojo.render.html.ie) {
this.rcvNode = new ActiveXObject("htmlfile");
this.rcvNode.open();
this.rcvNode.write("<html>");
this.rcvNode.write("<script>document.domain = '" + document.domain + "'");
this.rcvNode.write("</html>");
this.rcvNode.close();
var ifrDiv = this.rcvNode.createElement("div");
this.rcvNode.appendChild(ifrDiv);
this.rcvNode.parentWindow.dojo = dojo;
ifrDiv.innerHTML = "<iframe src='" + initUrl + "'></iframe>";
} else {
this.rcvNode = dojo.io.createIFrame(this.rcvNodeName, "", initUrl);
}
};
};
cometd.mimeReplaceTransport = new function () {
this.connected = false;
this.connectionId = null;
this.xhr = null;
this.authToken = null;
this.lastTimestamp = null;
this.lastId = null;
this.backlog = [];
this.check = function (types, version, xdomain) {
return ((!xdomain) && (dojo.render.html.mozilla) && (dojo.lang.inArray(types, "mime-message-block")));
};
this.tunnelInit = function () {
if (this.connected) {
return;
}
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"mime-message-block"}])});
this.connected = true;
};
this.tunnelCollapse = function () {
if (this.connected) {
this.connected = false;
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])});
}
};
this.deliver = cometd.iframeTransport.deliver;
this.handleOnLoad = function (resp) {
cometd.deliver(dojo.json.evalJson(this.xhr.responseText));
};
this.openTunnelWith = function (content, url) {
this.xhr = dojo.hostenv.getXmlhttpObject();
this.xhr.multipart = true;
if (dojo.render.html.mozilla) {
this.xhr.addEventListener("load", dojo.lang.hitch(this, "handleOnLoad"), false);
} else {
if (dojo.render.html.safari) {
dojo.debug("Webkit is broken with multipart responses over XHR = (");
this.xhr.onreadystatechange = dojo.lang.hitch(this, "handleOnLoad");
} else {
this.xhr.onload = dojo.lang.hitch(this, "handleOnLoad");
}
}
this.xhr.open("POST", (url || cometd.url), true);
this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
dojo.debug(dojo.json.serialize(content));
this.xhr.send(dojo.io.argsFromMap(content, "utf8"));
};
this.processBacklog = function () {
while (this.backlog.length > 0) {
this.sendMessage(this.backlog.shift(), true);
}
};
this.sendMessage = function (message, bypassBacklog) {
if ((bypassBacklog) || (this.connected)) {
message.connectionId = this.connectionId;
message.clientId = cometd.clientId;
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"POST", mimetype:"text/json", content:{message:dojo.json.serialize([message])}};
return dojo.io.bind(bindArgs);
} else {
this.backlog.push(message);
}
};
this.startup = function (handshakeData) {
dojo.debugShallow(handshakeData);
if (this.connected) {
return;
}
this.tunnelInit();
};
};
cometd.longPollTransport = new function () {
this.connected = false;
this.connectionId = null;
this.authToken = null;
this.lastTimestamp = null;
this.lastId = null;
this.backlog = [];
this.check = function (types, version, xdomain) {
return ((!xdomain) && (dojo.lang.inArray(types, "long-polling")));
};
this.tunnelInit = function () {
if (this.connected) {
return;
}
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"long-polling"}])});
this.connected = true;
};
this.tunnelCollapse = function () {
if (!this.connected) {
this.connected = false;
dojo.debug("clientId:", cometd.clientId);
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", connectionType:"long-polling", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])});
}
};
this.deliver = cometd.iframeTransport.deliver;
this.openTunnelWith = function (content, url) {
dojo.io.bind({url:(url || cometd.url), method:"post", content:content, mimetype:"text/json", load:dojo.lang.hitch(this, function (type, data, evt, args) {
cometd.deliver(data);
this.connected = false;
this.tunnelCollapse();
}), error:function () {
dojo.debug("tunnel opening failed");
}});
this.connected = true;
};
this.processBacklog = function () {
while (this.backlog.length > 0) {
this.sendMessage(this.backlog.shift(), true);
}
};
this.sendMessage = function (message, bypassBacklog) {
if ((bypassBacklog) || (this.connected)) {
message.connectionId = this.connectionId;
message.clientId = cometd.clientId;
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], method:"post", mimetype:"text/json", content:{message:dojo.json.serialize([message])}, load:dojo.lang.hitch(this, function (type, data, evt, args) {
cometd.deliver(data);
})};
return dojo.io.bind(bindArgs);
} else {
this.backlog.push(message);
}
};
this.startup = function (handshakeData) {
if (this.connected) {
return;
}
this.tunnelInit();
};
};
cometd.callbackPollTransport = new function () {
this.connected = false;
this.connectionId = null;
this.authToken = null;
this.lastTimestamp = null;
this.lastId = null;
this.backlog = [];
this.check = function (types, version, xdomain) {
return dojo.lang.inArray(types, "callback-polling");
};
this.tunnelInit = function () {
if (this.connected) {
return;
}
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/connect", clientId:cometd.clientId, connectionType:"callback-polling"}])});
this.connected = true;
};
this.tunnelCollapse = function () {
if (!this.connected) {
this.connected = false;
this.openTunnelWith({message:dojo.json.serialize([{channel:"/meta/reconnect", connectionType:"long-polling", clientId:cometd.clientId, connectionId:this.connectionId, timestamp:this.lastTimestamp, id:this.lastId}])});
}
};
this.deliver = cometd.iframeTransport.deliver;
this.openTunnelWith = function (content, url) {
var req = dojo.io.bind({url:(url || cometd.url), content:content, mimetype:"text/json", transport:"ScriptSrcTransport", jsonParamName:"jsonp", load:dojo.lang.hitch(this, function (type, data, evt, args) {
cometd.deliver(data);
this.connected = false;
this.tunnelCollapse();
}), error:function () {
dojo.debug("tunnel opening failed");
}});
this.connected = true;
};
this.processBacklog = function () {
while (this.backlog.length > 0) {
this.sendMessage(this.backlog.shift(), true);
}
};
this.sendMessage = function (message, bypassBacklog) {
if ((bypassBacklog) || (this.connected)) {
message.connectionId = this.connectionId;
message.clientId = cometd.clientId;
var bindArgs = {url:cometd.url || djConfig["cometdRoot"], mimetype:"text/json", transport:"ScriptSrcTransport", jsonParamName:"jsonp", content:{message:dojo.json.serialize([message])}, load:dojo.lang.hitch(this, function (type, data, evt, args) {
cometd.deliver(data);
}), };
return dojo.io.bind(bindArgs);
} else {
this.backlog.push(message);
}
};
this.startup = function (handshakeData) {
if (this.connected) {
return;
}
this.tunnelInit();
};
};
cometd.connectionTypes.register("mime-message-block", cometd.mimeReplaceTransport.check, cometd.mimeReplaceTransport);
cometd.connectionTypes.register("long-polling", cometd.longPollTransport.check, cometd.longPollTransport);
cometd.connectionTypes.register("callback-polling", cometd.callbackPollTransport.check, cometd.callbackPollTransport);
cometd.connectionTypes.register("iframe", cometd.iframeTransport.check, cometd.iframeTransport);
dojo.io.cometd = cometd;
 
/trunk/api/js/dojo/src/io/xip_server.html
New file
0,0 → 1,378
<!--
/*
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
*/
Pieces taken from Dojo source to make this file stand-alone
-->
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<script type="text/javascript" src="isAllowed.js"></script>
<!--
BY DEFAULT THIS FILE DOES NOT WORK SO THAT YOU DON'T ACCIDENTALLY EXPOSE
ALL OF YOUR XHR-ENABLED SERVICES ON YOUR SITE.
In order for this file to work, you should define a function with the following signature:
function isAllowedRequest(request){
return false;
}
Return true out of the function if you want to allow the cross-domain request.
DON'T DEFINE THIS FUNCTION IN THIS FILE! Define it in a separate file called isAllowed.js
and include it in this page with a script tag that has a src attribute pointing to the file.
See the very first script tag in this file for an example. You do not have to place the
script file in the same directory as this file, just update the path above if you move it
somewhere else.
Customize the isAllowedRequest function to restrict what types of requests are allowed
for this server. The request object has the following properties:
- requestHeaders: an object with the request headers that are to be added to
the XHR request.
- method: the HTTP method (GET, POST, etc...)
- uri: The URI for the request.
- data: The URL-encoded data for the request. For a GET request, this would
be the querystring parameters. For a POST request, it wll be the
body data.
See xip_client.html for more info on the xip fragment identifier protocol.
-->
<script type="text/javascript">
// <!--
djConfig = {
parseWidgets: false,
baseScriptUri: "./"
}
// -->
</script>
<script type="text/javascript">
// <!--
//Core XHR handling taken from Dojo IO code.
dojo = {};
dojo.hostenv = {};
// These are in order of decreasing likelihood; this will change in time.
dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
dojo.hostenv.getXmlhttpObject = function(){
var http = null;
var last_e = null;
try{ http = new XMLHttpRequest(); }catch(e){}
if(!http){
for(var i=0; i<3; ++i){
var progid = dojo.hostenv._XMLHTTP_PROGIDS[i];
try{
http = new ActiveXObject(progid);
}catch(e){
last_e = e;
}
if(http){
dojo.hostenv._XMLHTTP_PROGIDS = [progid]; // so faster next time
break;
}
}
/*if(http && !http.toString) {
http.toString = function() { "[object XMLHttpRequest]"; }
}*/
}
if(!http){
throw "xip_server.html: XMLHTTP not available: " + last_e;
}
return http;
}
 
dojo.setHeaders = function(http, headers){
if(headers) {
for(var header in headers) {
var headerValue = headers[header];
http.setRequestHeader(header, headerValue);
}
}
}
 
//MSIE has the lowest limit for URLs with fragment identifiers,
//at around 4K. Choosing a slightly smaller number for good measure.
xipUrlLimit = 4000;
xipIdCounter = 1;
 
function xipServerInit(){
xipStateId = "";
xipCurrentHash = "";
xipRequestMessage = "";
xipResponseParts = [];
xipPartIndex = 0;
}
 
function pollHash(){
//Can't use location.hash because at least Firefox does a decodeURIComponent on it.
var urlParts = window.location.href.split("#");
if(urlParts.length == 2){
var newHash = urlParts[1];
if(newHash != xipCurrentHash){
try{
messageReceived(newHash);
}catch(e){
//Make sure to not keep processing the error hash value.
xipCurrentHash = newHash;
throw e;
}
xipCurrentHash = newHash;
}
}
}
 
function messageReceived(encodedData){
var msg = unpackMessage(encodedData);
switch(msg.command){
case "ok":
sendResponsePart();
break;
case "start":
xipRequestMessage = "";
xipRequestMessage += msg.message;
setClientUrl("ok");
break;
case "part":
xipRequestMessage += msg.message;
setClientUrl("ok");
break;
case "end":
setClientUrl("ok");
xipRequestMessage += msg.message;
sendXhr();
break;
}
}
 
function sendResponse(encodedData){
//Break the message into parts, if necessary.
xipResponseParts = [];
var resData = encodedData;
var urlLength = xipClientUrl.length;
var partLength = xipUrlLimit - urlLength;
var resIndex = 0;
 
while((resData.length - resIndex) + urlLength > xipUrlLimit){
var part = resData.substring(resIndex, resIndex + partLength);
//Safari will do some extra hex escaping unless we keep the original hex
//escaping complete.
var percentIndex = part.lastIndexOf("%");
if(percentIndex == part.length - 1 || percentIndex == part.length - 2){
part = part.substring(0, percentIndex);
}
xipResponseParts.push(part);
resIndex += part.length;
}
xipResponseParts.push(resData.substring(resIndex, resData.length));
xipPartIndex = 0;
sendResponsePart();
}
function sendResponsePart(){
if(xipPartIndex < xipResponseParts.length){
//Get the message part.
var partData = xipResponseParts[xipPartIndex];
//Get the command.
var cmd = "part";
if(xipPartIndex + 1 == xipResponseParts.length){
cmd = "end";
}else if (xipPartIndex == 0){
cmd = "start";
}
 
setClientUrl(cmd, partData);
xipPartIndex++;
}else{
xipServerInit();
}
}
 
function setClientUrl(cmd, message){
var clientUrl = makeClientUrl(cmd, message);
//Safari won't let us replace across domains.
if(navigator.userAgent.indexOf("Safari") == -1){
parent.location.replace(clientUrl);
}else{
parent.location = clientUrl;
}
}
 
function makeClientUrl(cmd, message){
var clientUrl = xipClientUrl + "#" + (xipIdCounter++) + ":" + cmd;
if(message){
clientUrl += ":" + message;
}
return clientUrl
}
 
function xhrDone(xhr){
/* Need to pull off and return the following data:
- responseHeaders
- status
- statusText
- responseText
*/
var response = {};
if(typeof(xhr.getAllResponseHeaders) != "undefined"){
var allHeaders = xhr.getAllResponseHeaders();
if(allHeaders){
response.responseHeaders = allHeaders;
}
}
if(xhr.status == 0 || xhr.status){
response.status = xhr.status;
}
if(xhr.statusText){
response.statusText = xhr.statusText;
}
if(xhr.responseText){
response.responseText = xhr.responseText;
}
//Build a string of the response object.
var result = "";
var isFirst = true;
for (var param in response){
if(isFirst){
isFirst = false;
}else{
result += "&";
}
result += param + "=" + encodeURIComponent(response[param]);
}
sendResponse(result);
}
 
function sendXhr(){
var request = {};
var nvPairs = xipRequestMessage.split("&");
var i = 0;
var nameValue = null;
for(i = 0; i < nvPairs.length; i++){
if(nvPairs[i]){
var nameValue = nvPairs[i].split("=");
request[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
}
}
 
//Split up the request headers, if any.
var headers = {};
if(request.requestHeaders){
nvPairs = request.requestHeaders.split("\r\n");
for(i = 0; i < nvPairs.length; i++){
if(nvPairs[i]){
nameValue = nvPairs[i].split(": ");
headers[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
}
}
 
request.requestHeaders = headers;
}
if(isAllowedRequest(request)){
//The request is allowed, so set up the XHR object.
var xhr = dojo.hostenv.getXmlhttpObject();
//Start timer to look for readyState.
var xhrIntervalId = setInterval(function(){
if(xhr.readyState == 4){
clearInterval(xhrIntervalId);
xhrDone(xhr);
}
}, 10);
 
//Actually start up the XHR request.
xhr.open(request.method, request.uri, true);
dojo.setHeaders(xhr, request.requestHeaders);
var content = "";
if(request.data){
content = request.data;
}
 
try{
xhr.send(content);
}catch(e){
if(typeof xhr.abort == "function"){
xhr.abort();
xhrDone({status: 404, statusText: "xip_server.html error: " + e});
}
}
}
}
 
function unpackMessage(encodedMessage){
var parts = encodedMessage.split(":");
var command = parts[1];
encodedMessage = parts[2] || "";
 
var config = null;
if(command == "init"){
var configParts = encodedMessage.split("&");
config = {};
for(var i = 0; i < configParts.length; i++){
var nameValue = configParts[i].split("=");
config[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
}
}
return {command: command, message: encodedMessage, config: config};
}
 
function onServerLoad(){
xipServerInit();
 
//Decode the init params
var config = unpackMessage(window.location.href.split("#")[1]).config;
 
xipStateId = config.id;
xipClientUrl = config.client;
xipUseFrameRecursion = config["fr"];
 
setInterval(pollHash, 10);
if(xipUseFrameRecursion == "true"){
var serverUrl = window.location.href.split("#")[0];
document.getElementById("iframeHolder").innerHTML = '<iframe src="'
+ makeClientUrl("init", 'id=' + xipStateId + '&server=' + encodeURIComponent(serverUrl)
+ '&fr=endpoint') + '" name="' + xipStateId + '_clientEndPoint"></iframe>';
}else{
setClientUrl("loaded");
}
}
 
if(typeof(window.addEventListener) == "undefined"){
window.attachEvent("onload", onServerLoad);
}else{
window.addEventListener('load', onServerLoad, false);
}
// -->
</script>
</head>
<body>
<h4>The Dojo Toolkit -- xip_server.html</h4>
 
<p>This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the the file
that should go on the server that will actually be doing the XHR request.</p>
<div id="iframeHolder"></div>
</body>
</html>
/trunk/api/js/dojo/src/io/RepubsubIO.js
New file
0,0 → 1,337
/*
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.require("dojo.event.*");
dojo.require("dojo.io.BrowserIO");
dojo.provide("dojo.io.RepubsubIO");
dojo.io.repubsubTranport = new function () {
var rps = dojo.io.repubsub;
this.canHandle = function (kwArgs) {
if ((kwArgs["mimetype"] == "text/javascript") && (kwArgs["method"] == "repubsub")) {
return true;
}
return false;
};
this.bind = function (kwArgs) {
if (!rps.isInitialized) {
rps.init();
}
if (!rps.topics[kwArgs.url]) {
kwArgs.rpsLoad = function (evt) {
kwArgs.load("load", evt);
};
rps.subscribe(kwArgs.url, kwArgs, "rpsLoad");
}
if (kwArgs["content"]) {
var cEvt = dojo.io.repubsubEvent.initFromProperties(kwArgs.content);
rps.publish(kwArgs.url, cEvt);
}
};
dojo.io.transports.addTransport("repubsubTranport");
};
dojo.io.repubsub = new function () {
this.initDoc = "init.html";
this.isInitialized = false;
this.subscriptionBacklog = [];
this.debug = true;
this.rcvNodeName = null;
this.sndNodeName = null;
this.rcvNode = null;
this.sndNode = null;
this.canRcv = false;
this.canSnd = false;
this.canLog = false;
this.sndTimer = null;
this.windowRef = window;
this.backlog = [];
this.tunnelInitCount = 0;
this.tunnelFrameKey = "tunnel_frame";
this.serverBaseURL = location.protocol + "//" + location.host + location.pathname;
this.logBacklog = [];
this.getRandStr = function () {
return Math.random().toString().substring(2, 10);
};
this.userid = "guest";
this.tunnelID = this.getRandStr();
this.attachPathList = [];
this.topics = [];
this.parseGetStr = function () {
var baseUrl = document.location.toString();
var params = baseUrl.split("?", 2);
if (params.length > 1) {
var paramStr = params[1];
var pairs = paramStr.split("&");
var opts = [];
for (var x in pairs) {
var sp = pairs[x].split("=");
try {
opts[sp[0]] = eval(sp[1]);
}
catch (e) {
opts[sp[0]] = sp[1];
}
}
return opts;
} else {
return [];
}
};
var getOpts = this.parseGetStr();
for (var x in getOpts) {
this[x] = getOpts[x];
}
if (!this["tunnelURI"]) {
this.tunnelURI = ["/who/", escape(this.userid), "/s/", this.getRandStr(), "/kn_journal"].join("");
}
if (window["repubsubOpts"] || window["rpsOpts"]) {
var optObj = window["repubsubOpts"] || window["rpsOpts"];
for (var x in optObj) {
this[x] = optObj[x];
}
}
this.tunnelCloseCallback = function () {
dojo.io.setIFrameSrc(this.rcvNode, this.initDoc + "?callback=repubsub.rcvNodeReady&domain=" + document.domain);
};
this.receiveEventFromTunnel = function (evt, srcWindow) {
if (!evt["elements"]) {
this.log("bailing! event received without elements!", "error");
return;
}
var e = {};
for (var i = 0; i < evt.elements.length; i++) {
var ee = evt.elements[i];
e[ee.name || ee.nameU] = (ee.value || ee.valueU);
this.log("[event]: " + (ee.name || ee.nameU) + ": " + e[ee.name || ee.nameU]);
}
this.dispatch(e);
};
this.widenDomain = function (domainStr) {
var cd = domainStr || document.domain;
if (cd.indexOf(".") == -1) {
return;
}
var dps = cd.split(".");
if (dps.length <= 2) {
return;
}
dps = dps.slice(dps.length - 2);
document.domain = dps.join(".");
};
this.parseCookie = function () {
var cs = document.cookie;
var keypairs = cs.split(";");
for (var x = 0; x < keypairs.length; x++) {
keypairs[x] = keypairs[x].split("=");
if (x != keypairs.length - 1) {
cs += ";";
}
}
return keypairs;
};
this.setCookie = function (keypairs, clobber) {
if ((clobber) && (clobber == true)) {
document.cookie = "";
}
var cs = "";
for (var x = 0; x < keypairs.length; x++) {
cs += keypairs[x][0] + "=" + keypairs[x][1];
if (x != keypairs.length - 1) {
cs += ";";
}
}
document.cookie = cs;
};
this.log = function (str, lvl) {
if (!this.debug) {
return;
}
while (this.logBacklog.length > 0) {
if (!this.canLog) {
break;
}
var blo = this.logBacklog.shift();
this.writeLog("[" + blo[0] + "]: " + blo[1], blo[2]);
}
this.writeLog(str, lvl);
};
this.writeLog = function (str, lvl) {
dojo.debug(((new Date()).toLocaleTimeString()) + ": " + str);
};
this.init = function () {
this.widenDomain();
this.openTunnel();
this.isInitialized = true;
while (this.subscriptionBacklog.length) {
this.subscribe.apply(this, this.subscriptionBacklog.shift());
}
};
this.clobber = function () {
if (this.rcvNode) {
this.setCookie([[this.tunnelFrameKey, "closed"], ["path", "/"]], false);
}
};
this.openTunnel = function () {
this.rcvNodeName = "rcvIFrame_" + this.getRandStr();
this.setCookie([[this.tunnelFrameKey, this.rcvNodeName], ["path", "/"]], false);
this.rcvNode = dojo.io.createIFrame(this.rcvNodeName);
dojo.io.setIFrameSrc(this.rcvNode, this.initDoc + "?callback=repubsub.rcvNodeReady&domain=" + document.domain);
this.sndNodeName = "sndIFrame_" + this.getRandStr();
this.sndNode = dojo.io.createIFrame(this.sndNodeName);
dojo.io.setIFrameSrc(this.sndNode, this.initDoc + "?callback=repubsub.sndNodeReady&domain=" + document.domain);
};
this.rcvNodeReady = function () {
var statusURI = [this.tunnelURI, "/kn_status/", this.getRandStr(), "_", String(this.tunnelInitCount++)].join("");
this.log("rcvNodeReady");
var initURIArr = [this.serverBaseURL, "/kn?kn_from=", escape(this.tunnelURI), "&kn_id=", escape(this.tunnelID), "&kn_status_from=", escape(statusURI)];
dojo.io.setIFrameSrc(this.rcvNode, initURIArr.join(""));
this.subscribe(statusURI, this, "statusListener", true);
this.log(initURIArr.join(""));
};
this.sndNodeReady = function () {
this.canSnd = true;
this.log("sndNodeReady");
this.log(this.backlog.length);
if (this.backlog.length > 0) {
this.dequeueEvent();
}
};
this.statusListener = function (evt) {
this.log("status listener called");
this.log(evt.status, "info");
};
this.dispatch = function (evt) {
if (evt["to"] || evt["kn_routed_from"]) {
var rf = evt["to"] || evt["kn_routed_from"];
var topic = rf.split(this.serverBaseURL, 2)[1];
if (!topic) {
topic = rf;
}
this.log("[topic] " + topic);
if (topic.length > 3) {
if (topic.slice(0, 3) == "/kn") {
topic = topic.slice(3);
}
}
if (this.attachPathList[topic]) {
this.attachPathList[topic](evt);
}
}
};
this.subscribe = function (topic, toObj, toFunc, dontTellServer) {
if (!this.isInitialized) {
this.subscriptionBacklog.push([topic, toObj, toFunc, dontTellServer]);
return;
}
if (!this.attachPathList[topic]) {
this.attachPathList[topic] = function () {
return true;
};
this.log("subscribing to: " + topic);
this.topics.push(topic);
}
var revt = new dojo.io.repubsubEvent(this.tunnelURI, topic, "route");
var rstr = [this.serverBaseURL + "/kn", revt.toGetString()].join("");
dojo.event.kwConnect({once:true, srcObj:this.attachPathList, srcFunc:topic, adviceObj:toObj, adviceFunc:toFunc});
if (!this.rcvNode) {
}
if (dontTellServer) {
return;
}
this.log("sending subscription to: " + topic);
this.sendTopicSubToServer(topic, rstr);
};
this.sendTopicSubToServer = function (topic, str) {
if (!this.attachPathList[topic]["subscriptions"]) {
this.enqueueEventStr(str);
this.attachPathList[topic].subscriptions = 0;
}
this.attachPathList[topic].subscriptions++;
};
this.unSubscribe = function (topic, toObj, toFunc) {
dojo.event.kwDisconnect({srcObj:this.attachPathList, srcFunc:topic, adviceObj:toObj, adviceFunc:toFunc});
};
this.publish = function (topic, event) {
var evt = dojo.io.repubsubEvent.initFromProperties(event);
evt.to = topic;
var evtURLParts = [];
evtURLParts.push(this.serverBaseURL + "/kn");
evtURLParts.push(evt.toGetString());
this.enqueueEventStr(evtURLParts.join(""));
};
this.enqueueEventStr = function (evtStr) {
this.log("enqueueEventStr");
this.backlog.push(evtStr);
this.dequeueEvent();
};
this.dequeueEvent = function (force) {
this.log("dequeueEvent");
if (this.backlog.length <= 0) {
return;
}
if ((this.canSnd) || (force)) {
dojo.io.setIFrameSrc(this.sndNode, this.backlog.shift() + "&callback=repubsub.sndNodeReady");
this.canSnd = false;
} else {
this.log("sndNode not available yet!", "debug");
}
};
};
dojo.io.repubsubEvent = function (to, from, method, id, routeURI, payload, dispname, uid) {
this.to = to;
this.from = from;
this.method = method || "route";
this.id = id || repubsub.getRandStr();
this.uri = routeURI;
this.displayname = dispname || repubsub.displayname;
this.userid = uid || repubsub.userid;
this.payload = payload || "";
this.flushChars = 4096;
this.initFromProperties = function (evt) {
if (evt.constructor = dojo.io.repubsubEvent) {
for (var x in evt) {
this[x] = evt[x];
}
} else {
for (var x in evt) {
if (typeof this.forwardPropertiesMap[x] == "string") {
this[this.forwardPropertiesMap[x]] = evt[x];
} else {
this[x] = evt[x];
}
}
}
};
this.toGetString = function (noQmark) {
var qs = [((noQmark) ? "" : "?")];
for (var x = 0; x < this.properties.length; x++) {
var tp = this.properties[x];
if (this[tp[0]]) {
qs.push(tp[1] + "=" + encodeURIComponent(String(this[tp[0]])));
}
}
return qs.join("&");
};
};
dojo.io.repubsubEvent.prototype.properties = [["from", "kn_from"], ["to", "kn_to"], ["method", "do_method"], ["id", "kn_id"], ["uri", "kn_uri"], ["displayname", "kn_displayname"], ["userid", "kn_userid"], ["payload", "kn_payload"], ["flushChars", "kn_response_flush"], ["responseFormat", "kn_response_format"]];
dojo.io.repubsubEvent.prototype.forwardPropertiesMap = {};
dojo.io.repubsubEvent.prototype.reversePropertiesMap = {};
for (var x = 0; x < dojo.io.repubsubEvent.prototype.properties.length; x++) {
var tp = dojo.io.repubsubEvent.prototype.properties[x];
dojo.io.repubsubEvent.prototype.reversePropertiesMap[tp[0]] = tp[1];
dojo.io.repubsubEvent.prototype.forwardPropertiesMap[tp[1]] = tp[0];
}
dojo.io.repubsubEvent.initFromProperties = function (evt) {
var eventObj = new dojo.io.repubsubEvent();
eventObj.initFromProperties(evt);
return eventObj;
};
 
/trunk/api/js/dojo/src/io/ScriptSrcIO.js
New file
0,0 → 1,315
/*
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.ScriptSrcIO");
dojo.require("dojo.io.BrowserIO");
dojo.require("dojo.undo.browser");
dojo.io.ScriptSrcTransport = new function () {
this.preventCache = false;
this.maxUrlLength = 1000;
this.inFlightTimer = null;
this.DsrStatusCodes = {Continue:100, Ok:200, Error:500};
this.startWatchingInFlight = function () {
if (!this.inFlightTimer) {
this.inFlightTimer = setInterval("dojo.io.ScriptSrcTransport.watchInFlight();", 100);
}
};
this.watchInFlight = function () {
var totalCount = 0;
var doneCount = 0;
for (var param in this._state) {
totalCount++;
var currentState = this._state[param];
if (currentState.isDone) {
doneCount++;
delete this._state[param];
} else {
if (!currentState.isFinishing) {
var listener = currentState.kwArgs;
try {
if (currentState.checkString && eval("typeof(" + currentState.checkString + ") != 'undefined'")) {
currentState.isFinishing = true;
this._finish(currentState, "load");
doneCount++;
delete this._state[param];
} else {
if (listener.timeoutSeconds && listener.timeout) {
if (currentState.startTime + (listener.timeoutSeconds * 1000) < (new Date()).getTime()) {
currentState.isFinishing = true;
this._finish(currentState, "timeout");
doneCount++;
delete this._state[param];
}
} else {
if (!listener.timeoutSeconds) {
doneCount++;
}
}
}
}
catch (e) {
currentState.isFinishing = true;
this._finish(currentState, "error", {status:this.DsrStatusCodes.Error, response:e});
}
}
}
}
if (doneCount >= totalCount) {
clearInterval(this.inFlightTimer);
this.inFlightTimer = null;
}
};
this.canHandle = function (kwArgs) {
return dojo.lang.inArray(["text/javascript", "text/json", "application/json"], (kwArgs["mimetype"].toLowerCase())) && (kwArgs["method"].toLowerCase() == "get") && !(kwArgs["formNode"] && dojo.io.formHasFile(kwArgs["formNode"])) && (!kwArgs["sync"] || kwArgs["sync"] == false) && !kwArgs["file"] && !kwArgs["multipart"];
};
this.removeScripts = function () {
var scripts = document.getElementsByTagName("script");
for (var i = 0; scripts && i < scripts.length; i++) {
var scriptTag = scripts[i];
if (scriptTag.className == "ScriptSrcTransport") {
var parent = scriptTag.parentNode;
parent.removeChild(scriptTag);
i--;
}
}
};
this.bind = function (kwArgs) {
var url = kwArgs.url;
var query = "";
if (kwArgs["formNode"]) {
var ta = kwArgs.formNode.getAttribute("action");
if ((ta) && (!kwArgs["url"])) {
url = ta;
}
var tp = kwArgs.formNode.getAttribute("method");
if ((tp) && (!kwArgs["method"])) {
kwArgs.method = tp;
}
query += dojo.io.encodeForm(kwArgs.formNode, kwArgs.encoding, kwArgs["formFilter"]);
}
if (url.indexOf("#") > -1) {
dojo.debug("Warning: dojo.io.bind: stripping hash values from url:", url);
url = url.split("#")[0];
}
var urlParts = url.split("?");
if (urlParts && urlParts.length == 2) {
url = urlParts[0];
query += (query ? "&" : "") + urlParts[1];
}
if (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"]) {
dojo.undo.browser.addToHistory(kwArgs);
}
var id = kwArgs["apiId"] ? kwArgs["apiId"] : "id" + this._counter++;
var content = kwArgs["content"];
var jsonpName = kwArgs.jsonParamName;
if (kwArgs.sendTransport || jsonpName) {
if (!content) {
content = {};
}
if (kwArgs.sendTransport) {
content["dojo.transport"] = "scriptsrc";
}
if (jsonpName) {
content[jsonpName] = "dojo.io.ScriptSrcTransport._state." + id + ".jsonpCall";
}
}
if (kwArgs.postContent) {
query = kwArgs.postContent;
} else {
if (content) {
query += ((query) ? "&" : "") + dojo.io.argsFromMap(content, kwArgs.encoding, jsonpName);
}
}
if (kwArgs["apiId"]) {
kwArgs["useRequestId"] = true;
}
var state = {"id":id, "idParam":"_dsrid=" + id, "url":url, "query":query, "kwArgs":kwArgs, "startTime":(new Date()).getTime(), "isFinishing":false};
if (!url) {
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.none"});
return;
}
if (content && content[jsonpName]) {
state.jsonp = content[jsonpName];
state.jsonpCall = function (data) {
if (data["Error"] || data["error"]) {
if (dojo["json"] && dojo["json"]["serialize"]) {
dojo.debug(dojo.json.serialize(data));
}
dojo.io.ScriptSrcTransport._finish(this, "error", data);
} else {
dojo.io.ScriptSrcTransport._finish(this, "load", data);
}
};
}
if (kwArgs["useRequestId"] || kwArgs["checkString"] || state["jsonp"]) {
this._state[id] = state;
}
if (kwArgs["checkString"]) {
state.checkString = kwArgs["checkString"];
}
state.constantParams = (kwArgs["constantParams"] == null ? "" : kwArgs["constantParams"]);
if (kwArgs["preventCache"] || (this.preventCache == true && kwArgs["preventCache"] != false)) {
state.nocacheParam = "dojo.preventCache=" + new Date().valueOf();
} else {
state.nocacheParam = "";
}
var urlLength = state.url.length + state.query.length + state.constantParams.length + state.nocacheParam.length + this._extraPaddingLength;
if (kwArgs["useRequestId"]) {
urlLength += state.idParam.length;
}
if (!kwArgs["checkString"] && kwArgs["useRequestId"] && !state["jsonp"] && !kwArgs["forceSingleRequest"] && urlLength > this.maxUrlLength) {
if (url > this.maxUrlLength) {
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.tooBig"});
return;
} else {
this._multiAttach(state, 1);
}
} else {
var queryParams = [state.constantParams, state.nocacheParam, state.query];
if (kwArgs["useRequestId"] && !state["jsonp"]) {
queryParams.unshift(state.idParam);
}
var finalUrl = this._buildUrl(state.url, queryParams);
state.finalUrl = finalUrl;
this._attach(state.id, finalUrl);
}
this.startWatchingInFlight();
};
this._counter = 1;
this._state = {};
this._extraPaddingLength = 16;
this._buildUrl = function (url, nameValueArray) {
var finalUrl = url;
var joiner = "?";
for (var i = 0; i < nameValueArray.length; i++) {
if (nameValueArray[i]) {
finalUrl += joiner + nameValueArray[i];
joiner = "&";
}
}
return finalUrl;
};
this._attach = function (id, url) {
var element = document.createElement("script");
element.type = "text/javascript";
element.src = url;
element.id = id;
element.className = "ScriptSrcTransport";
document.getElementsByTagName("head")[0].appendChild(element);
};
this._multiAttach = function (state, part) {
if (state.query == null) {
this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"query.null"});
return;
}
if (!state.constantParams) {
state.constantParams = "";
}
var queryMax = this.maxUrlLength - state.idParam.length - state.constantParams.length - state.url.length - state.nocacheParam.length - this._extraPaddingLength;
var isDone = state.query.length < queryMax;
var currentQuery;
if (isDone) {
currentQuery = state.query;
state.query = null;
} else {
var ampEnd = state.query.lastIndexOf("&", queryMax - 1);
var eqEnd = state.query.lastIndexOf("=", queryMax - 1);
if (ampEnd > eqEnd || eqEnd == queryMax - 1) {
currentQuery = state.query.substring(0, ampEnd);
state.query = state.query.substring(ampEnd + 1, state.query.length);
} else {
currentQuery = state.query.substring(0, queryMax);
var queryName = currentQuery.substring((ampEnd == -1 ? 0 : ampEnd + 1), eqEnd);
state.query = queryName + "=" + state.query.substring(queryMax, state.query.length);
}
}
var queryParams = [currentQuery, state.idParam, state.constantParams, state.nocacheParam];
if (!isDone) {
queryParams.push("_part=" + part);
}
var url = this._buildUrl(state.url, queryParams);
this._attach(state.id + "_" + part, url);
};
this._finish = function (state, callback, event) {
if (callback != "partOk" && !state.kwArgs[callback] && !state.kwArgs["handle"]) {
if (callback == "error") {
state.isDone = true;
throw event;
}
} else {
switch (callback) {
case "load":
var response = event ? event.response : null;
if (!response) {
response = event;
}
state.kwArgs[(typeof state.kwArgs.load == "function") ? "load" : "handle"]("load", response, event, state.kwArgs);
state.isDone = true;
break;
case "partOk":
var part = parseInt(event.response.part, 10) + 1;
if (event.response.constantParams) {
state.constantParams = event.response.constantParams;
}
this._multiAttach(state, part);
state.isDone = false;
break;
case "error":
state.kwArgs[(typeof state.kwArgs.error == "function") ? "error" : "handle"]("error", event.response, event, state.kwArgs);
state.isDone = true;
break;
default:
state.kwArgs[(typeof state.kwArgs[callback] == "function") ? callback : "handle"](callback, event, event, state.kwArgs);
state.isDone = true;
}
}
};
dojo.io.transports.addTransport("ScriptSrcTransport");
};
window.onscriptload = function (event) {
var state = null;
var transport = dojo.io.ScriptSrcTransport;
if (transport._state[event.id]) {
state = transport._state[event.id];
} else {
var tempState;
for (var param in transport._state) {
tempState = transport._state[param];
if (tempState.finalUrl && tempState.finalUrl == event.id) {
state = tempState;
break;
}
}
if (state == null) {
var scripts = document.getElementsByTagName("script");
for (var i = 0; scripts && i < scripts.length; i++) {
var scriptTag = scripts[i];
if (scriptTag.getAttribute("class") == "ScriptSrcTransport" && scriptTag.src == event.id) {
state = transport._state[scriptTag.id];
break;
}
}
}
if (state == null) {
throw "No matching state for onscriptload event.id: " + event.id;
}
}
var callbackName = "error";
switch (event.status) {
case dojo.io.ScriptSrcTransport.DsrStatusCodes.Continue:
callbackName = "partOk";
break;
case dojo.io.ScriptSrcTransport.DsrStatusCodes.Ok:
callbackName = "load";
break;
}
transport._finish(state, callbackName, event);
};
 
/trunk/api/js/dojo/src/io/xip_client.html
New file
0,0 → 1,261
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<script type="text/javascript">
// <!--
/*
This file is really focused on just sending one message to the server, and
receiving one response. The code does not expect to be re-used for multiple messages.
This might be reworked later if performance indicates a need for it.
xip fragment identifier/hash values have the form:
#id:cmd:realEncodedMessage
 
id: some ID that should be unique among messages. No inherent meaning,
just something to make sure the hash value is unique so the message
receiver knows a new message is available.
cmd: command to the receiver. Valid values are:
- init: message used to init the frame. Sent as the first URL when loading
the page. Contains some config parameters.
- loaded: the remote frame is loaded. Only sent from server to client.
- ok: the message that this page sent was received OK. The next message may
now be sent.
- start: the start message of a block of messages (a complete message may
need to be segmented into many messages to get around the limitiations
of the size of an URL that a browser accepts.
- part: indicates this is a part of a message.
- end: the end message of a block of messages. The message can now be acted upon.
If the message is small enough that it doesn't need to be segmented, then
just one hash value message can be sent with "end" as the command.
To reassemble a segmented message, the realEncodedMessage parts just have to be concatenated
together.
*/
 
//MSIE has the lowest limit for URLs with fragment identifiers,
//at around 4K. Choosing a slightly smaller number for good measure.
xipUrlLimit = 4000;
xipIdCounter = 1;
 
function xipInit(){
xipStateId = "";
xipIsSending = false;
xipServerUrl = null;
xipStateId = null;
xipRequestData = null;
xipCurrentHash = "";
xipResponseMessage = "";
xipRequestParts = [];
xipPartIndex = 0;
xipServerWindow = null;
xipUseFrameRecursion = false;
}
xipInit();
function send(encodedData){
if(xipUseFrameRecursion == "true"){
var clientEndPoint = window.open(xipStateId + "_clientEndPoint");
clientEndPoint.send(encodedData);
}else{
if(!xipIsSending){
xipIsSending = true;
xipRequestData = encodedData || "";
 
//Get a handle to the server iframe.
xipServerWindow = frames[xipStateId + "_frame"];
if (!xipServerWindow){
xipServerWindow = document.getElementById(xipStateId + "_frame").contentWindow;
}
sendRequestStart();
}
}
}
 
//Modify the server URL if it is a local path and
//This is done for local/same domain testing.
function fixServerUrl(ifpServerUrl){
if(ifpServerUrl.indexOf("..") == 0){
var parts = ifpServerUrl.split("/");
ifpServerUrl = parts[parts.length - 1];
}
return ifpServerUrl;
}
function pollHash(){
//Can't use location.hash because at least Firefox does a decodeURIComponent on it.
var urlParts = window.location.href.split("#");
if(urlParts.length == 2){
var newHash = urlParts[1];
if(newHash != xipCurrentHash){
try{
messageReceived(newHash);
}catch(e){
//Make sure to not keep processing the error hash value.
xipCurrentHash = newHash;
throw e;
}
xipCurrentHash = newHash;
}
}
}
 
function messageReceived(encodedData){
var msg = unpackMessage(encodedData);
 
switch(msg.command){
case "loaded":
xipMasterFrame.dojo.io.XhrIframeProxy.clientFrameLoaded(xipStateId);
break;
case "ok":
sendRequestPart();
break;
case "start":
xipResponseMessage = "";
xipResponseMessage += msg.message;
setServerUrl("ok");
break;
case "part":
xipResponseMessage += msg.message;
setServerUrl("ok");
break;
case "end":
setServerUrl("ok");
xipResponseMessage += msg.message;
xipMasterFrame.dojo.io.XhrIframeProxy.receive(xipStateId, xipResponseMessage);
break;
}
}
function sendRequestStart(){
//Break the message into parts, if necessary.
xipRequestParts = [];
var reqData = xipRequestData;
var urlLength = xipServerUrl.length;
var partLength = xipUrlLimit - urlLength;
var reqIndex = 0;
 
while((reqData.length - reqIndex) + urlLength > xipUrlLimit){
var part = reqData.substring(reqIndex, reqIndex + partLength);
//Safari will do some extra hex escaping unless we keep the original hex
//escaping complete.
var percentIndex = part.lastIndexOf("%");
if(percentIndex == part.length - 1 || percentIndex == part.length - 2){
part = part.substring(0, percentIndex);
}
xipRequestParts.push(part);
reqIndex += part.length;
}
xipRequestParts.push(reqData.substring(reqIndex, reqData.length));
xipPartIndex = 0;
sendRequestPart();
}
function sendRequestPart(){
if(xipPartIndex < xipRequestParts.length){
//Get the message part.
var partData = xipRequestParts[xipPartIndex];
 
//Get the command.
var cmd = "part";
if(xipPartIndex + 1 == xipRequestParts.length){
cmd = "end";
}else if (xipPartIndex == 0){
cmd = "start";
}
setServerUrl(cmd, partData);
xipPartIndex++;
}
}
function setServerUrl(cmd, message){
var serverUrl = makeServerUrl(cmd, message);
 
//Safari won't let us replace across domains.
if(navigator.userAgent.indexOf("Safari") == -1){
xipServerWindow.location.replace(serverUrl);
}else{
xipServerWindow.location = serverUrl;
}
}
function makeServerUrl(cmd, message){
var serverUrl = xipServerUrl + "#" + (xipIdCounter++) + ":" + cmd;
if(message){
serverUrl += ":" + message;
}
return serverUrl;
}
 
function unpackMessage(encodedMessage){
var parts = encodedMessage.split(":");
var command = parts[1];
encodedMessage = parts[2] || "";
 
var config = null;
if(command == "init"){
var configParts = encodedMessage.split("&");
config = {};
for(var i = 0; i < configParts.length; i++){
var nameValue = configParts[i].split("=");
config[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
}
}
return {command: command, message: encodedMessage, config: config};
}
 
function onClientLoad(){
//Decode the init params
var config = unpackMessage(window.location.href.split("#")[1]).config;
 
xipStateId = config.id;
 
//Remove the query param for the IE7 recursive case.
xipServerUrl = fixServerUrl(config.server).replace(/(\?|\&)dojo\.fr\=1/, "");
xipUseFrameRecursion = config["fr"];
if(xipUseFrameRecursion == "endpoint"){
xipMasterFrame = parent.parent;
}else{
xipMasterFrame = parent;
}
//Start counter to inspect hash value.
setInterval(pollHash, 10);
 
var clientUrl = window.location.href.split("#")[0];
document.getElementById("iframeHolder").innerHTML = '<iframe src="'
+ makeServerUrl("init", 'id=' + xipStateId + '&client=' + encodeURIComponent(clientUrl)
+ '&fr=' + xipUseFrameRecursion) + '" id="' + xipStateId + '_frame"></iframe>';
}
 
if(typeof(window.addEventListener) == "undefined"){
window.attachEvent("onload", onClientLoad);
}else{
window.addEventListener('load', onClientLoad, false);
}
// -->
</script>
</head>
<body>
<h4>The Dojo Toolkit -- xip_client.html</h4>
 
<p>This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the "client" file used
internally by dojo.io.XhrIframeProxy.</p>
<span id="iframeHolder"></span>
</body>
</html>
/trunk/api/js/dojo/src/io/RhinoIO.js
New file
0,0 → 1,114
/*
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.RhinoIO");
dojo.require("dojo.io.common");
dojo.require("dojo.lang.func");
dojo.require("dojo.lang.array");
dojo.require("dojo.string.extras");
dojo.io.RhinoHTTPTransport = new function () {
this.canHandle = function (req) {
if (dojo.lang.find(["text/plain", "text/html", "text/xml", "text/javascript", "text/json", "application/json"], (req.mimetype.toLowerCase() || "")) < 0) {
return false;
}
if (req.url.substr(0, 7) != "http://") {
return false;
}
return true;
};
function doLoad(req, conn) {
var ret;
if (req.method.toLowerCase() == "head") {
} else {
var stream = conn.getContent();
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(stream));
var text = "";
var line = null;
while ((line = reader.readLine()) != null) {
text += line;
}
if (req.mimetype == "text/javascript") {
try {
ret = dj_eval(text);
}
catch (e) {
dojo.debug(e);
dojo.debug(text);
ret = null;
}
} else {
if (req.mimetype == "text/json" || req.mimetype == "application/json") {
try {
ret = dj_eval("(" + text + ")");
}
catch (e) {
dojo.debug(e);
dojo.debug(text);
ret = false;
}
} else {
ret = text;
}
}
}
req.load("load", ret, req);
}
function connect(req) {
var content = req.content || {};
var query;
if (req.sendTransport) {
content["dojo.transport"] = "rhinohttp";
}
if (req.postContent) {
query = req.postContent;
} else {
query = dojo.io.argsFromMap(content, req.encoding);
}
var url_text = req.url;
if (req.method.toLowerCase() == "get" && query != "") {
url_text = url_text + "?" + query;
}
var url = new java.net.URL(url_text);
var conn = url.openConnection();
conn.setRequestMethod(req.method.toUpperCase());
if (req.headers) {
for (var header in req.headers) {
if (header.toLowerCase() == "content-type" && !req.contentType) {
req.contentType = req.headers[header];
} else {
conn.setRequestProperty(header, req.headers[header]);
}
}
}
if (req.contentType) {
conn.setRequestProperty("Content-Type", req.contentType);
}
if (req.method.toLowerCase() == "post") {
conn.setDoOutput(true);
var output_stream = conn.getOutputStream();
var byte_array = (new java.lang.String(query)).getBytes();
output_stream.write(byte_array, 0, byte_array.length);
}
conn.connect();
doLoad(req, conn);
}
this.bind = function (req) {
var async = req["sync"] ? false : true;
if (async) {
setTimeout(dojo.lang.hitch(this, function () {
connect(req);
}), 1);
} else {
connect(req);
}
};
dojo.io.transports.addTransport("RhinoHTTPTransport");
};
 
/trunk/api/js/dojo/src/io/XhrIframeProxy.js
New file
0,0 → 1,150
/*
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.XhrIframeProxy");
dojo.require("dojo.experimental");
dojo.experimental("dojo.io.XhrIframeProxy");
dojo.require("dojo.io.IframeIO");
dojo.require("dojo.dom");
dojo.require("dojo.uri.Uri");
dojo.io.XhrIframeProxy = {xipClientUrl:djConfig["xipClientUrl"] || dojo.uri.moduleUri("dojo.io", "xip_client.html"), _state:{}, _stateIdCounter:0, needFrameRecursion:function () {
return (true == dojo.render.html.ie70);
}, send:function (facade) {
var stateId = "XhrIframeProxy" + (this._stateIdCounter++);
facade._stateId = stateId;
var frameUrl = this.xipClientUrl + "#0:init:id=" + stateId + "&server=" + encodeURIComponent(facade._ifpServerUrl) + "&fr=false";
if (this.needFrameRecursion()) {
var fullClientUrl = window.location.href;
if ((this.xipClientUrl + "").charAt(0) == "/") {
var endIndex = fullClientUrl.indexOf("://");
endIndex = fullClientUrl.indexOf("/", endIndex + 1);
fullClientUrl = fullClientUrl.substring(0, endIndex);
} else {
fullClientUrl = fullClientUrl.substring(0, fullClientUrl.lastIndexOf("/") + 1);
}
fullClientUrl += this.xipClientUrl;
var serverUrl = facade._ifpServerUrl + (facade._ifpServerUrl.indexOf("?") == -1 ? "?" : "&") + "dojo.fr=1";
frameUrl = serverUrl + "#0:init:id=" + stateId + "&client=" + encodeURIComponent(fullClientUrl) + "&fr=" + this.needFrameRecursion();
}
this._state[stateId] = {facade:facade, stateId:stateId, clientFrame:dojo.io.createIFrame(stateId, "", frameUrl)};
return stateId;
}, receive:function (stateId, urlEncodedData) {
var response = {};
var nvPairs = urlEncodedData.split("&");
for (var i = 0; i < nvPairs.length; i++) {
if (nvPairs[i]) {
var nameValue = nvPairs[i].split("=");
response[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
}
}
var state = this._state[stateId];
var facade = state.facade;
facade._setResponseHeaders(response.responseHeaders);
if (response.status == 0 || response.status) {
facade.status = parseInt(response.status, 10);
}
if (response.statusText) {
facade.statusText = response.statusText;
}
if (response.responseText) {
facade.responseText = response.responseText;
var contentType = facade.getResponseHeader("Content-Type");
if (contentType && (contentType == "application/xml" || contentType == "text/xml")) {
facade.responseXML = dojo.dom.createDocumentFromText(response.responseText, contentType);
}
}
facade.readyState = 4;
this.destroyState(stateId);
}, clientFrameLoaded:function (stateId) {
var state = this._state[stateId];
var facade = state.facade;
if (this.needFrameRecursion()) {
var clientWindow = window.open("", state.stateId + "_clientEndPoint");
} else {
var clientWindow = state.clientFrame.contentWindow;
}
var reqHeaders = [];
for (var param in facade._requestHeaders) {
reqHeaders.push(param + ": " + facade._requestHeaders[param]);
}
var requestData = {uri:facade._uri};
if (reqHeaders.length > 0) {
requestData.requestHeaders = reqHeaders.join("\r\n");
}
if (facade._method) {
requestData.method = facade._method;
}
if (facade._bodyData) {
requestData.data = facade._bodyData;
}
clientWindow.send(dojo.io.argsFromMap(requestData, "utf8"));
}, destroyState:function (stateId) {
var state = this._state[stateId];
if (state) {
delete this._state[stateId];
var parentNode = state.clientFrame.parentNode;
parentNode.removeChild(state.clientFrame);
state.clientFrame = null;
state = null;
}
}, createFacade:function () {
if (arguments && arguments[0] && arguments[0]["iframeProxyUrl"]) {
return new dojo.io.XhrIframeFacade(arguments[0]["iframeProxyUrl"]);
} else {
return dojo.io.XhrIframeProxy.oldGetXmlhttpObject.apply(dojo.hostenv, arguments);
}
}};
dojo.io.XhrIframeProxy.oldGetXmlhttpObject = dojo.hostenv.getXmlhttpObject;
dojo.hostenv.getXmlhttpObject = dojo.io.XhrIframeProxy.createFacade;
dojo.io.XhrIframeFacade = function (ifpServerUrl) {
this._requestHeaders = {};
this._allResponseHeaders = null;
this._responseHeaders = {};
this._method = null;
this._uri = null;
this._bodyData = null;
this.responseText = null;
this.responseXML = null;
this.status = null;
this.statusText = null;
this.readyState = 0;
this._ifpServerUrl = ifpServerUrl;
this._stateId = null;
};
dojo.lang.extend(dojo.io.XhrIframeFacade, {open:function (method, uri) {
this._method = method;
this._uri = uri;
this.readyState = 1;
}, setRequestHeader:function (header, value) {
this._requestHeaders[header] = value;
}, send:function (stringData) {
this._bodyData = stringData;
this._stateId = dojo.io.XhrIframeProxy.send(this);
this.readyState = 2;
}, abort:function () {
dojo.io.XhrIframeProxy.destroyState(this._stateId);
}, getAllResponseHeaders:function () {
return this._allResponseHeaders;
}, getResponseHeader:function (header) {
return this._responseHeaders[header];
}, _setResponseHeaders:function (allHeaders) {
if (allHeaders) {
this._allResponseHeaders = allHeaders;
allHeaders = allHeaders.replace(/\r/g, "");
var nvPairs = allHeaders.split("\n");
for (var i = 0; i < nvPairs.length; i++) {
if (nvPairs[i]) {
var nameValue = nvPairs[i].split(": ");
this._responseHeaders[nameValue[0]] = nameValue[1];
}
}
}
}});
 
/trunk/api/js/dojo/src/io/__package__.js
New file
0,0 → 1,13
/*
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.kwCompoundRequire({common:["dojo.io.common"], rhino:["dojo.io.RhinoIO"], browser:["dojo.io.BrowserIO", "dojo.io.cookie"], dashboard:["dojo.io.BrowserIO", "dojo.io.cookie"]});
dojo.provide("dojo.io.*");
 
/trunk/api/js/dojo/src/io/common.js
New file
0,0 → 1,218
/*
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, 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);
}
};