all files / js/ elementsPool.js

100% Statements 64/64
94.59% Branches 35/37
100% Functions 11/11
100% Lines 64/64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112       47× 47× 47× 47×   99× 99× 47×   99× 48×             1784×     1918×   1918× 231× 231× 231×           1687×   1918× 441× 441×     1918×     451× 451× 451× 451× 441× 441×   441× 441×   441× 441× 441× 441× 441× 441×   1133× 1133× 1067×   66×     453×   453× 1322×   1322×         1204× 231× 231× 231×     118× 118× 113× 113×             47× 47× 118×   47× 47× 47×      
define(['utils', 'IPlugin'], function(Utils, IPlugin) {
    "use strict";
 
    function ElementsPool(mainDiv, screenManager) {
        this._mainDiv = mainDiv;
        this._screenManager = screenManager;
        this._elements = {};
        this._elementsBySide = {};
    }
    Utils.inherite(ElementsPool, IPlugin);
    ElementsPool.prototype.configure = function(config) {
        Eif (typeof config === 'object') {
            if (config.loadingHtml !== undefined) {
                this._loadingHtml = config.loadingHtml;
            }
            if (config.saveHistoryInPool !== undefined) {
                this._saveHistoryInPool = config.saveHistoryInPool;
            }
        }
    };
 
    // todo load зависит от prepare, поэтому из prepare надо возвращать функцию load
    ElementsPool.prototype.prepareSide = function() {
        function getScreen(side) {
            return self._screenManager._getRelativeScreenByScreen(newScreen, side);
        }
        function prepareRelativeSide(side, screen) {
            var id = screen.toString(),
                element;
            if (!self._elements.hasOwnProperty(id)) {
                element = $('<div class="rb__side rb__hidden rb__loading" data-id="' + id + '">' + self._loadingHtml + '</div>');
                self._mainDiv.prepend(element);
                self._elements[id] = {
                    element: element,
                    screen: screen,
                    state: 'loading'
                };
            } else {
                element = self._elements[id].element;
            }
            if (side === 'center') {
                element.toggleClass('rb__center', true);
                element.toggleClass('rb__hidden', false);
            }
 
            self._elementsBySide[side] = id;
        }
 
        var newScreen = this._screenManager.getCurScreen(),
            self = this,
            leftScreen = getScreen('left'),
            topScreen = getScreen('top'),
            rightScreen = getScreen('right'),
            bottomScreen = getScreen('bottom');
 
        this.getElementBySide('center').toggleClass('rb__center', false);
        this._mainDiv.find('>.rb__side').toggleClass('rb__hidden', true);
 
        self._elementsBySide = {};
        newScreen && prepareRelativeSide('center', newScreen);
        leftScreen && prepareRelativeSide('left', leftScreen);
        topScreen && prepareRelativeSide('top', topScreen);
        rightScreen && prepareRelativeSide('right', rightScreen);
        bottomScreen && prepareRelativeSide('bottom', bottomScreen);
    };
    ElementsPool.prototype.getElementBySide = function(side) {
        var id = this._elementsBySide[side];
        if (id) {
            return this._elements[id].element;
        } else {
            return $();
        }
    };
    ElementsPool.prototype.loadElements = function() {
        var self = this;
 
        Object.keys(this._elements).forEach(function(id) { // todo вынести forEach для объекта в utils
            var elem = self._elements[id];
 
            if (self._elementsBySide['center'] === id // todo стремная проверка, рефакторить
                || self._elementsBySide['left'] === id
                || self._elementsBySide['top'] === id
                || self._elementsBySide['right'] === id
                || self._elementsBySide['bottom'] === id) {
                if (elem.state === 'loading') {
                    elem.element.html(elem.screen.html());
                    elem.element.toggleClass('rb__loading', false);
                    elem.state = 'loaded';
                }
            } else {
                Eif (elem.screen.isTemporary()) {
                    if (!(self._saveHistoryInPool && self._screenManager._containsHistory(self._elements[id].screen))) {
                        self._elements[id].element.remove();
                        delete self._elements[id];
                    }
                }
            }
        });
    };
 
    ElementsPool.prototype.destroy = function() {
        var self = this;
        Object.keys(this._elements).forEach(function(id) {
            self._elements[id].element.remove();
        });
        this._elements = null;
        this._elementsBySide = null;
        this._screenManager = null;
    };
 
    return ElementsPool;
});