FLocation = function() {
    function _getHash() {
        return window.location.hash.toString().substr(1);
    }
    var _title = document.title;
    document.title = _title;
    var hash = _getHash();

    var timer;
    var timerInterval = 500;

    /** Массив фунцкий обработчиков */
    var listeners = new Array();

    /**
     * Назначает обработчик
     */
    function setupHandler() {
        timer = window.setInterval(hashChangeHandler, timerInterval);

    }

    /**
     * Убивает обработчик
     */
    function dropHandler() {
        if (timer)
            window.clearInterval(timer);
    }

    /**
     * Обработчик смены location
     */
    function hashChangeHandler() {
        var locationHash = _getHash();
        document.getElementById('right-bar').innerHMTL += 'locationHash' + ' ... ' + hash;
        if (hash != locationHash) {
            dropHandler();
            hash = locationHash;
            for (var i = 0; i < listeners.length; i++) {
                listeners[i].call();
            }
            if (listeners.length > 0)
                setupHandler();
        }
    }

    return {
        /**
         * Устанавливает новый location
         * @param {String} newLocation
         */
        set: function(newLocation) {
            window.location = newLocation;
        },

        /**
         * Возвращает якорь
         */
        getHash: function() {
            return hash;
        },

        /**
         * Устанавливает якорь
         * @param {String} newHash
         * @param {Boolean} preventHandler отменить действие хэндлера
         */
        setHash: function(newHash, preventHandler) {
            if (hash == newHash)
                return;
            if (preventHandler)
                hash = newHash;
            window.location = '#' + newHash;
            document.title = _title;
        },

        /**
         * Добавляет обработчик к остлеживанию hash
         * @param {Function} callbackFunction фунцкия-обработки
         */
        attachListener: function(callbackFunction) {
            if (callbackFunction) {
                listeners.push(callbackFunction);
                if (listeners.length == 1)
                    setupHandler();
            }
        },

        /**
         * Убирает обработчик к остлеживанию hash
         * @param {Function} callbackFunction фунцкия-обработки
         */
        detachListener: function(callbackFunction) {
            var fIndex = listeners.indexOf(callbackFunction);
            if (fIndex > -1) {
                listeners.splice(fIndex, 1);
                if (listeners.length == 0)
                    dropHandler();
            }
        }
    }

}();


