﻿// 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");

// config
//  rootNodes : [TreeNode]
Xtensive.ObservableTreeLoader = function(cfg) {
  Xtensive.ObservableTreeLoader.superclass.constructor.call(this, cfg);
  this.addEvents('nodeExpanding');
};

Ext.extend(Xtensive.ObservableTreeLoader, Ext.tree.TreeLoader, {
  rootNodesFactory: null,

  load: function(node, callback) {
    if (node.getOwnerTree().root == node) {
      if (this.rootNodes) {
        var childs = this.rootNodes;
        var length = childs.length;
        node.beginUpdate();
        for (var i = 0; i < length; i++)
          node.appendChild(childs[i]);
        node.endUpdate();
        callback(node);
        delete this.rootNodes; // rootNodes should be used only once (on start)
      }
      else
        this.fireEvent('nodeExpanding', node, callback);      
    }
    else {
      if (node.attributes.preloaded) {
        callback(node);
        node.attributes.preloaded = false;
        return;
      }
      if (node.isLoaded()) {
        callback(node);
        return;
      }
      else
        this.fireEvent('nodeExpanding', node, callback);
    }
  }
});

if (typeof (Sys) !== 'undefined')
  Sys.Application.notifyScriptLoaded();