//#region 本地存储

Namespace.register("U.DW");

/**
* 异步加载跨域
*
* @param  {boolean} 是否存储永不过期
* @param  {object} 存储传参对象
* @return {object} 本地存储使用对象
*/
U.DW.local = function (UTP, UDE) {
    if ((!browser.msie || Number(browser.ver[2]) > 6)) {
        try {
            var _UDE = new Date(); //当前时间
            (!UTP) && (_UDE.setTime(_UDE.getTime() + (9999 * 24 * 60 * 60 * 1000)), _UBE.expires = _UDE.toUTCString()); //设置永不过期
        } catch (e) { }
    }
    return new U.DW.local.init(UTP); //初始化
}

/**
* 初始化本地存储查看
*
* @param  {boolean} 是否存储永不过期
* @param  {boolean} 存储传参对象
* @return {object} 本地存储使用对象
*/
U.DW.local.init = function (UTP, UDE) {
    U.Ut.AddObj(this, {
        UTP: UTP, //是否永不过期
        UTF: (this.UJE = (UTP ? window.sessionStorage : window.localStorage)),  //存储对象
        UJE: this.UJE || $$("input", { "type": "hidden", "style": { "behavior": "url(#default#userdata)"} }, document.body), //ie存储对象
        UDE: UDE || {}, //传参使用
        UGE: null,
        scb: null,
        date: {}
    }); //变量
    //事件绑定
    (UDE && UDE.event) && (this.on(UDE.event));
    return this;
}

/**
* 兼容storage事件触发 ie8-
*
* @param  {object} U.DW.local实例对象
*/
U.DW.local._cb = function (UTH) {
    clearInterval(UTH.UTI); //计时器取消
    UTH.UTI = setInterval(function () { //计时器消息
        var _UDE = U.DW.local.iep(UTH); //ie兼容处理
        (_UDE && UTH.UDE.event) && (UTH.UDE.event(_UDE));
    }, 5000);
};


/**
* ie兼容属性设置
*
* @param  {object} U.DW.local实例对象
* @param  {event} 上storage事件
* @return  {event} storage事件
*/
U.DW.local.iep = function (UTH, UE) {
    var i,
    _UOE = UTH.date, //变化前的值
    _UNE = UTH.UJE; //变化的对象
    UTH.date = U.DW.local.get(UTH), //获取所有的变化内容
    _UKE = UTH.getAllKey(); //获取所有的key
    for (i = 0; i < _UKE.length; i++) {
        if (_UOE[_UKE[i]] != _UNE[_UKE[i]]) { //判断是否key产生了变化
            return { //返回最新的 ie storgeevent
                Property: null,
                key: _UKE[i], //变化的key值
                oldValue: _UOE[_UKE[i]], //上一次的值
                newValue: _UNE[_UKE[i]], //最新的值
                url: UE ? (UE.url || UE.uri) : document.location.host //链接处理
            };
        }
    }
}
/**
* ie获取变化内容
*
* @param  {object} U.DW.local实例对象
* @return  {object} event值
*/
U.DW.local.get = function (UTH) {
    var i, _UKE; UTH.date = [];
    if (browser.ver[1] == "msie" && browser.ver[2].toInt() < 9) { //ie9- 处理
        _UKE = UTH.getAllKey(); //获取所有的key
        for (i = 0; i < _UKE.length; i++) { //获取所有的值 同时设置到 date里
            UTH.date[_UKE[i]] = UTH.UJE[_UKE[i]];
        }
    }
    return UTH.date;
}

U.DW.local.init.prototype = {
    /**
    * 事件绑定
    *
    * @param  {object} U.DW.local实例对象
    */
    on: function (UDE) {
        this.off(); //事件取消
        this.UDE.event = UDE;
        this.scb = U.M.apply(this, this["storage"]); //事件
        U.DW.local.get(this); //
        this.UTF ? (U.M.AddEvent("storage", window, this.scb), U.M.AddEvent("storage", document, this.scb)) : U.DW.local._cb(this, this.getAll()); //
    },
    //事件绑定取消
    off: function () {
        this.UTF ? (U.M.ReEvent("storage", window, this.scb), U.M.ReEvent("storage", document, this.scb)) : clearInterval(this.UTI); //移除storage绑定 去除计时
    },
    /**
    * 设置值
    *
    * @param  {object}需要存储的值 如
    -----------{id:"aaa"}
    * @param  {string} 值
    ----------当这个参数存在的使用 参数一是 string的key 这个参数为值 
    * @return  {object} 对象
    */
    set: function (UDE, USE) { //
        if (this.UJE) {
            var i, _UME = this.UJE;
            (USE != null) && (i = UDE, UDE = {}, UDE[i] = USE);
            //设置存储的值
            for (i in UDE) {
                (UDE.hasOwnProperty(i)) && (this.UTF ? _UME.setItem(i, UDE[i]) : (_UME.setAttribute(i, UDE[i]), _UME.save("us")));
            }
        }
        return this;

    },
    /**
    * storage事件回调
    * @param  {number} U.DW.local实例对象
    */
    storage: function (UE) {
        if (this.UDE.event) {
            var _UCB = this.UDE.event; //storage 事件回调函数
            if (UE.newValue == null) { //storage是新值改变
                UE = U.DW.local.iep(this); //生成 storgeevent事件
            }
            (_UCB && UE) && (_UCB(UE)); //回到到指定
            U.M.StopBubble(); //
        }
    },
    /**
    * 事件绑定
    * @param  {number} U.DW.local实例对象
    * @param  {number} U.DW.local实例对象
    */
    get: function (UIE) { //获取值
        if (this.UJE) {
            var i, _UME = this.UJE,
            _USE = {},
            _UTP = this.UTF ? "getItem" : (_UME.load("us"), "getAttribute");
            if (U.Ut.isString(UIE)) { //普通字符串获取
                return _UME[_UTP](UIE);
            }
            if (U.Ut.isArray(UIE)) { //数组获取
                for (i = 0; i < UIE.length; i++) {
                    _USE[UIE[i]] = _UME[_UTP](UIE[i]);
                }
            }
            else if (U.Ut.isObject(UIE)) { //对象获取
                for (i in UIE) { (UIE.hasOwnProperty(i)) && (_USE[i] = _UME[_UTP](i)); }
            }
            return _USE;
        }
    },
    /**
    * 获取所有的值
    * @return  {number} U.DW.local实例对象
    */
    getAll: function () {
        var i, _UKE, _USE = {},
        _UME = this.UJE;
        if (this.UTF) { //h5处理
            for (i = 0; i < _UME.length; i++) {
                _UKE = this.key(i); //获取指定的位置的key
                _USE[_UKE] = this.get(_UKE); //根据key获取值
            }
        }
        else { //ie处理
            _UME = _UME.XMLDocument.documentElement.attributes;
            for (i = 0; i < _UME.length; i++) {
                _USE[_UME[i].name] = _UME[i].nodeValue;
            }
        }
        return _USE;
    },
    //获取所有的键
    getAllKey: function () {
        if (this.UJE) {
            var _UME = this.UJE,
            _USE = [];
            if (this.UTF) {
                for (i = 0; i < _UME.length; i++) {
                    _USE.push(this.key(i));
                }
            }
            else {
                _UME = _UME.XMLDocument.documentElement.attributes;
                for (i = 0; i < _UME.length; i++) { _USE.push(_UME[i].name); }
            }

            return _USE;
        }
    },
    /**
    * 移除值
    * @param  {string 、 object} 移除的键值
    * @return  {object} 本地存储类
    */
    remove: function (UIE) {
        if (this.UJE) {
            var i,
            _UME = this.UJE,
            _UTP = this.UTF ? "removeItem" : "removeAttribute"; //兼容删除的内容
            if (U.Ut.isString(UIE)) { //普通删除
                _UME[_UTP](UIE);
            }
            else if (U.Ut.isArray(UIE)) { //普通的通过key删除
                for (i = 0; i < UIE.length; i++) {
                    _UME[_UTP](UIE[i]);
                }
            }
            else { //对象删除
                for (i in UIE) {
                    (UIE.hasOwnProperty(i)) && (_UME[_UTP](i));
                }
            }
            (!this.UTF) && (_UME.save("us")); //ie还需要保存操作
        } return this;
    },
    //移除所有的存储
    clear: function () {
        if (this.UJE) {
            if (this.UTF) { this.UJE.clear(); } //HTML5
            else { //ie处理删除
                var i, _UME = this.UJE;
                _UME.load("us");
                _UME = _UME.XMLDocument.documentElement.attributes;  //所有的本地存储属性
                for (i = 0; i < _UME.length; i++) { _UME.remove(_UME[i].name); } //循环删除
            }
        }
    },
    /**
    * 索引值
    * @param  {string} 键值
    * @return  {string} 键值对应值
    */
    key: function (UI) {
        if (this.UJE) {
            if (this.UTF) { //html5获取值
                return this.UJE.key(UI);
            }
            else { //ie获取
                var _UME = this.UJE;
                _UME.load("us"), //获取所有存储的值
                _UDM = _UME.XMLDocument.documentElement.attrbutes;
                if (_UDM[UI]) { //判断是否存在该键值的值
                    return _UDM[UI].name;
                }
            }
        }
    },
    //获取长度
    length: function () {
        if (this.UJE) {
            if (this.UTF) { return this.UJE.length; } //html5获取值
            else { //ie获取
                var _UL, _UDM,
                _UME = this.UJE;
                _UME.load("us");
                _UDM = _UME.XMLDocument; //获取所有存储的值
                ((_UDM = _UDM.childNodes[0]) && (_UL = _UDM.attributes.length));
                return _UL;
            }
        }
    }
}

//#endregion