//kill all error
window.onerror = function()
{
    alert(error);


    return true;
}
document.onselectstart = function()
{
    return false;
}
/*****************************/
/*           XTree           */
/*****************************/
var webFXTreeConfig =
{
    rootIcon        : 'inc/xtree/foldericon.png',
    openRootIcon    : 'inc/xtree/openfoldericon.png',
    folderIcon      : 'inc/xtree/foldericon.png',
    openFolderIcon  : 'inc/xtree/openfoldericon.png',
    fileIcon        : 'inc/xtree/file.png',
    iIcon           : 'inc/xtree/I.png',
    lIcon           : 'inc/xtree/L.png',
    lMinusIcon      : 'inc/xtree/Lminus.png',
    lPlusIcon       : 'inc/xtree/Lplus.png',
    tIcon           : 'inc/xtree/T.png',
    tMinusIcon      : 'inc/xtree/Tminus.png',
    tPlusIcon       : 'inc/xtree/Tplus.png',
    blankIcon       : 'inc/xtree/blank.png',
    defaultText     : 'Tree Item',
    defaultAction   : 'javascript:void(0);',
    defaultBehavior : 'classic',
    usePersistence  : true
};


var webFXTreeHandler =
{
    idCounter : 0,
    idPrefix  : "webfx-tree-object-",
    all       : {},
    behavior  : null,
    selected  : null,
    onSelect  : null, /* should be part of tree, not handler */
    getId     : function()
    {
        return this.idPrefix + this.idCounter++;
    },
    toggle    : function (oItem)
    {
        this.all[oItem.id.replace('-plus', '')].toggle();
    },
    select    : function (oItem)
    {
        this.all[oItem.id.replace('-icon', '')].select();
    },
    focus     : function (oItem)
    {
        this.all[oItem.id.replace('-anchor', '')].focus();
    },
    blur      : function (oItem)
    {
        this.all[oItem.id.replace('-anchor', '')].blur();
    },
    keydown   : function (oItem, e)
    {
        return this.all[oItem.id].keydown(e.keyCode);
    },
    cookies   : new WebFXCookie(),
    insertHTMLBeforeEnd    :    function (oElement, sHTML)
    {
        if (oElement.insertAdjacentHTML != null)
        {
            oElement.insertAdjacentHTML("BeforeEnd", sHTML)
            return;
        }
        var df;
        // DocumentFragment
        var r = oElement.ownerDocument.createRange();
        r.selectNodeContents(oElement);
        r.collapse(false);
        df = r.createContextualFragment(sHTML);
        oElement.appendChild(df);
    }
};

/*
 * WebFXCookie class
 */
function WebFXCookie()
{
    if (document.cookie.length)
    {
        this.cookies = ' ' + document.cookie;
    }
}

WebFXCookie.prototype.setCookie = function (key, value)
{
    document.cookie = key + "=" + escape(value);
}

WebFXCookie.prototype.getCookie = function (key)
{
    if (this.cookies)
    {
        var start = this.cookies.indexOf(' ' + key + '=');
        if (start == -1)
        {
            return null;
        }
        var end = this.cookies.indexOf(";", start);
        if (end == -1)
        {
            end = this.cookies.length;
        }
        end -= start;
        var cookie = this.cookies.substr(start, end);
        return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1));
    }
    else
    {
        return null;
    }
}

/*
 * WebFXTreeAbstractNode class
 */
function WebFXTreeAbstractNode(sText, sAction, sValue)
{
    this.childNodes = [];
    this.id = webFXTreeHandler.getId();
    this.text = sText;
    //|| webFXTreeConfig.defaultText;

    this.action = sAction;
    // || webFXTreeConfig.defaultAction;
    this._last = false;
    this.value = sValue;
    webFXTreeHandler.all[this.id] = this;
}

/*
 * To speed thing up if you're adding multiple nodes at once (after load)
 * use the bNoIdent parameter to prevent automatic re-indentation and call
 * the obj.ident() method manually once all nodes has been added.
 */

WebFXTreeAbstractNode.prototype.add = function (node, bNoIdent)
{
    node.parentNode = this;
    this.childNodes[this.childNodes.length] = node;
    var root = this;
    if (this.childNodes.length >= 2)
    {
        this.childNodes[this.childNodes.length - 2]._last = false;
    }
    while (root.parentNode)
    {
        root = root.parentNode;
    }

    if (root.rendered)
    {
        if (this.childNodes.length >= 2)
        {
            document.getElementById(this.childNodes[this.childNodes.length - 2].id + '-plus').src = ((this.childNodes[this.childNodes.length - 2].folder)?((this.childNodes[this.childNodes.length - 2].open)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tPlusIcon):webFXTreeConfig.tIcon);
            this.childNodes[this.childNodes.length - 2].plusIcon = webFXTreeConfig.tPlusIcon;
            this.childNodes[this.childNodes.length - 2].minusIcon = webFXTreeConfig.tMinusIcon;
            this.childNodes[this.childNodes.length - 2]._last = false;
        }
        this._last = true;
        var foo = this;
        while (foo.parentNode)
        {
            for (var i = 0; i < foo.parentNode.childNodes.length; i++)
            {
                if (foo.id == foo.parentNode.childNodes[i].id)
                {
                    break;
                }
            }
            if (i == foo.parentNode.childNodes.length - 1)
            {
                foo.parentNode._last = true;
            }
            else
            {
                foo.parentNode._last = false;
            }
            foo = foo.parentNode;
        }
        webFXTreeHandler.insertHTMLBeforeEnd(document.getElementById(this.id + '-cont'), node.toString());
        if ((!this.folder) && (!this.openIcon))
        {
            this.icon = webFXTreeConfig.folderIcon;
            this.openIcon = webFXTreeConfig.openFolderIcon;
        }
        if (!this.folder)
        {
            this.folder = true;
            this.collapse(true);
        }
        if (!bNoIdent)
        {
            this.indent();
        }
    }
    return node;
}

WebFXTreeAbstractNode.prototype.toggle = function()
{
    if (this.folder)
    {
        if (this.open)
        {
            this.collapse();
        }
        else
        {
            this.expand();
        }
    }
}

WebFXTreeAbstractNode.prototype.select = function()
{
    document.getElementById(this.id + '-anchor').focus();
}

WebFXTreeAbstractNode.prototype.deSelect = function()
{
    document.getElementById(this.id + '-anchor').className = '';
    webFXTreeHandler.selected = null;
}

WebFXTreeAbstractNode.prototype.focus = function()
{
    if ((webFXTreeHandler.selected) && (webFXTreeHandler.selected != this))
    {
        webFXTreeHandler.selected.deSelect();
    }
    webFXTreeHandler.selected = this;
    if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic'))
    {
        document.getElementById(this.id + '-icon').src = this.openIcon;
    }
    document.getElementById(this.id + '-anchor').className = 'selected';
    document.getElementById(this.id + '-anchor').focus();
    if (webFXTreeHandler.onSelect)
    {
        webFXTreeHandler.onSelect(this);
    }
}

WebFXTreeAbstractNode.prototype.blur = function()
{
    if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic'))
    {
        document.getElementById(this.id + '-icon').src = this.icon;
    }
    document.getElementById(this.id + '-anchor').className = 'selected-inactive';
}

WebFXTreeAbstractNode.prototype.doExpand = function()
{
    if (webFXTreeHandler.behavior == 'classic')
    {
        document.getElementById(this.id + '-icon').src = this.openIcon;
    }
    if (this.childNodes.length)
    {
        document.getElementById(this.id + '-cont').style.display = 'block';
    }
    this.open = true;
    if (webFXTreeConfig.usePersistence)
    {
        webFXTreeHandler.cookies.setCookie(this.id.substr(18, this.id.length - 18), '1');
    }
}

WebFXTreeAbstractNode.prototype.doCollapse = function()
{
    if (webFXTreeHandler.behavior == 'classic')
    {
        document.getElementById(this.id + '-icon').src = this.icon;
    }
    if (this.childNodes.length)
    {
        document.getElementById(this.id + '-cont').style.display = 'none';
    }
    this.open = false;
    if (webFXTreeConfig.usePersistence)
    {
        webFXTreeHandler.cookies.setCookie(this.id.substr(18, this.id.length - 18), '0');
    }
}

WebFXTreeAbstractNode.prototype.expandAll = function()
{
    this.expandChildren();
    if ((this.folder) && (!this.open))
    {
        this.expand();
    }
}

WebFXTreeAbstractNode.prototype.expandChildren = function()
{
    for (var i = 0; i < this.childNodes.length; i++)
    {
        this.childNodes[i].expandAll();
    }
}

WebFXTreeAbstractNode.prototype.collapseAll = function()
{
    this.collapseChildren();
    if ((this.folder) && (this.open))
    {
        this.collapse(true);
    }
}

WebFXTreeAbstractNode.prototype.collapseChildren = function()
{
    for (var i = 0; i < this.childNodes.length; i++)
    {
        this.childNodes[i].collapseAll();
    }
}

WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level, nodesLeft)
{
    /*
      * Since we only want to modify items one level below ourself,
      * and since the rightmost indentation position is occupied by
      * the plus icon we set this to -2
      */
    if (lvl == null)
    {
        lvl = -2;
    }
    var state = 0;
    for (var i = this.childNodes.length - 1; i >= 0; i--)
    {
        state = this.childNodes[i].indent(lvl + 1, del, last, level);
        if (state)
        {
            return;
        }
    }
    if (del)
    {
        if ((level >= this._level) && (document.getElementById(this.id + '-plus')))
        {
            if (this.folder)
            {
                document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon;
                this.plusIcon = webFXTreeConfig.lPlusIcon;
                this.minusIcon = webFXTreeConfig.lMinusIcon;
            }
            else if (nodesLeft)
            {
                document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon;
            }
            return 1;
        }
    }
    var foo = document.getElementById(this.id + '-indent-' + lvl);
    //window.status+=" "+(foo.tagName);
    if (foo)
    {
        if ((foo._last) || ((del) && (last)))
        {
            foo.src = webFXTreeConfig.blankIcon;
        }
        else
        {
            foo.src = webFXTreeConfig.iIcon;
        }
    }
    return 0;
}

/*
 * WebFXTree class
 */

function WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon)
{
    this.base = WebFXTreeAbstractNode;
    this.base(sText, sAction);
    this.icon = sIcon || webFXTreeConfig.rootIcon;
    this.openIcon = sOpenIcon || webFXTreeConfig.openRootIcon;
    /* Defaults to open */
    if (webFXTreeConfig.usePersistence)
    {
        this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18, this.id.length - 18)) == '0')?false:true;
    }
    else
    {
        this.open = true;
    }
    this.folder = true;
    this.rendered = false;
    this.onSelect = null;
    if (!webFXTreeHandler.behavior)
    {
        webFXTreeHandler.behavior = sBehavior || webFXTreeConfig.defaultBehavior;
    }
}

WebFXTree.prototype = new WebFXTreeAbstractNode;

WebFXTree.prototype.setBehavior = function (sBehavior)
{
    webFXTreeHandler.behavior = sBehavior;
};

WebFXTree.prototype.getBehavior = function (sBehavior)
{
    return webFXTreeHandler.behavior;
};

WebFXTree.prototype.getSelected = function()
{
    if (webFXTreeHandler.selected)
    {
        return webFXTreeHandler.selected;
    }
    else
    {
        return null;
    }
}

WebFXTree.prototype.remove = function()
{
}

WebFXTree.prototype.expand = function()
{
    this.doExpand();
}

WebFXTree.prototype.collapse = function(b)
{
    if (!b)
    {
        this.focus();
    }
    this.doCollapse();
}

WebFXTree.prototype.getFirst = function()
{
    return null;
}

WebFXTree.prototype.getLast = function()
{
    return null;
}

WebFXTree.prototype.getNextSibling = function()
{
    return null;
}

WebFXTree.prototype.getPreviousSibling = function()
{
    return null;
}

WebFXTree.prototype.keydown = function(key)
{
    if (key == 39)
    {
        if (!this.open)
        {
            this.expand();
        }
        else if (this.childNodes.length)
        {
            this.childNodes[0].select();
        }
        return false;
    }
    if (key == 37)
    {
        this.collapse();
        return false;
    }
    if ((key == 40) && (this.open) && (this.childNodes.length))
    {
        this.childNodes[0].select();
        return false;
    }
    return true;
}

WebFXTree.prototype.toString = function()
{
    var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" +
              "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" +
              "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" +
              (this.target ? " target=\"" + this.target + "\"" : "") +
              ">" + this.text + "</a></div>" +
              "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">";
    var sb = [];
    for (var i = 0; i < this.childNodes.length; i++)
    {
        sb[i] = this.childNodes[i].toString(i, this.childNodes.length);
    }
    this.rendered = true;
    return str + sb.join("") + "</div>";
};


WebFXTree.prototype.getSelectIds = function()
{
    var str = "";
    try
    {
        var sels = document.getElementsByName("selRadioObj");
        var size = sels.length;
        for (var i = 0; i < size; i++)
        {
            if (sels[i].checked)
            {
                str += sels[i].value + ",";
            }
        }

        sels = document.getElementsByName("selCheckObj");
        size = sels.length;
        for (var i = 0; i < size; i++)
        {
            if (sels[i].checked)
            {
                str += sels[i].value + ",";
            }
        }

        return  str.substring(0, str.length - 1);
    }
    catch(ex)
    {
        alert(ex.message);
    }
    ;
};

/*
 * WebFXTreeItem class
 */

function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon, sRadio, sCheckBox, sValue, sChecked)
{
    this.base = WebFXTreeAbstractNode;
    this.base(sText, sAction, sValue);

    this.radio = sRadio;
    this.checkbox = sCheckBox;
    this.value = sValue;
    this.checked = sChecked;

    /* Defaults to close */
    if (webFXTreeConfig.usePersistence)
    {
        this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18, this.id.length - 18)) == '1')?true:false;
    }
    else
    {
        this.open = false;
    }
    if (sIcon)
    {
        this.icon = sIcon;
    }
    if (sOpenIcon)
    {
        this.openIcon = sOpenIcon;
    }
    if (eParent)
    {
        eParent.add(this);
    }
}

WebFXTreeItem.prototype = new WebFXTreeAbstractNode;

WebFXTreeItem.prototype.remove = function()
{
    var iconSrc = document.getElementById(this.id + '-plus').src;
    var parentNode = this.parentNode;
    var prevSibling = this.getPreviousSibling(true);
    var nextSibling = this.getNextSibling(true);
    var folder = this.parentNode.folder;
    var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true;
    this.getPreviousSibling().focus();
    this._remove();
    if (parentNode.childNodes.length == 0)
    {
        document.getElementById(parentNode.id + '-cont').style.display = 'none';
        parentNode.doCollapse();
        parentNode.folder = false;
        parentNode.open = false;
    }
    if (!nextSibling || last)
    {
        parentNode.indent(null, true, last, this._level, parentNode.childNodes.length);
    }
    if ((prevSibling == parentNode) && !(parentNode.childNodes.length))
    {
        prevSibling.folder = false;
        prevSibling.open = false;
        iconSrc = document.getElementById(prevSibling.id + '-plus').src;
        iconSrc = iconSrc.replace('minus', '').replace('plus', '');
        document.getElementById(prevSibling.id + '-plus').src = iconSrc;
        document.getElementById(prevSibling.id + '-icon').src = webFXTreeConfig.fileIcon;
    }
    if (document.getElementById(prevSibling.id + '-plus'))
    {
        if (parentNode == prevSibling.parentNode)
        {
            iconSrc = iconSrc.replace('minus', '').replace('plus', '');
            document.getElementById(prevSibling.id + '-plus').src = iconSrc;
        }
    }
}

WebFXTreeItem.prototype._remove = function()
{
    for (var i = this.childNodes.length - 1; i >= 0; i--)
    {
        this.childNodes[i]._remove();
    }
    for (var i = 0; i < this.parentNode.childNodes.length; i++)
    {
        if (this == this.parentNode.childNodes[i])
        {
            for (var j = i; j < this.parentNode.childNodes.length; j++)
            {
                this.parentNode.childNodes[j] = this.parentNode.childNodes[j + 1];
            }
            this.parentNode.childNodes.length -= 1;
            if (i + 1 == this.parentNode.childNodes.length)
            {
                this.parentNode._last = true;
            }
            break;
        }
    }
    webFXTreeHandler.all[this.id] = null;
    var tmp = document.getElementById(this.id);
    if (tmp)
    {
        tmp.parentNode.removeChild(tmp);
    }
    tmp = document.getElementById(this.id + '-cont');
    if (tmp)
    {
        tmp.parentNode.removeChild(tmp);
    }
}

WebFXTreeItem.prototype.expand = function()
{
    this.doExpand();
    document.getElementById(this.id + '-plus').src = this.minusIcon;
}

WebFXTreeItem.prototype.collapse = function(b)
{
    if (!b)
    {
        this.focus();
    }
    this.doCollapse();
    document.getElementById(this.id + '-plus').src = this.plusIcon;
}

WebFXTreeItem.prototype.getFirst = function()
{
    return this.childNodes[0];
}

WebFXTreeItem.prototype.getLast = function()
{
    if (this.childNodes[this.childNodes.length - 1].open)
    {
        return this.childNodes[this.childNodes.length - 1].getLast();
    }
    else
    {
        return this.childNodes[this.childNodes.length - 1];
    }
}

WebFXTreeItem.prototype.getNextSibling = function()
{
    for (var i = 0; i < this.parentNode.childNodes.length; i++)
    {
        if (this == this.parentNode.childNodes[i])
        {
            break;
        }
    }
    if (++i == this.parentNode.childNodes.length)
    {
        return this.parentNode.getNextSibling();
    }
    else
    {
        return this.parentNode.childNodes[i];
    }
}

WebFXTreeItem.prototype.getPreviousSibling = function(b)
{
    for (var i = 0; i < this.parentNode.childNodes.length; i++)
    {
        if (this == this.parentNode.childNodes[i])
        {
            break;
        }
    }
    if (i == 0)
    {
        return this.parentNode;
    }
    else
    {
        if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder))
        {
            return this.parentNode.childNodes[i].getLast();
        }
        else
        {
            return this.parentNode.childNodes[i];
        }
    }
}

WebFXTreeItem.prototype.keydown = function(key)
{
    if ((key == 39) && (this.folder))
    {
        if (!this.open)
        {
            this.expand();
        }
        else
        {
            this.getFirst().select();
        }
        return false;
    }
    else if (key == 37)
    {
        if (this.open)
        {
            this.collapse();
        }
        else
        {
            this.parentNode.select();
        }
        return false;
    }
    else if (key == 40)
    {
        if (this.open)
        {
            this.getFirst().select();
        }
        else
        {
            var sib = this.getNextSibling();
            if (sib)
            {
                sib.select();
            }
        }
        return false;
    }
    else if (key == 38)
    {
        this.getPreviousSibling().select();
        return false;
    }
    return true;
}

WebFXTreeItem.prototype.toString = function (nItem, nItemCount)
{
    var foo = this.parentNode;
    var indent = '';
    if (nItem + 1 == nItemCount)
    {
        this.parentNode._last = true;
    }
    var i = 0;

    while (foo.parentNode)
    {
        foo = foo.parentNode;
        indent = "<img id=\"" + this.id + "-indent-" + i + "\" src=\"" + ((foo._last)?webFXTreeConfig.blankIcon:webFXTreeConfig.iIcon) + "\">" + indent;
        i++;
    }

    this._level = i;
    if (this.childNodes.length)
    {
        this.folder = 1;
    }
    else
    {
        this.open = false;
    }
    if ((this.folder) || (webFXTreeHandler.behavior != 'classic'))
    {
        if (!this.icon)
        {
            this.icon = webFXTreeConfig.folderIcon;
        }
        if (!this.openIcon)
        {
            this.openIcon = webFXTreeConfig.openFolderIcon;
        }
    }
    else if (!this.icon)
    {
        this.icon = webFXTreeConfig.fileIcon;
    }
    var label = this.text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" +
              indent +
              "<img id=\"" + this.id + "-plus\" src=\"" + ((this.folder)?((this.open)?((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon):((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon)):((this.parentNode._last)?webFXTreeConfig.lIcon:webFXTreeConfig.tIcon)) + "\" onclick=\"webFXTreeHandler.toggle(this);\">" +
              "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" ;
    var svalue = this.value;
    var selectedstr = "";
    if (svalue == null)
    {
        svalue = this.text;
    }

    if (this.radio == "Y" || this.radion == "y" || this.radio == "true")
    {
        str += "<input type=\"Radio\" id=\"selRadioObj\" name=\"selRadioObj\" value=\"" + svalue + "\">";
        //"+selectedstr+"
    }
    else if (this.checkbox == "Y" || this.checkbox == "y" || this.checkbox == "true")
    {
        if (this.checked == "Y" || this.checked == "y" || this.checked == "true")
        {
            selectedstr = "checked"
        }
        str += "<input type=\"Checkbox\" id=\"selCheckObj\" name=\"selCheckObj\" value=\"" + svalue + "\" " + selectedstr + ">";
    }

    str += "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" +
           (this.target ? " target=\"" + this.target + "\"" : "") +
           ">" + label + "</a></div>" +
           "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">";
    var sb = [];
    for (var i = 0; i < this.childNodes.length; i++)
    {
        sb[i] = this.childNodes[i].toString(i, this.childNodes.length);
    }
    this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon);
    this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon);
    //if(this.text=="1.3.1.1")
    //	alert(str + sb.join("") + "</div>");
    return str + sb.join("") + "</div>";
}

/**************************************************************/
/*                        xmlextras                           */
/**************************************************************/
// used to find the Automation server name
function getDomDocumentPrefix()
{
    if (getDomDocumentPrefix.prefix)
        return getDomDocumentPrefix.prefix;

    var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
    var o;
    for (var i = 0; i < prefixes.length; i++)
    {
        try
        {
            // try to create the objects
            o = new ActiveXObject(prefixes[i] + ".DomDocument");
            return getDomDocumentPrefix.prefix = prefixes[i];
        }
        catch (ex)
        {
        }
        ;
    }

    throw new Error("您没有安装 XML parser");
}

function getXmlHttpPrefix()
{
    if (getXmlHttpPrefix.prefix)
        return getXmlHttpPrefix.prefix;

    var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
    var o;
    for (var i = 0; i < prefixes.length; i++)
    {
        try
        {
            // try to create the objects
            o = new ActiveXObject(prefixes[i] + ".XmlHttp");
            return getXmlHttpPrefix.prefix = prefixes[i];
        }
        catch (ex)
        {
        }
        ;
    }

    throw new Error("您没有安装 XML parser");
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp()
{
}

XmlHttp.create = function ()
{
    try
    {
        if (window.XMLHttpRequest)
        {
            var req = new XMLHttpRequest();

            // some versions of Moz do not support the readyState property
            // and the onreadystate event so we patch it!
            if (req.readyState == null)
            {
                req.readyState = 1;
                req.addEventListener("load", function ()
                {
                    req.readyState = 4;
                    if (typeof req.onreadystatechange == "function")
                        req.onreadystatechange();
                }, false);
            }

            return req;
        }
        if (window.ActiveXObject)
        {
            return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
        }
    }
    catch (ex)
    {
    }
    // fell through
    throw new Error("你的浏览器不支持 XmlHttp objects");
};

// XmlDocument factory
function XmlDocument()
{
}

XmlDocument.create = function ()
{
    try
    {
        // DOM2
        if (document.implementation && document.implementation.createDocument)
        {
            var doc = document.implementation.createDocument("", "", null);

            // some versions of Moz do not support the readyState property
            // and the onreadystate event so we patch it!
            if (doc.readyState == null)
            {
                doc.readyState = 1;
                doc.addEventListener("load", function ()
                {
                    doc.readyState = 4;
                    if (typeof doc.onreadystatechange == "function")
                        doc.onreadystatechange();
                }, false);
            }

            return doc;
        }
        if (window.ActiveXObject)
            return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
    }
    catch (ex)
    {
    }
    throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
    window.XMLSerializer &&
    window.Node && Node.prototype && Node.prototype.__defineGetter__)
{

    // XMLDocument did not extend the Document interface in some versions
    // of Mozilla. Extend both!
    XMLDocument.prototype.loadXML =
    Document.prototype.loadXML = function (s)
    {

        // parse the string to a new doc
        var doc2 = (new DOMParser()).parseFromString(s, "text/xml");

        // remove all initial children
        while (this.hasChildNodes())
            this.removeChild(this.lastChild);

        // insert and import nodes
        for (var i = 0; i < doc2.childNodes.length; i++)
        {
            this.appendChild(this.importNode(doc2.childNodes[i], true));
        }
    };


    /*
      * xml getter
      *
      * This serializes the DOM tree to an XML String
      *
      * Usage: var sXml = oNode.xml
      *
      */
    // XMLDocument did not extend the Document interface in some versions
    // of Mozilla. Extend both!
    XMLDocument.prototype.__defineGetter__("xml", function ()
    {
        return (new XMLSerializer()).serializeToString(this);
    });
    Document.prototype.__defineGetter__("xml", function ()
    {
        return (new XMLSerializer()).serializeToString(this);
    });
}

/**************************************************************/
/*                        xmlextras                           */
/**************************************************************/


webFXTreeConfig.loadingText = "正在加载...";
webFXTreeConfig.loadErrorTextTemplate = "加载错误!";
webFXTreeConfig.emptyErrorTextTemplate = "数据格式!";

/*
 * WebFXLoadTree class
 */

function WebFXLoadTree(sText, sXmlSrc, sAction, sBehavior, sIcon, sOpenIcon)
{
    this.WebFXTree = WebFXTree;
    this.action = sAction;
    webFXTreeConfig.rootName = sText;
    this.WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon);

    // setup default property values
    this.src = sXmlSrc;
    this.loading = false;
    this.loaded = false;
    this.errorText = "";

    // check start state and load if open
    if (this.open)
        _startLoadXmlTree(this.src, this, this.action);
    else
    {
        // and create loading item if not
        this._loadingItem = new WebFXTreeItem(webFXTreeConfig.loadingText);
        this.add(this._loadingItem);
    }
}

WebFXLoadTree.prototype = new WebFXTree;

// override the expand method to load the xml file
WebFXLoadTree.prototype._webfxtree_expand = WebFXTree.prototype.expand;
WebFXLoadTree.prototype.expand = function()
{
    if (!this.loaded && !this.loading)
    {
        // load
        _startLoadXmlTree(this.src, this, this.action);
    }
    this._webfxtree_expand();
};

/*
 * WebFXLoadTreeItem class
 */

function WebFXLoadTreeItem(sText, sXmlSrc, sAction, eParent, sIcon, sOpenIcon, sRadio, sCheckBox, sValue, sChecked)
{
    // call super
    this.WebFXTreeItem = WebFXTreeItem;
    this.WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon);

    this.radio = sRadio;
    this.checkbox = sCheckBox;
    this.value = sValue;
    this.checked = sChecked;

    // setup default property values
    this.src = sXmlSrc;
    this.loading = false;
    this.loaded = false;
    this.errorText = "";

    // check start state and load if open
    if (this.open)
        _startLoadXmlTree(this.src, this, this.action);
    else
    {
        // and create loading item if not
        this._loadingItem = new WebFXTreeItem(webFXTreeConfig.loadingText);
        this.add(this._loadingItem);
    }
}

WebFXLoadTreeItem.prototype = new WebFXTreeItem;

// override the expand method to load the xml file
WebFXLoadTreeItem.prototype._webfxtreeitem_expand = WebFXTreeItem.prototype.expand;
WebFXLoadTreeItem.prototype.expand = function()
{
    if (!this.loaded && !this.loading)
    {
        // load
        _startLoadXmlTree(this.src, this, this.action);
    }
    this._webfxtreeitem_expand(	);
};

// reloads the src file if already loaded
WebFXLoadTree.prototype.reload =
WebFXLoadTreeItem.prototype.reload = function ()
{
    // if loading do nothing
    if (this.loaded)
    {
        var open = this.open;
        // remove
        try
        {
            while (this.childNodes.length > 0)
            {
                this.childNodes[this.childNodes.length - 1].remove();
            }
        }
        catch(ex)
        {
        }
        this.loaded = false;

        this._loadingItem = new WebFXTreeItem(webFXTreeConfig.loadingText);
        this.add(this._loadingItem);

        if (open)
        {
            this.expand();
        }
    }
    else if (this.open && !this.loading)
    {
        _startLoadXmlTree(this.src, this, this.action);
        alert("..");
    }
};

/*
 * Helper functions
 */

// creates the xmlhttp object and starts the load of the xml document
function _startLoadXmlTree(sSrc, jsNode, sAction)
{
    if (jsNode.loading || jsNode.loaded)
        return;
    jsNode.loading = true;
    jsNode.action = sAction;
    
    if(sSrc!='Data/1.xml')
    {
		oXmlDoc = XmlDocument.create();
		oXmlDoc.loadXML(sSrc);        
		_xmlFileLoaded(oXmlDoc, jsNode,sSrc,sAction);
	}
	else
	{
		var xmlHttp = XmlHttp.create();
		xmlHttp.open("GET", sSrc, true);
		// async
		xmlHttp.onreadystatechange = function ()
		{
			if (xmlHttp.readyState == 4)
			{
				_xmlFileLoaded(xmlHttp.responseXML, jsNode, sSrc, sAction);
			}
		};
		// call in new thread to allow ui to update
		window.setTimeout(function ()
		{
			xmlHttp.send(null);
		}, 10);
	}
}


// Converts an xml tree to a js tree. See article about xml tree format

function _xmlTreeToJsTree(oNode, sAction)
{

    // retreive attributes
    var text = oNode.getAttribute("text");
    //  var action = oNode.getAttribute("action");
    var action = sAction;

    var parent = null;
    var icon = oNode.getAttribute("icon");
    var openIcon = oNode.getAttribute("openIcon");
    var src = oNode.getAttribute("src");
    var target = oNode.getAttribute("target");

    var sRadio = oNode.getAttribute("radio");
    var sCheckbox = oNode.getAttribute("checkbox");
    var sValue = oNode.getAttribute("value");
    var sChecked = oNode.getAttribute("checked");

    // create jsNode
    var jsNode;
    if (src != null && src != "")
    {
        jsNode = new WebFXLoadTreeItem(text, src, action, parent, icon, openIcon, sRadio, sCheckbox, sValue, sChecked);
    }
    else
    {
        jsNode = new WebFXTreeItem(text, action, parent, icon, openIcon, sRadio, sCheckbox, sValue, sChecked);
    }

    if (target != "")
    {
        jsNode.target = target;
    }
    // go through childNOdes
    var cs = oNode.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++)
    {

        if (cs[i].tagName == "TreeNode")
            jsNode.add(_xmlTreeToJsTree(cs[i], action), true);
    }
    return jsNode;
}

// Inserts an xml document as a subtree to the provided node
function _xmlFileLoaded(oXmlDoc, jsParentNode,sSrc, sAction)
{
    if (jsParentNode.loaded)
        return;

    var bIndent = false;
    var bAnyChildren = false;
    jsParentNode.loaded = true;
    jsParentNode.loading = false;
    //if xmlHTTP load faild. use XmlDocument to load it;
    if (oXmlDoc == null || oXmlDoc.documentElement == null)
    {
        try
        {
            oXmlDoc = XmlDocument.create();
            oXmlDoc.load(sSrc);
        }
        catch(ex)
        {
            oXmlDoc = null;
        }
    }
    // check that the load of the xml file went well
    if (oXmlDoc == null || oXmlDoc.documentElement == null)
    {
        jsParentNode.errorText = parseTemplateString(webFXTreeConfig.loadErrorTextTemplate,
                jsParentNode.src);

    }
    else
    {
        // there is one extra level of tree elements
        var root = oXmlDoc.documentElement;

        // loop through all tree children
        var cs = root.childNodes;
        var l = cs.length;
        for (var i = 0; i < l; i++)
        {
            if (cs[i].tagName == "TreeNode")
            {
                bAnyChildren = true;
                bIndent = true;

                var nnode = _xmlTreeToJsTree(cs[i], sAction);
                jsParentNode.add(nnode, true);
            }
        }

        // if no children we got an error
        if (!bAnyChildren)
            jsParentNode.errorText = parseTemplateString(webFXTreeConfig.emptyErrorTextTemplate,
                    jsParentNode.src);
    }

    // remove dummy
    if (jsParentNode._loadingItem != null)
    {
        jsParentNode._loadingItem.remove();
        bIndent = true;
    }
    if (bIndent)
    { // indent now that all items are added
        //jsParentNode.indent();
    }

    // show error in status bar
    if (jsParentNode.errorText != "")
        window.status = jsParentNode.errorText;
}

// parses a string and replaces %n% with argument nr n
function parseTemplateString(sTemplate)
{
    var args = arguments;
    var s = sTemplate;

    s = s.replace(/\%\%/g, "%");

    for (var i = 1; i < args.length; i++)
        s = s.replace(new RegExp("\%" + i + "\%", "g"), args[i])

    return s;
}

//end

