(function (scope, hex_md5) {
    "use strict";
    var localstorage;
    if (typeof localStorage !== "undefined") {
        localstorage = {
            getItem: function (item) {
                var value = localStorage.getItem(item);
                return value === null? null: JSON.parse(value);
            },
            setItem: function (item, value) {
                return localStorage.setItem(item, JSON.stringify(value));
            },
            removeItem: function (item) {
                delete localStorage[item];
            },
            clone: function () {
                return JSON.parse(JSON.stringify(localStorage));
            }
        };
    } else {
        (function () {
            var pseudo_localStorage = {};
            localstorage = {
                getItem: function (item) {
                    var value = pseudo_localStorage[item];
                    return value === undefined?
                        null: JSON.parse(pseudo_localStorage[item]);
                },
                setItem: function (item, value) {
                    return pseudo_localStorage[item] = JSON.stringify(value);
                },
                removeItem: function (item) {
                    delete pseudo_localStorage[item];
                },
                clone: function () {
                    return JSON.parse(JSON.stringify(pseudo_localStorage));
                }
            };
        }());
    }