﻿TESCO.$('system.BitState').Manager = function() {

    var _cookie;
    var _bitState;

    function _domainAndOwner(domainName, owner) {
        if (!owner) { owner = 0; }
        if (typeof owner == "number") { owner = owner.toString(16).toUpperCase(); };
        return TESCO.system.BitState.Domain[domainName] + ":" + owner;
    }

    function _serializeBitState() {
        var _resultArray = [];
        for (var key in _bitState) {
            if (_bitState.hasOwnProperty(key)) {
                _resultArray.push(key + ":" + _bitState[key]);
            }
        }
        return _resultArray.join(',');
    }

    function _deserializeBitState() {
        _cookie = new TESCO.system.Cookie(TESCO.sites.Configuration.application.stateCookieName, null, TESCO.sites.Configuration.application.domain.cookie);
        _bitState = {};

        var _bitStateString = _cookie.getValueByName('BitSt');

        if (!_bitStateString) return;

        var _bitStatoids = _bitStateString.split(',');

        for (var i = 0; i < _bitStatoids.length; i++) {
            var _bitStatoid = _bitStatoids[i];
            _bitState[_bitStatoid.substring(0, _bitStatoid.lastIndexOf(':'))] = _bitStatoid.substring(_bitStatoid.lastIndexOf(':') + 1);
        }
    }

    function _constructor() {
        _deserializeBitState();
    }

    _constructor.prototype.getFlags = function(domainName, owner) {
        _deserializeBitState();
        var domainAndOwner = _domainAndOwner(domainName, owner);
        var result = parseInt(_bitState[domainAndOwner], 16);
        result = isNaN(result) ? 0 : result;
        return result;
    }

    _constructor.prototype.setFlag = function(domainName, owner, flagName) {
        _deserializeBitState();
        var domainAndOwner = _domainAndOwner(domainName, owner);
        _bitState[domainAndOwner] = (parseInt(_bitState[domainAndOwner], 16) | flagName).toString(16).toUpperCase();
        var _bitStateString = _serializeBitState.call(this);
        _cookie.setValueByName('BitSt', _bitStateString);
    }

    _constructor.prototype.clearFlag = function(domainName, owner, flagName) {
        var domainAndOwner = _domainAndOwner(domainName, owner);

        // Clearing like this because javascript does not have unsigned integers
        if (this.isFlagSelected(domainName, owner, flagName)) {
            _bitState[domainAndOwner] = (parseInt(_bitState[domainAndOwner], 16) - flagName).toString(16).toUpperCase();
        }

        var _bitStateString = _serializeBitState.call(this);
        _cookie.setValueByName('BitSt', _bitStateString);
    }

    _constructor.prototype.isFlagSelected = function(domainName, owner, flagName) {
        return !!(this.getFlags(domainName, owner) & flagName)
    }

    return new _constructor();
} ();