Wrox Programmer Forums
|
ASP.NET 1.1 As of 10/6/2005, this forum is locked as part of the reorganization described here: http://p2p.wrox.com/topic.asp?TOPIC_ID=35394. No posts have been deleted. Open ongoing discussions from the last week have been moved to either ASP.NET 1.0 and 1.1 Beginners http://p2p.wrox.com/asp-net-1-0-1-1-basics-60/ or ASP.NET 1.0 and 1.1 Professional. http://p2p.wrox.com/forum.asp?FORUM_ID=50. See my sticky post inside for more.
Welcome to the p2p.wrox.com Forums.

You are currently viewing the ASP.NET 1.1 section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
 
Old February 24th, 2004, 10:43 AM
Registered User
 
Join Date: Feb 2004
Posts: 6
Thanks: 0
Thanked 0 Times in 0 Posts
Default Client side code not working

Hello all:

I have a .NET application where in I have .NET validations (Requiredfield validator, etc..). Now, I have 2 URL's pointing to same code like http://myserver/Application and http://www.application.com. When the users run code through 2nd URL the validations don't work.

On comparison of the HTML source of both files (by using view source from the browser). The only difference was the encoded viewstate and the leading slash on the HREF of the links at the top of the page.

Any Ideas??
 
Old February 24th, 2004, 12:53 PM
Authorized User
 
Join Date: Feb 2004
Posts: 63
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Ajay..

did you asign registered the IP address for the second link it is going to find the side if you will type in the browser and and then it will take you the search engine and show the different search result .. so it you are testing it on the web then you have to have asign the IP address oke..
aashish

Aashish Shah
 
Old February 24th, 2004, 01:03 PM
Registered User
 
Join Date: Feb 2004
Posts: 6
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Ashish:

Didn't understand much of the solution you suggested. May be I should rephrase it better.

The problem at hand is that even though the 2 URLs are pointing at exactly same application, the client side validations (done through validation controls of .NET) are working for 1st URL and not for 2nd URL. Both the URLs are running the application fine except that when run through 2nd URL the Client side validations don't work.

Ajay

 
Old February 24th, 2004, 01:06 PM
Authorized User
 
Join Date: Feb 2004
Posts: 63
Thanks: 0
Thanked 0 Times in 0 Posts
Default

You mean to say that you client side validations are not working can you post that code over here .. so I can look at it and figure it out. thanks

Aashish Shah
 
Old February 24th, 2004, 01:16 PM
Registered User
 
Join Date: Feb 2004
Posts: 6
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Attached is code from a file in application. Code behind is further down.

HTML Code
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Add_MasterAgreement.ascx.vb" Inherits="Trade.Add_MasterAgreement" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<LINK href="FTS.css" type="text/css" rel="stylesheet">
<script language="javascript" src="include/jslib.js"></script>
<table style="WIDTH: 656px; HEIGHT: 493px">
    <tr>
        <td class="txt_PageTitle" colSpan="2">&nbsp;Add Master Agreement</td>
    </tr>
    <TR>
        <td style="WIDTH: 17px" width="17"></td>
        <td><asp:label id="lblMsg" CssClass="lbl_MessageFailure" Runat="server"></asp:label></td>
    <TR>
    <tr>
        <td style="WIDTH: 17px" width="17"></td>
        <td>Required fields are indicated by <IMG src="images/redball.gif">
        </td>
    </tr>
    <tr>
        <td style="WIDTH: 17px; HEIGHT: 339px"></td>
        <td style="HEIGHT: 339px">
            <table style="WIDTH: 628px; HEIGHT: 330px">
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px; HEIGHT: 24px">Program Provider:</td>
                    <td class="lbl_SmallBold" style="WIDTH: 338px; HEIGHT: 24px" colSpan="2"><asp:dropdownlist id="ddlPrgProv" CssClass="small" Runat="server" AutoPostBack="True" Width="241px"></asp:dropdownlist>&nbsp;
                        <IMG src="images/redball.gif"></td>
                    <td style="HEIGHT: 24px"></td>
                </tr>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">FEIN #:</td>
                    <td style="WIDTH: 213px"><asp:label id="lblFEIN" CssClass="small" Runat="server"></asp:label></td>
                    <td class="lbl_SmallBold" style="WIDTH: 134px">Program Provider #:</td>
                    <td><asp:label id="lblTAA" CssClass="small" Runat="server"></asp:label><INPUT id="hidPPNumber" type="hidden" name="hidPPNumber" runat="server"></td>
                </tr>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">Address :</td>
                    <td style="WIDTH: 213px"><asp:label id="lblAddr" CssClass="small" Runat="server"></asp:label></td>
                    <td class="lbl_SmallBold" style="WIDTH: 134px">City:
                    </td>
                    <td><asp:label id="lblCity" CssClass="small" Runat="server"></asp:label></td>
                </tr>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">County :</td>
                    <td style="WIDTH: 213px"><asp:label id="lblCounty" CssClass="small" Runat="server"></asp:label></td>
                    <td class="lbl_SmallBold" style="WIDTH: 134px">State:
                    </td>
                    <td><asp:label id="lblState" CssClass="small" Runat="server"></asp:label></td>
                </tr>
                <TR>
                    <TD class="lbl_SmallBold" style="WIDTH: 139px">ZIP :</TD>
                    <TD class="small" style="WIDTH: 338px" colSpan="2">
                        <asp:label id="lblZIP" Runat="server" CssClass="small"></asp:label></TD>
                    <TD class="small" style="WIDTH: 171px" colSpan="3"></TD>
                </TR>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">Master Agreement #:</td>
                    <TD class="small" style="WIDTH: 338px" colSpan="2">TAA-
                        <asp:label id="lblPPNumber" CssClass="small" Runat="server" Width="20px"></asp:label>-
                        <asp:dropdownlist id="ddlMAYear" CssClass="small" AutoPostBack="True" runat="server"></asp:dropdownlist><IMG src="images/redball.gif">
                    </TD>
                    <td class="small" style="WIDTH: 171px" colSpan="3"></td>
                </tr>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">Start Date:</td>
                    <td class="small" style="WIDTH: 213px"><input class="small" id="txtStartD" style="WIDTH: 88px; HEIGHT: 22px" maxLength="10" size="9"
                            name="txtStartD" runat="server"><IMG src="images/redball.gif">
                    </td>
                    <td class="lbl_SmallBold" style="WIDTH: 134px">End Date:</td>
                    <td class="small"><input class="small" id="txtEndD" style="WIDTH: 88px; HEIGHT: 22px" maxLength="10" size="9"
                            name="txtEndD" runat="server"><IMG src="images/redball.gif">
                    </td>
                </tr>
                <tr>
                    <td class="lbl_SmallBold" style="WIDTH: 139px">Funds Commitment&nbsp;#:</td>
                    <td class="small" style="WIDTH: 213px"><input class="small" id="txtFC" readOnly maxLength="10" size="14" name="txtFC" runat="server"><IMG src="images/redball.gif">
                    </td>
                    <td class="lbl_SmallBold" style="WIDTH: 134px"></td>
                    <td class="small">&nbsp;
                    </td>
                </tr>
                <TR>
                    <TD class="lbl_SmallBold" style="WIDTH: 139px">Comments:</TD>
                    <TD class="small" colSpan="3"><TEXTAREA id="txtComments" name="txtComments" rows="4" cols="33" runat="server"></TEXTAREA></TD>
                </TR>
            </table>
        </td>
    </tr>
    <tr>
        <td style="WIDTH: 17px; HEIGHT: 1px" width="17"></td>
        <td style="HEIGHT: 1px">&nbsp;<asp:button id="btnSave" Runat="server" Text="Save"></asp:button>&nbsp;
            <INPUT id="btnBack" type="button" value="Back" name="Button2" runat="server"></td>
    </tr>
    <tr>
        <td style="WIDTH: 17px" width="17"></td>
        <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        </td>
    </tr>
</table>
<P><asp:requiredfieldvalidator id="vldPP" runat="server" ControlToValidate="ddlPrgProv" Display="None" ErrorMessage="Please select Program Provider."></asp:requiredfieldvalidator><asp:requiredfieldvalid ator id="vldMayear" runat="server" ControlToValidate="ddlMAYear" Display="None" ErrorMessage="Please select Master Agreement year."></asp:requiredfieldvalidator><asp:requiredfieldvalid ator id="vlsStartD" runat="server" ControlToValidate="txtStartD" Display="None" ErrorMessage="Please enter Start Date."></asp:requiredfieldvalidator><asp:requiredfieldvalid ator id="vldEndD" runat="server" ControlToValidate="txtEndD" Display="None" ErrorMessage="Please enter End Date."></asp:requiredfieldvalidator><asp:requiredfieldvalid ator id="vldFC" runat="server" ControlToValidate="txtFC" Display="None" ErrorMessage="Please enter Funds Commitment #."></asp:requiredfieldvalidator><asp:regularexpressionv alidator id="vldValidStartDate" runat="server" ControlToValidate="txtStartD" Display="None"
        ErrorMessage="Invalid Start Date." ValidationExpression="([0]?[1-9]|1[012])[/]([0]?[1-9]|[12][0-9]|3[01])[/](19|20)\d\d"></asp:regularexpressionvalidator><asp:regularexpress ionvalidator id="vldEndDate" runat="server" ControlToValidate="txtEndD" Display="None" ErrorMessage="Invalid End Date."
        ValidationExpression="([0]?[1-9]|1[012])[/]([0]?[1-9]|[12][0-9]|3[01])[/](19|20)\d\d"></asp:regularexpressionvalidator><asp:comparevalidat or id="vldCompStartEndDate" runat="server" ControlToValidate="txtStartD" Display="None"
        ErrorMessage="End Date should be greater than Start Date." ControlToCompare="txtEndD" Type="Date" Operator="LessThanEqual"></asp:comparevalidator><asp:regularexpressionvalidat or id="vldValidFC" runat="server" ControlToValidate="txtFC" Display="None" ErrorMessage="Invalid Funds Commitment Number."
        ValidationExpression="\w{10}"></asp:regularexpressionvalidator></P>
<P><asp:validationsummary id="vldSummary" runat="server" HeaderText="Following errors have been found:" ShowSummary="False"
        ShowMessageBox="True"></asp:validationsummary></P>


CODE BEHIND

Imports DataAccessAppBlock
Imports System.Data.SqlClient
Public MustInherit Class Add_MasterAgreement
    Inherits System.Web.UI.UserControl
    Protected WithEvents ddlPrgProv As System.Web.UI.WebControls.DropDownList
    Protected WithEvents lblFEIN As System.Web.UI.WebControls.Label
    Protected WithEvents txtStartD As System.Web.UI.HtmlControls.HtmlInputText
    Protected WithEvents txtEndD As System.Web.UI.HtmlControls.HtmlInputText
    Protected WithEvents txtFC As System.Web.UI.HtmlControls.HtmlInputText
    Protected WithEvents txtComments As System.Web.UI.HtmlControls.HtmlTextArea
    Protected WithEvents btnSave As System.Web.UI.WebControls.Button
    Protected WithEvents lblMsg As System.Web.UI.WebControls.Label
    Protected WithEvents vldPP As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents vldCompStartEndDate As System.Web.UI.WebControls.CompareValidator
    Protected WithEvents vldValidFC As System.Web.UI.WebControls.RegularExpressionValidat or
    Protected WithEvents vldSummary As System.Web.UI.WebControls.ValidationSummary
    Protected WithEvents vldValidExeDate As System.Web.UI.WebControls.RegularExpressionValidat or
    Protected WithEvents vldEndDate As System.Web.UI.WebControls.RegularExpressionValidat or
    Protected WithEvents vldValidStartDate As System.Web.UI.WebControls.RegularExpressionValidat or
    Protected WithEvents btnBack As System.Web.UI.HtmlControls.HtmlInputButton
    Protected WithEvents vlsStartD As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents vldEndD As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents vldFC As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents lblCity As System.Web.UI.WebControls.Label
    Protected WithEvents lblAddr As System.Web.UI.WebControls.Label
    Protected WithEvents lblCounty As System.Web.UI.WebControls.Label
    Protected WithEvents lblState As System.Web.UI.WebControls.Label
    Protected WithEvents lblTAA As System.Web.UI.WebControls.Label
    Protected WithEvents lblPPNumber As System.Web.UI.WebControls.Label
    Protected WithEvents hidPPNumber As System.Web.UI.HtmlControls.HtmlInputHidden
    Protected WithEvents vldMayear As System.Web.UI.WebControls.RequiredFieldValidator
    Protected WithEvents ddlMAYear As System.Web.UI.WebControls.DropDownList
    Protected WithEvents lblZIP As System.Web.UI.WebControls.Label
    Dim strCon As String
#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        strCon = ConfigurationSettings.AppSettings("ConnString")
        lblMsg.Visible = False
        btnBack.CausesValidation = False
        If Not IsPostBack Then
            'Load default data
            Call Load_Data()
        End If
    End Sub
    Private Sub Load_Data()
        Dim dstPP As DataSet
        Dim intI As Integer

        'Get all parent program provider
        Try
            ddlPrgProv.Items.Add(New ListItem("(Select Program Provider)", ""))
            dstPP = SqlHelper.ExecuteDataset(strCon, CommandType.StoredProcedure, "spTrade_get_All_Parent_ProgramProvider")
            If dstPP.Tables(0).Rows.Count > 0 Then

                For intI = 0 To dstPP.Tables(0).Rows.Count - 1
                    ddlPrgProv.Items.Add(New ListItem(dstPP.Tables(0).Rows(intI).Item("ProgramP roviderName"), _
                                dstPP.Tables(0).Rows(intI).Item("ProgramProviderID ")))
                Next
            End If
            ddlMAYear.Items.Add(New ListItem("(Select Year)", ""))
            ddlMAYear.Items.Add(New ListItem("97", 97))
            ddlMAYear.Items.Add(New ListItem("98", 98))
            ddlMAYear.Items.Add(New ListItem("99", 99))
            For intI = 0 To 27
                ddlMAYear.Items.Add(New ListItem(IIf(intI < 10, "0" & intI, intI), _
                            IIf(intI < 10, "0" & intI, intI)))
            Next
        Catch ex As Exception
            ErrorLog.logError(ex.Message, "Add MasterAgreement", 1, Session("User_Id"))
            lblMsg.Text = "Error while retrieving Program provider details."
            lblMsg.Visible = True
        End Try
    End Sub
    Private Sub ddlMAYear_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ddlMAYear.SelectedIndexChanged
        txtFC.Value = "T0000" & lblPPNumber.Text.Trim & Right(ddlMAYear.SelectedValue, 1)
    End Sub

    Private Sub ddlPrgProv_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlPrgProv.SelectedIndexChanged
        Dim dstPP As DataSet
        Try
            If ddlPrgProv.SelectedIndex > 0 Then
                dstPP = SqlHelper.ExecuteDataset(strCon, CommandType.StoredProcedure, _
                                            "spTrade_get_ProgramProvider_FEIN", _
                                            New SqlParameter("@PrgProvID", ddlPrgProv.SelectedItem.Value))
                lblFEIN.Text = dstPP.Tables(0).Rows(0).Item("FEIN")
                lblAddr.Text = dstPP.Tables(0).Rows(0).Item("Address")
                lblCity.Text = dstPP.Tables(0).Rows(0).Item("City")
                lblCounty.Text = dstPP.Tables(0).Rows(0).Item("CountyName")
                lblState.Text = dstPP.Tables(0).Rows(0).Item("State")
                lblTAA.Text = dstPP.Tables(0).Rows(0).Item("TAA_Number")
                lblPPNumber.Text = dstPP.Tables(0).Rows(0).Item("TAA_Number")
                lblZIP.Text = dstPP.Tables(0).Rows(0).Item("ZIP")
                If Not IsDBNull(dstPP.Tables(0).Rows(0).Item("ZIP_PO")) And Trim(dstPP.Tables(0).Rows(0).Item("ZIP_PO")) <> "" Then
                    lblZIP.Text = lblZIP.Text & "-" & dstPP.Tables(0).Rows(0).Item("ZIP_po")
                End If
                If ddlMAYear.SelectedIndex > 0 Then
                    txtFC.Value = "T0000" + Trim(dstPP.Tables(0).Rows(0).Item("TAA_Number")) + Right(ddlMAYear.SelectedValue, 1)
                Else
                    txtFC.Value = "T0000" + Trim(dstPP.Tables(0).Rows(0).Item("TAA_Number"))
                End If
                hidPPNumber.Value = Trim(dstPP.Tables(0).Rows(0).Item("TAA_Number"))
            Else
                lblFEIN.Text = ""
                lblTAA.Text = ""
                lblPPNumber.Text = ""
                lblAddr.Text = ""
                lblCity.Text = ""
                lblCounty.Text = ""
                lblState.Text = ""
                txtFC.Value = ""
                hidPPNumber.Value = ""
            End If
        Catch ex As Exception
            ErrorLog.logError(ex.Message, "Add MasterAgreement", 2, Session("User_Id"))
            lblMsg.Text = "Error while retrieving Program provider details."
            lblMsg.Visible = True
        End Try
    End Sub
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Try
            Dim sMANumber As String
            sMANumber = "TAA-" & lblPPNumber.Text.Trim & "-" & ddlMAYear.SelectedValue
            If validateForm() Then
                'Call store procedure to insert the MA record
                SqlHelper.ExecuteNonQuery(strCon, CommandType.StoredProcedure, "spTrade_Insert_MasterAgreement", _
                                                New SqlParameter("@PrgProvID", ddlPrgProv.SelectedItem.Value), _
                                                New SqlParameter("@MANumber", sMANumber), _
                                                New SqlParameter("@StartD", IIf(txtStartD.Value.Trim.Length = 0, "", txtStartD.Value.Trim)), _
                                                New SqlParameter("@EndD", IIf(txtEndD.Value.Trim.Length = 0, "", txtEndD.Value.Trim)), _
                                                New SqlParameter("@FCNo", txtFC.Value.Trim), _
                                                New SqlParameter("@StatusID", 5), _
                                                New SqlParameter("@Comments", txtComments.Value.Trim), _
                                                New SqlParameter("@CreateUser", Session("User_ID")), _
                                                New SqlParameter("@CreDate", System.DateTime.Now))
                'Response.Redirect("List_MasterAgreement.aspx?Add_ Succ=Success")
                lblMsg.Visible = True
                lblMsg.Text = "Master Agreement Added Successfully."
                lblMsg.CssClass = "lbl_Message"
                btnSave.Enabled = False
            End If
        Catch ex As Exception
            ErrorLog.logError(ex.Message, "Add MasterAgreement", 1, Session("User_Id"))
            lblMsg.Text = "Error occured while adding MasterAgreement"
            lblMsg.Visible = True
        End Try
    End Sub
    Private Function validateForm() As Boolean
        'Check for valid dates
        If txtStartD.Value.Trim.Length > 0 Then
            If Not IsDate(txtStartD.Value.Trim) Then
                lblMsg.Text = "Invalid Start Date."
                lblMsg.Visible = True
                Return False
            End If
        End If
        If txtEndD.Value.Trim.Length > 0 Then
            If Not IsDate(txtEndD.Value.Trim) Then
                lblMsg.Text = "Invalid End Date."
                lblMsg.Visible = True
                Return False
            End If
        End If
        'Server side validation should be done here
        Dim intC As Integer
        intC = SqlHelper.ExecuteScalar(strCon, CommandType.StoredProcedure, "spTrade_get_Count_OF_MA", _
                                            New SqlParameter("@MANumber", "TAA-" & lblPPNumber.Text.Trim & "-" & ddlMAYear.SelectedValue))
        If intC > 0 Then
            lblMsg.Visible = True
            lblMsg.Text = "Duplicate Master Agreement number."
            Return False
        End If
        If SqlHelper.ExecuteScalar(strCon, CommandType.StoredProcedure, "spTrade_get_Count_OF_FC_MA", New SqlParameter("@FCNumber", txtFC.Value.Trim)) > 0 Then
            lblMsg.Visible = True
            lblMsg.Text = "Duplicate Funds Commitment number."
            Return False
        End If
        Return True
    End Function

    Private Sub btnBack_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.ServerClick
        Response.Redirect("Action_MA.aspx")
    End Sub


End Class


 
Old February 24th, 2004, 01:27 PM
Authorized User
 
Join Date: Feb 2004
Posts: 63
Thanks: 0
Thanked 0 Times in 0 Posts
Default

can just put the </table> after the validation code...
just try and I will work or not...
let me know..
by the time I am just looking at other part of the code.. thanks
thank

Aashish Shah
 
Old February 24th, 2004, 01:30 PM
Authorized User
 
Join Date: Feb 2004
Posts: 63
Thanks: 0
Thanked 0 Times in 0 Posts
Default

did you try it.. or not?
replay me..
thanks

Aashish Shah
 
Old February 24th, 2004, 01:39 PM
Registered User
 
Join Date: Feb 2004
Posts: 6
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Aashish:

I tried putting a </table> tag ...It still doenn't work.

Ajay

 
Old February 24th, 2004, 01:44 PM
Authorized User
 
Join Date: Feb 2004
Posts: 63
Thanks: 0
Thanked 0 Times in 0 Posts
Default

oke..
let me check the code step by step oke.. wait for 15 minutes..
thanks
aashish


Aashish Shah
 
Old May 1st, 2004, 06:10 AM
Registered User
 
Join Date: May 2004
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
Default

I have the same problem ...

The regularexpressionvalidator works off-line on my computer.
When I try it on-line, nothing happen !!

I have checked the difference between the 2 code, they are small difference between 2 client-side javascript...

Somebody know why ???

MrFLo





Similar Threads
Thread Thread Starter Forum Replies Last Post
Client Side Script not working in DNN rpdrake BOOK: Professional DotNetNuke ASP.NET Portals ISBN: 0-7645-9563-6 2 February 27th, 2009 03:06 PM
Problem Converting Client-side to Server-side Code kwilliams ASP.NET 2.0 Professional 1 November 21st, 2007 05:25 PM
Client Side Script Not Working sramesh ASP.NET 2.0 Basics 3 August 2nd, 2007 03:56 PM
Client side XSLT not working in FireFox ole_v2 XSLT 1 November 13th, 2006 06:26 PM
Writing Client Side Script from Code-Behind code sajid_pk Classic ASP Databases 1 January 18th, 2005 12:53 AM





Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.