/*
   This file aggregates all the scripts needed for the Eloquent
   JavaScript book. First comes the MochiKit library, then some
   scripts related to the in-browser JavaScript editor (a more
   polished version of which can be found at
   http://marijn.haverbeke.nl/codemirror/), and finally some
   scripts specifically for mangling the layout of the pages of this
   book (book.js), and adding a console to it (initenv.js, env.js).
*/

//- Mochi.js

/***

    MochiKit.MochiKit 1.4 : PACKED VERSION

    THIS FILE IS AUTOMATICALLY GENERATED.  If creating patches, please
    diff against the source tree, not this file.

    See <http://mochikit.com/> for documentation, downloads, license, etc.

    (c) 2005 Bob Ippolito.  All rights Reserved.

***/

if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.Base");
}
if(typeof (MochiKit)=="undefined"){
MochiKit={};
}
if(typeof (MochiKit.Base)=="undefined"){
MochiKit.Base={};
}
if(typeof (MochiKit.__export__)=="undefined"){
MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
}
MochiKit.Base.VERSION="1.4";
MochiKit.Base.NAME="MochiKit.Base";
MochiKit.Base.update=function(_1,_2){
if(_1===null){
_1={};
}
for(var i=1;i<arguments.length;i++){
var o=arguments[i];
if(typeof (o)!="undefined"&&o!==null){
for(var k in o){
_1[k]=o[k];
}
}
}
return _1;
};
MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
return "["+this.NAME+" "+this.VERSION+"]";
},toString:function(){
return this.__repr__();
},camelize:function(_6){
var _7=_6.split("-");
var cc=_7[0];
for(var i=1;i<_7.length;i++){
cc+=_7[i].charAt(0).toUpperCase()+_7[i].substring(1);
}
return cc;
},counter:function(n){
if(arguments.length===0){
n=1;
}
return function(){
return n++;
};
},clone:function(_b){
var me=arguments.callee;
if(arguments.length==1){
me.prototype=_b;
return new me();
}
},_flattenArray:function(_d,_e){
for(var i=0;i<_e.length;i++){
var o=_e[i];
if(o instanceof Array){
arguments.callee(_d,o);
}else{
_d.push(o);
}
}
return _d;
},flattenArray:function(lst){
return MochiKit.Base._flattenArray([],lst);
},flattenArguments:function(lst){
var res=[];
var m=MochiKit.Base;
var _15=m.extend(null,arguments);
while(_15.length){
var o=_15.shift();
if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
for(var i=o.length-1;i>=0;i--){
_15.unshift(o[i]);
}
}else{
res.push(o);
}
}
return res;
},extend:function(_18,obj,_1a){
if(!_1a){
_1a=0;
}
if(obj){
var l=obj.length;
if(typeof (l)!="number"){
if(typeof (MochiKit.Iter)!="undefined"){
obj=MochiKit.Iter.list(obj);
l=obj.length;
}else{
throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
}
}
if(!_18){
_18=[];
}
for(var i=_1a;i<l;i++){
_18.push(obj[i]);
}
}
return _18;
},updatetree:function(_1d,obj){
if(_1d===null){
_1d={};
}
for(var i=1;i<arguments.length;i++){
var o=arguments[i];
if(typeof (o)!="undefined"&&o!==null){
for(var k in o){
var v=o[k];
if(typeof (_1d[k])=="object"&&typeof (v)=="object"){
arguments.callee(_1d[k],v);
}else{
_1d[k]=v;
}
}
}
}
return _1d;
},setdefault:function(_23,obj){
if(_23===null){
_23={};
}
for(var i=1;i<arguments.length;i++){
var o=arguments[i];
for(var k in o){
if(!(k in _23)){
_23[k]=o[k];
}
}
}
return _23;
},keys:function(obj){
var _29=[];
for(var _2a in obj){
_29.push(_2a);
}
return _29;
},values:function(obj){
var _2c=[];
for(var _2d in obj){
_2c.push(obj[_2d]);
}
return _2c;
},items:function(obj){
var _2f=[];
var e;
for(var _31 in obj){
var v;
try{
v=obj[_31];
}
catch(e){
continue;
}
_2f.push([_31,v]);
}
return _2f;
},_newNamedError:function(_33,_34,_35){
_35.prototype=new MochiKit.Base.NamedError(_33.NAME+"."+_34);
_33[_34]=_35;
},operator:{truth:function(a){
return !!a;
},lognot:function(a){
return !a;
},identity:function(a){
return a;
},not:function(a){
return ~a;
},neg:function(a){
return -a;
},add:function(a,b){
return a+b;
},sub:function(a,b){
return a-b;
},div:function(a,b){
return a/b;
},mod:function(a,b){
return a%b;
},mul:function(a,b){
return a*b;
},and:function(a,b){
return a&b;
},or:function(a,b){
return a|b;
},xor:function(a,b){
return a^b;
},lshift:function(a,b){
return a<<b;
},rshift:function(a,b){
return a>>b;
},zrshift:function(a,b){
return a>>>b;
},eq:function(a,b){
return a==b;
},ne:function(a,b){
return a!=b;
},gt:function(a,b){
return a>b;
},ge:function(a,b){
return a>=b;
},lt:function(a,b){
return a<b;
},le:function(a,b){
return a<=b;
},seq:function(a,b){
return a===b;
},sne:function(a,b){
return a!==b;
},ceq:function(a,b){
return MochiKit.Base.compare(a,b)===0;
},cne:function(a,b){
return MochiKit.Base.compare(a,b)!==0;
},cgt:function(a,b){
return MochiKit.Base.compare(a,b)==1;
},cge:function(a,b){
return MochiKit.Base.compare(a,b)!=-1;
},clt:function(a,b){
return MochiKit.Base.compare(a,b)==-1;
},cle:function(a,b){
return MochiKit.Base.compare(a,b)!=1;
},logand:function(a,b){
return a&&b;
},logor:function(a,b){
return a||b;
},contains:function(a,b){
return b in a;
}},forwardCall:function(_73){
return function(){
return this[_73].apply(this,arguments);
};
},itemgetter:function(_74){
return function(arg){
return arg[_74];
};
},typeMatcher:function(){
var _76={};
for(var i=0;i<arguments.length;i++){
var typ=arguments[i];
_76[typ]=typ;
}
return function(){
for(var i=0;i<arguments.length;i++){
if(!(typeof (arguments[i]) in _76)){
return false;
}
}
return true;
};
},isNull:function(){
for(var i=0;i<arguments.length;i++){
if(arguments[i]!==null){
return false;
}
}
return true;
},isUndefinedOrNull:function(){
for(var i=0;i<arguments.length;i++){
var o=arguments[i];
if(!(typeof (o)=="undefined"||o===null)){
return false;
}
}
return true;
},isEmpty:function(obj){
return !MochiKit.Base.isNotEmpty.apply(this,arguments);
},isNotEmpty:function(obj){
for(var i=0;i<arguments.length;i++){
var o=arguments[i];
if(!(o&&o.length)){
return false;
}
}
return true;
},isArrayLike:function(){
for(var i=0;i<arguments.length;i++){
var o=arguments[i];
var typ=typeof (o);
if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
return false;
}
}
return true;
},isDateLike:function(){
for(var i=0;i<arguments.length;i++){
var o=arguments[i];
if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
return false;
}
}
return true;
},xmap:function(fn){
if(fn===null){
return MochiKit.Base.extend(null,arguments,1);
}
var _87=[];
for(var i=1;i<arguments.length;i++){
_87.push(fn(arguments[i]));
}
return _87;
},map:function(fn,lst){
var m=MochiKit.Base;
var itr=MochiKit.Iter;
var _8d=m.isArrayLike;
if(arguments.length<=2){
if(!_8d(lst)){
if(itr){
lst=itr.list(lst);
if(fn===null){
return lst;
}
}else{
throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
}
}
if(fn===null){
return m.extend(null,lst);
}
var _8e=[];
for(var i=0;i<lst.length;i++){
_8e.push(fn(lst[i]));
}
return _8e;
}else{
if(fn===null){
fn=Array;
}
var _90=null;
for(i=1;i<arguments.length;i++){
if(!_8d(arguments[i])){
if(itr){
return itr.list(itr.imap.apply(null,arguments));
}else{
throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
}
}
var l=arguments[i].length;
if(_90===null||_90>l){
_90=l;
}
}
_8e=[];
for(i=0;i<_90;i++){
var _92=[];
for(var j=1;j<arguments.length;j++){
_92.push(arguments[j][i]);
}
_8e.push(fn.apply(this,_92));
}
return _8e;
}
},xfilter:function(fn){
var _95=[];
if(fn===null){
fn=MochiKit.Base.operator.truth;
}
for(var i=1;i<arguments.length;i++){
var o=arguments[i];
if(fn(o)){
_95.push(o);
}
}
return _95;
},filter:function(fn,lst,_9a){
var _9b=[];
var m=MochiKit.Base;
if(!m.isArrayLike(lst)){
if(MochiKit.Iter){
lst=MochiKit.Iter.list(lst);
}else{
throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
}
}
if(fn===null){
fn=m.operator.truth;
}
if(typeof (Array.prototype.filter)=="function"){
return Array.prototype.filter.call(lst,fn,_9a);
}else{
if(typeof (_9a)=="undefined"||_9a===null){
for(var i=0;i<lst.length;i++){
var o=lst[i];
if(fn(o)){
_9b.push(o);
}
}
}else{
for(i=0;i<lst.length;i++){
o=lst[i];
if(fn.call(_9a,o)){
_9b.push(o);
}
}
}
}
return _9b;
},_wrapDumbFunction:function(_9f){
return function(){
switch(arguments.length){
case 0:
return _9f();
case 1:
return _9f(arguments[0]);
case 2:
return _9f(arguments[0],arguments[1]);
case 3:
return _9f(arguments[0],arguments[1],arguments[2]);
}
var _a0=[];
for(var i=0;i<arguments.length;i++){
_a0.push("arguments["+i+"]");
}
return eval("(func("+_a0.join(",")+"))");
};
},methodcaller:function(_a2){
var _a3=MochiKit.Base.extend(null,arguments,1);
if(typeof (_a2)=="function"){
return function(obj){
return _a2.apply(obj,_a3);
};
}else{
return function(obj){
return obj[_a2].apply(obj,_a3);
};
}
},method:function(_a6,_a7){
var m=MochiKit.Base;
return m.bind.apply(this,m.extend([_a7,_a6],arguments,2));
},compose:function(f1,f2){
var _ab=[];
var m=MochiKit.Base;
if(arguments.length===0){
throw new TypeError("compose() requires at least one argument");
}
for(var i=0;i<arguments.length;i++){
var fn=arguments[i];
if(typeof (fn)!="function"){
throw new TypeError(m.repr(fn)+" is not a function");
}
_ab.push(fn);
}
return function(){
var _af=arguments;
for(var i=_ab.length-1;i>=0;i--){
_af=[_ab[i].apply(this,_af)];
}
return _af[0];
};
},bind:function(_b1,_b2){
if(typeof (_b1)=="string"){
_b1=_b2[_b1];
}
var _b3=_b1.im_func;
var _b4=_b1.im_preargs;
var _b5=_b1.im_self;
var m=MochiKit.Base;
if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){
_b1=m._wrapDumbFunction(_b1);
}
if(typeof (_b3)!="function"){
_b3=_b1;
}
if(typeof (_b2)!="undefined"){
_b5=_b2;
}
if(typeof (_b4)=="undefined"){
_b4=[];
}else{
_b4=_b4.slice();
}
m.extend(_b4,arguments,2);
var _b7=function(){
var _b8=arguments;
var me=arguments.callee;
if(me.im_preargs.length>0){
_b8=m.concat(me.im_preargs,_b8);
}
var _ba=me.im_self;
if(!_ba){
_ba=this;
}
return me.im_func.apply(_ba,_b8);
};
_b7.im_self=_b5;
_b7.im_func=_b3;
_b7.im_preargs=_b4;
return _b7;
},bindMethods:function(_bb){
var _bc=MochiKit.Base.bind;
for(var k in _bb){
var _be=_bb[k];
if(typeof (_be)=="function"){
_bb[k]=_bc(_be,_bb);
}
}
},registerComparator:function(_bf,_c0,_c1,_c2){
MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2);
},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
if(a==b){
return 0;
}
var _c5=(typeof (a)=="undefined"||a===null);
var _c6=(typeof (b)=="undefined"||b===null);
if(_c5&&_c6){
return 0;
}else{
if(_c5){
return -1;
}else{
if(_c6){
return 1;
}
}
}
var m=MochiKit.Base;
var _c8=m._primitives;
if(!(typeof (a) in _c8&&typeof (b) in _c8)){
try{
return m.comparatorRegistry.match(a,b);
}
catch(e){
if(e!=m.NotFound){
throw e;
}
}
}
if(a<b){
return -1;
}else{
if(a>b){
return 1;
}
}
var _c9=m.repr;
throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared");
},compareDateLike:function(a,b){
return MochiKit.Base.compare(a.getTime(),b.getTime());
},compareArrayLike:function(a,b){
var _ce=MochiKit.Base.compare;
var _cf=a.length;
var _d0=0;
if(_cf>b.length){
_d0=1;
_cf=b.length;
}else{
if(_cf<b.length){
_d0=-1;
}
}
for(var i=0;i<_cf;i++){
var cmp=_ce(a[i],b[i]);
if(cmp){
return cmp;
}
}
return _d0;
},registerRepr:function(_d3,_d4,_d5,_d6){
MochiKit.Base.reprRegistry.register(_d3,_d4,_d5,_d6);
},repr:function(o){
if(typeof (o)=="undefined"){
return "undefined";
}else{
if(o===null){
return "null";
}
}
try{
if(typeof (o.__repr__)=="function"){
return o.__repr__();
}else{
if(typeof (o.repr)=="function"&&o.repr!=arguments.callee){
return o.repr();
}
}
return MochiKit.Base.reprRegistry.match(o);
}
catch(e){
if(typeof (o.NAME)=="string"&&(o.toString==Function.prototype.toString||o.toString==Object.prototype.toString)){
return o.NAME;
}
}
try{
var _d8=(o+"");
}
catch(e){
return "["+typeof (o)+"]";
}
if(typeof (o)=="function"){
o=_d8.replace(/^\s+/,"");
var idx=o.indexOf("{");
if(idx!=-1){
o=o.substr(0,idx)+"{...}";
}
}
return _d8;
},reprArrayLike:function(o){
var m=MochiKit.Base;
return "["+m.map(m.repr,o).join(", ")+"]";
},reprString:function(o){
return ("\""+o.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");
},reprNumber:function(o){
return o+"";
},registerJSON:function(_de,_df,_e0,_e1){
MochiKit.Base.jsonRegistry.register(_de,_df,_e0,_e1);
},evalJSON:function(){
return eval("("+MochiKit.Base._filterJSON(arguments[0])+")");
},_filterJSON:function(s){
var m=s.match(/^\s*\/\*(.*)\*\/\s*$/);
if(m){
return m[1];
}
return s;
},serializeJSON:function(o){
var _e5=typeof (o);
if(_e5=="number"||_e5=="boolean"){
return o+"";
}else{
if(o===null){
return "null";
}
}
var m=MochiKit.Base;
var _e7=m.reprString;
if(_e5=="string"){
return _e7(o);
}
var me=arguments.callee;
var _e9;
if(typeof (o.__json__)=="function"){
_e9=o.__json__();
if(o!==_e9){
return me(_e9);
}
}
if(typeof (o.json)=="function"){
_e9=o.json();
if(o!==_e9){
return me(_e9);
}
}
if(_e5!="function"&&typeof (o.length)=="number"){
var res=[];
for(var i=0;i<o.length;i++){
var val=me(o[i]);
if(typeof (val)!="string"){
val="undefined";
}
res.push(val);
}
return "["+res.join(", ")+"]";
}
try{
_e9=m.jsonRegistry.match(o);
if(o!==_e9){
return me(_e9);
}
}
catch(e){
if(e!=m.NotFound){
throw e;
}
}
if(_e5=="undefined"){
throw new TypeError("undefined can not be serialized as JSON");
}
if(_e5=="function"){
return null;
}
res=[];
for(var k in o){
var _ee;
if(typeof (k)=="number"){
_ee="\""+k+"\"";
}else{
if(typeof (k)=="string"){
_ee=_e7(k);
}else{
continue;
}
}
val=me(o[k]);
if(typeof (val)!="string"){
continue;
}
res.push(_ee+":"+val);
}
return "{"+res.join(", ")+"}";
},objEqual:function(a,b){
return (MochiKit.Base.compare(a,b)===0);
},arrayEqual:function(_f1,arr){
if(_f1.length!=arr.length){
return false;
}
return (MochiKit.Base.compare(_f1,arr)===0);
},concat:function(){
var _f3=[];
var _f4=MochiKit.Base.extend;
for(var i=0;i<arguments.length;i++){
_f4(_f3,arguments[i]);
}
return _f3;
},keyComparator:function(key){
var m=MochiKit.Base;
var _f8=m.compare;
if(arguments.length==1){
return function(a,b){
return _f8(a[key],b[key]);
};
}
var _fb=m.extend(null,arguments);
return function(a,b){
var _fe=0;
for(var i=0;(_fe===0)&&(i<_fb.length);i++){
var key=_fb[i];
_fe=_f8(a[key],b[key]);
}
return _fe;
};
},reverseKeyComparator:function(key){
var _102=MochiKit.Base.keyComparator.apply(this,arguments);
return function(a,b){
return _102(b,a);
};
},partial:function(func){
var m=MochiKit.Base;
return m.bind.apply(this,m.extend([func,undefined],arguments,1));
},listMinMax:function(_107,lst){
if(lst.length===0){
return null;
}
var cur=lst[0];
var _10a=MochiKit.Base.compare;
for(var i=1;i<lst.length;i++){
var o=lst[i];
if(_10a(o,cur)==_107){
cur=o;
}
}
return cur;
},objMax:function(){
return MochiKit.Base.listMinMax(1,arguments);
},objMin:function(){
return MochiKit.Base.listMinMax(-1,arguments);
},findIdentical:function(lst,_10e,_10f,end){
if(typeof (end)=="undefined"||end===null){
end=lst.length;
}
if(typeof (_10f)=="undefined"||_10f===null){
_10f=0;
}
for(var i=_10f;i<end;i++){
if(lst[i]===_10e){
return i;
}
}
return -1;
},mean:function(){
var sum=0;
var m=MochiKit.Base;
var args=m.extend(null,arguments);
var _115=args.length;
while(args.length){
var o=args.shift();
if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
_115+=o.length-1;
for(var i=o.length-1;i>=0;i--){
sum+=o[i];
}
}else{
sum+=o;
}
}
if(_115<=0){
throw new TypeError("mean() requires at least one argument");
}
return sum/_115;
},median:function(){
var data=MochiKit.Base.flattenArguments(arguments);
if(data.length===0){
throw new TypeError("median() requires at least one argument");
}
data.sort(compare);
if(data.length%2==0){
var _119=data.length/2;
return (data[_119]+data[_119-1])/2;
}else{
return data[(data.length-1)/2];
}
},findValue:function(lst,_11b,_11c,end){
if(typeof (end)=="undefined"||end===null){
end=lst.length;
}
if(typeof (_11c)=="undefined"||_11c===null){
_11c=0;
}
var cmp=MochiKit.Base.compare;
for(var i=_11c;i<end;i++){
if(cmp(lst[i],_11b)===0){
return i;
}
}
return -1;
},nodeWalk:function(node,_121){
var _122=[node];
var _123=MochiKit.Base.extend;
while(_122.length){
var res=_121(_122.shift());
if(res){
_123(_122,res);
}
}
},nameFunctions:function(_125){
var base=_125.NAME;
if(typeof (base)=="undefined"){
base="";
}else{
base=base+".";
}
for(var name in _125){
var o=_125[name];
if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
try{
o.NAME=base+name;
}
catch(e){
}
}
}
},queryString:function(_129,_12a){
if(typeof (MochiKit.DOM)!="undefined"&&arguments.length==1&&(typeof (_129)=="string"||(typeof (_129.nodeType)!="undefined"&&_129.nodeType>0))){
var kv=MochiKit.DOM.formContents(_129);
_129=kv[0];
_12a=kv[1];
}else{
if(arguments.length==1){
if(typeof (_129.length)=="number"&&_129.length==2){
return arguments.callee(_129[0],_129[1]);
}
var o=_129;
_129=[];
_12a=[];
for(var k in o){
var v=o[k];
if(typeof (v)=="function"){
continue;
}else{
if(typeof (v)!="string"&&typeof (v.length)=="number"){
for(var i=0;i<v.length;i++){
_129.push(k);
_12a.push(v[i]);
}
}else{
_129.push(k);
_12a.push(v);
}
}
}
}
}
var rval=[];
var len=Math.min(_129.length,_12a.length);
var _132=MochiKit.Base.urlEncode;
for(var i=0;i<len;i++){
v=_12a[i];
if(typeof (v)!="undefined"&&v!==null){
rval.push(_132(_129[i])+"="+_132(v));
}
}
return rval.join("&");
},parseQueryString:function(_133,_134){
var qstr=(_133.charAt(0)=="?")?_133.substring(1):_133;
var _136=qstr.replace(/\+/g,"%20").split(/(\&amp\;|\&\#38\;|\&#x26;|\&)/);
var o={};
var _138;
if(typeof (decodeURIComponent)!="undefined"){
_138=decodeURIComponent;
}else{
_138=unescape;
}
if(_134){
for(var i=0;i<_136.length;i++){
var pair=_136[i].split("=");
var name=_138(pair.shift());
if(!name){
continue;
}
var arr=o[name];
if(!(arr instanceof Array)){
arr=[];
o[name]=arr;
}
arr.push(_138(pair.join("=")));
}
}else{
for(i=0;i<_136.length;i++){
pair=_136[i].split("=");
var name=pair.shift();
if(!name){
continue;
}
o[_138(name)]=_138(pair.join("="));
}
}
return o;
}});
MochiKit.Base.AdapterRegistry=function(){
this.pairs=[];
};
MochiKit.Base.AdapterRegistry.prototype={register:function(name,_13e,wrap,_140){
if(_140){
this.pairs.unshift([name,_13e,wrap]);
}else{
this.pairs.push([name,_13e,wrap]);
}
},match:function(){
for(var i=0;i<this.pairs.length;i++){
var pair=this.pairs[i];
if(pair[1].apply(this,arguments)){
return pair[2].apply(this,arguments);
}
}
throw MochiKit.Base.NotFound;
},unregister:function(name){
for(var i=0;i<this.pairs.length;i++){
var pair=this.pairs[i];
if(pair[0]==name){
this.pairs.splice(i,1);
return true;
}
}
return false;
}};
MochiKit.Base.EXPORT=["flattenArray","noop","camelize","counter","clone","extend","update","updatetree","setdefault","keys","values","items","NamedError","operator","forwardCall","itemgetter","typeMatcher","isCallable","isUndefined","isUndefinedOrNull","isNull","isEmpty","isNotEmpty","isArrayLike","isDateLike","xmap","map","xfilter","filter","methodcaller","compose","bind","bindMethods","NotFound","AdapterRegistry","registerComparator","compare","registerRepr","repr","objEqual","arrayEqual","concat","keyComparator","reverseKeyComparator","partial","merge","listMinMax","listMax","listMin","objMax","objMin","nodeWalk","zip","urlEncode","queryString","serializeJSON","registerJSON","evalJSON","parseQueryString","findValue","findIdentical","flattenArguments","method","average","mean","median"];
MochiKit.Base.EXPORT_OK=["nameFunctions","comparatorRegistry","reprRegistry","jsonRegistry","compareDateLike","compareArrayLike","reprArrayLike","reprString","reprNumber"];
MochiKit.Base._exportSymbols=function(_146,_147){
if(!MochiKit.__export__){
return;
}
var all=_147.EXPORT_TAGS[":all"];
for(var i=0;i<all.length;i++){
_146[all[i]]=_147[all[i]];
}
};
MochiKit.Base.__new__=function(){
var m=this;
m.noop=m.operator.identity;
m.forward=m.forwardCall;
m.find=m.findValue;
if(typeof (encodeURIComponent)!="undefined"){
m.urlEncode=function(_14b){
return encodeURIComponent(_14b).replace(/\'/g,"%27");
};
}else{
m.urlEncode=function(_14c){
return escape(_14c).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
};
}
m.NamedError=function(name){
this.message=name;
this.name=name;
};
m.NamedError.prototype=new Error();
m.update(m.NamedError.prototype,{repr:function(){
if(this.message&&this.message!=this.name){
return this.name+"("+m.repr(this.message)+")";
}else{
return this.name+"()";
}
},toString:m.forwardCall("repr")});
m.NotFound=new m.NamedError("MochiKit.Base.NotFound");
m.listMax=m.partial(m.listMinMax,1);
m.listMin=m.partial(m.listMinMax,-1);
m.isCallable=m.typeMatcher("function");
m.isUndefined=m.typeMatcher("undefined");
m.merge=m.partial(m.update,null);
m.zip=m.partial(m.map,null);
m.average=m.mean;
m.comparatorRegistry=new m.AdapterRegistry();
m.registerComparator("dateLike",m.isDateLike,m.compareDateLike);
m.registerComparator("arrayLike",m.isArrayLike,m.compareArrayLike);
m.reprRegistry=new m.AdapterRegistry();
m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
m.registerRepr("string",m.typeMatcher("string"),m.reprString);
m.registerRepr("numbers",m.typeMatcher("number","boolean"),m.reprNumber);
m.jsonRegistry=new m.AdapterRegistry();
var all=m.concat(m.EXPORT,m.EXPORT_OK);
m.EXPORT_TAGS={":common":m.concat(m.EXPORT_OK),":all":all};
m.nameFunctions(this);
};
MochiKit.Base.__new__();
if(MochiKit.__export__){
compare=MochiKit.Base.compare;
compose=MochiKit.Base.compose;
serializeJSON=MochiKit.Base.serializeJSON;
}
MochiKit.Base._exportSymbols(this,MochiKit.Base);
if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.DOM");
dojo.require("MochiKit.Base");
}
if(typeof (JSAN)!="undefined"){
JSAN.use("MochiKit.Base",[]);
}
try{
if(typeof (MochiKit.Base)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.DOM depends on MochiKit.Base!";
}
if(typeof (MochiKit.DOM)=="undefined"){
MochiKit.DOM={};
}
MochiKit.DOM.NAME="MochiKit.DOM";
MochiKit.DOM.VERSION="1.4";
MochiKit.DOM.__repr__=function(){
return "["+this.NAME+" "+this.VERSION+"]";
};
MochiKit.DOM.toString=function(){
return this.__repr__();
};
MochiKit.DOM.EXPORT=["removeEmptyTextNodes","formContents","currentWindow","currentDocument","withWindow","withDocument","registerDOMConverter","coerceToDOM","createDOM","createDOMFunc","isChildNode","getNodeAttribute","removeNodeAttribute","setNodeAttribute","updateNodeAttributes","appendChildNodes","insertSiblingNodesAfter","insertSiblingNodesBefore","replaceChildNodes","removeElement","swapDOM","BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG","getElement","$","getElementsByTagAndClassName","addToCallStack","addLoadEvent","focusOnLoad","setElementClass","toggleElementClass","addElementClass","removeElementClass","swapElementClass","hasElementClass","escapeHTML","toHTML","emitHTML","scrapeText","isParent","getFirstParentByTagAndClassName","makeClipping","undoClipping","makePositioned","undoPositioned","getFirstElementByTagAndClassName"];
MochiKit.DOM.EXPORT_OK=["domConverters"];
MochiKit.DOM.DEPRECATED=[["computedStyle","MochiKit.Style.getStyle","1.4"],["elementDimensions","MochiKit.Style.getElementDimensions","1.4"],["elementPosition","MochiKit.Style.getElementPosition","1.4"],["hideElement","MochiKit.Style.hideElement","1.4"],["setElementDimensions","MochiKit.Style.setElementDimensions","1.4"],["setElementPosition","MochiKit.Style.setElementPosition","1.4"],["setDisplayForElement","MochiKit.Style.setDisplayForElement","1.4"],["setOpacity","MochiKit.Style.setOpacity","1.4"],["showElement","MochiKit.Style.showElement","1.4"],["Coordinates","MochiKit.Style.Coordinates","1.4"],["Dimensions","MochiKit.Style.Dimensions","1.4"]];
MochiKit.DOM.getViewportDimensions=new Function(""+"if (!MochiKit[\"Style\"]) {"+"    throw new Error(\"This function has been deprecated and depends on MochiKit.Style.\");"+"}"+"return MochiKit.Style.getViewportDimensions.apply(this, arguments);");
MochiKit.Base.update(MochiKit.DOM,{currentWindow:function(){
return MochiKit.DOM._window;
},currentDocument:function(){
return MochiKit.DOM._document;
},withWindow:function(win,func){
var self=MochiKit.DOM;
var _152=self._document;
var _153=self._window;
var rval;
try{
self._window=win;
self._document=win.document;
rval=func();
}
catch(e){
self._window=_153;
self._document=_152;
throw e;
}
self._window=_153;
self._document=_152;
return rval;
},formContents:function(elem){
var _156=[];
var _157=[];
var m=MochiKit.Base;
var self=MochiKit.DOM;
if(typeof (elem)=="undefined"||elem===null){
elem=self._document.body;
}else{
elem=self.getElement(elem);
}
m.nodeWalk(elem,function(elem){
var name=elem.name;
if(m.isNotEmpty(name)){
var _15c=elem.tagName.toUpperCase();
if(_15c==="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
return null;
}
if(_15c==="SELECT"){
if(elem.type=="select-one"){
if(elem.selectedIndex>=0){
var opt=elem.options[elem.selectedIndex];
var v=opt.value;
if(!v){
var h=opt.outerHTML;
if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
v=opt.text;
}
}
_156.push(name);
_157.push(v);
return null;
}
_156.push(name);
_157.push("");
return null;
}else{
var opts=elem.options;
if(!opts.length){
_156.push(name);
_157.push("");
return null;
}
for(var i=0;i<opts.length;i++){
var opt=opts[i];
if(!opt.selected){
continue;
}
var v=opt.value;
if(!v){
var h=opt.outerHTML;
if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
v=opt.text;
}
}
_156.push(name);
_157.push(v);
}
return null;
}
}
if(_15c==="FORM"||_15c==="P"||_15c==="SPAN"||_15c==="DIV"){
return elem.childNodes;
}
_156.push(name);
_157.push(elem.value||"");
return null;
}
return elem.childNodes;
});
return [_156,_157];
},withDocument:function(doc,func){
var self=MochiKit.DOM;
var _165=self._document;
var rval;
try{
self._document=doc;
rval=func();
}
catch(e){
self._document=_165;
throw e;
}
self._document=_165;
return rval;
},registerDOMConverter:function(name,_168,wrap,_16a){
MochiKit.DOM.domConverters.register(name,_168,wrap,_16a);
},coerceToDOM:function(node,ctx){
var m=MochiKit.Base;
var im=MochiKit.Iter;
var self=MochiKit.DOM;
if(im){
var iter=im.iter;
var _171=im.repeat;
var map=m.map;
}
var _173=self.domConverters;
var _174=arguments.callee;
var _175=m.NotFound;
while(true){
if(typeof (node)=="undefined"||node===null){
return null;
}
if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
node=im.list(node);
}
if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
return node;
}
if(typeof (node)=="number"||typeof (node)=="boolean"){
node=node.toString();
}
if(typeof (node)=="string"){
return self._document.createTextNode(node);
}
if(typeof (node.__dom__)=="function"){
node=node.__dom__(ctx);
continue;
}
if(typeof (node.dom)=="function"){
node=node.dom(ctx);
continue;
}
if(typeof (node)=="function"){
node=node.apply(ctx,[ctx]);
continue;
}
if(im){
var _176=null;
try{
_176=iter(node);
}
catch(e){
}
if(_176){
return map(_174,_176,_171(ctx));
}
}
try{
node=_173.match(node,ctx);
continue;
}
catch(e){
if(e!=_175){
throw e;
}
}
return self._document.createTextNode(node.toString());
}
return undefined;
},isChildNode:function(node,_178){
var self=MochiKit.DOM;
if(typeof (node)=="string"){
node=self.getElement(node);
}
if(typeof (_178)=="string"){
_178=self.getElement(_178);
}
if(node===_178){
return true;
}
while(node&&node.tagName.toUpperCase()!="BODY"){
node=node.parentNode;
if(node===_178){
return true;
}
}
return false;
},setNodeAttribute:function(node,attr,_17c){
var o={};
o[attr]=_17c;
try{
return MochiKit.DOM.updateNodeAttributes(node,o);
}
catch(e){
}
return null;
},getNodeAttribute:function(node,attr){
var self=MochiKit.DOM;
var _181=self.attributeArray.renames[attr];
node=self.getElement(node);
try{
if(_181){
return node[_181];
}
return node.getAttribute(attr);
}
catch(e){
}
return null;
},removeNodeAttribute:function(node,attr){
var self=MochiKit.DOM;
var _185=self.attributeArray.renames[attr];
node=self.getElement(node);
try{
if(_185){
return node[_185];
}
return node.removeAttribute(attr);
}
catch(e){
}
return null;
},updateNodeAttributes:function(node,_187){
var elem=node;
var self=MochiKit.DOM;
if(typeof (node)=="string"){
elem=self.getElement(node);
}
if(_187){
var _18a=MochiKit.Base.updatetree;
if(self.attributeArray.compliant){
for(var k in _187){
var v=_187[k];
if(typeof (v)=="object"&&typeof (elem[k])=="object"){
if(k=="style"&&MochiKit.Style){
MochiKit.Style.setStyle(elem,v);
}else{
_18a(elem[k],v);
}
}else{
if(k.substring(0,2)=="on"){
if(typeof (v)=="string"){
v=new Function(v);
}
elem[k]=v;
}else{
elem.setAttribute(k,v);
}
}
}
}else{
var _18d=self.attributeArray.renames;
for(var k in _187){
v=_187[k];
var _18e=_18d[k];
if(k=="style"&&typeof (v)=="string"){
elem.style.cssText=v;
}else{
if(typeof (_18e)=="string"){
elem[_18e]=v;
}else{
if(typeof (elem[k])=="object"&&typeof (v)=="object"){
if(k=="style"&&MochiKit.Style){
MochiKit.Style.setStyle(elem,v);
}else{
_18a(elem[k],v);
}
}else{
if(k.substring(0,2)=="on"){
if(typeof (v)=="string"){
v=new Function(v);
}
elem[k]=v;
}else{
elem.setAttribute(k,v);
}
}
}
}
}
}
}
return elem;
},appendChildNodes:function(node){
var elem=node;
var self=MochiKit.DOM;
if(typeof (node)=="string"){
elem=self.getElement(node);
}
var _192=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
var _193=MochiKit.Base.concat;
while(_192.length){
var n=_192.shift();
if(typeof (n)=="undefined"||n===null){
}else{
if(typeof (n.nodeType)=="number"){
elem.appendChild(n);
}else{
_192=_193(n,_192);
}
}
}
return elem;
},insertSiblingNodesBefore:function(node){
var elem=node;
var self=MochiKit.DOM;
if(typeof (node)=="string"){
elem=self.getElement(node);
}
var _198=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
var _199=elem.parentNode;
var _19a=MochiKit.Base.concat;
while(_198.length){
var n=_198.shift();
if(typeof (n)=="undefined"||n===null){
}else{
if(typeof (n.nodeType)=="number"){
_199.insertBefore(n,elem);
}else{
_198=_19a(n,_198);
}
}
}
return _199;
},insertSiblingNodesAfter:function(node){
var elem=node;
var self=MochiKit.DOM;
if(typeof (node)=="string"){
elem=self.getElement(node);
}
var _19f=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
if(elem.nextSibling){
return self.insertSiblingNodesBefore(elem.nextSibling,_19f);
}else{
return self.appendChildNodes(elem.parentNode,_19f);
}
},replaceChildNodes:function(node){
var elem=node;
var self=MochiKit.DOM;
if(typeof (node)=="string"){
elem=self.getElement(node);
arguments[0]=elem;
}
var _1a3;
while((_1a3=elem.firstChild)){
elem.removeChild(_1a3);
}
if(arguments.length<2){
return elem;
}else{
return self.appendChildNodes.apply(this,arguments);
}
},createDOM:function(name,_1a5){
var elem;
var self=MochiKit.DOM;
var m=MochiKit.Base;
if(typeof (_1a5)=="string"||typeof (_1a5)=="number"){
var args=m.extend([name,null],arguments,1);
return arguments.callee.apply(this,args);
}
if(typeof (name)=="string"){
var _1aa=self._xhtml;
if(_1a5&&!self.attributeArray.compliant){
var _1ab="";
if("name" in _1a5){
_1ab+=" name=\""+self.escapeHTML(_1a5.name)+"\"";
}
if(name=="input"&&"type" in _1a5){
_1ab+=" type=\""+self.escapeHTML(_1a5.type)+"\"";
}
if(_1ab){
name="<"+name+_1ab+">";
_1aa=false;
}
}
var d=self._document;
if(_1aa&&d===document){
elem=d.createElementNS("http://www.w3.org/1999/xhtml",name);
}else{
elem=d.createElement(name);
}
}else{
elem=name;
}
if(_1a5){
self.updateNodeAttributes(elem,_1a5);
}
if(arguments.length<=2){
return elem;
}else{
var args=m.extend([elem],arguments,2);
return self.appendChildNodes.apply(this,args);
}
},createDOMFunc:function(){
var m=MochiKit.Base;
return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments));
},removeElement:function(elem){
var e=MochiKit.DOM.getElement(elem);
e.parentNode.removeChild(e);
return e;
},swapDOM:function(dest,src){
var self=MochiKit.DOM;
dest=self.getElement(dest);
var _1b3=dest.parentNode;
if(src){
src=self.getElement(src);
_1b3.replaceChild(src,dest);
}else{
_1b3.removeChild(dest);
}
return src;
},getElement:function(id){
var self=MochiKit.DOM;
if(arguments.length==1){
return ((typeof (id)=="string")?self._document.getElementById(id):id);
}else{
return MochiKit.Base.map(self.getElement,arguments);
}
},getElementsByTagAndClassName:function(_1b6,_1b7,_1b8){
var self=MochiKit.DOM;
if(typeof (_1b6)=="undefined"||_1b6===null){
_1b6="*";
}
if(typeof (_1b8)=="undefined"||_1b8===null){
_1b8=self._document;
}
_1b8=self.getElement(_1b8);
var _1ba=(_1b8.getElementsByTagName(_1b6)||self._document.all);
if(typeof (_1b7)=="undefined"||_1b7===null){
return MochiKit.Base.extend(null,_1ba);
}
var _1bb=[];
for(var i=0;i<_1ba.length;i++){
var _1bd=_1ba[i];
var cls=_1bd.className;
if(!cls){
continue;
}
var _1bf=cls.split(" ");
for(var j=0;j<_1bf.length;j++){
if(_1bf[j]==_1b7){
_1bb.push(_1bd);
break;
}
}
}
return _1bb;
},_newCallStack:function(path,once){
var rval=function(){
var _1c4=arguments.callee.callStack;
for(var i=0;i<_1c4.length;i++){
if(_1c4[i].apply(this,arguments)===false){
break;
}
}
if(once){
try{
this[path]=null;
}
catch(e){
}
}
};
rval.callStack=[];
return rval;
},addToCallStack:function(_1c6,path,func,once){
var self=MochiKit.DOM;
var _1cb=_1c6[path];
var _1cc=_1cb;
if(!(typeof (_1cb)=="function"&&typeof (_1cb.callStack)=="object"&&_1cb.callStack!==null)){
_1cc=self._newCallStack(path,once);
if(typeof (_1cb)=="function"){
_1cc.callStack.push(_1cb);
}
_1c6[path]=_1cc;
}
_1cc.callStack.push(func);
},addLoadEvent:function(func){
var self=MochiKit.DOM;
self.addToCallStack(self._window,"onload",func,true);
},focusOnLoad:function(_1cf){
var self=MochiKit.DOM;
self.addLoadEvent(function(){
_1cf=self.getElement(_1cf);
if(_1cf){
_1cf.focus();
}
});
},setElementClass:function(_1d1,_1d2){
var self=MochiKit.DOM;
var obj=self.getElement(_1d1);
if(self.attributeArray.compliant){
obj.setAttribute("class",_1d2);
}else{
obj.setAttribute("className",_1d2);
}
},toggleElementClass:function(_1d5){
var self=MochiKit.DOM;
for(var i=1;i<arguments.length;i++){
var obj=self.getElement(arguments[i]);
if(!self.addElementClass(obj,_1d5)){
self.removeElementClass(obj,_1d5);
}
}
},addElementClass:function(_1d9,_1da){
var self=MochiKit.DOM;
var obj=self.getElement(_1d9);
var cls=obj.className;
if(cls==undefined||cls.length===0){
self.setElementClass(obj,_1da);
return true;
}
if(cls==_1da){
return false;
}
var _1de=cls.split(" ");
for(var i=0;i<_1de.length;i++){
if(_1de[i]==_1da){
return false;
}
}
self.setElementClass(obj,cls+" "+_1da);
return true;
},removeElementClass:function(_1e0,_1e1){
var self=MochiKit.DOM;
var obj=self.getElement(_1e0);
var cls=obj.className;
if(cls==undefined||cls.length===0){
return false;
}
if(cls==_1e1){
self.setElementClass(obj,"");
return true;
}
var _1e5=cls.split(" ");
for(var i=0;i<_1e5.length;i++){
if(_1e5[i]==_1e1){
_1e5.splice(i,1);
self.setElementClass(obj,_1e5.join(" "));
return true;
}
}
return false;
},swapElementClass:function(_1e7,_1e8,_1e9){
var obj=MochiKit.DOM.getElement(_1e7);
var res=MochiKit.DOM.removeElementClass(obj,_1e8);
if(res){
MochiKit.DOM.addElementClass(obj,_1e9);
}
return res;
},hasElementClass:function(_1ec,_1ed){
var obj=MochiKit.DOM.getElement(_1ec);
var cls=obj.className;
if(!cls){
return false;
}
var _1f0=cls.split(" ");
for(var i=1;i<arguments.length;i++){
var good=false;
for(var j=0;j<_1f0.length;j++){
if(_1f0[j]==arguments[i]){
good=true;
break;
}
}
if(!good){
return false;
}
}
return true;
},escapeHTML:function(s){
return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
},toHTML:function(dom){
return MochiKit.DOM.emitHTML(dom).join("");
},emitHTML:function(dom,lst){
if(typeof (lst)=="undefined"||lst===null){
lst=[];
}
var _1f8=[dom];
var self=MochiKit.DOM;
var _1fa=self.escapeHTML;
var _1fb=self.attributeArray;
while(_1f8.length){
dom=_1f8.pop();
if(typeof (dom)=="string"){
lst.push(dom);
}else{
if(dom.nodeType==1){
lst.push("<"+dom.tagName.toLowerCase());
var _1fc=[];
var _1fd=_1fb(dom);
for(var i=0;i<_1fd.length;i++){
var a=_1fd[i];
_1fc.push([" ",a.name,"=\"",_1fa(a.value),"\""]);
}
_1fc.sort();
for(i=0;i<_1fc.length;i++){
var _200=_1fc[i];
for(var j=0;j<_200.length;j++){
lst.push(_200[j]);
}
}
if(dom.hasChildNodes()){
lst.push(">");
_1f8.push("</"+dom.tagName.toLowerCase()+">");
var _202=dom.childNodes;
for(i=_202.length-1;i>=0;i--){
_1f8.push(_202[i]);
}
}else{
lst.push("/>");
}
}else{
if(dom.nodeType==3){
lst.push(_1fa(dom.nodeValue));
}
}
}
}
return lst;
},scrapeText:function(node,_204){
var rval=[];
(function(node){
var cn=node.childNodes;
if(cn){
for(var i=0;i<cn.length;i++){
arguments.callee.call(this,cn[i]);
}
}
var _209=node.nodeValue;
if(typeof (_209)=="string"){
rval.push(_209);
}
})(MochiKit.DOM.getElement(node));
if(_204){
return rval;
}else{
return rval.join("");
}
},removeEmptyTextNodes:function(_20a){
_20a=MochiKit.DOM.getElement(_20a);
for(var i=0;i<_20a.childNodes.length;i++){
var node=_20a.childNodes[i];
if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
node.parentNode.removeChild(node);
}
}
},makeClipping:function(_20d){
_20d=MochiKit.DOM.getElement(_20d);
var _20e=_20d.style.overflow;
if((MochiKit.Style.getStyle(_20d,"overflow")||"visible")!="hidden"){
_20d.style.overflow="hidden";
}
return _20e;
},undoClipping:function(_20f,_210){
_20f=MochiKit.DOM.getElement(_20f);
if(!_210){
return;
}
_20f.style.overflow=_210;
},makePositioned:function(_211){
_211=MochiKit.DOM.getElement(_211);
var pos=MochiKit.Style.getStyle(_211,"position");
if(pos=="static"||!pos){
_211.style.position="relative";
if(/Opera/.test(navigator.userAgent)){
_211.style.top=0;
_211.style.left=0;
}
}
},undoPositioned:function(_213){
_213=MochiKit.DOM.getElement(_213);
if(_213.style.position=="relative"){
_213.style.position=_213.style.top=_213.style.left=_213.style.bottom=_213.style.right="";
}
},getFirstElementByTagAndClassName:function(_214,_215,_216){
var self=MochiKit.DOM;
if(typeof (_214)=="undefined"||_214===null){
_214="*";
}
if(typeof (_216)=="undefined"||_216===null){
_216=self._document;
}
_216=self.getElement(_216);
var _218=(_216.getElementsByTagName(_214)||self._document.all);
if(typeof (_215)=="undefined"||_215===null){
return _218[0];
}
for(var i=0;i<_218.length;i++){
var _21a=_218[i];
var _21b=_21a.className.split(" ");
for(var j=0;j<_21b.length;j++){
if(_21b[j]==_215){
return _21a;
}
}
}
},getFirstParentByTagAndClassName:function(elem,_21e,_21f){
var self=MochiKit.DOM;
elem=self.getElement(elem);
if(typeof (_21e)=="undefined"||_21e===null){
_21e="*";
}else{
_21e=_21e.toUpperCase();
}
if(typeof (_21f)=="undefined"||_21f===null){
_21f=null;
}
var _221="";
var _222="";
while(elem&&elem.tagName){
elem=elem.parentNode;
if(_21e=="*"&&_21f===null){
return elem;
}
_221=elem.className.split(" ");
_222=elem.tagName.toUpperCase();
if(_21f===null&&_21e==_222){
return elem;
}else{
if(_21f!==null){
for(var i=0;i<_221.length;i++){
if(_21e=="*"&&_221[i]==_21f){
return elem;
}else{
if(_21e==_222&&_221[i]==_21f){
return elem;
}
}
}
}
}
}
return elem;
},isParent:function(_224,_225){
if(!_224.parentNode||_224==_225){
return false;
}
if(_224.parentNode==_225){
return true;
}
return MochiKit.DOM.isParent(_224.parentNode,_225);
},__new__:function(win){
var m=MochiKit.Base;
if(typeof (document)!="undefined"){
this._document=document;
var _228="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
this._xhtml=(document.documentElement&&document.createElementNS&&document.documentElement.namespaceURI===_228);
}else{
if(MochiKit.MockDOM){
this._document=MochiKit.MockDOM.document;
}
}
this._window=win;
this.domConverters=new m.AdapterRegistry();
var _229=this._document.createElement("span");
var _22a;
if(_229&&_229.attributes&&_229.attributes.length>0){
var _22b=m.filter;
_22a=function(node){
return _22b(_22a.ignoreAttrFilter,node.attributes);
};
_22a.ignoreAttr={};
var _22d=_229.attributes;
var _22e=_22a.ignoreAttr;
for(var i=0;i<_22d.length;i++){
var a=_22d[i];
_22e[a.name]=a.value;
}
_22a.ignoreAttrFilter=function(a){
return (_22a.ignoreAttr[a.name]!=a.value);
};
_22a.compliant=false;
_22a.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"};
}else{
_22a=function(node){
return node.attributes;
};
_22a.compliant=true;
_22a.renames={};
}
this.attributeArray=_22a;
var _233=function(_234,arr){
var _236=arr[1].split(".");
var str="";
var obj={};
str+="if (!MochiKit."+_236[1]+") { throw new Error(\"";
str+="This function has been deprecated and depends on MochiKit.";
str+=_236[1]+".\");}";
str+="return MochiKit."+_236[1]+"."+arr[0];
str+=".apply(this, arguments);";
obj[_236[2]]=new Function(str);
MochiKit.Base.update(MochiKit[_234],obj);
};
for(var i;i<MochiKit.DOM.DEPRECATED.length;i++){
_233("DOM",MochiKit.DOM.DEPRECATED[i]);
}
var _239=this.createDOMFunc;
this.UL=_239("ul");
this.OL=_239("ol");
this.LI=_239("li");
this.TD=_239("td");
this.TR=_239("tr");
this.TBODY=_239("tbody");
this.THEAD=_239("thead");
this.TFOOT=_239("tfoot");
this.TABLE=_239("table");
this.TH=_239("th");
this.INPUT=_239("input");
this.SPAN=_239("span");
this.A=_239("a");
this.DIV=_239("div");
this.IMG=_239("img");
this.BUTTON=_239("button");
this.TT=_239("tt");
this.PRE=_239("pre");
this.H1=_239("h1");
this.H2=_239("h2");
this.H3=_239("h3");
this.BR=_239("br");
this.HR=_239("hr");
this.LABEL=_239("label");
this.TEXTAREA=_239("textarea");
this.FORM=_239("form");
this.P=_239("p");
this.SELECT=_239("select");
this.OPTION=_239("option");
this.OPTGROUP=_239("optgroup");
this.LEGEND=_239("legend");
this.FIELDSET=_239("fieldset");
this.STRONG=_239("strong");
this.CANVAS=_239("canvas");
this.$=this.getElement;
this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
m.nameFunctions(this);
}});
MochiKit.DOM.__new__(((typeof (window)=="undefined")?this:window));
if(MochiKit.__export__){
withWindow=MochiKit.DOM.withWindow;
withDocument=MochiKit.DOM.withDocument;
}
MochiKit.Base._exportSymbols(this,MochiKit.DOM);
if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.Style");
dojo.require("MochiKit.Base");
dojo.require("MochiKit.DOM");
}
if(typeof (JSAN)!="undefined"){
JSAN.use("MochiKit.Base",[]);
JSAN.use("MochiKit.DOM",[]);
}
try{
if(typeof (MochiKit.Base)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Style depends on MochiKit.Base!";
}
try{
if(typeof (MochiKit.DOM)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Style depends on MochiKit.DOM!";
}
if(typeof (MochiKit.Style)=="undefined"){
MochiKit.Style={};
}
MochiKit.Style.NAME="MochiKit.Style";
MochiKit.Style.VERSION="1.4";
MochiKit.Style.__repr__=function(){
return "["+this.NAME+" "+this.VERSION+"]";
};
MochiKit.Style.toString=function(){
return this.__repr__();
};
MochiKit.Style.EXPORT_OK=[];
MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"];
MochiKit.Style.Dimensions=function(w,h){
this.w=w;
this.h=h;
};
MochiKit.Style.Dimensions.prototype.__repr__=function(){
var repr=MochiKit.Base.repr;
return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}";
};
MochiKit.Style.Dimensions.prototype.toString=function(){
return this.__repr__();
};
MochiKit.Style.Coordinates=function(x,y){
this.x=x;
this.y=y;
};
MochiKit.Style.Coordinates.prototype.__repr__=function(){
var repr=MochiKit.Base.repr;
return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}";
};
MochiKit.Style.Coordinates.prototype.toString=function(){
return this.__repr__();
};
MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_241){
var dom=MochiKit.DOM;
var d=dom._document;
elem=dom.getElement(elem);
_241=MochiKit.Base.camelize(_241);
if(!elem||elem==d){
return undefined;
}
if(_241=="opacity"&&elem.filters){
var _244=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/);
if(_244&&_244[1]){
return parseFloat(_244[1])/100;
}
return 1;
}
var _245=elem.style?elem.style[_241]:null;
if(!_245){
if(d.defaultView&&d.defaultView.getComputedStyle){
var css=d.defaultView.getComputedStyle(elem,null);
_241=_241.replace(/([A-Z])/g,"-$1").toLowerCase();
_245=css?css.getPropertyValue(_241):null;
}else{
if(elem.currentStyle){
_245=elem.currentStyle[_241];
}
}
}
if(_241=="opacity"){
_245=parseFloat(_245);
}
if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_241)!=-1)){
if(MochiKit.Style.getStyle(elem,"position")=="static"){
_245="auto";
}
}
return _245=="auto"?null:_245;
},setStyle:function(elem,_248){
elem=MochiKit.DOM.getElement(elem);
for(var name in _248){
if(name=="opacity"){
MochiKit.Style.setOpacity(elem,_248[name]);
}else{
elem.style[MochiKit.Base.camelize(name)]=_248[name];
}
}
},setOpacity:function(elem,o){
elem=MochiKit.DOM.getElement(elem);
var self=MochiKit.Style;
if(o==1){
var _24d=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
elem.style["opacity"]=_24d?0.999999:1;
if(/MSIE/.test(navigator.userAgent)){
elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"");
}
}else{
if(o<0.00001){
o=0;
}
elem.style["opacity"]=o;
if(/MSIE/.test(navigator.userAgent)){
elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")";
}
}
},getElementPosition:function(elem,_24f){
var self=MochiKit.Style;
var dom=MochiKit.DOM;
elem=dom.getElement(elem);
if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){
return undefined;
}
var c=new self.Coordinates(0,0);
var box=null;
var _254=null;
var d=MochiKit.DOM._document;
var de=d.documentElement;
var b=d.body;
if(!elem.parentNode&&elem.x&&elem.y){
c.x+=elem.x||0;
c.y+=elem.y||0;
}else{
if(elem.getBoundingClientRect){
box=elem.getBoundingClientRect();
c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
}else{
if(elem.offsetParent){
c.x+=elem.offsetLeft;
c.y+=elem.offsetTop;
_254=elem.offsetParent;
if(_254!=elem){
while(_254){
c.x+=_254.offsetLeft;
c.y+=_254.offsetTop;
_254=_254.offsetParent;
}
}
var ua=navigator.userAgent.toLowerCase();
if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){
c.x-=b.offsetLeft;
c.y-=b.offsetTop;
}
}
}
}
if(typeof (_24f)!="undefined"){
_24f=arguments.callee(_24f);
if(_24f){
c.x-=(_24f.x||0);
c.y-=(_24f.y||0);
}
}
if(elem.parentNode){
_254=elem.parentNode;
}else{
_254=null;
}
while(_254){
var _259=_254.tagName.toUpperCase();
if(_259==="BODY"||_259==="HTML"){
break;
}
var disp=self.getStyle(_254,"display");
if(disp!="inline"&&disp!="table-row"){
c.x-=_254.scrollLeft;
c.y-=_254.scrollTop;
}
if(_254.parentNode){
_254=_254.parentNode;
}else{
_254=null;
}
}
return c;
},setElementPosition:function(elem,_25c,_25d){
elem=MochiKit.DOM.getElement(elem);
if(typeof (_25d)=="undefined"){
_25d="px";
}
var _25e={};
var _25f=MochiKit.Base.isUndefinedOrNull;
if(!_25f(_25c.x)){
_25e["left"]=_25c.x+_25d;
}
if(!_25f(_25c.y)){
_25e["top"]=_25c.y+_25d;
}
MochiKit.DOM.updateNodeAttributes(elem,{"style":_25e});
},getElementDimensions:function(elem){
var self=MochiKit.Style;
var dom=MochiKit.DOM;
if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){
return new self.Dimensions(elem.w||0,elem.h||0);
}
elem=dom.getElement(elem);
if(!elem){
return undefined;
}
var disp=self.getStyle(elem,"display");
if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){
return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
}
var s=elem.style;
var _265=s.visibility;
var _266=s.position;
s.visibility="hidden";
s.position="absolute";
s.display="";
var _267=elem.offsetWidth;
var _268=elem.offsetHeight;
s.display="none";
s.position=_266;
s.visibility=_265;
return new self.Dimensions(_267,_268);
},setElementDimensions:function(elem,_26a,_26b){
elem=MochiKit.DOM.getElement(elem);
if(typeof (_26b)=="undefined"){
_26b="px";
}
var _26c={};
var _26d=MochiKit.Base.isUndefinedOrNull;
if(!_26d(_26a.w)){
_26c["width"]=_26a.w+_26b;
}
if(!_26d(_26a.h)){
_26c["height"]=_26a.h+_26b;
}
MochiKit.DOM.updateNodeAttributes(elem,{"style":_26c});
},setDisplayForElement:function(_26e,_26f){
var _270=MochiKit.Base.extend(null,arguments,1);
var _271=MochiKit.DOM.getElement;
for(var i=0;i<_270.length;i++){
_26f=_271(_270[i]);
if(_26f){
_26f.style.display=_26e;
}
}
},getViewportDimensions:function(){
var d=new MochiKit.Style.Dimensions();
var w=MochiKit.DOM._window;
var b=MochiKit.DOM._document.body;
if(w.innerWidth){
d.w=w.innerWidth;
d.h=w.innerHeight;
}else{
if(b.parentElement.clientWidth){
d.w=b.parentElement.clientWidth;
d.h=b.parentElement.clientHeight;
}else{
if(b&&b.clientWidth){
d.w=b.clientWidth;
d.h=b.clientHeight;
}
}
}
return d;
},getViewportPosition:function(){
var c=new MochiKit.Style.Coordinates(0,0);
var d=MochiKit.DOM._document;
var de=d.documentElement;
var db=d.body;
if(de&&(de.scrollTop||de.scrollLeft)){
c.x=de.scrollLeft;
c.y=de.scrollTop;
}else{
if(db){
c.x=db.scrollLeft;
c.y=db.scrollTop;
}
}
return c;
},__new__:function(){
var m=MochiKit.Base;
this.elementPosition=this.getElementPosition;
this.elementDimensions=this.getElementDimensions;
this.hideElement=m.partial(this.setDisplayForElement,"none");
this.showElement=m.partial(this.setDisplayForElement,"block");
this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
m.nameFunctions(this);
}});
MochiKit.Style.__new__();
MochiKit.Base._exportSymbols(this,MochiKit.Style);
if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.Signal");
dojo.require("MochiKit.Base");
dojo.require("MochiKit.DOM");
dojo.require("MochiKit.Style");
}
if(typeof (JSAN)!="undefined"){
JSAN.use("MochiKit.Base",[]);
JSAN.use("MochiKit.DOM",[]);
JSAN.use("MochiKit.Style",[]);
}
try{
if(typeof (MochiKit.Base)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Signal depends on MochiKit.Base!";
}
try{
if(typeof (MochiKit.DOM)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Signal depends on MochiKit.DOM!";
}
try{
if(typeof (MochiKit.Style)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Signal depends on MochiKit.Style!";
}
if(typeof (MochiKit.Signal)=="undefined"){
MochiKit.Signal={};
}
MochiKit.Signal.NAME="MochiKit.Signal";
MochiKit.Signal.VERSION="1.4";
MochiKit.Signal._observers=[];
MochiKit.Signal.Event=function(src,e){
this._event=e||window.event;
this._src=src;
};
MochiKit.Base.update(MochiKit.Signal.Event.prototype,{__repr__:function(){
var repr=MochiKit.Base.repr;
var str="{event(): "+repr(this.event())+", src(): "+repr(this.src())+", type(): "+repr(this.type())+", target(): "+repr(this.target());
if(this.type()&&this.type().indexOf("key")===0||this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu"){
str+=", modifier(): "+"{alt: "+repr(this.modifier().alt)+", ctrl: "+repr(this.modifier().ctrl)+", meta: "+repr(this.modifier().meta)+", shift: "+repr(this.modifier().shift)+", any: "+repr(this.modifier().any)+"}";
}
if(this.type()&&this.type().indexOf("key")===0){
str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
}
if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
str+=", mouse(): {page: "+repr(this.mouse().page)+", client: "+repr(this.mouse().client);
if(this.type()!="mousemove"){
str+=", button: {left: "+repr(this.mouse().button.left)+", middle: "+repr(this.mouse().button.middle)+", right: "+repr(this.mouse().button.right)+"}}";
}else{
str+="}";
}
}
if(this.type()=="mouseover"||this.type()=="mouseout"){
str+=", relatedTarget(): "+repr(this.relatedTarget());
}
str+="}";
return str;
},toString:function(){
return this.__repr__();
},src:function(){
return this._src;
},event:function(){
return this._event;
},type:function(){
return this._event.type||undefined;
},target:function(){
return this._event.target||this._event.srcElement;
},_relatedTarget:null,relatedTarget:function(){
if(this._relatedTarget!==null){
return this._relatedTarget;
}
var elem=null;
if(this.type()=="mouseover"){
elem=(this._event.relatedTarget||this._event.fromElement);
}else{
if(this.type()=="mouseout"){
elem=(this._event.relatedTarget||this._event.toElement);
}
}
if(elem!==null){
this._relatedTarget=elem;
return elem;
}
return undefined;
},_modifier:null,modifier:function(){
if(this._modifier!==null){
return this._modifier;
}
var m={};
m.alt=this._event.altKey;
m.ctrl=this._event.ctrlKey;
m.meta=this._event.metaKey||false;
m.shift=this._event.shiftKey;
m.any=m.alt||m.ctrl||m.shift||m.meta;
this._modifier=m;
return m;
},_key:null,key:function(){
if(this._key!==null){
return this._key;
}
var k={};
if(this.type()&&this.type().indexOf("key")===0){
if(this.type()=="keydown"||this.type()=="keyup"){
k.code=this._event.keyCode;
k.string=(MochiKit.Signal._specialKeys[k.code]||"KEY_UNKNOWN");
this._key=k;
return k;
}else{
if(this.type()=="keypress"){
k.code=0;
k.string="";
if(typeof (this._event.charCode)!="undefined"&&this._event.charCode!==0&&!MochiKit.Signal._specialMacKeys[this._event.charCode]){
k.code=this._event.charCode;
k.string=String.fromCharCode(k.code);
}else{
if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
k.code=this._event.keyCode;
k.string=String.fromCharCode(k.code);
}
}
this._key=k;
return k;
}
}
}
return undefined;
},_mouse:null,mouse:function(){
if(this._mouse!==null){
return this._mouse;
}
var m={};
var e=this._event;
if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
m.client=new MochiKit.Style.Coordinates(0,0);
if(e.clientX||e.clientY){
m.client.x=(!e.clientX||e.clientX<0)?0:e.clientX;
m.client.y=(!e.clientY||e.clientY<0)?0:e.clientY;
}
m.page=new MochiKit.Style.Coordinates(0,0);
if(e.pageX||e.pageY){
m.page.x=(!e.pageX||e.pageX<0)?0:e.pageX;
m.page.y=(!e.pageY||e.pageY<0)?0:e.pageY;
}else{
var de=MochiKit.DOM._document.documentElement;
var b=MochiKit.DOM._document.body;
m.page.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
m.page.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
}
if(this.type()!="mousemove"){
m.button={};
m.button.left=false;
m.button.right=false;
m.button.middle=false;
if(e.which){
m.button.left=(e.which==1);
m.button.middle=(e.which==2);
m.button.right=(e.which==3);
}else{
m.button.left=!!(e.button&1);
m.button.right=!!(e.button&2);
m.button.middle=!!(e.button&4);
}
}
this._mouse=m;
return m;
}
return undefined;
},stop:function(){
this.stopPropagation();
this.preventDefault();
},stopPropagation:function(){
if(this._event.stopPropagation){
this._event.stopPropagation();
}else{
this._event.cancelBubble=true;
}
},preventDefault:function(){
if(this._event.preventDefault){
this._event.preventDefault();
}else{
if(this._confirmUnload===null){
this._event.returnValue=false;
}
}
},_confirmUnload:null,confirmUnload:function(msg){
if(this.type()=="beforeunload"){
this._confirmUnload=msg;
this._event.returnValue=msg;
}
}});
MochiKit.Signal._specialMacKeys={3:"KEY_ENTER",63289:"KEY_NUM_PAD_CLEAR",63276:"KEY_PAGE_UP",63277:"KEY_PAGE_DOWN",63275:"KEY_END",63273:"KEY_HOME",63234:"KEY_ARROW_LEFT",63232:"KEY_ARROW_UP",63235:"KEY_ARROW_RIGHT",63233:"KEY_ARROW_DOWN",63302:"KEY_INSERT",63272:"KEY_DELETE"};
(function(){
var _287=MochiKit.Signal._specialMacKeys;
for(i=63236;i<=63242;i++){
_287[i]="KEY_F"+(i-63236+1);
}
})();
MochiKit.Signal._specialKeys={8:"KEY_BACKSPACE",9:"KEY_TAB",12:"KEY_NUM_PAD_CLEAR",13:"KEY_ENTER",16:"KEY_SHIFT",17:"KEY_CTRL",18:"KEY_ALT",19:"KEY_PAUSE",20:"KEY_CAPS_LOCK",27:"KEY_ESCAPE",32:"KEY_SPACEBAR",33:"KEY_PAGE_UP",34:"KEY_PAGE_DOWN",35:"KEY_END",36:"KEY_HOME",37:"KEY_ARROW_LEFT",38:"KEY_ARROW_UP",39:"KEY_ARROW_RIGHT",40:"KEY_ARROW_DOWN",44:"KEY_PRINT_SCREEN",45:"KEY_INSERT",46:"KEY_DELETE",59:"KEY_SEMICOLON",91:"KEY_WINDOWS_LEFT",92:"KEY_WINDOWS_RIGHT",93:"KEY_SELECT",106:"KEY_NUM_PAD_ASTERISK",107:"KEY_NUM_PAD_PLUS_SIGN",109:"KEY_NUM_PAD_HYPHEN-MINUS",110:"KEY_NUM_PAD_FULL_STOP",111:"KEY_NUM_PAD_SOLIDUS",144:"KEY_NUM_LOCK",145:"KEY_SCROLL_LOCK",186:"KEY_SEMICOLON",187:"KEY_EQUALS_SIGN",188:"KEY_COMMA",189:"KEY_HYPHEN-MINUS",190:"KEY_FULL_STOP",191:"KEY_SOLIDUS",192:"KEY_GRAVE_ACCENT",219:"KEY_LEFT_SQUARE_BRACKET",220:"KEY_REVERSE_SOLIDUS",221:"KEY_RIGHT_SQUARE_BRACKET",222:"KEY_APOSTROPHE"};
(function(){
var _288=MochiKit.Signal._specialKeys;
for(var i=48;i<=57;i++){
_288[i]="KEY_"+(i-48);
}
for(i=65;i<=90;i++){
_288[i]="KEY_"+String.fromCharCode(i);
}
for(i=96;i<=105;i++){
_288[i]="KEY_NUM_PAD_"+(i-96);
}
for(i=112;i<=123;i++){
_288[i]="KEY_F"+(i-112+1);
}
})();
MochiKit.Signal.Ident=function(_28a){
this.source=_28a.source;
this.signal=_28a.signal;
this.listener=_28a.listener;
this.isDOM=_28a.isDOM;
this.objOrFunc=_28a.objOrFunc;
this.funcOrStr=_28a.funcOrStr;
this.connected=_28a.connected;
};
MochiKit.Signal.Ident.prototype={};
MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
return "["+this.NAME+" "+this.VERSION+"]";
},toString:function(){
return this.__repr__();
},_unloadCache:function(){
var self=MochiKit.Signal;
var _28c=self._observers;
for(var i=0;i<_28c.length;i++){
if(_28c[i].signal!=="onload"&&_28c[i].signal!=="onunload"){
self._disconnect(_28c[i]);
}
}
},_listener:function(src,sig,func,obj,_292){
var self=MochiKit.Signal;
var E=self.Event;
if(!_292){
return MochiKit.Base.bind(func,obj);
}
obj=obj||src;
if(typeof (func)=="string"){
if(sig==="onload"||sig==="onunload"){
return function(_295){
obj[func].apply(obj,[new E(src,_295)]);
var _296=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:obj,funcOrStr:func});
MochiKit.Signal._disconnect(_296);
};
}else{
return function(_297){
obj[func].apply(obj,[new E(src,_297)]);
};
}
}else{
if(sig==="onload"||sig==="onunload"){
return function(_298){
func.apply(obj,[new E(src,_298)]);
MochiKit.Signal.disconnect(src,sig,func);
var _299=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:func});
MochiKit.Signal._disconnect(_299);
};
}else{
return function(_29a){
func.apply(obj,[new E(src,_29a)]);
};
}
}
},_browserAlreadyHasMouseEnterAndLeave:function(){
return /MSIE/.test(navigator.userAgent);
},_mouseEnterListener:function(src,sig,func,obj){
var E=MochiKit.Signal.Event;
return function(_2a0){
var e=new E(src,_2a0);
try{
e.relatedTarget().nodeName;
}
catch(err){
return;
}
e.stop();
if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
return;
}
e.type=function(){
return sig;
};
if(typeof (func)=="string"){
return obj[func].apply(obj,[e]);
}else{
return func.apply(obj,[e]);
}
};
},_getDestPair:function(_2a2,_2a3){
var obj=null;
var func=null;
if(typeof (_2a3)!="undefined"){
obj=_2a2;
func=_2a3;
if(typeof (_2a3)=="string"){
if(typeof (_2a2[_2a3])!="function"){
throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
}
}else{
if(typeof (_2a3)!="function"){
throw new Error("'funcOrStr' must be a function or string");
}
}
}else{
if(typeof (_2a2)!="function"){
throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
}else{
func=_2a2;
}
}
return [obj,func];
},connect:function(src,sig,_2a8,_2a9){
src=MochiKit.DOM.getElement(src);
var self=MochiKit.Signal;
if(typeof (sig)!="string"){
throw new Error("'sig' must be a string");
}
var _2ab=self._getDestPair(_2a8,_2a9);
var obj=_2ab[0];
var func=_2ab[1];
if(typeof (obj)=="undefined"||obj===null){
obj=src;
}
var _2ae=!!(src.addEventListener||src.attachEvent);
if(_2ae&&(sig==="onmouseenter"||sig==="onmouseleave")&&!self._browserAlreadyHasMouseEnterAndLeave()){
var _2af=self._mouseEnterListener(src,sig.substr(2),func,obj);
if(sig==="onmouseenter"){
sig="onmouseover";
}else{
sig="onmouseout";
}
}else{
var _2af=self._listener(src,sig,func,obj,_2ae);
}
if(src.addEventListener){
src.addEventListener(sig.substr(2),_2af,false);
}else{
if(src.attachEvent){
src.attachEvent(sig,_2af);
}
}
var _2b0=new MochiKit.Signal.Ident({source:src,signal:sig,listener:_2af,isDOM:_2ae,objOrFunc:_2a8,funcOrStr:_2a9,connected:true});
self._observers.push(_2b0);
if(!_2ae&&typeof (src.__connect__)=="function"){
var args=MochiKit.Base.extend([_2b0],arguments,1);
src.__connect__.apply(src,args);
}
return _2b0;
},_disconnect:function(_2b2){
if(!_2b2.connected){
return;
}
_2b2.connected=false;
if(!_2b2.isDOM){
return;
}
var src=_2b2.source;
var sig=_2b2.signal;
var _2b5=_2b2.listener;
if(src.removeEventListener){
src.removeEventListener(sig.substr(2),_2b5,false);
}else{
if(src.detachEvent){
src.detachEvent(sig,_2b5);
}else{
throw new Error("'src' must be a DOM element");
}
}
},disconnect:function(_2b6){
var self=MochiKit.Signal;
var _2b8=self._observers;
var m=MochiKit.Base;
if(arguments.length>1){
var src=MochiKit.DOM.getElement(arguments[0]);
var sig=arguments[1];
var obj=arguments[2];
var func=arguments[3];
for(var i=_2b8.length-1;i>=0;i--){
var o=_2b8[i];
if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){
self._disconnect(o);
if(!self._lock){
_2b8.splice(i,1);
}else{
self._dirty=true;
}
return true;
}
}
}else{
var idx=m.findIdentical(_2b8,_2b6);
if(idx>=0){
self._disconnect(_2b6);
if(!self._lock){
_2b8.splice(idx,1);
}else{
self._dirty=true;
}
return true;
}
}
return false;
},disconnectAllTo:function(_2c1,_2c2){
var self=MochiKit.Signal;
var _2c4=self._observers;
var _2c5=self._disconnect;
var _2c6=self._lock;
var _2c7=self._dirty;
if(typeof (_2c2)==="undefined"){
_2c2=null;
}
for(var i=_2c4.length-1;i>=0;i--){
var _2c9=_2c4[i];
if(_2c9.objOrFunc===_2c1&&(_2c2===null||_2c9.funcOrStr===_2c2)){
_2c5(_2c9);
if(_2c6){
_2c7=true;
}else{
_2c4.splice(i,1);
}
}
}
self._dirty=_2c7;
},disconnectAll:function(src,sig){
src=MochiKit.DOM.getElement(src);
var m=MochiKit.Base;
var _2cd=m.flattenArguments(m.extend(null,arguments,1));
var self=MochiKit.Signal;
var _2cf=self._disconnect;
var _2d0=self._observers;
var i,_2d2;
var _2d3=self._lock;
var _2d4=self._dirty;
if(_2cd.length===0){
for(i=_2d0.length-1;i>=0;i--){
_2d2=_2d0[i];
if(_2d2.source===src){
_2cf(_2d2);
if(!_2d3){
_2d0.splice(i,1);
}else{
_2d4=true;
}
}
}
}else{
var sigs={};
for(i=0;i<_2cd.length;i++){
sigs[_2cd[i]]=true;
}
for(i=_2d0.length-1;i>=0;i--){
_2d2=_2d0[i];
if(_2d2.source===src&&_2d2.signal in sigs){
_2cf(_2d2);
if(!_2d3){
_2d0.splice(i,1);
}else{
_2d4=true;
}
}
}
}
self._dirty=_2d4;
},signal:function(src,sig){
var self=MochiKit.Signal;
var _2d9=self._observers;
src=MochiKit.DOM.getElement(src);
var args=MochiKit.Base.extend(null,arguments,2);
var _2db=[];
self._lock=true;
for(var i=0;i<_2d9.length;i++){
var _2dd=_2d9[i];
if(_2dd.source===src&&_2dd.signal===sig&&_2dd.connected){
try{
_2dd.listener.apply(src,args);
}
catch(e){
_2db.push(e);
}
}
}
self._lock=false;
if(self._dirty){
self._dirty=false;
for(var i=_2d9.length-1;i>=0;i--){
if(!_2d9[i].connected){
_2d9.splice(i,1);
}
}
}
if(_2db.length==1){
throw _2db[0];
}else{
if(_2db.length>1){
var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
e.errors=_2db;
throw e;
}
}
}});
MochiKit.Signal.EXPORT_OK=[];
MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"];
MochiKit.Signal.__new__=function(win){
var m=MochiKit.Base;
this._document=document;
this._window=win;
this._lock=false;
this._dirty=false;
try{
this.connect(window,"onunload",this._unloadCache);
}
catch(e){
}
this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
m.nameFunctions(this);
};
MochiKit.Signal.__new__(this);
if(MochiKit.__export__){
connect=MochiKit.Signal.connect;
disconnect=MochiKit.Signal.disconnect;
disconnectAll=MochiKit.Signal.disconnectAll;
signal=MochiKit.Signal.signal;
}
MochiKit.Base._exportSymbols(this,MochiKit.Signal);
if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.Iter");
dojo.require("MochiKit.Base");
}
if(typeof (JSAN)!="undefined"){
JSAN.use("MochiKit.Base",[]);
}
try{
if(typeof (MochiKit.Base)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Iter depends on MochiKit.Base!";
}
if(typeof (MochiKit.Iter)=="undefined"){
MochiKit.Iter={};
}
MochiKit.Iter.NAME="MochiKit.Iter";
MochiKit.Iter.VERSION="1.4";
MochiKit.Base.update(MochiKit.Iter,{__repr__:function(){
return "["+this.NAME+" "+this.VERSION+"]";
},toString:function(){
return this.__repr__();
},registerIteratorFactory:function(name,_2e2,_2e3,_2e4){
MochiKit.Iter.iteratorRegistry.register(name,_2e2,_2e3,_2e4);
},iter:function(_2e5,_2e6){
var self=MochiKit.Iter;
if(arguments.length==2){
return self.takewhile(function(a){
return a!=_2e6;
},_2e5);
}
if(typeof (_2e5.next)=="function"){
return _2e5;
}else{
if(typeof (_2e5.iter)=="function"){
return _2e5.iter();
}
}
try{
return self.iteratorRegistry.match(_2e5);
}
catch(e){
var m=MochiKit.Base;
if(e==m.NotFound){
e=new TypeError(typeof (_2e5)+": "+m.repr(_2e5)+" is not iterable");
}
throw e;
}
},count:function(n){
if(!n){
n=0;
}
var m=MochiKit.Base;
return {repr:function(){
return "count("+n+")";
},toString:m.forwardCall("repr"),next:m.counter(n)};
},cycle:function(p){
var self=MochiKit.Iter;
var m=MochiKit.Base;
var lst=[];
var _2f0=self.iter(p);
return {repr:function(){
return "cycle(...)";
},toString:m.forwardCall("repr"),next:function(){
try{
var rval=_2f0.next();
lst.push(rval);
return rval;
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
if(lst.length===0){
this.next=function(){
throw self.StopIteration;
};
}else{
var i=-1;
this.next=function(){
i=(i+1)%lst.length;
return lst[i];
};
}
return this.next();
}
}};
},repeat:function(elem,n){
var m=MochiKit.Base;
if(typeof (n)=="undefined"){
return {repr:function(){
return "repeat("+m.repr(elem)+")";
},toString:m.forwardCall("repr"),next:function(){
return elem;
}};
}
return {repr:function(){
return "repeat("+m.repr(elem)+", "+n+")";
},toString:m.forwardCall("repr"),next:function(){
if(n<=0){
throw MochiKit.Iter.StopIteration;
}
n-=1;
return elem;
}};
},next:function(_2f6){
return _2f6.next();
},izip:function(p,q){
var m=MochiKit.Base;
var self=MochiKit.Iter;
var next=self.next;
var _2fc=m.map(self.iter,arguments);
return {repr:function(){
return "izip(...)";
},toString:m.forwardCall("repr"),next:function(){
return m.map(next,_2fc);
}};
},ifilter:function(pred,seq){
var m=MochiKit.Base;
seq=MochiKit.Iter.iter(seq);
if(pred===null){
pred=m.operator.truth;
}
return {repr:function(){
return "ifilter(...)";
},toString:m.forwardCall("repr"),next:function(){
while(true){
var rval=seq.next();
if(pred(rval)){
return rval;
}
}
return undefined;
}};
},ifilterfalse:function(pred,seq){
var m=MochiKit.Base;
seq=MochiKit.Iter.iter(seq);
if(pred===null){
pred=m.operator.truth;
}
return {repr:function(){
return "ifilterfalse(...)";
},toString:m.forwardCall("repr"),next:function(){
while(true){
var rval=seq.next();
if(!pred(rval)){
return rval;
}
}
return undefined;
}};
},islice:function(seq){
var self=MochiKit.Iter;
var m=MochiKit.Base;
seq=self.iter(seq);
var _308=0;
var stop=0;
var step=1;
var i=-1;
if(arguments.length==2){
stop=arguments[1];
}else{
if(arguments.length==3){
_308=arguments[1];
stop=arguments[2];
}else{
_308=arguments[1];
stop=arguments[2];
step=arguments[3];
}
}
return {repr:function(){
return "islice("+["...",_308,stop,step].join(", ")+")";
},toString:m.forwardCall("repr"),next:function(){
var rval;
while(i<_308){
rval=seq.next();
i++;
}
if(_308>=stop){
throw self.StopIteration;
}
_308+=step;
return rval;
}};
},imap:function(fun,p,q){
var m=MochiKit.Base;
var self=MochiKit.Iter;
var _312=m.map(self.iter,m.extend(null,arguments,1));
var map=m.map;
var next=self.next;
return {repr:function(){
return "imap(...)";
},toString:m.forwardCall("repr"),next:function(){
return fun.apply(this,map(next,_312));
}};
},applymap:function(fun,seq,self){
seq=MochiKit.Iter.iter(seq);
var m=MochiKit.Base;
return {repr:function(){
return "applymap(...)";
},toString:m.forwardCall("repr"),next:function(){
return fun.apply(self,seq.next());
}};
},chain:function(p,q){
var self=MochiKit.Iter;
var m=MochiKit.Base;
if(arguments.length==1){
return self.iter(arguments[0]);
}
var _31d=m.map(self.iter,arguments);
return {repr:function(){
return "chain(...)";
},toString:m.forwardCall("repr"),next:function(){
while(_31d.length>1){
try{
return _31d[0].next();
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
_31d.shift();
}
}
if(_31d.length==1){
var arg=_31d.shift();
this.next=m.bind("next",arg);
return this.next();
}
throw self.StopIteration;
}};
},takewhile:function(pred,seq){
var self=MochiKit.Iter;
seq=self.iter(seq);
return {repr:function(){
return "takewhile(...)";
},toString:MochiKit.Base.forwardCall("repr"),next:function(){
var rval=seq.next();
if(!pred(rval)){
this.next=function(){
throw self.StopIteration;
};
this.next();
}
return rval;
}};
},dropwhile:function(pred,seq){
seq=MochiKit.Iter.iter(seq);
var m=MochiKit.Base;
var bind=m.bind;
return {"repr":function(){
return "dropwhile(...)";
},"toString":m.forwardCall("repr"),"next":function(){
while(true){
var rval=seq.next();
if(!pred(rval)){
break;
}
}
this.next=bind("next",seq);
return rval;
}};
},_tee:function(_328,sync,_32a){
sync.pos[_328]=-1;
var m=MochiKit.Base;
var _32c=m.listMin;
return {repr:function(){
return "tee("+_328+", ...)";
},toString:m.forwardCall("repr"),next:function(){
var rval;
var i=sync.pos[_328];
if(i==sync.max){
rval=_32a.next();
sync.deque.push(rval);
sync.max+=1;
sync.pos[_328]+=1;
}else{
rval=sync.deque[i-sync.min];
sync.pos[_328]+=1;
if(i==sync.min&&_32c(sync.pos)!=sync.min){
sync.min+=1;
sync.deque.shift();
}
}
return rval;
}};
},tee:function(_32f,n){
var rval=[];
var sync={"pos":[],"deque":[],"max":-1,"min":-1};
if(arguments.length==1||typeof (n)=="undefined"||n===null){
n=2;
}
var self=MochiKit.Iter;
_32f=self.iter(_32f);
var _tee=self._tee;
for(var i=0;i<n;i++){
rval.push(_tee(i,sync,_32f));
}
return rval;
},list:function(_336){
var rval;
if(_336 instanceof Array){
return _336.slice();
}
if(typeof (_336)=="function"&&!(_336 instanceof Function)&&typeof (_336.length)=="number"){
rval=[];
for(var i=0;i<_336.length;i++){
rval.push(_336[i]);
}
return rval;
}
var self=MochiKit.Iter;
_336=self.iter(_336);
var rval=[];
try{
while(true){
rval.push(_336.next());
}
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
return rval;
}
return undefined;
},reduce:function(fn,_33b,_33c){
var i=0;
var x=_33c;
var self=MochiKit.Iter;
_33b=self.iter(_33b);
if(arguments.length<3){
try{
x=_33b.next();
}
catch(e){
if(e==self.StopIteration){
e=new TypeError("reduce() of empty sequence with no initial value");
}
throw e;
}
i++;
}
try{
while(true){
x=fn(x,_33b.next());
}
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
}
return x;
},range:function(){
var _340=0;
var stop=0;
var step=1;
if(arguments.length==1){
stop=arguments[0];
}else{
if(arguments.length==2){
_340=arguments[0];
stop=arguments[1];
}else{
if(arguments.length==3){
_340=arguments[0];
stop=arguments[1];
step=arguments[2];
}else{
throw new TypeError("range() takes 1, 2, or 3 arguments!");
}
}
}
if(step===0){
throw new TypeError("range() step must not be 0");
}
return {next:function(){
if((step>0&&_340>=stop)||(step<0&&_340<=stop)){
throw MochiKit.Iter.StopIteration;
}
var rval=_340;
_340+=step;
return rval;
},repr:function(){
return "range("+[_340,stop,step].join(", ")+")";
},toString:MochiKit.Base.forwardCall("repr")};
},sum:function(_344,_345){
if(typeof (_345)=="undefined"||_345===null){
_345=0;
}
var x=_345;
var self=MochiKit.Iter;
_344=self.iter(_344);
try{
while(true){
x+=_344.next();
}
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
}
return x;
},exhaust:function(_348){
var self=MochiKit.Iter;
_348=self.iter(_348);
try{
while(true){
_348.next();
}
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
}
},forEach:function(_34a,func,self){
var m=MochiKit.Base;
if(arguments.length>2){
func=m.bind(func,self);
}
if(m.isArrayLike(_34a)){
try{
for(var i=0;i<_34a.length;i++){
func(_34a[i]);
}
}
catch(e){
if(e!=MochiKit.Iter.StopIteration){
throw e;
}
}
}else{
self=MochiKit.Iter;
self.exhaust(self.imap(func,_34a));
}
},every:function(_34f,func){
var self=MochiKit.Iter;
try{
self.ifilterfalse(func,_34f).next();
return false;
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
return true;
}
},sorted:function(_352,cmp){
var rval=MochiKit.Iter.list(_352);
if(arguments.length==1){
cmp=MochiKit.Base.compare;
}
rval.sort(cmp);
return rval;
},reversed:function(_355){
var rval=MochiKit.Iter.list(_355);
rval.reverse();
return rval;
},some:function(_357,func){
var self=MochiKit.Iter;
try{
self.ifilter(func,_357).next();
return true;
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
return false;
}
},iextend:function(lst,_35b){
if(MochiKit.Base.isArrayLike(_35b)){
for(var i=0;i<_35b.length;i++){
lst.push(_35b[i]);
}
}else{
var self=MochiKit.Iter;
_35b=self.iter(_35b);
try{
while(true){
lst.push(_35b.next());
}
}
catch(e){
if(e!=self.StopIteration){
throw e;
}
}
}
return lst;
},groupby:function(_35e,_35f){
var m=MochiKit.Base;
var self=MochiKit.Iter;
if(arguments.length<2){
_35f=m.operator.identity;
}
_35e=self.iter(_35e);
var pk=undefined;
var k=undefined;
var v;
function fetch(){
v=_35e.next();
k=_35f(v);
}
function eat(){
var ret=v;
v=undefined;
return ret;
}
var _366=true;
var _367=m.compare;
return {repr:function(){
return "groupby(...)";
},next:function(){
while(_367(k,pk)===0){
fetch();
if(_366){
_366=false;
break;
}
}
pk=k;
return [k,{next:function(){
if(v==undefined){
fetch();
}
if(_367(k,pk)!==0){
throw self.StopIteration;
}
return eat();
}}];
}};
},groupby_as_array:function(_368,_369){
var m=MochiKit.Base;
var self=MochiKit.Iter;
if(arguments.length<2){
_369=m.operator.identity;
}
_368=self.iter(_368);
var _36c=[];
var _36d=true;
var _36e;
var _36f=m.compare;
while(true){
try{
var _370=_368.next();
var key=_369(_370);
}
catch(e){
if(e==self.StopIteration){
break;
}
throw e;
}
if(_36d||_36f(key,_36e)!==0){
var _372=[];
_36c.push([key,_372]);
}
_372.push(_370);
_36d=false;
_36e=key;
}
return _36c;
},arrayLikeIter:function(_373){
var i=0;
return {repr:function(){
return "arrayLikeIter(...)";
},toString:MochiKit.Base.forwardCall("repr"),next:function(){
if(i>=_373.length){
throw MochiKit.Iter.StopIteration;
}
return _373[i++];
}};
},hasIterateNext:function(_375){
return (_375&&typeof (_375.iterateNext)=="function");
},iterateNextIter:function(_376){
return {repr:function(){
return "iterateNextIter(...)";
},toString:MochiKit.Base.forwardCall("repr"),next:function(){
var rval=_376.iterateNext();
if(rval===null||rval===undefined){
throw MochiKit.Iter.StopIteration;
}
return rval;
}};
}});
MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",];
MochiKit.Iter.EXPORT=["StopIteration","registerIteratorFactory","iter","count","cycle","repeat","next","izip","ifilter","ifilterfalse","islice","imap","applymap","chain","takewhile","dropwhile","tee","list","reduce","range","sum","exhaust","forEach","every","sorted","reversed","some","iextend","groupby","groupby_as_array"];
MochiKit.Iter.__new__=function(){
var m=MochiKit.Base;
if(typeof (StopIteration)!="undefined"){
this.StopIteration=StopIteration;
}else{
this.StopIteration=new m.NamedError("StopIteration");
}
this.iteratorRegistry=new m.AdapterRegistry();
this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter);
this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter);
this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
m.nameFunctions(this);
};
MochiKit.Iter.__new__();
if(MochiKit.__export__){
reduce=MochiKit.Iter.reduce;
}
MochiKit.Base._exportSymbols(this,MochiKit.Iter);
if(typeof (dojo)!="undefined"){
dojo.provide("MochiKit.Async");
dojo.require("MochiKit.Base");
}
if(typeof (JSAN)!="undefined"){
JSAN.use("MochiKit.Base",[]);
}
try{
if(typeof (MochiKit.Base)=="undefined"){
throw "";
}
}
catch(e){
throw "MochiKit.Async depends on MochiKit.Base!";
}
if(typeof (MochiKit.Async)=="undefined"){
MochiKit.Async={};
}
MochiKit.Async.NAME="MochiKit.Async";
MochiKit.Async.VERSION="1.4";
MochiKit.Async.__repr__=function(){
return "["+this.NAME+" "+this.VERSION+"]";
};
MochiKit.Async.toString=function(){
return this.__repr__();
};
MochiKit.Async.Deferred=function(_379){
this.chain=[];
this.id=this._nextId();
this.fired=-1;
this.paused=0;
this.results=[null,null];
this.canceller=_379;
this.silentlyCancelled=false;
this.chained=false;
};
MochiKit.Async.Deferred.prototype={repr:function(){
var _37a;
if(this.fired==-1){
_37a="unfired";
}else{
if(this.fired===0){
_37a="success";
}else{
_37a="error";
}
}
return "Deferred("+this.id+", "+_37a+")";
},toString:MochiKit.Base.forwardCall("repr"),_nextId:MochiKit.Base.counter(),cancel:function(){
var self=MochiKit.Async;
if(this.fired==-1){
if(this.canceller){
this.canceller(this);
}else{
this.silentlyCancelled=true;
}
if(this.fired==-1){
this.errback(new self.CancelledError(this));
}
}else{
if((this.fired===0)&&(this.results[0] instanceof self.Deferred)){
this.results[0].cancel();
}
}
},_resback:function(res){
this.fired=((res instanceof Error)?1:0);
this.results[this.fired]=res;
this._fire();
},_check:function(){
if(this.fired!=-1){
if(!this.silentlyCancelled){
throw new MochiKit.Async.AlreadyCalledError(this);
}
this.silentlyCancelled=false;
return;
}
},callback:function(res){
this._check();
if(res instanceof MochiKit.Async.Deferred){
throw new Error("Deferred instances can only be chained if they are the result of a callback");
}
this._resback(res);
},errback:function(res){
this._check();
var self=MochiKit.Async;
if(res instanceof self.Deferred){
throw new Error("Deferred instances can only be chained if they are the result of a callback");
}
if(!(res instanceof Error)){
res=new self.GenericError(res);
}
this._resback(res);
},addBoth:function(fn){
if(arguments.length>1){
fn=MochiKit.Base.partial.apply(null,arguments);
}
return this.addCallbacks(fn,fn);
},addCallback:function(fn){
if(arguments.length>1){
fn=MochiKit.Base.partial.apply(null,arguments);
}
return this.addCallbacks(fn,null);
},addErrback:function(fn){
if(arguments.length>1){
fn=MochiKit.Base.partial.apply(null,arguments);
}
return this.addCallbacks(null,fn);
},addCallbacks:function(cb,eb){
if(this.chained){
throw new Error("Chained Deferreds can not be re-used");
}
this.chain.push([cb,eb]);
if(this.fired>=0){
this._fire();
}
return this;
},_fire:function(){
var _385=this.chain;
var _386=this.fired;
var res=this.results[_386];
var self=this;
var cb=null;
while(_385.length>0&&this.paused===0){
var pair=_385.shift();
var f=pair[_386];
if(f===null){
continue;
}
try{
res=f(res);
_386=((res instanceof Error)?1:0);
if(res instanceof MochiKit.Async.Deferred){
cb=function(res){
self._resback(res);
self.paused--;
if((self.paused===0)&&(self.fired>=0)){
self._fire();
}
};
this.paused++;
}
}
catch(err){
_386=1;
if(!(err instanceof Error)){
err=new MochiKit.Async.GenericError(err);
}
res=err;
}
}
this.fired=_386;
this.results[_386]=res;
if(cb&&this.paused){
res.addBoth(cb);
res.chained=true;
}
}};
MochiKit.Base.update(MochiKit.Async,{evalJSONRequest:function(req){
return MochiKit.Base.evalJSON(req.responseText);
},succeed:function(_38e){
var d=new MochiKit.Async.Deferred();
d.callback.apply(d,arguments);
return d;
},fail:function(_390){
var d=new MochiKit.Async.Deferred();
d.errback.apply(d,arguments);
return d;
},getXMLHttpRequest:function(){
var self=arguments.callee;
if(!self.XMLHttpRequest){
var _393=[function(){
return new XMLHttpRequest();
},function(){
return new ActiveXObject("Msxml2.XMLHTTP");
},function(){
return new ActiveXObject("Microsoft.XMLHTTP");
},function(){
return new ActiveXObject("Msxml2.XMLHTTP.4.0");
},function(){
throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
}];
for(var i=0;i<_393.length;i++){
var func=_393[i];
try{
self.XMLHttpRequest=func;
return func();
}
catch(e){
}
}
}
return self.XMLHttpRequest();
},_xhr_onreadystatechange:function(d){
var m=MochiKit.Base;
if(this.readyState==4){
try{
this.onreadystatechange=null;
}
catch(e){
try{
this.onreadystatechange=m.noop;
}
catch(e){
}
}
var _398=null;
try{
_398=this.status;
if(!_398&&m.isNotEmpty(this.responseText)){
_398=304;
}
}
catch(e){
}
if(_398==200||_398==201||_398==204||_398==304||_398==1223){
d.callback(this);
}else{
var err=new MochiKit.Async.XMLHttpRequestError(this,"Request failed");
if(err.number){
d.errback(err);
}else{
d.errback(err);
}
}
}
},_xhr_canceller:function(req){
try{
req.onreadystatechange=null;
}
catch(e){
try{
req.onreadystatechange=MochiKit.Base.noop;
}
catch(e){
}
}
req.abort();
},sendXMLHttpRequest:function(req,_39c){
if(typeof (_39c)=="undefined"||_39c===null){
_39c="";
}
var m=MochiKit.Base;
var self=MochiKit.Async;
var d=new self.Deferred(m.partial(self._xhr_canceller,req));
try{
req.onreadystatechange=m.bind(self._xhr_onreadystatechange,req,d);
req.send(_39c);
}
catch(e){
try{
req.onreadystatechange=null;
}
catch(ignore){
}
d.errback(e);
}
return d;
},doXHR:function(url,opts){
var self=MochiKit.Async;
return self.callLater(0,self._doXHR,url,opts);
},_doXHR:function(url,opts){
var m=MochiKit.Base;
opts=m.update({method:"GET",sendContent:""},opts);
var self=MochiKit.Async;
var req=self.getXMLHttpRequest();
if(opts.queryString){
var qs=m.queryString(opts.queryString);
if(qs){
url+="?"+qs;
}
}
if("username" in opts){
req.open(opts.method,url,true,opts.username,opts.password);
}else{
req.open(opts.method,url,true);
}
if(req.overrideMimeType&&opts.mimeType){
req.overrideMimeType(opts.mimeType);
}
if(opts.headers){
var _3a9=opts.headers;
if(!m.isArrayLike(_3a9)){
_3a9=m.items(_3a9);
}
for(var i=0;i<_3a9.length;i++){
var _3ab=_3a9[i];
var name=_3ab[0];
var _3ad=_3ab[1];
req.setRequestHeader(name,_3ad);
}
}
return self.sendXMLHttpRequest(req,opts.sendContent);
},_buildURL:function(url){
if(arguments.length>1){
var m=MochiKit.Base;
var qs=m.queryString.apply(null,m.extend(null,arguments,1));
if(qs){
return url+"?"+qs;
}
}
return url;
},doSimpleXMLHttpRequest:function(url){
var self=MochiKit.Async;
url=self._buildURL.apply(self,arguments);
return self.doXHR(url);
},loadJSONDoc:function(url){
var self=MochiKit.Async;
url=self._buildURL.apply(self,arguments);
var d=self.doXHR(url,{"mimeType":"text/plain","headers":[["Accept","application/json"]]});
d=d.addCallback(self.evalJSONRequest);
return d;
},wait:function(_3b6,_3b7){
var d=new MochiKit.Async.Deferred();
var m=MochiKit.Base;
if(typeof (_3b7)!="undefined"){
d.addCallback(function(){
return _3b7;
});
}
var _3ba=setTimeout(m.bind("callback",d),Math.floor(_3b6*1000));
d.canceller=function(){
try{
clearTimeout(_3ba);
}
catch(e){
}
};
return d;
},callLater:function(_3bb,func){
var m=MochiKit.Base;
var _3be=m.partial.apply(m,m.extend(null,arguments,1));
return MochiKit.Async.wait(_3bb).addCallback(function(res){
return _3be();
});
}});
MochiKit.Async.DeferredLock=function(){
this.waiting=[];
this.locked=false;
this.id=this._nextId();
};
MochiKit.Async.DeferredLock.prototype={__class__:MochiKit.Async.DeferredLock,acquire:function(){
var d=new MochiKit.Async.Deferred();
if(this.locked){
this.waiting.push(d);
}else{
this.locked=true;
d.callback(this);
}
return d;
},release:function(){
if(!this.locked){
throw TypeError("Tried to release an unlocked DeferredLock");
}
this.locked=false;
if(this.waiting.length>0){
this.locked=true;
this.waiting.shift().callback(this);
}
},_nextId:MochiKit.Base.counter(),repr:function(){
var _3c1;
if(this.locked){
_3c1="locked, "+this.waiting.length+" waiting";
}else{
_3c1="unlocked";
}
return "DeferredLock("+this.id+", "+_3c1+")";
},toString:MochiKit.Base.forwardCall("repr")};
MochiKit.Async.DeferredList=function(list,_3c3,_3c4,_3c5,_3c6){
MochiKit.Async.Deferred.apply(this,[_3c6]);
this.list=list;
var _3c7=[];
this.resultList=_3c7;
this.finishedCount=0;
this.fireOnOneCallback=_3c3;
this.fireOnOneErrback=_3c4;
this.consumeErrors=_3c5;
var cb=MochiKit.Base.bind(this._cbDeferred,this);
for(var i=0;i<list.length;i++){
var d=list[i];
_3c7.push(undefined);
d.addCallback(cb,i,true);
d.addErrback(cb,i,false);
}
if(list.length===0&&!_3c3){
this.callback(this.resultList);
}
};
MochiKit.Async.DeferredList.prototype=new MochiKit.Async.Deferred();
MochiKit.Async.DeferredList.prototype._cbDeferred=function(_3cb,_3cc,_3cd){
this.resultList[_3cb]=[_3cc,_3cd];
this.finishedCount+=1;
if(this.fired==-1){
if(_3cc&&this.fireOnOneCallback){
this.callback([_3cb,_3cd]);
}else{
if(!_3cc&&this.fireOnOneErrback){
this.errback(_3cd);
}else{
if(this.finishedCount==this.list.length){
this.callback(this.resultList);
}
}
}
}
if(!_3cc&&this.consumeErrors){
_3cd=null;
}
return _3cd;
};
MochiKit.Async.gatherResults=function(_3ce){
var d=new MochiKit.Async.DeferredList(_3ce,false,true,false);
d.addCallback(function(_3d0){
var ret=[];
for(var i=0;i<_3d0.length;i++){
ret.push(_3d0[i][1]);
}
return ret;
});
return d;
};
MochiKit.Async.maybeDeferred=function(func){
var self=MochiKit.Async;
var _3d5;
try{
var r=func.apply(null,MochiKit.Base.extend([],arguments,1));
if(r instanceof self.Deferred){
_3d5=r;
}else{
if(r instanceof Error){
_3d5=self.fail(r);
}else{
_3d5=self.succeed(r);
}
}
}
catch(e){
_3d5=self.fail(e);
}
return _3d5;
};
MochiKit.Async.EXPORT=["AlreadyCalledError","CancelledError","BrowserComplianceError","GenericError","XMLHttpRequestError","Deferred","succeed","fail","getXMLHttpRequest","doSimpleXMLHttpRequest","loadJSONDoc","wait","callLater","sendXMLHttpRequest","DeferredLock","DeferredList","gatherResults","maybeDeferred","doXHR"];
MochiKit.Async.EXPORT_OK=["evalJSONRequest"];
MochiKit.Async.__new__=function(){
var m=MochiKit.Base;
var ne=m.partial(m._newNamedError,this);
ne("AlreadyCalledError",function(_3d9){
this.deferred=_3d9;
});
ne("CancelledError",function(_3da){
this.deferred=_3da;
});
ne("BrowserComplianceError",function(msg){
this.message=msg;
});
ne("GenericError",function(msg){
this.message=msg;
});
ne("XMLHttpRequestError",function(req,msg){
this.req=req;
this.message=msg;
try{
this.number=req.status;
}
catch(e){
}
});
this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
m.nameFunctions(this);
};
MochiKit.Async.__new__();
MochiKit.Base._exportSymbols(this,MochiKit.Async);

//- cm.js compressed version of CodeMirror with its JS parser

function matcher(_1){
return function(_2){
return _1.test(_2);
};
}
function hasClass(_3,_4){
var _5=_3.className;
return _5&&new RegExp("(^| )"+_4+"($| )").test(_5);
}
function insertAfter(_6,_7){
var _8=_7.parentNode;
var _9=_7.nextSibling;
if(_9){
_8.insertBefore(_6,_9);
}else{
_8.appendChild(_6);
}
return _6;
}
function insertAtStart(_a,_b){
if(_b.firstChild){
_b.insertBefore(_a,_b.firstChild);
}else{
_b.appendChild(_a);
}
return _a;
}
function isAncestor(_c,_d){
while(_d=_d.parentNode){
if(_c==_d){
return true;
}
}
return false;
}
var nbsp=String.fromCharCode(160);
var realWhiteSpace=new RegExp("^[\\s"+nbsp+"]*$");
var tokenizeJavaScript=function(){
var _e=function(){
function result(_f,_10){
return {type:_f,style:_10};
}
var _11=result("keyword a","keyword");
var _12=result("keyword b","keyword");
var _13=result("keyword c","keyword");
var _14=result("operator","keyword");
var _15=result("atom","atom");
return {"if":_11,"switch":_11,"while":_11,"with":_11,"else":_12,"do":_12,"try":_12,"finally":_12,"return":_13,"break":_13,"continue":_13,"new":_13,"delete":_13,"throw":_13,"in":_14,"typeof":_14,"instanceof":_14,"var":result("var","keyword"),"function":result("function","keyword"),"catch":result("catch","keyword"),"for":result("for","keyword"),"case":result("case","keyword"),"true":_15,"false":_15,"null":_15,"undefined":_15,"NaN":_15,"Infinity":_15};
}();
var _16=matcher(/[\+\-\*\&\%\/=<>!\?]/);
var _17=matcher(/[0-9]/);
var _18=matcher(/[0-9A-Fa-f]/);
var _19=matcher(/[\w\$_]/);
function isWhiteSpace(ch){
return ch!="\n"&&realWhiteSpace.test(ch);
}
return function(_1b){
function result(_1c,_1d,_1e){
_1b.nextWhile(isWhiteSpace);
var _1f={type:_1c,style:_1d,value:(_1e?_1e+_1b.get():_1b.get())};
if(_1e){
_1f.name=_1e;
}
return _1f;
}
function nextUntilUnescaped(end){
var _21=false;
var _22;
while(_1b.notEquals("\n")){
var _23=_1b.next();
if(_23==end&&!_21){
break;
}
_21=_23=="\\";
}
}
function readHexNumber(){
_1b.next();
_1b.nextWhile(_18);
return result("number","atom");
}
function readNumber(){
_1b.nextWhile(_17);
if(_1b.equals(".")){
_1b.next();
_1b.nextWhile(_17);
}
if(_1b.equals("e")||_1b.equals("E")){
_1b.next();
if(_1b.equals("-")){
_1b.next();
}
_1b.nextWhile(_17);
}
return result("number","atom");
}
function readWord(){
_1b.nextWhile(_19);
var _24=_1b.get();
var _25=_e.hasOwnProperty(_24)&&_e.propertyIsEnumerable(_24)&&_e[_24];
return _25?result(_25.type,_25.style,_24):result("variable","variable",_24);
}
function readRegexp(){
nextUntilUnescaped("/");
_1b.nextWhile(matcher(/[gi]/));
return result("regexp","string");
}
function readMultilineComment(_26){
this.inComment=true;
var _27=(_26=="*");
while(true){
if(_1b.equals("\n")){
break;
}
var _28=_1b.next();
if(_28=="/"&&_27){
this.inComment=false;
break;
}
_27=(_28=="*");
}
return result("comment","comment");
}
function next(){
var _29=null;
var ch=_1b.next();
if(ch=="\n"){
_29={type:"newline",style:"whitespace",value:_1b.get()};
}else{
if(this.inComment){
_29=readMultilineComment.call(this,ch);
}else{
if(isWhiteSpace(ch)){
_29=_1b.nextWhile(isWhiteSpace)||result("whitespace","whitespace");
}else{
if(ch=="\""||ch=="'"){
_29=nextUntilUnescaped(ch)||result("string","string");
}else{
if(/[\[\]{}\(\),;\:\.]/.test(ch)){
_29=result(ch,"punctuation");
}else{
if(ch=="0"&&(_1b.equals("x")||_1b.equals("X"))){
_29=readHexNumber();
}else{
if(_17(ch)){
_29=readNumber();
}else{
if(ch=="/"){
if(_1b.equals("*")){
_29=readMultilineComment.call(this,ch);
}else{
if(_1b.equals("/")){
_29=nextUntilUnescaped(null)||result("comment","comment");
}else{
if(this.regexp){
_29=readRegexp();
}else{
_29=_1b.nextWhile(_16)||result("operator","operator");
}
}
}
}else{
if(_16(ch)){
_29=_1b.nextWhile(_16)||result("operator","operator");
}else{
_29=readWord();
}
}
}
}
}
}
}
}
}
if(_29.style!="whitespace"&&_29!="comment"){
this.regexp=_29.type=="operator"||_29.type=="keyword c"||_29.type.match(/[\[{}\(,;:]/);
}
return _29;
}
return {next:next,regexp:true,inComment:false};
};
}();
var JavaScriptParser=(function(){
var _2b={"atom":true,"number":true,"variable":true,"string":true,"regexp":true};
function JSLexical(_2c,_2d,_2e,_2f,_30){
this.indented=_2c;
this.column=_2d;
this.type=_2e;
if(_2f!=null){
this.align=_2f;
}
this.prev=_30;
}
function indentJS(_31){
return function(_32){
var _33=_32&&_32.charAt(0);
var _34=_33==_31.type;
if(_31.type=="vardef"){
return _31.indented+4;
}else{
if(_31.type=="form"&&_33=="{"){
return _31.indented;
}else{
if(_31.type=="stat"||_31.type=="form"){
return _31.indented+2;
}else{
if(_31.align){
return _31.column-(_34?1:0);
}else{
return _31.indented+(_34?0:2);
}
}
}
}
};
}
function parseJS(_35){
var _36=tokenizeJavaScript(_35);
var cc=[statements];
var _38=null;
var _39=new JSLexical(-2,0,"block",false);
var _3a=0;
var _3b=0;
var _3c,marked;
var _3d={next:next,copy:copy};
function next(){
while(cc[cc.length-1].lex){
cc.pop()();
}
var _3e=_36.next();
if(_3e.type=="whitespace"&&_3a==0){
_3b=_3e.value.length;
}
_3a+=_3e.value.length;
if(_3e.type=="newline"){
_3b=_3a=0;
if(!("align" in _39)){
_39.align=false;
}
_3e.indentation=indentJS(_39);
}
if(_3e.type=="whitespace"||_3e.type=="newline"||_3e.type=="comment"){
return _3e;
}
if(!("align" in _39)){
_39.align=true;
}
while(true){
_3c=marked=false;
cc.pop()(_3e.type,_3e.name);
if(_3c){
if(marked){
_3e.style=marked;
}else{
if(_3e.type=="variable"&&inScope(_3e.name)){
_3e.style="localvariable";
}
}
return _3e;
}
}
}
function copy(){
var _3f=_38,_lexical=_39,_cc=cc.concat([]),_regexp=_36.regexp,_comment=_36.inComment;
return function(_40){
_38=_3f;
_39=_lexical;
cc=_cc.concat([]);
_3a=_3b=0;
_36=tokenizeJavaScript(_40);
_36.regexp=_regexp;
_36.inComment=_comment;
return _3d;
};
}
function push(fs){
for(var i=fs.length-1;i>=0;i--){
cc.push(fs[i]);
}
}
function cont(){
push(arguments);
_3c=true;
}
function pass(){
push(arguments);
_3c=false;
}
function mark(_43){
marked=_43;
}
function pushcontext(){
_38={prev:_38,vars:{"this":true,"arguments":true}};
}
function popcontext(){
_38=_38.prev;
}
function register(_44){
if(_38){
mark("variabledef");
_38.vars[_44]=true;
}
}
function inScope(_45){
var _46=_38;
while(_46){
if(_46.vars[_45]){
return true;
}
_46=_46.prev;
}
return false;
}
function pushlex(_47){
var _48=function(){
_39=new JSLexical(_3b,_3a,_47,null,_39);
};
_48.lex=true;
return _48;
}
function poplex(){
_39=_39.prev;
}
poplex.lex=true;
function expect(_49){
return function(_4a){
if(_4a==_49){
cont();
}else{
cont(arguments.callee);
}
};
}
function statements(_4b){
return pass(statement,statements);
}
function statement(_4c){
if(_4c=="var"){
cont(pushlex("vardef"),vardef1,expect(";"),poplex);
}else{
if(_4c=="keyword a"){
cont(pushlex("form"),expression,statement,poplex);
}else{
if(_4c=="keyword b"){
cont(pushlex("form"),statement,poplex);
}else{
if(_4c=="{"){
cont(pushlex("}"),block,poplex);
}else{
if(_4c=="function"){
cont(functiondef);
}else{
if(_4c=="for"){
cont(pushlex("form"),expect("("),pushlex(")"),forspec1,expect(")"),poplex,statement,poplex);
}else{
if(_4c=="variable"){
cont(pushlex("stat"),maybelabel);
}else{
if(_4c=="case"){
cont(expression,expect(":"));
}else{
if(_4c=="catch"){
cont(pushlex("form"),pushcontext,expect("("),funarg,expect(")"),statement,poplex,popcontext);
}else{
pass(pushlex("stat"),expression,expect(";"),poplex);
}
}
}
}
}
}
}
}
}
}
function expression(_4d){
if(_2b.hasOwnProperty(_4d)){
cont(maybeoperator);
}else{
if(_4d=="function"){
cont(functiondef);
}else{
if(_4d=="keyword c"){
cont(expression);
}else{
if(_4d=="("){
cont(pushlex(")"),expression,expect(")"),poplex);
}else{
if(_4d=="operator"){
cont(expression);
}else{
if(_4d=="["){
cont(pushlex("]"),commasep(expression),expect("]"),poplex);
}else{
if(_4d=="{"){
cont(pushlex("}"),commasep(objprop),expect("}"),poplex);
}
}
}
}
}
}
}
}
function maybeoperator(_4e){
if(_4e=="operator"){
cont(expression);
}else{
if(_4e=="("){
cont(pushlex(")"),expression,commasep(expression),expect(")"),poplex);
}else{
if(_4e=="."){
cont(property,maybeoperator);
}else{
if(_4e=="["){
cont(pushlex("]"),expression,expect("]"),poplex);
}
}
}
}
}
function maybelabel(_4f){
if(_4f==":"){
cont(poplex,statement);
}else{
pass(maybeoperator,expect(";"),poplex);
}
}
function property(_50){
if(_50=="variable"){
mark("property");
cont();
}
}
function objprop(_51){
if(_51=="variable"){
mark("property");
}
if(_2b.hasOwnProperty(_51)){
cont(expect(":"),expression);
}
}
function commasep(_52){
function proceed(_53){
if(_53==","){
cont(_52,proceed);
}
}
return function(){
pass(_52,proceed);
};
}
function block(_54){
if(_54=="}"){
cont();
}else{
pass(statement,block);
}
}
function vardef1(_55,_56){
if(_55=="variable"){
register(_56);
cont(vardef2);
}else{
cont();
}
}
function vardef2(_57){
if(_57=="operator"){
cont(expression,vardef2);
}else{
if(_57==","){
cont(vardef1);
}
}
}
function forspec1(_58,_59){
if(_58=="var"){
cont(vardef1,forspec2);
}else{
cont(expression,forspec2);
}
}
function forspec2(_5a){
if(_5a==","){
cont(forspec1);
}
if(_5a==";"){
cont(expression,expect(";"),expression);
}
}
function functiondef(_5b,_5c){
if(_5b=="variable"){
register(_5c);
cont(functiondef);
}else{
if(_5b=="("){
cont(pushcontext,commasep(funarg),expect(")"),statement,popcontext);
}
}
}
function funarg(_5d,_5e){
if(_5d=="variable"){
register(_5e);
cont();
}
}
return _3d;
}
return {make:parseJS,electricChars:"{}"};
})();
(function(){
var _5f={more:function(){
return this.peek()!==null;
},applies:function(_60){
var _61=this.peek();
return (_61!==null&&_60(_61));
},nextWhile:function(_62){
while(this.applies(_62)){
this.next();
}
},equals:function(ch){
return ch===this.peek();
},notEquals:function(ch){
var _65=this.peek();
return (_65!==null&&_65!=ch);
}};
window.singleStringStream=function(_66){
var pos=0,start=0;
return update(_5f,{peek:function(){
if(pos<_66.length){
return _66.charAt(pos);
}else{
return null;
}
},next:function(){
if(pos>=_66.length){
if(pos<start){
throw "End of stringstream reached without emptying buffer.";
}else{
throw StopIteration;
}
}
return _66.charAt(pos++);
},get:function(){
var _68=_66.slice(start,pos);
start=pos;
return _68;
}});
};
window.multiStringStream=function(_69){
_69=iter(_69);
var _6a="",pos=0;
var _6b=null,accum="";
return update(_5f,{peek:function(){
if(!_6b){
try{
_6b=this.step();
}
catch(e){
if(e!=StopIteration){
throw e;
}else{
_6b=null;
}
}
}
return _6b;
},step:function(){
if(_6b){
var _6c=_6b;
_6b=null;
return _6c;
}
while(pos==_6a.length){
accum+=_6a;
_6a="";
pos=0;
_6a=_69.next();
}
return _6a.charAt(pos++);
},next:function(){
try{
return this.step();
}
catch(e){
if(e==StopIteration&&accum.length>0){
throw "End of stringstream reached without emptying buffer ('"+accum+"').";
}else{
throw e;
}
}
},get:function(){
var _6d=accum;
var _6e=_6b?pos-1:pos;
accum="";
if(_6e>0){
_6d+=_6a.slice(0,_6e);
_6a=_6a.slice(_6e);
pos=_6b?1:0;
}
return _6d;
}});
};
})();
var select={};
(function(){
var _6f=document.selection&&document.selection.createRangeCollection;
function topLevelNodeAt(_70,top){
while(_70&&_70.parentNode!=top){
_70=_70.parentNode;
}
return _70;
}
function topLevelNodeBefore(_72,top){
while(!_72.previousSibling&&_72.parentNode!=top){
_72=_72.parentNode;
}
return topLevelNodeAt(_72.previousSibling,top);
}
if(_6f){
select.markSelection=function(win){
var _75=win.document.selection;
var _76=_75.createRange(),end=_76.duplicate();
var _77=_76.getBookmark();
_76.collapse(true);
end.collapse(false);
var _78=win.document.body;
return {start:{x:_76.boundingLeft+_78.scrollLeft-1,y:_76.boundingTop+_78.scrollTop},end:{x:end.boundingLeft+_78.scrollLeft-1,y:end.boundingTop+_78.scrollTop},window:win,bookmark:_77};
};
select.selectMarked=function(sel){
if(!sel){
return;
}
var _7a=sel.window.document.body.createTextRange(),range2=_7a.duplicate();
if(sel.start.y<0||sel.end.y>sel.window.document.body.clientHeight){
_7a.moveToBookmark(sel.bookmark);
}else{
_7a.moveToPoint(sel.start.x,sel.start.y);
range2.moveToPoint(sel.end.x,sel.end.y);
_7a.setEndPoint("EndToStart",range2);
}
_7a.select();
};
select.selectionTopNode=function(_7b,_7c){
var _7d=_7b.ownerDocument.selection;
if(!_7d){
return false;
}
var _7e=_7d.createRange();
_7e.collapse(_7c);
var _7f=_7e.parentElement();
if(_7f&&isAncestor(_7b,_7f)){
var _80=_7e.duplicate();
_80.moveToElementText(_7f);
if(_7e.compareEndPoints("StartToStart",_80)==-1){
return topLevelNodeAt(_7f,_7b);
}
}
_7e.pasteHTML("<span id='// temp //'></span>");
var _81=_7b.ownerDocument.getElementById("// temp //");
var _82=topLevelNodeBefore(_81,_7b);
removeElement(_81);
return _82;
};
select.replaceSelection=function(){
};
select.focusAfterNode=function(_83,_84){
var _85=_84.ownerDocument.body.createTextRange();
_85.moveToElementText(_83||_84);
_85.collapse(!_83);
_85.select();
};
select.insertNewlineAtCursor=function(_86){
var _87=_86.document.selection;
if(_87){
var _88=_87.createRange();
_88.pasteHTML("<br/>");
_88.collapse(false);
_88.select();
}
};
}else{
var _89=!window.scrollX&&!window.scrollY;
select.markSelection=function(win){
var _8b=win.getSelection();
if(!_8b||_8b.rangeCount==0){
return null;
}
var _8c=_8b.getRangeAt(0);
var _8d={start:{node:_8c.startContainer,offset:_8c.startOffset},end:{node:_8c.endContainer,offset:_8c.endOffset},window:win,scrollX:_89&&win.document.body.scrollLeft,scrollY:_89&&win.document.body.scrollTop};
function normalize(_8e){
while(_8e.node.nodeType!=3&&_8e.node.nodeName!="BR"){
var _8f=_8e.node.childNodes[_8e.offset]||_8e.node.nextSibling;
_8e.offset=0;
while(!_8f&&_8e.node.parentNode){
_8e.node=_8e.node.parentNode;
_8f=_8e.node.nextSibling;
}
_8e.node=_8f;
if(!_8f){
break;
}
}
}
normalize(_8d.start);
normalize(_8d.end);
if(_8d.start.node){
_8d.start.node.selectStart=_8d.start;
}
if(_8d.end.node){
_8d.end.node.selectEnd=_8d.end;
}
return _8d;
};
function selectRange(_90,_91){
var _92=_91.getSelection();
_92.removeAllRanges();
_92.addRange(_90);
}
select.selectionTopNode=function(_93,_94){
var _95=_93.ownerDocument.defaultView.getSelection();
if(!_95||_95.rangeCount==0){
return false;
}
var _96=_95.getRangeAt(0);
var _97=_94?_96.startContainer:_96.endContainer;
var _98=_94?_96.startOffset:_96.endOffset;
if(_97.nodeType==3){
if(_98>0){
return topLevelNodeAt(_97,_93);
}else{
return topLevelNodeBefore(_97,_93);
}
}else{
if(_97.nodeName=="HTML"){
return (_98==1?null:_93.lastChild);
}else{
if(_97==_93){
return (_98==0)?null:_97.childNodes[_98-1];
}else{
if(_98==_97.childNodes.length){
return topLevelNodeAt(_97,_93);
}else{
if(_98==0){
return topLevelNodeBefore(_97,_93);
}else{
return topLevelNodeAt(_97.childNodes[_98-1],_93);
}
}
}
}
}
};
select.selectMarked=function(sel){
if(!sel){
return;
}
var win=sel.window;
var _9b=win.document.createRange();
function setPoint(_9c,_9d){
if(_9c.node){
delete _9c.node["select"+_9d];
if(_9c.offset==0){
_9b["set"+_9d+"Before"](_9c.node);
}else{
_9b["set"+_9d](_9c.node,_9c.offset);
}
}else{
_9b.setStartAfter(win.document.body.lastChild||win.document.body);
}
}
if(_89){
sel.window.document.body.scrollLeft=sel.scrollX;
sel.window.document.body.scrollTop=sel.scrollY;
}
setPoint(sel.end,"End");
setPoint(sel.start,"Start");
selectRange(_9b,win);
};
select.replaceSelection=function(_9e,_9f,_a0,_a1){
function replace(_a2){
var _a3=_9e["select"+_a2];
if(_a3){
if(_a3.offset>_a0){
_a3.offset-=_a0;
}else{
_9f["select"+_a2]=_a3;
delete _9e["select"+_a2];
_a3.node=_9f;
_a3.offset+=(_a1||0);
}
}
}
replace("Start");
replace("End");
};
select.focusAfterNode=function(_a4,_a5){
var win=_a5.ownerDocument.defaultView,range=win.document.createRange();
range.setStartBefore(_a5.firstChild||_a5);
if(_a4&&!_a4.firstChild){
range.setEndAfter(_a4);
}else{
if(_a4){
range.setEnd(_a4,_a4.childNodes.length);
}else{
range.setEndBefore(_a5.firstChild||_a5);
}
}
range.collapse(false);
selectRange(range,win);
};
select.insertNewlineAtCursor=function(_a7){
var _a8=_a7.getSelection();
if(_a8&&_a8.rangeCount>0){
var _a9=_a8.getRangeAt(0);
var br=withDocument(_a7.document,BR);
if(_a7.opera&&_a9.startContainer.nodeType==3&&_a9.startOffset!=0){
var _ab=_a9.startContainer,text=_ab.nodeValue;
_ab.parentNode.insertBefore(_a7.document.createTextNode(text.substr(0,_a9.startOffset)),_ab);
_ab.nodeValue=text.substr(_a9.startOffset);
_ab.parentNode.insertBefore(br,_ab);
}else{
_a9.insertNode(br);
}
_a9.setEndAfter(br);
_a9.collapse(false);
selectRange(_a9,_a7);
}
};
}
}());
var MirrorOptions=window.MirrorOptions||{};
setdefault(MirrorOptions,{stylesheet:"jscolors.css",parser:window.JavaScriptParser,linesPerPass:10,passDelay:300,width:"100%",height:"300px"});
var CodeMirror=function(){
var _ac={"P":true,"DIV":true,"LI":true};
function safeWhiteSpace(n){
var _ae=[],nb=true;
for(;n>0;n--){
_ae.push((nb || n == 1)?nbsp:" ");
nb=!nb;
}
return _ae.join("");
}
var _af=new RegExp("[\\t "+nbsp+"]{2,}|[\\t ]{2,}","g");
function splitSpaces(_b0){
return _b0.replace(_af,function(s){
return safeWhiteSpace(s.length);
});
}
function simplifyDOM(_b2){
var doc=_b2.ownerDocument;
var _b4=[];
var _b5=false;
function simplifyNode(_b6){
_b5=false;
if(_b6.nodeType==3){
_b6.nodeValue=splitSpaces(_b6.nodeValue.replace(/[\n\r]/g,""));
_b4.push(_b6);
}else{
if(_b6.nodeName=="BR"&&_b6.childNodes.length==0){
_b4.push(_b6);
}else{
forEach(_b6.childNodes,simplifyNode);
if(!_b5&&_ac.hasOwnProperty(_b6.nodeName)){
_b5=true;
_b4.push(withDocument(doc,BR));
}
}
}
}
simplifyNode(_b2);
return _b4;
}
function traverseDOM(_b7){
function yield(_b8,c){
cc=c;
return _b8;
}
function push(fun,arg,c){
return function(){
return fun(arg,c);
};
}
function stop(){
cc=stop;
throw StopIteration;
}
var cc=push(scanNode,_b7,stop);
var _be=_b7.ownerDocument;
function pointAt(_bf){
var _c0=_bf.parentNode;
var _c1=_bf.nextSibling;
if(_c1){
return function(_c2){
_c0.insertBefore(_c2,_c1);
};
}else{
return function(_c3){
_c0.appendChild(_c3);
};
}
}
var _c4=null;
function insertPart(_c5){
var _c6="\n";
if(_c5.nodeType==3){
_c6=_c5.nodeValue;
_c5=withDocument(_be,partial(SPAN,{"class":"part"},_c5));
_c5.currentText=_c6;
}
_c5.dirty=true;
_c4(_c5);
return _c6;
}
function writeNode(_c7,c){
var _c9=[];
forEach(simplifyDOM(_c7),function(_ca){
_c9.push(insertPart(_ca));
});
return yield(_c9.join(""),c);
}
function partNode(_cb){
if(_cb.nodeName=="SPAN"&&_cb.childNodes.length==1&&_cb.firstChild.nodeType==3){
_cb.currentText=_cb.firstChild.nodeValue;
return true;
}
return false;
}
function scanNode(_cc,c){
if(_cc.nextSibling){
c=push(scanNode,_cc.nextSibling,c);
}
if(partNode(_cc)){
return yield(_cc.currentText,c);
}else{
if(_cc.nodeName=="BR"){
return yield("\n",c);
}else{
_c4=pointAt(_cc);
removeElement(_cc);
return writeNode(_cc,c);
}
}
}
return {next:function(){
return cc();
}};
}
var _ce=new RegExp(nbsp,"g");
function startOfLine(_cf){
while(_cf&&_cf.nodeName!="BR"){
_cf=_cf.previousSibling;
}
return _cf;
}
function CodeMirror(_d0,_d1){
this.options=_d1||{};
setdefault(this.options,MirrorOptions);
this.frame=createDOM("IFRAME",{style:"border: 0; display: block; width: "+_d1.width+"; "+"height: "+_d1.height+";"});
if(_d0.appendChild){
_d0.appendChild(this.frame);
}else{
_d0(this.frame);
}
this.win=this.frame.contentWindow;
this.doc=this.win.document;
this.doc.designMode="on";
this.doc.open();
this.doc.write("<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\""+this.options.stylesheet+"\"/></head>"+"<body style=\"border-width: 0;\" class=\"editbox\" spellcheck=\"false\"></body></html>");
this.doc.close();
this.dirty=[];
if(this.doc.body){
this.init(_d1.content);
}else{
connect(this.frame,"onload",bind(function(){
disconnectAll(this.frame,"onload");
this.init(_d1.content);
},this));
}
}
var _d2={"KEY_ARROW_UP":true,"KEY_ARROW_DOWN":true,"KEY_ARROW_LEFT":true,"KEY_ARROW_RIGHT":true,"KEY_END":true,"KEY_HOME":true,"KEY_PAGE_UP":true,"KEY_PAGE_DOWN":true,"KEY_SHIFT":true,"KEY_CTRL":true,"KEY_ALT":true,"KEY_SELECT":true};
CodeMirror.prototype={init:function(_d3){
this.container=this.doc.body;
if(_d3){
this.importCode(_d3);
}
connect(this.doc,"onkeydown",method(this,"keyDown"));
connect(this.doc,"onkeypress",method(this,"keyPress"));
connect(this.doc,"onkeyup",method(this,"keyUp"));
},importCode:function(_d4){
replaceChildNodes(this.container);
var _d5=splitSpaces(_d4.replace(_ce," ")).replace(/\r\n?/g,"\n").split("\n");
for(var i=0;i!=_d5.length;i++){
if(i>0){
this.container.appendChild(withDocument(this.doc,BR));
}
var _d7=_d5[i];
if(_d7.length>0){
this.container.appendChild(this.doc.createTextNode(_d7));
}
}
if(this.container.firstChild){
this.addDirtyNode(this.container.firstChild);
this.scheduleHighlight();
}
},getCode:function(){
if(!this.container.firstChild){
return "";
}
var _d8=[];
forEach(traverseDOM(this.container.firstChild),method(_d8,"push"));
return _d8.join("").replace(_ce," ");
},keyDown:function(_d9){
var key=_d9.key().string;
if(key=="KEY_ENTER"){
if(_d9.modifier().ctrl){
this.reparseBuffer();
}else{
select.insertNewlineAtCursor(this.win);
this.indentAtCursor();
}
_d9.stop();
}else{
if(key=="KEY_TAB"){
this.handleTab();
_d9.stop();
}
}
},keyPress:function(_db){
var _dc=_db.event().keyCode,ch=_db.key().string;
var _dd=this.options.parser.electricChars;
if(window.opera&&(_dc==13||_dc==9)){
_db.stop();
}else{
if(_dd&&ch.length==1&&_dd.indexOf(ch)!=-1){
setTimeout(method(this,"indentAtCursor"),0);
}
}
},keyUp:function(_de){
if(!_d2.hasOwnProperty(_de.key().string)){
this.markCursorDirty();
}
},indentLineAfter:function(_df){
var _e0=_df?_df.nextSibling:this.container.firstChild;
if(_e0&&!hasClass(_e0,"whitespace")){
_e0=null;
}
var _e1=_e0?_e0.nextSibling:(_df?_df.nextSibling:this.container.firstChild);
var _e2=(_df&&_e1&&_e1.currentText)?_e1.currentText:"";
var _e3=_df?_df.indentation(_e2):0;
var _e4=_e3-(_e0?_e0.currentText.length:0);
if(_e4<0){
if(_e3==0){
removeElement(_e0);
_e0=null;
}else{
_e0.currentText=safeWhiteSpace(_e3);
_e0.firstChild.nodeValue=_e0.currentText;
}
}else{
if(_e4>0){
if(_e0){
_e0.currentText=safeWhiteSpace(_e3);
_e0.firstChild.nodeValue=_e0.currentText;
}else{
_e0=withDocument(this.doc,function(){
return SPAN({"class":"part whitespace"},safeWhiteSpace(_e3));
});
if(_df){
insertAfter(_e0,_df);
}else{
insertAtStart(_e0,this.containter);
}
}
}
}
return _e0;
},handleTab:function(){
var _e5=select.selectionTopNode(this.container,true),end=select.selectionTopNode(this.container,false);
if(_e5===false||end===false){
return;
}
if(_e5==end){
this.indentAtCursor();
}else{
this.indentSelection(_e5,end);
}
},indentAtCursor:function(){
if(!this.container.firstChild){
return;
}
var _e6=select.selectionTopNode(this.container,false);
if(_e6){
if(_e6.nodeType!=3){
_e6.dirty=true;
}
var sel=select.markSelection(this.win);
this.highlight(_e6);
select.selectMarked(sel);
_e6=select.selectionTopNode(this.container,false);
}
if(_e6===false){
return;
}
var _e8=startOfLine(_e6);
var _e9=this.indentLineAfter(_e8);
if(_e6==_e8&&_e9){
_e6=_e9;
}
if(_e6==_e9){
select.focusAfterNode(_e6,this.container);
}
},indentSelection:function(_ea,end){
var sel=select.markSelection(this.win);
if(!_ea){
this.indentLineAfter(_ea);
}else{
_ea=startOfLine(_ea.previousSibling);
}
while(_ea!=end){
var _ed=this.highlight(_ea,1);
var _ee=_ed?_ed.node:null;
while(_ea!=_ee&&_ea!=end){
_ea=_ea?_ea.nextSibling:this.container.firstChild;
}
if(_ea!=end){
if(_ee){
this.indentLineAfter(_ee);
}
}
}
select.selectMarked(sel);
},markCursorDirty:function(){
var _ef=select.selectionTopNode(this.container,false);
if(_ef!==false&&this.container.firstChild){
this.scheduleHighlight();
this.addDirtyNode(_ef||this.container.firstChild);
}
},reparseBuffer:function(){
forEach(this.container.childNodes,function(_f0){
_f0.dirty=true;
});
if(this.container.firstChild){
this.addDirtyNode(this.container.firstChild);
}
},addDirtyNode:function(_f1){
for(var i=0;i<this.dirty.length;i++){
if(this.dirty[i]==_f1){
return;
}
}
if(_f1.nodeType!=3){
_f1.dirty=true;
}
this.dirty.push(_f1);
},scheduleHighlight:function(){
clearTimeout(this.highlightTimeout);
this.highlightTimeout=setTimeout(bind(this.highlightDirty,this),this.options.passDelay);
},getDirtyNode:function(){
while(this.dirty.length>0){
var _f3=this.dirty.pop();
if((_f3.dirty||_f3.nodeType==3)&&_f3.parentNode){
return _f3;
}
}
return null;
},highlightDirty:function(){
var _f4=this.options.linesPerPass;
var sel=select.markSelection(this.win);
var _f6;
while(_f4>0&&(_f6=this.getDirtyNode())){
var _f7=this.highlight(_f6,_f4);
if(_f7){
_f4=_f7.left;
if(_f7.node&&_f7.dirty){
this.addDirtyNode(_f7.node);
}
}
}
select.selectMarked(sel);
if(_f6){
this.scheduleHighlight();
}
},highlight:function(_f8,_f9){
var _fa=this.container;
var _fb=this.doc;
if(!_fa.firstChild){
return;
}
while(_f8&&!_f8.parserFromHere){
_f8=_f8.previousSibling;
}
if(_f8&&!_f8.nextSibling){
return;
}
function correctPart(_fc,_fd){
return !_fd.reduced&&_fd.currentText==_fc.value&&hasClass(_fd,_fc.style);
}
function shortenPart(_fe,_ff){
_fe.currentText=_fe.currentText.substring(_ff);
_fe.reduced=true;
}
function tokenPart(_100){
var part=withDocument(_fb,partial(SPAN,{"class":"part "+_100.style},_100.value));
part.currentText=_100.value;
return part;
}
var _102=_f8?_f8.parserFromHere(multiStringStream(traverseDOM(_f8.nextSibling))):this.options.parser.make(multiStringStream(traverseDOM(_fa.firstChild)));
var _103={current:null,forward:false,get:function(){
if(!this.current){
this.current=_f8?_f8.nextSibling:_fa.firstChild;
}else{
if(this.forward){
this.current=this.current.nextSibling;
}
}
this.forward=false;
return this.current;
},next:function(){
if(this.forward){
this.get();
}
this.forward=true;
},remove:function(){
this.current=this.get().previousSibling;
_fa.removeChild(this.current?this.current.nextSibling:_fa.firstChild);
this.forward=true;
},nextNonEmpty:function(){
var part=this.get();
while(part.nodeName=="SPAN"&&part.currentText==""){
var old=part;
this.remove();
part=this.get();
select.replaceSelection(old.firstChild,part.firstChild||part,0,0);
}
return part;
}};
var _106=false;
forEach(_102,function(_107){
var part=_103.nextNonEmpty();
if(_107.value=="\n"){
if(part.nodeName!="BR"){
throw "Parser out of sync. Expected BR.";
}
if(part.dirty||!part.indentation){
_106=true;
}
part.parserFromHere=_102.copy();
part.indentation=_107.indentation;
part.dirty=false;
if((_f9!==undefined&&--_f9<=0)||!_106){
throw StopIteration;
}
_106=false;
_103.next();
}else{
if(part.nodeName!="SPAN"){
throw "Parser out of sync. Expected SPAN.";
}
if(part.dirty){
_106=true;
}
if(correctPart(_107,part)){
part.dirty=false;
_103.next();
}else{
_106=true;
var _109=tokenPart(_107);
_fa.insertBefore(_109,part);
var _10a=_107.value.length;
var _10b=0;
while(_10a>0){
part=_103.get();
var _10c=part.currentText.length;
select.replaceSelection(part.firstChild,_109.firstChild,_10a,_10b);
if(_10c>_10a){
shortenPart(part,_10a);
_10a=0;
}else{
_10a-=_10c;
_10b+=_10c;
_103.remove();
}
}
}
}
});
return {left:_f9,node:_103.get(),dirty:_106};
}};
return CodeMirror;
}();

//- bookutil.js

function stripPath(url){
  var slash = url.lastIndexOf("/");
  return (slash == -1) ? url : url.slice(slash + 1);
}

var decentEval = function () {
  window.eval("var __TEST = true;");
  var found = window.__TEST === true;
  if (found)
    delete window.__TEST;
  return found;
}();

function addPoint(a, b) {
  return {x: a.x + b.x, y: a.y + b.y};
}

function placeElement(e, p) {
  setElementPosition(e, p);
  setElementDimensions(e, p);
}

var dimMode = function(){
  var mode = undefined;
  return function(){
    if (mode == undefined) {
      var test = DIV(null, "q");
      test.style.width = "100px";
      test.style.borderWidth = "5px";
      test.style.borderStyle = "solid";
      test.style.visibility = "hidden";
      document.body.appendChild(test);
      mode = test.offsetWidth == 100 ? "precise" : "standard";
      removeElement(test);
    }
    return mode;
  }
}();

function growElement(node) {
  setElementDimensions(node, {w: node.parentNode.clientWidth, h: node.parentNode.clientHeight});
}

function centerElement(node, pos) {
  setElementPosition(node, {x: pos.x - node.offsetWidth / 2, y: pos.y - node.offsetHeight / 2});
}

function attach(event, func) {
  return function(element){connect(element, event, func);};
}

function scrollToBottom(element) {
  element.scrollTop = element.scrollHeight - element.clientHeight;
}

function disconnectTree(root) {
  disconnectAll(root);
  if (root.childNodes)
    forEach(root.childNodes, disconnectTree);
}

var browserIsIE = document.all && window.ActiveXObject;
var preNewline = browserIsIE ? "\r" : "\n";

function probablyAnArray(value) {
  try {
    return value && typeof value == "object" &&
      typeof value.length == "number" && typeof value.splice == "function";
  } catch (e) {return false;}
}

function probablyARegexp(value) {
  try {
    return value && typeof value == "object" &&
      typeof value.ignoreCase == "boolean" && typeof value.compile == "function";
  } catch (e) {return false;}
}

function probablyADOMNode(value) {
  try {
    return value && typeof value == "object" &&
      value.previousSibling !== undefined &&
      (value.nodeType == 3 || value.nodeType == 1);
  } catch (e) {return false;}
}

function isAccessibleWindow(win) {
  try {
    return win && typeof win == "object" && win.document && win.document.nodeType == 9;
  } catch (e) {return false;}
}

function trim(string) {
  return string.match(/^\s*(.*)\s*$/)[1];
}

function getCookie(name, def) {
  var cookies = document.cookie.split(";");
  for (var i = 0; i < cookies.length; i++) {
    var parts = cookies[i].split("=");
    if (trim(parts[0]) == name)
      return parts[1];
  }
  return def;
}

function setCookie(name, value) {
  document.cookie = name + "=" + value + "; expires=" + (new Date(2030, 0, 1)).toGMTString();
}

//- initenv.js

var htmlTable = [];

function initEnvironment(win, output, callback) {
  var feed = (win.execScript ? function(code) {win.execScript(code);} : function(code) {win.__setTimeout(code, 0);});

  function wrapCode(before, after, code) {
    env.code = code;
    return "__setTimeout(__ENV.callback, 0); try{" + before + "__ENV.code" + after +"}catch(e){__ENV.error(e);}";
  }

  function run(code, showResult) {
    if (showResult) 
      feed(wrapCode("$r = eval(", "); if ($r !== undefined) " + showResult + "($r);", code));
    else
      feed(wrapCode("eval(", ");", code));
  }

  function error(err) {
    env.output(DIV(null, "Exception: ", env.format(err)));
    if (err.stack) {
      var stack = err.stack.split("\n");
      for (var i = 0; i < env.maxStackTrace && i < stack.length; i++) {
        var part = stack[i], at = part.indexOf("@");
        if (at > 1 && part.slice(0, 5) != "eval(")
          win.print("  in function " + part.slice(0, at));
      };
      if (stack.length > env.maxStackTrace)
        win.print("  [...]")
    }
  };

  var env = {
    output: method(output, "append"),
    format: method(output, "summarize"),
    parent: window,
    maxStackTrace: 10,
    error: error,
    run: run,
    callback: callback,
    code: null
  };
  win.__ENV = env;

  win.load = function(file) {
    win.document.body.appendChild(withDocument(win.document, function(){
      return createDOM("SCRIPT", {type: "text/javascript", src: /$http:\/\//.test(file) ? file : "js/" + file});
    }));
  };

  win.print = function() {
    var accum = [];
    for (var i = 0; i != arguments.length; i++)
      accum.push(String(arguments[i]));
    var joined = accum.join("");
    env.output(DIV(null, preNewline != "\n" ? joined.replace(/\n/g, preNewline) : joined));
  };

  win.show = function(x) {
    env.output(DIV(null, env.format(x)));
  };

  win.viewHTML = function(html) {
    htmlTable.push(String(html));
    var result = window.open("view.html?id=" + (htmlTable.length - 1));
    if (!result)
      alert("There seems to be a popup-blocker stopping this page from opening new windows. Try turning it off first.");
    return result;
  };

  function wrapAction(action) {
    if (typeof action == "string")
      return "try{" + action + "}catch(e){__ENV.error(e);}";
    else
      return function(){try{action();}catch(e){env.error(e);}};
  }

  // Apparantly, the .call and .apply methods of setTimeout and
  // setInterval don't quite work on IE, so we rename them and call
  // them directly.
  win.__setTimeout = win.setTimeout;
  win.__setInterval = win.setInterval;

  win.setTimeout = function(action, interval) {
    return win.__setTimeout(wrapAction(action), interval);
  };

  win.setInterval = function(action, interval) {
    return win.__setInterval(wrapAction(action), interval);
  };

  // For some strange reason, this *has* to be executed from the
  // window itself, or creating the Error object fails (in IE).
  win.__setTimeout("if (/^\\[object/.test((new Error(\"...\")).toString())) " +
                   "Error.prototype.toString = function(){return this.name + \": \" + this.message;};", 0);
}

//- env.js

var ie = document.selection && window.ActiveXObject && /MSIE \d+/.test(navigator.userAgent);
var iphone = /AppleWebKit/.test(navigator.userAgent) && /iP[oa]d|iPhone/.test(navigator.userAgent);

function makeFrame(place, init) {
  var frame = createDOM("IFRAME", {"style": "border-width: 0; display: none;"});
  (place || document.body).appendChild(frame);

  var fdoc = frame.contentWindow.document;
  fdoc.open();
  fdoc.write("<html><head><title>Default</title></head><body style=\"border-width: 0\"></body></html>");
  fdoc.close();

  if (init) {
    if (fdoc.body)
      init(frame);
    else
      connect(frame, "onload", function(){disconnectAll(frame, "onload"); init(frame);});
  }
  return frame;
}

function checkAppVersion(minimum){
  if (typeof navigator.appVersion != "string") return false;
  var parts = navigator.appVersion.split(" ");
  return parts.length > 0 && Number(parts[0]) >= minimum;
}
var useJSEditor = true;
if (iphone) useJSEditor = false;

function Buffer(name, content, where){
  if (useJSEditor){
    var self = this;
    this.editor = new CodeMirror(function(node){
      self.node = node;
      where.appendChild(node);
    }, {content: content, stylesheet: "css/highlight.css"});
  }
  else {
    this.node = TEXTAREA({spellcheck: false}, content);
    where.appendChild(this.node);
  }
  growElement(this.node);
  this.name = name;
}

Buffer.prototype = {
  show: function() {
    showElement(this.node);
  },
  hide: function() {
    hideElement(this.node);
  },
  remove: function() {
    removeElement(this.node);
  },
  getCode: function() {
    if (useJSEditor)
      return this.editor.getCode();
    else
      return this.node.value;
  }
};

function History(){
  this.history = [];
  this.pos = 0;
  this.current = "";
}

History.prototype = {
  push: function(line) {
    this.history.push(line);
    if (this.history.length > 150)
      this.history = this.history.slice(0, 100);
    this.pos = this.history.length;
  },
  move: function(dir, from) {
    if (this.pos == this.history.length)
      this.current = from;
    else
      this.history[this.pos] = from;

    this.pos = (this.pos + dir) % (this.history.length + 1);
    if (this.pos < 0) // JS' modulo is a bit impractical when dealing with negative numbers
      this.pos += (this.history.length + 1);

    if (this.pos == this.history.length)
      return this.current;
    else
      return this.history[this.pos];
  }
};

var dotdotdot = "\u2026";

function summarize(element, depth) {
  depth = depth || 0;
  var maxLength = depth == 0 ? 50 : 10;
  var self = this;

  function nodeLength(node) {
    if (node.nodeType == 3)
      return node.nodeValue.length;
    else
      return sum(map(nodeLength, node.childNodes));
  }
  function span(className, content, onclick) {
    var result = SPAN({"class": className}, content);
    if (onclick) {
      connect(result, "onclick", function(event) {
        onclick();
        event.stop();
      });
    }
    return result;
  }
  function objectHasProperties(object) {
    for (var x in object)
      return true;
    return false;
  }
  // Some mystery objects in IE throw an exception when you try to
  // enumerate them.
  function objectIsEnumerable(object) {
    try {
      for (var x in object)
        return true;
      return true;
    }
    catch (e) {
      return false;
    }
  }

  function formatFunc(value) {
    var regexp = /^\s*function ?([^\(]*)?\(([^\(]*)\)/;
    var match = String(value).match(regexp);
    return span("functionvalue", match ? "<function " + (match[1] || "") + "(" + match[2] + ")>" : "<function>");
  }
  function formatArray(value) {
    var content = ["["], length = 2;
    if (depth > 1) {
      if (value.length > 0)
        content.push(dotdotdot);
    }
    else {
      for (var i = 0; i < value.length; i++) {
        var last = i == value.length - 1;
        var summary = self.summarize(value[i], depth + 1);
        var summaryLength = nodeLength(summary);
        if (length + summaryLength + (last ? 0 : 3) <= maxLength) {
          content.push(summary);
          length += summaryLength;
        }
        else {
          content.push(dotdotdot);
          break;
        }
        if (!last)
          content.push(", ");
      }
    }
    content.push("]");
    return span("arrayvalue", content, bind(self.expand, self, value));
  }
  function formatDOMNode(value) {
    if (value.nodeType == 3)
      return value.nodeValue.replace("\n", "\\n");
    var accum = ["<", value.nodeName.toLowerCase()];
    if (value.attributes) {
      forEach(value.attributes, function(attr) {
        if (attr.specified && typeof attr.nodeValue == "string") {
          accum.push(" " + attr.nodeName.toLowerCase() + "=" + serializeJSON(attr.nodeValue));
        }
      });
    }
    accum.push(">");
    return accum.join("");
  }
  function formatObject(value) {
    var asString = (probablyADOMNode(value) ? formatDOMNode(value) : value + "");
    if (/^\[object.*\]$/.test(asString))
      return formatPlainObject(value);
    else
      return span("objectvalue", asString, bind(self.expand, self, value));
  }
  function formatPlainObject(value) {
    var content = ["{"], length = 2, elements = [], first = true;
    if (depth > 1) {
      if (objectIsEnumerable(value) && objectHasProperties(value))
        content.push(dotdotdot);
    }
    else if (objectIsEnumerable(value)) {
      for (var name in value) {
        var skip = true;
        // Firefox has a nasty habit of throwing 'not implemented' or 'security'
        // exceptions when accessing certain properties in window and document.
        try {
          var element = value[name];
          skip = false;
        }
        catch (e) {}
        if (!skip) {
          if (first) {
            first = false;
          }
          else {
            content.push(", ");
            length += 2;
          }
          var summary = self.summarize(element, depth + 1);
          var elementLength = nodeLength(summary) + 2 + name.length;
          if (length + elementLength <= maxLength) {
            content.push(name + ": ");
            content.push(summary);
            length += elementLength;
          }
          else {
            content.push(dotdotdot);
            break;
          }
        }
      }
    }
    content.push("}");
    return span("objectvalue", content, bind(self.expand, self, value));
  }
  function formatString(value){
    return span("stringvalue", serializeJSON(value));
  }
  function formatAtom(value) {
    return span("atomvalue", String(value));
  }

  var type = typeof element;
  // Regexps report their type as function, but that is a lousy way to
  // display them.
  if (probablyARegexp(element))
    type = "object";
  if (type == "function")
    return formatFunc(element);
  else if (type == "object" && element != null) {
    // Some IE built-in functions report their type as "object"
    // Also, the navigator object in IE can not be passed to the String function. Gah.
    if (browserIsIE && ("" + element).match(/function .*/))
      return formatFunc(element);
    else if (probablyAnArray(element))
      return formatArray(element);
    else
      return formatObject(element);
  }
  else if (type == "string")
    return formatString(element);
  else
    return formatAtom(element);
}

function inspect(value) {
  function cutOff(name) {
    if (name.length > 22)
      return name.slice(0, 21) + dotdotdot;
    else
      return name;
  }
  
  var tbody = TBODY();
  if (probablyAnArray(value)) {
    for (var i = 0; i < value.length; i++)
      tbody.appendChild(TR(null, TH(null, i + ":"), TD(null, this.summarize(value[i], 1))));
  }
  else {
    var elements = [];
    for (var name in value) {
      var skip = true;
      try {
        var element = value[name];
        skip = false;
      }
      catch(e) {}
      if (!skip)
        tbody.appendChild(TR(null, TH(null, cutOff(name) + ":"), TD(null, this.summarize(element, 1))));
    }
  }
  return TABLE({"class": "objecttable"}, tbody);
}

function Output(place, parent) {
  this.place = place;
  this.scrollPos = 0;
  this.stack = [];
  this.parent = parent;

  this.outhead = DIV({"class": "outputhead"},
                     DIV({"class": "outputbutton", "title": "Clear output"}, "\u263C",
                         attach("onclick", method(this, "clear"))),
                     "Output:");
  this.out = PRE(), this.show = PRE();
  this.scroll = DIV({"class": "outputinner", "id": "outputinner"}, this.out);
  this.showhead = DIV({"class": "outputhead"},
                      DIV({"class": "outputbutton", "title": "Store this value in $i"}, "$",
                          attach("onclick", method(this, "copy"))),
                      DIV({"class": "outputbutton", "title": "Close inspect view"}, "\u00D7",
                          attach("onclick", method(this, "close"))),
                      DIV({"class": "outputbutton", "title": "Back"}, "\u2190",
                          attach("onclick", method(this, "back"))),
                     "View object");
  replaceChildNodes(this.place, this.outhead, this.scroll);
}

Output.prototype = {
  append: function(node) {
    this.out.appendChild(node);
    if (this.stack.length == 0)
      scrollToBottom(this.scroll);
  },
  clear: function() {
    disconnectTree(this.out);
    replaceChildNodes(this.out);
  },
  expand: function(value) {
    if (this.stack.length == 0) {
      this.scrollPos = this.scroll.scrollTop;
      this.place.replaceChild(this.showhead, this.outhead);
      this.scroll.replaceChild(this.show, this.out);
    }
    this.stack.push(value);
    this.display(value);
  },
  display: function(value) {
    disconnectTree(this.show);
    this.scroll.scrollTop = 0;
    replaceChildNodes(this.show, this.inspect(value));
  },
  close: function() {
    this.place.replaceChild(this.outhead, this.showhead);
    this.scroll.replaceChild(this.out, this.show);
    this.scroll.scrollTop = this.scrollPos;
    this.stack = [];
  },
  back: function() {
    this.stack.pop();
    if (this.stack.length == 0)
      this.close();
    else
      this.display(this.stack[this.stack.length - 1]);
  },
  copy: function() {
    if (this.parent.env)
      this.parent.env.$i = this.stack[this.stack.length - 1];
  },
  summarize: summarize,
  inspect: inspect
};

function Console(param) {
  var active, self = this, frame = null;
  var history = new History();
  var out = new Output(param.output, this);
  var baseEnv, codeStream = [], streaming = false;
  resetEnvironment();

  function showBuffer(buffer) {
    if (active)
      active.hide();
    active = buffer;
    active.show();
    return active;
  }

  function runCode(code, showResult) {
    if (self.env && !self.env.__ENV) {
      self.env = baseEnv;
      self.env.print("Lost attached window, detaching.");
    }

    if (streaming || !self.env) {
      codeStream.push({code: code, show: showResult});
    }
    else {
      streaming = true;
      self.env.__ENV.run(code, showResult);
    }
  }
  // Because the window that code must be sent to can change, code
  // must only be sent when the code before it has finished running.
  // Hence this callback.
  function runCallback() {
    if (codeStream.length > 0 && self.env) {
      var code = codeStream.shift();
      self.env.__ENV.run(code.code, code.show);
    }
    else {
      streaming = false;
    }
  }
  function setEnvironment(win) {
    self.env = win;
    if (win && !streaming && codeStream.length > 0)
      runCallback();
  }

  var buffers = SELECT({"class": "buffers"});
  replaceChildNodes(
    param.controls,
    BUTTON({title: "Run the code in this buffer", "type": "button"},
           "Run", attach("onclick", function(){runCode(active.getCode(), false);})),
    buffers,
    BUTTON({title: "New buffer", "type": "button"}, "New", attach("onclick", createBuffer)),
    BUTTON({title: "Load a file as a new buffer", "type": "button"}, "Load", attach("onclick", loadFile)),
    BUTTON({title: "Close this buffer", "type": "button"}, "Close", attach("onclick", closeBuffer)),
    BUTTON({title: "Reset the console environment", "type": "button"}, "Reset", attach("onclick", resetEnvironment)));
  connect(buffers, "onchange", function(){
    showBuffer(buffers.options[buffers.selectedIndex].buffer);
  });
  var repl = INPUT({"type": "text"});
  replaceChildNodes(param.repl, repl);
  connect(repl, "onkeydown", lineKey);

  function bufferName(name){
    function exists(name) {
      return some(buffers.childNodes, function(option){return option.text == name;});
    }
    if (!exists(name)) return name;
    for (var i = 2; ; i++) {
      var newName = name + "(" + i + ")";
      if (!exists(newName)) return newName;
    }
  }

  function addBuffer(name, content){
    var option = OPTION(null, bufferName(name));
    buffers.appendChild(option);
    option.selected = true;
    option.buffer = new Buffer(name, content || "", param.editor);
    return showBuffer(option.buffer);
  }
  function createBuffer(){
    var name = prompt("Enter a name for the new buffer", "");
    if (name)
      addBuffer(name);
  }
  function closeBuffer(){
    if (buffers.selectedIndex != -1) {
      buffers.removeChild(buffers.childNodes[buffers.selectedIndex]);
      active.remove();
      if (buffers.firstChild){
        active = buffers.firstChild.buffer;
        buffers.firstChild.selected = true;
        active.show();
      }
      else {
        active = null;
      }
    }
  }
  function loadFile(){
    var filename = prompt("Enter a filename or URL", "");
    if (filename) {
      var simplename = stripPath(filename);
      if (!/^http:\/\//.test(filename))
        filename = "js/" + filename;
      var defer = doXHR(filename);
      defer.addCallback(function(xhr){addBuffer(simplename, xhr.responseText);});
      defer.addErrback(function(){alert("File '" + simplename + "' could not be loaded.");});
    }
  }

  function attachEnvironment(win) {
    function detach() {
      if (self.env == win) {
        var title = self.env.document.title;
        setEnvironment(baseEnv);
        self.env.print("Detaching from window '", title || "[unnamed]", "'.");
      }
    }
    function attach() {
      if (!win.__ENV)
        initEnvironment(win, out, runCallback);
      win.detach = detach;
      var unload = connect(win, "onunload", detach);
      connect(window, "onunload", function(){disconnect(unload);});
      setEnvironment(win);
      self.env.print("Attaching to window '", win.document.title || "[unnamed]", "'.");
    }

    if (isAccessibleWindow(win)) {
      connect(win, "onload", attach);
      // When immediately attaching to a newly created window, wait
      // until onload, or strange things happen.
      self.env = null;
      if (win.document.body && (win.document.body.childNodes.length > 0 || win.document.title != ""))
        attach();
    }
    else {
      self.env.print("Not an accessible window.");
    }
  }

  function resetEnvironment(){
    if (frame)
      removeElement(frame);
    frame = makeFrame(param.framePlace, function(frame){
      baseEnv = frame.contentWindow;
      initEnvironment(baseEnv, out, runCallback);
      baseEnv.attach = attachEnvironment;
      if (param.initEnv)
        param.initEnv(baseEnv);
      setEnvironment(baseEnv);
    });
  }

  function evalLine(){
    var line = repl.value;
    repl.value = "";
    history.push(line);
    runCode(line, "show");
  }
  function getHistory(dir){
    repl.value = history.move(dir, repl.value);
  }

  // Opera generates events for the '(' and '&' keys that are pretty
  // much the same as those for arrow down and up. So, to
  // disambiguate, we disallow shift when those are pressed.
  function lineKey(event){
    var keyObj = event.key(), key = keyObj.string;
    var shift = event.modifier().shift;
    if (key == "KEY_ENTER" || keyObj.code == 10)
      evalLine();
    else if (key == "KEY_ARROW_UP" && !shift)
      getHistory(-1);
    else if (key == "KEY_ARROW_DOWN" && !shift)
      getHistory(1);
    else
      return;
    event.stop();
  }

  addBuffer("*scratch*");

  this.loadCode = addBuffer;
  this.runCode = function(code){runCode(code, false);};
  this.evalCode = function(code){runCode(code, "show");};
  this.printCode = function(code){runCode(code, "print");};
}

connect(window, "onload", function() {
  if (/^\[object/.test((new Error("...")).toString()))
    Error.prototype.toString = function(){return this.name + ": " + this.message;};
});

//- book.js

// This code assumes a 1px border around the console, repl, output,
// and editor elements.
var _console = null;

var processPage = function(){
  function hideSolutions() {
    forEach(getElementsByTagAndClassName("div", "solution"), function(solution) {
      solution.style.display = "none";

      var showToggle = DIV({"class": "toggle"}, "[show solution]");
      connect(showToggle, "onclick", function() {
	showToggle.style.display = "none";
	solution.style.display = "";
      });
      solution.parentNode.insertBefore(showToggle, solution);

      var hideToggle = DIV({"class": "solutionarrow", title: "Hide the solution."}, "\u00D7");
      connect(hideToggle, "onclick", function() {
	showToggle.style.display = "";
	solution.style.display = "none";
      });
      solution.insertBefore(hideToggle, solution.firstChild);
    });
  }

  function positionFloater(element, pos) {
    var minWidth = 600;
    var winWidth = getViewportDimensions().w;
    pos.x = Math.min(pos.x, winWidth - minWidth);
    setElementDimensions(element, {w: winWidth - pos.x - 35});
    setElementPosition(element, pos);
  }

  function moveFootnotes() {
    var notelist = getFirstElementByTagAndClassName("ol", "footnotes");
    if (!notelist)
      return;

    function moveNote(note, ref) {
      var floater = DIV({"class": "floater footnotefloat"}, note.childNodes);
      floater.style.display = "none";
      document.body.appendChild(floater);
      var newRef = SPAN({"class": "footref"}, ref.firstChild);
      ref.parentNode.replaceChild(newRef, ref);
      connect(newRef, "onmouseover", function(event) {
        positionFloater(floater, addPoint(event.mouse().page, {x: 5, y: 10}));
        floater.style.display = "block";
      });
      connect(newRef, "onmouseout", function() {
        floater.style.display = "none";
      });
    }

    var notes = notelist.childNodes;
    var refs = getElementsByTagAndClassName("a", "footref");
    for (var i = 0; i < notes.length; i++)
      moveNote(notes[i], refs[i]);
    removeElement(notelist);
  }

  function getCode(code){
    function flattenNode(node){
      if (node.nodeType == 3)
        return node.nodeValue;
      else if (node.nodeName == "SPAN")
        return node.firstChild.nodeValue;
      else
        return "";
    }
    return map(flattenNode, code.childNodes).join("");
  }

  function runCodeUpto(code) {
    var fragments = [];
    while (code) {
      removeElementClass(code, "not-run");
      fragments.push(getCode(code));
      code = code.prev;
    }
    for (var i = fragments.length - 1; i >= 0; i--)
      _console.runCode(fragments[i]);
  }

  function addCodeButtons(){
    var prev = null;
    forEach(getElementsByTagAndClassName("pre", "code"), function(code) {
      addElementClass(code, "not-run");
      var expr = hasClass(code, "expression");
      var runUpto = !(expr || hasClass(code, "invalid"));
      if (runUpto) {
        code.prev = prev;
        prev = code;
      }

      if (!expr) {
        var load = insertAtStart(BUTTON({"class": "codebutton load", "type": "button", "title": "Load this code into the console"}), code);
        connect(load, "onclick", function(){
          setOpen(true);
          _console.loadCode("example", getCode(code));
        });
      }

      var run = insertAtStart(BUTTON({"class": "codebutton run", "title": "Run this code", "type": "button"}), code);
      connect(run, "onclick", function(event){
        removeElementClass(code, "not-run");
        setOpen(true);
        if (runUpto && event.modifier().shift)
          runCodeUpto(code);
        else
          _console[expr ? "printCode" : "runCode"](getCode(code));
      });
    });
  }

  var popup = null;
  function react() {
    if (popup) {
      closeReaction();
      return;
    }

    var name = INPUT({value: getCookie("name", ""), type: "text"}),
        email = INPUT({value: getCookie("email", ""), type: "text"}),
        subject = INPUT({value: "", type: "text"}),
        message = TEXTAREA(null, "");
    popup = DIV({"class": "reactpopup"},
                P(null, "Send me a message..."),
                P(null, SPAN(null, "Your name:"), name),
                P(null, SPAN(null, "Your e-mail:"), email),
                P(null, SPAN(null, "Subject:"), subject),
                P(null, message),
                P(null,
                  BUTTON({type: "button"}, "Send", attach("onclick", sendReaction)), " ",
                  BUTTON({type: "button"}, "Cancel", attach("onclick", closeReaction))));
    document.body.appendChild(popup);
    name.focus();

    function sendByXHR() {
      var data = queryString({name: name.value, email: email.value, message: message.value,
                              subject: subject.value, chapter: chapterTag});
      request = doXHR("/contact", {method: "POST", sendContent: data,
                                  headers: {"Content-type": "application/x-www-form-urlencoded; charset=utf-8",
                                            "Content-length": data.length,
                                            "Connection": "close"}});
      function fail(reason) {
        alert("Could not deliver your message. (" + reason + ")");
      }
      request.addErrback(function(xhr){
        fail((err.xhr && err.xhr.statusText) || err.message);
      });
      request.addCallback(function(xhr) {
        if (xhr.responseText != "ok")
          fail(xhr.responseText);
      });
    }
    function sendByIFrame() {
      var frame = createDOM("IFRAME", {style: "border-width: 0; position: absolute; width: 1px; height: 1px; top: 0px;",
                                       src: "js/sendreaction.html"});
      connect(frame, "onload", function() {
        var win = frame.contentWindow;
        var form = win.document.getElementById("form");
        form.elements.name.value = name.value;
        form.elements.email.value = email.value;
        form.elements.chapter.value = chapterTag;
        form.elements.message.value = message.value;
        form.elements.subject.value = subject.value;
        form.submit();
        setTimeout(partial(removeElement, frame), 10000);
      });
      document.body.appendChild(frame);
    }

    function sendReaction() {
      if (message.value == "") {
        alert("You did not enter a message.");
        return;
      }

      if (!/\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b/.test(email.value) && !confirm("If you do not enter a valid e-mail address, I will probably ignore you. Send anyway?"))
        return;

      setCookie("name", name.value);
      setCookie("email", email.value);

      if (/eloquentjavascript\.net/.test(document.domain))
        sendByXHR();
      else
        sendByIFrame();
      closeReaction();
    }
    function closeReaction() {
      removeElement(popup);
      popup = null
    }
  }

  function addReactButton() {
    var b = BUTTON({type: "button", "class": "react",
                    title: "Send me a message"},
                    attach("onclick", react));
    document.body.appendChild(b);
    if (fixedConsole) b.style.position = "fixed";
  }

  var fixedConsole = !ie;
  var fakeFixed = iphone, inputFocused = false;
  var open = true;
  var contentRatio = Number(getCookie("contentRatio", .75));
  var topBar = 13;
  var sizeCorrection = dimMode() == "standard" ? -2 : 0;
  var minContentWidth = 700;

  function setContentRatio(consoleHeight) {
    var winHeight = getViewportDimensions().h;
    contentRatio = (winHeight - consoleHeight) / winHeight;
    setCookie("contentRatio", String(contentRatio));
  }

  function alignConsole() {
    if (fakeFixed) {
      if (!iphone || !inputFocused)
        $("console").style.bottom = "-" + (iphone ? window.pageYOffset : document.body.scrollTop) + "px";
    }
    else {
      $("console").style.bottom = "0px";
    }
  }

  function resizeFrames() {
    var winSize = getViewportDimensions();
    if (open) {
      var consoleSize = Math.max(minSize, Math.round(winSize.h * (1.0 - contentRatio)));
      if (fixedConsole)
        $("consoleCompensation").style.height = consoleSize + "px";
      else
        setElementDimensions($("content"), {h: Math.max(0, winSize.h - 1 - consoleSize)});
      setElementDimensions($("console"), {h: consoleSize + sizeCorrection,
                                          w: fixedConsole ? document.body.clientWidth : winSize.w + sizeCorrection});
      resizeConsole();
    }
    else {
      if (fixedConsole) {
        $("consoleCompensation").style.height = "0px";
        $("console").style.height = topBar + "px";
      }
      else {
        setElementDimensions($("content"), {h: winSize.h - topBar + sizeCorrection});
      }
      setElementDimensions($("console"), {h: topBar,
                                          w: fixedConsole ? document.body.clientWidth : winSize.w + sizeCorrection});
    }
    if (fixedConsole) alignConsole();
  }

  function addConsole() {
    if (fixedConsole) {
      document.body.appendChild(DIV({"class": "frame console" + (open ? " open" : ""), "id": "console"}));
      document.getElementsByClassName("content")[0].id = "content";
      $("console").style.position = fakeFixed ? "absolute" : "fixed";
      alignConsole();
      document.body.appendChild(DIV({id: "consoleCompensation"}));
    }
    else {
      document.body.appendChild(DIV({"class": "frame", "id": "content"}, document.body.childNodes[1]));
      document.body.appendChild(DIV({"class": "frame console" + (open ? " open" : ""), "id": "console"}));
      document.body.style.overflow = "hidden"; 
    }
    initConsole($("console"));
    setOpen(false);
    connect(window, "onresize", resizeFrames);

    if (!fixedConsole) {
      window.onscroll = function() {
        if (document.body.scrollTop > 0) {
	  $("content").scrollTop += document.body.scrollTop;
          document.body.scrollTop = 0;
	  $("content").focus();
        }
      };
    }
    else if (fakeFixed) {
      window.onscroll = alignConsole;
//      setInterval(alignConsole, 200);
      if (iphone) {
        function trackFocus(node) {
          node.onfocus = function(){inputFocused = true;};
          node.onblur = function(){inputFocused = false;};
        }
        trackFocus($("repl").firstChild);
        trackFocus($("editor").firstChild);
      }
    }
  }

  var minSize = 120;

  function resizeConsole() {
    var margin = 6;
    var leftRatio = .4;
    var width = fixedConsole ? document.body.clientWidth : $("console").clientWidth;
    var height = $("console").clientHeight;

    var bottomHeight = Math.max($("repl").offsetHeight, $("controls").offsetHeight);
    var topHeight = height - topBar - 2 * margin - bottomHeight;

    var innerWidth = width - 3 * margin;
    var leftWidth = Math.round(leftRatio * innerWidth);
    var rightWidth = innerWidth - leftWidth;

    var output = $("output"), editor = $("editor");

    placeElement(output, {x: margin, y: topBar, w: leftWidth + sizeCorrection, h: topHeight + sizeCorrection});
    placeElement($("repl"), {x: margin, y: topBar + margin + topHeight, w: leftWidth + sizeCorrection});
    setElementDimensions($("repl").firstChild, {w: $("repl").clientWidth});

    placeElement(editor, {x: 2 * margin + leftWidth, y: topBar, w: rightWidth + sizeCorrection, h: topHeight + sizeCorrection});
    placeElement($("controls"), {x: 2 * margin + leftWidth, y: topBar + margin + topHeight, w: rightWidth});

    forEach(editor.childNodes, growElement);
    setElementDimensions($("outputinner"), {w: output.clientWidth, h: output.clientHeight - output.firstChild.offsetHeight});
  }

  function setOpen(nowOpen){
    if (open == nowOpen)
      return;
    open = nowOpen;
    $("editor").style.display = $("repl").style.display = $("output").style.display =
	 $("controls").style.display = $("resize").style.display = (open ? "" : "none");
    resizeFrames();
    if (open)
      addElementClass($("console"), "open");
    else
      removeElementClass($("console"), "open");
  }

  function dragResize(event) {
    var size = $("console").offsetHeight, startSize = size;
    var startY = event.mouse().page.y;

    // Temporarily hide the editor, because iframes and dragging do
    // not get along very well.
    forEach($("editor").childNodes, function(frame) {
      frame.oldDisplay = frame.style.display;
      frame.style.display = "none";
    });
    document.body.style.cursor = "n-resize";

    var marker = DIV({"class": "resizemarker"});
    marker.style.bottom = size + "px";
    document.body.appendChild(marker);

    var tracker = connect(document.body, "onmousemove", function(event) {
      size = Math.max(minSize, startSize - (event.mouse().page.y - startY));
      marker.style.bottom = size + "px";
    });
    var finish = connect(document.body, "onmouseup", function(event) {
      disconnect(tracker);
      disconnect(finish);
      document.body.style.cursor = "";
      forEach($("editor").childNodes, function(frame) {
        frame.style.display = frame.oldDisplay;
      });
      setContentRatio(size);
      resizeFrames();
      removeElement(marker);
    });
  }

  function initConsole(where) {
    function toggle(event){
      setOpen(!open);
    }

    var showHide = BUTTON({"class": "showhide", "type": "button", "title": "Open or close the console"},
      attach("onclick", toggle));
    var resize = BUTTON({"class": "resize", "type": "button", "title": "Resize the console", "id": "resize"},
      attach("onmousedown", dragResize));

    var output = DIV({"class": "output", "id": "output"}),
        controls = DIV({"id": "controls"}),
        editor = DIV({"class": "editor", "id": "editor"}),
        repl = DIV({"class": "editor", "id": "repl"}),
	header = DIV({"class": "header"}, SPAN(null, "CONSOLE", attach("onclick", toggle)), resize, showHide);
    replaceChildNodes(where, header, output, controls, editor, repl);

    function initFrame(env) {
      if (window.chapterTag)
        env.load("chapter/" + chapterTag + ".js");
    }
    _console = new Console({output: output, controls: controls, editor: editor, repl: repl,
                            initEnv: initFrame});
  }

  function restoreBookmark(){
    if (/#/.test(location.href))
      location.href = location.href;
  }

  setTimeout(function(){document.body.style.visibility = "";}, 0);
  if (/Version\/2/.test(navigator.userAgent) && /Safari\//.test(navigator.userAgent)) {
    if (!getCookie("safariwarning", false)) {
      setCookie("safariwarning", "1");
      alert("Safari 2 unfortunately does not support the JavaScript used by this book. Extra functionality will be disabled. Upgrade to version 3 (still beta), or use Firefox to read the book with full functionality.");
    }
  }
  else if (window.opera && Number(window.opera.version()) < 9.52) {
    if (!getCookie("operawarning", false)) {
      setCookie("operawarning", "1");
      alert("Your version of Opera is not supported by this site. The 'active' components of this book will be disabled. Use version 9.52+, Firefox, or a recent Safari if you want full functionality.");
    }
  }
  else {
    hideSolutions();
    moveFootnotes();
    addCodeButtons();
    addReactButton();
    addConsole();
    restoreBookmark();
  }
};

connect(window, "onload", processPage);
