Vous êtes sur la page 1sur 5

/*

sessvars ver 1.01


- 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()+'%)&nbsp;&nbsp;&nbsp;'+
'<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;
}()

Vous aimerez peut-être aussi