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.
172 lines
4.2 KiB
172 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); |
|
};
|
|
|