/* --- Accessing document elements ------------------------------------------ */ function element(id) { return document.getElementById(id); } /* --- JSONP ---------------------------------------------------------------- */ // Inspired by the function jsonp from // http://www.west-wind.com/Weblog/posts/107136.aspx // See also http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/ // http://en.wikipedia.org/wiki/JSON#JSONP function jsonp(url,callback) { if (url.indexOf("?") > -1) url += "&jsonp=" else url += "?jsonp=" url += callback; //url += "&" + new Date().getTime().toString(); // prevent caching var script = empty("script"); script.setAttribute("src",url); script.setAttribute("type","text/javascript"); document.body.appendChild(script); } var json = {next:0}; // Like jsonp, but instead of passing the name of the ballback function, you // pass the callback function directly, making it possible to use anonymous // functions. function jsonpf(url,callback) { var name="callback"+(json.next++); json[name]=function(x) { delete json[name]; callback(x); } jsonp(url,"json."+name); } /* --- HTML construction ---------------------------------------------------- */ function text(s) { return document.createTextNode(s); } function empty(tag,name,value) { var el=document.createElement(tag); if(name && value) el.setAttribute(name,value); return el; } function empty_id(tag,id) { return empty(tag,"id",id); } function empty_class(tag,cls) { return empty(tag,"class",cls); } function div_id(id) { return empty_id("div",id); } function span_id(id) { return empty_id("span",id); } function wrap(tag,contents) { var el=empty(tag); el.appendChild(contents); return el; } function wrap_class(tag,cls,contents) { var el=empty_class(tag,cls); if(contents) el.appendChild(contents); return el; } function span_class(cls,contents) { return wrap_class("span",cls,contents); } function div_class(cls,contents) { return wrap_class("div",cls,contents); } function p(contents) { return wrap("p",contents); } function dt(contents) { return wrap("dt",contents); } function li(contents) { return wrap("li",contents); } function th(contents) { return wrap("th",contents); } function td(contents) { return wrap("td",contents); } function tr(cells) { var tr=empty("tr"); for(var i=0;i"; } return result; } function field_names(obj) { var result = ""; for (var i in obj) { result += " " + i; } return result; } /* --- Data manipulation ---------------------------------------------------- */ function swap(a,i,j) { // Note: this doesn't work on strings. var tmp=a[i]; a[i]=a[j]; a[j]=tmp; return a; } function sort(a) { // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort return a.sort(); /* // Note: this doesn't work on strings. for(var i=0;i