--- /dev/null
+/**\r
+ * Created by Vincent on 03/06/2015.\r
+ */\r
+try {\r
+ // Test webstorage existence.\r
+ if (!window.localStorage || !window.sessionStorage) throw "exception";\r
+ // Test webstorage accessibility - Needed for Safari private browsing.\r
+ localStorage.setItem('storage_test', 1);\r
+ localStorage.removeItem('storage_test');\r
+} catch (e) {\r
+ (function () {\r
+ var Storage = function (type) {\r
+ function createCookie(name, value, days) {\r
+ var date, expires;\r
+\r
+ if (days) {\r
+ date = new Date();\r
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r
+ expires = "; expires=" + date.toGMTString();\r
+ } else {\r
+ expires = "";\r
+ }\r
+ document.cookie = name + "=" + value + expires + "; path=/";\r
+ }\r
+\r
+ function readCookie(name) {\r
+ var nameEQ = name + "=",\r
+ ca = document.cookie.split(';'),\r
+ i, c;\r
+\r
+ for (i = 0; i < ca.length; i++) {\r
+ c = ca[i];\r
+ while (c.charAt(0) == ' ') {\r
+ c = c.substring(1, c.length);\r
+ 2480\r
+ }\r
+\r
+ if (c.indexOf(nameEQ) == 0) {\r
+ return c.substring(nameEQ.length, c.length);\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ function setData(data) {\r
+ // Convert data into JSON and encode to accommodate for special characters.\r
+ data = encodeURIComponent(JSON.stringify(data));\r
+ // Create cookie.\r
+ if (type == 'session') {\r
+ createCookie(getSessionName(), data, 365);\r
+ } else {\r
+ createCookie('localStorage', data, 365);\r
+ }\r
+ }\r
+\r
+ function clearData() {\r
+ if (type == 'session') {\r
+ createCookie(getSessionName(), '', 365);\r
+ } else {\r
+ createCookie('localStorage', '', 365);\r
+ }\r
+ }\r
+\r
+ function getData() {\r
+ // Get cookie data.\r
+ var data = type == 'session' ? readCookie(getSessionName()) : readCookie('localStorage');\r
+ // If we have some data decode, parse and return it.\r
+ return data ? JSON.parse(decodeURIComponent(data)) : {};\r
+ }\r
+\r
+ function getSessionName() {\r
+ // If there is no name for this window, set one.\r
+ // To ensure it's unquie use the current timestamp.\r
+ if (!window.name) {\r
+ window.name = new Date().getTime();\r
+ }\r
+ return 'sessionStorage' + window.name;\r
+ }\r
+\r
+ // Initialise if there's already data.\r
+ var data = getData();\r
+\r
+ return {\r
+ length: 0,\r
+ clear: function () {\r
+ data = {};\r
+ this.length = 0;\r
+ clearData();\r
+ },\r
+ getItem: function (key) {\r
+ return data[key] === undefined ? null : data[key];\r
+ },\r
+ key: function (i) {\r
+ // not perfect, but works\r
+ var ctr = 0;\r
+ for (var k in data) {\r
+ if (ctr == i) return k;\r
+ else ctr++;\r
+ }\r
+ return null;\r
+ },\r
+ removeItem: function (key) {\r
+ delete data[key];\r
+ this.length--;\r
+ setData(data);\r
+ },\r
+ setItem: function (key, value) {\r
+ data[key] = value + ''; // forces the value to a string\r
+ this.length++;\r
+ setData(data);\r
+ }\r
+ };\r
+ };\r
+\r
+ // Replace window.localStorage and window.sessionStorage with out custom\r
+ // implementation.\r
+ var localStorage = new Storage('local');\r
+ var sessionStorage = new Storage('session');\r
+ window.localStorage = localStorage;\r
+ window.sessionStorage = sessionStorage;\r
+ // For Safari private browsing need to also set the proto value.\r
+ window.localStorage.__proto__ = localStorage;\r
+ window.sessionStorage.__proto__ = sessionStorage;\r
+ })();\r
+}\r