SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
4.2 KiB

/*
DynAPI Distribution
Cookie functions
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
*/
/*
This is not tested, should work like this:
var c = new Cookie('mycookieset');
c.add('array',[1,2,3]); // re-saves cookie each time a value is added
var c = new Cookie('mycookieset'); // auto-retrieves saved cookie object
var name = c.get('name');
var array = c.get('array');
array[array.length] = 4;
c.add('name',name+' MyLastName');
c.add('array',array);
*/
function Cookie(name,pDType) {
this.DynObject = DynObject;
this.DynObject();
this.data = {};
this.name = name;
this.exists = false;
this._pdt=pDType;
var c = dynapi.functions.getCookie(this.name);
if (c) {
this.exists = true;
var a = c.split(',');
var x,n,v;
for (var i=0;i<a.length;i++) {
x = a[i].split('=');
n = x[0];
v = Cookie.decode(x[1]);
if (n && v) this.data[n] = v;
}
//var i1 = c.indexOf('expires=');
this._save(false);
}
else this._save();
};
// to-do: replace escape(),unescape() with better encoding functions
Cookie.decode = function(t,_lvl){
var dt = (t+'').substring(0,2);
if(isNaN(_lvl)) _lvl=0; else _lvl++;
if(dt=='a[') { //array
t=t.substring(2,t.length-1);
t=t.split('\\'+_lvl);
for(var i=0;i<t.length;i++) t[i]=Cookie.decode(t[i],_lvl);
}
else if(dt=='o[') { //object
var a,n,v;
t=t.substring(2,t.length-1);
a=t.split('\\'+_lvl);
t={};
for(var i=0;i<a.length;i++) {
n=a[i].substring(0,a[i].indexOf(':'));
if(n) v=a[i].substring(n.length+1);
else v=null;
t[n]=Cookie.decode(v,_lvl);
}
}
else if(dt=='n[') { //number:float, integer
t=parseFloat(t.substring(2,t.length-1));
}
else if(dt=='d[') { //date
t=new Date(unescape(t.substring(2,t.length-1)));
}
else if(dt=='b[') { //boolean
t=(t.substring(2,t.length-1)=="1")? true:false;
}
else if(dt=='u[') { //null
t=null;
}
else{ //string
t=unescape(t);
}
return t;
};
// to-do: replace escape(),unescape() with better encoding functions
Cookie.encode = function(t,pDType,_lvl){
if (!pDType) t=escape(t);
else if (t==null) t='u[]';
else if(typeof(t)=='number') t='n['+t+']';
else if(typeof(t)=='boolean') t='b['+((t)? 1:0)+']';
else if(typeof(t)!='object') t=escape(t);
else {
if(isNaN(_lvl)) _lvl=0; else _lvl++;
if(t.constructor==Date) t='d['+escape(t)+']';
else if(t.constructor==Array){
//encode array = a[n1\0n2...\0nN]
var a=[];
for(var i=0;i<t.length;i++) a[i]=Cookie.encode(t[i],pDType);
t='a['+a.join('\\'+_lvl)+']';
}
else {
//encode object = o[name1:value1\0name2:value2...\0nameN:valueN]
var a=[];
for(var i in t){
a[a.length]=(i+':'+Cookie.encode(t[i],pDType,_lvl));
}
t='o['+a.join('\\'+_lvl)+']';
}
}
return t;
};
var p = dynapi.setPrototype('Cookie','DynObject');
p.get = function(name) {
return this.data[name];
};
p.getAll = function() {
return data;
};
p.add = function(name,value) {
this.data[name] = value;
this._save();
};
p.remove = function(name) {
this.data[name] = null;
delete this.data[name];
this._save();
};
p.removeAll = function(){
this.data = {};
this._save();
};
p.setExpires = function(days) {
this.expires = days;
};
p.destroy = function() {
dynapi.functions.deleteCookie(this.name);
};
p._save = function(write) {
var s = '';
for (var i in this.data) {
var v = this.data[i];
if (v) s += i + '=' + Cookie.encode(v,this._pdt) + ',';
}
s = s.substring(0,s.length-1);
var f = 'Saved';
if (write!=false) dynapi.functions.setCookie(this.name,s,this.expires);
else f = 'Found';
dynapi.debug.print(f+' Cookie: name='+this.name+' data={'+s+'}');
};
dynapi.functions.setCookie = function(name,value,days) {
if (days) {
var date=new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires="; expires="+date.toGMTString();
}
else expires = "";
dynapi.frame.document.cookie = name+"="+value+expires+"; path=/";
};
dynapi.functions.getCookie = function(name) {
var nameEQ = name+"=";
var c,ca = dynapi.frame.document.cookie.split(';');
for(var i=0;i<ca.length;i++) {
c=ca[i];
while (c.charAt(0)==' ') c=c.substring(1,c.length);
if (c.indexOf(nameEQ)==0) return c.substring(nameEQ.length,c.length);
}
return null;
};
dynapi.functions.deleteCookie = function(name) {
dynapi.functions.setCookie(name,"",-1);
};