- JavaScript based session object copyright 2008 Thomas Frank This EULA grants you the following rights: Installation and Use. You may install and use an unlimited number of copies of t he SOFTWARE PRODUCT. Reproduction and Distribution. You may reproduce and distribute an unlimited num ber of copies of the SOFTWARE PRODUCT either in whole or in part; each copy shou ld include all copyright and trademark notices, and shall be accompanied by a co py of this EULA. Copies of the SOFTWARE PRODUCT may be distributed as a standalo ne product or included with your own product. Commercial Use. You may sell for profit and freely distribute scripts and/or com piled scripts that were created with the SOFTWARE PRODUCT. v 1.0 --> 1.01 sanitizer added to toObject-method & includeFunctions flag now defaults to false */ sessvars=function(){ var x={}; x.$={ prefs:{ memLimit:2000, autoFlush:true, crossDomain:false, includeProtos:false, includeFunctions:false }, parent:x, clearMem:function(){ for(var i in this.parent){if(i!="$"){this.parent[i]=unde fined}}; this.flush(); }, usedMem:function(){ x={}; return Math.round(this.flush(x)/1024); }, usedMemPercent:function(){ return Math.round(this.usedMem()/this.prefs.memLimit); }, flush:function(x){ var y,o={},j=this.$$; x=x||top; for(var i in this.parent){o[i]=this.parent[i]}; o.$=this.prefs; j.includeProtos=this.prefs.includeProtos; j.includeFunctions=this.prefs.includeFunctions; y=this.$$.make(o); if(x!=top){return y.length}; if(y.length/1024>this.prefs.memLimit){return false} x.name=y; return true; }, getDomain:function(){ var l=location.href l=l.split("///").join("//"); l=l.substring(l.indexOf("://")+3).split("/")[0]; while(l.split(".").length>2){l=l.substring(l.ind exOf(".")+1)}; return l }, debug:function(t){ var t=t||this,a=arguments.callee; if(!document.body){setTimeout(function(){a(t)},200);retu rn}; t.flush(); var d=document.getElementById("sessvarsDebugDiv"); if(!d){d=document.createElement("div");document.body.ins ertBefore(d,document.body.firstChild)}; d.id="sessvarsDebugDiv"; d.innerHTML='<div style="line-height:20px;padding:5px;fo nt-size:11px;font-family:Verdana,Arial,Helvetica;'+ 'z-index:10000;background:#FFFFC C;border: 1px solid #333;margin-bottom:12px">'+ '<b style="font-family:Trebuchet MS;font-size:20px">sessvars.js - debug info:</b><br/><br/>'+ 'Memory usage: '+t.usedMem()+' K b ('+t.usedMemPercent()+'%) '+ '<span style="cursor:pointer"><b >[Clear memory]</b></span><br/>'+ top.name.split('\n').join('<br/> ')+'</div>'; d.getElementsByTagName('span')[0].onclick=function(){t.c learMem();location.reload()} }, init:function(){ var o={}, t=this; try {o=this.$$.toObject(top.name)} catch(e){o={}}; this.prefs=o.$||t.prefs; if(this.prefs.crossDomain || this.prefs.currentDomain==t his.getDomain()){ for(var i in o){this.parent[i]=o[i]}; } else { this.prefs.currentDomain=this.getDomain(); }; this.parent.$=t; t.flush(); var f=function(){if(t.prefs.autoFlush){t.flush()}}; if(window["addEventListener"]){addEventListener("unload" ,f,false)} else if(window["attachEvent"]){window.attachEvent("onunl oad",f)} else {this.prefs.autoFlush=false}; } }; x.$.$$={ compactOutput:false, includeProtos:false, includeFunctions: false, detectCirculars:true, restoreCirculars:true, make:function(arg,restore) { this.restore=restore; this.mem=[];this.pathMem=[]; return this.toJsonStringArray(arg).join(''); }, toObject:function(x){ if(!this.cleaner){ try{this.cleaner=new RegExp('^("(\\\\.|[^"\\\\\\ n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')} catch(a){this.cleaner=/^(true|false|null|\[.*\]| \{.*\}|".*"|\d+|\d+\.\d+)$/} }; if(!this.cleaner.test(x)){return {}}; eval("this.myObj="+x); if(!this.restoreCirculars || !alert){return this.myObj}; if(this.includeFunctions){ var x=this.myObj; for(var i in x){if(typeof x[i]=="string" && !x[i ].indexOf("JSONincludedFunc:")){ x[i]=x[i].substring(17); eval("x[i]="+x[i]) }} }; this.restoreCode=[]; this.make(this.myObj,true); var r=this.restoreCode.join(";")+";"; eval('r=r.replace(/\\W([0-9]{1,})(\\W)/g,"[$1]$2").repla ce(/\\.\\;/g,";")'); eval(r); return this.myObj }, toJsonStringArray:function(arg, out) { if(!out){this.path=[]}; out = out || []; var u; // undefined switch (typeof arg) { case 'object': this.lastObj=arg; if(this.detectCirculars){ var m=this.mem; var n=this.pathMem; for(var i=0;i<m.length;i++){ if(arg===m[i]){ out.push('"JSONcircRef:' +n[i]+'"');return out } }; m.push(arg); n.push(this.path.join(".")) ; }; if (arg) { if (arg.constructor == Array) { out.push('['); for (var i = 0; i < arg.length; ++i) { this.path.push(i); if (i > 0) out.push(',\n'); this.toJsonStringArray(a rg[i], out); this.path.pop(); } out.push(']'); return out; } else if (typeof arg.toString != 'undef ined') { out.push('{'); var first = true; for (var i in arg) { if(!this.includeProtos & & arg[i]===arg.constructor.prototype[i]){continue}; this.path.push(i); var curr = out.length; if (!first) out.push(this.co mpactOutput?',':',\n'); this.toJsonStringArray(i , out); out.push(':');
this.toJsonStringArray(a rg[i], out); if (out[out.length - 1] == u) out.splice(curr, out.length - curr); else first = false; this.path.pop(); } out.push('}'); return out; } return out; } out.push('null'); return out; case 'unknown': case 'undefined': case 'function': if(!this.includeFunctions){out.push(u);return ou t}; arg="JSONincludedFunc:"+arg; out.push('"'); var a=['\n','\\n','\r','\\r','"','\\"']; arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i ]).join(a[i+1])}; out.push(arg); out.push('"'); return out; case 'string': if(this.restore && arg.indexOf("JSONcircRef:")== 0){ this.restoreCode.push('this.myObj.'+this .path.join(".")+"="+arg.split("JSONcircRef:").join("this.myObj.")); }; out.push('"'); var a=['\n','\\n','\r','\\r','"','\\"']; arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i ]).join(a[i+1])}; out.push(arg); out.push('"'); return out; default: out.push(String(arg)); return out; } } }; x.$.init(); return x; }()