3
* Copyright(c) 2006-2010 Ext JS, LLC
5
* http://www.extjs.com/license
8
* @class Ext.state.Provider
9
* Abstract base class for state provider implementations. This class provides methods
10
* for encoding and decoding <b>typed</b> variables including dates and defines the
13
Ext.state.Provider = function(){
16
* Fires when a state change occurs.
17
* @param {Provider} this This state provider
18
* @param {String} key The state key which was changed
19
* @param {String} value The encoded value for the state
21
this.addEvents("statechange");
23
Ext.state.Provider.superclass.constructor.call(this);
25
Ext.extend(Ext.state.Provider, Ext.util.Observable, {
27
* Returns the current value for a key
28
* @param {String} name The key name
29
* @param {Mixed} defaultValue A default value to return if the key's value is not found
30
* @return {Mixed} The state data
32
get : function(name, defaultValue){
33
return typeof this.state[name] == "undefined" ?
34
defaultValue : this.state[name];
38
* Clears a value from the state
39
* @param {String} name The key name
41
clear : function(name){
42
delete this.state[name];
43
this.fireEvent("statechange", this, name, null);
47
* Sets the value for a key
48
* @param {String} name The key name
49
* @param {Mixed} value The value to set
51
set : function(name, value){
52
this.state[name] = value;
53
this.fireEvent("statechange", this, name, value);
57
* Decodes a string previously encoded with {@link #encodeValue}.
58
* @param {String} value The value to decode
59
* @return {Mixed} The decoded value
61
decodeValue : function(cookie){
62
var re = /^(a|n|d|b|s|o)\:(.*)$/;
63
var matches = re.exec(unescape(cookie));
64
if(!matches || !matches[1]) return; // non state cookie
65
var type = matches[1];
71
return new Date(Date.parse(v));
77
Ext.each(v.split('^'), function(val){
78
all.push(this.decodeValue(val));
85
Ext.each(v.split('^'), function(val){
86
var kv = val.split('=');
87
all[kv[0]] = this.decodeValue(kv[1]);
97
* Encodes a value including type information. Decode with {@link #decodeValue}.
98
* @param {Mixed} value The value to encode
99
* @return {String} The encoded value
101
encodeValue : function(v){
103
if(typeof v == "number"){
105
}else if(typeof v == "boolean"){
106
enc = "b:" + (v ? "1" : "0");
107
}else if(Ext.isDate(v)){
108
enc = "d:" + v.toGMTString();
109
}else if(Ext.isArray(v)){
111
for(var i = 0, len = v.length; i < len; i++){
112
flat += this.encodeValue(v[i]);
113
if(i != len-1) flat += "^";
116
}else if(typeof v == "object"){
119
if(typeof v[key] != "function" && v[key] !== undefined){
120
flat += key + "=" + this.encodeValue(v[key]) + "^";
123
enc = "o:" + flat.substring(0, flat.length-1);
131
* @class Ext.state.Manager
132
* This is the global state manager. By default all components that are "state aware" check this class
133
* for state information if you don't pass them a custom state provider. In order for this class
134
* to be useful, it must be initialized with a provider when your application initializes. Example usage:
136
// in your initialization function
138
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
139
var win = new Window(...);
145
Ext.state.Manager = function(){
146
var provider = new Ext.state.Provider();
150
* Configures the default state provider for your application
151
* @param {Provider} stateProvider The state provider to set
153
setProvider : function(stateProvider){
154
provider = stateProvider;
158
* Returns the current value for a key
159
* @param {String} name The key name
160
* @param {Mixed} defaultValue The default value to return if the key lookup does not match
161
* @return {Mixed} The state data
163
get : function(key, defaultValue){
164
return provider.get(key, defaultValue);
168
* Sets the value for a key
169
* @param {String} name The key name
170
* @param {Mixed} value The state data
172
set : function(key, value){
173
provider.set(key, value);
177
* Clears a value from the state
178
* @param {String} name The key name
180
clear : function(key){
185
* Gets the currently configured state provider
186
* @return {Provider} The state provider
188
getProvider : function(){
194
* @class Ext.state.CookieProvider
195
* @extends Ext.state.Provider
196
* The default Provider implementation which saves state via cookies.
199
var cp = new Ext.state.CookieProvider({
201
expires: new Date(new Date().getTime()+(1000*60*60*24*30)), //30 days
204
Ext.state.Manager.setProvider(cp);
206
* @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
207
* @cfg {Date} expires The cookie expiration date (defaults to 7 days from now)
208
* @cfg {String} domain The domain to save the cookie for. Note that you cannot specify a different domain than
209
* your page is on, but you can specify a sub-domain, or simply the domain itself like 'extjs.com' to include
210
* all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same
211
* domain the page is running on including the 'www' like 'www.extjs.com')
212
* @cfg {Boolean} secure True if the site is using SSL (defaults to false)
214
* Create a new CookieProvider
215
* @param {Object} config The configuration object
217
Ext.state.CookieProvider = function(config){
218
Ext.state.CookieProvider.superclass.constructor.call(this);
220
this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
223
Ext.apply(this, config);
224
this.state = this.readCookies();
227
Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
229
set : function(name, value){
230
if(typeof value == "undefined" || value === null){
234
this.setCookie(name, value);
235
Ext.state.CookieProvider.superclass.set.call(this, name, value);
239
clear : function(name){
240
this.clearCookie(name);
241
Ext.state.CookieProvider.superclass.clear.call(this, name);
245
readCookies : function(){
247
var c = document.cookie + ";";
248
var re = /\s?(.*?)=(.*?);/g;
250
while((matches = re.exec(c)) != null){
251
var name = matches[1];
252
var value = matches[2];
253
if(name && name.substring(0,3) == "ys-"){
254
cookies[name.substr(3)] = this.decodeValue(value);
261
setCookie : function(name, value){
262
document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
263
((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
264
((this.path == null) ? "" : ("; path=" + this.path)) +
265
((this.domain == null) ? "" : ("; domain=" + this.domain)) +
266
((this.secure == true) ? "; secure" : "");
270
clearCookie : function(name){
271
document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
272
((this.path == null) ? "" : ("; path=" + this.path)) +
273
((this.domain == null) ? "" : ("; domain=" + this.domain)) +
274
((this.secure == true) ? "; secure" : "");
b'\\ No newline at end of file'