/* Ajax bootstrapping code */ // bound in sjs-ajax-bootstrap.js // var Ajax = {}; //---------------------------------------------------------------------- // helpers // implemented in sjs-ajax-bootstrap.js (pending SJS implementation of for-in) //Ajax.constructURI = function(baseuri, properties) //---------------------------------------------------------------------- // loading scripts Ajax._pendingScripts = {}; Ajax._loadedScripts = {}; Ajax.loadScript = function(url) { if (this._loadedScripts[url]) return; var hook = this._pendingScripts[url]; if (hook != null) { suspend { hook.push(resume); } // retract { // XXX could remove resume function from hook here // } } else { // we're the inital requester var THIS=this; // XXX bug workaround; see http://www.croczilla.com/stratified suspend { var elem = document.createElement("script"); var hook = []; THIS._pendingScripts[url] = hook; function listener(e) { resume(); } function listenerIE(e) { if (e.srcElement.readyState == "loaded" || e.srcElement.readyState == "complete") resume(); } if (elem.addEventListener) elem.addEventListener("load", listener, false); else // IE elem.attachEvent("onreadystatechange", listenerIE); // kick off the load: elem.src = url; document.getElementsByTagName("head")[0].appendChild(elem); } retract { THIS._pendingScripts[url] = null; } finally { if (elem.removeEventListener) elem.removeEventListener("load", listener, false); else elem.detachEvent("onreadystatechange", listenerIE); } this._pendingScripts[url] = null; this._loadedScripts[url] = true; for (var i=0; i\x3C/script>"); doc.close(); } finally { iframe.parentNode.removeChild(iframe); } return rv; }; //---------------------------------------------------------------------- // DOM helpers: Ajax.DOM = {}; Ajax.DOM.waitForEvent = function(event, elem) { if (typeof elem == "string") elem = document.getElementById(elem); suspend { var rv; var listener_func = function(e) { rv = e; resume(); } if (elem.addEventListener) elem.addEventListener(event, listener_func, false); else // IE elem.attachEvent("on"+event, listener_func); } finally { if (elem.removeEventListener) elem.removeEventListener(event, listener_func, false); else // IE elem.detachEvent("on"+event, listener_func); } return rv; }; //---------------------------------------------------------------------- // Google API wrapper: Ajax.google = {}; // ensure that the google ajax api is loaded. Only used internally. Ajax.google._ensureAPI = function() { Ajax.loadScript("http://www.google.com/jsapi"); }; // load a particular module through the google api loader Ajax.google.loadModule = function(moduleName, moduleVersion) { Ajax.google._ensureAPI(); suspend { google.load(moduleName, moduleVersion, { callback: resume }); } }; // low-level wrapper of google search api // see http://code.google.com/apis/ajaxsearch/documentation/reference.html#_restUrlBase // type parameter: web (default) | local | video | blogs | news | books | images | patent Ajax.google.search = function(query, /*[opt] */ type, /* [opt] */ extra_params) { var params = { q : query, v : "1.0" }; if (!type) type = "web"; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/search/" + type, params, extra_params); return Ajax.requestJSONP(url); }; Ajax.google.feed = {}; // low-level wrappers of google feed api // see http://code.google.com/apis/ajaxfeeds/documentation/reference.html#_restUrlBase Ajax.google.feed.load = function(query, /* [opt] */ extra_params) { var params = { q : query, v : "1.0" }; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/feed/load", params, extra_params); return Ajax.requestJSONP(url); }; Ajax.google.feed.find = function(query, /* [opt] */ extra_params) { var params = { q : query, v : "1.0" }; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/feed/find", params, extra_params); return Ajax.requestJSONP(url); }; Ajax.google.feed.lookup = function(query, /* [opt] */ extra_params) { var params = { q : query, v : "1.0" }; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/feed/lookup", params, extra_params); return Ajax.requestJSONP(url); }; // deprecated method that loads feeds through the google API Ajax.google.feed.loadFeed = function(url, numEntries) { Ajax.google.loadModule("feeds", "1"); var feed = new google.feeds.Feed(url); feed.setNumEntries(numEntries ? numEntries : 20); var result; suspend { feed.load(function(res) { result = res; resume(); }); } return result; }; Ajax.google.language = {}; // low-level wrappers of google language api // see http://code.google.com/apis/ajaxlanguage/documentation/reference.html#_intro_fonje // src_lang can be null or "", in which case the src language will be // autodetected Ajax.google.language.translate = function(text, dest_lang, src_lang, /* [opt] */ extra_params) { if (src_lang == null) src_lang = ""; var params = { q : text, v : "1.0", langpair : src_lang + "|" + dest_lang }; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/language/translate", params, extra_params); return Ajax.requestJSONP(url); }; Ajax.google.language.detect = function(text, /* [opt] */ extra_params) { var params = { q : text, v : "1.0" }; var url = Ajax.constructURI("http://ajax.googleapis.com/ajax/services/language/detect", params, extra_params); return Ajax.requestJSONP(url); };