function AutoLayoutManager(xml) {
  var allLayouts = new Object();
  var allPanels = new Object();
  var panelWithLayout = new Array();
  var randomseed = 0;
  var createLayout = function(container, nodeRoot) {
    var layout = new YAHOO.ext.BorderLayout(container, {});
    layout.beginUpdate();
    createRegion(nodeRoot, layout, 'north');
    createRegion(nodeRoot, layout, 'south');
    createRegion(nodeRoot, layout, 'east');
    createRegion(nodeRoot, layout, 'west');
    createRegion(nodeRoot, layout, 'center');
    layout.endUpdate();
    if(nodeRoot.getAttribute('id'))
      allLayouts[nodeRoot.getAttribute('id')] = layout;
    return layout;
  };
  var createRegion = function(nodeRoot, layout, target) {
    for(var i=0; i<nodeRoot.childNodes.length; i++) {
      var region = nodeRoot.childNodes[i];
      if(region.nodeName==target) {
        layout.addRegion(target, createConfig(region));
        var nestLayoutNode = region.getElementsByTagName('BorderLayout')[0];
        if(nestLayoutNode && nestLayoutNode.parentNode==region) {
          var newdiv;
          if(!nestLayoutNode.getAttribute('id'))
            newdiv = YAHOO.ext.DomHelper.append(layout.getEl().dom, {tag:'div', id:'randomlayout'+(randomseed++)});
          if(!document.getElementById(nestLayoutNode.getAttribute('id')))
            newdiv = YAHOO.ext.DomHelper.append(layout.getEl().dom, {tag:'div', id:nestLayoutNode.getAttribute('id')});
          var nestLayout = createLayout(newdiv, nestLayoutNode);
          layout.add(target, new YAHOO.ext.NestedLayoutPanel(nestLayout));
        } else {
          var panels = region.childNodes;
          var activePanel;
          for(var j=0; j<panels.length; j++) {
            if(panels[j].tagName!='panel')
              continue;
            var pcfg = createConfig(panels[j]);
            if(!document.getElementById(pcfg.id))
              YAHOO.ext.DomHelper.append(layout.getEl().dom, {tag:'div', id:pcfg.id});
            allPanels[pcfg.id] = layout.add(target, new YAHOO.ext.ContentPanel(pcfg.id, pcfg));
            var layoutPanel = panels[j].getElementsByTagName('BorderLayout')[0];
            if(layoutPanel && layoutPanel.parentNode==panels[j])
              panelWithLayout.push({panel:pcfg.id,node:layoutPanel});
            if(pcfg.activePanel)
              activePanel = panels[j];
          }
          if(activePanel)
            layout.showPanel(activePanel.getAttribute('id'));
        }
      }
    }
  };
  var createConfig = function(node) {
    var config = new Object();
    for(var i=0; i<node.attributes.length; i++) {
      var name = node.attributes[i].name;
      var value = node.attributes[i].value;
      if(!isNaN(value))
        config[name] = parseFloat(value);
      else if(value=="true")
        config[name] = true;
      else if(value=="false")
        config[name] = false;
      else {
        config[name] = value;
      }
    }
    return config;
  };
  this.getLayout = function(id) {
    return allLayouts[id];
  };
  this.getPanel = function(id) {
    return allPanels[id];
  };
  this.setBorderLayout = function(container, xml) {
    var xmlhttp;
    if(window.ActiveXObject)
      xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    else if(window.XMLHttpRequest)
      xmlhttp = new XMLHttpRequest();
    var root;
    try {
      xmlhttp.open('GET', xml, false);
      xmlhttp.send(null);
      root = xmlhttp.responseXML.getElementsByTagName('BorderLayout')[0];
      createLayout(container, root);
      while(panelWithLayout.length>0) {
        var obj = panelWithLayout.pop();
        var nestLayout = createLayout(obj.panel, obj.node);
      }
    } catch(ex) {
      alert(ex);
      return;
    }
  };
  if(xml)
    this.setBorderLayout(document.body, xml);
}
                                                                                                                                                                          