This is a migrated thread and some comments may be shown as answers.

Add new Record returning blank grid

3 Answers 165 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Steven
Top achievements
Rank 1
Steven asked on 18 Mar 2009, 08:09 PM
I have a radgrid in a tabstrip radmultipage and when i click on the add new record the grid returns completely blank.  This is a very urgent matter, so if someone could help me asap, it would be greatly appreciated.  All of the grids in the tabstrip are reacting the same way.

aspx code:

<%@ Page Language="C#" MasterPageFile="~/MasterPages/SiteMaster.master" Title="Manage Provider" AutoEventWireup="true" Inherits="Pgi.Hub.Administration.providerAddEdit" Codebehind="providerAddEdit.aspx.cs" %> 
<%@ Register TagPrefix="radM" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> 
<asp:Content id="Content1" ContentPlaceHolderID="javascript" runat="server"
    <script type="text/javascript"
 
        $(document).ready( 
            function() { 
                $("#<%=chkModeratorSameAsTitle.ClientID %>").click(chkModeratorSameAsTitle_click); 
                $("#<%=chkAttendeeSameAsTitle.ClientID %>").click(chkAttendeeSameAsTitle_click); 
            } 
        ); 
 
        function chkModeratorSameAsTitle_click() { 
            var txtModerator = $get('<%= txtDefaultModeratorEmailSubject.ClientID %>'); 
 
            if (eval($get('<%= chkModeratorSameAsTitle.ClientID %>')).checked) { 
                txtModerator.disabled = true
            } 
            else { 
                txtModerator.disabled = false
            } 
 
        } 
 
        function chkAttendeeSameAsTitle_click() { 
            var txtAttendee = $get('<%= txtDefaultAttendeeEmailSubject.ClientID %>'); 
 
            if (eval($get('<%= chkAttendeeSameAsTitle.ClientID %>')).checked) { 
                txtAttendee.disabled = true
            } 
            else { 
                txtAttendee.disabled = false
            } 
        } 
 
        function ValidateDefaultModeratorEmailSubject(source, args) { 
            var chkModerator = $get('<%= chkModeratorSameAsTitle.ClientID %>'); 
            args.IsValid = false
 
            if ((chkModerator.checked) || 
                ((!chkModerator.checked) && jQuery.trim(args.Value).length > 0)) { 
                args.IsValid = true
            } 
 
        } 
 
        function ValidateDefaultAttendeeEmailSubject(source, args) { 
            var chkAttendee = $get('<%= chkAttendeeSameAsTitle.ClientID %>'); 
            args.IsValid = false
 
            if ((chkAttendee.checked) || 
                ((!chkAttendee.checked) && jQuery.trim(args.Value).length > 0)) { 
                args.IsValid = true
            } 
 
        } 
 
 
     
     
         
            var hasChanges, inputs, dropdowns, editedRow; 
 
            function RowClick(sender, eventArgs) { 
                if (editedRow && hasChanges) { 
                    hasChanges = false
                    if (confirm("Update changes?")) { 
 
                        $find("<%= radGridHelpLinks.MasterTableView.ClientID %>").updateItem(editedRow); 
                    } 
                } 
            } 
 
            function RowDblClick(sender, eventArgs) { 
                editedRow = eventArgs.get_itemIndexHierarchical(); 
                $find("<%= radGridHelpLinks.MasterTableView.ClientID %>").editItem(editedRow); 
            } 
 
            function GridCommand(sender, args) { 
                if (args.get_commandName() != "Edit") { 
                    editedRow = null
                } 
            } 
 
            function GridCreated(sender, eventArgs) { 
                var gridElement = sender.get_element(); 
                var elementsToUse = []; 
                inputs = gridElement.getElementsByTagName("input"); 
                for (var i = 0; i < inputs.length; i++) { 
                    var lowerType = inputs[i].type.toLowerCase(); 
                    if (lowerType == "hidden" || lowerType == "button") { 
                        continue; 
                    } 
 
                    Array.add(elementsToUse, inputs[i]); 
                    inputs[i].onchange = TrackChanges
                } 
               
 
                setTimeout(function() { if (elementsToUse[0]) elementsToUse[0].focus(); }, 100); 
            } 
 
            function TrackChanges(e) { 
                hasChanges = true
            } 
          
    </script> 
     
</asp:Content> 
<asp:Content ContentPlaceHolderID="mainContent" ID="pageContent" runat="server"
    <netspoke:pageHeading  
            ID="pageheading"  
            runat="server"            
            ShowRequiredText="true" /> 
    <netspoke:resultHandler runat="server" ID="resultHandler" /> 
    <asp:ValidationSummary  
        runat="server"  
        ID="validationSummary"  
        DisplayMode="BulletList"  
        ShowMessageBox="false" 
        ShowSummary="true"  
        CssClass="warningResponse"  
        HeaderText="Unable to save the provider. The following problems were encountered with your information:"  
         ValidationGroup="providerValidationGroup"/> 
     
     
    <radM:RadTabStrip ID="tabstripProviderOptions" runat="server" Orientation="HorizontalTop" 
        SelectedIndex="0" CausesValidation="true" ValidationGroup="providerValidationGroup" MultiPageID="MultiPageBranding" Align="Left"  
        AutoPostBack="true" Skin="Vista" OnTabClick="onTabClick"
        <Tabs> 
            <radM:RadTab Text="Add Provider" Value="1"  runat="server" PageViewID="addProvider"
            </radM:RadTab> 
            <radM:RadTab Text="Linked Enterprises" Value="2" runat="server" PageViewID="linkedEnterprises"
            </radM:RadTab> 
            <radM:RadTab runat="server" Value="3" PageViewID="netspokeOptions"
            </radM:RadTab> 
            <radM:RadTab Text="Branding Options" Value="4" runat="server" SelectedIndex="0"
                <Tabs> 
                    <radM:RadTab Text="Web Conf. Logo" Value="5" runat="server" PageViewID="webConfLogo"></radM:RadTab> 
                    <radM:RadTab Text="Hub Logo" Value="6" runat="server" PageViewID="hubLogo"></radM:RadTab> 
                    <radM:RadTab Text="Marketing Links" Value="7" runat="server" PageViewID="marketingLinks"></radM:RadTab> 
                    <radM:RadTab Text="Marketing Images" Value="8" runat="server" PageViewID="marketingImages"></radM:RadTab> 
                    <radM:RadTab Text="Application Title" Value="9" runat="server" PageViewID="appTitle"></radM:RadTab> 
                    <radM:RadTab Text="Getting Started Text" Value="10" runat="server" PageViewID="gettingStartedText"></radM:RadTab> 
                    <radM:RadTab Text="Help Links" Value="11" runat="server" PageViewID="helpLinks"></radM:RadTab> 
                    <radM:RadTab Text="Quick Links" Value="12" runat="server" PageViewID="quickLinks"></radM:RadTab> 
                    <radM:RadTab Text="Skin" Value="13" runat="server" PageViewID="skin"></radM:RadTab> 
                </Tabs> 
            </radM:RadTab> 
        </Tabs> 
    </radM:RadTabStrip>     
    <radM:RadMultiPage ID="MultiPageBranding" runat="server" SelectedIndex="0" CssClass="multiPage">     
        <radM:RadPageView runat="server" ID="addProvider"
            <div class="yui-gd"
                <div class="yui-g first leftDiv"
                    <asp:Localize ID="locProviderName" runat="server" Text="Provider Name:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locProviderType" runat="server" Text="Provider Type:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locHubGroupDomain" runat="server" Text="Hub Group Domain:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locDefaultMeetingServer" Text="Default Meeting Server:" runat="server" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locSecureDefaultMeetingServer" Text="Secure Default Meeting Server:" 
                        runat="server" />&nbsp;<span class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locAppShareHost" Text="App Share Host:" runat="server" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locCustomerHomePage" runat="server" Text="Customer Home Page:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locDefaultConferenceTitle" runat="server" Text="Default Conference Title:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locDefaultModeratorEmailSubject" runat="server" Text="Default Moderator Email Subject:" />&nbsp;<span 
                        class="required">*</span> 
                    <br /> 
                    <asp:Localize ID="locDefaultAttendeeEmailSubject" runat="server" Text="Default Attendee Email Subject:" />&nbsp;<span 
                        class="required">*</span> 
                </div> 
                <div class="yui-g rightDiv"
                    <asp:TextBox runat="server" ID="txtProviderName" Width="214px" /> 
                    <asp:RequiredFieldValidator ID="rvProviderName" runat="server" ControlToValidate="txtProviderName" 
                        Display="Dynamic" ErrorMessage="Provider Name is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    &nbsp; 
                    <asp:RegularExpressionValidator ID="revProviderName" runat="server" ErrorMessage="Only alphanumeric characters and spaces allowed." 
                        ControlToValidate="txtProviderName" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="^[0-9a-zA-Z ]+$" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:DropDownList ID="ddlProviderType" runat="server" /> 
                    <br /> 
                    <asp:TextBox ID="txtHubGroupDomain" runat="server" onchange="SetText()" Width="214px" /> 
                    <asp:RequiredFieldValidator ID="rvHubGrpDomain" runat="server" ControlToValidate="txtHubGroupDomain" 
                        Display="Dynamic" ErrorMessage="Hub Group Domain is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    &nbsp; 
                    <asp:RegularExpressionValidator ID="revHubGroupDomain" runat="server" ErrorMessage="Not a valid domain name." 
                        ControlToValidate="txtHubGroupDomain" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:TextBox ID="txtDefualtMeetingServer" runat="server" Width="214px" /> 
                    <input id="inpMeetingServerAppend" readonly="readonly" runat="server" type="text" /> 
                    <asp:RequiredFieldValidator ID="rvDefMtngServer" runat="server" ControlToValidate="txtDefualtMeetingServer" 
                        Display="Dynamic" ErrorMessage="Default Meeting Server is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    &nbsp; 
                    <asp:RegularExpressionValidator ID="revdefMeetingServer" runat="server" ErrorMessage="Only numbers, letters, or dashes allowed." 
                        ControlToValidate="txtDefualtMeetingServer" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="(^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$)" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:TextBox ID="txtSecureDefaultMeetingServer" runat="server" Width="214px" /> 
                    <input id="inpSecureMeetingServerAppend" readonly="readonly" runat="server" type="text" /> 
                    <asp:RequiredFieldValidator ID="rvSecDefMtngServer" runat="server" ControlToValidate="txtSecureDefaultMeetingServer" 
                        Display="Dynamic" ErrorMessage="Secure Default Meeting Server is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    &nbsp; 
                    <asp:RegularExpressionValidator ID="revSecDefMeetingServer" runat="server" ErrorMessage="Only numbers, letters, or dashes allowed." 
                        ControlToValidate="txtSecureDefaultMeetingServer" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="(^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$)" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:TextBox ID="txtAppShareHost" runat="server" Width="214px" /> 
                    <input id="inpAppShareHostAppend" readonly="readonly" runat="server" type="text" /> 
                    <asp:RequiredFieldValidator ID="rvAppShareHost" runat="server" ControlToValidate="txtAppShareHost" 
                        Display="Dynamic" ErrorMessage="App Share Host is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    <asp:RegularExpressionValidator ID="revAppShareHost" runat="server" ErrorMessage="Only numbers, letters, or dashes allowed." 
                        ControlToValidate="txtAppShareHost" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="(^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$)" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:TextBox ID="txtCustomerHomePage" runat="server" Width="214px" /> 
                    <asp:RequiredFieldValidator ID="rvCustomerHomePage" runat="server" ControlToValidate="txtCustomerHomePage" 
                        Display="Dynamic" ErrorMessage="Customer Home Page is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    &nbsp;<asp:RegularExpressionValidator ID="revHomePage" runat="server" ErrorMessage="Not a valid url." 
                        ControlToValidate="txtCustomerHomePage" Display="Dynamic" SetFocusOnError="True" 
                        ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?" ValidationGroup="providerValidationGroup"></asp:RegularExpressionValidator> 
                    <br /> 
                    <asp:TextBox ID="txtDefaultConferenceTitle" runat="server" Width="214px" /> 
                    <asp:RequiredFieldValidator ID="rvDefaultConferenceTitle" runat="server" ControlToValidate="txtDefaultConferenceTitle" 
                        Display="Dynamic" ErrorMessage="Default Conference Title is required" SetFocusOnError="True" ValidationGroup="providerValidationGroup"></asp:RequiredFieldValidator> 
                    <br /> 
                    <asp:TextBox ID="txtDefaultModeratorEmailSubject" runat="server" Width="214px" /> 
                    <asp:CheckBox ID="chkModeratorSameAsTitle" runat="server" Text="Same as title" /> 
                    <asp:CustomValidator ControlToValidate="txtDefaultModeratorEmailSubject" ID="valDefaultModeratorEmailSubject" 
                        runat="server" ErrorMessage="Default Moderator Email Subject is required" ValidateEmptyText="true" 
                        SetFocusOnError="true" Display="Dynamic" ValidationGroup="providerValidationGroup"/> 
                    <br /> 
                    <asp:TextBox ID="txtDefaultAttendeeEmailSubject" runat="server" Width="214px" /> 
                    <asp:CheckBox ID="chkAttendeeSameAsTitle" runat="server" Text="Same as title" /> 
                    <asp:CustomValidator ControlToValidate="txtDefaultAttendeeEmailSubject" ID="valDefaultAttendeeEmailSubject" 
                        runat="server" ErrorMessage="Default Attendee Email Subject is required" ValidateEmptyText="true" 
                        SetFocusOnError="true" Display="Dynamic" ValidationGroup="providerValidationGroup"/> 
                </div> 
            </div> 
        </radM:RadPageView>         
        <radM:RadPageView runat="server" ID="linkedEnterprises"
            <div id="doc3"
                <asp:UpdateProgress ID="UpdateProgressEnterprises" runat="server" AssociatedUpdatePanelID="updatePanelEnterprises" 
                    DisplayAfter="0"
                    <ProgressTemplate> 
                        <asp:Image ID="imgAjaxProgress" runat="server" ImageUrl="~/images/ajax-loader.gif" /> 
                    </ProgressTemplate> 
                </asp:UpdateProgress> 
                <asp:UpdatePanel ID="updatePanelEnterprises" runat="server"
                    <ContentTemplate> 
                        <div style="width: 870px;"
                            <table class="widetable"
                                <tr> 
                                    <td> 
                                        <strong> 
                                            <asp:Localize ID="Localize3" runat="server" Text="Enterprise Name:" /></strong
                                    </td> 
                                    <td> 
                                        <asp:TextBox ID="txtEnterpriseName" runat="server" Width="214px" /> 
                                    </td> 
                                </tr> 
                                <tr> 
                                    <td> 
                                        <strong> 
                                            <asp:Localize ID="Localize6" runat="server" Text="Enterprise Type:" /></strong
                                    </td> 
                                    <td align="left"
                                        <asp:DropDownList ID="ddlEnterpriseType" runat="server"
                                        </asp:DropDownList> 
                                    </td> 
                                </tr> 
                                <tr> 
                                    <td> 
                                    </td> 
                                    <td align="left"
                                        <asp:Button ID="btnSearchEnterprise" runat="server" CssClass="brandingButton" Text="Search" 
                                            OnClick="btnSearchEnterprise_Click" UseSubmitBehavior="False" CausesValidation="False" /> 
                                    </td> 
                                </tr> 
                                <tr> 
                                    <td> 
                                    </td> 
                                    <td> 
                                    </td> 
                                </tr> 
                            </table> 
                        </div> 
                        <div style="width: 900px;"
                            <table> 
                                <tr> 
                                    <td align="center"
                                        <strong> 
                                            <asp:Localize ID="locAvaiableEnterprises" runat="server" Text="Search Results" /> 
                                        </strong> 
                                    </td> 
                                    <td align="center"
                                    </td> 
                                    <td align="center"
                                        <strong> 
                                            <asp:Localize ID="locSelectedEnterprises" runat="server" Text="Selected Enterprises" /> 
                                        </strong> 
                                    </td> 
                                </tr> 
                                <tr> 
                                    <td> 
                                        <asp:ListBox ID="lstSearchResults" runat="server" Rows="10" SelectionMode="Multiple" 
                                            Width="280px"></asp:ListBox> 
                                    </td> 
                                    <td align="center" valign="middle"
                                        <asp:Button ID="btnAddEnterprise" runat="server" CssClass="brandingButton" OnClick="btnAddEnterprise_Click" 
                                            Text="Add&gt;&gt;" UseSubmitBehavior="False" CausesValidation="False" /> 
                                    </td> 
                                    <td valign="middle"
                                        <asp:ListBox ID="lstSelectedEnterprises" runat="server" Rows="10" SelectionMode="Multiple" 
                                            Width="280px"></asp:ListBox> 
                                    </td> 
                                </tr> 
                                <tr> 
                                    <td align="center"
                                        <asp:Button ID="btnClearResults" runat="server" CausesValidation="False" CssClass="brandingButton" 
                                            OnClick="btnClearResults_Click" Text="Clear Search" UseSubmitBehavior="False" /> 
                                    </td> 
                                    <td> 
                                    </td> 
                                    <td align="center"
                                        <asp:Button ID="btnDeleteSelected" runat="server" CssClass="brandingButton" OnClick="btnDeleteSelected_Click" 
                                            Text="Delete Selected" UseSubmitBehavior="False" CausesValidation="False" /> 
                                    </td> 
                                </tr> 
                            </table> 
                        </div> 
                    </ContentTemplate> 
                    <Triggers> 
                        <asp:AsyncPostBackTrigger ControlID="btnSearchEnterprise" EventName="Click" /> 
                        <asp:AsyncPostBackTrigger ControlID="btnAddEnterprise" EventName="Click" /> 
                        <asp:AsyncPostBackTrigger ControlID="btnDeleteSelected" EventName="Click" /> 
                        <asp:AsyncPostBackTrigger ControlID="btnClearResults" EventName="Click" /> 
                    </Triggers> 
                </asp:UpdatePanel> 
            </div> 
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="netspokeOptions"
            <div class="yui-gb"
                <div class="yui-g first"
                    <strong> 
                        <asp:Localize ID="locScheduleOptions" runat="server" Text="Scheduling/Joining" /> 
                    </strong><br /> 
                    <asp:CheckBox ID="chkRequirePasscodeChecked" runat="server" Text="Conference private by default" /><br /> 
                    <asp:CheckBox ID="chkJoinNoiseEnabled" runat="server" Text="Audio alert when someone joins" /><br /> 
                    <asp:CheckBox ID="chkCallMyPhoneEnabled" runat="server" Text="Enable call my phone feature" /><br /> 
                    <asp:CheckBox ID="chkPresentationsChecked" runat="server" Text="All uploaded presentations available" /><br /> 
                    <asp:CheckBox ID="chkPollingChecked" runat="server" Text="All uploaded polling questions available" /><br /> 
                    <asp:CheckBox ID="chkWebRecordingConfigEnabled" runat="server" Text="Web recording is modifiable in scheduling" /><br /> 
                    <asp:CheckBox ID="chkRecordAllWeb" runat="server" Text="Record all web conference events" /><br /> 
                </div> 
                <div class="yui-g"
                    <strong> 
                        <asp:Localize ID="locConferenceOptions" runat="server" Text="In Conference" /> 
                    </strong><br /> 
                    <asp:CheckBox ID="chkQAEnabled" runat="server" Text="Enable Q&A" /><br /> 
                    <asp:CheckBox ID="chkWebRecordingEnabled" runat="server" Text="Enable web recording option" /><br /> 
                    <asp:CheckBox ID="chkChatEnabled" runat="server" Text="Enable chat" /><br /> 
                    <asp:CheckBox ID="chkBlockSharingEntireDesktop" runat="server" Text="Enable desktop sharing" /><br /> 
                    <asp:CheckBox ID="chkAppShareEnabled" runat="server" Text="Enable AppShare" /><br /> 
                    <asp:CheckBox ID="chkSharingVideoEnabled" runat="server" Text="Enable video" /><br /> 
                    <asp:CheckBox ID="chkSharedFilesEnabled" runat="server" Text="Enable file transfer" /><br /> 
                    <asp:CheckBox ID="chkPollingEnabled" runat="server" Text="Enable polling" /><br /> 
                    <asp:CheckBox ID="chkWhiteboardEnabled" runat="server" Text="Enable whiteboard" /><br /> 
                    <asp:CheckBox ID="chkPresentationsEnabled" runat="server" Text="Enable PowerPoint sharing" /><br /> 
                    <asp:CheckBox ID="chkHelpEnabled" runat="server" Text="Enable live help" /><br /> 
                </div> 
                <div class="yui-g"
                    <strong> 
                        <asp:Localize ID="locAppShareOptions" runat="server" Text="AppShare/Communication" /> 
                    </strong><br /> 
                    <asp:CheckBox ID="chkAppShareMaskingEnabled" runat="server" Text="Hide pop-up windows when sharing" /><br /> 
                    <asp:CheckBox ID="chkGrantControlEnabled" runat="server" Text="Grant control to participants enabled" /><br /> 
                    <asp:CheckBox ID="chkSecure" runat="server" Text="SSL enabled for all conferences by default" /><br /> 
                    <asp:Label ID="lblAppShareColorDepth" runat="server" Text="Set default AppShare color level" /> 
                    <asp:DropDownList ID="ddlAppShareColorDepth" runat="server"
                        <asp:ListItem Text="Low" Value="8" /> 
                        <asp:ListItem Text="High" Value="16" /> 
                    </asp:DropDownList> 
                    <br /> 
                </div> 
            </div> 
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="webConfLogo"
            <div class="yui-gd"
                <div class="yui-g first"
                    <strong> 
                        <asp:Localize ID="locWebLogoCurrent" runat="Server" Text="Web Conference Logo:" /> 
                    </strong> 
                    <br /> 
                    <br /> 
                    <asp:Localize ID="locSelectWebLogo" runat="server" Text="Select Conference Logo for upload:" /><br /> 
                    <radM:RadUpload ID="RadUploadWebConfLogo" runat="server" InitialFileInputsCount="1" 
                        ControlObjectsVisibility="None" MaxFileSize="262144000" MaxFileInputsCount="1" 
                        OnValidatingFile="RadUpload_ValidatingFile" Width="100%" EnableFileInputSkinning="false" /> 
                    <p> 
                        <asp:Localize ID="locWebLogoRequirements" runat="Server" Text="<i><strong>Logo Requirements:</strong><br>&#8226;    The file must be in <strong>.jpg or .gif</strong> format<br>&#8226; The image must not exceed <strong>150W x 38H</strong> px<br>&#8226; The file size must not exceed <strong>128</strong> kb</i>." /> 
                        <asp:HiddenField ID="hfWebConfLogo" runat="server" /> 
                    </p> 
                    <br />                     
                    <asp:Button ID="btnWebConfLogoPreview" runat="server" Text="Preview" OnClick="btnWebConfLogoPreview_Click" />&nbsp&nbsp 
                    <asp:Button ID="btnWebConfLogoSave" runat="server" Text="Save" OnClick="btnWebLogoSave_Click" Visible="false" /> 
                </div> 
                <div class="yui-g"
                    <asp:Image ID="imgConfLogo" AlternateText="Image Preview" runat="server" /> 
                </div> 
            </div> 
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="hubLogo"
            <div class="yui-gd"
                <div class="yui-g first"
                    <strong> 
                        <asp:Localize ID="locHubLogoCurrent" runat="Server" Text="Conferencing Hub Logo:" /> 
                    </strong> 
                    <br /> 
                    <asp:Localize ID="locSelectHubLogo" runat="Server" Text="Select Conferencing Hub Logo for upload:" /><br /> 
                    <radM:RadUpload ID="RadUploadHeaderLogo" runat="server" InitialFileInputsCount="1" 
                        ControlObjectsVisibility="None" MaxFileSize="262144000" MaxFileInputsCount="1" 
                        OnValidatingFile="RadUpload_ValidatingFile" Width="100%" EnableFileInputSkinning="false" /> 
                    <p> 
                        <asp:Localize ID="locHubLogoRequirements" runat="Server" Text="<i><strong>Logo Requirements:</strong><br>&#8226;    The file must be in <strong>.jpg or .gif</strong> format<br>&#8226; The image must not exceed <strong>150W x 60H</strong> px<br>&#8226; The file size must not exceed <strong>128</strong> kb</i>." /> 
                    </p> 
                    <br /> 
                    <asp:Button ID="btnHeaderLogoPreview" runat="server" Text="Preview" OnClick="btnHeaderLogoPreview_Click" 
                       UseSubmitBehavior="False" />&nbsp&nbsp 
                    <asp:Button ID="btnHeaderLogoSave" runat="server" Text="Save" OnClick="btnHubLogoSave_Click" Visible="false"/> 
                        
                </div> 
                <div class="yui-g"
                    <asp:Image ID="imgHeaderLogo" runat="server" /> 
                    <asp:HiddenField ID="hfHeaderLogo" runat="server" /> 
                </div> 
            </div> 
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="marketingLinks"
            <radM:RadGrid ID="radGridMarkeingLinks" runat="server" PageSize="5" AutoGenerateColumns="false" 
                 AllowAutomaticDeletes="true" AllowAutomaticInserts="true" AllowAutomaticUpdates="true" 
                     OnItemInserted="InsertBranding"  OnItemDeleted="DeleteBranding" OnItemUpdated="UpdateBranding" AllowPaging="false" Width="600px"
                    <MasterTableView TableLayout="Fixed" CommandItemDisplay="Top" EnableNoRecordsTemplate="true"
                        <Columns>  
                            <radM:GridEditCommandColumn></radM:GridEditCommandColumn>                            
                            <radM:GridBoundColumn UniqueName="MarketingText" HeaderText="Marketing Link Text" DataField="Key" ></radM:GridBoundColumn> 
                            <radM:GridBoundColumn UniqueName="MarketingLink" HeaderText="Marketing Link URL" DataField="Value" ></radM:GridBoundColumn> 
                            <radM:GridButtonColumn ButtonType="LinkButton" Text="Delete"></radM:GridButtonColumn>                             
                        </Columns> 
                        <NoRecordsTemplate> 
                            <h2>There are currently no marketing links defined</h2>                         
                        </NoRecordsTemplate> 
                    </MasterTableView> 
                    <%--<ClientSettings> 
                        <ClientEvents  OnRowClick="RowClick" OnRowDblClick="RowDblClick" 
                    OnGridCreated="GridCreated" OnCommand="GridCommand"/> 
                    </ClientSettings>--%> 
                                         
                </radM:RadGrid> 
                <%--<radM:GridTextBoxColumnEditor ID="MarketingKey" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor> 
                 <radM:GridTextBoxColumnEditor ID="MarketingValue" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor>--%> 
                <netspoke:actionButtons ID="abMarketingLinks" runat="server" DisplaySaveButton="true" SaveText="Save" DisplayCancelButton="false" /> 
             
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="marketingImages"
            <div> 
                <radM:RadGrid ID="radGridMarketingImages" runat="server" PageSize="5" AutoGenerateColumns="False" 
                    AllowPaging="false" Width="600px"
                    <MasterTableView TableLayout="Fixed" CommandItemDisplay="Top"
                        <Columns> 
                            <radM:GridEditCommandColumn></radM:GridEditCommandColumn> 
                            <radM:GridTemplateColumn HeaderText="Image Path" UniqueName="ImagePath" SortExpression="value"
                                <ItemTemplate> 
                                    <asp:Label runat="server" ID="lblName" text='<%# Eval("Value") %>'></asp:Label> 
                                </ItemTemplate> 
                                <EditItemTemplate> 
                                    <asp:TextBox runat="server" ID="txbName" text='<%# Eval("Value") %>'></asp:TextBox> 
                                </EditItemTemplate> 
                            </radM:GridTemplateColumn> 
                            <radM:GridTemplateColumn HeaderText="Image" UniqueName="Upload"
                                <ItemTemplate> 
                                    <asp:Image runat="server" ID="ImageThumbnail" ImageUrl='<%# Eval("Value") %>' /> 
                                </ItemTemplate> 
                                <EditItemTemplate> 
                                    <radM:RadUpload ID="RadUploadMarkeingImage" runat="server" InitialFileInputsCount="1" 
                                        ControlObjectsVisibility="None" MaxFileSize="262144000" MaxFileInputsCount="1" 
                                        OnValidatingFile="RadUpload_ValidatingFile" Width="100%" EnableFileInputSkinning="false"
                                    </radM:RadUpload>  
                                </EditItemTemplate> 
                            </radM:GridTemplateColumn> 
                            <radM:GridButtonColumn ButtonType="PushButton" Text="Delete" CommandName="delete" UniqueName="column"
                            </radM:GridButtonColumn> 
                        </Columns> 
                        <EditFormSettings> 
                        <EditColumn UniqueName="EditCommandColumn1"
                        </EditColumn> 
                    </EditFormSettings> 
                    <ExpandCollapseColumn> 
                        <HeaderStyle Width="20px" /> 
                    </ExpandCollapseColumn> 
                    <RowIndicatorColumn> 
                        <HeaderStyle Width="20px" /> 
                    </RowIndicatorColumn> 
                </MasterTableView> 
                <FilterMenu EnableTheming="True"
                    <CollapseAnimation Duration="200" Type="OutQuint" /> 
                </FilterMenu>                                       
                </radM:RadGrid> 
            </div> 
        </radM:RadPageView>         
        <radM:RadPageView runat="server" ID="appTitle"
            <div class="yui-gd"
                <div class="yui-g first"
                    <br /> 
                    <strong> 
                        <asp:Localize ID="locAppTitle" runat="server" Text="Application Title Text:"></asp:Localize> 
                    </strong> 
                    <br /> 
                    <br /> 
                    <asp:Localize ID="locAppText" runat="server" Text="Application Text"></asp:Localize> 
                </div> 
                <div class="yui-g"
                    <br /> 
                    <br />                     
                    <asp:TextBox ID="txtAppText" runat="server"></asp:TextBox> 
                </div> 
            </div>             
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="gettingStartedText"
        <radM:RadGrid ID="radGridGettingStarted" runat="server" PageSize="5" AutoGenerateColumns="false" 
                    AllowPaging="false" Width="600px"
                    <MasterTableView TableLayout="Fixed" CommandItemDisplay="Top" EditMode="InPlace" EnableNoRecordsTemplate="true"
                        <Columns>                             
                            <radM:GridBoundColumn UniqueName="GettingStartedText" HeaderText="Getting Started Text" DataField="Key" ColumnEditorID="GettingStartedKey"></radM:GridBoundColumn> 
                            <radM:GridBoundColumn UniqueName="GettingStartedLink" HeaderText="Getting Started Link" DataField="Value" ColumnEditorID="GettingStartedValue"></radM:GridBoundColumn> 
                            <radM:GridButtonColumn ButtonType="PushButton" Text="Delete"></radM:GridButtonColumn>                             
                        </Columns> 
                        <NoRecordsTemplate> 
                            <h2>There are currently no Getting Started links defined</h2>                         
                        </NoRecordsTemplate> 
                    </MasterTableView> 
                    <ClientSettings> 
                        <ClientEvents  OnRowClick="RowClick" OnRowDblClick="RowDblClick" 
                    OnGridCreated="GridCreated" OnCommand="GridCommand"/> 
                    </ClientSettings> 
                                         
                </radM:RadGrid> 
                <radM:GridTextBoxColumnEditor ID="GettingStartedKey" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor> 
                 <radM:GridTextBoxColumnEditor ID="GettingStartedValue" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor> 
                <netspoke:actionButtons ID="abGettingStarted" runat="server" DisplaySaveButton="true" SaveText="Save" DisplayCancelButton="false" /> 
             
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="helpLinks"
            <div>             
                <radM:RadGrid ID="radGridHelpLinks" runat="server" PageSize="5" AutoGenerateColumns="false" 
                    AllowPaging="false" Width="600px"
                    <MasterTableView TableLayout="Fixed" CommandItemDisplay="Top" EditMode="InPlace" EnableNoRecordsTemplate="true"
                        <Columns>                             
                            <radM:GridBoundColumn UniqueName="HelpText" HeaderText="Help Item Text" DataField="Key" ColumnEditorID="HelpKey"></radM:GridBoundColumn> 
                            <radM:GridBoundColumn UniqueName="HelpLink" HeaderText="Help Item URL" DataField="Value" ColumnEditorID="HelpValue"></radM:GridBoundColumn> 
                            <radM:GridButtonColumn ButtonType="PushButton" Text="Delete"></radM:GridButtonColumn>                             
                        </Columns> 
                        <NoRecordsTemplate> 
                            <h2>There are currently no help links defined</h2>                         
                        </NoRecordsTemplate> 
                    </MasterTableView> 
                    <ClientSettings> 
                        <ClientEvents  OnRowClick="RowClick" OnRowDblClick="RowDblClick" 
                    OnGridCreated="GridCreated" OnCommand="GridCommand"/> 
                    </ClientSettings> 
                                         
                </radM:RadGrid> 
                <radM:GridTextBoxColumnEditor ID="HelpKey" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor> 
                 <radM:GridTextBoxColumnEditor ID="HelpValue" runat="server" TextBoxStyle-Width="200px"></radM:GridTextBoxColumnEditor> 
                <netspoke:actionButtons ID="abHelpLinks" runat="server" DisplaySaveButton="true" SaveText="Save" DisplayCancelButton="false" /> 
            </div> 
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="quickLinks"
        </radM:RadPageView> 
        <radM:RadPageView runat="server" ID="skin"
            <asp:Localize ID="locSkin" runat="server" Text="Skin:" /><span class="required">*</span> 
            <asp:DropDownList ID="ddlSkin" runat="server" /> 
        </radM:RadPageView> 
    </radM:RadMultiPage> 
    
    
    <asp:HiddenField id="hfBrandingId" runat="server" /> 
    <asp:HiddenField id="hfProviderID" runat="server" /> 
             
        <br /> 
        <div id="divAction" runat="server"
          <netspoke:actionButtons runat="server" ID="actionBtns" OnSaveClick="Save" CancelURL="~/Administration/providerSearch.aspx" /> 
        </div>      
      <br /> 
</asp:Content> 
 

.cs

using System; 
using System.Data; 
using System.Net; 
using System.Text; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Pgi.DomainLayer; 
using Pgi.Logging; 
using Pgi.ServiceAgents; 
using Pgi.Hub.ServiceLayer; 
using System.IO; 
using System.Web;    
using Telerik.Web.UI.Upload; 
using Telerik.Web.UI; 
using System.Drawing.Imaging; 
using System.Web.Configuration; 
using System.Collections.Generic; 
using Pgi.ServiceAgents.PgiInternalWS; 
using Provider=Pgi.DomainLayer.Provider; 
using System.Globalization; 
using ProviderType=Pgi.DomainLayer.ProviderType; 
 
namespace Pgi.Hub.Administration 
    public partial class providerAddEdit : HubBasePage 
    { 
        #region Private Variables 
        private const int _MAX_FILE_SIZE = 128000; 
        private const string _SAME_AS_TITLE = "SAME AS TITLE"
        private Provider _provider = new Provider(); 
        private ServiceLocator _serviceLocator = new ServiceLocator(); 
        private const string applicationName = "Hub"
        private const string defaultLanguage = "en"
        private int brandId; 
        private int providerId; 
        private bool edit; 
        #endregion 
        #region Load Methods 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            if (!Page.User.IsInRole("GlobalAdmin")) 
            { 
                throw new Exception("You do not have access to this page."); 
            } 
 
 
            if (!Page.IsPostBack) 
            { 
                //Skin Options 
                ddlSkin.Items.Add(new ListItem("Default""default")); 
                ddlSkin.Items.Add(new ListItem("Blue""blue")); 
                ddlSkin.Items.Add(new ListItem("Brown""brown")); 
                ddlSkin.Items.Add(new ListItem("Gray""gray")); 
                ddlSkin.Items.Add(new ListItem("Green""green")); 
                ddlSkin.Items.Add(new ListItem("Khaki""khaki")); 
                ddlSkin.Items.Add(new ListItem("Navy""navy")); 
                ddlSkin.Items.Add(new ListItem("Orange""orange")); 
                ddlSkin.Items.Add(new ListItem("Purple""purple")); 
                ddlSkin.Items.Add(new ListItem("Red""red")); 
                ddlSkin.Items.Add(new ListItem("Yellow""yellow")); 
 
                //provider types 
                ddlProviderType.Items.Add(new ListItem(_provider.GetStringFromProviderType(ProviderType.External), DomainLayer.ProviderType.External.ToString())); 
                ddlProviderType.Items.Add(new ListItem(_provider.GetStringFromProviderType(ProviderType.Test), DomainLayer.ProviderType.Test.ToString())); 
                ddlProviderType.Items.Add(new ListItem(_provider.GetStringFromProviderType(ProviderType.Internal), DomainLayer.ProviderType.Internal.ToString())); 
 
                //enterprise Types 
                ddlEnterpriseType.Items.Add(new ListItem("""")); 
                ddlEnterpriseType.Items.Add(new ListItem("Premiere Client""Premiere Client")); 
                ddlEnterpriseType.Items.Add(new ListItem("Reseller""Reseller")); 
                ddlEnterpriseType.Items.Add(new ListItem("Wholesaler""Wholesaler")); 
 
                valDefaultModeratorEmailSubject.ClientValidationFunction = "ValidateDefaultModeratorEmailSubject"
                valDefaultAttendeeEmailSubject.ClientValidationFunction = "ValidateDefaultAttendeeEmailSubject"
 
 
                imgConfLogo.Visible = false
                imgHeaderLogo.Visible = false
 
                //to add domain name automatically from Hub Group Domain textbox 
                SetText(); 
 
                hfBrandingId.Value = CurrentHub.Id.ToString(); 
 
                //set netspoke options tab text 
                RadTab radTab = tabstripProviderOptions.Tabs.FindTabByValue("3"); 
                radTab.Text = string.Format("{0} Options", BrandingLocalization.GetProductName(ProductTypes.NetspokeService, CurrentHub.BrandId)); 
 
                actionBtns.Visible = false
 
                edit = false
 
                //Edit(provider ID is provided) 
                if (Request["ID"] != null
                { 
                    edit = true
                    actionBtns.Visible = true
 
                    try 
                    { 
                        hfProviderID.Value = Request["ID"]; 
                    } 
                    catch (Exception exc) 
                    { 
                        LogManager.Log.Error("Error converting providerID on provider add/edit"); 
                        LogManager.Log.Exception(exc); 
                        Response.Redirect("providerSearch.aspx"); 
                    } 
 
                    LoadProvider(); 
                    ddlProviderType.Enabled = false
 
 
 
 
                } 
            } 
        } 
 
        private void LoadProvider() 
        { 
            IEnumerable<string> mycol = new List<string>(); 
            _provider = _serviceLocator.ProviderService().Load(Convert.ToInt32(hfProviderID.Value)); 
 
            brandId = _serviceLocator.BrandingService().GetBrandId(null, _provider.Name); 
 
 
 
            txtProviderName.Text = _provider.Name; 
            txtHubGroupDomain.Text = _provider.HubGroupDomain; 
            txtAppShareHost.Text = _provider.AppShareHost.Replace("." + _provider.HubGroupDomain.Trim(), ""); 
            txtCustomerHomePage.Text = _provider.CustomerUrl; 
            txtDefualtMeetingServer.Text = _provider.DefaultMeetingServer.Replace("." + _provider.HubGroupDomain.Trim(), ""); 
            txtSecureDefaultMeetingServer.Text = _provider.DefaultMeetingServerSSL.Replace("." + _provider.HubGroupDomain.Trim(), ""); 
 
            inpAppShareHostAppend.Value = txtHubGroupDomain.Text; 
            inpMeetingServerAppend.Value = txtHubGroupDomain.Text; 
            inpSecureMeetingServerAppend.Value = txtHubGroupDomain.Text; 
 
            //ddlSkin.SelectedValue = _provider.Skin; 
            ddlProviderType.SelectedValue = _provider.ProviderType.ToString(); 
 
            if (_provider.HeaderLogo.Length > 0) 
            { 
                imgHeaderLogo.Visible = true
                imgHeaderLogo.ImageUrl = "~/utilities/imageStreamer.aspx?imagePath=" + HttpUtility.UrlEncode(_provider.HeaderLogo); 
            } 
 
            if (_provider.ConsoleLogo.Length > 0) 
            { 
                imgConfLogo.Visible = true
                imgConfLogo.ImageUrl = "~/utilities/imageStreamer.aspx?imagePath=" + HttpUtility.UrlEncode(_provider.ConsoleLogo); 
            } 
 
            foreach (var enterprise in _provider.Enterprises) 
            { 
                lstSelectedEnterprises.Items.Add(enterprise.Trim()); 
            } 
 
            txtDefaultConferenceTitle.Text = _provider.TextOptions["DefaultConferenceTitle"]; 
 
            if (_provider.TextOptions["DefaultSubjectModerator"].ToUpper() == _SAME_AS_TITLE) 
            { 
                chkModeratorSameAsTitle.Checked = true
                txtDefaultModeratorEmailSubject.Enabled = false
            } 
            else 
            { 
                txtDefaultModeratorEmailSubject.Text = _provider.TextOptions["DefaultSubjectModerator"]; 
            } 
 
            if (_provider.TextOptions["DefaultSubjectAttendee"].ToUpper() == _SAME_AS_TITLE) 
            { 
                chkAttendeeSameAsTitle.Checked = true
                txtDefaultAttendeeEmailSubject.Enabled = false
            } 
            else 
            { 
                txtDefaultAttendeeEmailSubject.Text = _provider.TextOptions["DefaultSubjectAttendee"]; 
            } 
 
            LoadBrandingInfo(); 
 
            LoadOptions(_provider); 
        } 
 
        private void SetText() 
        { 
            var sb = new StringBuilder(); 
            sb.Append("<script type='text/javascript'>\r\n"); 
            sb.Append("function SetText()\r\n"); 
            sb.Append(" {\r\n"); 
            sb.Append("     var domain = document.getElementById('" + txtHubGroupDomain.ClientID + "');\r\n"); 
            sb.Append("     var txt1 = document.getElementById('" + inpAppShareHostAppend.ClientID + "');\r\n"); 
            sb.Append("     var txt2 = document.getElementById('" + inpMeetingServerAppend.ClientID + "');\r\n"); 
            sb.Append("     var txt3 = document.getElementById('" + inpSecureMeetingServerAppend.ClientID + "');\r\n"); 
            sb.Append("     if (domain != null)\r\n"); 
            sb.Append("     {\r\n"); 
            sb.Append("         txt1.value = domain.value;\r\n"); 
            sb.Append("         txt2.value = domain.value;\r\n"); 
            sb.Append("         txt3.value = domain.value;\r\n"); 
            sb.Append("     }\r\n"); 
            sb.Append(" }\r\n"); 
            sb.Append("</script>\r\n"); 
 
            var cs = Page.ClientScript; 
            var csName = "setTextScript"
            Type csType = GetType(); 
 
            if (!cs.IsClientScriptBlockRegistered(csType, csName)) 
            { 
                cs.RegisterClientScriptBlock(csType, csName, sb.ToString()); 
            } 
        } 
 
        private void LoadBrandingInfo() 
        { 
            //initial load of helplinks grid 
            BrandedItem[] brandingData = null
 
            brandingData = _serviceLocator.BrandingService().GetBrandingData(applicationName, brandId); 
 
            var keyValMarketingLinks = _serviceLocator.BrandingService().GetKeyValPair(brandingData, "DisplaySettings"
                                                                                       "Content""MarketingLinks"); 
            radGridMarkeingLinks.DataSource = keyValMarketingLinks; 
            radGridMarkeingLinks.DataBind(); 
 
 
            var keyValHelpLinks = _serviceLocator.BrandingService().GetKeyValPair(brandingData, "DisplaySettings"
                                                                                                 "Content"
                                                                                                    "HelpLinks"); 
            radGridHelpLinks.DataSource = keyValHelpLinks; 
            radGridHelpLinks.DataBind(); 
 
            var keyValGettingStarted = _serviceLocator.BrandingService().GetKeyValPair(brandingData, "DisplaySettings"
                                                                                       "Content""GettingStarted"); 
            radGridGettingStarted.DataSource = keyValGettingStarted; 
            radGridGettingStarted.DataBind(); 
 
            var keyValMarketingAds = _serviceLocator.BrandingService().GetKeyValPair(brandingData, "DisplaySettings"
                                                                                     "Content""PormotionLinks"); 
            radGridMarketingImages.DataSource = keyValMarketingAds; 
            radGridMarketingImages.DataBind(); 
 
        } 
 
        private void LoadOptions(Pgi.DomainLayer.Provider provider) 
        { 
            if (provider.Options != null && provider.Options.Count > 0) 
            { 
                foreach (var option in provider.Options) 
                { 
                    switch (option.Key) 
                    { 
                        //column 1 
                        case "RequirePasscodeChecked"
                            chkRequirePasscodeChecked.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "JoinNoiseEnabled"
                            chkJoinNoiseEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "CallMyPhoneEnabled"
                            chkCallMyPhoneEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "PresentationsChecked"
                            chkPresentationsChecked.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "PollingChecked"
                            chkPollingChecked.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "WebRecordingConfigEnabled"
                            chkWebRecordingConfigEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "RecordAllWeb"
                            chkRecordAllWeb.Checked = Convert.ToBoolean(option.Value); 
                            break
 
                        // column 2 
                        case "QAEnabled"
                            chkQAEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "WebRecordingEnabled"
                            chkWebRecordingEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "ChatEnabled"
                            chkChatEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "HelpEnabled"
                            chkHelpEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "BlockSharingEntireDesktop"
                            chkBlockSharingEntireDesktop.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "AppShareEnabled"
                            chkAppShareEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "SharingVideoEnabled"
                            chkSharingVideoEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "SharedFilesEnabled"
                            chkSharedFilesEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "PollingEnabled"
                            chkPollingEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "WhiteboardEnabled"
                            chkWhiteboardEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "PresentationsEnabled"
                            chkPresentationsEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
 
                        // column 3 
                        case "AppShareMaskingEnabled"
                            chkAppShareMaskingEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "GrantControlEnabled"
                            chkGrantControlEnabled.Checked = Convert.ToBoolean(option.Value); 
                            break
                        case "AppShareColorDepth"
                            ddlAppShareColorDepth.SelectedIndex = Common.GetSelectedIndex(ddlAppShareColorDepth, option.Value.ToString()); 
                            break
                        case "Secure"
                            chkSecure.Checked = Convert.ToBoolean(option.Value); 
                            break
                    } 
                } 
                bool hideLiveHelp; 
                bool.TryParse(BrandingLocalization.GetValue("DisplaySettings""Content""HideLiveHelp", CurrentHub.BrandId), 
                    out hideLiveHelp); 
                if (hideLiveHelp) 
                { 
                    chkHelpEnabled.Enabled = false
                    chkHelpEnabled.Visible = false
                } 
            } 
        } 
        #endregion 
        #region Save Methods 
 
        protected void Save(object sender, EventArgs e) 
        { 
            if (Page.IsValid) 
            { 
                resultHandler.ResetStatus(); 
                try 
                { 
                    if (SaveData() && edit == false
                    { 
                        //Response.Redirect("providerSearch.aspx", true); 
                        RadTab tab = tabstripProviderOptions.FindTabByValue("4"); 
                        tab.Selected = true
                        RadPageView pageView = MultiPageBranding.FindPageViewByID("webConfLogo"); 
                        pageView.Selected = true
                        actionBtns.Visible = true
                    } 
                    else 
                    { 
                        resultHandler.ChangeStatus(ActionStatus.Warning, "Unable to save your changes."); 
                    } 
                } 
                catch (Exception wsEx) 
                { 
                    imgConfLogo.Visible = false
                    imgHeaderLogo.Visible = false
                    resultHandler.ResetStatus(); 
                    resultHandler.ChangeStatus(ActionStatus.Error, String.Format("The following error occurred while saving your changes: {0}", wsEx.Message)); 
                    LogManager.Log.Exception(wsEx); 
                } 
            } 
        } 
 
        private bool SaveData() 
        { 
            var defaultSubjectModerator = ""
            var defaultSubjectAttendee = ""
 
            if (chkModeratorSameAsTitle.Checked) 
            { 
                defaultSubjectModerator = _SAME_AS_TITLE; 
            } 
            else 
            { 
                defaultSubjectModerator = txtDefaultModeratorEmailSubject.Text; 
            } 
 
            if (chkAttendeeSameAsTitle.Checked) 
            { 
                defaultSubjectAttendee = _SAME_AS_TITLE; 
            } 
            else 
            { 
                defaultSubjectAttendee = txtDefaultModeratorEmailSubject.Text; 
            } 
 
            if (hfProviderID.Value != ""
            { 
                _provider = _serviceLocator.ProviderService().Load(int.Parse(hfProviderID.Value)); 
                _provider.TextOptions["DefaultConferenceTitle"] = txtDefaultConferenceTitle.Text; 
                _provider.TextOptions["DefaultSubjectModerator"] = defaultSubjectModerator; 
                _provider.TextOptions["DefaultSubjectAttendee"] = defaultSubjectAttendee; 
            } 
            else 
            { 
                _provider = new Provider(); 
                _provider.TextOptions.Add("ProviderName", txtProviderName.Text.Trim()); 
                _provider.TextOptions.Add("DefaultConferenceTitle", txtDefaultConferenceTitle.Text); 
                _provider.TextOptions.Add("DefaultSubjectModerator", defaultSubjectModerator); 
                _provider.TextOptions.Add("DefaultSubjectAttendee", defaultSubjectAttendee); 
            } 
            //_provider.Skin = ddlSkin.SelectedValue.Trim();             
            _provider.ProviderType = _provider.GetProviderTypeFromString(ddlProviderType.SelectedItem.Text); 
            _provider.Name = txtProviderName.Text.Trim(); 
            _provider.HubGroupDomain = txtHubGroupDomain.Text.Trim(); 
            _provider.AppShareHost = txtAppShareHost.Text.Trim() + "." + txtHubGroupDomain.Text.Trim(); 
            _provider.CustomerUrl = txtCustomerHomePage.Text.Trim(); 
            _provider.DefaultMeetingServer = txtDefualtMeetingServer.Text.Trim() + "." + txtHubGroupDomain.Text.Trim(); 
            _provider.DefaultMeetingServerSSL = txtSecureDefaultMeetingServer.Text.Trim() + "." + txtHubGroupDomain.Text.Trim(); 
 
            _provider.Enterprises.Clear(); 
            foreach (ListItem enterprise in lstSelectedEnterprises.Items) 
            { 
                _provider.Enterprises.Add(enterprise.Text.Trim()); 
            } 
 
            SaveOptions(_provider); 
 
            //SaveHeaderImageToServer(_provider); 
 
            //SaveWebConfImageToServer(_provider); 
 
            providerId = _serviceLocator.ProviderService().Save(_provider); 
            hfProviderID.Value = providerId.ToString(); 
 
            brandId = _serviceLocator.BrandingService().GetBrandId(providerId, _provider.Name); 
 
            RadTab tab = tabstripProviderOptions.FindTabByValue("4"); 
            tab.Selected = true
            RadPageView pageView = MultiPageBranding.FindPageViewByID("webConfLogo"); 
            pageView.Selected = true
 
            return true
        } 
 
        private void SaveOptions(Provider provider) 
        { 
            provider.Options.Clear(); 
            //column 1 
            provider.Options.Add("RequirePasscodeChecked", Convert.ToInt16(chkRequirePasscodeChecked.Checked)); 
            provider.Options.Add("JoinNoiseEnabled", Convert.ToInt16(chkJoinNoiseEnabled.Checked)); 
            provider.Options.Add("CallMyPhoneEnabled", Convert.ToInt16(chkCallMyPhoneEnabled.Checked)); 
            provider.Options.Add("PresentationsChecked", Convert.ToInt16(chkPresentationsChecked.Checked)); 
            provider.Options.Add("PollingChecked", Convert.ToInt16(chkPollingChecked.Checked)); 
            provider.Options.Add("WebRecordingConfigEnabled", Convert.ToInt16(chkWebRecordingConfigEnabled.Checked)); 
            provider.Options.Add("RecordAllWeb", Convert.ToInt16(chkRecordAllWeb.Checked)); 
 
            //column 2 
            provider.Options.Add("QAEnabled", Convert.ToInt16(chkQAEnabled.Checked)); 
            provider.Options.Add("WebRecordingEnabled", Convert.ToInt16(chkWebRecordingEnabled.Checked)); 
            provider.Options.Add("ChatEnabled", Convert.ToInt16(chkChatEnabled.Checked)); 
            provider.Options.Add("HelpEnabled", Convert.ToInt16(chkHelpEnabled.Checked)); 
            provider.Options.Add("BlockSharingEntireDesktop", Convert.ToInt16(chkBlockSharingEntireDesktop.Checked)); 
            provider.Options.Add("AppShareEnabled", Convert.ToInt16(chkAppShareEnabled.Checked)); 
            provider.Options.Add("SharingVideoEnabled", Convert.ToInt16(chkSharingVideoEnabled.Checked)); 
            provider.Options.Add("SharedFilesEnabled", Convert.ToInt16(chkSharedFilesEnabled.Checked)); 
            provider.Options.Add("PollingEnabled", Convert.ToInt16(chkPollingEnabled.Checked)); 
            provider.Options.Add("WhiteboardEnabled", Convert.ToInt16(chkWhiteboardEnabled.Checked)); 
            provider.Options.Add("PresentationsEnabled", Convert.ToInt16(chkPresentationsEnabled.Checked)); 
            //column 3   
 
            provider.Options.Add("AppShareMaskingEnabled", Convert.ToInt16(chkAppShareMaskingEnabled.Checked)); 
            provider.Options.Add("GrantControlEnabled", Convert.ToInt16(chkGrantControlEnabled.Checked)); 
            provider.Options.Add("AppShareColorDepth", Convert.ToInt32(ddlAppShareColorDepth.SelectedValue)); 
            provider.Options.Add("Secure", Convert.ToInt16(chkSecure.Checked)); 
        } 
 
        private void SaveHeaderImageToServer(Provider provider) 
        { 
            if (Page.IsValid) 
            { 
                SaveLocalImage(RadUploadHeaderLogo, 150, 60, hfHeaderLogo); 
                if (RadUploadHeaderLogo.InvalidFiles.Count == 0 && hfHeaderLogo.Value.Length > 0) 
                { 
                    if (SaveImage("headerLogo", Server.UrlDecode(hfHeaderLogo.Value), provider)) 
                    { 
                        imgHeaderLogo.Visible = true
                        imgHeaderLogo.ImageUrl = "~/utilities/imageStreamer.aspx?imageType=headerLogo&hubId=" + hfBrandingId.Value; 
                        hfHeaderLogo.Value = ""
                    } 
                    else 
                    { 
                        imgHeaderLogo.Visible = false
                        resultHandler.ChangeStatus(ActionStatus.Warning, "Unable to update information"); 
                    } 
                } 
                else 
                { 
                    imgHeaderLogo.Visible = false
                    imgHeaderLogo.ImageUrl = ""
                    hfHeaderLogo.Value = ""
                } 
            } 
            else 
            { 
                imgHeaderLogo.Visible = false
                imgHeaderLogo.ImageUrl = ""
                hfHeaderLogo.Value = ""
            } 
        } 
 
        private void SaveWebConfImageToServer(Provider provider) 
        { 
 
            SaveLocalImage(RadUploadWebConfLogo, 150, 38, hfWebConfLogo); 
 
            if (RadUploadWebConfLogo.InvalidFiles.Count == 0 && hfWebConfLogo.Value.Length > 0) 
            { 
                if (SaveImage("consoleLogo", Server.UrlDecode(hfWebConfLogo.Value), provider)) 
                { 
                    imgConfLogo.Visible = true
                    imgConfLogo.ImageUrl = "~/utilities/imageStreamer.aspx?imageType=consoleLogo&hubId=" + hfBrandingId.Value; 
                    hfWebConfLogo.Value = ""
                } 
                else 
                { 
                    imgConfLogo.Visible = false
                    hfWebConfLogo.Value = ""
                    resultHandler.ChangeStatus(ActionStatus.Warning, "Unable to update information"); 
                } 
            } 
 
        } 
 
        private bool SaveImage(string baseFileName, string finalFullPath, Provider provider) 
        { 
            int returnVal = int.MinValue; 
            if (Session["hubId"] != null
            { 
                var client = new ServiceLocator().ClientService().GetDomainClientById((int)Session["clientId"]); 
                if (!Validator.ValidateBrandingPermission(client, CurrentHub.Id, Page)) 
                    throw new Exception(Validator.InvalidPermissionMsg); 
 
                if (finalFullPath.Length != 0) 
                { 
                    switch (baseFileName.ToLower()) 
                    { 
                        case "consolelogo"
                            finalFullPath = 
                                SaveNASImage(finalFullPath, 
                                             WebConfigurationManager.AppSettings["BrandingLogoPathPrefix"], baseFileName) 
                                    .Replace(WebConfigurationManager.AppSettings["BrandingLogoPathPrefix"], ""); 
                            _serviceLocator.BrandingService().SetBrandingProperty(brandId, applicationName, defaultLanguage, "DisplaySettings""Images""ConsoleLogo", finalFullPath, Session["clientId"].ToString()); 
                            break
 
                        case "headerlogo"
                            finalFullPath = 
                                SaveNASImage(finalFullPath, 
                                             WebConfigurationManager.AppSettings["BrandingLogoPathPrefix"], baseFileName) 
                                    .Replace(WebConfigurationManager.AppSettings["BrandingLogoPathPrefix"], ""); 
                            _serviceLocator.BrandingService().SetBrandingProperty(brandId, applicationName, defaultLanguage, "DisplaySettings""Images""HeaderLogo", finalFullPath, Session["clientId"].ToString()); 
                            break
                    } 
 
                    returnVal = 1; 
                } 
            } 
            return returnVal != int.MinValue; 
        } 
 
        private string SaveNASImage(string finalFullPath, string path_prefix, string baseFilename) 
        { 
            var filePath = new StringBuilder(); 
            filePath.Append(DateTime.Today.ToString("yyyyMMdd") + "/" + Hub.Common.GlobalRandom.Next() + "/"); 
 
            var filename = filePath + baseFilename + "-" + DateTime.Now.ToString("yyyyMMdd-HHmmssfff") + "-" + new Random().Next(10000, 99999); 
            var fileExtension = ""
            var extIndex = finalFullPath.LastIndexOf("."); 
            if (extIndex >= 0) 
            { 
                fileExtension = finalFullPath.Substring(extIndex); 
            } 
            var finalRelativePath = path_prefix + filename + fileExtension; 
            if (!FileManager.TransferFileToNAS(finalFullPath, finalRelativePath)) 
            { 
                throw new Exception(baseFilename + " could not be saved. Operation aborted."); 
            } 
            return finalRelativePath; 
        } 
 
        private void SaveLocalImage(RadUpload upLogo, int maxWidth, int maxHeight, HiddenField hfLogo) 
        { 
            if (upLogo.UploadedFiles.Count > 0) 
            { 
                var statusMessage = ""
                var path = System.Web.Configuration.WebConfigurationManager.AppSettings["BrandingImagesRootFolder"] + "\\" + 
                              DateTime.Today.ToString("yyyyMMdd") + "\\" + Hub.Common.GlobalRandom.Next() + "\\"
 
                if (!Directory.Exists(path)) 
                { 
                    Directory.CreateDirectory(path); 
                } 
 
                var finalFullPath = path + upLogo.UploadedFiles[0].GetName(); 
                upLogo.UploadedFiles[0].SaveAs(finalFullPath, true); 
 
                System.Drawing.Image imageCheck; 
 
                try 
                { 
                    imageCheck = System.Drawing.Image.FromFile(finalFullPath); 
 
                    if (!imageCheck.RawFormat.Equals(ImageFormat.Jpeg) && !imageCheck.RawFormat.Equals(ImageFormat.Gif)) 
                    { 
                        statusMessage = "Unable to update logo due to the following error: " + upLogo.UploadedFiles[0].GetName() + " is not a jpg or gif."
                    } 
                    else if (imageCheck.Height > maxHeight || imageCheck.Width > maxWidth) 
                    { 
                        statusMessage = "Unable to update logo due to the following error: " + 
                                        upLogo.UploadedFiles[0].GetName() + " is larger than " + maxWidth + 
                                        " pixels wide and " + maxHeight + " pixels high."
                    } 
                    imageCheck.Dispose(); 
                } 
                catch 
                { 
                    statusMessage = "Unable to update logo due to the following error: " + upLogo.UploadedFiles[0].GetName() + " is not an image."
                } 
 
                if (statusMessage.Length > 0) 
                { 
                    hfLogo.Value = ""
                    resultHandler.ResetStatus(); 
                    resultHandler.ChangeStatus(ActionStatus.Error, statusMessage); 
 
                    if (File.Exists(finalFullPath)) 
                    { 
                        File.Delete(finalFullPath); 
                    } 
                } 
                else 
                { 
                    hfLogo.Value = Server.UrlEncode(finalFullPath); 
                } 
            } 
            else if (upLogo.InvalidFiles.Count > 0) 
            { 
                //Do nothing and let resultHandler display message. 
            } 
            else if (hfLogo.Value.Length == 0) 
            { 
                resultHandler.ResetStatus(); 
                resultHandler.ChangeStatus(ActionStatus.Error, "Unable to update logo due to the following error: No logo file was specified"); 
            } 
            return
        } 
        #endregion 
        #region Event Handlers 
 
        protected void btnSearchEnterprise_Click(object sender, EventArgs e) 
        { 
            var searchResult = new EnterpriseService().Find("", txtEnterpriseName.Text.Trim(), ddlEnterpriseType.SelectedValue, NameSearchType.Contains, AssociationSearchType.UnassociatedOnly); 
 
            lstSearchResults.Items.Clear(); 
 
            foreach (var enterprise in searchResult) 
            { 
                lstSearchResults.Items.Add(enterprise.Name); 
            } 
        } 
 
        protected void btnDeleteSelected_Click(object sender, EventArgs e) 
        { 
            var removeCollection = new ListItemCollection(); 
 
            foreach (ListItem item in lstSelectedEnterprises.Items) 
            { 
                if (!item.Selected) 
                { 
                    continue
                } 
 
                removeCollection.Add(item); 
 
                if (!lstSearchResults.Items.Contains(item)) 
                { 
                    lstSearchResults.Items.Add(item); 
                } 
            } 
 
            foreach (ListItem removeItem in removeCollection) 
            { 
                lstSelectedEnterprises.Items.Remove(removeItem); 
            } 
        } 
 
        protected void btnAddEnterprise_Click(object sender, EventArgs e) 
        { 
            var removeCollection = new ListItemCollection(); 
 
            foreach (ListItem item in lstSearchResults.Items) 
            { 
 
                if (!item.Selected) 
                { 
                    continue
                } 
 
                removeCollection.Add(item); 
 
                if (!lstSelectedEnterprises.Items.Contains(item)) 
                { 
                    lstSelectedEnterprises.Items.Add(item); 
                } 
            } 
            foreach (ListItem removeItem in removeCollection) 
            { 
                lstSearchResults.Items.Remove(removeItem); 
            } 
        } 
 
        public void RadUpload_ValidatingFile(object sender, ValidateFileEventArgs e) 
        { 
            resultHandler.ResetStatus(); 
            if (e.UploadedFile.ContentLength > _MAX_FILE_SIZE) 
            { 
                resultHandler.ChangeStatus(ActionStatus.Error, "<b>" + e.UploadedFile.GetName() + ":</b> Exceeds Maximum File Size<br>"); 
                e.IsValid = false
            } 
            else 
            { 
                switch (e.UploadedFile.GetExtension().ToLower()) 
                { 
                    case ".jpg"
                    case ".gif"
                        e.IsValid = true
                        break
                    default
                        resultHandler.ChangeStatus(ActionStatus.Error, "<b>" + e.UploadedFile.GetName() + ":</b> Unknown File Type<br>"); 
                        e.IsValid = false
                        break
                } 
            } 
            e.SkipInternalValidation = true
        } 
 
 
        protected void btnWebConfLogoPreview_Click(object sender, EventArgs e) 
        { 
 
            SaveLocalImage(RadUploadWebConfLogo, 150, 38, hfWebConfLogo); 
 
            if (RadUploadWebConfLogo.InvalidFiles.Count == 0 && hfWebConfLogo.Value.Length != 0) 
            { 
                imgConfLogo.Visible = true
                //string path = Server.UrlDecode(hfWebConfLogo.Value); 
                //imgConfLogo.ImageUrl = path; 
                imgConfLogo.ImageUrl = "~/utilities/imagePreview.aspx?path=" + hfWebConfLogo.Value; 
                btnWebConfLogoSave.Visible = true
            } 
            else 
            { 
                imgConfLogo.Visible = false
                imgConfLogo.ImageUrl = ""
                hfWebConfLogo.Value = ""
            } 
 
 
        } 
 
        protected void btnWebLogoSave_Click(object sender, EventArgs e) 
        { 
            SaveWebConfImageToServer(_provider); 
        } 
 
        protected void btnHubLogoSave_Click(object sender, EventArgs e) 
        { 
            SaveHeaderImageToServer(_provider); 
        } 
 
        protected void btnHeaderLogoPreview_Click(object sender, EventArgs e) 
        { 
 
            SaveLocalImage(RadUploadHeaderLogo, 150, 60, hfHeaderLogo); 
 
            if (RadUploadHeaderLogo.InvalidFiles.Count == 0 && hfHeaderLogo.Value.Length != 0) 
            { 
                imgHeaderLogo.Visible = true
                imgHeaderLogo.ImageUrl = "~/utilities/imagePreview.aspx?path=" + hfHeaderLogo.Value; 
 
                btnHeaderLogoSave.Visible = true
            } 
            else 
            { 
                imgHeaderLogo.Visible = false
                imgHeaderLogo.ImageUrl = ""
                hfHeaderLogo.Value = ""
            } 
 
 
        } 
 
        protected void btnClearResults_Click(object sender, EventArgs e) 
        { 
            lstSearchResults.Items.Clear(); 
            txtEnterpriseName.Text = ""
        } 
        #endregion 
 
        protected void onTabClick(object sender, RadTabStripEventArgs e) 
        { 
 
            if (e.Tab.Value == "3"
            { 
                actionBtns.Visible = true
            } 
            if (e.Tab.Value == "4"
            { 
                if (edit == false
                { 
                    actionBtns.Visible = true
                    resultHandler.ChangeStatus(ActionStatus.Warning, "Please save your provider information before entering your branding options."); 
                    RadTab tab = tabstripProviderOptions.FindTabByValue("3"); 
                    tab.Selected = true
                    RadPageView pageView = MultiPageBranding.FindPageViewByID("netspokeOptions"); 
                    pageView.Selected = true
 
                } 
                else 
                { 
                     
                    SaveData(); 
                     
                    actionBtns.Visible = false
                } 
 
            } 
        } 
 
        protected void UpdateBranding(object source, GridUpdatedEventArgs e) 
        { 
             
        } 
 
        protected void InsertBranding(object source, GridInsertedEventArgs e) 
        { 
             
 
        } 
 
        protected void DeleteBranding(object source, GridDeletedEventArgs e) 
        { 
             
 
        } 
 
        protected void BrandingUpdate() 
        { 
             
        } 
 
    } 
 


3 Answers, 1 is accepted

Sort by
0
Princy
Top achievements
Rank 2
answered on 19 Mar 2009, 08:14 AM
Hi,

Are using the AdvancedDataBinding technique to bind your grid. If so then the add new record  functionality should work just fine.
Take a look at the technique and let me know of any further issues.

Thanks,
Princy
0
Steven
Top achievements
Rank 1
answered on 19 Mar 2009, 02:15 PM
No, I am currently not using the Advanced Data Binding.  You are right, I can get it to work that way.  The issues that I am seeing are that, if I do use the DataBinding methods that you have for the grid, the number of database calls is huge.  What I would actually like to do is let the user update/edit/delete the items in the grid and then do an update to my original datasource.  The datasouce that I have for this particular application is one that automatically, when an insert happens, does a delete first and then repopulates the entire datasource with new data.  I know that is pretty odd, but it is just what I have to work with, with this application.  As you can see, I have multiple datagrids within this page, nested in the tabstrip/multipages. If I have to continue to do updates on to the database for every insert/edit on a grid, the performance of the page is going to really suffer. 

So, is there a way to be able to do what I'm looking for...not updating the datasource every time an insert/update/delete happens and only doing it when they are completey done updating the grid?


0
Rory
Top achievements
Rank 1
answered on 13 Apr 2010, 06:37 PM
Hi Steven did you ever get your Grid Scenario to work? We are doing something like what you needed. We let you add items and then there is a save button that sends all the grid items to the database at once. Let me know I can show you how we did it.
Tags
Grid
Asked by
Steven
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 2
Steven
Top achievements
Rank 1
Rory
Top achievements
Rank 1
Share this question
or