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

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.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.                 var values = v.split("^");
  74.                 for(var i = 0, len = values.length; i < len; i++){
  75.                     all.push(this.decodeValue(values[i]));
  76.                 }
  77.                 return all;
  78.            case "o":
  79.                 var all = {};
  80.                 var values = v.split("^");
  81.                 for(var i = 0, len = values.length; i < len; i++){
  82.                     var kv = values[i].split("=");
  83.                     all[kv[0]] = this.decodeValue(kv[1]);
  84.                 }
  85.                 return all;
  86.            default:
  87.                 return v;
  88.         }
  89.     },
  90.     /**
  91.      * Encodes a value including type information.  Decode with {@link #decodeValue}.
  92.      * @param {Mixed} value The value to encode
  93.      * @return {String} The encoded value
  94.      */
  95.     encodeValue : function(v){
  96.         var enc;
  97.         if(typeof v == "number"){
  98.             enc = "n:" + v;
  99.         }else if(typeof v == "boolean"){
  100.             enc = "b:" + (v ? "1" : "0");
  101.         }else if(Ext.isDate(v)){
  102.             enc = "d:" + v.toGMTString();
  103.         }else if(Ext.isArray(v)){
  104.             var flat = "";
  105.             for(var i = 0, len = v.length; i < len; i++){
  106.                 flat += this.encodeValue(v[i]);
  107.                 if(i != len-1) flat += "^";
  108.             }
  109.             enc = "a:" + flat;
  110.         }else if(typeof v == "object"){
  111.             var flat = "";
  112.             for(var key in v){
  113.                 if(typeof v[key] != "function" && v[key] !== undefined){
  114.                     flat += key + "=" + this.encodeValue(v[key]) + "^";
  115.                 }
  116.             }
  117.             enc = "o:" + flat.substring(0, flat.length-1);
  118.         }else{
  119.             enc = "s:" + v;
  120.         }
  121.         return escape(enc);
  122.     }
  123. });