Your IP : 3.128.180.89


Current Path : /usr/local/mgr5/skins/orion/devel/
Upload File :
Current File : //usr/local/mgr5/skins/orion/devel/app-desktop.js

/**
 * namespace APP
 */
var App = App || {};


/**
 * Init method of application
 */
App.init = function() {
  'use strict';
  App.mgr();

  //core methods here
  function nextEventBind(e, data) {
    var event = data.event,
        cb = data.cb,
        tData = data.tData;
    if (typeof cb === 'function') {
      EventMgr.one(event, cb, tData);
    }
  }

  EventMgr.bind('nextEventBind', nextEventBind);
};


/**
 * Global vars
 */
App.Global = function() {
  'use strict';
  var HeaderMoving = false,
      bannerHtml = null,
      warning = [],
      anychartXML = null,
      selid,
      scrollTop,
      targetId = '',
      msg = {};

  return {
    HeaderMoving: HeaderMoving,
    bannerHtml: bannerHtml,
    warning: warning,
    anychartXML: anychartXML,
    selid: selid,
    scrollTop: scrollTop,
    msg: msg,
    targetId: targetId
  };
}();

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 * Module with utilits
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 */
/*global App:true*/
App.u = App.Common = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.on($(window.document), linkSelector, 'keydown', linkKeyDownHandler);
  },
      ENTERKEY = 13,
      SPACE = 32,
      linkSelector = 'a',
      getQueryString = function getQueryString(queryObj, noesc) {
    var j = 0,
        paramString = '',
        curValue,
        keyVar;
    for (keyVar in queryObj) {
      if (keyVar !== '') {
        if (j !== 0) {
          paramString += '&';
        }
        curValue = queryObj[keyVar];
        //encode params
        if (noesc) {
          paramString += keyVar + '=' + curValue;
        } else {
          paramString += keyVar + '=' + encodeURIComponent(curValue);
        }
        j++;
      }
    }
    return paramString;
  },

  //parse url to object
  //@todo unit test
  parseParams = function parseParams(paramString) {
    if (paramString !== undefined && paramString !== null) {
      paramString = paramString.replace(/^\?/, '');
      var paramStirngArray = paramString.split('&'),
          paramStirngObj = {},
          re = /=(.+)?/,
          tmp;
      for (var i = 0; i < paramStirngArray.length; i++) {
        tmp = paramStirngArray[i].split(re);
        paramStirngObj[tmp[0]] = tmp[1] ? tmp[1] : '';
      }
      return paramStirngObj;
    } else {
      return {};
    }
  },

  //@todo unit test
  serializeForAttr = function serializeForAttr(obj) {
    var keyVar,
        paramStr = '',
        i = 0;
    /* jslint forin:true */
    for (keyVar in obj) {
      i++;
      if (i !== 1) {
        paramStr += '&';
      }
      paramStr += keyVar + '=' + encodeURIComponent(obj[keyVar]);
    }
    return paramStr;
  },


  //from here
  // http://www.jonefox.com/blog/2009/05/21/internet-explorer-and-the-innerhtml-property/
  replaceHtml = function replaceHtml(el, html) {
    if (el) {
      var oldEl = typeof el === 'string' ? document.getElementById(el) : el,
          newEl = document.createElement(oldEl.nodeName);
      //Preserve any properties we care about (id and class in this example)
      newEl.id = oldEl.id;
      newEl.className = oldEl.className;
      //set the new HTML and insert back into the DOM
      newEl.innerHTML = html;
      if (oldEl.parentNode) {
        oldEl.parentNode.replaceChild(newEl, oldEl);
      } else {
        oldEl.innerHTML = html;
      }
      //return a reference to the new element in case we need it
      oldEl = null;
      return newEl;
    }
  },
      linkKeyDownHandler = function linkKeyDownHandler(e) {
    var codeKey = e.which || e.keyCode;
    if (ENTERKEY === codeKey || SPACE === codeKey) {
      $(this).trigger('click');
      e.preventDefault();
    }
  },
      wordWrap = function wordWrap(str, wordLen) {
    if (!str) {
      return str;
    }
    wordLen = wordLen || 100;
    var wArr = str.split(' '),
        length = wArr.length,
        cWord,
        cWordLen,
        newWord,
        wordLenReg = new RegExp('(.{' + wordLen + '})', 'g');
    for (var i = 0; i < length; i++) {
      if (wArr[i].length > wordLen) {
        cWord = wArr[i].split(wordLenReg);
        cWordLen = cWord.length;
        newWord = '';
        for (var j = 0; j < cWordLen; j++) {
          if (cWord[j] !== '') {
            newWord += cWord[j] + '<br>';
          }
        }
        str = str.replace(wArr[i], newWord);
        //replace \n to <br/>
        str = str.replace(/\n/g, '<br/>');
      }
    }
    return str;
  },
      injectCss = function injectCss(url) {
    var link = document.createElement('link');
    link.setAttribute('rel', 'stylesheet');
    link.setAttribute('type', 'text/css');
    link.setAttribute('href', url);
    document.getElementsByTagName('head')[0].appendChild(link);
  },
      required = function required(file, callback, param) {
    var script = document.getElementsByTagName('script')[0],
        newjs = document.createElement('script');

    newjs.onreadystatechange = function () {
      if (newjs.readyState === 'loaded' || newjs.readyState === 'complete') {
        newjs.onreadystatechange = null;
        if (App.u.isFunction(callback)) {
          callback(param);
          param = null;
          file = null;
        }
      }
    };

    newjs.onload = function () {
      if (App.u.isFunction(callback)) {
        callback(param);
        param = null;
        file = null;
      }
    };

    newjs.src = file;
    script.parentNode.insertBefore(newjs, script);
  },
      noMoreId = {},
      noMoreCheckTimeId,
      noMoreThan = function noMoreThan(id, timeOut, func) {
    var time = new Date().getTime(),
        dTime;
    timeOut = timeOut ? timeOut : 100;
    if (!noMoreId[id]) {
      noMoreId[id] = {
        q: false,
        lastRun: time,
        timeOut: timeOut
      };
      runFunc(func, time, id);
    } else {
      dTime = time - noMoreId[id].lastRun;
      //check for timeout
      if (dTime > timeOut) {
        runFunc(func, time, id);
        clearTimeout(noMoreCheckTimeId);
        //to queue
      } else {
        noMoreId[id].q = true;
        clearTimeout(noMoreCheckTimeId);
        //todo closure
        noMoreCheckTimeId = setTimeout(function () {
          checkLastCall(func, time, id);
        }, timeOut * 2);
      }
    }
  },
      checkLastCall = function checkLastCall(func, time, id) {
    if (noMoreId[id].q === true) {
      runFunc(func, time, id);
    }
  },
      runFunc = function runFunc(func, time, id) {
    if (typeof func === 'function') {
      func();
      noMoreId[id].lastRun = time;
      noMoreId[id].q = false;
    }
  },
      clone = function clone(obj) {
    // Handle the 3 simple types, and null or undefined
    if (null === obj || 'object' !== (typeof obj === 'undefined' ? 'undefined' : _typeof(obj))) {
      return obj;
    }
    var copy;
    // Handle Date
    if (obj instanceof Date) {
      copy = new Date();
      copy.setTime(obj.getTime());
      return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
      copy = [];
      for (var i = 0, len = obj.length; i < len; i++) {
        copy[i] = clone(obj[i]);
      }
      return copy;
    }

    // Handle Object
    if (obj instanceof Object) {
      copy = {};
      for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) {
          copy[attr] = clone(obj[attr]);
        }
      }
      return copy;
    }

    throw new Error("Unable to copy obj! Its type isn't supported.");
  },
      msg = {},
      storage = { breadcrumb: {}, dashboard: {} },

  /**
   * Cache jQuery Selector for static elems
   */
  selectorCache = function () {
    var selectors = {};
    return function (selector) {
      if (selectors[selector]) {
        return selectors.selector;
      }
      selectors.selector = $(selector);
      return selectors.selector;
    };
  }(),

  //check for string
  isString = function isString(string) {
    return typeof string === 'string';
  },

  //check for function
  isFunction = function isFunction(func) {
    return typeof func === 'function';
  },

  //check for type Number
  isNumber = function isNumber(num) {
    return typeof num === 'number';
  },

  //escape regexp expression
  escapeRegExp = function escapeRegExp(str) {
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
  },

  //escape qoute & double quote
  escapeQuote = function escapeQuote(str) {
    return String(str).replace(/"/g, '&quot;');
  },
      getCaretPosition = function getCaretPosition(obj) {
    obj.focus();
    if (obj.selectionStart) {
      return obj.selectionStart;
    } else if (document.selection) {
      var sel = document.selection.createRange();
      var clone = sel.duplicate();
      sel.collapse(true);
      clone.moveToElementText(obj);
      clone.setEndPoint('EndToEnd', sel);
      return clone.text.length;
    }
    return 0;
  },
      CSSEscape = function CSSEscape(value) {
    var string = String(value);
    var length = string.length;
    var index = -1;
    var codeUnit;
    var result = '';
    var firstCodeUnit = string.charCodeAt(0);
    while (++index < length) {
      codeUnit = string.charCodeAt(index);
      // Note: there’s no need to special-case astral symbols, surrogate
      // pairs, or lone surrogates.
      // If the character is NULL (U+0000), then throw an
      // `InvalidCharacterError` exception and terminate these steps.
      if (codeUnit == 0x0000) {
        throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
      }
      if (
      // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is
      // U+007F, […]
      codeUnit >= 0x0001 && codeUnit <= 0x001F || codeUnit == 0x007F ||
      // If the character is the first character and is in the range [0-9]
      // (U+0030 to U+0039), […]
      index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039 ||
      // If the character is the second character and is in the range [0-9]
      // (U+0030 to U+0039) and the first character is a `-` (U+002D), […]
      index == 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && firstCodeUnit == 0x002D) {
        // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point
        result += '\\' + codeUnit.toString(16) + ' ';
        continue;
      }
      // If the character is not handled by one of the above rules and is
      // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or
      // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to
      // U+005A), or [a-z] (U+0061 to U+007A), […]
      if (codeUnit >= 0x0080 || codeUnit == 0x002D || codeUnit == 0x005F || codeUnit >= 0x0030 && codeUnit <= 0x0039 || codeUnit >= 0x0041 && codeUnit <= 0x005A || codeUnit >= 0x0061 && codeUnit <= 0x007A) {
        // the character itself
        result += string.charAt(index);
        continue;
      }
      // Otherwise, the escaped character.
      // http://dev.w3.org/csswg/cssom/#escape-a-character
      result += '\\' + string.charAt(index);
    }
    return result;
  },
      insertStringAfterCaret = function insertStringAfterCaret(elem, textToInsert, removeLine) {
    if (!elem || !textToInsert) {
      return;
    }
    elem.focus();
    var val = elem.value,
        end = val.length === 0 ? 0 : getCaretPosition(elem),
        start = removeLine ? val.lastIndexOf('\n', end - 1) + 1 : end,
        before = val.substring(0, start),
        after = val.substring(end);
    elem.value = before + textToInsert + after;
    var r,
        index = (before + textToInsert).length;
    if (elem.setSelectionRange) {
      elem.setSelectionRange(index, index);
    } else {
      r = elem.createTextRange();
      r.collapse(true);
      r.select(index, index);
    }
  },
      formatDateTime = function formatDateTime(timestamp) {
    var date = new Date(timestamp);
    return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2) + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + ':' + ('0' + date.getSeconds()).slice(-2);
  },
      parseDate = function parseDate(timeString) {
    var cArr = String(timeString).split(' ');
    if (cArr.length === 2) {
      var dArr = cArr[0].split('-'),
          tArr = cArr[1].split(':');
      if (dArr.length === 3 && tArr.length === 3) {
        return new Date(dArr[0], parseInt(dArr[1], 10) - 1, dArr[2], tArr[0], tArr[1], tArr[2]);
      }
    }
    return new Date();
  },

  //check file size function
  checkFileSize = function checkFileSize(tabId, name) {
    var inputFile = name ? $('#' + name + '-' + tabId) : $('#form-wrapper-' + tabId + ' input[type="file"]'),
        msg = null,
        field = null;
    inputFile.each(function () {
      var maxSize = this.getAttribute('data-max-size'),
          msgSize = this.getAttribute('data-maxsize-msg');
      field = this;
      if (this.files && maxSize) {
        maxSize -= 0;
        for (var i = 0, l = this.files.length; i < l; i++) {
          if (this.files[i].size > maxSize) {
            msg = String(pageInfo.messages.fileMaxSize).replace('__VALUE__', msgSize);
            return false;
          }
        }
      }
    });
    return {
      msg: msg,
      field: field
    };
  },
      openInNewWindow = function openInNewWindow(url, param) {
    var newwindow = window.open('', param);
    if (newwindow) {
      newwindow.openner = null;
      newwindow.location = url;
    }
  },
      removeParam = function removeParam(form, param) {
    var len = form.length,
        i,
        name;
    for (i = 0; i < len; i++) {
      name = form[i].name;
      delete param[name];
    }
    return param;
  },

  /**
   *  Устанавливаем позиционирование выпадающего списка на форме
   */
  setOptionListPosition = function setOptionListPosition(prefixId, id) {
    var elemHeight, elem, bodyHeight, elemTop, formTop, form, tabId;
    bodyHeight = window.document.body.offsetHeight;
    //calculate position for list options
    elem = $(prefixId + id);
    elem[0].style.top = '';
    elemTop = elem.offset().top;
    elemHeight = elem[0].offsetHeight;
    if (bodyHeight - elemTop < elemHeight) {
      tabId = elem[0].getAttribute('data-tabid');
      form = $('#form-scroll-' + tabId);
      if (form.length === 0) {
        //if it filter
        form = $('#tcw-' + tabId);
      }
      formTop = form.offset().top;
      if (formTop > elemTop - elemHeight - 19) {
        elem[0].style.top = '-' + elemHeight / 2 + 'px';
      } else {
        elem[0].style.top = '-' + elemHeight + 'px';
      }
    }
  },


  /**
   * Получить предыдущую html ноду
   * @param {HTMLElement} node - html node
   * @return {null | HTMLElement}
   */
  getPreviousNode = function getPreviousNode(node) {
    var el = node;
    var previousSibling = null;
    if (el) {
      while (!previousSibling && el) {
        el = el.previousSibling;
        if (el.nodeType === 1) {
          previousSibling = el;
        }
      }
    }

    return previousSibling;
  },


  /**
   * Check on refresh menu flag in response
   */
  checkRefreshMenu = function checkRefreshMenu(data) {
    if (data.refreshMenu) {
      EventMgr.trigger('favoriteMenuUpdateDone');
    }
  };

  return {
    init: init,
    setOptionListPosition: setOptionListPosition,
    parseParams: parseParams,
    replaceHtml: replaceHtml,
    serializeForAttr: serializeForAttr,
    wordWrap: wordWrap,
    required: required,
    noMoreThan: noMoreThan,
    checkRefreshMenu: checkRefreshMenu,
    clone: clone,
    injectCss: injectCss,
    msg: msg,
    removeParam: removeParam,
    storage: storage,
    selectorCache: selectorCache,
    isNumber: isNumber,
    isString: isString,
    isFunction: isFunction,
    getQueryString: getQueryString,
    escapeRegExp: escapeRegExp,
    insertStringAfterCaret: insertStringAfterCaret,
    getCaretPosition: getCaretPosition,
    escapeQuote: escapeQuote,
    formatDateTime: formatDateTime,
    parseDate: parseDate,
    checkFileSize: checkFileSize,
    openInNewWindow: openInNewWindow,
    CSSEscape: CSSEscape,
    getPreviousNode: getPreviousNode
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.Common.js.map

'use strict';

/**
 * Модуль для работы с DOM
 *  App.Dom
 * @param {object} window global object
 * @return {{addClass: function, removeClass: function,
 * toggleClass: function, byId: function, hasClass: function
 * }}
 *
 */
App.Dom = function (window) {
  'use strict';

  var doc = document,
      testAPIelem = doc.createElement('div');

  /**
   * getElementById wrapper
   * @param {String} id value of id
   * @return {?null|object}
   */
  function byId(id) {
    if (typeof id !== 'string') {
      return null;
    }
    return doc.getElementById(id);
  }

  /**
   * add class to HTMLNode
   * @param {HTMLNode} elem HTML node
   * @param {string} className name of adding class
   * @type {Function}
   */
  var addClass = testAPIelem.classList ? function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    elem.classList.add(className);
  } : function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    if (!elem.className.match(className)) {
      elem.className += ' ' + className;
    }
  };

  /**
   * remove class
   * @param {HTMLNode} elem HTML node
   * @param {string} className name of removing class
   * @type {Function}
   */
  var removeClass = testAPIelem.classList ? function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    elem.classList.remove(className);
  } : function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    var regex = new RegExp(className, 'g');
    elem.className += elem.className.replace(regex, '');
  };

  /**
   * toggle class
   * @param {HTMLNode} elem HTML node
   * @param {string} className name of toggling class
   * @type {Function}
   * @return {undefined}
   */
  var toogleClass = testAPIelem.classList ? function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    elem.classList.toggle(className);
  } : function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    var classes = elem.className;
    if (classes.match(className)) {
      var regex = new RegExp(className, 'g');
      elem.className += classes.replace(regex, '');
    } else {
      elem.className += ' ' + className;
    }
  };

  /**
   * check for has class
   * @param {HTMLNode} elem HTML node
   * @param {string} className name of checking class
   * @type {Function}
   * @return {boolean|undefined}
   */
  var hasClass = testAPIelem.classList ? function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    return elem.classList.contains(className);
  } : function (elem, className) {
    if (!elem) {
      return;
    }
    if (typeof className !== 'string') {
      return;
    }
    var classes = elem.className;
    return classes.match(className);
  };
  return {
    init: function init() {},
    byId: byId,
    addClass: addClass,
    removeClass: removeClass,
    toogleClass: toogleClass,
    hasClass: hasClass
  };
}(window);
//# sourceMappingURL=App.Dom.js.map

'use strict';

/**
 *  Menu module
 *
 *  find in menu, show/hide menu items,
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
App.Menu = function (window, $, EventMgr, App) {
  'use strict';

  var groups = [],
      menuType = '',
      init = function init() {
    EventMgr.bind('loadPage', buildGroups);
    EventMgr.bind('loadPage', utilGroups);
    //EventMgr.bind('loadPage', checkWidthItems);
    EventMgr.bind('loadPage', indexMenu);
    EventMgr.bind('readCookie', MenuSetUp);
    EventMgr.obind(headerGroupSel, 'click', toggleShowGroup);
    EventMgr.obind(groupControlsSel, 'click', groupsControlHandler);
    EventMgr.obind(menuPosControlSel, 'click', setMenuPosition);
    EventMgr.obind(menuPosBtnSel, 'click', lockMenuPosition);
    EventMgr.obind($searchField(), 'keyup', searchHandler);
    EventMgr.obind(searchCloseBtnSel, 'click', searchItemsClear);
    EventMgr.bind('changeTabStatus', activateMenuItem);
    EventMgr.bind('closeTab', deactivateMenuItems);
    EventMgr.bind('comboCtrlShiftMKeyUp', focusSearchInput);
    EventMgr.obind($left(), 'mouseenter', showMenu);
    EventMgr.obind($left(), 'mouseleave', hideMenu);
    EventMgr.obind($topMenu(), 'change', topMenuHandler);
    EventMgr.bind('favoriteMenuUpdateDone', getFavoriteMenu);
    EventMgr.bind('menuObjectGot', updateFavoriteMenu);
  },

  /**
   * make popular and favorite menu
   */
  utilGroups = function utilGroups() {
    //@TODO looks some messy
    //@TODO move it to xslt
    //add classes popular and favorite to parent
    $('.group .popular').parents('.group').addClass('popular');
    $('.group .favorite').parents('.group').addClass('favorite');
    // add classes unfavorite and unpopular for hidding it
    var self;
    $('.group').each(function () {
      self = $(this);
      if (!self.hasClass('favorite')) {
        self.addClass('unfavorite');
      }
      if (!self.hasClass('popular')) {
        self.addClass('unpopular');
      }
    });
  },
      $topMenu = function $topMenu() {
    return $('#_select-tab0-val');
  },
      $left = function $left() {
    return $('#left');
  },
      $cbutton = function $cbutton() {
    return $('#cbutton');
  },
      $menuItems = function $menuItems() {
    return $('#menu-items a.textlink');
  },


  //wrapper for group
  $group = function $group() {
    return $('.group');
  },

  //wrapper for group's header
  headerGroupSel = '.h-group',

  //wrapper for elemetns which has class menev; menuType and plus/minus
  groupControlsSel = '.menev',

  // menu open/close button
  menuPosControlSel = '#mainmenu #cbutton, #mainmenu #mfb',
      menuPosBtnSel = '#menu-items-wr',
      $searchField = function $searchField() {
    return $('#m-search');
  },
      searchCloseBtnSel = '#close-search a',
      checkWidthItems = function checkWidthItems() {
    var width, scrollWidth;
    $menuItems().each(function () {
      width = this.offsetWidth;
      scrollWidth = this.scrollWidth - 1;
      if (width < scrollWidth) {
        if (!this.className.match('overwidth')) {
          this.className += ' overwidth';
        }
      }
    });
  },
      menuScrollId = 'menu-items-wr',
      setMenuType = function setMenuType(type) {
    var $menu = $('#menu-items');
    $menu.removeClass('favorite popular all').addClass(type);
    $('.menev').removeClass('active');
    $('#' + type).addClass('active');
    menuType = type;
  },
      lockMenuPosition = function lockMenuPosition(e) {
    if (!e.target.className.match('listened-elem')) {
      var body = $('body');
      if (body.hasClass('active-menu')) {
        return false;
      } else {
        // body.addClass('active-menu');
        setMenuPosition.apply(window, [{ type: 'click' }]);
      }
    }
  },

  // first menu set up
  setMenuPosition = function setMenuPosition(e, data) {
    var body = $('body'),
        left = $('#left'),
        content = $('#content'),
        cbutton = $cbutton(),
        menupos,
        tabId,
        elemTab;
    if (e.type === 'click') {
      //lol code! must think about!
      menupos = body.hasClass('active-menu') ? 'closed' : 'open';
      tabId = $('.tab-content_st_active').attr('data-tabid');
      elemTab = $('#cont-' + tabId);
      $('#sort_table-' + tabId).css('width', '100%');
      $('.block-table .sort_table').css('width', '100%');
      elemTab.addClass('table-manip');
      if (menupos === 'closed') {
        left.stop().animate({
          left: '-203'
        }, 300, function () {
          EventMgr.trigger('hideHint');
        });
        content.stop().animate({
          marginLeft: '0'
        }, 300);
        cbutton.stop().fadeIn(300);
      } else {
        content.stop().animate({
          marginLeft: '205'
        }, 300);
        cbutton.stop().fadeOut(300);
      }
      body.toggleClass('active-menu');
      setTimeout(function () {
        EventMgr.trigger('menuPositionChanged', {
          menupos: menupos,
          tabId: tabId
        });
        elemTab.removeClass('table-manip');
        menupos = null;
        tabId = null;
      }, 350);
    } else if (e.type === 'begin') {
      //console.log(data);
      menupos = data;
      if (menupos === 'closed') {
        body.toggleClass('active-menu');
      } else {
        content.css('marginLeft', '205px');
      }
    }
    $('#mfb').attr('data-state', menupos);
  },
      showMenu = function showMenu() {
    var self = $(this),
        body = $('body'),
        cbutton = $cbutton();
    if (!body.hasClass('active-menu')) {
      self.stop().animate({
        left: '0'
      }, 350);
      cbutton.stop().fadeOut(300);
    }
  },
      hideMenu = function hideMenu() {
    var self = $(this),
        body = $('body'),
        cbutton = $cbutton();
    if (!body.hasClass('active-menu')) {
      self.stop().animate({
        left: '-203'
      }, 350);
      cbutton.stop().fadeIn(300);
    }
  },
      MenuSetUp = function MenuSetUp(e, data) {
    var cookie = data,
        ee,
        curMenuPos,
        re,
        content,
        curMbar,
        keyVar;
    //set menu position
    ee = {};
    ee.type = 'begin';
    if (cookie.menupos) {
      re = new RegExp(pageInfo.product + '-' + pageInfo.level + '-' + '(open|closed)');
      curMenuPos = cookie.menupos.match(re);
      if (curMenuPos !== null) {
        setMenuPosition(ee, curMenuPos['1']);
      } else {
        content = $('#content');
        content.css('marginLeft', '205px');
      }
    } else {
      content = $('#content');
      content.css('marginLeft', '205px');
      setMenuPosition(ee, 'open');
    }
    //set menu type
    if (cookie.mbar) {
      re = new RegExp(pageInfo.product + '-' + pageInfo.level + '-' + '(all|popular|favorite)');
      if (cookie.mbar.match(re)) {
        curMbar = cookie.mbar.match(re);
        setMenuType(curMbar['1']);
      }
    } else {
      setMenuType('all');
    }
    //set menu items status
    if (cookie.menupane && cookie.menupane !== '') {
      /* jslint forin:true */
      for (keyVar in groups) {
        //check only collapsed
        re = new RegExp(groups[keyVar].level + '_' + groups[keyVar].id + '-0');
        if (cookie.menupane.match(re)) {
          groups[keyVar].disactivate();
        } else {
          re = new RegExp(groups[keyVar].level + '_' + groups[keyVar].id + '-1');
          if (cookie.menupane.match(re)) {
            groups[keyVar].activate();
          }
        }
      }
    }
    //check width for hint
    checkWidthItems();
  },

  // buildGroups
  buildGroups = function buildGroups() {
    var group = $group(),
        pLength = group.length;
    for (var i = 0; i < pLength; i++) {
      groups[group[i].id] = new MenuGroup(pageInfo.level, group[i].id, '0', $(group[i]));
    }
  },

  // Handler for menu manipulation
  groupsControlHandler = function groupsControlHandler(e) {
    var controller = this.getAttribute('id');
    switch (controller) {
      case 'minus':
        collapseGroups('minus');
        break;
      case 'plus':
        collapseGroups('plus');
        break;
      case 'all':
        switchTypeMenu('all');
        break;
      case 'favorite':
        switchTypeMenu('favorite');
        break;
      case 'popular':
        switchTypeMenu('popular');
        break;
    }
    e.preventDefault();
  },

  // @method collapseGroups
  // @param {String} type Type of event; minus or plus
  collapseGroups = function collapseGroups(type) {
    var keyVar;
    if (type === 'minus') {
      /* jslint forin:true */
      for (keyVar in groups) {
        groups[keyVar].disactivate();
      }
    } else if (type === 'plus') {
      /* jslint forin:true */
      for (keyVar in groups) {
        groups[keyVar].activate();
      }
    }
    EventMgr.trigger('groupChanged', { groups: groups });
    EventMgr.trigger('updateScroll', { id: menuScrollId });
  },

  //@method switchTypeMenu
  //@param {String} type Type of Menu ; all, popular, favorite
  switchTypeMenu = function switchTypeMenu(type) {
    menuType = type;
    setMenuType(type);
    EventMgr.trigger('menuTypeChanged', type);
  },

  //show/hide groups
  toggleShowGroup = function toggleShowGroup(e) {
    var groupId = this.getAttribute('data-group');
    groups[groupId].toggle();
    EventMgr.trigger('groupChanged', { groups: groups });
    EventMgr.trigger('updateScroll', { id: menuScrollId });
    //check width for hint
    checkWidthItems();
    e.preventDefault();
  },
      lastTimeSearch = 0,
      indexMenuArray = [],
      REPLACEMENT = { 'q': 'й',
    'w': 'ц',
    'e': 'у',
    'r': 'к',
    't': 'е',
    'y': 'н',
    'u': 'г',
    'i': 'ш',
    'o': 'щ',
    'p': 'з',
    '[': 'х',
    ']': 'ъ',
    'a': 'ф',
    's': 'ы',
    'd': 'в',
    'f': 'а',
    'g': 'п',
    'h': 'р',
    'j': 'о',
    'k': 'л',
    'l': 'д',
    ';': 'ж',
    "'": 'э',
    'z': 'я',
    'x': 'ч',
    'c': 'с',
    'v': 'м',
    'b': 'и',
    'n': 'т',
    'm': 'ь',
    ',': 'б',
    '/': 'ю',
    'й': 'q',
    'ц': 'w',
    'у': 'e',
    'к': 'r',
    'е': 't',
    'н': 'y',
    'г': 'u',
    'ш': 'i',
    'щ': 'o',
    'з': 'p',
    'х': '[',
    'ъ': ']',
    'ф': 'a',
    'ы': 's',
    'в': 'd',
    'а': 'f',
    'п': 'g',
    'р': 'h',
    'о': 'j',
    'л': 'k',
    'д': 'l',
    'ж': ';',
    'э': "'",
    'я': 'z',
    'ч': 'x',
    'с': 'c',
    'м': 'v',
    'и': 'b',
    'т': 'n',
    'ь': 'm',
    'б': ',',
    'ю': '/',
    ' ': ' '
  },
      transformToMistakeLayout = function transformToMistakeLayout(string) {
    if (typeof string === 'string') {
      var stringArr = string.split(''),
          l = stringArr.length,
          mistakeString = new Array(l);
      while (l--) {
        if (REPLACEMENT[stringArr[l]]) {
          mistakeString[l] = REPLACEMENT[stringArr[l]];
        } else {
          mistakeString[l] = stringArr[l];
        }
      }
      return mistakeString.join('');
    }
  },
      indexMenu = function indexMenu() {
    var item, self;
    $('#menu-items a.textlink').each(function () {
      item = {};
      self = $(this);
      item.parent = self.parent();
      item.text = self.text().toLowerCase();
      item.mistakeText = transformToMistakeLayout(item.text);
      item.parentGroup = self.parents('.group');
      indexMenuArray.push(item);
    });
  },

  //search for menu
  searchHandler = function searchHandler(e) {
    var time = new Date().getTime(),
        value,
        valLen,
        $CloseBtn = $('#close-search');
    if (time - lastTimeSearch < 100) {
      lastTimeSearch = time;
      return;
    }
    lastTimeSearch = time;
    $CloseBtn.removeClass('not_active');
    value = this.value;
    valLen = value.length;
    if (valLen === 0) {
      searchItemsClear();
      $CloseBtn.addClass('not_active');
    } else if (valLen === 1) {
      searchItemsClear();
    } else if (valLen > 1) {
      //show close button
      searchItemsClear();
      searchItems(value);
    }
    EventMgr.trigger('updateScroll', { id: 'menu-items-wr' });
  },

  // close search
  searchItemsClear = function searchItemsClear(e) {
    $('.cont').removeClass('cont');
    $('#mainmenu').removeClass('search');
    $('.s-hidden').removeClass('s-hidden');
    $('#m-search').removeClass('not_found');
    //if it from close button
    if (e) {
      $('#close-search').addClass('not_active');
      $searchField().val('');
      EventMgr.trigger('updateScroll', { id: 'menu-items-wr' });
    }
    scrollToActPosition();
  },
      scrollToActPosition = function scrollToActPosition() {
    var actMenu = $('.m-item.active'),
        TOPMARGIN = 67;
    if (actMenu.length) {
      EventMgr.trigger('scrollTo', {
        'raw': false,
        id: 'menu-items-wr',
        offsetTop: actMenu[0].offsetTop - TOPMARGIN });
    }
  },

  // Search function
  searchItems = function searchItems(term) {
    var count = 0,
        l = indexMenuArray.length,
        misTerm = transformToMistakeLayout(term);
    $('#mainmenu').addClass('search');
    while (l--) {
      if (indexMenuArray[l].text.indexOf(term.toLowerCase()) + 1 || indexMenuArray[l].mistakeText.indexOf(term.toLowerCase()) + 1 || indexMenuArray[l].text.indexOf(misTerm.toLowerCase()) + 1 || indexMenuArray[l].mistakeText.indexOf(misTerm.toLowerCase()) + 1) {
        indexMenuArray[l].parent.removeClass('s-hidden');
        indexMenuArray[l].parentGroup.addClass('cont');
        count++;
      } else {
        indexMenuArray[l].parent.addClass('s-hidden');
      }
    }
    if (count === 0) {
      $('#m-search').addClass('not_found');
    } else {
      $('#m-search').removeClass('not_found');
    }
  },
      focusSearchInput = function focusSearchInput(e, data) {
    $left().trigger('mouseenter');
    $searchField().focus();
  },

  //activate menu item
  activateMenuItem = function activateMenuItem(e, data) {
    $('.m-item').removeClass('active');
    if (data.func) {
      var elem = App.Dom.byId('l-' + String(data.func).replace(/\./g, '_'));
      if (elem !== null) {
        elem.className += ' active';
      }
    }
  },
      deactivateMenuItems = function deactivateMenuItems() {
    $('.m-item').removeClass('active');
  },
      topMenuHandler = function topMenuHandler(e) {
    var action = this.value,
        elid = this.getAttribute('data-handler-val');
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: { func: action, elid: elid },
      invar: {},
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      failfunc: 'failCommonAjaxResponse',
      queue: 'noqueue' });
  },
      getFavoriteMenu = function getFavoriteMenu(e, data) {
    EventMgr.trigger('ajaxRequest', {
      param: {
        func: 'desktop',
        out: 'sjson'
      },
      outtype: 'json',
      trfunc: 'menuObjectGot'
    });
  },
      getMessage = function getMessage(name, doc) {
    var messages = doc && doc.messages && doc.messages.msg || {};
    return messages['menu_' + name];
  },
      updateMenuItemText = function updateMenuItemText(name, $menuItem, doc) {
    var newMessage = getMessage(name, doc);
    if (newMessage && $menuItem) {
      $menuItem.children('a.textlink').text(newMessage);
    }
  };

  updateFavoriteMenu = function updateFavoriteMenu(e, data) {
    if (!data.doc.mainmenu) {
      return;
    }
    var mainmenu = data.doc.mainmenu,
        groups = mainmenu.node,
        groupLen = groups.length,
        groupItems,
        $menuItem,
        $groupItem,
        groupItem,
        groupItemLens,
        favoriteParent = false,
        menuItem;
    while (groupLen--) {
      groupItems = groups[groupLen].node;
      groupItem = groups[groupLen];
      groupItemLens = groupItems.length;
      favoriteParent = false;
      while (groupItemLens--) {
        menuItem = groupItems[groupItemLens];
        $menuItem = $('#l-' + String(menuItem.$name).replace(/\./g, '_'));

        if (menuItem.$favorite) {
          favoriteParent = true;
          if ($menuItem.hasClass('unfavorite')) {
            $menuItem.switchClass('favorite', 'unfavorite');
          }
        } else {
          if ($menuItem.hasClass('favorite')) {
            $menuItem.switchClass('unfavorite', 'favorite');
          }
        }

        updateMenuItemText(menuItem.$name, $menuItem, data.doc);
      }
      $groupItem = $('#' + String(groupItem.$name).replace(/\./g, '_'));
      if (favoriteParent) {
        if ($groupItem.hasClass('unfavorite')) {
          $groupItem.switchClass('favorite', 'unfavorite');
        }
      } else {
        if ($groupItem.hasClass('favorite')) {
          $groupItem.switchClass('unfavorite', 'favorite');
        }
      }
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Menu.js.map

'use strict';

/**
 * Update elements size
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.UpSize = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.obind($window, 'resize', getSizes);
    EventMgr.obind($window, 'resize', updateMenuHeight);
    EventMgr.obind($window, 'resize', updateHeightTabContent);
    EventMgr.obind($window, 'resize', updateTableHeight);
    EventMgr.obind($window, 'resize', updFormContent);
    EventMgr.bind('loadPage', getSizes);
    EventMgr.bind('loadPage', updateMenuHeight);
    EventMgr.bind('appended', setStyleTabContent);
    EventMgr.bind('appendList', updateTableHeight);
    EventMgr.bind('appendList', setRowsWidth);
    EventMgr.bind('setRowsWidth', setRowsWidth);
    EventMgr.bind('changedTab', updateDashTable);
    EventMgr.bind('menuPositionChanged', updateDashTable);
    EventMgr.bind('menuPositionChanged', updateTableHeightFunc);
    EventMgr.bind('updTableHeight', updateTableHeight);
    EventMgr.bind('updFormHeight', updFormContent);
    EventMgr.bind('appendForm', updFormContent);
    EventMgr.bind('appendForm, setValuesDone', updateHeightFormListBlocks);
    EventMgr.bind('verticalScroll', updateButtonBar);
  },

  // offset topBar
  top = 0,

  // height work window
  tabHeight = 0,

  //window height
  windowHeight = 0,


  //windowWidth = 0,

  getWindowHeight = function getWindowHeight() {
    windowHeight = $window.height();
    //windowWidth = $window.width();
  },
      calcHeight = function calcHeight() {
    tabHeight = windowHeight - getTopF();
  },

  //offset topBar
  getTopF = function getTopF() {
    if (top === 0 && $menu().length > 0) {
      top = $menu().offset().top;
    }
    return top;
  },
      $menu = function $menu() {
    return App.u.selectorCache('#menu-items-wr');
  },
      $window = function () {
    return $(window);
  }(),

  //calculate height
  getSizes = function getSizes() {
    getWindowHeight();
    calcHeight();
  },
      updateMenuHeight = function updateMenuHeight() {
    $menu().height(tabHeight);
  },

  //@todo add update
  setStyleTabContent = function setStyleTabContent(e, data) {
    var tabId = data.tabId,
        tabCont = App.Dom.byId('cont-' + tabId);
    if (tabCont !== null) {
      tabCont.style.height = tabHeight + 'px';
      if (tabId === 'tab0') {
        tabCont.style.marginTop = '-' + tabHeight + 'px';
      }
    }
    tabCont = null;
  },
      updFormContent = function updFormContent(e, data) {
    setTimeout(function () {
      var formHeight = windowHeight - getTopF(),
          tabId,
          formWrapper,
          topForm,
          availableHeight;
      if (data) {
        tabId = data.tabId;
      } else {
        var tabAct = $('.tab-content_st_active');
        if (tabAct.attr('data-tab-type') === 'form') {
          tabId = tabAct.attr('data-tabid');
        } else {
          return;
        }
      }
      formWrapper = $('#incont-' + tabId + ' .topWrapper');
      if (formWrapper.length > 0) {
        //set height for formwrapper
        $('.tab-content').height(formHeight);
        var formScrollCont = $('#form-scroll-' + tabId);
        topForm = formWrapper[0].offsetHeight;
        availableHeight = tabHeight - topForm;
        var allFormHeight = formScrollCont[0].scrollHeight;
        if (tabId === 'modal1') {
          formScrollCont.height('auto');
          var innerFormHeigth = formScrollCont.height();
          formScrollCont.height(innerFormHeigth + 'px');
          if (allFormHeight < availableHeight) {
            $('#cont-modal1').height('auto');
          }
        } else {
          //set height for form inner
          formScrollCont.height(availableHeight);
          EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
          //fixed or not buttons
          if (allFormHeight > availableHeight) {
            $('#incont-' + tabId + ' .i-buttons_form-type_form').addClass('l-buttons_pos_fixed');
            $('#form-scroll-in-' + tabId).addClass('l-form__inner_fly_buttons');
          } else {
            $('#incont-' + tabId + ' .i-buttons_form-type_form').removeClass('l-buttons_pos_fixed');
            $('#form-scroll-in-' + tabId).removeClass('l-form__inner_fly_buttons');
          }
        }
      }
    }, 0);
  },
      updateHeightTabContent = function updateHeightTabContent() {
    $('#cont-tab0').css('marginTop', '-' + tabHeight + 'px').height(tabHeight);
    $('.tab-content').height(tabHeight);
  },
      updateTableHeight = function updateTableHeight() {
    // setTimeout('APP.upSize.updth()', '100');
    setTimeout(function () {
      updateTableHeightFunc();
    }, '100');
  },
      updateTableHeightFunc = function updateTableHeightFunc() {
    var self, tabId, statusBarHeight, topTable, availableHeight;
    $('.tab-content_st_active .content').each(function () {
      tabId = this.getAttribute('data-tabid');
      self = $(this);
      //height table
      statusBarHeight = '27';
      // offset top table
      topTable = this.offsetTop;
      // availible height for table
      availableHeight = tabHeight - topTable - statusBarHeight;
      // new table height
      self.height(availableHeight);
      updateWidthTableHead(tabId);
      EventMgr.trigger('updateScroll', { id: 'ltwr-' + tabId });
    });
    EventMgr.trigger('updatedTableHeight', { tabId: tabId });
  },

  //set row width for sorting table
  setRowsWidth = function setRowsWidth(e, data) {
    var id = data.tabId,
        table = App.Dom.byId('sort_table-' + id),
        tabElem = $('#cont-' + id),
        sBarCells;
    if (!table) {
      return;
    }

    var tableWidth = table.offsetWidth,
        cellsSort = table.rows['0'].cells,
        statusBar = App.Dom.byId('statusbar-' + id);
    if (statusBar !== null) {
      sBarCells = statusBar.rows['0'].cells;
    }
    if (tableWidth === 0) {
      return null;
    }
    var parentTable = App.Dom.byId('lt-' + id);
    if (parentTable === null) {
      return;
    }
    var cellsParent = parentTable.rows['0'].cells,
        len = cellsSort.length,
        lenTmp = len,
        width,
        per,
        autoSize = false,
        colWithoutWidth = 0,
        widthPer,
        widths = [],
        widthsPer = [],
        sumWidthPer = 0,
        sumWidth = 0,
        halfSumWidth,
        otherWidths = 0;

    tabElem.addClass('table-manip');
    //get all width
    while (lenTmp--) {
      widths[lenTmp] = cellsParent[lenTmp].clientWidth;
      widthPer = parseInt(cellsSort[lenTmp].getAttribute('width'), 10);
      if (isNaN(widthPer)) {
        colWithoutWidth++;
      } else {
        widthsPer[lenTmp] = widthPer;
      }
      sumWidth += widths[lenTmp];
      sumWidthPer += widthsPer[lenTmp];
    }
    if (colWithoutWidth || sumWidthPer < 90 && sumWidthPer > 110) {
      autoSize = true;
    }
    //check for more 50% width
    halfSumWidth = sumWidth / 2;
    lenTmp = len;
    while (lenTmp--) {
      if (widths[lenTmp] > halfSumWidth) {
        for (var i = 0; i < len; i++) {
          if (i !== lenTmp) {
            otherWidths += widths[i];
          }
        }
        widths[lenTmp] = otherWidths;
        sumWidth = otherWidths * 2;
        break;
      }
    }
    //set width in percent
    while (len--) {
      width = widths[len];
      if (autoSize) {
        per = Math.round(width / sumWidth * 100) + '%';
      } else {
        per = widthsPer[len] + '%';
      }
      cellsSort[len].style.width = per;
      cellsParent[len].style.width = per;
      try {
        sBarCells[len].style.width = per;
      } catch (ex) {}
    }
    parentTable.style.tableLayout = 'fixed';
    table.style.tableLayout = 'fixed';
    setTimeout(function () {
      tabElem.removeClass('table-manip');
      tabElem.removeClass('init');
    }, 100);
  },
      updateWidthTableHead = function updateWidthTableHead(tabId) {
    var parentTable = App.Dom.byId('lt-' + tabId),
        sortTable = App.Dom.byId('sort_table-' + tabId),
        statusTable = App.Dom.byId('statusbar-' + tabId),
        width;
    if (parentTable !== null) {
      width = parentTable.offsetWidth + 'px';
      if (sortTable !== null) {
        sortTable.style.width = width;
      }
      if (statusTable !== null) {
        statusTable.style.width = width;
      }
    }
    parentTable = null;
    sortTable = null;
    statusTable = null;
  },
      updateDashTable = function updateDashTable(e, data) {
    var tabId = data.tabId;
    if (tabId === 'tab0') {
      EventMgr.trigger('updateScroll', {});
    }
  },

  /**
   * Set height for all blocks in form list block
   * @param {object} e
   * @param {object} data
   */
  updateHeightFormListBlocks = function updateHeightFormListBlocks(e, data) {
    var tabId = data.tabId,
        selector = '.' + tabId + '-list .b-form-blocks__block',
        maxHeight = 0,
        curHeight,
        $elems = $(selector);
    if ($elems.length > 0) {
      $elems.each(function () {
        curHeight = this.offsetHeight;
        if (curHeight > maxHeight) {
          maxHeight = curHeight;
        }
      });
      $elems.each(function () {
        this.style.height = maxHeight + 'px';
        App.Dom.addClass(this, 'b-form-block__block_set_height');
      });
    }
  },

  /**
   * update class for buttons wrapper
   * @param {object} e
   */
  updateButtonBar = function updateButtonBar(e) {
    var data, $btnWrapper;
    if (e.originalEvent && e.originalEvent.detail) {
      data = e.originalEvent.detail;
      //check for is it form scroll
      if (data.id && data.id.match('form-scroll')) {
        $btnWrapper = $('#' + data.id + ' .l-buttons_pos_fixed');
        if ($btnWrapper.length > 0) {
          //check for scroll state top/middle/bottom
          if (data.bottom) {
            if (!$btnWrapper.hasClass('l-buttons_pos_bottom')) {
              $btnWrapper.addClass('l-buttons_pos_bottom');
            }
          } else {
            if ($btnWrapper.hasClass('l-buttons_pos_bottom')) {
              $btnWrapper.removeClass('l-buttons_pos_bottom');
            }
          }
        }
      }
    }
  };
  return {
    init: init,
    updth: updateTableHeightFunc
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.UpSize.js.map

'use strict';

/**
 * ScrollController
 * requires ScrollHandler!!!
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} ScrollHandler Scrollbar library
 */
App.ScrollController = function (window, $, EventMgr, App, ScrollHandler) {
  'use strict';

  var init = function init() {
    EventMgr.bind('menuTypeChanged', updateScroll);
    EventMgr.obind($window(), 'resize', updateScroll);
    EventMgr.bind('updateScroll', updateScroll);
    EventMgr.bind('loadPage', attachScrollMenu);
    EventMgr.bind('appendForm,appendedFilter', attachScrollTabtoForm);
    EventMgr.bind('appendToolbarAce', attachScrollToToolbarAce);
    EventMgr.bind('appendReport', attachScrollTabtoForm);
    EventMgr.bind('appendList', attachScrollTabtoList);
    EventMgr.bind('appendMapDone', attachScrollTabtoRack);
    EventMgr.bind('loadLoginForm', attachScrolltoLoginForm);
    EventMgr.bind('appendDashboard', attachScrollTabtoDB);
    EventMgr.bind('appendDashList', attachScrolltoBlockDB);
    EventMgr.bind('closeTabEvent', detachScroll);
    EventMgr.bind('scrollTo', scrollTo);
  },
      $window = function $window() {
    return $(window);
  },
      updateScroll = function updateScroll(e, data) {
    if (data && data.id) {
      ScrollHandler.update(data.id);
    } else {
      ScrollHandler.update();
    }
    data = null;
  },
      detachScroll = function detachScroll(e, data) {
    ScrollHandler.detach(data.tabId);
    data = null;
  },
      attachScrollMenu = function attachScrollMenu() {
    setTimeout(function () {
      ScrollHandler.attach('menu-items-wr', 'menu-items', 'tab0');
    }, 10);
  },
      attachScrolltoBlockDB = function attachScrolltoBlockDB(e, data) {
    var blockId = data.tabId,
        cont = blockId + '-scrollwrapper',
        obj = 'lt-' + blockId;
    ScrollHandler.attach(cont, obj, blockId, true, true);
    data = null;
  },

  //вешаем сколл на форму
  attachScrollTabtoForm = function attachScrollTabtoForm(e, data) {
    setTimeout(function () {
      var tabId = data.tabId;
      ScrollHandler.attach('form-scroll-' + tabId, 'form-scroll-in-' + tabId, tabId, true);
      $('#frm-' + tabId + ' .band-table').each(function () {
        var id = this.id;
        ScrollHandler.attach(id, 'lt-' + id, tabId, true, true);
      });
      $('#frm-' + tabId + ' .b-form-list_view_table').each(function () {
        var id = this.id;
        ScrollHandler.attach(id, 'inner-' + id, tabId, true, true);
      });
      // for select
      $('#frm-' + tabId + ' .b-myselect__select-ul').each(function () {
        var id = this.getAttribute('id');
        ScrollHandler.attach('cont-' + id, id, tabId, true);
      });
      // for multiselect
      $('#frm-' + tabId + ' .b-mselect__ul-choose').each(function () {
        var id = this.getAttribute('data-id');
        ScrollHandler.attach(id + '-ms-list', id + '-ms-list-ul', tabId, true);
      });
      // for multiselect
      $('#frm-' + tabId + ' .b-mselect__view-value').each(function () {
        var id = this.getAttribute('data-id');
        ScrollHandler.attach(this.id, id + '-ms-view', tabId, true);
      });
      //for tree
      $('#frm-' + tabId + ' .tree-inner').each(function () {
        var id = this.getAttribute('id');
        ScrollHandler.attach('cont-' + id, id, tabId, true, true);
      });

      //for select autocomplite
      $('#frm-' + tabId + ' .b-select-ac__list').each(function () {
        var id = this.getAttribute('id');
        ScrollHandler.attach('cont-' + id, id, tabId, true);
      });
      // $('#frm-' + tabId + ' .b-textdata').each(function() {
      //   var id = this.getAttribute('id');
      //   ScrollHandler.attach(id, id + '-inner', tabId, true, true);
      // });
      tabId = null;
      data = null;
    }, 50);
  },
      attachScrollToToolbarAce = function attachScrollToToolbarAce(e, data) {
    var tabId = data.tabId;
    $('#frm-' + tabId + ' .b-myselect__select-ul').each(function () {
      var id = this.getAttribute('id');
      ScrollHandler.attach('cont-' + id, id, tabId, true);
    });
  },
      attachScrollTabtoDB = function attachScrollTabtoDB(e, data) {
    var tabId = 'tab0';
    ScrollHandler.attach('cont-' + tabId, 'incont-' + tabId, 'tab0', true);
    tabId = null;
  },
      attachScrolltoLoginForm = function attachScrolltoLoginForm(e, data) {
    $('.b-myselect__select-ul').each(function () {
      var id = this.getAttribute('id');
      ScrollHandler.attach('cont-' + id, id, 'tab1', true);
      id = null;
    });
  },
      attachScrollTabtoList = function attachScrollTabtoList(e, data) {
    var tabId = data.tabId;
    ScrollHandler.attach('ltwr-' + tabId, 'lt-' + tabId, tabId, true);
    ScrollHandler.attach('cont-' + tabId + '-pager-slist', tabId + '-pager-slist', tabId, true);
    tabId = null;
  },
      attachScrollTabtoRack = function attachScrollTabtoRack(e, data) {
    if (data.map.type === 'rack') {
      var tabId = data.tabId;
      ScrollHandler.attach(tabId + '-map', 'b-rack-' + tabId, tabId, true);
    }
  },
      scrollTo = function scrollTo(e, data) {
    var offsetTop = data.offsetTop,
        id = data.id,
        raw = data.raw,
        animate = data.animate;
    ScrollHandler.scrollTo(id, offsetTop, raw, animate);
  };

  return {
    init: init
  };
}(window, $, EventMgr, App, ScrollHandler);
//# sourceMappingURL=App.ScrollController.js.map

'use strict';

/**
 * App.AceEditor модуль подключения подстветки синтаксиса
 *
 * http://ace.c9.io/
 *
 * скрипты либы лежат в /common/ace
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} doT doT template
 */
App.AceEditor = function (window, $, EventMgr, App, doT) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendForm', loadEditor);
    EventMgr.bind('gotToolbarEditorTemplate', setToolbarEditorTemplate);
    EventMgr.on(mainWrapperSelector, fontSizeSetSelector, 'change', setFontSize);
    EventMgr.on(mainWrapperSelector, themeSetSelector, 'change', setTheme);
    EventMgr.on(mainWrapperSelector, modeSetSelector, 'change', setMode);
    EventMgr.on(mainWrapperSelector, keyBindingSetSelector, 'change', setKeyBinding);
    EventMgr.on(mainWrapperSelector, showHiddenSetSelector, 'change', setShowHidden);
    EventMgr.on(mainWrapperSelector, showGutterSetSelector, 'change', setShowGutter);
    EventMgr.on(mainWrapperSelector, softWrapSetSelector, 'change', setSoftWrap);
    EventMgr.on(mainWrapperSelector, fullscreenSetSelector, 'click', setFullscreen);
    EventMgr.on(mainWrapperSelector, fullscreenExitSelector, 'click', exitFullscreen);
    EventMgr.on(mainWrapperSelector, '.i-button_type_ok, .i-button_type_setvalue', 'click', syncContent);
    EventMgr.bind('preSetValues', syncContent);
    EventMgr.bind('resizeEditor', resizeEditor);
    EventMgr.on(mainWrapperSelector, '.b-textarea.editor', 'change', updateContent);
  },

  //selectors
  mainWrapperSelector = '#main-wrapper',
      fontSizeSetSelector = '.toolbar-editor .editor-set-font',
      themeSetSelector = '.toolbar-editor .editor-set-theme',
      modeSetSelector = '.toolbar-editor .editor-set-mode',
      keyBindingSetSelector = '.toolbar-editor .editor-set-keybinding',
      showHiddenSetSelector = '.toolbar-editor .editor-set-show_hidden',
      showGutterSetSelector = '.toolbar-editor .editor-set-show_gutter',
      softWrapSetSelector = '.toolbar-editor .editor-set-soft_wrap',
      fullscreenSetSelector = '.toolbar-editor .editor-set-fullscreen',
      fullscreenExitSelector = '.toolbar-editor .editor-exit-fullscreen',

  //keybining variables
  keybindings = {
    ace: null, // Null = use "default" keymapping
    vim: 'ace/keyboard/vim',
    emacs: 'ace/keyboard/emacs'
    /*custom: new HashHandler({
    "gotoright":      "Tab",
    "indent":         "]",
    "outdent":        "[",
    "gotolinestart":  "^",
    "gotolineend":    "$"
    })*/
  },
      editors = {},

  //save settings object
  saveConf = function saveConf(data) {
    if (typeof localStorage !== 'undefined') {
      var dataStr = JSON.stringify(data),
          productId = pageInfo.product + '_5_' + pageInfo.user + '_' + pageInfo.hostName,
          itemId = productId + '_toolbar_ide';
      localStorage.setItem(itemId, dataStr);
      return true;
    }
    return false;
  },

  //get saved settings
  readConf = function readConf() {
    if (typeof localStorage !== 'undefined') {
      var productId = pageInfo.product + '_5_' + pageInfo.user + '_' + pageInfo.hostName,
          itemId = productId + '_toolbar_ide',
          dataStr = localStorage.getItem(itemId);
      return JSON.parse(dataStr) || {};
    }
    return false;
  },

  //save one setting
  preSaveConf = function preSaveConf(name, value) {
    var dataObj = readConf();
    if (dataObj) {
      dataObj[name] = value;
      saveConf(dataObj);
    }
  },

  //set font size from toolbar controller
  setFontSize = function setFontSize() {
    var value = this.value,
        id = this.getAttribute('data-tabid');
    editors[id].setFontSize(value + 'px');
    preSaveConf('font', value);
  },

  //set theme by toolbar controller
  setTheme = function setTheme() {
    var value = this.value,
        id = this.getAttribute('data-tabid');
    editors[id].setTheme(value);
    preSaveConf('theme', value);
  },

  //set lang by toolbar controller
  setMode = function setMode() {
    var value = this.value,
        id = this.getAttribute('data-tabid');
    editors[id].getSession().setMode('ace/mode/' + value);
  },

  //set key binding by toolbar controller
  setKeyBinding = function setKeyBinding() {
    var value = this.value,
        id = this.getAttribute('data-tabid');
    editors[id].setKeyboardHandler(keybindings[value]);
    preSaveConf('keybinding', value);
  },

  //set invisibles by toolbar controller
  setShowHidden = function setShowHidden() {
    var value = this.value === 'on',
        id = this.getAttribute('data-tabid');
    editors[id].setShowInvisibles(value);
    preSaveConf('invisibles', value);
  },

  //set gutter by toolbar controller
  setShowGutter = function setShowGutter() {
    var value = this.value === 'on',
        id = this.getAttribute('data-tabid');
    editors[id].renderer.setShowGutter(value);
    editors[id].renderer.updateFull();
  },

  //set soft wrap by toolbar controller
  setSoftWrap = function setSoftWrap() {
    var value = this.value,
        id = this.getAttribute('data-tabid'),
        session = editors[id].session,
        renderer = editors[id].renderer;

    switch (value) {
      case 'off':
        session.setUseWrapMode(false);
        renderer.setPrintMarginColumn(80);
        break;
      case 'free':
        session.setUseWrapMode(true);
        session.setWrapLimitRange(null, null);
        renderer.setPrintMarginColumn(80);
        break;
      default:
        session.setUseWrapMode(true);
        var col = parseInt(value, 10);
        session.setWrapLimitRange(col, col);
        renderer.setPrintMarginColumn(col);
    }
    preSaveConf('soft_wrap', value);
  },

  //set fullwidth screen editor
  setFullscreen = function setFullscreen() {
    var id = this.getAttribute('data-tabid');
    App.Dom.byId(id + '-editor').className += ' fullscreen';
    App.Dom.byId('exit-fullscreen-' + id).parentNode.className += ' fullscreen';
    editors[id].resize();
    editors[id].focus();
    editors[id].renderer.updateFull();
  },
      exitFullscreen = function exitFullscreen() {
    var id = this.getAttribute('data-tabid'),
        editorElem = App.Dom.byId(id + '-editor'),
        btnElem = App.Dom.byId('exit-fullscreen-' + id).parentNode;

    editorElem.className = editorElem.className.replace(/fullscreen/g, '');
    btnElem.className = btnElem.className.replace(/\sfullscreen/g, '');
    editors[id].resize();
    editors[id].focus();
  },

  //load editor if need
  loadEditor = function loadEditor(e, data) {
    var tabId = data.tabId,
        editor,
        textareas;
    textareas = $('#cont-' + tabId + ' .editor');
    if (textareas.length > 0) {
      if (typeof window.ace !== 'undefined') {
        appendEditor(textareas);
      } else {
        loadEditorScript(textareas);
      }
    }
  },

  //load editor scripts
  loadEditorScript = function loadEditorScript(elems) {
    var file = '/manimg/common/ace/ace.js';
    App.Common.required(file, initEditor, elems);
    var url = pageInfo.host + pageInfo.theme + 'templates/toolbar-editor.html';
    EventMgr.trigger('ajaxRequest', {
      url: url,
      trfunc: 'gotToolbarEditorTemplate',
      outtype: 'html',
      type: 'get',
      queue: 'templates' });
  },

  //init editor and setup fullwidth handler
  initEditor = function initEditor(elems) {
    if (typeof require !== 'undefined') {
      //keybindings.vim = require("ace/keyboard/vim");
      var commands = require('ace/commands/default_commands').commands;
      // add command for all new editors
      commands.push({
        name: 'Toggle Fullscreen',
        bindKey: 'Esc',
        exec: function exec(editor) {
          editor.container.className = editor.container.className.replace(/fullscreen/g, '');
          var id = editor.container.getAttribute('data-id'),
              elem = App.Dom.byId('exit-fullscreen-' + id).parentNode;
          elem.className = elem.className.replace(/\sfullscreen/g, '');
          editor.resize();
          editor.focus();
        }
      });
    }
    appendEditor(elems);
  },

  //insert editor and setup it
  appendEditor = function appendEditor(elems) {
    var editor,
        id,
        editArea,
        tabId,
        name,
        dataObj = readConf();
    //set default settings
    dataObj.theme = dataObj.theme || 'ace/theme/eclipse';
    dataObj.font = dataObj.font || 11;
    dataObj.keybinding = dataObj.keybinding ? dataObj.keybinding === null ? null : dataObj.keybinding : null;
    dataObj.invisibles = dataObj.invisibles === undefined ? false : dataObj.invisibles;
    saveConf(dataObj);

    elems.each(function () {
      var codelang = this.getAttribute('data-codelang'),
          readOnly = this.getAttribute('readonly'),
          highlight = this.getAttribute('data-highlight'),
          highlightString;
      codelang = codelang || 'text';
      id = this.id;
      tabId = this.getAttribute('data-tabid');
      name = this.name;
      editArea = App.Dom.byId(id + '-editor');
      if (!editArea) {
        return true;
      }
      editArea.style.width = '100%';
      editArea.style.height = this.offsetHeight + 'px';
      editor = window.ace.edit(id + '-editor');
      editors[id] = editor;
      editor.getSession().setMode('ace/mode/' + codelang);
      editor.getSession().setNewLineMode('unix');
      editor.getSession().setValue(this.value);
      editor.focus();
      //editor.getHighlightSelectedWord(true);
      if (readOnly !== null) {
        editor.setReadOnly(true);
      }
      //set hifglight string
      if (highlight) {
        setTimeout(function () {
          var highlightField = App.Dom.byId(highlight + '-' + tabId);
          highlightString = highlightField ? highlightField.value : null;
          if (highlightString) {
            var found = editor.find({ needle: highlightString, wrap: true });
            if (found) {
              editor.session.addMarker(found, 'ace_orion_highlight_red', 'background');
              editor.scrollToLine(found.start.row, true, true);
            }
          }
        }, 1);
      }
      this.style.display = 'none';
      appendToolbar(id, tabId, this, codelang);
    });
  },
      syncContent = function syncContent(e, self) {
    var tabId = this.getAttribute('data-tabid') || self.getAttribute('data-tabid'),
        elems = $('#frm-' + tabId + ' .editor'),
        l = elems.length,
        id;
    while (l--) {
      id = elems[l].id;
      elems[l].value = editors[id].getValue();
    }
  },
      updateContent = function updateContent() {
    var id = this.id;
    editors[id].setValue(this.value);
  },

  //set variable with html template of toolbar
  setToolbarEditorTemplate = function setToolbarEditorTemplate(e, data) {
    toolbarEditorTemplate = doT.template(data);
  },

  //foreach all elemems and set saved values
  setToolbarVal = function setToolbarVal(savedObj, tabId) {
    for (var keyVar in savedObj) {
      if (typeof savedObj[keyVar] === 'boolean') {
        if (savedObj[keyVar]) {
          $('#' + tabId + '-' + keyVar).trigger('click');
        }
      } else {
        $('#' + tabId + '-' + keyVar + ' li[data-val="' + savedObj[keyVar] + '"]').trigger('click');
      }
    }
  },

  //toolbar template variable
  toolbarEditorTemplate = '',

  //append toolbar and set saved values in elems
  appendToolbar = function appendToolbar(id, tabId, elem, codelang) {
    if (toolbarEditorTemplate === '') {
      setTimeout(function () {
        appendToolbar(id, tabId, elem, codelang);
      }, 300);
    } else {
      var savedData = readConf(),
          msg = App.Common.msg,
          dataObj = {
        tabId: id,
        fontMsg: msg.fontMsg || 'Font',
        modeMsg: msg.modeMsg || 'Mode',
        themeMsg: msg.themeMsg || 'Theme',
        keyBindMsg: msg.keyBindMsg || 'Key Binding',
        showInvMsg: msg.showInvMsg || 'Show Invisibles',
        showGutMsg: msg.showGutMsg || 'Show Gutter',
        softWrapMsg: msg.softWrapMsg || 'Soft Wrap',
        fullscreenMsg: msg.fullscreenMsg || 'Fullscreen',
        exitFullscreenMsg: msg.exitFullscreenMsg || 'Exit Fullscreen',
        darkMsg: 'Dark',
        brightMsg: 'Bright',
        modeValue: codelang
      },

      //@TODO!!!
      toolbarHTML = toolbarEditorTemplate(dataObj);
      var elemeId = elem.id;
      $(elem).after(toolbarHTML);
      App.Dom.removeClass(App.Dom.byId('resizer_editor-' + elemeId), 'b-resizer_for_editor');
      savedData.mode = codelang;
      setToolbarVal(savedData, id);
      setTimeout(function () {
        EventMgr.trigger('appendToolbarAce', { tabId: tabId });
        EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
      }, 100);
    }
  },
      resizeEditor = function resizeEditor(e, data) {
    var id = data.id ? data.id.replace('-editor', '') : undefined;
    if (editors[id]) {
      editors[id].resize();
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App, doT);
//# sourceMappingURL=App.AceEditor.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 *  Модуль.
 *  ваш К.О.
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.ActionHandler = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.onwithdata($content(), actionBtnSel, 'click', 'menuAction', actionController);
    EventMgr.on($content(), formBtnFunc, 'click', actionFormController);
    EventMgr.on($content(), cancelDefActionNonActSel, 'click', cancelDefAct);
    EventMgr.on($content(), reloadTabBtnSel, 'click', reloadTabController);
    EventMgr.on('#main-wrapper', formSubmitSel, 'click', submitForm);
    EventMgr.on($content(), ticketRate, 'click', ticketRateHandler);
    EventMgr.bind('rateResponse', rateResponseHandler);
    //    EventMgr.onwithdata('#main-wrapper', formSubmitSel, 'click', 'formSubmit',
    //        submitForm);
    EventMgr.bind('failedAjaxResponseForDashboard', failedDashboardBlockRequestHandler);
    EventMgr.bind('failMenuAjaxResponse', failMenuRequest);
    EventMgr.bind('failCommonAjaxResponse', failListRequest);
    EventMgr.bind('failFormAjaxResponse', failFormRequest);
    EventMgr.bind('tabLoading', tabLoadingHandler);
    EventMgr.bind('tabLoadingHide', tabLoadingHideHandler);
    EventMgr.on($content(), dismissMsgSelector, 'click', dismissMessage);
  },
      $content = function $content() {
    return $('#main-wrapper');
  },


  // wrapper for right menu links
  actionBtnSel = '.m-item a, .b-menu-item',


  //wrapper for reload tab btn
  reloadTabBtnSel = '.reload',

  // wrapper for toolbar's group btn

  //prevent default not active actions
  cancelDefActionNonActSel = '.notActive span',
      formSubmitSel = '.i-button_type_ok',
      formBtnFunc = '.i-button_type_func',
      dismissMsgSelector = '.i-message__dismiss-link',
      ticketRate = '.i-ticket__rate',
      cancelDefAct = function cancelDefAct(e) {
    e.preventDefault();
  },
      tabLoadingId = {},
      tabLoadingHandler = function tabLoadingHandler(e, data) {
    var tabId = data.tabId;
    clearTimeout(tabLoadingId[tabId]);
    tabLoadingId[tabId] = setTimeout(function () {
      $('#cont-' + tabId).addClass('loading');
    }, 350);
  },
      tabLoadingHideHandler = function tabLoadingHideHandler(e, data) {
    var tabId = data.tabId;
    setTimeout(function () {
      clearTimeout(tabLoadingId[tabId]);
      $('#cont-' + tabId).removeClass('loading');
    }, 0);
    //for be sure what it fucking loading hide
    setTimeout(function () {
      $('#cont-' + tabId).removeClass('loading');
    }, 100);
    //for be defintly sure what it fucking loading hide
    setTimeout(function () {
      $('#cont-' + tabId).removeClass('loading');
    }, 200);
    //for be absolutly sure  what it fucking loading hide
    setTimeout(function () {
      $('#cont-' + tabId).removeClass('loading');
    }, 350);
  },

  //handler for failed request from menu
  failMenuRequest = function failMenuRequest(e, data) {
    $('.m-item.loading').removeClass('loading');
    if (data.erType === 'json') {
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error. Func: "' + data.param.func + '"' });
    } else if (data.erMsg) {
      EventMgr.trigger('pullMsg', { msg: data.erMsg });
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again. Func: "' + data.param.func + '"' });
    }
  },

  //handler for failed request from list
  failListRequest = function failListRequest(e, data) {
    var tabId = data.invar ? data.invar.tabId ? data.invar.tabId : data.invar.parent ? data.invar.parent : data.invar.targetTabId : undefined;
    EventMgr.trigger('tabLoadingHide', { tabId: tabId });
    if (data.erType === 'json') {
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error. Func: "' + data.param.func + '"' });
    } else if (data.erMsg) {
      EventMgr.trigger('pullMsg', { msg: data.erMsg });
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again. Func: "' + data.param.func + '"' });
    }
  },
      disabledButton = function disabledButton(btn) {
    btn.addClass('b-button_st_disabled');
    btn.html(btn.attr('data-disabled'));
  },
      resetButtonForDefault = function resetButtonForDefault(arg) {
    //return btn state
    var btn, tabId;
    if (typeof arg === 'string') {
      tabId = arg;
      btn = $('#form-wrapper-' + tabId + ' .b-button_st_disabled');
    } else {
      btn = arg;
    }
    if (btn.length) {
      btn.html(btn[0].getAttribute('data-enabled'));
      btn.removeClass('b-button_st_disabled');
    }
  },

  //handler fot failed request from form
  failFormRequest = function failFormRequest(e, data) {
    var tabId = data.invar.tabId;

    if (data.erType === 'json') {
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error. Func: "' + data.param.func + '"' });
    } else if (data.erMsg) {
      EventMgr.trigger('pullMsg', { msg: data.erMsg });
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again. Func: "' + data.param.func + '"' });
    }
    //reset button
    resetButtonForDefault(tabId);
    //for run after upload callback
    setTimeout(function () {
      //return progressbar state
      var loader = $('#' + tabId + '-progressbar .b-progressbar__loader');
      $('#' + tabId + '-progressbar').removeClass('b-progressbar_type_withbtn');
      //remove animated
      loader.addClass('b-progressbar__loader_type_animate');
      //add static color
      loader.removeClass('b-progressbar__loader_type_static');
      loader.css('width', '');
      loader.html('');
      //remove cancel btn
      $('#' + tabId + '-progressbar .b-progressbar__btn-wr').remove();
    }, 1);

    EventMgr.trigger('tabLoadingHide', { tabId: tabId });
  },
      failedDashboardBlockRequestHandler = function failedDashboardBlockRequestHandler(e, data) {
    var blockId = data.invar.blockId,
        tblock = App.Dom.byId('t' + blockId);
    if (tblock) {
      tblock.className = tblock.className.replace(/loading/g, '');
    }
    if (data.erType === 'json') {
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error. Func: "' + data.param.func + '"' });
    } else if (data.erMsg) {
      EventMgr.trigger('pullMsg', { msg: data.erMsg });
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again. Func: "' + data.param.func + '"' });
    }
  },


  //reload page handler
  reloadTabController = function reloadTabController(e, data) {
    var tabId = '',
        addedParam = {};
    if (e) {
      tabId = this.getAttribute('data-tabid');
      addedParam = {
        clickstat: 'title'
      };
      e.preventDefault();
    } else {
      tabId = data.tabId;
    }
    EventMgr.trigger('reloadTab', {
      addedParam: addedParam,
      tabId: tabId,
      help: true,
      selid: true,
      filter: true });
  },
      ticketRateHandler = function ticketRateHandler(e) {
    var func = this.getAttribute('data-func'),
        type = this.getAttribute('data-type'),
        name = this.getAttribute('data-name'),
        $parent = this.parentNode,
        elid = $parent.getAttribute('data-id'),
        plid = $parent.getAttribute('data-elid'),
        param = {
      func: func,
      elid: elid,
      plid: plid
    };
    if (type === 'setrate') {
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: {
          $parent: $parent,
          rateType: name,
          self: this
        },
        outtype: 'json',
        trfunc: 'rateResponse',
        failfunc: 'failCommonAjaxResponse'
      });
    } else if (type === 'rate') {
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: {
          parent: $(this).closest('.tab-content_st_active').attr('data-tabid')
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'noqueue' });
    }
  },
      rateResponseHandler = function rateResponseHandler(e, data) {
    if (!data.error) {
      $(data.$parent).addClass('b-ticket__rate_rated_' + data.rateType);
      $(data.self).removeClass('i-ticket__rate');
    } else if (data.erMsg) {
      EventMgr.trigger('pullMsg', { msg: data.erMsg });
    }
  },
      actionFormController = function actionFormController(e) {
    var $self = $(this),
        func = $self.attr('data-func'),
        id = $self.attr('data-id'),
        tabId = $self.attr('data-tabid'),
        param = {
      func: func
    };
    //check for button id
    if (id && id !== 'undefined') {
      id = id.split('=', 2);
      if (id[1]) {
        param[id[0]] = id[1];
      }
    }
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: {
        parent: tabId
      },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      failfunc: 'failMenuAjaxResponse',
      queue: 'menu' });
    EventMgr.trigger('tabLoading', { tabId: tabId });
  },
      checkSameTabsOpened = function checkSameTabsOpened(func, tabs) {
    var resp = {
      exist: false,
      tabId: null,
      status: 0
    };
    var curFunc, regExpWitDot;
    if (func && tabs && (typeof tabs === 'undefined' ? 'undefined' : _typeof(tabs)) === 'object') {
      /* jslint forin:true */
      for (var key in tabs) {
        if (tabs[key]) {
          curFunc = tabs[key].func;
          if (!curFunc && tabs[key].paramObjAll) {
            curFunc = tabs[key].paramObjAll.func;
          }
          //check if empty func like basket.empty
          //regExpWitDot = new RegExp('^' + func + '\\.');
          //.empty
          regExpWitDot = func + '.empty';
          //if ((String(curFunc).match(regExpWitDot) || curFunc === func) &&
          if ((regExpWitDot === curFunc || curFunc === func) && tabs[key].hType === 'parent') {
            resp.exist = true;
            resp.tabId = key;
            resp.status = tabs[key].status;
            //be sure that found active same tab
            if (resp.status === 1) {
              break;
            }
          }
        }
      }
    }
    return resp;
  },


  //handler for menu action
  actionController = function actionController(e, data) {
    var self = $(this),
        href = this.getAttribute('data-url'),
        parent = this.getAttribute('data-parent'),
        re = new RegExp('/?func=+'),
        cgi = this.getAttribute('data-cgi'),
        sameModule = false,
        queue = 'menu',
        isFromMenu = self.hasClass('i-menu-link'),
        fromFatalError = self.parent().hasClass('b-fatal-error__refresh-link'),
        newtab = false,
        url,
        param;
    if (e.ctrlKey || e.metaKey || self.hasClass('newtab')) {
      newtab = true;
      queue = 'noqueue';
    }
    if (self.hasClass('wohan')) {
      return true;
    }
    //if from fatal error close alertBox
    if (fromFatalError) {
      $('#modal_alert_ok').trigger('click');
    }

    if (href) {
      if (href.match(re)) {
        url = cgi ? pageInfo.host + cgi : pageInfo.url;
        href = href.replace('?', '');
        param = App.Common.parseParams(href);
        param.clickstat = 'yes';
        //check for same module open from menu
        if (!newtab) {
          var actFunc = $('.tab-content_st_active').attr('data-func');
          if (param.func === actFunc) {
            sameModule = true;
          }
        }
        //check for exist tabs with this function
        var checkTabs = checkSameTabsOpened(param.func, data.__tabs);
        if (checkTabs.exist && !checkTabs.status && isFromMenu) {
          $('#switch-' + checkTabs.tabId).trigger('lclick');
          EventMgr.trigger('reloadTab', { tabId: checkTabs.tabId, resetFilterOn: true });
        } else {
          EventMgr.trigger('ajaxRequest', {
            url: url,
            param: param,
            invar: {
              parent: parent, newtab: newtab, sameModule: sameModule, __src: 'menuAction', __src_func: param.func },
            type: 'get',
            outtype: 'json',
            trfunc: 'ajaxResponse',
            failfunc: 'failMenuAjaxResponse',
            queue: queue });
          //add loading class to menu
          self.parents('.m-item').addClass('loading');
        }
      } else {
        //what else?
        console.log(url);
      }
    }
    if (e) {
      e.preventDefault();
    }
  },


  //handler for submit form
  submitForm = function submitForm(e, data) {
    e.preventDefault();
    var self = $(this),
        flags = self.getFlags(),
        tabId = self.attr('data-tabid'),
        form = $('#frm-' + tabId),
        vars = form.getVars(),
        action = form.attr('action'),
        param = form.serializeObject(),
        parent = self.attr('data-parent'),
        type = self.attr('data-type'),
        hasFiles = form.hasClass('withfiles'),
        act = self.attr('data-act'),
        id = self.attr('data-id'),
        isShowcaseForm = form.hasClass('b-form_showcase_yes'),
        name = self.attr('data-name'),
        progressTypeElem = App.Dom.byId(tabId + '-progresstype'),
        progressType,
        confirmMsg,
        RequiredMsg,
        progressid,
        param1,
        text,
        passwdField,
        pwstrength,
        options;
    //prevent dbclick
    if (self.hasClass('b-button_st_disabled')) {
      return false;
    }
    disabledButton(self);
    if (progressTypeElem !== null) {
      progressType = progressTypeElem.value;
    }
    //check for valid
    if (act !== 'back') {
      //check file length
      var fileSizeRes = App.u.checkFileSize(tabId);
      if (fileSizeRes.msg) {
        EventMgr.trigger('errMsgValid', {
          self: fileSizeRes.field,
          err: fileSizeRes.msg,
          number: 0
        });
        resetButtonForDefault(self);
        return false;
      }
      //check passwd confirm fields
      confirmMsg = checkConfirm(tabId);
      if (confirmMsg.msg !== '') {
        EventMgr.trigger('showAlert', confirmMsg);
        resetButtonForDefault(self);
        return false;
      }
      //check required fields
      RequiredMsg = checkRequired(tabId);
      if (RequiredMsg.msg !== '') {
        EventMgr.trigger('errMsgValid', {
          self: RequiredMsg.himself,
          err: RequiredMsg.msg,
          number: 0
        });
        //watching while input not be empty for remove error
        $(RequiredMsg.himself).bind('keyup', function () {
          if (this.value !== '') {
            $(this).unbind('keyup');
            EventMgr.trigger('okMsgValid', {
              self: this,
              number: 0,
              notOk: true
            });
          }
        });
        resetButtonForDefault(self);
        return false;
      }
      //maybe it not needed
      // if ($('#frm-' + tabId +
      //     ' .row-error:not(".l-form__row_hidden_yes") input.test').length !== 0) {
      //   return false;
      // }
      //check password strength
      passwdField = $('#frm-' + tabId + ' input[data-check-field]');
      if (passwdField.length !== 0) {
        pwstrength = getPwdStrength(passwdField);
        var badPwd = false;
        passwdField.each(function () {
          var pname = this.getAttribute('name');
          if (pwstrength !== 0 && param[pname] !== '' && $(this).width() !== 0) {
            if (pwstrength > App.Forms.checkPassStrength(param[pname])) {
              EventMgr.trigger('showAlert', { msg: pageInfo.pwErrorMsg });
              badPwd = true;
              return false;
            }
          }
        });
        if (badPwd) {
          resetButtonForDefault(self);
          return false;
        }
      }
    }

    if (act === 'back') {
      param.sback = 'ok';
      //not needed progress when press back btn
      progressType = 'false';
    }
    //check for button id
    if (id && id !== 'undefined') {
      id = id.split('=', 2);
      if (id[1]) {
        param[id[0]] = id[1];
      }
    }

    //add name of button
    if (name) {
      /* jslint camelcase: false */
      param.clicked_button = name;
      /* jslint camelcase: true */
    }
    //add progressid
    progressid = progressType;
    param.progressid = progressid;
    param1 = { elid: progressid, func: 'progress.get', sfrom: 'ajax' };
    //check for target
    if (act === 'blank') {
      var $form,
          winId = progressid + new Date().getTime(),
          $formWrapper = $('#form-wrapper-' + tabId);
      $formWrapper.wrap(function () {
        return '<form action="' + action + '" id="form-' + winId + '" method="POST" enctype="multipart/form-data" target="' + winId + '"/>';
      });
      $form = $('#form-' + winId);
      $form.append('<input type="hidden" class="i-input-tmp-elem" value="ok" name="sok"/>');
      $form.append('<input type="hidden" class="i-input-tmp-elem" value="' + name + '" name="clicked_button"/>');
      if (id && id[1]) {
        $form.append('<input type="hidden" class="i-input-tmp-elem"' + ' value="' + id[1] + '" name="' + id[0] + '"/>');
      }
      //remove sfrom=ajax
      $form.find('input[name="sfrom"]').remove();
      window.open('', winId);
      $form.submit();
      if (!flags.keepform) {
        App.Tabs.closeTab(e, tabId);
        if (parent) {
          EventMgr.trigger('reloadTab', { tabId: parent });
        }
      } else {
        $formWrapper.unwrap();
        $('.i-input-tmp-elem').remove();
      }
      //try reload parent after close form
      resetButtonForDefault(self);
      return false;
    }
    var $mixedContols = $('#frm-' + tabId + ' .i-control-mixed');
    if ($mixedContols.length !== 0) {
      param = App.u.removeParam($mixedContols, param);
    }
    //get progressType before request
    progressType = String(progressType).split('_')[0];
    //options for form & form with files submit
    options = {
      url: pageInfo.host + action,
      param: param,
      invar: {
        tabId: tabId,
        parent: parent,
        type: type,
        progresstype: progressType,
        progressid: progressid,
        iType: 'replace',
        dataSaved: true,
        targetTabId: tabId,
        __vars: vars
      },
      type: 'post',
      outtype: 'json',
      trfunc: 'ajaxFormResponse',
      queue: 'noqueue',
      failfunc: 'failFormAjaxResponse' };
    //check for files
    //THIS IS FORM WITH FILE
    /* jshint camelcase: false */
    if (hasFiles) {
      param.sok = 'ok';
      EventMgr.trigger('setBrandSettings', {
        options: options,
        tabId: tabId,
        pid: progressid,
        name: name,
        param: param,
        addParams: {
          sok: 'ok',
          sfrom: 'ajax',
          clicked_button: name,
          pid: progressid
        },
        parent: parent });
    } else if (type === 'report') {
      //THIS IS REPORT
      param.sok = 'ok';
      options = {
        url: pageInfo.host + action,
        param: param,
        invar: { parent: parent, tabId: tabId, __src: 'report' },
        outtype: 'json',
        trfunc: 'ajaxResponse',
        queue: 'noqueue',
        failfunc: 'failCommonAjaxResponse'
      };
      EventMgr.trigger('ajaxRequest', options);
    } else {
      //THIS IS FORM
      param.sok = 'ok';
      EventMgr.trigger('ajaxRequest', options);
    }
    if (progressType !== 'false') {
      setTimeout(function () {
        EventMgr.trigger('ajaxRequest', {
          param: param1,
          invar: {
            tabId: tabId,
            param: param1,
            type: type,
            progresstype: progressType },
          outtype: 'json',
          trfunc: 'progressBarResponse',
          queue: 'noqueue' });
      }, 1000);
    }
    EventMgr.trigger('tabLoading', { tabId: tabId });
  },
      getPwdStrength = function getPwdStrength(passwdField) {
    var pws = passwdField.attr('data-check-args'),
        firstSing;
    if (!pws) {
      return pageInfo.pwstrength;
    }
    firstSing = pws.substring(0, 1);
    if (firstSing === '-' || firstSing === '+') {
      return parseFloat(pws) + parseFloat(pageInfo.pwstrength);
    } else {
      return parseFloat(pws);
    }
  },


  //check required field on form
  checkRequired = function checkRequired(tabId) {
    var field = $('#form-wrapper-' + tabId + ' input[required="required"],' + ' #form-wrapper-' + tabId + ' .b-textarea[required="required"]'),
        msg = '',
        self = null;
    if (field.length > 0) {
      field.each(function () {
        //check for empty and not hidden
        var value = String(this.value).replace(/\s/g, '');
        if (this.className.match('i-control-mixed')) {
          return true;
        }
        if (value === '' && this.offsetWidth !== 0) {
          msg = getRequiredMsg();
          self = this;
          return false;
        }
        if (this.getAttribute('data-type') === 'multiple' && value === '') {
          var id = this.getAttribute('data-id'),
              elem = App.Dom.byId(id + '-ms-view');
          if (elem && elem.offsetWidth !== 0) {
            msg = getRequiredMsg();
            self = elem.parentNode;
            return false;
          }
        }
      });
    }
    return {
      param: tabId,
      msg: msg,
      himself: self
    };
  },


  //get message for required error
  getRequiredMsg = function getRequiredMsg() {
    return pageInfo.messages.empty;
  },

  //check password confirm field
  checkConfirm = function checkConfirm(tabId) {
    var field = $('#form-wrapper-' + tabId + ' input[data-confirm="yes"]'),
        msg = '',
        self = null;
    if (field.length > 0) {
      field.each(function () {
        var confirmField = this.getAttribute('data-check-field'),
            value1 = this.value,
            confirmFieldElem = App.Dom.byId(confirmField + '-' + tabId),
            confirmFieldElemFake = App.Dom.byId(confirmField + '-' + tabId + '-fake'),
            value2;
        if (confirmFieldElem !== null) {
          value2 = confirmFieldElem.value;
        }
        if (value1 !== value2 && (confirmFieldElem.offsetWidth !== 0 || confirmFieldElemFake.offsetWidth !== 0)) {
          msg = pageInfo.confirm;
          self = this;
        }
        return;
      });
    }
    return {
      msg: msg,
      himself: self,
      callback: function callback() {
        this.focus();
      }
    };
  },


  //banner dismiss link handler
  dismissMessage = function dismissMessage(e, data) {
    if (e) {
      e.preventDefault();
    }
    var self = $(this),
        param;
    self.parents('.i-message').hide();
    param = this.getAttribute('data-href');
    EventMgr.trigger('updTableHeight');
    param = App.Common.parseParams(param);
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      trfunc: 'DoNothing',
      queue: 'noqueue' });
  };
  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ActionHandler.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 *  Модуль обрабатывает запросы с листа
 *  ваш К.О.
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
/*global App:true*/
App.ActionHandlerList = function (window, $, EventMgr, App) {
  'use strict';

  var dummyToolbtn = '.i-toolbtn-type-dummy',
      actionBannerSelector = '.i-message__more-link, .i-wizard__step-link',
      backBtnListSelector = '.back-btn-row',
      breadcrumbSelector = '.breadcrumb',
      controlPropSelector = '.controlprop',
      pageNumListSelector = '.pager-list_type_list .pager-list__item_act',
      tSettingSel = '.tsetting',
      rowTableSel = '.list_table tr',
      pagerInputSel = '.pager-list__input',
      pagerBtnSelector = '.pager-list__input-submit',
      pagerSlistSel = 'input[name="pager-slist"]',
      toolBarBtnGroupActSel = '.toolbar-button.active span.action.group,' + ' .toolbar-button.active span.action.groupdownload',
      toolBarBtnSel = '.toolbar-button.active span.action:not(".group")',
      toolBarBtnPreviewSel = '.toolbar-button.active span.action-preview',
      dashboardButtonSel = '.dashboard-button',
      modalActive = false,
      storage = App.u.storage,
      nestedListSel = '.i-nestedlist',
      editFormSel = '.i-editform',

  //selected elems from not list view
  selectedElems = {},


  // selected items
  $selectedItems = function $selectedItems() {
    return $('.tab-content_st_active .list_table .selected:not(".filtred")');
  },
      $firstListItem = function $firstListItem() {
    return $('.tab-content_st_active .b-list__table-row:not(".back-btn")').get(0);
  },
      $content = function $content() {
    return $('#main-wrapper');
  };

  //update selected elems object from not list view
  function updateSelectedElems(e, data) {
    var tabId = data.tabId,
        elems = data.elems;
    selectedElems[tabId] = elems;
  }
  //add elid for toolbar &
  function updateSelectedElemsForForm(e, data) {
    var tabId = data.tabId;
    if (App.Dom.byId('toolbar-' + tabId)) {
      selectedElems[tabId] = [{
        elid: $('#frm-' + tabId).find('input[name="elid"]').val()
      }];
      //maybe dangeours
      EventMgr.trigger('listSelect', { tabId: 'cont-' + tabId, len: 1 });
    }
  }

  function removeSelectedElems(e, data) {
    var tabId = data.tabId;
    delete selectedElems[tabId];
  }

  /**
   * Banner/Wizard Link handler
   * @param {object} e
   * @this {elem}
   */
  function bannerAction(e) {
    var href = this.getAttribute('data-href'),
        wizardLink = App.Dom.hasClass(this, 'i-wizard__step-link'),
        outerLink = App.Dom.hasClass(this, 'i-message__outer-link'),
        iType = wizardLink ? 'replace' : false,
        src = wizardLink ? 'wizardLink' : '',
        param = App.Common.parseParams(href),
        tabId = $(this).parents('.tab-content').attr('data-tabid'),
        parent = App.Dom.hasClass(this, 'i-wizard__step-link') ? false : tabId,
        targetTabId = App.Dom.hasClass(this, 'i-wizard__step-link') ? tabId : false,
        formParam = $('#frm-' + tabId).serializeObject();
    if (!outerLink) {
      if (e) {
        e.preventDefault();
      }
    } else {
      return true;
    }
    if (formParam) {
      delete formParam.func;
      delete formParam.snext;
      //delete formParam.elid;
      delete formParam.sfrom;
      $.extend(param, formParam);
    }
    EventMgr.trigger('ajaxRequest', {
      param: param,
      trfunc: 'ajaxResponse',
      invar: {
        dataSaved: true,
        parent: parent,
        iType: iType,
        __src: src,
        targetTabId: targetTabId },
      queue: 'noqueue',
      outtype: 'json',
      failfunc: 'failCommonAjaxResponse' });
    EventMgr.trigger('tabLoading', { tabId: tabId });
  }

  function nestedListHandler(e) {
    e.preventDefault();
    var $self = $(this),
        elid = $self.closest('.b-list__table-row').attr('data-elid'),
        index = $self.closest('td').index(),
        th = $self.closest('table').find('th')[index],
        colname = th.getAttribute('data-colname'),
        nested = th.getAttribute('data-nestedlist'),
        blank = th.getAttribute('data-nestedlist-blank'),
        tabCont = $self.closest('.tab-content'),
        tabId = tabCont.attr('data-tabid'),
        pfunc = tabCont.attr('data-func'),
        toolbarNode = App.Dom.byId('toolbar-' + tabId),
        plid,
        form = $('#frm-' + tabId),
        filterParamString = form.serialize(),
        param = {};
    param.parentfilter = filterParamString;
    param.func = 'nestedlist';
    param.elid = elid;
    param.col = colname;
    param.nestedlist = nested;
    /* jslint camelcase: false */
    param.col_value = this.innerHTML;
    /* jslint camelcase: true */
    param.pfunc = pfunc;
    if (toolbarNode) {
      plid = filterXSS.friendlyAttrValue(toolbarNode.getAttribute('data-plid') || '');
      if (plid) {
        param.plid = plid;
      }
    }
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: {
        newtab: blank,
        __src: 'nestedList'
      },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      queue: 'nested-' + tabId,
      failfunc: 'failCommonAjaxResponse' });
    if (!blank) {
      EventMgr.trigger('tabLoading', { tabId: tabId });
    }
  }

  /**
   * Back button in 1st list row handler
   * @param {object} e
   * @this {elem}
   */
  function backBtnHandlerList(e) {
    e.preventDefault();
    var tabId = this.getAttribute('data-tabid');
    $('#cont-' + tabId + ' .toolbar-button__item-img.back.img-link').trigger('click');
  }

  //breacrumb link handler
  function breadcrumbHandler(e) {
    e.preventDefault();
    var id = this.getAttribute('data-id'),
        tabId = $(this).parents('.tab-content').attr('data-tabid'),
        param = storage.breadcrumb[tabId][id],
        targetTabId = tabId;
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      invar: { targetTabId: targetTabId, iType: 'replace' },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      failfunc: 'failCommonAjaxResponse',
      queue: 'noqueue' });
    EventMgr.trigger('tabLoading', { tabId: tabId });
  }

  //do if confirm
  function confirmOk(confirmObj) {
    modalActive = false;
    var paramString = confirmObj.param,
        tabId = confirmObj.tabId,
        url = confirmObj.cgi ? pageInfo.host + confirmObj.cgi : pageInfo.url,
        param = (typeof paramString === 'undefined' ? 'undefined' : _typeof(paramString)) === 'object' ? paramString : App.Common.parseParams(paramString),
        progressid,
        param1;
    if (confirmObj.progressbar) {
      param.progressid = confirmObj.progressbar;
      progressid = confirmObj.progressbar;
    }
    if (confirmObj.download) {
      paramString = (typeof paramString === 'undefined' ? 'undefined' : _typeof(paramString)) === 'object' ? App.Common.serializeForAttr(paramString) : paramString;
      //for show error in new window #17646
      window.open(url + '?' + paramString);
      return;
    } else {
      EventMgr.trigger('ajaxRequest', {
        url: url,
        param: param,
        invar: { tabId: tabId, tabs: confirmObj.to, __from: confirmObj.__from, __blockId: confirmObj.__blockId, '__src': 'groupAction' },
        type: 'get',
        trfunc: 'ajaxGroupComplete',
        outtype: 'json',
        queue: 'noqueue',
        failfunc: 'failCommonAjaxResponse' });
    }
    if (confirmObj.progressbar) {
      param1 = { elid: progressid, func: 'progress.get', sfrom: 'ajax' };
      setTimeout(function () {
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param1,
          invar: { tabId: tabId,
            param: param1,
            type: '',
            progresstype: confirmObj.progressbar },
          type: 'get',
          outtype: 'json',
          trfunc: 'progressBarResponse',
          queue: 'noqueue' });
        param1 = null;
        tabId = null;
      }, 700);
    } else if (!confirmObj.download) {
      EventMgr.trigger('tabLoading', { tabId: tabId });
    }
  }

  //handler for group action, open confirm msg
  function groupActionHandler(e, data) {
    var confirmText = data.confirm,
        self = data.self,
        rows = data.rows,
        tabId = data.tabId,
        param = data.params,
        progressbar = data.progressbar,
        download = data.download,
        delimiter = new RegExp(', ', 'g'),
        lb = new RegExp('\n', 'g'),
        dataText,
        confirmObj = {};
    if (typeof rows === 'string' && data.confirmDelimiter) {
      if (data.confirmDelimiter === '\n') {
        data.confirmDelimiter = '<br/>';
      }
      rows = rows.replace(delimiter, data.confirmDelimiter);
    }
    if (typeof confirmText === 'string') {
      confirmText = confirmText.replace(lb, '<br>');
    }
    dataText = confirmText + ' ' + rows + '?';
    confirmObj.data = dataText;
    confirmObj.tabId = tabId;
    confirmObj.param = param;
    confirmObj.progressbar = progressbar;
    confirmObj.download = download;
    confirmObj.cgi = data.cgi;
    confirmObj.to = data.to;
    confirmObj.__from = data.__from;
    confirmObj.__blockId = data.__blockId;
    EventMgr.trigger('confirmBoxShow', {
      callbackOk: confirmOk,
      callbackCancel: null,
      self: data.self,
      text: dataText,
      warning: data.warning,
      args: [confirmObj]
    });
  }

  //group action
  function groupAction(e) {
    if (e) {
      e.preventDefault();
    }
    var self = $(this),
        toolbar = self.parent(),
        confirm = toolbar.attr('data-confirm'),
        confirmDelimiter = toolbar.attr('data-confirm-d'),
        itemId = self.attr('data-itemid'),
        progressbar = self.attr('data-progressid') || false,
        classes = self.attr('class'),
        cgi = self.attr('data-cgi'),

    //tabId = this.getAttribute('data-parent'),
    tabId = self.attr('data-parent'),
        params = App.Common.parseParams(self.attr('data-url')),
        warning = App.Dom.hasClass(self[0], 'i-confirm-warning'),
        download = App.Dom.hasClass(self[0], 'groupdownload'),
        invar = { confirm: confirm,
      params: params,
      tabId: tabId,
      progressbar: progressbar ? progressbar + itemId : false,
      download: download,
      confirmDelimiter: confirmDelimiter,
      warning: warning,
      cgi: cgi,
      self: this
    };
    EventMgr.trigger('clickedGroupItem', {
      invar: invar,
      tabId: tabId,
      classes: classes });
  }

  //relaod after group actions
  function reloadAfterGroupAction(e, data) {
    var tabId = data.tabId,

    //check for user.su
    newLocation = data.location,
        newWin = data.newwin,
        newFormParams = data.formParam,
        newListParams = data.listParam,
        parent = data.parent || '',
        tabs = data.tabs,
        error = data.error,
        param;

    App.Common.checkRefreshMenu(data);

    //check for open as child
    if (data.openAsChild) {
      parent = data.tabId;
    }
    if (data.reload) {
      window.location = pageInfo.url;
    } else if (newLocation && newWin) {
      window.open(newLocation, '_blank');
    } else if (newLocation) {
      window.location = newLocation;
    } else if (newFormParams) {
      param = App.Common.parseParams(newFormParams);
      EventMgr.trigger('ajaxRequest', {
        noesc: true,
        param: param,
        invar: { parent: parent, srcTabId: tabId },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        queue: 'noqueue' });
      return false;
    } else if (newListParams) {
      param = App.Common.parseParams(newListParams);
      EventMgr.trigger('ajaxRequest', {
        noesc: true,
        param: param,
        invar: { parent: parent, srcTabId: tabId },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        queue: 'noqueue' });
      return false;
    } else if (error) {
      EventMgr.trigger('ajaxResponse', data);
      return;
    } else if (data.__from === 'dashboard' && data.__blockId) {
      $('#tblock-' + data.__blockId + ' .dashblock-reload').trigger('click');
      return;
    }

    if (data.message && data.message.length) {
      App.Global.bannerHtml = data.message;
      App.Global.warning = data.warning;
      App.Global.targetId = tabId;
    }
    if (tabId !== undefined) {
      EventMgr.trigger('reloadTab', { tabId: tabId, filter: true });
    } else {
      param = tabs[0][0];
      EventMgr.trigger('ajaxRequest', {
        param: param,
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        queue: 'noqueue',
        failfunc: 'failCommonAjaxResponse' });
    }
  }

  //control props handler
  function controlPropHandler(e) {
    e.preventDefault();
    e.stopPropagation();
    var type = this.getAttribute('data-type'),
        func = this.getAttribute('data-func'),
        cgi = this.getAttribute('data-cgi'),
        self = $(this),
        tr = self.parents('tr'),
        blockId = self.closest('.b-form-page_view_dblock').attr('data-tabid'),
        elid = tr.attr('data-elid'),
        keyName = tr.attr('data-elkeyname'),
        param = [],
        paramString = '',
        url = cgi ? pageInfo.host + cgi : pageInfo.url,
        parent = self.parents('.content').attr('data-tabid'),
        confirm = {},
        tabs,
        toolbar = $('#cont-' + parent + ' .toolbar'),
        plid = filterXSS.friendlyAttrValue(toolbar.attr('data-plid') || ''),
        convert = toolbar.attr('data-convert'),
        value = this.getAttribute('data-value');
    paramString += 'elid=' + encodeURIComponent(elid);
    if (plid) {
      param.plid = plid;
      // plid already encode
      paramString += '&plid=' + plid;
    }
    if (convert) {
      param.tconvert = convert;
      paramString += '&tconvert=' + encodeURIComponent(convert);
    }
    if (value) {
      param.value = value;
      paramString += '&value=' + value;
    }
    param.func = func;
    param.elid = elid;
    if (type === 'list' || type === 'form' || type === 'edit') {
      EventMgr.trigger('ajaxRequest', {
        url: url,
        param: param,
        invar: { parent: parent },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        queue: 'noqueue' });
    } else if (type === 'url') {
      //how it does work?
      App.u.openInNewWindow(func, '_blank');
    } else if (type === 'group') {
      confirm = this.getAttribute('data-confirm');
      tabs = { 0: [param] };
      param.sok = 'ok';
      var grActParam = {
        confirm: confirm,
        rows: keyName,
        tabId: parent,
        params: param,
        to: tabs,
        // __from: 'dashboard',
        self: this,
        cgi: cgi };
      if (blockId) {
        grActParam.__from = 'dashboard';
        grActParam.__blockId = blockId;
      }
      groupActionHandler.apply(window, [{}, grActParam]);
    } else if (type === 'window') {
      paramString += '&func=' + func;
      window.open(url + '?' + paramString + '&newwindow=yes', '_blank');
    }
  }

  //handler for modules with param elid plid
  function actionControllerWithParam(e, data) {
    var i = 0,
        paramString,
        self = $(this),
        type = this.getAttribute('data-type'),
        cgi = this.getAttribute('data-cgi'),
        name = this.getAttribute('data-name'),
        updateTab = App.Dom.hasClass(this, 'updatetab'),
        newTab = App.Dom.hasClass(this, 'newtab'),
        classes = self.attr('class'),
        href,
        parent,
        re,
        url,
        param = {},
        targetTabId,
        plid,
        moreOne = false,
        hasProgressBar = false,
        tabId,
        tconvert,
        progressid,
        iType,
        rParent,
        elems,
        l,
        rl;
    param.plid = '';

    href = this.getAttribute('data-url');
    parent = this.getAttribute('data-parent');
    tabId = parent;

    if (type !== 'new' && type !== 'list' && type !== 'url' && type !== 'windownosel') {
      if (self.parents('.toolbar').attr('data-plid') !== undefined) {
        param.plid = filterXSS.friendlyAttrValue(self.parents('.toolbar').attr('data-plid') || '');
      }
      //check for map selected
      if (selectedElems[tabId]) {
        elems = selectedElems[tabId];
        l = elems.length;
        rl = l - 1;
        while (l--) {
          if (l !== rl) {
            param.elid += ', ';
            if (elems[l].name) {
              param.name += ', ';
            }
          } else {
            param.elid = '';
            if (elems[l].name) {
              param.name = '';
            }
          }
          param.elid += elems[l].elid;
          if (elems[l].name) {
            param.name += elems[l].name;
          }
        }
        //get form list
      } else {
        $selectedItems().each(function () {
          if (i !== 0) {
            param.elid += ', ';
            moreOne = true;
          } else {
            param.elid = '';
          }
          param.elid += this.getAttribute('data-elid');
          if (i === 0) {
            param.elname = this.getAttribute('data-elkeyname');
          } else if (param.elname) {
            delete param.elname;
          }
          i++;
        });
      }
      //check for elid for groupformnosel
      if (type === 'groupformnosel') {
        if (!param.elid) {
          var firstRow = $firstListItem();
          if (firstRow) {
            param.elid = firstRow.getAttribute('data-elid');
          }
        }
      }

      tconvert = self.parents('.toolbar').attr('data-convert');
      if (tconvert) {
        param.tconvert = tconvert;
      }
    } else {
      plid = filterXSS.friendlyAttrValue(self.parents('.toolbar').attr('data-plid') || '');
      param.plid = plid || '';
    }

    re = new RegExp('/?func=+');
    if (href.match(re)) {
      url = cgi ? pageInfo.host + cgi : pageInfo.url;
      href = href.replace('?', '');
      paramString = href + '&elid=' + encodeURIComponent(param.elid) + '&plid=' + encodeURIComponent(param.plid);
      param.func = href.replace('func=', '');
      //check for progressbar

      progressid = this.getAttribute('data-progressid') + this.getAttribute('data-itemid');
      if (this.getAttribute('data-progressbar')) {
        hasProgressBar = true;
      }
      //choose type
      if (type === 'window' || type === 'groupwindow' || type === 'windownosel') {
        window.open(url + '?' + paramString + '&newwindow=yes', '_blank');
        return false;
        //groupedit
      } else if (type === 'edit' && moreOne) {
        param.faction = param.func;
        param.func = 'groupedit';
        hasProgressBar = true;

        EventMgr.trigger('clickedGroupItem', {
          invar: {
            url: url,
            tabId: tabId,
            params: param,
            newTab: newTab,
            parent: parent,
            type: type,
            updateTab: updateTab,
            name: name,
            hasProgressBar: hasProgressBar,
            progressid: progressid
          },
          tabId: tabId,
          classes: classes,
          triggerAction: 'requestListAction'
        });
        return false;
      } else if (type === 'url') {
        if (cgi) {
          App.u.openInNewWindow(url, '_blank');
        } else {
          App.u.openInNewWindow(param.func, '_blank');
        }
        return false;
      }
      //trigger requestAction here
      EventMgr.trigger('requestListAction', {
        url: url,
        params: param,
        newTab: newTab,
        parent: parent,
        tabId: tabId,
        type: type,
        updateTab: updateTab,
        name: name,
        hasProgressBar: hasProgressBar,
        progressid: progressid
      });
    } else {
      //what else?
      console.log(href);
    }
    //call progressbar if needed
    if (e) {
      e.preventDefault();
    }
  }

  function requestAction(e, data) {
    var url = data.url,
        param = data.params,
        tabId = data.tabId,
        newTab = data.newTab,
        parent = data.parent,
        type = data.type,
        name = data.name,
        updateTab = data.updateTab,
        hasProgressBar = data.hasProgressBar,
        progressid = data.progressid,
        iType,
        rParent,
        targetTabId;

    if (hasProgressBar) {
      param.progressid = progressid;
      setTimeout(function () {
        var param1 = {
          elid: progressid,
          func: 'progress.get',
          sfrom: 'ajax' };
        EventMgr.trigger('ajaxRequest', {
          param: param1,
          invar: {
            tabId: tabId,
            param: param1,
            type: '',
            progresstype: undefined },
          type: 'get',
          outtype: 'json',
          trfunc: 'progressBarResponse',
          queue: 'noqueue' });
      }, 700);
    }
    //call function and refresh list after (like group action)
    if (type === 'refresh' || type === 'action') {
      EventMgr.trigger('ajaxRequest', {
        url: url,
        param: param,
        invar: { tabId: tabId, __src: 'toolbarAction-refresh' },
        type: 'get',
        trfunc: 'ajaxGroupComplete',
        outtype: 'json',
        queue: 'noqueue',
        failfunc: 'failCommonAjaxResponse' });
      EventMgr.trigger('tabLoading', { tabId: tabId });
      return false;
    } else if (updateTab) {
      targetTabId = parent;
      iType = 'replace';
      //flag for remember parent
      rParent = true;
      parent = null;
    }
    if (newTab) {
      parent = null;
    }
    //param = APP.common.parseParams(param);
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      invar: {
        dataSaved: true,
        newtab: newTab,
        parent: parent,
        targetTabId: targetTabId,
        iType: iType,
        __srcBtn: name,
        __src: 'toolbarAction',
        rParent: rParent },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      failfunc: 'failCommonAjaxResponse',
      queue: 'noqueue' });
    if (!newTab) {
      EventMgr.trigger('tabLoading', { tabId: tabId });
    }
  }

  function actionPreviewHandler(e) {
    var $self = $(this),
        plid = '',
        elid = '',
        i = 0,
        href = this.getAttribute('data-url'),
        $fakeNode = $('#b-lightbox-fake-link');
    if ($self.parents('.toolbar').attr('data-plid') !== undefined) {
      plid = filterXSS.friendlyAttrValue($self.parents('.toolbar').attr('data-plid') || '');
    }

    $selectedItems().each(function () {
      if (i !== 0) {
        elid += ', ';
      } else {
        elid = '';
      }
      elid += this.getAttribute('data-elid');
      i++;
    });

    $fakeNode.attr('href', '?' + href + '&elid=' + elid + '&plid=' + plid);
    $fakeNode.trigger('click');
  }
  //hotkey handler for toolbtn
  function hotKeysHandler(e, d) {
    if (d && d.key && d.keys && d.len) {
      if (window.document.activeElement && window.document.activeElement.getAttribute('type')) {
        return;
      }
      var hotKeyClass = 'hotkey-';
      //check for CTRL
      if (d.ctrl) {
        hotKeyClass += 'Ctrl-';
      }
      //check for SHIFT
      if (d.shift) {
        hotKeyClass += 'Shift-';
      }
      hotKeyClass += d.key;
      var $toolbtn = $('.tab-content_st_active .' + hotKeyClass);
      if ($toolbtn.length) {
        $toolbtn.find('.img-link').trigger('click');
      }
    }
  }

  //DbClick on table row
  function actionDbClickController(e) {
    if (e) {
      e.preventDefault();
    }
    blockSelection();
    var $toolBarBtn = $('.tab-content_st_active' + ' .toolbar-button.active .img-link.default');
    if ($toolBarBtn.length > 0) {
      if ($toolBarBtn.hasClass('group')) {
        groupAction.apply($toolBarBtn);
      } else if ($toolBarBtn.hasClass('action-preview')) {
        actionPreviewHandler.apply($toolBarBtn[0]);
      } else {
        actionControllerWithParam.apply($toolBarBtn[0]);
      }
      EventMgr.trigger('hideContextIcon');
    }
  }
  //list pager handler
  function pagerHandler(e, data) {
    var tabCont = $(this).parents('.tab-content'),
        tabId = tabCont.attr('data-tabid'),
        pCnt = $('#cont-' + tabId + ' .page_cnt .cnt').val(),
        pNum = this.getAttribute('data-n'),

    /* jslint camelcase: false */
    param = { p_num: pNum, p_cnt: pCnt };
    /* jslint camelcase: true */

    EventMgr.trigger('reloadTab', { tabId: tabId, param: param });
  }

  function slistPagerHandler(e, data) {
    var pNum = $(this).val(),

    //@todo move to variable
    tabCont = $('.tab-content_st_active'),
        tabId = tabCont.attr('data-tabid'),
        pCnt = $('#cont-' + tabId + ' .page_cnt .cnt').val(),

    /* jslint camelcase: false */
    param = {
      p_num: pNum,
      p_cnt: pCnt
    };
    /* jslint camelcase: true */
    EventMgr.trigger('reloadTab', { tabId: tabId, param: param });
  }

  //pager input in list
  function pagerInputHandler(e, data) {
    var code = e.keyCode || e.which,
        select;
    if (code === 13) {
      select = $('.tab-content_st_active ' + '.pager-wrapper input[name="pager-slist"]');
      if (select.val() !== 1) {
        select.val(1);
      }
      slistPagerHandler.apply(select);
      e.preventDefault();
    }
  }
  //pager ok button handler
  function pagerBtnHandler(e) {
    var select = $('.tab-content_st_active ' + '.pager-wrapper input[name="pager-slist"]');
    if (select.val() !== 1) {
      select.val(1);
    }
    slistPagerHandler.apply(select);
    e.preventDefault();
  }

  //handler for tsetting button in list
  function actionControllerTsetting(e) {
    var href = this.getAttribute('data-url'),
        parent = this.getAttribute('data-parent'),
        re = new RegExp('/?func=+'),
        queue = 'menu',
        newtab = false,
        url,
        param;
    if (href) {
      if (href.match(re)) {
        url = pageInfo.url;
        href = href.replace('?', '');
        // convert string to object
        param = App.Common.parseParams(href);
        //noesc param
        EventMgr.trigger('ajaxRequest', {
          url: url,
          param: param,
          noesc: true,
          invar: {
            parent: parent,
            newtab: newtab,
            __src: 'tSetting',
            __srcBtn: 'tsetting'
          },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          queue: queue,
          failfunc: 'failCommonAjaxResponse' });
        EventMgr.trigger('tabLoading', { tabId: parent });
      } else {
        //what else?
        console.log(url);
      }
    }
    if (e) {
      e.preventDefault();
    }
  }

  //open list and form form dashboard
  function dashBoardButtonHandler(e) {
    e.preventDefault();
    var type = this.getAttribute('data-type'),
        func = this.getAttribute('data-func'),
        form = this.getAttribute('data-form'),
        name = this.getAttribute('data-name'),
        tabs,
        self,
        rows,
        tabid,
        confirm,
        blockId,
        funcParam = App.Common.parseParams(func),
        funcForm = App.Common.parseParams(form);
    if (type === 'group') {
      self = $(this);
      blockId = self.closest('.b-form-page_view_dblock').attr('data-tabid'), rows = self.parents('tr').attr('data-elid');
      tabid = undefined;
      confirm = self.parents('table.list_table').find('div[data-confirm-' + name + ']').attr('data-confirm-' + name);
      tabs = [[{ status: 1, title: '', params: funcParam }]];
      var grActParam = {
        confirm: confirm,
        rows: rows,
        tabId: tabid,
        to: tabs,
        self: this,
        params: funcForm };
      if (blockId) {
        grActParam.__from = 'dashboard';
        grActParam.__blockId = blockId;
      }
      groupActionHandler.apply(window, [{}, grActParam]);
      return;
    } else {
      //if not defined func list open only form
      if (!funcParam.func) {
        tabs = [[{ status: 1, title: '', params: funcForm }]];
      } else {
        tabs = [[{ status: 1, title: '', params: funcParam }, { status: 1, title: '', params: funcForm }]];
      }
      //tabs = { 0 : [funcParam, funcForm] };
    }
    EventMgr.trigger('multiLoadTab', { tabs: tabs, isNotInit: true });
  }

  function editFormHandler(e) {
    e.preventDefault();
    var $self = $(this),
        elid = $self.closest('.b-list__table-row').attr('data-elid'),
        index = $self.closest('td').index(),
        th = $self.closest('table').find('th')[index],
        editFunc = th.getAttribute('data-editform'),
        tabCont = $self.closest('.tab-content'),
        tabId = tabCont.attr('data-tabid'),
        toolbarNode = App.Dom.byId('toolbar-' + tabId),
        invar = {},
        param = {
      func: editFunc,
      elid: elid
    },
        plid;
    if (toolbarNode) {
      plid = filterXSS.friendlyAttrValue(toolbarNode.getAttribute('data-plid') || '');
      if (plid) {
        param.plid = plid;
      }
    }

    if (tabId !== 'tab0') {
      invar.parent = tabId;
    }

    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: invar,
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      queue: 'dashboard',
      failfunc: 'failCommonAjaxResponse' });
  }

  function dummyToolbtnHandler(e) {
    if (e) {
      e.preventDefault();
    }
  }

  function init() {
    EventMgr.on($content(), actionBannerSelector, 'click', bannerAction);
    EventMgr.on($content(), backBtnListSelector, 'click', backBtnHandlerList);
    EventMgr.on($content(), breadcrumbSelector, 'click', breadcrumbHandler);
    EventMgr.bind('listSelectedData', groupActionHandler);
    EventMgr.bind('requestListAction', requestAction);
    EventMgr.on($content(), controlPropSelector, 'click', controlPropHandler);
    EventMgr.on($content(), toolBarBtnGroupActSel, 'click', groupAction);
    EventMgr.on($content(), toolBarBtnSel, 'click', actionControllerWithParam);
    EventMgr.on($content(), toolBarBtnPreviewSel, 'click', actionPreviewHandler);
    EventMgr.on($content(), pageNumListSelector, 'click', pagerHandler);
    EventMgr.bind('updateSelectedElems', updateSelectedElems);
    EventMgr.bind('appendForm', updateSelectedElemsForForm);
    EventMgr.bind('closeTabEvent', removeSelectedElems);
    EventMgr.on($content(), tSettingSel, 'click', actionControllerTsetting);
    EventMgr.bind('ajaxGroupComplete', reloadAfterGroupAction);
    EventMgr.on($content(), rowTableSel, 'dblclick', actionDbClickController);
    EventMgr.on($content(), pagerInputSel, 'keydown', pagerInputHandler);
    EventMgr.on($content(), pagerBtnSelector, 'click', pagerBtnHandler);
    EventMgr.on($content(), pagerSlistSel, 'change', slistPagerHandler);
    EventMgr.on($content(), dashboardButtonSel, 'click', dashBoardButtonHandler);
    EventMgr.on($content(), nestedListSel, 'click', nestedListHandler);
    EventMgr.on($content(), editFormSel, 'click', editFormHandler);
    EventMgr.on($content(), dummyToolbtn, 'click', dummyToolbtnHandler);
    EventMgr.bind('otherKeyUp', hotKeysHandler);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ActionHandlerList.js.map

'use strict';

/**
 *  Модуль.
 *  ваш К.О.
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.ActionHandlerDashboard = function (window, $, EventMgr, App) {
  'use strict';

  var storage = App.Common.storage,
      refDashboardBlock = '.dashblock-reload',
      pageNumDashSel = '.pager-list_type_dashboard .pager-list__item_act',
      actionMultiBtnSel = '.multi-item a, .multi-item span',
      $content = function $content() {
    return $('#main-wrapper');
  },
      blockToUpdate = [];

  function dashboardLoad() {
    var url = pageInfo.url,
        param = { func: 'dashboard' };
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      invar: { exType: 'dashboard' },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      queue: 'dashboard' });
  }

  function dashoardCheckSwitchTab(e, data) {
    var tabId = data.tabId;
    if (tabId === 'tab0') {
      dashboardLoad();
      EventMgr.unbind('activateTab', dashoardCheckSwitchTab);
    }
  }

  //startpage
  function dashBoard() {
    if (pageInfo.startpage !== 'dashboard' || pageInfo.startform) {
      var data = { 'lateLoad': true, exType: 'dashboard' };
      EventMgr.trigger('ajaxResponse', data);
      EventMgr.bind('activateTab', dashoardCheckSwitchTab);
    } else {
      dashboardLoad();
    }
  }
  //for autoupdate
  function refreshDashBlock(e, data) {
    var block = data.block;
    if (block && $('#cont-tab0').hasClass('tab-content_st_active')) {
      $('#tblock-' + block.name).find('.dashblock-reload').trigger('click');
    }
    if (block.autoupdate) {
      setTimeout(function (block) {
        return function () {
          EventMgr.trigger('refreshDashBlock', { block: block });
        };
      }(block), block.autoupdate * 1000);
    }
  }

  function addBlockToUpdate(e, block) {
    blockToUpdate.push(block);
  }

  function checkForUpdate(e, d) {
    if (d && d.tabId === 'tab0') {
      update();
    }
  }

  function update(e, data) {
    for (var i = 0, l = blockToUpdate.length; i < l; i++) {
      EventMgr.trigger('refreshDashBlock', { block: blockToUpdate[i] });
    }
  }

  function refDashboardBlockHandler(e) {
    e = e || window.event;
    e.preventDefault();
    e.stopPropagation();
    var id = $(this).closest('.l-form-page__title-wr').attr('data-name').replace('.', '_'),
        blockId = 'block-' + id,
        block = App.Dom.byId(blockId),
        name,
        param,
        pNum,
        tblock,
        startTime;
    if (block) {
      tblock = App.Dom.byId('t' + blockId);
      if (tblock) {
        startTime = new Date().getTime();
        tblock.className += ' loading ';
      }
      name = block.getAttribute('data-block-name');
      param = storage.dashboard[name];
      pNum = $('#' + blockId + ' .page.active').attr('data-n');

      if (pNum) {
        /* jslint camelcase: false */
        param.p_num = pNum;
        /* jslint camelcase: true */
      }
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: { blockId: blockId, startTime: startTime },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponseForDashboard',
        failfunc: 'failedAjaxResponseForDashboard',
        queue: 'dash_pager' + id });
    }
  }

  //pager on dashboard block
  function pagerHandlerDash() {
    var self = $(this),
        parent = self.parents('.block-table'),
        id = parent.attr('id'),
        pNum = self.attr('data-n'),
        name = parent.attr('data-block-name'),
        tblock = App.Dom.byId('t' + id),
        param = storage.dashboard[name],
        startTime;
    /* jslint camelcase: false */
    param.p_num = pNum;
    /* jslint camelcase: true */
    if (tblock) {
      startTime = new Date().getTime();
      tblock.className += ' loading ';
    }
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { blockId: id, startTime: startTime },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponseForDashboard',
      failfunc: 'failedAjaxResponseForDashboard',
      queue: 'dash_pager' + id });
  }

  //handler for dashboard button
  function actionMultiController(e) {
    if (e) {
      e.preventDefault();
    }
    var form = this.getAttribute('data-form'),
        list = this.getAttribute('data-list'),
        top = this.getAttribute('data-top'),
        type = this.getAttribute('data-type'),
        tabs,
        param;
    if (type === 'form-list') {
      tabs = [];
      tabs.push([{
        'title': '',
        status: 1,
        params: { func: list } }, { title: '',
        status: 1,
        params: { func: form } }]);
      EventMgr.trigger('multiLoadTab', { tabs: tabs });
    } else if (type === 'list' || type === 'form') {
      param = { func: list || form };
      EventMgr.trigger('ajaxRequest', {
        param: param,
        type: 'get',
        invar: {
          __src: 'dashboardBtn'
        },
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'multiload' });
    } else if (type === 'top') {
      //reload desktop by reload flag for build tab function
      param = { func: top };
      EventMgr.trigger('ajaxRequest', {
        param: param,
        type: 'get',
        outtype: 'json',
        invar: {
          dataSaved: true,
          reload: true
        },
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'multiload' });
    }
  }

  function init() {
    EventMgr.bind('refreshDashBlock', refreshDashBlock);
    EventMgr.bind('loadPage', dashBoard);
    EventMgr.bind('addBlockToUpdate', addBlockToUpdate);
    EventMgr.bind('changedTab', checkForUpdate);
    EventMgr.on($content(), refDashboardBlock, 'click', refDashboardBlockHandler);
    EventMgr.on($content(), pageNumDashSel, 'click', pagerHandlerDash);
    EventMgr.on($content(), actionMultiBtnSel, 'click', actionMultiController);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ActionHandlerDashboard.js.map

'use strict';

/**
 * ajax helper module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 */
App.AjaxHelper = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.bind('ajaxRequest', ajaxRequest);
    EventMgr.bind('ajaxRequestAbort', ajaxRequestAbort);
  },
      CACHE = {},
      ajaxRequestAbort = function ajaxRequestAbort(e, data) {
    var id = data.id;
    if (CACHE[id] && CACHE[id].xhr.abort) {
      CACHE[id].erMsg = 'Request canceled By User';
      CACHE[id].xhr.abort();
    }
  },
      addRequestHook = function addRequestHook(cb) {
    if (typeof cb === 'function') {
      requestHooks.push(cb);
    }
  },
      addResponseHook = function addResponseHook(cb) {
    if (typeof cb === 'function') {
      responseHooks.push(cb);
    }
  },
      requestHooks = [],
      responseHooks = [],
      applyRequestHooks = function applyRequestHooks(data) {
    for (var i = 0, l = requestHooks.length; i < l; i++) {
      requestHooks[i].apply(this, [data]);
    }
  },
      applyResponseHooks = function applyResponseHooks(data) {
    for (var i = 0, l = responseHooks.length; i < l; i++) {
      responseHooks[i].apply(this, [data]);
    }
  },
      ajaxRequest = function ajaxRequest(e, dataSource) {
    applyRequestHooks(dataSource);
    var cUrl = dataSource.url || pageInfo.url,
        param = dataSource.param || {},
        formData = dataSource.formData || {},
        inVar = dataSource.invar || {},
        trFunc = dataSource.trfunc || 'ajaxResponse',
        failFunc = dataSource.failfunc || false,
        type = dataSource.type || 'get',
        outType = dataSource.outtype || 'html',
        queueName = dataSource.queue || 'queue',
        noesc = !!dataSource.noesc,
        reqType = dataSource.reqType || 'jquery',
        progressCb = dataSource.progressCb || function () {},
        rp = dataSource.rp || [],
        id = dataSource.id;
    inVar.__dataSource = dataSource;
    if (queueName === 'noqueue') {
      queueName = new Date().getTime();
    }
    param.sfrom = 'ajax';
    param.operafake = new Date().getTime();
    var paramString = getQueryString(param, noesc);

    if (reqType === 'jquery') {
      EventMgr.trigger('getAjaxRequest', {});
      var ajaxParams = {
        url: cUrl,
        type: type,
        dataType: 'html',
        data: paramString,
        headers: { 'ISP-Client': 'Web-interface' },
        //data : param,
        async: true,
        success: success,
        xhrFields: { withCredentials: true },
        error: error
      };
      if (type === 'jsonp') {
        ajaxParams.jsonp = 'callback';
        ajaxParams.dataType = 'jsonp';
        ajaxParams.crossDomain = true;
      }
      $.ajaxq(queueName, ajaxParams);
    } else {
      //progress upload
      var xhr = new XMLHttpRequest();
      xhr.upload.addEventListener('progress', progressCb, false);
      xhr.open('POST', cUrl);
      //set header for long request
      xhr.setRequestHeader('ISP-Client', 'Web-interface');
      xhr.onreadystatechange = function () {
        if (this.readyState === 4) {
          if (this.status === 200) {
            delete CACHE[id];
            success(this.responseText);
          } else {
            error(this, this.statusText, this.statusText);
          }
        }
      };
      formData.append('sfrom', 'ajax');
      CACHE[id] = { xhr: xhr };
      xhr.send(formData);
    }
    /* jshint latedef: false*/
    function success(data) {
      if (type !== 'jsonp') {
        data = data.replace(/\\'/g, "'");
        data = data.replace(/^<![\w\s\"-\/]*>/g, '');
        if (!data) {
          //wtf?
          console.log('empty response');
          EventMgr.trigger('ajaxError', {});
          return;
        }
      }

      if (outType === 'json' && type !== 'jsonp') {
        //remove non-printable characters
        data = data.replace(/[\x00-\x08\x0B-\x0C\x0E-\x1F]/g, '');
        try {
          data = jQuery.parseJSON(data);
        } catch (e) {
          //error
          console.log('jsonParseError', dataSource, failFunc);
          dataSource.erType = 'json';
          if (failFunc) {
            EventMgr.trigger(failFunc, dataSource);
          }
          //EventMgr.trigger('ajaxError', {});
          return;
        }
      }
      if (outType !== 'html') {
        data.sourceParamString = paramString;
        //add props in returned object
        $.extend(data, inVar);
        data.selfUrl = pageInfo.url + '?' + data.urlparam;
        //remove some param from response
        if (rp.length) {
          data = removeParams(data, rp);
        }
      }

      if (trFunc !== 'DoNothing') {
        EventMgr.trigger(trFunc, data);
      }
      EventMgr.trigger('giveAjaxRequest', {});
    }
    /* jshint latedef: false*/
    function error(jqXHR, textStatus, errorThrown) {
      //check for long request
      if ((errorThrown === 'Service Unavailable' || jqXHR.status === 503) && !dataSource.ignore503) {
        //go to new url while request not end
        var longUrl = jqXHR.responseText;
        dataSource.url = pageInfo.host + '/' + longUrl;
        dataSource.reqType = 'jquery';
        EventMgr.trigger('ajaxRequest', dataSource);
      } else if (trFunc === 'ajaxResponse' && inVar.exType === 'dashboard') {
        inVar.error = true;
        inVar.shithappend = true;
        EventMgr.trigger('ajaxResponse', inVar);
      } else if (failFunc) {
        var regex = /<div class="fatal-error-desc">(.*?)<\/div>/ig,
            errText = String(jqXHR.responseText).match(regex);
        if (errText && errText[0]) {
          dataSource.erMsg = errText[0];
        }
        if (CACHE[dataSource.id] && App.u.isString(CACHE[dataSource.id].erMsg)) {
          dataSource.erMsg = CACHE[dataSource.id].erMsg;
        }
        EventMgr.trigger(failFunc, dataSource);
        delete CACHE[dataSource.id];
      }
      console.log(textStatus);
    }
  },
      removeParams = function removeParams(data, rp) {
    var l = rp.length;
    while (l--) {
      data[rp[l]] = null;
    }
    return data;
  },

  //join with &
  getQueryString = function getQueryString(queryObj, noesc) {
    var j = 0,
        paramString = '',
        curValue,
        keyVar;
    for (keyVar in queryObj) {
      if (keyVar !== '') {
        if (j !== 0) {
          paramString += '&';
        }
        curValue = queryObj[keyVar];
        //encode params
        if (noesc) {
          paramString += keyVar + '=' + curValue;
        } else {
          paramString += keyVar + '=' + encodeURIComponent(curValue);
        }
        j++;
      }
    }
    return paramString;
  };
  return {
    init: init,
    addRequestHook: addRequestHook,
    addResponseHook: addResponseHook
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.AjaxHelper.js.map

'use strict';

/**
 * Alert module
 * shows alert message
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @return {object} api
 */
App.Alert = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.bind('showAlert', showAlert);
    EventMgr.obind($modalBtn(), 'click', hideAlert);
  },
      $body = function $body() {
    return $('body');
  },
      $modalMsg = function $modalMsg() {
    return $('#modal_alert_message');
  },
      $modalBtn = function $modalBtn() {
    return $('#modal_alert_ok');
  },
      callback = null,
      himself = null,
      param = null,
      activeClass = 'active-modal-alert',
      showAlert = function showAlert(e, data) {
    var msg = data.msg,
        closeTimeout = data.closeTimeout,
        modalMsg = $modalMsg(),
        textarea;
    callback = data.callback || null;
    himself = data.himself || window;
    param = data.param;
    modalMsg.html(msg);
    $body().addClass(activeClass);
    setTimeout(function () {
      textarea = modalMsg.find('.b-textarea');
      if (textarea.length) {
        textarea.select();
      } else {
        $modalBtn().focus();
      }
    }, 1);

    if (closeTimeout) {
      setTimeout(function () {
        hideAlert();
      }, closeTimeout);
    }
  },
      hideAlert = function hideAlert() {
    $body().removeClass(activeClass);
    if (callback !== null) {
      callback.apply(himself, [param]);
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.Alert.js.map

'use strict';

/**
 * Модуль утилит для манипуляции с формой
 * @param {object} window глобальный объект
 * @param {object} $ jQuery глобальный объект
 * @param {object} App объект приложения
 */
App.FormUtils = function (window, $, App) {

  function changeReadOnly(elems, set) {
    if (!elems || elems.length === 0) {
      return;
    }
    if (set) {
      elems.find('.b-myselect,' + ' .b-radio,' + ' .b-checkbox__control,' + ' .l-slider__wr,' + ' .b-input_for_slider,' + ' .b-mselect').addClass('readonly').removeClass('mselect-av');
    } else {
      elems.find('.b-myselect, .b-radio,' + ' .b-checkbox__control,' + ' .l-slider__wr,' + ' .b-input_for_slider,' + ' .b-mselect').removeClass('readonly').addClass('mselect-av');
    }
    elems.find('.b-input, .b-textarea').attr('readonly', set);
  }

  var api = {
    changeReadOnly: changeReadOnly
  };

  return api;
}(window, $, App);
//# sourceMappingURL=App.FormUtils.js.map

'use strict';

/**
 * Модуль обработки скрытия полей на форме
 * @param {object} window глобальный объект
 * @param {object} $ jQuery глобальный объект
 * @param {object} EventMgr менеджер событий
 * @param {object} formUtils утилиты для манипуляции с формой
 * @param {object} commonUtils общие утилиты
 */
App.FormDependFields = function (window, $, EventMgr, formUtils, commonUtils) {
  /** селектор контролов управляющих скрытием полей  */
  var dependFieldSlistSelector = '.control-field input[type="hidden"],' + ' .control-field .b-input,' + ' .control-field .b-input_type_file,' + ' .control-field .b-textarea';

  /**
   * Получаем ссылку на ноду формы
   * @return {object} jQuery объект
   */
  function $content() {
    return commonUtils.selectorCache('.i-form-wr');
  }

  //hide/show field by select, radio and checkbox
  /**
   * Обработчик скрытия зависимых полей от данного контрола
   */
  function dependFieldsSlistHandler() {
    var handlerValue = this.getAttribute('data-handler-val');
    var name = this.getAttribute('name');
    var type = this.getAttribute('type');
    var tabId = this.getAttribute('data-tabid');
    var rowIsHidden = false,
        shadowShowElems = void 0,
        shadowHideElems = void 0,
        HideElems = void 0,
        shadowedRow = void 0;
    if (!name) {
      return;
    }
    //show hidden fields by "hide"
    shadowHideElems = $('.hidden-shadow-' + name);
    HideElems = $('.hidden-' + name);
    //unshadow shadow elems
    formUtils.changeReadOnly(shadowHideElems, false);
    shadowHideElems.removeClass('hidden-shadow-' + name);
    HideElems.removeClass('hidden-' + name);
    //hide field by else
    $('.showed-' + name).addClass('depended-hidden-s').addClass('l-form__row_hidden_yes').removeClass('showed-' + name);
    //check row if already shadowed by else or 1st start
    shadowedRow = $('.depended-shadow-s');
    if (!shadowedRow.hasClass('row-shadow')) {
      shadowedRow.addClass('row-shadow');
      formUtils.changeReadOnly(shadowedRow, true);
    }
    //shadow field by else
    shadowShowElems = $('.showed-shadow-' + name).removeClass('showed-shadow-' + name).addClass('depended-shadow-s').addClass('row-shadow');
    //add readonly from shadow
    formUtils.changeReadOnly(shadowShowElems, true);

    rowIsHidden = $(this).parents('.l-form__row, .filter-item').hasClass('l-form__row_hidden_yes');
    // если поле не скрыто, то оно учавствует в скрытие полей
    if (!rowIsHidden) {
      //for text and native hidden
      if (type === 'text' || type === 'textarea' || !handlerValue) {
        var value = this.value;
        if (value === '') {
          //hide field by "hide" (empty = "yes")
          $('#frm-' + tabId + ' [data-hide-' + name + '-' + hash('empty-yes') + ' = "yes"]').addClass('hidden-' + name).addClass('l-form__row_hidden_yes');
          //shadow field by "hide" (empty = "yes")
          shadowHideElems = $('#frm-' + tabId + ' [data-shadow-' + name + '-' + hash('empty-yes') + ' = "yes"]').addClass('hidden-shadow-' + name).addClass('row-shadow');
          formUtils.changeReadOnly(shadowHideElems, true);
        } else {
          //hide fields by "hide" (empty = no)
          $('#frm-' + tabId + ' [data-hide-' + name + '-' + hash('empty-no') + ' = "yes"]').addClass('hidden-' + name).addClass('l-form__row_hidden_yes');
          //shadow fields by "hide" (empty = no)
          shadowHideElems = $('#frm-' + tabId + ' [data-shadow-' + name + '-' + hash('empty-no') + ' = "yes"]').addClass('hidden-shadow-' + name).addClass('row-shadow');
          formUtils.changeReadOnly(shadowHideElems, true);
        }
        // для селектов и радиобаттонов
      } else {
        //show field by "show"
        $('#frm-' + tabId + ' [data-show-' + name + '-' + handlerValue + ' = "yes"]').addClass('showed-' + name).removeClass('depended-hidden-s').removeClass('l-form__row_hidden_yes');
        //unshadow field by "show"
        shadowShowElems = $('#frm-' + tabId + ' [data-show-shadow-' + name + '-' + handlerValue + ' = "yes"]').addClass('showed-shadow-' + name).removeClass('depended-shadow-s').removeClass('row-shadow');
        formUtils.changeReadOnly(shadowShowElems, false);
        //hide field by "hide"
        $('#frm-' + tabId + ' [data-hide-' + name + '-' + handlerValue + ' = "yes"]').addClass('hidden-' + name).addClass('l-form__row_hidden_yes');
        //shadow field by "hide"
        shadowHideElems = $('#frm-' + tabId + ' [data-shadow-' + name + '-' + handlerValue + ' = "yes"]').addClass('hidden-shadow-' + name).addClass('row-shadow');
        formUtils.changeReadOnly(shadowHideElems, true);
      }
    }
  }

  /**
   * Вызываем обработчик if/else скрытия полей
   * @param {string} tabId id таба
   */
  function dependSlistHandlerRun(tabId) {
    $('#cont-' + tabId + ' tr:not(".row-error") .control-field' + ' input[type="hidden"],' + ' #cont-' + tabId + ' tr:not(".row-error") .control-field' + ' input[type="text"],' + ' #cont-' + tabId + ' tr:not(".row-error") .control-field' + ' input[type="password"],' + ' #cont-' + tabId + ' tr:not(".row-error") .control-field' + ' .b-input_type_file,' + ' #cont-' + tabId + ' .control-field.filter-item input[type="hidden"],' + ' #cont-' + tabId + ' .control-field .b-textarea,' + ' #cont-' + tabId + ' .control-field.filter-item input[type="text"]').each(function () {
      dependFieldsSlistHandler.apply(this);
    });
  }

  /**
   * Hide page if no visible fields
   * @param {String} tabId
   */
  function checkEmptyPage(tabId) {
    $('#form-wrapper-' + tabId + ' .b-form-page').each(function () {
      var id = this.getAttribute('id');
      if ($('#' + id + ' .l-form__row:not(.l-form__row_hidden_yes):not(.depended-hidden-s)').length > 0) {
        this.style.display = '';
      } else {
        this.style.display = 'none';
      }
    });
  }

  /**
   * Handler for changed control fields
   *
   * every contol field runs hide/show function from up to down from
   * @param {object} e event object
   * @param {object} data
   * @this {object} HTML node
   */
  function firstDependFieldsSlistHandler(e, data) {
    //проверяем на тип boolean для проверки на setvalue=once/final 
    var tabId = !!data && typeof data !== 'boolean' ? data.tabId : this.getAttribute('data-tabid');
    // сбрасываем все правила скрытия
    $('#cont-' + tabId + ' .l-form__row_hidden_yes').removeClass('l-form__row_hidden_yes');
    $('#cont-' + tabId + ' .row-shadow').removeClass('row-shadow');

    dependSlistHandlerRun(tabId);

    checkEmptyPage(tabId);

    EventMgr.trigger('updFormHeight', { tabId: tabId });
    EventMgr.trigger('reloadSlider', { tabId: tabId });
    EventMgr.trigger('upPrefixField', { tabId: tabId });
  }

  function init() {
    EventMgr.bind('appendForm,appendReport,appendedFilter,initFuncRun', firstDependFieldsSlistHandler);
    EventMgr.on($content(), dependFieldSlistSelector, 'change', firstDependFieldsSlistHandler);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App.FormUtils, App.Common);
//# sourceMappingURL=App.FormDependFields.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 * Form module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} ScrollHandler Scrollbar library
 */
App.Forms = function (window, $, EventMgr, App, ScrollHandler) {
  'use strict';

  function init() {
    EventMgr.on($content(), headerFormSelector, 'click', collapsedForm);
    EventMgr.on($content(), unlimitBtnSelector, 'click', insertUnlimValue);
    //zoom
    EventMgr.on($content(), zoomBtnSelector, 'click', zoomHandler);
    EventMgr.on($content(), zoomTextareaSelector, 'change', syncZoomValue);
    EventMgr.on($content(), zoomTextareaSelector, 'keyup', addLineBreakToZoomField);
    EventMgr.on($content(), zoomTextareaELSelector, 'keyup', syncZoomValue);
    EventMgr.on($content(), passwdBtnSelector, 'click', genPassword);
    EventMgr.on($content(), showpwdBtnSelector, 'click', showPassword);
    EventMgr.on($content(), calendarBtnSelector, 'click', calendarHandler);
    //checkbox
    EventMgr.on($content(), checkboxChangeSelector, 'change', changeElHandler);
    EventMgr.on($content(), checkboxSelector, 'click', changeCheckboxValue);
    //radio
    EventMgr.on($content(), radiobuttonSelector, 'click', changeRadioValue);
    EventMgr.on($content(), descRadioSelector, 'click', radioLabelClickHandler);
    EventMgr.on($content(), radiobuttonSelector, 'keydown', radioBtnKeyDownHandler);

    EventMgr.on($content(), bandShowSelector, 'click', bandShowHandler);
    EventMgr.on($content(), dependSlistSelector, 'change', dependSlistHandler);
    EventMgr.on($content(), setvalueSelector, 'change', setValueHandler);
    EventMgr.on($content(), setvalueBtnSelector, 'click', setValueHandler);
    EventMgr.on($content(), resetBtnSelector, 'click', resetHandler);
    EventMgr.on($content(), userexpLinkSelector, 'click', levelUp);
    EventMgr.on($content(), nestedreportSelector, 'click', nestedReportHandler);
    EventMgr.on($content(), fakePasswdSelector, 'change', fakePasswdCopy);
    EventMgr.bind('forceSetValues', forceSetValues);
    EventMgr.bind('appendForm,appendReport,appendedFilter,forceDepend', firstDependSlistHandler);
    EventMgr.bind('loadPage', loadPassList);
    EventMgr.bind('appendForm,appendReport,switchTabForm,setFocus', setFocus);
    EventMgr.bind('appendForm', scrollToSelectedBranch);
    EventMgr.bind('formSetValues', formSetValues);
    EventMgr.bind('syncInputToZoom', syncInputWithZoom);
    EventMgr.on($content(), passwdField, 'change', checkPass);
    EventMgr.on($content(), inputTypeTextSelector, 'keydown', submitFormByEnter);
    EventMgr.on($content(), checkBoxSelectTextareaRadioFormSelector, 'keydown', submitFormByCtrlEnter);
    EventMgr.on($content(), passwdField, 'keyup', checkPass);
    EventMgr.on($content(), novalueSelector, 'change', changeNovalueFieldHandler);
    EventMgr.on($content(), formBtnSelector, 'keydown', formBtnKeyDownHandler);
    EventMgr.on($content(), descLabelCheckboxSelector, 'click', checkboxDescClickHandler);
    EventMgr.bind('gotPasswdList', gotPasswdListHandler);
    EventMgr.on($content(), treeHitarea, 'click', treeCollpasedControl);
    EventMgr.on($content(), treeLabelSelector, 'click', treeSelectedControl);
    EventMgr.on($content(), treeMultiLabelSelector, 'click', treeMultiSelectedControl);
    EventMgr.on($content(), treeCommonLabelSelector, 'dblclick', treeCollpasedControlWrapper);
    EventMgr.on($content(), fakeFileInput, 'click', fakeFileInputHandler);
    EventMgr.on($content(), FileInput, 'change', fileInputChangeHandler);
    EventMgr.on($content(), treeReszieConrtolSelector, 'mousedown', treeResizeControl);
    EventMgr.on($content(), confirmField, 'keyup, change', checkConfirmField);
    EventMgr.on($content(), quoteSelector, 'click', quoteHandler);
    //clear tab cache
    EventMgr.bind('closeTabEvent,appendForm,appendFilter,appendReport', cleanTabCache);
    EventMgr.bind('appendForm', prefixFieldSetUp);
    EventMgr.bind('upPrefixField', prefixFieldSetUp);
    EventMgr.on($content(), formListRow, 'click', formListRowClickHandler);
    EventMgr.bind('focusOnErrorField', focusOnErrorField);
    EventMgr.on($content(), '.b-textarea_responsive_yes', 'keyup', textareaResize);
    EventMgr.bind('appendForm', checkTitleWidth);
    EventMgr.on($content(), ticketBtnUp, 'click', ticketMoveUpHandler);
    EventMgr.on($content(), ticketBtnDown, 'click', ticketMoveDownHandler);
    EventMgr.on($content(), ticketCollapse, 'click', ticketCollapseHandler);
  }

  var appDom = App.Dom;

  var CACHE = {};

  function cleanTabCache(e, data) {
    var tabId = data.tabId;
    if (CACHE[tabId]) {
      delete CACHE[tabId];
    }
  }

  function $content() {
    return App.Common.selectorCache('.i-form-wr');
  }

  var pageInfo = window.pageInfo,
      quoteSelector = '.b-quote',
      treeReszieConrtolSelector = '.b-resizer',
      fakeFileInput = '.b-input-file-fake',
      FileInput = '.b-input_type_file',
      treeHitarea = '.tree-wrapper .tree-hitarea',
      treeLabelSelector = '.b-tree_type_default .tree-handler',
      treeCommonLabelSelector = '.tree-wrapper .tree-handler',
      treeMultiLabelSelector = '.b-tree_type_multiple .tree-handler',
      fakePasswdSelector = 'input.fakePasswd',
      novalueSelector = 'input[data-novalue], textarea[data-novalue]',
      passwdField = '.b-form-passwd-field, .b-form-passwd-field + input',
      userexpLinkSelector = 'div.userexperience',


  //wrapper for zoom textarea
  zoomTextareaSelector = '.b-textarea_for_zoom',

  //zoom field in inline-edit
  zoomTextareaELSelector = '.edit-field-form .b-textarea_for_zoom',


  //wrapper for body

  //wrapper for radiobutton
  radiobuttonSelector = '.b-radio:not(".readonly")' + ' .b-radio__control',

  //wrapper for checkboxes
  checkboxSelector = '.b-checkbox__control',

  //wrapper for headers of form page
  headerFormSelector = '.b-form-page__title',
      bandShowSelector = '.band-content .band_show_button',

  //wrapper for unlim btn from form
  unlimitBtnSelector = '.b-input-btn_type_unlimit',

  //zoom button
  zoomBtnSelector = '.b-input-btn_type_zoom',

  //password button
  passwdBtnSelector = '.b-input-btn_type_passwd',

  //calendar button
  calendarBtnSelector = '.b-input-btn_type_calendar',

  //show passwd button
  showpwdBtnSelector = '.b-input-btn_type_showpwd',

  //checkbox onchange
  checkboxChangeSelector = 'input[type="checkbox"].onchange',


  //wrapper for control field select and radio
  dependSlistSelector = '.depend.b-myselect input[type="hidden"],' + ' .depend.b-select-ac input[type="hidden"],' + ' .depend.b-radio input[type="hidden"]',
      setvalueSelector = '.setvalue input[type="hidden"],' + ' .b-select-ac_setvalues_yes input[type="hidden"],' + ' .setvalue input[type="text"],' + ' .setvalue input[type="password"],' + ' .setvalue .b-textarea',
      setvalueBtnSelector = '.i-button_type_setvalues',
      resetBtnSelector = '.i-button_type_reset',
      formBtnSelector = '.i-button, .b-checkbox__control',
      inputTypeTextSelector = '.l-form__wrapper .i-input-control,' + ' .filter-wrapper .i-input-control',
      checkBoxSelectTextareaRadioFormSelector = '.l-form__wrapper' + ' .b-radio__control,' + ' .l-form__wrapper .b-textarea,' + ' .l-form__wrapper .b-myselect__select-value,' + ' .filter-wrapper .b-myselect__select-value,' + ' .l-form__wrapper .b-checkbox__control,' + ' .l-form__wrapper .b-mselect__view-value',
      nestedreportSelector = '.data-wrapper.nestedreport',
      descRadioSelector = '.b-label__visible_for_radio, .b-radio-img__row',
      descLabelCheckboxSelector = ' .l-form__row_type_checkbox .b-label__visible',
      confirmField = '.b-form-confirm-field, .b-form-passwd-field',
      ticketBtnUp = '.i-ticket__btn-move_up',
      ticketBtnDown = '.i-ticket__btn-move_down',
      ticketCollapse = '.i-ticket__btn-collapse',
      formListRow = '.b-form-list__row, .b-form-blocks__block';

  function $activeTab() {
    return $('.tab-content_st_active');
  }

  //check for title overwidth & set hint overwidth
  function checkTitleWidth(e, data) {
    $('#cont-' + data.tabId).find('.b-title_type-form').each(function () {
      var width = this.offsetWidth,
          scrollWidth = this.scrollWidth - 1;
      if (width < scrollWidth) {
        this.className += ' overwidth';
        this.removeAttribute('data-hint');
      }
    });
  }

  function quoteHandler(e) {
    e.preventDefault();
    var content = '',
        selection;
    if (typeof window.getSelection !== 'undefined') {
      var sel = window.getSelection();
      content = sel.toString();
    } else if (typeof document.selection !== 'undefined') {
      if (document.selection.type === 'Text') {
        selection = document.selection.createRange();
        content = selection.text;
      }
    }
    if (content === '') {
      return;
    }
    var lines = content.split('\n'),
        l = lines.length;
    content = '';
    for (var i = 0; i < l; i++) {
      content += '> ' + lines[i];
      if (i !== l - 1) {
        content += '\n';
      }
    }
    var targetId = this.getAttribute('data-target'),
        elem = App.Dom.byId(targetId);
    if (elem) {
      App.u.insertStringAfterCaret(elem, content);
    }
  }

  function fakeFileInputHandler() {
    var id = this.getAttribute('data-source');
    $('#' + id).trigger('click');
  }

  function checkFileSize(tabId, name) {
    var fileSizeRes = App.u.checkFileSize(tabId, name);
    if (fileSizeRes.msg) {
      EventMgr.trigger('errMsgValid', {
        self: fileSizeRes.field,
        err: fileSizeRes.msg,
        number: 0
      });
    } else {
      EventMgr.trigger('okMsgValid', {
        self: fileSizeRes.field,
        number: 0,
        notOk: true
      });
    }
  }

  function fileInputChangeHandler() {
    var id = this.id,
        tabId = this.getAttribute('data-tabid'),
        fElemInput = App.Dom.byId('f-' + id),
        value = this.value,
        startIndex = value.indexOf('\\') >= 0 ? value.lastIndexOf('\\') : value.lastIndexOf('/'),
        filename = '',
        stateWrapper = App.Dom.byId('b-input-file__wr-' + tabId);
    if (this.files) {
      var filesList = this.files,
          l = filesList.length;
      for (var i = 0; i < l; i++) {
        if (i !== 0) {
          filename += ', ';
        }
        filename += filesList[i].name;
      }
      App.Dom.addClass(stateWrapper, 'b-input-file__wr_state_selected');
      //check file size
      checkFileSize(tabId, this.getAttribute('name'));
    } else {
      filename = value.substring(startIndex);
      if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) {
        filename = filename.substring(1);
      }
      App.Dom.removeClass(stateWrapper, 'b-input-file__wr_state_selected');
    }
    filename = window.filterXSS(filename);
    fElemInput.innerHTML = filename;
    fElemInput.setAttribute('data-hint', filename);
  }
  //tree resizer
  var treeResizeObj = {};
  //tree resize drag
  function treeResizeControl(e) {
    var id = this.getAttribute('data-id'),
        tabId = this.getAttribute('data-tabid'),
        elem = App.Dom.byId(id),
        moveTrigger = this.getAttribute('data-move-trigger') || false,
        offsetTop = parseInt(this.offsetTop, 10),
        $tip = $('.b-tip_name_textarea_resize');
    //hide tip if it showing
    if ($tip.length) {
      $tip.find('.b-tip__close').trigger('click');
    }
    treeResizeObj.height = parseInt(elem.style.height, 10);
    if (!treeResizeObj.height) {
      treeResizeObj.height = elem.offsetHeight;
    }
    treeResizeObj.elem = elem;
    treeResizeObj.id = id;
    treeResizeObj.tabId = tabId;
    treeResizeObj.moveTrigger = moveTrigger;

    e = e || window.event;
    if (e.touches) {
      treeResizeObj.shiftY = e.touches[0].pageY;
      treeResizeObj.top = e.touches[0].pageY - offsetTop;
      document.ontouchmove = treeResizeMove;
      document.ontouchend = treeResizeDrop;
      document.ontouchcancel = treeResizeDrop;
    } else {
      treeResizeObj.shiftY = e.clientY;
      treeResizeObj.top = e.clientY - offsetTop;
      document.onmousemove = treeResizeMove;
      document.onmouseup = treeResizeDrop;
    }
    document.body.style.cursor = 'n-resize';
  }
  var treeResizerTimeId = 1;
  // tree resize move
  function treeResizeMove(e) {
    var diffY;
    if (e.touches) {
      diffY = e.touches[0].pageY - treeResizeObj.shiftY;
    } else {
      diffY = e.clientY - treeResizeObj.shiftY;
    }
    if (treeResizeObj.elem) {
      treeResizeObj.elem.style.height = treeResizeObj.height + diffY + 'px';
    }
    if (treeResizeObj.moveTrigger) {
      clearTimeout(treeResizerTimeId);
      treeResizerTimeId = setTimeout(function () {
        EventMgr.trigger(treeResizeObj.moveTrigger, {
          id: treeResizeObj.id, tabId: treeResizeObj.tabId });
      }, 100);
    }
    e.preventDefault();
  }
  // tree resize drop
  function treeResizeDrop(e) {
    if (e.touches) {
      document.ontouchmove = null;
      document.ontouchend = null;
      document.ontouchcancel = null;
    } else {
      document.onmousemove = null;
      document.onmouseup = null;
    }
    EventMgr.trigger('updFormHeight', { tabId: treeResizeObj.tabId });
    document.body.style.cursor = '';
    $(treeResizeObj.elem).removeClass('b-textarea_responsive_yes');
    e.preventDefault();
  }
  //dblclick handler
  function treeCollpasedControlWrapper(e) {
    e.preventDefault();
    var $self = $(this);
    $self.prev().trigger('click');
  }

  function treeCollpasedControl() {
    var parent = this.parentNode,
        className = parent.className,
        name,
        params,
        url,
        self,
        tabId,
        root,
        elem,
        img,
        src,
        id;
    self = $(this);
    root = self.parents('.tree-inner');
    tabId = root.attr('data-tabid');
    id = root.attr('id');
    //added class collapsed
    if (className.match(/t-opened/)) {
      className = className.replace(/t-opened/g, '');
      className += ' collapsed';
      //remove collapsed
    } else if (className.match(/collapsed/)) {
      //just open
      if (className.match(/loaded/)) {
        className = className.replace(/collapsed/g, '');
        className += ' t-opened';
        //load children
      } else if (!className.match(/loading/)) {
        name = App.Dom.byId(id + '-value').name;
        params = $('#frm-' + tabId).serializeObject();
        url = pageInfo.url;
        /* jslint camelcase:false */
        params.sv_field = name;
        params.sv_tree = 'yes';
        /* jslint camelcase:true */
        elem = self.siblings('.tree-handler');
        img = self.siblings('.tree-handler').children('.icon').children('img');
        src = img.attr('src');
        img.attr('src', pageInfo.theme + 'img/loader.gif');
        params[name] = elem.attr('data-val');
        //elem.parent().addClass('loading');
        className += ' loading';
        //get text node
        /* jshint camelcase: false */
        params.sv_text = $(elem).find('.tree-label').text();
        EventMgr.trigger('ajaxRequest', {
          url: url,
          param: params,
          trfunc: 'formGetTreeBranch',
          invar: {
            tabId: tabId,
            name: name,
            elem: elem,
            src: src,
            img: img,
            id: 'cont-' + id },
          type: 'get', outtype: 'json', queue: 'noqueue' });
      }
    }
    parent.className = className;
    EventMgr.trigger('updateScroll', { id: 'cont-' + id });
  }

  function treeSelectedControl(e) {
    var $self = $(this),
        id = $self.parents('.tree-inner').attr('id');
    //remove other selection
    $selectedTreeElem(id).removeClass('selected');
    var input = App.Dom.byId(id + '-value');
    input.value = this.getAttribute('data-val');
    $(input).trigger('change');
    this.className += ' selected';
  }

  function $selectedTreeElem(id) {
    return $('#' + id + ' .tree-handler.selected');
  }

  function treeMultiSelectedControl(e) {
    var $self = $(this),
        id = $self.parents('.tree-inner').attr('id'),
        value = '';
    //remove other selection
    var input = App.Dom.byId(id + '-value');
    if (e.ctrlKey || e.metaKey) {
      //unselected
      if ($self.hasClass('selected')) {
        $self.removeClass('selected');
        //add selection
      } else {
        $self.addClass('selected');
      }
      $selectedTreeElem(id).each(function (index) {
        if (index !== 0) {
          value += ',';
        }
        value += this.getAttribute('data-val');
      });
    } else {
      $selectedTreeElem(id).removeClass('selected');
      value = this.getAttribute('data-val');
      this.className += ' selected';
    }
    input.value = value;
    $(input).trigger('change');
  }

  function scrollToSelectedBranch() {
    setTimeout(function () {
      $('.tree-wrapper .selected').each(function () {
        var id = $(this).parents('.tree-wrapper').attr('id');
        EventMgr.trigger('scrollTo', { id: id, offsetTop: this.offsetTop });
      });
    }, 100);
  }

  function resetHandler() {
    var tabId = this.getAttribute('data-tabid'),
        form = App.Dom.byId('frm-' + tabId);
    form.reset();
  }

  function changeNovalueFieldHandler() {
    if (this.getAttribute('data-novalue')) {
      this.setAttribute('data-novalue', 'no');
      if (this.placeholder) {
        this.placeholder = '';
      }
    }
  }
  //submit form by ENTER keyup under text and password fields
  function submitFormByEnter(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode,
        tabId;
    if (codeKey === ENTERKEY) {
      //sometime form submit native...
      e.preventDefault();
      var $self = $(this);
      tabId = this.getAttribute('data-tabid');
      $self.trigger('change');
      $self.trigger('blur');
      clickButtonTrigger(tabId);
    }
  }
  //submit form by ENTER + CTRL under textarea, select, radio, checkbox
  function submitFormByCtrlEnter(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode,
        tabId;
    if (codeKey === ENTERKEY && (e.ctrlKey || e.metaKey)) {
      e.preventDefault();
      $(this).trigger('blur');
      tabId = this.getAttribute('data-tabid');
      clickButtonTrigger(tabId);
    }
  }
  /**
   * Ищем кнопку типа ok для отправки формы, сперва ищем дефлотную(default="yes"), затем (type=ok), (type=next), кнопку фильтра()
   */
  function clickButtonTrigger(tabId) {
    // ищем кнопку default, кнопку ok, потом первую попавшусю
    var $defaultButton = $('#cont-' + tabId + ' .i-button_default_yes');
    var $okButton = $('#cont-' + tabId + ' .b-button_act_ok');
    var $nextButton = $('#cont-' + tabId + ' .b-button_act_next');
    var $filterButton = $('#frm-' + tabId + ' .b-button__filter-set');

    setTimeout(function () {
      var $button;
      if ($defaultButton[0]) {
        $button = $defaultButton;
      } else if ($okButton[0]) {
        $button = $okButton;
      } else if ($nextButton[0]) {
        $button = $nextButton;
      } else if ($filterButton) {
        $button = $filterButton;
      }
      $button.first().trigger('click');
    }, 1);
  }

  function loadPassList() {
    var url,
        data = getLocalStorage('mgr5-passwdlist'),
        version = getLocalStorage('mgr5-passwd-ver'),
        newVersion = false;

    if (pageInfo.version !== version) {
      setLocalStorage('mgr5-passwd-ver', pageInfo.version);
      newVersion = true;
    }

    if (data && data !== '' && !newVersion) {
      passwdlist = data;
    } else {
      url = '/manimg/common/passwd.list';
      EventMgr.trigger('ajaxRequest', {
        url: url, param: {}, trfunc: 'gotPasswdList',
        outtype: 'html', type: 'get' });
    }
  }

  function getLocalStorage(itemId) {
    if (typeof localStorage !== 'undefined') {
      return localStorage.getItem(itemId);
    } else {
      return false;
    }
  }

  function setLocalStorage(itemId, data) {
    if (typeof localStorage !== 'undefined') {
      localStorage.setItem(itemId, data);
    } else {
      return false;
    }
  }

  var passwdlist = '';

  function gotPasswdListHandler(e, data) {
    passwdlist = '\n' + data + '\n';
    setLocalStorage('mgr5-passwdlist', passwdlist);
  }

  //The following function returns the logarithm of y with base x (ie. logx y):
  function getBaseLog(x, y) {
    return Math.log(y) / Math.log(x);
  }

  var passType = { 0: 'short', 1: 'weak', 2: 'good', 3: 'strong' };

  function checkConfirmField(e) {
    var self, tabId;
    if (this.getAttribute('data-check-field')) {
      tabId = this.getAttribute('data-tabid');
      self = App.Dom.byId(this.getAttribute('data-check-field') + '-' + tabId);
    } else {
      self = this;
    }
    var confirmId = self.getAttribute('data-confirm-field'),
        parentId = self.getAttribute('data-parent'),
        confirmField = App.Dom.byId(confirmId),
        messageElem = App.Dom.byId('check-confirm-' + parentId),
        isChanged = false,
        showConfirmMsg = false;
    if (App.Dom.hasClass(messageElem, 'b-form-confirm-message_show_true')) {
      showConfirmMsg = true;
    }
    if (!!confirmField && self.value !== confirmField.value) {
      if (!showConfirmMsg) {
        App.Dom.addClass(messageElem, 'b-form-confirm-message_show_true');
        isChanged = true;
      }
    } else {
      if (showConfirmMsg) {
        App.Dom.removeClass(messageElem, 'b-form-confirm-message_show_true');
        isChanged = true;
      }
    }
    if (isChanged) {
      EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
    }
  }

  function checkPass() {
    var strength,
        value = App.u.escapeRegExp($.trim(this.value)),
        name = this.getAttribute('data-parent'),
        regexp = new RegExp('\n' + value + '\n', 'i'),
        tabId = this.getAttribute('data-tabid'),
        id = 'checkpass-indicator-wrapper-' + name,
        wr = App.Dom.byId(id),
        isChanged = false;
    if (wr) {
      if (this.value !== '') {
        if (passwdlist.match(regexp)) {
          strength = 0;
        } else {
          strength = checkPassStrength(this.value);
        }
        if (wr.className !== passType[strength] + ' showed') {
          wr.className = passType[strength] + ' showed';
          isChanged = true;
        }
      } else {
        if (wr.className !== '') {
          wr.className = '';
          isChanged = true;
        }
      }
    }
    if (isChanged) {
      EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
    }
  }

  function checkPassStrength(value) {
    var len = value.length,
        str = value.split(''),
        uniq = 0,
        special = 0,
        repeatTypes = 0,
        varCase = 0,
        symbArr = {},
        strType = [],
        ind,
        i,
        lvl = 0;

    for (i = 0; i < len; i++) {
      //count uniq symbols
      if (!symbArr[str[i]]) {
        uniq++;
      }
      symbArr[str[i]] = true;
      //count special symbols
      if (str[i].match(/[!@#$%^&*?_~{}"'()|\\+\[\]]\s/)) {
        special++;
        strType.push('sn');
        //count lowcase
      } else if (str[i].match(/[a-z]/)) {
        strType.push('ll');
        //count uppercase
      } else if (str[i].match(/[A-Z]/)) {
        strType.push('lu');
        //count number
      } else if (str[i].match(/\d/)) {
        strType.push('dn');
        //any cyrillic symbol = 2 special
      } else {
        special++;
        special++;
        strType.push('sn');
      }
      if (i !== 0) {
        //check for repeat types symbol
        if (strType[i].substr(0, 1) === strType[i - 1].substr(0, 1)) {
          repeatTypes++;
        }
        //check for diffirent case
        if (strType[i].substr(1, 1) !== strType[i - 1].substr(1, 1)) {
          varCase++;
        }
      }
    }

    ind = (len + Math.sqrt(0.5 * special + varCase) - Math.sqrt(repeatTypes)) * getBaseLog(len, uniq);
    if (ind < 3) {
      lvl = 0;
      //weak
    } else if (ind >= 3 && ind < 6) {
      lvl = 1;
      //good
    } else if (ind >= 6 && ind < 9) {
      lvl = 2;
      //hard
    } else if (ind >= 9) {
      lvl = 3;
    } else {
      lvl = 0;
    }
    return lvl;
  }
  //handler for level up link
  function levelUp(e) {
    e.preventDefault();
    var exp = this.getAttribute('data-level'),
        tabId = getActiveTabId(),
        form = $('#frm-' + tabId),
        param = form.serializeObject(),
        $mixedContols = form.find('.i-control-mixed');
    param.userexperience = exp;

    if ($mixedContols.length !== 0) {
      param = App.u.removeParam($mixedContols, param);
    }
    if (param.snext) {
      delete param.snext;
    }
    if (param.sback) {
      delete param.sback;
    }
    EventMgr.trigger('reloadTab', { tabId: tabId, param: param });
  }

  function nestedReportHandler(e) {
    e.preventDefault();
    var elid = this.getAttribute('data-elid'),
        $self = $(this),
        index = $self.parents('td').index(),
        th = $self.parents('table').find('th')[index],
        colname = th.getAttribute('data-colname'),
        nested = th.getAttribute('data-nestedreport'),
        parent = getActiveTabId(),
        plid = App.Dom.byId(parent + '-plid'),
        form = $('#frm-' + parent),
        param = form.serializeObject();
    elid = elid || $self.find('.b-list__table-col-content').first().html();
    param.func = nested;
    param.elid = elid;
    param.colname = colname;
    if (plid !== null) {
      param.plid = plid.value;
    }
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { parent: parent },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      queue: 'nested-' + parent,
      failfunc: 'failCommonAjaxResponse' });
    EventMgr.trigger('tabLoading', { tabId: parent });
  }

  var isIE = '\v' === 'v';

  function scrollToFormRow($focusedField, tabId, animate) {
    setTimeout(function () {
      var formRow = $focusedField.closest('.l-form__row'),
          offsetTop = formRow[0] ? formRow[0].offsetTop : 0,
          $page = $focusedField.closest('.b-form-page'),
          formScrollEl = App.Dom.byId('form-scroll-' + tabId),
          heightViewPort = formScrollEl ? parseInt(formScrollEl.style.height, 10) : 0;
      if ($page[0]) {
        offsetTop += $page[0].offsetTop;
      }

      EventMgr.trigger('scrollTo', {
        id: 'form-scroll-' + tabId,
        offsetTop: offsetTop,
        animate: animate });
    }, 100);
  }

  function focusOnErrorField(e, data) {
    var $focusField = $('.row-error .b-input, .row-error .b-textarea, .row-error .b-checkbox__control'),
        tabId = data.tabId,
        $page;
    if ($focusField.length > 0) {
      $page = $focusField.closest('.b-form-page');
      if ($page.hasClass('b-form-page_st_collapsed')) {
        $page.find('.i-form-page__title').trigger('click');
      }

      $focusField.focus();
      scrollToFormRow($focusField, tabId, true);
    }
  }

  function setFocus(e, data) {
    if (isIE || window.pageInfo.mobile) {
      return;
    }
    var tabId = data.tabId,
        form = document.getElementById('frm-' + tabId);
    if (form === null) {
      return;
    }
    var len = form.length,
        elem = null,
        curElem,
        name,
        r1,
        readonly,
        forceFocused = $('#form-wrapper-' + tabId + ' .b-form__focus-field');
    //force focused field by attr focus="yes"
    if (forceFocused.length > 0) {
      forceFocused.focus();
      scrollToFormRow(forceFocused, tabId, false);
      return;
    }
    //find out accessable field
    for (var i = 0; i < len; i++) {
      elem = form[i];
      //for select
      if (elem.type === 'hidden' && elem.getAttribute('data-type') === 'select') {
        curElem = $(elem).parent();
        if (!curElem.hasClass('readonly') && curElem.width() !== 0) {
          name = elem.getAttribute('name');
          $('#_' + name + '-' + tabId + ' .b-myselect__select-value').focus();
          window.scrollToTopLeft();
          return;
        }
        //for radio
      } else if (elem.type === 'hidden' && elem.getAttribute('data-type') === 'radio') {
        curElem = $(elem).parent();
        if (!curElem.hasClass('readonly') && curElem.width() !== 0) {
          name = elem.getAttribute('name');
          $('.tab-content_st_active div[data-id="' + name + '"][tabindex="0"]').focus();
          window.scrollToTopLeft();
          return;
        }
      } else if (elem.type === 'hidden' && elem.getAttribute('data-type') === 'checkbox') {
        name = elem.getAttribute('name');
        $('#' + tabId + '-' + name).focus();
        window.scrollToTopLeft();
        return;
      }
      r1 = elem.getAttribute('readonly');
      readonly = r1 !== null;
      if (elem.type !== 'hidden' && !readonly && elem.offsetWidth !== 0) {
        elem.focus();
        window.scrollToTopLeft();
        return;
      }
    }
    form = null;
    elem = null;
  }

  function AttrIsSupported(element, attr) {
    var elem = document.createElement(element);
    return attr in elem;
  }
  /**
   * forceSetValues
   * @param {object} e event object
   * @param {object} data object with data
   */
  function forceSetValues(e, data) {
    var tabId = data.tabId,
        url = pageInfo.url,
        name = data.name,
        params = $('#frm-' + tabId).serializeObject();
    /* jslint camelcase:false */
    params.sv_field = name;
    /* jslint camelcase:true */
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: params,
      trfunc: 'formSetValues',
      invar: { tabId: tabId },
      type: 'get',
      outtype: 'json',
      queue: 'multiload' });
  }

  /**
   * Callback setvalues field changed
   * send request for new values
   * @param {object} e  event object
   * @param {boolean} sv  setvalues once flag
   * @return {boolean}
   * @this {object} HTML node
   */
  var lastTargetElemId = 'default_value';
  function setValueHandler(e, sv, srcId) {
    var self = this;
    setTimeout(function () {
      EventMgr.trigger('preSetValues', [self, 100]);
      //check for loop
      var elemId = self.getAttribute('id'),
          $self = $(self),
          flags = $self.getFlags();
      if ($self.hasClass('b-textarea_for_zoom')) {
        return true;
      }
      if (lastTargetElemId === srcId) {
        return true;
      }
      lastTargetElemId = elemId;
      //check for setvalues once
      if (sv) {
        return true;
      }
      //var tabId = $activeTab().attr('data-tabid'),
      var tabId = self.getAttribute('data-tabid'),
          $form = $('#frm-' + tabId),
          params = $form.serializeObject(),
          addParams = {},
          url = pageInfo.url,
          once = App.Dom.hasClass(self.parentNode, 'sv_nochange'),
          blocking = App.Dom.hasClass(self.parentNode, 'sv_blocking') || flags.blocking,
          name = self.getAttribute('data-name') ? self.getAttribute('data-name') : self.name,
          id = self.getAttribute('data-id'),
          isShowcaseForm = $form.hasClass('b-form_showcase_yes'),
          hasFile = $form.hasClass('withfiles'),
          skipFile = App.Dom.hasClass(self.parentNode, 'sv_skipfiles'),
          $noSetValues = $form.find('.i-nosetvalues');

      if ($noSetValues.length !== 0) {
        params = App.u.removeParam($noSetValues, params);
      }

      //check for button id
      if (id && id !== 'undefined') {
        id = id.split('=', 2);
        if (id[1]) {
          params[id[0]] = id[1];
          addParams[id[0]] = id[1];
        }
      }

      /* jshint camelcase: false */
      params.sv_field = name;
      var options = {
        url: url,
        param: params,
        failfunc: 'failFormAjaxResponse',
        trfunc: 'formSetValues',
        invar: { tabId: tabId, once: once, blocking: blocking },
        type: 'post',
        outtype: 'json',
        queue: 'multiload' };
      //if form has input@type=file
      if (hasFile && !skipFile) {
        /* jshint camelcase: false */
        options.invar.blocking = true;
        addParams.sv_field = name;
        addParams.sfrom = 'ajax';
        EventMgr.trigger('setBrandSettings', {
          options: options,
          tabId: tabId,
          param: params,
          addParams: addParams
        });
      } else {
        /* jslint camelcase:true */
        EventMgr.trigger('ajaxRequest', options);
        if (blocking) {
          EventMgr.trigger('tabLoading', { tabId: tabId });
        }
      }
    }, 0);
  }
  /**
   * Проверяем на изменение значения мультиселекта
   */
  function isMultiSelectValuesChanged(stringVal, arrVal) {
    //check for empty value - only slist rerender
    if (arrVal === '') {
      return true;
    }
    if (typeof stringVal === 'string') {
      if (typeof arrVal === 'string') {
        arrVal = arrVal.split(',');
      } else if (typeof arrVal.join !== 'function') {
        return false;
      }
      var oldValues = stringVal.split(','),
          l = oldValues.length;
      oldValues.sort();
      arrVal.sort();
      if (oldValues.length !== arrVal.length) {
        return true;
      }
      while (l--) {
        if (oldValues[l] !== arrVal[l]) {
          return true;
        }
      }
      return false;
    }
    return false;
  }

  /**
   * Setvalues handler
   * change values in fields from response
   * @param {object} e event object
   * @param {object} data object with data
   **/
  function formSetValues(e, data) {
    //check for auth
    if (data.ok && data.reload) {
      window.location.reload();
    }
    var tabId = data.tabId,
        form = App.Dom.byId('frm-' + tabId),
        once = data.once,
        blocking = data.blocking,
        readonlyArray = [];
    if (blocking) {
      EventMgr.trigger('tabLoadingHide', { tabId: tabId });
    }
    if (form === null || data.error) {
      return;
    }
    var setvalues = data.setvalues,
        elem = '',
        keyVar,
        tagName,
        value,
        changed,
        dType,
        type,
        liAct,
        elemId;
    if ((typeof setvalues === 'undefined' ? 'undefined' : _typeof(setvalues)) === 'object') {
      /* jslint forin:true */
      for (keyVar in setvalues) {
        elem = form.elements[keyVar];
        //check for bad words
        if (keyVar === 'item' || keyVar === 'length') {
          continue;
        }
        if (elem) {
          tagName = elem.tagName;
          value = setvalues[keyVar];
          changed = true;
          if (value === null) {
            continue;
          }
          if (tagName === 'INPUT') {
            type = elem.getAttribute('type');
            if (elem.value !== value) {
              //input@type=text
              if (type === 'text' || type === 'password') {
                changed = elem.value !== value.value;
                elem.value = value.value;
                if (value.prefix) {
                  var $prefixNode = $(elem).parent().find('.i-input__prefix');
                  if ($prefixNode.length) {
                    $prefixNode.html(value.prefix);
                    EventMgr.trigger('upPrefixField', { tabId: tabId });
                  }
                }
                //slider logic
                if (value.min !== undefined || value.max !== undefined || value.step !== undefined) {
                  var id = elem.id,
                      $sliderNode = $('#' + id + '-slider');
                  if (value.min !== undefined) {
                    $sliderNode.attr('data-min', value.min);
                  }
                  if (value.max !== undefined) {
                    $sliderNode.attr('data-max', value.max);
                  }
                  if (value.step !== undefined) {
                    $sliderNode.attr('data-step', value.step);
                  }
                  EventMgr.trigger('reloadSlider', { tabId: tabId });
                }
                //mask logic
                if (value.mask !== undefined) {
                  EventMgr.trigger('inputMaskChangeBySetvalues', { elem: elem, mask: value.mask, value: value.value });
                }
              } else if (type === 'file') {
                //reset file value
                if (value.value === '') {
                  var $elem = $(elem);
                  $elem.replaceWith($elem.val('').clone(true));
                  $(form.elements[keyVar]).trigger('change');
                }
              } else if (type === 'hidden') {
                // #17927 setvalues[keyVar].slist
                changed = elem.value !== value.value || setvalues[keyVar].slist;
                if (changed) {
                  elemId = elem.getAttribute('id');
                  dType = elem.getAttribute('data-type');
                  //select
                  if (dType === 'select') {
                    //replace slist values
                    if (value.slist) {
                      $('ul#' + tabId + '-' + elem.name).html(renderSlistElem(setvalues[keyVar].slist));
                      //clean slist cache for searching
                      EventMgr.trigger('cleanSlistCache', {
                        tabId: tabId,
                        id: tabId + '-' + elem.name });
                      //check for search in list
                      if (setvalues[keyVar].slist && setvalues[keyVar].slist.length > 10) {
                        var $mySelect = $('#_' + elem.name + '-' + tabId);
                        if (!$mySelect.hasClass('sb-select')) {
                          $mySelect.addClass('sb-select');
                        }
                      }
                      EventMgr.trigger('forceDepend', { tabId: tabId });
                      if (setvalues[keyVar].slist && setvalues[keyVar].slist.length !== 0) {
                        //set active item
                        if (setvalues[keyVar].value !== '') {
                          liAct = $('#' + tabId + '-' + keyVar + ' li[data-val="' + setvalues[keyVar].value + '"]');
                        } else {
                          liAct = $('#' + tabId + '-' + keyVar + ' li[data-val="' + elem.value + '"]');
                          if (liAct.length === 0) {
                            liAct = $('ul#' + tabId + '-' + elem.name + ' li:first');
                          }
                        }
                      } else {
                        //set null msg
                        $('#_' + keyVar + '-' + tabId + ' .b-myselect__select-value').html(setvalues.nullmsg);
                      }
                    } else {
                      // case without slist
                      //set active item
                      liAct = $('#' + tabId + '-' + keyVar + ' li[data-val="' + value.value + '"]');
                    }
                    //set value for select
                    if (liAct.length > 0) {
                      var $selectElem = $('#_' + keyVar + '-' + tabId),
                          isReadonly = $selectElem.hasClass('readonly');
                      //check for readonly
                      if (isReadonly) {
                        $selectElem.removeClass('readonly');
                      }
                      liAct.trigger('click', [once, elemId]);
                      if (isReadonly) {
                        $selectElem.addClass('readonly');
                      }
                    }
                    //radio
                  } else if (dType === 'radio') {
                    if (value.slist && App.Tabs.tabs[tabId] && App.Tabs.tabs[tabId].formSource && App.Tabs.tabs[tabId].formSource[keyVar]) {
                      var sourceElem = App.Tabs.tabs[tabId].formSource[keyVar],
                          radioHtml = '';
                      sourceElem.slist = value.slist;
                      if (value.value) {
                        sourceElem.value = value.value;
                        //set first value
                      } else if (sourceElem.slist[0]) {
                        sourceElem.value = sourceElem.slist[0].key;
                      }
                      radioHtml = templates.formItemRadio(sourceElem);
                      $('#' + tabId + '-' + keyVar + '-radio').replaceWith(radioHtml);
                    }
                    if (!value.slist) {
                      $('#' + 'frm-' + tabId + ' .' + keyVar + '-' + tabId + '-' + window.hash(value.value)).trigger('click', [once, elemId]);
                    }
                    // checkbox
                  } else if (dType === 'checkbox') {
                    $('#' + tabId + '-' + keyVar).trigger('click', [[once, true]]);
                    // multiselect
                  } else if (dType === 'multiple') {
                    // replace value.value with value
                    var mvalue = value.value !== undefined ? value.value : value;
                    changed = isMultiSelectValuesChanged(elem.value, mvalue);
                    // вызываем при изменение значений или наличие slist
                    if (changed || value.slist) {
                      var id = elem.getAttribute('data-id');
                      EventMgr.trigger('selectValues', {
                        id: id, sElems: setvalues[keyVar] });
                    }
                    // input@type=hidden
                  } else if (dType === 'tree') {
                    $('#' + keyVar + '-' + tabId + ' li[data-val="' + setvalues[keyVar].value + '"]').trigger('click', [once, true]);
                  } else {
                    elem.value = value.value;
                  }
                }
              }
              if (changed) {
                elemId = elem.getAttribute('id');
                $(elem).trigger('change', [once, elemId]);
              }
            }
          } else {
            changed = elem.value !== value.value;
            elem.value = value.value;
            if (changed) {
              elemId = elem.getAttribute('id');
              $(elem).trigger('change', [once, elemId]);
              if (elem.classList && elem.classList.contains('b-text-editor')) {
                EventMgr.trigger('TinyMCE_setContent', { content: elem.value, id: elemId });
              }
            }
          }
          //set readonly
          if (value.readonly) {
            var readonly = value.readonly === 'yes';
            //changeReadOnly($(elem).closest('.l-form__row'), readonly);
            //add to array and set after all
            readonlyArray.push({ elem: elem, readonly: readonly });
          }
        } else {
          //textdata
          elem = App.Dom.byId(tabId + '-' + keyVar);
          if (elem) {
            type = elem.getAttribute('data-type');
            if (type === 'img') {
              elem.src = setvalues[keyVar].value;
              //ticket
            } else if (type === 'ticket') {
              var newTicketHtml = templates.formItemTicketMsg(setvalues[keyVar]);
              if (newTicketHtml) {
                $(newTicketHtml).appendTo(elem);
              }
              //              EventMgr.trigger('setFocus', { tabId: tabId });
              //list
            } else if (type === 'list') {
              setvalues[keyVar].id = tabId;
              setvalues[keyVar].type = 'form';
              if (setvalues[keyVar].view === 'blocklist') {
                elem.innerHTML = templates.formListBlocksContent(setvalues[keyVar]);
              } else {
                elem.innerHTML = templates.formListContent(setvalues[keyVar]);
              }
            } else if (type === 'listfilter') {
              setvalues[keyVar].id = tabId;
              elem.innerHTML = templates.formListFilter(setvalues[keyVar]);
              //buttons
            } else if (type === 'buttons') {
              var buttons = setvalues[keyVar],
                  l = setvalues[keyVar].length;
              for (var i = 0; i < l; i++) {
                //check for same buttons
                if (data.__formModel && data.__formModel.__buttons[i] && buttons[i].name !== data.__formModel.__buttons[i].name) {
                  var parent = $('#' + tabId + '-buttons .b-button').first().attr('data-parent');
                  elem.innerHTML = templates.buttons({
                    buttons: buttons,
                    id: tabId,
                    parent: parent,
                    type: 'form',
                    cancelBtnClass: ''
                  });
                  //update form model
                  EventMgr.trigger('updateModel', {
                    tabId: tabId,
                    name: '__buttons',
                    value: buttons
                  });
                  break;
                }
              }
              if (l === 0) {
                elem.innerHTML = '';
                //update form model
                EventMgr.trigger('updateModel', {
                  tabId: tabId,
                  name: '__buttons',
                  value: buttons
                });
              }
            } else if (type === 'link') {
              //unescape &amp; -> &
              var hrefLink = String(setvalues[keyVar].value).replace(/&amp;/g, '&');
              elem.href = hrefLink;
              elem.setAttribute('data-url', App.u.escapeQuote(hrefLink));
            } else if (type === 'datetime') {
              var d = App.u.parseDate(setvalues[keyVar].value),
                  dt = new Date().getTime() - d.getTime();
              elem.setAttribute('data-difftime', dt);
            } else if (type === 'textdata') {
              elem = App.Dom.byId(tabId + '-' + keyVar + '-inner');
              elem.innerHTML = window.htmlDecode(setvalues[keyVar].value);
              // EventMgr.trigger('updateScroll', { id: tabId + '-' + keyVar });
            } else {
              elem.innerHTML = window.htmlDecode(setvalues[keyVar].value);
            }
            EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
          } else {
            //for frame
            elem = App.Dom.byId(keyVar + '-' + tabId);
            if (elem && elem.getAttribute('data-type') === 'frame') {
              elem.setAttribute('src', setvalues[keyVar].value);
            }
          }
        }
      }
    }
    //set readonly
    for (var i = 0, l = readonlyArray.length; i < l; i++) {
      App.FormUtils.changeReadOnly($(readonlyArray[i].elem).closest('.l-form__row'), readonlyArray[i].readonly);
    }
    EventMgr.trigger('setValuesDone', { tabId: tabId });
  }

  function renderSlistElem(elems) {
    var elemHTML = templates.formItemSelectList({ slist: elems, value: '' });
    return elemHTML;
  }
  //remove space and insert line break when press SPACE in zoom field
  function addLineBreakToZoomField(e) {
    var codeKey = e.which || e.keyCode;
    if (codeKey === SPACE) {
      e.preventDefault();
      var allText = this.value,
          currentPos = getCaret(this),
          beforeText = allText.substr(0, currentPos),
          afterText = allText.substr(currentPos);

      this.value = beforeText.replace(/((\s*\S+)*)\s*/, '$1') + '\n' + afterText.replace(/((\s*\S+)*)\s*/, '$1');
      setCaretPosition(this, beforeText.length);
    }
  }
  //from
  // http://stackoverflow.com/questions/11779140/how-to-push-cursor-to-the-next-line-when-user-hits-ctrl-enter
  function getCaret(el) {
    if (el.selectionStart) {
      return el.selectionStart;
    } else if (document.selection) {
      el.focus();

      var r = document.selection.createRange();
      if (r === null) {
        return 0;
      }

      var re = el.createTextRange(),
          rc = re.duplicate();
      re.moveToBookmark(r.getBookmark());
      rc.setEndPoint('EndToStart', re);

      return rc.text.length;
    }
    return 0;
  }

  function setCaretPosition(elem, caretPos) {
    if (elem !== null) {
      if (elem.createTextRange) {
        var range = elem.createTextRange();
        range.move('character', caretPos);
        range.select();
      } else {
        if (elem.selectionStart) {
          elem.focus();
          elem.setSelectionRange(caretPos, caretPos);
        } else {
          elem.focus();
        }
      }
    }
  }

  //sync value zoom textarea and input
  function syncZoomValue(e) {
    var self = $(this),
        controlField = self.attr('data-control-field'),
        tabId = $activeTab().attr('data-tabid'),
        input = $('#cont-' + tabId + ' input[name="' + controlField + '"],' + ' #editinlist-wrapper-' + tabId + ' input[name="' + controlField + '"]'),
        value = self.val().replace(/\n+/g, ' ').replace(/(^\s*|\s*$)/g, '').replace(/\s+/g, ' ');
    input.val(value).trigger('change');
  }

  function syncInputWithZoom(e, data) {
    var tabId = data.tabId,
        input = data.self,
        controlField,
        textarea,
        value;
    if (input && App.Dom.hasClass(input, 'testzoom')) {
      controlField = input.name;
      textarea = $('#cont-' + tabId + ' .b-textarea[name="zoom-' + controlField + '"],' + ' #editinlist-wrapper-' + tabId + ' .b-textarea[name="zoom-' + controlField + '"]');
      value = input.value.replace(/(^\s*|\s*$)/g, '').replace(/\s+/g, '\n');
      if (textarea.length > 0) {
        textarea[0].value = value;
      }
    }
  }
  //calendar handler
  function calendarHandler(e) {
    var self = $(this),
        calendarFieldName = self.attr('data-control-field'),
        type = self.attr('data-type'),
        activeTab = $activeTab().attr('data-tabid'),
        calendarField = App.Dom.byId(calendarFieldName + '-' + activeTab),
        syncFieldName,
        syncField;
    if (calendarField) {
      syncFieldName = calendarField.getAttribute('data-syncfield');
      if (syncFieldName) {
        syncField = App.Dom.byId(syncFieldName + '-' + activeTab);
      }
    }
    //not good
    if (calendarField !== null) {
      if (type === 'month') {
        App.Calendar.showMonth(calendarField, syncField, e);
      } else {
        App.Calendar.show(calendarField, syncField, e);
      }
    }
  }
  //zoom handler
  function zoomHandler() {
    var self = $(this),
        controlField = self.attr('data-control-field'),
        row = self.parents('.l-form__row'),
        tabId = $activeTab().attr('data-tabid'),
        input = $('#cont-' + tabId + ' input[name="' + controlField + '"],' + ' #editinlist-wrapper-' + tabId + ' input[name="' + controlField + '"]'),
        textarea = $('#cont-' + tabId + ' .b-textarea[name="zoom-' + controlField + '"],' + ' #editinlist-wrapper-' + tabId + ' .b-textarea[name="zoom-' + controlField + '"]'),
        value;
    if (row.hasClass('zoom')) {
      //state = 'zoom';
      row.removeClass('zoom');
      value = textarea[0].value.replace(/\n+/g, ' ').replace(/(^\s*|\s*$)/g, '').replace(/\s+/g, ' ');
      input.val(value);
    } else {
      // state = 'unzoom';
      row.addClass('zoom');
      value = input.val().replace(/(^\s*|\s*$)/g, '').replace(/\s+/g, '\n');
      textarea[0].value = value;
    }
    EventMgr.trigger('updFormHeight', { tabId: tabId });
    EventMgr.trigger('updateFixedField', { tabId: tabId });
  }
  //toggle password field type text/password
  function showPassword() {
    var pwdFieldName = this.getAttribute('data-control-field'),
        tabId = this.getAttribute('data-tabid'),
        pwdField = App.Dom.byId(pwdFieldName + '-' + tabId);
    if (pwdField) {
      var type = pwdField.getAttribute('type');
      if (type === 'text') {
        pwdField.setAttribute('type', 'password');
        $(this).removeClass('b-input-btn_pwd_liketext');
      } else if (type === 'password') {
        pwdField.setAttribute('type', 'text');
        $(this).addClass('b-input-btn_pwd_liketext');
      }
    }
  }

  function fakePasswdCopy() {
    var parentId = this.getAttribute('data-parent'),
        parent = App.Dom.byId(parentId);
    if (parent !== null) {
      parent.value = this.value;
      $(parent).trigger('change');
    }
  }
  //password generation
  function genPassword() {
    var pwdFieldName = this.getAttribute('data-control-field'),
        pwdField = $('.tab-content_st_active input[name="' + pwdFieldName + '"]'),
        current = pwdField.val(),
        confFieldName = pwdField.attr('data-check-field'),
        pwdLen = pageInfo.pwgenlen || 8,
        pwdChar = pageInfo.pwgencharacters || '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
        confField = $('.tab-content_st_active' + ' input[name="' + confFieldName + '"][type="password"]'),
        n = 0,
        rn,
        nnn = 0,
        tabId = $activeTab().attr('data-tabid'),
        pwdFake,
        confirmFake;
    if (pwdField.attr('readonly')) {
      return;
    }
    if (pwdFieldName) {
      $('.b-input-btn_type_showpwd[data-control-field="' + pwdFieldName + '"]').remove();
    }
    pwdFake = App.Dom.byId(pwdFieldName + '-' + tabId + '-fake');
    confirmFake = App.Dom.byId(confFieldName + '-' + tabId + '-fake');

    if (pwdFake && pwdFake.offsetWidth === 0) {
      pwdFake.style.display = 'block';
      if (confirmFake) {
        confirmFake.style.display = 'block';
      }
      pwdField.hide();
      if (confField) {
        confField.hide();
      }
    }
    var lowerCase = pwdChar.match(/[a-z]/g),
        upperCase = pwdChar.match(/[A-Z]/g),
        number = pwdChar.match(/\d/g),
        special = pwdChar.match(/[!,@,#,$,%,^,&,*,?,_,~]/g),
        pwgenchar = {},
        typesPull = [],
        i,
        nn = 0,
        letters = 0;
    if (lowerCase || upperCase) {
      nn++;
      typesPull.push('l');
    }
    if (lowerCase) {
      lowerCase = lowerCase.join('');
      if (!upperCase) {
        pwgenchar.l = lowerCase;
      } else {
        pwgenchar.lc = lowerCase;
      }
      letters++;
    }
    if (upperCase) {
      upperCase = upperCase.join('');
      if (!lowerCase) {
        pwgenchar.l = upperCase;
      } else {
        pwgenchar.uc = upperCase;
      }

      letters++;
    }
    if (number) {
      number = number.join('');
      pwgenchar.d = number;
      typesPull.push('d');
      nn++;
    }
    if (special) {
      special = special.join('');
      pwgenchar.s = special;
      typesPull.push('s');
      nn++;
    }
    for (i = 0; i < pwdLen - nn; i++) {
      if (nnn === nn) {
        nnn = 0;
      }
      typesPull.push(typesPull[nnn]);
      nnn++;
    }
    rn = Math.floor(Math.random() * pwdLen + 1) % nn;
    typesPull = shiftArray(typesPull, rn);
    var elemObj = {
      passwdField: pwdField,
      confirmField: confField,
      passwdFake: pwdFake,
      confirmFake: confirmFake,
      pwdLen: pwdLen,
      //pwdChar : pwdChar,
      typesPull: typesPull,
      pwgenchar: pwgenchar,
      letters: letters
    };
    genPasswd(current, n, elemObj, 'lc');
  }

  //last to one
  function shiftArray(arr, n) {
    var elem,
        len = arr.length - 1;
    while (n--) {
      elem = arr[0];
      arr.splice(0, 1);
      arr[len] = elem;
    }
    return arr;
  }

  function genPasswd(current, n, elemObj, prevCase) {
    current = current.substr(0, n);
    var pwd = '',
        curCase = prevCase,
        curType,
        typesPull = elemObj.typesPull,
        pwgenchar = elemObj.pwgenchar,
        letters = elemObj.letters;

    for (var i = n; i < elemObj.pwdLen; i++) {
      curType = typesPull[i];
      if (curType === 'l' && letters === 2) {

        if (curCase === 'lc') {
          curCase = 'uc';
        } else {
          curCase = 'lc';
        }
        curType = curCase;
        if (i === n) {
          prevCase = curCase;
        }
      }
      pwd += pwgenchar[curType].substr(Math.floor(Math.random() * pwgenchar[curType].length), 1);
    }
    n++;
    current += pwd;
    elemObj.passwdField.val(current);
    elemObj.confirmField.val(current);
    elemObj.passwdFake.value = current;
    if (elemObj.confirmFake) {
      setTimeout(function () {
        elemObj.confirmFake.value = current;
      }, 1);
    }
    if (n < elemObj.pwdLen) {
      setTimeout(function () {
        genPasswd(current, n, elemObj, prevCase);
      }, 35);
    } else {
      $(elemObj.passwdField).trigger('change');
      $(elemObj.passwdFake).trigger('change');
      $(elemObj.confirmField).trigger('change');
    }
  }

  function getActiveTabId() {
    return $('.tab-content_st_active').attr('data-tabid') || false;
  }

  var UPKEY = 38,
      DOWNKEY = 40,
      LEFTKEY = 37,
      RIGHTKEY = 39,
      ENTERKEY = 13,
      TABKEY = 9,
      ESCKEY = 27,
      SPACE = 32;
  //trigger click if ENTER||SPACE KEYDOWN by element
  function formBtnKeyDownHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode;
    if (codeKey === ENTERKEY || codeKey === SPACE) {
      e.preventDefault();
      $(this).trigger('click');
    }
  }

  function radioBtnKeyDownHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode,
        name,
        id,
        tabId,
        radios;
    if (codeKey === UPKEY && !e.ctrlKey) {
      e.preventDefault();
      name = this.getAttribute('data-id');
      id = this.getAttribute('data-handler-val');
      radios = $(this).closest('.b-radio').find('div[data-id="' + name + '"]');
      var prev = null;
      radios.each(function () {
        var curId = this.getAttribute('data-handler-val');
        if (curId === id && prev !== null) {
          this.setAttribute('tabindex', '');
          prev.setAttribute('tabindex', '0');
          changeRadioValue.apply(prev);
          prev.focus();
          window.scrollToTopLeft();
          return false;
        }
        prev = this;
      });
    } else if (codeKey === DOWNKEY && !e.ctrlKey) {
      e.preventDefault();
      name = this.getAttribute('data-id');
      id = this.getAttribute('data-handler-val');
      radios = $(this).closest('.b-radio').find('div[data-id="' + name + '"]');
      var next = false;
      radios.each(function () {
        if (next) {
          this.setAttribute('tabindex', '0');
          changeRadioValue.apply(this);
          this.focus();
          return false;
        }
        var curId = this.getAttribute('data-handler-val');
        if (curId === id) {
          this.setAttribute('tabindex', '');
          next = true;
        }
      });
    }
  }

  function radioLabelClickHandler() {
    var rClass = this.getAttribute('data-r-class'),
        targetElem = $('.' + rClass);
    targetElem.trigger('click');
  }
  function checkboxDescClickHandler(e, sv) {
    var tabId = this.getAttribute('data-tabid'),
        id = this.getAttribute('data-id'),
        targetElem = $('.b-checkbox__control[data-tabid="' + tabId + '"]' + '[data-id="' + id + '"]');
    targetElem.trigger('click', [sv]);
  }
  //set radio value
  function changeRadioValue(e, sv) {
    var self = $(this),
        id = this.getAttribute('data-id'),
        val = this.getAttribute('data-val'),
        handlerVal = this.getAttribute('data-handler-val');

    if (self.hasClass('checked')) {
      return false;
    } else {
      $('.' + id).removeClass('checked').attr('tabindex', '');
      self.addClass('checked');
      this.setAttribute('tabindex', '0');
      this.focus();
      $('#' + id).val(val).attr('data-handler-val', handlerVal).trigger('change', [sv]);
    }
  }
  /**
   * Callback checkbox click event
   * check/uncheck checkbox
   * @param  {object} e event object
   * @param {boolean} setvalues flag once
   * @return {boolean}
   * @this {object} HTML node
   */
  function changeCheckboxValue(e, param) {
    var $self = $(this),
        id = this.getAttribute('data-id'),
        elem;
    param = param || [];
    if ($self.hasClass('readonly') && !param[1]) {
      return false;
    }
    if ($self.hasClass('checked')) {
      $self.removeClass('checked');
      elem = $('input[name=' + id + ']').val('off').attr('data-handler-val', hash('off'));
    } else {
      $self.addClass('checked');
      elem = $('input[name=' + id + ']').val('on').attr('data-handler-val', hash('on'));
    }
    elem.trigger('change', [param[0]]);
  }

  function collapsedForm(e) {
    //dangerously
    var TIMEOUT = 300;
    e = e || window.event;
    //check for dashboard block reload click
    if (e && e.target) {
      if ($(e.target).hasClass('dashblock-reload')) {
        return;
      }
    }
    if (!App.Global.HeaderMoving) {
      var self = $(this),
          parent = self.parent(),
          elemSlide = parent.next(),
          elemParent = parent.parent(),
          tabId = elemParent.attr('data-tabid'),
          name = parent.attr('data-name'),
          type = parent.attr('data-type'),
          $stateElem = parent.find('.b-triangle'),
          collapsed = elemParent.hasClass('b-form-page_st_collapsed');
      if (collapsed) {
        elemSlide.slideDown(TIMEOUT);
        elemParent.removeClass('b-form-page_st_collapsed');
        $stateElem.attr('data-state', 'expanded');
      } else {
        elemSlide.slideUp(TIMEOUT);
        $stateElem.attr('data-state', 'collapsed');
        setTimeout(function () {
          elemParent.addClass('b-form-page_st_collapsed');
          elemParent = null;
        }, TIMEOUT - 20);
      }
      //form page
      if (type !== 'dashboard-block') {
        EventMgr.trigger('saveFormPageState', {
          tabId: tabId,
          name: name,
          collapsed: collapsed
        });
        setTimeout(function () {
          EventMgr.trigger('updFormHeight', { tabId: tabId });
          EventMgr.trigger('updateScroll', {});
          tabId = null;
        }, TIMEOUT);
      } else {
        //dashboard block
        setTimeout(function () {
          EventMgr.trigger('updateScroll', {});
        }, TIMEOUT);
        var position = self.parents('.b-dashboard_cell').attr('data-pos'),
            display = collapsed ? 'max' : 'min',
            block = self.parent().attr('data-name');
        var param = {
          func: 'dashboard.save', out: 'xml',
          block: block, display: display, position: position };
        var url = pageInfo.url;
        EventMgr.trigger('ajaxRequest', {
          url: url, param: param,
          trfunc: 'DoNothing', queue: 'noqueue' });
        if (!collapsed) {
          setTimeout(function () {
            EventMgr.trigger('updateScroll', {});
          }, TIMEOUT);
        } else {
          setTimeout(function () {
            EventMgr.trigger('updateScroll', {});
            EventMgr.trigger('upDashTableList', { tabId: 'block-' + block });
            block = null;
          }, 10);
        }
      }
    } else {
      App.Global.HeaderMoving = false;
    }
    e.preventDefault();
  }

  function insertUnlimValue() {
    var parId = this.getAttribute('data-control-field'),
        tabId = getActiveTabId(),
        parentEl = App.Dom.byId(parId + '-' + tabId),
        value = parentEl.getAttribute('data-unlimit');
    if (parentEl !== null) {
      parentEl.value = value;
      //for setvalues
      $(parentEl).trigger('change');
    }
  }

  function changeElHandler(e) {
    var showAttr = this.getAttribute('show'),
        show = showAttr.split(','),
        len = show.length,
        checked = this.getAttribute('checked'),
        className = 'hideEl';
    while (len--) {
      $('formItem' + show[len]).toggleClass(className);
    }
  }
  //hide/show depend items in select and radio
  function dependSlistHandler(e) {
    var value = this.value,
        name = this.getAttribute('name'),
        type = this.getAttribute('data-type'),
        tabId = this.getAttribute('data-tabid'),
        elem,
        selectElem,
        showElem;
    //hide select options
    $('#frm-' + tabId + ' div[data-depend="' + name + '"] .dependelem.b-myselect__select-li_show_yes').removeClass('b-myselect__select-li_show_yes');
    $('#frm-' + tabId + ' div[data-depend="' + name + '"] .dependelem[data-dependkey="' + value + '"]').addClass('b-myselect__select-li_show_yes');

    //uncheck radio
    selectElem = $('#frm-' + tabId + ' div[data-depend="' + name + '"] .b-myselect__select-li_show_yes .b-radio__control.checked');
    if (selectElem.length === 0) {
      $('#frm-' + tabId + ' div[data-depend="' + name + '"] .b-radio__control').removeClass('checked');
      elem = $('#frm-' + tabId + ' div[data-depend="' + name + '"] .b-myselect__select-li_show_yes .b-radio__control')[0];
      if (elem) {
        changeRadioValue.apply(elem);
      }
    }
    //check for more one depend select
    var $dependSelect = $('#frm-' + tabId + ' div[data-depend="' + name + '"]');
    if ($dependSelect.length > 1) {
      $dependSelect.each(function () {
        var showElem = $(this).find('.dependelem[data-dependkey="' + value + '"].b-myselect__select-li_show_yes');
        dependSelectCheckForOprion(showElem, name, tabId, $(this));
      });
    } else {
      //unselect option
      showElem = $('#frm-' + tabId + ' div[data-depend="' + name + '"] ' + 'li.dependelem[data-dependkey="' + value + '"].b-myselect__select-li_show_yes');
      dependSelectCheckForOprion(showElem, name, tabId);
    }
    //unselect multiselect
    if ($dependSelect.length) {
      $dependSelect.each(function () {
        if (appDom.hasClass(this, 'b-mselect')) {
          EventMgr.trigger('mselectUnselectByDepend', { self: this });
        }
      });
    }
    EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
  }

  /**
   * Проверяем на наличия опций у зависимого селекта, если их нет скрываем поле
   */
  function dependSelectCheckForOprion(showElem, name, tabId, $self) {
    var $elem = $self || $('#frm-' + tabId + ' div[data-depend="' + name + '"]');
    if (showElem.length === 0) {
      $elem.closest('.l-form__row').css('display', 'none');
    } else {
      $elem.closest('.l-form__row').css('display', '');
    }
  }

  //show depend items in append form
  function firstDependSlistHandler(e, data) {
    var tabId = data.tabId;
    $('#cont-' + tabId + ' tr:not(".row-error") .depend.b-myselect ' + 'input[type="hidden"],' + ' #cont-' + tabId + ' .depend.b-radio input[type="hidden"],' + ' #cont-' + tabId + ' .depend.b-select-ac input[type="hidden"]').each(function () {
      dependSlistHandler.apply(this);
    });
    EventMgr.trigger('updFormHeight', { tabId: tabId });
    EventMgr.trigger('reloadSlider', { tabId: tabId });
  }

  function bandShowHandler(e) {
    var id = this.getAttribute('data-id'),
        self = $(this),
        toggleClass = 'data-table-hidden';
    if (self.hasClass(toggleClass)) {
      self.removeClass(toggleClass);
      $('#' + id).slideDown(300);
    } else {
      self.addClass(toggleClass);
      $('#' + id).slideUp(300);
    }
    setTimeout(function () {
      EventMgr.trigger('updateScroll', {});
    }, 350);
  }

  /**
   * setUp padding for input with prefix
   * @param {object} e
   * @param {object} data
   */
  function prefixFieldSetUp(e, data) {
    var tabId = data.tabId;
    setTimeout(function () {
      $('#cont-' + tabId + ' .i-input__prefix').each(function () {
        var elemWidth = this.offsetWidth,
            input = App.Common.getPreviousNode(this),
            inputWidth,
            PADDING = 7,
            BORDER = 1;
        if (input) {
          inputWidth = input.offsetWidth;
          input.style.width = inputWidth - elemWidth - (PADDING + BORDER * 2) + 'px';
          input.style.paddingLeft = elemWidth + 'px';
        }
      });
    }, 1);
  }

  //click for row in form list
  function formListRowClickHandler(e) {
    //check for loop
    if (e.target) {
      var $target = $(e.target);
      if ($target.hasClass('i-button') || $target.prop('tagName') === 'A' || $target.hasClass('b-checkbox__control')) {
        return;
      }
    }
    var $self = $(this),
        buttons = $self.find('.i-button_default_yes'),
        checkbox = $self.find('.i-checkbox_type_default');

    if (buttons.length === 1) {
      buttons.trigger('click');
    } else if (checkbox.length === 1) {
      checkbox.trigger('click');
    }
  }

  //
  function textareaResize(e) {
    var lastHeight = parseInt(this.style.height, 10),
        scrollHeight,
        maxHeight = (this.getAttribute('data-max-rows') - 0) * 12,
        BTNBOXHEIGHT = 62,
        id = this.getAttribute('id'),
        tabId = this.getAttribute('data-tabid');
    this.style.height = 'auto';
    scrollHeight = this.scrollHeight - 0;
    if (maxHeight < scrollHeight) {
      $(this).removeClass('b-textarea_responsive_yes');
    }
    this.style.height = scrollHeight + 'px';
    if (lastHeight !== scrollHeight) {

      EventMgr.trigger('updFormHeight', {
        tabId: tabId });
      //scroll textarea for visible area
      var textareaBotPos = $(this).offset().top + scrollHeight + BTNBOXHEIGHT,
          windowHeight = window.innerHeight;
      if (textareaBotPos > windowHeight) {
        var $self = $(this),
            offsetTop = $self.closest('.l-form__row')[0] ? $self.closest('.l-form__row')[0].offsetTop : 0,
            $page = $self.closest('.b-form-page'),
            formScrollEl = App.Dom.byId('form-scroll-' + tabId),
            heightViewPort = formScrollEl ? parseInt(formScrollEl.style.height, 10) : 0;
        if ($page[0]) {
          offsetTop += $page[0].offsetTop;
        }
        offsetTop -= heightViewPort - (scrollHeight + BTNBOXHEIGHT + this.offsetTop);
        EventMgr.trigger('scrollTo', {
          id: 'form-scroll-' + tabId,
          offsetTop: offsetTop,
          raw: false
        });
      }
    }
  }

  function ticketMoveUpHandler(e) {
    var tabId = this.getAttribute('data-tabid'),
        $self = $(this),
        $row = $self.closest('.l-form__row'),
        offsetTop = 0;
    if ($row[0]) {
      offsetTop = $row[0].offsetTop;
      EventMgr.trigger('scrollTo', {
        id: 'form-scroll-' + tabId,
        offsetTop: offsetTop,
        animate: true
      });
    }
  }

  function ticketMoveDownHandler(e) {
    var tabId = this.getAttribute('data-tabid'),
        $self = $(this),
        $row = $self.closest('.l-form__row'),
        $form = $self.closest('.l-form__wrapper'),
        offsetTop = 0,
        height = 0,
        formHeight = 0,
        MAGICNUMBER2 = 120,
        //min height item for work
    MAGICNUMBER = 160; //btn box height
    if ($row[0] && $form[0]) {
      offsetTop = $row[0].offsetTop;
      height = $row[0].offsetHeight;
      if (height < 120) {
        return;
      }
      formHeight = $form[0].offsetHeight;
      EventMgr.trigger('scrollTo', {
        id: 'form-scroll-' + tabId,
        offsetTop: offsetTop + height - formHeight + MAGICNUMBER,
        animate: true
      });
    }
  }

  function ticketCollapseHandler(e) {
    e.preventDefault();
    var $self = $(this),
        tabId = $self.closest('.tab-content').attr('data-tabid');
    if ($self.hasClass('mbar-showall')) {
      $self.removeClass('mbar-showall').addClass('mbar-hideall');
      $self.closest('.b-ticket__table-row_is_collapsible').removeClass('b-ticket__table-row_is_collapsed');
    } else {
      $self.removeClass('mbar-hideall').addClass('mbar-showall');
      $self.closest('.b-ticket__table-row_is_collapsible').addClass('b-ticket__table-row_is_collapsed');
    }
    EventMgr.trigger('updFormHeight', { tabId: tabId });
  }

  return {
    init: init,
    checkPassStrength: checkPassStrength,
    CACHE: CACHE
  };
}(window, $, EventMgr, App, ScrollHandler);
//# sourceMappingURL=App.Forms.js.map

'use strict';

/**
 * Модуль кастомного мультиселекта
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.MultiSelect = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__view-value', 'click', listOpenHandler);
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__ul-choose li', 'click', chooseElemHandler);
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__ul-view .b-mselect__unselect', 'click', unChooseElemHandler);
    // EventMgr.on('#main-wrapper', '.mselect-av .b-input-btn_type_plus',
    //     'click', selectAllHandler);
    // EventMgr.on('#main-wrapper', '.mselect-av .b-input-btn_type_minus',
    //     'click', unSelectAllHandler);
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__item_select-all', 'dblclick', unSelectAllHandler);
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__ul-view .b-mselect__item', 'mouseover', checkSize);
    EventMgr.on('#main-wrapper', '.mselect-av .b-mselect__view-value', 'keydown', keydownHandler);
    EventMgr.bind('selectValues', selectValues);
    EventMgr.bind('multiSelectUnselect', unSelectAllFromOut);
    EventMgr.bind('mselectUnselectByDepend', unselectByDepend);
  },
      listWrapperIdPostfix = '-ms-list-wrapper',
      listIdPostfix = '-ms-list',
      chooseListIdPostfix = '-ms-view',
      appDom = App.Dom,
      $body = function $body() {
    return $('body');
  },

  //show select options
  listOpenHandler = function listOpenHandler(e) {
    var id = this.getAttribute('data-id'),
        list = appDom.byId(id + listWrapperIdPostfix),
        bodyHeight,
        elemHeight,
        formTop,
        elemTop,
        tabId,
        form;
    if (e.target && e.target.className.match('scrlbr')) {
      return;
    }
    if (list) {
      if (list.offsetWidth === 0) {
        //for close other list
        $('body').trigger('click');
        bodyHeight = window.document.body.offsetHeight;
        appDom.removeClass(list, 'closed');
        //calculate list options position
        elemHeight = list.offsetHeight;
        list.style.top = '';
        elemTop = $(list).offset().top;
        if (bodyHeight - elemTop < elemHeight) {
          tabId = list.getAttribute('data-tabid');
          form = $('#form-scroll-' + tabId);
          formTop = form.offset().top;
          if (formTop > elemTop - elemHeight - appDom.byId(id + '-ms-view').offsetHeight) {
            list.style.top = '-' + elemHeight / 2 + 'px';
          } else {
            list.style.top = '-' + elemHeight + 'px';
          }
        }
        $body().on('click', listCloseHandler);
        e.stopPropagation();
        EventMgr.trigger('updateScroll', { id: id + listIdPostfix });
      } else {
        appDom.addClass(list, 'closed');
        EventMgr.off('body', 'click');
        $body().off('click', listCloseHandler);
      }
    }
  },

  //close select options
  listCloseHandler = function listCloseHandler(e) {
    if (e.target) {
      if (!appDom.hasClass(e.target, 'b-mselect__item') && !appDom.hasClass(e.target, 'scrlbr')) {
        closeList();
      } else {
        return;
      }
    }
    $body().off('click', listCloseHandler);
    e.stopPropagation();
  },

  //
  closeList = function closeList(id) {
    var elems, selected;
    if (typeof id === 'string') {
      elems = $('#' + id + '-ms-list-wrapper');
    } else {
      elems = $('.b-mselect__options');
    }
    elems.addClass('closed');
    //remove selected hightlight
    if (typeof id === 'string') {
      selected = $('#' + id + '-ms-list-ul').find('.b-mselect__item_st_selected');
    } else {
      selected = $('.b-mselect__item_st_selected');
    }
    selected.removeClass('b-mselect__item_st_selected');
  },
      checkAllSelectedElem = function checkAllSelectedElem(id) {
    var $items = $('#' + id + '-ms-list-ul'),
        selectedCount = $items.find('.chosen').length,
        allCount = $items.find('.b-mselect__item').length - 1;
    return {
      selectedCount: selectedCount,
      allCount: allCount,
      allSelected: allCount === selectedCount
    };
  },
      chooseElemHandler = function chooseElemHandler(e, data) {
    var clone = this.cloneNode(true),
        id = this.parentNode.getAttribute('data-id'),
        clist = App.Dom.byId(id + chooseListIdPostfix),
        maxSelect = clist.getAttribute('data-maxselect'),
        selectedObj = checkAllSelectedElem(id),
        selectedCount = selectedObj.selectedCount,
        preventChange = data ? data.preventChange ? true : false : false;
    maxSelect = maxSelect === '' ? 9999 : parseInt(maxSelect, 10);
    if (selectedCount === maxSelect) {
      //closeList(id);
      return;
    }

    //check for selected
    if (appDom.hasClass(this, 'b-mselect__item_select-all')) {
      if (selectedObj.allSelected) {
        unSelectAllValues(id);
      } else {
        selectAllValues(id);
      }
    } else if (appDom.hasClass(this, 'chosen')) {
      appDom.removeClass(this, 'chosen');
      $('.b-mselect__item[data-s-id="' + clone.id + '"] .b-mselect__unselect').trigger('click');
    } else {
      clone.setAttribute('data-s-id', clone.id);
      clone.id = '';
      if (!clist) {
        return;
      }
      appDom.addClass(this, 'chosen');
      appDom.addClass(clone, 'chosen');
      clist.appendChild(clone);
      setValue(id, preventChange);
    }
  },
      unChooseElemHandler = function unChooseElemHandler(e) {
    var elem = this.parentNode,
        sid = elem.getAttribute('data-s-id'),
        sElem = appDom.byId(sid),
        id = sElem.parentNode.getAttribute('data-id');
    elem.parentNode.removeChild(elem);
    appDom.removeClass(sElem, 'chosen');
    setValue(id);
    // closeList(id);
    e.stopPropagation();
  },
      unSelectAllHandler = function unSelectAllHandler(e) {
    var id = this.getAttribute('data-id');
    unSelectAllValues(id);
    e.preventDefault();
  },
      unSelectAllFromOut = function unSelectAllFromOut(e, data) {
    var id = data.id;
    unSelectAllValues(id);
  },

  //unselect all values
  unSelectAllValues = function unSelectAllValues(id) {
    $('#' + id + '-ms-view .b-mselect__item.chosen').remove();
    $('#' + id + '-ms-list-ul .chosen').removeClass('chosen');
    setValue(id);
  },
      selectAllHandler = function selectAllHandler(e) {
    var id = this.getAttribute('data-id');
    selectAllValues(id);
    e.preventDefault();
  },

  //select all values
  selectAllValues = function selectAllValues(id) {
    var elems = $('#' + id + '-ms-list-ul .b-mselect__item'),
        l = elems.length,
        clone,
        clist = App.Dom.byId(id + chooseListIdPostfix),
        maxSelect = clist.getAttribute('data-maxselect'),
        selectedCount = $('#' + id + '-ms-list-ul li.chosen').length;
    maxSelect = maxSelect === '' ? 9999 : parseInt(maxSelect, 10);
    for (var i = 0; i < l; i++) {
      if (selectedCount === maxSelect) {
        break;
      }
      if (appDom.hasClass(elems[i], 'dependelem') && !appDom.hasClass(elems[i], 'b-myselect__select-li_show_yes')) {
        continue;
      }
      if (appDom.hasClass(elems[i], 'b-mselect__item_select-all')) {
        continue;
      }
      if (!appDom.hasClass(elems[i], 'chosen')) {
        clone = elems[i].cloneNode(true);
        clone.setAttribute('data-s-id', clone.id);
        clone.id = '';
        appDom.addClass(elems[i], 'chosen');
        appDom.addClass(clone, 'chosen');
        clist.appendChild(clone);
        selectedCount++;
      }
    }
    setValue(id);
  },


  //setvalue when change
  setValue = function setValue(id, preventChange) {
    var elem = appDom.byId(id + chooseListIdPostfix),
        cElems = elem.children,
        l = cElems.length,
        val,
        value = '',
        input = appDom.byId(id + '-ms-value'),
        wrapper = appDom.byId(id + '-ms'),
        scrollId = $(wrapper).find('.b-mselect__view-value').attr('id'),
        tabId = elem.getAttribute('data-tabId');
    if (l !== 1) {
      while (l--) {
        val = cElems[l].getAttribute('data-val');
        value += val;
        if (l !== 1) {
          value += ',';
        } else {
          break;
        }
      }
    } else {
      value = '';
    }

    input.value = value;
    if (value === '') {
      appDom.removeClass(wrapper, 'selected');
    } else {
      appDom.addClass(wrapper, 'selected');
    }
    if (!preventChange) {
      $(input).trigger('change');
    }
    EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
    EventMgr.trigger('updateScroll', { id: scrollId });
  },

  //apply setvalues
  selectValues = function selectValues(e, data) {
    var id = data.id,
        slist = data.sElems.slist,
        values = data.sElems.value !== undefined ? data.sElems.value : data.sElems,
        l = values.length,
        elem,
        maxSelect = $('#' + id + '-ms-view').attr('data-maxselect');
    maxSelect = maxSelect === '' ? 9999 : parseInt(maxSelect, 10);
    if (slist) {
      $('#' + id + '-ms-list-ul').html(renderMultiSelectValues(slist, id));
    }
    $('#' + id + '-ms').removeClass('selected');
    $('#' + id + '-ms-list-ul li.chosen').removeClass('chosen');
    $('#' + id + '-ms-view li.chosen').remove();
    if (typeof values === 'string' && values !== '') {
      elem = $('#' + id + '-ms-list-ul li[data-val="' + values + '"]').trigger('click');
    } else {
      if (maxSelect < l) {
        l = maxSelect;
      }
      for (var i = 0; i < l; i++) {
        if (i === l - 1) {
          elem = $('#' + id + '-ms-list-ul li[data-val="' + values[i] + '"]').trigger('click', { 'preventChange': false });
        } else {
          elem = $('#' + id + '-ms-list-ul li[data-val="' + values[i] + '"]').trigger('click', { 'preventChange': true });
        }
      }
    }
  },
      unselectByDepend = function unselectByDepend(e, data) {
    var self = data.self;
    $(self).find('.b-mselect__ul-view .dependelem:not(".b-myselect__select-li_show_yes") .b-mselect__unselect').each(function () {
      $(this).trigger('click');
    });
  },

  //render options for setvalues
  renderMultiSelectValues = function renderMultiSelectValues(slist, id) {
    var html = '',
        l = slist.length;

    html += '<li class="b-mselect__item b-mselect__item_select-all">' + pageInfo.messages.msg_select_all + '</li>';
    for (var i = 0; i < l; i++) {
      html += '<li class="b-mselect__item" data-val="' + slist[i].key + '" unselectable="on" data-handler-val="' + hash(slist[i].key) + '"  data-dependkey="' + slist[i].depend + '" id="' + id + '-' + i + '">' + slist[i].value + '<span class="b-mselect__unselect"></span></li>';
    }
    return html;
  },
      UPKEY = 38,
      DOWNKEY = 40,
      LEFTKEY = 37,
      RIGHTKEY = 39,
      ENTERKEY = 13,
      TABKEY = 9,
      ESCKEY = 27,
      SPACE = 32,
      keydownHandler = function keydownHandler(e) {
    var codeKey = e.which || e.keyCode,
        ctrlKey = e.metaKey || e.ctrlKey,
        closed = appDom.hasClass(appDom.byId(this.getAttribute('data-id') + listWrapperIdPostfix), 'closed');
    //go up
    if (codeKey === UPKEY && !closed) {
      selectPrevOption.apply(this, []);
      //go down
    } else if (codeKey === DOWNKEY && !closed) {
      selectNextOption.apply(this, []);
      //close tab
    } else if (codeKey === TABKEY && !closed) {
      closeList();
      //choose selected value & close select or not?
    } else if ((codeKey === ENTERKEY || codeKey === SPACE) && !ctrlKey) {
      if (closed) {
        listOpenHandler.apply(this, [e]);
      } else {
        chooseSelected.apply(this, [e]);
      }
      //close list
    } else if (codeKey === ESCKEY && !closed) {
      e.stopPropagation();
      closeList();
    }
  },
      selectPrevOption = function selectPrevOption() {
    var id = this.getAttribute('data-id'),
        $list = $('#' + id + '-ms-list-ul'),
        selElem = $list.find('.b-mselect__item_st_selected'),
        prev = true,
        prevElem = selElem;
    if (selElem.length > 0) {
      while (prev) {
        prevElem = prevElem.prev();
        if (prevElem.length > 0) {
          prev = prevElem.hasClass('chosen');
        } else {
          prevElem = null;
          prev = false;
        }
      }
      if (prevElem) {
        selElem.removeClass('b-mselect__item_st_selected');
        prevElem.addClass('b-mselect__item_st_selected');
      }
    } else {
      selElem = $list.find('.b-mselect__item:first:not(".chosen")');
      selElem.addClass('b-mselect__item_st_selected');
    }
  },
      selectNextOption = function selectNextOption() {
    var id = this.getAttribute('data-id'),
        $list = $('#' + id + '-ms-list-ul'),
        selElem = $list.find('.b-mselect__item_st_selected'),
        nextElem = selElem,
        next = true;
    if (selElem.length > 0) {
      while (next) {
        nextElem = nextElem.next();
        if (nextElem.length > 0) {
          next = nextElem.hasClass('chosen');
        } else {
          nextElem = null;
          next = false;
        }
      }
      if (nextElem) {
        selElem.removeClass('b-mselect__item_st_selected');
        nextElem.addClass('b-mselect__item_st_selected');
      }
    } else {
      selElem = findFirst($list);
      if (selElem) {
        selElem.addClass('b-mselect__item_st_selected');
      }
    }
  },
      findFirst = function findFirst($list) {
    var finding = true,
        first = $list.find('.b-mselect__item:first');
    while (finding) {
      if (first.length > 0) {
        if (first.hasClass('chosen')) {
          first = first.next();
          finding = true;
        } else {
          return first;
        }
      } else {
        return false;
      }
    }
  },
      chooseSelected = function chooseSelected(e) {
    var id = this.getAttribute('data-id'),
        selected = $('#' + id + '-ms-list-ul').find('.b-mselect__item_st_selected');
    if (selected.length > 0) {
      selected.trigger('click');
    } else {
      closeList(id);
    }
  },
      checkSize = function checkSize() {
    if (App.Dom.hasClass(this, 'overwidth') || App.Dom.hasClass(this, 'notoverwidth')) {
      return;
    }
    if (this.scrollWidth > this.offsetWidth) {
      App.Dom.addClass(this, 'overwidth');
      $(this).trigger('mouseover');
    } else {
      App.Dom.addClass(this, 'notoverwidth');
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.MultiSelect.js.map

'use strict';

/**
 * Select Module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.Select = function (window, $, EventMgr, App) {
  'use strict';

  var UPKEY = 38,
      DOWNKEY = 40,
      LEFTKEY = 37,
      RIGHTKEY = 39,
      ENTERKEY = 13,
      TABKEY = 9,
      ESCKEY = 27,
      SPACE = 32,

  //wrapper for select
  selectSelector = '.b-myselect:not(".readonly")' + ' .b-myselect__select-selected',

  //wrapper for select item
  selectItemSelector = '.b-myselect:not(".readonly")' + ' .b-myselect__select-li',
      selectKeySelector = '.b-myselect:not(".readonly")' + ' .b-myselect__select-selected,' + ' .b-myselect:not(".readonly") .sb-input',
      CACHE = {},
      CACHEOPENEDSELECT = {},
      dependSlistSelector = '.depend.b-myselect input[type="hidden"],' + ' .depend.b-select-ac input[type="hidden"],' + ' .depend.b-radio input[type="hidden"]';

  function $body() {
    return $('body');
  }

  function getActiveTabId() {
    return $('.tab-content_st_active').attr('data-tabid') || false;
  }
  //flag for active select list
  function $content() {
    return App.Common.selectorCache('.i-form-wr');
  }

  function $selectCont(id) {
    if (id) {
      return $('#' + id + '.b-myselect');
    } else {
      return $('.b-myselect');
    }
  }

  //add /remove handler for body, for close selectlist
  function addRemoveHandlerForBody(add) {
    if (add) {
      $body().on('click', bodyHandlerClick);
    } else {
      $body().off('click', bodyHandlerClick);
    }
  }

  function closeOtherSelectList(tabId, click) {
    if (!tabId) {
      tabId = getActiveTabId();
    }
    if (CACHEOPENEDSELECT[tabId] && CACHEOPENEDSELECT[tabId].removeClass) {
      CACHEOPENEDSELECT[tabId].addClass('b-myselect_st_close').removeClass('b-myselect_st_open');
      addRemoveHandlerForBody();
    }
  }

  function bodyHandlerClick(e) {
    if (e) {
      var scrElemClass = e.srcElement ? e.srcElement.className : e.target ? e.target.className : '',
          scrollFlag = scrElemClass.indexOf('scrlbr'),
          highlightFlag = scrElemClass.indexOf('highlight');
      if (scrollFlag === -1 && highlightFlag === -1) {
        closeOtherSelectList();
      }
    } else {
      //what is it?!
      e.stopPropagation();
    }
  }
  //click for select
  function selectListHandler(e) {
    e.preventDefault();
    e.stopPropagation();
    var id = this.getAttribute('data-id'),
        $selectContVar = $selectCont(id),
        ids,
        searchBox,
        tabId = getActiveTabId(),
        keySymbol,
        r;
    //check current state option list
    if (!$selectContVar.hasClass('b-myselect_st_open')) {
      $('body').trigger('click');
      closeOtherSelectList(tabId);
      $selectContVar.removeClass('b-myselect_st_close').addClass('b-myselect_st_open');
      //set optionlist position
      App.Common.setOptionListPosition('#opt', id);

      ids = $selectContVar.find('.b-myselect__select-list').attr('id');
      EventMgr.trigger('updateScroll', { id: ids });
      addRemoveHandlerForBody(true);
      //set focus on searchbox
      if (this.parentNode.className.match('sb-select')) {
        searchBox = App.Dom.byId('sb-' + ids);
        if (searchBox) {
          //try guess symbol of pressed key
          if (e && e.originalEvent) {
            if (e.originalEvent.key) {
              keySymbol = e.originalEvent.key;
              if (keySymbol.length > 1) {
                keySymbol = null;
              }
            }
          }
          searchBox.value = keySymbol || '';
          setTimeout(function () {
            findElemsInSelect.apply(searchBox, [{ codeKey: 'ololo' }]);
          }, 1);
          searchBox.focus();
          //set cursor after 1st symbol
          if (keySymbol) {
            if (searchBox.setSelectionRange) {
              searchBox.setSelectionRange(1, 1);
            } else {
              r = searchBox.createTextRange();
              r.collapse(true);
              r.select(1, 1);
            }
          }
          window.scrollToTopLeft();
        }
      }
      CACHEOPENEDSELECT[tabId] = $selectContVar;
    } else {
      $selectContVar.removeClass('b-myselect_st_open').addClass('b-myselect_st_close');
      delete CACHEOPENEDSELECT[tabId];
      addRemoveHandlerForBody(false);
      this.childNodes[1].focus();
      window.scrollToTopLeft();
    }
  }

  //select item handler
  function setSelectedValue(e, sv, close) {
    var self = $(this),
        val = this.getAttribute('data-val'),
        handlerVal = this.getAttribute('data-handler-val'),
        content = self.html(),
        id = self.parent().attr('data-id'),
        currentSelect = $('#' + id + ' .b-myselect__select-value');
    if (self.hasClass('group')) {
      return;
    }
    var $inputValue = $('input#' + id + '-val');
    var prevValue = $inputValue.val();

    //вызываем change только при изменение значения, чтобы не зациклить setvalues
    if (prevValue !== val) {
      $inputValue.val(val).attr('data-handler-val', handlerVal).trigger('change', [sv, close]);
    }
    //if it clone from search - search self made it
    if (!self.hasClass('b-myselect__select-li_clone_true')) {
      self.addClass('selected').siblings().removeClass('selected');
    } else if (!e) {
      //up/down keydown
      self.addClass('selected').siblings().removeClass('selected');
      self.trigger('customclick');
      content = self.siblings('.selected').find('.b-myselect__option-value').html();
    }
    currentSelect.html(content);
    if (close !== false) {
      $body().trigger('click');
      if (e && !e.isTrigger) {
        currentSelect.focus();
        window.scrollToTopLeft();
      }
    }
    EventMgr.trigger('selectChange', { id: id });
  }

  //идем по селекту вниз downkey
  function selectListNext(e) {
    var tabId = getActiveTabId(),
        id = this.getAttribute('data-id'),
        l,
        currentLi = $('#' + id + ' li.selected'),
        nextLi = currentLi.next(),
        next = true,
        closed = currentLi.parent()[0].offsetWidth ? false : true;
    if (!currentLi[0].offsetWidth && !closed) {
      currentLi = $('#' + id + ' li[style$="display: block;"]');
      l = currentLi.length;
      if (l > 0) {
        setSelectedValue.apply(currentLi[0], [false, false, false]);
        return;
      }
    }
    while (next) {
      if (nextLi.length === 0) {
        return;
        //detect showed elements by class 'show'
      } else if (nextLi[0].offsetWidth && !closed) {
        next = false;
      } else if (closed && nextLi[0].className.match('b-myselect__select-li_show_yes')) {
        next = false;
      } else {
        nextLi = nextLi.next();
      }
    }
    setSelectedValue.apply(nextLi[0], [false, false, false]);
    var offsetTop = nextLi[0].offsetTop,
        scrollId = 'cont-' + id;

    //if (offsetTop != 0) {
    ScrollHandler.forceMoveSelectItem(scrollId, offsetTop);
    //}
  }

  //идем по селекту вверх upkey
  function selectListPrev() {
    var tabId = getActiveTabId(),
        id = this.getAttribute('data-id'),
        l,
        currentLi = $('#' + id + ' li.selected'),
        prevLi = currentLi.prev(),
        prev = true,
        closed = currentLi.parent()[0].offsetWidth ? false : true;
    if (!currentLi[0].offsetWidth && !closed) {
      currentLi = $('#' + id + ' li[style$="display: block;"]');
      l = currentLi.length;
      if (l > 0) {
        setSelectedValue.apply(currentLi[l - 1], [false, false, false]);
        return;
      }
    }
    while (prev) {
      if (prevLi.length === 0) {
        return;
        //detect showed elements by class 'show'
      } else if (prevLi[0].offsetWidth && !closed) {
        prev = false;
      } else if (closed && prevLi[0].className.match('b-myselect__select-li_show_yes')) {
        prev = false;
      } else {
        prevLi = prevLi.prev();
      }
    }

    setSelectedValue.apply(prevLi[0], [false, false, false]);
    var offsetTop = prevLi[0].offsetTop,
        scrollId = 'cont-' + id;

    //if (offsetTop !== 0) {
    ScrollHandler.forceMoveSelectItem(scrollId, offsetTop);
    //}
  }

  //обработчик клавишных нажатий по селекту
  function selectListKeyDownHandler(e) {
    var codeKey = e.which || e.keyCode,
        tabId = this.getAttribute('data-tabid'),
        listOpened = !!CACHEOPENEDSELECT[tabId];
    //by ENTER and SPACE
    if ((codeKey === ENTERKEY || codeKey === SPACE) && !e.ctrlKey && this.type !== 'text') {
      e.preventDefault();
      selectListHandler.apply(this, [e]);
      //by ENTER and SPACE search field
    } else if (codeKey === ENTERKEY && !e.ctrlKey && this.type === 'text') {
      selectFindFirstElem(this);
      e.preventDefault();
      //by TABKEY when openlist
    } else if ((codeKey === TABKEY || codeKey === ESCKEY) && listOpened) {
      //      e.preventDefault();
      //      closeSelectList(e, true);
      e.stopPropagation();
      closeOtherSelectList(false, true);
      //UP or LEFT when list opened
    } else if ((codeKey === UPKEY || codeKey === LEFTKEY) && !listOpened && !e.ctrlKey && this.type !== 'text') {
      e.preventDefault();
      selectListPrev.apply(this, [e]);
      //DOWN or RIGHT list opened
    } else if ((codeKey === DOWNKEY || codeKey === RIGHTKEY) && !listOpened && !e.ctrlKey && this.type !== 'text') {
      e.preventDefault();
      selectListNext.apply(this, [e]);
      //DOWN when list closed
    } else if (codeKey === DOWNKEY && listOpened && !e.ctrlKey) {
      e.preventDefault();
      selectListNext.apply(this, [e]);
      //UP when list closed
    } else if (codeKey === UPKEY && listOpened && !e.ctrlKey) {
      e.preventDefault();
      selectListPrev.apply(this, [e]);
      //Open by any symbol
    } else if (this.type !== 'text' && codeKey > 32) {
      selectListHandler.apply(this, [e]);
    }
  }

  function selectFindFirstElem(self) {
    var id, sElem, selElem, currentSelect;
    id = self.getAttribute('data-id');
    sElem = $('#' + id);
    if (sElem.length === 0) {
      return;
    }
    selElem = sElem.find('li.selected:visible');
    if (selElem.length !== 0) {
      selElem.trigger('click');
    } else {
      selElem = sElem.find('li:visible:first');
      if (selElem.length !== 0) {
        selElem.trigger('click');
      } else {
        $('body').trigger('click');
      }
    }
    //set focus on select
    currentSelect = $('#' + sElem.attr('data-id') + ' .b-myselect__select-value');
    currentSelect.focus();
    window.scrollToTopLeft();
  }

  var matchesElems = {};
  //поиск по селекту
  function findElemsInSelect(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode;
    if (codeKey === UPKEY || codeKey === DOWNKEY || TABKEY === codeKey) {
      return;
    }
    var value,
        id,
        sElem,
        sElems,
        len,
        regEx,
        words,
        wLen,
        find,
        inner,
        searchAll = true,
        optListId,
        curElem,
        selElems,
        tabId,
        matches,
        listParent;
    value = this.value.toLowerCase();

    value = App.u.escapeRegExp(value);
    id = this.getAttribute('data-id');
    sElem = App.Dom.byId(id);
    if (!sElem) {
      return;
    }
    var $sElem = $(sElem);
    optListId = String(sElem.getAttribute('data-id'));
    sElems = sElem.children;
    len = sElems.length;
    tabId = this.getAttribute('data-tabId');
    //cache html nodes
    if (!CACHE[tabId]) {
      CACHE[tabId] = {};
    }
    if (!CACHE[tabId][id]) {
      sElems = sElem.children;
      selElems = [];
      var l = sElems.length,
          t1,
          pushed,
          clone;
      while (l--) {
        clone = sElems[l].cloneNode(true);
        clone.className += ' b-myselect__select-li_clone_true';
        t1 = $(clone).find('.b-myselect__option-value');
        /* jslint loopfunc:true */
        pushed = selElems.push({
          node: sElems[l],
          clone: clone,
          innerNode: t1,
          inner: t1.html(),
          bindClick: function bindClick() {
            var $clone = $(this.clone);
            $clone.bind('click', $.proxy(function (e) {
              this.returnDefValue();
              var $node = $(this.node);
              $node.addClass('selected').siblings().removeClass('selected');
              //for unknow reasons it doesn't bubble to parent li
              //force click
              if (e) {
                var scrElemClass = e.srcElement ? e.srcElement.className : e.target ? e.target.className : '';
                if (scrElemClass.indexOf('highlight') === 0) {
                  $node.trigger('click');
                }
              }
            }, this));

            $clone.bind('customclick', $.proxy(function () {
              var $node = $(this.node);
              $node.addClass('selected');
            }, this));
          },
          returnDefValue: function returnDefValue() {
            if (this.isMatched) {
              this.innerNode.html(this.inner);
            }
            this.isMatched = false;
          }
        });
        /* jslint loopfunc:false */
        selElems[pushed - 1].bindClick();
        CACHE[tabId][id] = selElems;
      }
    } else {
      selElems = CACHE[tabId][id];
      len = selElems.length;
    }
    if (value === '') {
      //show all elems in list
      $sElem.removeClass('b-myselect__select-ul_searching_true');
      hideElement(matchesElems[id]);
      scrollToSelectedElement(sElem, id);
      EventMgr.trigger('updateScroll', { id: 'cont-' + id });
      return;
    } else {
      $sElem.addClass('b-myselect__select-ul_searching_true');
    }
    if (!searchAll) {
      regEx = new RegExp('^' + value);
    } else {
      regEx = new RegExp(value);
    }

    var wordLowerCase = '';
    matchesElems[id] = [];

    while (len--) {
      curElem = selElems[len];
      curElem.returnDefValue();
      inner = curElem.inner;
      words = inner.split(' ');
      wLen = words.length;
      find = false;
      while (wLen--) {
        wordLowerCase = words[wLen].toLocaleLowerCase();
        matches = wordLowerCase.match(regEx);
        if (matches) {
          selElems[len].isMatched = true;
          selElems[len].searchIndex = wordLowerCase.indexOf(matches[0]) + Math.pow(10, wLen);
          find = true;
          words[wLen] = addHightLight(value, words[wLen], searchAll);
          matchesElems[id].push(selElems[len]);
        }
      }
      if (!find) {
        hideElement(curElem);
      } else {
        showElement(curElem);
        curElem.innerNode.html(words.join(' '));
      }
    }
    //sort result of find

    if (matchesElems[id].length > 0) {
      var lMatchesElems = matchesElems[id];
      lMatchesElems.sort(sortMatches);
      listParent = $(sElem);
      var mLen = lMatchesElems.length;
      while (mLen--) {
        listParent.prepend(lMatchesElems[mLen].clone);
      }
    }
    EventMgr.trigger('updateScroll', { id: 'cont-' + id });
    ScrollHandler.scrollTo('cont-' + id, 0);
    App.Common.setOptionListPosition('#opt', optListId);
  }

  function sortMatches(a, b) {
    if (b.searchIndex === a.searchIndex) {
      return 0;
    }
    if (b.searchIndex < a.searchIndex) {
      return 1;
    } else {
      return -1;
    }
  }

  function scrollToSelectedElement(sElem, id) {
    var top, selectedElem;
    selectedElem = $(sElem).find('.selected:not(".b-myselect__select-li_clone_true")');
    if (selectedElem.length) {
      top = selectedElem[0].offsetTop;
      setTimeout(function () {
        ScrollHandler.scrollTo('cont-' + id, top);
      }, 1);
    }
  }

  //показываем элемент или элементы в селекте
  function showElement(elem) {
    if (!elem) {
      return;
    }
    var len = elem.length;
    if (len) {
      while (len--) {
        if (elem[len].clone.className.match('b-myselect__select-li_show_yes')) {
          elem[len].clone.style.display = 'block';
        } else {
          elem[len].clone.style.display = 'none';
        }
      }
    } else {
      if (elem.clone) {
        if (elem.clone.className.match('b-myselect__select-li_show_yes')) {
          elem.clone.style.display = 'block';
        } else {
          elem.clone.style.display = 'none';
        }
      }
    }
  }

  //скрываем элемент или элементы в селекте
  function hideElement(elem) {
    if (!elem) {
      return;
    }
    var len = elem.length;
    if (len) {
      while (len--) {
        elem[len].clone.style.display = 'none';
      }
    } else {
      if (elem.clone) {
        elem.clone.style.display = 'none';
      }
    }
  }
  //добавляем выделение
  function addHightLight(rep, value, searchAll) {
    var re, elemValue;
    if (!searchAll) {
      re = rep ? new RegExp('(^' + rep + ')', 'i') : false;
    } else {
      re = rep ? new RegExp('(' + rep + ')', 'i') : false;
    }
    elemValue = value.replace(re, '<span class="highlight">$1</span>');
    return elemValue;
  }

  /**
   * Обрабатываем зависимости при отрисовке формы
   */
  function firstDependSlistHandler(e, data) {
    var tabId = data.tabId;
    $('#cont-' + tabId + ' tr:not(".row-error") .depend.b-myselect ' + 'input[type="hidden"],' + ' #cont-' + tabId + ' .depend.b-radio input[type="hidden"],' + ' #cont-' + tabId + ' .depend.b-select-ac input[type="hidden"]').each(function () {
      dependSlistHandler.apply(this);
    });
    EventMgr.trigger('updFormHeight', { tabId: tabId });
  }

  function dependSlistHandler() {
    var value = this.value,
        name = this.getAttribute('name'),
        type = this.getAttribute('data-type'),
        tabId = this.getAttribute('data-tabid'),
        elem,
        selectElem,
        showElem,
        $dependSelect;
    //hide select options
    $dependSelect = $('#frm-' + tabId + ' div[data-depend="' + name + '"]');
    if ($dependSelect.length > 1) {
      $dependSelect.each(function () {
        var $self = $(this);
        selectElem = $self.find('li.dependelem[data-dependkey="' + value + '"].selected.b-myselect__select-li_show_yes');
        dependSlistCheckSelected(selectElem, $self);
      });
    } else {
      selectElem = $dependSelect.find('li.dependelem[data-dependkey="' + value + '"].selected.b-myselect__select-li_show_yes');
      dependSlistCheckSelected(selectElem, $dependSelect);
    }
    //set first value or prev key
    EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
  }

  function dependSlistCheckSelected(selectElem, $dependSelect) {
    if (selectElem.length === 0) {
      var id = $dependSelect.attr('id'),
          prevValue = $('#' + id + '-val').val();

      $dependSelect.find('li').removeClass('selected');
      var elem = $dependSelect.find('li.b-myselect__select-li_show_yes[data-val="' + prevValue + '"]')[0] || $dependSelect.find('li.b-myselect__select-li_show_yes')[0];
      if (elem) {
        setSelectedValue.apply(elem);
      } else {
        //console.log('alarm!!! no elem');
      }
    }
  }

  /**
   * Clean cache if slist changed by setvalues
   * @param {object} e
   * @param {object} data
   */
  function cleanSlistCache(e, data) {
    var id = data.id,
        tabId = data.tabId;
    if (CACHE && CACHE[tabId] && CACHE[tabId][id]) {
      delete CACHE[tabId][id];
    }
  }

  function init() {
    //select
    EventMgr.on($content(), selectSelector, 'click', selectListHandler);
    EventMgr.on($content(), selectKeySelector, 'keydown', selectListKeyDownHandler);
    EventMgr.on($content(), selectItemSelector, 'click', setSelectedValue);
    EventMgr.on($content(), '.sb-input', 'keyup', findElemsInSelect);
    EventMgr.on($content(), dependSlistSelector, 'change', dependSlistHandler);
    EventMgr.bind('appendForm,appendReport,appendedFilter,forceDepend', firstDependSlistHandler);
    EventMgr.bind('cleanSlistCache', cleanSlistCache);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Select.js.map

'use strict';

/**
 * App.Bands module
 * Scroll to Ancor in report table
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.Bands = function (window, $, EventMgr, App) {
  'use strict';

  function init() {
    EventMgr.on($content(), bandAncorLinkSelector, 'click', scrollToAncor);
  }

  function $content() {
    return $('#content');
  }

  var bandAncorLinkSelector = 'span[data-child-id]';

  function scrollToAncor(e) {
    var chilid = this.getAttribute('data-child-id'),
        topHim = $('#' + chilid).offset().top,
        tabId = $('.tab-content_st_active').attr('data-tabid'),
        topTabCont = $('#form-scroll-' + tabId).offset().top,
        tabCont = App.Dom.byId('form-scroll-' + tabId),
        scrollTop;
    if (tabCont === null) {
      return;
    }
    //tabCont.scrollTop =  tabCont.scrollTop + (topHim - topTabCont);
    scrollTop = tabCont.scrollTop + (topHim - topTabCont);
    ScrollHandler.scrollTo('form-scroll-' + tabId, scrollTop, false, true);
    //ScrollHandler.forceMove('form-scroll-' + tabId);
  }

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Bands.js.map

'use strict';

/**
 * Change brand color
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
App.ChangeBrandColors = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.bind('changeSliderValue', changeBrandColor);
    EventMgr.bind('appendForm', start);
  },
      changeBrandColor = function changeBrandColor(e, data) {
    var tabId = data.tabId,
        h = $('#' + tabId + '-h').val(),
        s = $('#' + tabId + '-s').val(),
        l = $('#' + tabId + '-l').val(),
        colors = {};
    colors[tabId + '-color1'] = '587B9D';
    colors[tabId + '-color2'] = '78A5DF';
    colors[tabId + '-color3'] = 'E1E7ED';
    colors[tabId + '-color4'] = '879CB5';
    colors[tabId + '-color5'] = '537393';
    colors[tabId + '-color6'] = '6086ab';
    colors[tabId + '-color7'] = 'dae2ec';
    var i, elem;
    /* jslint forin:true */
    for (i in colors) {
      elem = App.Dom.byId(i);
      if (!elem) {
        continue;
      }
      elem.style.backgroundColor = '#' + changeColor(colors[i], h, s, l);
    }
  },
      start = function start(e, data) {
    var tabId = data.tabId;
    EventMgr.trigger('changeSliderValue', { tabId: tabId });
  },
      changeColor = function changeColor(rgbhex, hue, saturation, lightness) {
    var r = parseInt(rgbhex.substr(0, 2), 16),
        g = parseInt(rgbhex.substr(2, 2), 16),
        b = parseInt(rgbhex.substr(4, 2), 16);

    saturation /= 100;
    lightness /= 100;

    // this seems to give the same result as Photoshop
    var satMul = saturation < 0 ? 1 + saturation : 1 + saturation * 2;

    hue = hue % 360 / 360;
    var hue6 = hue * 6;

    var rgbDiv = 1 / 255;

    var light255 = lightness * 255;
    var lightp1 = 1 + lightness;
    var lightm1 = 1 - lightness;

    if (hue !== 0 || saturation !== 0) {
      var vs = r,
          s,
          v,
          h;
      if (g > vs) {
        vs = g;
      }
      if (b > vs) {
        vs = b;
      }
      var ms = r;
      if (g < ms) {
        ms = g;
      }
      if (b < ms) {
        ms = b;
      }
      var vm = vs - ms;
      var l = (ms + vs) / 510;
      if (l > 0) {
        if (vm > 0) {
          if (l <= 0.5) {
            s = vm / (vs + ms) * satMul;
            if (s > 1) {
              s = 1;
            }
            v = l * (1 + s);
          } else {
            s = vm / (510 - vs - ms) * satMul;
            if (s > 1) {
              s = 1;
            }
            v = l + s - l * s;
          }
          if (r === vs) {
            if (g === ms) {
              h = 5 + (vs - b) / vm + hue6;
            } else {
              h = 1 - (vs - g) / vm + hue6;
            }
          } else if (g === vs) {
            if (b === ms) {
              h = 1 + (vs - r) / vm + hue6;
            } else {
              h = 3 - (vs - b) / vm + hue6;
            }
          } else {
            if (r === ms) {
              h = 3 + (vs - g) / vm + hue6;
            } else {
              h = 5 - (vs - r) / vm + hue6;
            }
          }
          if (h < 0) {
            h += 6;
          }
          if (h >= 6) {
            h -= 6;
          }
          var m = l + l - v;
          var sextant = h >> 0;
          if (sextant === 0) {
            r = v * 255;
            g = (m + (v - m) * (h - sextant)) * 255;
            b = m * 255;
          } else if (sextant === 1) {
            r = (v - (v - m) * (h - sextant)) * 255;
            g = v * 255;
            b = m * 255;
          } else if (sextant === 2) {
            r = m * 255;
            g = v * 255;
            b = (m + (v - m) * (h - sextant)) * 255;
          } else if (sextant === 3) {
            r = m * 255;
            g = (v - (v - m) * (h - sextant)) * 255;
            b = v * 255;
          } else if (sextant === 4) {
            r = (m + (v - m) * (h - sextant)) * 255;
            g = m * 255;
            b = v * 255;
          } else if (sextant === 5) {
            r = v * 255;
            g = m * 255;
            b = (v - (v - m) * (h - sextant)) * 255;
          }
        }
      }
    }

    if (lightness < 0) {
      r *= lightp1;g *= lightp1;b *= lightp1;
    } else if (lightness > 0) {
      r = r * lightm1 + light255;
      g = g * lightm1 + light255;
      b = b * lightm1 + light255;
    }

    r = r < 0 ? 0 : r > 255 ? 255 : Math.round(r);
    g = g < 0 ? 0 : g > 255 ? 255 : Math.round(g);
    b = b < 0 ? 0 : b > 255 ? 255 : Math.round(b);

    var rh = r.toString(16);if (rh.length === 1) {
      rh = '0' + rh;
    }
    var gh = g.toString(16);if (gh.length === 1) {
      gh = '0' + gh;
    }
    var bh = b.toString(16);if (bh.length === 1) {
      bh = '0' + bh;
    }

    return rh + gh + bh;
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ChangeBrandColors.js.map

'use strict';

//Cookie module
App.Cookie = function () {
  "use strict";

  var init = function init() {
    EventMgr.bind('menuTypeChanged', updateMenuType);
    EventMgr.bind('groupChanged', updateMenu);
    EventMgr.bind('loadPage', beginCookie);
    EventMgr.bind('menuPositionChanged', updateMenuPos);
  },

  // get began cookie
  beginCookie = function beginCookie() {
    var menupane = getCookie('menupane'),
        mbar = getCookie('mbar'),
        menupos = getCookie('menupos'),
        cookie = {
      menupane: menupane,
      mbar: mbar,
      menupos: menupos
    };
    EventMgr.trigger('readCookie', cookie);
  },

  //update cookie menu type
  updateMenuType = function updateMenuType(e, data) {
    //check data?
    var name = 'mbar',
        re = new RegExp(pageInfo.product + '-' + pageInfo.level + '-' + '(all|popular|favorite)'),
        value = pageInfo.product + '-' + pageInfo.level + '-' + data,
        curCookie = getCookie(name);

    if (curCookie.match(re)) {
      value = curCookie.replace(re, value);
    } else {
      value = curCookie + ':' + value;
    }
    setCookie(name, value, 600);
  },

  // update cookie menu status items
  updateMenu = function updateMenu(e, data) {
    //check data?
    //new method for toogle?
    var groups = data.groups,
        value,
        name = 'menupane',
        curCookie = getCookie(name),
        re,
        keyVar;
    curCookie = curCookie.replace(/:+/g, ":");
    /* jslint forin:true */
    for (keyVar in groups) {
      re = new RegExp(groups[keyVar].level + '_' + groups[keyVar].id + '-' + '[01]');

      value = groups[keyVar].level + '_' + groups[keyVar].id + '-' + groups[keyVar].status;

      if (curCookie.match(re)) {
        curCookie = curCookie.replace(re, value);
      } else {
        if (curCookie !== '') {
          curCookie += ':' + value;
        } else {
          curCookie += value;
        }
      }
    }
    setCookie(name, curCookie, 600);
  },

  // update cookie menu position
  updateMenuPos = function updateMenuPos(e, data) {
    //check data?
    var name = 'menupos',
        re = new RegExp(pageInfo.product + '-' + pageInfo.level + '-' + '(open|closed)'),
        value = pageInfo.product + '-' + pageInfo.level + '-' + data.menupos,
        curCookie = getCookie(name);

    if (curCookie.match(re)) {
      value = curCookie.replace(re, value);
    } else {
      value = curCookie + ':' + value;
    }
    setCookie(name, value, 600);
  };
  return {
    init: init
  };
}();
//# sourceMappingURL=App.Cookie.js.map

'use strict';

/**
 * Dashboard block moving
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.DashboardDragAndDrop = function (window, $, EventMgr, App) {
  'use strict';

  var dashboardTabSel = '.b-form-page_view_dblock .i-form-page__title',
      dragObj = {},
      bPositions = [],
      bCount = {},
      pos = null,
      dragPos = null,
      after = false,
      lastMoveTime = 0;

  function init() {
    EventMgr.on($content(), dashboardTabSel, 'mousedown', drag);
    EventMgr.on($content(), dashboardTabSel, 'ontouchstart', drag);
  }

  function topBorder() {
    return $('#content').offset().top;
  }

  function $content() {
    return $('#content');
  }

  function $topCont() {
    return $('#dash-top');
  }

  function $leftCont() {
    return $('#dash-left');
  }

  function $rightCont() {
    return $('#dash-right');
  }

  function getDragPos(name) {
    var len = bPositions.length;
    for (var i = 0; i < len; i++) {
      if (bPositions[i].name === name) {
        return i;
      }
    }
  }

  function drag(e) {
    e = e || window.event;
    //get positions all blocks
    getPositions();
    if (dragObj.shadow !== undefined) {
      dragObj.shadow.remove();
    }
    var self = $(this).parent();
    dragObj.obj = self.parent();
    document.onmouseup = drop;
    if (document.captureEvents) {
      document.captureEvents(Event.MOUSEUP);
    }
    document.onmousemove = move;
    if (document.captureEvents) {
      document.captureEvents(Event.MOUSEMOVE);
    }
    document.ontouchend = drop;
    document.ontouchmove = move;
    if (e.touches) {
      dragObj.y = e.touches[0].pageY;
      dragObj.x = e.touches[0].pageX;
    } else {
      dragObj.y = e.clientY;
      dragObj.x = e.clientX;
    }

    var width = dragObj.obj[0].offsetWidth,
        height = dragObj.obj[0].offsetHeight,
        widthHeader = self.find('.i-form-page__title').width(),
        heightHeader = this.offsetHeight,
        heightBody = height - heightHeader,
        $shadow = $('<div class="dash-block-bg" style="width: ' + width + 'px; height: ' + height + 'px;"><div class="dash-block-bg-header" style="width: ' + widthHeader + 'px; height: ' + heightHeader + 'px;"></div><div class="dash-block-bg-body" style=" height: ' + heightBody + 'px;"></div></div>');

    if (dragObj.obj.hasClass('b-form-page_st_collapsed')) {
      $shadow.addClass('b-form-page_st_collapsed');
    }
    dragObj.obj.after($shadow);

    dragObj.shadow = $shadow;
    dragObj.name = dragObj.obj[0].getAttribute('data-tabid');
    dragPos = getDragPos(dragObj.name);
    var top = this.parentNode.parentNode.offsetTop,
        left = this.parentNode.parentNode.offsetLeft;

    dragObj.obj[0].style.left = left + 'px';
    dragObj.obj[0].style.top = top + 'px';
    dragObj.obj[0].style.width = width + 'px';
    dragObj.obj[0].style.height = height + 'px';
    dragObj.obj[0].style.position = 'absolute';
    dragObj.obj.addClass('movingBlock');
    if (e.preventDefault) {
      e.preventDefault();
    }

    blockEvent(e);
  }

  function move(e) {
    if (lastMoveTime - 0 === 0) {
      lastMoveTime = new Date().getTime();
    } else {
      var currentTime = new Date().getTime();
      if (currentTime - lastMoveTime < 50) {
        return;
      } else {
        lastMoveTime = currentTime;
      }
    }
    e = e || window.event;
    var x = null,
        y = null;
    if (e.touches !== undefined) {
      y = e.touches[0].pageY;
      x = e.touches[0].pageX;
    } else {
      y = e.clientY;
      x = e.clientX;
    }
    //moving block
    var curX = x - dragObj.x,
        curY = y - dragObj.y;
    if (Math.abs(curX) < 10 && Math.abs(curY) < 10) {
      return;
    }
    pos = null;
    dragObj.x = x;
    dragObj.y = y;
    var top = parseInt(dragObj.obj[0].style.top, 10),
        left = parseInt(dragObj.obj[0].style.left, 10);
    dragObj.obj[0].style.left = left + curX + 'px';
    dragObj.obj[0].style.top = top + curY + 'px';
    var len = bPositions.length;
    //moving shadow
    for (var i = 0; i < len; i++) {
      if (bPositions[i].x1 <= x && bPositions[i].x2 >= x && bPositions[i].y1 <= y && bPositions[i].y2 >= y) {
        //insert before
        // dragObj.shadow[0].style.width = bPositions[i].width;
        // bPositions[i].self.before(dragObj.shadow);
        pos = i;
        after = false;
        break;
      } else if (bPositions[i].x1 <= x && bPositions[i].x2 >= x && bPositions[i].y1 <= y && bPositions[i].y2 + 37 >= y) {
        //insert after
        //dragObj.shadow[0].style.width = bPositions[i].width;
        //bPositions[i].self.after(dragObj.shadow);
        pos = i;
        after = true;
        break;
      } else if (topBorder() >= y && bCount.top === 0) {
        //insert into TOP
        pos = 'TOP';
      } else if ($rightCont().offset().left <= x && $rightCont().offset().top <= y) {
        //insert into RIGHT
        pos = 'RIGHT';
      } else if ($rightCont().offset().left >= x && $rightCont().offset().top <= y) {
        //insert into LEFT
        pos = 'LEFT';
      }
    }
    if (pos !== null) {
      var content = App.Dom.byId('content');
      if (content === null) {
        return;
      }
      if (pos === 'TOP') {
        $topCont().append(dragObj.shadow);
        dragObj.shadow[0].style.width = content.offsetWidth - 36 + 'px';
      } else if (pos === 'LEFT') {
        $leftCont().append(dragObj.shadow);
        dragObj.shadow[0].style.width = (content.offsetWidth - 36) / 2 + 'px';
      } else if (pos === 'RIGHT') {
        $rightCont().append(dragObj.shadow);
        dragObj.shadow[0].style.width = (content.offsetWidth - 36) / 2 + 'px';
      } else {
        dragObj.shadow[0].style.width = bPositions[pos].width + 'px';
        if (after) {
          bPositions[pos].self.after(dragObj.shadow);
        } else {
          bPositions[pos].self.before(dragObj.shadow);
        }
      }
    }
    if (e.preventDefault) {
      e.preventDefault();
    }
    //for remove collapsed block handler
    App.Global.HeaderMoving = true;
    blockEvent(e);
  }

  function drop(e) {
    var rPos = false;
    e = e || window.event;
    document.onmousemove = null;
    document.onmouseup = null;
    document.ontouchmove = null;
    document.ontouchend = null;
    dragObj.obj.css('left', '').css('top', '').css('position', '').width('').height('').removeClass('movingBlock');
    if (pos !== null) {
      if (pos === 'TOP') {
        $topCont().append(dragObj.obj);
        dragObj.order = 9;
      } else if (pos === 'LEFT') {
        $leftCont().append(dragObj.obj);
        dragObj.order = 9;
      } else if (pos === 'RIGHT') {
        $rightCont().append(dragObj.obj);
        dragObj.order = 9;
      } else if (dragObj.name !== bPositions[pos].name) {
        rPos = true;
        if (after) {
          bPositions[pos].self.after(dragObj.obj);
          dragObj.order = bPositions[pos].order;
        } else {
          bPositions[pos].self.before(dragObj.obj);
          dragObj.order = bPositions[pos].order;
        }
      }
      //don't save if after or before self
      if (rPos) {
        if (pos !== dragPos) {
          if (after) {
            //check for next
            if (bPositions[dragPos + 1] !== undefined && bPositions[dragPos].pos === bPositions[pos].pos && bPositions[pos].order === bPositions[dragPos].order + 1) {} else {
              dragObj.order += 1;
            }
          }
          saveBlock(dragObj);
        }
      } else {
        saveBlock(dragObj);
      }

      setTimeout(function () {
        EventMgr.trigger('updateScroll', {});
      }, 100);
    }
    if (e.preventDefault) {
      e.preventDefault();
    }
    dragObj.shadow.remove();
    pos = null;
    //reload block after moved
    if (dragObj.obj.children('h3').attr('data-block-type') === 'report') {
      dragObj.obj.find('.dashblock-reload').trigger('click');
    }
  }
  //send position to server
  function saveBlock(dragObj) {
    var position = dragObj.obj.parents('.b-dashboard_cell').attr('data-pos'),
        order = dragObj.order,
        display = 'max',
        block = dragObj.name;
    if (dragObj.shadow.hasClass('collapsed')) {
      display = 'min';
    }
    var param = {
      func: 'dashboard.save', order: order,
      block: block, display: display, position: position },
        url = pageInfo.url;
    EventMgr.trigger('ajaxRequest', {
      url: url, param: param, trfunc: 'DoNothing', queue: 'noqueue' });
  }
  //get position each block in dashboard
  function getPositions() {

    bPositions = [];
    var leftCount = 0,
        rightCount = 0,
        topCount = 0,
        self,
        offset,
        posObj;

    $('#dash-top .b-form-page').each(function () {
      self = $(this);
      offset = self.offset();
      posObj = {
        x1: offset.left,
        x2: offset.left + self.width(),
        y1: offset.top,
        y2: offset.top + self.height(),
        width: self.width(),
        self: self,
        name: self.attr('data-tabid'),
        order: topCount++,
        pos: 'TOP'
      };
      bPositions.push(posObj);
    });
    $('#dash-left .b-form-page').each(function () {
      self = $(this);
      offset = self.offset();
      posObj = {
        x1: offset.left,
        x2: offset.left + self.width(),
        y1: offset.top,
        y2: offset.top + self.height(),
        width: self.width(),
        self: self,
        name: self.attr('data-tabid'),
        order: leftCount++,
        pos: 'LEFT'
      };
      bPositions.push(posObj);
    });
    $('#dash-right .b-form-page').each(function () {
      self = $(this);
      offset = self.offset();
      posObj = {
        x1: offset.left,
        x2: offset.left + self.width(),
        y1: offset.top,
        y2: offset.top + self.height(),
        width: self.width(),
        self: self,
        name: self.attr('data-tabid'),
        order: rightCount++,
        pos: 'RIGHT'
      };
      bPositions.push(posObj);
    });
    self = null;
    offset = null;
    posObj = null;
    bCount = {
      top: topCount,
      left: leftCount,
      right: rightCount
    };
  }

  return {
    init: init,
    bPositions: bPositions
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.DashboardDragAndDrop.js.map

'use strict';

/**
 * App.Deview модуль позволяет выводить ошибки или отладочную информацию, в виде небольшого блока сверху
 *
 * Использование:
 * EventMgr.trigger('pullMsg', {@String});
 *
 */
App.Deview = function () {
  'use strict';

  var init = function init() {
    EventMgr.bind('pullMsg', pullMsg);
    EventMgr.bind('loadPage', appendWrapper);
    EventMgr.on(mainWrapperSelector, msgCloseSelector, 'click', removeMsg);
    EventMgr.on(mainWrapperSelector, msgActionSelector, 'click', doAction);
  },
      i = 0,
      $msg = function $msg() {
    return $('.i-warning-banner__msg');
  },
      $msginner = function $msginner() {
    return $('.i-warning-banner__inner');
  },
      mainWrapperSelector = 'body',
      msgCloseSelector = '.i-warning-banner__close',
      msgActionSelector = '.i-warning-banner_has_action',

  //hide message
  removeMsg = function removeMsg(e, data) {
    clearTimeout(timeId);
    $msg().animate({
      opacity: '0.25',
      marginTop: '-50'
    });
    $msginner().removeClass('i-warning-banner_has_action b-warning-banner_has_action b-menu-item newtab').attr('data-url', '');
  },
      timeId = null,

  //show message
  pullMsg = function pullMsg(e, d) {
    i++;
    var msg = d.msg,
        timeOut = d.timeout || 9000,
        func = d.func || false,
        theme = d.theme || false;
    $msginner().html(msg);
    if (func) {
      $msginner().addClass('i-warning-banner_has_action b-warning-banner_has_action b-menu-item newtab').attr('data-url', '?func=' + func);
    }
    if (theme) {
      $msginner().addClass('b-warning-banner_has_action b-warning-banner_was_link').attr('href', '?theme=' + theme);
    }
    $msg().animate({
      opacity: '1',
      marginTop: '0'
    });
    clearTimeout(timeId);
    timeId = setTimeout(function () {
      $msg().animate({
        opacity: '0.25',
        marginTop: '-50'
      });
    }, timeOut);
  },
      doAction = function doAction(e) {
    removeMsg();
  },

  //append html wrapper for block
  appendWrapper = function appendWrapper() {
    var wrapper = '<div id="deviewer">' + '<div class="msg i-warning-banner__msg" style="margin-top: -50px;">' + '<a class="msginner i-warning-banner__inner"></a>' + '<img src="' + pageInfo.theme + 'img/tab_close.png" class="msgclose i-warning-banner__close"/>' + '</div>' + '</div>';
    $('#wrapper').append(wrapper);

    if (pageInfo && pageInfo.warning_notify) {
      EventMgr.trigger('pullMsg', pageInfo.warning_notify);
    }
  };
  return {
    init: init
  };
}();
//# sourceMappingURL=App.Deview.js.map

'use strict';

/**
 * Edit value in list module
 *
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} templates doT template
 */
/*global App:true*/
App.EditInList = function (window, $, EventMgr, App, templates) {
  'use strict';

  var init = function init() {
    EventMgr.on(contentSelector, editableFieldSelector, 'mouseover', showEditableIcon);
    EventMgr.on(contentSelector, editableFieldSelector, 'mouseout', hideEditableIcon);
    EventMgr.obind(editableIconSelector, 'mouseout', hideEditableIcon);
    EventMgr.obind(editableIconSelector, 'mouseover', selfShowEditableIcon);
    EventMgr.obind(editableIconSelector, 'click', openEditFieldForm);
    EventMgr.bind('ajaxResponseEditInList', cachedFormData);
    EventMgr.bind('ajaxResponseEditInListSave', responseSaveHandler);
    EventMgr.bind('ajaxResponseEditInListSaveFailed', responseSaveHandlerFailed);
    EventMgr.on(contentSelector, edittableOkBtnSelector, 'click', saveBtnHandler);
    EventMgr.on(contentSelector, edittableCancelBtnSelector, 'click', closeEditBtnHandler);
    EventMgr.on(contentSelector, edittableOverlay, 'click', closeEditBtnHandler);
    EventMgr.on(contentSelector, editTableFieldSelector, 'keydown', hotKeyHandler);
    EventMgr.obind($(document), 'keyup', removeKeyUp);
    EventMgr.bind('closeTabEvent', removeEditForm);
    EventMgr.bind('closeTabEvent', removeIndexCols);
    EventMgr.bind('changedTab', removeEditForm);
    EventMgr.bind('changedTab, appendList, appendForm, appendReport, appendMap', hideEditableIcon);
    EventMgr.bind('appendList', removeIndexCols);
    EventMgr.bind('failLoadForm', failLoadForm);
  },
      editableFieldSelector = '.editable',
      editableIconSelector = '#edit-filed-in-list',
      editTableFieldSelector = '.edit-field-form input[type="text"],' + ' .edit-field-form .b-textarea,' + ' .edit-field-form .b-textarea_for_zoom,' + ' .edit-field-form .b-myselect__select-selected .b-myselect__select-value,' + ' .edit-field-form .b-radio__control,' + ' .edit-field-form .b-checkbox__control',
      contentSelector = '#main-wrapper',
      edittableOkBtnSelector = '.i-btn-editlis-ok',
      edittableCancelBtnSelector = '.i-btn-editlis-cancel',
      edittableOverlay = '.i-tab-overlay_trig_editlist',
      $$editableIcon = function $$editableIcon() {
    return App.Dom.byId('edit-filed-in-list');
  },
      editingField = null,
      currentField = null,
      iconLeftPos = 0,

  //show icon under field when mouseover
  showEditableIcon = function showEditableIcon(e) {
    var self = $(this),
        offset = self.offset(),
        left = offset.left,
        top = offset.top,
        width = this.offsetWidth,
        editableIconElem = $$editableIcon();
    if (editableIconElem.className === 'active') {
      return;
    }
    currentField = self;
    iconLeftPos = left + width - 22;
    editableIconElem.style.left = iconLeftPos + 'px';
    editableIconElem.style.top = top + 'px';
    editableIconElem.style.display = 'block';
  },

  //show icon
  selfShowEditableIcon = function selfShowEditableIcon() {
    var editableIconElem = $$editableIcon();
    editableIconElem.style.display = 'block';
  },

  //hide icon
  hideEditableIcon = function hideEditableIcon() {
    var editableIconElem = $$editableIcon();
    if (editableIconElem.className !== 'active') {
      editableIconElem.style.display = 'none';
    }
  },
      templateBlock = function templateBlock(id) {
    return '<div id="editinlist-wrapper-' + id + '" class="edit-field-form"><div class="edit-field-form-loader"><img src="' + pageInfo.theme + 'img/loader.gif"/></div></div>';
  },
      editFormElemData = {},
      loading = {},
      editableCols = {},

  //get cols header for data
  getEditableCols = function getEditableCols(id) {
    var $tableTh = $('#lt-' + id + ' thead th');
    editableCols[id] = {};
    $tableTh.each(function (index) {
      if (this.getAttribute('data-edit-func')) {
        editableCols[id][index] = true;
      } else {
        editableCols[id][index] = false;
      }
    });
  },

  //open form edit
  openEditFieldForm = function openEditFieldForm() {
    editingField = currentField;
    var activeTab = currentField.parents('.tab-content'),
        funcName = activeTab.attr('data-func'),
        parentTd = currentField.parents('td'),
        index = parentTd.index(),
        $th = currentField.parents('table').find('th'),
        th = $th[index],
        colName = th.getAttribute('data-colname'),
        keyField = th.className.match('keyfield'),
        tabId = activeTab.attr('data-tabid'),
        parentTr = currentField.parents('tr'),
        elid = parentTr.attr('data-elid'),
        rowIndex = parentTr.attr('data-index'),
        plid = filterXSS.friendlyAttrValue($('#cont-' + activeTab.attr('data-tabid') + ' .toolbar').attr('data-plid') || ''),
        funcEdit = th.getAttribute('data-edit-func'),
        curObj = {
      tabId: tabId,
      funcName: funcName,
      colName: colName,
      elid: elid,
      plid: plid,
      funcEdit: funcEdit,
      parentTr: parentTr,
      index: index,
      rowIndex: rowIndex
    },
        tconvert;

    if (keyField) {
      tconvert = activeTab.find('.toolbar').attr('data-convert');
      curObj.tconvert = tconvert;
    }

    $$editableIcon().className = 'active';
    if (!loading[tabId]) {
      if (!editFormElemData[tabId]) {
        loadForm(curObj);
      } else {
        showForm(curObj);
      }
    }
  },

  //load form edit
  loadForm = function loadForm(curObj) {
    var url = pageInfo.url,
        param = { func: curObj.funcEdit,
      scolname: curObj.colName,
      stablename: curObj.funcName,
      stylesheet: 'editinlist',
      elid: curObj.elid
    };
    if (curObj.tconvert) {
      param.tconvert = curObj.tconvert;
    }
    if (curObj.plid) {
      param.plid = curObj.plid;
    }
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      invar: { id: curObj.tabId, curObj: curObj },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponseEditInList',
      failfunc: 'failLoadForm',
      queue: 'noqueue' });
    loading[curObj.tabId] = true;
  },

  //handler for failed request
  failLoadForm = function failLoadForm(e, data) {
    EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again.' });
    $$editableIcon().className = '';
  },

  //remember form structure
  cachedFormData = function cachedFormData(e, data) {
    var tabId = data.id,
        curObj = data.curObj,
        editFormElem = $(templateBlock(tabId));
    loading[curObj.tabId] = false;
    editFormElemData[tabId] = data;
    editFormElemData[tabId].eFwrapper = editFormElem;
    editFormElemData[tabId].eFwrapper.removeClass('active');
    editFormElemData[tabId].eFoverlay = $('#' + tabId + '-progressbar-overlay');
    showForm(curObj);
    //inser wrapper for form
    $('.i-report-wr').append(editFormElem);
    //$('#main-wrapper').append(editFormElem);
  },

  //show form edit
  showForm = function showForm(curObj) {
    if (!editFormElemData[curObj.tabId][curObj.colName]) {
      EventMgr.trigger('pullMsg', { msg: 'Not found field. Sorry...' });
      $$editableIcon().className = '';
      return;
    }
    var id = curObj.tabId,
        type = editFormElemData[id][curObj.colName].type,
        elemObj = editFormElemData[id][curObj.colName],
        value = editingField.hasClass('b-list__table-col-content') ? editingField.text() : editingField.find('.b-list__table-col-content').text(),


    //position target cell
    offset = editingField.offset(),
        top = offset.top,
        left = offset.left,
        wrapper = editFormElemData[id].eFwrapper,
        overlay = editFormElemData[id].eFoverlay,
        field = '',
        len,
        html;
    value = value.replace(/"/g, '&quot;');
    $$editableIcon().className = '';
    editFormElemData[id].eFsend = false;
    editFormElemData[id].curObj = curObj;
    editFormElemData[id].eFvalue = value;
    editFormElemData[id].editingField = editingField;
    //insert current row value in object structure
    if (type === 'text') {
      elemObj.attr = elemObj.sourceAttr;
      elemObj.value = value;
      elemObj.setvalue = '';
      elemObj.attr += ' value="' + value + '"';
    } else if (type === 'select' || type === 'radio') {
      if (value === '') {
        elemObj.value = '';
        elemObj.msg = elemObj.slist[0].value;
      } else {
        len = elemObj.slist.length;
        while (len--) {
          if (elemObj.slist[len].value === value) {
            elemObj.value = elemObj.slist[len].key;
            editFormElemData[id].eFvalue = elemObj.value;
            len = 0;
          }
        }
        elemObj.msg = value;
      }
    } else if (type === 'checkbox') {
      if (value === 'on') {
        elemObj.cbclass = 'checked';
      } else {
        elemObj.cbclass = '';
      }
      elemObj.value = value;
    } else {
      elemObj.value = value;
    }
    elemObj.id = id;
    //render elem
    if (type === 'text') {
      if (elemObj.unlimit) {
        field += '<div class="b-input-btn b-input-btn_type_unlimit"  data-control-field="' + elemObj.name + '"></div>';
      } else if (elemObj.date) {
        field += '<div class="b-input-btn b-input-btn_type_calendar"  data-control-field="' + elemObj.name + '"></div>';
      }
      if (elemObj.zoom) {
        field += '<div class="b-input-btn b-input-btn_type_zoom"  data-control-field="' + elemObj.name + '"></div>';
        elemObj.textareaClasses = ' b-textarea_for_zoom';
        field += templates.formItemInputWithZoom1(elemObj);
      } else {
        field += templates.formItemInput(elemObj);
      }
      //} else if (type === 'checkbox') {
      //field = templates.formItemCheckbox(elemObj);
    } else if (type === 'textarea') {
      elemObj.third = '';
      elemObj.hint = '';
      field = templates.formItemTextarea(elemObj);
    } else if (type === 'slider') {
      elemObj.tabId = id;
      field = templates.formItemSliderEditInList(elemObj);
      setTimeout(function () {
        EventMgr.trigger('appendEditInList', {
          tabId: id });
      }, 100);
    } else if (type === 'select') {
      field = templates.formItemSelect(elemObj);
    } else if (type === 'radio') {
      field = templates.formItemRadio(elemObj);
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Not found field. Sorry...' });
      $$editableIcon().className = '';
      return;
    }
    for (var keyVar in editFormElemData[id]) {
      if (editFormElemData[id][keyVar].type === 'hidden') {
        field += '<' + editFormElemData[id][keyVar].attr + '/>';
      }
    }
    // set position for edit form
    wrapper.css('top', top + 'px');
    wrapper.css('left', left + 'px');
    //currentField.addClass('editing-field');
    html = templates.editinListForm({
      field: field,
      elid: String(curObj.elid).replace(/"/g, '&quot;'),
      id: id,
      func: curObj.funcEdit });
    wrapper.html(html);
    wrapper.show();
    overlay.addClass('i-tab-overlay_trig_editlist' + ' b-tab-overlay_show_edlist');
    //overlay.show();
    checkPosition(wrapper, left);
    setTimeout(function () {
      checkPosition(wrapper, left);
    }, 30);
    setTimeout(function () {
      focusOnField(elemObj);
    }, 100);
  },

  //check position for wrapper
  checkPosition = function checkPosition(elem, left) {
    var width = elem.width(),
        windowWidth = window.innerWidth,
        PADDING = 12,
        diff = windowWidth - (left + width + PADDING);
    if (diff < 0) {
      left = left + diff - 16;
      elem.css('left', left + 'px');
    }
  },

  //set focus on field [stable function]
  focusOnField = function focusOnField(obj) {
    var wrapperSelector = '#editinlist-wrapper-';
    if (obj.type === 'text' || obj.type === 'slider' || obj.type === 'textarea') {
      $(wrapperSelector + obj.id + ' ' + '[name="' + obj.name + '"]').focus();
    } else if (obj.type === 'select') {
      $(wrapperSelector + obj.id + ' ' + 'div[data-id="' + obj.name + '"]  .b-myselect__select-value').focus();
    } else if (obj.type === 'radio') {
      $(wrapperSelector + obj.id + ' ' + 'div[data-id="' + obj.name + '"][tabindex="0"]').focus();
    } else if (obj.type === 'checkbox') {
      $(wrapperSelector + obj.id + ' ' + 'input[data-id="' + obj.name + '"]').focus();
    }
  },

  //close btn handler
  closeEditBtnHandler = function closeEditBtnHandler() {
    var id = this.getAttribute('data-id');
    if (!id) {
      id = this.getAttribute('data-tabid');
      //for radio and checkboxes
    } else if (!id.match(/tab/)) {
      id = this.getAttribute('data-tabid');
    }
    closeEdit(id);
  },

  //hide edit form
  closeEdit = function closeEdit(id) {
    if (editFormElemData[id]) {
      editFormElemData[id].eFwrapper.hide();
      //          editFormElemData[id].eFoverlay.hide();
      editFormElemData[id].eFoverlay.removeClass('b-tab-overlay_show_edlist' + ' i-tab-overlay_trig_editlist');
    }
  },

  //save btn handler
  saveBtnHandler = function saveBtnHandler(e, nextStep) {
    var id = this.getAttribute('data-tabid');
    if (id === undefined || id === null) {
      id = this.getAttribute('data-id');
    }
    saveValue(id, nextStep);
  },

  //save value if it changed
  saveValue = function saveValue(id, nextStep) {
    if (!editFormElemData[id].eFsend) {
      var $form = $('#editinlist-form-' + id),
          param = $form.serializeObject();
      if (editFormElemData[id].eFvalue !== param[editFormElemData[id].curObj.colName]) {
        EventMgr.trigger('ajaxRequest', {
          param: param,
          invar: { id: id,
            tabId: id,
            nextStep: nextStep,
            value: param[editFormElemData[id].curObj.colName] },
          type: 'post',
          outtype: 'json',
          trfunc: 'ajaxResponseEditInListSave',
          failfunc: 'ajaxResponseEditInListSaveFailed',
          queue: 'noqueue' });
        editFormElemData[id].eFsend = true;
        editFormElemData[id].eFwrapper.addClass('active');
      } else {
        responseSaveHandler.apply({}, [{}, {
          ok: true,
          id: id,
          nextStep: nextStep }]);
      }
    }
  },

  //
  responseSaveHandlerFailed = function responseSaveHandlerFailed(e, data) {
    if (data.erType === 'json') {
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error. Func: "' + data.param.func + '"' });
    } else {
      EventMgr.trigger('pullMsg', { msg: 'Request failed. Try again. Func: "' + data.param.func + '"' });
    }
    var id = data.invar.id;
    editFormElemData[id].eFsend = false;
    editFormElemData[id].eFwrapper.removeClass('active');
  },

  //hide edit form if ok, else will show error
  responseSaveHandler = function responseSaveHandler(e, data) {
    var id = data.id,
        ok = data.ok,
        value = data.value,
        error = data.error,
        errorMsg = data.ermsg,
        nextStep = data.nextStep,
        elid = data.elid,
        elname = data.elname,
        curObj = editFormElemData[id].curObj,
        nameElem = curObj.colName,
        len,
        elemObj = editFormElemData[id][nameElem],
        op = {};
    editFormElemData[id].eFvalue = value;
    if (ok) {
      if (elemObj.type === 'select' || elemObj.type === 'radio') {
        len = elemObj.slist.length;
        while (len--) {
          if (elemObj.slist[len].key === value) {
            value = elemObj.slist[len].value;
          }
        }
      }
      // вставляем значения в таблицу
      if (editFormElemData[id].editingField.hasClass('b-list__table-col-content')) {
        editFormElemData[id].editingField.html(window.filterXSS(value));
      } else {
        editingField.find('.b-list__table-col-content').html(window.filterXSS(value));
      }
      editFormElemData[id].eFwrapper.removeClass('active');
      closeEdit(id);
      if (elid) {
        //think jquery escape quotes
        curObj.parentTr.attr('data-elid', elid);
        if (elname) {
          curObj.parentTr.attr('data-elkeyname', elname);
        }
      }
      if (nextStep !== undefined) {
        op.index = curObj.index;
        op.direction = nextStep;
        op.elid = curObj.elid;
        op.tr = curObj.parentTr;
        op.id = id;
      }
      if (nextStep !== undefined) {
        editNextValue(op);
      }
      //update list model
      if (data.__content && data.__content[curObj.rowIndex] && data.__content[curObj.rowIndex][nameElem]) {
        data.__content[curObj.rowIndex][nameElem].v = value;
        EventMgr.trigger('updateTotalList', {
          tabId: id,
          index: curObj.index,
          colName: nameElem });
      }
    } else if (error) {
      $('#err-cont-' + id).html('<div class="b-error-box">' + '<div class="b-error-box__top-triangle"></div>' + '<div class="b-error-box__inner">' + errorMsg + '</div></div>');
      editFormElemData[id].eFsend = false;
      editFormElemData[id].eFwrapper.removeClass('active');
    }
  },

  //find next/prev/right/left edit cell
  editNextValue = function editNextValue(op) {
    var prev, next, run, i, cols, nextElem;
    if (op.direction === 'up') {
      prev = op.tr.prev();
      if (prev.length !== 0) {
        var prevElem = prev.find('.data')[op.index];
        if (!prevElem.className.match(/editable/)) {
          currentField = $(prevElem).parent();
        } else {
          currentField = $(prevElem);
        }
        openEditFieldForm.apply();
      }
    } else if (op.direction === 'down') {
      next = op.tr.next();
      if (next.length !== 0) {
        nextElem = next.find('.data')[op.index];
        if (!nextElem.className.match(/editable/)) {
          currentField = $(nextElem).parent();
        } else {
          currentField = $(nextElem);
        }
        openEditFieldForm.apply();
      }
    } else if (op.direction === 'right') {
      if (!editableCols[op.id]) {
        getEditableCols(op.id);
      }
      run = true;
      i = op.index;
      cols = editableCols[op.id];
      while (run) {
        i++;
        if (cols[i]) {
          run = false;
          nextElem = op.tr.find('.data')[i];
          if (!nextElem.className.match(/editable/)) {
            currentField = $(nextElem).parent();
          } else {
            currentField = $(nextElem);
          }
          openEditFieldForm.apply();
        } else if (cols[i] === undefined) {
          run = false;
        }
      }
    } else if (op.direction === 'left') {
      if (!editableCols[op.id]) {
        getEditableCols(op.id);
      }
      run = true;
      i = op.index;
      cols = editableCols[op.id];

      while (run) {
        i--;
        if (cols[i]) {
          run = false;
          nextElem = op.tr.find('.data')[i];
          if (!nextElem.className.match(/editable/)) {
            currentField = $(nextElem).parent();
          } else {
            currentField = $(nextElem);
          }
          openEditFieldForm.apply();
        } else if (cols[i] === undefined) {
          run = false;
        }
      }
    }
  },
      keys = [],
      ENTER_KEY = 13,
      ESC_KEY = 27,
      UP_KEY = 38,
      DOWN_KEY = 40,
      TAB_KEY = 9,
      SHIFT_KEY = 16,
      CTRL_KEY = 17,
      ZERO = 0,

  //hot key controller
  hotKeyHandler = function hotKeyHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode,
        textarea;
    keys[codeKey] = true;
    if (keys[ENTER_KEY]) {
      textarea = this.className.match(/b-textarea/g);
      if (!textarea || textarea && e.ctrlKey) {
        e.preventDefault();
        saveBtnHandler.apply(this, [{}, 'down']);
      }
    } else if (keys[ESC_KEY]) {
      e.preventDefault();
      e.stopPropagation();
      closeEditBtnHandler.apply(this);
    } else if (keys[UP_KEY] && keys[CTRL_KEY]) {
      e.preventDefault();
      saveBtnHandler.apply(this, [{}, 'up']);
    } else if (keys[DOWN_KEY] && keys[CTRL_KEY]) {
      e.preventDefault();
      saveBtnHandler.apply(this, [{}, 'down']);
    } else if (keys[UP_KEY]) {
      if (!this.className.match(/b-myselect__select-value|b-radio__control|b-input_for_slider|b-textarea/g)) {
        e.preventDefault();
        saveBtnHandler.apply(this, [{}, 'up']);
      }
    } else if (keys[DOWN_KEY]) {
      if (!this.className.match(/b-myselect__select-value|b-radio__control|b-input_for_slider|b-textarea/g)) {
        e.preventDefault();
        saveBtnHandler.apply(this, [{}, 'down']);
      }
    } else if ((keys[SHIFT_KEY] || keys[ZERO]) && keys[TAB_KEY]) {
      e.preventDefault();
      saveBtnHandler.apply(this, [{}, 'left']);
    } else if (keys[TAB_KEY]) {
      e.preventDefault();
      saveBtnHandler.apply(this, [{}, 'right']);
    }
  },
      removeKeyUp = function removeKeyUp(e) {
    var codeKey = e.which || e.keyCode;
    if (keys[ZERO]) {
      delete keys[ZERO];
    }
    if (keys[codeKey]) {
      delete keys[codeKey];
    }
  },

  //handler for ext events
  removeEditForm = function removeEditForm(e, data) {
    var tabId = data.prevTabId || data.tabId;
    closeEdit(tabId);
  },
      removeIndexCols = function removeIndexCols(e, data) {
    var id = data.tabId;
    if (!id) {
      id = data.tabId;
    }
    if (editFormElemData[id]) {
      editFormElemData[id].eFwrapper.remove();
      delete loading[id];
      delete editFormElemData[id];
      delete editableCols[id];
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App, templates);
//# sourceMappingURL=App.EditInList.js.map

'use strict';

/**
 * Модуль фильтра в списке
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 * @param {object} templates HTML templates
 */
App.FilterList = function (window, $, EventMgr, App, templates) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendFilter', getFilter);
    EventMgr.bind('ajaxFilterResponse', gotFilterData);
    EventMgr.bind('closeTabEvent', clearCache);
    EventMgr.on($mainWrapper(), submitFilterBtnSelector, 'click', submitFilterForm);
    EventMgr.on($mainWrapper(), filterBtnSelector, 'click', showHideFilter);
    EventMgr.on($mainWrapper(), resetFilterSelector, 'click', resetFilter);
    EventMgr.on($mainWrapper(), editFilterBtnSelector, 'click', showHideFilter);
    EventMgr.on($mainWrapper(), clearFilterBtnSelector, 'click', clearFilter);
    EventMgr.on($mainWrapper(), saveFilterBtnSelector, 'click', saveFilter);
    EventMgr.on($mainWrapper(), nameFilterSel, 'keyup', syncName);
    EventMgr.on($mainWrapper(), nameFilterSel, 'change', saveName);
    EventMgr.on($mainWrapper(), removeFilterSel, 'click', removeFilter);
    EventMgr.on($mainWrapper(), editFilterSel, 'click', editFilterName);
    EventMgr.on($mainWrapper(), nameFilterSel, 'blur', closeEditFilterName);
    EventMgr.on($mainWrapper(), applyFilterSel, 'click', applySavedFilter);
    EventMgr.obind($(window), 'resize', resizeWindowHandler);
    EventMgr.bind('loadPage', insertFastFilterIcon);
    EventMgr.on($mainWrapper(), filterFieldSelector, 'mouseover', showFastFilterIcon);
    EventMgr.on($mainWrapper(), filterFieldSelector, 'mouseout', hideFastFilterIcon);
    EventMgr.bind('appendForm,appendList,appendReport,closeTabEvent', hideFastFilterIcon);
  },
      pageInfo = window.pageInfo,
      CACHE = {},
      $mainWrapper = function $mainWrapper() {
    return App.u.selectorCache('.i-list-wr');
  },
      $overlay = function $overlay(tabId) {
    return $('#' + tabId + '-progressbar-overlay');
  },
      submitFilterBtnSelector = '.b-button__filter-set',
      resetFilterSelector = '.b-button__filter-reset',
      editFilterBtnSelector = '.b-button__filter-change, .i-filter-applied',
      clearFilterBtnSelector = '.b-button__filter-clear',
      filterBtnSelector = '.tab-content_st_active .filter-btn',
      saveFilterBtnSelector = '.b-button__filter-save',
      nameFilterSel = '.b-filter__saved-name-edit',
      removeFilterSel = '.b-filter__saved-remove',
      editFilterSel = '.b-filter__saved-edit',
      applyFilterSel = '.b-filter__saved-name',
      filterIconSelector = '#b-fast-filter-icon',
      filterFieldSelector = '.i-filter-field',
      filterBtnIconSelector = '.b-filter__toggle',
      disabledBtnClass = 'b-button_st_disabled',
      disabledFilterIconClass = 'b-filter__toggle_is_disabled',


  //handler for submit form
  submitFilterForm = function submitFilterForm(e, data) {
    var tabId = this.getAttribute('data-tabid'),
        param = $('#frm-' + tabId).serializeObject();
    param.sok = 'ok';
    this.value = this.getAttribute('data-disabled');
    this.className += ' b-button_st_disabled';
    e.preventDefault();
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { tabId: tabId, __src: 'filterset' },
      trfunc: 'reloadTab',
      outtype: 'json',
      queue: 'filter' + tabId });
  },

  // Show/hide filter
  showHideFilter = function showHideFilter(e) {
    if ($(filterIconSelector).hasClass(disabledFilterIconClass)) {
      return;
    }
    var activeTab = $('.tab-content_st_active');
    activeTab.toggleClass('filter-hide').toggleClass('filter-opened');
    var tabId = activeTab.attr('data-tabid');
    //if show
    if (!activeTab.hasClass('filter-hide')) {
      EventMgr.trigger('setFocus', { tabId: tabId });
      setTimeout(function () {
        EventMgr.trigger('updateHorizScrollControl', {
          id: 'filter-' + tabId });
        $('#frm-' + tabId + ' .b-mselect__view-value').each(function () {
          var id = this.getAttribute('data-id');
          ScrollHandler.attach(this.id, id + '-ms-view', tabId, true);
        });
      }, 50);
      $overlay(tabId).on('click', showHideFilter).addClass('b-tab-overlay_st_filter');
    } else {
      $overlay(tabId).off('click', showHideFilter).removeClass('b-tab-overlay_st_filter');
    }
    EventMgr.trigger('updTableHeight');
    EventMgr.trigger('updateTipPosition');
    e.preventDefault();
    e.stopPropagation();
  },

  //get filter after load list
  getFilter = function getFilter(e, data) {
    var tabId = data.tabId,
        func = data.func,
        param = {};
    if (data.listParam.filter === 'on') {
      param = $.extend(param, data.listParam);
    }
    param.func = func;
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { tabId: tabId },
      trfunc: 'ajaxFilterResponse',
      outtype: 'json',
      queue: 'noqueue' });
  },

  //reset filter
  resetFilter = function resetFilter(e) {
    e.preventDefault();
    //for not open filter form
    e.stopPropagation();
    var tabId = $('.tab-content_st_active').attr('data-tabid'),
        func = $('#frm-' + tabId + ' input[name="func"]').val(),
        param = { func: func, sok: 'ok', drop: 'on' };
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { tabId: tabId, __src: 'filterset' },
      trfunc: 'reloadTab',
      outtype: 'json',
      queue: 'noqueue' });
    this.className += ' b-button_st_disabled';
  },

  //clear filter values
  clearFilter = function clearFilter(e) {
    var tabId = this.getAttribute('data-tabid'),
        type,
        id,
        dType;
    $('#frm-' + tabId).find('input').each(function () {
      type = this.type;
      dType = this.getAttribute('data-type');
      //input[type=text]
      if (type === 'text') {
        this.value = '';
        //checkbox
      } else if (type === 'hidden' && dType === 'checkbox') {
        this.value = 'off';
        $('#frm-' + tabId + ' [data-id = "' + this.name + '"]').removeClass('checked');
        //select
      } else if (type === 'hidden' && dType === 'select') {
        id = this.id.replace('-val', '');
        $('#frm-' + tabId + ' ul[data-id = "' + id + '"] li:first').trigger('click');
        //multiselect
      } else if (type === 'hidden' && dType === 'multiple') {
        id = this.getAttribute('data-id');
        EventMgr.trigger('multiSelectUnselect', { id: id });
        // $('#' + id + '-ms').find('.b-input-btn_type_minus')
        //    .trigger('click');
      }
    });
    EventMgr.trigger('setFocus', { tabId: tabId });
    e.preventDefault();
  },
      makeFilterParams = function makeFilterParams(model, tabId) {
    var param = '',
        $permaLink = $('#permalink-' + tabId),
        defLink = $permaLink.attr('href');
    for (var key in model) {
      if (model[key].value) {
        if (model[key].type === 'select') {
          if (model[key].slist && model[key].slist[0] && model[key].slist[0].key !== model[key].value) {
            param += '&' + key + '=' + model[key].value;
          }
        } else if (model[key].type === 'checkbox' && model[key].value === 'off') {
          //ignore 
        } else {
          param += '&' + key + '=' + model[key].value;
        }
      }
    }
    if (param) {
      param += '&filter=on';
      $permaLink.attr('data-clipboard-text', defLink + param);
    }
  },
      gotFilterData = function gotFilterData(e, data) {
    //check for new msg
    if (data.msg) {
      $.extend(App.u.msg, data.msg);
    }
    var tabId = data.tabId,
        cols = calcFilterGrid(getSizeOfFilter()),
        formItems = data.form[0].formItems,
        form = renderFormItems(formItems, tabId, cols, data.func);

    makeFilterParams(form.model, tabId);

    CACHE[tabId] = {
      model: form.model,
      renderObject: formItems,
      cols: cols
    };
    //check for filter cols
    if (form.model && form.model.__formItemsLen > 0) {
      renderWrapperFilter(data, form.html);
      renderSavedFilter(data);
      showFilterIcons(formItems, tabId);
      enableFilterButtons();
    } else {
      //hide & remove all filter boxes
      $('#cont-' + tabId).removeClass('filter').find('.filter-active').remove();
      EventMgr.trigger('updTableHeight');
    }
  },
      getSizeOfFilter = function getSizeOfFilter() {
    var filterWrapperSel = '.b-content',
        width = $(filterWrapperSel).width(),
        PADDING = 20 + 16;

    return width - PADDING;
  },
      calcFilterGrid = function calcFilterGrid(wrapperWidth) {
    var BTNWIDTH = wrapperWidth > 960 ? 150 : 10,
        ROWWIDTH = 348,
        PADDINGLEFT = 12,
        PADDINGRIGHT = 60,
        acceptWidth = wrapperWidth - BTNWIDTH - PADDINGLEFT,
        cols = parseInt(acceptWidth / ROWWIDTH, 10);
    if (cols > 1) {
      cols = parseInt((acceptWidth - PADDINGRIGHT * (cols - 1)) / ROWWIDTH, 10);
    }
    return cols;
  },
      timeId,
      resizeWindowHandler = function resizeWindowHandler() {
    clearTimeout(timeId);
    timeId = setTimeout(function () {
      updateFilterGrid();
    }, 200);
  },
      updateFilterGrid = function updateFilterGrid() {
    if (CACHE) {
      var cols = calcFilterGrid(getSizeOfFilter()),
          filter;
      /* jslint forin:true */
      for (var key in CACHE) {
        filter = CACHE[key];
        if (filter.cols !== cols) {
          filter.cols = cols;
          updateFilterForm(key);
        }
      }
    }
  },

  /**
   * Сделать доступными кнопки фильтра
   */
  enableFilterButtons = function enableFilterButtons() {
    $(resetFilterSelector).removeClass(disabledBtnClass);
    $(editFilterBtnSelector).removeClass(disabledBtnClass);
    $(filterBtnIconSelector).removeClass(disabledFilterIconClass);
  },
      updateFilterForm = function updateFilterForm(tabId) {
    if (CACHE[tabId] && CACHE[tabId].renderObject) {
      var rowsInCols = Math.ceil(CACHE[tabId].model.__formItemsLen / CACHE[tabId].cols),
          curElem = 0,
          curCol = 1;
      $('#filter-' + tabId + ' .filter-item').each(function () {
        curElem++;
        $('#filter-' + tabId + ' .filter-table_n_' + curCol).append(this);
        if (curElem === rowsInCols) {
          curElem = 0;
          curCol++;
        }
      });
    }
  },
      renderSavedFilter = function renderSavedFilter(data) {
    var filterList = data.savedFilters,
        tabId = data.tabId;
    if (filterList && filterList.length > 0) {
      var l = filterList.length,
          savedFilters = '';
      for (var i = 0; i < l; i++) {
        savedFilters += templates.filterSavedItem({
          name: filterList[i],
          id: 'tid' + new Date().getTime() + i,
          func: data.func,
          tabId: tabId,
          active: data.savedFilterAct === filterList[i]
        });
      }
      $('#cont-' + tabId + ' .b-filter__save-bar').addClass('b-filter__save-bar_has_items');
      $('#cont-' + tabId + ' .b-filter__save-bar-inner').append($(savedFilters));
      //bind horizontal scroll
      setTimeout(function () {
        EventMgr.trigger('bindHorizScrollControl', {
          leftBtn: '#cont-' + tabId + ' .b-filter__btn-move_dir_left',
          rightBtn: '#cont-' + tabId + ' .b-filter__btn-move_dir_right',
          actElem: '#cont-' + tabId + ' .b-filter__saved-item_st_active',
          innerBox: '#cont-' + tabId + ' .b-filter__save-bar-inner',
          id: 'filter-' + tabId
        });
      }, 50);
    }
  },

  //render filter items
  renderWrapperFilter = function renderWrapperFilter(data, formHtml) {
    var filter = {},
        tabId = data.tabId,
        html;
    filter.title = data.title;
    filter.form = formHtml;
    filter.tabId = data.tabId;
    filter.func = data.func;
    filter.disabled = data.formflags.disabledText;
    filter.filterMsg = data.filterMsg;
    filter.sfname = data.savedFilterAct;
    html = templates.filterWrapper(filter);
    $('#filter-' + data.tabId).html(html);
    EventMgr.trigger('appendedFilter', { tabId: tabId });
  },

  //show filter icon for col if filter applied
  showFilterIcons = function showFilterIcons(formItems, tabId) {
    var length = formItems.length,
        i = 0,
        name,
        value,
        filterIcon,
        showIcon,
        fastFilter,
        delimiter = '=',
        type,
        sLen,
        ind = 0;
    for (i = 0; i < length; i++) {
      if (formItems[i][0] !== undefined) {
        name = formItems[i][0].name;
        value = formItems[i][0].value;
        type = formItems[i][0].type;
        showIcon = false;
        fastFilter = false;
        //chekc for empty value
        if (value !== '') {
          showIcon = true;
        }
        if (type === 'select' || type === 'mselect') {
          fastFilter = true;
        }
        if (type === 'select' && value === '*') {
          showIcon = false;
        } else if (type === 'select' && value !== '*') {
          if (formItems[i][0].slist) {
            sLen = formItems[i][0].slist.length;
            while (sLen--) {
              if (formItems[i][0].slist[sLen].key === value) {
                value = formItems[i][0].slist[sLen].value;
                if (sLen === 0) {
                  showIcon = false;
                }
                break;
              }
            }
          }
        } else if (type === 'checkbox' && value === 'off') {
          showIcon = false;
        } else if (type === 'mselect' && formItems[i][0].slist) {
          value = '';
          ind = 0;
          for (var j = 0, l = formItems[i][0].slist.length; l > j; j++) {
            if (formItems[i][0].values && formItems[i][0].values[j]) {
              if (ind !== 0) {
                value += ' | ';
              }
              value += formItems[i][0].slist[j].value;
              ind++;
            }
          }
          if (value === '') {
            showIcon = false;
          }
        }
        if (showIcon) {
          if (formItems[i][0].delimiter) {
            delimiter = formItems[i][0].delimiter;
          }
          filterIcon = $('#sort_table-' + tabId + ' [data-colname="' + name + '"] .filter-icon');
          filterIcon.attr('data-hint', delimiter + ' "' + value + '"');
          filterIcon.addClass('active');
        }
        if (fastFilter) {
          if (!formItems[i][0].period) {
            $('#lt-' + tabId).find('.b-list__table-col_name_' + name).addClass('i-filter-field');
          }
        }
      }
    }
  },

  //render filer items
  renderFormItems = function renderFormItems(formItems, id, cols, func) {
    var html = '',
        row = '',
        maxCols = 5,
        index = 0,
        formItemsLen = formItems.length,
        j,
        formItemLen,
        k,
        formItem,
        formRow,
        classes,
        model = {},
        rowsInCols = Math.ceil((formItemsLen - 1) / cols);
    //-1 when 1st elem is empty for valid json
    model.__formItemsLen = formItemsLen - 1;
    for (j = 1; j < formItemsLen; j++) {
      formItemLen = formItems[j].length;
      formItem = formItems[j];

      for (k = 0; k < formItemLen; k++) {
        model[formItem[k].name] = formItems[j][k];
        formRow = {};
        formRow.first = '';
        formRow.second = '';
        formRow.hide = formItem[k].hide || {};
        formRow.show = formItem[k].show || {};
        formRow.classes = formItem[k].dependFields;
        if (formItem[k].show !== undefined) {
          if (formItem[k].shadow) {
            formRow.classes += ' depended-shadow-s';
          } else {
            formRow.classes += ' depended-hidden-s';
          }
        }
        classes = '';
        formItem[k].id = id;
        //render label
        if (formItem[k].label) {
          formRow.first += templates.filterItemLabel({
            label: formItem[k].label,
            name: formItem[k].name,
            func: func,
            classes: '' });
        }
        if (formItem[k].value) {
          formItem[k].value = formItem[k].value.replace(/"/g, '&quot;');
        }
        //render input text ||hidden || password
        if (formItem[k].type === 'text' || formItem[k].type === 'hidden' || formItem[k].type === 'password') {
          formItem[k].classes = classes;
          if (formItem[k].date) {
            formRow.second += '<div class="b-input-btn b-input-btn_type_calendar hint" data-hint="' + formItem[k].hintBtn + '"  data-control-field="' + formItem[k].name + '"></div>';
          }
          if (!formItem[k].zoom) {
            formRow.second += templates.formItemInput(formItem[k]);
          } else {
            formRow.second += '<div class="b-input-btn b-input-btn_type_zoom hint"' + ' data-hint="' + formItem[k].hintBtn + '" ' + 'data-control-field="' + formItem[k].name + '"></div>';
            formItem[k].inputAttr = formItem[k].attr;
            formItem[k].inputClasses = classes;
            formItem[k].inputName = formItem[k].name;
            formItem[k].textareaClasses = ' b-textarea_for_zoom';
            formRow.second += templates.formItemInputWithZoom(formItem[k]);
          }
        } else if (formItem[k].type === 'select') {
          //render select
          formRow.second += templates.formItemSelect(formItem[k]);
        } else if (formItem[k].type === 'aselect') {
          //render select autocomplete
          formRow.second += templates.formItemSelectAutocomplete(formItem[k]);
        } else if (formItem[k].type === 'checkbox') {
          formRow.second += templates.formItemCheckbox(formItem[k]);
        } else if (formItem[k].type === 'mselect') {
          formRow.second += templates.formItemMSelect(formItem[k]);
        }
        //render extra btn
        row += templates.filterItem(formRow);
        if (j % rowsInCols === 0 && rowsInCols !== 1) {
          index++;
          html += templates.filterRow({ content: row, index: index });
          row = '';
        }
      }
    }
    if (row !== '') {
      index++;
      html += templates.filterRow({ content: row, index: index });
    }
    //render ended cols
    maxCols -= cols;
    for (var n = 0; n < maxCols; n++) {
      index++;
      html += templates.filterRow({ content: '', index: index });
    }
    return {
      html: html,
      model: model
    };
  },
      addNewFilter = function addNewFilter(tabId, tid, filterFunc) {
    var $savedFilter = $('#cont-' + tabId + ' .b-filter__saved-name-edit'),
        $currentFilter = $('#cont-' + tabId + ' .b-filter__saved-item_st_active .b-filter__saved-name-edit'),
        l = $savedFilter.length,
        N = l + 1,
        filterName;
    if ($currentFilter.length > 0) {
      filterName = $currentFilter.val();
    } else {
      filterName = getFilterName(N, $savedFilter);
    }
    return filterName;
  },
      getFilterName = function getFilterName(index, savedFilters) {
    var name = App.u.msg.filterName + ' ' + index,
        exist = false;
    savedFilters.each(function () {
      if (this.value === name) {
        exist = true;
        index++;
        return;
      }
    });

    return exist ? getFilterName(index, savedFilters) : name;
  },
      saveFilter = function saveFilter(e) {
    e.preventDefault();
    var tabId = this.getAttribute('data-id'),
        param = $('#frm-' + tabId).serializeObject(),
        tid = 'tid' + new Date().getTime(),
        filterFunc = param.func,
        filterName = addNewFilter(tabId, tid, filterFunc);
    /* jslint camelcase: false */
    param.faction = 'save';
    param.fname = filterName;
    param.sok = 'ok';
    /* jslint camelcase: true */
    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { tabId: tabId, tid: tid },
      trfunc: 'reloadTab',
      outtype: 'json',
      queue: 'filter' + tabId });
    EventMgr.trigger('updTableHeight');
  },

  /**
   * remove saved filter
   * @param {object} e
   * @this {object}
   */
  removeFilter = function removeFilter(e) {
    e.preventDefault();
    var id = this.getAttribute('data-id'),
        elem = App.Dom.byId('b-filter__saved-name-edit_tid_' + id),
        param = {};
    if (!elem) {
      return;
    }
    param.fname = elem.value;
    param.func = elem.getAttribute('data-func');
    if (this.parentNode) {
      this.parentNode.parentNode.removeChild(this.parentNode);
    }
    param.faction = 'drop';
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      invar: {},
      trfunc: 'DoNothing',
      outtype: 'json'
    });
    EventMgr.trigger('updTableHeight');
  },
      ENTER_KEY = 13,

  /**
   * sync value name with display name
   * @param {object} e
   * @this {object}
   */
  syncName = function syncName(e) {
    var value = window.htmlEscape(this.value),
        tabId = this.getAttribute('data-tabid'),
        nameBox = this.nextSibling;
    if (nameBox) {
      nameBox.innerHTML = value;
      if ($(this).parents('.b-filter__saved-item').hasClass('b-filter__saved-item_st_active')) {
        $('#filter-' + tabId + ' .b-button__filter-save-name').html(value);
      }
    }

    var codeKey = e.which || e.keyCode;
    if (codeKey === ENTER_KEY) {
      this.blur();
    }
  },

  /**
   * show input for rename saved filter
   * @this {object}
   */
  editFilterName = function editFilterName(e) {
    e.preventDefault();
    if (this.parentNode) {
      App.Dom.addClass(this.parentNode, 'b-filter-flag_editing');
    }
    $(this.parentNode).find('.b-filter__saved-name-edit').focus().select();
  },

  /**
   * rename saved filter
   * @param {object} e
   * @this {object}
   */
  saveName = function saveName(e) {
    /* jslint camelcase: false */
    var name = this.value,
        func = this.getAttribute('data-func'),
        oldName = this.getAttribute('data-name'),
        param = {
      fnew_name: name,
      fname: oldName,
      faction: 'rename',
      func: func
    };
    /* jslint camelcase: true */
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      invar: {},
      trfunc: 'DoNothing',
      outtype: 'json'
    });
    this.setAttribute('data-name', name);
  },
      closeEditFilterName = function closeEditFilterName(e) {
    if (this.parentNode) {
      App.Dom.removeClass(this.parentNode.parentNode, 'b-filter-flag_editing');
    }
  },
      applySavedFilter = function applySavedFilter(e) {
    e.preventDefault();
    var elem = App.Common.getPreviousNode(this),
        id = elem.getAttribute('data-id'),
        tabId = elem.getAttribute('data-tabid'),
        param = {};
    if (!elem) {
      return;
    }
    param.func = elem.getAttribute('data-func');
    param.fname = elem.getAttribute('data-name');
    param.faction = 'set';
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      invar: { tabId: tabId },
      trfunc: 'reloadTab',
      outtype: 'json' });
  },
      clearCache = function clearCache(e, data) {
    var tabId = data.tabId;
    if (CACHE && CACHE[tabId]) {
      delete CACHE[tabId];
    }
  },
      insertFastFilterIcon = function insertFastFilterIcon() {
    $mainWrapper().append('<div class="b-fast-filter-icon" id="b-fast-filter-icon"></div>');
    EventMgr.obind(filterIconSelector, 'mouseout', hideFastFilterIcon);
    EventMgr.obind(filterIconSelector, 'mouseover', selfShowFastFilterIcon);
    EventMgr.obind(filterIconSelector, 'click', setFilterByColValue);
  },
      iconLeftPos = 0,
      filterField,
      $fastFilterIcon = function $fastFilterIcon() {
    return App.Dom.byId('b-fast-filter-icon');
  },
      showFastFilterIcon = function showFastFilterIcon() {
    var self = $(this),
        offset = self.offset(),
        left = offset.left,
        top = offset.top,
        width = this.offsetWidth,
        fastFilterIconElem = $fastFilterIcon(),
        isEditable = self.hasClass('editable'),
        marginLeft = 22;
    filterField = self;
    if (isEditable) {
      marginLeft += 22;
    }
    if (fastFilterIconElem.className.match('active')) {
      return;
    }
    iconLeftPos = left + width - marginLeft;
    fastFilterIconElem.style.left = iconLeftPos + 'px';
    fastFilterIconElem.style.top = top + 'px';
    fastFilterIconElem.style.display = 'block';
  },
      hideFastFilterIcon = function hideFastFilterIcon(e) {
    var fastFilterIconElem = $fastFilterIcon();
    if (!fastFilterIconElem.className.match('active')) {
      fastFilterIconElem.style.display = 'none';
    }
  },
      selfShowFastFilterIcon = function selfShowFastFilterIcon() {
    var fastFilterIconElem = $fastFilterIcon();
    fastFilterIconElem.style.display = 'block';
  },
      setFilterByColValue = function setFilterByColValue(e) {
    if (filterField) {
      var value,
          th,
          td,
          index,
          colname,
          filterControl,
          tabId,
          filterFieldContent,
          keyValue,
          type,
          control,
          findKey = false,
          id;
      filterFieldContent = filterField.find('.b-list__table-col-content');
      if (filterField.length) {
        keyValue = filterFieldContent.attr('data-v-id');
        value = filterFieldContent.html();
        index = filterField.closest('td').index();
        th = filterField.closest('table').find('th')[index];
        colname = th.getAttribute('data-colname');
        tabId = filterField.closest('.tab-content').attr('data-tabid');
        if (CACHE[tabId] && CACHE[tabId].model && CACHE[tabId].model[colname]) {
          control = CACHE[tabId].model[colname];
          type = control.type;
          if (type === 'select' || type === 'mselect') {
            //если не задан keyValue, то ищем в селекте UX-1662
            if (!keyValue) {
              for (var i = 0, l = control.slist.length; i < l; i++) {
                if (control.slist[i].value === value) {
                  value = control.slist[i].key;
                  findKey = true;
                  break;
                }
              }
            } else {
              value = keyValue;
              findKey = true;
            }
            if (type === 'mselect') {
              id = tabId + '-' + colname + '-ms-value';
            } else {
              id = '_' + colname + '-' + tabId + '-val';
            }
          } else if (type === 'text') {
            id = colname + '-' + tabId;
            findKey = true;
          }
          filterControl = App.Dom.byId(id);
          if (filterControl && findKey) {
            filterControl.value = value;
            $('#frm-' + tabId + ' .b-button__filter-set').trigger('click');
          }
        }
      }
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App, templates);
//# sourceMappingURL=App.FilterList.js.map

'use strict';

/**
 * Wrapper for google charts
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} pageInfo
 */
/*global App: true*/
App.GoogleCharts = function (window, $, EventMgr, App, pageInfo) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendReport', loadGCharts);
    EventMgr.bind('appendListWithDiagram', loadGChartFromList);
    EventMgr.bind('loadGCharts', loadGCharts);
    EventMgr.bind('loadGChart', loadGChart);
    EventMgr.bind('loadGChartPrepare', loadGChartPrepare);
    EventMgr.one('loadGChartScripts', loadGChartScript);
  },
      loadedGChartScripts = false,

  //load google charts
  loadGCharts = function loadGCharts(e, data) {
    var bands = data.bands.bands,
        tabId = data.tabId,
        len = bands.length,
        id,
        gid,
        i,
        j,
        lenD;
    for (i = 0; i < len; i++) {
      id = tabId + '-' + i;
      gid = id + bands[i].id;
      if (bands[i].diagram !== undefined) {
        lenD = bands[i].diagram.length;
        for (j = 0; j < lenD; j++) {
          if (loadedGChartScripts) {
            EventMgr.trigger('loadGChart', {
              diagram: bands[i].diagram[j],
              gid: gid + j,
              empty: bands[i].empty,
              tabId: tabId,
              content: bands[i].content });
          } else {
            EventMgr.trigger('loadGChartPrepare', {
              diagram: bands[i].diagram[j],
              gid: gid + j,
              empty: bands[i].empty,
              tabId: tabId,
              content: bands[i].content });
          }
        }
      }
    }
    if (data.bands.emptyBand) {
      var emptyBandData = data.bands.emptyBandData;
      if (loadedGChartScripts) {
        EventMgr.trigger('loadGChart', {
          diagram: emptyBandData.diagram,
          gid: tabId + '-band-empty',
          tabId: tabId,
          content: emptyBandData.content });
      } else {
        EventMgr.trigger('loadGChartPrepare', {
          diagram: emptyBandData.diagram,
          gid: tabId + '-band-empty',
          tabId: tabId,
          content: emptyBandData.content });
      }
    }
  },

  //
  loadGChartFromList = function loadGChartFromList(e, data) {
    var diagram = data.diagram,
        gid = data.gid,
        tabId = data.tabId,
        content = data.content;
    if (loadedGChartScripts) {
      EventMgr.trigger('loadGChart', {
        diagram: diagram,
        gid: gid,
        tabId: tabId,
        content: content });
    } else {
      EventMgr.trigger('loadGChartPrepare', {
        diagram: diagram,
        gid: gid,
        tabId: tabId,
        content: content });
    }
  },

  //load google chart
  loadGChart = function loadGChart(e, data) {
    var diagram = data.diagram,
        content = data.content,
        gid = data.gid,
        wrapper = App.Dom.byId(gid),
        tabId = data.tabId,
        chart,
        cdata,
        options,
        empty = data.empty,
        chartsData,
        rawData = false,
        colors = ['#5c85d6', '#e36141', '#ffbc58', '#53b858', '#ba70ba', '#3fafd1', '#e37fa0', '#8dc43b', '#cc6665', '#aaa'];
    if (diagram.colors && diagram.colors.length > 1) {
      colors = diagram.colors;
      colors.shift();
    }
    //check for data form dashbord or report
    //dashboard data without line
    if (diagram.chartsData && !diagram.chartsData.fakeArr) {
      chartsData = diagram.chartsData.data;
      rawData = true;
      //dashboard data with line
    } else if (diagram.chartsData && diagram.chartsData.fakeArr) {
      chartsData = diagram.chartsData;
      rawData = true;
      //report
    } else {
      chartsData = makeData(diagram, content);
    }
    if (wrapper === null) {
      return;
    }
    var len = chartsData.data ? chartsData.data.length : chartsData.length,
        len2 = 0,
        fakeArr = [],
        pointSize = 0,
        showTextEvery = 'automatic',
        width = wrapper.offsetWidth;
    //check for point size
    if (len < 32) {
      pointSize = 3;
    }
    //check for show labels 
    if (width > 700) {
      showTextEvery = Math.round(len / 10);
    } else {
      showTextEvery = Math.round(len / 5);
    }
    //check when rawData
    if (len === 1) {
      if (chartsData.data) {
        len2 = chartsData.data[0];
      } else {
        console.log('empty chart data');
        return;
      }
      while (len2--) {
        fakeArr.push(0);
      }
      // chartsData.push(fakeArr);
    }
    if (rawData) {
      chartsData = prepareRawData(chartsData, len);
    }

    if (diagram && diagram.type === 'pie') {
      if (rawData) {
        cdata = window.google.visualization.arrayToDataTable(chartsData);
      } else {
        cdata = new window.google.visualization.DataTable();
        for (var i = 0, l = chartsData.fakeArr.length; i < l; i++) {
          if (chartsData.fakeArr[i] === null) {
            cdata.addColumn({ type: 'string', role: 'tooltip' });
          } else {
            cdata.addColumn(i === 0 ? 'string' : 'number', chartsData.fakeArr[i]);
          }
        }
        cdata.addRows(chartsData.data);
      }

      options = {
        // backgroundColor : 'rgb(242, 249, 255)',
        'backgroundColor.stroke': '#fff',
        'vAxis': {
          'minValue': 0,
          'textStyle': { 'fontSize': '11' }
        },
        'colors': colors,
        'is3D': true,
        'legend': {
          'alignment': 'center',
          'textStyle': { 'fontSize': '11' }
        },
        'sliceVisibilityThreshold': diagram.others
      };
      if (diagram.title) {
        options.title = diagram.title;
        options.chartArea = { 'height': '80%' };
      } else {
        options.chartArea = { 'height': '94%' };
      }
      chart = new window.google.visualization.PieChart(App.Dom.byId(gid));
    } else if (diagram && diagram.type === 'histogram') {
      if (!chartsData.fakeArr) {
        cdata = window.google.visualization.arrayToDataTable(chartsData);
      } else {
        cdata = new window.google.visualization.DataTable();
        /* jshint shadow: true */
        for (var i = 0, l = chartsData.fakeArr.length; i < l; i++) {
          if (chartsData.fakeArr[i] === null) {
            cdata.addColumn({ type: 'string', role: 'tooltip' });
          } else {
            cdata.addColumn(i === 0 ? 'string' : 'number', chartsData.fakeArr[i]);
          }
        }
        cdata.addRows(chartsData.data);
      }

      options = {
        //backgroundColor : 'rgb(242, 249, 255)',
        'backgroundColor.stroke': '#fff',
        colors: colors,
        vAxis: {
          //'minValue': 0,
          textStyle: { fontSize: '11' },
          viewWindow: {}
        },
        hAxis: {
          textStyle: { fontSize: '11' }
        },
        legend: {
          alignment: 'start',
          position: 'right',
          textStyle: { fontSize: '11' }
        }
      };
      if (diagram.title) {
        options.title = diagram.title;
      }
      //set min/max viewport for chart
      if (diagram.min) {
        options.vAxis.viewWindow.min = diagram.min;
      }
      if (diagram.max) {
        options.vAxis.viewWindow.max = diagram.max;
      }
      chart = new window.google.visualization.ColumnChart(App.Dom.byId(gid));
    } else if (diagram && (diagram.type === 'line' || diagram.type === 'area' || diagram.type === 'steppedarea')) {
      if (!chartsData.fakeArr) {
        cdata = window.google.visualization.arrayToDataTable(chartsData);
      } else {
        cdata = new window.google.visualization.DataTable();
        for (var i = 0, l = chartsData.fakeArr.length; i < l; i++) {
          /* jshint shadow: true */
          if (chartsData.fakeArr[i] === null) {
            cdata.addColumn({ type: 'string', role: 'tooltip' });
          } else {
            cdata.addColumn(i === 0 ? 'string' : 'number', chartsData.fakeArr[i]);
          }
        }
        cdata.addRows(chartsData.data);
      }
      options = {
        //backgroundColor : 'rgb(242, 249, 255)',
        // 'chartArea' : { 'left' : 50 },
        'backgroundColor.stroke': '#fff',
        colors: colors,
        vAxis: {
          //'minValue' : 0,
          textStyle: { fontSize: '11' },
          viewWindow: {}
        },
        hAxis: {
          showTextEvery: showTextEvery,
          textStyle: { fontSize: '11' }
        },
        pointSize: pointSize,
        focusTarget: 'category',
        legend: {
          alignment: 'start',
          textStyle: { fontSize: '11' }
        }
      };
      if (diagram.title) {
        title = diagram.title;
      }
      //set min/max viewport for chart
      if (diagram.min) {
        options.vAxis.viewWindow.min = diagram.min;
      }
      if (diagram.max) {
        options.vAxis.viewWindow.max = diagram.max;
      }
      if (diagram.type === 'line') {
        chart = new window.google.visualization.LineChart(App.Dom.byId(gid));
      } else if (diagram.type === 'area') {
        chart = new window.google.visualization.AreaChart(App.Dom.byId(gid));
      } else if (diagram.type === 'steppedarea') {
        options.areaOpacity = 1;
        options.isStacked = true;
        chart = new window.google.visualization.SteppedAreaChart(App.Dom.byId(gid));
      } else if (diagram.type === 'column') {
        options.isStacked = true;
        chart = new window.google.visualization.ColumnChart(App.Dom.byId(gid));
      }
    } else if (diagram && diagram.type === 'scatter') {
      if (!chartsData.fakeArr) {
        cdata = window.google.visualization.arrayToDataTable(chartsData);
      } else {
        //chartsData.data.unshift(chartsData.fakeArr);
        //var tmpArr = chartsData.data;
        //cdata = google.visualization.arrayToDataTable(tmpArr);
        cdata = new window.google.visualization.DataTable();
        /* jshint shadow: true */
        for (var i = 0, l = chartsData.fakeArr.length; i < l; i++) {
          if (chartsData.fakeArr[i] === null) {
            cdata.addColumn({ type: 'string', role: 'tooltip' });
          } else {
            cdata.addColumn('number', chartsData.fakeArr[i]);
          }
        }
        if (diagram.markerline !== undefined) {
          for (var i = 0, l = chartsData.data.length; i < l; i++) {
            chartsData.data[i].push(diagram.markerline - 0);
          }
          cdata.addColumn('number', diagram.markerlineLabel);
        }
        cdata.addRows(chartsData.data);
      }
      options = {
        'backgroundColor.stroke': '#fff',
        colors: colors,
        vAxis: {
          //'minValue' : 0,
          textStyle: { fontSize: '11' },
          viewWindow: {}
        },
        hAxis: {
          showTextEvery: showTextEvery,
          textStyle: { fontSize: '11' }
        },
        legend: false,
        seriesType: 'scatter'
      };

      if (diagram.markerline !== undefined) {
        options.series = {};
        options.series[1] = { 'type': 'line' };
      }
      //set min/max viewport for chart
      if (diagram.min) {
        options.vAxis.viewWindow.min = diagram.min;
      }
      if (diagram.max) {
        options.vAxis.viewWindow.max = diagram.max;
      }
      //chart = new google.visualization.ScatterChart(App.Dom.byId(gid));
      chart = new window.google.visualization.ComboChart(App.Dom.byId(gid));
    } else if (diagram) {
      EventMgr.trigger('pullMsg', { msg: 'Diagram type "' + diagram.type + '" do not support' });
      return;
    }
    if (empty) {
      options.colors = colors;
    }
    chart.draw(cdata, options);
    EventMgr.trigger('addedChart', { chart: chart, tabId: tabId });
    var func = function func() {
      EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
      EventMgr.trigger('updTableHeight');
    };
    App.Common.noMoreThan('form-scroll-' + tabId, 100, func);
  },
      prepareRawData = function prepareRawData(chartsData, len) {
    var len2,
        data = chartsData.data ? chartsData.data : chartsData;
    while (len--) {
      //check for separate data
      //skip first elem with labels
      if (len === 0 && !chartsData.fakeArr) {
        continue;
      }
      len2 = data[len].length;
      while (len2--) {
        if (len2 !== 0) {
          //check for separate data
          //skip elem with hint
          if (chartsData.fakeArr && !chartsData.fakeArr[len2]) {
            continue;
          }
          data[len][len2] = parseData(data[len][len2]);
        }
      }
    }
    if (chartsData.data) {
      chartsData.data = data;
    } else {
      chartsData = data;
    }
    return chartsData;
  },
      parseData = function parseData(value) {
    return value === '' ? null : parseFloat(String(value).replace(/\s/g, ''));
  },
      makeData = function makeData(diagram, content) {
    var type = diagram.type,
        data,
        elem,
        fakeArr,
        label = diagram.label,
        dataCol = diagram.data,
        labels = diagram.labelText,
        lines = diagram.lines,
        tooltip = diagram.tooltip,
        woLabel = diagram.type === 'scatter',
        len,
        labelsLen,
        i,
        j,
        labelsLenSrc;
    //if (type == 'histogram' || type == 'pie') {
    //withot lines
    if (!lines) {
      //check for one lines in histogram
      dataCol = dataCol[0] ? dataCol[0] : dataCol;
      //first fake row
      fakeArr = ['fake', labels[0]];
      if (dataCol.convert || tooltip) {
        fakeArr.push(null);
      }
      // data = [elem];
      data = [];
      len = content.length;
      i = 0;
      while (len--) {
        if (tooltip) {
          elem = [content[i][label].v, parseFloat(content[i][dataCol.name].v.replace(/\s/g, ''))];
          elem.push(content[i][tooltip].v + ': ' + elem[0] + ', ' + elem[1]);
        } else if (dataCol.convert) {
          elem = [content[i][label].v, parseFloat(content[i][dataCol.name].orig || content[i][dataCol.name].v), content[i][dataCol.name].v];
        } else {
          elem = [content[i][label].v, parseFloat(content[i][dataCol.name].v.replace(/\s/g, ''))];
        }
        //
        if (woLabel) {
          elem[0] = elem[0] - 0;
        }
        data.push(elem);
        i++;
      }
    } else {
      //first fake row
      fakeArr = ['fake'];
      labelsLen = dataCol.length;
      labelsLenSrc = labelsLen;
      i = 0;
      while (labelsLen--) {
        fakeArr.push(labels[i]);
        if (dataCol[i].convert) {
          fakeArr.push(null);
        }
        i++;
      }

      // data = [elem];
      data = [];
      len = content.length;
      j = 0;
      while (len--) {
        elem = [content[j][label].v];
        labelsLen = labelsLenSrc;
        i = 0;
        while (labelsLen--) {
          if (dataCol[i].convert) {
            elem.push(parseFloat(content[j][dataCol[i].name].orig || content[j][dataCol[i].name].v.replace(/\s/g, '')));
            elem.push(content[j][dataCol[i].name].v === '' ? null : content[j][dataCol[i].name].v);
          } else {
            elem.push(content[j][dataCol[i].name].v === '' ? null : parseFloat(content[j][dataCol[i].name].v.replace(/\s/g, '')));
          }
          i++;
        }
        data.push(elem);
        j++;
      }
    }
    return {
      data: data,
      fakeArr: fakeArr
    };
  },
      queueCharts = [],
      loadGChartPrepare = function loadGChartPrepare(e, data) {
    queueCharts.push(data);
    EventMgr.trigger('loadGChartScripts', {});
  },

  //loading gchart form queue
  runQueue = function runQueue() {
    var len = queueCharts.length;
    while (len--) {
      EventMgr.trigger('loadGChart', queueCharts[len]);
    }
    queueCharts = [];
  },
      checkScripts = function checkScripts() {
    if (window.google.visualization === undefined) {
      setTimeout(function () {
        checkScripts();
      }, 100);
    } else {
      if (window.google.visualization.arrayToDataTable === undefined) {
        setTimeout(function () {
          checkScripts();
        }, 100);
      } else {
        loadedGChartScripts = true;
        runQueue();
      }
    }
  },

  //load google charts scripts
  loadGChartScript = function loadGChartScript() {
    setTimeout(function () {
      window.google.load('visualization', '1', {
        'callback': 'console.log("2 sec wait")',
        'packages': ['corechart'],
        'language': pageInfo.lang });
    }, 100);
    setTimeout(function () {
      checkScripts();
    }, 100);
  };

  return {
    init: init
  };
}(window, $, EventMgr, App, pageInfo);
//# sourceMappingURL=App.GoogleCharts.js.map

'use strict';

/**
 * Wrapper for google charts
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} pageInfo
 */
/*global App: true*/
App.Captcha = function (window, $, EventMgr, App, pageInfo) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendCaptcha', appendCaptcha);
  };

  function appendCaptcha(e, d) {
    var id = d.id,
        node = App.Dom.byId(id);
    if (window.grecaptcha && typeof window.grecaptcha.render === 'function' && node) {
      if (node.innerHTML === '') {
        renderCaptcha(node);
      } else {
        //if doesnt rerender tab after refresh
        setTimeout(function () {
          appendCaptcha(e, d);
        }, 100);
      }
    } else {
      appendScript(node);
    }
  }

  function appendScript(node) {
    var file = 'https://www.google.com/recaptcha/api.js';
    App.Common.required(file, renderCaptcha, node);
  }

  function renderCaptcha(node) {
    if (node) {
      window.grecaptcha.render(node, { sitekey: node.getAttribute('data-sitekey') });
    }
  }

  return {
    init: init
  };
}(window, $, EventMgr, App, pageInfo);
//# sourceMappingURL=App.Captcha.js.map

'use strict';

/**
 * Модуль обрабатывает ссылки на документацию
 *
 */
var App = App || {};
App.Help = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.on($mainWrapper(), helpLinkSelector, 'click', showHelp);
  },
      $mainWrapper = function $mainWrapper() {
    return $('#main-wrapper');
  },
      helpLinkSelector = '.help',
      showHelp = function showHelp(e) {
    var type = this.getAttribute('data-help-type'),
        helpChain = this.getAttribute('data-help'),
        func = $('.tab-content_st_active').attr('data-func'),
        url;
    e = e || window.event;
    e.preventDefault();
    if (type - 0 === 2 || type === 'default') {
      window.open(pageInfo.url + '?func=help&topic=' + func + '&path=' + helpChain + '&newwindow=yes');
    } else if (type === 'external') {
      url = this.getAttribute('data-help-func');
      App.u.openInNewWindow(url);
    }
  };
  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.Help.js.map

'use strict';

/**
 * Модуль отвечает за отображение хинтов
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
/*global App:true*/
App.Hint = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on($mainWrapper(), hintItemSelector, 'mouseover', hintShowHandler);
    EventMgr.on($mainWrapper(), '.i-text-content', 'mouseover', hintInListShowHandler);
    EventMgr.on($mainWrapper(), hintActiveItemSelector, 'mouseover', hintActiveShowHandler);
    EventMgr.bind('hintActiveShowHandler', hintActiveShowHandler);
    EventMgr.on($mainWrapper(), hintMenuItemSelector, 'mouseover', hintShowHandler);
    EventMgr.on($mainWrapper(), hintItemSelector, 'mouseout', hintHideHandler);
    EventMgr.on($mainWrapper(), '.i-text-content', 'mouseout', hintHideHandler);
    EventMgr.on($mainWrapper(), previewItemSelector, 'mouseover', previewShowHandler);
    EventMgr.on($mainWrapper(), previewItemSelector, 'mouseout', hintHideHandler);
    EventMgr.on($mainWrapper(), hintActiveItemSelector, 'mouseout', hintHideHandler);
    EventMgr.on($mainWrapper(), hintMenuItemSelector, 'mouseout', hintHideHandler);
    EventMgr.on($mainWrapper(), hintBoxSelector, 'mouseover', hintShow);
    EventMgr.on($mainWrapper(), hintBoxSelector, 'mouseout', hintHide);
    EventMgr.on($body(), tipCloseSelector, 'click', closeTipByCross);
    //EventMgr.on($body(), tipCloseCrossSelector, 'click', closeTipByCross);
    EventMgr.bind('showHintMap', showHintMap);
    EventMgr.bind('forceShowHint', forceShowHint);
    EventMgr.bind('hideHint', hintHide);
    EventMgr.bind('stopShowHint', stopShowHint);
    EventMgr.bind('tabLoading', hintHide);
    EventMgr.bind('closeTabEvent', hintHide);
    EventMgr.bind('ajaxResponseHint', updateHint);
    EventMgr.on('.force-hint-flag', '.force-hint', 'focus', showForceHint);
    EventMgr.on('.force-hint-flag', '.force-hint', 'blur', forcehintHide);
    EventMgr.bind('verticalScroll', checkPosition);
    EventMgr.bind('showTips', showTips);
    EventMgr.bind('loadPage', checkTipsForDesktop);
    EventMgr.bind('updateTipPosition', updateTipPosition);
  },
      $mainWrapper = function $mainWrapper() {
    return App.u.selectorCache('#main-wrapper');
  },
      $body = function $body() {
    return App.u.selectorCache('#main-wrapper');
  },
      hintItemSelector = '.hint',
      tipCloseSelector = '.b-tip',
      tipCloseCrossSelector = '.b-tip__close',
      pageInfo = window.pageInfo,
      previewItemSelector = '#modal1-img li',
      hintActiveItemSelector = '.acthint',
      $hintBoxFn = function $hintBoxFn() {
    return $('#hint');
  },
      $hintBoxInnerFn = function $hintBoxInnerFn() {
    return $('#hint-inner');
  },
      hintBoxSelector = '#hint',

  //$ elem inner hint
  $$hintBoxInner,
      $$hintBox,
      hintMenuItemSelector = '.overwidth',
      timer,
      hideTimer,
      lastSelf,

  /**
   * Force show hint when form elem in focus
   * @param {object} e
   * @this HTML Node
   */
  showForceHint = function showForceHint(e) {
    clearTimeout(hideTimer);
    var $srcElem = $(this),
        hintField = $srcElem.parents('.i-form__item').find('.field-help'),
        self = hintField;
    if (hintField.length > 0 && hintGetContent(self, false)) {
      setTimeout(function () {
        setHintPosition(self, true);
        hintShow(undefined, true);
      }, 1);
    }
    lastSelf = $srcElem;
  },
      forcehintHide = function forcehintHide() {
    $$hintBox = $$hintBox || $hintBoxFn();
    $$hintBox.css('visibility', '').removeClass('active');
  },
      checkPosition = function checkPosition() {
    if ($$hintBox.hasClass('active')) {
      if (lastSelf && lastSelf.hasClass('force-hint')) {
        var hintField = lastSelf.parents('.l-form__row').find('.field-help');
        if (hintField.offset().top < 142) {
          forcehintHide();
        } else {
          setHintPosition(hintField, true);
        }
      }
    }
  },


  //prevent show hint
  stopShowHint = function stopShowHint() {
    clearTimeout(timer);
  },

  /**
   * Hint handler for DCMap
   * get props of element and show it as list
   * @param {object} e
   */
  showHintMap = function showHintMap(e) {
    var data = e.originalEvent.detail.props,
        self = $(e.originalEvent.detail.elem),
        hint = '<ul>',
        msg = data.msg,
        key,
        $$hintBoxInner = $$hintBoxInner || $hintBoxInnerFn();
    for (key in data) {
      if (msg[key]) {
        hint += '<li>' + '<label class="b-hint-line__label">' + msg[key] + ':</label>' + ' ' + data[key] + '</li>';
      }
    }
    hint += '</ul>';
    $$hintBoxInner.html(hint);

    //@todo least 200ms mouseover don't show hint

    timer = setTimeout(function () {
      hintShow(self);
    }, 500);
    lastSelf = null;
  },

  /**
   * Show hint like preview for development mode
   * @param {object} e
   * @this {object} HTML Node
   */
  previewShowHandler = function previewShowHandler(e) {
    var self = $(this),
        imgName = this.getAttribute('data-val'),
        text,
        style,
        src;
    $$hintBoxInner = $$hintBoxInner || $hintBoxInnerFn();
    if (!imgName) {
      return;
    }
    src = 'src="/manimg/common/img/' + imgName + '.png"';
    style = 'style="min-height: 16px; min-width: 16px;"';
    text = '<img class="preview-icon" ' + style + ' ' + src + ' ></img>';
    $$hintBoxInner.html(text);
    //check for shadow

    setHintPosition(self, false);

    //@todo least 200ms mouseover don't show hint
    timer = setTimeout(function () {
      hintShow();
    }, 500);
  },

  /**
   * show hint for element with custom hint
   * @param {object} e
   * @param {object} data
   */
  forceShowHint = function forceShowHint(e, data) {
    var elem = data.elem,
        hint = data.hint,
        self = $(elem);
    $$hintBoxInner = $$hintBoxInner || $hintBoxInnerFn();
    $$hintBoxInner.html(hint);
    setHintPosition(self, false);
    hintShow();
    lastSelf = null;
  },

  /**
   * Get hint content for view
   * find out hint content in elem attribute
   * @param {object} self jQuery object of element
   * @param {boolean} active Flag for active hint
   * @return {boolean}
   */
  hintGetContent = function hintGetContent(self, active) {
    var state,
        text,
        shadow,
        row,
        mn,
        overwidth = false;
    $$hintBoxInner = $$hintBoxInner || $hintBoxInnerFn();
    //get hint content
    state = self[0].getAttribute('data-state');
    if (state) {
      text = self[0].getAttribute('data-hint-' + state);
      if (!text) {
        text = self[0].getAttribute('data-hint');
      }
    } else {
      text = self[0].getAttribute('data-hint');
    }
    mn = self[0].getAttribute('data-hint-mn');
    if (active) {
      text = pageInfo.loading;
    }
    if (!text) {
      if (self.hasClass('overwidth')) {
        text = self[0].innerText || self[0].firstChild.nodeValue || self.html();
        overwidth = true;
      } else {
        return false;
      }
    }
    //filtred text
    text = window.filterXSS(text);
    shadow = self.hasClass('shadow');
    if (shadow) {
      row = self.parents('tr.row-shadow');
      if (!row.length) {
        text = text.replace(/<span class=['"]hint-.*/g, '');
      }
    }

    $$hintBoxInner.html(text);
    if (mn) {
      if (!String(mn).match('hint')) {
        mn = 'hint_' + mn;
      }
      $$hintBoxInner.attr('data-mn', mn);
    } else {
      $$hintBoxInner.attr('data-mn', null);
    }
    lastSelf = null;
    return true;
  },

  /**
   * Show hint handler
   * call function for show hint
   * @param {object} e
   * @param {boolean} active Flag for active hint
   * @this HTML Node
   */
  hintShowHandler = function hintShowHandler(e, active) {
    var self = $(this);
    if (hintGetContent(self, active)) {
      setHintPosition(self, false);
      //@todo least 200ms mouseover don't show hint
      timer = setTimeout(function () {
        hintShow();
      }, 500);
    }
    lastSelf = null;
    //if hint on parent
    if (e.stopPropagation) {
      e.stopPropagation();
    }
  },
      hintInListShowHandler = function hintInListShowHandler(e) {
    if (this.className.match(/overwidth/)) {
      hintShowHandler.apply(this, [e]);
    } else {
      var width = this.offsetWidth,
          scrollWidth = this.scrollWidth - 1;
      if (width < scrollWidth) {
        this.className += ' overwidth';
        hintShowHandler.apply(this, [e]);
      }
    }
  },


  /**
   * Set position for hint
   * detect best position for view hint
   * @param {object} self jQuery object of element
   * @param {boolean} fixed flag for fixed position of hint (for form items)
   */
  setHintPosition = function setHintPosition(self, fixed, box, boxInner, forceRight, forceBottom) {
    var PADDING = 15,
        heightTail = 10,
        marginElem = 3,
        N3 = 7,
        N4 = 30,
        $hintBoxInner,
        $hintBox;
    if (box && boxInner) {
      $hintBoxInner = boxInner;
      $hintBox = box;
    } else {
      if (!$$hintBox || !$$hintBoxInner) {
        $$hintBoxInner = $hintBoxInnerFn();
        $$hintBox = $hintBoxFn();
      }
      $hintBoxInner = $$hintBoxInner;
      $hintBox = $$hintBox;
    }
    //calculate hint position
    var heightHintBox = $hintBoxInner[0].offsetHeight,
        widthElem = self.width(),
        heightElem,
        selfOffset = self.offset(),

    //top position of element
    topElem = selfOffset.top,

    //left position of element
    leftElem = selfOffset.left,
        docWidth = $('body').width(),
        left,
        top,
        topFlag = false,
        rightFlag = false,
        LEFT_BORDER;
    //check for svg elem
    if (widthElem === 0 && self && self[0]) {
      widthElem = self[0].getBoundingClientRect().width;
    }
    $hintBoxInner.removeClass('b-hint__inner_right_fixed' + ' b-hint__inner_right' + ' b-hint__inner_top' + ' b-hint__inner_top_right' + ' b-hint__inner_left');
    //top of element hinting
    if (!fixed) {
      top = topElem - heightHintBox - heightTail - marginElem - PADDING;
      left = leftElem + widthElem / 2 - N3;
      LEFT_BORDER = 300;
    } else {
      top = topElem - PADDING;
      left = leftElem + widthElem + marginElem + heightTail;
      LEFT_BORDER = 250;
    }
    //check for left border
    if (docWidth - left < LEFT_BORDER || forceRight) {
      $hintBoxInner.addClass('b-hint__inner_right');
      var right = docWidth - leftElem - N4;
      rightFlag = true;
      $hintBox.css('right', right + 'px');
      $hintBox.css('left', '');
      if (fixed) {
        top = topElem - heightHintBox - heightTail - marginElem - PADDING;
      }
    } else {
      if (fixed) {
        $hintBoxInner.addClass('b-hint__inner_right_fixed');
      }
      $hintBoxInner.addClass('b-hint__inner_left');
      $hintBox.css('left', left + 'px');
      $hintBox.css('right', '');
    }
    //check for top border
    if (heightHintBox > top || forceBottom) {
      heightElem = self.outerHeight();
      //check for svg elem
      if (heightElem === 0 && self && self[0]) {
        heightElem = self[0].getBoundingClientRect().height;
      }
      top = self.offset().top + heightElem + heightTail - PADDING;
      if (rightFlag) {
        $hintBoxInner.addClass('b-hint__inner_top_right');
      } else {
        $hintBoxInner.addClass('b-hint__inner_top');
      }
    }
    $hintBox.css('top', top + 'px');
  },
      currentHintId,

  /**
   * Active hint handler
   * get request for content hint
   * @param {object} e
   * @this {object}
   */
  hintActiveShowHandler = function hintActiveShowHandler(e) {
    var _this = this;
    if (e.originalEvent.detail.elem) {
      _this = e.originalEvent.detail.elem;
    }
    var self = $(_this),
        tabId = $('.tab-content_st_active').attr('data-tabid'),
        elid = self.parents('tr').attr('data-elid') || _this.getAttribute('data-elid'),
        pName = _this.getAttribute('data-name'),
        value = _this.getAttribute('data-value'),
        hintfunc = _this.getAttribute('data-hintfunc');
    //for acthint in col
    if (!pName) {
      var index = self.closest('td').index(),
          th = self.closest('table').find('th')[index],
          pName = th.getAttribute('data-colname');
    }
    if (hintfunc) {
      currentHintId = tabId + value + elid + pName;
      var params = {
        func: hintfunc,
        elid: elid,
        type: pName
      };
      EventMgr.trigger('ajaxRequest', {
        url: pageInfo.url,
        param: params,
        invar: {
          hintTabId: tabId,
          hintElid: elid,
          hintPName: pName,
          hintValue: value,
          self: self },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponseHint',
        queue: 'actHint' + tabId,
        failfunc: 'failCommonAjaxResponse' });
    } else {
      currentHintId = tabId + value + elid + pName;
      EventMgr.trigger('getActiveHint', {
        tabId: tabId,
        elid: elid,
        pName: pName,
        value: value,
        self: self });
    }

    hintShowHandler.apply(_this, [{}, true]);
    e.preventDefault();
    e.stopPropagation();
  },

  /**
   * Update hint content when got response of active hint
   * @param {object} e
   * @param {object} data
   */
  updateHint = function updateHint(e, data) {
    var elid = data.hintElid,
        tabId = data.hintTabId,
        pName = data.hintPName,
        value = data.hintValue,
        self = data.self,
        id = tabId + value + elid + pName,
        textValue;
    if (currentHintId === id) {
      if (!data.hint || data.hint === '') {
        textValue = 'Oops..';
      } else {
        textValue = window.htmlDecode(data.hint);
      }
      textValue = window.filterXSS(textValue);
      $$hintBoxInner.html(textValue);
      setHintPosition(self, false);
    }
  },

  /**
   * Show HTML Node of hint
   * @param {object} self jQuery object of element
   * @param {boolean} force Force show hint flag
   */
  hintShow = function hintShow(self, force) {
    $$hintBoxInner = $$hintBoxInner || $hintBoxInnerFn();
    $$hintBox = $$hintBox || $hintBoxFn();
    //check for hint show by self
    if (self !== undefined && typeof self.width === 'function') {
      setHintPosition(self, false);
    }
    $$hintBox.addClass('active');
    if (force) {
      $$hintBox.css('visibility', 'visible');
    } else {
      $$hintBox.css('visibility', '');
    }
    clearTimeout(timer);
  },
      hintHideHandler = function hintHideHandler(e) {
    hintHide();
    clearTimeout(timer);
  },

  /**
   * Hide HTML Node of hint
   */
  hintHide = function hintHide() {
    $$hintBox = $$hintBox || $hintBoxFn();
    $$hintBox.removeClass('active');
    $$hintBox.find('.hint-cont').html();
    currentHintId = '';
    clearTimeout(timer);
  },
      renderTip = function renderTip(tipObject, inTab) {
    var html = templates.tip(tipObject);
    if (inTab) {
      $('.tab-content_st_active').append(html);
    } else {
      $body().append(html);
    }
    return $('.b-tip_name_' + tipObject.name);
  },
      actTip,

  /**
   * show Tips
   * @param {object} e
   * @param {object} data
   *
   * find target element by classname i-tip-target_st_NAME
   * */
  showTips = function showTips(e, data) {
    actTip = data;
    var tips = data.tips,
        inTab = data.inTab,
        tabId = data.tabId,
        l = tips.length,
        sameModule = data.sameModule,
        $target,
        $tip,
        TABMARGINTOP = 69,
        TABMARGINLEFT = 205,
        forceRight = false,
        forceBottom = false;
    //show only one tip
    if ($('.b-tip').length) {
      return;
    }
    while (l--) {
      //check for exist this tip
      if ($('.b-tip_name_' + tips[l].name).length) {
        continue;
      }
      //check for sameModule load form menu
      if (tips[l].name === 'title_reload' && !sameModule) {
        continue;
      }
      if (tips[l].name === 'mbar_pin') {
        inTab = false;
      }
      if (tips[l].name === 'tabs_close') {
        if ($('.tab-group').length < 9) {
          continue;
        }
        inTab = false;
      }
      //show inside tab
      if (inTab) {
        $target = $('#cont-' + tabId + ' .i-tip-target_st_' + tips[l].name);
      } else {
        $target = $('.i-tip-target_st_' + tips[l].name);
      }
      //show textarea only when it focused
      if (tips[l].name === 'textarea_resize' && !data.textareaTip) {
        $('.b-textarea').bind('focus', showTipsForTextarea);
        textareaTip = [tips[l]];
        continue;
      } else if (data.textareaTip) {
        var $textarea = $('.b-textarea');
        if ($target.length) {
          var $targetTextarea = $target.prev();
          if ($targetTextarea.length) {
            var height = $targetTextarea[0].offsetHeight,
                scrollHeight = $targetTextarea[0].scrollHeight - 1;
            if (height < scrollHeight) {
              $textarea.off('focus', showTipsForTextarea);
              forceBottom = true;
            } else {
              continue;
            }
          }
        }
      }

      //force bottom position for new_btn tip
      if (tips[l].name === 'btn_new') {
        forceBottom = true;
      }
      if ($target.length) {
        //check for visibility
        if ($target[0].offsetWidth === 0 || $target[0].offsetHeight === 0) {
          continue;
        }
        $tip = renderTip(tips[l], inTab);
        setHintPosition($target, false, $tip, $tip.find('.b-tip__inner'), forceRight, forceBottom);
        //correct position inside tab
        if (inTab) {
          $tip.css('top', parseFloat($tip.css('top')) - TABMARGINTOP);
          var left;
          if ($tip.length) {
            left = $tip[0].style.left;
          }
          if (left) {
            $tip.css('left', parseFloat(left) - TABMARGINLEFT);
          }
        }
        $target.on('click', $.proxy(closeTipByCross, {
          elem: $tip.find('.b-tip__close') }));
      }
    }
  },
      textareaTip = [],
      showTipsForTextarea = function showTipsForTextarea(e) {
    var tabId = this.getAttribute('data-tabid'),
        tips = textareaTip;
    EventMgr.trigger('showTips', {
      tips: tips,
      inTab: true,
      textareaTip: true,
      tabId: tabId });
  },
      closeTipByCross = function closeTipByCross(e) {
    var self = this,
        $self = $(this);
    if (this.elem && this.elem[0]) {
      this.elem.trigger('click');
      return;
    }
    var id = self.getAttribute('data-name');
    if (!id) {
      id = $self.find('.b-tip__close').attr('data-name');
    } else {
      $self = $self.closest('.b-tip');
    }
    var param = {
      func: 'tip',
      elid: id
    };
    EventMgr.trigger('ajaxRequest', {
      param: param,
      type: 'get',
      outtype: 'json',
      trfunc: 'DoNothing',
      queue: 'noqueue' });
    //$('.i-tip-target_st_' + id).off('click');

    actTip = null;
    $self.remove();
  },
      closeTip = function closeTip(e) {
    $(this).remove();
    actTip = null;
  },
      checkTipsForDesktop = function checkTipsForDesktop(e, data) {
    if (pageInfo && pageInfo.tips) {
      //timeout for make all objects in theme
      setTimeout(function () {
        showTips.apply(window, [{}, { tips: pageInfo.tips }]);
      }, 1500);
    }
  },

  /**
   * update position for Tip
   * @param {object} e
   * @param {object} data
   */
  updateTipPosition = function updateTipPosition(e, data) {
    if (actTip) {
      $('.b-tip').remove();
      showTips.apply(window, [{}, actTip]);
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Hint.js.map

'use strict';

/**
 * App.HorizontScroll
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.HorizontScroll = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.obind($rB(), 'mousedown', keyDownRight);
    EventMgr.obind($lB(), 'mousedown', keyDownLeft);
    EventMgr.obind($rB(), 'click', clickRight);
    EventMgr.obind($lB(), 'click', clickLeft);
    EventMgr.obind($window(), 'resize', getSizeElems);
    EventMgr.bind('loadPage', getSizeElems);
    EventMgr.bind('loadPage', start);
    EventMgr.bind('appended', checkSize);
    EventMgr.bind('switchTab', checkSize);
    EventMgr.bind('closeTab', checkSize);
  },
      delta = 10,
      cWidth = '',
      extra = 0,
      moveVar = false,
      intId = null,
      intMLId = null,
      $window = function $window() {
    return $(window);
  },
      $obj = function $obj() {
    return $('#tab-cont');
  },
      $rB = function $rB() {
    return $('#tab-mover-left');
  },
      $lB = function $lB() {
    return $('#tab-mover-right');
  },
      start = function start() {
    $obj().css('margin-left', '0px');
  },
      getSizeElems = function getSizeElems() {
    var offsetWidth = document.body.offsetWidth;
    cWidth = offsetWidth - 205 - 108 - 50;
  },
      keyDownRight = function keyDownRight(e) {
    e = e || window.event;
    clearInterval(intMLId);
    document.onmouseup = cancelMove;
    intId = setInterval(function () {
      move(10);
    }, 10);
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      keyDownLeft = function keyDownLeft(e) {
    e = e || window.event;
    clearInterval(intMLId);
    document.onmouseup = cancelMove;
    intId = setInterval(function () {
      move(-10);
    }, 10);
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      clickRight = function clickRight(e) {
    e = e || window.event;
    move(delta);
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      clickLeft = function clickLeft(e) {
    e = e || window.event;
    move(delta);
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      checkSize = function checkSize(e, data) {
    var tabId = data.tabId;
    setTimeout(function () {
      checkSizeFunc(tabId);tabId = null;
    }, 50);
  },
      checkSizeFunc = function checkSizeFunc(tabId) {
    getSizeElems();
    var objWidth = $obj().width(),
        $body = $('body');

    extra = objWidth - cWidth;

    if (objWidth > cWidth) {
      $body.addClass('tabscrollactive');
      focusActiveTab(tabId);
    } else {
      $body.removeClass('tabscrollactive');
      $obj().css('margin-left', '0');
    }
  },
      focusActiveTab = function focusActiveTab(tabId) {
    clearInterval(intMLId);
    if (tabId === undefined) {
      return;
    }
    var activeTab = App.Dom.byId(tabId);
    if (activeTab === null) {
      return;
    }
    var width = activeTab.offsetWidth,
        left = activeTab.offsetLeft,
        allWidth = width + left,
        moveLen;
    if (cWidth < allWidth) {
      moveLen = allWidth - cWidth - parseInt($obj().css('margin-left'), 10);
      intMLId = setInterval(function () {
        moveLeft(moveLen);
      }, 10);
    } else if (left < 25) {
      moveLen = -(parseInt($obj().css('margin-left'), 10) - left + 25);
      //25 is left mover + padding
      intMLId = setInterval(function () {
        moveRight(moveLen);
      }, 10);
    }
    activeTab = null;
  },
      moveLeft = function moveLeft(moveLen) {
    var curMargin = -parseInt($obj().css('margin-left'), 10);

    if (curMargin > moveLen) {
      clearInterval(intMLId);
    } else {
      $obj().css('margin-left', -curMargin - 10 + 'px');
    }
  },
      moveRight = function moveRight(moveLen) {
    var curMargin = -parseInt($obj().css('margin-left'), 10);

    if (curMargin < moveLen || -curMargin > 0) {
      clearInterval(intMLId);
    } else {
      $obj().css('margin-left', -curMargin + 10 + 'px');
    }
  },
      move = function move(delta) {
    if (extra) {
      var curMar = parseInt($obj().css('margin-left'), 10),
          futMar = curMar + delta;
      if (futMar < 0) {
        if (extra + futMar > 0) {
          $obj().css('margin-left', futMar + 'px');
        } else {
          $obj().css('margin-left', -extra + 'px');
        }
        if (moveVar) {
          clearInterval(intId);
        }
      } else {
        $obj().css('margin-left', '0px');
        if (moveVar) {
          clearInterval(intId);
        }
      }
    }
  },
      cancelMove = function cancelMove() {
    moveVar = false;
    clearInterval(intId);
  };

  return {
    init: init,
    checkSizeFunc: checkSizeFunc,
    move: move
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.HorizontScroll.js.map

'use strict';

//hotkey module
App.HotKeys = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.obind($(document), 'keydown', hotKeyHandler);
    EventMgr.obind($(document), 'keyup', removeKeyUp);
    EventMgr.obind($(window), 'focus', removeAllKeys);
  },
      hotkeys = {},
      len = 0,
      ZERO = 0,
      ESC_KEY = 27,
      CTRL_KEY = 17,
      SHIFT_KEY = 16,
      ENTER_KEY = 13,
      SPACE = 32,
      UP = 38,
      DOWN = 40,
      LEFT = 37,
      RIGHT = 39,
      M = 77,
      A = 65,
      F = 70,
      X = 88,
      Y = 89,
      Z = 90,
      B = 66,
      C = 67,
      V = 86,
      N = 78,
      S = 83,
      D = 68,
      G = 71,
      H = 72,
      J = 74,
      K = 75,
      L = 76,
      Q = 81,
      W = 87,
      E = 69,
      R = 82,
      T = 84,
      U = 85,
      I = 73,
      O = 79,
      P = 80,
      keyDic = {
    77: 'M',
    65: 'A',
    70: 'F',
    88: 'X',
    89: 'Y',
    90: 'Z',
    66: 'B',
    67: 'C',
    86: 'V',
    78: 'N',
    83: 'S',
    68: 'D',
    71: 'G',
    72: 'H',
    74: 'J',
    75: 'K',
    76: 'L',
    81: 'Q',
    87: 'W',
    69: 'E',
    82: 'R',
    84: 'T',
    85: 'U',
    73: 'I',
    79: 'O',
    80: 'P'
  },
      keys = {},
      hotKeyHandler = function hotKeyHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode;
    keys[codeKey] = true;
    len++;
    if (e.ctrlKey) {
      keys[CTRL_KEY] = true;
    }

    if (e.shiftKey) {
      keys[SHIFT_KEY] = true;
    }
    //esc
    if (codeKey === ESC_KEY) {
      EventMgr.trigger('escKeyUp', { e: e });
      e.preventDefault();
      //enter
    } else if (codeKey === ENTER_KEY) {
      EventMgr.trigger('enterKeyUp', { e: e });
      //CTRL + SHIFT + M
    } else if (keys[CTRL_KEY] && keys[SHIFT_KEY] && keys[M]) {
      EventMgr.trigger('comboCtrlShiftMKeyUp', { codeKey: codeKey });
      e.preventDefault();
      //CTRL + SHIFT + A
    } else if (keys[CTRL_KEY] && keys[SHIFT_KEY] && keys[A]) {
      EventMgr.trigger('comboCtrlShiftAKeyUp', { codeKey: codeKey });
      e.preventDefault();
      //CTRL + SHIFT + F
    } else if (keys[CTRL_KEY] && keys[SHIFT_KEY] && keys[F]) {
      EventMgr.trigger('comboCtrlShiftFKeyUp', { codeKey: codeKey });
      e.preventDefault();
      //CTRL + SHIFT + Z
    } else if (keys[CTRL_KEY] && keys[SHIFT_KEY] && keys[Z]) {
      EventMgr.trigger('comboCtrlShiftZKeyUp', { codeKey: codeKey });
      e.preventDefault();
      //CTRL + SHIFT + X
    } else if (keys[CTRL_KEY] && keys[SHIFT_KEY] && keys[X]) {
      EventMgr.trigger('comboCtrlShiftXKeyUp', { codeKey: codeKey });
      e.preventDefault();
      //SPACE
    } else if (keys[SPACE]) {
      EventMgr.trigger('spaceKeyUp');
      window.scrollTo(0, 0);
    } else if (keys[UP]) {
      EventMgr.trigger('upKeyUp', { codeKey: codeKey, shiftKey: keys[SHIFT_KEY], ctrl: keys[CTRL_KEY] });
    } else if (keys[DOWN]) {
      EventMgr.trigger('downKeyUp', { codeKey: codeKey, shiftKey: keys[SHIFT_KEY], ctrl: keys[CTRL_KEY] });
    } else if (keys[LEFT]) {
      EventMgr.trigger('leftKeyUp', { codeKey: codeKey, shift: keys[SHIFT_KEY], ctrl: keys[CTRL_KEY] });
    } else if (keys[RIGHT]) {
      EventMgr.trigger('rightKeyUp', { codeKey: codeKey, shift: keys[SHIFT_KEY], ctrl: keys[CTRL_KEY] });
      //check for hotkey in toolbtn
    } else {
      var key = null;
      if (keyDic[codeKey]) {
        key = keyDic[codeKey];
      } else {
        for (var keyVar in keys) {
          if (keyDic[keyVar]) {
            key = keyDic[keyVar];
            break;
          }
        }
      }
      EventMgr.trigger('otherKeyUp', { keys: $.extend({}, keys), key: key, len: len, shift: keys[SHIFT_KEY], ctrl: keys[CTRL_KEY] });
    }
    codeKey = null;
  },
      removeKeyUp = function removeKeyUp(e) {
    var codeKey = e.which || e.keyCode;
    if (keys[ZERO]) {
      delete keys[ZERO];
      len--;
    }
    if (keys[codeKey]) {
      delete keys[codeKey];
      len--;
    }
    if (e.ctrlKey) {
      delete keys[CTRL_KEY];
      len--;
    }
  },
      removeAllKeys = function removeAllKeys(e) {
    keys = {};
    len = 0;
  };

  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.HotKeys.js.map

'use strict';

//module keepalive for keep session
App.KeepAlive = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.bind('loadPage', start);
  },
      keepAlive = function keepAlive() {
    var param = { func: 'keepalive' };
    EventMgr.trigger('ajaxRequest', { url: pageInfo.url, param: param, trfunc: 'DoNothing', queue: 'noqueue' });
  },
      start = function start() {
    setInterval(function () {
      keepAlive();
    }, 900001);
  };
  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.KeepAlive.js.map

'use strict';

/**
 * App.List
 * manipulation with list
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 * */
App.List = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.bind('clickedGroupItem', fillActiveRows);
    EventMgr.bind('listMultiSelect, mapMultiSelect', activateToolbarGroup);
    EventMgr.bind('listSelect, mapSelect', activateTollbarAll);
    EventMgr.bind('listUnSelect, mapUnSelect', deactivateToolbarAll);
    EventMgr.bind('switchTab', changeActTabId);
    EventMgr.bind('listMultiSelect,listSelect,listLiveFound,listUnSelect', statusBarHandler);
    EventMgr.on('#content', '.content .list_table tbody tr', 'click', rowSelect);
    EventMgr.on('#content', $tableTd(), 'mousedown', preventSelectTd);
    EventMgr.bind('hideToolBtn', toolBtnHide);
    EventMgr.bind('showToolBtn', toolBtnShow);
    EventMgr.bind('appendList', forceRowSelect);
    EventMgr.bind('appendList', bindMoveBtn);
    EventMgr.bind('updatedTableHeight', forceScrollTo);
    EventMgr.bind('comboCtrlShiftAKeyUp', selectAllRow);
    EventMgr.on(mainWrapperSel, selectAllSelector, 'click', selectAllRow);
    EventMgr.bind('comboCtrlShiftFKeyUp', focusOnSearch);
    EventMgr.bind('updateSelected', toolbarHandlerFuncWrapper);
    EventMgr.on(mainWrapperSel, tableRowSelector, 'touchstart', swipeDetectorTouchStart);
    EventMgr.bind('updateTotalList', updateStatusBarTotal);
    EventMgr.bind('updateTotalWithConvert', updateTotalWithConvert);
    EventMgr.bind('upKeyUp', arrowKeyUpHandler);
    EventMgr.bind('downKeyUp', arrowKeyDownHandler);
  },
      pageInfo = window.pageInfo,

  //current tabId (like cont-tab1)!!!
  tabId = '',
      mainWrapperSel = '#main-wrapper',
      tableRowSelector = '.list_table tr',
      selectAllSelector = 'a.select-all',

  /**
   * toolbar rows
   * @param {String} tabIdParam TabId of tab
   * @return {object} jQuery wrap nodes
   */
  $tableRow = function $tableRow(tabIdParam) {
    var tabId = '';
    if (tabIdParam) {
      tabId = '#' + tabIdParam + ' ';
    }
    return $(tabId + '.content .list_table tbody tr');
  },

  //grouping actions
  $toolbarBtnGroup = function $toolbarBtnGroup() {
    return $('#' + tabId + ' .toolbar-button__item-img.tb-group').parent();
  },

  //not grouping actions for action
  $toolBarBtnNotGroup = function $toolBarBtnNotGroup() {
    return $('#' + tabId + ' .toolbar-button__item-img.tb-not-group').parent();
  },
      $toolBarBtnNoSelEdit = function $toolBarBtnNoSelEdit() {
    return $('#' + tabId + ' .toolbar-button__item-img.tb-nosel').parent();
  },
      $tableTd = function $tableTd() {
    return 'table td';
  },

  //all toolbar btns
  $toolbarBtnAll = function $toolbarBtnAll() {
    return $('#' + tabId + ' .toolbar-button');
  },

  //prevent selected td in ff
  preventSelectTd = function preventSelectTd(e) {
    if (e.ctrlKey || e.metaKey || e.shiftKey) {
      e.preventDefault();
    }
  },
      focusOnSearch = function focusOnSearch() {
    $('.tab-content_st_active .itsearch').focus();
  },
      changeActTabId = function changeActTabId(e, data) {
    tabId = 'cont-' + data.tabId;
  },
      bindMoveBtn = function bindMoveBtn(e, data) {
    var curTabId = data.tabId;
    setTimeout(function () {
      EventMgr.trigger('bindHorizScrollControl', {
        leftBtn: '#cont-' + curTabId + ' .toolbar__btn-move_dir_left',
        rightBtn: '#cont-' + curTabId + ' .toolbar__btn-move_dir_right',
        innerBox: '#cont-' + curTabId + ' .toolbar__inner',
        id: curTabId,
        step: 50
      });
    }, 50);
  },
      selectAllRow = function selectAllRow(e) {
    var rows = $('.tab-content_st_active .list_table tbody tr'),
        sRows = $('.tab-content_st_active .list_table tbody tr.selected:not(".filtred")'),
        len = rows.length,
        sLen = sRows.length,
        firstRow;
    e = e || {};
    if (len > 0) {
      firstRow = rows[0];
      if (rows[0].className.match('back-btn')) {
        firstRow = rows[1];
        sLen += 1;
      }
      if (sLen === len) {
        rowSelect.apply(firstRow, [e]);
        rowSelect.apply(firstRow, [e, true]);
      } else {
        rows.removeClass('last-selected');
        rows.removeClass('first-selected');
        $(rows[len - 1]).addClass('last-selected');
        e.shiftKey = true;
        rowSelect.apply(firstRow, [e]);
      }
    }
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      scrollToSelectRow = function scrollToSelectRow(row, isNextRow, tabId) {
    var MAGIC_NUMBER = 22,
        offsetTop = row ? row.offsetTop : 0,
        scrollId = 'ltwr-' + tabId,
        boxHeight;
    if (offsetTop) {
      offsetTop = isNextRow ? offsetTop + MAGIC_NUMBER : offsetTop - MAGIC_NUMBER;
      boxHeight = parseInt($('#ltwr-' + tabId).css('height'), 10);
      ScrollHandler.forceMoveSelectItem(scrollId, offsetTop, boxHeight, 22);
    }
  },
      selectFirstRow = function selectFirstRow() {
    var rows = $('.tab-content_st_active .list_table tbody tr'),
        firstRow = rows[0];
    if (firstRow && firstRow.className) {
      if (firstRow.className.match('back-btn')) {
        firstRow = rows[1];
      }
      rowSelect.apply(firstRow, [{}]);
    }
  },
      arrowKeyUpHandler = function arrowKeyUpHandler(e, d) {
    if (window.document.activeElement && window.document.activeElement.getAttribute('type')) {
      return;
    }
    var actTab = $('.tab-content_st_active'),
        type = actTab.attr('data-tab-type');
    if (type === 'list') {
      var $sRows = $('.tab-content_st_active .list_table tbody tr.selected:not(".filtred")'),
          $prevRow;
      if ($sRows.first().hasClass('first-selected')) {
        $prevRow = $sRows.last().prev();
      } else {
        $prevRow = $sRows.prev();
      }
      if ($prevRow.length) {
        rowSelect.apply($prevRow[0], [d]);
        scrollToSelectRow($prevRow[0], false, actTab.attr('data-tabid'));
      } else if (!$sRows.length) {
        selectFirstRow();
      }
    }
  },
      arrowKeyDownHandler = function arrowKeyDownHandler(e, d) {
    if (window.document.activeElement && window.document.activeElement.getAttribute('type')) {
      return;
    }
    var actTab = $('.tab-content_st_active'),
        type = actTab.attr('data-tab-type');
    if (type === 'list') {
      var $sRows = $('.tab-content_st_active .list_table tbody tr.selected:not(".filtred")'),
          $nextRow;
      if ($sRows.first().hasClass('first-selected')) {
        $nextRow = $sRows.last().next();
      } else {
        $nextRow = $sRows.next();
      }
      if ($nextRow.length) {
        rowSelect.apply($nextRow[0], [d]);
        scrollToSelectRow($nextRow[0], true, actTab.attr('data-tabid'));
      } else if (!$sRows.length) {
        selectFirstRow();
      }
    }
  },


  //handler of selecting rows
  rowSelect = function rowSelect(e, fakeCtrl) {
    var self = $(this),
        tabIdOrg = self.parents('.tab-content').attr('data-tabid'),
        tableRows,
        i,
        k,
        elem,
        lastId,
        firstId,
        curId,
        lastIdElem,
        smthg;
    e = e || window.event;

    tabId = 'cont-' + tabIdOrg;
    if (tabIdOrg === 'tab0') {
      tabId = self.parents('.block-table').attr('id');
    }
    tableRows = $tableRow(tabId);

    //not select if nothing do with
    if (!self.attr('data-elid')) {
      if (!e.ctrlKey && !e.metaKey && !e.shiftKey && !fakeCtrl) {
        tableRows.removeClass('selected').removeClass('last-selected').removeClass('first-selected');
      }
      return;
    }
    //check for link in changelog
    if (e.target && e.target.nodeName === 'A') {
      return true;
    }

    if (!e.ctrlKey && !e.metaKey && !e.shiftKey && !fakeCtrl) {
      tableRows.removeClass('selected').removeClass('last-selected').removeClass('first-selected');
      self.addClass('selected').addClass('last-selected');
      //with SHIFT KEY
    } else if (e.shiftKey) {
      tableRows.removeClass('selected');
      lastIdElem = $('#lt-' + tabIdOrg + ' tr.last-selected');
      lastId = lastIdElem.attr('id');
      firstId = $('#lt-' + tabIdOrg + ' tr.first-selected').attr('id');
      if (!firstId) {
        firstId = lastId;
        lastIdElem.addClass('first-selected');
      }
      curId = self.attr('id');
      if (firstId === undefined) {
        return;
      }
      firstId = parseInt(firstId.replace('i-', ''), 10);
      curId = parseInt(curId.replace('i-', ''), 10);
      //go down
      i = 0;
      k = 0;
      if (firstId > curId) {
        i = curId;
        k = firstId;
        //go up
      } else {
        i = firstId;
        k = curId;
      }

      for (i; i <= k; i++) {
        elem = $('tr#i-' + i);
        if (elem.attr('data-elid')) {
          elem.addClass('selected');
        }
      }

      tableRows.removeClass('last-selected');
      self.addClass('last-selected');
      // Remove text selection
      if (document.selection) {
        if (document.selection.type.toLowerCase() !== 'none') {
          document.selection.empty();
        }
      } else if (window.getSelection) {
        smthg = window.getSelection();try {
          smthg.collapseToStart();
        } catch (ex) {}
      }
      //with CTRL KEY
    } else {
      //multiselect
      tableRows.removeClass('last-selected').removeClass('first-selected');
      self.toggleClass('selected').addClass('last-selected');
      if (document.selection) {
        if (document.selection.type.toLowerCase() !== 'none') {
          document.selection.empty();
        }
      } else if (window.getSelection) {
        smthg = window.getSelection();
        try {
          smthg.collapseToStart();
        } catch (ex) {}
      }
    }

    toolbarHandler(tabId);
    if (e.preventDefault) {
      e.preventDefault();
    }
  },
      toolbarHandlerFuncWrapper = function toolbarHandlerFuncWrapper(e, data) {
    if (data.tabId) {
      toolbarHandler('cont-' + data.tabId);
    }
  },

  /**
   * Toolbar handlers when selecting elements
   * @param {String} tabId
   */
  toolbarHandler = function toolbarHandler(tabId) {
    var len,
        toolBtnShow,
        toolBtnHide,
        toolBtnsRemove,
        $selectedRows = $('#' + tabId + ' tr.selected:not(".filtred")');
    len = $selectedRows.length;
    //trigger events
    if (len === 0) {
      EventMgr.trigger('listUnSelect', {
        tabId: tabId,
        len: len,
        selectedRows: $selectedRows });
    } else if (len > 1) {
      EventMgr.trigger('listMultiSelect', {
        tabId: tabId,
        len: len,
        selectedRows: $selectedRows });
    } else {
      EventMgr.trigger('listSelect', {
        tabId: tabId,
        len: len,
        selectedRows: $selectedRows });
    }
    //hide showed button
    var $showedNodes = $('.toolbtnShow').parent();
    if ($showedNodes.hasClass('active')) {
      $showedNodes.switchClass('notActive', 'active').attr('data-state', 'disabled');
    } else {
      $showedNodes.attr('data-state', null);
    }
    toolBtnShow = $('#' + tabId + ' tr.selected.toolbtn-show:not(".filtred")');
    if (toolBtnShow.length > 0) {
      EventMgr.trigger('showToolBtn', {
        toolBtnShow: toolBtnShow, len: len });
    }
    toolBtnHide = $('#' + tabId + ' tr.selected.toolbtn-hide:not(".filtred")');
    if (toolBtnHide.length > 0) {
      EventMgr.trigger('hideToolBtn', { toolBtnHide: toolBtnHide });
    }
    toolBtnsRemove = $('#' + tabId + ' tr.selected.toolbtn-remove:not(".filtred")');
    if (toolBtnsRemove.length > 0) {
      toolBtnRemove(toolBtnsRemove);
    }
  },

  //force rowSelect [used in warning about not deleted elems]
  forceRowSelect = function forceRowSelect(e, data) {
    var tabId = data.tabId,
        keyVar,
        self;
    if (App.Global.warning) {
      /* jslint forin: true */
      for (keyVar in App.Global.warning) {
        self = $('#cont-' + tabId + ' [data-elid="' + App.Common.CSSEscape(keyVar) + '"]');
        rowSelect.apply(self, [{}, true]);
      }
      App.Global.warning = null;
    }
    if (App.Global.selid) {
      var len = App.Global.selid.length;
      while (len--) {
        self = $('#cont-' + tabId + ' [data-elid="' + App.Common.CSSEscape(App.Global.selid[len]) + '"]');
        rowSelect.apply(self, [{}, true]);
      }
      App.Global.selid = undefined;
    }
  },
      forceScrollTo = function forceScrollTo(e, data) {
    var tabId = data.tabId;
    if (App.Global.scrollTop) {
      setTimeout(function () {
        ScrollHandler.scrollTo('ltwr-' + tabId, App.Global.scrollTop, true, true);
        App.Global.scrollTop = undefined;
      }, 10);
    }
  },
      toolBtnRemove = function toolBtnRemove(elems) {
    var l = elems.length,
        removeClass;
    while (l--) {
      removeClass = elems[l].getAttribute('data-remove');
      removeClass = String(removeClass).replace(/,\s+$/, '');
      $(removeClass).parent().addClass('removed').removeClass('active');
    }
  },


  //disable toolbtn
  toolBtnHide = function toolBtnHide(e, data) {
    //selected rows
    var $toolBtnHide = data.toolBtnHide,
        l = $toolBtnHide.length,
        len = l,
        hideClass,
        hides = {},
        hideClassArray,
        $targetNode,
        duplicate;
    //count hide rules for each toolbtn
    while (l--) {
      //hide class has id button
      hideClass = $toolBtnHide[l].getAttribute('data-hide');
      hideClass = String(hideClass).replace(/,\s+$/, '');
      hideClassArray = hideClass.split(', ');
      duplicate = {};
      for (var i = 0, hLen = hideClassArray.length; i < hLen; i++) {
        hideClass = hideClassArray[i];
        if (duplicate[hideClass]) {
          continue;
        }
        if (!hides[hideClass]) {
          hides[hideClass] = 0;
        }
        hides[hideClass] += 1;
        duplicate[hideClass] = true;
      }
    }
    //if all rows in rules - hide btn
    for (var key in hides) {
      if (hides[key] === len) {
        $targetNode = $(key).parent();
        if ($targetNode.hasClass('active')) {
          $targetNode.switchClass('notActive', 'active').attr('data-state', 'disabled');
        }
      }
    }
  },

  //enable toolbtn
  //show rules check
  toolBtnShow = function toolBtnShow(e, data) {
    var $toolBtnShow = data.toolBtnShow,
        classArr,
        len,
        rules = {},
        countRow = data.len,
        showClass;
    $toolBtnShow.each(function () {
      showClass = this.getAttribute('data-show');
      //for show toolbtn if one value for selected row
      if (countRow > 1) {
        classArr = showClass.split(',');
        len = classArr.length;
        showClass = '';
        while (len--) {
          if (classArr[len] !== ' ' && classArr[len] !== '') {
            if (!rules[classArr[len]]) {
              rules[classArr[len]] = 1;
            } else {
              rules[classArr[len]]++;
            }
          }
        }
      } else {
        showClass = String(showClass).replace(/,\s+$/, '');
        $(showClass).parent().switchClass('active', 'notActive').attr('data-state', null);
      }
    });
    //if more one selected rows, check for rules each row
    if (countRow > 1) {
      /* jslint forin:true */
      for (var keyVar in rules) {
        //for group && inert toolbtn
        showClass = keyVar + '.tb-group, ' + keyVar + '.tb-inert';
        $(showClass).parent().switchClass('active', 'notActive').attr('data-state', null);
      }
    }
  },

  /**
   * enabling group's btns
   * disabling not group's btns
   * @param {object} e event object
   * @param {object} data data object
   */
  activateToolbarGroup = function activateToolbarGroup(e, data) {
    tabId = data ? data.tabId ? data.tabId : tabId : tabId;
    $toolBarBtnNotGroup().switchClass('notActive', 'active').removeClass('removed').attr('data-state', 'noselect');
    $toolbarBtnGroup().switchClass('active', 'notActive').removeClass('removed').attr('data-state', null);
    $toolBarBtnNoSelEdit().switchClass('notActive', 'active').attr('data-state', 'noselect');
  },

  //enabling all toolbar's btns
  activateTollbarAll = function activateTollbarAll(e, data) {
    tabId = data ? data.tabId ? data.tabId : tabId : tabId;
    $toolbarBtnAll().switchClass('active', 'notActive').removeClass('removed').attr('data-state', null);
  },
      isDenyByHideRules = function isDenyByHideRules(classes, ovhide) {
    var hides = String(ovhide).split(','),
        l = hides.length,
        hideId;
    while (l--) {
      if (hides[l] && hides[l] !== ' ') {
        hideId = hides[l].replace('#', '');
        if (String(classes).match(hideId)) {
          return true;
        }
      }
    }
    return false;
  },

  /**
   * check for show rules in this row
   * @param {String} classes
   * @param {String} ovshow
   * @return {boolean}
   */
  isAllowByShowRules = function isAllowByShowRules(classes, ovshow) {
    var shows = String(ovshow).split(','),
        l = shows.length,
        showId;
    if (classes.match('toolbtnShow')) {
      while (l--) {
        if (shows[l] && shows[l] !== ' ') {
          showId = shows[l].replace('.', '');
          if (String(classes).match(showId)) {
            return true;
          }
        }
      }
    } else {
      return true;
    }
    return false;
  },

  //get array of name key fields active rows and create url
  fillActiveRows = function fillActiveRows(e, data) {
    var activeRows = [],
        elids = [],
        invar = data.invar,
        locTabId = data.invar.tabId,
        $curTab = $('#cont-' + locTabId),
        toolbar = $curTab.find('.toolbar'),
        plid = filterXSS.friendlyAttrValue(toolbar.attr('data-plid') || ''),
        convert = toolbar.attr('data-convert'),
        triggerAction = data.triggerAction || 'listSelectedData',
        j = 0,
        classes = data.classes,
        content = data.__content,
        actRowString;
    $curTab.find('tr.selected:not(".filtred")').each(function () {
      var rowIndex = this.getAttribute('data-index');
      if (content[rowIndex]) {
        if (content[rowIndex]._ovhide) {
          if (isDenyByHideRules(classes, content[rowIndex]._ovhide)) {
            return true;
          }
        }
        if (content[rowIndex]._ovshow) {
          if (!isAllowByShowRules(classes, content[rowIndex]._ovshow)) {
            return true;
          }
        }
      }
      if (j < 10) {
        var elName = String(this.getAttribute('data-elkeyname')),
            elNameLength = elName.length;
        if (elNameLength > 50) {
          elName = elName.substring(0, 50);
          elName += '...';
        }
        activeRows.push('<span class="b-text-wrapper">' + window.htmlEncode(elName) + '</span>');
      }
      elids.push(String(this.getAttribute('data-elid')).replace(/,\s/g, ', , '));
      j++;
    });
    actRowString = activeRows.join(', ');
    elids = elids.join(', ');
    if (j > 10) {
      actRowString += pageInfo.totalelem.replace(/__s__/, j);
    }
    if (convert) {
      invar.params.tconvert = convert;
    }
    invar.params.elid = elids;
    invar.params.plid = plid || '';
    invar.rows = actRowString;

    EventMgr.trigger(triggerAction, invar);
  },

  //disabling all toolbar's btns exclude "new" and "back" btns
  deactivateToolbarAll = function deactivateToolbarAll(e, data) {
    tabId = data ? data.tabId ? data.tabId : tabId : tabId;
    $toolBarBtnNotGroup().switchClass('notActive', 'active').removeClass('removed').attr('data-state', 'noselect');
    $toolbarBtnGroup().switchClass('notActive', 'active').removeClass('removed').attr('data-state', 'noselect');
    $toolBarBtnNoSelEdit().switchClass('active', 'notActive').attr('data-state', null);
  },

  //recalc total of col in list
  updateStatusBarTotal = function updateStatusBarTotal(e, data) {
    if (!data.__headers || !data.__content) {
      return;
    }
    var colName = data.colName,
        content = data.__content,
        index = data.index,
        tabId = data.tabId,
        l = content.length,
        total = 0;
    while (l--) {
      if (content[l][colName]) {
        total += content[l][colName].v - 0;
      }
    }
    $('#cont-' + tabId).find('.sb-result_index_' + index).html(total);
  },
      statusBarHandler = function statusBarHandler(e, data) {
    //check for selected row from from
    if (!data.__headers || !data.__content) {
      return;
    }
    var tabId = data.tabId,
        len = data.len,
        headers = data.__headers,
        tableContent = data.__content,
        headersLens = headers.length,
        l,
        $sbr,
        $sbs,
        $1sbr,
        $1sbs,
        $selectedRows = data.selectedRows,
        selecedCount,
        defPropStat,
        index,
        total = {},
        type,
        resultSum;
    $1sbr = $('#' + tabId + ' .sb-result_index_0');
    $1sbs = $('#' + tabId + ' .sb-selected_index_0');
    if (len !== 0) {
      //1st total col
      $1sbr.removeClass('sb-result_st_active');
      selecedCount = $1sbs.addClass('sb-selected_st_active').html().replace(/\d{1,100}/, len);
      $1sbs.html(selecedCount);
      //each for all selected elems
      $selectedRows.each(function (i) {
        index = this.getAttribute('data-index');
        l = headersLens;
        while (l--) {
          type = headers[l].type;
          //check for total
          if (headers[l].total) {
            if (tableContent[index] && tableContent[index][headers[l].name]) {
              if (type === 'data' || type === 'money') {
                //calc data
                total[l] = dataCalc(total[l], tableContent[index][headers[l].name]);
              } else if (type === 'indicator') {
                //calc indicator
                total[l] = indicatorCalc(total[l], tableContent[index][headers[l].name]);
              } else if (type === 'prop') {
                //calc props
                total[l] = propCalc(total[l], tableContent[index][headers[l].name]);
              }
            }
          }
          //update html here
          if (i === len - 1) {
            if (headers[l].total) {
              //all total
              $sbr = $('#' + tabId + ' .sb-result_index_' + l).removeClass('sb-result_st_active');
              //selected total
              $sbs = $('#' + tabId + ' .sb-selected_index_' + l).addClass('sb-selected_st_active');
              if (type === 'data' || type === 'money') {
                resultSum = '';
                /* jslint forin: true */
                for (var key in total[l]) {
                  if (key === 'TOTAL_FINAL') {
                    continue;
                  }
                  if (resultSum !== '') {
                    resultSum += '; ';
                  }
                  if (type === 'money') {
                    resultSum += App.Tabs.moneyFormat(total[l][key]) + ' ' + key;
                  } else {
                    resultSum += total[l][key] + ' ' + key;
                  }
                  if (headers[l].convert && headers[l].convert !== 'money') {
                    convertData(headers[l].convert, resultSum, $sbs);
                  }
                }
                $sbs.html(pageInfo.total + ': ' + resultSum);
              } else if (type === 'indicator') {
                if (headers[l].convert) {
                  convertData(headers[l].convert, total[l], $sbs);
                } else {
                  $sbs.html(pageInfo.total + ': ' + total[l].c);
                }
              } else if (type === 'prop') {
                defPropStat = $sbr.html();
                $sbs.html(renderPropsStat(total[l], defPropStat));
              }
            }
          }
        }
      });
    } else {
      //1st total col
      $1sbr.addClass('sb-result_st_active');
      $1sbs.removeClass('sb-selected_st_active');
      //show default values
      l = headersLens;
      while (l--) {
        if (headers[l].total) {
          $('#' + tabId + ' .sb-result_index_' + l).addClass('sb-result_st_active');
          $('#' + tabId + ' .sb-selected_index_' + l).removeClass('sb-selected_st_active');
        }
      }
    }
  },

  //convert data
  convertData = function convertData(name, value, $sbs) {
    var invar = {
      $sbs: $sbs
    };
    //logic for indicator convert
    if (value && value.a !== undefined) {
      invar.__value = value;
      invar.__name = name;
      if (value.a_converted) {
        value = value.b;
        invar.__current = 'b';
      } else {
        value = value.a;
        invar.__current = 'a';
      }
    }

    EventMgr.trigger('ajaxRequest', {
      param: {
        func: 'convert',
        name: name,
        value: value
      },
      invar: invar,
      type: 'get',
      outtype: 'json',
      trfunc: 'updateTotalWithConvert',
      failfunc: 'DoNothing',
      queue: 'multiload'
    });
  },

  /**
   * Calculate data
   * @param {object|undefined} resultC template object with current
   * calculated data
   * @param {number|string} current number
   * @return {object}
   **/
  dataCalc = function dataCalc(resultC, current) {
    if (current.total && current.total === 'ignore') {
      return resultC;
    }
    if (current.total && current.total === 'final') {
      resultC = {
        TOTAL_FINAL: true,
        '': current.orig || current.v
      };
      return resultC;
    } else if (resultC && resultC.TOTAL_FINAL) {
      return resultC;
    }
    var dec1,
        dec2 = 0,
        maxDec = 0,
        suffix;
    resultC = resultC || {};
    current = current.orig || current.v;
    suffix = current.replace(/[0-9\s\.,-]+/, '');
    current = current.replace(suffix, '').replace(/\s/g, '');
    if (resultC[suffix] && resultC[suffix].length > 12 || current.length > 12) {
      if (!resultC[suffix]) {
        resultC[suffix] = current;
      } else {
        resultC[suffix] = calcLongNumber(resultC[suffix], current);
      }
    } else {
      //check for suffix like "USD", "EUR"
      if (resultC[suffix]) {
        dec1 = decimalPlaces(resultC[suffix]);
        dec2 = decimalPlaces(current);
        maxDec = dec1 > dec2 ? dec1 : dec2;
      } else {
        maxDec = decimalPlaces(current);
      }
      if (current === '') {
        current = '0';
      }
      if (!resultC[suffix]) {
        resultC[suffix] = parseFloat(current);
      } else {
        resultC[suffix] = parseFloat(resultC[suffix]) + parseFloat(current);
      }
    }
    if (resultC[suffix]) {
      resultC[suffix] = resultC[suffix].toFixed ? resultC[suffix].toFixed(maxDec) : resultC[suffix];
    }
    return resultC;
  },
      indicatorCalc = function indicatorCalc(resultC, current) {
    resultC = resultC || { a: 0, b: 0, c: 0 };
    current.u = current.u_orig || current.u;
    current.l = current.l_orig || current.l;
    if (resultC.a.length > 12 || current.u.length > 12) {
      resultC.a = calcLongNumber(resultC.a, current.u);
    } else {
      resultC.a = parseInt(resultC.a, 10) + parseInt(current.u, 10);
    }
    if (resultC.b.length > 12 || current.l.length > 12) {
      resultC.b = calcLongNumber(resultC.b, current.l);
    } else {
      resultC.b = parseInt(resultC.b, 10) + parseInt(current.l, 10);
    }
    if (isNaN(resultC.a)) {
      resultC.a = '-';
    }
    if (isNaN(resultC.b)) {
      resultC.b = '-';
    }
    resultC.c = resultC.a + ' / ' + resultC.b;
    return resultC;
  },
      decimalPlaces = function decimalPlaces(num) {
    var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match) {
      return 0;
    }
    return Math.max(0,
    // Number of digits right of decimal point.
    match[1] ? match[1].length : 0,
    // Adjust for scientific notation.
    -(match[2] ? +match[2] : 0));
  },
      calcLongNumber = function calcLongNumber(num1, num2) {

    var calcLongNaturalNumber = function calcLongNaturalNumber(num1, num2, one) {
      num1 = String($.trim(num1));
      num2 = String($.trim(num2));

      var num1Arr = num1.split('').reverse(),
          num2Arr = num2.split('').reverse(),
          newNum = [],
          bigNum = null,
          next = 0,
          i;
      if (one) {
        next = 1;
      }
      var len1 = num1Arr.length,
          len2 = num2Arr.length,
          len = 0,
          firstPart = '';
      if (len1 > len2) {
        len = len2;
        bigNum = num1;
      } else {
        len = len1;
        bigNum = num2;
      }
      for (i = 0; i < len; i++) {
        var tmpNum = parseInt(num1Arr[i], 10) + parseInt(num2Arr[i], 10) + next;
        if (tmpNum >= 10) {
          tmpNum = tmpNum - 10;
          next = 1;
        } else {
          next = 0;
        }
        newNum.push(tmpNum);
      }
      if (len1 === len2) {
        if (next === 1) {
          newNum.push(1);
        }
      } else {
        firstPart = bigNum.substr(0, bigNum.length - i - 1);
        newNum.push(parseInt(bigNum[bigNum.length - i - 1], 10) + next);
      }
      newNum.push(firstPart);
      newNum.reverse();
      return newNum.join('');
    },
        addZeroes = function addZeroes(str, num) {
      var z = '',
          i;
      for (i = 0; i < num; i++) {
        z += '0';
      }
      return str + z;
    };

    var result = '';
    if (String(num1).indexOf('.') !== -1 || String(num2).indexOf('.') !== -1) {
      var num1Tail = num1.split('.'),
          num2Tail = num2.split('.'),
          resultTail = '',
          resultHead = '';
      if (num1Tail[1] === undefined) {
        resultTail = num2Tail[1];
      } else if (num2Tail[1] === undefined) {
        resultTail = num1Tail[1];
      } else {
        var len1 = num1Tail[1].length,
            len2 = num2Tail[1].length,
            bigLen = 0;
        if (len1 > len2) {
          bigLen = len1;
          num2Tail[1] = addZeroes(num2Tail[1], len1 - len2);
        } else {
          bigLen = len2;
          num1Tail[1] = addZeroes(num1Tail[1], len2 - len1);
        }
        resultTail = calcLongNaturalNumber(num1Tail[1], num2Tail[1]);
        if (resultTail.length > bigLen) {
          resultHead = calcLongNaturalNumber(num1Tail[0], num2Tail[0], true);
        } else {
          resultHead = calcLongNaturalNumber(num1Tail[0], num2Tail[0]);
        }
        result = resultHead + '.' + resultTail;
      }
    } else {
      result = calcLongNaturalNumber(num1, num2);
    }
    return result;
  },
      propCalc = function propCalc(resultC, current) {
    if (resultC === undefined) {
      resultC = [];
    }
    var cStat = current.psp,
        cStatArr,
        len;
    if (!cStat) {
      return;
    }
    cStatArr = cStat.split(':');
    len = cStatArr.length;
    for (var i = 0; i < len; i++) {
      resultC[i] = parseInt(resultC[i] ? resultC[i] : 0, 10) + parseInt(cStatArr[i], 10);
    }
    return resultC;
  },
      renderPropsStat = function renderPropsStat(self, statAll) {
    if (!self) {
      return '';
    }
    var statAllArr = statAll.split(',');
    for (var i = 0; i < self.length; i++) {
      //ignore error with data
      if (statAllArr[i] === undefined) {
        break;
      }
      statAllArr[i] = statAllArr[i].replace(/>\d+/, '>' + self[i]);
      if (self[i] - 0 === 0) {
        statAllArr[i] = statAllArr[i].replace(/class=\"default\"/, 'class="no"');
      } else {
        statAllArr[i] = statAllArr[i].replace(/class=\"no\"/, 'class="default"');
      }
    }
    return statAllArr.join(', ');
  },
      swipeStarted = false,
      swipeTouch,
      swipeDetecting = false,
      swipeX,
      swipeY,
      swipeElem,
      swipeDetectorTouchStart = function swipeDetectorTouchStart(e) {
    if (e.touches && (e.touches.length !== 1 || swipeStarted)) {
      return;
    }
    swipeDetecting = true;
    swipeTouch = e.originalEvent.changedTouches[0];
    swipeX = swipeTouch.pageX;
    swipeY = swipeTouch.pageY;
    swipeElem = this;
    document.ontouchmove = swipeDetectorTouchMove;
    document.ontouchend = swipeDetectorTouchDrop;
    document.ontouchcancel = swipeDetectorTouchDrop;
  },
      swipeDetectorTouchMove = function swipeDetectorTouchMove(e) {
    var curTouch = e.changedTouches[0];
    if (!swipeStarted && !swipeDetecting) {
      return;
    }
    if (curTouch[0] === swipeTouch) {
      return;
    }
    if (Math.abs(swipeX - curTouch.pageX) >= Math.abs(swipeY - curTouch.pageY)) {
      e.preventDefault();
      swipeStarted = true;
    }
    swipeDetecting = false;
    if (swipeStarted) {
      $(swipeElem).trigger('click');
      $(swipeElem).trigger('dblclick');
    }
  },
      swipeDetectorTouchDrop = function swipeDetectorTouchDrop(e) {
    document.ontouchmove = null;
    document.ontouchend = null;
    document.ontouchcancel = null;
    swipeStarted = false;
    swipeTouch = null;
    swipeDetecting = false;
    swipeX = null;
    swipeY = null;
    swipeElem = null;
  },
      updateTotalWithConvert = function updateTotalWithConvert(e, data) {
    var $targetTotal = data.$sbs,
        value = data.convertValue;
    //logic for indicator
    if (data.__value && data.__current) {
      if (data.__current === 'a') {
        data.__value.a_converted = value;
        convertData(data.__name, data.__value, data.$sbs);
        return;
      } else if (data.__current === 'b') {
        value = data.__value.a_converted + ' / ' + value;
      }
    }
    $targetTotal.html(pageInfo.total + ': ' + value);
  };
  return {
    dataCalc: dataCalc,
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.List.js.map

'use strict';

/**
 * App.Listsorting
 * sorting table list
 * @param {object} window global object
 * @param {function} $ jQuery
 * @param {object} EventMgr EventManager
 * @param {object} App EventManager
 *
 */
App.ListSorting = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on('#main-wrapper', '.td_sort .ovf', 'click', sortRows);
    EventMgr.on('#main-wrapper', '.td_client_sort .ovf', 'click', sortRowsOnClient);
  },
      sortCol = function sortCol(a, b) {
    if (b.number === a.number) {
      return 0;
    }
    if (b.number < a.number) {
      return 1;
    } else {
      return -1;
    }
  },
      sortA = function sortA(a, b) {
    if (b.data === a.data) {
      return 0;
    }
    if (b.data < a.data) {
      return 1;
    } else {
      return -1;
    }
  },
      sortD = function sortD(a, b) {
    if (!a.data) {
      return -1;
    } else if (!b.data) {
      return 1;
    }
    a = a.data.replace(/[A-Za-z!,@,#,$,%,^,&,*,?,_,~"'/=<>|]+\-/g, '').replace(/[A-Za-z!,@,#,$,%,^,&,*,?,_,~"'/=<>|]/g, '').replace(/[-]+\s/g, '').replace(/-{2,}/, '-');
    b = b.data.replace(/[A-Za-z!,@,#,$,%,^,&,*,?,_,~"'/=<>|]+\-/g, '').replace(/[A-Za-z!,@,#,$,%,^,&,*,?,_,~"'/=<>|]/g, '').replace(/[-]+\s/g, '').replace(/-{2,}/, '-');
    return parseFloat(a) - parseFloat(b);
  },
      sortRowsOnClient = function sortRowsOnClient(e) {
    //for selected text
    if (typeof window.getSelection !== 'undefined') {
      var selection = window.getSelection();
      if (selection.toString() !== '') {
        return;
      }
    }
    var sortType = this.getAttribute('data-sorttype'),
        porder = this.getAttribute('data-order'),
        coln = this.getAttribute('data-coln'),
        parent = $(this).parents('.block-table'),
        tableId = parent.attr('id'),
        table = document.getElementById('lt-' + tableId);
    if (table === null) {
      return;
    }
    var body = table.tBodies[0],
        rows = body.rows,
        len = rows.length,
        orig,
        $col,
        $colContent,
        mRows = [],
        o = {},
        i,
        j,
        $row,
        tableHead,
        HeadList,
        hLRow,
        attrs,
        l,
        $hRow,
        hRow,
        startI = 0,
        cLen = 0;
    if (!porder || porder === 'desc') {
      porder = true;
    } else {
      porder = false;
    }

    for (i = startI; i < len; i++) {
      o = {};
      o.row = [];
      for (j = 0; j < rows[i].cells.length; j++) {
        o.row.push(rows[i].cells[j].innerHTML);
      }
      $row = $(rows[i]);
      //copy and remove all attributes
      attrs = rows[i].attributes;
      l = attrs.length;
      o.attrs = [];
      while (l--) {
        if (attrs[l].nodeName !== 'id') {
          o.attrs.push({
            name: attrs[l].nodeName,
            value: attrs[l].nodeValue
          });
          rows[i].removeAttribute(attrs[l].nodeName);
        }
      }
      $col = $row.find('.data-wrapper')[coln];
      if ($col) {
        //check for orig value
        orig = null;
        $colContent = $($col).find('.b-list__table-col-content');
        if ($colContent.length) {
          orig = $colContent[0].getAttribute('data-orig');
        }
        if (orig) {
          o.data = orig;
        } else {
          o.data = $colContent.length ? $colContent.html() : $col.innerHTML;
        }
      }
      mRows.push(o);
    }

    if (sortType === 'alpha') {
      mRows.sort(sortA);
    } else if (sortType === 'digit') {
      mRows.sort(sortD);
    }

    if (!porder) {
      mRows.reverse();
    }

    for (i = startI; i < len; i++) {
      cLen = rows[i].cells.length;
      for (j = 0; j < cLen; j++) {
        App.u.replaceHtml(rows[i].cells[j], mRows[i].row[j]);
      }
      //copy all attributes
      if (mRows[i].attrs) {
        attrs = mRows[i].attrs;
        l = attrs.length;
        while (l--) {
          rows[i].setAttribute(attrs[l].name, attrs[l].value);
        }
      }
      //even class add
      if (i % 2 !== 0) {
        if (!rows[i].className.match(/even/)) {
          rows[i].className += ' even';
        }
      } else {
        rows[i].className = rows[i].className.replace(/even/, '');
      }
    }

    tableHead = document.getElementById('lt-' + tableId);
    if (tableHead === null) {
      return;
    }
    hRow = tableHead.tHead.rows[0].cells[coln];
    $hRow = $(hRow);
    $('#lt-' + tableId + ' .triangle').removeClass('triangl-bot').removeClass('triangl-top');

    if (!porder) {
      $hRow.find('.triangle').addClass('triangl-top');
      $hRow.find('.ovf').attr('data-order', 'desc');
    } else {
      $hRow.find('.triangle').addClass('triangl-bot');
      $hRow.find('.ovf').attr('data-order', 'asc');
    }
  },
      serverSorting = function serverSorting(elem, block, ctrl) {
    var csorting = elem.getAttribute('sorting'),
        ccolname = elem.getAttribute('data-colname'),
        params = {},
        dashboard = '',
        pNum,
        func,
        tabId,
        id,
        cols = [],
        sorting,
        colname,
        pCurrent = '';
    //table in dashboard and not
    if (!block) {
      tabId = $(elem).parents('.content').attr('data-tabid');
      var tabCont = $('#cont-' + tabId);
      pNum = tabCont.attr('data-pnum');
    } else {
      var parent = $(elem).parents('.block-table'),
          name = parent.attr('data-block-name');
      id = parent.attr('id');
      tabId = id;
      dashboard = '&dashboard=' + name;
      pNum = parent.attr('data-block-pnum');
      params.dashboard = name;
      func = parent.attr('data-block-func');
    }
    //if add field to sorting, build string soting
    if (ctrl) {
      $('#sort_table-' + tabId).find('.td_sort .ovf').each(function () {
        sorting = this.getAttribute('sorting');
        colname = this.getAttribute('data-colname');
        if (sorting) {
          cols.push({
            name: this.getAttribute('data-colname'),
            value: sorting,
            number: String(sorting).charAt(1)
          });
        }
      });
      cols.sort(sortCol);
      //make string
      for (var i = 0, l = cols.length; i < l; i++) {
        if (i !== 0) {
          pCurrent += ',';
        }
        pCurrent += cols[i].value.charAt(0) + cols[i].name;
      }
    } else {
      //add sorting if exist
      if (csorting) {
        ccolname = csorting.charAt(0) + ccolname;
      }
    }

    /* jslint camelcase: false */
    //format: '+/-name,+/-name';
    params.p_current = pCurrent;
    params.p_num = pNum;
    //format: '+/-name';
    params.p_col = ccolname;
    /* jslint camelcase: true */
    if (!block) {
      EventMgr.trigger('reloadTab', { tabId: tabId, param: params });
    } else {
      params.func = func;
      EventMgr.trigger('ajaxRequest', {
        param: params,
        invar: { blockId: id },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponseForDashboard',
        failfunc: 'failedAjaxResponseForDashboard',
        queue: 'noqueue' });
    }
  },
      sortRows = function sortRows(e, data) {
    //for selected text
    if (typeof window.getSelection !== 'undefined') {
      var selection = window.getSelection();
      if (selection.toString() !== '') {
        return;
      }
    }
    var block = false;
    if ($(this).parents('.block-table').length > 0) {
      block = true;
    }

    serverSorting(this, block, e.ctrlKey || e.metaKey);

    blockEvent(e);
    e.preventDefault();
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ListSorting.js.map

'use strict';

/**
 * Live filter module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
/*global App:true*/
App.LiveListFilter = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on(mainWrapperSel, '.itsearch', 'keyup', searchHandler);
    EventMgr.on(mainWrapperSel, '.itsearch', 'focus', showHint);
    EventMgr.on(mainWrapperSel, '.itsearch', 'blur', hideHint);
    EventMgr.bind('appendList', listIndex);
    EventMgr.bind('forceListIndex', listIndex);
    EventMgr.bind('closeTabEvent', removeIndex);
    EventMgr.on(mainWrapperSel, '.close_tsearch a', 'click', closeSearch);
  },
      appDom = App.Dom,
      pageInfo = window.pageInfo,

  //object with index of rows
  listIndexObj = {},
      HIGHLIGHT = 'live-search-highlighted',
      mainWrapperSel = '#main-wrapper',
      table = null,
      MINFINDLENGTH = 2,


  /**
   * show hint about find only current page
   * @this {Node}
   */
  showHint = function showHint() {
    var tabId = this.getAttribute('data-tabid'),
        pager = appDom.byId('_pager-slist-' + tabId);
    if (pager) {
      EventMgr.trigger('forceShowHint', {
        elem: this,
        hint: pageInfo.messages.hintLivefilter
      });
    }
  },

  /**
  *
  * @param {object} e
  */
  hideHint = function hideHint(e) {
    EventMgr.trigger('hideHint');
  },

  /**
   * close search box
   * @param {object} e
   */
  closeSearch = function closeSearch(e) {
    var tabId = this.getAttribute('data-tabid'),
        input = appDom.byId(tabId + '-search');
    input.value = '';

    searchHandler.apply(input, []);
    e.preventDefault();
  },
      reverse = false,

  /**
   * handler for search box
   * @param {object} e
   */
  searchHandler = function searchHandler(e) {
    var tabId = this.getAttribute('data-tabid'),
        input = $(this),
        val = $.trim(this.value),
        len = val.length,
        $contTab = $('#cont-' + tabId);
    reverse = String(val).charAt(0) === '-' ? true : false;
    if (reverse) {
      val = val.substring(1);
      len -= 1;
    }
    table = appDom.byId('lt-' + tabId);
    //@todo checking value...
    if (len > 0) {
      input.parent().addClass('livesearch');
    } else {
      input.parent().removeClass('livesearch');
      $contTab.find('.list_table tr').removeClass('filtred').removeClass('ifound');
    }
    if (len >= MINFINDLENGTH) {
      $contTab.addClass('livesearch-active');
    } else {
      $contTab.removeClass('livesearch-active');
      $contTab.find('.list_table tr').removeClass('filtred').removeClass('ifound');
    }
    if (len === 0) {
      EventMgr.trigger('updateSelected', { tabId: tabId });
    }
    function search(val, n, tabId) {
      var curListIndex = listIndexObj[tabId],
          l = curListIndex.length,
          length,
          i,
          $selectedRows;
      if (val.length < MINFINDLENGTH) {
        //show all elements
        for (i = 0; i < l; i++) {
          show(curListIndex[i], false);
        }
        $selectedRows = $('#lt-' + tabId + ' tbody tr.ifound');
        length = $selectedRows.length;
        EventMgr.trigger('listLiveFound', {
          selectedRows: $selectedRows,
          tabId: 'cont-' + tabId,
          len: length });
      } else {
        var lim = n + 10;
        i = n;
        for (i, len = l; i < len && i < lim; i++) {
          checkMatches(curListIndex[i], val);
        }

        var changed = reverse ? String(input.val()).substring(1) !== val : input.val() !== val,
            notOver = i < len;

        if (!changed && i && len && notOver) {
          search(val, i, tabId);
        } else {
          $selectedRows = $('#lt-' + tabId + ' tbody tr.ifound');
          length = $selectedRows.length;
          EventMgr.trigger('listLiveFound', {
            selectedRows: $selectedRows,
            tabId: 'cont-' + tabId,
            len: length });
          $('tr.ifound').removeClass('lf-odd');
          $('tr.ifound:odd').addClass('lf-odd');
        }
      }
    }

    search(val, 0, tabId);
    if (val.length >= MINFINDLENGTH) {
      ScrollHandler.scrollTo('ltwr-' + tabId, 0);
    }
    EventMgr.trigger('updateSelected', { tabId: tabId });
  },

  /**
   * check matches on finding value
   * @param {object} elem
   * @param {string} val
   */
  checkMatches = function checkMatches(elem, val) {
    var text = elem.text.toLowerCase(),
        valLowCase = val.toLowerCase(),
        match = text.indexOf(valLowCase) !== -1;

    if (match && !reverse || !match && reverse) {
      show(elem, val);
    } else {
      hide(elem);
    }
  },

  /**
   * show html element
   * @param {object} elem
   * @param {string} val
   */
  show = function show(elem, val) {
    if (!elem.isVisible) {
      elem.tr.removeClass('filtred');
      elem.tr.removeClass('selected');
      elem.isVisible = true;
      var len = table.rows.length;
      table.deleteRow(len - 1);
    }

    elem.tr.addClass('ifound');

    if (val) {
      addHighlighting(elem, val);
    } else {
      removeHighlighting(elem);
    }
  },

  /**
   * hide html element
   * @param {object} elem
   */
  hide = function hide(elem) {
    if (!elem.isVisible) {
      return;
    }

    elem.tr.removeClass('ifound');
    elem.tr.addClass('filtred');
    elem.tr.removeClass('selected');
    elem.isVisible = false;

    var len = table.rows.length,
        row = table.insertRow(len);
    row.className = 'fake-row';
    removeHighlighting(elem);
  },

  /**
   * add highlighting to html element
   * @param {object} elem
   * @param {string} val
   */
  addHighlighting = function addHighlighting(elem, val) {
    if (elem.isHighLight && val) {
      removeHighlighting(elem);
    }
    //setTimeout(function() {
    try {
      var re = val ? new RegExp('(' + App.u.escapeRegExp(val) + ')', 'ig') : false;
      elem.isHighLight = true;
      elem.data.each(function (index) {
        var self = $(this),
            text = window.filterXSS($.trim(self.html())),
            hiText;
        hiText = text.replace(re, '<span class="' + HIGHLIGHT + '">$1</span>');
        if (hiText !== text) {
          self.html(hiText);
        }
      });
    } catch (e) {
      console.log('e', e);
    }
    //}, 0);
  },

  /**
   * remove highlighting from html element
   * @param {object} elem
   */
  removeHighlighting = function removeHighlighting(elem) {
    // setTimeout(function() {
    var highlighted = elem.data.find('.' + HIGHLIGHT);
    highlighted.each(function (index) {
      var self = $(this);
      self.replaceWith(self.text());
      elem.isHighLight = false;
    });
    // }, 0);
  },

  /**
   * make index with rows
   * @param {object} e event object
   * @param {object} data object with data
   */
  listIndex = function listIndex(e, data) {
    var tabId = data.tabId,
        collection = [],
        elem,
        ndata,
        text;
    $('#lt-' + tabId + ' tbody tr').each(function () {
      elem = $(this);
      ndata = elem.find('.b-list__table-col-content');
      text = function text() {
        var result = [],
            txt;
        ndata.each(function () {
          txt = $.trim($(this).text());
          result.push(txt);
        });
        return result.join('||');
      };
      collection.push({
        tr: elem,
        isVisible: true,
        text: text(),
        isHighLight: false,
        data: ndata
      });
    });

    listIndexObj[tabId] = collection;
  },

  /**
   * remove index for closed tab
   * @param {object} e
   * @param {object} data
   */
  removeIndex = function removeIndex(e, data) {
    var tabId = data.tabId;
    listIndexObj[tabId] = null;
    delete listIndexObj[tabId];
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.LiveListFilter.js.map

'use strict';

/**
 * LOad required modules
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.LoadScripts = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    //EventMgr.bind('loadPage', forceLoadScripts);
    EventMgr.bind('gotAnyChartXML', setAnyChartXML);
    EventMgr.bind('required', required);
    EventMgr.one('loadACHTML5', loadACHTML5);
  },
      loadACHTML5 = function loadACHTML5() {
    required(pageInfo.host + pageInfo.theme + 'AnyChart.js', runQueue, '');
    required(pageInfo.host + pageInfo.theme + 'AnyChartHTML5.js', runQueue, '');
  },
      runQueue = function runQueue() {
    if (window.AnyChart !== undefined && window.anychart.render !== undefined) {
      AnyChart.renderingType = anychart.RenderingType.SVG_ONLY;
      EventMgr.trigger('runQueue');
    } else {
      setTimeout(function () {
        runQueue();
      }, 250);
    }
  },
      required = function required(file, callback, param) {
    var script = document.getElementsByTagName('script')[0],
        newjs = document.createElement('script');

    newjs.onreadystatechange = function () {
      if (newjs.readyState === 'loaded' || newjs.readyState === 'complete') {
        newjs.onreadystatechange = null;
        callback(param);
        param = null;
        file = null;
      }
    };

    newjs.onload = function () {
      callback(param);
      param = null;
      file = null;
    };

    newjs.src = file;
    script.parentNode.insertBefore(newjs, script);
  },
      forceLoadScripts = function forceLoadScripts() {
    if (App.Global.anychartXML === null) {
      var url = pageInfo.host + pageInfo.theme + 'anychart.xml';
      EventMgr.trigger('ajaxRequest', {
        url: url,
        trfunc: 'gotAnyChartXML',
        outtype: 'html',
        type: 'get',
        queue: 'anychartxml' });
    }
  },
      setAnyChartXML = function setAnyChartXML(e, data) {
    App.Global.anychartXML = data;
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.LoadScripts.js.map

'use strict';

/**
 * LocalStorage module
 *
 * read and write data to localStorage
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 */
/*global App:true */
App.LocalStorage = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    if (window.localStorage) {
      EventMgr.bind('changedTabs', updateTabsState);
      EventMgr.bind('loadPage', readTabsState);
      EventMgr.bind('writeDatatoLocalStorage', writeData);
      EventMgr.bind('readDatafromLocalStorage', readData);
      EventMgr.bind('removeDatafromLocalStorage', removeData);
      EventMgr.bind('loadPage', readGlobalSettings);
      EventMgr.bind('setGlobalSetting', setGlobalSetting);
    }
  },
      pageInfo = window.pageInfo,
      productId = pageInfo.product + '_5_' + pageInfo.user + '_' + pageInfo.hostName + '_' + pageInfo.lang + pageInfo.project,
      writeData = function writeData(e, data) {
    if (data && data.id) {
      localStorage.setItem(data.id, JSON.stringify(data.data));
    }
  },
      readData = function readData(e, data) {},
      removeData = function removeData(e, data) {
    if (data && data.id) {
      localStorage.removeItem(data.id);
    }
  },
      sortByIndex = function sortByIndex(a, b) {
    if (a[0] && b[0]) {
      return a[0].sIndex - b[0].sIndex;
    } else {
      return 0;
    }
  },

  /**
   * Update data of active tab in local storage
   * @param {object} e
   * @param {object} data
   */
  updateTabsState = function updateTabsState(e, data) {
    var tabs = data.tabs,
        forceActive = data.forceActive,
        tabsStorageObj = {},
        keyVar,
        chain,
        ok,
        ind,
        tab;
    tabsStorageObj.tabs = [];
    //console.log("tabhandler");
    for (keyVar in tabs) {
      if (tabs[keyVar].hType === 'parent' && keyVar !== 'tab0' && tabs[keyVar].pin !== true) {
        chain = [];
        tab = {
          sIndex: tabs[keyVar].sIndex,
          status: tabs[keyVar].status,
          title: tabs[keyVar].title,
          params: tabs[keyVar].paramObjAll,
          menuFunc: tabs[keyVar].menuFunc,
          help: tabs[keyVar].help
        };
        if (forceActive && tabs[keyVar].beforeRequest) {
          tab.beforeRequest = tabs[keyVar].beforeRequest;
        }
        chain.push(tab);
        ok = true;
        ind = keyVar;
        while (ok) {
          if (tabs[ind].child && tabs[ind] !== undefined) {
            ind = tabs[ind].child;
            tab = {
              status: forceActive ? tabs[ind].forceActive ? 1 : 0 : tabs[ind].status,
              title: tabs[ind].title,
              params: tabs[ind].paramObjAll,
              help: tabs[ind].help
            };
            if (forceActive && tabs[ind].beforeRequest) {
              tab.beforeRequest = tabs[ind].beforeRequest;
            }
            chain.push(tab);
          } else {
            ok = false;
          }
        }
        tabsStorageObj.tabs.push(chain);
      }
    }
    chain = null;
    tabsStorageObj.tabs.sort(sortByIndex);
    var tabsStorageString = JSON.stringify(tabsStorageObj);
    if (typeof localStorage !== 'undefined') {
      localStorage.setItem(productId, tabsStorageString);
      localStorage.setItem(productId + '_time', new Date().getTime());
    }
    tabsStorageString = null;
    tabsStorageObj = null;
    data = null;
  },

  /**
   * read local storage data when startup
   *
   *
   */
  readTabsState = function readTabsState() {
    var tabsStorage,
        now,
        timeSave,

    //parse for a lot of params in startform/startpage
    startFormParam = App.u.parseParams('func=' + pageInfo.startform),
        startPageParam = App.u.parseParams('func=' + pageInfo.startpage);
    //startpage/startform handler
    if (pageInfo.startpage !== 'dashboard') {
      if (pageInfo.startform) {
        tabsStorage = '{"tabs": [[{"status": 1,' + ' "title": "",' + ' "params": ' + JSON.stringify(startPageParam) + '},' + ' {"status": 1,' + ' "title": "",' + ' "params": ' + JSON.stringify(startFormParam) + '}]]}';
        EventMgr.trigger('readStorage', { tabs: tabsStorage });
        return;
      } else {
        tabsStorage = '{ "tabs": [[{"status": 1, "title": "", "params":' + ' ' + JSON.stringify(startPageParam) + '}]]}';
        EventMgr.trigger('readStorage', { tabs: tabsStorage });
        return;
      }
    } else if (pageInfo.startform) {
      tabsStorage = '{"tabs": [[{"status": 1, "title": "", "params":' + ' ' + JSON.stringify(startFormParam) + '}]]}';
      EventMgr.trigger('readStorage', { tabs: tabsStorage });
      return;
    }
    now = new Date().getTime();
    if (localStorage.getItem(productId)) {
      //check for week expiries
      timeSave = localStorage.getItem(productId + '_time');
      if (now - timeSave > 604800 * 1000 || pageInfo.forgetTabs) {
        localStorage.removeItem(productId);
        localStorage.removeItem(productId + '_time');
      } else {
        tabsStorage = localStorage.getItem(productId);
        EventMgr.trigger('readStorage', { tabs: tabsStorage });
      }
    }
  },
      readGlobalSettings = function readGlobalSettings() {
    var settings = localStorage.getItem(productId + '_gs'),
        settingsObj = JSON.parse(settings);
    if (settingsObj) {
      /* jslint forin:true */
      for (var key in settingsObj) {
        pageInfo[key] = settingsObj[key];
      }
    }
  },
      setGlobalSetting = function setGlobalSetting(e, data) {
    var settings = localStorage.getItem(productId + '_gs'),
        settingsObj = JSON.parse(settings) || {},
        key = data.key,
        value = data.value;
    settingsObj[key] = value;
    pageInfo[key] = value;
    localStorage.setItem(productId + '_gs', JSON.stringify(settingsObj));
  };
  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.LocalStorage.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 * Multi load tabs
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 */
App.MultiLoadTabs = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.bind('readStorage', loadFromStorage);
    EventMgr.bind('loadChildren', loadChildren);
    EventMgr.bind('multiLoadTab', loadTabs);
  },
      pageInfo = window.pageInfo,
      loadFromStorage = function loadFromStorage(e, data) {
    var cookie = data.tabs,
        tabsObj;
    try {
      tabsObj = $.parseJSON(cookie);
      EventMgr.trigger('multiLoadTab', { tabs: tabsObj.tabs });
    } catch (exp) {}
  },
      loadTabs = function loadTabs(e, data) {
    var delay = 50,
        children,
        tabs = data.tabs,
        isNotInit = data.isNotInit,
        keyVar,
        len,
        param,
        curTab,
        urlParams = App.u.parseParams(window.location.search),
        showDashboard = urlParams.sfrom === 'loginform' && !(pageInfo.startform !== '' || pageInfo.startpage !== 'dashboard');
    if (pageInfo.tabPin && pageInfo.tabPin.length > 1 && !isNotInit) {
      for (var i = 1, l = pageInfo.tabPin.length; i < l; i++) {
        tabs.unshift([pageInfo.tabPin[i]]);
      }
    }
    if (tabs !== null) {
      /* jslint forin:true */
      for (keyVar in tabs) {
        curTab = tabs[keyVar][0];
        len = tabs[keyVar].length;
        delay += 50;
        if (len > 1) {
          tabs[keyVar].splice(0, 1);
          children = tabs[keyVar];
        } else {
          children = null;
        }
        if (_typeof(curTab.params) === 'object') {
          if (curTab.beforeRequest) {
            EventMgr.trigger('ajaxRequest', {
              param: App.u.parseParams(curTab.beforeRequest),
              trfunc: 'DoNothing',
              queue: 'multiload'
            });
          }
          /* jshint loopfunc:true*/
          setTimeout(function (children, curTab) {
            return function () {
              if (curTab.status === 1 && !showDashboard) {
                EventMgr.trigger('ajaxRequest', {
                  param: curTab.params,
                  noesc: pageInfo.startform !== '',
                  invar: { newtab: true, children: children, ignErr: true, __src_func: curTab.menuFunc },
                  type: 'get',
                  outtype: 'json',
                  trfunc: 'ajaxResponse',
                  queue: 'multiload' });
              } else {
                if (curTab.title) {
                  EventMgr.trigger('ajaxResponse', {
                    newtab: true,
                    children: children,
                    ignErr: true,
                    pin: curTab.pin,
                    __src_func: curTab.menuFunc,
                    pinIcon: curTab.pinIcon,
                    type: 'empty',
                    title: curTab.title,
                    urlObj: curTab.params });
                }
              }
              param = null;children = null;
            };
          }(children, curTab), delay);
        }
      }
    }
    data = null;
  },
      loadChildren = function loadChildren(e, data) {
    var parent = data.parent,
        children = data.children,
        curTab = children[0],
        urlParams = App.u.parseParams(window.location.search),
        showDashboard = urlParams.sfrom === 'loginform' && !(pageInfo.startform !== '' || pageInfo.startpage !== 'dashboard');
    if (children.length > 1) {
      children = children.splice(1, 1);
    } else {
      children = null;
    }
    if (curTab.beforeRequest) {
      EventMgr.trigger('ajaxRequest', {
        param: App.u.parseParams(curTab.beforeRequest),
        trfunc: 'DoNothing',
        queue: 'multiload'
      });
    }
    setTimeout(function (children, parent, curTab) {
      return function () {
        if (curTab.status === 1 && !showDashboard) {
          EventMgr.trigger('ajaxRequest', {
            param: curTab.params,
            invar: { parent: parent, children: children, ignErr: true, help: curTab.help },
            type: 'get',
            noesc: pageInfo.startform !== '',
            outtype: 'json',
            trfunc: 'ajaxResponse',
            queue: 'multiload' });
          EventMgr.trigger('tabLoading', { tabId: parent });
        } else {
          EventMgr.trigger('ajaxResponse', {
            parent: parent,
            children: children,
            ignErr: true,
            help: curTab.help,
            type: 'empty',
            title: curTab.title,
            pinIcon: curTab.pinIcon,
            urlObj: curTab.params });
        }
      };
    }(children, parent, curTab), 50);
  };

  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.MultiLoadTabs.js.map

'use strict';

/**
 * Progressbar module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} templates Templates of App
 */
App.ProgressBar = function (window, $, EventMgr, App, templates) {
  'use strict';

  var CACHE = {};
  // закончившиеся wait прогрессбары, на случай когда прогрессбар пришел раньше респонса формы
  var ENDED_WAIT_PROGRESSBAR = {};
  /**
   * Remove ProgressBar
   * @param {string} tabId
   */
  function removeProgressBar(tabId) {
    var tabCont = App.Dom.byId('cont-' + tabId);
    App.Dom.removeClass(tabCont, 'tab-content__progressbar_show');
    var progressbar = App.Dom.byId('cont-' + tabId + '-progressbar');
    if (progressbar === null) {
      return;
    }
    progressbar.style.display = 'none';
    progressbar.innerHTML = '';
    //show default loader
    var defProgress = App.Dom.byId('cont-' + tabId + '-progressbar-default');
    if (defProgress === null) {
      return false;
    }
    if (defProgress.style.display === 'none') {
      defProgress.style.display = null;
    }
    progressbar = null;
  }

  /**
   * Wait progressbar response after panel restart
   * @param {object} e
   * @param {object} data
   */
  function waitProgressBar(e, data) {
    if (data.progresstype === 'wait' || data.invar && data.invar.progresstype === 'wait') {
      setTimeout(function () {
        EventMgr.trigger('ajaxRequest', {
          param: data.param,
          invar: data.invar,
          type: 'get',
          outtype: 'json',
          trfunc: 'progressBarResponse',
          failfunc: 'progressBarResponseFail',
          queue: 'noqueue' });
      }, 1500);
    }
  }

  /**
   * Render Progressbar HTML
   * @param {object} e
   * @param {object} data
   */
  function renderProgressBar(e, data) {
    var start = data.start,
        progressType = data.progresstype,
        tabId = '',
        tabExist = false,
        progressId = data.param.elid;
    if (start !== '' && start !== undefined) {
      var done = data.done,
          now = data.now,
          steps = data.steps,
          comment = data.comment,
          param = data.param,
          colorClass = '';
      tabId = data.tabId;
      var per = 0,
          left = '';
      if (done !== '' && steps !== '') {
        per = Math.round(done / steps * 100);
      }
      if (done !== '' && steps !== '' && progressType !== 'notime') {
        var elapsedTime = now - start,
            elapsedSteps = steps - done;
        if (elapsedSteps !== 0 && done !== 0) {
          left = Math.round(elapsedTime / done * elapsedSteps) + 'sec';
        }
      }
      var width = per * 0.98;
      if (per < 6) {
        per = '.';
        colorClass = 'blue-color';
      } else {
        if (per > 100) {
          per = 100;
          width = per * 0.98;
        }
        per += '%';
      }
      var html = templates.progressBar({
        tabId: tabId,
        per: per,
        width: width,
        left: '',
        comment: comment,
        colorClass: colorClass });
      tabExist = appendProgressBar(tabId, progressId, html);
      //if exist tab
      if (tabExist) {
        setTimeout(function () {
          EventMgr.trigger('ajaxRequest', {
            param: param,
            invar: { tabId: tabId, param: param, progresstype: progressType },
            type: 'get',
            outtype: 'json',
            trfunc: 'progressBarResponse',
            failfunc: 'progressBarResponseFail',
            queue: 'noqueue' });
          param = null;tabId = null;progressType = null;
        }, 1000);
      }
    } else {
      tabId = data.tabId;
      removeProgressBar(tabId);
      //@todo remove cache
    }
    if (data.ok && progressType === 'wait') {
      if (data.param && data.param.elid) {
        ENDED_WAIT_PROGRESSBAR[data.param.elid] = true;
        if (CACHE[data.param.elid]) {
          CACHE[data.param.elid].progresstype = null;
          if (CACHE[data.param.elid].progressok) {
            CACHE[data.param.elid].__dataSource.rp = ['progressok'];
            CACHE[data.param.elid].__dataSource.rp = ['progressok'];
            EventMgr.trigger('tabLoading', { tabId: data.tabId });
            EventMgr.trigger('ajaxRequest', CACHE[data.param.elid].__dataSource);
          } else {
            EventMgr.trigger('ajaxFormResponse', CACHE[data.param.elid]);
          }
          delete CACHE[data.param.elid];
        }
      }
    }
  }

  /**
   * Append Progressbar to form
   * @param {string} tabId
   * @param {string} html
   * @return {boolean}
   */
  function appendProgressBar(tabId, progressId, html) {
    var progressChecker = App.Dom.byId(progressId),
        tabCont = App.Dom.byId('cont-' + tabId);
    if (!progressChecker) {
      return false;
    }
    App.Dom.addClass(tabCont, 'tab-content__progressbar_show');
    var progressbar = App.Dom.byId('cont-' + tabId + '-progressbar');
    if (progressbar === null) {
      return false;
    }
    progressbar.style.display = 'block';
    progressbar.innerHTML = html;
    progressbar = null;
    var defProgress = App.Dom.byId('cont-' + tabId + '-progressbar-default');
    if (defProgress === null) {
      return false;
    }
    defProgress.style.display = 'none';
    return true;
  }

  function progressBarSaveState(e, data) {
    // если wait прогресс уже пришел с ok
    if (ENDED_WAIT_PROGRESSBAR[data.progressid]) {
      data.progresstype = null;
      EventMgr.trigger('ajaxFormResponse', data);
    } else if (data && data.progressid) {
      CACHE[data.progressid] = data;
    }
  }

  function init() {
    EventMgr.bind('progressBarSaveState', progressBarSaveState);
    EventMgr.bind('progressBarResponse', renderProgressBar);
    EventMgr.bind('progressBarResponseFail', waitProgressBar);
  }

  return {
    init: init
  };
}(window, $, EventMgr, App, templates);
//# sourceMappingURL=App.ProgressBar.js.map

'use strict';

/**
 * Upload files
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.SendFormWithFiles = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.bind('setBrandSettings', sendFormWithFiles);
    EventMgr.on('#main-wrapper', '.i-button-form-send-cancel', 'click', abortFormSending);
  },
      abortFormSending = function abortFormSending(e) {
    var id = this.getAttribute('data-id');
    EventMgr.trigger('ajaxRequestAbort', { id: id });
  },
      sendFormWithFiles = function sendFormWithFiles(e, data) {
    if (window.FormData) {
      sendLikeFormData(data);
    } else {
      sendLikeFrame(data);
    }
  },
      sendLikeFormData = function sendLikeFormData(data) {
    var formData = new FormData(),
        param = data.param,
        tabId = data.tabId,
        options = data.options,
        id = new Date().getTime();
    resetHiddenInput(tabId);
    /* jshint forin:false */
    for (var key in param) {
      formData.append(key, param[key]);
    }
    $('#frm-' + tabId + ' input[type="file"]').each(function () {
      if (this.files) {
        var l = this.files.length,
            name = this.name;
        if (l > 1) {
          name += '[]';
        }
        while (l--) {
          formData.append(name, this.files[l]);
        }
      }
    });
    //formData.append('sok', 'ok');
    options.formData = formData;
    options.reqType = 'xhr';
    options.id = id;
    //clear class for setvalues
    var $progressbar = $('#' + tabId + '-progressbar'),
        $loader = $progressbar.find('.b-progressbar__loader'),
        $btn = $progressbar.find('.b-progressbar__btn-wr');
    $loader.removeClass('b-progressbar__loader_type_static');
    if ($btn.length) {
      $btn.remove();
    }
    options.progressCb = function (e) {
      if (e.lengthComputable) {
        var per = Math.round(e.loaded * 100 / e.total),
            width = per * 0.98;
        // loader = App.u.selectorCache('#' + tabId +
        //     '-progressbar .b-progressbar__loader');
        //add static class & rewrite comment & add cancel btn
        if (!$loader.hasClass('b-progressbar__loader_type_static')) {
          //add class for small bottom padding
          $('#' + tabId + '-progressbar').addClass('b-progressbar_type_withbtn');
          //remove animated
          $loader.removeClass('b-progressbar__loader_type_animate');
          //add static color
          $loader.addClass('b-progressbar__loader_type_static');
          //add cancel btn
          $('#' + tabId + '-progressbar .b-progressbar__inner').append('<div class="b-progressbar__btn-wr">' + '<div class="b-button b-button_style_small i-button-form-send-cancel" data-id="' + id + '">' + pageInfo.msgCancel + '</div>' + '</div>');
          //rewite comment
          $('#' + tabId + '-progressbar .b-progressbar__comment').html(window.pageInfo.formSending);
        }
        //set progress
        $loader.css('width', width + '%');
        if (per > 7) {
          $loader.html(per + '%');
        } else {
          $loader.html('');
        }
      }
    };
    EventMgr.trigger('ajaxRequest', options);
    EventMgr.trigger('tabLoading', { tabId: tabId });
  },
      sendLikeFrame = function sendLikeFrame(data) {
    var tabId = data.tabId,
        parent = data.parent,
        frameId = 'iframe-' + Math.round(new Date().getTime() / 1000),
        $form,
        sForm,
        action;
    //find hidden by if/else input@type=hidden & reset it
    resetHiddenInput(tabId);
    $('body').after('<iframe width="0" height="0" style="display:none;" name="' + frameId + '" id="' + frameId + '"></iframe>');
    sForm = document['frm-' + tabId];
    action = sForm.getAttribute('action');
    $('#form-wrapper-' + tabId).wrap(function () {
      return '<form action="' + action + '" id="form-' + frameId + '" method="POST" enctype="multipart/form-data" target="' + frameId + '"/>';
    });
    $form = $('#form-' + frameId);
    if (data.addParams) {
      /* jshint forin: false */
      for (var key in data.addParams) {
        $form.append('<input type="hidden" name="' + key + '" value="' + data.addParams[key] + '"/>');
      }
    }
    //$form.append('<input type="hidden" value="ok" name="sok"/>');
    //$form.append('<input type="hidden" value="ajax" name="sfrom"/>');
    // $form.append('<input type="hidden" value="' + data.pid +
    //     '" name="progressid"/>');
    // $form.append('<input type="hidden" value="' + data.name +
    //    '" name="clicked_button"/>');
    $('#' + frameId).load(function () {
      handleResponse(this, frameId, data, parent);
    });
    $form.submit();
    EventMgr.trigger('showLoader');
  },
      resetHiddenInput = function resetHiddenInput(tabId) {
    //find hidden by if/else input@type=hidden & reset it
    $('#form-wrapper-' + tabId).find('.l-form__row_hidden_yes input[type="file"]').each(function () {
      var $self = $(this);
      $self.wrap('<form>').closest('form').get(0).reset();
      $self.unwrap();
    });
  },
      handleResponse = function handleResponse(loadedFrame, frameId, data, parent) {
    var response = {},
        responseStr = loadedFrame.contentWindow.document.body.innerHTML,
        tabId = data.tabId;
    try {
      //replace ' with ""
      responseStr = responseStr.replace(/\\'/g, "'");
      //remove doctype
      responseStr = responseStr.replace(/<![\w\s\"-\/]*>/g, '');
      //remove html tags
      responseStr = responseStr.replace(/(<([^>]+)>)/g, '');
      //check for 503 error
      if (responseStr.match(/^long\/+/)) {
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.host + responseStr,
          invar: {
            iType: 'replace',
            dataSaved: true,
            tabId: tabId,
            targetTabId: tabId,
            parent: parent
          },
          type: 'post',
          outtype: 'json',
          trfunc: 'ajaxFormResponse',
          queue: 'noqueue',
          failfunc: 'failFormAjaxResponse'
        });
        return;
      } else {
        response = $.parseJSON($.trim(responseStr));
      }
    } catch (e) {
      response = responseStr;
      EventMgr.trigger('hideLoader');
      EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error.' });
    }
    //@TODO run formHandler
    //@TODO remove iframe and wrapper
    if (response) {
      $('#form-wrapper-' + tabId).unwrap();
      $('#' + frameId).remove();
      response.tabId = tabId;
      response.parent = parent;
      var resp = $.extend(response, data.options.invar);
      EventMgr.trigger(data.options.trfunc, resp);
      //EventMgr.trigger('ajaxFormResponse', response);
      EventMgr.trigger('hideLoader');
    }
  };

  return {
    init: init,
    handleResponse: handleResponse
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.SendFormWithFiles.js.map

'use strict';

/**
 * Slider module
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
/*global App:true*/
App.Slider = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on($content(), sliderSelector, 'mousedown', drag);
    EventMgr.on($content(), sliderWrapperSelector, 'mousedown', sliderToPoint);
    EventMgr.bind('appendForm', start);
    EventMgr.bind('appendEditInList', startEditInList);
    EventMgr.bind('reloadSlider', start);
    EventMgr.on($content(), sliderInputSelector, 'change', sliderMove);
    EventMgr.on($content(), sliderInputSelector, 'keydown', sliderKeyDownHandler);
    EventMgr.on($content(), sliderInputSelector, 'keyup', deleteSliderHandler);
    EventMgr.on($content(), sliderSelector, 'ontouchstart', drag);
  },
      $content = function $content() {
    return $('#main-wrapper');
  },
      sliderSelector = '.l-slider__wr:not(".readonly") .b-slider__el',
      sliderInputSelector = '.b-input_for_slider:not(".readonly")',
      sliderWrapperSelector = '.l-slider__wr:not(".readonly")',
      max = 0,
      min = 0,
      self = null,
      maxleft = 0,
      shiftX = 0,
      width = 0,
      intId = null,
      tabId = '',
      inputId = null,
      step = 0,


  //flag for change input value
  fromInput = false,
      calcValue = function calcValue(np) {
    var bound = max - min,
        delta = bound / maxleft,
        initDelta = min % step,
        value = Math.round(np * delta) + parseInt(min, 10),
        el = App.Dom.byId(inputId),
        elSlider = App.Dom.byId(inputId + '-slider'),
        ldf = value % step,
        rdf = step - ldf;
    if (ldf > rdf) {
      value += rdf;
    } else {
      value -= ldf;
    }
    value += initDelta;
    //check bounds
    if (value > max) {
      value = max;
    } else if (value < min) {
      value = min;
    }
    if (el !== null) {
      el.value = value;
    }
    if (elSlider) {
      elSlider.setAttribute('data-value', value);
    }
    EventMgr.trigger('changeSliderValue', { tabId: tabId });
  },
      getDataSlider = function getDataSlider() {
    tabId = self.getAttribute('data-tabid');
    inputId = self.getAttribute('data-id');
    min = self.getAttribute('data-min');
    step = parseInt(self.getAttribute('data-step'), 10);
    if (!step) {
      step = 1;
    }
    max = self.getAttribute('data-max');
    width = $(self).parent().width();
    maxleft = width - 9;
  },
      setPosition = function setPosition(newPosition) {
    var np = 0;
    if (newPosition <= maxleft && newPosition >= 0) {
      np = newPosition;
    } else if (newPosition > maxleft) {
      fromInput = false;
      np = maxleft;
    } else {
      fromInput = false;
      np = 0;
    }
    self.style.left = np + 'px';
    if (!fromInput) {
      calcValue(np);
    }
    fromInput = false;
    return false;
  },
      start = function start(e, data) {
    tabId = data.tabId;
    $('#incont-' + tabId + ' .b-slider__el').each(function () {
      self = this;
      fromInput = true;
      getDataSlider();
      if (width !== 0) {
        var value = this.getAttribute('data-value'),
            bound = max - min,
            delta = bound / maxleft,
            np = value / delta - min / delta;
        setPosition(np);
      }
    });
  },
      startEditInList = function startEditInList(e, data) {
    tabId = data.tabId;
    $('#editinlist-wrapper-' + tabId + ' .b-slider__el').each(function () {
      self = this;
      fromInput = true;
      getDataSlider();
      var value = this.getAttribute('data-value'),
          bound = max - min,
          delta = bound / maxleft,
          np = value / delta - min / delta;
      setPosition(np);
    });
  },
      sliderMove = function sliderMove(e, sv) {
    e = e || window.event;
    var f = this.value.substr(0, 1) === '-' ? '-' : '';
    this.value = f + this.value.replace(/\D/g, '');
    fromInput = true;
    var id = this.getAttribute('id');
    self = App.Dom.byId(id + '-slider');
    getDataSlider();
    var value = App.Dom.byId(inputId).value,
        ldf = value % step,
        rdf = step - ldf,
        bound = max - min,
        delta = bound / maxleft,
        initDelta = min % step,
        np,
        elSlider = App.Dom.byId(inputId + '-slider');
    value -= 0;
    if (ldf > rdf) {
      value += rdf;
    } else {
      value -= ldf;
    }
    value += initDelta;
    this.value = value;
    np = value / delta - min / delta;

    if (np > maxleft) {
      fromInput = false;
    }
    setPosition(np);
    blockEvent(e);

    if (elSlider) {
      elSlider.setAttribute('data-value', value);
    }

    EventMgr.trigger('changeSliderValue', { tabId: tabId });
    return false;
  },
      sliderKeyDownHandler = function sliderKeyDownHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode,
        id;
    if (codeKey === 38 || codeKey === 40) {
      id = this.getAttribute('id');
      self = $('a#' + id + '-slider')[0];
      getDataSlider();
      blockEvent(e);
    }
    if (codeKey === 38 && !e.ctrlKey) {
      clearInterval(intId);
      sliderMoveForKeyDown(true);
      intId = setInterval(function () {
        sliderMoveForKeyDown(true);
      }, 100);
      blockEvent(e);
    } else if (codeKey === 40 && !e.ctrlKey) {
      clearInterval(intId);
      sliderMoveForKeyDown(false);
      intId = setInterval(function () {
        sliderMoveForKeyDown(false);
      }, 100);
      blockEvent(e);
    }
  },
      deleteSliderHandler = function deleteSliderHandler() {
    var f = this.value.substr(0, 1) === '-' ? '-' : '';
    this.value = f + this.value.replace(/\D/g, '');
    clearInterval(intId);
  },
      sliderMoveForKeyDown = function sliderMoveForKeyDown(up) {
    var input = App.Dom.byId(inputId),
        value = input.value;
    if (up) {
      value = parseInt(value, 10) + step;
    } else {
      if (value === max) {
        value -= 3;
      } else {
        value -= step;
      }
    }
    input.value = value;
    EventMgr.trigger('changeSliderValue', { tabId: tabId });
    $('#' + inputId).trigger('change');
  },
      sliderToPoint = function sliderToPoint(e) {
    e = e || window.event;
    self = $(this).children('.b-slider__el')[0];
    getDataSlider();
    shiftX = e.clientX - $(this).offset().left - 7;
    setPosition(shiftX);
    $('#' + inputId).trigger('change');
  },
      drag = function drag(e) {
    $(this).trigger('focus');
    e = e || window.event;
    if (e.touches) {
      shiftX = e.touches[0].pageX - parseInt(this.style.left, 10);
      document.ontouchmove = move;
      document.ontouchend = drop;
      document.ontouchcancel = drop;
    } else {
      shiftX = e.clientX - parseInt(this.style.left, 10);
      document.onmousemove = move;
      document.onmouseup = drop;
    }
    self = this;
    getDataSlider();
    blockEvent(e);
    return false;
  },

  //Handler for move
  move = function move(e) {
    e = e || window.event;
    if (e.touches) {
      setPosition(e.touches[0].pageX - shiftX);
    } else {
      setPosition(e.clientX - shiftX);
    }
    blockEvent(e);
    return false;
  },

  //Handler for mouseup, unbind mousemove and mouseup
  drop = function drop(e) {
    $(this).trigger('blur');
    e = e || window.event;
    document.onmousemove = null;
    document.onmouseup = null;
    document.ontouchmove = null;
    document.ontouchend = null;
    document.ontouchcancel = null;
    $('#' + inputId).trigger('change');
    blockEvent(e);
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Slider.js.map

'use strict';

/**
  Select Autocomplete
  provide select with options autocomplete
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} ScrollHandler Scrollbar library
 *  @return {object}
 **/
App.SelectAutoComplete = function (window, $, EventMgr, App, ScrollHandler) {
  'use strict';

  var inputSelector = '.b-select-ac__input',
      chooseListItem = '.i-select-ac__list-item',
      keys = {
    '38': 'UPKEY',
    '40': 'DOWNKEY',
    '37': 'LEFTKEY',
    '39': 'RIGHTKEY',
    '13': 'ENTERKEY',
    '9': 'TABKEY'
  };

  function $content() {
    var content;
    return function () {
      if (!content || content.length === 0) {
        content = $('#main-wrapper');
      }
      return content;
    }();
  }

  function $body() {
    var content;
    return function () {
      if (!content || content.length === 0) {
        content = $('body');
      }
      return content;
    }();
  }

  function init() {
    EventMgr.on($content(), inputSelector, 'keyup', keyUpHandler);
    EventMgr.on($content(), inputSelector, 'keydown', tabUpHandler);
    EventMgr.on($content(), inputSelector, 'blur', checkValue);
    EventMgr.on($content(), inputSelector, 'click', getDefaultOptions);
    EventMgr.on($content(), inputSelector, 'click', preventDefault);
    EventMgr.bind('selectAutoCompleteResponse', makeChooseList);
    EventMgr.on($content(), chooseListItem, 'click', chooseListItemHandler);
  }

  var timer, lastValue;

  function preventDefault(e) {
    e.preventDefault();
    e.stopPropagation();
  }

  function getChooseList(elem, firstRun) {
    var name = elem.getAttribute('data-name'),
        tabId = elem.getAttribute('data-tabid'),
        url = window.pageInfo.url,
        param = $('#frm-' + tabId).serializeObject(),
        value = elem.value;
    param[name] = elem.value;
    /* jslint camelcase: false */
    param.sv_field = name;
    param.sv_autocomplete = 'yes';
    /* jslint camelcase: true */
    if (value !== lastValue || firstRun) {
      EventMgr.trigger('ajaxRequest', {
        url: url,
        param: param,
        trfunc: 'selectAutoCompleteResponse',
        invar: { tabId: tabId, sourceField: name, value: value },
        type: 'post', outtype: 'json', queue: 'noqueue' });
    }
    lastValue = value;
  }

  function getDefaultOptions() {
    // close others list
    $body().trigger('click');
    var elem = this;
    getChooseList(elem, true);
  }

  /**
   * KeyUp handler
   * get choose list or set value from choose list
   * @param {object} e
   * @this {Node}
   */
  function keyUpHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode;
    if (keys[codeKey]) {
      keyChooseListItem(e, keys[codeKey], this);
      return;
    }
    var elem = this;
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(function () {
      getChooseList(elem);
    }, 200);
  }

  /**
   * Choose value by up/down key
   * @param {Object} e Event object
   * @param {String} key Name of key
   * @param {HTMLElement} elem
   * @param {Boolean} dontPrevent Don't prevent default action
   */
  function keyChooseListItem(e, key, elem, dontPrevent) {
    var name = elem.getAttribute('data-name'),
        tabId = elem.getAttribute('data-tabid'),
        $selected = $('#b-select-ac-list__' + name + '-' + tabId + ' .b-select-ac__list-item_selected_yes');
    if ($selected.length === 0) {
      $selected = $('#b-select-ac-list__' + name + '-' + tabId + ' .i-select-ac__list-item:first');
      if ($selected.length === 0) {
        return;
      } else {
        $selected.addClass('b-select-ac__list-item_selected_yes');
        chooseListItemHandler.apply($selected[0], [e, true, dontPrevent]);
        return;
      }
    }

    if (key === 'UPKEY') {
      var prev = $selected.prev();
      if (prev.length !== 0) {
        $selected.removeClass('b-select-ac__list-item_selected_yes');
        prev.addClass('b-select-ac__list-item_selected_yes');
        chooseListItemHandler.apply(prev[0], [e, true, dontPrevent]);
      }
    } else if (key === 'DOWNKEY') {
      var next = $selected.next();
      if (next.length !== 0) {
        $selected.removeClass('b-select-ac__list-item_selected_yes');
        next.addClass('b-select-ac__list-item_selected_yes');
        chooseListItemHandler.apply(next[0], [e, true, dontPrevent]);
      }
    } else if (key === 'ENTERKEY') {
      chooseListItemHandler.apply($selected[0], [e, false, dontPrevent]);
    } else if (key === 'TABKEY') {
      //choose only when selected 1st elem
      if ($selected.index() === 0) {
        chooseListItemHandler.apply($selected[0], [e, true, dontPrevent]);
      }
    }
  }
  var chooseListStorage = {},
      VALUESCACHE = {};

  /**
   * Build choose list from response
   * @param {Object} e
   * @param {Object} data
   * @return {Boolean}
   */
  function makeChooseList(e, data) {
    var tabId = data.tabId,
        fieldName = data.sourceField,
        commonId = fieldName + '-' + tabId,
        listElem = App.Dom.byId('b-select-ac-list__' + commonId),
        listElemWrapperId = 'cont-b-select-ac-list__' + commonId,
        listElemWrapper = App.Dom.byId(listElemWrapperId),
        chooseList = data.setvalues[fieldName],
        defValue = data.value,
        l,
        html = '',
        value,
        re,
        options = {},
        id = new Date().getTime(),
        focusedElem = document.activeElement;
    //show only if element is focused
    if (focusedElem) {
      if (focusedElem.getAttribute('data-name') !== fieldName) {
        return false;
      }
    }

    //trigger setvalues if somebody add other field values
    if (data[data.sourceField]) {
      data[data.sourceField] = null;
      EventMgr.trigger('formSetValues', data);
    }

    if (chooseList && chooseList.slist) {
      l = chooseList.slist.length;
      for (var i = 0; i < l; i++) {
        value = chooseList.slist[i].value;
        if (typeof value === 'string') {
          re = new RegExp('(' + App.u.escapeRegExp(defValue) + ')', 'i');
          value = value.replace(re, '<span class="b-select-ac__font-normal">$1</span>');
          html += '<li data-id="' + i + '" data-lid="' + id + '"' + ' class="b-select-ac__list-item i-select-ac__list-item">' + value + '</li>';
          options[String(i)] = {
            key: chooseList.slist[i].key,
            value: chooseList.slist[i].value
          };
        }
      }
      chooseListStorage[String(id)] = {
        options: options
      };
      listElem.innerHTML = html;
    } else {
      listElem.innerHTML = '<li class="b-select-ac__list-item i-select-ac__list-item ' + 'b-select-ac__list-item_notfound_yes" data-lid="' + id + '">' + pageInfo.notfound + '</li>';
    }
    if (listElemWrapper.style.display !== 'block') {
      listElemWrapper.style.display = 'block';
      $body().on('click.closeChooseList', $.proxy(closeChooseList, listElem));
    } else {
      $body().off('click.closeChooseList');
      $body().on('click.closeChooseList', $.proxy(closeChooseList, listElem));
    }
    EventMgr.trigger('updateScroll', listElemWrapperId);
    App.Common.setOptionListPosition('#opt-', commonId);
  }

  function setValue(opt) {
    opt = opt || {};
    var inputValue = App.Dom.byId(opt.id),
        inputKey = App.Dom.byId('key-' + opt.id);
    if (inputValue) {
      inputValue.value = opt.value;
    }
    if (inputKey) {
      inputKey.value = opt.key;
      $(inputKey).trigger('change');
      VALUESCACHE[opt.id] = {
        key: opt.key,
        value: opt.value
      };
    }
  }

  /**
   * Set choosen value to element
   * @param {Object} e
   * @param {Boolean|Undefined} dontclose Don't close flag
   * @param {Boolean|Undefined} dontPrevent Don't prevent default action
   * @this {Node}
   */
  function chooseListItemHandler(e, dontclose, dontPrevent) {
    if (!dontPrevent) {
      e.preventDefault();
    }
    var elem = this,
        id = elem.getAttribute('data-id'),
        lid = elem.getAttribute('data-lid'),
        parentNode = elem.parentNode,
        inputId = parentNode.getAttribute('data-id');
    if (chooseListStorage[lid] && chooseListStorage[lid].options) {
      if (chooseListStorage[lid].options[id] !== undefined) {
        setValue({
          id: inputId,
          key: chooseListStorage[lid].options[id].key,
          value: chooseListStorage[lid].options[id].value
        });
      }
    }
    if (!dontclose) {
      closeChooseList.apply(parentNode, [{}, true]);
    }
  }
  function tabUpHandler(e) {
    e = e || window.event;
    var codeKey = e.which || e.keyCode;
    if (keys[codeKey] === 'TABKEY') {
      if (this.value !== '') {
        keyChooseListItem(e, 'TABKEY', this, true);
      }
      //close list
      $body().trigger('click');
    }
  }
  /**
   * check congruence for value & key
   */
  function checkValue(e, force) {
    var id = this.getAttribute('id'),
        optListWrapper = App.Dom.byId('cont-b-select-ac-list__' + id),
        optList = App.Dom.byId('b-select-ac-list__' + id);
    if (force || optListWrapper && optListWrapper.style.display === 'none' || $(optList).find('.b-select-ac__list-item_notfound_yes').length) {
      var inputKey = App.Dom.byId('key-' + id);
      if (VALUESCACHE[id] && inputKey && VALUESCACHE[id].key === inputKey.value) {
        if (this.value !== '') {
          this.value = VALUESCACHE[id].value;
        } else {
          setValue({ id: id, key: '', value: '' });
        }
      } else {
        this.value = '';
      }
    }
  }

  /**
   * check fullmatch value & options
   */
  function checkFullmatch(options, value) {
    var fullmatch = false,
        fullmatchKey;
    if (options && value !== undefined) {
      var l = options.length;
      for (var key in options) {
        if (options.hasOwnProperty(key)) {
          fullmatchKey = key;
          if (options[key].value === value) {
            fullmatch = true;
            break;
          }
        }
      }
    }
    return {
      yes: fullmatch,
      key: options[fullmatchKey].key
    };
  }
  /**
   * close Choose list
   * @param {Boolean|Undefined} chosen
   * @param {Object} e
   * @this {Node}
   */
  function closeChooseList(e, chosen) {
    var listItem = $(this).find('.i-select-ac__list-item');
    var listElemWrapper = this.parentNode;

    if (listItem[0] && !chosen) {
      var lid = listItem[0].getAttribute('data-lid'),
          id = this.getAttribute('data-id');
      if (id && chooseListStorage && chooseListStorage[lid]) {
        var inputValue = App.Dom.byId(id),
            fullmatch = checkFullmatch(chooseListStorage[lid].options, inputValue.value);
        //if (chooseListStorage[lid].fullmatchKey !== false) {
        if (fullmatch.yes) {
          //set valuesCache
          setValue({
            id: id,
            key: fullmatch.key,
            value: inputValue.value
          });
        } else {
          //check for valid value in value field
          checkValue.apply(inputValue, [{}, true]);
        }
      }
    }
    listElemWrapper.style.display = 'none';
    this.innerHTML = '';
    $body().off('click');
    chooseListStorage = {};
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App, ScrollHandler);
//# sourceMappingURL=App.SelectAutoComplete.js.map

'use strict';

/**
 * resize cols in table
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
App.TableRowResize = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on('#content', '.content .rowHandler', 'mousedown', tableResizeHandler);
  },
      shiftX = 0,
      self = '',
      left = '',
      lastPos,
      cWidth = '',
      pcWidth = '',
      prevCol = '',
      curCol = '',

  // min width of col (2% of table width)
  minWidth = '',
      tabId,
      tableResizeHandler = function tableResizeHandler(e) {
    e = e || window.event;

    shiftX = e.clientX;
    document.onmousemove = move;
    document.onmouseup = drop;
    this.style.position = 'absolute';
    calcBounds(this);
    var actTab = $('.tab-content_st_active .content'),
        h = actTab.height();
    tabId = actTab.attr('data-tabid');
    this.style.height = h + 'px';
    left = this.offsetLeft;
    self = this;
    blockEvent(e);
  },
      move = function move(e) {
    e = e || window.event;
    var newpos = e.clientX - shiftX;
    if (checkBounds(newpos)) {
      lastPos = newpos;
    }
    self.style.left = left + lastPos + 'px';
    blockEvent(e);
  },
      drop = function drop(e) {
    var param = setNewWidths();
    self.style.height = '100%';
    self.style.left = '';
    self.style.position = '';
    document.onmouseup = null;
    document.onmousemove = null;
    self = '';
    if (!param) {
      return;
    }
    param.func = 'colwidth';
    param.out = 'xml';
    param.elid = App.Tabs.tabs[tabId].func;
    EventMgr.trigger('ajaxRequest', {
      param: param,
      trfunc: 'DoNothing',
      queue: 'noqueue' });
  },
      calcBounds = function calcBounds(self) {
    //width all table
    var twidth = $('.tab-content_st_active .list_table').width(),
        per;
    curCol = self.parentNode;
    //width cur col
    cWidth = curCol.offsetWidth;

    prevCol = App.Common.getPreviousNode(curCol);
    // width  prev col
    pcWidth = prevCol.offsetWidth;
    // one percent of width table in pixel
    per = twidth / 100;
    minWidth = 2 * per;
  },
      checkBounds = function checkBounds(newpos) {
    if (newpos >= 0) {
      if (cWidth - newpos < minWidth) {
        return false;
      }
    } else {
      if (pcWidth + newpos < minWidth) {
        return false;
      }
    }
    return true;
  },

  //set new width for cols when drag
  setNewWidths = function setNewWidths() {
    if (!lastPos) {
      return undefined;
    }
    var curColWidth = parseInt(curCol.style.width, 10),
        curPrevColWidth = parseInt(prevCol.style.width, 10),
        sumWidth = curColWidth + curPrevColWidth,
        newWidth,
        otherWidth;
    if (lastPos > 0) {
      newWidth = 2 * (cWidth - lastPos) / minWidth;
      newWidth = newWidth > 2 ? newWidth : 2;
      curCol.style.width = Math.round(newWidth) + '%';
      otherWidth = sumWidth - newWidth;
      otherWidth = otherWidth > 2 ? otherWidth : 2;
      prevCol.style.width = Math.round(otherWidth) + '%';
    } else {
      newWidth = 2 * (pcWidth + lastPos) / minWidth;
      newWidth = newWidth > 2 ? newWidth : 2;
      prevCol.style.width = Math.round(newWidth) + '%';
      otherWidth = sumWidth - newWidth;
      otherWidth = otherWidth > 2 ? otherWidth : 2;
      curCol.style.width = Math.round(otherWidth) + '%';
    }
    lastPos = undefined;
    return syncCols();
  },

  //sync col width on list table
  syncCols = function syncCols() {
    var colWidth = {};
    $('.tab-content_st_active .sort_table td').each(function (index) {
      var name = this.getAttribute('data-colname'),
          width = parseInt(this.style.width, 10),
          id = 'lt-' + $(this).parents('.sort_table').attr('id').replace('sort_table-', '');
      // set width in pixel
      this.firstChild.style.width = width * (minWidth / 2) + 'px';

      colWidth[name] = width;
      //for body table
      $('.tab-content_st_active .list_table#' + id + ' tbody tr:first td:eq(' + index + ')').width(width + '%');
      //for head table
      $('.tab-content_st_active .list_table#' + id + ' th[data-colname="' + name + '"]').width(width + '%');
      //for statusbar table
      $('.tab-content_st_active .statusbar td[data-colname="' + name + '"]').width(width + '%');
    });
    return colWidth;
  };
  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.TableRowResize.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

/**
 * Модуль отвечает за вкладки и их рендер
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 * @param {object} templates HTML templates
 */
App.Tabs = function (window, $, EventMgr, App, templates) {
  'use strict';

  var tabs = {},
      pageInfo = window.pageInfo,
      tabIndex = 1,
      tabN = 'tab',
      rowId = 0,
      activeTab = '',
      //current active tab id

  defaultTab = '',
      //defaultTab

  mainWrapperSel = '#main-wrapper',
      init = function init() {
    EventMgr.bind('ajaxResponse', buildTabWrapper);
    EventMgr.bind('builtTab', appendTab);
    EventMgr.bind('comboCtrlShiftZKeyUp', closeAllTabs);
    EventMgr.bind('comboCtrlShiftXKeyUp', closeOthersTabs);
    EventMgr.on(mainWrapperSel, 'a.close', 'click', closeTabClickHandler);
    EventMgr.on(mainWrapperSel, 'span.back', 'click', backBtnHandler);
    EventMgr.on(mainWrapperSel, '#tabs .switch', 'click', switchTabs);
    EventMgr.on(mainWrapperSel, '#tabs .switch', 'mousedown', closeTabsByMiddleBtn);
    EventMgr.on(mainWrapperSel, '#tabs .switch', 'dblclick', upSwitchedTabs);
    EventMgr.bind('reloadTab', reloadTabData);
    EventMgr.bind('updateTab', updateTab);
    EventMgr.bind('ajaxFormResponse', formHandler);
    EventMgr.on(mainWrapperSel, '.i-button_type_cancel', 'click', cancelBtnHandler);
    EventMgr.bind('ajaxResponseForDashboard', renderDashboardTable);
    EventMgr.bind('addedChart', addChartToTab);
    EventMgr.bind('formGetTreeBranch', formGetTreeBranch);
    EventMgr.bind('getActiveHint', getActiveHint);
    EventMgr.on(mainWrapperSel, 'input, textarea', 'change', formFieldChangeHandler);
    EventMgr.on(mainWrapperSel, '.i-list-icon__stop', 'click', stopAutoUpdate);
    EventMgr.addHook('formSetValues,formSubmit', addModelToSetvalues);
    EventMgr.bind('updateModel', updateModelBySetvalues);
    EventMgr.addHook('listMultiSelect,listSelect,listLiveFound,' + 'listUnSelect,ajaxResponseEditInListSave,updateTotalList,' + 'clickedGroupItem', addListModel);
    EventMgr.bind('saveFormPageState', saveFormPageState);
    EventMgr.on(mainWrapperSel, '.i-take-favorite', 'click', favoriteToggle);
    EventMgr.on(mainWrapperSel, '.i-pin', 'click', pinToggle);
    EventMgr.bind('loadPage', removeSfromParam);
    EventMgr.addHook('menuAction,testColCheck', addTabsModel);
    EventMgr.bind('changeTabSortIndex', changeTabSortIndex);
    EventMgr.bind('updateTotalWithConvertReport', updateTotalWithConvertReport);
    EventMgr.addToTriggerStack('escKeyUp', esckeyHandler, 1);
  },

  //remove sfrom param form url after login
  removeSfromParam = function removeSfromParam() {
    var params = App.u.parseParams(window.location.search);
    if (params.sfrom) {
      if (window.history) {
        setTimeout(function () {
          window.history.pushState('default', '', pageInfo.binary);
        }, 10000);
      }
    }
  },
      checkDasboard = function checkDasboard(d) {
    if (d && d.dashboard) {
      $('#switch-tab0').trigger('click');
      return false;
    }
    return true;
  },
      checkFeatures = function checkFeatures(data) {
    //if has redirect keep new tabs
    if (data && data.__src !== 'okList' && data.__src !== 'okForm') {
      var params;
      if (data.features && pageInfo.features && !data.wizard && data.features !== pageInfo.features) {
        params = App.u.parseParams(window.location.search);
        params.ssavetabs = 1;
        if (!params.scountreload) {
          params.scountreload = 1;
        } else {
          params.scountreload -= 0;
          params.scountreload += 1;
        }
        if (params.scountreload < 5) {
          window.location.search = '?' + App.u.getQueryString(params);
          return false;
        }
      } else {
        //remove params from url
        params = App.u.parseParams(window.location.search);
        if (params.ssavetabs) {
          setTimeout(function () {
            if (window.history) {
              window.history.pushState('default', '', pageInfo.binary);
            }
          }, 10000);
        }
      }
    }
    return true;
  },
      checkReload = function checkReload(data) {
    if (data) {
      if (data.reload) {
        var newLocation = pageInfo.url;
        if (data.savetab) {
          newLocation += '?sfrom=sessionexpired';
        }
        if (data.__src && (data.__src === 'menuAction' || data.__src === 'toolbarAction' || data.__src === 'report' || data.__src === 'reloadTab')) {
          makeFakeTab(data);
        }
        if (data.__src && data.__src === 'filterset') {
          addBeforeLoadRequest(data);
        }
        window.location = newLocation;
        return false;
      }
    }
    return true;
  },
      checkNewWin = function checkNewWin(data) {
    if (data) {
      if (data.location && data.newwin) {
        window.open(data.location, '_blank');
        //remove loading className
        $('.m-item.loading').removeClass('loading');
        return false;
      } else if (data.location) {
        window.location = data.location;
        return false;
      }
    }
    return true;
  },
      checkNewForm = function checkNewForm(data) {
    if (data) {
      var param,
          options,
          newFormParams = data.formParam,
          parent = data.parent;
      if (newFormParams) {
        param = App.u.parseParams(newFormParams);
        options = {
          noesc: true,
          param: param,
          invar: {
            waitingTabId: data.targetTabId,
            parent: parent,
            dataSaved: true,
            '__src_func': data.__src_func,
            '__src': 'okForm',
            '__srcBtn': data.__srcBtn,
            newtab: data.newtab
          },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          queue: 'noqueue' };
        if (data.openAsChild) {
          options.invar.parent = data.tabId;
        }
        EventMgr.trigger('ajaxRequest', options);
        return false;
      }
    }
    return true;
  },
      checkNewList = function checkNewList(data) {
    if (data) {
      var param,
          newListParams = data.listParam,
          parent = data.parent;
      if (newListParams) {
        param = App.u.parseParams(newListParams);
        EventMgr.trigger('ajaxRequest', {
          noesc: true,
          param: param,
          invar: {
            waitingTabId: data.targetTabId,
            parent: parent,
            dataSaved: true,
            '__src': 'okList',
            '__srcBtn': data.__srcBtn,
            newtab: data.newtab
          },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          queue: 'noqueue' });
        if (data.openAsChild) {
          options.invar.parent = data.tabId;
        }
        EventMgr.trigger('tabLoading', { tabId: parent });
        return false;
      }
    }
    return true;
  },
      storage = App.Common.storage,

  //render breadcrumb
  getBreadcrumb = function getBreadcrumb(breadcrumb) {
    var str = '';
    /* jslint forin:true */
    for (var key in breadcrumb) {
      str += '<a href="#" data-id="' + key + '" class="breadcrumb">' + breadcrumb[key].name + '</a>';
    }
    return str;
  },
      resetToDefaultFormButton = function resetToDefaultFormButton(tabId) {
    if (tabs[tabId] && tabs[tabId].type === 'form') {
      $('#frm-' + tabId + ' .b-button_st_disabled').each(function () {
        var $self = $(this);
        $self.html($self.attr('data-enabled'));
        $self.removeClass('b-button_st_disabled');
      });
    }
  },

  //cancel btn handler
  cancelBtnHandler = function cancelBtnHandler(e) {
    var tabId = this.getAttribute('data-tabid'),
        func = this.getAttribute('data-func'),
        $self = $(this),
        form = $('#frm-' + tabId),
        isShowcaseForm = form.hasClass('b-form_showcase_yes'),
        flags = $self.getFlags(),
        parent,
        options;
    if (!tabs[tabId]) {
      return;
    }
    parent = tabs[tabId].parent;

    if (flags.refresh && parent) {
      EventMgr.trigger('reloadTab', { tabId: parent, __src: 'formCancelRefresh', filter: true });
    }
    //return list if it from sametab
    if (tabs[tabId].rParentObj) {
      var param = tabs[tabId].rParentObj,
          targetTabId = tabId;
      tabs[tabId].rParent = undefined;
      EventMgr.trigger('ajaxRequest', {
        url: pageInfo.url, param: param,
        invar: {
          parent: parent,
          targetTabId: targetTabId,
          iType: 'replace',
          dataSaved: true
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'noqueue' });
      EventMgr.trigger('tabLoading', { tabId: tabId });
    } else if (func) {
      options = {
        param: {
          func: func
        },
        invar: {
          parent: parent,
          targetTabId: tabId,
          iType: 'replace',
          dataSaved: true
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'noqueue'
      };
      EventMgr.trigger('ajaxRequest', options);
      EventMgr.trigger('tabLoading', { tabId: tabId });
    } else {
      closeTab(e, tabId);
    }
    e.preventDefault();
  },
      unsavedDataCheckboxHandler = function unsavedDataCheckboxHandler(val) {
    if (val === 'on') {
      var options = {
        param: {
          func: 'usrparam',
          elid: pageInfo.user,
          checkunsaved: 'off',
          sok: 'ok'
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'DoNothing',
        queue: 'noqueue'
      };
      EventMgr.trigger('ajaxRequest', options);
      pageInfo.checkUnsaved = false;
    }
  },
      addBeforeLoadRequest = function addBeforeLoadRequest(data) {
    var tabId = data.tabId;
    if (tabs[tabId]) {
      tabs[tabId].beforeRequest = data.sourceParamString;
    }
    EventMgr.trigger("changedTabs", { tabs: tabs, forceActive: true });
  },
      makeFakeTab = function makeFakeTab(data) {
    var tabId, tabObj;
    tabId = tabN + tabIndex;
    tabObj = {
      status: 1,
      forceActive: true,
      title: '',
      paramObjAll: App.u.parseParams(data.sourceParamString)
    };
    //check for su func
    var func = tabObj.paramObjAll.func;
    if (String(func).match(/su$/) || func === 'chlevel') {
      return;
    }
    if (data.parent) {
      if (data.targetTabId || data.tabId) {
        tabId = data.targetTabId || data.tabId;
      }
      tabObj.hType = 'child';
      if (tabs[data.parent]) {
        tabs[data.parent].child = tabId;
      }
    } else {
      if (data.targetTabId) {
        tabId = data.targetTabId;
      }
      tabObj.hType = 'parent';
    }
    tabs[tabId] = tabObj;

    EventMgr.trigger('changedTabs', { tabs: tabs, forceActive: true });
  },

  //wrapper buildTab for check for unsaved form data
  buildTabWrapper = function buildTabWrapper(e, data) {
    var isChanged = false,
        tabId;
    //check for open in new tab & replace tab from redirect
    if (!data.newtab && !data.dataSaved && pageInfo.checkUnsaved) {
      //check for active tab is form
      if (tabs[activeTab]) {
        //find form in tab group
        tabId = findTabForm(activeTab);
        if (tabId !== activeTab) {
          //activate tab if not active
          if (tabs[tabId] && tabs[tabId].status === 0) {
            activateTab(tabId);
          }
        }
        var changedFields = checkFormChange(tabId);
        if (changedFields.isChanged) {
          isChanged = true;
          //show confirmBox
          EventMgr.trigger('confirmBoxShow', {
            callbackOk: buildTab,
            callbackCancel: function callbackCancel() {
              $('.m-item.loading').removeClass('loading');
            },
            text: String(pageInfo.unsavedData).replace('__VALUE__', changedFields.count) + '<br/><span class="b-text_style_bold">' + changedFields.labels + '</span>',
            args: [e, data],
            checkbox: {
              msg: pageInfo.unsavedDontShow,
              cb: unsavedDataCheckboxHandler
            }
          });
        }
      }
    }
    if (!isChanged) {
      buildTab(e, data);
    }
  },
      findTabForm = function findTabForm(tabId) {
    if (tabs[tabId] && tabs[tabId].type === 'form') {
      return tabId;
    } else {
      //form can be only last in tab group
      if (tabs[tabId].child) {
        return findTabForm(tabs[tabId].child);
      }
    }
    return false;
  },

  //build new tab
  buildTab = function buildTab(e, data) {
    EventMgr.trigger('hideHint');
    //check for user.su
    var parent = data.parent ? data.parent : '',
        ok = data.ok || false,
        tabId,
        obj,
        type,
        delay,
        timeId;
    //hide loader for parent tab
    if (parent) {
      EventMgr.trigger('tabLoadingHide', { tabId: parent });
      //reset btn on form if opened as a child
      resetToDefaultFormButton(parent);
    }
    //hide loader for targetTab (for case if has error)
    if (data.targetTabId) {
      EventMgr.trigger('tabLoadingHide', { tabId: data.targetTabId });
    }
    //hide loader for srcTab (when redirect) (for case if has error)
    if (data.srcTabId) {
      EventMgr.trigger('tabLoadingHide', { tabId: data.srcTabId });
    }

    if (!checkReload(data) || !checkNewWin(data) || !checkNewList(data) || !checkNewForm(data)) {
      return false;
    }

    if (ok) {
      if (parent !== undefined) {
        EventMgr.trigger('reloadTab', { tabId: parent, filter: true, __src: 'buildTabOk' });
        return;
      }
    }

    EventMgr.trigger('startbuildTab', 'new empty tab');

    tabId = tabN + tabIndex;
    obj = data;
    type = obj.type || obj.id;

    if (obj.exType === 'dashboard') {
      tabId = 'tab0';
    } else if (obj.targetTabId) {
      tabId = obj.targetTabId;
    } else if (obj.showcase) {
      tabId = 'tab0';
    } else {
      tabIndex++;
    }

    //Гвозди
    //check for error on big Cicle
    if (obj.error && !obj.ignErr && obj.type !== 'form' && obj.type !== 'inspectorForm' && obj.type !== 'showcaseForm' && obj.type !== 'report' || obj.userexpMsg === undefined && obj.error && obj.type === 'form') {
      EventMgr.trigger('hideLoader');
      type = 'fatalerror';
    } else if (obj.error && obj.ignErr) {
      return;
    }
    if (type === '' && !tabs.tab0 || obj.exType === 'dashboard') {
      type = 'dashboard';
    }
    if (obj.msg) {
      $.extend(App.Common.msg, obj.msg);
    }

    switch (type) {
      case 'list':
        buildList(tabId, obj);
        break;
      case 'form':
        buildForm(tabId, obj);
        break;
      case 'dashboard':
        buildDashboard(tabId, obj);
        break;
      case 'report':
        buildReport(tabId, obj);
        EventMgr.trigger('reportLoad');
        break;
      case 'map':
      case 'rack':
        buildMap(tabId, obj);
        break;
      case 'fatalerror':
        buildFatalError(tabId, obj);
        break;
      case 'empty':
        buildEmpty(tabId, obj);
        break;
      case 'inspectorForm':
        buildInspectorForm(tabId, obj);
        break;
      case 'showcaseForm':
        buildShowcaseForm(tabId, obj);
        break;
      default:
        EventMgr.trigger('pullMsg', { msg: 'Do not support type = "' + type + '" of metadata' });
    }
    //handler for autoupdate
    //@TODO this shit must to rewrite
    delay = obj.autoupdate;

    if (!tabs[tabId]) {
      return;
    }

    if (tabs[tabId].timeId) {
      clearTimeout(tabs[tabId].timeId);
    }
    if (obj.autoupdate !== undefined) {
      timeId = setTimeout(function (tabId, delay) {
        return function () {
          EventMgr.trigger('updateTab', { tabId: tabId, delay: delay });
        };
      }(tabId, delay), obj.autoupdate * 1000);
      tabs[tabId].autoupdate = true;
      tabs[tabId].timeId = timeId;
    } else {
      tabs[tabId].autoupdate = false;
      tabs[tabId].timeId = undefined;
    }
    //show tips
    if (obj.tips) {
      setTimeout(function () {
        EventMgr.trigger('showTips', {
          tips: obj.tips,
          inTab: true,
          tabId: tabId,
          sameModule: obj.sameModule });
      }, 1);
    }
  },

  //build tab with list/table
  buildList = function buildList(tabId, obj) {
    var plid = '',
        elid = '',
        pagerParam = '',
        breadcrumb,
        body = prepareTab(obj, tabId);
    if (obj.plid) {
      //what the hell?
      plid = '&plid=' + encodeURIComponent(obj.plid);
    }
    if (obj.elid) {
      elid = '&elid=' + encodeURIComponent(obj.elid);
    }

    if (obj.sortOrder) {
      pagerParam += '&p_order=' + obj.sortOrder;
    }
    if (obj.sortCol) {
      pagerParam += '&p_sort=' + obj.sortCol;
    }
    if (obj.pager.pager === 'true') {
      pagerParam += '&p_num=' + obj.pager.pageNum + '&p_cnt=' + obj.pager.pageCnt;
    }

    //flag for render bottom bar
    obj.sbar = true;
    if (App.Global.warning) {
      obj.warning = App.Global.warning;
    }
    if (obj.selid) {
      App.Global.selid = obj.selid;
    }
    if (obj.scrollTop) {
      App.Global.scrollTop = obj.scrollTop;
    }
    obj.tabId = tabId;

    //check for extra confirm
    if (obj.warning) {
      var warning = $.extend({}, obj.warning);
      EventMgr.trigger('checkWarningForConfirm', { d: obj, w: warning });
    }
    var table = renderTable(obj);
    //render pager
    var pager = '';
    if (obj.pager.pager === 'true') {
      pager = buildPager(obj.pager, tabId);
    }
    var filter = '';
    if (obj.filter === 'true') {
      if (obj.activeFilter.status) {
        filter = 'filter filter-hide filter-set';
      } else {
        filter = 'filter filter-hide';
      }
    }

    breadcrumb = getBreadcrumb(obj.breadcrumb);
    delete obj.breadcrumb.name;
    storage.breadcrumb[tabId] = obj.breadcrumb;

    body.autoupdate = obj.autoupdate !== undefined;
    body.tsettings = App.u.escapeQuote(obj.hintTsettings) || '';
    body.hAutoupdate = App.u.escapeQuote(obj.hintAutoupdate) || '';
    body.hExport = App.u.escapeQuote(obj.hintExport) || '';
    body.hSelectAll = App.u.escapeQuote(obj.hintSelectAll) || '';
    body.fHelp = App.u.escapeQuote(obj.hintFilter) || '';
    body.pNum = obj.pager.pageNum;
    body.porder = obj.sortOrder;
    body.sortCol = obj.sortCol;
    body.pcnt = obj.pager.pageCnt;
    body.breadcrumb = breadcrumb;
    body.plidAttr = obj.plid ? 'data-plid= "' + filterXSS.safeAttrValue('div', 'data-plid', obj.plid) + '"' : '';
    body.convertAttr = obj.convert ? 'data-convert=' + obj.convert : '';
    body.oplid = obj.plid || '';
    body.tsplid = obj.tsplid || '';
    body.tsettingsParam = filterXSS.safeAttrValue('a', 'data-url', '?func=tsetting&elid=' + obj.func + '&plid=' + obj.tsplid);
    body.table = table;
    body.progressid = obj.progressid;
    //for toolbar btn
    body.tabIdAttr = 'data-parent=' + tabId;
    body.pager = pager;
    body.filter = filter;
    body.afilter = obj.activeFilter;
    body.param = pagerParam;
    body.livefilter = obj.liveFilter || '';

    tabs[tabId].body = body;
    //save model
    tabs[tabId].__content = obj.content;
    tabs[tabId].__headers = obj.headers;

    App.Global.bannerHtml = null;
    App.Global.targetId = '';
    //APP.Global.warning = null;

    if (obj.filter === 'true') {
      tabs[tabId].filter = true;
      tabs[tabId].filterFunc = obj.filterFunc;
    } else {
      tabs[tabId].filter = false;
    }

    EventMgr.trigger('builtTab', {
      tab: tabs[tabId],
      newtab: obj.newtab,
      targetTabId: obj.targetTabId,
      iType: obj.iType,
      srcData: obj });

    activateNewTab(tabId, obj.newtab, obj.iType);

    if (obj.children) {
      EventMgr.trigger('loadChildren', {
        parent: tabId,
        children: obj.children });
    }
    //if tab have progressbar - run it
    if (obj.progressid) {
      var param = { elid: obj.progressid, func: 'progress.get' };
      EventMgr.trigger('ajaxRequest', {
        url: pageInfo.url,
        param: param,
        invar: { tabId: tabId, param: param, progresstype: undefined },
        type: 'get',
        outtype: 'json',
        trfunc: 'progressBarResponse',
        queue: 'noqueue' });
    }
    //if tab have diagram - insert it
    if (obj.diagram && obj.diagram[0]) {
      EventMgr.trigger('appendListWithDiagram', {
        diagram: obj.diagram[0],
        content: obj.content,
        tabId: tabId,
        gid: 'diagram-' + tabId });
    }
    //check for saved live filter
    if (obj.liveFilter) {
      $('#' + tabId + '-search').trigger('keyup');
    }
  },

  //build tab with form
  buildForm = function buildForm(tabId, obj) {
    var body = prepareTab(obj, tabId);

    if (!obj.form) {
      return;
    }

    obj.form.id = tabId;
    obj.form.formflags = obj.formflags || {};
    obj.form.parent = obj.parent || '';
    obj.form.func = obj.func;

    body = prepareFormTab(obj, tabId, body);

    tabs[tabId].formModel = body.model;
    tabs[tabId].formSource = body.formSource;

    tabs[tabId].body = body;

    EventMgr.trigger('builtTab', {
      tab: tabs[tabId],
      newtab: obj.newtab,
      targetTabId: obj.targetTabId,
      iType: obj.iType,
      srcData: obj });

    activateNewTab(tabId, obj.newtab, obj.iType);
    if (obj.error) {
      EventMgr.trigger('focusOnErrorField', { tabId: tabId });
    }
  },

  //build tab with dashboard
  buildDashboard = function buildDashboard(tabId, obj) {
    var msg;
    tabs[tabId] = new TabObj(tabId, 1, 'dashboard');

    if (!obj.error && obj.blocks) {
      tabs[tabId].body = renderDashboard(obj.blocks);
    } else if (obj.lateLoad) {
      msg = pageInfo.loading;
      /*jslint sub: true*/
      tabs[tabId].body = { id: tabId, top: msg, left: '', right: '' };
      /*jslint sub: false*/
    } else if (!obj.shithappend) {
      msg = templates.fatalError({ message: obj.ermsg, ref: false });
      tabs[tabId].body = { 'id': tabId, top: msg, left: '', right: '' };
    } else {
      msg = pageInfo.loading;
      tabs[tabId].body = { id: tabId, top: msg, left: '', right: '' };
      //shit happend trying again
      setTimeout(function () {
        var url = pageInfo.url,
            param = { func: 'dashboard' };
        EventMgr.trigger('ajaxRequest', {
          url: url,
          param: param,
          invar: { exType: 'dashboard' },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          queue: 'dashboard' });
      }, 500);
    }
    //if was error
    $('#cont-tab0').remove();

    tabs[tabId].func = obj.func;

    EventMgr.trigger('builtTab', { tab: tabs[tabId] });

    defaultTab = tabId;
    //if dashboard loaded after list/form
    /*jslint sub: true*/
    if (!tabs['tab1'] || !tabs['tab1'].active) {
      activateNewTab(tabId);
    } else {
      tabs['tab0'].deactive();
    }
    /*jslint sub: false*/
  },
      buildFatalError = function buildFatalError(tabId, obj) {
    var ref,
        refreshLink,
        sTabId = obj.targetTabId || tabId,
        cb;
    $('.m-item.loading').removeClass('loading');
    if (obj.__src === 'groupAction' || obj.__src === 'report' || obj.__src === 'toolbarAction-refresh') {
      EventMgr.trigger('tabLoadingHide', { tabId: obj.tabId });
      if (obj.__src === 'groupAction') {
        EventMgr.trigger('reloadTab', { tabId: obj.tabId, filter: true });
      }
    } else if (obj.__src === 'wizardLink') {
      EventMgr.trigger('tabLoadingHide', { tabId: obj.tabId });
      sTabId = false;
    } else if (obj.targetTabId) {
      EventMgr.trigger('tabLoadingHide', { tabId: obj.targetTabId || obj.waitingTabId });
    } else if (obj.waitingTabId) {
      //reset to default form state
      EventMgr.trigger('tabLoadingHide', { tabId: obj.waitingTabId });
      resetToDefaultFormButton(obj.waitingTabId);
    }
    if (obj.ref) {
      ref = pageInfo.url + obj.ref;
    }
    if (obj.ertype === 'unavailable') {
      refreshLink = obj.sourceParamString;
    }
    //check for exist tab, and close it
    if (sTabId) {
      if (tabs[sTabId]) {
        closeTab({ preventDefault: function preventDefault() {} }, sTabId);
      }
    }
    //reload parent, becase it can be unexist elem
    if (obj.parent) {
      cb = function cb() {
        EventMgr.trigger('reloadTab', { tabId: obj.parent, __src: 'fatalError' });
      };
    }
    var html = templates.fatalAlert({
      msg: obj.ermsg,
      ref: ref,
      refreshLink: refreshLink,
      refreshLinkMsg: pageInfo.tryreload,
      moreMsg: pageInfo.moreinfo
    });
    EventMgr.trigger('showAlert', {
      msg: html,
      callback: cb });
  },
      buildReport = function buildReport(tabId, obj) {
    //@todo вынести
    var bands,
        body = prepareTab(obj, tabId);

    obj.form.id = tabId;
    obj.form.func = obj.func;
    obj.reports.func = obj.func;

    bands = renderBands(obj.reports, tabId);
    body = prepareFormTab(obj, tabId, body);

    body.helpType = 'default';
    body.helpurl = '';
    body.type = 'report';
    body.bands = bands;
    body.reportInfo = obj.reportInfo;

    tabs[tabId].body = body;

    EventMgr.trigger('builtTab', {
      tab: tabs[tabId],
      newtab: obj.newtab,
      bands: obj.reports,
      targetTabId: obj.targetTabId });

    activateNewTab(tabId, obj.newtab, obj.iType);
  },
      buildMap = function buildMap(tabId, obj) {
    var body = prepareTab(obj, tabId),
        ermsg,
        type = obj.type;

    if (obj.ermsg && !obj.erobj) {
      ermsg = templates.banner({ message: {
          status: 'error',
          classes: '',
          id: tabId,
          text: App.Common.wordWrap(obj.ermsg, 100),
          ref: false,
          refText: pageInfo.moreinfo,
          dismiss: obj.msg.dismiss
        } });
    }

    body.helpType = 'default';
    body.helpurl = '';
    body.type = type;
    body.plid = obj.plid ? String(obj.plid).replace(/"/g, '&quot;') : '';
    body.elid = obj.elid ? String(obj.elid).replace(/"/g, '&quot;') : '';
    body.parent = obj.parent ? obj.parent : '';
    body.ermsg = ermsg;
    body.btng = obj.btng ? obj.btng : [];
    body.btnview = obj.btnview ? 'o-' + obj.btnview : '';
    body.plidAttr = obj.plid ? 'data-plid= "' + filterXSS.safeAttrValue('div', 'data-plid', obj.plid) + '"' : '';
    body.convertAttr = obj.convert ? 'data-convert=' + obj.convert : '';

    tabs[tabId].body = body;

    EventMgr.trigger('builtTab', {
      tab: tabs[tabId],
      map: obj[type],
      newtab: obj.newtab,
      targetTabId: obj.targetTabId });

    activateNewTab(tabId, obj.newtab, obj.iType);
  },
      buildEmpty = function buildEmpty(tabId, obj) {
    var body = pageInfo.loading,
        curTab;
    prepareTab(obj, tabId);
    curTab = tabs[tabId];
    curTab.body = { id: tabId, text: '', comment: body };
    curTab.status = 0;
    curTab.notLoaded = true;
    curTab.pin = obj.pin;

    if (obj.children) {
      EventMgr.trigger('loadChildren', {
        parent: tabId,
        children: obj.children });
    }

    EventMgr.trigger('builtTab', {
      tab: curTab,
      newtab: obj.newtab,
      targetTabId: obj.targetTabId });
    EventMgr.trigger('changedTabs', { tabs: tabs });
  },
      buildInspectorForm = function buildInspectorForm(tabId, obj) {
    //if fatal error without form
    if (obj.error && obj.userexpMsg === undefined) {
      EventMgr.trigger('pullMsg', { msg: obj.ermsg });
      return;
    }
    var body = prepareTab(obj, tabId);
    //rename id
    delete tabs[tabId];
    tabId = 'modal1';
    body.id = tabId;

    if (!obj.form) {
      return;
    }

    obj.form.id = tabId;

    body = prepareFormTab(obj, tabId, body);

    body.parent = obj.sourceTab;

    var html = templates.tabContForm(body);
    EventMgr.trigger('readyInspectorFormHtml', html);
  },

  //build external form
  buildShowcaseForm = function buildShowcaseForm(tabId, obj) {
    tabId = 'tab0';
    var body = prepareTab(obj, tabId);
    obj.form.id = tabId;

    obj.form.formflags = obj.formflags || {};

    obj.form.parent = obj.parent || '';

    body = prepareFormTab(obj, tabId, body);

    tabs[tabId].formModel = body.model;
    tabs[tabId].formSource = body.formSource;

    body.showcase = true;
    body.nostep = !pageInfo.wizard_step;
    body.notitle = !pageInfo.title;

    //        body.parent = obj.sourceTab;

    var html = templates.tabContForm(body);
    EventMgr.trigger('readyShowcaseFormHtml', html);
  },

  //fill body object for form
  prepareFormTab = function prepareFormTab(obj, tabId, body) {
    if (!body || !obj) {
      return;
    }
    var ermsg = '',
        userexpMsg = String(obj.userexpMsg).replace('__value__', obj.userexpHideFields),
        renderObject;
    //banner
    if (obj.ermsg && !obj.erobj) {
      ermsg = templates.banner({ message: {
          status: 'error',
          classes: 'i-message__outer-link',
          id: tabId,
          text: App.Common.wordWrap(obj.ermsg, 100),
          ref: obj.ref ? obj.ref : false,
          refText: pageInfo.moreinfo,
          dismiss: obj.msg.dismiss || pageInfo.dismiss
        } });
    }

    body.form = obj.form;
    body.tabClass = obj.testMode ? ' tab-content_st_testmode' : '';
    body.formstatus = obj.formstatus;
    body.files = obj.withfiles ? 'withfiles' : 'withoutfiles';
    body.bands = '';
    body.progress = obj.progress ? obj.progress + '_' + body.itemId : false;
    body.helpType = obj.helpType;
    body.helpurl = obj.helpurl;
    obj.form.testMode = obj.testMode;
    renderObject = renderFormItems(obj.form, tabId);
    body.pages = renderObject.html;
    body.model = renderObject.model;
    body.formSource = renderObject.source;
    body.action = pageInfo.binary;
    body.step = pageInfo.step;
    body.formflags = obj.formflags ? obj.formflags : {};
    body.buttons = obj.buttons;
    body.parent = obj.parent ? obj.parent : '';
    body.plid = obj.plid ? String(obj.plid).replace(/"/g, '&quot;') : '';
    body.elid = obj.elid ? String(obj.elid).replace(/"/g, '&quot;') : '';
    body.plidAttr = obj.plid ? 'data-plid= "' + filterXSS.safeAttrValue('div', 'data-plid', obj.plid) + '"' : '';
    body.type = 'form';
    //body.isUserexp = obj.isUserexp;
    body.userexp = obj.userexp;
    body.userexpMsg = userexpMsg;
    body.reportInfo = undefined;
    body.arePages = obj.form.length > 1 ? 'a-lot-of-pages' : '';
    body.ermsg = ermsg;
    body.__innervars = obj.__innervars ? objectToString(obj.__innervars) : '';

    //add buttons to formModel
    if (obj.buttons) {
      body.model.__buttons = obj.buttons;
    }

    return body;
  },
      objectToString = function objectToString(object) {
    var stringVars = '',
        index = 0;
    for (var key in object) {
      if (index !== 0) {
        stringVars += '|';
      }
      index++;
      stringVars += key + ':' + object[key];
    }

    return stringVars;
  },
      isAlreadyPinTab = function isAlreadyPinTab(obj, tabId) {
    var func = obj.func || (obj.urlObj ? obj.urlObj.func : ''),
        already = false,
        tab;
    for (var key in tabs) {
      tab = tabs[key];
      if (key === tabId) {
        return true;
      }
      if (tab && tab.paramObjAll && tab.paramObjAll.func === func) {
        return true;
      } else if (tab && tab.urlObj && tab.urlObj.func === func) {
        return true;
      }
    }
    return already;
  },

  //fill body object for all types
  prepareTab = function prepareTab(obj, tabId) {
    var body = {},
        title,
        titleLen = 0,
        shortTitle,
        hint,
        tImg,
        tStyle,
        imgId,
        selfUrl = obj.selfUrl ? obj.selfUrl.replace(/sfrom=ajax/g, '') : '',
        curTab;

    //dont show pin when isPin && from menu
    obj.pin = obj.pin && obj.__src !== 'menuAction';
    //check already same pin tab
    if (obj.pin && !isAlreadyPinTab(obj, tabId)) {
      obj.pin = true;
    }
    /* jshint camelcase: false*/
    body.commonDir = pageInfo.commonDir;
    body.itemId = obj.type + new Date().getTime();
    body.id = tabId;
    body.func = obj.func;
    body.theme = obj.theme;
    body.hReload = App.u.escapeQuote(obj.hintReload) || '';
    body.comment = App.u.escapeQuote(obj.msg_loading) || '';
    body.hFavorite = App.u.escapeQuote(obj.hintFavorite) || '';
    body.hUnfavorite = App.u.escapeQuote(obj.hintUnFavorite) || '';
    body.hPrint = App.u.escapeQuote(obj.hintPrint) || '';
    body.hCopy = App.u.escapeQuote(obj.hintCopy) || '';
    body.hPdf = App.u.escapeQuote(obj.hintPdf) || '';
    body.hHelp = App.u.escapeQuote(obj.hHelp) || '';
    body.hintUnpin = App.u.escapeQuote(obj.hintPin) || '';
    body.hintPin = App.u.escapeQuote(obj.hintUnpin) || '';
    body.hDevel = 'out=devel';
    body.breadcrumb = '';
    body.message = '';
    body.selfurl = pageInfo.url + '?' + getQueryString(obj.urlObj);
    body.devMode = devMode;
    body.testMode = obj.testMode;
    body.pdfOn = pdfOn;
    body.btng = obj.btng ? obj.btng : [];
    body.btnview = obj.btnview ? 'o-' + obj.btnview : '';
    body.favorite = obj.favorite || false;
    body.pin = obj.pin || false;
    body.inmenu = !!App.Dom.byId('l-' + String(obj.func).replace(/\./g, '_'));
    //for btn in form
    body.parentAttr = obj.parent ? 'data-parent=' + obj.parent : '';
    //for toolbar btn
    body.tabIdAttr = 'data-parent=' + tabId;
    //make permalink
    var permaLinkObj = $.extend({}, obj.urlObj);
    delete permaLinkObj.sfrom;
    delete permaLinkObj.operafake;
    delete permaLinkObj.clickstat;
    permaLinkObj.startform = permaLinkObj.func;
    delete permaLinkObj.elname;
    delete permaLinkObj.func;
    body.permaLink = pageInfo.url + '?' + getQueryString(permaLinkObj);
    //remove error if not tagret tab
    if (App.Global.targetId && App.Global.targetId !== tabId && App.Global.bannerHtml && App.Global.bannerHtml.length > 0) {
      var msgLen = App.Global.bannerHtml.length;
      while (msgLen--) {
        if (App.Global.bannerHtml[msgLen].status === 'error') {
          App.Global.bannerHtml.splice(msgLen, 1);
        }
      }
    }
    if (obj.message) {
      if (App.Global.bannerHtml) {
        body.message = obj.message.concat(App.Global.bannerHtml);
      } else {
        body.message = obj.message;
      }
    } else {
      if (App.Global.bannerHtml) {
        body.message = App.Global.bannerHtml;
      }
    }
    if (body.message) {
      //check for message exists
      var l = body.message.length;
      while (l--) {
        if (body.message[l].refText === '') {
          body.message[l].refText = obj.msg.moreinfo;
        }
        if (body.message[l].dismiss === '') {
          body.message[l].dismiss = obj.msg.dismiss || pageInfo.dismiss;
        }
      }
    }

    if (!obj.targetTabId) {
      tabs[tabId] = new TabObj(tabId, 1, obj.type, selfUrl);
    } else {
      tabs[tabId].type = obj.type;
      tabs[tabId].selfUrl = selfUrl;
    }
    //set menu func name
    if (obj.__src_func) {
      tabs[tabId].menuFunc = obj.__src_func;
    }

    curTab = tabs[tabId];

    if (obj.iType !== 'hardUpdate' && obj.iType !== 'replace') {
      if (!obj.parent) {
        curTab.hType = 'parent';
      } else {
        if (tabs[obj.parent] === undefined) {
          return;
        }
        curTab.hType = 'child';
        curTab.parent = obj.parent;
        curTab.gParent = tabs[obj.parent].gParent ? tabs[obj.parent].gParent : obj.parent;
        if (obj.type === 'empty') {
          tabs[obj.parent].child = tabId;
        }
      }
    } else {
      obj.parent = curTab.parent;
    }

    //get title
    if (obj.title && obj.title !== '') {
      titleLen = obj.title.length;
      if (titleLen < 25) {
        title = obj.title;
      } else {
        title = obj.title.substr(0, 25) + '...';
      }
      if (titleLen < 10) {
        shortTitle = obj.title;
      } else {
        shortTitle = obj.title.substr(0, 10) + '...';
      }
      hint = App.u.escapeQuote(obj.title);
    } else {
      title = '...';
    }
    curTab.title = obj.title;
    body.tabTitle = obj.title;

    //get icon for title
    if (obj.parent) {
      imgId = tabs[tabs[tabId].gParent].func;
    } else {
      imgId = obj.id;
    }
    tImg = getMainImg(imgId, obj.selfIcon, pageInfo.commonDir);
    tStyle = getMainImg(imgId, obj.selfIcon, pageInfo.commonDir, true);

    body.tImg = tImg;
    body.tStyle = tStyle;
    //remember parent params for return parent by cancel
    if (obj.rParent) {
      curTab.rParentObj = tabs[tabId].paramObjAll;
    } else {
      curTab.rParentObj = undefined;
    }

    //set tabs props
    curTab.paramObjAll = obj.urlObj;

    if (obj.type !== 'empty') {
      curTab.notLoaded = false;
    }

    curTab.iType = obj.iType;
    curTab.pinIcon = obj.pinIcon ? obj.pinIcon : getGroupIcon(imgId);
    curTab.pin = obj.pin || false;

    curTab.header = {
      tabId: tabId,
      title: title,
      hint: hint,
      isPin: obj.pin,
      pinIcon: curTab.pinIcon,
      shortTitle: shortTitle,
      theme: pageInfo.theme };

    curTab.func = obj.func;

    curTab.favorite = obj.favorite;

    curTab.features = obj.features;
    curTab.wizard = obj.wizard;
    //make help param
    if (obj.help) {
      curTab.help = obj.help;
    } else if (obj.__src === 'toolbarAction' || obj.__src === 'okForm' || obj.__src === 'tSetting') {
      if (obj.parent && tabs[obj.parent]) {
        curTab.help = tabs[obj.parent].help + '.' + obj.__srcBtn;
      } else {
        curTab.help = obj.func;
      }
    } else {
      //obj.__src === 'menuAction' ||
      //  obj.newtab ||
      //  obj.__src === 'dashboardBtn'
      curTab.help = obj.func;
    }
    body.help = curTab.help;

    return body;
  },
      getQueryString = function getQueryString(queryObj) {
    var paramString = '',
        j = 0,
        curValue;
    for (var key in queryObj) {
      if (key !== '') {
        if (j !== 0) {
          paramString += '&';
        }
        //encode params
        paramString += key + '=' + encodeURIComponent(queryObj[key]);
        j++;
      }
    }
    return paramString;
  },


  /**
   * activate tab when switching
   * @param {String} tabId
   */
  activateTab = function activateTab(tabId) {
    var gParent = '',
        prevTabId = activeTab,
        pTabId = '',
        selid = [],
        func;
    //checking, probably deleted it early
    if (tabs[activeTab]) {
      tabs[activeTab].deactive();
      //remove actChild from gParent if child
      if (tabs[activeTab].gParent) {
        gParent = tabs[activeTab].gParent;
        tabs[gParent].actChild = null;
      }
    }
    //write actChild to gParent if child
    if (tabs[tabId].gParent) {
      gParent = tabs[tabId].gParent;
      tabs[gParent].actChild = tabId;
    }
    tabs[tabId].activate();
    if (!gParent) {
      pTabId = tabId;
    } else {
      pTabId = gParent;
    }

    EventMgr.trigger('activateTab', { tabId: tabId });
    EventMgr.trigger('changedTab', { tabId: tabId, prevTabId: prevTabId });
    EventMgr.trigger('changeTabStatus', {
      func: getMenuFunction(pTabId),
      type: 'activate' });
    EventMgr.trigger('changedTabs', { tabs: tabs });
    //EventMgr.trigger('switchTab', {tabId : tabId});
    activeTab = tabId;
    //updateTab or load if notloaded
    if (tabs[tabId].aupdate || tabs[tabId].notLoaded) {
      selid = true;
      EventMgr.trigger('reloadTab', {
        tabId: tabId,
        selid: selid,
        help: true,
        filter: true });
    }
  },
      isPinTab = function isPinTab(tabId) {
    var isPin = false;
    if (tabs[tabId] && tabs[tabId].pin) {
      isPin = true;
    } else if (tabs[tabId] && tabs[tabId].gParent) {
      if (tabs[tabs[tabId].gParent] && tabs[tabs[tabId].gParent].pin) {
        isPin = true;
      }
    }
    return isPin;
  },
      getMenuFunction = function getMenuFunction(pTabId) {
    var func = '';
    //get func name
    if (tabs[pTabId]) {
      if (tabs[pTabId].menuFunc) {
        func = tabs[pTabId].menuFunc;
      } else if (tabs[pTabId].func) {
        func = tabs[pTabId].func;
      } else if (tabs[pTabId].paramObjAll) {
        func = tabs[pTabId].paramObjAll.func;
      }
    }
    return func;
  },

  /**
   * activate new opened tab
   * @param {String} tabId Activated tabId
   * @param {Boolean} empty Empty Tabrea
   * @param {String} iType
   */
  activateNewTab = function activateNewTab(tabId, empty, iType) {
    var isPin = isPinTab(activeTab);
    if (activeTab === tabId) {
      tabs[tabId].activate();
      return;
    }
    var hType = tabs[tabId].hType,
        parent = tabs[tabId].parent || null,
        gParent = tabs[tabId].gParent || null,
        pTabId,
        child,
        update = iType === 'hardUpdate' || iType === 'softUpdate',
        replace = iType === 'replace';
    //delete active tab if not default and not child
    if (activeTab && activeTab !== defaultTab && !empty && hType !== 'child' && tabId !== 'tab0' && !update && !replace && !isPin) {
      //close tabs group (parents & children)
      closeTabGroup(activeTab);
    }
    //delete sibling child
    if (parent && tabs[parent].child && !update && !replace) {
      child = tabs[parent].child;
      closeChildTab(child);
    }

    if (hType === 'child') {
      //write child to parent
      tabs[parent].child = tabId;
      //write actChild to greatParent
      tabs[gParent].actChild = tabId;
    }
    if (tabs[activeTab]) {
      tabs[activeTab].deactive();
    }
    tabs[tabId].activate();

    if (!gParent) {
      pTabId = tabId;
    } else {
      pTabId = gParent;
    }
    activeTab = tabId;
    //remove loading className
    $('.m-item.loading').removeClass('loading');
    EventMgr.trigger('activateTab', { tabId: tabId });
    EventMgr.trigger('changeTabStatus', {
      func: getMenuFunction(pTabId),
      type: 'activate' });
    EventMgr.trigger('changedTabs', { tabs: tabs });
  },

  /**
   * finding out new active tab
   * @param {String} tabId closed TabId
   */
  newActiveTab = function newActiveTab(tabId, src) {
    var newActTab, gParent, pTabId;
    //check actChild
    if (!tabs[tabId]) {
      return;
    }
    if (tabs[tabId].gParent) {
      gParent = tabs[tabId].gParent;
      if (!tabs[gParent].actChild) {
        return;
      }
    } else if (tabs[tabId].actChild) {} else if (tabId !== activeTab) {
      return;
    }
    //set active to dashboard
    if (tabs[tabId].hType === 'parent') {
      if (src === 'backBtn') {
        newActTab = 'tab0';
      } else {
        newActTab = getNextTab(tabId);
      }
    } else {
      //set active to parent
      newActTab = tabs[tabId].parent;
      if (tabs[tabId].gParent) {
        gParent = tabs[tabId].gParent;
        tabs[gParent].actChild = newActTab;
      }
    }
    //set actChild for
    if (tabs[newActTab].gParent) {
      tabs[tabs[newActTab].gParent].actChild = newActTab;
    }

    tabs[newActTab].activate();

    if (!gParent) {
      pTabId = newActTab;
    } else {
      pTabId = gParent;
    }
    activeTab = newActTab;
    EventMgr.trigger('activateTab', { tabId: newActTab });
    EventMgr.trigger('changeTabStatus', {
      func: getMenuFunction(pTabId),
      type: 'activate' });
    EventMgr.trigger('changedTab', { tabId: newActTab });
    EventMgr.trigger('changedTabs', { tabs: tabs });

    if (tabs[newActTab].aupdate || tabs[newActTab].notLoaded) {
      EventMgr.trigger('reloadTab', {
        tabId: newActTab,
        __src: 'activateTab',
        selid: true,
        filter: true });
    }
  },

  //get right or left tab
  getNextTab = function getNextTab(tabId) {
    var tabsArr = [],
        ind = 0,
        selfIndex,
        next,
        prev;
    for (var key in tabs) {
      if (tabs[key].hType === 'parent') {
        tabsArr.push(key);
        if (key === tabId) {
          selfIndex = ind;
        }
        ind++;
      }
    }
    next = selfIndex + 1;
    prev = selfIndex - 1;
    if (tabsArr[next]) {
      return getChild(tabsArr[next]);
    } else if (tabsArr[prev]) {
      return getChild(tabsArr[prev]);
    } else {
      return defaultTab;
    }
  },

  //get last child tab
  getChild = function getChild(tabId) {
    var childTabId = tabId;
    if (tabs[tabId].child) {
      childTabId = getChild(tabs[tabId].child);
    }
    return childTabId;
  },

  //switch tabs
  switchTabs = function switchTabs(e) {
    e.preventDefault();
    var tabId = this.getAttribute('data-tabid');

    if (activeTab === tabId) {
      return;
    }
    activateTab(tabId);
    if (tabs[tabId].type === 'form' || tabs[tabId].type === 'report') {
      EventMgr.trigger('switchTabForm', { tabId: tabId });
      EventMgr.trigger('updFormHeight', { tabId: tabId });
    } else {
      EventMgr.trigger('updTableHeight');
    }
    EventMgr.trigger('switchTab', { tabId: tabId });
  },
      closeTabsByMiddleBtn = function closeTabsByMiddleBtn(e) {
    if (e.which === 2 || e.button === 1) {
      var tabId = this.getAttribute('data-tabid');
      e.preventDefault();
      if (tabId !== 'tab0') {
        closeTabClickHandler.apply(this, [e]);
      }
    }
  },

  //update tab by dbclick
  upSwitchedTabs = function upSwitchedTabs(e) {
    e.preventDefault();
    var tabId = this.getAttribute('data-tabid');
    EventMgr.trigger('reloadTab', { tabId: tabId, __src: 'dblclickTab', filter: true });
  },

  //append new tab
  appendTab = function appendTab(e, data) {
    var tabObj = data.tab,
        newtab = data.newtab || false,
        bands = data.bands || '',
        map = data.map || '',
        tabId,
        isPin = isPinTab(activeTab);
    if (activeTab !== defaultTab && !newtab && !isPin) {
      if (tabs[activeTab].gParent) {
        tabId = tabs[activeTab].gParent;
      } else {
        tabId = activeTab;
      }
    }
    if (!tabObj.iType) {
      tabObj.render().append(tabId).clean();
    } else if (tabObj.iType === 'hardUpdate') {
      tabObj.render().update().clean();
    } else if (tabObj.iType === 'softUpdate') {
      tabObj.softUpdate().clean();
    } else if (tabObj.iType === 'replace') {
      tabObj.render().replace().clean();
    }

    EventMgr.trigger('appended', { tabId: tabObj.id });
    //trigger events
    if (tabObj.type === 'form') {
      EventMgr.trigger('appendForm', {
        tabId: tabObj.id,
        tabObj: tabObj,
        srcData: data.srcData });
    } else if (tabObj.type === 'list') {
      EventMgr.trigger('appendList', { tabId: tabObj.id, srcData: data.srcData });
    } else if (tabObj.type === 'dashboard') {
      EventMgr.trigger('appendDashboard', {});
    } else if (tabObj.type === 'report') {
      EventMgr.trigger('appendReport', { tabId: tabObj.id, bands: bands });
    } else if (tabObj.type === 'map' || tabObj.type === 'rack') {
      EventMgr.trigger('appendMap', { tabId: tabObj.id, map: map });
    }
    //get filter
    if (tabObj.filter === true) {
      EventMgr.trigger('appendFilter', {
        tabId: tabObj.id,
        listParam: tabObj.paramObjAll,
        func: tabObj.filterFunc });
    }
    data = null;
    checkFeatures(tabObj);
  },
      closeTabClickHandler = function closeTabClickHandler(e) {
    e.stopPropagation();
    var tabId = this.getAttribute('rel') || this.getAttribute('data-tabid'),
        isChanged = false,
        isPin = tabs[tabId].pin;
    if (isPin) {
      return;
    }
    if (tabs[tabId] && tabs[tabId].type === 'form' && pageInfo.checkUnsaved) {
      var changedFields = checkFormChange(tabId);
      if (changedFields.isChanged) {
        isChanged = true;
        EventMgr.trigger('confirmBoxShow', {
          callbackOk: closeTab,
          callbackCancel: '',
          self: this,
          text: String(pageInfo.unsavedData).replace('__VALUE__', changedFields.count) + '<br/><span class="b-text_style_bold">' + changedFields.labels + '</span>',
          args: [e, tabId],
          checkbox: {
            msg: pageInfo.unsavedDontShow,
            cb: unsavedDataCheckboxHandler
          }
        });
      }
    }
    if (!isChanged) {
      closeTab(e, tabId);
    }
  },


  //close tab
  closeTab = function closeTab(e, data, src) {
    EventMgr.trigger('closeTab', {});
    var tabId, parent;
    if (data) {
      tabId = data;
    } else {
      tabId = this.getAttribute('rel');
    }
    if (!tabs[tabId]) {
      return;
    }
    //check for tab is pin
    if (tabs[tabId] && tabs[tabId].pin) {
      //reload tab if it form
      if (tabs[tabId].type === 'form') {
        EventMgr.trigger('reloadTab', { tabId: tabId, __src: 'pinForm' });
      }
      return;
    }
    EventMgr.trigger('closeTabEvent', { tabId: tabId });

    newActiveTab(tabId, src); //set new active tab
    //killing children
    if (tabs[tabId] && tabs[tabId].child) {
      closeChildTab(tabs[tabId].child);
    }
    //clear child from parent
    if (tabs[tabId] && tabs[tabId].hType === 'child') {
      parent = tabs[tabId].parent;
      tabs[parent].child = null;
    }
    tabs[tabId].close();
    delete tabs[tabId];
    if (e) {
      e.preventDefault();
    }

    EventMgr.trigger('updTableHeight');
    EventMgr.trigger('changedTabs', { tabs: tabs });
  },

  /**
   * close tab's group
   * @param {Stirng} tabId closing tab
   */
  closeTabGroup = function closeTabGroup(tabId) {
    EventMgr.trigger('closeTab', { tabId: tabId });
    if (tabs[tabId].child) {
      closeChildTab(tabs[tabId].child);
    }
    if (tabs[tabId].parent) {
      closeParentTab(tabs[tabId].parent);
    }
    if (tabId !== 'tab0') {
      tabs[tabId].close();
      delete tabs[tabId];
      EventMgr.trigger('closeTabEvent', { tabId: tabId });
    }
  },

  /**
   * close tab's parent
   * @param {String} tabId closing tab parent (will remove)
   */
  closeParentTab = function closeParentTab(tabId) {
    EventMgr.trigger('closeTabEvent', { tabId: tabId });
    if (tabs[tabId].parent) {
      closeParentTab(tabs[tabId].parent);
    }
    tabs[tabId].close();
    delete tabs[tabId];
  },

  /**
   * close tab's child
   * @param {Stirng} tabId closing tab child (will remove)
   */
  closeChildTab = function closeChildTab(tabId) {
    EventMgr.trigger('closeTabEvent', { tabId: tabId });
    if (tabs[tabId].child) {
      closeChildTab(tabs[tabId].child);
    }
    tabs[tabId].close();
    delete tabs[tabId];
  },

  //close all tabs
  closeAllTabs = function closeAllTabs(e) {
    if (tabs) {
      for (var key in tabs) {
        if (tabs.hasOwnProperty(key)) {
          if (key !== 'tab0') {
            closeTab(e, key);
          }
        }
      }
    }
  },

  //close all tabs expect active
  closeOthersTabs = function closeOthersTabs(e) {
    if (tabs) {
      var actTabId = $('.tab-content_st_active').attr('data-tabid'),
          actParentTabId = tabs[actTabId].gParent ? tabs[actTabId].gParent : actTabId;
      for (var key in tabs) {
        if (tabs.hasOwnProperty(key)) {
          if (key !== 'tab0' && tabs[key].hType === 'parent' && key !== actParentTabId) {
            closeTab(e, key);
          }
        }
      }
    }
  },

  //back btn handler
  backBtnHandler = function backBtnHandler(e, data) {
    e.preventDefault();
    var tabId,
        parentId,
        selid = [],
        self = $(this),
        plid = filterXSS.friendlyAttrValue(self.parents('.toolbar').attr('data-plid') || ''),
        isReport = self.closest('.tab-content').attr('data-report') === 'report';
    if (data) {
      tabId = data;
    } else {
      tabId = this.getAttribute('rel');
    }
    selid.push(plid);
    parentId = tabs[tabId].parent;
    if (App.Dom.hasClass(this, 'updatetab')) {
      var pos = plid.lastIndexOf('/'),
          url = pageInfo.url,
          parent = null,
          targetId = tabId,
          funcName = this.getAttribute('data-url').replace('func=', ''),
          param = {};
      param.func = funcName;
      if (pos !== -1) {
        plid = plid.substring(0, pos);
        pos = plid.lastIndexOf('/');
        if (pos === -1) {
          param.elid = plid;
        } else {
          param.plid = plid.substring(0, pos);
          param.elid = plid.substr(pos + 1);
        }
      }
      EventMgr.trigger('ajaxRequest', {
        url: url,
        param: param,
        invar: { parent: parent, targetTabId: targetId, iType: 'replace', __src: 'toolbarAction' },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failCommonAjaxResponse',
        queue: 'noqueue' });
      EventMgr.trigger('tabLoading', { tabId: tabId });
    } else {
      closeTab.apply(this, [e, tabId, 'backBtn']);
      if (parentId && !isReport) {
        EventMgr.trigger('reloadTab', {
          tabId: parentId,
          __src: 'backBtn',
          selid: selid,
          filter: true });
        EventMgr.trigger('tabLoading', { tabId: parentId });
      }
    }
  },

  //update tab by autoupdate
  updateTab = function updateTab(e, data) {
    var tabId = data.tabId,
        delay = data.delay,
        selid;
    if (activeTab !== tabId) {
      if (tabs[tabId] !== undefined && tabs[tabId].autoupdate) {
        setTimeout(function (tabId, delay) {
          return function () {
            EventMgr.trigger('updateTab', { tabId: tabId, delay: delay });
          };
        }(tabId, delay), delay * 1000);
        tabs[tabId].autoupdate = true;
      }
    } else {
      selid = true;
      EventMgr.trigger('reloadTab', {
        tabId: tabId,
        __src: 'autoUpdate',
        selid: selid,
        filter: true });
    }
  },

  //stop autoupdate by click button
  stopAutoUpdate = function stopAutoUpdate(e) {
    e.preventDefault();
    var tabId = this.getAttribute('data-tabid');
    if (tabs[tabId]) {
      tabs[tabId].autoupdate = false;
      clearTimeout(tabs[tabId].timeId);
      App.Dom.removeClass(this, 'i-list-icon__stop');
      App.Dom.addClass(this, 'b-elem_style_gracescale');
    }
  },

  //get elid selected elements
  getSelectedElems = function getSelectedElems(tabId) {
    var selid = [],
        elid;
    $('#cont-' + tabId + ' .list_table tr.selected:not(".filtred")').each(function () {
      elid = this.getAttribute('data-elid');
      selid.push(elid);
    });
    return selid;
  },
      getScrollTop = function getScrollTop(tabId) {
    var elem = App.Dom.byId('ltwr-' + tabId + '-scrollbar-handler'),
        top = 0;
    if (elem) {
      top = parseFloat(elem.style.top, 10);
    }
    return top;
  },

  //render table
  //return with unopenned <div>,
  // for external usage need to add unclosed <div>
  renderTable = function renderTable(args) {
    var keyVar,
        headers = args.headers,
        headersName = {},
        tableHead,
        tableBody,
        output;
    /* jslint forin: true */
    for (keyVar in headers) {
      headersName[headers[keyVar].name] = {
        type: headers[keyVar].type,
        hidden: headers[keyVar].hidden ? true : false
      };
    }
    args.headersName = headersName;
    tableHead = renderTableHeader(args);
    tableBody = renderTableBody(args);
    output = tableHead.output;
    output += tableBody;
    if (args.sbar) {
      output += '<div class="bottom-bar">';
      output += tableHead.sBar;
    }
    return output;
  },
      renderTableHeader = function renderTableHeader(args) {
    var output = '',
        dHeader = '',
        sBar = '',
        tabId = args.tabId,
        headers = args.headers,
        props = args.props,
        elKeyName = args.elKeyName || args.elKey,
        elKey = args.elKey,
        colLen = headers.length,
        keyVar,
        header,
        className,
        triangle,
        thAttr,
        divAttr,
        rowHandler,
        dataSorttype,
        text,
        total,
        first;

    output += '<table class="list_table init b-list__table_type_body" id="lt-' + tabId + '">' + '<thead><tr>';
    dHeader += '<table id="sort_table-' + tabId + '" class="sort_table b-list__table_type_head">' + '<thead class="1"><tr>';
    sBar += '<table id="statusbar-' + tabId + '" class="statusbar b-list__table_type_footer">' + '<tbody class="1"><tr>';
    /* jslint forin: true */
    for (keyVar in headers) {
      header = headers[keyVar];
      //check for only data diagram col
      if (header && header.hidden) {
        continue;
      }
      className = header.hint ? ' hint ' : '';
      className += header.align ? ' align-' + header.align : '';
      if (header.minimize) {
        className += ' i-minimize-col ';
      }
      triangle = '';
      first = keyVar - 0 === 0;
      thAttr = ' data-colname="' + header.name + '" ';
      divAttr = ' data-colname="' + header.name + '" ';
      divAttr += ' data-coln="' + keyVar + '" ';
      thAttr += header.total ? ' data-type="' + header.type + '" ' : '';
      thAttr += header.nestedreport ? ' data-nestedreport="' + header.nestedreport + '" ' : '';
      thAttr += header.nestedlist ? ' data-nestedlist="' + header.nestedlist + '" ' : '';
      thAttr += header.nestedlistBlank ? ' data-nestedlist-blank="true" ' : '';
      thAttr += header.editform ? ' data-editform="' + header.editform + '" ' : '';
      header.hint = header.hint ? App.u.escapeQuote(header.hint) : undefined;
      thAttr += header.hint ? ' data-hint="' + header.hint + '" ' : '';
      thAttr += header.width ? ' width="' + header.width + '"' : '';
      //resize col handler
      rowHandler = keyVar - 0 !== 0 ? '<div class="rowHandler"><div class="rowLine1"></div>' + '<div class="rowLine2"></div></div>' : '';
      thAttr += header.edit ? ' data-edit-func="' + header.edit + '" ' : '';
      if (elKey === header.name) {
        className += ' keyfield ';
      }
      if (elKeyName === header.name) {
        className += ' keynamefield ';
      }
      if (first) {
        className += 'first ';
        text = pageInfo.selected + ' - 1';
      } else {
        text = '';
      }
      if (colLen - 1 === keyVar) {
        className += 'last';
      }
      //sorting cols
      if (header.sort && !args.band) {
        className += ' td_sort i-tip-target_st_sort i-tip-target_st_msort';
        dataSorttype = header.sort;
      } else if (header.sort && args.band) {
        className += ' td_client_sort i-tip-target_st_sort i-tip-target_st_msort';
        dataSorttype = header.sort;
      }
      divAttr += dataSorttype ? ' data-sorttype="' + dataSorttype + '" ' : '';
      //sorted col
      if (header.sorted) {
        if (String(header.sorted).match(/\+/)) {
          //asc
          triangle = '<div class="triangl-bot triangle"></div>';
        } else {
          //desc
          triangle = '<div class="triangl-top triangle"></div>';
        }
        if (args.sortedCount > 1) {
          triangle += '<div class="b-sort-table__sort-order">' + String(header.sorted).charAt(1) + '</div>';
        }
        divAttr += 'sorting="' + header.sorted + '"';
      } else {
        triangle = '<div class="triangle"></div>';
      }

      triangle += '<div class="filter-icon hint"  data-hint=""></div>';
      //check for development flag
      if (devMode) {
        triangle += '<a href="#" class="devel-link-settings devel-link-settings--col" data-elid="' + header.name + '" data-tabid="' + tabId + '"></a>';
        triangle += '<a href="#" class="devel-link-delete devel-link-delete--col" data-elid="' + header.name + '" data-name="' + header.pName + '" data-tabid="' + tabId + '"></a>';
        if (first) {
          triangle += '<a href="#" class="devel-link-add devel-link-add--col"  data-tabid="' + tabId + '"></a>';
        }
      }

      if (header.type === 'button') {
        for (keyVar in header.confirm) {
          if (header.confirm[keyVar] !== '') {
            divAttr += ' data-confirm-' + keyVar + '="' + header.confirm[keyVar] + '" ';
          }
        }
      }
      //@todo warning!!! diff html
      output += '<th  class="' + className + '" ' + thAttr + '>' + '<div class="ovf" ' + divAttr + '><span class="data-wrapper" data-mn="' + header.name + '" data-fn="' + args.func + '">' + header.pName + '</span>' + triangle + '</div> ' + rowHandler + '</th>';
      dHeader += '<td  class="' + className + '" ' + thAttr + '>' + '<div class="ovf"  ' + divAttr + '><span class="data-wrapper" data-mn="' + header.name + '" data-fn="' + args.func + '">' + header.pName + '</span>' + triangle + '</div> ' + rowHandler + '</td>';
      //row selected
      if (keyVar - 0 === 0) {
        sBar += '<td ' + thAttr + '>' + '<div class="ovf"><span class="sb-result sb-result_index_0 sb-result_st_active" data-mn="msg_total" data-fn="desktop">' + pageInfo.total + ': ' + args.pager.pageElems + '</span><span class="sb-selected sb-selected_index_0" data-mn="msg_selected" data-fn="desktop">' + pageInfo.selected + ': 1</span></div></td>';
      } else {
        //count total row
        if (header.total !== '') {
          //check for type props or not
          if (_typeof(header.total) === 'object') {
            total = renderPropsStat(header.total, props);
            className += ' data';
          } else {
            total = header.total;
            className += ' data';
          }
        } else {
          total = '';
          className += ' empty';
        }

        sBar += '<td ' + thAttr + '>' + '<div class="ovf">' + '<span class="sb-result sb-result_st_active sb-result_index_' + keyVar + '">' + total + ' </span>' + '<span class="sb-selected sb-selected_index_' + keyVar + '">' + text + '</span></div></td>';
      }
    }

    output += '</tr></thead>';
    dHeader += '</tr></thead></table>';
    output = dHeader + output;
    sBar += '</tr></thead></table>';

    return {
      output: output,
      sBar: sBar };
  },
      renderTableBody = function renderTableBody(args) {
    var output = '<tbody>',
        plid = args.plid ? ' data-plid="' + filterXSS.safeAttrValue('div', 'data-plid', args.plid) + '" ' : '',
        keyVar,
        contentItem,
        elid,
        className,
        curElKeyName,
        curElKey,
        id,
        hint,
        attr,
        len,
        headers = args.headers,
        elKeyName = args.elKeyName || args.elKey,
        elKey = args.elKey,
        ii = 0,
        content = args.content;
    args.defProp = args.props ? findDefProp(args.props) : null;
    if (args.backBtn) {
      len = args.headers.length;
      output += '<tr class="back-btn"><td colspan="' + len + '">' + '<div class="back-btn-row hint" data-tabid="' + args.tabId + '" >' + '<div class="hint back-btn-row-hint" data-hint="' + App.u.escapeQuote(App.Common.msg.hintBack) + '"></div></td></tr>';
      ii++;
    }
    //render tbody
    /* jslint forin:true */
    for (keyVar in content) {
      contentItem = content[keyVar];
      elid = '';
      className = '';
      curElKeyName = '';
      curElKey = '';
      ii++;
      rowId++;
      id = '';
      hint = '';
      attr = plid;
      attr += ' id="i-' + rowId + '" ';
      //data-index for detect row in model
      attr += ' data-index="' + keyVar + '"';
      if (elKey !== undefined && contentItem[elKey] !== undefined) {
        curElKey = contentItem[elKey].v.replace(/"/g, '&quot;');
        attr += ' data-elid="' + curElKey + '" ';
        elid = contentItem[elKey].v;
      }
      if (elKeyName !== undefined && contentItem[elKeyName] !== undefined) {
        curElKeyName = contentItem[elKeyName].v.replace(/"/g, '&quot;');
        attr += ' data-elkeyname ="' + curElKeyName + '" ';
      }
      if (ii % 2 === 0) {
        className = ' even ';
      } else {
        className = '';
      }
      if (contentItem._ovcol) {
        className += ' ' + contentItem._ovcol + ' ';
      }
      if (contentItem._ovhide) {
        attr += ' data-hide="' + contentItem._ovhide + '" ';
        className += ' toolbtn-hide ';
      }
      if (contentItem._ovremove) {
        attr += ' data-remove="' + contentItem._ovremove + '" ';
        className += ' toolbtn-remove ';
      }
      if (contentItem._ovshow) {
        attr += ' data-show="' + contentItem._ovshow + '" ';
        className += ' toolbtn-show ';
      }
      if (args.warning) {
        if (args.warning[elid] !== undefined) {
          if (args.warning[elid].msg !== undefined) {
            className += ' warning';
            hint = App.u.escapeQuote(args.warning[elid].msg);
            delete args.warning[elid];
          }
        }
      }

      className += ' b-list__table-row';
      output += '<tr class="' + className + '"' + attr + ' >';
      output += buildRow(contentItem, args, hint);
      output += '</tr>';
    }
    if (args.warning) {
      EventMgr.trigger('nextEventBind', {
        event: 'appendList',
        tData: args.warning,
        cb: function cb(e, data) {
          if (e.data) {
            var tabId = data.tabId,
                bannerText = $('#cont-' + tabId + ' .b-message__text_warning').get(0),
                warning = e.data,
                extraText = '';

            if (bannerText) {
              for (var key in warning) {
                if (warning[key]) {
                  extraText += warning[key].msg + '<br/>';
                }
              }
              if (extraText) {
                bannerText.innerHTML = extraText;
              }
              EventMgr.trigger('updateScroll', { id: 'cont-' + tabId });
            }
          }
        }
      });
    }
    output += '</tbody>';
    output += buildLastRow(args);
    output += '</table>';
    output += '</div>'; //close table div from template
    return output;
  },


  //render Row
  buildRow = function buildRow(row, args, hint) {
    var headers = args.headersName,
        output = '',
        elKey = args.elKey,
        i = 0,
        ind = 0,
        warning,
        color,
        keyVar,
        usage,
        type,
        currentRow,
        editableClass,
        contentClassName,
        colNameClass,
        contentAttrs,
        attr,
        className,
        value,
        id,
        per,
        buttons,
        j,
        button,
        func,
        form,
        name,
        btnMsg,
        onlyForm;
    /* jslint forin:true */
    for (keyVar in headers) {
      //check for only diagram col
      if (headers[keyVar] && headers[keyVar].hidden) {
        continue;
      }
      i++;
      warning = '';
      className = '';
      editableClass = '';
      colNameClass = 'b-list__table-col_name_' + keyVar;
      color = '';
      value = '';
      attr = '';
      usage = '';
      per = '';
      contentAttrs = '';
      buttons = '';
      onlyForm = false;
      if (elKey === keyVar) {
        className += ' key-field ';
      }
      if (i === 1 && hint !== '' && hint !== undefined) {
        warning = '<div class="warning-img hint" data-hint="' + hint + '"></div>';
      }
      currentRow = row[keyVar];
      if (args.headers[ind].edit) {
        editableClass += ' editable ';
      }
      if (args.testMode) {
        editableClass += ' i-testmode-field ';
      }
      if (args.headers[ind].fastFilter && !args.blockId) {
        editableClass += ' i-filter-field ';
      }
      contentClassName = args.headers[ind].nestedlist !== undefined && !currentRow.nestedlist ? ' i-nestedlist b-list__table-col-content_type_link' : '';
      contentClassName += args.headers[ind].editform !== undefined && !currentRow.nolink ? ' i-editform b-list__table-col-content_type_link ' + 'b-list__table-col-content_style_underline' : '';
      if (currentRow !== undefined) {
        type = headers[keyVar].type;
        //data/prop/money
        if (type === 'data' || type === 'prop' || type === 'money') {
          if (currentRow.color !== undefined) {
            className += ' status-' + currentRow.color;
          }
          if (args.headers[ind].acthint) {
            className += ' acthint ';
          }
          value = args.headers[ind].noescaping ? window.filterXSS(window.htmlDecode(currentRow.v)) : currentRow.v;
          id = currentRow.id ? window.filterXSS(window.htmlDecode(currentRow.id)) : null;
          contentClassName += args.headers[ind].wrap ? ' b-list__table-col-content_is_wrap ' : '';
          className += args.headers[ind].nestedreport !== undefined ? ' nestedreport ' : '';
          className += args.headers[ind].align ? ' align-' + args.headers[ind].align : '';
          attr += currentRow.link ? ' data-child-id="' + args.oTabId + '-' + currentRow.childid + '" ' : '';
          attr += currentRow.elid ? ' data-elid="' + currentRow.elid + '" ' : '';
          contentAttrs += id ? ' data-v-id="' + id + '"' : '';
          contentAttrs += currentRow.orig ? 'data-orig="' + currentRow.orig + '"' : '';
          if (currentRow.props) {
            attr += currentRow.psp ? ' data-stat="' + currentRow.psp + '" ' : '';
            output += '\n                  <td>\n                    <div class="ovf i-text-content ' + editableClass + '">\n                      ' + warning + '\n                      <span class="data-wrapper " ' + attr + '>\n                        ' + makeProps(currentRow, args, row) + '\n                      </span>\n                      <span class="data middle ' + className + '">\n                        <span class="b-list__table-col-content ' + contentClassName + '" ' + contentAttrs + '>' + currentRow.v + '</span>\n                      </span>\n                    </div>\n                  </td>';
          } else {
            output += '\n                  <td class="first ' + colNameClass + '">\n                    ' + warning + '\n                    <span class="i-text-content data-wrapper data ' + className + ' ' + editableClass + '" ' + attr + '>\n                      <span class="b-list__table-col-content ' + contentClassName + '" ' + contentAttrs + '>' + value + '</span>\n                    </span>\n                  </td>';
          }
          //indicator
        } else if (type === 'indicator') {
          if (currentRow.u && currentRow.l) {
            if (currentRow.color !== undefined) {
              className = ' status-' + currentRow.color;
            }
            if (parseInt(currentRow.l, 10) !== 0) {
              if (parseInt(currentRow.u, 10) === 0) {
                per = 0;
              } else {
                per = Math.round(currentRow.u / currentRow.l * 100);
                if (per === 0 || !per) {
                  per = 0;
                }
                per = per > 100 ? 100 : per;
              }
              usage = '<div class="used-wr">' + '<div class="used" style="width:' + per + '%"></div></div>';
            }
          }
          output += '<td class="first">' + '<span class="i-text-content data-wrapper data ' + className + editableClass + '">' + warning + '<span class="b-list__table-col-content ' + contentClassName + '">' + window.htmlDecode(currentRow.v) + '</span>' + '</span>' + usage + '</td>';
          //indicator brackets
        } else if (type === 'indicatorbrackets') {
          if (currentRow.color !== undefined) {
            className = ' status-' + currentRow.color;
          }
          value = currentRow.l || '';
          if (currentRow.u !== '') {
            value += ' (<span class="' + className + '">' + currentRow.u + '</span>)';
          }
          output += '<td class="first">' + '<span class="i-text-content data-wrapper data">' + warning + '<span class="b-list__table-col-content ' + contentClassName + '">' + value + '</span>' + '</span></td>';
          //buttons
        } else if (type === 'button') {
          for (j = 0; j < currentRow.buttons.length; j++) {
            button = currentRow.buttons[j];
            if (button !== '') {
              name = button;
              //for billing dashboard show msg for btn from col & open only form
              onlyForm = args.btn[name].msgsrc && row[args.btn[name].msgsrc];
              attr = '';
              if (!onlyForm) {
                attr += ' data-func="func=' + args.func + '" ';
              }
              attr += ' data-type="' + args.btn[button].type + '" ';
              attr += ' data-name="' + button + '" ';
              type = args.btn[button].type;
              if (onlyForm) {
                btnMsg = row[args.btn[name].msgsrc].v;
              } else {
                btnMsg = args.btn[name].name;
              }
              if (type === 'edit' || type === 'group' || type === 'editlist') {
                attr += ' data-form="func=' + args.btn[button].func + '&elid=' + row[args.elKey].v + '" ';
              }

              buttons += '<a href="#" ' + attr + ' class="dashboard-button">' + btnMsg + '</a> ';

              //buttons += args.btn[currentRow.buttons[i]].name + ' ';
            }
          }
          output += '<td><span class="data-wrapper">' + buttons + '</span></td>';
        }
      } else {
        output += '<td><span class="data-wrapper ' + className + '"></span></td>';
      }
      ind++;
    }
    return output;
  },


  /**
   * Рендерем props и xprop для статусбара
   * @param total
   */
  renderPropsStat = function renderPropsStat(total, props) {
    var stat = '',
        i = 0,
        keyVar,
        cumma = '',
        propName,
        prop,
        sprite = false,
        extension,
        className = '';
    /* jslint forin:true */
    for (keyVar in total) {
      if (i !== 0) {
        cumma = ',</span> ';
      } else {
        cumma = '';
      }
      if (total[keyVar] - 0 === 0) {
        className = 'no';
      } else {
        className = 'default';
      }
      prop = props[keyVar];
      sprite = prop.style === '';
      if (!sprite) {
        extension = prop.animated ? '.gif' : '.png';
        stat += cumma + '<span class="' + className + '"><img class="props" src="' + pageInfo.commonDir + 'img/' + prop.onImg + extension + '"/>' + total[keyVar];
      } else {
        stat += cumma + '<span class="' + className + '"><div class="props s-icon s16x16 ' + prop.onImg + ' i-total-prop-' + keyVar + '"></div>' + total[keyVar];
      }
      i++;
    }
    stat += '</span>';
    return stat;
  },

  //render props
  makeProps = function makeProps(row, args, rows) {
    var output = '',
        propName,
        func,
        type,
        className,
        hide,
        hint,
        attr,
        props = row.props,
        len = props.length,
        i;
    for (i = 1; i < len; i++) {
      if (props[i].n) {
        propName = props[i].n;
        hint = App.u.escapeQuote(args.props[propName].hint);
        func = args.props[propName].func;
        type = args.props[propName].type;
        hide = args.props[propName].hide;
        attr = '';
        className = '';
        if (func && checkFunc(hide, rows)) {
          attr += ' data-func="' + func + '" ';
          attr += ' data-type="' + type + '" ';
          attr += ' data-value="' + props[i].v.replace(/"/g, '&quot;') + '" ';
          className += 'controlprop';
          if (type === 'group') {
            attr += ' data-confirm="' + args.props[propName].confirm + '" ';
          }
          if (args.props[propName].cgi) {
            attr += ' data-cgi="' + args.props[propName].cgi + '" ';
          }
        }
        attr += 'data-name="' + args.props[propName].name + '"';
        // I don't why this rules
        //if (args.props[propName].name !== propName) {
        //check for don't rewrite func attr
        if (!func) {
          attr += ' data-value="' + props[i].v.replace(/"/g, '&quot;') + '" ';
        }

        if (args.props[propName].acthint) {
          className += ' acthint';
        } else {
          className += ' hint';
        }
        if (hint !== '' && hint) {
          hint = App.u.escapeQuote(hint.replace('__value__', props[i].v));
          attr += ' data-hint="' + hint + '" ';
        } else if (props[i].v !== '' && props[i].v) {
          attr += ' data-hint="' + App.u.escapeQuote(props[i].v) + '" ';
        }
        if (args.props[propName].style) {
          attr += args.props[propName].style;
        }
        if (args.props[propName].animated) {
          output += '<img class="props ' + className + ' " ' + attr + ' src="' + pageInfo.commonDir + 'img/' + args.props[propName].onImg + '.gif"/>';
        } else {
          output += '<div class="s-icon s16x16 props ' + className + ' ' + args.props[propName].onImg + '" ' + attr + '></div>';
        }
      }
    }
    return output;
  },

  //check for hide rule for function
  checkFunc = function checkFunc(hide, rows) {
    if (!hide) {
      return true;
    }
    var l = hide.length,
        name,
        value;
    while (l--) {
      name = hide[l].n;
      value = hide[l].v;
      if (rows[name] && rows[name].v === value) {
        return false;
      }
    }
    return true;
  },

  //find default prop
  findDefProp = function findDefProp(props) {
    var keyVar;
    for (keyVar in props) {
      if (props[keyVar].defImg) {
        return keyVar;
      }
    }
    return null;
  },

  //update total report for convert col
  updateTotalWithConvertReport = function updateTotalWithConvertReport(e, data) {
    var id = data.id;
    $('#' + id).html(data.convertValue);
  },
      buildLastRow = function buildLastRow(args) {
    var headers = args.headers,
        colCount = headers.length,
        tFoot = '<tfoot><tr>',
        content = args.content,
        total,
        hint = '',
        msg = App.Common.msg,
        align = '',
        name,
        id;

    for (var i = 0; i < colCount; i++) {
      if (headers && headers[i] && headers[i].hidden) {
        continue;
      }
      total = '';
      id = '';
      align = 'align-' + (headers[i].align || '');
      if (headers[i].total === 'sum') {
        name = headers[i].name;
        total = sumRows(name, content);
        hint = msg.totalSum || '';
      } else if (headers[i].total === 'sumsuffix') {
        hint = msg.totalSum || '';
        total = sumRowsSuffix(name, content, headers[i].convert);
        name = headers[i].name;
      } else if (headers[i].total === 'count') {
        total = content.length;
        hint = msg.totalCount || '';
      } else if (headers[i].total === 'avg') {
        name = headers[i].name;
        total = avgRows(name, content);
        hint = msg.totalAvg || '';
      }

      if (headers[i].convert && total !== '') {
        id = args.tabId + '-' + name;
        EventMgr.trigger('ajaxRequest', {
          param: {
            func: 'convert',
            name: headers[i].convert,
            value: total
          },
          invar: {
            id: id
          },
          type: 'get',
          outtype: 'json',
          trfunc: 'updateTotalWithConvertReport',
          failfunc: 'failMenuAjaxResponse',
          queue: 'multiload'
        });
      }
      tFoot += '<td id="' + id + '" class="hint ' + align + '" data-hint="' + App.u.escapeQuote(hint) + '">' + total + '</td>';
    }
    tFoot += '</tfoot>';
    return tFoot;
  },
      sumRows = function sumRows(name, rows) {
    var len = rows.length,
        sum = 0,
        v,
        maxDec = 0,
        curDec;
    while (len--) {
      if (rows[len][name].orig) {
        v = rows[len][name].orig - 0;
      } else if (rows[len][name].v === '') {
        v = 0;
      } else {
        v = parseFloat(rows[len][name].v.replace(/\s/g, ''));
      }
      curDec = decimalPlaces(v);
      maxDec = curDec > maxDec ? curDec : maxDec;
      sum += v;
    }
    if (maxDec > 0) {
      sum = sum.toFixed(maxDec);
    }
    return sum;
  },
      sumRowsSuffix = function sumRowsSuffix(name, rows, convert) {
    var len = rows.length,
        resultC,
        resultSum = '';
    while (len--) {
      resultC = App.List.dataCalc(resultC, rows[len][name]);
    }
    /* jslint forin: true */
    for (var key in resultC) {
      if (resultSum !== '') {
        resultSum += '; ';
      }
      if (convert === 'money') {
        resultSum += App.Tabs.moneyFormat(resultC[key]) + ' ' + key;
      } else {
        resultSum += resultC[key] + ' ' + key;
      }
    }
    return resultSum;
  },
      avgRows = function avgRows(name, rows) {
    var len = rows.length,
        lenForLoop = len,
        sum = 0,
        avg,
        v;
    while (lenForLoop--) {
      v = rows[lenForLoop][name].v === '' ? 0 : parseFloat(rows[lenForLoop][name].orig || rows[lenForLoop][name].v);
      sum += v;
    }
    avg = sum / len;
    if (avg.toFixed) {
      avg = avg.toFixed(2);
    }
    return avg;
  },
      moneyFormat = function moneyFormat(num) {
    var strNum = '' + parseFloat(num).toFixed(2),
        parts = strNum.split('.'),
        head = parts[0] || '',
        tail = parts[1] || '',
        s = [];
    if (head) {
      var l = head.length,
          p = Math.floor(l / 3);
      for (var i = 0; i < p; i++) {
        s.push(head.substr(l - i * 3 - 3, 3));
      }
      s.push(head.substr(0, l % 3));
      s.reverse();
    }
    if (s.length > 0) {
      return s.join(' ') + '.' + tail;
    } else {
      return num;
    }
  },
      decimalPlaces = function decimalPlaces(num) {
    var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match) {
      return 0;
    }
    return Math.max(0,
    // Number of digits right of decimal point.
    match[1] ? match[1].length : 0,
    // Adjust for scientific notation.
    -(match[2] ? +match[2] : 0));
  },

  /**
   * get Image for group
   * check for selficon, else get icon from menu group
   * @param {String} id
   * @param {String} name
   * @param {String} theme
   * @param {Boolean} style
   */
  getMainImg = function getMainImg(id, name, theme, style) {
    var elem, output, pElem, extImg;
    elem = App.Dom.byId('l-' + id);
    pElem = $(elem).parent();
    extImg = pElem.attr('data-img');
    if (!name) {
      //use this way because id can have dot.
      name = pElem.attr('data-group');
    }
    if (name && name.indexOf(".") != -1) {
      output = '';
    } else {
      output = 'mb-' + name;
    }

    if (style && extImg) {
      if (name && name.indexOf(".") != -1) {
        output = 'style="background: url(' + name + ') left top no-repeat"';
      } else {
        var prefix = 'img/mb-',
            suffix = '.png';
        output = 'style="background: url(' + theme + prefix + name + suffix + ') left top no-repeat"';
      }
    }
    if (!extImg && style) {
      output = '';
    }

    //output = theme + prefix + name + suffix;
    return output;
  },
      getGroupIcon = function getGroupIcon(id) {
    var elem, pElem, output, extImg;
    id = String(id).replace(/\./g, '_');
    elem = App.Dom.byId('l-' + id);
    pElem = $(elem).parent();
    name = pElem.attr('data-group');
    extImg = pElem.attr('data-img');

    if (extImg) {
      output = 'class="subtab__text_for_pin s16x16 s-icon" style="background: url(/manimg/common/img/m-' + name + '.png) left top no-repeat"';
    } else {
      output = 'class="subtab__text_for_pin s16x16 s-icon m-' + name + '"';
    }
    return output;
  },
      devMode = pageInfo.devmode,
      pdfOn = pageInfo.pdfOn,
      dateTimeId,
      renderFormItem = function renderFormItem(item, tabId, classes) {
    var itemHTML = '';
    classes = classes || '';
    //render input text ||hidden || password
    if (item.type === 'text' || item.type === 'hidden' || item.type === 'color' || item.type === 'password') {
      item.setvalue = item.setvalue || '';
      if (item.value) {
        item.value = App.u.escapeQuote(item.value);
      }
      if (item.test && !item.zoom) {
        classes += ' test';
      } else if (item.test && item.zoom) {
        classes += ' testzoom';
      }
      //render help buttons
      if (item.passwd) {
        itemHTML += '<div class="b-input-btn b-input-btn_type_passwd hint"' + ' data-hint="' + App.u.escapeQuote(item.hintGenBtn) + '"' + ' data-control-field="' + item.name + '"></div>';
      }
      if (item.showpwd) {
        itemHTML += '<div class="' + (item.passwd ? 'b-input-btn_is_left' : '') + ' b-input-btn b-input-btn_type_showpwd hint"' + ' data-hint="' + App.u.escapeQuote(item.hintShowPwdBtn) + '"' + ' data-control-field="' + item.name + '"' + ' data-tabid="' + tabId + '"></div>';
      }
      if (item.date) {
        itemHTML += '<div class="b-input-btn b-input-btn_type_calendar hint"' + ' data-hint="' + App.u.escapeQuote(item.hintBtn) + '"' + ' data-control-field="' + item.name + '"' + ' data-type="' + item.date + '"></div>';
      }
      if (item.unlimit) {
        itemHTML += '<div class="b-input-btn b-input-btn_type_unlimit hint"' + ' data-hint="' + App.u.escapeQuote(item.hintBtn) + '"' + ' data-control-field="' + item.name + '"></div>';
      }
      if (item.change) {
        itemHTML += '<div class="b-input-btn b-input-btn_type_change hint"' + ' data-hint="' + App.u.escapeQuote(item.hintBtn) + '"></div>';
      }
      if (item.zoom) {
        itemHTML += '<div class="b-input-btn b-input-btn_type_zoom hint"' + ' data-hint="' + App.u.escapeQuote(item.hintBtn) + '" ' + 'data-control-field="' + item.name + '"></div>';
        item.inputAttr = item.attr;
        item.inputClasses = classes;
        item.inputName = item.name;
        item.textareaClasses = ' b-textarea_for_zoom';
        itemHTML += templates.formItemInputWithZoom(item);
      } else if (item.type === 'password') {
        item.classes += classes;
        if (item.confirm) {
          item.confirmField = item.confirmField + '-' + tabId;
          item.classes += ' b-form-confirm-field';
        } else if (item.passwd) {
          item.classes += ' b-form-passwd-field';
        }
        itemHTML += templates.formItemPassword(item);
        if (item.passwd) {
          item.pwcheck.id = tabId;
          item.pwcheck.name = item.name;
          itemHTML += templates.passwdCheck(item.pwcheck);
        } else if (item.confirm) {
          itemHTML += templates.confirmCheck(item);
        }
      } else {
        item.classes += classes;
        itemHTML += templates.formItemInput(item);
      }
      //render input@type=file
    } else if (item.type === 'file') {
      item.classes += classes;
      item.setvalue = '';
      item.value = '';
      itemHTML += templates.formItemFile(item);
    } else if (item.type === 'textarea') {
      //render textarea
      item.classes += item.editor;
      item.value = window.htmlEscape(item.value);
      itemHTML += templates.formItemTextarea(item);
      //data for plugin
      if (item.variables) {
        EventMgr.trigger('saveVarsTinyMCE', {
          name: item.name,
          tabId: tabId,
          vars: item.variables
        });
      }
    } else if (item.type === 'desc') {
      //render description
      itemHTML += templates.formItemDesk(item);
    } else if (item.type === 'htmldata') {
      //render htmldata
      itemHTML += templates.formItemHtmldata(item);
    } else if (item.type === 'select') {
      //render select
      //separate image & value for filtred value
      item.msg = window.filterXSS(item.msg);
      item.msg = item.img + item.msg;
      itemHTML += templates.formItemSelect(item);
    } else if (item.type === 'mselect') {
      //render multi select
      itemHTML += templates.formItemMSelect(item);
      if (item.msg_select_all && pageInfo && pageInfo.messages) {
        pageInfo.messages.msg_select_all = item.msg_select_all;
      }
    } else if (item.type === 'aselect') {
      //render select autocomplete
      itemHTML += templates.formItemSelectAutocomplete(item);
    } else if (item.type === 'radio') {
      if (item.hint === '') {
        item.readonly += ' nohint';
      }
      //render radio
      itemHTML += templates.formItemRadio(item);
    } else if (item.type === 'radioimg') {
      //render radio-img
      itemHTML += templates.formItemRadioImg(item);
    } else if (item.type === 'checkbox') {
      if (item.hint === '') {
        item.dependFields += ' nohint';
      }
      if (item.desc === '') {
        item.dependFields += ' nodesc';
      }
      itemHTML += templates.formItemCheckbox(item);
      //render slider
    } else if (item.type === 'slider') {
      //@TODO change with value
      itemHTML += templates.formItemSlider(item);
      //render mgrview
    } else if (item.type === 'mgrview') {
      itemHTML += templates.formItemMgrview({
        tabId: tabId, theme: pageInfo.theme });
      //render textdata
    } else if (item.type === 'textdata') {
      item.value = window.htmlDecode(item.value);
      itemHTML += templates.formItemTextData(item);
      //render tree
    } else if (item.type === 'tree') {
      itemHTML += renderTree(item, tabId);
    } else if (item.type === 'ticket') {
      itemHTML += templates.formItemTicket(item);
    } else if (item.type === 'link') {
      itemHTML += templates.formItemLink(item);
    } else if (item.type === 'frame') {
      itemHTML += templates.formItemFrame(item);
    } else if (item.type === 'datetime') {
      var d = App.u.parseDate(item.value);
      item.difftime = new Date().getTime() - d.getTime();
      item.value = App.u.formatDateTime(d.getTime());
      itemHTML += templates.formItemDateTime(item);
      dateTimeId = setInterval(function (tabId, name) {
        return function () {
          var elem = App.Dom.byId(tabId + '-' + name);
          if (!tabs[tabId] || !elem) {
            clearInterval(dateTimeId);
            return;
          }
          var dt = elem.getAttribute('data-difftime') - 0;
          elem.innerHTML = App.u.formatDateTime(new Date().getTime() - dt);
        };
      }(tabId, item.name), 500);
    } else if (item.type === 'listfilter') {
      itemHTML += templates.formListFilterWrapper({ name: item.name, id: item.id, content: templates.formListFilter(item) });
    } else if (item.type === 'captcha') {
      itemHTML += templates.formItemCaptcha(item);
      EventMgr.trigger('appendCaptcha', { id: tabId + '-' + item.name });
    }
    return itemHTML;
  },

  //render form items
  renderFormItems = function renderFormItems(form, tabId) {
    var length = form.length,
        i,
        pages = '',
        formHtml,
        formItemsLen,
        j,
        formItems,
        formItemLen,
        k,
        formItem,
        formRow,
        classes,
        valuesForm = {},
        sourceForm = {};
    for (i = 0; i < length; i++) {
      formHtml = {
        name: form[i].name,
        title: '',
        content: '',
        classes: '',
        withList: form[i].withList,
        display: form[i].collapsed ? 'none' : 'block',
        collapsed: form[i].collapsed,
        hide: form[i].hide ? form[i].hide : {},
        show: form[i].show ? form[i].show : {},
        tabId: tabId
      };
      if (form[i].title !== '') {
        //render title Page
        formHtml.title = templates.formPageTitle({
          title: form[i].title,
          name: form[i].name,
          id: form[i].name,
          type: 'page',
          collapsed: form[i].collapsed,
          hintCollapse: pageInfo.pageCollapse,
          hintExpand: pageInfo.pageExpand,
          blockType: '',
          theme: pageInfo.theme,
          reload: false });
      }
      if (!form[i].formItems) {
        continue;
      }
      formItemsLen = form[i].formItems.length;

      formItems = form[i].formItems;
      //foreach for fields
      for (j = 0; j < formItemsLen; j++) {
        formItemLen = formItems[j].length;
        formItem = formItems[j];
        //foreach for elems
        for (k = 0; k < formItemLen; k++) {
          if (formItem[k].skip) {
            continue;
          }
          sourceForm[formItem[k].name] = formItem[k];
          //make form model for watching
          valuesForm[formItem[k].name] = {
            'defValue': formItem[k].value,
            'isChanged': false,
            'value': formItem[k].value,
            'label': formItem[k].label || formItem[k].desc || false
          };
          if (formItem[k].type === 'textarea') {
            if (formItem[k].value === '\n') {
              formItem[k].value = '';
              valuesForm[formItem[k].name].value = '';
              valuesForm[formItem[k].name].defValue = '';
            }
          }
          formRow = {};
          formRow.first = '';
          formRow.second = '';
          formRow.third = '';
          formRow.hint = '';
          formRow.classes = '';
          formRow.hide = formItem[k].hide || {};
          formRow.show = formItem[k].show || {};
          formRow.id = formItem[k].name + '-' + form.id;
          formRow.desc = '';
          formRow.error = formItem[k].error ? formItem[k].error : '';
          formRow.colspan = formItem[k].error ? 'colspan="2"' : '';
          formRow.fname = formItem[k].name;
          formRow.label = formItem[k].label;
          formRow.tabId = form.id;
          formRow.devMode = devMode;
          formRow.testMode = form.testMode;
          formItem[k].id = form.id;
          //render label
          if (formItem[k].label) {
            formRow.first += templates.formItemLabel({
              label: formItem[k].label,
              img: formItem[k].l_img || '',
              required: formItem[k].required,
              tabId: form.id,
              func: form.func,
              id: formItem[k].name,
              devMode: devMode });
          } else if (formItem[k].type !== 'textdata') {
            formRow.first += '<div></div>';
          }
          //render hint
          if (formItem[k].hint !== '' && formItem[k].hint) {
            formRow.third += App.u.escapeQuote(formItem[k].hint);
            if (formItem[k].shadowHint) {
              formRow.third += " <span class='hint-shadow'>" + App.u.escapeQuote(formItem[k].shadowHint) + '</span>';
              formRow.hint += ' shadow ';
            }
            formRow.hint += 'field-help_available_yes';
          }
          if (formItem[k].setvalue) {
            var timeout = parseInt(formItem[k].setvalue, 10),
                timeId;
            if (!isNaN(timeout)) {
              /* jslint loopfunc:true*/
              timeId = setInterval(function (tabId, name) {
                return function () {
                  if (!tabs[tabId]) {
                    clearInterval(timeId);
                  }
                  EventMgr.trigger('forceSetValues', {
                    tabId: tabId, name: name
                  });
                };
              }(tabId, formItem[k].name), timeout * 1000);
            }
          } else if (formItem[k].type === 'textarea') {
            if (formItem[k].quote) {
              formRow.classes += ' b-form-row_with_quote ';
            }
            formItem[k].third = formRow.third;
            formItem[k].error = formRow.error;
          }
          //@todo move to template
          if (formItem[k].desc && formItem[k].desc !== '') {
            formRow.desc = formItem[k].desc || '';
            //check for checkbox desc
            if (formItem[k].type === 'checkbox') {
              if (formItem[k].desc !== '') {
                formRow.desc = '';
              }
            }
            formRow.descName = formItem[k].descName || '';
          }
          if (formItem[k].type === 'checkbox' && !formItem[k].desc) {
            formRow.classes += ' row-with-no-desc ';
          }
          formRow.classes += ' l-form__row_type_' + formItem[k].type;
          if (formItem[k].fixed) {
            formRow.classes += ' i-form__row_fixed_yes b-form__row_fixed_yes';
          }
          if (formItem[k].error) {
            formRow.classes += ' row-error';
          }
          //check for hide/show rules
          if (formItem[k].show !== undefined) {
            if (formItem[k].shadow) {
              formRow.classes += ' depended-shadow-s';
            } else {
              formRow.classes += ' depended-hidden-s';
            }
          }
          //render form item
          formRow.second = renderFormItem(formItem[k], tabId, '');
          //render extra field
          if (formItem[k].hasAddition) {
            var nextFormItem = formItem[k + 1];
            if (nextFormItem) {
              if (nextFormItem.type === 'checkbox') {
                if (nextFormItem.desc !== '') {
                  formRow.desc = '';
                }
              } else if (nextFormItem.type === 'text') {
                formRow.id = nextFormItem.name + '-' + form.id;
              }
              nextFormItem.id = form.id;
              formRow.second += renderFormItem(nextFormItem, tabId, '');
              formRow.classes += ' l-form__row_has_addition';
              if (formItem[k].propWidth) {
                formRow.classes += ' l-form__row_propwidth';
              }
              //check for error
              if (nextFormItem.error) {
                formRow.error = nextFormItem.error;
                formRow.classes += ' row-error';
                formRow.colspan = 'colspan="2"';
              }
            }
          }
          //render form row
          //render input@type=hidden row
          if (formItem[k].type === 'hidden') {
            formHtml.content += templates.formItemRowHidden(formRow);
            //render fullwidth row
          } else if (formItem[k].fullwidth) {
            formRow.classes += ' fullwidth-row';
            formHtml.content += templates.formItemFullWidthRow(formRow);
            //render desc row
          } else if (formItem[k].formwidth) {
            formRow.classes += ' formwidth-row';
            formHtml.content += templates.formItemFormWidthRow(formRow);
            //render desc row
          } else if (formItem[k].type === 'desc') {
            formRow.third = '';
            formRow.hint = '';
            formHtml.content += templates.formItemRowDesc(formRow);
            //render row without label
          } else if (formItem[k].type === 'list') {
            formItem[k].id = form.id;
            formItem[k].formflags = form.formflags;
            formItem[k].parent = form.parent;
            formItem[k].testMode = form.testMode;
            //for btn template change type
            formItem[k].type = 'form';
            if (!(formItem[k].rows && formItem[k].rows.length === 1 && formItem[k].view === 'table')) {
              formHtml.content += templates.formListItemRow(formItem[k]);
            }
          } else if (formRow.first === '') {
            formHtml.content += templates.formItemRowWithoutLabel(formRow);
            //render normal row
          } else {
            formHtml.content += templates.formItemRow(formRow);
          }
          if (formItem[k].plainhint) {
            var hLen = formItem[k].plainhint.length;
            //start from 1 because 1st elem empty
            for (var h = 1; h < hLen; h++) {
              formItem[k].plainhint[h].name = formItem[k].name;
              formHtml.content += templates.formPlainHintRow(formItem[k].plainhint[h]);
            }
          }
        }
      }
      formHtml.view = 'form';
      pages += templates.formPageWrapper(formHtml);
    }
    return {
      html: pages,
      model: valuesForm,
      source: sourceForm
    };
  },
      formGetTreeBranch = function formGetTreeBranch(e, data) {
    var setvalues = data.setvalues,
        elem = data.elem,
        name = data.name,
        items = setvalues[name].tlist,
        html = renderTlist(items),
        id = data.id;
    elem.after(html);
    data.img.attr('src', data.src);
    elem.parent().addClass('loaded t-opened').removeClass('collapsed loading');
    EventMgr.trigger('updateScroll', { id: id });
  },

  //render tree
  renderTree = function renderTree(items, tabId) {
    var elems = items.tlist,
        html,
        rows = items.rows * 18,
        id = items.name + '-' + tabId;
    html = renderTlist(elems, items.value);
    return '<div class="tree-wrapper ' + items.setvalue + ' ' + items.multiple + '" id="cont-' + id + '"  style="height:' + rows + 'px;">' + '<div id="' + id + '" class="tree-inner" data-tabid="' + tabId + '">' + html + '<input data-type="tree" type="hidden" name="' + items.name + '" value="' + items.value + '" class="' + items.classes + '"id="' + items.name + '-' + tabId + '-value" data-tabid="' + tabId + '"/></div></div>' + '<div class="b-resizer" data-move-trigger="updateScroll" data-id="cont-' + id + '" data-tabid="' + tabId + '"></div>';
  },

  //render tree list
  renderTlist = function renderTlist(items, value) {
    var len = items.length,
        i,
        html = '',
        child,
        className = '',
        selected;
    html = '<ul>';
    for (i = 0; i < len; i++) {
      child = items[i].child.length > 0;
      className = child ? 't-opened loaded' : items[i].collapsed ? 'collapsed' : '';
      className += len - 1 === i ? ' last ' : '';
      selected = items[i].key === value ? ' selected ' : '';
      html += ' <li class="' + className + ' folder"> <div class="tree-hitarea bline"></div> <div class="tree-handler ' + selected + '"  data-val="' + items[i].key + '" ><div class="bline icon"><img src="' + pageInfo.commonDir + 'img/' + items[i].img + '.png" /></div><div class="tree-label bline">' + items[i].value + '</div></div>';
      if (child) {
        html += renderTlist(items[i].child, value);
      }
      html += '</li>';
    }
    html += '</ul>';
    return html;
  },
      renderInfoList = function renderInfoList(obj) {
    return templates.infoList({ rows: obj.rows, testMode: obj.testMode });
  },


  //render dashboard blocks
  renderDashboard = function renderDashboard(blocks) {
    var bLength = blocks.length,
        top = '',
        left = '',
        right = '',
        dashboard = '',
        contentBlock,
        title,
        param,
        classes,
        display,
        blockId,
        id,
        titleObject,
        contentObject,
        obj;
    storage.dashboard = {};
    for (var i = 0; i < bLength; i++) {
      blocks[i].name = String(blocks[i].name).replace(/\./g, '_');
      id = blocks[i].name;
      blockId = blocks[i].name;

      titleObject = {
        name: blocks[i].name,
        id: id,
        title: blocks[i].title,
        type: 'dashboard-block',
        blockType: blocks[i].type,
        theme: pageInfo.theme,
        collapsed: blocks[i].display === 'min',
        hintCollapse: pageInfo.pageCollapse,
        hintExpand: pageInfo.pageExpand,
        hintReload: blocks[i].hintReload,
        reload: false };
      if (blocks[i].type === 'toolbar') {
        contentBlock = templates.dashTaskbar({
          toolbar: blocks[i].toolbar });
      } else if (blocks[i].type === 'list') {
        /* jslint camelcase:false */
        param = {
          func: blocks[i].func,
          p_num: 1,
          dashboard: blocks[i].name };
        if (blocks[i].rows) {
          param.p_cnt = blocks[i].rows;
        }
        /* jslint camelcase:true */
        $.extend(param, blocks[i].params);
        storage.dashboard[blocks[i].name] = param;
        if (blocks[i].autoupdate) {
          setTimeout(function (block) {
            return function () {
              EventMgr.trigger('refreshDashBlock', { block: block });
            };
          }(blocks[i]), blocks[i].autoupdate * 1000);
        }
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param,
          invar: { blockId: 'block-' + blocks[i].name },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponseForDashboard',
          failfunc: 'failedAjaxResponseForDashboard',
          queue: 'noqueue' });
        contentBlock = '<div id="block-' + blockId + '" class="block-table" data-block-name="' + blocks[i].name + '" data-block-cnt="' + blocks[i].rows + '" data-block-pnum="1' + '" data-block-func="' + blocks[i].func + '">' + '<div class="dashboard-nodata">' + pageInfo.loading + '</div></div>';
        titleObject.reload = true;
      } else if (blocks[i].type === 'report') {
        param = { func: blocks[i].func, dashboard: blocks[i].name };
        $.extend(param, blocks[i].params);
        storage.dashboard[blocks[i].name] = param;
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param,
          invar: { blockId: 'block-' + blocks[i].name },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponseForDashboard',
          failfunc: 'failedAjaxResponseForDashboard',
          queue: 'noqueue' });
        contentBlock = '<div id="block-' + blockId + '" class="block-table" data-block-name="' + blocks[i].name + '" data-block-func="' + blocks[i].func + '" data-block-param="' + App.Common.serializeForAttr(blocks[i].params) + '"><div class="dashboard-nodata">' + pageInfo.loading + '</div></div>';
        titleObject.reload = true;
      } else if (blocks[i].type === 'url') {
        var ifId = 'f-' + blocks[i].name;
        contentBlock = '<div><iframe id="' + ifId + '" width="100%" src="' + blocks[i].url + '"></iframe></div>';
      } else if (blocks[i].type === 'infolist') {
        param = { func: blocks[i].func, dashboard: blocks[i].name };
        storage.dashboard[blocks[i].name] = param;
        if (blocks[i].autoupdate) {
          setTimeout(function (block) {
            return function () {
              EventMgr.trigger('refreshDashBlock', { block: block });
            };
          }(blocks[i]), blocks[i].autoupdate * 1000);
        }
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param,
          invar: { blockId: 'block-' + blocks[i].name },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponseForDashboard',
          failfunc: 'failedAjaxResponseForDashboard',
          queue: 'noqueue' });
        titleObject.reload = true;
        contentBlock = '<div class="" id="block-' + blockId + '" data-block-name="' + blocks[i].name + '"></div>';
      } else if (blocks[i].type === 'isplicense' || blocks[i].type === 'ispupdate') {
        param = { func: blocks[i].func, dashboard: blocks[i].name };
        storage.dashboard[blocks[i].name] = param;
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param,
          invar: { blockId: 'block-' + blocks[i].name },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponseForDashboard',
          failfunc: 'failedAjaxResponseForDashboard',
          queue: 'noqueue' });
        titleObject.reload = true;
        contentBlock = '<div class="" id="block-' + blockId + '" data-block-name="' + blocks[i].name + '"><div class="dashboard-nodata">' + pageInfo.loading + '</div></div>';
      } else {
        EventMgr.trigger('pullMsg', { msg: 'Dashboard type "' + blocks[i].type + '" do not support.' });
        return;
      }
      //check for update
      if (blocks[i].update) {
        EventMgr.trigger('addBlockToUpdate', blocks[i]);
      }
      title = templates.formPageTitle(titleObject);

      classes = blocks[i].display === 'min' ? ' b-form-page_st_collapsed ' : '';
      display = blocks[i].display === 'min' ? 'none' : 'block';

      contentObject = {
        view: 'dblock',
        title: title,
        content: contentBlock,
        classes: classes,
        display: display,
        tabId: blocks[i].name,
        hide: [],
        show: [] };

      if (blocks[i].position === 'top' || blocks[i].position === 'undefined') {
        top += templates.formPageWrapper(contentObject);
      } else if (blocks[i].position === 'left') {
        left += templates.formPageWrapper(contentObject);
      } else if (blocks[i].position === 'right') {
        right += templates.formPageWrapper(contentObject);
      }
      contentBlock = '';
      title = '';
      classes = '';
      display = '';
    }

    obj = {
      top: top,
      left: left,
      right: right,
      id: 'tab0'
    };
    return obj;
  },
      renderDashboardTable = function renderDashboardTable(e, data) {
    var resp = data,
        startTime = resp.startTime || 0,
        extraTime,
        blockId = resp.blockId.replace(/\./g, '_'),
        block,
        bandHTML,
        table,
        pagerList,
        blockHTML,
        bName,
        bCnt,
        bFunc,
        bPnum,
        tblock;
    resp.tabId = blockId;
    block = App.Dom.byId(blockId);
    //remove loading class
    tblock = App.Dom.byId('t' + blockId);
    //calc time end of animation
    extraTime = 1000 - (new Date().getTime() - startTime) % 1000;
    setTimeout(function () {
      if (tblock) {
        tblock.className = tblock.className.replace(/loading/g, '');
      }
    }, extraTime);
    if (block === null) {
      return;
    }
    if (resp.type === 'report') {
      bandHTML = renderBandDash(resp.bands, blockId);
      block.innerHTML = bandHTML;
      setTimeout(function () {
        EventMgr.trigger('loadGCharts', { bands: resp, tabId: blockId });
      }, 10);
    } else if (resp.type === 'infolist') {
      blockHTML = renderInfoList({ rows: resp.rows, testMode: resp.testMode });
      block.innerHTML = blockHTML;
    } else if (resp.type === 'isplicense') {
      blockHTML = renderLicenseBlock(resp.isplicense_data);
      block.innerHTML = blockHTML;
    } else if (resp.type === 'ispupdate') {
      blockHTML = renderUpdateBlock(resp.ispupdate_data);
      block.innerHTML = blockHTML;
    } else {
      table = '';
      pagerList = '';
      if (resp.error) {
        table = resp.ermsg;
      } else {
        table = renderTable(resp);
        if (resp.pager.pager === 'true') {
          pagerList = buildPagerList(resp.pager.pageCount, resp.pager.pageNum);
        }
      }

      blockHTML = '<div id="' + blockId + '-scrollwrapper">' + table + '</div><div class="pager_list pager-list_type_dashboard">' + pagerList + '</div>';
      bName = block.getAttribute('data-block-name');
      bCnt = block.getAttribute('data-block-cnt');
      bFunc = block.getAttribute('data-block-func');
      bPnum = block.getAttribute('data-block-pnum');

      block = App.Common.replaceHtml(block, blockHTML);
      block.setAttribute('data-block-pnum', resp.pager ? resp.pager.pageNum : 1);
      block.setAttribute('data-block-name', bName);
      block.setAttribute('data-block-cnt', bCnt);
      block.setAttribute('data-block-func', bFunc);
      block.setAttribute('data-block-pnum', bPnum);
      if (!resp.error) {
        EventMgr.trigger('appendDashList', { tabId: blockId });
      }
    }
    setTimeout(function () {
      EventMgr.trigger('updateScroll', { id: 'cont-tab0' });
    }, 300);
    setTimeout(function () {
      EventMgr.trigger('updateScroll', { id: 'cont-tab0' });
    }, 7000);
    block = null;
  },

  //render bands for
  renderBandDash = function renderBandDash(bands, id) {
    var bandLen = bands.length - 1,
        output = '',
        i,
        gid,
        title,
        titleClass,
        fullwidth;
    if (bandLen > 0) {
      for (i = 0; i < bandLen; i++) {
        gid = id + '-' + i + bands[i].id + '0';
        title = '';
        titleClass = '';
        fullwidth = bands[i].fullwidth ? 'fullwidth-band' : '';
        if (bands[i].bigTitle !== '') {
          title = bands[i].bigTitle || '';
          titleClass = 'big-title';
        } else if (bands[i].smallTitle !== '') {
          title = bands[i].smallTitle || '';
          titleClass = 'small-title';
        }
        output += templates.reportBandDash({
          empty: bands[i].empty,
          emptymsg: pageInfo.emptyreport,
          title: title,
          titleClass: titleClass,
          id: id,
          gid: gid,
          fullwidth: fullwidth });
      }
    } else {
      output = '<div class="dashboard-nodata">' + pageInfo.nodata + '</div>';
    }
    return output;
  },

  // render license block on dashboard
  renderLicenseBlock = function renderLicenseBlock(data) {
    return templates.licenseDashBlock(data);
  },

  // render update to isp6 block on dashboard
  renderUpdateBlock = function renderUpdateBlock(data) {
    return templates.updateToIsp6(data);
  },

  //render tables in reports
  renderBands = function renderBands(reports, tabId) {
    //if no data return fake chart
    if (reports.emptyBand) {
      if (reports.hasDiagram) {
        return templates.emptyBandOverlay({
          emptymsg: pageInfo.emptyreport, tabId: tabId });
      } else {
        return '<div class="report-nodata">' + pageInfo.nodata + '</div>';
      }
    }
    var bandsContent = '',
        bands = reports.bands,
        len = bands.length - 1,
        id = null,
        fullwidth,
        i;
    //go for bands
    for (i = 0; i < len; i++) {
      id = tabId + '-' + i;
      if (bands[i].content.length === 0) {
        if (bands[i - 1] && bands[i - 1].title) {
          bandsContent += '<div class="b-report-nodata">' + pageInfo.nodata + '</div>';
        }
        continue;
      }

      //check for band like title
      if (bands[i].title !== undefined) {
        fullwidth = bands[i].fullwidth ? 'fullwidth-band' : '';
        bandsContent += '<div class="band-content b-title ' + fullwidth + '"><div class="band-title big-title">' + bands[i].title + '</div></div>';
      } else {
        $.extend(bands[i], {
          elKey: bands[i].headers[0].name,
          pager: { pageElems: 0 },
          tabId: id, oTabId: tabId });
        bands[i].func = reports.func;
        var table = '<div>' + renderTable(bands[i]),
            gid = id + bands[i].id,
            aid = tabId + '-' + bands[i].id,
            title = '',
            titleClass = '',
            hidden = bands[i].hidden ? 'data-table-hidden' : '',
            showMsg = bands[i].showMsg,
            hideMsg = bands[i].hideMsg,
            hiddenClass = bands[i].hidden ? 'hidden' : '',
            diagrmCount = bands[i].diagram.length;
        fullwidth = bands[i].fullwidth ? 'fullwidth-band' : '';
        if (diagrmCount === 0) {
          fullwidth += ' nodiagram';
        }
        if (bands[i].smallTitle !== '') {
          title = bands[i].smallTitle;
          titleClass = 'small-title';
        }
        bandsContent += templates.reportBand({
          title: title || '',
          titleClass: titleClass,
          table: table,
          id: id,
          aid: aid,
          gid: gid,
          fullwidth: fullwidth,
          hidden: hidden,
          showMsg: showMsg,
          hideMsg: hideMsg,
          hiddenClass: hiddenClass,
          dc: diagrmCount });
        bandsContent += createTableRow(bands[i].headers, id);
      } // EventMgr.trigger('loadChart', {diagram :
      // bands[i].diagram, gid : gid});
    }
    return bandsContent;
  },

  //render table with one row for sum in table reports
  createTableRow = function createTableRow(headers, id) {
    var table = '<table id="table_sum-' + id + '"><tr>';
    for (var i = 0; i < headers; i++) {
      table += '<td>' + '<span class="data-sum" id="' + headers[i].name + '"></span>' + '</td>';
    }
    table += '</tr></table>';
    return table;
  },

  //data for reload page
  reloadTabData = function reloadTabData(e, data) {
    var tabId = data.tabId,
        resetFilterOn = data.resetFilterOn,
        url = pageInfo.url,
        iType = data.softUpdate ? 'softUpdate' : 'hardUpdate',
        filter = data.filter || false,
        param,
        scrollTop = 0,

    //stay help chain
    help = data.help,
        selid = data.selid || true;
    if (data.reload) {
      if (!checkReload(data)) {
        return;
      }
    }
    if (tabs[tabId] === undefined) {
      return;
    }
    var defParams = tabs[tabId].paramObjAll,
        parent = tabs[tabId].parent,
        newUrl = data.newurl ? true : false;
    if (data.param) {
      param = data.param;
      //check for pager
      /* jslint camelcase:false */
      if (param.p_num !== defParams.p_num) {
        selid = false;
      }
      /* jslint camelcase:true */
      /* jslint camelcase:false */
      if (param.p_num) {
        delete defParams.p_num;
      }
      /* jslint camelcase:true */
    } else {
      param = data.addedParam || {};
      if (tabs[tabId].param.match('p_num')) {
        param = App.Common.parseParams(tabs[tabId].param);
      }
    }
    defParams = $.extend(defParams, param);

    if (newUrl) {
      url = pageInfo.url;
    }
    //if has selected elems remember it
    if (selid) {
      scrollTop = getScrollTop(tabId);
      if (selid === true) {
        selid = getSelectedElems(tabId);
      }
    }
    //save filter value
    if (filter) {
      var filterBox = App.Dom.byId(tabId + '-search');
      if (filterBox) {
        filter = filterBox.value;
      } else {
        filter = false;
      }
    }

    //reset filter on when update from menu
    if (resetFilterOn) {
      delete defParams.filter;
    }

    //if request from filter drop, remove filter=on param from list
    if (data.__src === 'filterset' || data.__src === 'buildTabOk') {
      delete defParams.filter;
    }
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: defParams,
      invar: {
        dataSaved: true,
        parent: parent,
        targetTabId: tabId,
        selid: selid,
        scrollTop: scrollTop,
        iType: iType,
        __src: 'reloadTab',
        help: help ? tabs[tabId].help : false,
        liveFilter: filter },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponse',
      queue: 'reloadTab' + tabId,
      failfunc: 'failCommonAjaxResponse' });
    if (iType !== 'softUpdate') {
      EventMgr.trigger('tabLoading', { tabId: tabId });
    }
  },


  //handler for submit form
  formHandler = function formHandler(e, data) {
    var tabId = data.tabId,
        selid = data.elid ? [data.elid] : true,
        parent = '',
        granny = '';
    //check for modal
    if (!tabs[tabId] && tabId === 'modal1') {
      EventMgr.trigger('formInspectorResponse', data);
    }
    //progressok for wizard form
    if (data.ok || data.progressok) {
      //check for notifyUp
      if (data.notifyUp) {
        EventMgr.trigger('forceCheckNotify');
      }
      //check for late update
      if (data.progresstype === 'wait') {
        EventMgr.trigger('progressBarSaveState', data);
        return false;
      }
      //check for banners
      if (data.message && data.message.length) {
        App.Global.bannerHtml = data.message;
        App.Global.warning = data.warning;
        App.Global.targetId = '';
      }
      if (tabs[tabId] && tabs[tabId].parent) {
        parent = tabs[tabId].parent;
      }

      if (!checkReload(data) || !checkNewWin(data) || !checkFeatures(data) || !checkDasboard(data)) {
        closeTab(e, tabId);
        return false;
      }

      if (!checkNewForm(data) || !checkNewList(data)) {
        //            closeTab(e, tabId);
        return false;
      }
      App.Common.checkRefreshMenu(data);

      if (data.bootTime) {
        EventMgr.trigger('startCheckRestart', { bootTime: data.bootTime });
      }
      //if has parent close self and reload parent
      if (tabs[tabId] && tabs[tabId].parent) {
        parent = tabs[tabId].parent;
        granny = tabs[tabs[tabId].parent].parent;
        closeTab(e, tabId);
        EventMgr.trigger('reloadTab', { tabId: parent, selid: selid, filter: true });
        EventMgr.trigger('tabLoading', { parent: granny });
      } else {
        closeTab(e, tabId);
      }
    } else if (data.error && !data.form) {
      showErrorOnForm(data);
    } else {
      EventMgr.trigger('ajaxResponse', data);
    }
  },
      showErrorOnForm = function showErrorOnForm(data) {
    if (data.error && data.targetTabId) {
      var ermsg = templates.banner({ message: {
          status: 'error',
          classes: '',
          id: data.targetTabId,
          text: App.Common.wordWrap(data.ermsg, 100),
          ref: false,
          refText: pageInfo.moreinfo,
          dismiss: data.msg.dismiss
        } });
      $('#cont-' + data.targetTabId).find('.error-message').html(ermsg);
      EventMgr.trigger('tabLoadingHide', { tabId: data.targetTabId });
      resetToDefaultFormButton(data.targetTabId);
      EventMgr.trigger('updateScroll', { id: 'form-scroll-' + data.targetTabId });
    }
  },


  //BuildPager
  buildPager = function buildPager(pager, tabId) {
    var slist = templates.formItemSelect({
      name: 'pager-slist',
      slist: pager.pageSlist,
      value: pager.pageNum,
      msg: pager.pageSlist[pager.pageNum - 1].value,
      depend: pager.depend,
      dependMaster: pager.dependMaster,
      dependFields: '',
      hide: '',
      show: '',
      readonly: '',
      setvalue: '',
      id: tabId,
      attrInput: '' }),
        pagerList = buildPagerList(pager.pageCount, pager.pageNum),
        pageCnt = pager.pageCnt,
        msgBegan = pager.msgPagershow,
        msgEnd = pager.msgPagerline,
        pagerHTML = templates.listPager({
      slist: slist,
      cnt: pageCnt,
      pagerList: pagerList,
      msgBegan: msgBegan,
      msgEnd: msgEnd });
    return pagerHTML;
  },

  //build list pager
  buildPagerList = function buildPagerList(pages, current) {
    var html = '',
        maxLen = 9,
        active = '',

    // length environment
    rl = Math.round((maxLen - 5) / 2);
    if (!current) {
      current = 1;
    }
    current = parseInt(current, 10);

    var standartPager = function standartPager(pages, current) {
      var html = '';
      for (var i = 1; i <= pages; i++) {
        if (i === current - 0) {
          active = 'pager-list__item_active';
        } else {
          active = 'pager-list__item_act';
        }
        html += '<span class="page pager-list__item ' + active + '" data-n="' + i + '">' + i + '</span>';
      }
      return html;
    },
        firstPageActive = function firstPageActive(maxLen, pages, current) {
      var html = '',
          prevLast = maxLen - 1;
      for (var i = 1; i <= maxLen; i++) {
        if (i === current - 0) {
          active = 'pager-list__item_active';
        } else {
          active = 'pager-list__item_act';
        }
        if (i === prevLast) {
          html += '<span class="page ellipsis">...</span>';
        } else if (i === maxLen) {
          html += '<span class="page pager-list__item ' + active + '" data-n="' + pages + '">' + pages + '</span>';
        } else {
          html += '<span class="page pager-list__item ' + active + '" data-n="' + i + '">' + i + '</span>';
        }
      }
      return html;
    },
        lastPageActive = function lastPageActive(maxLen, pages, current) {
      var html = '',
          first = pages - maxLen;
      for (var i = 1; i <= maxLen; i++) {
        if (i + first === current - 0) {
          active = 'pager-list__item_active';
        } else {
          active = 'pager-list__item_act';
        }
        if (i === 2) {
          html += '<span class="page ellipsis"> ... </span>';
        } else if (i === 1) {
          html += '<span class="page pager-list__item ' + active + '" data-n="1">1</span>';
        } else {
          html += '<span class="page pager-list__item ' + active + '" data-n="' + (i + first) + '">' + (i + first) + '</span>';
        }
      }
      return html;
    },
        middlePageActive = function middlePageActive(maxLen, pages, current, rl) {
      var html = '',
          first = current - rl - 3,
          prevLast = maxLen - 1;
      for (var i = 1; i <= maxLen; i++) {
        if (i + first === current) {
          active = 'pager-list__item_active';
        } else {
          active = '';
        }
        if (i === 1) {
          html += '<span class="page pager-list__item pager-list__item_act' + active + '" data-n="1">1</span>';
        } else if (i === 2 || i === prevLast) {
          html += '<span class="page ellipsis">...</span>';
        } else if (i === maxLen) {
          html += '<span class="page pager-list__item pager-list__item_act ' + active + '"  data-n="' + pages + '">' + pages + '</span>';
        } else {
          html += '<span class="page pager-list__item pager-list__item_act ' + active + '" data-n="' + (i + first) + '">' + (i + first) + '</span>';
        }
      }
      return html;
    };

    if (pages <= maxLen) {
      // console.log("case: standart");
      html = standartPager(pages, current);
    } else if (pages >= maxLen && current - rl <= 1) {
      // console.log("case: first");
      html = firstPageActive(maxLen, pages, current);
    } else if (pages >= maxLen && current + rl >= pages) {
      // console.log("case: last");
      html = lastPageActive(maxLen, pages, current);
    } else if (pages >= maxLen && (current - rl >= 1 || current + rl <= pages)) {
      // console.log("case: middle");
      html = middlePageActive(maxLen, pages, current, rl);
    }

    return html;
  },
      addChartToTab = function addChartToTab(e, data) {
    var tabId = data.tabId,
        chart = data.chart;
    if (tabs[tabId] !== undefined) {
      tabs[tabId].chart = tabs[tabId].chart || [];
      tabs[tabId].chart.push(chart);
    }
  },
      getActiveHint = function getActiveHint(e, data) {
    var tabId = data.tabId,
        elid = data.elid,
        pName = data.pName,
        value = data.value,
        url = pageInfo.url,
        self = data.self,
        params;
    if (tabs[tabId] === undefined) {
      return;
    }
    params = App.Common.clone(tabs[tabId].paramObjAll);
    /* jslint camelcase:false */
    params.hint_field = pName;
    /* jslint camelcase:true */
    params.plid = params.elid;
    params.elid = elid;
    if (value) {
      params.value = value;
    }

    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: params,
      invar: {
        hintTabId: tabId,
        hintElid: elid,
        hintValue: value,
        hintPName: pName,
        self: self },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponseHint',
      queue: 'actHint' + tabId,
      failfunc: 'failCommonAjaxResponse' });
  },

  //hook for change field callbacks
  formFieldChangeHandler = function formFieldChangeHandler(e) {
    var tabId = this.getAttribute('data-tabid');
    //check for input contains in tab
    if (tabs[tabId]) {
      EventMgr.trigger('formFieldChanged', {
        tabObj: tabs[tabId],
        tabId: tabId,
        field: this });
    }
  },


  //  add formModel to data for setvalues
  addModelToSetvalues = function addModelToSetvalues(data) {
    var tabId = data.tabId;
    if (tabs[tabId]) {
      data.__formModel = tabs[tabId].formModel;
    }
  },
      addListModel = function addListModel(data) {
    if (data.tabId) {
      var tabId = data.tabId.replace('cont-', '');
      if (tabs[tabId] && tabs[tabId].__content && tabs[tabId].__headers) {
        data.__content = tabs[tabId].__content;
        data.__headers = tabs[tabId].__headers;
      }
    }
  },
      updateModelBySetvalues = function updateModelBySetvalues(e, data) {
    var tabId = data.tabId;
    if (tabs[tabId]) {
      tabs[tabId].formModel[data.name] = data.value;
    }
  },
      addTabsModel = function addTabsModel(data) {
    if (data) {
      data.__tabs = tabs;
    }
  },

  //check form changed
  checkFormChange = function checkFormChange(tabId) {
    if (tabs[tabId] && tabs[tabId].formModel) {
      var formModel = tabs[tabId].formModel,
          count = 0,
          labels = '',
          isChanged = false;
      for (var keyVar in formModel) {
        if (formModel[keyVar].isChanged && formModel[keyVar].label) {
          count++;
          labels += formModel[keyVar].label + '<br/>';
          isChanged = true;
        }
      }
      return {
        isChanged: isChanged,
        count: count,
        labels: labels
      };
    } else {
      return {
        isChanged: false,
        count: 0
      };
    }
  },

  //save form page collapsed state to server
  saveFormPageState = function saveFormPageState(e, data) {
    var tabId = data.tabId;
    if (tabs[tabId]) {
      var param = {
        page: data.name,
        action: tabs[tabId].func,
        func: 'collapse',
        collapse: data.collapsed ? 'off' : 'on'
      };
      EventMgr.trigger('ajaxRequest', {
        param: param,
        trfunc: 'DoNothing',
        queue: 'noqueue'
      });
    }
  },
      favoriteToggle = function favoriteToggle(e) {
    e.preventDefault();
    var $self = $(this),
        tabId = $self.closest('.tab-content').attr('data-tabid'),
        favorite,
        options = {
      param: {},
      trfunc: 'favoriteMenuUpdateDone',
      outtype: 'json'
    };
    if (tabs[tabId]) {
      favorite = tabs[tabId].favorite;
      if (favorite) {
        options.param.func = 'usermenu.suspend';
        $self.addClass('b-elem_style_gracescale');
        $self.attr('data-state', 'unfavorite');
      } else {
        options.param.func = 'usermenu.resume';
        $self.removeClass('b-elem_style_gracescale');
        $self.attr('data-state', 'favorite');
      }
      options.param.elid = tabs[tabId].func;
      EventMgr.trigger('ajaxRequest', options);
      tabs[tabId].favorite = !favorite;
    }
  },
      pinToggle = function pinToggle(e) {
    e.preventDefault();
    var $self = $(this),
        tabId = $self.closest('.tab-content').attr('data-tabid'),
        pin,
        $tabLi = $('#switch-' + tabId),
        options = {
      param: {},
      trfunc: 'pinTabDone',
      outtype: 'json'
    };
    if (tabs[tabId]) {
      pin = tabs[tabId].pin;
      if (pin) {
        options.param.func = 'usermenu.unpin';
        //options.param.func = 'usermenu.unpin';
        $self.addClass('b-elem_style_gracescale');
        $self.attr('data-state', 'unpin');
        $tabLi.removeClass('subtab_is_pin');
      } else {
        options.param.func = 'usermenu.pin';
        //options.param.func = 'usermenu.pin';
        $self.removeClass('b-elem_style_gracescale');
        $self.attr('data-state', 'pin');
        $tabLi.addClass('subtab_is_pin');
      }
      options.param.elid = tabs[tabId].func;
      EventMgr.trigger('ajaxRequest', options);
      tabs[tabId].pin = !pin;
      //update localstorage tabs
      EventMgr.trigger('changedTabs', { tabs: tabs });
    }
  },
      changeTabSortIndex = function changeTabSortIndex(e, data) {
    if (data.s && data.t && tabs[data.s] && tabs[data.t]) {
      var sIndex = tabs[data.s].sIndex;
      tabs[data.s].sIndex = tabs[data.t].sIndex;
      tabs[data.t].sIndex = sIndex;
      EventMgr.trigger('changedTabs', { tabs: tabs });
    }
  },

  /**
   * close form & child list/report by ESC key
   * e {object} event object
   * data {object|undefined} event object data
   */
  esckeyHandler = function esckeyHandler(e, data) {
    var $actTab = $('.tab-content_st_active'),
        type = $actTab.attr('data-tab-type'),
        tabId = $actTab.attr('data-tabid');
    if (type === 'list' || type === 'report') {
      $actTab.find('.toolbar-button__item-img.back').trigger('click');
    } else if (type === 'form') {
      $('#switch-' + tabId).find('.i-tab-close').trigger('click');
    }
  };

  return {
    init: init,
    //for dev
    tabs: tabs,
    closeTab: closeTab,
    moneyFormat: moneyFormat
  };
}(window, $, EventMgr, App, templates);
//# sourceMappingURL=App.Tabs.js.map

'use strict';

/**
 * Form validators module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.Validators = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.on('#main-wrapper', 'input[type="text"].test', 'change', validate);
    EventMgr.on('#main-wrapper', 'input[type="text"].testzoom', 'change', multiValidate);
    EventMgr.bind('errMsgValid', setErrorMessage);
    EventMgr.bind('okMsgValid', setOkMessage);
  },
      pageInfo = window.pageInfo,
      $activeTab = function $activeTab() {
    return $('.tab-content_st_active');
  },

  //Callback for changed input value
  validate = function validate(e, data) {
    var nameValid = this.getAttribute('data-check'),
        paramValid = this.getAttribute('data-check-args'),
        errMsg = this.getAttribute('data-error-msg'),
        fieldName = this.getAttribute('data-fieldname'),
        funcName = this.getAttribute('data-funcname'),
        prefix = $(this).siblings('.b-input__prefix').html(),
        convert = this.getAttribute('data-convert');
    if (this.value === '') {
      EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
      return;
    }
    //trigger checkvalue
    EventMgr.trigger('checkValue', {
      name: nameValid,
      prefix: prefix,
      param: paramValid,
      err: errMsg,
      fieldname: fieldName,
      number: 0,
      funcname: funcName,
      convert: convert,
      self: this,
      value: this.value });
  },

  //function for checking duplicate
  checkDuplicate = function checkDuplicate(values) {
    var i, j, n;
    n = values.length;
    // to ensure the fewest possible comparisons
    // outer loop uses each item i at 0 through n
    for (i = 0; i < n; i++) {
      // inner loop only compares items j at i+1 to n
      for (j = i + 1; j < n; j++) {
        if (values[i] === values[j]) {
          return true;
        }
      }
    }
    return false;
  },
      multiValidate = function multiValidate(e, data) {
    if (this.value === '') {
      EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
      return;
    }
    var number = 0,
        value = this.value,
        values = this.value.split(/\s+/),
        len = values.length;
    if (data) {
      number = data.number;
      var nextNumber = number + 1;
      if (len === nextNumber) {
        number = 0;
      } else {
        number = nextNumber;
      }
      value = values[nextNumber - 1];
    } else {
      if (len === 1) {
        number = 0;
      } else {
        if (this.getAttribute('duplicate') !== 'yes') {
          if (checkDuplicate(values)) {
            EventMgr.trigger('errMsgValid', {
              type: 'duplicate',
              self: this,
              err: pageInfo.duplicate,
              number: 0 });
            return;
          }
        }
        number = 1;
      }
      value = this.value.split(/\s+/)[0];
    }
    var nameValid = this.getAttribute('data-check'),
        paramValid = this.getAttribute('data-check-args'),
        errMsg = this.getAttribute('data-error-msg'),
        fieldName = this.getAttribute('data-fieldname'),
        funcName = this.getAttribute('data-funcname'),
        convert = this.getAttribute('data-convert');
    EventMgr.trigger('checkValue', {
      name: nameValid,
      param: paramValid,
      err: errMsg,
      multi: true,
      fieldname: fieldName,
      funcname: funcName,
      self: this,
      number: number,
      value: value,
      convert: convert });
  },
      replaceValidValue = function replaceValidValue(where, what, than) {
    var arr = String(where).split(/\s+|\n/),
        l = arr.length,
        obj = {
      v: '',
      changed: false
    };
    while (l--) {
      if (String(arr[l]) === String(what)) {
        if (String(what) !== String(than)) {
          obj.changed = true;
        }
        arr[l] = than;
        break;
      }
    }
    obj.v = arr.join(' ');
    return obj;
  },
      setOkMessage = function setOkMessage(e, data) {
    var self = data.self,
        number = data.number,
        value = data.value,
        ovalue = data.ovalue,
        vvalue = data.vvalue,
        multi = data.multi,
        notOk = data.notOk,
        tabId,
        secondTdElem,
        sData = data,
        o;
    data = {};
    data.number = number;
    //for multi value
    if (number - 0 !== 0) {
      o = replaceValidValue(self.value, vvalue, value);
      self.value = o.v;
      if (o.changed) {
        setWarningError(e, sData);
      }
      multiValidate.apply(self, [null, data]);
    } else {
      secondTdElem = $(self).parents('.l-form__col_cont_control');
      if (secondTdElem.attr('colspan') - 0 === 2 && !secondTdElem.hasClass('formwidth')) {
        secondTdElem.attr('colspan', '');
      }
      if (value === '' && self.getAttribute('required') || notOk) {
        secondTdElem.parents('.l-form__row').removeClass('row-error').removeClass('row-ok');
      } else {
        secondTdElem.parents('.l-form__row').removeClass('row-error').addClass('row-ok');
      }
      //replace value if this changed
      if (value !== undefined && ovalue !== undefined && vvalue !== undefined) {
        o = {};
        if (multi) {
          o = replaceValidValue(self.value, vvalue, value);
          self.value = o.v;
          if (o.changed) {
            setWarningError(e, sData);
          }
        } else if (value !== '') {
          if (self.value !== value || o.changed) {
            setWarningError(e, sData);
          }
          self.value = value;
        }
      }
    }
    tabId = $(self).closest('.tab-content').attr('data-tabid');
    EventMgr.trigger('syncInputToZoom', { tabId: tabId, self: self });
    EventMgr.trigger('updFormHeight', { tabId: tabId });
  },
      setWarningError = function setWarningError(e, data) {
    data.warning = true;
    data.err = pageInfo.messages.validChangeVal;
    setErrorMessage.apply(window, [e, data]);
  },


  // Write error
  setErrorMessage = function setErrorMessage(e, data) {
    var msg = data.err,
        self = data.self,
        name = self.getAttribute('name'),
        id = self.getAttribute('id'),
        number = data.number,
        arrValues = self.value ? self.value.split(' ') : [],
        tmp = '',
        warning = data.warning,
        i,
        index,
        tabId,
        r,
        secondTdElem;
    //show error box if created
    if (number - 0 === 0) {
      number = arrValues.length;
    }
    for (i = 0; i < number - 1; i++) {
      tmp += arrValues[i] + ' ';
    }
    index = tmp.length;

    var errHTML = '<div class="b-error-box"><div class="b-error-box__top-triangle"></div>' + '<div class="b-error-box__inner">' + msg + '</div></div>';
    $('.b-error-box__wrapper[data-id="' + id + '"]').html(errHTML);
    secondTdElem = $(self).parents('.l-form__col_cont_control');
    if (!secondTdElem.attr('colspan') && !warning) {
      secondTdElem.attr('colspan', '2');
    }
    if (!warning) {
      secondTdElem.parents('.l-form__row').addClass('row-error').removeClass('row-ok');
    } else {
      secondTdElem.parents('.l-form__row').addClass('row-warning');
      setTimeout(function () {
        secondTdElem.parents('.l-form__row').removeClass('row-warning');
      }, 2000);
    }
    tabId = $(self).closest('.tab-content').attr('data-tabid');
    EventMgr.trigger('updFormHeight', { tabId: tabId });
    EventMgr.trigger('updateFixedField', { tabId: tabId });
    if (!warning) {
      //scroll to field
      var $self = $(self),
          offsetTop = $self.closest('.l-form__row')[0] ? $self.closest('.l-form__row')[0].offsetTop : 0,
          $page = $self.closest('.b-form-page'),
          $formSW = $('#form-scroll-' + tabId),
          MAGICNUMBER = 62 + 12 + 2 + 2; //button block height + padding + margin
      if ($page.hasClass('b-form-page_st_collapsed')) {
        $page.find('.i-form-page__title').trigger('click');
      }
      //it can be extform
      if ($formSW.length) {
        var height = parseFloat($formSW[0].style.height),
            scrollTop = $formSW[0].scrollTop;
        if ($page[0]) {
          offsetTop += $page[0].offsetTop;
        }
        //offsetTop -= MAGICNUMBER;
        offsetTop += MAGICNUMBER;
        //scrolltop when not in viewport
        if (offsetTop < scrollTop || height + scrollTop < offsetTop) {
          EventMgr.trigger('scrollTo', {
            id: 'form-scroll-' + tabId,
            offsetTop: offsetTop,
            animate: false,
            raw: false
          });
        }
      }
      //setfocus and cursor
      //check for type=file
      if (String(self.getAttribute('type')).toLowerCase() !== 'file') {
        if (self.offsetWidth !== 0) {
          self.focus();
          window.scrollTo(0, 0);
          if (self.setSelectionRange) {
            self.setSelectionRange(index, index);
          } else if (self.createTextRange) {
            r = self.createTextRange();
            r.collapse(true);
            r.select(index, index);
          }
        } else if (self.nextSibling) {
          //for passwd I think
          self.nextSibling.focus();
          window.scrollTo(0, 0);
          if (self.setSelectionRange) {
            self.nextSibling.setSelectionRange(index, index);
          } else {
            r = self.nextSibling.createTextRange();
            r.collapse(true);
            r.select(index, index);
          }
        }
      }
    }
  };
  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Validators.js.map

'use strict';

/**
 * Wizard Module
 * Control wizard steps
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 */
/*global App:true*/
App.Wizards = function (window, $, EventMgr) {
  'use strict';

  /**
   * Event in appendForm for check wizard steps
   * @param {object} e
   * @param {object} data
   */

  function wizardLoad(e, data) {
    var tabId = data.tabId;
    setTimeout(function () {
      EventMgr.trigger('bindHorizScrollControl', {
        leftBtn: '#cont-' + tabId + ' .i-wizard__triangle_dir_left',
        rightBtn: '#cont-' + tabId + ' .i-wizard__triangle_dir_right',
        actElem: '#cont-' + tabId + ' .i-wizard__step-num_st_active',
        innerBox: '#cont-' + tabId + ' .i-wizard__inner',
        id: tabId
      });
    }, 50);
  }

  /**
   * Init function
   * Bind to needed events
   */
  function init() {
    EventMgr.bind('appendForm', wizardLoad);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr);
//# sourceMappingURL=App.Wizards.js.map

'use strict';

/**
 * Calendar module
 *
 * show calendar
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} em EventMgr library
 */
App.Calendar = function (window, $, em) {
  'use strict';

  function init() {
    loadMessages();
  }

  function addListeners() {
    em.on($calCont(), toolsSelector, 'click', toolMouseupRep);
    em.on($calCont(), calMonthSel, 'click', chooseMonthHandler);
    em.on($calCont(), daysSelector, 'click', daysMousedownRep);
    em.on($calCont(), calMonthSelector, 'mousedown', toolMousedownRep);
    em.on($calCont(), calYearSelector, 'mousedown', toolMousedownRep);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
    em.on($calYearCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
    em.on($calYearCombo(), calComboboxSelector, 'mouseover', comboMouseover);
    em.on($calYearCombo(), calComboboxSelector, 'mouseout', comboMouseout);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseover', comboMouseover);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseout', comboMouseout);
    addedListener = true;
  }

  var addedListener = false,
      isIe = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent),
      clActive = false,
      clCalendar = null,
      clCalendarCell = null,
      clField = null,
      clDate = null,
      clTimeout = null,
      clTtool = null,
      clElYears = null,
      clElMonths = null,
      clElHead = null,
      clElDays = null,
      clElDaysTbody = null,
      clSyncField = null,
      clMsgMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
      clMsgSmonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
      clMsgWdays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
      calMonthSelector = '#calmonth',
      calYearSelector = '#calyear',
      toolsSelector = '.cl-tool-td',
      daysSelector = 'td.cl-days',
      calComboboxSelector = ' div',
      calMonthSel = '.b-cal__month',
      pageInfo = window.pageInfo;

  function loadMessages() {
    var i;
    for (i = 0; i < 12; i++) {
      clMsgMonths[i] = pageInfo.calendar['m' + i];
      clMsgSmonths[i] = pageInfo.calendar['ms' + i];
    }
    for (i = 0; i < 7; i++) {
      clMsgWdays[i] = pageInfo.calendar['w' + i];
    }
  }

  function $calCont() {
    return $('#calendar');
  }

  function $calMonthCombo() {
    return $('#calendar-m');
  }

  function $calYearCombo() {
    return $('#calendar-y');
  }

  function getHtmlNodes() {
    if (!clCalendar) {
      clCalendar = document.getElementById('calendar');
      if (!clCalendar) {
        clCalendar = document.createElement('div');
        clCalendar.setAttribute('class', 'cl');
        clCalendar.setAttribute('id', 'calendar');
        clCalendarCell = document.createElement('div');
        clCalendarCell.setAttribute('class', 'cl-cell');
        clCalendarCell.setAttribute('id', 'calendar-cell');
        clCalendar.appendChild(clCalendarCell);
        document.body.appendChild(clCalendar);
      }
    }
    if (!clCalendarCell) {
      clCalendarCell = document.getElementById('calendar-cell');
    }
    if (!clElYears) {
      clElYears = document.getElementById('calendar-y');
      if (!clElYears) {
        clElYears = document.createElement('div');
        clElYears.setAttribute('id', 'calendar-y');
        clElYears.setAttribute('class', 'cl-ym-y');
        document.body.appendChild(clElYears);
      }
    }
    if (!clElMonths) {
      clElMonths = document.getElementById('calendar-m');
      if (!clElMonths) {
        clElMonths = document.createElement('div');
        clElMonths.setAttribute('id', 'calendar-m');
        clElMonths.setAttribute('class', 'cl-ym-m');
        document.body.appendChild(clElMonths);
      }
    }
    if (!addedListener) {
      addListeners();
    }
  }

  function setPosition(e) {
    // Set position
    // Get object which fire even
    var obj = e.target ? e.target : e.srcElement,
        ipos = $(obj).offset(),
        windowWidth = window.innerWidth,
        windowHeight = window.innerHeight,
        cWidth = clCalendar.offsetWidth,
        cHeight = clCalendar.offsetHeight,
        x = ipos.left - cWidth + obj.offsetWidth,
        y = ipos.top + obj.offsetHeight - 1,
        diffY = windowHeight - (y + cHeight),
        diffX = windowWidth - (x + cWidth);
    if (diffX < 0) {
      x = windowWidth - cWidth;
    }
    if (diffY < 0) {
      y = ipos.top - cHeight;
    }
    if (isIe) {
      x += 1;
    }
    clCalendar.style.left = x + 'px';
    clCalendar.style.top = y + 'px';
    clCalendar.style.visibility = 'visible';
    clActive = true;
  }

  var calTempl = '<div class="b-cal">' + '<div class="b-cal__head cl-head">' + '<div class="cl-tool-td" id="prevY"><div class="t-inner"></div></div>' + '<div class="cl-tool-td" id="calyear">{{=it.cYear}}</div>' + '<div class="cl-tool-td" id="nextY"><div class="t-inner"></div></div>' + '<div class="cl-tool-td b-cal__today" id="curMonth"></div>' + '</div>' + '<div class="cl-days-wrapper b-cal__month-wrapper">' + '{{~it.months :value :index}}' + '<div class="b-cal__month ' + '{{?index === it.month}}b-cal__month_selected{{?}}"' + ' data-value="{{=index}}">' + '{{=value}}' + '</div>' + '{{~}}' + '</div>' + '</div>',
      calTemplFunc = window.doT.template(calTempl);

  /**
   * show Month calendar
   * @param {object} field current field HTML node
   * @param {object} syncField HTML node
   * @param {object} e event object
   */
  function showMonthCal(field, syncField, e) {

    getHtmlNodes();

    buildComboBox();

    document.onmousedown = checkOutclick;

    clField = field;
    clSyncField = syncField;
    clDate = parseDate(field.value, true);

    var html = calTemplFunc({
      cYear: clDate.getFullYear(),
      months: clMsgMonths,
      month: clDate.getMonth()
    });

    clCalendar.setAttribute('data-type', 'month');

    clCalendarCell.innerHTML = html;

    setPosition(e);
  }

  function chooseMonthHandler(e) {
    e.preventDefault();
    if (!this) {
      return;
    }
    var month = this.getAttribute('data-value'),
        year = clDate.getFullYear();
    month -= 0;
    setMonth(year, month + 1);
    hide();
  }

  function showRep(field, syncField, e) {
    e = e || window.event;

    getHtmlNodes();

    // Register events
    document.onmousedown = checkOutclick;

    // Parse field date
    clField = field;
    clSyncField = syncField;
    clDate = parseDate(clField.value);

    // Draw calendar
    drawCalendarRep();
    drawDateRep(clDate);

    setPosition(e);
  }

  function hideRep() {
    if (!clCalendar) {
      clCalendar = document.getElementById('calendar');
    }
    document.onmouseup = null;
    document.onmousedown = null;
    clCalendar.style.visibility = 'hidden';
    clActive = false;
  }

  function buildComboBox() {
    // COMBO BOXES
    if (clElYears.innerHTML !== '') {
      return;
    }
    var i;
    for (i = 0; i < 12; i++) {
      var elDiv = document.createElement('div');
      elDiv.id = 'ycombo' + i;
      elDiv.className = i % 2 === 0 ? 'cl-ym-div' : 'cl-ym-diveven';
      elDiv.innerHTML = 'y ' + i;

      clElYears.appendChild(elDiv);

      elDiv = document.createElement('div');
      elDiv.id = 'mcombo' + i;
      elDiv.className = i % 2 === 0 ? 'cl-ym-div' : 'cl-ym-diveven';
      elDiv.innerHTML = 'm ' + i;

      clElMonths.appendChild(elDiv);
    }
    // COMBO BOXES
  }

  function drawCalendarRep() {
    if (clElHead && clCalendar.getAttribute('data-type') === 'default') {
      return;
    }
    var i;
    clCalendarCell.innerHTML = '';
    // HEAD
    clElHead = document.createElement('div');
    clElHead.className = 'cl-head';

    clCalendarCell.appendChild(clElHead);
    clCalendar.setAttribute('data-type', 'default');
    clElHead.innerHTML = '';
    //HEAD

    buildComboBox();
    // TOOLBAR and DAYS
    var elWrDays = document.createElement('div');
    elWrDays.className = 'cl-days-wrapper';
    clCalendarCell.appendChild(elWrDays);
    clElDays = document.createElement('table');
    clElDays.className = 'cl-days';
    elWrDays.appendChild(clElDays);

    clElDaysTbody = document.createElement('tbody');
    clElDays.appendChild(clElDaysTbody);

    var toolcontent = {
      prevM: '.',
      calmonth: '',
      nextM: '.',
      prevY: '.',
      calyear: '',
      nextY: '.',
      today: ''
    };
    /* jslint forin:true */
    for (var keyVar in toolcontent) {
      var elToolTd = document.createElement('div');
      elToolTd.className = 'cl-tool-td';
      elToolTd.id = keyVar;
      elToolTd.setAttribute('unselectable', true);
      if (toolcontent[keyVar] === '.') {
        elToolTd.innerHTML = '<div class="t-inner"></div>';
      } else {
        elToolTd.innerHTML = toolcontent[keyVar];
      }

      clElHead.appendChild(elToolTd);
    }
    var emptyRow = document.createElement('tr');
    clElDaysTbody.appendChild(emptyRow);

    for (i = 0; i < 7; i++) {
      var elDaysTr = document.createElement('tr');
      if (i === 0) {
        elDaysTr.className = 'cl-dayst-tr';
      }
      clElDaysTbody.appendChild(elDaysTr);

      for (var j = 0; j < 7; j++) {
        var elDaysTd = document.createElement('td');
        if (j === 6) {
          elDaysTd.style.borderRightWidth = 0;
        }
        elDaysTd.innerHTML = i === 0 ? clMsgWdays[j] : '&nbsp;';
        if (j === 0) {
          addClass(elDaysTd, 'cl-first');
        } else if (j === 6) {
          addClass(elDaysTd, 'cl-last');
        }

        elDaysTr.appendChild(elDaysTd);
      }
    }
    // TOOLBAR and DAYS
  }
  /**
   * Draw calendar dates
   * @param {Date} cdate current Date object
   */
  function drawDateRep(cdate) {
    var cyear = cdate.getFullYear();
    var cmon = cdate.getMonth();
    var cday = cdate.getDate();
    var cyearb, cmonb;
    if (cmon === 0) {
      cyearb = cyear - 1;
      cmonb = 11;
    } else {
      cyearb = cyear;
      cmonb = cmon - 1;
    }
    var elMonth = document.getElementById('calmonth');
    var elYear = document.getElementById('calyear');

    elYear.innerHTML = cyear;

    if (!elMonth) {
      return;
    }
    elMonth.innerHTML = clMsgMonths[cmon];

    // 1th week day
    var firstdayDate = new Date(cdate.getFullYear(), cdate.getMonth(), cdate.getDate());
    firstdayDate.setDate(1);
    var startWday = firstdayDate.getDay();
    if (startWday === 0) {
      startWday = 7;
    }

    // last day in month
    var lastDay = getLastday(cyear, cmon);
    var lastDayBehind = getLastday(cyearb, cmonb);
    var cb = lastDayBehind - (startWday - 2);
    var showRows = [1, 1, 1, 1, 1, 1, 1, 1];
    var c = 1;
    var nextm = 1;
    var innerTd;
    for (var i = 2; i < 8; i++) {

      for (var j = 0; j < 7; j++) {
        clElDays.rows[i].className = '';
        if (i % 2 === 0) {
          clElDays.rows[i].cells[j].className = 'cl-days';
        } else {
          clElDays.rows[i].cells[j].className = 'cl-even cl-days';
        }
        if (j >= 5) {
          addClass(clElDays.rows[i].cells[j], 'cl-weekend');
        }
        clElDays.rows[i].cells[j].id = '';
        //prev month
        if (i === 2 && j + 1 < startWday) {
          // ******
          //even day
          if (i % 2 === 0) {
            clElDays.rows[i].cells[j].className = 'cl-behind cl-days';
          } else {
            clElDays.rows[i].cells[j].className = 'cl-even cl-behind cl-days';
          }
          //weekend
          if (j >= 5) {
            addClass(clElDays.rows[i].cells[j], 'cl-weekend');
          }
          innerTd = '<div class="inner-td">' + cb + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          clElDays.rows[i].cells[j].id = cb;
          //add event behind day

          cb++;
          //next month
        } else if (c > lastDay) {
          // ******
          //even day
          if (i % 2 === 0) {
            clElDays.rows[i].cells[j].className = 'cl-days cl-future';
          } else {
            clElDays.rows[i].cells[j].className = 'cl-even cl-future cl-days';
          }
          //weekend
          if (j >= 5) {
            addClass(clElDays.rows[i].cells[j], 'cl-weekend');
          }
          innerTd = '<div class="inner-td">' + nextm + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          clElDays.rows[i].cells[j].id = nextm;
          nextm++;
          if (j === 0) {
            showRows[i] = 0;
          }
          //current month
        } else {
          innerTd = '<div class="inner-td">' + c + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          if (c === cday) {
            addClass(clElDays.rows[i].cells[j], 'cl-selected');
          }
          c++;
        }
        if (j === 0) {
          addClass(clElDays.rows[i].cells[j], 'cl-first');
        } else if (j === 6) {
          addClass(clElDays.rows[i].cells[j], 'cl-last');
        }
        if (i === 2) {
          clElDays.rows[i].className = 'first-row';
        } else if (i === 7) {
          if (showRows[i] !== 0) {
            clElDays.rows[i].className = 'last-row';
          } else {
            clElDays.rows[i - 1].className = 'last-row';
          }
        }
      }
    }

    for (var ii = 5; ii < showRows.length; ii++) {
      if (showRows[ii] === 1) {
        clElDays.rows[ii].style.display = 'table-row';
      } else {
        clElDays.rows[ii].style.display = 'none';
      }
    }
  }

  /////// Select clicked day
  function daysMousedownRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement,
        inner = obj.innerHTML;
    if (!String(inner).match(/\d+/)) {
      return;
    }
    /* jslint validthis: true */
    inner = inner.replace(/\D[^\.]/g, '');
    var self = $(this),
        cday = parseInt(inner, 10);
    /* jslint validthis: false */
    if (self.hasClass('cl-behind')) {
      clDate.setMonth(clDate.getMonth() - 1, cday);
    } else if (self.hasClass('cl-future')) {
      clDate.setMonth(clDate.getMonth() + 1, cday);
    } else {
      if (isNaN(cday)) {
        return;
      }
    }

    setDate(clDate.getFullYear(), clDate.getMonth() + 1, cday);
    hideRep();
    stopEvent(e);
  }

  /**
   * set month & year in input
   * @param {Number} y year XXXX
   * @param {Number|String} m month XX
   */
  function setMonth(y, m) {
    if (m < 10) {
      m = '0' + String(m);
    }
    if (clField.getAttribute('readonly') === null) {
      var value = y + '-' + m;
      clField.value = value;
      $(clField).trigger('change');
      if (clSyncField && clSyncField.value === '') {
        clSyncField.value = value;
        $(clSyncField).trigger('change');
      }
    }
  }

  /**
   * set full date in input
   * @param {Number|String} y year XXXX
   * @param {Number|String} m month XX
   * @param {Number|String} d day XX
   */
  function setDate(y, m, d) {
    if (m < 10) {
      m = '0' + String(m);
    }
    if (d < 10) {
      d = '0' + String(d);
    }
    if (clField.getAttribute('readonly') === null) {
      var value = y + '-' + m + '-' + d;
      clField.value = value;
      $(clField).trigger('change');
      if (clSyncField && clSyncField.value === '') {
        clSyncField.value = value;
        $(clSyncField).trigger('change');
      }
    }
  }

  function getLastday(y, m) {
    var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (m === 1 && y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0)) {
      return 29;
    } else {
      return months[m];
    }
  }

  function applyCurMonth() {
    $('.b-cal__month_selected').removeClass('b-cal__month_selected');
    $('.b-cal__month[data-value="' + clDate.getMonth() + '"]').addClass('b-cal__month_selected');
    $('#calyear').html(clDate.getFullYear());
  }

  function toolMouseupRep(e) {
    e = e || window.event;
    // Get object which fire event
    /* jslint validthis: true */
    var obj = this;
    /* jslint validthis: false */
    var cday = clDate.getDate();
    var cmonth = clDate.getMonth();
    var cyear = clDate.getFullYear();
    var lastDay, todayDate;
    clDate.setDate(1);
    if (obj.id === 'prevY') {
      clDate.setFullYear(clDate.getFullYear() - 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    } else if (obj.id === 'prevM') {
      clDate.setMonth(clDate.getMonth() - 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    } else if (obj.id === 'today') {
      todayDate = new Date();
      if (todayDate.getFullYear() === cyear && todayDate.getMonth() === cmonth && todayDate.getDate() === cday) {
        setDate(cyear, cmonth + 1, cday);
        hide();
      } else {
        clDate = todayDate;
        drawDateRep(clDate);
      }
    } else if (obj.id === 'curMonth') {
      todayDate = new Date();
      if (todayDate.getFullYear() === cyear && todayDate.getMonth() === cmonth) {
        setMonth(cyear, cmonth + 1);
        hide();
      } else {
        clDate = todayDate;
        applyCurMonth();
      }
    } else if (obj.id === 'nextM') {
      clDate.setMonth(clDate.getMonth() + 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    } else if (obj.id === 'nextY') {
      clDate.setFullYear(clDate.getFullYear() + 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    }
    stopEvent(e);
  }

  /**
   * Year & month click handler
   * @param {object} e event object
   */
  function toolMousedownRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement;
    clTtool = obj;

    if (obj.id === 'calyear') {
      if (clTimeout) {
        clearTimeout(clTimeout);
      }
      clTimeout = setTimeout(function () {
        showYear();
      }, 250);
      document.onmouseup = hideMyRep;
    } else if (obj.id === 'calmonth') {
      if (clTimeout) {
        clearTimeout(clTimeout);
      }
      clTimeout = setTimeout(function () {
        showMonths();
      }, 250);
      document.onmouseup = hideMyRep;
    }
    stopEvent(e);
  }

  function hideMyRep() {
    if (clTimeout) {
      clearTimeout(clTimeout);
    }
    document.onmouseup = null;
    clElYears.style.visibility = 'hidden';
    clElMonths.style.visibility = 'hidden';
    if (clTtool) {
      removeClass(clTtool, 'cl-tool-selected');
    }
  }

  function showMonths() {
    var cmonth = clDate.getMonth();
    for (var i = 0; i < 12; i++) {
      clElMonths.childNodes[i].innerHTML = clMsgSmonths[i];
      if (cmonth === i) {
        addClass(clElMonths.childNodes[i], 'cl-ym-selected');
      } else {
        removeClass(clElMonths.childNodes[i], 'cl-ym-selected');
      }
    }

    var pos = $(clTtool).offset();

    var x = clTtool.id === 'calmonth' ? pos.left : pos.left + clTtool.offsetWidth - clElMonths.offsetWidth;
    if (isIe) {
      x += 1;
    }
    clElMonths.style.left = x + 'px';
    clElMonths.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
    clElMonths.style.visibility = 'visible';
    addClass(clTtool, 'cl-tool-selected');
  }
  /**
   * Show years combo box
   */
  function showYear() {
    var cyear = clDate.getFullYear();
    cyear += 12;
    for (var i = 0; i < 12; i++) {
      clElYears.childNodes[i].innerHTML = cyear - 1 - i * 2;
    }
    var pos = $(clTtool).offset();
    //var pos = mn_get_obj_pos(clTtool);
    var x = clTtool.id === 'calyear' ? pos.left - 1 : pos.left + clTtool.offsetWidth - clElYears.offsetWidth + 1;
    if (isIe) {
      x += 1;
    }
    clElYears.style.left = x + 'px';
    clElYears.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
    clElYears.style.visibility = 'visible';
    addClass(clTtool, 'cl-tool-selected');
  }
  /**
   * close calendar
   */
  function hide() {
    if (!clCalendar) {
      clCalendar = document.getElementById('calendar');
    }
    document.onmousedown = null;
    clCalendar.style.visibility = 'hidden';
    clActive = false;
  }
  /**
   * Out caledar click handler
   * close calendar
   * @param {object} e event object
   */
  function checkOutclick(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement;
    while (obj.parentNode) {
      if (obj.id === 'calendar') {
        return;
      }
      obj = obj.parentNode;
    }
    hide();
  }

  /**
   * Combo month & year click handler
   * show chosen year or month
   * @param {object} e event object
   */
  function comboMouseupRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement;

    var cday = clDate.getDate();
    var lastDay;
    clDate.setDate(1);
    if (String(obj.id).match(/ycombo/)) {
      clDate.setFullYear(parseInt(obj.innerHTML, 10));
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    } else if (String(obj.id).match(/mcombo(\d+)/)) {
      clDate.setMonth(parseInt(RegExp.$1, 10));
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else {
        clDate.setDate(cday);
      }
      drawDateRep(clDate);
    }
  }

  function parseDate(str, month) {
    var isfieldok = false,
        fy = null,
        fm = null,
        fd = null;
    if (month) {
      if (String(str).match(/^(\d\d\d\d)-(\d+)/)) {
        fy = parseInt(RegExp.$1, 10);
        fm = parseInt(RegExp.$2, 10);
        fd = 1;
        if (!isNaN(fy) && !isNaN(fm)) {
          fm -= 1;
          isfieldok = true;
        }
      }
    } else {
      if (String(str).match(/^(\d\d\d\d)-(\d+)-(\d+)/)) {
        fy = parseInt(RegExp.$1, 10);
        fm = parseInt(RegExp.$2, 10);
        fd = parseInt(RegExp.$3, 10);
        if (!isNaN(fy) && !isNaN(fm) && !isNaN(fd)) {
          fm -= 1;
          isfieldok = true;
        }
      }
    }
    var rdate = null;
    if (isfieldok) {
      rdate = new Date(fy, fm, fd);
    } else {
      rdate = new Date();
    }

    return rdate;
  }

  function comboMouseover(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement;
    addClass(obj, 'cl-ym-hover');
  }

  function comboMouseout(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = e.target ? e.target : e.srcElement;
    removeClass(obj, 'cl-ym-hover');
  }

  // Remove class from element
  function removeClass(el, name) {
    if (!(el && el.className)) {
      return;
    }
    var cls = el.className.split(' ');
    var ar = [];
    for (var i = cls.length; i > 0;) {
      if (cls[--i] !== name) {
        ar[ar.length] = cls[i];
      }
    }
    el.className = ar.join(' ');
  }

  // Add class to element
  function addClass(el, name) {
    removeClass(el, name);
    el.className += ' ' + name;
  }

  function stopEvent(e) {
    e = e || window.event;
    if (isIe) {
      e.cancelBubble = true;e.returnValue = false;
    } else {
      e.preventDefault();e.stopPropagation();
    }
    return false;
  }

  return {
    init: init,
    show: showRep,
    showMonth: showMonthCal
  };
}(window, $, EventMgr);

/*
 try {
  if ( pageInfo.calendar['today'] ) clMsgToday = pageInfo.calendar['today'];
 } catch (ex) {}
 for ( var i=0; i<12; i++ ) {
 clMsgMonths[i] = pageInfo.calendar['m' + i];
  clMsgSmonths[i] = pageInfo.calendar['ms' + i]; }
 for ( var i=0; i<7; i++ ) { clMsgWdays[i] = pageInfo.calendar['w' + i];; }
 */
//# sourceMappingURL=App.Calendar.js.map

'use strict';

/**
 * Valid checker module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.ValidChecker = function (window, $, EventMgr, App) {
  var init = function init() {
    EventMgr.bind('checkValue', checkValue);
    EventMgr.bind('validatorResponse', managerValidator);
  },
      checkValue = function checkValue(e, data) {
    var nameValid = data.name,
        self = data.self,
        paramValid = data.param,
        number = data.number,
        value = data.value,
        prefix = data.prefix,
        fieldName = data.fieldname,
        funcName = data.funcname,
        convert = data.convert;
    //ajax request
    var param = {
      func: 'check.' + nameValid,
      value: value,
      name: fieldName,
      funcname: funcName };
    if (paramValid) {
      param.args = paramValid;
    }
    if (prefix) {
      param.prefix = prefix;
    }
    if (convert) {
      param.tconvert = convert;
    }
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      invar: {
        self: self,
        namevalid: nameValid,
        ovalue: self.value,
        vvalue: value,
        multi: data.multi,
        number: number },
      trfunc: 'validatorResponse',
      outtype: 'json',
      queue: 'multiload' });
  },
      managerValidator = function managerValidator(e, data) {
    var self = data.self,
        nameValid = data.namevalid,
        ovalue = data.ovalue,
        value = data.value,
        number = data.number,
        vvalue = data.vvalue;
    if (data.ermsg) {
      validatorErrors[nameValid] = data.ermsg;
      if (ovalue === self.value && self.offsetWidth !== 0 || self.nextSibling !== null && self.nextSibling.nodeName.toLowerCase() === 'textarea' && self.nextSibling.offsetWidth !== 0 && ovalue === self.value) {
        EventMgr.trigger('errMsgValid', {
          type: nameValid,
          self: self,
          err: data.ermsg,
          number: number });
      } else {
        EventMgr.trigger('okMsgValid', {
          type: nameValid,
          self: self,
          number: number });
      }
    } else {
      if (ovalue === self.value) {
        //single valid
        EventMgr.trigger('okMsgValid', {
          type: nameValid,
          self: self,
          number: number,
          multi: data.multi,
          value: value,
          ovalue: ovalue,
          vvalue: vvalue });
      } else {
        //multivalid
        EventMgr.trigger('okMsgValid', {
          type: nameValid,
          self: self,
          multi: data.multi,
          number: number,
          value: value,
          ovalue: ovalue,
          vvalue: vvalue });
      }
    }
  },
      validatorErrors = {};

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ValidChecker.js.map

'use strict';

/***
 * Toolbar grouping buttons
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.Toolbar = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendList', initToolbar);
    EventMgr.bind('menuPositionChanged', windowResize);
    EventMgr.obind($(window), 'resize', windowResize);
    EventMgr.on('#main-wrapper', toolgrpSelector, 'mouseover', setPosition);
  },
      toolgrpSelector = '.toolgrp.collapsed',
      timeId,
      appDom = App.Dom,

  /**
   * set marginLeft for centring expanded toolbuttons
   * @this {Node}
   */
  setPosition = function setPosition() {
    var width = this.offsetWidth,
        id = this.getAttribute('data-id'),
        bag = appDom.byId('tb-' + id),
        bWidth = bag.offsetWidth,
        diff;
    diff = (width - bWidth) / 2;
    bag.style.marginLeft = diff + 'px';
  },

  /**
   * check for overflow
   * @param {Node} elem
   * @return {boolean}
   */
  checkOverWidth = function checkOverWidth(elem) {
    if (elem.offsetWidth + 3 < elem.scrollWidth) {
      return true;
    }
    return false;
  },

  /**
   * collapse toolbuttons
   * @param {HTML array} tGroups
   * @param {Node} toolbar
   * @param {String} tabId
   * @return {boolean}
   */
  collapseToolBtn = function collapseToolBtn(tGroups, toolbar, tabId) {
    var overwidth = true,
        collapsed = false,
        name,
        tl,
        toolbag,
        bagElems,
        l = tGroups.length;
    while (overwidth && l--) {
      name = tGroups[l].getAttribute('data-name');
      toolbag = appDom.byId('tb-' + tabId + '-' + name);
      bagElems = toolbag.childNodes;
      tl = bagElems.length;
      if (tl > 0) {
        collapsed = true;
        appDom.addClass(tGroups[l], 'collapsed');
      }
      collapsed = true;
      overwidth = checkOverWidth(toolbar);
    }
    return collapsed;
  },

  /**
   * Expand toolbuttons
   * @param {HTML array} tGroups
   * @param {Node} toolbar
   * @param {string} tabId
   * @return {boolean}
   */
  expandToolBtn = function expandToolBtn(tGroups, toolbar, tabId) {
    var l = tGroups.length,
        collapsed = false,
        overwidth,
        i,
        name,
        tl,
        toolbag,
        bagElems;
    for (i = 0; i < l; i++) {
      name = tGroups[i].getAttribute('data-name');
      toolbag = appDom.byId('tb-' + tabId + '-' + name);
      toolbag.style.marginLeft = 0;
      bagElems = toolbag.childNodes;
      tl = bagElems.length;
      appDom.removeClass(tGroups[i], 'collapsed');
      overwidth = checkOverWidth(toolbar);
      if (overwidth) {
        if (tl > 0) {
          appDom.addClass(tGroups[i], 'collapsed');
        }
        collapsed = true;
        break;
      }
    }
    return collapsed;
  },

  /**
   * check size when append tab
   * @param {object} e
   * @param {object} data
   */
  initToolbar = function initToolbar(e, data) {
    var tabId = data.tabId,
        toolbar = appDom.byId('toolbar-' + tabId),
        tGroups = $('#toolbar-' + tabId + ' .toolgrp'),
        overwidth,
        collapsed = false;
    if (!toolbar) {
      return;
    }
    overwidth = checkOverWidth(toolbar);

    if (overwidth) {
      collapsed = collapseToolBtn(tGroups, toolbar, tabId);
    }

    if (collapsed) {
      appDom.addClass(toolbar, 'collapsed');
    }
  },

  /**
   * check size when resize window
   * @param {string} tabId
   */
  checkToolbar = function checkToolbar(tabId) {
    var toolbar = appDom.byId('toolbar-' + tabId),
        collapsed = appDom.hasClass(toolbar, 'collapsed'),
        tGroups = $('#toolbar-' + tabId + ' .toolgrp'),
        overwidth;
    if (!toolbar) {
      return;
    }
    overwidth = checkOverWidth(toolbar);
    if (collapsed && !overwidth) {
      collapsed = expandToolBtn(tGroups, toolbar, tabId);
    } else if (overwidth) {
      collapsed = collapseToolBtn(tGroups, toolbar, tabId);
    }
    if (collapsed) {
      appDom.addClass(toolbar, 'collapsed');
    } else {
      appDom.removeClass(toolbar, 'collapsed');
    }
  },
      resizeHandler = function resizeHandler(e, data) {
    var tabId, tabElem;
    if (!data) {
      tabElem = $('.tab-content_st_active');
      tabId = tabElem.attr('data-tabid');
    } else {
      tabId = data.tabId;
      tabElem = $('#cont-' + tabId);
    }
    if (tabElem.attr('data-tab-type') === 'list') {
      checkToolbar(tabId);
    }
  },
      windowResize = function windowResize() {
    clearTimeout(timeId);
    timeId = setTimeout(function () {
      resizeHandler();
    }, 100);
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Toolbar.js.map

'use strict';

/**
 *  Map module
 *
 *  SVG DCMap wrapper
 *
 */
var App = App || {};
App.Map = function (window, $, EventMgr, App) {
  "use strict";

  var init = function init() {
    EventMgr.bind('appendMap', loadMap);
    EventMgr.bind('savedMapData', savedMapDataHandler);
    EventMgr.obind($(window), 'resize', resizeMapHandler);
    EventMgr.one('loadMapScript', loadScript);
    EventMgr.bind('spaceKeyUp', spaceKeyUpHandler);
    EventMgr.bind('upKeyUp, downKeyUp, leftKeyUp, rightKeyUp', arrowKeyUpHandler);
  },
      baseUrl = pageInfo.url,
      racks = {},
      selectHandler = function selectHandler(elems, self) {
    var i = 0,
        tabId = 'cont-' + self.tabId,
        sElems = [],
        curElem;
    /* jslint forin:true */
    for (var keyVar in elems) {
      i++;
      curElem = {};
      curElem.elid = elems[keyVar].elid;
      curElem.name = elems[keyVar].name;
      sElems.push(curElem);
    }
    if (i === 1) {
      EventMgr.trigger("mapSelect", { tabId: tabId });
    } else if (i === 0) {
      EventMgr.trigger("mapUnSelect", { tabId: tabId });
    } else if (i > 1) {
      EventMgr.trigger("mapMultiSelect", { tabId: tabId });
    }
    EventMgr.trigger('updateSelectedElems', { elems: sElems, tabId: self.tabId });
  },
      saveRackData = function saveRackData(elems, tabId) {
    var elemsArray = [],
        elemObject,
        elem;
    for (var key in elems) {
      if (elems[key].state) {
        elem = elems[key];
        if (elem) {
          elemObject = {
            elid: elem.elid,
            name: elem.type,
            position: elem.position
          };
          if (elem.parent) {
            elemObject.plid = elem.parent.elid;
          }
          elemsArray.push(elemObject);
        }
      }
    }

    var data = JSON.stringify(elemsArray);

    var param = {
      func: racks[tabId].saveAction,
      data: data
    };

    EventMgr.trigger('ajaxRequest', {
      url: baseUrl,
      param: param,
      invar: { tabId: tabId },
      type: 'get',
      outtype: 'json',
      trfunc: 'savedMapData',
      failfunc: 'failSavedMapData',
      queue: 'noqueue' });

    EventMgr.trigger('tabLoading', { tabId: tabId });
  },
      saveData = function saveData(elems, tabId) {
    var elemsArray = [],
        elemObject,
        elem;
    /* jslint forin:true */
    for (var key in elems) {
      elem = elems[key];
      if (elems[key]) {
        elemObject = {
          elid: elem.elid,
          direction: Math.round(elem.curDirect),
          top: elem.curY,
          left: elem.curX,
          name: elem.name
        };
        elemsArray.push(elemObject);
      }
    }

    var data = JSON.stringify(elemsArray);

    var param = {
      func: maps[tabId].saveAction,
      data: data
    };

    EventMgr.trigger('ajaxRequest', {
      url: baseUrl,
      param: param,
      invar: { tabId: tabId },
      type: 'get',
      outtype: 'json',
      trfunc: 'savedMapData',
      failfunc: 'failSavedMapData',
      queue: 'noqueue' });

    EventMgr.trigger('tabLoading', { tabId: tabId });
  },
      savedMapDataHandler = function savedMapDataHandler(e, data) {
    EventMgr.trigger('tabLoadingHide', { tabId: data.tabId });
  },
      selectNodeHandler = function selectNodeHandler(elems, tabId) {
    if (elems) {
      var l = elems.length,
          len = l,
          ctabId = 'cont-' + tabId,
          sElems = [],
          curElem;
      while (l--) {
        curElem = {};
        curElem.elid = elems[l].elid;
        curElem.name = elems[l].type;
        sElems.push(curElem);
      }
      if (len === 1) {
        EventMgr.trigger("mapSelect", { tabId: ctabId });
      } else if (len === 0) {
        EventMgr.trigger("mapUnSelect", { tabId: ctabId });
      } else if (len > 1) {
        EventMgr.trigger("mapMultiSelect", { tabId: ctabId });
      }
      EventMgr.trigger('updateSelectedElems', { elems: sElems, tabId: tabId });
    }
  },
      dblclickNodeHandler = function dblclickNodeHandler(elem, tabId) {
    var sElems = [{
      'elid': elem.elid,
      'name': elem.type
    }],
        ctabId = 'cont-' + tabId;
    EventMgr.trigger("mapSelect", { tabId: ctabId });
    EventMgr.trigger('updateSelectedElems', { elems: sElems, tabId: tabId });
    $('#toolbar-' + tabId + ' .action.default').trigger('click');
  },
      setHeightRack = function setHeightRack(tabId) {
    var windowHeight = $(window).height(),
        top = $('#menu-items-wr').offset().top,
        rackHeight = windowHeight - top;

    $('.tab-content').height(rackHeight);
    var rackWrapper = $('#tcw-' + tabId + ' .topBar');
    if (rackWrapper.length > 0) {
      var topRack = rackWrapper[0].offsetHeight,
          availableHeight = rackHeight - topRack;
      $('#' + tabId + '-map').height(availableHeight);
      EventMgr.trigger('updateScroll', { id: tabId + '-map' });
    }
  },
      renderRack = function renderRack(data) {
    var rack = new Rack('wrapper');
    rack.setData(data);
    rack.render();
    rack.onSaveData(saveRackData);
    rack.onSelect(selectNodeHandler);
    rack.onDblclick(dblclickNodeHandler);
    rack.saveAction = data.map.action;
    racks[data.tabId] = rack;
    setTimeout(function () {
      setHeightRack(data.tabId);
    }, 150);

    EventMgr.trigger('appendMapDone', data);
  },
      renderMap = function renderMap(e, data) {
    if (data.map.type === 'rack') {
      renderRack(data);
      return;
    }

    var tabId = data.tabId,
        dataMap = data.map,
        mapWrapper = AppDom.byId(tabId + '-map'),
        svgWrapper = doc.createElement('div'),
        id = 'svg-map-' + tabId,
        scale = dataMap.scale || 1,
        $mapWrapper,
        width = dataMap.width,
        height = dataMap.height;
    if (!mapWrapper) {
      return;
    }

    svgWrapper.setAttribute('class', 'svg-wrapper');
    svgWrapper.setAttribute('id', id);
    mapWrapper.appendChild(svgWrapper);
    var map = new window.DCMap(id);
    map.init({ width: width, height: height, scale: scale, edit: dataMap.edit, msg: dataMap.msg });
    map.onDblClick(mapDblClickHandler);
    map.renderWorkarea();
    map.renderLayers(dataMap);
    maps[tabId] = map;
    map.saveAction = dataMap.action;
    map.onSave(saveData);
    map.onSelect(selectHandler);

    map.tabId = tabId;
    resizeTimeId = setTimeout(function () {
      resizeMap();
    }, 100);
  },
      mapDblClickHandler = function mapDblClickHandler(e, ee) {
    e.preventDefault();
    var curElem = {},
        sElems = [],
        tabId = this.papper.master.tabId;
    curElem.elid = this.elid;
    curElem.name = this.name;
    sElems.push(curElem);
    EventMgr.trigger('updateSelectedElems', { elems: sElems, tabId: tabId });
    $('#toolbar-' + tabId + ' .action.default').trigger('click');
  },
      mapQueue = [],
      loadMap = function loadMap(e, data) {
    if (typeof window.DCMap !== 'undefined') {
      renderMap.apply(window, [e, data]);
    } else {
      mapQueue.push(data);
      EventMgr.trigger('loadMapScript');
    }
  },
      loadScript = function loadScript() {
    var file = '/manimg/orion/dcmap.min.js';
    App.Common.required(file, runQueue);
  },
      runQueue = function runQueue() {
    var l = mapQueue.length;
    while (l--) {
      renderMap.apply(window, [{}, mapQueue[l]]);
    }
  },
      AppDom = App.Dom,
      doc = document,

  //@todo remove map when close tab
  maps = {},
      resizeTimeId,


  //@todo resize when menu hide
  resizeMapHandler = function resizeMapHandler() {
    clearTimeout(resizeTimeId);
    resizeTimeId = setTimeout(function () {
      resizeMap();
    }, 50);
  },
      resizeMap = function resizeMap() {
    var actTab = $('.tab-content_st_active'),
        tabType = actTab.attr('data-tab-type'),
        tabId = actTab.attr('data-tabid'),
        mapWrapper,
        top,
        width,
        docHeight,
        avHeight,
        map;
    if (tabType === 'map' && maps[tabId]) {
      mapWrapper = $('#' + tabId + '-map');
      width = mapWrapper[0].offsetWidth - 20;
      top = mapWrapper.offset().top;
      docHeight = document.body.offsetHeight;
      avHeight = docHeight - top - 20;
      map = maps[tabId];
      map.resize({ width: width, height: avHeight });
    } else if (tabType === 'map') {
      setHeightRack(tabId);
    }
  },
      spaceKeyUpHandler = function spaceKeyUpHandler() {
    var actTab = $('.tab-content_st_active'),
        tabId = actTab.attr('data-tabid');
    if (maps[tabId]) {
      maps[tabId].forceRotate();
    }
  },
      direction = {
    '38': 'up',
    '40': 'down',
    '37': 'left',
    '39': 'right'
  },
      arrowKeyUpHandler = function arrowKeyUpHandler(e, data) {
    var actTab = $('.tab-content_st_active'),
        tabId = actTab.attr('data-tabid'),
        dir = direction[data.codeKey];
    if (maps[tabId]) {
      maps[tabId].forceMove(dir);
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Map.js.map

'use strict';

/**
 * Builder state
 * @param {object} window global object
 * @param {object|function} $ jQuery
 * @param {object} EventMgr Event manager
 * @param {object} App Application
 */
/*global App:true*/
App.Builder = function (window, $, EventMgr, App) {
  'use strict';

  var init = function init() {
    EventMgr.bind('ajaxResponseInspectorForm', inspectorFormResponseHandler);
    EventMgr.bind('failResponseInspectorForm', inspectorFormResponseFailHandler);
    EventMgr.bind('readyInspectorFormHtml', readyInspectorFormHtmlHandler);
    EventMgr.on(inspectorWrapperSelector, inspectorCloseSelector, 'click', closeForm);
    EventMgr.on(inspectorWrapperSelector, inspectorCancelSelector, 'click', closeForm);
    EventMgr.on(inspectorWrapperSelector, inspectorCollapseSelector, 'click', inspectorCollapseHandler);
    EventMgr.on(mainWrapperSelector, inspectorControlSelector, 'mousedown', inspectorDragHandler);
    EventMgr.on(mainWrapperSelector, inspectorFieldLinkSelector, 'click', inspectorLinkFieldHandler);
    EventMgr.on(mainWrapperSelector, inspectorToolBtnLinkSelector, 'click', inspectorLinkToolBtnHandler);
    EventMgr.on(mainWrapperSelector, inspectorFormLinkSelector, 'click', inspectorLinkFormHandler);
    EventMgr.on(mainWrapperSelector, inspectorListLinkSelector, 'click', inspectorLinkListHandler);
    EventMgr.on(mainWrapperSelector, inspectorColLinkSelector, 'click', inspectorLinkColHandler);
    EventMgr.on(mainWrapperSelector, inspectorToolBtnDelLinkSelector, 'click', inspectorLinkToolBtnDelHandler);
    EventMgr.on(mainWrapperSelector, inspectorColDelLinkSelector, 'click', inspectorLinkColDelHandler);
    EventMgr.on(mainWrapperSelector, inspectorFieldDelLinkSelector, 'click', inspectorLinkFieldDelHandler);
    EventMgr.on('#wrapper', inspectorMenuLinkSelector, 'click', inspectorLinkMenuHandler);

    EventMgr.bind('formInspectorResponse', formResponseHandler);
    EventMgr.bind('closeModalForm', closeModalForm);
  },
      document = window.document,
      baseUrl = pageInfo.url,
      $formWrapper = function $formWrapper() {
    return App.Dom.byId('inspector_form');
  },
      $inspectorContent = function $inspectorContent() {
    return App.Dom.byId('inspector-content');
  },
      inspectorCancelSelector = '.i-button_type_cancel',
      inspectorCloseSelector = '.inspector-close',
      inspectorCollapseSelector = '.inspector-collapse',
      inspectorControlSelector = '.inspector-control',
      mainWrapperSelector = '#main-wrapper',
      inspectorWrapperSelector = '#main-wrapper',
      inspectorFieldLinkSelector = '.devel-link-settings--field,' + ' .devel-link-add--field',
      inspectorToolBtnLinkSelector = '.devel-link-settings--toolbutton,' + ' .devel-link-add--toolbutton',
      inspectorToolBtnDelLinkSelector = '.devel-link-delete--toolbutton',
      inspectorListLinkSelector = '.devel-link-settings--list',
      inspectorFormLinkSelector = '.devel-link-settings--form',
      inspectorColLinkSelector = '.devel-link-settings--col,' + ' .devel-link-add--col',
      inspectorColDelLinkSelector = '.devel-link-delete--col',
      inspectorFieldDelLinkSelector = '.devel-link-delete--field',
      inspectorMenuLinkSelector = '.devel-link-settings--menu,' + ' .devel-link-add--menu',


  //trigger ajax request
  inspectorRequest = function inspectorRequest(param, tabId) {
    EventMgr.trigger('ajaxRequest', {
      url: baseUrl,
      param: param,
      invar: { sourceTab: tabId },
      type: 'get',
      outtype: 'json',
      trfunc: 'ajaxResponseInspectorForm',
      queue: '',
      failfunc: 'failResponseInspectorForm' });
  },

  //common function for list inspector
  inspectorLinkListEdit = function inspectorLinkListEdit(self, func, plid) {
    var param = {},
        tabId = self.getAttribute('data-tabid'),
        tabCont = App.Dom.byId('cont-' + tabId);
    param.func = func;
    if (plid) {
      param.plid = tabCont.getAttribute('data-func');
    }
    param.elid = self.getAttribute('data-elid') || '';

    inspectorRequest(param, tabId);
  },

  //common function for delete elem in list
  inspectorDeleteListElem = function inspectorDeleteListElem(self, func) {
    var param = {},
        tabId = self.getAttribute('data-tabid'),
        tabCont = App.Dom.byId('cont-' + tabId),
        invar = {};
    param.func = func;
    param.plid = tabCont.getAttribute('data-func');
    param.elid = self.getAttribute('data-elid');

    invar.rows = self.getAttribute('data-name');
    var l = 10;
    invar.confirm = '';
    //Special for Kuzmich
    while (l--) {
      invar.confirm += 'Я точно уверен, что хочу удалить элемент!<br/>';
    }

    invar.tabId = tabId;
    invar.params = param;
    EventMgr.trigger('listSelectedData', invar);
  },

  //inspector for field in form
  inspectorLinkFieldHandler = function inspectorLinkFieldHandler(e) {
    var self = this,
        param = {},
        tabId = self.getAttribute('data-tabid'),
        form = App.Dom.byId('frm-' + tabId);
    param.func = 'builder.field';
    param.plid = form.func.value;
    param.elid = self.getAttribute('data-elid') || '';

    inspectorRequest(param, tabId);
    e.preventDefault();
  },

  // inspector toolbtn in list
  inspectorLinkToolBtnHandler = function inspectorLinkToolBtnHandler(e) {
    inspectorLinkListEdit(this, 'builder.button', true);
    e.preventDefault();
  },

  //delete toolbtn in list
  inspectorLinkToolBtnDelHandler = function inspectorLinkToolBtnDelHandler(e) {
    inspectorDeleteListElem(this, 'builder.button.delete');
    e.preventDefault();
  },

  //inspector for form
  inspectorLinkFormHandler = function inspectorLinkFormHandler(e) {
    var self = this,
        param = {},
        tabId = self.getAttribute('data-tabid'),
        tabCont = App.Dom.byId('cont-' + tabId);
    param.func = 'builder.form';
    param.elid = tabCont.getAttribute('data-func') || '';

    inspectorRequest(param, tabId);
    e.preventDefault();
  },

  //inspector for list
  inspectorLinkListHandler = function inspectorLinkListHandler(e) {
    inspectorLinkListEdit(this, 'builder.list');
    e.preventDefault();
  },

  //response handler for inspector form
  inspectorFormResponseHandler = function inspectorFormResponseHandler(e, data) {
    var obj = data;
    obj.type = 'inspectorForm';
    EventMgr.trigger('ajaxResponse', obj);
  },
      inspectorFormResponseFailHandler = function inspectorFormResponseFailHandler() {},

  //inspector for col in list
  inspectorLinkColHandler = function inspectorLinkColHandler(e) {
    inspectorLinkListEdit(this, 'builder.col', true);
    e.preventDefault();
    e.stopPropagation();
  },

  //delete col in list
  inspectorLinkColDelHandler = function inspectorLinkColDelHandler(e) {
    inspectorDeleteListElem(this, 'builder.col.delete');
    e.preventDefault();
    e.stopPropagation();
  },
      inspectorLinkFieldDelHandler = function inspectorLinkFieldDelHandler(e) {
    var self = this,
        param = {},
        invar = {},
        tabId = self.getAttribute('data-tabid'),
        form = App.Dom.byId('frm-' + tabId);
    param.func = 'builder.field.delete';
    param.plid = form.func.value;
    param.elid = self.getAttribute('data-elid');

    invar.rows = self.getAttribute('data-name');
    invar.confirm = 'Delete  ';
    invar.tabId = tabId;
    invar.params = param;
    EventMgr.trigger('listSelectedData', invar);

    e.preventDefault();
  },

  //inspector menu
  inspectorLinkMenuHandler = function inspectorLinkMenuHandler(e) {
    var self = this,
        param = {};
    param.elid = self.getAttribute('data-elid') || '';
    param.func = 'builder.menu';
    inspectorRequest(param, '');
    e.preventDefault();
  },

  //insert form to modal wrapper
  readyInspectorFormHtmlHandler = function readyInspectorFormHtmlHandler(e, data) {
    var html = data;
    $inspectorContent().innerHTML = html;
    $formWrapper().style.display = 'block';

    EventMgr.trigger('appendForm', { tabId: 'modal1' });
    setModalFormPosition();
  },
      setModalFormPosition = function setModalFormPosition() {
    var $$formWrapper = $formWrapper(),
        formWidth,
        innerWidth;
    if (!$$formWrapper.style.right) {
      formWidth = $$formWrapper.offsetWidth;
      innerWidth = window.innerWidth;
      $$formWrapper.style.right = (innerWidth - formWidth) / 2 + 'px';
      $$formWrapper.style.top = '90px';
    }
  },

  //handler for form response
  formResponseHandler = function formResponseHandler(e, data) {
    var parent = '',
        reload = data.reload,
        newLocation = data.location,
        newWin = data.newwin,
        newFormParams = data.formParam,
        newListParams = data.listParam,
        vars = data.__vars,
        param;

    if (vars && vars.afterFunc && data.ok) {
      EventMgr.trigger(vars.afterFunc, { d: vars });
    }
    if (data.ok) {
      if (reload) {
        window.location = baseUrl;
        closeForm(e);
        return;
      } else if (newLocation && newWin) {
        window.open(newLocation, '_blank');
      } else if (newLocation) {
        window.location = newLocation;
        closeForm(e);
        return;
      } else if (newFormParams) {
        param = App.Common.parseParams(newFormParams);
        EventMgr.trigger('ajaxRequest', {
          url: baseUrl,
          noesc: true,
          param: param,
          invar: { parent: parent },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          failfunc: 'failCommonAjaxResponse',
          queue: 'noqueue' });
        return;
      } else if (newListParams) {
        param = App.Common.parseParams(newListParams);
        EventMgr.trigger('ajaxRequest', {
          url: baseUrl,
          noesc: true,
          param: param,
          invar: { parent: parent },
          type: 'get',
          outtype: 'json',
          trfunc: 'ajaxResponse',
          failfunc: 'failCommonAjaxResponse',
          queue: 'noqueue' });
        return;
      } else {
        //reload source tab
        if (data.parent) {
          EventMgr.trigger('reloadTab', { tabId: data.parent });
        }
      }
      closeForm(e);
    } else {
      //if error render form again with error
      var obj = data;
      obj.type = 'inspectorForm';
      obj.targetTabId = null;
      obj.sourceTab = obj.parent;
      if (obj.__vars) {
        obj.__innervars = obj.__vars;
      }
      EventMgr.trigger('ajaxResponse', obj);
      EventMgr.trigger('tabLoadingHide', { tabId: obj.tabId });
    }
  },

  //inspector collapsed
  inspectorCollapseHandler = function inspectorCollapseHandler(e) {
    var formWrapper = $formWrapper();
    if (App.Dom.hasClass(formWrapper, 'collapsed')) {
      App.Dom.removeClass(formWrapper, 'collapsed');
      App.Dom.addClass(formWrapper, 'uncollapsed');
    } else {
      App.Dom.addClass(formWrapper, 'collapsed');
      App.Dom.removeClass(formWrapper, 'uncollapsed');
    }
    e.preventDefault();
  },

  //close inspector form
  closeForm = function closeForm(e) {
    $formWrapper().style.display = 'none';
    if (e) {
      e.preventDefault();
    }
  },
      closeModalForm = function closeModalForm() {
    closeForm();
  },
      formWrapper,
      moveObj = {},

  //inspector form drag & drop
  inspectorDragHandler = function inspectorDragHandler(e) {
    e.preventDefault();
    document.onmousemove = inspectorMove;
    document.onmouseup = inspectorDrop;

    formWrapper = $formWrapper();
    moveObj.defX = parseInt(formWrapper.style.right, 10) || 0;
    moveObj.defY = parseInt(formWrapper.style.top, 10) || 0;
    moveObj.shiftX = e.clientX;
    moveObj.shiftY = e.clientY;
    moveObj.width = formWrapper.offsetWidth;
    moveObj.maxTop = window.innerHeight - 35;
    moveObj.maxRight = window.innerWidth - moveObj.width;
    moveObj.minRight = 50 - moveObj.width;
  },
      inspectorMove = function inspectorMove(e) {
    var x = moveObj.shiftX - e.clientX + moveObj.defX,
        y = -(moveObj.shiftY - e.clientY) + moveObj.defY;
    if (y < 0) {
      y = 0;
    }
    if (y > moveObj.maxTop) {
      y = moveObj.maxTop;
    }

    if (x < moveObj.minRight) {
      x = moveObj.minRight;
    }
    if (x > moveObj.maxRight) {
      x = moveObj.maxRight;
    }
    formWrapper.style.right = x + 'px';
    formWrapper.style.top = y + 'px';
  },
      inspectorDrop = function inspectorDrop(e) {
    document.onmousemove = null;
    document.onmouseup = null;
    moveObj = {};
  };

  return {
    init: init
  };
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Builder.js.map

'use strict';

/**
 * check restart
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
**/
App.CheckRestart = function (window, $, EventMgr) {
  'use strict';

  var bootTime,
      pageInfo = window.pageInfo;

  function checkRestart(e, data) {
    if (!data.bootTime || data.bootTime === bootTime) {
      setTimeout(function () {
        var param = { func: 'keepalive' };
        EventMgr.trigger('ajaxRequest', {
          url: pageInfo.url,
          param: param,
          outtype: 'json',
          trfunc: 'checkRestart',
          failfunc: 'checkRestart',
          queue: 'noqueue' });
      }, 1500);
    } else {
      $('#b-overlay').fadeOut(300);
      $('#b-progressbar').fadeOut(300);
    }
  }

  function startCheckRestart(e, data) {
    bootTime = data.bootTime;
    var param = { func: 'keepalive' };
    EventMgr.trigger('ajaxRequest', {
      url: pageInfo.url,
      param: param,
      outtype: 'json',
      trfunc: 'checkRestart',
      failfunc: 'checkRestart',
      queue: 'noqueue' });
    $('#b-overlay').fadeIn(300);
    $('#b-progressbar').fadeIn(300);
  }

  function init() {
    EventMgr.bind('startCheckRestart', startCheckRestart);
    EventMgr.bind('checkRestart', checkRestart);
  }
  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.CheckRestart.js.map

'use strict';

/**
 * TinyMCE connector
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 **/

App.TinyMCE = function (window, $, EventMgr, App) {
  'use strict';

  var CACHE = {},
      mainWrapperSelector = '#main-wrapper';

  function cleanCache(tabId) {
    if (CACHE[tabId] && window.tinymce) {
      var l = CACHE[tabId].length,
          editors = window.tinymce.editors,
          eLen = editors.length,
          eLenTmp,
          id;

      while (l--) {
        id = CACHE[tabId][l];
        eLenTmp = eLen;
        while (eLenTmp--) {
          if (editors[eLenTmp].id === id) {
            EventMgr.trigger('removeDatafromLocalStorage', { id: id });
            editors[eLenTmp].remove();
          }
        }
      }
      delete CACHE[tabId];
    }
  }
  /**
   * Обновляем контент из вне, по сетвалуес например
   * d = { id, content };
   */
  function setContent(e, d) {
    var editors = window.tinymce.editors,
        l = editors.length;
    while (l--) {
      if (editors[l].id === d.id) {
        editors[l].setContent(d.content);
      }
    }
  }

  function cleanCacheWrapper(e, data) {
    var tabId = data.tabId;
    cleanCache(tabId);
  }

  function initEditor(elems) {
    appendEditor(elems);
  }

  function appendEditor(elems) {
    if (!elems) {
      return;
    }
    var l = elems.length,
        id,
        tabId,
        height,
        TOOLBAR_HEIGHT = 35 + 34 + 37,
        myplugin;

    while (l--) {
      myplugin = '';
      id = elems[l].getAttribute('id');
      tabId = elems[l].getAttribute('data-tabid');
      height = elems[l].offsetHeight - TOOLBAR_HEIGHT;
      //check for needs plugin
      if (window.localStorage && window.localStorage.getItem(id)) {
        myplugin = 'isp_bill_macro';
      }
      /* jslint loopfunc:true */
      window.tinymce.init({
        selector: '#' + id,
        language: pageInfo.lang,
        resize: false,
        height: height,
        relative_urls: false,
        convert_urls: false,
        setup: function setup(ed) {
          ed.on('blur', function (e) {
            ed.save();
            $('#' + ed.id).trigger('change');
          });
        },
        plugins: ['advlist autolink lists link image charmap print preview anchor', 'searchreplace visualblocks code fullscreen', 'insertdatetime media table contextmenu paste ' + myplugin],
        toolbar: 'insertfile undo redo pastetext | fontselect | fontsizeselect | styleselect | bold italic |' + ' alignleft aligncenter alignright alignjustify |' + ' bullist numlist outdent indent | link image | ' + myplugin
      });
      /* jslint loopfunc:false */
      CACHE[tabId].push(id);
    }
  }

  function loadEditorScript(elems) {
    var file = '/manimg/common/tinymce/tinymce.min.js';
    App.Common.required(file, initEditor, elems);
  }

  function loadEditor(e, data) {
    var tabId = data.tabId,
        editor,
        textareas;
    cleanCache(tabId);
    CACHE[tabId] = [];
    textareas = $('#cont-' + tabId + ' .b-text-editor');
    if (textareas.length > 0) {
      if (typeof window.tinymce !== 'undefined') {
        appendEditor(textareas);
      } else {
        loadEditorScript(textareas);
      }
    }
  }

  function syncContent(e, data) {
    var tabId = this.getAttribute('data-tabid');
    if (CACHE[tabId] && window.tinymce) {
      var l = CACHE[tabId].length,
          editors = window.tinymce.editors,
          eLen = editors.length,
          eLenTmp,
          id;

      while (l--) {
        id = CACHE[tabId][l];
        eLenTmp = eLen;
        while (eLenTmp--) {
          if (editors[eLenTmp].id === id) {
            editors[eLenTmp].save();
          }
        }
      }
    }
  }

  function saveVariablesForPlugin(e, data) {
    var tabId = data.tabId,
        id = data.name + '-' + tabId;
    EventMgr.trigger('writeDatatoLocalStorage', { id: id, data: data.vars });
  }

  function init() {
    EventMgr.bind('appendForm', loadEditor);
    EventMgr.bind('closeTabEvent', cleanCacheWrapper);
    EventMgr.on(mainWrapperSelector, '.i-button_type_ok, .i-button_type_setvalue', 'click', syncContent);
    EventMgr.bind('preSetValues', syncContent);
    EventMgr.bind('saveVarsTinyMCE', saveVariablesForPlugin);
    EventMgr.bind('TinyMCE_setContent', setContent);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.TinyMCE.js.map

'use strict';

/**
 * Form model watcher
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} API
 */
/*global App: true*/
App.FormWatcher = function (window, $, EventMgr, App) {
  'use strict';

  //change form model

  function changeState(data) {
    var value = data.field.value,
        tabObj = data.tabObj,
        name = data.field.getAttribute('name');
    if (tabObj && tabObj.formModel && tabObj.formModel[name]) {
      if (tabObj.formModel[name].defValue === value) {
        tabObj.formModel[name].isChanged = false;
      } else {
        tabObj.formModel[name].isChanged = true;
      }
      tabObj.formModel[name].value = value;
    }
  }

  function init() {
    EventMgr.addHook('formFieldChanged', changeState);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.FormWatcher.js.map

'use strict';

/**
 *  ConfirmBox module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
/*global App:true*/
/*global EventMgr:true*/
/*global $:true*/
App.ConfirmBox = function (window, $, EventMgr, App) {
  'use strict';

  var callbackOk,
      callbackCancel,
      args,
      checkbox,

  //show ConfirmBox Flag
  modalActive = false,
      ACTIVE_CLASS = 'active-modal';
  //ConfirmBox selector
  function $confirmBox() {
    return App.u.selectorCache('#modal');
  }
  //ConfirmBox message selector
  function $confirmBoxMessage() {
    return App.u.selectorCache('#modal_message');
  }
  //ConfirmBok OK button selector
  function $confirmBoxOk() {
    return App.u.selectorCache('#modal_ok');
  }
  //ConfirmBox Cancel button selector
  function $confirmBoxCancel() {
    return App.u.selectorCache('#modal_cancel');
  }
  //ConfirmBox form area
  function $confirmBoxForm() {
    return App.u.selectorCache('#modal_form');
  }
  //BODY selector
  function $body() {
    return App.u.selectorCache('body');
  }
  //detect postion nearest trget elem
  function detectPosition(self) {
    var $self = $(self),
        PADDING = 10,
        CONFIRMBOXWIDTH = 420,
        offset = $self.offset(),
        selfHeight = $self.height(),
        $confimBoxLocal = $confirmBox(),
        confirmBoxHeight = $confimBoxLocal.height(),
        windowWidth = window.innerWidth,
        windowHeight = window.innerHeight,
        top = offset.top + selfHeight + PADDING,
        left = offset.left - 137,
        defTop = windowHeight / 2 - selfHeight / 2,
        defLeft = windowWidth / 2 - CONFIRMBOXWIDTH / 2;
    //check for bottom border
    if (top + confirmBoxHeight > windowHeight) {
      top = windowHeight - confirmBoxHeight - selfHeight - 2 * PADDING;
    } else if (top < 0) {
      top = 0 + PADDING;
    }
    //check for right border
    if (left + CONFIRMBOXWIDTH > windowWidth) {
      left = windowWidth - CONFIRMBOXWIDTH;
    } else if (left < 0) {
      left = 0 + PADDING;
    }
    if (defTop - top > 320 || defLeft - left > 320) {
      //set new position
      $confimBoxLocal.css({
        top: top,
        left: left,
        marginLeft: 0,
        marginTop: 0
      });
    }
  }
  //Show ConfirmBox
  function confirmBoxShow(e, data) {
    var text = data.text,
        self = data.self;
    checkbox = data.checkbox || null;
    callbackOk = data.callbackOk || null;
    callbackCancel = data.callbackCancel || null;
    args = data.args || [];
    $body().addClass(ACTIVE_CLASS);
    if (data.warning) {
      $confirmBox().addClass('modal-with-warning');
      text = pageInfo.messages.warning + "</br>" + text;
    }
    $confirmBoxMessage().html(window.filterXSS(text));
    if (checkbox) {
      $confirmBoxForm().html(templates.formItemCheckbox({
        id: 'confirmbox',
        name: 'confirmcheckbox',
        desc: checkbox.msg,
        value: 'off',
        attrInput: 'id="confirmcheckbox"',
        dependFields: 'b-checkbox__wrapper_for_confirmbox l-form__row_type_checkbox'
      }));
    } else {
      $confirmBoxForm().html('');
    }
    if (self) {
      detectPosition(self);
    }
    $confirmBox().show();
    modalActive = true;
  }
  //Reset confirmBox settings
  function resetSettings() {
    callbackCancel = null;
    callbackOk = null;
    modalActive = false;
    checkbox = null;
    $confirmBox().css({
      top: '',
      left: '',
      marginLeft: '',
      marginTop: ''
    });
    $confirmBox().removeClass('modal-with-warning');
  }
  //OK Handler
  function confirmOkHandler(e) {
    if (modalActive === true) {
      $body().removeClass(ACTIVE_CLASS);
      $confirmBox().hide();
      if (App.u.isFunction(callbackOk)) {
        callbackOk.apply(window, args);
      }
      if (checkbox && App.u.isFunction(checkbox.cb)) {
        checkbox.cb.apply(window, [$('#confirmcheckbox').val()]);
      }
      resetSettings();
    }
  }
  //Cancel Handler
  function confirmCancelHandler(e) {
    if (modalActive === true) {
      $body().removeClass(ACTIVE_CLASS);
      $confirmBox().hide();
      if (App.u.isFunction(callbackCancel)) {
        callbackCancel.apply(window, args);
      }
      $confirmBoxForm().html('');
      resetSettings();
      return true;
    }
  }

  function init() {
    EventMgr.bind('confirmBoxShow', confirmBoxShow);
    EventMgr.obind($confirmBoxOk(), 'click', confirmOkHandler);
    EventMgr.obind($confirmBoxCancel(), 'click', confirmCancelHandler);
    // EventMgr.bind('escKeyUp', confirmCancelHandler);
    EventMgr.addToTriggerStack('escKeyUp', confirmCancelHandler, 0);
    EventMgr.bind('enterKeyUp', confirmOkHandler);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ConfirmBox.js.map

'use strict';

/**
 *  Модуль.
 *  ваш К.О.
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} API
 */
App.HorizScrollControl = function (window, $, EventMgr, App) {
  'use strict';

  var CACHE = {};

  function bindHorizScrollControll(e, data) {
    var $leftBtn = $(data.leftBtn),
        $rightBtn = $(data.rightBtn),
        $innerBox = $(data.innerBox),
        $actElem = $(data.actElem),
        id = data.id,
        step = data.step;

    var sc = new ScrollControl({
      leftBtn: $leftBtn,
      rightBtn: $rightBtn,
      innerBox: $innerBox,
      actElem: $actElem,
      step: step
    });
    sc.init();
    CACHE[id] = sc;
  }

  function updateHorizScrollControll(e, data) {
    var id = data.id;
    if (CACHE[id] && CACHE[id].update) {
      CACHE[id].update();
    }
  }

  var ScrollControl = function ScrollControl(options) {
    this.leftBtn = options.leftBtn;
    this.rightBtn = options.rightBtn;
    this.innerBox = options.innerBox;
    this.outterBox = this.innerBox.parent();
    this.actElem = options.actElem;
    this.step = options.step || 150;
  };

  ScrollControl.fn = ScrollControl.prototype;

  ScrollControl.fn.init = function () {
    this.leftBtn.addClass('b-hsc__btn-left');
    this.rightBtn.addClass('b-hsc__btn-right');
    this.leftBtn.bind('click', $.proxy(this.moveLeft, this));
    this.rightBtn.bind('click', $.proxy(this.moveRight, this));
    $(window).bind('resize', $.proxy(this.update, this));
    this.getWidth();
    this.moveToActElem();
    this.checkPosition();
  };

  ScrollControl.fn.update = function () {
    var self = this;
    clearTimeout(this.updTimeout);
    this.updTimeout = setTimeout(function () {
      self.getWidth();
      self.moveToActElem();
      self.checkPosition();
    }, 300);
  };

  ScrollControl.fn.moveRight = function (e) {
    e.preventDefault();
    var curLeft = parseFloat(this.innerBox.css('marginLeft'));
    if (isNaN(curLeft)) {
      curLeft = 0;
    }
    curLeft -= this.step;
    if (curLeft < this.maxLeft) {
      curLeft = this.maxLeft;
    }
    var self = this;
    this.innerBox.animate({
      marginLeft: curLeft + 'px'
    }, 150, function () {
      self.checkPosition();
    });
  };

  ScrollControl.fn.moveLeft = function (e) {
    e.preventDefault();
    var curLeft = parseFloat(this.innerBox.css('marginLeft'));
    if (isNaN(curLeft)) {
      curLeft = 0;
    }
    curLeft += this.step;
    if (curLeft > 0) {
      curLeft = 0;
    }
    var self = this;
    this.innerBox.animate({
      marginLeft: curLeft + 'px'
    }, 150, function () {
      self.checkPosition();
    });
  };

  ScrollControl.fn.getWidth = function () {
    this.outterBoxWidth = this.outterBox.width();
    this.innerBoxWidth = this.innerBox.width();
    this.maxLeft = this.outterBoxWidth - this.innerBoxWidth;
    this.overWidth = this.maxLeft < 0;
    this.step = Math.ceil(this.innerBoxWidth / Math.floor(this.innerBoxWidth / this.step));
    if (isNaN(this.step)) {
      this.step = 150;
    }
  };

  ScrollControl.fn.moveToActElem = function () {
    if (this.actElem.length > 0 && this.overWidth) {
      this.actElemWidth = this.actElem.width();
      var offsetLeft = this.actElem.position().left,
          rightPoint = this.actElemWidth + offsetLeft,
          overLeft = this.outterBoxWidth - rightPoint;
      if (overLeft < 0) {
        var mLeft = parseInt(this.innerBox.css('marginLeft'), 10) + overLeft;
        mLeft = Math.ceil(mLeft / this.step) * this.step - this.step;
        if (mLeft < this.maxLeft) {
          mLeft = this.maxLeft;
        }
        this.innerBox.css('margin-left', mLeft + 'px');
      }
    }
  };

  ScrollControl.fn.checkPosition = function () {
    this.outterBox.removeClass('b-hsc_overwidth_right b-hsc_overwidth_left' + ' b-hsc_overwidth_full');
    if (this.outterBoxWidth < this.innerBoxWidth) {
      //need to buttons
      var marginLeft = parseInt(this.innerBox.css('marginLeft'), 10);
      if (marginLeft === 0) {
        //show right btn
        this.outterBox.addClass('b-hsc_overwidth_right');
      } else if (marginLeft === this.maxLeft) {
        //show left btn
        this.outterBox.addClass('b-hsc_overwidth_left');
      } else {
        //show both btn
        this.outterBox.addClass('b-hsc_overwidth_full');
      }
    }
  };

  function clearCache(e, data) {
    var tabId = data.tabId;
    if (CACHE && CACHE[tabId]) {
      delete CACHE[tabId];
      if (CACHE['filter-' + tabId]) {
        delete CACHE['filter-' + tabId];
      }
    }
  }

  function init() {
    EventMgr.bind('bindHorizScrollControl', bindHorizScrollControll);
    EventMgr.bind('updateHorizScrollControl', updateHorizScrollControll);
    EventMgr.bind('closeTabEvent', clearCache);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.HorizScrollControl.js.map

'use strict';

/**
 * Dashboard List after insert update
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.DashboardList = function (window, $, EventMgr, App) {
  'use strict';

  var minimizeColSel = '.i-minimize-col';

  function fitCol(e, data) {
    var blockId = data.tabId,
        $block = $('#' + blockId),
        $table = $block.find('.list_table'),
        $minimizedCol = $table.find(minimizeColSel),
        tableWidth,
        blockWidth,
        dfWidth,
        colWidth;
    $table.removeClass('b-list_overflow_ellipsis');
    $minimizedCol.css('width', '');
    if ($minimizedCol.length) {
      tableWidth = $table.width();
      blockWidth = $block.width();
      if (tableWidth > blockWidth) {
        dfWidth = tableWidth - blockWidth;
        colWidth = $minimizedCol.width();
        $minimizedCol.css('width', colWidth - dfWidth + 'px');
        $table.addClass('b-list_overflow_ellipsis');
        EventMgr.trigger('updateScroll', { id: blockId + '-scrollwrapper' });
      }
    }
  }

  function init() {
    EventMgr.bind('appendDashList', fitCol);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.DashboardList.js.map

'use strict';

/**
 * Functions for desktop Application
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.Desktop = function (window, $, EventMgr, App) {
  'use strict';

  function scrollTopWindow() {
    window.scrollToTopLeft();
  }

  function init() {
    EventMgr.obind($(window), 'scroll', scrollTopWindow);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.Desktop.js.map

'use strict';

/**
 *  Message templates
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.MessageTempl = function (window, $, EventMgr, App) {
  'use strict';

  var msgTemplLink = '.b-msg-templ__link';

  function $content() {
    return $('#main-wrapper');
  }

  function $body() {
    return $('body');
  }

  function showFullMsg() {
    var ind = this.getAttribute('data-ind');
    $('.b-msg-templ__title-content-item_ind_' + ind).show();
  }

  function hideFullMsg() {
    var ind = this.getAttribute('data-ind');
    $('.b-msg-templ__title-content-item_ind_' + ind).hide();
  }
  function frRevstring(str) {
    var retStr = '';
    for (var i = str.length - 1; i > -1; i--) {
      retStr += str.substr(i, 1);
    }
    return retStr;
  }

  function getMsgTempl(e) {
    e.preventDefault();
    var id = this.getAttribute('data-id'),
        msgTempl = $('#b-msg-templ-' + id).find('.b-msg-templ'),
        tabId = this.getAttribute('data-tabid'),
        textarea = App.Dom.byId(id);
    var str = textarea.value,
        pos = str.length === 0 ? 0 : App.u.getCaretPosition(textarea),
        start = str.lastIndexOf('\n', pos - 1) + 1,
        s = str.slice(start, pos),
        len = s.length;
    s = frRevstring(s);
    var sm = s.match(/(.*?)[\.\?\!] */);
    s = frRevstring(!sm ? s : sm[1]);
    s = s.replace(/^ */, '');
    if (msgTempl.length > 0) {
      msgTempl.remove();
    } else {
      var param = $('#frm-' + tabId).serializeObject();
      /* jslint camelcase: false */
      param.source_func = param.func;
      /* jslint camelcase: true */
      param.func = 'anstempl.get';
      /* jslint camelcase: false */
      param.source_string = s;
      /* jslint camelcase: true */
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: {
          id: id
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'msgTemplResp'
      });
    }
  }

  function closeMsgTemlList(e) {
    var $msgTemlList = $('.tab-content_st_active .b-msg-templ');
    $msgTemlList.remove();
    $body().off('click.msgTempl', closeMsgTemlList);
  }

  function renderMsgTemplList(e, data) {
    var templList = data.savedmessage,
        id = data.id;

    var html = templates.msgTemplList({ templList: templList, id: id });
    $('#b-msg-templ-' + id).append(html);
    setTimeout(function () {
      $body().on('click.msgTempl', closeMsgTemlList);
    }, 1);
  }

  function insertMessage(e) {
    e.preventDefault();
    var ind = this.getAttribute('data-ind'),
        id = this.getAttribute('data-id'),
        textMsg = $('.b-msg-templ__title-content-item_ind_' + ind).text(),
        targetId = $(this).closest('.b-msg-templ').attr('data-target');
    var elem = App.Dom.byId(targetId);
    if (elem) {
      elem.focus();
      App.u.insertStringAfterCaret(elem, textMsg, true);
      EventMgr.trigger('ajaxRequest', {
        param: {
          func: 'anstempl.stat',
          id: id
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'DoNothing'
      });
    }
    var msgTempl = $('#b-msg-templ-' + targetId).find('.b-msg-templ');
    msgTempl.remove();
    $body().off('click.msgTempl', closeMsgTemlList);
  }

  function init() {
    EventMgr.on($content(), msgTemplLink, 'click', getMsgTempl);
    EventMgr.bind('msgTemplResp', renderMsgTemplList);
    EventMgr.on($content(), '.b-msg-templ__title-list-item', 'mouseenter', showFullMsg);
    EventMgr.on($content(), '.b-msg-templ__title-list-item', 'mouseleave', hideFullMsg);
    EventMgr.on($content(), '.b-msg-templ__title-list-item', 'click', insertMessage);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.MessageTempl.js.map

'use strict';

/**
 * Font setting module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.FontSettings = function (window, $, EventMgr, App) {
  'use strict';

  function createLink(font) {
    var link = document.createElement('link');
    link.setAttribute('rel', 'stylesheet');
    link.setAttribute('type', 'text/css');
    link.setAttribute('href', 'http://fonts.googleapis.com/css?family=' + font);
    document.head.appendChild(link);
  }

  function setFontSize(e) {
    var targetview = this.getAttribute('data-targetview'),
        val = this.value,
        tabId = this.getAttribute('data-tabid'),
        elem = App.Dom.byId(tabId + '-' + targetview);
    if (elem) {
      elem.style.fontSize = val + 'px';
      elem.style.lineHeight = val + 'px';
    }
  }

  function setFontFamily(e) {
    var targetview = this.getAttribute('data-targetview'),
        val = this.value,
        tabId = this.getAttribute('data-tabid'),
        elem = App.Dom.byId(tabId + '-' + targetview);
    if (elem) {
      elem.style.fontFamily = val;
      if (elem.style.fontFamily === '') {
        createLink(val);
        setTimeout(function () {
          elem.style.fontFamily = val;
        }, 1000);
      }
    }
  }

  function checkFontSettings(e, data) {
    var tabId = data.tabId,
        $actTab = $('#cont-' + tabId);

    $actTab.find('.i-font-family-control').trigger('change');
    $actTab.find('.i-font-size-control').trigger('change');
  }

  function $c() {
    return $('.i-list-wr');
  }

  function init() {
    EventMgr.on($c(), '.i-font-family-control', 'change', setFontFamily);
    EventMgr.on($c(), '.i-font-size-control', 'change', setFontSize);
    EventMgr.bind('appendForm', checkFontSettings);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.FontSettings.js.map

'use strict';

/**
 * Module for report about mistake in content
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.ContentMistake = function (window, $, EventMgr, App) {
  'use strict';

  var CTRLKEY = 17,
      ENTERKEY = 13,
      mistakeObject = {};

  function showForm(mistakeObject) {
    $('body').addClass('active_mistake_form');
    $('#modal_mistake_textarea').val(mistakeObject.content);
    $('#modal_mistake_input').val(mistakeObject.msgName + ', ' + mistakeObject.funcName);
  }

  function closeForm() {
    $('body').removeClass('active_mistake_form');
    $('#modal_mistake_textarea').val('');
    $('#modal_mistake_input').val('');
    $('#reportmistakebox').val('on');
  }

  function submitForm() {
    var content = $('#modal_mistake_textarea').val(),
        devReport = $('#reportmistakebox').val();
    if (content !== mistakeObject.content) {
      EventMgr.trigger('ajaxRequest', {
        param: {
          msg: mistakeObject.msgName,
          module: mistakeObject.funcName,
          content: content,
          func: 'editmsg',
          notify: devReport
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'DoNothing',
        queue: 'noqueue'
      });
      if (mistakeObject.node) {
        mistakeObject.node.innerHTML = content;
      }
    }
    closeForm();
  }

  function detectTextSelection() {
    mistakeObject = {};
    var content, node, msgName, selection, funcName, selectedContent, targetNode;
    if (typeof window.getSelection !== 'undefined') {
      selection = window.getSelection();
      selectedContent = selection.toString();
      if (selectedContent === '') {
        return true;
      }
      //try to find
      if (selection.rangeCount > 0) {
        node = selection.getRangeAt(0).startContainer.parentNode;
        if (node) {
          msgName = node.getAttribute('data-mn');
          funcName = node.getAttribute('data-fn');
          content = node.innerHTML;
          targetNode = node;
          //try to find in children
          if (!msgName) {
            $(node).children().each(function () {
              if (this.getAttribute('data-mn')) {
                msgName = this.getAttribute('data-mn');
                funcName = this.getAttribute('data-fn');
                content = this.innerHTML;
                targetNode = node;
                return false;
              }
            });
          }
          //try to find in parents
          if (!msgName) {
            var $parentNode = $(node).closest('[data-mn]');
            msgName = $parentNode.attr('data-mn');
            if (msgName && $parentNode.length) {
              content = $parentNode[0].innerHTML;
            }
          }
          if (msgName && !funcName) {
            funcName = $(node).closest('.tab-content').attr('data-func');
          }
          if (!funcName) {
            funcName = $('.tab-content_st_active').attr('data-func');
          }
        }
      }
    }
    mistakeObject.content = content;
    mistakeObject.msgName = msgName;
    mistakeObject.funcName = funcName;
    mistakeObject.node = targetNode;
    if (!msgName) {
      EventMgr.trigger('showAlert', { 'msg': pageInfo.mistakeNosel });
    } else {
      showForm(mistakeObject);
    }
  }

  function keyUpHandler(e) {
    var codeKey = e.which || e.keyCode;
    if (codeKey === ENTERKEY && (e.ctrlKey || e.metaKey)) {
      detectTextSelection();
    }
  }

  function init() {
    if (pageInfo.userLevel - 0 >= 29) {
      EventMgr.obind($(document), 'keyup', keyUpHandler);
      EventMgr.obind('#modal_mistake_cancel', 'click', closeForm);
      EventMgr.obind('#modal_mistake_ok', 'click', submitForm);
    }
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ContentMistake.js.map

'use strict';

/**
 *  Module provide coping link to buffer for current form
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.CopyToBuffer = function (window, $, EventMgr, App) {
  'use strict';

  function addLinkHandler(e, data) {
    var tabId = data.tabId,
        elem = App.Dom.byId('permalink-' + tabId),
        client;
    if (!elem) {
      return;
    }
    client = new ZeroClipboard(elem);

    client.on('aftercopy', function (e) {
      EventMgr.trigger('showAlert', {
        msg: window.pageInfo.linkCopied,
        closeTimeout: 1500
      });
    });
  }

  function checkFlash() {
    var hasFlash = false;
    try {
      var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
      if (fo) {
        hasFlash = true;
      }
    } catch (e) {
      if (navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash'] !== undefined && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
        hasFlash = true;
      }
    }
    return hasFlash;
  }

  function preventClick(e) {
    e.preventDefault();
    if (!checkFlash()) {
      EventMgr.trigger('showAlert', {
        msg: '<div>' + window.pageInfo.linkToCopy + '</div>' + '<textarea class="b-textarea b-modal-mistake__textarea" readonly>' + this.getAttribute('data-clipboard-text') + '</textarea>'
      });
    }
  }

  function init() {
    if (window.ZeroClipboard && checkFlash()) {
      EventMgr.bind('appendForm,appendList,appendReport,appendMap', addLinkHandler);
    }
    EventMgr.on($('#main-wrapper'), '.b-permalink', 'click', preventClick);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.CopyToBuffer.js.map

'use strict';

/**
 *  TestCases
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.TestCases = function (window, $, EventMgr, App) {
  'use strict';

  var formLinkSel = '.testmode__form-link',
      contentWrapperSel = '#main-wrapper',
      testModeFieldSel = '.i-testmode-field',
      inputTextareaSel = '.tab-content_st_testmode input, .tab-content_st_testmode textarea',
      iconSelector = '#testmode__list-icon';

  function $mainWrapper() {
    return App.u.selectorCache('.i-list-wr');
  }

  function formLinkHandler(e) {
    e.preventDefault();
    var fieldName = this.getAttribute('data-elid'),
        tabId = this.getAttribute('data-tabid'),
        func = $('#cont-' + tabId).attr('data-func'),
        $self = $(this),
        value = $('#cont-' + tabId + ' input[type=hidden][name="' + fieldName + '"],' + '#cont-' + tabId + ' input[type=text][name="' + fieldName + '"],' + '#cont-' + tabId + ' textarea[name=' + fieldName + ']').val();
    //if it html/textdata
    if (value === undefined) {
      //textdata
      value = $('#' + tabId + '-' + fieldName + '-inner').html();
      if (!value) {
        value = $('#' + tabId + '-' + fieldName).html();
      }
    }

    var param = {
      func: 'test.check',
      fieldname: fieldName,
      ffunc: func,
      value: value
    };

    if ($self.hasClass('b-elem_style_gracescale')) {
      $self.removeClass('b-elem_style_gracescale');
    } else {
      $self.addClass('b-elem_style_gracescale');
      param.cancel = 'yes';
    }

    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: { sourceTab: tabId },
      type: 'get',
      outtype: 'json',
      trfunc: 'DoNothing',
      queue: ''
    });
  }
  var field, iconLeftPos;

  function $icon() {
    return App.Dom.byId('testmode__list-icon');
  }

  function showIcon() {
    var self = $(this),
        offset = self.offset(),
        left = offset.left,
        top = offset.top,
        width = this.offsetWidth,
        fastFilterIconElem = $icon(),
        isEditable = self.hasClass('editable') || self.hasClass('i-filter-field') || self.parent().hasClass('i-filter-field'),
        marginLeft = 22;
    field = self;
    if (isEditable) {
      marginLeft += 22;
    }
    if (fastFilterIconElem.className.match('active')) {
      return;
    }
    iconLeftPos = left + width - marginLeft;
    fastFilterIconElem.style.left = iconLeftPos + 'px';
    fastFilterIconElem.style.top = top + 'px';
    fastFilterIconElem.style.display = 'block';
  }

  function hideIcon(e) {
    var fastFilterIconElem = $icon();
    if (!fastFilterIconElem.className.match('active')) {
      fastFilterIconElem.style.display = 'none';
    }
  }

  function selfShowIcon() {
    var fastFilterIconElem = $icon();
    fastFilterIconElem.style.display = 'block';
  }

  function addFieldFromFormList(e, data) {
    var value = field.html(),
        $tabCont = field.closest('.tab-content'),
        func = $tabCont.attr('data-func'),
        $list = field.closest('.b-form-list__table'),
        $tr = field.closest('.b-form-list__col'),
        keyName = $list.attr('data-key'),
        fieldName = $list.attr('data-name'),
        tabId = $tabCont.attr('data-tabid'),
        elid = $('#' + tabId + '-elid').val(),
        colName = $tr.attr('data-colname');

    var param = {
      func: 'test.check',
      colname: colName,
      ffunc: func,
      elid: elid,
      keyname: keyName,
      value: value,
      fieldname: fieldName
    };
    checkTestRequest(param, field);
  }

  function addFieldFromInfoList(e, data) {
    var value = field.html(),
        $list = field.closest('.block-table'),
        func = $list.attr('data-block-func'),
        fieldName = field.attr('data-name');

    var param = {
      func: 'test.check',
      ffunc: func,
      value: value,
      fieldname: fieldName
    };
    checkTestRequest(param, field);
  }

  function addField(e, data) {
    //check for formlist
    if (field.hasClass('b-form-list__data')) {
      addFieldFromFormList(e, data);
      return;
    } else if (field.hasClass('b-infolist__col_type_value')) {
      addFieldFromInfoList(e, data);
      return;
    }
    var value = field.find('.b-list__table-col-content').html(),
        listRow = field.closest('.b-list__table-row'),
        elid = listRow.attr('data-elid'),
        keyName = listRow.attr('data-elkeyname'),
        index = field.closest('td').index(),
        fieldName = field.closest('table').find('th')[index].getAttribute('data-colname'),
        $tabCont = field.closest('.tab-content'),
        tabId = $tabCont.attr('data-tabid'),
        func = $tabCont.attr('data-func'),
        rowIndex = listRow.attr('data-index'),
        props = field.find('.props'),
        propsString = '';
    props.each(function () {
      if (propsString !== '') {
        propsString += ',';
      }
      propsString += this.getAttribute('data-name');
      propsString += '=';
      var v = this.getAttribute('data-value');
      if (v) {
        propsString += this.getAttribute('data-value');
      }
    });
    if (data.__tabs[tabId] && data.__tabs[tabId].__content) {
      if (data.__tabs[tabId].__content[rowIndex] && data.__tabs[tabId].__content[rowIndex][fieldName] && data.__tabs[tabId].__content[rowIndex][fieldName].orig) {
        value = data.__tabs[tabId].__content[rowIndex][fieldName].orig;
      }
    }
    var param = {
      func: 'test.check',
      colname: fieldName,
      ffunc: func,
      elid: elid,
      keyname: keyName,
      value: value
    };
    if (propsString) {
      /* jshint camelcase: false */
      param.p_value = propsString;
    }
    checkTestRequest(param, field);
  }

  function checkTestRequest(param, field) {
    if (field.hasClass('bg__green')) {
      field.removeClass('bg__green');
      param.cancel = 'yes';
    } else {
      field.addClass('bg__green');
    }
    //value @orig
    //unselect cancel=yes

    EventMgr.trigger('ajaxRequest', {
      param: param,
      invar: {},
      type: 'get',
      outtype: 'json',
      trfunc: 'DoNothing',
      queue: ''
    });
  }

  function removeChecker() {
    $(this).closest('.l-form__table-control').find('.testmode__form-link').remove();
  }

  function init() {
    EventMgr.on($mainWrapper(), formLinkSel, 'click', formLinkHandler);
    EventMgr.on($mainWrapper(), inputTextareaSel, 'change', removeChecker);
    $mainWrapper().append('<div class="testmode__list-icon" id="testmode__list-icon" style="display:none;"></div>');
    EventMgr.on($mainWrapper(), testModeFieldSel, 'mouseover', showIcon);
    EventMgr.on($mainWrapper(), testModeFieldSel, 'mouseout', hideIcon);
    EventMgr.obind(iconSelector, 'mouseout', hideIcon);
    EventMgr.obind(iconSelector, 'mouseover', selfShowIcon);
    //EventMgr.obind(iconSelector, 'click', addField);
    EventMgr.onwithdata($mainWrapper(), iconSelector, 'click', 'testColCheck', addField);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.TestCases.js.map

'use strict';

/**
 *  Модуль.
 *  ваш К.О.
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.TabDrag = function (window, $, EventMgr, App) {
  'use strict';

  var tabDragSel = '.tab-group',
      dragObj = {},
      MINLEFT = 0,
      MAXLEFT;

  function $content() {
    return $('#nav-tabs');
  }

  function makeShadow($target) {
    var width = $target.width(),
        height = $target.height(),
        $shadow = $('<li class="tab-group__shadow" style="width: ' + width + 'px;"></li>');
    dragObj.$shadow = $shadow;
    dragObj.width = width;
    dragObj.$obj.after(dragObj.$shadow);
  }

  function detectPosition($list) {
    var elems = [];
    $list.children().each(function () {
      if (this.id !== dragObj.obj.id && this.className !== 'tab-group__shadow') {
        var left = this.offsetLeft;
        elems.push({
          left: left,
          right: this.offsetWidth + left,
          self: this
        });
      }
    });
    dragObj.elems = elems;
  }

  function underElement(left, right) {
    var elems = dragObj.elems,
        l = elems.length,
        elem;
    while (l--) {
      //check for left elem
      if (left > elems[l].left && left < elems[l].right) {
        if (left < elems[l].left + (elems[l].right - elems[l].left) / 2) {
          elem = elems[l];
          elem.pos = 'before';
          break;
        }
      }
      //check for right
      if (right > elems[l].left && right < elems[l].right) {
        if (right > elems[l].left + (elems[l].right - elems[l].left) / 2) {
          elem = elems[l];
          elem.pos = 'after';
        }
        break;
      }
    }
    return elem;
  }

  function drag(e) {
    if ('which' in e && e.which === 3) {
      // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
      return false;
    } else if ('button' in e && e.button === 2) {
      // IE, Opera
      return false;
    }
    document.onmouseup = drop;
    document.onmousemove = move;

    var $self = $(this),
        $parent = $self.parent(),
        obj = this,
        left = obj.offsetLeft;

    dragObj.$obj = $self;
    dragObj.obj = this;
    dragObj.$parent = $parent;

    $self.addClass('tab-group_moving_yes');
    makeShadow($self);

    obj.style.left = left + 'px';
    obj.style.position = 'absolute';
    MAXLEFT = $parent.width() - dragObj.width;

    dragObj.y = e.clientY;
    dragObj.x = e.clientX;

    detectPosition($parent);

    e.preventDefault();
  }
  var timeId;

  function move(e) {
    var y = e.clientY,
        x = e.clientX,
        right,
        left,
        curX = x - dragObj.x,
        curY = y - dragObj.y;

    if (Math.abs(curX) < 10 && Math.abs(curY) < 10) {
      return;
    }
    dragObj.x = x;
    dragObj.y = y;

    left = parseInt(dragObj.obj.style.left, 10) + curX;
    left = left > MINLEFT ? left : MINLEFT;
    left = left < MAXLEFT ? left : MAXLEFT;
    right = left + dragObj.width;

    var elem = underElement(left, right);

    if (elem) {
      $(elem.self)[elem.pos](dragObj.$shadow);
      dragObj.cElem = elem;
      clearTimeout(timeId);
      timeId = setTimeout(function () {
        detectPosition(dragObj.$parent);
      }, 5);
    }

    dragObj.obj.style.left = left + 'px';

    e.preventDefault();
  }

  function drop(e) {
    //check moving elem
    if (dragObj.cElem) {
      $(dragObj.cElem.self)[dragObj.cElem.pos](dragObj.$obj);
      EventMgr.trigger('changeTabSortIndex', {
        s: dragObj.cElem.self.id, t: dragObj.obj.id });
    }
    dragObj.$shadow.remove();
    dragObj.$obj.removeClass('tab-group_moving_yes');
    dragObj.obj.style.position = "";
    //clear dragObj
    dragObj = {};
    document.onmouseup = null;
    document.onmousemove = null;
  }

  function init() {
    EventMgr.on($content(), tabDragSel, 'mousedown', drag);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.TabDrag.js.map

'use strict';

/**
 *  UsefulLinks Module
 *  It shows hint box with links form msg
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.UsefulLinks = function (window, $, EventMgr, App) {
  'use strict';

  var usefulLinksCrossSelector = '.i-userful-links-collapse',
      usefulLinksIcon = '.b-usefulLinks__icon';

  function $body() {
    return App.u.selectorCache('#main-wrapper');
  }

  function checkForLinks(e, data) {
    if (data && data.srcData && data.srcData.usefulLinks) {
      var content = data.srcData.usefulLinks,
          title = pageInfo.messages.usefulLinksTitle,
          tabId = data.tabId,
          type = data.srcData.type,
          html = templates.usefulLinks({
        content: window.htmlDecode(content),
        title: title }),
          targetWrapper,
          elem = window.document.createElement('div');
      $('#cont-' + tabId).addClass('tab-content_has_usefullinks');
      if (type === 'list') {
        targetWrapper = App.Dom.byId('ltwr-' + tabId);
      } else if (type === 'form') {
        targetWrapper = App.Dom.byId('form-scroll-in-' + tabId);
      }
      if (targetWrapper) {
        elem.innerHTML = html;
        targetWrapper.appendChild(elem);
      }
    }
  }

  function closeUsefulLinksByCross(e) {
    if (e) {
      e.preventDefault();
    }
    //set cookie, remove :
    $('#content').addClass('b-useful-links-flag_is_collapsed');
    if (window.localStorage) {
      window.localStorage.setItem('useful-links-flag-collapsed', true);
    }
  }

  function expandUsefulLinks(e) {
    if (e) {
      e.preventDefault();
    }
    $('#content').removeClass('b-useful-links-flag_is_collapsed');
    if (window.localStorage) {
      window.localStorage.setItem('useful-links-flag-collapsed', false);
    }
  }

  function init() {
    if (window.localStorage) {
      if (window.localStorage.getItem('useful-links-flag-collapsed') === 'true') {
        closeUsefulLinksByCross();
      }
    }
    EventMgr.bind('appendForm,appendList', checkForLinks);
    EventMgr.on($body(), usefulLinksCrossSelector, 'click', closeUsefulLinksByCross);
    EventMgr.on($body(), usefulLinksIcon, 'click', expandUsefulLinks);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.UsefulLinks.js.map

'use strict';

/**
 * App.InputMask wrapper for http://jasny.github.io/bootstrap/javascript/#inputmask
 *
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.InputMask = function (window, $, EventMgr, App) {
  'use strict';

  function bindInputMask(e, data) {
    var tabId = data.tabId;
    $('#frm-' + tabId).find('.i-input-mask').each(function () {
      var mask = this.getAttribute('data-mask');
      if (mask) {
        $(this).inputmask({
          mask: mask,
          showMaskOnHover: false
        });
      }
    });
  }

  function changeMask(e, data) {
    var value;
    if (data.elem && data.mask !== undefined) {
      if (data.mask === '') {
        //save value
        value = data.elem.value;
        $(data.elem).inputmask('remove');
        data.elem.value = value;
      } else {
        value = data.value;
        data.elem.setAttribute('data-mask', data.mask);
        $(data.elem).inputmask({
          mask: data.mask,
          showMaskOnHover: false
        });
        data.elem.value = value;
      }
    }
  }

  function init() {
    EventMgr.bind('appendForm', bindInputMask);
    EventMgr.bind('inputMaskChangeBySetvalues', changeMask);
  }
  return {
    init: init
  };
}(window, $, EventMgr, App, doT);
//# sourceMappingURL=App.InputMask.js.map

'use strict';

/**
 * Module provide filter with checkboxes for formlist`
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.FormListFilter = function (window, $, EventMgr, App) {
  'use strict';

  function $mainWrapper() {
    return $('#main-wrapper');
  }

  function filterListCallback(e, data) {
    var $filterWrapper = $(this).closest('.i-form-list__filter'),
        srcName = $filterWrapper.attr('data-srcname'),
        tabId = this.getAttribute('data-tabid'),
        $formList = $('#' + tabId + '-' + srcName);
    EventMgr.trigger('formListFilterHandler', {
      tabId: tabId,
      name: srcName,
      $formList: $formList,
      $filterWrapper: $filterWrapper });
    //filterListHandler($formList, $filterWrapper);
  }

  function filterListHandler(e, data) {
    var $formList = data.$formList,
        tabId = data.tabId,
        $filterWrapper = data.$filterWrapper,
        listName = data.name,
        $formRows = $formList.find('.row__has__tags');

    var $filterItems = $filterWrapper.find('input[type="hidden"]'),
        actFilter = [],
        actFilterLen = 0,
        hasCheckedFilters = false;

    //show elems
    $filterItems.each(function () {
      var name = this.getAttribute('name');
      if (this.value === 'on') {
        actFilter.push({ name: name, isChecked: true });
        actFilterLen++;
      } else {
        //actFilter.push({ name: name, isChecked: false });
      }
    });

    var hasTag,
        countFound = 0;
    for (var i = 0, l = $formRows.length; i < l; i++) {
      hasTag = false;
      if (actFilterLen !== 0) {
        $formList.addClass('b-form-list__table_filter_yes');
        $filterWrapper.addClass('b-form-list__filter_filter_yes');
        for (var j = 0; j < actFilterLen; j++) {
          if ($formRows[i] && $formRows[i].className.match(actFilter[j].name)) {
            hasTag = true;
            //break;
          } else {
            hasTag = false;
            break;
          }
        }
        if (!hasTag) {
          $formRows[i].style.display = 'none';
        } else {
          $formRows[i].style.display = '';
          countFound++;
        }
      } else {
        $formRows[i].style.display = '';
        $formList.removeClass('b-form-list__table_filter_yes');
        $filterWrapper.removeClass('b-form-list__filter_filter_yes');
      }
    }
    if (countFound === 0 && actFilterLen !== 0) {
      $filterWrapper.find('.b-form-list__filter-notfound').css('display', 'block');
    } else {
      $filterWrapper.find('.b-form-list__filter-notfound').css('display', '');
    }
    EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
  }

  function updateFilter(e, data) {
    var tabId = data.tabId,
        $filterLists = $('#cont-' + tabId + ' .i-form-list__filter'),
        $formList,
        srcName;
    $filterLists.each(function () {
      srcName = this.getAttribute('data-srcname');
      $formList = $('#' + tabId + '-' + srcName);
      EventMgr.trigger('formListFilterHandler', {
        tabId: tabId,
        name: srcName,
        $formList: $formList,
        $filterWrapper: $(this) });
      //filterListHandler($filterList, $(this));
    });
  }

  function resetFilter() {
    var $filterWrapper = $(this).closest('.i-form-list__filter'),
        tabId = $filterWrapper.attr('data-tabid'),
        $filterItems = $filterWrapper.find('input[type="hidden"]');
    $filterItems.each(function () {
      if (this.value === 'on') {
        $(this).closest('.b-checkbox__wrapper').find('.b-checkbox__control').trigger('click');
      }
    });
    EventMgr.trigger('updateScroll', { id: 'form-scroll-' + tabId });
  }

  function init() {
    EventMgr.on($mainWrapper(), '.b-form-list__filter input[type="hidden"]', 'change', filterListCallback);
    EventMgr.on($mainWrapper(), '.i-form-list__filter-clear', 'click', resetFilter);
    EventMgr.bind('setValuesDone', updateFilter);
    EventMgr.bind('formListFilterHandler', filterListHandler);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.FormListFilter.js.map

'use strict';

/**
 * Module provide image view
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.LightBoxProvider = function (window, $, EventMgr, App) {
  'use strict';

  var $mainWrapper = $('#main-wrapper'),
      loaded = false;

  function appendFakeItem(e, data) {
    $('body').append('<a id="b-lightbox-fake-link" data-lightbox="1" style="visibility: hidden;"></a>');
  }

  function checkForImage(e, data) {
    var tabId = data.tabId,
        imageForView = $('#cont-' + tabId + ' .b-image-for-view');
    if (imageForView.length > 0) {
      loadLib();
      imageForView.attr('data-lightbox', tabId + 'img');
    }
  }

  function checkForPreviewBtn(e, data) {
    var tabId = data.tabId;
    if (!loaded && $('.action-preview').length) {
      loadLib();
    }
  }

  function loadLib() {
    if (!loaded) {
      App.u.injectCss('/manimg/orion/lib/lightbox/css/lightbox.css');
      App.u.required('/manimg/orion/lib/lightbox/js/lightbox.min.js');
      loaded = true;
    }
  }

  function init() {
    EventMgr.bind('appendForm', checkForImage);
    EventMgr.bind('formSetValues', checkForImage);
    EventMgr.bind('appendList', checkForPreviewBtn);
    EventMgr.bind('loadPage', appendFakeItem);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.LightBoxProvider.js.map

'use strict';

/**
 * Module provide fixed field in form
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.FormFixedField = function (window, $, EventMgr, App) {
  'use strict';

  function fixedField(e, data) {
    var tabId = data.tabId;
    $('#cont-' + tabId).find('.i-form__row_fixed_yes').each(function (index) {
      var $self = $(this),
          $clone = $self.clone(),
          height = $self.height(),
          id = 'i' + new Date().getTime();
      $clone.addClass('b-form__row_visible_hidden');
      $clone.html('<td><div class="b-form__row-inner" id="' + id + '" style="height: ' + height + 'px;"></div></td>');
      $self.css('position', 'fixed').css('z-index', 10 - index).css('width', '100%');
      $self.attr('data-id', id);
      $self.after($clone);
    });
  }

  function updateFixedField(e, data) {
    var tabId = data.tabId;
    $('#cont-' + tabId).find('.i-form__row_fixed_yes').each(function () {
      var $self = $(this),
          height = $self.height(),
          id = this.getAttribute('data-id');
      $('#' + id).css('height', height + 'px');
    });
  }

  function init() {
    EventMgr.bind('appendForm', fixedField);
    EventMgr.bind('updateFixedField', updateFixedField);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.FormFixedField.js.map

'use strict';

/**
 * App.GroupEdit
 *
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.GroupEdit = function (window, $, EventMgr, App) {
  'use strict';

  function $content() {
    return $('.i-form-wr');
  }

  function inputHandler(e) {
    var $this = $(this);
    if (this.value === '') {
      //$this.addClass('b-input-mixed');
    } else if ($this.hasClass('b-input-mixed')) {
      $this.removeClass('b-input-mixed').removeClass('i-control-mixed');
      $this.attr('placeholder', '');
    }
  }

  function checkboxHandler(e) {
    var $this = $(this),
        $wrapper = $this.closest('.b-checkbox__wrapper');
    $this.removeClass('i-control-mixed');
    if ($wrapper.hasClass('b-checkbox_mixed_yes')) {
      $wrapper.removeClass('b-checkbox_mixed_yes');
      // $('#' + $this.attr('data-id')).removeClass('i-control-mixed');
    }
  }

  function selectHandler(e) {
    var $this = $(this),
        $wrapper = $this.closest('.b-myselect');
    $this.removeClass('i-control-mixed');
    if ($wrapper.hasClass('b-select_mixed_yes')) {
      $wrapper.removeClass('b-select_mixed_yes');
    }
  }

  function mSelectHandler(e) {
    var $this = $(this),
        $wrapper = $this.closest('.b-mselect');
    $this.removeClass('i-mselect_mixed_yes'), $unselectMsgNode = $wrapper.find('.b-mselect__item_msg_unselected');
    $unselectMsgNode.html($unselectMsgNode.attr('data-default-msg'));
    if ($wrapper.hasClass('b-mselect_mixed_yes')) {
      $wrapper.removeClass('b-mselect_mixed_yes');
    }
  }

  function textareaHandler() {
    var $this = $(this);
    if (this.value === '') {
      //$this.addClass('b-input-mixed');
    } else if ($this.hasClass('b-textarea-mixed')) {
      $this.removeClass('b-textarea-mixed').removeClass('i-control-mixed');
      $this.attr('placeholder', '');
    }
  }

  function radioHandler() {
    var $this = $(this),
        $wrapper = $this.closest('.b-radio');
    $this.removeClass('i-control-mixed');
    if ($wrapper.hasClass('b-radio_mixed_yes')) {
      $wrapper.removeClass('b-radio_mixed_yes');
    }
  }

  function init() {
    EventMgr.on($content(), '.i-textarea-mixed', 'change', textareaHandler);
    EventMgr.on($content(), '.i-input-mixed', 'change', inputHandler);
    EventMgr.on($content(), '.i-checkbox_mixed_yes input', 'change', checkboxHandler);
    EventMgr.on($content(), '.i-select_mixed_yes input', 'change', selectHandler);
    EventMgr.on($content(), '.i-mselect_mixed_yes input', 'change', mSelectHandler);
    EventMgr.on($content(), '.i-radio_mixed_yes input', 'change', radioHandler);
  }
  return {
    init: init
  };
}(window, $, EventMgr, App, doT);
//# sourceMappingURL=App.GroupEdit.js.map

'use strict';

/**
 * Module provide global search
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.GlobalSearch = function (window, $, EventMgr, App) {
  'use strict';

  var timeoutId,
      loaderTimeid,
      elem = [],
      emptyElem = [{ description: { $: pageInfo.notfound }, __empty__: true }],
      keys = {
    '38': 'UPKEY',
    '40': 'DOWNKEY',
    '37': 'LEFTKEY',
    '39': 'RIGHTKEY',
    '13': 'ENTERKEY',
    '9': 'TABKEY'
  };

  function $mountNode() {
    return App.u.selectorCache('.i-gsearch');
  }

  function $body() {
    return App.u.selectorCache('body');
  }

  function keyUpHandler(e) {
    var key = e.which || e.keyCode,
        searchString = this.value,
        $selected = $('.b-gsearch__list-item_selected_yes');
    if (keys[key] === 'UPKEY') {
      var prev = $selected[0] ? $selected.prev() : $('.b-gsearch__list-item:first');
      if (prev.length !== 0) {
        $selected.removeClass('b-gsearch__list-item_selected_yes');
        prev.addClass('b-gsearch__list-item_selected_yes');
      }
      e.preventDefault();
    } else if (keys[key] === 'DOWNKEY') {
      var next = $selected[0] ? $selected.next() : $('.b-gsearch__list-item:first');
      if (next.length !== 0) {
        $selected.removeClass('b-gsearch__list-item_selected_yes');
        next.addClass('b-gsearch__list-item_selected_yes');
      }
      e.preventDefault();
    } else if (keys[key] === 'ENTERKEY') {
      if ($selected[0]) {
        clickListHandler.apply($selected[0], [e]);
      } else {
        searchHandler(searchString);
      }
      e.preventDefault();
    } else {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(function () {
        searchHandler(searchString);
      }, 250);
    }
    if (searchString !== '') {
      showSearchReset();
    } else {
      hideSearchReset();
    }
  }

  function showSearchReset() {
    var $crossBtn = $('.b-gsearch__close');
    if (!$crossBtn.hasClass('b-gsearch__close_is_show')) {
      $crossBtn.addClass('b-gsearch__close_is_show');
    }
  }

  function hideSearchReset() {
    $('.b-gsearch__close').removeClass('b-gsearch__close_is_show');
  }

  function searchFailHandler(e, data) {
    unsetLoader();
  }

  function searchRespHandler(e, data) {
    var doc = data.doc || {},
        html = '';
    if (doc.elem) {
      elem = doc.elem;
      if (elem.length > 20) {
        elem.splice(20, elem.length - 1);
      }
      html = tempFunc({ elem: elem });
    } else {
      html = tempFunc({ elem: emptyElem });
    }
    $mountNode().html(html);
    $body().on('click.globalSearch', closeList);
    unsetLoader();
  }

  var template = '<div class="b-gsearch__list-wrapper b-select-ac__list-scroll-wrapper">' + '<div class="b-select-ac__list-wrapper b-gsearch__list " style="display:block;">' + '<ul class="b-select-ac__list">' + '{{~it.elem :v :i}}' + '<li class="b-gsearch__list-item i-gsearch__list-item b-select-ac__list-item" data-index="{{=i}}">{{=window.filterXSS(v.description.$)}}</li>' + '{{~}}' + '</ul>' + '</div>' + '</div>';

  var tempFunc = window.doT.template(template);

  function searchHandler(searchString) {
    if (searchString !== '') {
      var param = {
        func: 'globalindex',
        elid: searchString,
        out: 'json'
      };
      EventMgr.trigger('ajaxRequest', {
        param: param,
        trfunc: 'globalSearchResponse',
        failfunc: 'globalSearchFail',
        outtype: 'json',
        queue: 'noqueue'
      });
      setLoader();
    }
  }

  function clickListHandler() {
    var index = this.getAttribute('data-index');
    if (elem && elem[index] && !elem[index].__empty__) {
      var param = App.u.parseParams(elem[index].filter.$);
      param.func = elem[index].func.$;
      param.filter = 'on';
      //var param = App.u.parseParams('func=paymethod&filter=on&name=rub');
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: {
          newtab: true, __src: 'menuAction'
        },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponse',
        failfunc: 'failMenuAjaxResponse',
        queue: 'noqueue' });
    }
    closeList();
  }

  function closeList() {
    $mountNode().html('');
    elem = [];
    $body().off('click.globalSearch');
  }

  function setLoader() {
    //clearTimeout(loaderTimeid);
    loaderTimeid = setTimeout(function () {
      $('.i-gsearch__input').addClass('b-gsearch__input_loading_yes');
    }, 100);
  }

  function unsetLoader() {
    clearTimeout(loaderTimeid);
    $('.i-gsearch__input').removeClass('b-gsearch__input_loading_yes');
  }

  function resetHandler(e) {
    e.preventDefault();
    $('.i-gsearch__input').val('');
    hideSearchReset();
  }

  function init() {
    EventMgr.on($mainWrapper(), '.i-gsearch__input', 'keyup', keyUpHandler);
    EventMgr.on($mainWrapper(), '.i-gsearch__input', 'focus', keyUpHandler);
    EventMgr.on($mainWrapper(), '.i-gsearch__list-item', 'click', clickListHandler);
    EventMgr.on($mainWrapper(), '.i-gsearch__close', 'click', resetHandler);
    EventMgr.bind('globalSearchResponse', searchRespHandler);
    EventMgr.bind('globalSearchFail', searchFailHandler);
  }

  function $mainWrapper() {
    return App.u.selectorCache('#main-wrapper');
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.GlobalSearch.js.map

'use strict';

/**
 * Select Module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.PrefixSelect = function (window, $, EventMgr, App) {
  'use strict';

  var CACHE = {},
      selectPrefixSelector = '.i-myselect_is_prefix',
      inputPrefixSelector = 'input.i-input_has_prefix',
      timeOutId;

  function $content() {
    return App.Common.selectorCache('.i-form-wr');
  }

  function inputPrefixHandlerWrapper(e) {
    var self = this;
    clearTimeout(timeOutId);
    timeOutId = setTimeout(function () {
      inputPrefixHandler(self);
    }, 300);
  }
  /**
   * Input prefix handler
   *
   **/
  function inputPrefixHandler(elem, isInit) {
    var value = elem.value,
        tabId = elem.getAttribute('data-tabid'),
        prefixSelectName = elem.getAttribute('data-prefix-name'),
        selectIndex = getSelectIndex(tabId, prefixSelectName),
        prevPrefix = elem.getAttribute('data-prefix'),
        findObject = findInSelect(value, selectIndex),
        selectElem;
    if (isInit) {
      selectElem = $('#' + tabId + '-' + prefixSelectName + ' li.selected').trigger('click', [null, { isIgnore: true }]);
      var prefix = selectElem.attr('data-code');
      var mask = selectElem.attr('data-mask');
      //set data-prefix
      elem.setAttribute('data-prefix', prefix);
      //set data-mask
      if (mask) {
        elem.setAttribute('data-mask', mask);
        EventMgr.trigger('inputMaskChangeBySetvalues', { elem: elem, mask: mask, value: value });
      }
      return;
    }
    //set find prefix value
    if (findObject.isFind && prevPrefix !== findObject.prefix) {
      $($('#' + tabId + '-' + prefixSelectName + ' li[data-code="' + findObject.prefix + '"]:not(".selected")')[0]).trigger('click', [null, { isIgnore: true }]);
      //set data-prefix
      elem.setAttribute('data-prefix', findObject.prefix);
      if (findObject.mask) {
        elem.setAttribute('data-mask', findObject.mask);
        EventMgr.trigger('inputMaskChangeBySetvalues', { elem: elem, mask: findObject.mask, value: value });
      }
    }
  }
  //get cached index
  function getSelectIndex(tabId, name) {
    if (!CACHE[tabId]) {
      CACHE[tabId] = {};
    } else if (CACHE[tabId][name]) {
      return CACHE[tabId][name];
    }

    CACHE[tabId][name] = makeIndex(tabId, name);
    return CACHE[tabId][name];
  }
  //make select values index
  function makeIndex(tabId, name) {
    var items = $('#' + tabId + '-' + name + ' li'),
        l = items.length,
        index = {};
    while (l--) {
      index[items[l].getAttribute('data-code')] = { mask: items[l].getAttribute('data-mask') };
    }
    return index;
  }
  //find in select index
  function findInSelect(value, selectIndex) {
    var searchPrefix = String(value).replace(/\)/g, '').replace(/\(/g, '').replace(/\s/g, '');
    for (var i = 0, l = String(value).length; i < l; i++) {
      if (selectIndex[searchPrefix]) {
        return { isFind: true, prefix: searchPrefix, mask: selectIndex[searchPrefix].mask };
      }
      searchPrefix = searchPrefix.substring(0, searchPrefix.length - 1);
    }
    return { isFind: false };
  }
  //remove value ignore white spaces
  function removeIgnoreWhiteSpace(replacement, value) {
    var valueArr = String(value).split(''),
        replacementArr = String(replacement).split(''),
        replacementLength = replacementArr.length,
        ii = 0;
    for (var i = 0, l = valueArr.length; i < l; i++) {
      if (valueArr[i] !== ' ' && valueArr[i] !== '(' && valueArr[i] !== ')' && valueArr[i] !== '_' && valueArr[i] !== '-') {

        if (valueArr[i] === replacementArr[ii]) {
          ii++;
          valueArr[i] = '';
          if (replacementLength === ii) {
            break;
          }
        }
      } else {
        valueArr[i] = '';
      }
    }
    return valueArr.join('');
  }
  /**
   * Select prefix handler 
   *
   **/
  function prefixHandler(e, data, d) {
    if (d && d.isIgnore) {
      return;
    }
    var targetName = this.getAttribute('data-targetinput'),
        tabId = this.getAttribute('data-tabid'),
        $target = $('#' + targetName + '-' + tabId),
        targetPrefix = $target.attr('data-prefix'),
        key = this.value,
        value = $target.val(),
        $selectElem = $('#' + tabId + '-' + this.getAttribute('name') + ' li[data-val="' + key + '"]'),
        newPrefix = $selectElem.attr('data-code'),
        mask = $selectElem.attr('data-mask');
    //remove prev prefix
    value = removeIgnoreWhiteSpace(targetPrefix, value);
    //just insert to 1st position
    value = newPrefix + value;
    $target.val(value);
    if (mask) {
      EventMgr.trigger('inputMaskChangeBySetvalues', { elem: $target[0], mask: mask, value: value });
    }
    //set new prefix
    $target.attr('data-prefix', newPrefix);
  }

  function checkInitValue(e, data) {
    var tabId = data.tabId;
    $('#cont-' + tabId + ' .i-input_has_prefix').each(function () {
      inputPrefixHandler(this, true);
    });
  }

  function init() {
    EventMgr.on($content(), selectPrefixSelector, 'change', prefixHandler);
    EventMgr.on($content(), inputPrefixSelector, 'change', inputPrefixHandlerWrapper);
    EventMgr.on($content(), inputPrefixSelector, 'keyup', inputPrefixHandlerWrapper);
    EventMgr.bind('appendForm', checkInitValue);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.PrefixSelect.js.map

'use strict';

/**
 * Module resize form page by lagest
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.ResizeFormPage = function (window, $, EventMgr, App) {
  'use strict';

  function checkPageWidth(e, data) {
    if (data && data.tabObj && data.tabObj.func === 'settings' && data.tabObj.type === 'form') {
      var tabId = data.tabId,
          $formPages = $('#form-wrapper-' + tabId + ' .b-form-page'),
          $formPage,
          $labels,
          $labelsArr = [],
          maxWidth = 0,
          tmpWidth;
      //go for pages
      for (var i = 0, l = $formPages.length; i < l; i++) {
        $fields = $($formPages[i]).find('.l-label__wrapper');
        //go for 1st label 
        for (var j = 0, lf = $fields.length; j < lf; j++) {
          tmpWidth = $fields[j].offsetWidth;

          if (tmpWidth !== 0) {
            if (tmpWidth > maxWidth) {
              maxWidth = tmpWidth;
            }
            $labelsArr.push($fields[j]);
            break;
          }
        }
      }
      if (maxWidth > 0) {
        for (var i = 0, l = $labelsArr.length; i < l; i++) {
          $labelsArr[i].style.minWidth = maxWidth + 'px';
        }
      }
    }
  }

  function init() {
    EventMgr.bind('appendForm', checkPageWidth);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ResizeFormPage.js.map

'use strict';

/**
 * Module provide confirm form
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
App.ConfirmForm = function (window, $, EventMgr, App) {
  'use strict';

  var confirmElems = {};

  function checkWarningForConfirm(e, d) {
    if (d && d.w) {
      var warning,
          index = 0,
          confirmKey,
          plid = d.d.plid,
          listaction = d.d.func,
          tabId = d.d.tabId,
          hasConfirmWarning = false;
      confirmElems[tabId] = {};
      for (var key in d.w) {
        warning = d.w[key];
        if (warning.type === 'extraconfirm') {
          confirmKey = warning.func + warning.value;
          hasConfirmWarning = true;
          if (!confirmElems[tabId][confirmKey]) {
            confirmElems[tabId][confirmKey] = {
              'elid': [],
              //'func': 'groupedit',
              'func': warning.func,
              'plid': plid,
              'listaction': listaction,
              'action': warning.src_func
              //'faction': warning.func
            };
          }
          confirmElems[tabId][confirmKey].elid.push(String(warning.elid).replace(/,\s/g, ', , '));
        }
      }
      if (hasConfirmWarning) {
        openConfirmForm(confirmElems[tabId], tabId);
      }
    }
  }

  function openConfirmForm(elems, tabId) {
    var hasNext = false;
    for (var key in elems) {
      var w = elems[key],
          param = w;
      param.elid = w.elid.join(', ');
      EventMgr.trigger('ajaxRequest', {
        param: param,
        invar: { sourceTab: tabId, __innervars: { confirmKey: key, sourceTab: tabId, afterFunc: 'checkNextConfirmForm' } },
        type: 'get',
        outtype: 'json',
        trfunc: 'ajaxResponseInspectorForm',
        queue: '',
        failfunc: 'failResponseInspectorForm' });
      hasNext = true;
      break;
    }
    if (!hasNext) {
      if (confirmElems[tabId]) {
        delete confirmElems[tabId];
      }
      EventMgr.trigger('reloadTab', { tabId: tabId });
    }
  }

  function checkNextConfirmForm(e, d) {
    if (d && d.d && d.d.confirmKey && d.d.sourceTab) {
      if (confirmElems[d.d.sourceTab] && confirmElems[d.d.sourceTab][d.d.confirmKey]) {
        delete confirmElems[d.d.sourceTab][d.d.confirmKey];
      }
    }
    openConfirmForm(confirmElems[d.d.sourceTab], d.d.sourceTab);
  }

  function checkForCloseSourceTab(e, d) {
    if (d && d.tabId) {
      if (confirmElems[d.tabId]) {
        delete confirmElems[d.tabId];
        EventMgr.trigger('closeModalForm');
      }
    }
  }

  function init() {
    EventMgr.bind('checkWarningForConfirm', checkWarningForConfirm);
    EventMgr.bind('checkNextConfirmForm', checkNextConfirmForm);
    EventMgr.bind('closeTabEvent', checkForCloseSourceTab);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App);
//# sourceMappingURL=App.ConfirmForm.js.map

'use strict';

/**
 * FieldHeight module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @param {object} ScrollHandler Scrollbar library
 */
App.FieldHeight = function (window, $, EventMgr, App, ScrollHandler) {
  'use strict';

  function init() {
    EventMgr.bind('appendForm', checkFieldForClass);
  }

  function checkFieldForClass(e, data) {
    var tabId = data.tabId;
    setTimeout(function () {
      $('#form-wrapper-' + tabId).find('.i-control__fullwidth').each(function () {
        var availableHeight = $('#form-scroll-' + tabId).height(),
            hasButtons = $('#' + tabId + '-buttons').length;
        setHeight(this, availableHeight, hasButtons);
      });
    });
  }

  function setHeight(elem, height, hasButtons) {
    //buttons height(52) + margin bottom(20) + padding row (5) + tbody(2) + td padding (2) + resizer (5) + control border (2)
    var MAGICNUMBER = 37,
        BUTTONHEIGHT = 52,
        height = height - MAGICNUMBER;
    if (hasButtons) {
      height -= BUTTONHEIGHT;
    }
    if (elem) {
      elem.setAttribute('height', height + 'px');
    }
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr, App, ScrollHandler);
//# sourceMappingURL=App.FieldHeight.js.map

'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

App.Jscript = function (window, $, EventMgr) {
  'use strict';

  var init = function init() {
    EventMgr.bind('appendForm,appendList,appendReport', checkJscript);
    EventMgr.on('#wr-content', 'input.i-onchange-event, textarea.i-onchange-event', 'change', changeEventHandler);
  },
      checkJscript = function checkJscript(e, d) {
    if (d && d.srcData && d.srcData.jscript && d.srcData.jscript.length) {
      var jscript = d.srcData.jscript;
      for (var i = 0, l = jscript.length; i < l; i++) {
        eval(jscript[i]);
      }
    }
  },
      changeEventHandler = function changeEventHandler(e) {
    var name = this.getAttribute('name');
    if (window[name + '_event'] && _typeof(window[name + '_event'])) {
      window[name + '_event'].apply(this, [e]);
    }
  };

  return {
    init: init
  };
}(window, $, EventMgr);
//# sourceMappingURL=App.Jscript.js.map

'use strict';

/**
 * Notify module
 *
 * provide notification block on the top page
 *
 */
App.Notify = function (window, $, EventMgr) {
  'use strict';

  var pageInfo = window.pageInfo,
      timeoutId;

  var template = '<div class="b-notif">' + '{{~it.items :value:index}}' + '<div class="b-notif__elem hint {{?value.type !== "bannerlist"}} b-menu-item newtab i-menu-link {{??}} i-bannerlist-open{{?}}" data-url="?func={{=value.action}}" data-hint="{{=value.hint}}">' + '<div class="b-notif__img s-icon s16x16 props {{=value.img}}"></div>' + '{{ var nums = String(value.value).split(""); }}' + '<div class="b-notif__text">' + '{{~nums :v:i}}' + '<span class="b-number b-number_value_{{=v}}"></span>' + '{{~}}' + '</div>' + '</div>' + '{{~}}' + '</div>';

  var templBanner = '<div class="b-notify-banner b-notify-banner_status_{{=it.status}} {{?it.isNew}} b-notify-banner_is_new {{?}}" data-elid="{{=it.elid}}" id="{{=it.id}}"><div class="b-notify-banner__close i-notify-banner__close b-tab-close"></div>{{=it.msg}}</div>';

  var templCloseAll = '<div class="b-notify-banner__close-all {{?it.hasNew}}b-notify-banner_is_new{{?}}" data-elid="{{=it.elids}}"><div class="b-notify-banner__close-all-inner i-notify-banner__close-all">' + pageInfo.messages.closeall + '<div class="b-notify-banner__close b-tab-close"></div></div></div>';

  var tempFunc = window.doT.template(template);
  var templBannerFunc = window.doT.template(templBanner);
  var templCloseAll = window.doT.template(templCloseAll);

  function notificationGet() {
    var url = pageInfo.url,
        param = { func: 'notify' };
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      type: 'get',
      outtype: 'json',
      ignore503: true,
      failFunc: notifyFail,
      trfunc: 'notificationResponse',
      queue: 'notification' });
  }

  function notifyBannerDeleteRequest(id) {
    var url = pageInfo.url,
        param = { func: 'notificationbar.delete', elid: id };
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      type: 'get',
      outtype: 'json',
      ignore503: true,
      trfunc: 'notifyBannerDeleteResponse',
      queue: 'notification'
    });
  }

  function notifyBannnerDeleteAllRequest() {
    var url = pageInfo.url,
        param = { func: 'notificationbar.deleteall' };
    EventMgr.trigger('ajaxRequest', {
      url: url,
      param: param,
      type: 'get',
      outtype: 'json',
      ignore503: true,
      trfunc: 'notifyBannerDeleteResponse',
      queue: 'notification'
    });
  }

  function notifyBannerDeleteResponse(resp) {
    notificationGet();
  }

  function notifyFail(e, dataSource) {
    var dataSource = dataSource;
    setTimeout(function () {
      EventMgr.trigger('ajaxRequest', dataSource);
    }, 5000);
  }

  function notificationRender(notifElems) {
    var html = tempFunc(notifElems);
    var elem = window.document.getElementById('notify');
    elem.innerHTML = html;

    if (elem.style.display === 'none') {
      $(elem).slideDown(1000);
    }
  }

  function notificationHide() {
    var elem = window.document.getElementById('notify');
    $(elem).slideUp(1000);
  }

  function notifyBannerRender(notifElems) {
    var html = '',
        htmlList = '',
        items = notifElems.items,
        hasNew = false,
        elids;
    if (items && items.length) {
      for (var i = 0, l = items.length; i < l; i++) {
        if (items[i].type === 'bannerlist' && items[i].bitems && items[i].bitems.length) {
          var bannerlist = items[i].bitems;
          for (var j = 0, ll = bannerlist.length; j < ll; j++) {
            if (!elids) {
              elids = bannerlist[j].id;
            } else {
              elids += ',' + bannerlist[j].id;
            }
            if (bannerlist[j].isNew) {
              hasNew = true;
            }
            htmlList += templBannerFunc({
              id: '__' + bannerlist[j].id,
              elid: bannerlist[j].id,
              isNew: bannerlist[j].isNew,
              status: bannerlist[j].status,
              msg: bannerlist[j].msg });
          }
        }
      }
      setTimeout(function () {
        removeNotifyBanner(bannerlist);
      }, 7000);

      if (htmlList) {
        htmlList = templCloseAll({ elids: elids, hasNew: hasNew }) + htmlList;
      }
      addNotifyBannerList(htmlList);
      setTimeout(function () {
        setPositionToList();
      }, 50);
    }
  }

  function setPositionToList() {
    var $notifyList = $(bannerOpenSel),
        offsetLeft = $notifyList[0] ? $notifyList[0].offsetLeft : 0,
        $bannerList = $('#notify-banner-list');

    $bannerList.css('left', offsetLeft + 'px');
  }

  function removeNotifyBanner(items) {
    items = items || [];

    for (var i = 0, l = items.length; i < l; i++) {
      var $notifyBanner = $('#__' + items[i].id);
      if ($notifyBanner.length && $notifyBanner.hasClass('b-notify-banner_is_new')) {
        $notifyBanner.slideUp(function () {
          $(this).removeClass('b-notify-banner_is_new').css('display', '');
        });
      }
    }
    $('.b-notify-banner__close-all').removeClass('b-notify-banner_is_new');
  }

  function closeNotifyBanner(e) {
    e.preventDefault();
    var $parent = $(this.parentNode),
        id = $parent.attr('id'),
        elid = $parent.attr('data-elid');
    //@todo make banner as closed
    //@todo remove banner from bannerlist
    if (id) {
      notifyBannerDeleteRequest(elid);
      $parent.fadeOut('fast', function () {
        $(this).remove();
      });
      //remove from banner list
      $('#__' + id).remove();
      //check for noone banner
      checkAndRemoveCloseAllBtn();
      //close all banners
    } else {
      notifyBannnerDeleteAllRequest();
      $('.b-notify-banner').fadeOut('fast', function () {
        $parent.remove();
        $('.b-notify-banner').remove();
      });
    }
  }

  function closeNotifyFromListBanner(e) {
    e.preventDefault();
    var $parent = $(this.parentNode),
        id = $parent.attr('id'),
        elid = $parent.attr('data-elid');
    id = String(id).slice(0, 2);
    notifyBannerDeleteRequest(elid);
    //@todo make banner as closed
    //@todo remove banner from bannerlist
    $parent.fadeOut('fast', function () {
      $(this).remove();
    });
    //remove from banner list
    $('#' + id).remove();
    checkAndRemoveCloseAllBtn();
  }

  function checkAndRemoveCloseAllBtn() {
    if ($('.b-notify-banner').length === 0) {
      $('.b-notify-banner__close-all').remove();
    } else if ($('.b-notify-banner__list_is_open').length === 0 && $('.b-notify-banner_is_new').length === 1) {
      $('.b-notify-banner_is_new').removeClass('b-notify-banner_is_new');
    }
  }

  function addNotifyBanner(html) {
    var $targetElem = $('#notify-banner-wrapper'),
        $html = $(html);
    if ($targetElem) {
      $html.hide();
      $html.appendTo($targetElem).slideDown('slow');
    }
  }

  function addNotifyBannerList(html) {
    var $targetElem = $('#notify-banner-list');
    if ($targetElem) {
      $targetElem.html(html);
    }
  }

  function bannerListToggle() {
    var $bannerList = $('#notify-banner-list'),
        offsetLeft = this.offsetLeft;
    if ($bannerList.hasClass('b-notify-banner__list_is_open')) {
      $bannerList.removeClass('b-notify-banner__list_is_open');
    } else {
      $('.b-notify-banner_is_new').removeClass('b-notify-banner_is_new');
      $bannerList.addClass('b-notify-banner__list_is_open');
      $bannerList.css('left', offsetLeft + 'px');
    }
  }
  //change title
  function notifyTitle(data) {
    if (data && data.title) {
      window.document.title = data.title;
    } else {
      window.document.title = pageInfo.title;
    }
  }

  function notifySound(data) {
    if (data && data.sound) {
      var audio = window.document.getElementById('audio-beep');
      if (!audio) {
        audio = window.document.createElement('audio');
        audio.style.display = 'none';
        audio.setAttribute('id', 'audio-beep');
        document.body.appendChild(audio);
      }
      audio.setAttribute('src', data.sound);

      audio.play();
    }
  }

  function notifyBalance(data) {
    if (data && data.balance) {
      var balance_box = $('#balance-show-box');
      if (balance_box) {
        balance_box.text(data.balance);
      }
    }
  }

  function notificationCheck(e, data) {
    if (!data.items) {
      return;
    }
    if (data.items.length > 0) {
      notificationRender(data);
      notifyBannerRender(data);
      notifyTitle(data);
      notifySound(data);
      notifyBalance(data);
    } else {
      notificationHide();
      if (data && data.balance) {
        notifyBalance(data);
      }
    }

    if (data.timeout) {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(function () {
        notificationGet();
      }, parseInt(data.timeout * 1000, 10));
    }
  }

  function notificationLoad() {
    notificationGet();
  }

  function checkForNotify(e, data) {
    if (pageInfo.notify && data.notify && pageInfo.notify !== data.notify) {
      pageInfo.notify = data.notify;
      notificationGet();
    }
  }

  var closeBtnSel = '.i-notify-banner__close',
      bannerOpenSel = '.i-bannerlist-open',
      closeBtnAllSel = '.i-notify-banner__close-all';

  function init() {
    EventMgr.bind('loadPage', notificationLoad);
    EventMgr.bind('notificationResponse', notificationCheck);
    EventMgr.bind('forceCheckNotify', notificationGet);
    EventMgr.bind('ajaxResponse,ajaxFormResponse', checkForNotify);
    EventMgr.bind('notifyBannerDeleteResponse', notifyBannerDeleteResponse);
    EventMgr.on('#notify-banner-wrapper', closeBtnSel, 'click', closeNotifyBanner);
    EventMgr.on('#notify-banner-list', closeBtnSel, 'click', closeNotifyFromListBanner);
    EventMgr.on('#notify', bannerOpenSel, 'click', bannerListToggle);
    EventMgr.on('#notify-banner-list', closeBtnAllSel, 'click', closeNotifyBanner);
  }

  var api = {
    init: init
  };

  return api;
}(window, $, EventMgr);
//# sourceMappingURL=App.Notify.js.map

//module loaders
App.mgr = function () {
	'use strict';
	var modules = [

			App.Common.init
			,App.Dom.init
			,App.Menu.init
			,App.UpSize.init
			,App.ScrollController.init
			,App.AceEditor.init
			,App.ActionHandler.init
			,App.ActionHandlerList.init
			,App.ActionHandlerDashboard.init
			,App.AjaxHelper.init
			,App.Alert.init
			,App.FormUtils.init
			,App.FormDependFields.init
			,App.Forms.init
			,App.MultiSelect.init
			,App.Select.init
			,App.Bands.init
			,App.ChangeBrandColors.init
			,App.Cookie.init
			,App.DashboardDragAndDrop.init
			,App.Deview.init
			,App.EditInList.init
			,App.FilterList.init
			,App.GoogleCharts.init
			,App.Captcha.init
			,App.Help.init
			,App.Hint.init
			,App.HorizontScroll.init
			,App.HotKeys.init
			,App.KeepAlive.init
			,App.List.init
			,App.ListSorting.init
			,App.LiveListFilter.init
			,App.LoadScripts.init
			,App.LocalStorage.init
			,App.MultiLoadTabs.init
			,App.ProgressBar.init
			,App.SendFormWithFiles.init
			,App.Slider.init
			,App.SelectAutoComplete.init
			,App.TableRowResize.init
			,App.Tabs.init
			,App.Validators.init
			,App.Wizards.init
			,App.Calendar.init
			,App.ValidChecker.init
			,App.Toolbar.init
			,App.Map.init
			,App.Builder.init
			,App.CheckRestart.init
			,App.TinyMCE.init
			,App.FormWatcher.init
			,App.ConfirmBox.init
			,App.HorizScrollControl.init
			,App.DashboardList.init
			,App.Desktop.init
			,App.MessageTempl.init
			,App.FontSettings.init
			,App.ContentMistake.init
			,App.CopyToBuffer.init
			,App.TestCases.init
			,App.TabDrag.init
			,App.UsefulLinks.init
			,App.InputMask.init
			,App.FormListFilter.init
			,App.LightBoxProvider.init
			,App.FormFixedField.init
			,App.GroupEdit.init
			,App.GlobalSearch.init
			,App.PrefixSelect.init
			,App.ResizeFormPage.init
			,App.ConfirmForm.init
			,App.FieldHeight.init
			,App.Jscript.init
			,App.Notify.init

	],
	len = modules.length,
		i, data = 'data';

	for (i = 0; i < len; i++) {
    if (typeof modules[i] === 'function') {
      modules[i]();
    } else {
      console.log('undefined init function of module number: ', i);
    }
	}
	EventMgr.trigger('loadPage', data);
};

/**
 *  ErrorReport module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api
 */
/*global App:true*/
/*global EventMgr:true*/
/*global $:true*/
App.ErrorReport = function(window, $, EventMgr, App) {
  'use strict';

  function errorReport(errorMsg, url, lineNumber, colNumber, error) {
    var param = {};
    param.error_url = url + '______' + window.location.href;
    param.error_message = errorMsg;
    param.stack_trace = lineNumber;
    param.error = error;
    param.col_number = colNumber;
    param.user_level = pageInfo.userLevel;
    param.product = pageInfo._product;
    param.is_branding = pageInfo.isBranding;
    param.theme = 'orion';
    param.module = $('.tab-content_st_active').attr('data-func');
    param.version = pageInfo.version;
    EventMgr.trigger('ajaxRequest', {
      url: 'https://themereport.ispsystem.net:3001/api/errorreport/',
      param: param,
      type: 'jsonp'
    });
  }

  window.onerror = errorReport;

} (window, $, EventMgr, App);

//Constructor for tabs
(function(window, $, templates) {
  'use strict';
  function TabObj(id, status, type, selfUrl) {
    this.id = id;
    this.cid = 'cont-' + this.id;
    //this.title = title;
    this.status = status || 0;
    this.type = type;
    this.selfUrl = selfUrl;
    this.body = '';
    this.header = '';
    this.param = '';
    this.sIndex = String(id).replace('tab', '') - 0;
  }

  TabObj.fn = TabObj.prototype;

  TabObj.fn.deactive = function() {
    $('#' + this.id).removeClass('active');
    $('#switch-' + this.id).removeClass('active');
    //$('#s-' + this.id).removeClass('active');
    if (this.hType === 'child') {
      $('#' + this.gParent).removeClass('active');
      $('#switch-' + this.gParent).removeClass('active');
    }
    $('#' + this.cid).removeClass('tab-content_st_active').addClass('hidden');
    this.status = 0;
  };

  TabObj.fn.activate = function() {
    $('#' + this.id).addClass('active');
    $('#switch-' + this.id).addClass('active');
    //$('#s-' + this.id).addClass('active');
    if (this.hType === 'child') {
      $('#' + this.gParent).addClass('active');
    }
    $('#' + this.cid).addClass('tab-content_st_active').removeClass('hidden');
    this.status = 1;
  };
  //render HTML for tabHead and tabBody
  TabObj.fn.render = function() {
    switch (this.type) {
      case 'empty':
        this.htmlBody = templates.tabContEmpty(this.body);
        if (this.hType === 'parent') {
          this.htmlHeader = templates.tabLi(this.header);
        } else {
          this.htmlHeader = templates.tabChld(this.header);
        }
        break;
      case 'list':
        this.htmlBody = templates.tabCont(this.body);
        if (this.hType === 'parent') {
          this.htmlHeader = templates.tabLi(this.header);
        } else {
          this.htmlHeader = templates.tabChld(this.header);
        }
        break;
      case 'form':
        this.htmlBody = templates.tabContForm(this.body); //going replace
        if (this.hType === 'parent') {
          this.htmlHeader = templates.tabLi(this.header);
        } else {
          this.htmlHeader = templates.tabChld(this.header);
        }
        break;
      case 'report':
        this.htmlBody = templates.tabContForm(this.body); //going replace
        if (this.hType === 'parent') {
          this.htmlHeader = templates.tabLi(this.header);
        } else {
          this.htmlHeader = templates.tabChld(this.header);
        }
        break;
      case 'dashboard':
        this.htmlBody = templates.tabContDashBoard(this.body);
        break;
      case 'map':
      case 'rack':
        this.htmlBody = templates.tabContMap(this.body); //going replace
        if (this.hType === 'parent') {
          this.htmlHeader = templates.tabLi(this.header);
        } else {
          this.htmlHeader = templates.tabChld(this.header);
        }
        break;

    }
    return this;
  };
  //append tabBody and tabHead
  TabObj.fn.append = function(tabId) {
    if (this.htmlHeader && this.htmlBody) {
      if (this.hType === 'parent') {
        tabId = tabId || 'add-tab';
        $('#nav-tabs #' + tabId).before(this.htmlHeader);
      } else {
        $('#' + this.gParent).append(this.htmlHeader);
      }
      $('#wr-content').append(this.htmlBody);
    } else if (this.htmlBody) {
      $('#wr-content').append(this.htmlBody);
    }

    return this;
  };
  //replace tabBody
  TabObj.fn.update = function() {
    var body = document.getElementById(this.cid);
    if (body !== null) {
      body.parentNode.removeChild(body);
    }
    $('#wr-content').append(this.htmlBody);
    return this;
  };
  //replace only table
  TabObj.fn.softUpdate = function() {
    var table = document.getElementById('ltwr-' + this.id),
        newTable = '';
    if (table !== null) {
      newTable = '<div class="content" id="ltwr-' + this.id +
          '" data-tabid=' + this.id + '>' + this.body.table + '</div>';
      $(table).replaceWith(newTable);
    }
    return this;
  };
  //replace tabBody and tabHeader
  TabObj.fn.replace = function() {
    var tabHeader = document.getElementById(this.id),
        tabBody = document.getElementById(this.cid);
    if (tabBody !== null) {
      tabBody.parentNode.removeChild(tabBody);
    }
    $('#wr-content').append(this.htmlBody);
    if (tabHeader !== null) {
      $(tabHeader).replaceWith(this.htmlHeader);
    }
    return this;
  };
  //remove temprorary properties
  TabObj.fn.clean = function() {
    this.htmlBody = null;
    this.htmlHeader = null;
    this.header = null;
    this.body = null;
  };
  //close tab
  TabObj.fn.close = function() {
    if (this.chart !== undefined) {
      var myArray = this.chart,
          i = this.chart.length;
      while (i--) {
        if (typeof myArray[i].clearChart === 'function') {
          myArray[i].clearChart();
          myArray[i] = null;
        }
      }
    }
    var header = document.getElementById(this.id),
        body = document.getElementById(this.cid);
    if (header !== null) {
      header.parentNode.removeChild(header);
    }
    if (body !== null) {
      body.parentNode.removeChild(body);
    }
    header = null;
    body = null;
  };

  window.TabObj = TabObj;
  //Constructor for menuGroup
  function MenuGroup(level, id, status, self) {
    this.level = level;
    this.id = id;
    this.status = (status !== null) ? status : '0';
    this.self = self;
  }
  MenuGroup.fn = MenuGroup.prototype;
  //methods
  MenuGroup.fn.statusUp = function(status) {
    this.status = status;
  };

  MenuGroup.fn.activate = function() {
    this.status = '1';
    this.self.removeClass('collapsed');
  };

  MenuGroup.fn.disactivate = function() {
    this.status = '0';
    this.self.addClass('collapsed');
  };

  MenuGroup.fn.toggle = function() {
    if (this.status === '1') {
      this.status = '0';
    } else {
      this.status = '1';
    }
    this.self.toggleClass('collapsed');
  };

  window.MenuGroup = MenuGroup;
  //utilits
  //setCookie
  function setCookie(cName, value, exdays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var cValue = encodeURIComponent(value) + ((exdays === null) ? '' :
        '; expires=' + exdate.toUTCString());
    document.cookie = cName + '=' + cValue;
  }
  window.setCookie = setCookie;
  //getCookie
  function getCookie(cName) {
    var i, x, y, ARRcookies = document.cookie.split(';');
    for (i = 0; i < ARRcookies.length; i++) {
      x = ARRcookies[i].substr(0, ARRcookies[i].indexOf('='));
      y = ARRcookies[i].substr(ARRcookies[i].indexOf('=') + 1);
      x = x.replace(/^\s+|\s+$/g, '');
      if (x === cName) {
        return decodeURIComponent(y);
      }
    }
    return '';
  }
  window.getCookie = getCookie;
  //jquery !plugins
  $.fn.switchClass = function(added, removed) {
    return this.removeClass(removed).addClass(added);
  };

  $.fn.serializeObject = function() {
    var formArray = this.serializeArray(),
        formObject = {},
        length = formArray.length,
        i;
    for (i = 0; i < length; i++) {
      formObject[formArray[i].name] = formArray[i].value;
    }
    return formObject;
  };
  //get flags from attr data-flag="default|reload"
  $.fn.getFlags = function() {
    var flags = {},
        flagString = this.attr('data-flags'),
        flagStringArr;
    if (flagString) {
      flagStringArr = flagString.split('|');
      for (var i = 0, l = flagStringArr.length; i < l; i++) {
        flags[$.trim(flagStringArr[i])] = true;
      }
    }
    return flags;
  };

  //get vars from attribute data-vars="t:1|r:25"
  $.fn.getVars = function() {
    var vars = {},
        varsString = this.attr('data-vars'),
        varsStringAttr,
        varsStringValue;
    if (varsString) {
      varsStringAttr = String(varsString).split('|');
      for (var i = 0, l = varsStringAttr.length; i < l; i++) {
        varsStringValue = varsStringAttr[i].split(':');
        if (varsStringValue && varsStringValue[0] && varsStringValue[1]) {
          vars[varsStringValue[0]] = varsStringValue[1];
        }
      }
    }
    return vars;
  };

  //@todo remove from all

  function blockEvent(e) {
    e = e || window.event;
    if (e.stopPropagation) {
      e.stopPropagation();
    }
    else {
      e.cancelBubble = true;
    }
    if (e.preventDefault) {
      e.preventDefault();
    }
    else {
      e.returnValue = false;
    }
  }
  window.blockEvent = blockEvent;

  //from here https://github.com/janl/mustache.js/blob/master/mustache.js#L47
  var entityMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;',
    '/': '&#x2F;',
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>' ,
    '&quot;': '"',
    '&#39;': "'" ,
    '&#x2F;': '/'
  };

  function scrollToTopLeft() {
    if (!window.pageInfo.mobile && !window.pageInfo.store && !window.pageInfo.extform) {
      window.scrollTo(0, 0);
    }
  }

  window.scrollToTopLeft = scrollToTopLeft;

  function htmlEscape(string) {
    return String(string).replace(/[&<>"'\/]/g, function(s) {
      return entityMap[s];
    });
  }

  window.htmlEscape = htmlEscape;
  function htmlDecode(value) {
    return $('<div/>').html(value).text();
  }
  window.htmlDecode = htmlDecode;

  function htmlEncode(s) {
    s = String(s).replace(/&lt;/g, '<').replace(/&gt;/g, '>');
    return s;
  }
  window.htmlEncode = htmlEncode;
  function blockSelection() {
    if (window.getSelection) { window.getSelection().removeAllRanges(); }
    //else if (document.selection && document.selection.clear) {
    // document.selection.clear();
    // }
    else if (document.selection && document.selection.empty) {
      document.selection.empty();
    }
  }
  window.blockSelection = blockSelection;
  function hash(input) {
    var hashI = 0, charI, i;
    if (input.length === 0) {
      return hashI;
    }
    for (i = 0; i < input.length; i++) {
      charI = input.charCodeAt(i);
      hashI = ((hashI << 5) - hashI) + charI;
      hashI = hashI & hashI; // Convert to 32bit integer
    }
    return 'id' + hashI;
  }
  window.hash = hash;


  var split;

  // Avoid running twice; that would break the `nativeSplit` reference
  split = window.split || function(undef) {

    var nativeSplit = String.prototype.split,
        // NPCG: nonparticipating capturing group
        compliantExecNpcg = /()??/.exec('')[1] === undef,
        self;

    self = function(str, separator, limit) {
      // If `separator` is not a regex, use `nativeSplit`
      if (Object.prototype.toString.call(separator) !== '[object RegExp]') {
        return nativeSplit.call(str, separator, limit);
      }
      var output = [],
          flags = (separator.ignoreCase ? 'i' : '') +
          (separator.multiline ? 'm' : '') +
          (separator.extended ? 'x' : '') + // Proposed for ES6
          (separator.sticky ? 'y' : ''), // Firefox 3+
          lastLastIndex = 0,
          // Make `global` and avoid `lastIndex` issues by working with a copy
          separator2, match, lastIndex, lastLength;
      separator = new RegExp(separator.source, flags + 'g');
      str += ''; // Type-convert
      if (!compliantExecNpcg) {
        // Doesn't need flags gy, but they don't hurt
        separator2 = new RegExp('^' + separator.source + '$(?!\\s)', flags);
      }

      limit = limit === undef ?
          -1 >>> 0 : // Math.pow(2, 32) - 1
          limit >>> 0; // ToUint32(limit)
      /* jslint boss:true*/
      while (match = separator.exec(str)) {
        // `separator.lastIndex` is not reliable cross-browser
        lastIndex = match.index + match[0].length;
        if (lastIndex > lastLastIndex) {
          output.push(str.slice(lastLastIndex, match.index));
          // Fix browsers whose `exec` methods don't consistently
          // return `undefined` for
          // nonparticipating capturing groups
          /* jslint loopfunc:true*/
          if (!compliantExecNpcg && match.length > 1) {
            match[0].replace(separator2, function() {
              for (var i = 1; i < arguments.length - 2; i++) {
                if (arguments[i] === undef) {
                  match[i] = undef;
                }
              }
            });
          }
          if (match.length > 1 && match.index < str.length) {
            Array.prototype.push.apply(output, match.slice(1));
          }
          lastLength = match[0].length;
          lastLastIndex = lastIndex;
          if (output.length >= limit) {
            break;
          }
        }
        if (separator.lastIndex === match.index) {
          separator.lastIndex++; // Avoid an infinite loop
        }
      }
      if (lastLastIndex === str.length) {
        if (lastLength || !separator.test('')) {
          output.push('');
        }
      } else {
        output.push(str.slice(lastLastIndex));
      }
      return output.length > limit ? output.slice(0, limit) : output;
    };

    // For convenience
    String.prototype.split = function(separator, limit) {
      return self(this, separator, limit);
    };

    return self;

  }();

}(window, $, templates));