state-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:9k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**  * @class Ext.state.Provider  * Abstract base class for state provider implementations. This class provides methods  * for encoding and decoding <b>typed</b> variables including dates and defines the  * Provider interface.  */ Ext.state.Provider = function(){     /**      * @event statechange      * Fires when a state change occurs.      * @param {Provider} this This state provider      * @param {String} key The state key which was changed      * @param {String} value The encoded value for the state      */     this.addEvents("statechange");     this.state = {};     Ext.state.Provider.superclass.constructor.call(this); }; Ext.extend(Ext.state.Provider, Ext.util.Observable, {     /**      * Returns the current value for a key      * @param {String} name The key name      * @param {Mixed} defaultValue A default value to return if the key's value is not found      * @return {Mixed} The state data      */     get : function(name, defaultValue){         return typeof this.state[name] == "undefined" ?             defaultValue : this.state[name];     },     /**      * Clears a value from the state      * @param {String} name The key name      */     clear : function(name){         delete this.state[name];         this.fireEvent("statechange", this, name, null);     },     /**      * Sets the value for a key      * @param {String} name The key name      * @param {Mixed} value The value to set      */     set : function(name, value){         this.state[name] = value;         this.fireEvent("statechange", this, name, value);     },     /**      * Decodes a string previously encoded with {@link #encodeValue}.      * @param {String} value The value to decode      * @return {Mixed} The decoded value      */     decodeValue : function(cookie){         var re = /^(a|n|d|b|s|o):(.*)$/;         var matches = re.exec(unescape(cookie));         if(!matches || !matches[1]) return; // non state cookie         var type = matches[1];         var v = matches[2];         switch(type){             case "n":                 return parseFloat(v);             case "d":                 return new Date(Date.parse(v));             case "b":                 return (v == "1");             case "a":                 var all = [];                 var values = v.split("^");                 for(var i = 0, len = values.length; i < len; i++){                     all.push(this.decodeValue(values[i]));                 }                 return all;            case "o":                 var all = {};                 var values = v.split("^");                 for(var i = 0, len = values.length; i < len; i++){                     var kv = values[i].split("=");                     all[kv[0]] = this.decodeValue(kv[1]);                 }                 return all;            default:                 return v;         }     },     /**      * Encodes a value including type information.  Decode with {@link #decodeValue}.      * @param {Mixed} value The value to encode      * @return {String} The encoded value      */     encodeValue : function(v){         var enc;         if(typeof v == "number"){             enc = "n:" + v;         }else if(typeof v == "boolean"){             enc = "b:" + (v ? "1" : "0");         }else if(Ext.isDate(v)){             enc = "d:" + v.toGMTString();         }else if(Ext.isArray(v)){             var flat = "";             for(var i = 0, len = v.length; i < len; i++){                 flat += this.encodeValue(v[i]);                 if(i != len-1) flat += "^";             }             enc = "a:" + flat;         }else if(typeof v == "object"){             var flat = "";             for(var key in v){                 if(typeof v[key] != "function" && v[key] !== undefined){                     flat += key + "=" + this.encodeValue(v[key]) + "^";                 }             }             enc = "o:" + flat.substring(0, flat.length-1);         }else{             enc = "s:" + v;         }         return escape(enc);     } }); /**
  2.  * @class Ext.state.Manager
  3.  * This is the global state manager. By default all components that are "state aware" check this class
  4.  * for state information if you don't pass them a custom state provider. In order for this class
  5.  * to be useful, it must be initialized with a provider when your application initializes. Example usage:
  6.  <pre><code>
  7. // in your initialization function
  8. init : function(){
  9.    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
  10.    var win = new Window(...);
  11.    win.restoreState();
  12. }
  13.  </code></pre>
  14.  * @singleton
  15.  */
  16. Ext.state.Manager = function(){
  17.     var provider = new Ext.state.Provider();
  18.     return {
  19.         /**
  20.          * Configures the default state provider for your application
  21.          * @param {Provider} stateProvider The state provider to set
  22.          */
  23.         setProvider : function(stateProvider){
  24.             provider = stateProvider;
  25.         },
  26.         /**
  27.          * Returns the current value for a key
  28.          * @param {String} name The key name
  29.          * @param {Mixed} defaultValue The default value to return if the key lookup does not match
  30.          * @return {Mixed} The state data
  31.          */
  32.         get : function(key, defaultValue){
  33.             return provider.get(key, defaultValue);
  34.         },
  35.         /**
  36.          * Sets the value for a key
  37.          * @param {String} name The key name
  38.          * @param {Mixed} value The state data
  39.          */
  40.          set : function(key, value){
  41.             provider.set(key, value);
  42.         },
  43.         /**
  44.          * Clears a value from the state
  45.          * @param {String} name The key name
  46.          */
  47.         clear : function(key){
  48.             provider.clear(key);
  49.         },
  50.         /**
  51.          * Gets the currently configured state provider
  52.          * @return {Provider} The state provider
  53.          */
  54.         getProvider : function(){
  55.             return provider;
  56.         }
  57.     };
  58. }();
  59. /**
  60.  * @class Ext.state.CookieProvider
  61.  * @extends Ext.state.Provider
  62.  * The default Provider implementation which saves state via cookies.
  63.  * <br />Usage:
  64.  <pre><code>
  65.    var cp = new Ext.state.CookieProvider({
  66.        path: "/cgi-bin/",
  67.        expires: new Date(new Date().getTime()+(1000*60*60*24*30)), //30 days
  68.        domain: "extjs.com"
  69.    });
  70.    Ext.state.Manager.setProvider(cp);
  71.  </code></pre>
  72.  * @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
  73.  * @cfg {Date} expires The cookie expiration date (defaults to 7 days from now)
  74.  * @cfg {String} domain The domain to save the cookie for.  Note that you cannot specify a different domain than
  75.  * your page is on, but you can specify a sub-domain, or simply the domain itself like 'extjs.com' to include
  76.  * all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same
  77.  * domain the page is running on including the 'www' like 'www.extjs.com')
  78.  * @cfg {Boolean} secure True if the site is using SSL (defaults to false)
  79.  * @constructor
  80.  * Create a new CookieProvider
  81.  * @param {Object} config The configuration object
  82.  */
  83. Ext.state.CookieProvider = function(config){
  84.     Ext.state.CookieProvider.superclass.constructor.call(this);
  85.     this.path = "/";
  86.     this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
  87.     this.domain = null;
  88.     this.secure = false;
  89.     Ext.apply(this, config);
  90.     this.state = this.readCookies();
  91. };
  92. Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
  93.     // private
  94.     set : function(name, value){
  95.         if(typeof value == "undefined" || value === null){
  96.             this.clear(name);
  97.             return;
  98.         }
  99.         this.setCookie(name, value);
  100.         Ext.state.CookieProvider.superclass.set.call(this, name, value);
  101.     },
  102.     // private
  103.     clear : function(name){
  104.         this.clearCookie(name);
  105.         Ext.state.CookieProvider.superclass.clear.call(this, name);
  106.     },
  107.     // private
  108.     readCookies : function(){
  109.         var cookies = {};
  110.         var c = document.cookie + ";";
  111.         var re = /s?(.*?)=(.*?);/g;
  112.      var matches;
  113.      while((matches = re.exec(c)) != null){
  114.             var name = matches[1];
  115.             var value = matches[2];
  116.             if(name && name.substring(0,3) == "ys-"){
  117.                 cookies[name.substr(3)] = this.decodeValue(value);
  118.             }
  119.         }
  120.         return cookies;
  121.     },
  122.     // private
  123.     setCookie : function(name, value){
  124.         document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
  125.            ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
  126.            ((this.path == null) ? "" : ("; path=" + this.path)) +
  127.            ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
  128.            ((this.secure == true) ? "; secure" : "");
  129.     },
  130.     // private
  131.     clearCookie : function(name){
  132.         document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
  133.            ((this.path == null) ? "" : ("; path=" + this.path)) +
  134.            ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
  135.            ((this.secure == true) ? "; secure" : "");
  136.     }
  137. });