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
173 lines
4.2 KiB
2 years ago
|
/*
|
||
|
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);
|
||
|
};
|