﻿// Copyright (C) 2007 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// Created by: Alexander Ilyin
// Created:    2007.09.25


Ext.namespace("Xtensive");

Xtensive.TreeViewerTreePanel = function(cfg) {
  Xtensive.TreeViewerTreePanel.superclass.constructor.call(this, cfg);
  this.nodeIndex = {};
}
Ext.extend(Xtensive.TreeViewerTreePanel, Ext.tree.TreePanel, {
  getNodeKey: function(a1, a2) {
    if (a2) {
      return a1 + "|" + a2;
    }
    else {
      var node = a1;
      var nodeId = node.attributes.nodeId;
      var nodeTreeId = node.attributes.nodeTreeId;
      if (!nodeId || !nodeTreeId)
        return;
      return this.getNodeKey(nodeId, nodeTreeId);
    }
  },

  registerNode: function(node) {
    Xtensive.TreeViewerTreePanel.superclass.registerNode.apply(this, arguments);
    var key = this.getNodeKey(node);
    if (!key)
      return;
    var entry = this.nodeIndex[key];
    if (!entry) {
      this.nodeIndex[key] = node;
      return;
    }
    if (!Ext.isArray(entry)) {
      this.nodeIndex[key] = [entry, node];
      return;
    }
    entry.push(node);
  },

  unregisterNode: function(node) {
    Xtensive.TreeViewerTreePanel.superclass.unregisterNode.apply(this, arguments);
    var key = this.getNodeKey(node);
    if (!key)
      return;
    var entry = this.nodeIndex[key];
    if (Ext.isArray(entry)) {
      for (var i = 0; i < entry.length; i++) {
        if (entry[i] == node) {
          entry.splice(i, 1);
          break;
        }
      }
    }
    if (entry == node)
      delete this.nodeIndex[key];
  },

  getNodes: function(nodeId, nodeTreeId) {
    var key = this.getNodeKey(nodeId, nodeTreeId);
    var entry = this.nodeIndex[key];
    if (Ext.isArray(entry))
      return result;
    else
      return entry ? [entry] : [];
  },

  refresh: function(nodeId, nodeTreeId) {
    var nodes = this.getNodes(nodeId, nodeTreeId);
    for (var i = 0; i < nodes.length; i++) {
      var parentNode = nodes[i].parentNode;
      if (parentNode && parentNode.reload)
        parentNode.reload();
    }
  },

  expand: function(path) {
    this.expandRecursive(path, 0, this.root);
  },

  expandRecursive: function(path, depth, node) {
    var callback = function() {
      if (depth >= path.length)
        return;
      var childPathFragment = path[depth];
      var childKey = this.getNodeKey(childPathFragment.nodeId, childPathFragment.nodeTreeId);
      for (var i = 0; i < node.childNodes.length; i++) {
        var childNode = node.childNodes[i];
        if (this.getNodeKey(childNode) == childKey) {
          this.expandRecursive(path, depth + 1, childNode);
        }
      }
    };
    if (node.isExpanded())
      callback.apply(this, []);
    else
      node.expand(false, true, callback.createDelegate(this));
  }
});

if (typeof (Sys) !== 'undefined')
  Sys.Application.notifyScriptLoaded();