Provider.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:4k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  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
  11.  * Provider interface.
  12.  */
  13. Ext.state.Provider = function(){
  14.     /**
  15.      * @event statechange
  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
  20.      */
  21.     this.addEvents("statechange");
  22.     this.state = {};
  23.     Ext.state.Provider.superclass.constructor.call(this);
  24. };
  25. Ext.extend(Ext.state.Provider, Ext.util.Observable, {
  26.     /**
  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
  31.      */
  32.     get : function(name, defaultValue){
  33.         return typeof this.state[name] == "undefined" ?
  34.             defaultValue : this.state[name];
  35.     },
  36.     /**
  37.      * Clears a value from the state
  38.      * @param {String} name The key name
  39.      */
  40.     clear : function(name){
  41.         delete this.state[name];
  42.         this.fireEvent("statechange", this, name, null);
  43.     },
  44.     /**
  45.      * Sets the value for a key
  46.      * @param {String} name The key name
  47.      * @param {Mixed} value The value to set
  48.      */
  49.     set : function(name, value){
  50.         this.state[name] = value;
  51.         this.fireEvent("statechange", this, name, value);
  52.     },
  53.     /**
  54.      * Decodes a string previously encoded with {@link #encodeValue}.
  55.      * @param {String} value The value to decode
  56.      * @return {Mixed} The decoded value
  57.      */
  58.     decodeValue : function(cookie){
  59.         var re = /^(a|n|d|b|s|o):(.*)$/;
  60.         var matches = re.exec(unescape(cookie));
  61.         if(!matches || !matches[1]) return; // non state cookie
  62.         var type = matches[1];
  63.         var v = matches[2];
  64.         switch(type){
  65.             case "n":
  66.                 return parseFloat(v);
  67.             case "d":
  68.                 return new Date(Date.parse(v));
  69.             case "b":
  70.                 return (v == "1");
  71.             case "a":
  72.                 var all = [];
  73.                 if(v != ''){
  74.                     Ext.each(v.split('^'), function(val){
  75.                         all.push(this.decodeValue(val));
  76.                     }, this);
  77.                 }
  78.                 return all;
  79.            case "o":
  80.                 var all = {};
  81.                 if(v != ''){
  82.                     Ext.each(v.split('^'), function(val){
  83.                         var kv = val.split('=');
  84.                         all[kv[0]] = this.decodeValue(kv[1]);
  85.                     }, this);
  86.                 }
  87.                 return all;
  88.            default:
  89.                 return v;
  90.         }
  91.     },
  92.     /**
  93.      * Encodes a value including type information.  Decode with {@link #decodeValue}.
  94.      * @param {Mixed} value The value to encode
  95.      * @return {String} The encoded value
  96.      */
  97.     encodeValue : function(v){
  98.         var enc;
  99.         if(typeof v == "number"){
  100.             enc = "n:" + v;
  101.         }else if(typeof v == "boolean"){
  102.             enc = "b:" + (v ? "1" : "0");
  103.         }else if(Ext.isDate(v)){
  104.             enc = "d:" + v.toGMTString();
  105.         }else if(Ext.isArray(v)){
  106.             var flat = "";
  107.             for(var i = 0, len = v.length; i < len; i++){
  108.                 flat += this.encodeValue(v[i]);
  109.                 if(i != len-1) flat += "^";
  110.             }
  111.             enc = "a:" + flat;
  112.         }else if(typeof v == "object"){
  113.             var flat = "";
  114.             for(var key in v){
  115.                 if(typeof v[key] != "function" && v[key] !== undefined){
  116.                     flat += key + "=" + this.encodeValue(v[key]) + "^";
  117.                 }
  118.             }
  119.             enc = "o:" + flat.substring(0, flat.length-1);
  120.         }else{
  121.             enc = "s:" + v;
  122.         }
  123.         return escape(enc);
  124.     }
  125. });