    instantdeptloader = 
    function()
    {

      //
      // Common
      //

      var nothingSelected = $('nothingSelected');
      var pageInfoPanel = $('page-info-panel');
      var pageInfo = $('page-info');
      var selectionBehaviour = {
        change: function(){
          if (this.items.length)
          {
            showInfo();
            var node = this.items.first();
            if (node.clone)
             node = node.clone;
            var page;
            if (node.nodeType == 'page')
              page = node;

            if (page)
            {
              var p = page.getPath();
              if (p.length > 0)
               pageInfo.innerHTML = '<div class="type subord"><span>Подчиненность:</span><span class="over"></span><p>- '+p.join('<br/>-&#160;')+'</p></div>';

              if (page.data.fio)
               pageInfo.innerHTML += '<div class="type boss"><span>Руководитель:</span><span class="over"></span><p>'+page.data.fio+'</p></div>';
              if (page.data.phone)
               pageInfo.innerHTML += '<div class="type phone"><span>Тел.:</span><span class="over"></span><p>'+page.data.phone+'</p></div>';
              if (page.data.site)
               pageInfo.innerHTML += '<div class="type info"><span>Инфо:</span><span class="over"></span><p><a href="'+page.data.site+'" target="_blank">подробнее...</a></p></div>';
            }
          }
          else
            hideInfo();
        }
      };

      //
      // Search
      //

      var editorTreeMode = 'overview', prevSearch = '';
      var searchInput, searchCancel;
      var nothingFound = $element('.nothing_found', 'Ничего не найдено');
      $insert('search_dept', $element('', searchInput = $element('INPUT'), searchCancel = $element('.cancel[title="Отмена поиска"]')));
      $addHandler(searchCancel, 'click', function(){ searchInput.value = ''; $fireEvent(searchInput, 'keyup') });
      $addHandler(searchInput, 'keyup', function(event){
        var forSearch = this.value.qw().join(' '), found = 0;
        if (forSearch != '' && editorTreeMode != 'search')
        {
          editorTreeMode = 'search';
          $class('search_dept').add('search_mode');
          SearchTree.loadForSearch = '';
          $remove(Tree.element);
          $insert('page_tree', SearchTree.element);
          SearchTree.selection.dispatch('change');
        }
        else if (forSearch == '' && editorTreeMode != 'overview')
        {
          editorTreeMode = 'overview';
          $class('search_dept').remove('search_mode');
          $remove(SearchTree.element);
          $insert('page_tree', Tree.element);
          SearchTree.selection.clear();
          Tree.selection.dispatch('change');
          return;
        }
        if (editorTreeMode == 'search' && forSearch != prevSearch)
        {
          if (prevSearch && SearchTree.loadForSearch &&
              SearchTree.loadForSearch == forSearch.substring(0, SearchTree.loadForSearch.length) &&
              (prevSearch == forSearch.substring(0, prevSearch.length) ||
               forSearch  == prevSearch.substring(0, forSearch.length)))
          {
            $axis(SearchTree.root, $axis.DESCENDANT)
            .forEach(function(node){
              var match = this.every(''.match, node.data.title);
              if (match) found++;
              node.element.style.display = match ? 'block' : 'none';
            }, forSearch.qw().map(function(word){ return new RegExp('(^|[\\s,."-])' + word + (word.length > 2 ? '' : '(\\S|$)'), 'i') }))
          }
          else
          {
            SearchTree.clear();
            SearchTree.loadForSearch = forSearch;
            $axis(Tree.root, $axis.DESCENDANT)
            .filter(function(node){
              if (node.nodeType == 'page')
                return this.every(''.match, node.data.title);
            }, forSearch.qw().map(function(word){ return new RegExp('(^|[\\s,."-])' + word + (word.length > 2 ? '' : '(\\S|$)'), 'i') }))
            .sortAsObject('data.title.toLowerCase()')
            .forEach(function(node){ SearchTree.root.appendChild(node.cloneNode(false)).clone = node; });
            found = SearchTree.root.childNodes.length;
          }
          if (found)
            $remove(nothingFound);
          else
            $insert(SearchTree.root.element, nothingFound);

          prevSearch = forSearch;
        }
      }, searchInput);

      //
      // New Basis.Tree node types
      //
      Basis.Tree.DeferedFolder = Class.create(Basis.Tree.AjaxFolder);
      Basis.Tree.DeferedFolder.extend({
        transportProto: $extend({}, Basis.Tree.AjaxFolder.prototype.transportProto, {
          onLoading: function(){
            $insert(this.node.content, this.loadLabel)
            searchInput.disabled = true;
          },
          onSuccess: function(req){
            if (!this.node) return;
            try {
              var nodes = eval(req.responseText);
              this.node.clear();
              Tree.insert(this.node, nodes);
              this.node.dispatch('success');
            } catch(e){ alert($em(e)) }
          },
          onComplete: function(){
            if (this.node)
            {
              $remove(this.loadLabel)
              this.node.dispatch('complete');
              $class(this.node.document.root.element).add('root-invisible');
            }
            searchInput.disabled = false;
          }
        }),
        init: function(data){
          this.inherit(data);
          this.data.location = '/pages/add/tree.php';
        }
      });

      Basis.Tree.Page = Class.create(Basis.Tree.Folder);
      Basis.Tree.Page.extend({
        nodeType: 'page',

        init: function(data){
          this.inherit(data);

          $class(this.element).add('empty');
          if (this.data.site)
          {
            $class(this.content).add('have_site');
          }
        },
        appendChild: function(newChild){
          var result = this.inherit(newChild);
          if (this.childNodes.length == 1)
            $class(this.element).remove('empty');
          return result;
        },
        removeChild: function(oldChild){
          var result = this.inherit(oldChild);
          if (!this.childNodes.length)
            $class(this.element).add('empty');
          return result;
        },
        clear: function(){
          this.inherit();
          $class(this.element).add('empty');
        },
        getPath: function(){
          var parent = this.parentNode;
//          if (this.clone) parent = this.clone.parentNode;

          var result = new Array();
          while (parent && parent != this.document.root)
          {
            result.push(parent.data.title);
            parent = parent.parentNode;
          }
          return result.reverse();
        },
        destroy: function(){
          delete this.clone;
          this.inherit();
        }
      });

      //
      // Navigation tree
      //
      Tree = new Basis.Tree('page_tree', new Basis.Tree.DeferedFolder({ title: 'Структура ОГУ', visible: true, collapsed: false }));
      $class(Tree.element.firstChild).add('border-frame');
      Tree.selection.multiple = false;
      Tree.selection.addHandler(selectionBehaviour);
      Tree.insert = function(parent, nodes){
        var parent = parent || Tree.root;
        var node;
        for (var i = 0; i < nodes.length; i++)
        {
          var node, data = nodes[i];
          var childs = data.childs;
          delete data.childs;
          data.collapsed = parent != Tree.root;
          node = new Basis.Tree.Page(data);
          node = parent.appendChild(node);

          if (node && childs)
            Tree.insert(node, childs);
        }
      };

      Tree.root.upload();

      //
      // Search tree
      //
      var SearchTree = new Basis.Tree(null, { title: 'root', visible: false });
      SearchTree.element.id = "editor-search-tree";
      $class(SearchTree.element.firstChild).add('border-frame');
      SearchTree.selection.multiple = false;
      SearchTree.loadForSearch = '';
      $remove(SearchTree.element);
      SearchTree.selection.addHandler(selectionBehaviour);

      function hideInfo(){
        $remove(pageInfoPanel);
        $insert('page', nothingSelected);
      }
      function showInfo(){
        $remove(nothingSelected);
        $insert('page', pageInfoPanel);
      }
      hideInfo();
    }
    instantdeptloader();