﻿// Kræver jQuery
var $state = function() {
    /// <summary>Klientside state-objekt</summary>
    var _encode = true;
    // Private objekter
    var _dict = {};
    var _serialize = function() {
        var res = "";
        for (var key in _dict) {
            res += (res ? "|" : "") + key + "=" + _dict[key];
        }
        if (_encode)
            res = base64.encode(res);

        return res;
    };
    var _deserialize = function(data) {
        if (_encode)
            data = base64.decode(data.slice(1));

        var items = data.split(/[|#]/g);
        for (var i = 0, l = items.length; i < l; i++) {
            if (!items[i])
                continue;
            var kevValue = items[i].split('=');
            if (kevValue.length < 2)
                continue;
            _dict[kevValue[0]] = kevValue[1];
        }
    };
    var _save = function() {
        location.hash = _serialize();
    };

    var _raiseEvent = function(event) {
        if (event && typeof (event) == "function") {
            event();
        }
    }

    // Initialicering
    _deserialize(location.hash);
    $(document).ready(function() {
        for (var key in _dict) {
            $("#" + key).val(_dict[key]);
        }
    });

    // Public / offentlige objekter
    return {
        set: function(key, value) {
            _dict[key] = value;
            _save();
            _raiseEvent(this.onChange);
        },
        setRange: function(range) {
            range.each(function(item, i) {
                _dict[item[0]] = item[1];
            });
            _save();
            _raiseEvent(this.onChange);
        },
        get: function(key, defaultValue) {
            /// <summary>Udleder værdien fra hash-staten</summary>
            if (typeof (_dict[key]) == "undefined")
                return defaultValue;
            return _dict[key];
        },
        hookup: function(id) {
            /// <summary>Opsætter changehandler til at afspejle værdi i state</summary>
            ///<param name="id" type="jQuery query" />
            $(id).change(function() {
                var $caller = $(this);
                $state.set($caller.attr("id"), $caller.val());
            });
        },
        onChange: null
    };
} ();
