summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbjorn <bjorn@bringert.net>2008-10-17 11:14:46 +0000
committerbjorn <bjorn@bringert.net>2008-10-17 11:14:46 +0000
commit0eaef4a5b576aad05a0e52690f0cc02e87c82168 (patch)
treeb68f9dd3c3e92974d37f03f2976fc13ddaefc3a5 /src
parent3df821efd7fd0efaf6cf9b1163b6542aa29f5cc7 (diff)
Use JSON-P in gf-server-jsapi.js
Diffstat (limited to 'src')
-rw-r--r--src/server/gf-server-jsapi.js34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/server/gf-server-jsapi.js b/src/server/gf-server-jsapi.js
index 6cf6afbc3..5c02395e8 100644
--- a/src/server/gf-server-jsapi.js
+++ b/src/server/gf-server-jsapi.js
@@ -26,11 +26,41 @@ gf.callFunction = function (fun, args, callback) {
var query = "";
for (var i in args) {
query += (query == "") ? "?" : "&";
- query += i + "=" + escape(args[i]);
+ query += i + "=" + encodeURIComponent(args[i]);
}
- gf.httpGetText(pgf_base_url + "/" + fun + query, function (output) { callback(gf.readJSON(output)); });
+ var url = pgf_base_url + "/" + fun + query;
+
+ // FIXME: if same domain, use gf.httpGetText
+ gf.httpGetJSONP(url, callback);
}
+gf.httpGetJSONP = function (url, callback) {
+ var script = document.createElement("script");
+
+ if (!window.jsonCallbacks) {
+ window.jsonCallbacks = new Array();
+ }
+ var callbackIndex = window.jsonCallbacks.length;
+ window.jsonCallbacks.push(function (output) {
+ document.getElementsByTagName("head")[0].removeChild(script);
+ callback(output);
+ window.jsonCallbacks[callbackIndex] = null; // let the function be garbage-collected
+ // FIXME: there will be lots of nulls in that array, we should purge it
+ });
+ var callbackName = "jsonCallbacks[" + callbackIndex + "]";
+
+ var questionMarkPos = url.indexOf("?");
+ if (questionMarkPos > -1) {
+ url += (questionMarkPos < url.length-1) ? "&" : "";
+ } else {
+ url += "?";
+ }
+ url += "jsonp=" + callbackName;
+ script.setAttribute("src", url);
+ script.setAttribute("type", "text/javascript");
+ document.getElementsByTagName("head")[0].appendChild(script);
+};
+
gf.httpGetText = function (url, callback) {
var XMLHttpRequestObject = false;