window.Trees = {};
window.TreesEvents = {};
window.TreeInits = new Array();

//window.TreeInits['expand']    = function(tar,div){if ($(div).prev().is(".tree-minus")){tar.innerHTML = "Свернуть";}else{tar.innerHTML = "Развернуть";};return $(div).prev().is(".tree-expander");};
//window.TreeInits['select']    = function(tar,div){return !$(div).is(".node-selected")};
window.TreeInits['selectAll'] = function(tar,div){
  var id = $(div).parents('.tree').attr('id').substr(4);
  return window.Trees[id].multiselect;
};
window.TreeInits['deselectAll'] = window.TreeInits['selectCh'] = window.TreeInits['selectLvl'] = window.TreeInits['deselectLvl'] = window.TreeInits['deselectCh'] = window.TreeInits['selectAll'];
window.TreeClick = new Array();
window.TreeClick['expand'] = function(div){
  $(div).prev().click();
}
window.TreeClick['select'] = function(div){
  $(div).click();
}
window.TreeClick['showSForm'] = function(div){
  var id=$(div).parent().attr("id")+'';
  var nodeId = id.substr(id.lastIndexOf("_")+1);
  id=id.substr(4,id.lastIndexOf("_")-4);
  window.Trees[id].TreeShowSearchForm();
}

window.TreeClick['expandCh'] = function(div){
  var id=$(div).parent().attr("id")+'';
  var nodeId = id.substr(id.lastIndexOf("_")+1);
  id=id.substr(4,id.lastIndexOf("_")-4);
  $(div).parent().find('.tree-plus').each(function(){
    var id     = $(this).parent().attr("id")+'';
    var nodeId = id.substr(id.lastIndexOf("_")+1);
    var treeId = id.substr(4,id.lastIndexOf("_")-4);
    window.Trees[treeId].toggleChilds(this,nodeId,false);
  });
}

window.TreeClick['collapseCh'] = function(div){
  $(div).parent().find('.tree-minus').click();
}

window.TreeClick['selectCh'] = function(div){
  var id = $(div).parent().attr("id")+'';
  var nodeId = id.substr(id.lastIndexOf("_")+1);
  id     = id.substr(4,id.lastIndexOf("_")-4);
  $(div).parent().find('.tree-node').each(function(){
    $(this).addClass('node-selected');
    var nodeId = $(this).parent().attr('id').substr($(this).parent().attr('id').lastIndexOf("_")+1);
  });
  window.Trees[id].reInitSelected();
  window.Trees[id].setSelectedCountLabel();
  window.Trees[id].updateModifier('selectCh');
}

window.TreeClick['selectLvl'] = function(div){
  var id = $(div).parent().attr("id")+'';
  var nodeId = id.substr(id.lastIndexOf("_")+1);
  id     = id.substr(4,id.lastIndexOf("_")-4);
  lvl = window.Trees[id].selectLvl($(div).parent()[0]);
  window.Trees[id].updateModifier('selectLvl',lvl);
}

window.TreeClick['deselectLvl'] = function(div){
  var id = $(div).parent().attr("id")+'';
  var nodeId = id.substr(id.lastIndexOf("_")+1);
  id     = id.substr(4,id.lastIndexOf("_")-4);
  lvl = window.Trees[id].deSelectLvl($(div).parent()[0]);
  window.Trees[id].updateModifier('deselectLvl',lvl);
}

window.TreeClick['deselectCh'] = function(div){
  $(div).parent().find('.node-selected').click();
  var id = $(div).parent().attr("id")+'';
  id     = id.substr(4,id.lastIndexOf("_")-4);
  window.Trees[id].reInitSelected();
  window.Trees[id].setSelectedCountLabel();
  window.Trees[id].updateModifier('deselectCh');
}

window.TreeClick['selectAll'] = function(div){
  var id = $(div).parent().attr("id")+'';
  id     = id.substr(4,id.lastIndexOf("_")-4);
  $('#tree'+id).find('.tree-node').each(function(){
    $(this).addClass('node-selected');
  });
  window.Trees[id].reInitSelected();
  window.Trees[id].setSelectedCountLabel();
  window.Trees[id].updateModifier('selectAll');
}

window.TreeClick['deselectAll'] = function(div){
  var id = $(div).parent().attr("id")+'';
  id     = id.substr(4,id.lastIndexOf("_")-4);
  $('#tree'+id).find('.tree-node').each(function(){
    $(this).removeClass('node-hasselected');
    $(this).removeClass('node-selected');
  });
  window.Trees[id].reInitSelected();
  window.Trees[id].setSelectedCountLabel();
  window.Trees[id].updateModifier('deselectAll');
}

F_TreesFocusManager = function(){
  this.activeTree = false;
  this.collection = {};
  this.initedKeys = false;

  this.register = function(id){
    this.collection[id] = window.Trees[id];
  }

  this.setActiveTree = function(tree){
    for (var i in this.collection){

      if (i != tree.id){
        this.collection[i].FocusManager.clearFocus();
      }
    }
    this.activeTree = tree;
  }

  this.collapseNodes = function(){
    if (this.activeTree && this.activeTree.FocusManager.activeNode){
      var exp = this.activeTree.FocusManager.activeNode.prevAll('.tree-minus');
      if (exp){
        exp.click();
      }
    }
  }

  this.expandNodes = function(){
    if (this.activeTree && this.activeTree.FocusManager.activeNode){
      var exp = this.activeTree.FocusManager.activeNode.prevAll('.tree-plus');
      if (exp){
        exp.click();
      }
    }
  }

  this.makeClick = function(){
    if (this.activeTree && this.activeTree.FocusManager.activeNode){
      this.activeTree.FocusManager.makeClick();
    }
  }

  this.goDown = function(e){
    if (this.activeTree && this.activeTree.FocusManager.activeNode){
      var ch = this.activeTree.FocusManager.activeNode.parent().children('.tree-childs').find('.tree-node:visible');
      //если малоли у нас дети есть!
      if (ch.length){
        window.TreesFocusManager.activeTree.FocusManager.setActive($(ch[0]), e.shiftKey);
      }else{
        //Детей нет!
        var next = this.activeTree.FocusManager.activeNode.parent().next().children('.tree-node:visible');
        //есть ли
        if (next.length){
          window.TreesFocusManager.activeTree.FocusManager.setActive(next, e.shiftKey);
          return false;
        }else{
          //подымаемся вверх берем детей оттуда
          window.TreesFocusManager.activeTree.FocusManager.activeNode.parent().parents('li').each(function(){
            var $this = $(this);
            var next  = $this.next().children('.tree-node:visible');
            if (next.length){
              window.TreesFocusManager.activeTree.FocusManager.setActive(next, e.shiftKey);
              return false;
            }else{
              var ch = $this.next().children('.tree-node:visible');
              if (ch.length){
                window.TreesFocusManager.activeTree.FocusManager.setActive($(ch[0]), e.shiftKey);
                return false;
              }
            }
          });
        }
      }
    }
  }

  this.goUp = function(e){
    if (this.activeTree && this.activeTree.FocusManager.activeNode){
      var prev = this.activeTree.FocusManager.activeNode.parent().prev();

      var childs = prev.children('.tree-childs').find('.tree-node:visible');
      if (!childs.length){
        var prev = prev.children('.tree-node:visible');
      }else{
        var prev = $(childs[childs.length-1]);
      }
      if (prev.length){
        this.activeTree.FocusManager.setActive(prev, e.shiftKey);
      }else{
        //нада выделить парента
        prev = this.activeTree.FocusManager.activeNode.parent().parent().parent().parent().children('.tree-node:visible');
        if (prev.length){
          this.activeTree.FocusManager.setActive(prev, e.shiftKey);
        }
      }
    }
  }

  this.checkScroll = function(){
    if (this.activeTree && this.activeTree.FocusManager.activeNode && this.activeTree.FocusManager.tree.dim){
      var sc = $('#cmbBody'+this.activeTree.FocusManager.tree.id).find('.cmb-scrollable');
      if (sc.length){
        var ot  = this.activeTree.FocusManager.activeNode.parent().attr('offsetTop');
        var oh  = this.activeTree.FocusManager.activeNode.parent().height();
        var sch = sc.height();
        var sh  = sc.attr('clientWidth')<sc.attr('scrollWidth')?17:0;
        var pos = ot - sc.attr('scrollTop') + oh ;
        if (pos>sch){
          var v = Math.min(ot-sch  + oh + sh, sc.attr('scrollHeight')+10);
          sc.attr({scrollTop:v})
        }else{
          if ( ot < sc.attr('scrollTop')){
            sc.attr({scrollTop:Math.max(ot-5,0)});
          }
        }
      }
    }
  }

  this.testClick = function(e){
    if (e!=undefined && $(e.target).parent().children('.tree-node').length==0){
      if(window.TreesFocusManager.activeTree){
        window.TreesFocusManager.activeTree.FocusManager.clearFocus();
      }
    }
  };

  this.initTreeKeys = function(){
    if (!this.initedKeys){
      this.initedKeys = true;

      FE.manageEvent('onmousedown','TreesFocusManager.testClick(event)');

      $(document).keydown(function(e){
        if (e.keyCode == 37) {
          TreesFocusManager.collapseNodes();
        }
        if (e.keyCode == 39) {
          TreesFocusManager.expandNodes();
        }
        if (e.keyCode == 38) {
          TreesFocusManager.goUp(e);
          TreesFocusManager.checkScroll();
          if (TreesFocusManager.activeTree && TreesFocusManager.activeTree.FocusManager.activeNode){
            return false;
          }
        }
        if (e.keyCode == 40) {
          TreesFocusManager.goDown(e);
          TreesFocusManager.checkScroll();
          if (TreesFocusManager.activeTree && TreesFocusManager.activeTree.FocusManager.activeNode){
            return false;
          }
        }
        if (e.keyCode == 32) {
          TreesFocusManager.makeClick();
          if (TreesFocusManager.activeTree && TreesFocusManager.activeTree.FocusManager.activeNode){
            return false;
          }
        }
        if (e.keyCode == 13) {
          TreesFocusManager.makeClick();
          if (TreesFocusManager.activeTree && TreesFocusManager.activeTree.FocusManager.activeNode){
            return false;
          }
        }
        if (e.keyCode == 16) {
          if (TreesFocusManager.activeTree){
            TreesFocusManager.activeTree.FocusManager.setSelMode();
          }
          if (TreesFocusManager.activeTree && TreesFocusManager.activeTree.FocusManager.activeNode){
            return false;
          }
        }
      });
    }
  }
}

window.TreesFocusManager = new F_TreesFocusManager();

F_TreeFocusManager = function(tree){
  this.activeNode   = false;
  this.activeNodeId = false;
  this.tree = tree;
  this.selModeSel = true;
  window.TreesFocusManager.register(this.tree.id);

  this.makeClick = function(){
    if (this.activeNode){
      this.activeNode.click();
    }
  }

  this.clearFocus = function(){
    if (this.activeNode){
      this.activeNode.removeClass('node-focus');
      this.activeNode = false;
    }
  }

  this.setSelMode = function(){
    if (this.activeNode){
      this.selModeSel = this.activeNode.is('.node-selected');
    }
  }

  //перемещает фокус по нодам
  this.setActive = function(node, addMode){
    if (this.tree.useKeyBoard){
      if (this.activeNode){
        this.activeNode.removeClass('node-focus');
      }
      node.addClass('node-focus');
      this.activeNode = node;
      var id = node.parent().attr("id");
      this.activeNodeId = id.substr(id.lastIndexOf("_")+1);
      window.TreesFocusManager.setActiveTree(this.tree);
      if (addMode!=undefined && addMode && ( (this.selModeSel&&!this.activeNode.is('.node-selected')) || (!this.selModeSel&&this.activeNode.is('.node-selected')) )){
        this.makeClick();
      }
    }
  }
}

function Tree(id, cubeId, multiselect, selectable){
  FE.level += 10;
  this.id       = id;
  this.pseudo   = 0;
  if (String(cubeId).indexOf('pseudo')!=-1){
    this.cubeId   = cubeId.substr(6);
    this.pseudo   = 1;
  }else{
    this.cubeId   = cubeId;
  }
  Trees[id]     = this;
  this.ro       = false;
  this.selectedNodes      = {};
  this.selectedNodesCount = 0;
  this.hiddenNodesCount   = 0;
  this.multiselect = multiselect==1;
  this.dim         = false;
  this.selectable = selectable==1;
  this.handledEvents = {};
  this.handledEvents['onchangeselection'] = new Array();
  this.handledEvents['onclosebody']       = new Array();
  this.handledEvents['onsetselected']     = new Array();
  this.handledEvents['onchangedepended']  = new Array();
  this.enabledCM  = false;
  this.newchoises = [];
  this.blurT      = false;
  this.searchTxt  = 1;
  this.savedSelection = true;
  this.canSelectLvl   = false;
  this.selModHash     = false;
  this.useKeyBoard    = false;
  this.savedSelModHash  = false;
  this.selectLeafOnly = false;

  var tempDiv = $('#treeTempDiv');
  if (tempDiv.length==0){
    $('body').append('<div id="treeTempDiv" style="display:none;background-attachment:scroll;background-color:white;background-image:none;background-position:0 0;background-repeat:repeat;position:absolute;width:100%;z-index:1000;"></div>');
  }

  this.updateModifier = function(mode, lvl){
    if (lvl==undefined){
      lvl = '';
    }else{
      lvl = '&lvl='+lvl;
    }
    if (this.DimFixInfo!=undefined){
      var fixInfo = this.DimFixInfo.getFixInfo( );
      var sid     = '&srcId='+this.DimFixInfo.srcId;
    }else{
      var fixInfo = '';
      var sid     = '';
    }
    if (this.selModHash){
      var mh = '&selModHash='+this.selModHash;
    }else{
      var mh = '';
    }
    lockScreen();
    FE.manageEvent('ajaxafterload','unlockScreen()');
    downloadPage('index.php','ajax=tree_service&action=modifySelection&treeId='+this.cubeId+fixInfo+sid+'&pseudo='+this.pseudo+'&nodeId='+window.TreesFocusManager.activeTree.FocusManager.activeNodeId+'&treeDivId='+this.id+'&fixedNow='+(this.fixedElements?1:0)+'&mode='+mode+lvl+mh+this.getSelectionAsArray(), 'treeTempDiv', '');

  }

  this.getLvl = function(node){
    var lvl = '';
    var nodeClasses = node.className.split(' ');
    v = jQuery.each(nodeClasses, function(i, val){
      val = val+'';
      if (val.match(/l\d/ )){
        lvl = val.substr(1)-(-1);
        return false;
      }
    });
    return lvl;
  }

  this.selectLvl = function(node){
    var lvl = this.getLvl(node)-1;
    //select existing
    $('#tree'+this.id+' li.l'+lvl).children('.tree-node').addClass('node-selected');
    this.reInitSelected();
    $('#tree'+this.id+' li.l'+lvl).parent().parent().parent().parent().children('li').children('.tree-node').addClass('node-hasselected');
    this.setSelectedCountLabel();
    return lvl;
  }

  this.deSelectLvl = function(node){
    var lvl = this.getLvl(node);
    //deselect existing
    $('li.l'+(lvl-1)).children('.tree-node').removeClass('node-selected');
    this.reInitSelected();
    this.setSelectedCountLabel();
    return lvl;
  }

  this.initKeyBoard = function(){
    this.useKeyBoard = true;
    this.FocusManager = new F_TreeFocusManager(this);
    window.TreesFocusManager.initTreeKeys();
  }

  this.checkHaveChilds = function(node){
    if ($(node).length){
      if ($(node).is('li')){
        var len = $(node).find('li').length;
        var exp = $(node).find('.tree-expander').length;
      }else{
        var len = $(node).parent().find('li').length;
        var exp = $(node).parent().find('.tree-expander').length;
      }
    }else{
      var len = $('#childs'+this.id+'_'+node).children('.tree-childs').find('li').length;
      var exp = $('#node'+this.id+'_'+node+' .tree-expander').length;
    }
    if (node){
      return (len || exp);
    }else{
      return false;
    }
  }

  this.initCM = function(newchoises){
    this.enabledCM = true;
    this.newchoises = newchoises;
    container = $('div#myMenu'+this.id);
    if (container.length==0){
      $(document.createElement('div')).attr('id', 'myMenu'+this.id).addClass('contextMenu').appendTo(document.body);
      container = $('div#myMenu'+this.id);
      $.each(this.newchoises , function(){
        if (this.label!='-' && this.label!='hr'){
          var actio      = this.action;
          $('<div class=""><a href="#'+this.action+'">'+this.label+'</a></div>').appendTo(container);
        }else{
          $(document.createElement('div')).html('&nbsp;').addClass('separator').appendTo(container);
        }
      }
      )
    }
    $("#tree"+this.id+" div.tree-node").contextMenu({
      menu: 'myMenu'+this.id,
      init: function(sel,el){
        var id = $(el).parents('.tree').attr('id').substr(4);
        window.Trees[id].FocusManager.setActive($(el));
        $(this).css('z-index',++FE.level);
        $('#'+sel+' a').each(function(){
          var act = $(this).attr('href').substr(1);
          if (window.TreeInits[act]!=undefined){
            if (!window.TreeInits[act](this,el)){
              $(this).parent().addClass('disabled');
            }else{
              $(this).parent().removeClass('disabled');
            }
          }
        })
      }
    },
    function(action, el, pos) {
      action = action.indexOf('#')?action.substr(action.indexOf('#')+1):action;
      var i = window.TreeClick[action](el);
    });
  }

  this.getSelectedNodes = function(id) {
    var arr = new Array();
    $('#tree'+id).find('.tree-node').each(function(){
      if ($(this).hasClass('node-selected')) {
        arr[arr.length] = $(this).parent().attr('id').split('_')[1];
      }
    });
    return arr;
  }

  this.getCountSelectedNodes = function(id) {
    var i = 0;
    $('#tree'+id).find('.tree-node').each(function(){
      if ($(this).hasClass('node-selected')) {
        i++;
      }
    });
    return i;
  }

  this.selectAll = function(id){
    var s = this.selectLeafOnly;
    $('#tree'+id).find('.tree-node').each(function(){
      if (s && $(this).parent().children('.tree-childs').find('li').length == 0) {
        $(this).addClass('node-selected');
      }
    });
    this.handleEvent('onsetselected');
  }

  this.selectNodes = function(id, arr) {
    var s = this.selectLeafOnly;
    $('#tree'+id).find('.tree-node').each(function(){
      if (in_array($(this).parent().attr('id').split('_')[1], arr)) {
        $(this).addClass('node-selected');
      }
    });
    this.handleEvent('onsetselected');
  }

  this.deselectAll = function() {
    $('#tree'+this.id).find('.tree-node').each(function(){
      $(this).removeClass('node-selected');
    });
    this.handleEvent('onsetselected');
  }

  this.initSelectable = function(){
    if (this.enabledCM){
      if (!window.opera){
        $("#tree"+this.id+" div.tree-node").unbind('contextmenu');
      }
      this.initCM();
    }
    if (this.selectable){
      $('#tree'+this.id+' div.tree-node').hover(function(){Trees[id].ro = this;$(this).addClass('node-rollover')},function(){$(this).removeClass('node-rollover')});
      $('#tree'+this.id+' div.tree-node').unbind('click');
      if (this.multiselect){
        $('#tree'+this.id+' div.tree-node').click(
        function(){
          eval('t'+id+'.toggleSelected(this);');
        }
        );
      }else{
        $('#tree'+this.id+' div.tree-node').click(
        function(){
          eval('t'+id+'.setSelected(this);');
        }
        );
      }
    }
  }

  this.initSelectable();
  this.getFirstSelected = function(){
    for (i in this.selectedNodes){
      return i;
    }
    return false;
  }

  this.manageEvent = function(evName, launchEventName){
    window.TreesEvents[launchEventName] = this;
    if (this.handledEvents[evName][launchEventName]==undefined){
      this.handledEvents[evName][launchEventName] = launchEventName;
    }
  }

  this.handleEvent = function(evName){
    for (var i in this.handledEvents[evName]){
      var ev = this.handledEvents[evName][i];
      FE.handleEvent(ev,this.selectedNodes);
    }
  }

  this.clearEvent = function(evName){
    this.handledEvents[evName] = new Array();
  }

  this.setSelection = function(mixed){
    switch(typeof(mixed)){
      case 'object':
      if (mixed.nodeName == 'DIV'){
        if (mixed.parentNode && mixed.parentNode.id){
          var id = mixed.parentNode.id.substr(mixed.parentNode.id.lastIndexOf('_')+1);
          this.selectedNodes[id] = true;
          var node = $(mixed);
          node.addClass('node-selected');
        }
      }
      break;
      case 'number':
      case 'string':
      this.selectedNodes[mixed] = true;
      var node = $('#node'+this.id+'_'+mixed+' .tree-node');
      node.addClass('node-selected');
      break;
    }
    node.parents('li').children('.tree-node').addClass('node-hasselected');
    this.selectedNodesCount++;
    //this.setSelectedCountLabel();
    this.handleEvent('onchangeselection');
    this.savedSelection     = false;
  }

  //очиста отметки измерения
  this.clearSelection = function(){
    $('#tree'+this.id+' .tree-node').removeClass('node-selected');
    $('#tree'+this.id+' .tree-node').removeClass('node-hasselected');
    this.selectedNodes      = {};
    this.selectedNodesCount = 0;
    this.handleEvent('onchangeselection');
    this.savedSelection     = false;
  }

  //отмечает елементы. во всех смыслах
  this.setSelected = function (tar){
    if (!this.selectLeafOnly || !this.checkHaveChilds(tar)){
      //очистим отметку
      this.clearSelection();
      //добавим отметку
      this.setSelection(tar);
      if (this.dim){
        //спрячем дим бодиу
        var treeBody=$('#cmbBody'+this.id);
        treeBody.removeClass('cmb-body');
        treeBody.addClass('cmb-body-hidden');
        treeBody.addClass('cmb-body-hiddenbyme');
        //поставим подпись о текущем елементе
        $('#cmbHead'+this.id+' * .inner').attr('innerHTML',tar.innerHTML);
        $('#cmbHead'+this.id+' * .inner').attr('title',tar.innerHTML);
        $('#cmbHead'+this.id).find('.cmb-count').attr('innerHTML','');
        this.handleEvent('onclosebody');
      }
      this.savedSelection     = false;
      if (this.FocusManager){
        this.FocusManager.setActive($(tar));
      }
      this.handleEvent('onsetselected');
      this.handleDep();
    }else{
      $(tar).prevAll('.tree-expander').click();
    }
  }
  this.handleDep = function(){}

  //подсчитывает кол-во отмеченных елементов
  this.setSelectedCountLabel = function (){
    if (this.dim){
      $('#cmbHead'+this.id).find('.cmb-count').attr( 'innerHTML' , this.selectedNodesCount + this.hiddenNodesCount);
    }
  }

  //Функция для работы с мультиселектами
  this.toggleSelected = function(tar){
    if (!this.selectLeafOnly || !this.checkHaveChilds(tar)){
      var node = tar;
      $tar = $(tar);
      $tar.toggleClass('node-selected');
      if ($tar.attr('className').indexOf('node-selected')==-1){
        this.reInitSelected();
      }else{
        if (ctrlIsDown){
          var selection = $('#'+this.id+' div.node-selected');
          this.selectedNodesCount = selection.length-1;
        }
        this.setSelection(tar);
      }
      this.setSelectedCountLabel();
      this.handleEvent('onsetselected');
      if (this.FocusManager){
        this.FocusManager.setActive($tar);
      }
    }else{
      $(tar).prevAll('.tree-expander').click();
    }
    /*
    жутка глюкавая - закомментил
    Маслов
    if (FE.alt){
    if ($tar.is('.node-selected')){
    window.TreeClick['selectCh'](this.FocusManager.activeNode);
    }else{
    window.TreeClick['deselectCh'](this.FocusManager.activeNode);
    }
    }*/
    //пересбор массива отмеченных
    //this.reInitSelected();
  }

  //функция будет полезна, если например мы из PHP выставили отметку. Она пересоберет массив отмеченных елементов
  this.reInitSelected = function(){
    this.selectedNodes      = {};
    this.selectedNodesCount = 0;
    var tree = this;
    $('#tree'+this.id+' div.node-hasselected').removeClass('node-hasselected');
    $('#tree'+this.id+' div.node-selected').each(
    function (){
      tree.setSelection(this);
      //$(this).parents('li').children('div.tree-node').addClass('node-hasselected');
    }
    );
  }

  //Функция скрывает и показывает детишкав
  this.toggleChilds = function(tar, unitId, notFull, selectAll, doNotOpen){
    var node = tar.parentNode;
    var lvl = this.getLvl(node);
    $tar = $(tar);
    if (doNotOpen==undefined){
      doNotOpen = false;
    }
    if ( !doNotOpen && (node.className.indexOf('hidded')!=-1 || node.childNodes.length==0) ){
      node.className = node.className.split('hidded').join('');
      $tar.removeClass('tree-plus');
      $tar.addClass('tree-minus');
      //node.children('.tree-childs').find('div.tree-plus').click();
    }else{
      node.className = node.className+' hidded';
      $tar.removeClass('tree-minus');
      $tar.addClass('tree-plus');
    }
    var childUL      = findClass('tree-childs','DIV',node);
    if (childUL.length>0){
      if (childUL[0].childNodes.length==0){
        childUL[0].id = 'childs'+this.id+'_'+unitId;
        ms = this.multiselect?1:0;
        if (!notFull && notFull!=undefined){
          childsOpened = '&notFull=0';
          if (doNotOpen){
            childsOpened += '&childsOpened=0';
          }else{
            childsOpened += '&childsOpened=1';
          }
        }else{
          childsOpened = '';
        }
        if (this.DimFixInfo!=undefined){
          var fixInfo = this.DimFixInfo.getFixInfo( );
          var sid     = '&srcId='+this.DimFixInfo.srcId;
        }else{
          var fixInfo = '';
          var sid     = '';
        }
        if (selectAll != undefined){
          var sa = '&selectAll=1';
        }else{
          var sa = '';
        }
        if (lvl!='' &&  this.canSelectLvl){
          var lvl = '&currentLvl='+lvl+'&canSelectLvl=1';
        }else{
          var lvl = '';
        }
        if (this.selModHash){
          var mh = '&selModHash='+this.selModHash;
        }else{
          var mh = '';
        }
        if (this.canSelectLvl){
          var sel = this.getSelectionAsArray();
        }else{
          var sel = '';
        }
        downloadPage('index.php','ajax=tree_service&action=getNodes&multiselect='+ms+sa+sid+'&nodeId='+unitId+mh+lvl+'&pseudo='+this.pseudo+'&treeId='+this.cubeId+'&treeDivId='+this.id+childsOpened+fixInfo+sel, childUL[0].id, 'Загрузка' ,'window.Trees["'+this.id+'"].setSelectedCountLabel();');
      }
    }
  }

  //Функция дергает все дерево заного
  this.refreshTree = function(){
    $('#cmbHead'+this.id).find('.cmb-count').attr( 'innerHTML','...');
    ms = this.multiselect?1:0;
    if (this.DimFixInfo!=undefined){
      var fixInfo = this.DimFixInfo.getFixInfo();
    }else{
      var fixInfo = '';
    }
    if (this.selModHash){
      var mh = '&selModHash='+this.selModHash;
    }else{
      var mh = '';
    }
    var cmb = window.Combos[this.id];
    if (this.dim && cmb.isCal != ''){
      var cal = '&calId='+cmb.isCal;
    }else{
      var cal = '';
    }
    lockScreen();
    FE.manageEvent('ajaxafterload','unlockScreen()');
    downloadPage('index.php','ajax=tree_service&action=getNodes&multiselect='+ms+mh+cal+'&pseudo='+this.pseudo+'&treeId='+this.cubeId+'&srcId='+this.DimFixInfo.srcId+'&treeDivId='+this.id+fixInfo+this.getSelectionAsArray(), 'tree'+this.id, 'Загрузка' ,'window.Trees["'+this.id+'"].setSelectedCountLabel();window.Trees["'+this.id+'"].handleEvent("onchangedepended");');

  }

  this.getSelectionAsArray = function(fieldName){
    s = '';
    var treeId = this.id;
    if (fieldName==undefined){
      var fieldName = 'selection';
      var selModName = 'selMod';
    }
    if (selModName==undefined){
      var selModName = 'selMod'+fieldName;
    }
    var processed = {};
    jQuery.each(this.selectedNodes,function(n,val){
      var f = Number( n );
      var re = new RegExp(/([y,h,q,m,d]{1})([0-9]{2})l([0-9]{2})l([0-9]{4})/);
      if (re.test(n)){
        n = n.replace(/l/g,'.');
      }
      if (processed[n]==undefined){
        processed[n] = n
        s += '&'+fieldName+'['+treeId+'][]='+n;
      }
    })
    return s;
  }

  this.updateHidden = function(hidden, hashName){
    this.hiddenNodesCount = hidden;
    this.selModHash       = hashName;
    this.savedSelModHash  = this.savedselModHash?this.savedSelModHash:hashName;
    this.setSelectedCountLabel();
  }

  //функция выдает отмеченные елементы через запятую
  this.getForForm = function(){
    var s = '';
    var count = 0;
    var len;
    jQuery.each(this.selectedNodes,function(n,val){
      var f = Number( n );
      var re = new RegExp(/([y,h,q,m,d]{1})([0-9]{2})l([0-9]{2})l([0-9]{4})/);
      if (re.test(n)){
        n = n.replace(/l/g,'.');
      }
      if ( n.toString() != f.toString() ){
        //n = "'"+n+"'";
      }
      len = n.toString().length;
      s += 'i:'+count+';s:'+len+':"'+n+'";';
      count++;
    })
    return 'a:'+count+':{'+s+'}';
  }

  this.TreeGo = function(){

  }
  this.startSearchNode = function(cubeId, id, txt, target, caption){
    var txt = txt || $('div#TreeSearchForm .input-search').val();

    if (txt != this.searchTxt){
      if (!caption){
        caption = 'Идет поиск';
      }
      if (!target)  {
        target = 'TreeSearchFormResults';
        var exists = !true;
      }else{
        var exists = true;
      }

      var tar = $('div#'+target);
      if (txt.length>3 && 'Введите строку поиска'!=txt){
        if ($('#'+target).length){

        }else{
          $(document.createElement('div')).hide().attr('id',target).appendTo(document.body);
          tar = $('#'+target);
        }
        FE.level++;/*
        var par = $('div#TreeSearchForm');
        var ipos    = par.position();
        ipos.top += par.height();
        var treeBody = $('#tree'+this.id);
        if (treeBody.width()>0){
        ipos.width  = treeBody.width()-4;
        ipos.height = treeBody.height()-4;
        }else{
        ipos.width  = par.width()-4;
        ipos.height = 300;
        }
        $(tar).insertAfter( par );*/
        if (!exists){
          var cmbBody = $('#cmbBody'+this.id);
          if (cmbBody.length>0){
            $(tar).insertAfter( cmbBody );
          }else{
            var treeBody = $('#tree'+this.id);
            $(tar).insertAfter( treeBody );
          }
          $(tar).css(this.ipos).css('z-index',FE.level).show();
        }
        //alert('ajax=tree_service&action=searchNodes&treeId='+cubeId+'&pseudo='+this.pseudo+'&text='+escapeRus(txt)+'&treeDivId='+id)
        downloadPage('index.php','ajax=tree_service&action=searchNodes&treeId='+cubeId+'&pseudo='+this.pseudo+'&text='+escapeRus(txt)+'&treeDivId='+id, target, caption );
      }
    }
    this.searchTxt = txt;
  }


  this.onBlurInit = function(){
    if (this.blurT){
      clearTimeout(this.blurT);
    }
    window.tempGlobVarIESUXTreeID = this.id;
    this.blurT = setTimeout(function(){window.Trees[window.tempGlobVarIESUXTreeID].startSearchNode(window.Trees[window.tempGlobVarIESUXTreeID].cubeId, window.tempGlobVarIESUXTreeID);},1000);
  }

  this.downloadNode = function(id, parents){

    var pa = parents.split(',');
    //проверка есть ли темка

    var node = $('li#node'+this.id+'_'+id);
    if (node.length>0){
      if (!this.multiselect){
        this.clearSelection();
      }
      this.setSelection(id);
      this.setSelectedCountLabel();
    }else{
      for(var i in pa){
        var nid = pa[i];
        if (nid.length>0){
          var node = $('li#node'+this.id+'_'+nid);
          if (node.length>0){
            if (!this.multiselect){
              this.clearSelection();
            }
            ms = this.multiselect?1:0;
            node.find('div.tree-childs').attr('id','childs'+this.id+'_'+id);
            node.removeClass('hidded');
            node.find('tree-expander').removeClass('tree-plus').addClass('tree-minus');
            FE.manageEvent('ajaxafterload','FE.handleEvent("downloadNodeComplete");FE.clearEvent("ajaxafterload");');
            downloadPage('index.php','ajax=tree_service&action=getNodes&multiselect='+ms+'&pseudo='+this.pseudo+'&nodeId='+nid+'&treeId='+this.cubeId+'&treeDivId='+this.id+'&selection='+id+'&childsOpened=1', 'childs'+this.id+'_'+id, 'Загрузка' , 'window.Trees["'+this.id+'"].focusNewNode("'+nid+'","'+id+'")');
            break;
          }
        }
      }
    }
    $('div#TreeSearchFormResults').hide();
    $('div#TreeSearchForm').hide();
    setTimeout("if ($('#cmbBody"+this.id+":hidden').length>0){$('#cmbHead"+this.id+" .cmb-drop').click();}",100);
    FE.handleEvent('downloadNode');
    FE.handleEvent("downloadNodeComplete");
  }

  this.setLabel = function(label){
    $('#cmbHead'+this.id+' * .inner').html(label);
  }

  this.getNodeName = function(id){
    return $('#node'+this.id+'_'+id).children('.tree-node').html();
  }

  this.focusNewNode = function(nid, newNode){
    $('#node'+this.id+'_'+nid).children('.tree-plus').addClass('tree-minus').removeClass('tree-plus');
    if (this.FocusManager){
      this.FocusManager.setActive($('#node'+this.id+'_'+newNode).children('.tree-node'));
      TreesFocusManager.checkScroll();
    }
    this.reInitSelected();
  }

  this.TreeShowSearchForm = function (){
    tar = $('div#TreeSearchForm');
    this.FocusManager.activeNode.removeClass('node-focus');
    this.FocusManager.activeNode = false;
    if (tar.length){

    }else{
      $(document.createElement('div')).hide().attr('id','TreeSearchForm').appendTo(document.body);
      tar = $('div#TreeSearchForm');
      $(document.createElement('input')).addClass('input-search').val('Введите строку поиска').attr('id','i-se-'+this.id).click(function(){if (this.value=='Введите строку поиска'){this.value='';}}).appendTo(tar);
    }
    if ($('#cmbHead'+this.id).length>0){
      var ipos = $('#cmbHead'+this.id+' div.inner').position();
      $(tar).insertAfter( $('#cmbHead'+this.id));
      ipos.top -= 2;
      ipos.width = $('#cmbHead'+this.id+' div.inner').width()-4;
      this.ipos        = $('#cmbBody'+this.id).position();
      this.ipos.height = $('#cmbBody'+this.id).height();
      this.ipos.width  = $('#cmbBody'+this.id).width();
    }else{
      var treeTar  = $('#tree'+this.id+'');
      var ipos     = treeTar.position();
      $(tar).insertAfter( treeTar );
      this.ipos        = treeTar.position();
      this.ipos.height = treeTar.height()-(tar).height()-3;
      this.ipos.width  = treeTar.width();
      this.ipos.top    += $(tar).height()+3;
      ipos.width       = treeTar.width();
    }
    $(tar).css(ipos).css('z-index',FE.level).show();
    tar.find('.input-search').focus().select().keyup(function(e){var id = this.id.substr(5);window.Trees[id].onBlurInit();});
    $('body').click(TreeHideSearchForm);
  }


  this.reInitSelected();
}

TreeHideSearchForm = function (target){
  var c = target!=undefined && !$(target).parents('div#TreeSearchForm').length && !$(target).parents('div#TreeSearchFormResults').length
  var c = !$(target.target).is('.input-search');
  if (c){
    $('body').unbind('click',TreeHideSearchForm);
    $('div#TreeSearchForm').remove();
    $('div#TreeSearchFormResults').remove();
  }
}

//Функция пробегает по всем димам на странице и сериализует их для PHP
function getAllTreesForForm(){
  var s = ''
  var len;
  var st = '';
  var count = 0;
  jQuery.each(Trees,function(n,val){
    len = val.id.toString().length;
    s += 's:'+len+':"'+val.id+'"'+';'+val.getForForm();
    count++;
  })
  return 'a:'+count+':{'+s+'}';
}