IE8 Issues

4 posts, 0 answers
  1. Bruce
    Bruce avatar
    17 posts
    Member since:
    Oct 2010

    Posted 15 May 2013 Link to this post

    Our JavaScript is working fine on all platforms except IE8.  The following problems arise:

    We use external JS files.  The jquery $find function on the splitter's id fails. The line reads as follows:

    var splMain = $find(splMainId);,

    but changing the line to this works:

        var splMain = $(window).find(splMainId);

    Unfortunately, the changed line does not work for all other browsers.

    The second issue in IE8 is that we are getting "Object doesn't support this property or method" with the following:

    splMain.getStartPane()

    From what I've read, IE8 has a tough time properly detecting the JS files it needs to include and therefore, you need to include the required JS files.  I have done so, but the problem remains.

    I have pasted both the ASPX file in question and its included JS files (two of them).  IE8 breaks on the following line, line 55 of CreateEstimate.js.  

    var mainWidth = $(window).width() - splMain.getStartPane().get_width() - 37;

    Please let me know what I need to do in order to ensure that the page runs in IE8.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CreateEstimate.aspx.cs" Inherits="UP.Estimate.CreateEstimate" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
            <meta http-equiv="cache-control" content="max-age=0" />
            <meta http-equiv="cache-control" content="no-cache" />
            <meta http-equiv="expires" content="0" />
            <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
            <meta http-equiv="pragma" content="no-cache" />
            <title></title>
            <link rel="stylesheet" type="text/css" href="../Styles/Styles.css" />
            <link href="../Styles/Skin_ipd/ComboBox.Skin_ipd.css" rel="stylesheet" type="text/css" />
            <link href="../Styles/Skin_ipd/Button.Skin_ipd.css" rel="stylesheet" type="text/css" />
            <style type="text/css">
                .container
                {
                border: solid 1px #9BB5C1;
                }
                .col1, .col2, .col3
                {
                float: left;
                width: 280px;
                margin: 0;
                padding: 0 5px 0 0;
                line-height: 14px;
                }
                .rcbHeader ul,
                .rcbFooter ul,
                .rcbItem ul, .rcbHovered ul, .rcbDisabled ul
                {
                width: 100%;
                display: inline-block;
                margin: 0;
                padding: 0;
                list-style-type: none;
                }
            </style>
        </head>
        <body>
            <form id="estimateForm" runat="server">
                <%-- The RadAjaxLoadingPanel contains a Skin property that can be set to "", or null.  
                Doing so basically turns off the loading image that shows normally when an AJAX call is made.--%>
                <telerik:RadAjaxLoadingPanel ID="pnlAjaxLoading" runat="server" Skin=""/>
                <telerik:RadSkinManager ID="RadSkinManager1" Runat="server" Skin="Web20">
                </telerik:RadSkinManager>
                <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
                    <Scripts>
                        <%--Needed for JavaScript IntelliSense in VS2010--%>
                        <%--For VS2008 replace RadScriptManager with ScriptManager--%>
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryPlugins.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Navigation.NavigationScripts.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Splitter.RadSplitterScripts.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Splitter.RadSlidingZoneScripts.js" />
                        <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.PopUp.PopUpScripts.js" />
                        <asp:ScriptReference Path="../Scripts/Main.js" />
                        <asp:ScriptReference Path="Scripts/CreateEstimate.js" />
                    </Scripts>
                </telerik:RadScriptManager>
                <telerik:RadAjaxManager ID="ajaMain" runat="server" DefaultLoadingPanelID="pnlAjaxLoading">
                    <AjaxSettings>
                        <telerik:AjaxSetting AjaxControlID="cboIntelligentSearch">
                            <UpdatedControls>
                                <telerik:AjaxUpdatedControl ControlID="cboIntelligentSearch" LoadingPanelID="pnlAjaxLoading" />
                                <telerik:AjaxUpdatedControl ControlID="ajaMain" LoadingPanelID="pnlAjaxLoading"/>
                                <telerik:AjaxUpdatedControl ControlID="lblLogs" LoadingPanelID="pnlAjaxLoading"/>
                                <telerik:AjaxUpdatedControl ControlID="lblReports" LoadingPanelID="pnlAjaxLoading"/>
                                <telerik:AjaxUpdatedControl ControlID="lblProjectOverview" LoadingPanelID="pnlAjaxLoading"/>
                                <telerik:AjaxUpdatedControl ControlID="actionOnLoad" LoadingPanelID="pnlAjaxLoading"/>
                            </UpdatedControls>
                        </telerik:AjaxSetting>
                    </AjaxSettings>
                </telerik:RadAjaxManager>
                <telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">
                    <script type="text/javascript">
                        var newTab = false;
                        (function ($)
                        {
                            $(document).ready(function ()
                            {
                                doLoadStuff();
                            });
                        })($telerik.$);

                        //Telerik DOM Id's
                        var cboIntelligentSearchId = '<%= cboIntelligentSearch.ClientID %>';
                        var ajaxManagerId = '<%= ajaMain.ClientID %>';
                        var toolTipId = '<%= toolTip.ClientID %>';
                        var tolErrorId = '<%= tolError.ClientID %>';
                        var trvMainId = '<%= trvMain.ClientID %>';
                        var splMainId = '<%= splMain.ClientID %>';
                        var pnlMainId = '<%= pnlMain.ClientID %>';
                        var contextMenuId = '<%= ctxMain.ClientID %>';
                        var btnSaveId = '<%= btnSave.ClientID %>';
                        var cboBidItemVersionId = '<%= cboBidItemVersion.ClientID %>';
            
                        //Strings
                        var Global_Undefined = '<%=Global_Undefined%>';
                        var Estimate_Project = '<%=Estimate_Project%>';
                        var Estimate_Description = '<%=Estimate_Description%>';
                        var ELECTRONIC_BIDDING_BEGIN = '<%=ELECTRONIC_BIDDING_BEGIN%>';
                        var Estimate_CannotDuplicate = '<%=Estimate_CannotDuplicate%>';
                        var Estimate_SelectProject = '<%=Estimate_SelectProject%>';
                        var Contract_Lock = '<%=Contract_Lock%>';
                        var Contract_Unlock = '<%=Contract_Unlock%>';

                        var ProjectTree_AddProject = "<%#ProjectTree_AddProject%>";
                        var ProjectTree_AddVersion = "<%#ProjectTree_AddVersion%>";
                        var ProjectTree_AddCategory = "<%#ProjectTree_AddCategory%>";
                        var ProjectTree_AddAlternateGroup = "<%#ProjectTree_AddAlternateGroup%>";
                        var ProjectTree_AddAlternate = "<%#ProjectTree_AddAlternate%>";
                        var ProjectTree_AddItem = "<%#ProjectTree_AddItem%>";
                        var ProjectTree_DeleteVersion = "<%#ProjectTree_DeleteVersion%>";
                        var ProjectTree_DeleteCategory = "<%#ProjectTree_DeleteCategory%>";
                        var ProjectTree_DeleteAlternateGroup = "<%#ProjectTree_DeleteAlternateGroup%>";
                        var ProjectTree_DeleteAlternate = "<%#ProjectTree_DeleteAlternate%>";
                        var ProjectTree_ConfirmDeleteVersion = "<%#ProjectTree_ConfirmDeleteVersion%>";
                        var ProjectTree_ConfirmDeleteCategory = "<%#ProjectTree_ConfirmDeleteCategory%>";
                        var ProjectTree_ConfirmDeleteAlternateGroup = "<%#ProjectTree_ConfirmDeleteAlternateGroup%>";
                        var ProjectTree_ConfirmDeleteAlternate = "<%#ProjectTree_ConfirmDeleteAlternate%>";
                        var ProjectTree_ConfirmDeleteHeader = "<%#ProjectTree_ConfirmDeleteHeader%>";
                        var ProjectTree_MoveProject = "<%#ProjectTree_MoveProject%>";
                        var TakeProject_TakeProject = "<%#TakeProject_TakeProject%>";
                        var TakeProject_TooManyWindows = "<%#TakeProject_TooManyWindows%>";
                        var Category_ItemFooter = '<%=Category_ItemFooter%>';
                    </script>
                </telerik:RadCodeBlock>
                <div>
                    <asp:Table runat="server" style="width:100%">
                        <asp:TableRow>
                            <asp:TableCell style="width:100px"  HorizontalAlign="Right">
                                <span runat="server" id="lblIntelligentSearchSpan">
                                    <asp:Label runat="server" ID="lblIntelligentSearch" AssociatedControlID="cboIntelligentSearch" Text='<%#Estimate_SelectProject%>' CssClass="fieldPrompt"/>:
                                </span>
                            </asp:TableCell>
                            <asp:TableCell HorizontalAlign="Left">
                                <telerik:RadComboBox runat="server" ID="cboIntelligentSearch" Width="420px" Height="190px" DropDownWidth="610" EnableEmbeddedSkins="False" Skin="Skin_ipd"
                                                     AutoPostBack="false" EmptyMessage="<%#Global_IntelligentSearch%>" EnableLoadOnDemand="true" OnClientSelectedIndexChanging="changingContract"
                                                     AllowCustomText="true" OnItemsRequested="cboIntelligentSearch_OnItemsRequested" OnClientDropDownOpening="setIntelligentSearchHeaders"
                                                     OnItemDataBound="cboIntelligentSearch_ItemDataBound" HighlightTemplatedItems="True">
                                    <HeaderTemplate>
                                        <table style="width:600px" cellspacing="0" cellpadding="0">
                                            <tr>
                                                <td style="width: 200px;" id="header2">
                                                    <asp:Literal runat="server" ID="searchContractLiteral" Text="<%#Estimate_Project%>" />
                                                </td>
                                                <td style="width: 400px;" id="header3">
                                                    <asp:Literal runat="server" ID="searchProjectLiteral" Text="<%#Estimate_Description%>" />
                                                </td>
                                            </tr>
                                        </table>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <table style="width:600px" cellspacing="0" cellpadding="0">
                                            <tr>
                                                <td style="width: 200px;"><%# DataBinder.Eval(Container.DataItem, "DD_NAME") %></td>
                                                <td style="width: 400px;"><%# DataBinder.Eval(Container.DataItem, "DD_DESCRIPTION") %></td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                    <FooterTemplate>
                                        <asp:Label runat="server" ID="lblRefineSearch" Text="<%#Category_ItemFooter%>" />
                                    </FooterTemplate>
                                </telerik:RadComboBox>
                            </asp:TableCell>
                            <asp:TableCell HorizontalAlign="Right">
                                <span id="spnAdd" runat="server" style="display:inline-block;width:110px;text-align:right">
                                    <telerik:RadButton ID="btnAddProject" Width="100" runat="server" AutoPostBack="false" EnableEmbeddedSkins="false" Skin="Skin_ipd"
                                                       OnClientClicked="addButtonClicked" Text="<%#CreateEstimate_AddContract%>"
                                                       secure="ProjectAdministrationGroup"/>
                                </span>
                                <span id="spnSave" runat="server" style="display:inline-block;width:65px;text-align:right">
                                    <telerik:RadButton ID="btnSave" Width="60" runat="server" AutoPostBack="false" EnableEmbeddedSkins="false" Skin="Skin_ipd"
                                                       OnClientClicked="saveButtonClicked" Text="<%#Global_Save%>" Enabled="false"/>
                                </span>
                            </asp:TableCell>
                        </asp:TableRow>
                    </asp:Table>
                </div>
                <div>
                    <telerik:RadSplitter ID="splMain" runat="server" Orientation="Vertical" OnClientLoad="splMain_OnClientLoad" ResizeMode="AdjacentPane">
                        <telerik:RadPane ID="RadPane1" runat="server" >
                            <telerik:RadComboBox ID="cboBidItemVersion" runat="server" Width="100%" TabIndex="5" EnableEmbeddedSkins="False" Skin="Skin_ipd"
                                                 AutoPostBack="false" OnClientSelectedIndexChanged="selectVersionChanged" MarkFirstMatch="true">
                            </telerik:RadComboBox>
                            <hr/>
                            <telerik:RadTreeView ID="trvMain" runat="server" EnableDragAndDrop="true" OnClientNodeDragStart="nodeDragStart"
                                                 OnClientNodeDropping="onNodeDropping" OnClientNodeDragging="onNodeDragging" OnClientNodeClicking="treeNodeClick"
                                                 OnClientContextMenuItemClicking="trvMainMenuItemClick" OnClientContextMenuShowing="trvMainMenuOpening">
                                <Nodes></Nodes>
                                <ContextMenus>
                                    <telerik:RadTreeViewContextMenu ID="ctxMain" runat="server">
                                        <Items>
                                            <telerik:RadMenuItem Value="Lock" Text="<%#Contract_Lock%>" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="AddX" Text="<%#ProjectTree_AddCategory%>" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Text="<%#Category_AddItemBatch%>" Value="AddInBatch" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Text="<%#Category_AddItemFile%>" Value="AddByFile" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="MoveProject" Text="<%#ProjectTree_MoveProject%>" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="AddExisting" Text="<%#TakeProject_TakeProject%>" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="AddGroup" Text="<%#ProjectTree_AddAlternateGroup%>" ImageUrl="../Images/Add.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="SelectVersion" Text="<%#ProjectTree_SelectVersion%>" ImageUrl="../Images/Properties.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="Delete" Text="<%#ProjectTree_Delete%>" ImageUrl="../Images/Delete.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="Cut" Text="<%#Global_Cut%>" ImageUrl="../Images/Cut.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="Copy" Text="<%#Global_Copy%>" ImageUrl="../Images/Copy.gif">
                                            </telerik:RadMenuItem>
                                            <telerik:RadMenuItem Value="Paste" Text="<%#Global_Paste%>" ImageUrl="../Images/Paste.gif">
                                            </telerik:RadMenuItem>
                                        </Items>
                                        <CollapseAnimation Type="none" />
                                    </telerik:RadTreeViewContextMenu>
                                </ContextMenus>
                            </telerik:RadTreeView>
                        </telerik:RadPane>
                        <telerik:RadSplitBar ID="splMain1" runat="server">
                        </telerik:RadSplitBar>
                        <telerik:RadPane ID="pnlMain" runat="server" Width="100%" Height="100%" Scrolling="None">
                            <iframe id='ifrMain' runat='server' width='100%' height='100%'  style='border-style:none;overflow:hidden' />
                        </telerik:RadPane>
                    </telerik:RadSplitter>
                </div>
                <telerik:RadToolTip runat="server" ID="tolError" OffsetX="125" Position="TopLeft" HideEvent="Default"
                                    ShowEvent="FromCode" Width="175px" RelativeTo="Element" EnableShadow="true" AutoCloseDelay="3000" 
                                    Animation="Fade" AnimationDuration="250" ShowCallout="false"
                                    />
                <telerik:RadToolTip runat="server" OffsetX="560" OffsetY="0" Position="TopLeft" HideEvent="Default" ID="toolTip"
                                    ShowEvent="FromCode" Width="85px" RelativeTo="Element" EnableShadow="false" ShowCallout="false" Text="<%#Tooltip_DataSaved%>"/>
                <asp:HiddenField ID="actionOnLoad" runat="server" />
                <asp:HiddenField ID="modified" Value="false" runat="server" />
                <asp:HiddenField ID="contractStatus" runat="server" />
                <asp:HiddenField ID="isReadOnly" runat="server" />
                <asp:HiddenField ID="ELECTRONIC_BIDDING_BEGIN" runat="server" />
                <asp:HiddenField ID="viewModelGuid" runat="server" Value="unset" />
                <asp:HiddenField ID="currentPrimaryKey" runat="server"/>
            </form>
        </body>
    </html>

    CreateEstimate.js:

    var selectedNode;
    var candidateSelectedNode;
    var destinationNode = null;
    var sourceNode = null;
    var projectToBeSelected;
    var projectNumberToBeSelected;
    var ajaxLocation = "CreateEstimateAjax.aspx";
    var nodeTypeToBeAdded;
    var isOnwerAVersionOnAdd;
    var parentNodeKeyOnAdd;
    var appRoot = "..";
    var childActionOnLoad;
    var versionToBeSelected;
    var selectVersionUponContract;

    function doLoadStuff()
    {
        doGenericLoadStuff(true);
        resizeSplitter();
        $(window).resize(function ()
        {
            resizeSplitter();
        });
        setModified(isModified());
        var actionOnLoadValue = $("#actionOnLoad").val();
        if (actionOnLoadValue && actionOnLoadValue.indexOf("load") >= 0)
        {
            projectToBeSelected = actionOnLoadValue.substring(4);
            doChangeProject(actionOnLoadValue.substring(4));
        }
    }

    function doChangeProject(projectToBeSelected)
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "changeProject", contractId: projectToBeSelected };
        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function resizeSplitter()
    {
        //We've got an issue with height and it's all over the place.  One issue is that
        //WC3 set the standard that for height, if you set the entire stack of DOM
        //elements to 100%, it'll show 0 height.  Basically, some element in the stack
        //has to have a specific value and not a percentage.  That causes issues.
        //Additionally, Telerik does some resizing of its own, which further complicates
        //things.  You're going to have to do some resizing like this in pretty much
        //every screen we make.
        //Resizing the entire splitter didn't work.  Seems that there's a Telerik
        //function that executes after this that sets the height to what it wants.
        //Therefore, what I'm doing is setting the height of the first pane within
        //the splitter.
        var splMain = $find(splMainId);
        var tempHeight = $(window).height();
        var totalHeight = tempHeight - 43;
        var mainWidth = $(window).width() - splMain.getStartPane().get_width() - 37;
        var frameWidth = mainWidth;
        var tempWidth = $(window).width();
        if (tempWidth > 1500)
        {
            frameWidth = mainWidth + 10;
        }
        else
        {
            frameWidth = mainWidth + 25;
        }
        splMain.getStartPane().set_height(totalHeight);
        splMain.getEndPane().set_height(totalHeight);
        splMain.getEndPane().set_width(mainWidth);
        var ifrMain = $("#ifrMain");
        if (ifrMain)
        {
            ifrMain.width(frameWidth);
            ifrMain.height(totalHeight);
        }
    }

    function returnYesNoCancel(result, type)
    {
        switch (type)
        {
            case "confirmDelete":
                if (result == "yes")
                {
                    var nodeType = selectedNode.get_attributes().getAttribute("nodeType");
                    var nodeKey = selectedNode.get_attributes().getAttribute("key");
                    doDelete(nodeType, nodeKey);
                }
                break;
            default:
                alert(Global_Undefined);
        }
    }

    //This function is currently not used in CreateEstimate, but is a standard call that 
    //could be made from Index.js so we're leaving it in place.
    function returnConfirm(result, type)
    {
        switch (type)
        {
            case "SOMETHING":

                break;
            default:
                alert(Global_Undefined);
        }
    }

    function doAbandon()
    {
        setModified(false);
        var nodeKey = selectedNode.get_attributes().getAttribute("key");
        var nodeType = selectedNode.get_attributes().getAttribute("nodeType");
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "reloadContract", nodeKey: nodeKey, nodeType: nodeType };
        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function doCustomDeleteProcessing(xml)
    {
        if ($(xml).find('RESULT').text() == "DELETE_SUCCESS")
        {
            var trvMain = $find(trvMainId);
            trvMain.trackChanges();
            nodeTypeKey = $(xml).find('DELETE_NODE_TYPE').text() + $(xml).find('DELETE_NODE_KEY').text();
            nodeToDelete = trvMain.findNodeByValue(nodeTypeKey);
            nodeToDelete.get_parent().get_nodes().remove(nodeToDelete);
            trvMain.commitChanges();
            var ifrMain = $("#ifrMain");
            if (ifrMain && ifrMain[0].contentWindow)
            {
                ifrMain[0].contentWindow.location = "about:blank";
            }
        }
    }

    function ajaxReturn(xml)
    {
        var callResult = $(xml).find('RESULT').text();
        var trvMain = $find(trvMainId);
        var ifrMain = $("#ifrMain");
        var callResultXml;
        var mainNode;
        switch (callResult)
        {
            case "NEW_PROJECT_SUCCESS":
                callResultXml = $(xml).find('CALL_RESULT');
                trvMain.trackChanges();
                mainNode = trvMain.get_nodes().getNode(0);
                makeChildNodes(callResultXml[0], mainNode);
                trvMain.commitChanges();
                if (ifrMain && ifrMain[0].contentWindow)
                {
                    ifrMain[0].contentWindow.location = "about:blank";
                }
                break;
            case "NEW_VERSION_SUCCESS":
                $("#isReadOnly").val($(xml).find('READ_ONLY').text());
                callResultXml = $(xml).find('CALL_RESULT');
                trvMain.trackChanges();
                mainNode = trvMain.get_nodes().getNode(0);
                if (mainNode.get_selected())
                {
                    mainNode.unselect();
                    selectedNode = null;
                    candidateSelectedNode = null;
                }
                $(xml).find("CE_PROJECT").each(function ()
                {
                    var projectNode;
                    var nodeKey = $(this).find("PROJECT_NODE_KEY").text();
                    for (var i = 0; i < mainNode.get_nodes().get_count(); i++)
                    {
                        var tempNode = mainNode.get_nodes().getNode(i);
                        if (tempNode.get_attributes().getAttribute("key") == nodeKey)
                        {
                            projectNode = tempNode;
                            break;
                        }
                    }
                    projectNode.get_nodes().clear();
                    makeChildNodes(this, projectNode);
                });
                trvMain.commitChanges();
                if (ifrMain && ifrMain[0].contentWindow)
                {
                    ifrMain[0].contentWindow.location = "about:blank";
                }
                break;
            case "ADD_SUCCESS":
                var newNodeType = $(xml).find('NEW_NODE_TYPE').text();
                if (newNodeType == "EB_CONTRACT")
                {
                    buildNewProjectNodes(xml);
                    var nodes = trvMain.get_allNodes();
                    for (var i = 0; i < nodes.length; i++)
                    {
                        if (nodes[i].get_nodes() != null)
                        {
                            nodes[i].set_expanded(true);
                        }
                    }
                    trvMain.get_nodes().getNode(0).select();
                    changeMain(trvMain.get_nodes().getNode(0));
                }
                else
                {
                    var newNodeKey = $(xml).find('NEW_NODE_KEY').text();
                    var newNodeText = $(xml).find('NEW_NODE_TEXT').text();
                    var newNodeValue = $(xml).find('NEW_NODE_VALUE').text();
                    candidateSelectedNode = makeNewNode(newNodeType, newNodeKey, newNodeText, newNodeValue, selectedNode.get_nodes());
                    var parent = candidateSelectedNode.get_parent();
                    if (parent && typeof parent.set_expanded == 'function')
                    {
                        parent.set_expanded(true);
                    }
                    sortChildNodes(selectedNode);
                    selectedNode = candidateSelectedNode;
                    if (newNodeType == "CE_ESTIMATE_VERSION")
                    {
                        var categoryNode = $(xml).find('CE_ESTIMATE_CATEGORY')[0];
                        switchSelectedVersion(selectedNode);
                        if (categoryNode)
                        {
                            callResultXml = $(xml).find('CALL_RESULT');
                            makeChildNodes(callResultXml[0], selectedNode);
                        }
                    }
                    changeMainContent();
                }
                break;
            case "NEW_CONTRACT_SUCCESS":
                $("#currentPrimaryKey").val($(xml).find('NEW_CONTRACT_KEY').text());
                $("#contractStatus").val($(xml).find('CONTRACT_STATUS').text());
                var doSelect = $(xml).find('DO_SELECT').text();
                $("#isReadOnly").val($(xml).find('READ_ONLY').text());
                setViewOnly();
                var cboIntelligentSearch = $find(cboIntelligentSearchId);
                cboIntelligentSearch.trackChanges();
                cboIntelligentSearch.clearItems();
                cboIntelligentSearch.set_text($(xml).find('NEW_CONTRACT_TEXT').text());
                cboIntelligentSearch.commitChanges();

                var cboBidItemVersion = $find(cboBidItemVersionId);
                cboBidItemVersion.trackChanges();
                cboBidItemVersion.clearItems();
                $(xml).find("BID_ITEM_VERSION").each(function ()
                {
                    var versionText = $(this).text();
                    var item = new Telerik.Web.UI.RadComboBoxItem();
                    item.set_text(versionText.substring(0, versionText.indexOf("|")));
                    item.set_value(versionText.substring(versionText.indexOf("|") + 1));
                    cboBidItemVersion.get_items().add(item);
                });
                cboBidItemVersion.commitChanges();
                selectVersionUponContract = true;
                cboBidItemVersion.get_items().getItem(cboBidItemVersion.get_items().get_count() -1).select();
                buildNewProjectNodes(xml);
                if (ifrMain && ifrMain[0].contentWindow)
                {
                    ifrMain[0].contentWindow.location = "about:blank";
                }
                //We're going to expand the project node selected.
                trvMain.get_nodes().getNode(0).set_expanded(true);
                if (projectToBeSelected)
                {
                    var projectNode = trvMain.findNodeByValue("CE_PROJECT" + projectToBeSelected);
                    projectNode.set_expanded(true);
                    var versionNode;
                    for (var i = 0; i < projectNode.get_nodes().get_count(); i++)
                    {
                        var tempVersionNode = projectNode.get_nodes().getNode(i);
                        if (tempVersionNode.get_imageUrl() == "../Images/Selected.gif")
                        {
                            versionNode = tempVersionNode;
                            break
                        }
                    }
                    if (versionNode)
                    {
                        versionNode.set_expanded(true);
                        //Now we're going to expand all Alternate Group nodes under the versionNode.
                        for (var i = 0; i < versionNode.get_nodes().get_count(); i++)
                        {
                            var childNode = versionNode.get_nodes().getNode(i);
                            childNode.set_expanded(true);
                            for (var j = 0; j < childNode.get_nodes().get_count(); j++)
                            {
                                var alternateNode = childNode.get_nodes().getNode(j);
                                alternateNode.set_expanded(true);
                            }
                        }
                    }
                    projectToBeSelected = null;
                    projectNumberToBeSelected = null;
                }
                if (doSelect == "CONTRACT")
                {
                    candidateSelectedNode = trvMain.get_nodes().getNode(0);
                    changeMainContent();
                }
                break;
            case "PROJECT_ALREADY_CHOSEN":
                $find(cboIntelligentSearchId).set_text("");
                getIndexContainer(window).showAlert(Estimate_CannotDuplicate, 250, 140, Estimate_SelectProject);
                break;
            case "CUT_SUCCESS":
                trvMain.trackChanges();
                nodeTypeKey = $(xml).find('CUT_NODE_TYPE').text() + $(xml).find('CUT_NODE_KEY').text();
                nodeToDelete = trvMain.findNodeByValue(nodeTypeKey);
                nodeToDelete.get_parent().get_nodes().remove(nodeToDelete);
                trvMain.commitChanges();
                if (ifrMain && ifrMain[0].contentWindow)
                {
                    ifrMain[0].contentWindow.location = "about:blank";
                }
                break;
            case "COPY_SUCCESS":
                // There's really nothing to do with a copy success.
                break;
            case "PASTE_SUCCESS":
                buildPastedNodes(xml);
                break;
            case "PASTE_FAIL":
                getIndexContainer(window).openValidationWindow(getValidationErrorList(xml));
                break;
            case "MOVE_SUCCESS":
                if (sourceNode && destinationNode)
                {
                    var droppedNodeType = sourceNode.get_attributes().getAttribute("nodeType");
                    trvMain.trackChanges();
                    if (droppedNodeType == "CE_ESTIMATE_VERSION")
                    {
                        sourceNode.set_imageUrl("../Images/Unselected.gif");
                    }
                    sourceNode.get_parent().get_nodes().remove(sourceNode);
                    destinationNode.get_nodes().add(sourceNode);
                    sortChildNodes(destinationNode);
                    trvMain.commitChanges();
                }
                break;
            case "EXCEPTION":
                getIndexContainer(window).doError();
                break;
            case "SELECT_VERSION_SUCCESS":
                switchSelectedVersion(selectedNode);
                break;
            case "RELOAD_SUCCESS":
                var nodeKey = parseInt(selectedNode.get_attributes().getAttribute("key"));
                if (nodeKey < 0)
                {
                    trvMain.trackChanges();
                    var nodeToDelete = selectedNode;
                    selectedNode.set_selected(false);
                    selectedNode.get_parent().get_nodes().remove(nodeToDelete);
                    trvMain.commitChanges();
                }
                candidateSelectedNode = selectedNode;
                if (candidateSelectedNode)
                {
                    candidateSelectedNode.set_selected(true);
                }
                changeMainContent();
                break;
            case "TOGGLE_LOCK_SUCCESS":
                setModified(true);
                var menu = $find(contextMenuId);
                var menuLock = menu.findItemByValue("Lock");
                menu.trackChanges();
                if ($(xml).find('LOCKED').text() == "true")
                {
                    menuLock.set_text(Contract_Unlock);
                }
                else
                {
                    menuLock.set_text(Contract_Lock);
                }
                if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.setModified == 'function')
                {
                    ifrMain[0].contentWindow.location = ifrMain[0].contentWindow.location;
                }
                menu.commitChanges();
                break;
        }
    }

    function setViewOnly()
    {
        if ($("#isReadOnly").val() == "readOnly" || $("#isReadOnly").val() == "bidItemVersion")
        {
            $find(trvMainId).set_enableDragAndDrop(false);
        }
        else
        {
            $find(trvMainId).set_enableDragAndDrop(true);
        }
    }

    function buildNewProjectNodes(xml)
    {
        var nodeType = "EB_CONTRACT";
        var nodeKey = $(xml).find('NEW_CONTRACT_KEY').text();
        var nodeText = $(xml).find('NEW_CONTRACT_TEXT').text();
        var nodeValue = $(xml).find('NEW_NODE_VALUE').text();
        var callResultXml = $(xml).find('CALL_RESULT');
        var trvMain = $find(trvMainId);
        trvMain.trackChanges();
        trvMain.get_nodes().clear();
        var newNode = makeNewNode(nodeType, nodeKey, nodeText, nodeValue, trvMain.get_nodes());
        newNode.set_allowDrag(false);
        makeChildNodes(callResultXml[0], newNode);
        trvMain.commitChanges();
    }

    function buildPastedNodes(xml)
    {
        var pasteNodeType = $(xml).find('PASTE_NODE_TYPE').text();
        var pasteNodeKey = $(xml).find('PASTE_NODE_KEY').text();
        var pasteNodeText = $(xml).find('PASTE_NODE_TEXT').text();
        var pasteNodeValue = $(xml).find('PASTE_NODE_VALUE').text();
        var callResultXml = $(xml).find('CALL_RESULT');
        var trvMain = $find(trvMainId);
        trvMain.trackChanges();
        var newNode = makeNewNode(pasteNodeType, pasteNodeKey, pasteNodeText, pasteNodeValue, selectedNode.get_nodes());
        sortChildNodes(selectedNode);
        makeChildNodes(callResultXml[0], newNode);
        trvMain.commitChanges();
    }

    function makeChildNodes(xml, parentNode)
    {
        var childNodes = xml.childNodes;
        for (var i = 0;i < childNodes.length;i++)
        {
            var childNode = childNodes[i];
            if ($(childNode).find('NODE_TYPE')[0])
            {
                var nodeKey;
                var nodeType;
                var nodeText;
                var nodeValue;
                for (var j = 0; j < childNode.childNodes.length; j++)
                {
                    var childChildNode = $(childNode.childNodes[j]);
                    switch (childChildNode[0].nodeName)
                    {
                        case "NODE_KEY":
                            nodeKey = childChildNode.text();
                            break;
                        case "NODE_TYPE":
                            nodeType = childChildNode.text();
                            break;
                        case "NODE_TEXT":
                            nodeText = childChildNode.text();
                            break;
                        case "NODE_VALUE":
                            nodeValue = childChildNode.text();
                            break;
                    }
                }
                if (nodeType.length > 0)
                {
                    newNode = makeNewNode(nodeType, nodeKey, nodeText, nodeValue, parentNode.get_nodes());
                    makeChildNodes(childNode, newNode);
                }
            }
        }
        if (parentNode && parentNode.get_attributes().getAttribute("nodeType") != "CE_PROJECT")
        {
            sortChildNodes(parentNode);
        }
    }

    function makeNewNode(nodeType, nodeKey, nodeText, nodeValue, nodes)
    {
        var newNode = new Telerik.Web.UI.RadTreeNode();
        if (nodeType.indexOf("CE_ESTIMATE_VERSION") >= 0)
        {
            if (nodeType.substring(nodeType.indexOf("|") + 1) == "True")
            {
                newNode.set_imageUrl("../Images/Selected.gif");
            }
            else
            {
                newNode.set_imageUrl("../Images/Unselected.gif");
            }
            nodeType = "CE_ESTIMATE_VERSION";
        }
        newNode.set_text(nodeText);
        newNode.get_attributes().setAttribute("nodeType", nodeType);
        newNode.get_attributes().setAttribute("key", nodeKey);
        newNode.set_value(nodeValue);
        if (nodes)
        {
            nodes.add(newNode);
        }
        return newNode;
    }

    function returnDialog(arguments, callType)
    {
        var argument = arguments.get_argument();
        if (argument)
        {
            var result = argument.substring(0, arguments.get_argument().indexOf("|"));
            argument = argument.substring(arguments.get_argument().indexOf("|") + 1);
            var inputData;
            switch (callType)
            {
                case "takeProject":
                    inputData = { viewModelGuid: getViewModelGuid(), callType: "isTakeProjectCall" };
                    $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                    break;
                case "AddProject":
                    if (result == "successClose")
                    {
                        var primaryKey = argument.substring(0, argument.indexOf("|"));
                        inputData = { viewModelGuid: getViewModelGuid(), callType: "getNewProjectNodes", key: primaryKey };
                        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                    }
                    else
                    {
                        //Very odd.  If I don't do this timeout, the call to open a new window gets all crossed up
                        //with the Add New Project window that's in the middle of closing.  The result is the error
                        //message appears and immediately disappears.
                        setTimeout("getIndexContainer(window).doError();", 500);
                    }
                    break;
                case "AddContract":
                    if (result == "successClose")
                    {
                        var projectToBeSelected = argument.substring(0, argument.indexOf("|"));
                        projectNumberToBeSelected = argument.substring(argument.indexOf("|") + 1);
                        var cboIntelligentSearch = $find(cboIntelligentSearchId);
                        cboIntelligentSearch.trackChanges();
                        cboIntelligentSearch.clearItems();
                        cboIntelligentSearch.set_text(projectNumberToBeSelected);
                        cboIntelligentSearch.commitChanges();
                        doChangeProject(projectToBeSelected);
                    }
                    else
                    {
                        //Very odd.  If I don't do this timeout, the call to open a new window gets all crossed up
                        //with the Add New Project window that's in the middle of closing.  The result is the error
                        //message appears and immediately disappears.
                        setTimeout("getIndexContainer(window).doError();", 500);
                    }
                    break;
                case "itemUpload":
                    //Reloading the Category.aspx page.
                    var ifrMain = $("#ifrMain");
                    if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.reloadItems == 'function')
                    {
                        ifrMain[0].contentWindow.reloadItems();
                    }
                    break;
            }
        }
    }

    //This is a TOTAL kludge, but it works so I'm going to leave it.  There's not a
    //way to access the content of the cboSelectContract's HeaderTemplate in the code
    //behind so changing the order of the columns in the code behind is nigh unto impossible.
    //Yes, there's supposedly a way you can implement an ITemplate and set the HeaderTemplate,
    //in its entirety, in the code behind.  A) I couldn't get that to work and B) this is 
    //simpler.  This function, setSelectHeaders, will fire every time the user drops down
    //the cboSelectContract combo box.  It'll read the selection in cboProjectSort and
    //set the column header accordingly.
    function setIntelligentSearchHeaders()
    {
        $("#header2")[0].innerHTML = Estimate_Project;
        $("#header3")[0].innerHTML = Estimate_Description;
        $find(cboIntelligentSearchId).get_dropDownElement().children[2].innerHTML = Category_ItemFooter;
    }

    function doAddExistingProject(sender, args)
    {
        if (getIndexContainer(window).permitTakeProject())
        {
            getIndexContainer(window).openWindow("Estimate/TakeProject.aspx?viewModelGuid=" + getViewModelGuid(), "Transfer Project", 650, 610, 50, 50, true, true, window, "takeProject", true);
        }
        else
        {
            getIndexContainer(window).showAlert(TakeProject_TooManyWindows, 400, 150, TakeProject_TakeProject);
        }
    }

    function saveButtonClicked(sender, args)
    {
        saveData();
    }

    function addButtonClicked(sender, args)
    {
        nodeTypeToBeAdded = "EB_CONTRACT";
        parentNodeKeyOnAdd = "0";
        isOnwerAVersionOnAdd = "false";

        if (isModified())
        {
            candidateSelectedNode = null;
            getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
        }
        else
        {
            doAddNew();
        }
    }

    function returnSavePromptResult(result, inCallType)
    {
        //The SaveConfirm dialog permits the user to set saveAsYouGo to true.  If the user does, we need
        //to know that in JavaScript because ContractManagement.aspx would never reload.  I am definitely 
        //not a fan of this, but I slapped the saveAsYouGo value on the end of the result string.
        var saveAsYouGoControl;
        var ifrMain = $("#ifrMain");
        if (result.indexOf("True") > 0)
        {
            result = result.substring(0, result.indexOf("True"));
            saveAsYouGoControl = $("#saveAsYouGo");
            saveAsYouGoControl.val("true");
        }
        else if (result.indexOf("False") > 0)
        {
            result = result.substring(0, result.indexOf("False"));
            saveAsYouGoControl = $("#saveAsYouGo");
            saveAsYouGoControl.val("false");
        }
        switch (inCallType)
        {
            case "saveOnChangeMain":
                switch (result)
                {
                    case "yes":
                        saveData();
                        break;
                    case "no":
                        //I have to now allow the user to change tabs, which means I'll have to abandon changes to
                        //the previous contract and then change the tab
                        doAbandon();
                        break;
                    case "cancel":
                        candidateSelectedNode = null;
                        break;
                }
                break;
            case "confirmSaveOnChangeProject":
                switch (result)
                {
                    case "yes":
                        saveData();
                        break;
                    case "no":
                        //I have to now allow the user to change projects, which means I just get the new project
                        setModified(false);
                        var cboIntelligentSearch = $find(cboIntelligentSearchId);
                        cboIntelligentSearch.trackChanges();
                        cboIntelligentSearch.clearItems();
                        cboIntelligentSearch.set_text(projectNumberToBeSelected);
                        cboIntelligentSearch.commitChanges();
                        doChangeProject(projectToBeSelected);
                        projectToBeSelected = null;
                        projectNumberToBeSelected = null;
                        if (ifrMain && ifrMain[0].contentWindow)
                        {
                            ifrMain[0].contentWindow.location = "about:blank";
                        }
                        break;
                    case "cancel":
                        //No need to do anything here; the tab change has been cancelled.
                        break;
                }
                break;
            case "confirmSaveOnChangeVersion":
                switch (result)
                {
                    case "yes":
                        saveData();
                        break;
                    case "no":
                        //I have to now allow the user to change projects, which means I just get the new project
                        setModified(false);
                        doChangeVersion(versionToBeSelected);
                        versionToBeSelected = null;
                        if (ifrMain && ifrMain[0].contentWindow)
                        {
                            ifrMain[0].contentWindow.location = "about:blank";
                        }
                        break;
                    case "cancel":
                        //No need to do anything here; the tab change has been cancelled.
                        break;
                }
                break;
            case "confirmSaveOnAddNew":
                switch (result)
                {
                    case "yes":
                        saveData();
                        break;
                    case "no":
                        doAbandon();
                        doAddNew();
                        break;
                    case "cancel":
                        //No need to do anything here; the tab change has been cancelled.
                        break;
                }
                break;
        }
    }

    function changingContract(sender, args)
    {
        if (isModified())
        {
            args.set_cancel(true);
            projectToBeSelected = args.get_item().get_value();
            projectNumberToBeSelected = args.get_item().get_text();
            getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnChangeProject");
        }
        else
        {
            projectToBeSelected = args.get_item().get_value();
            doChangeProject(projectToBeSelected);
        }
    }

    function isInEletronicBidding()
    {
        return $("#contractStatus").val() >= $("#ELECTRONIC_BIDDING_BEGIN").val();
    }

    function trvMainMenuOpening(sender, args)
    {
        //Right-clicking on a node other than the selected
        //node will fire this event first.  Therefore, we have to see if the selectedNode
        //is different than the node we get in args.  If the new, incoming node is different
        //than selectedNode, we'll permit the context-sensitive menu to show, but only if
        //the main form's "modified" value is false.  If it is true, then we'll kill this
        //menu opening and call chnageMain.
        var treeNode = args.get_node();
        if (treeNode != selectedNode)
        {
            //First thing we'll do is see of our main page's content is modified.
            var ifrMain = $("#ifrMain");
            if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
            {
                //We're going to cancel the context-sensitive menu so it's not in the
                //way when we do the save when we changeMain.
                args.set_cancel(true);
                return false;
            }
            else
            {
                //The current main page is not modified.  We can go ahead and permit this thing to open.
                setContextSensitiveContent(treeNode);
            }
            treeNode.select();
            if (!changeMain(args.get_node()))
            {
                args.set_cancel(true);
            }
        }
        else
        {
            args.set_cancel(false);
            setContextSensitiveContent(treeNode);
        }
    }

    function setContextSensitiveContent(treeNode)
    {
        var menu = $find(contextMenuId);
        var menuLock = menu.findItemByValue("Lock");
        var menuAddX = menu.findItemByValue("AddX");
        var menuAddInBatch = menu.findItemByValue("AddInBatch");
        var menuAddByFile = menu.findItemByValue("AddByFile");
        var menuAddGroup = menu.findItemByValue("AddGroup");
        var addExisting = menu.findItemByValue("AddExisting");
        var moveProject = menu.findItemByValue("MoveProject");
        var menuDelete = menu.findItemByValue("Delete");
        var menuCut = menu.findItemByValue("Cut");
        var menuCopy = menu.findItemByValue("Copy");
        var menuPaste = menu.findItemByValue("Paste");
        var selectVersion = menu.findItemByValue("SelectVersion");
        menu.trackChanges();
        if ($("#isReadOnly").val() == "readOnly")
        {
            menuLock ? menuLock.set_enabled(false) : false;
            addExisting ? addExisting.set_enabled(false) : false;
            menuAddX ? menuAddX.set_enabled(false) : false;
            menuAddInBatch ? menuAddInBatch.set_enabled(false) : false;
            menuAddByFile ? menuAddByFile.set_enabled(false) : false;
            menuAddGroup ? menuAddGroup.set_enabled(false) : false;
            menuDelete ? menuDelete.set_enabled(false) : false;
            menuCut ? menuCut.set_enabled(false) : false;
            menuCopy ? menuCopy.set_enabled(true) : true;
            menuPaste ? menuPaste.set_enabled(false) : false;
            selectVersion ? selectVersion.set_enabled(false) : false;
            moveProject ? moveProject.set_enabled(false) : false;
        }
        else if ($("#isReadOnly").val() == "bidItemVersion")
        {
            menuLock ? menuLock.set_enabled(true) : true;
            addExisting ? addExisting.set_enabled(false) : false;
            menuAddInBatch ? menuAddInBatch.set_enabled(true) : true;
            menuAddByFile ? menuAddByFile.set_enabled(true) : true;
            menuAddGroup ? menuAddGroup.set_enabled(true) : true;
            menuCopy ? menuCopy.set_enabled(true) : true;
            menuPaste ? menuPaste.set_enabled(false) : false;
            selectVersion ? selectVersion.set_enabled(false) : false;
            moveProject ? moveProject.set_enabled(false) : false;

            var nodeType = treeNode.get_attributes().getAttribute("nodeType");
            if (nodeType == "EB_CONTRACT" || nodeType == "CE_PROJECT")
            {
                menuAddX ? menuAddX.set_enabled(false) : false;
                menuDelete ? menuDelete.set_enabled(false) : false;
                menuCut ? menuCut.set_enabled(false) : false;
            }
            else if (nodeType == "CE_ESTIMATE_VERSION")
            {
                menuAddX ? menuAddX.set_enabled(true) : true;
                menuDelete ? menuDelete.set_enabled(false) : false;
                menuCut ? menuCut.set_enabled(false) : false;
            }
            else
            {
                menuAddX ? menuAddX.set_enabled(true) : true;
                menuDelete ? menuDelete.set_enabled(true) : true;
                menuCut ? menuCut.set_enabled(true) : true;
            }
        }
        else
        {
            menuLock ? menuLock.set_enabled(true) : true;
            addExisting ? addExisting.set_enabled(true) : true;
            menuAddX ? menuAddX.set_enabled(true) : true;
            menuAddInBatch ? menuAddInBatch.set_enabled(true) : true;
            menuAddByFile ? menuAddByFile.set_enabled(true) : true;
            menuAddGroup ? menuAddGroup.set_enabled(true) : true;
            menuDelete ? menuDelete.set_enabled(true) : true;
            menuCut ? menuCut.set_enabled(true) : true;
            menuCopy ? menuCopy.set_enabled(true) : true;
            menuPaste ? menuPaste.set_enabled(true) : true;
            selectVersion ? selectVersion.set_enabled(true) : true;
            moveProject ? moveProject.set_enabled(true) : true;

            menuLock ? menuLock.set_visible(true) : true;
            menuAddX ? menuAddX.set_visible(true) : true;
            menuAddInBatch ? menuAddInBatch.set_visible(true) : true;
            menuAddByFile ? menuAddInBatch.set_visible(true) : true;
            menuAddGroup ? menuAddGroup.set_visible(true) : true;
            menuDelete ? menuDelete.set_visible(true) : true;
            menuCut ? menuCut.set_visible(true) : true;
            menuCopy ? menuCopy.set_visible(true) : true;
            menuPaste ? menuPaste.set_visible(true) : true;
            selectVersion ? selectVersion.set_visible(true) : true;
            moveProject ? moveProject.set_visible(true) : true;
        }
        switch (treeNode.get_attributes().getAttribute("nodeType"))
        {
            case "EB_CONTRACT":
                menuAddX ? menuAddX.set_text(ProjectTree_AddProject) : true;
                menuLock ? menuAddX.set_visible(true) : true;
                addExisting ? addExisting.set_visible(true) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(false) : false;
                menuAddByFile ? menuAddByFile.set_visible(false) : false;
                menuAddGroup ? menuAddGroup.set_visible(false) : false;
                menuDelete ? menuDelete.set_visible(false) : false;
                menuCut ? menuCut.set_visible(false) : false;
                menuCopy ? menuCopy.set_visible(false) : false;
                menuPaste ? menuPaste.set_visible(false) : false;
                selectVersion ? selectVersion.set_visible(false) : false;
                moveProject ? moveProject.set_visible(false) : false;
                break;
            case "CE_PROJECT":
                menuLock ? menuLock.set_visible(false) : false;
                menuAddX ? menuAddX.set_text(ProjectTree_AddVersion) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(false) : false;
                menuAddByFile ? menuAddByFile.set_visible(false) : false;
                addExisting ? addExisting.set_visible(false) : false;
                menuAddGroup ? menuAddGroup.set_visible(false) : false;
                menuDelete ? menuDelete.set_visible(false) : false;
                menuCut ? menuCut.set_visible(false) : false;
                menuCopy ? menuCopy.set_visible(false) : false;
                selectVersion ? selectVersion.set_visible(false) : false;

                if (treeNode.get_parent().get_nodes().get_count() > 1)
                {
                    moveProject ? moveProject.set_visible(true) : true;
                }
                else
                {
                    moveProject ? moveProject.set_visible(false) : false;
                }

                //You can paste a Version or a project
                if (getIndexContainer(window).getClipboardType() == "CE_ESTIMATE_VERSION")
                {
                    menuPaste ? menuPaste.set_visible(true) : true;
                }
                else
                {
                    menuPaste ? menuPaste.set_visible(false) : false;
                }
                break;
            case "CE_ESTIMATE_VERSION":
                menuLock ? menuLock.set_visible(false) : false;
                menuAddX ? menuAddX.set_text(ProjectTree_AddCategory) : true;
                menuDelete ? menuDelete.set_text(ProjectTree_DeleteVersion) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(false) : false;
                menuAddByFile ? menuAddByFile.set_visible(false) : false;
                addExisting ? addExisting.set_visible(false) : false;
                menuAddGroup ? menuAddGroup.set_visible(true) : true;
                menuDelete ? menuDelete.set_visible(true) : true;
                menuCut ? menuCut.set_visible(true) : true;
                menuCopy ? menuCopy.set_visible(true) : true;
                moveProject ? moveProject.set_visible(false) : false;
                if (isModified() || isInEletronicBidding())
                {
                    menuCut ? menuCut.set_enabled(false) : false;
                }
                else
                {
                    menuCut ? menuCut.set_enabled(true) : true;
                }
                menuCopy ? menuCopy.set_enabled(true) : true;
                selectVersion ? selectVersion.set_visible(true) : true;
                //You can paste a Category or an Alternate Group on a version
                if (getIndexContainer(window).getClipboardType() == "CE_ESTIMATE_CATEGORY" || getIndexContainer(window).getClipboardType() == "CE_ALTERNATE_GROUP")
                {
                    menuPaste ? menuPaste.set_visible(true) : true;
                }
                else
                {
                    menuPaste ? menuPaste.set_visible(false) : false;
                }
                break;
            case "CE_ESTIMATE_CATEGORY":
                menuLock ? menuLock.set_visible(false) : false;
                menuDelete ? menuDelete.set_text(ProjectTree_DeleteCategory) : true;
                menuAddX ? menuAddX.set_text(ProjectTree_AddItem) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(true) : true;
                menuAddByFile ? menuAddByFile.set_visible(true) : true;
                addExisting ? addExisting.set_visible(false) : false;
                menuDelete ? menuDelete.set_visible(true) : true;
                menuCut ? menuCut.set_visible(true) : true;
                menuCopy ? menuCopy.set_visible(true) : true;
                moveProject ? moveProject.set_visible(false) : false;
                if (isModified() || isInEletronicBidding())
                {
                    menuCut ? menuCut.set_enabled(false) : false;
                }
                else
                {
                    menuCut ? menuCut.set_enabled(true) : true;
                }
                menuCopy ? menuCopy.set_enabled(true) : true;
                selectVersion ? selectVersion.set_visible(false) : false;
                //You can paste Items on a Category
                if (getIndexContainer(window).getClipboardType() == "ITEM")
                {
                    menuPaste ? menuPaste.set_visible(true) : true;
                }
                else
                {
                    menuPaste ? menuPaste.set_visible(false) : false;
                }
                menuAddGroup ? menuAddGroup.set_visible(false) : false;
                break;
            case "CE_ALTERNATE_GROUP":
                menuLock ? menuLock.set_visible(false) : false;
                menuAddX ? menuAddX.set_text(ProjectTree_AddAlternate) : true;
                menuDelete ? menuDelete.set_text(ProjectTree_DeleteAlternateGroup) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(false) : false;
                menuAddByFile ? menuAddByFile.set_visible(false) : false;
                addExisting ? addExisting.set_visible(false) : false;
                menuDelete ? menuDelete.set_visible(true) : true;
                menuCut ? menuCut.set_visible(true) : true;
                menuCopy ? menuCopy.set_visible(true) : true;
                moveProject ? moveProject.set_visible(false) : false;
                if (isModified() || isInEletronicBidding())
                {
                    menuCut ? menuCut.set_enabled(false) : false;
                }
                else
                {
                    menuCut ? menuCut.set_enabled(true) : true;
                }
                menuCopy ? menuCopy.set_enabled(true) : true;
                selectVersion ? selectVersion.set_visible(false) : false;
                //You can paste Items on a Category
                if (getIndexContainer(window).getClipboardType() == "CE_ALTERNATE")
                {
                    menuPaste ? menuPaste.set_visible(true) : true;
                }
                else
                {
                    menuPaste ? menuPaste.set_visible(false) : false;
                }
                menuAddGroup ? menuAddGroup.set_visible(false) : false;
                break;
            case "CE_ALTERNATE":
                menuLock ? menuLock.set_visible(false) : false;
                menuAddX ? menuAddX.set_text(ProjectTree_AddCategory) : true;
                menuDelete ? menuDelete.set_text(ProjectTree_DeleteAlternate) : true;
                menuAddX ? menuAddX.set_visible(true) : true;
                menuAddInBatch ? menuAddInBatch.set_visible(false) : false;
                menuAddByFile ? menuAddByFile.set_visible(false) : false;
                addExisting ? addExisting.set_visible(false) : false;
                menuDelete ? menuDelete.set_visible(true) : true;
                menuCut ? menuCut.set_visible(true) : true;
                menuCopy ? menuCopy.set_visible(true) : true;
                moveProject ? moveProject.set_visible(false) : false;
                if (isModified() || isInEletronicBidding())
                {
                    menuCut ? menuCut.set_enabled(false) : false;
                }
                else
                {
                    menuCut ? menuCut.set_enabled(true) : true;
                }
                menuCopy ? menuCopy.set_enabled(true) : true;
                selectVersion ? selectVersion.set_visible(false) : false;
                //You can paste Category items on an Alternate
                if (getIndexContainer(window).getClipboardType() == "CE_ESTIMATE_CATEGORY")
                {
                    menuPaste ? menuPaste.set_visible(true) : true;
                }
                else
                {
                    menuPaste ? menuPaste.set_visible(false) : false;
                }
                menuAddGroup ? menuAddGroup.set_visible(false) : false;
                break;
            default:
                break;
        }
        //Last thing we'll do is disable a bunch of functions if the node in question
        //is in the process of being added.
        if (treeNode.get_attributes().getAttribute("key") < 0)
        {
            menuLock ? menuLock.set_enabled(false) : false;
            menuAddX ? menuAddX.set_enabled(false) : false;
            menuAddInBatch ? menuAddInBatch.set_enabled(false) : false;
            menuAddByFile ? menuAddByFile.set_enabled(false) : false;
            menuAddGroup ? menuAddGroup.set_enabled(false) : false;
            addExisting ? addExisting.set_enabled(false) : false;
            moveProject ? moveProject.set_enabled(false) : false;
            menuCut ? menuCut.set_enabled(false) : false;
            menuCopy ? menuCopy.set_enabled(false) : false;
            menuPaste ? menuPaste.set_enabled(false) : false;
            selectVersion ? selectVersion.set_enabled(false) : false;
        }
        menu.commitChanges();
    }

    function trvMainMenuItemClick(sender, args)
    {
        var menuItem = args.get_menuItem();
        menuItem.get_menu().hide();
        selectedNode = args.get_node();
        var nodeType = selectedNode.get_attributes().getAttribute("nodeType");
        var nodeKey = selectedNode.get_attributes().getAttribute("key");
        var ifrMain = $("#ifrMain");
        var saveAsYouGo = $("#saveAsYouGo").val();
        var inputData;
        switch (menuItem.get_value())
        {
            case "Lock":
                doLock();
                break;
            case "AddX":
                switch (nodeType)
                {
                    case "EB_CONTRACT":
                        nodeTypeToBeAdded = "CE_PROJECT";
                        isOnwerAVersionOnAdd = false;
                        parentNodeKeyOnAdd = nodeKey;
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                        {
                            if (saveAsYouGo == "true")
                            {
                                saveData();
                            }
                            else
                            {
                                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                            }
                        }
                        else
                        {
                            doAddNew();
                        }
                        break;
                    case "CE_PROJECT":
                        nodeTypeToBeAdded = "CE_ESTIMATE_VERSION";
                        isOnwerAVersionOnAdd = false;
                        parentNodeKeyOnAdd = nodeKey;
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                        {
                            if (saveAsYouGo == "true")
                            {
                                saveData();
                            }
                            else
                            {
                                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                            }
                        }
                        else
                        {
                            doAddNew();
                        }
                        break;
                    case "CE_ESTIMATE_VERSION":
                        nodeTypeToBeAdded = "CE_ESTIMATE_CATEGORY";
                        isOnwerAVersionOnAdd = true;
                        parentNodeKeyOnAdd = nodeKey;
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                        {
                            if (saveAsYouGo == "true")
                            {
                                saveData();
                            }
                            else
                            {
                                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                            }
                        }
                        else
                        {
                            doAddNew();
                        }
                        break;
                    case "CE_ALTERNATE_GROUP":
                        nodeTypeToBeAdded = "CE_ALTERNATE";
                        isOnwerAVersionOnAdd = true;
                        parentNodeKeyOnAdd = nodeKey;
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                        {
                            if (saveAsYouGo == "true")
                            {
                                saveData();
                            }
                            else
                            {
                                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                            }
                        }
                        else
                        {
                            doAddNew();
                        }
                        break;
                    case "CE_ALTERNATE":
                        nodeTypeToBeAdded = "CE_ESTIMATE_CATEGORY";
                        isOnwerAVersionOnAdd = false;
                        parentNodeKeyOnAdd = nodeKey;
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                        {
                            if (saveAsYouGo == "true")
                            {
                                saveData();
                            }
                            else
                            {
                                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                            }
                        }
                        else
                        {
                            doAddNew();
                        }
                        break;
                    case "CE_ESTIMATE_CATEGORY":
                        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.addItem == 'function')
                        {
                            ifrMain[0].contentWindow.addItem(false);
                        }
                        break;
                }
                break;
            case "AddInBatch":
                if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.addItem == 'function')
                {
                    ifrMain[0].contentWindow.addItem(true);
                }
                break;
            case "AddByFile":
                if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.getCategoryKey == 'function')
                {
                    var categoryPrimaryKey = ifrMain[0].contentWindow.getCategoryKey();
                    getIndexContainer(window).openWindow("Estimate/ItemUpload.aspx?viewModelGuid=" + getViewModelGuid() + "&key=" + categoryPrimaryKey, "Item Upload", 450, 200, 50, 50, true, false, window, "itemUpload", true);
                }
                break;
            case "AddExisting":
                if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                {
                    if (saveAsYouGo == "true")
                    {
                        saveData();
                        doAddExistingProject();
                    }
                    else
                    {
                        contractToBeSelected = "CE_PROJECT";
                        getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddExistingProject");
                    }
                }
                else
                {
                    doAddExistingProject();
                }
                break;
            case "AddGroup":
                nodeTypeToBeAdded = "CE_ALTERNATE_GROUP";
                isOnwerAVersionOnAdd = true;
                parentNodeKeyOnAdd = nodeKey;
                if (ifrMain && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
                {
                    if (saveAsYouGo == "true")
                    {
                        saveData();
                        doAddNew();
                    }
                    else
                    {
                        contractToBeSelected = "CE_ALTERNATE_GROUP";
                        getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnAddNew");
                    }
                }
                else
                {
                    doAddNew();
                }
                break;
            case "Delete":
                switch (nodeType)
                {
                    case "CE_ESTIMATE_VERSION":
                        getIndexContainer(window).showYesNoCancel(ProjectTree_ConfirmDeleteVersion, 300, 150, ProjectTree_ConfirmDeleteHeader, window, "confirmDelete", false);
                        break;
                    case "CE_ESTIMATE_CATEGORY":
                        getIndexContainer(window).showYesNoCancel(ProjectTree_ConfirmDeleteCategory, 300, 150, ProjectTree_ConfirmDeleteHeader, window, "confirmDelete", false);
                        break;
                    case "CE_ALTERNATE_GROUP":
                        getIndexContainer(window).showYesNoCancel(ProjectTree_ConfirmDeleteAlternateGroup, 300, 150, ProjectTree_ConfirmDeleteHeader, window, "confirmDelete", false);
                        break;
                    case "CE_ALTERNATE":
                        getIndexContainer(window).showYesNoCancel(ProjectTree_ConfirmDeleteAlternate, 300, 150, ProjectTree_ConfirmDeleteHeader, window, "confirmDelete", false);
                        break;
                }
                break;
            case "Cut":
                getIndexContainer(window).setClipboardType(nodeType);
                inputData = { viewModelGuid: getViewModelGuid(), callType: "isCutCall", nodeType: nodeType, nodeKey: nodeKey };
                $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                break;
            case "Copy":
                getIndexContainer(window).setClipboardType(nodeType);
                inputData = { viewModelGuid: getViewModelGuid(), callType: "isCopyCall", nodeType: nodeType, nodeKey: nodeKey };
                $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                break;
            case "Paste":
                if (getIndexContainer(window).getClipboardType() == "ITEM")
                {
                    //If the clipboard type is items, I'm going to go to Category.aspx to paste them. 
                    //I'm not going to use the Ajax infrastructure to do so.
                    if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.doPaste == 'function')
                    {
                        ifrMain[0].contentWindow.doPaste();
                    }
                }
                else
                {
                    inputData = { viewModelGuid: getViewModelGuid(), callType: "isPasteCall", nodeType: nodeType, nodeKey: nodeKey };
                    $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                }
                break;
            case "SelectVersion":
                inputData = { viewModelGuid: getViewModelGuid(), callType: "selectVersion", nodeKey: nodeKey };
                $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                break;
            case "MoveProject":
                inputData = { viewModelGuid: getViewModelGuid(), callType: "moveToNewContract", projectKey: nodeKey };
                $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                break;
        }
    }

    function onNodeDragging(sender, args)
    {
        var target = args.get_htmlElement();

        if (!target)
            return;

        if (target.tagName == "INPUT")
        {
            target.style.cursor = "hand";
        }

        var grid = isMouseOverGrid(target)
        if (grid)
        {
            grid.style.cursor = "hand";
        }
    }

    function nodeDragStart(sender, args)
    {
        var draggedType = args.get_node().get_attributes().getAttribute("nodeType");
        var trvMain = $find(trvMainId);
        var nodes = trvMain.get_allNodes();
        for (var i = 0; i < nodes.length; i++)
        {
            var overType = nodes[i].get_attributes().getAttribute("nodeType");
            //CONTRACT and PROJECT objects cannot be dragged.
            switch (draggedType)
            {
                case "CE_ESTIMATE_VERSION":
                    if (overType == "CE_PROJECT")
                    {
                        nodes[i].set_allowDrop(true);
                    }
                    else
                    {
                        nodes[i].set_allowDrop(false);
                    }
                    break;
                case "CE_ESTIMATE_CATEGORY":
                    if (overType == "CE_ESTIMATE_VERSION" || overType == "CE_ALTERNATE")
                    {
                        nodes[i].set_allowDrop(true);
                    }
                    else
                    {
                        nodes[i].set_allowDrop(false);
                    }
                    break;
                case "CE_ALTERNATE_GROUP":
                    if (overType == "CE_ESTIMATE_VERSION")
                    {
                        nodes[i].set_allowDrop(true);
                    }
                    else
                    {
                        nodes[i].set_allowDrop(false);
                    }
                    break;
                case "CE_ALTERNATE":
                    if (overType == "CE_ALTERNATE_GROUP")
                    {
                        nodes[i].set_allowDrop(true);
                    }
                    else
                    {
                        nodes[i].set_allowDrop(false);
                    }
                    break;
            }
        }
        args.get_node().get_parent().set_allowDrop(false);
    }

    function isMouseOverGrid(target)
    {
        parentNode = target;
        while (parentNode != null)
        {
            parentNode = parentNode.parentNode;
        }
        return null;
    }

    function onNodeDropping(sender, args)
    {
        destinationNode = args.get_destNode();
        if (destinationNode)
        {
            if (destinationNode.get_allowDrop())
            {
                sourceNode = args.get_sourceNodes()[0];
                if (sourceNode)
                {
                    //The TreeView has the dragged node in the right spot, but the Model component doesn't have the
                    //proper foreign key to its parent.  We have to make an AJAX call to change that.
                    //We need to pass a bunch of information to the AJAX handler.  Getting that now.
                    var droppedNodeType = sourceNode.get_attributes().getAttribute("nodeType");
                    var droppedNodeKey = sourceNode.get_attributes().getAttribute("key");
                    var receivingNodeType = destinationNode.get_attributes().getAttribute("nodeType");
                    var receivingNodeKey = destinationNode.get_attributes().getAttribute("key");
                    var inputData = { viewModelGuid: getViewModelGuid(), callType: "isDropCall", dnt: droppedNodeType, dnk: droppedNodeKey, rnt: receivingNodeType, rnk: receivingNodeKey };
                    $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
                }
            }
        }
    }

    function splMain_OnClientLoad(splitter, args)
    {
        var indexes = $telerik.$(".indexes");
        indexes.each(function (i)
        {
            $telerik.$(this).click(function ()
            {
                var contentPane = splitter.getPaneById("pnlMain");
                var pageNo = $telerik.$(this).text();

                var scrollValue = 650 * (pageNo - 1); //650 is the height of a 'page'
                contentPane.setScrollPos(0, scrollValue);
            });
        });
    }

    function treeNodeClick(object, args)
    {
        if (!changeMain(args.get_node()))
        {
            args.set_cancel(true);
        }
    }

    function changeMain(inSelectedNode)
    {
        if (inSelectedNode != selectedNode)
        {
            //First thing we'll do is see if the currently-displayed ASPX has been changed.
            //If it has not, we'll just permit the change to happen without doing a thing.
            //If it has, we'll need to call saveData
            candidateSelectedNode = inSelectedNode;
            //Couldn't get the jquery way of doing this to work so we're just doing straight
            //JavaScript
            var ifrMain = $("#ifrMain");
            if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.isModified == 'function' && ifrMain[0].contentWindow.isModified())
            {
                //First thing we'll do here is to see if saveAsYouGo is true.
                var saveAsYouGo = getIndexContainer(window).getSaveAsYouGo();
                if (saveAsYouGo == "true")
                {
                    saveData();
                }
                else
                {
                    //We have an unusual set of circumstances right here.  If there's a new
                    //Version, it might have a new Calculated Items node underneath it.  If so,
                    //we have to send an immediate false.  Letting the save confirm thing show
                    //and continue with that process, then we'll get JavaScript errors if the 
                    //user clicks on that Calculated Items node.
                    var selectedNodeType = selectedNode.get_attributes().getAttribute("nodeType");
                    var selectedNodeKey = parseInt(selectedNode.get_attributes().getAttribute("key"));
                    var newNodeKey = parseInt(inSelectedNode.get_attributes().getAttribute("key"));
                    if (selectedNodeType == "CE_ESTIMATE_VERSION" && selectedNodeKey < 0 && newNodeKey < 0 && selectedNode.get_nodes().get_count() > 0)
                    {
                        return false;
                    }
                    getIndexContainer(window).showSaveConfirm(window, "saveOnChangeMain");
                }
                return false;
            }
            else
            {
                changeMainContent();
                return true;
            }
        }
        else
        {
            return true;
        }
    }

    function changeMainContent()
    {
        var nodeType;
        if (candidateSelectedNode)
        {
            selectedNode = candidateSelectedNode;
            candidateSelectedNode = null;
            selectedNode.select();
            nodeType = selectedNode.get_attributes().getAttribute("nodeType");
        }
        //Doing the work of setting ifrMain's content.  Now, you might be wondering why
        //I'm dynamically adding an iframe instead of creating a static iframe and then
        //changing its content.  The reason is that I need to be able to call the iframe's
        //scripts.  The DOM gets all wonky when you dynamically change an iframe's
        //src property
        var ifID = document.getElementById('ifrMain');
        if (ifID)
        {
            ifID.parentNode.removeChild(ifID);
        }
        switch (nodeType)
        {
            case "EB_CONTRACT":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='Contract.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            case "CE_PROJECT":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='ProjectSetup.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            case "CE_ESTIMATE_VERSION":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='Version.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            case "CE_ESTIMATE_CATEGORY":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='Category.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            case "CE_ALTERNATE_GROUP":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='AlternateGroup.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            case "CE_ALTERNATE":
                $find(pnlMainId).get_element().innerHTML = "<iframe id='ifrMain' runat='server' style='border-style:none;width:100%;height:100%;overflow:hidden' scrolling='no' src='Alternate.aspx?key=" + selectedNode.get_attributes().getAttribute("key") + "&viewModelGuid=" + getViewModelGuid() + "'/>";
                break;
            default:
                break;
        }
        resizeSplitter();
    }

    function switchSelectedVersion(selectedNode)
    {
        var siblingNodes = selectedNode.get_parent().get_nodes();
        for (var i = 0; i < siblingNodes.get_count(); i++)
        {
            siblingNodes.getNode(i).set_imageUrl("../Images/Unselected.gif");
        }
        selectedNode.set_imageUrl("../Images/Selected.gif");
    }

    function sortChildNodes(parentNode)
    {
        var nodes = parentNode.get_nodes();
        var sortNode;
        var testNode;
        var i;
        var j;
        for (i = 0; i < nodes.get_count(); i++)
        {
            sortNode = nodes.getNode(i);
            var nodeType = sortNode.get_attributes().getAttribute("nodeType");
            var nodeText = sortNode.get_text();
            if (nodeType == "CE_ESTIMATE_CATEGORY")
            {
                for (j = 0; j < nodes.get_count(); j++)
                {
                    testNode = nodes.getNode(j);
                    if (testNode.get_attributes().getAttribute("nodeType") == "CE_ALTERNATE_GROUP")
                    {
                        nodes.insert(j, sortNode);
                        break;
                    }
                    else if (testNode.get_text().toLowerCase() >= nodeText.toLowerCase())
                    {
                        nodes.insert(j, sortNode);
                        break;
                    }
                }
                nodes.insert(j, sortNode);
            }
            else if (nodeType == "CE_ALTERNATE_GROUP")
            {
                for (j = 0; j < nodes.get_count(); j++)
                {
                    testNode = nodes.getNode(j);
                    var test = testNode.get_attributes().getAttribute("nodeType");
                    if (test == "CE_ALTERNATE_GROUP" && testNode.get_text().toLowerCase() >= nodeText.toLowerCase())
                    {
                        nodes.insert(i, sortNode);
                        break;
                    }
                }
                nodes.insert(j, sortNode);
            }
            else
            {
                for (j = 0; j < nodes.get_count(); j++)
                {
                    testNode = nodes.getNode(j);
                    if (testNode.get_text().toLowerCase() >= nodeText.toLowerCase())
                    {
                        nodes.insert(j, sortNode);
                        break;
                    }
                }
                nodes.insert(j, sortNode);
            }
            if (sortNode == selectedNode)
            {
                sortNode.set_selected(true);            
            }
        }
    }

    function doLock()
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "toggleLockCall" };
        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function doAddNew()
    {
        if (nodeTypeToBeAdded == "CE_PROJECT")
        {
            getIndexContainer(window).openWindow("Estimate/AddProject.aspx?viewModelGuid=" + getViewModelGuid() + "&contractKey=" + getContractKey(), "AddProject", 760, 310, 150, 100, true, true, window, "AddProject", true);
            nodeTypeToBeAdded = null;
            parentNodeKeyOnAdd = null;
        }
        else if (nodeTypeToBeAdded == "EB_CONTRACT")
        {
            var trvMain = $find(trvMainId);
            trvMain.trackChanges();
            trvMain.get_nodes().clear();
            trvMain.commitChanges();
            var ifrMain = $("#ifrMain");
            ifrMain[0].contentWindow.location = "about:blank";
            $find(cboIntelligentSearchId).set_text("");
            getIndexContainer(window).openWindow("Estimate/AddProject.aspx?viewModelGuid=" + getViewModelGuid() + "&contractKey=NEW", "AddContract", 760, 410, 150, 100, true, true, window, "AddContract", true);
            nodeTypeToBeAdded = null;
            parentNodeKeyOnAdd = null;
        }
        else
        {
            setViewOnly();
            var inputData = { viewModelGuid: getViewModelGuid(), callType: "isAddCall", nodeType: nodeTypeToBeAdded, parentNodeKey: parentNodeKeyOnAdd, isOwnerAVersion: isOnwerAVersionOnAdd };
            $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
            nodeTypeToBeAdded = null;
            parentNodeKeyOnAdd = null;
        }
    }

    function setNodeText(newText)
    {
        var trvMain = $find(trvMainId);
        trvMain.trackChanges();
        selectedNode.set_text(newText);
        sortChildNodes(selectedNode.get_parent());
        trvMain.commitChanges();
    }

    function getContractKey()
    {
        return $("#currentPrimaryKey").val();
    }

    function doCustomSaveProcessing(xml)
    {
        var ifrMain = $("#ifrMain");
        var saveResults = $(xml).find('RESULT').text();
        //This is the function called by the ifrMain's ASPX when that ASPX's save work is done.
        //It'll process the results.
        if (saveResults == "SAVE_SUCCESS")
        {
            if (getIndexContainer(window).getSaveAsYouGo() == "true")
            {
                showSaveToolTip();
            }
            var nodeKey = selectedNode.get_attributes().getAttribute("key");
            if (nodeKey < 0)
            {
                //I'm sure there's a way to select a node by the node's text, but I couldn't see it quickly online.
                //Therefore, I'm doing this in the cheesy way.
                $(xml).find("KEY_PAIR").each(function ()
                {
                    var oldKey = $(this).find("OLD_KEY").text();
                    if (oldKey == nodeKey)
                    {
                        selectedNode.get_attributes().setAttribute("key", $(this).find("NEW_KEY").text());
                        selectedNode.set_value(selectedNode.get_attributes().getAttribute("nodeType") + $(this).find("NEW_KEY").text());
                    }
                    else
                    {
                        for (var i = 0; i < selectedNode.get_nodes().get_count(); i++)
                        {
                            var node = selectedNode.get_nodes().getNode(i);
                            var childNodeKey = node.get_attributes().getAttribute("key");
                            if (oldKey == childNodeKey)
                            {
                                node.get_attributes().setAttribute("key", $(this).find("NEW_KEY").text());
                                node.set_value(node.get_attributes().getAttribute("nodeType") + $(this).find("NEW_KEY").text());
                            }
                        }
                    }
                });
            }
            if (projectToBeSelected > 0)
            {
                //You now have to do a number of things here.  First, you have to set the intelligent search's
                //text property to be the new project selected.  Then you have to get rid of the iframe so nothing
                //is showing in the main content area.
                var selectProject = $find(cboIntelligentSearchId);
                selectProject.trackChanges();
                selectProject.clearItems();
                selectProject.set_text(projectNumberToBeSelected);
                selectProject.commitChanges();
                doChangeProject(projectToBeSelected);
                if (ifrMain && ifrMain[0].contentWindow)
                {
                    ifrMain[0].contentWindow.location = "about:blank";
                }
            }
            else if (candidateSelectedNode)
            {
                candidateSelectedNode.set_selected(true);
                setTimeout("changeMainContent()", 100);
            }
            else if (nodeTypeToBeAdded != null && nodeTypeToBeAdded.length > 0)
            {
                doAddNew();
            }
            else if (versionToBeSelected > 0)
            {
                doChangeVersion(versionToBeSelected);    
            }
            getIndexContainer(window).notifySave(true);
        }
        else if (saveResults.indexOf("SAVE_SUCCESS_NEW_CONTRACT") >= 0)
        {
            $("#actionOnLoad").val(saveResults);
            $("#estimateForm").submit();
        }
        else if (saveResults == "SAVE_CONCURRENCY")
        {
            projectToBeSelected = null;
            projectNumberToBeSelected = null;
            candidateSelectedNode = null;
            getIndexContainer(window).openValidationWindow(getValidationErrorList(xml));
            getIndexContainer(window).notifySave(false);
            //Reloading the page so it grabs the most current data.
            $("#ifrMain")[0].contentWindow.location = $("#ifrMain")[0].contentWindow.location;
        }
        else if (saveResults == "SAVE_FAIL")
        {
            //Don't need to do anything here because there are no fields on the CreateEstimate page.
        }
        if (ifrMain[0] && ifrMain[0].contentWindow && typeof ifrMain[0].contentWindow.doCustomSaveProcessing == 'function')
        {
            ifrMain[0].contentWindow.doCustomSaveProcessing(xml);
        }
    }

    function reloadPage()
    {
        $("#ifrMain")[0].contentWindow.location = $("#ifrMain")[0].contentWindow.location;
    }

    function reloadEstimate()
    {
        doChangeContract($("#currentPrimaryKey").val());
    }

    function doChangeContract(contractToBeSelected)
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "changeContract", contractId: contractToBeSelected };
        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function selectVersionChanged(sender, args)
    {
        if (selectVersionUponContract)
        {
            selectVersionUponContract = false;
        }
        else
        {
            if (isModified())
            {
                args.set_cancel(true);
                versionToBeSelected = args.get_item().get_value();
                getIndexContainer(window).showSaveConfirm(window, "confirmSaveOnChangeVersion");
            }
            else
            {
                versionToBeSelected = args.get_item().get_value();
                doChangeVersion(versionToBeSelected);
            }
        }
    }

    function doChangeVersion(inVersionToBeSelected)
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "changeVersion", versionNumber: inVersionToBeSelected };
        $.ajax({ type: 'POST', url: ajaxLocation, success: ajaxReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    Main.js:

    //Using this variable to avoid an endless loop in the setModified function.
    var haveSetEstimateModfied = false;
    var haveSetBiddingModfied = false;
    var haveSetSubContractModified = false;
    var haveSetChangeOrderModified = false;
    var changedComboBox;
    var comboBoxChangeback = false;
    var overflowCounter = 0;

    function doGenericLoadStuff()
    {
        if (window.location.href.indexOf(window.parent.location.href) == 0)
        {
            //This is where relative paths break down.  The ASPX calling this function
            //could be anywhere in our application.  I'm going to get the path from a hidden value,
            //if it exists.  If it doesn't exist, I'm going to send the user to msn.com.  This if
            //statement exists so that users do not attempt to enter a URL path to an ASPX that is
            //intended to be shown within Index.aspx somewhere.
            if (appRoot) 
            {
                window.location = appRoot + "/Index.aspx";
            }
            else 
            {
                window.location = "http://www.msn.com";
            }
        }
        else
        {
            if ($("#actionOnLoad").val() == "notLoggedIn")
            {
                //This will reload the page, causing Login.aspx to be shown.
                getIndexContainer(window).location = appRoot + "/Index.aspx";
            }
            else if ($("#actionOnLoad").val() == "doError")
            {
                getIndexContainer(window).doError();
            }
            else
            {
                if ($("#viewModelGuid"))
                {
                    registerThisViewModel();
                    setInterval("registerThisViewModel()", 59000);
                }
            }
        }
    }

    function registerThisViewModel()
    {
        getIndexContainer(window).registerViewModel($("#viewModelGuid").val());
    }

    function isModified()
    {
        if ($("#modified").val() == "true")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    function getIndexContainer(inForm)
    {
        overflowCounter++;
        if (overflowCounter > 50)
        {
            overflowCounter = 0;
            return null;
        }
        if (inForm.location.href.indexOf(inForm.parent.location.href) == 0 && inForm.location.href.indexOf("Index") >= 0)
        {
            //If inForm is the outermost container, we'll return it.
            overflowCounter = 0;
            return inForm;
        }
        else
        {
            //If inForm is NOT the outermost container, it'll call itself until
            //the very outermost container is found and return that.
            var test = inForm.location.href == inForm.parent.location.href;
            return getIndexContainer(inForm.parent);
        }
    }

    function getCreateEstimateContainer(inForm)
    {
        overflowCounter++;
        if (overflowCounter > 50)
        {
            overflowCounter = 0;
            return null;
        }
        if (inForm.location.href.indexOf("CreateEstimate.aspx") >= 0)
        {
            //If inForm is the outermost container, we'll return it.
            return inForm;
        }
        else if (inForm.parent.location.toString().indexOf("Index.aspx") == -1)
        {
            //If inForm is NOT the outermost container, it'll call itself until
            //the very outermost container is found and return that.
            return getCreateEstimateContainer(inForm.parent);
        }
        else
        {
            return null;
        }
    }

    function getBiddingContainer(inForm)
    {
        overflowCounter++;
        if (overflowCounter > 50)
        {
            overflowCounter = 0;
            return null;
        }
        if (inForm.location.href.indexOf("ElectronicBidding.aspx") >= 0)
        {
            //If inForm is the outermost container, we'll return it.
            return inForm;
        }
        else if (inForm.parent.location.toString().indexOf("Index.aspx") == -1)
        {
            //If inForm is NOT the outermost container, it'll call itself until
            //the very outermost container is found and return that.
            return getBiddingContainer(inForm.parent);
        }
        else
        {
            return null;
        }
    }

    function getSubContractContainer(inForm)
    {
        overflowCounter++;
        if (overflowCounter > 50)
        {
            overflowCounter = 0;
            return null;
        }
        if (inForm.location.href.indexOf("SubContractorManagement.aspx") >= 0) 
        {
            //If inForm is the outermost container, we'll return it.
            return inForm;
        }
        else if (inForm.parent.location.toString().indexOf("Index.aspx") == -1) 
        {
            //If inForm is NOT the outermost container, it'll call itself until
            //the very outermost container is found and return that.
            return getSubContractContainer(inForm.parent);
        } 
        else 
        {
            return null;
        }
    }

    function getChangeOrderContainer(inForm)
    {
        overflowCounter++;
        if (overflowCounter > 50)
        {
            overflowCounter = 0;
            return null;
        }
        if (inForm.location.href.indexOf("ChangeOrderManagement.aspx") >= 0) 
        {
            //If inForm is the outermost container, we'll return it.
            return inForm;
        }
        else if (inForm.parent.location.toString().indexOf("Index.aspx") == -1) 
        {
            //If inForm is NOT the outermost container, it'll call itself until
            //the very outermost container is found and return that.
            return getChangeOrderContainer(inForm.parent);
        }
        else 
        {
            return null;
        }
    }

    function setModified(isModified)
    {
        var estimateContainer = getCreateEstimateContainer(window);
        var biddingContainer = getBiddingContainer(window);
        var subcontractContainer = getSubContractContainer(window);
        var changeOrderContainer = getChangeOrderContainer(window);
        var btnSave;
        if (typeof btnSaveId != "undefined")
        {
            btnSave = $find(btnSaveId);
        }
        if (!isModified || isModified == "false")
        {
            $("#modified").val("false");
            if (btnSave)
            {
                btnSave.set_enabled(false);
            }
            if (!haveSetEstimateModfied)
            {
                haveSetEstimateModfied = true;
                if (estimateContainer)
                {
                    estimateContainer.setModified(false);
                }
            }
            else
            {
                haveSetEstimateModfied = false;
            }
            if (!haveSetBiddingModfied)
            {
                haveSetBiddingModfied = true;
                if (biddingContainer)
                {
                    biddingContainer.setModified(false);
                }
            }
            else
            {
                haveSetBiddingModfied = false;
            }
            if (!haveSetSubContractModified) 
            {
                haveSetSubContractModified = true;
                if (subcontractContainer) 
                {
                    subcontractContainer.setModified(false);
                }
            }
            else
            {
                haveSetSubContractModified = false;
            }
        }
        else
        {
            if (!haveSetEstimateModfied)
            {
                haveSetEstimateModfied = true;
                if (estimateContainer)
                {
                    estimateContainer.setModified(true);
                }
            }
            else
            {
                haveSetEstimateModfied = false;
            }
            if (!haveSetBiddingModfied)
            {
                haveSetBiddingModfied = true;
                if (biddingContainer)
                {
                    biddingContainer.setModified(true);
                }
            }
            else
            {
                haveSetBiddingModfied = false;
            }
            if (!haveSetSubContractModified) 
            {
                haveSetSubContractModified = true;
                if (subcontractContainer) 
                {
                    subcontractContainer.setModified(true);
                }
            }
            else 
            {
                haveSetSubContractModified = false;
            }
            if (!haveSetChangeOrderModified) 
            {
                haveSetChangeOrderModified = true;
                if (changeOrderContainer) 
                {
                    changeOrderContainer.setModified(true);
                }
            }
            else 
            {
                haveSetChangeOrderModified = false;
            }
            if (btnSave)
            {
                btnSave.set_enabled(true);
            }
            $("#modified").val("true");
        }
    }

    function myvoid() 
    {
        ;
    }

    function clearPoundSign(inString)
    {
        if (inString && typeof inString.indexOf == 'function')
        {
            while (inString.indexOf("#") >= 0)
            {
                inString = inString.replace("#", "%23");
            }
            while (inString.indexOf("+") >= 0)
            {
                inString = inString.replace("+", "%2b");
            }
        }
        return inString;
    }

    function clearAmpersand(inString)
    {
        if (inString && typeof inString.indexOf == 'function')
        {
            while (inString.indexOf("&") >= 0)
            {
                inString = inString.replace("&", "%26");
            }
        }
        return inString;
    }

    function selectValueChanged(sender, args)
    {
        if (comboBoxChangeback)
        {
            comboBoxChangeback = false;
        }
        else
        {
            fieldValueChanged(sender);
        }
    }

    function fieldValueChanged(changedControl)
    {
        setModified(true);
        window.parent.setModified(true);
        var changedControljq;
        if (changedControl)
        {
            changedControljq = $(changedControl);
        }
        else
        {
            return;
        }
        var mapping;
        var newValue;
        var formatting = "";
        var errorFieldName;
        var primaryKey = $("#currentPrimaryKey").val();
        if (changedControljq.parent().attr("mapping"))
        {
            //Odd.  Sometimes, checkboxes show up in this format.  Other times, they show up in a format we're accounting for
            //just below this if.
            changedControljq = $(changedControl);
            mapping = changedControljq.parent().attr("mapping");
            newValue = changedControljq.is(":checked");
            if (changedControljq.parent().attr("primaryKey") != null && changedControljq.parent().attr("primaryKey").length > 0)
            {
                primaryKey = changedControljq.parent().attr("primaryKey");
            }
            errorFieldName = changedControljq.parent().attr("errorFieldName");
        }
        else if (changedControl && changedControl.firstElementChild && changedControl.firstElementChild.type == "checkbox")
        {
            //This is an ASP CheckBox as well.  For some reason, ASP .NET is laying it out differently in this case.
            changedControljq = $(changedControl);
            mapping = changedControljq.attr("mapping");
            if (changedControl.firstElementChild.checked)
            {
                newValue = true;
            }
            else
            {
                newValue = false;
            }
            if (changedControljq.attr("primaryKey") != null && changedControljq.attr("primaryKey").length > 0)
            {
                primaryKey = changedControljq.attr("primaryKey");
            }
            errorFieldName = changedControljq.attr("errorFieldName");
        }
        else if (changedControl.id)
        {
            //I'm going to get a jquery handle on the control.  They're so much easier to get information from.
            changedControljq = $("#" + changedControl.id);
            mapping = changedControljq.attr("mapping");
            newValue = changedControljq.val();
            if (!newValue)
            {
                newValue = changedControljq.val();
            }
            if (changedControljq.attr("primaryKey") != null && changedControljq.attr("primaryKey").length > 0)
            {
                primaryKey = changedControljq.attr("primaryKey");
            }
            if (changedControljq.attr("formatting") != undefined)
            {
                formatting = changedControljq.attr("formatting");
            }
            errorFieldName = changedControljq.attr("errorFieldName");
        }
        else if (changedControl && typeof changedControl.set_expandDirection == 'function')
        {
            //We have a Telerik combo box.
            changedControljq = changedControl;
            changedComboBox = changedControl;
            mapping = changedControljq.get_attributes().getAttribute("mapping");
            newValue = changedControljq.get_value();
            //A bit odd.  The following line, remarked out, is the way I'd normally get
            //an attribute on a combo box.
            //primaryKey = sender.get_attributes().getAttribute("primaryKey");
            //That's Telerik's way.  Works fine under most circumstances, but I have
            //code that deals with a save to a temporary primary and switches it to
            //a permanent, database one.  For some reason, that line above is still
            //returning the old key.  So, we'll get the primary key with the following
            //line.
            primaryKey = $(changedControljq.get_element()).attr("primaryKey");
            errorFieldName = changedControljq.get_attributes().getAttribute("errorFieldName");
        }
        else if (changedControl && typeof changedControl.get_buttonType == 'function')
        {
            //Well, that's not cool.  While other Telerik contrls support custom attributes, 
            //the RadButton doesn't appear to.  For example, look above at the code we have for the
            //Telerik combo box.  I have that get_attributes().getAttribute line.  Well, can't do 
            //that for a RadButton. So, we're going to use the RadButton's GroupName property for the
            //mapping and the Value property for the newValue.  It's a deviation from our preferred
            //standard, but it'll work.
            //Also, the primary key is getting stuck on the end of the group name so we have to strip 
            //it off.
            changedControljq = changedControl;
            newValue = changedControljq.get_value();
            mapping = changedControljq.get_groupName();
            if (mapping.length > 0)
            {
                primaryKey = mapping.substring(mapping.lastIndexOf("|") + 1);
                mapping = mapping.substring(0, mapping.lastIndexOf("|"));
            }
            else
            {
                var element = changedControljq.get_element();
                mapping = $(element.outerHTML).attr("mapping");
                primaryKey = $(element.outerHTML).attr("primaryKey");
            }
        }
        else if (changedControl && typeof changedControl.get_selectedDate == 'function')
        {
            var elementComponent = changedControl.get_element();
            var searchString = "[id*='" + elementComponent.id + "_wrapper']";
            var wrapperComponent = $(searchString);
            primaryKey = wrapperComponent.attr("primaryKey");
            mapping = wrapperComponent.attr("mapping");
            errorFieldName = wrapperComponent.attr("errorFieldName");
            newValue = changedControl.get_textBox().value;
        }
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "fieldValueChanged", mapping: mapping, newValue: newValue, formatting: formatting, errorFieldName: errorFieldName, primaryKey: primaryKey };
        $.ajax({ type: 'POST', url: ajaxLocation, success: fieldValueChangedReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function fieldValueChangedReturn(xml)
    {
        var resultValue = $(xml).find('RESULT').text();
        var primaryKey = $(xml).find('PRIMARY_KEY').text();
        var propertyField;
        var errorImageField;
        var searchString;
        switch (resultValue)
        {
            case "SUCCESS":
                if (primaryKey && primaryKey.length > 0)
                {
                    propertyField = $("[mapping='" + $(xml).find('PROPERTY').text() + "'][primaryKey='" + primaryKey + "']");
                }
                else
                {
                    propertyField = $("[mapping='" + $(xml).find('PROPERTY').text() + "']");
                }
                var formattedReturnValue = $(xml).find('FORMATTED_RETURN_VALUE').text();
                if (formattedReturnValue)
                {
                    propertyField.val(formattedReturnValue);
                }
                //If we got a successful change, the error field might be showing because the user
                //previously entered a bad value.  Hiding it here.
                searchString = "[id*='" + propertyField.attr("errorImageField") + "']";
                errorImageField = $(searchString);
                errorImageField.hide();
                //We're setting a variable in case a combo box change causes a VALIDATION_FAIL.
                //If we're here and changeComboBox is not null, we're going to unset it so
                //it doesn't cause problems with future validation fails.
                if (changedComboBox)
                {
                    changedComboBox = null;
                }
                break;
            case "VALIDATION_FAIL":
                var exceptionText = $(xml).find('ERROR_TEXT').text();
                var previousValue = $(xml).find('PREVIOUS_VALUE').text();
                propertyField = $("[mapping='" + $(xml).find('PROPERTY').text() + "'][primaryKey='" + primaryKey + "']");
                if (changedComboBox)
                {
                    comboBoxChangeback = true;
                    changedComboBox.findItemByValue(previousValue).select();
                    changedComboBox = null;
                }
                else
                {
                    propertyField.val(previousValue);
                    var checkBox = $(propertyField[0].children[0]);
                    if (checkBox)
                    {
                        if (previousValue == "true")
                        {
                            checkBox.attr('checked', 'checked');
                        }
                        else
                        {
                            checkBox.removeAttr('checked');
                        }
                    }
                }
                searchString = "#" + propertyField.attr("errorImageField");
                errorImageField = $(searchString);
                searchString = "[id*='" + propertyField.attr("errorTextField") + "']";
                var errorTextField = $(searchString);
                errorTextField.val(exceptionText);
                errorImageField.show();
                propertyField.focus();
                var tempPosition = propertyField.position();
                tempPosition.left = tempPosition.left + Number(propertyField.css("width").substring(0, propertyField.css("width").length - 2));
                tempPosition.top = tempPosition.top + 20;
                showErrorTip(tempPosition, propertyField.attr("errorTextField"));
                break;
            case "EXCEPTION":
                getIndexContainer(window).doError();
                break;
        }
        if (typeof doCustomChangeProcessing == 'function')
        {
            doCustomChangeProcessing(xml);
        }
    }

    function doDelete(objectType, objectKey)
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "isDeleteCall", objectType: objectType, objectKey: objectKey };
        $.ajax({ type: 'POST', url: ajaxLocation, success: deleteReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function deleteReturn(xml)
    {
        setModified(false);
        var callResult = $(xml).find('RESULT').text();
        switch (callResult)
        {
            case "DELETE_SUCCESS":

                break;
            case "DELETE_FAIL":
                doSaveFail(xml);
                break;
            case "EXCEPTION":
                getIndexContainer(window).doError();
                break;
        }
        if (typeof doCustomDeleteProcessing == 'function')
        {
            doCustomDeleteProcessing(xml);
        }
    }

    function getViewModelGuid()
    {
        if ($("#childViewModelGuid").length > 0)
        {
            return $("#childViewModelGuid").val();
        }
        else
        {
            if ($("#viewModelGuid").length > 0)
            {
                return $("#viewModelGuid").val();
            }
            else if (parent.location.toString().indexOf("Index.aspx") == -1)
            {
                return parent.getViewModelGuid();
            }
            else
            {
                return null;
            }
        }
    }

    function showErrorTip(inOffset, inTextField)
    {
        var tolError = $find(tolErrorId);
        if (tolError)
        {
            var searchString = "[id*='" + inTextField + "']";
            var errorMessage = $(searchString).val();
            tolError.set_offsetX(inOffset.left);
            tolError.set_offsetY(inOffset.top);
            tolError.set_text(errorMessage);
            tolError.show();
        }
    }

    function saveData()
    {
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "saveData" };
        $.ajax({ type: 'POST', url: ajaxLocation, success: saveReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function saveReturn(xml)
    {
        var resultValue = $(xml).find('RESULT').text();
        switch (resultValue)
        {
            case "SAVE_SUCCESS":
                hideValidationImages();
                setModified(false);
                if (parent && typeof parent.setModified == 'function')
                {
                    parent.setModified(false);
                }
                $(xml).find("KEY_PAIR").each(function ()
                {
                    var oldKey = $(this).find("OLD_KEY").text();
                    var newKey = $(this).find("NEW_KEY").text();
                    var fieldToChange = $("[primaryKey='" + oldKey + "']");
                    fieldToChange.attr("primaryKey", newKey);
                });
                break;
            case "SAVE_CONCURRENCY":
                if (doConcurrencyFail && typeof doConcurrencyFail == 'function')
                {
                    doConcurrencyFail(xml);
                }
                break;
            case "SAVE_FAIL":
                //If there's a doCustomSaveProcessing, then that function is responsible
                //for showing the save fail message.
                if (typeof doCustomSaveProcessing != 'function')
                {
                    doSaveFail(xml);
                }
                break;
            case "EXCEPTION":
                getIndexContainer(window).doError();
                break;
        }
        if (parent && parent.ajaxLocation != undefined)
        {
            parent.saveReturn(xml);
        }
        if (typeof doCustomSaveProcessing == 'function')
        {
            doCustomSaveProcessing(xml);
        }
    }

    function getValidationErrorList(xml)
    {
        var returnString = "";
        $(xml).find("RESULT_RECORD").each(function ()
        {
            returnString = returnString + "|" + $(this).find("RESULT_TEXT").text();
        });
        return returnString;
    }

    function doSaveFail(xml)
    {
        $(xml).find("RESULT_RECORD").each(function ()
        {
            var mappingString = $(this).find("MAPPING").text();
            if (mappingString.length > 0)
            {
                var valueBox;
                var i;
                var mappedFields = mappingString.split("|");
                //First thing to do is to get a "replaced" text string.  That means we'll
                //replace all the mapping names in the error text with the errorFieldName values.
                var formattedString = $(this).find("RESULT_TEXT").text()
                for (i = 0; i < mappedFields.length; i++)
                {
                    var mapping = mappedFields[i];
                    valueBox = $("[mapping*='" + mapping + "']");
                    var errorFieldName;
                    for (var j = 0; j < valueBox.length; j++)
                    {
                        var testName = $(valueBox[j]).attr("errorFieldName");
                        if (testName && testName.length > 0)
                        {
                            errorFieldName = $(valueBox[j]).attr("errorFieldName");
                        }
                    }
                    if (errorFieldName != null)
                    {
                        formattedString = clearPoundSign(formattedString.replace(mapping, errorFieldName));
                    }
                }
                $(this).find("RESULT_TEXT").text(formattedString);
                for (i = 0; i < mappedFields.length; i++)
                {
                    valueBox = $("[mapping*='" + mappedFields[i] + "']");
                    var searchString = "[id*='" + valueBox.attr("errorTextField") + "']";
                    $(searchString).val(formattedString);
                    searchString = "[id*='" + valueBox.attr("errorImageField") + "']";
                    $(searchString).show();
                }
            }
        });
        getIndexContainer(window).openValidationWindow(getValidationErrorList(xml));
        getIndexContainer(window).notifySave(false);
    }

    function doConcurrencyFail(xml)
    {
        getIndexContainer(window).openValidationWindow(getValidationErrorList(xml));
        getIndexContainer(window).notifySave(false);
    }

    function hideValidationImages()
    {
        $(".validationImage").each(function ()
        {
            $(this).hide();
        }
        );
    }

    function GetRadWindow()
    {
        var oWindow = null;
        if (window.radWindow)
        {
            oWindow = window.radWindow;
        }
        else if (window.frameElement.radWindow)
        {
            oWindow = window.frameElement.radWindow;
        }
        return oWindow;
    }

    function showCommentsDialog(mapping, primaryKey, isReadOnly)
    {
        var indexPage = getIndexContainer(window);
        indexPage.openTextDetail(window, mapping, primaryKey, getViewModelGuid(), textHeader, isReadOnly);
    }

    function ajaxError(xhr, ajaxOptions, thrownError)
    {
        alert("A client-side error occurred.  Please report the following to ExeVision, LLC: " + xhr.responseText);
        getIndexContainer(window).doError();
    }

    function getAbsolutePosition(element)
    {
        var tempPosition = new Point();
        tempPosition.left = 0;
        tempPosition.top = 0;
        do
        {
            tempPosition.left = tempPosition.left + element.offsetLeft;
            tempPosition.top = tempPosition.top + element.offsetTop;
            element = element.offsetParent;
        }
        while (element.offsetParent);
        return tempPosition;
    }

    //Used by the getAbsolutePosition function above.
    function Point()
    {
        this.x;
        this.y;
    }

    function listTransferring(sender, args)
    {
        setModified(true);
        parent.setModified(true);
        var ajaxUrl;
        var newValues = args.get_items();
        var newValuesList = "";
        var i;
        for (i = 0; i < newValues.length; i++)
        {
            if (newValuesList.length != 0)
            {
                newValuesList = newValuesList + "|"
            }
            newValuesList = newValuesList + newValues[i].get_value();
        }
        var sourceBox = args.get_sourceListBox();
        var destinationBox = args.get_destinationListBox();
        var isAssigning = destinationBox.get_attributes().getAttribute("isAssigned") != null;
        var mapping;
        var isAdding;
        var owningKey = 0;
        if (isAssigning)
        {
            mapping = sourceBox.get_attributes().getAttribute("mapping");
            isAdding = "true";
        }
        else
        {
            mapping = destinationBox.get_attributes().getAttribute("mapping");
            isAdding = "false";
        }
        if ($("#currentPrimaryKey"))
        {
            owningKey = $("#currentPrimaryKey").val();
        }
        setTimeout(function ()
        {
            destinationBox.clearSelection();
        }, 100);
        setTimeout(function ()
        {
            sourceBox.clearSelection();
        }, 100);
        sortListBoxItems(args.get_destinationListBox(), args.get_item());
        var inputData = { viewModelGuid: getViewModelGuid(), callType: "listChange", mapping: mapping, newValues: newValuesList, isAdding: isAdding, owningKey: owningKey };
        $.ajax({ type: 'POST', url: ajaxLocation, success: listChangeReturn, error: ajaxError, datatype: "xml", cache: false, data: inputData });
    }

    function sortListBoxItems(listBox, item)
    {
        listBox.reorderItem(item, 0);
        var transferredItemText = item.get_text();
        var listBoxItems = listBox.get_items();
        var i = 0;
        for (i = 0; i < listBoxItems.get_count(); i++)
        {
            if (listBoxItems.getItem(i).get_text() > transferredItemText)
            {
                break;
            }
        }
        listBox.reorderItem(item, i - 1);
    }

    function listChangeReturn(xml)
    {
        var resultValue = $(xml).find('RESULT').text();
        if (resultValue == "EXCEPTION")
        {
            getIndexContainer(window).doError();
        }
        if (typeof doCustomListChangeProcessing == 'function')
        {
            doCustomListChangeProcessing(xml);
        }
    }

    function showSaveToolTip()
    {
        var toolTipSave = $find(toolTipId);
        if (toolTipSave)
        {
            toolTipSave.show();
        }
    }

    //Forms that do not have a Button object, something that submits the form, will take an 
    //Enter keypress as a form submit.  Well, I don't want to add a button to the form just
    //so Enter doesn't submit the form.  Therefore, we'll use this method to cancel an enter.
    function cancelPressEnter(event)
    {
        if (event.keyCode == 13)
        {
            fieldValueChanged(event.currentTarget);
            return false;
        }
        else
        {
            return true;
        }
    }
  2. Vessy
    Admin
    Vessy avatar
    1389 posts

    Posted 20 May 2013 Link to this post

    Hello Bruce,

    We are not aware of such an issue and unfortunately the provided information was not enough for me to reproduce the issue. I was not able to run the code because of many missing references, this is why - could you provide more detailed information on the specific scenario?
    • Which version of RadControls for ASP.NET AJAX is used in your application?
    • Could you isolate the problem into a sample fully runnable project reproducing it so we could examine and debug it locally? You can see how this can be done in the following blog post: Isolating a problem in a sample project

    Thank you in advance for your cooperation.

    Looking forward to hearing from you,
    Veselina Raykova
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. Bruce
    Bruce avatar
    17 posts
    Member since:
    Oct 2010

    Posted 21 May 2013 Link to this post

    We're using the latest RadControls, Q1 2013, SP2.  I am able to produce the problem at will.  I created a completely separate test project/solution that I can send.  Let me know how to do that and I will.  If there is no way, I suppose I can open a ticket.
  5. Vessy
    Admin
    Vessy avatar
    1389 posts

    Posted 23 May 2013 Link to this post

    Hello Bruce,

    I have just answered your ticket on the subject - for convenience I will paste my answer here as well:

    In order to be sure that the used RadControls' objects are loaded correctly (fully) on the page, you will need to attach the doLoadStuff() function to the Sys.Application Load event:

    (function ($)
    {
        Sys.Application.add_load(function(){
            doLoadStuff();
        });
    })($telerik.$);

    In addition, note that $find(controlID) gives reference to the object of the control, while $(window).find(controlId) is searching among the DOM elements.

    Regards,
    Veselina Raykova
    Telerik
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
Back to Top