jstorage.js 7.54 KB
!function(){function e(){var e=!1;if("localStorage"in window)try{window.localStorage.setItem("_tmptest","tmpval"),e=!0,window.localStorage.removeItem("_tmptest")}catch(e){}if(e)try{window.localStorage&&(b=window.localStorage,T="localStorage",O=b.jStorage_update)}catch(e){}else if("globalStorage"in window)try{window.globalStorage&&(b="localhost"==window.location.hostname?window.globalStorage["localhost.localdomain"]:window.globalStorage[window.location.hostname],T="globalStorage",O=b.jStorage_update)}catch(e){}else{if(v=document.createElement("link"),!v.addBehavior)return void(v=null);v.style.behavior="url(#default#userData)",document.getElementsByTagName("head")[0].appendChild(v);try{v.load("jStorage")}catch(e){v.setAttribute("jStorage","{}"),v.save("jStorage"),v.load("jStorage")}var t="{}";try{t=v.getAttribute("jStorage")}catch(e){}try{O=v.getAttribute("jStorage_update")}catch(e){}b.jStorage=t,T="userDataBehavior"}s(),_(),r(),c(),"addEventListener"in window&&window.addEventListener("pageshow",function(e){e.persisted&&a()},!1)}function t(){var e="{}";if("userDataBehavior"==T){v.load("jStorage");try{e=v.getAttribute("jStorage")}catch(e){}try{O=v.getAttribute("jStorage_update")}catch(e){}b.jStorage=e}s(),_(),c()}function r(){"localStorage"==T||"globalStorage"==T?"addEventListener"in window?window.addEventListener("storage",a,!1):document.attachEvent("onstorage",a):"userDataBehavior"==T&&setInterval(a,1e3)}function a(){var e;clearTimeout(L),L=setTimeout(function(){if("localStorage"==T||"globalStorage"==T)e=b.jStorage_update;else if("userDataBehavior"==T){v.load("jStorage");try{e=v.getAttribute("jStorage_update")}catch(e){}}e&&e!=O&&(O=e,o())},25)}function o(){var e,r=h.parse(h.stringify(p.__jstorage_meta.CRC32));t(),e=h.parse(h.stringify(p.__jstorage_meta.CRC32));var a,o=[],i=[];for(a in r)if(r.hasOwnProperty(a)){if(!e[a]){i.push(a);continue}r[a]!=e[a]&&"2."==String(r[a]).substr(0,2)&&o.push(a)}for(a in e)e.hasOwnProperty(a)&&(r[a]||o.push(a));n(o,"updated"),n(i,"deleted")}function n(e,t){if(e=[].concat(e||[]),"flushed"==t){e=[];for(var r in C)C.hasOwnProperty(r)&&e.push(r);t="deleted"}for(var a=0,o=e.length;a<o;a++){if(C[e[a]])for(var n=0,i=C[e[a]].length;n<i;n++)C[e[a]][n](e[a],t);if(C["*"])for(var n=0,i=C["*"].length;n<i;n++)C["*"][n](e[a],t)}}function i(){var e=(+new Date).toString();"localStorage"==T||"globalStorage"==T?b.jStorage_update=e:"userDataBehavior"==T&&(v.setAttribute("jStorage_update",e),v.save("jStorage")),a()}function s(){if(b.jStorage)try{p=h.parse(String(b.jStorage))}catch(e){b.jStorage="{}"}else b.jStorage="{}";y=b.jStorage?String(b.jStorage).length:0,p.__jstorage_meta||(p.__jstorage_meta={}),p.__jstorage_meta.CRC32||(p.__jstorage_meta.CRC32={})}function u(){d();try{b.jStorage=h.stringify(p),v&&(v.setAttribute("jStorage",b.jStorage),v.save("jStorage")),y=b.jStorage?String(b.jStorage).length:0}catch(e){}}function g(e){if(!e||"string"!=typeof e&&"number"!=typeof e)throw new TypeError("Key name must be string or numeric");if("__jstorage_meta"==e)throw new TypeError("Reserved key name");return!0}function _(){var e,t,r,a,o=1/0,s=!1,g=[];if(clearTimeout(m),p.__jstorage_meta&&"object"==typeof p.__jstorage_meta.TTL){e=+new Date,r=p.__jstorage_meta.TTL,a=p.__jstorage_meta.CRC32;for(t in r)r.hasOwnProperty(t)&&(r[t]<=e?(delete r[t],delete a[t],delete p[t],s=!0,g.push(t)):r[t]<o&&(o=r[t]));o!=1/0&&(m=setTimeout(_,o-e)),s&&(u(),i(),n(g,"deleted"))}}function c(){var e,t;if(p.__jstorage_meta.PubSub){var r,a=D;for(e=t=p.__jstorage_meta.PubSub.length-1;e>=0;e--)r=p.__jstorage_meta.PubSub[e],r[0]>D&&(a=r[0],l(r[1],r[2]));D=a}}function l(e,t){if(P[e])for(var r=0,a=P[e].length;r<a;r++)P[e][r](e,h.parse(h.stringify(t)))}function d(){if(p.__jstorage_meta.PubSub){for(var e=+new Date-2e3,t=0,r=p.__jstorage_meta.PubSub.length;t<r;t++)if(p.__jstorage_meta.PubSub[t][0]<=e){p.__jstorage_meta.PubSub.splice(t,p.__jstorage_meta.PubSub.length-t);break}p.__jstorage_meta.PubSub.length||delete p.__jstorage_meta.PubSub}}function f(e,t){p.__jstorage_meta||(p.__jstorage_meta={}),p.__jstorage_meta.PubSub||(p.__jstorage_meta.PubSub=[]),p.__jstorage_meta.PubSub.unshift([+new Date,e,t]),u(),i()}function S(e,t){for(var r,a=e.length,o=t^a,n=0;a>=4;)r=255&e.charCodeAt(n)|(255&e.charCodeAt(++n))<<8|(255&e.charCodeAt(++n))<<16|(255&e.charCodeAt(++n))<<24,r=1540483477*(65535&r)+((1540483477*(r>>>16)&65535)<<16),r^=r>>>24,r=1540483477*(65535&r)+((1540483477*(r>>>16)&65535)<<16),o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16)^r,a-=4,++n;switch(a){case 3:o^=(255&e.charCodeAt(n+2))<<16;case 2:o^=(255&e.charCodeAt(n+1))<<8;case 1:o^=255&e.charCodeAt(n),o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16)}return o^=o>>>13,o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16),o^=o>>>15,o>>>0}var j="0.4.3",w=window.jQuery||window.$||(window.$={}),h={parse:window.JSON&&(window.JSON.parse||window.JSON.decode)||String.prototype.evalJSON&&function(e){return String(e).evalJSON()}||w.parseJSON||w.evalJSON,stringify:Object.toJSON||window.JSON&&(window.JSON.stringify||window.JSON.encode)||w.toJSON};if(!h.parse||!h.stringify)throw new Error("No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page");var m,p={__jstorage_meta:{CRC32:{}}},b={jStorage:"{}"},v=null,y=0,T=!1,C={},L=!1,O=0,P={},D=+new Date,A={isXML:function(e){var t=(e?e.ownerDocument||e:0).documentElement;return!!t&&"HTML"!==t.nodeName},encode:function(e){if(!this.isXML(e))return!1;try{return(new XMLSerializer).serializeToString(e)}catch(t){try{return e.xml}catch(e){}}return!1},decode:function(e){var t,r="DOMParser"in window&&(new DOMParser).parseFromString||window.ActiveXObject&&function(e){var t=new ActiveXObject("Microsoft.XMLDOM");return t.async="false",t.loadXML(e),t};return!!r&&(t=r.call("DOMParser"in window&&new DOMParser||window,e,"text/xml"),!!this.isXML(t)&&t)}};w.jStorage={version:j,set:function(e,t,r){if(g(e),r=r||{},"undefined"==typeof t)return this.deleteKey(e),t;if(A.isXML(t))t={_is_xml:!0,xml:A.encode(t)};else{if("function"==typeof t)return;t&&"object"==typeof t&&(t=h.parse(h.stringify(t)))}return p[e]=t,p.__jstorage_meta.CRC32[e]="2."+S(h.stringify(t),2538058380),this.setTTL(e,r.TTL||0),n(e,"updated"),t},get:function(e,t){return g(e),e in p?p[e]&&"object"==typeof p[e]&&p[e]._is_xml?A.decode(p[e].xml):p[e]:"undefined"==typeof t?null:t},deleteKey:function(e){return g(e),e in p&&(delete p[e],"object"==typeof p.__jstorage_meta.TTL&&e in p.__jstorage_meta.TTL&&delete p.__jstorage_meta.TTL[e],delete p.__jstorage_meta.CRC32[e],u(),i(),n(e,"deleted"),!0)},setTTL:function(e,t){var r=+new Date;return g(e),t=Number(t)||0,e in p&&(p.__jstorage_meta.TTL||(p.__jstorage_meta.TTL={}),t>0?p.__jstorage_meta.TTL[e]=r+t:delete p.__jstorage_meta.TTL[e],u(),_(),i(),!0)},getTTL:function(e){var t,r=+new Date;return g(e),e in p&&p.__jstorage_meta.TTL&&p.__jstorage_meta.TTL[e]?(t=p.__jstorage_meta.TTL[e]-r,t||0):0},flush:function(){return p={__jstorage_meta:{CRC32:{}}},u(),i(),n(null,"flushed"),!0},storageObj:function(){function e(){}return e.prototype=p,new e},index:function(){var e,t=[];for(e in p)p.hasOwnProperty(e)&&"__jstorage_meta"!=e&&t.push(e);return t},storageSize:function(){return y},currentBackend:function(){return T},storageAvailable:function(){return!!T},listenKeyChange:function(e,t){g(e),C[e]||(C[e]=[]),C[e].push(t)},stopListening:function(e,t){if(g(e),C[e]){if(!t)return void delete C[e];for(var r=C[e].length-1;r>=0;r--)C[e][r]==t&&C[e].splice(r,1)}},subscribe:function(e,t){if(e=(e||"").toString(),!e)throw new TypeError("Channel not defined");P[e]||(P[e]=[]),P[e].push(t)},publish:function(e,t){if(e=(e||"").toString(),!e)throw new TypeError("Channel not defined");f(e,t)},reInit:function(){t()}},e()}();