function jsAlert(val) {
if(typeof alert != 'undefined') {
alert(val);
} else {
print(val);
}
}
function jsLog(val) {
console.log(val);
}
function jsPrompt(str) {
var val;
if(typeof prompt != 'undefined') {
val = prompt(str);
} else {
print(str);
val = readline();
}
return val == undefined ? '' : val.toString();
}
function jsEval(str) {
var x = eval(str);
return x == undefined ? '' : x.toString();
}
function isNull(obj) {
return obj === null;
}
function jsRead(str) {
return Number(str);
}
function jsShowI(val) {return val.toString();}
function jsShow(val) {
var ret = val.toString();
return val == Math.round(val) ? ret + '.0' : ret;
}
function jsGetMouseCoords(e) {
var posx = 0;
var posy = 0;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
}
else if (e.clientX || e.clientY) {
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
return [posx - e.target.offsetLeft, posy - e.target.offsetTop];
}
function jsSetCB(elem, evt, cb) {
// Count return press in single line text box as a change event.
if(evt == 'change' && elem.type.toLowerCase() == 'text') {
setCB(elem, 'keyup', function(k) {
if(k == '\n'.charCodeAt(0)) {
A(cb,[[0,k.keyCode],0]);
}
});
}
var fun;
switch(evt) {
case 'click':
case 'dblclick':
case 'mouseup':
case 'mousedown':
fun = function(x) {
var mpos = jsGetMouseCoords(x);
var mx = [0,mpos[0]];
var my = [0,mpos[1]];
A(cb,[[0,x.button],[0,mx,my],0]);
};
break;
case 'mousemove':
case 'mouseover':
fun = function(x) {
var mpos = jsGetMouseCoords(x);
var mx = [0,mpos[0]];
var my = [0,mpos[1]];
A(cb,[[0,mx,my],0]);
};
break;
case 'keypress':
case 'keyup':
case 'keydown':
fun = function(x) {A(cb,[[0,x.keyCode],0]);};
break;
default:
fun = function() {A(cb,[0]);};
break;
}
return setCB(elem, evt, fun);
}
function setCB(elem, evt, cb) {
if(elem.addEventListener) {
elem.addEventListener(evt, cb, false);
return true;
} else if(elem.attachEvent) {
elem.attachEvent('on'+evt, cb);
return true;
}
return false;
}
function jsSetTimeout(msecs, cb) {
window.setTimeout(function() {A(cb,[0]);}, msecs);
}
function jsGet(elem, prop) {
return elem[prop].toString();
}
function jsSet(elem, prop, val) {
elem[prop] = val;
}
function jsGetStyle(elem, prop) {
return elem.style[prop].toString();
}
function jsSetStyle(elem, prop, val) {
elem.style[prop] = val;
}
function jsKillChild(child, parent) {
parent.removeChild(child);
}
function jsClearChildren(elem) {
while(elem.hasChildNodes()){
elem.removeChild(elem.lastChild);
}
}
function jsFind(elem) {
var e = document.getElementById(elem)
if(e) {
return [1,[0,e]];
}
return [0];
}
function jsCreateElem(tag) {
return document.createElement(tag);
}
function jsGetChildBefore(elem) {
elem = elem.previousSibling;
while(elem) {
if(typeof elem.tagName != 'undefined') {
return [1,[0,elem]];
}
elem = elem.previousSibling;
}
return [0];
}
function jsGetLastChild(elem) {
var len = elem.childNodes.length;
for(var i = len-1; i >= 0; --i) {
if(typeof elem.childNodes[i].tagName != 'undefined') {
return [1,[0,elem.childNodes[i]]];
}
}
return [0];
}
function jsGetChildren(elem) {
var children = [0];
var len = elem.childNodes.length;
for(var i = len-1; i >= 0; --i) {
if(typeof elem.childNodes[i].tagName != 'undefined') {
children = [1, [0,elem.childNodes[i]], children];
}
}
return children;
}
function jsSetChildren(elem, children) {
children = E(children);
jsClearChildren(elem, 0);
while(children[0] === 1) {
elem.appendChild(E(E(children[1])[1]));
children = E(children[2]);
}
}
function jsAppendChild(child, container) {
container.appendChild(child);
}
function jsAddChildBefore(child, container, after) {
container.insertBefore(child, after);
}
var jsRand = Math.random;
// Concatenate a Haskell list of JS strings
function jsCat(strs, sep) {
var arr = [];
strs = E(strs);
while(strs[0]) {
strs = E(strs);
arr.push(E(strs[1])[1]);
strs = E(strs[2]);
}
return arr.join(sep);
}
// Escape all double quotes in a string
function jsUnquote(str) {
return str.replace(/"/, '\\"');
}
// Parse a JSON message into a Haste.JSON.JSON value.
// As this pokes around inside Haskell values, it'll need to be updated if:
// * Haste.JSON.JSON changes;
// * E() starts to choke on non-thunks;
// * data constructor code generation changes; or
// * Just and Nothing change tags.
function jsParseJSON(str) {
try {
var js = JSON.parse(str);
var hs = toHS(js);
} catch(_) {
return [0];
}
return [1,hs];
}
function toHS(obj) {
switch(typeof obj) {
case 'number':
return [0, [0, jsRead(obj)]];
case 'string':
return [1, [0, obj]];
break;
case 'boolean':
return [2, obj]; // Booleans are special wrt constructor tags!
break;
case 'object':
if(obj instanceof Array) {
return [3, arr2lst(obj, 0)];
} else {
// Object type but not array - it's a dictionary.
// The RFC doesn't say anything about the ordering of keys, but
// considering that lots of people rely on keys being "in order" as
// defined by "the same way someone put them in at the other end,"
// it's probably a good idea to put some cycles into meeting their
// misguided expectations.
var ks = [];
for(var k in obj) {
ks.unshift(k);
}
var xs = [0];
for(var i in ks) {
xs = [1, [0, [0,ks[i]], toHS(obj[ks[i]])], xs];
}
return [4, xs];
}
}
}
function arr2lst(arr, elem) {
if(elem >= arr.length) {
return [0];
}
return [1, toHS(arr[elem]), new T(function() {return arr2lst(arr,elem+1);})]
}
function ajaxReq(method, url, async, postdata, cb) {
var xhr = new XMLHttpRequest();
xhr.open(method, url, async);
xhr.setRequestHeader('Cache-control', 'no-cache');
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
A(cb,[[1,[0,xhr.responseText]],0]);
} else {
A(cb,[[0],0]); // Nothing
}
}
}
xhr.send(postdata);
}