﻿
Partial Class ETGSignup
    Inherits System.Web.UI.UserControl

 'Private variables.
    Private mblnIsValid As Boolean
    Private mstrProductID As String
    Private mstrSubProductID As String

    Protected mobjCharges As Specialized.ListDictionary
    Protected mobjCharge As Specialized.ListDictionary
    Protected mstrKey As String
    Protected mstrChargeType As String
    Protected mdecSubTotal As Decimal
    Protected mdecTotal As Decimal
    Protected mdecSalesTax As Decimal

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        On Error Resume Next

        'Check for SSL connection.
        'CheckSSL()

        'Check for post back.
        If Me.IsPostBack = False Then
            InitializePage()
        End If

        'Create default button.
        CreateDefaultButton()

    End Sub

    Private Sub InitializePage()

        'Get query string data.
        GetQueryStringData()

        'Set error messages invisible.
        tblErrorMessage1.Visible = False
        tblExchange.Visible = False
        tblSharePoint.Visible = False
        tblCRM.Visible = False
        tblBackup.Visible = False
        tblOCS.Visible = False
        tblWeb.Visible = False
        tblVPS.Visible = False

        'Set page controls.
        SetPageControls()

        'Show page 1.
        ShowPage(page:=1)

    End Sub

    Private Sub GetQueryStringData()

        'Get query string data.
        mstrProductID = Trim(Request.Params("ProductID"))
        mstrSubProductID = Trim(Request.Params("SubProductID"))

    End Sub

    Private Sub SetPageControls()
        On Error Resume Next


        'Set defaults.
        rdoExistingDomain.Checked = True

        'Select service.
        If mstrProductID = "1" Then
            chkExchange.Checked = True
            tblExchange.Visible = True
            tdExchange1.Visible = True
            tdExchange2.Visible = True

            If mstrSubProductID = "w" Then
                txtExchangeWeb.Text = "1"
                txtExchange.Text = "0"
            End If

            If mstrSubProductID = "1" Then

                txtArchive.Text = "1"

            End If

        ElseIf mstrProductID = "2" Then
            chkSharePoint.Checked = True
            tblSharePoint.Visible = True
            tdSharePoint1.Visible = True
            tdSharePoint2.Visible = True
        ElseIf mstrProductID = "3" Then
            chkWeb.Checked = True
            tblWeb.Visible = True
            tdWeb1.Visible = True
            tdWeb2.Visible = True
        ElseIf mstrProductID = "4" Then
            chkOCS.Checked = True
            tblOCS.Visible = True
            tdOCS1.Visible = True
            tdOCS2.Visible = True
        ElseIf mstrProductID = "5" Then
            chkCRM.Checked = True
            tblCRM.Visible = True
            tdCRM1.Visible = True
            tdCRM2.Visible = True
        ElseIf mstrProductID = "6" Then
            chkVPS.Checked = True
            tblVPS.Visible = True
            tdVPS1.Visible = True
            tdVPS2.Visible = True

            If mstrSubProductID = "w" Then
                txtVPSWeb.Text = "1"
            End If

            If mstrSubProductID = "s" Then
                txtVPSWeb.Text = "0"
                txtVPSStd.Text = "1"
            End If

            If mstrSubProductID = "e" Then
                txtVPSWeb.Text = "0"
                txtVPSEnt.Text = "1"
            End If

        ElseIf mstrProductID = "7" Then
            chkBackup.Checked = True
            tblBackup.Visible = True
            tdBackup1.Visible = True
            tdBackup2.Visible = True

            If mstrSubProductID = "s" Then
                txtPCBackup5.Text = "0"
                txtServerBackup25.Text = "1"
            End If

        End If

    End Sub

    Private Sub CheckSSL()

        Dim strSecureServer As String
        Dim strURL As String

        'Exit sub if secure.
        If Request.IsSecureConnection = True Then
            Exit Sub
        End If

        'Get the SSL URL.
        strSecureServer = ConfigurationSettings.AppSettings("SecureServer")

        'Build the redirection URL.
        strURL = strSecureServer & Request.RawUrl

        'Redirect to secure URL.
        Response.Redirect(url:=strURL)

    End Sub

    Private Sub ProcessForm(ByVal page As Integer)

        'Check for sitefinity.
        If Request("cmspagemode") <> "" Then
            Exit Sub
        End If

        'Validate form.
        Me.Validate(page:=page)

        'Exit sub if form is not valid.
        If Me.IsValid = False Then
            Exit Sub
        End If

        'Process appropriate page.
        Select Case page
            Case 1
                ProcessForm1()
            Case 2
                ProcessForm2()
            Case 3
                ProcessForm3()
            Case 4
                ProcessForm4()
        End Select

    End Sub

    Private Sub ProcessForm1()

        'Show page 2.
        ShowPage(page:=2)

        'Build charges.
        BuildCharges()

        'Set focus.
        txtDomainName.Focus()

    End Sub

    Private Sub ProcessForm2()

        'Set domain name label.
        If InStr(Trim(txtDomainName.Text), ".") = 0 Then
            lblDomainName.Text = Trim(txtDomainName.Text) 
        Else
            lblDomainName.Text = Trim(txtDomainName.Text)
        End If

        'Show page 3.
        ShowPage(page:=3)

        'Build charges.
        BuildCharges()

        'Set focus.
        txtCompanyName.Focus()

    End Sub

    Private Sub ProcessForm3()

        'Show page 4.
        ShowPage(page:=4)

    End Sub

    Private Sub ProcessForm4()

        'Build receipt.
        BuildReceipt()

        'Send email message.
        SendEmailMessage()

        'Show page 5.
        ShowPage(page:=5)

    End Sub

    Private Sub ShowPage(ByVal page As Integer)

        'Set tables invisible.
        tblPage1.Visible = False
        tblPage2.Visible = False
        tblPage3.Visible = False
        tblPage4.Visible = False
        tblPage5.Visible = False

        'Set error messages invisible.
        tblErrorMessage1.Visible = False
        tblErrorMessage2.Visible = False
        tblErrorMessage3.Visible = False
        tblErrorMessage4.Visible = False

        'Show appropriate page.
        Select Case page
            Case 1
                tblPage1.Visible = True
            Case 2
                tblPage2.Visible = True
            Case 3
                tblPage3.Visible = True
            Case 4
                tblPage4.Visible = True
                'Load list controls.
                LoadExpirationMonths()
                LoadExpirationYears()
            Case 5
                
                tblPage5.Visible = True
        End Select

        'Create default button.
        CreateDefaultButton()

    End Sub

    Private Sub LoadExpirationMonths()

        Dim lstListItem As ListItem
        Dim strMonth As String
        Dim I As Integer

        'Clear.
        dropExpirationMonth.Items.Clear()

        'Loop.
        For I = 1 To 12

            'Instantiate object.
            lstListItem = New ListItem

            'Format month.
            strMonth = Right("00" & I, 2)

            'Set list item properties.
            With lstListItem
                .Value = strMonth
                .Text = strMonth
            End With

            'Add list item to drop down.
            dropExpirationMonth.Items.Add(item:=lstListItem)

        Next

        'Set page size.
        'dropExpirationMonth.DropDownPageSize = I - 1

    End Sub

    Private Sub LoadExpirationYears()

        Dim dtDate As Date
        Dim lstListItem As ListItem
        Dim strYear As String
        Dim I As Integer

        'Clear.
        dropExpirationYear.Items.Clear()

        'Get the current date.
        dtDate = DateTime.Today

        'Loop.
        For I = Year(dtDate) To Year(dtDate) + 7

            'Instantiate object.
            lstListItem = New ListItem

            'Format year.
            strYear = CStr(I)

            'Set list item properties.
            With lstListItem
                .Value = strYear
                .Text = strYear
            End With

            'Add list item to drop down.
            dropExpirationYear.Items.Add(item:=lstListItem)

        Next

    End Sub

    Protected Overrides Function SaveViewState() As Object

        Dim objSavedState As Object

        'Instantiate object.
        If mobjCharges Is Nothing Then
            mobjCharges = New Specialized.ListDictionary
        End If

        'Save object to view state.
        With Me
            .ViewState(key:="Charges") = mobjCharges
        End With

        'Save view state.
        objSavedState = MyBase.SaveViewState()

        'Set function return.
        Return objSavedState

    End Function

    Protected Overrides Sub LoadViewState(ByVal savedState As Object)

        'Load view state.
        MyBase.LoadViewState(savedState:=savedState)

        'Get objects from view state.
        With Me
            mobjCharges = .ViewState(key:="Charges")
        End With

    End Sub

    Public Shadows Sub Validate(ByVal page As Integer)

        'Validate appropriate page.
        Select Case page
            Case 1
                ValidatePage1()
            Case 2
                ValidatePage2()
            Case 3
                ValidatePage3()
            Case 4
                ValidatePage4()
        End Select

    End Sub

    Public Shadows ReadOnly Property IsValid() As Boolean

        Get

            'Return IsValid property.
            Return mblnIsValid

        End Get

    End Property

    Public Shadows Sub ValidatePage1()

        Dim blnIsValid As Boolean
        Dim strErrorText As String

        'Initialize variable.
        blnIsValid = True

        'Exchange.
        If chkExchange.Checked = True Then

            'Exchange.
            If ValidInteger(value:=txtExchange.Text) = False Then
                strErrorText = strErrorText & "The value entered for Exchange Professional is not valid, "
                blnIsValid = False
            End If

            'Exchange Web.
            If ValidInteger(value:=txtExchangeWeb.Text) = False Then
                strErrorText = strErrorText & "The value entered for Exchange Web is not valid, "
                blnIsValid = False
            End If

            'Outlook.
            If ValidInteger(value:=txtOutlook.Text) = False Then
                strErrorText = strErrorText & "The value entered for Outlook License is not valid, "
                blnIsValid = False
            End If

            'Exclaimer.
            If ValidInteger(value:=txtDisclaimer.Text) = False Then
                strErrorText = strErrorText & "The value entered for Company-wide Email Disclaimer is not valid, "
                blnIsValid = False
            End If

            'Resource.
            If ValidInteger(value:=txtExchangeResource.Text) = False Then
                strErrorText = strErrorText & "The value entered for Exchange Resource Mailbox  is not valid, "
                blnIsValid = False
            End If

            'Blackberry.
            If ValidInteger(value:=txtBlackberry.Text) = False Then
                strErrorText = strErrorText & "The value entered for Blackberry Enterprise Server is not valid, "
                blnIsValid = False
            End If

            'Archive.
            If ValidInteger(value:=txtArchive.Text) = False Then
                strErrorText = strErrorText & "The value entered for Email Archive User is not valid, "
                blnIsValid = False
            End If

        End If

        'SharePoint.
        If chkSharePoint.Checked = True Then

            'SharePoint.
            If ValidInteger(value:=txtSharePoint.Text) = False Then
                strErrorText = strErrorText & "The value entered for SharePoint Foundation 2010 is not valid, "
                blnIsValid = False
            End If

            'SharePoint Users.
            If ValidInteger(value:=txtSPUsers.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional SharePoint Users is not valid, "
                blnIsValid = False
            End If

            'SharePoint Space.
            If ValidInteger(value:=txtSPStorage.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional 1GB SharePoint Storage is not valid, "
                blnIsValid = False
            End If

        End If

        'Web Hosting.
        If chkWeb.Checked = True Then

            'Websites.
            If ValidInteger(value:=txtWebsites.Text) = False Then
                strErrorText = strErrorText & "The value entered for Windows Server Website is not valid, "
                blnIsValid = False
            End If

            'Web Space.
            If ValidInteger(value:=txtWebSpace.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional 500MB Web Space is not valid, "
                blnIsValid = False
            End If

            'SQL.
            If ValidInteger(value:=txtSQL.Text) = False Then
                strErrorText = strErrorText & "The value entered for SQL Server 2008 Database is not valid, "
                blnIsValid = False
            End If

            'SQL Space.
            If ValidInteger(value:=txtSQLSpace.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional 500MB SQL Space is not valid, "
                blnIsValid = False
            End If

            'Dedicated IP.
            If ValidInteger(value:=txtIP.Text) = False Then
                strErrorText = strErrorText & "The value entered for Dedicated IP Address is not valid, "
                blnIsValid = False
            End If

            'SSL.
            If ValidInteger(value:=txtSSLCert.Text) = False Then
                strErrorText = strErrorText & "The value entered for SSL Certificate is not valid, "
                blnIsValid = False
            ElseIf CInt(txtSSLCert.Text) > 0 And ValidInteger(value:=txtIP.Text) = False Then
                strErrorText = strErrorText & "The value entered for Dedicated IP Address is not valid, "
                blnIsValid = False
            ElseIf CInt(txtSSLCert.Text) > CInt(txtIP.Text) Then
                strErrorText = strErrorText & "The number of SSL Certificates mutch match the number of Dedicated IP Addresses, "
                blnIsValid = False
            End If

        End If

        'OCS.
        If chkOCS.Checked = True Then

            'OCS Users.
            If ValidInteger(value:=txtOCS.Text) = False Then
                strErrorText = strErrorText & "The value entered for Lync Standard Users is not valid, "
                blnIsValid = False
            End If

	   
            'OCS Users.
            If ValidInteger(value:=txtOCS2.Text) = False Then
                strErrorText = strErrorText & "The value entered for Lync Professional Users is not valid, "
                blnIsValid = False
            End If

        End If

        'CRM.
        If chkCRM.Checked = True Then
	    
            'CRM Users.
            If ValidInteger(value:=txtCRMXUsers.Text) = False Then
                strErrorText = strErrorText & "The value entered for CRM Read Only Users is not valid, "
                blnIsValid = False
            End If

            'CRM Users.
            If ValidInteger(value:=txtCRMUsers.Text) = False Then
                strErrorText = strErrorText & "The value entered for CRM Enterprise Users is not valid, "
                blnIsValid = False
            End If

        End If

        'VPS Hosting.
        If chkVPS.Checked = True Then

            'Web.
            If ValidInteger(value:=txtVPSWeb.Text) = False Then
                strErrorText = strErrorText & "The value entered for VPS Web is not valid, "
                blnIsValid = False
            End If

            'Standard.
            If ValidInteger(value:=txtVPSStd.Text) = False Then
                strErrorText = strErrorText & "The value entered for VPS Standard is not valid, "
                blnIsValid = False
            End If

            'Enterprise.
            If ValidInteger(value:=txtVPSEnt.Text) = False Then
                strErrorText = strErrorText & "The value entered for VPS Enterprise is not valid, "
                blnIsValid = False
            End If

            'RAM.
            If ValidInteger(value:=txtRAM.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional 1GB RAM is not valid, "
                blnIsValid = False
            End If

            'CPU.
            If ValidInteger(value:=txtCPU.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional CPU is not valid, "
                blnIsValid = False
            End If

            'Disk.
            If ValidInteger(value:=txtDisk.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional 10GB Disk Space is not valid, "
                blnIsValid = False
            End If

            'IP.
            If ValidInteger(value:=txtIPX.Text) = False Then
                strErrorText = strErrorText & "The value entered for Additional IP Address is not valid, "
                blnIsValid = False
            End If

        End If

        'Backup.
        If chkBackup.Checked = True Then

            'Workstation Backup 5.
            If ValidInteger(value:=txtPCBackup5.Text) = False Then
                strErrorText = strErrorText & "The value entered for Workstation Backup - 5GB is not valid, "
                blnIsValid = False
            End If

            'Workstation Backup 10.
            If ValidInteger(value:=txtPCBackup10.Text) = False Then
                strErrorText = strErrorText & "The value entered for Workstation Backup - 10GB is not valid, "
                blnIsValid = False
            End If

            'Workstation Backup 25.
            If ValidInteger(value:=txtPCBackup25.Text) = False Then
                strErrorText = strErrorText & "The value entered for Workstation Backup - 25GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 25.
            If ValidInteger(value:=txtServerBackup25.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 25GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 50.
            If ValidInteger(value:=txtServerBackup50.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 50GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 100.
            If ValidInteger(value:=txtServerBackup100.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 100GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 250.
            If ValidInteger(value:=txtServerBackup250.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 250GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 500.
            If ValidInteger(value:=txtServerBackup500.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 500GB is not valid, "
                blnIsValid = False
            End If

            'Server Backup 1000.
            If ValidInteger(value:=txtServerBackup1000.Text) = False Then
                strErrorText = strErrorText & "The value entered for Server Backup - 1,000GB is not valid, "
                blnIsValid = False
            End If

        End If

        'Check for errors.
        If blnIsValid = False Then
            lblErrors1.Text = Microsoft.VisualBasic.Left(strErrorText, Len(strErrorText) - 2)
            tblErrorMessage1.Visible = True
        Else
            tblErrorMessage1.Visible = False
        End If

        'Set property.
        mblnIsValid = blnIsValid

    End Sub

    Private Function ValidInteger(ByVal value As String) As Boolean

        Dim blnValid As Boolean

        'Set default.
        blnValid = True

        'Check.
        If value <> "" Then
            If IsNumeric(value) = False Then
                blnValid = False
            ElseIf CInt(value) <> CDbl(value) Then
                blnValid = False
            ElseIf CInt(value) < 0 Then
                blnValid = False
            End If
        End If

        'Set return value.
        Return blnValid

    End Function

    Public Shadows Sub ValidatePage2()

        Dim blnIsValid As Boolean
        Dim strErrorText As String

        'Initialize variable.
        blnIsValid = True

        'Check domain name.
        If Trim(txtDomainName.Text) = "" Then
            strErrorText = strErrorText & "Please enter a domain name, "
            blnIsValid = False
        End If

        'Check domain selection.
        If rdoRegisterDomain.Checked = False And rdoSelfRegister.Checked = False And rdoExistingDomain.Checked = False Then
            strErrorText = strErrorText & "Would you like us to register this domain, "
            blnIsValid = False
        End If

        'Check registration years.
        If rdoRegisterDomain.Checked = True And Trim(dropRegistrationYears.SelectedItem.Value) = "" Then
            strErrorText = strErrorText & "Number of years to register this domain, "
            blnIsValid = False
        End If

        'Check for errors.
        If blnIsValid = False Then
            lblErrors2.Text = Microsoft.VisualBasic.Left(strErrorText, Len(strErrorText) - 2)
            tblErrorMessage2.Visible = True
        Else
            tblErrorMessage2.Visible = False
        End If

        'Set property.
        mblnIsValid = blnIsValid

    End Sub

    Public Shadows Sub ValidatePage3()

        Dim blnIsValid As Boolean
        Dim strErrorText As String

        'Initialize variable.
        blnIsValid = True

        'Check contact name.
        If Trim(txtContactName.Text) = "" Then
            strErrorText = strErrorText & "Your Name, "
            blnIsValid = False
        End If

        'Check address.
        If Trim(txtAddress.Text) = "" Then
            strErrorText = strErrorText & "Address, "
            blnIsValid = False
        End If

        'Check city.
        If Trim(txtCity.Text) = "" Then
            strErrorText = strErrorText & "City, "
            blnIsValid = False
        End If

        'Check state.
        If Trim(dropState.SelectedIndex) = -1 Then
            strErrorText = strErrorText & "State, "
            blnIsValid = False
        End If

        'Check zip code.
        If Trim(txtZipCode.Text) = "" Then
            strErrorText = strErrorText & "Zip Code, "
            blnIsValid = False
        End If

        'Check phone number.
        If Trim(txtPhoneNumber.Text) = "" Then
            strErrorText = strErrorText & "Phone Number, "
            blnIsValid = False
        End If

        'Check for errors.
        If blnIsValid = False Then
            lblErrors3.Text = Microsoft.VisualBasic.Left(strErrorText, Len(strErrorText) - 2)
            tblErrorMessage3.Visible = True
        Else
            tblErrorMessage3.Visible = False
        End If

        'Set property.
        mblnIsValid = blnIsValid

    End Sub

    Public Shadows Sub ValidatePage4()

        Dim blnIsValid As Boolean
        Dim strErrorText As String

        'Initialize variable.
        blnIsValid = True

        'Check credit card type.
        If Trim(dropCreditCardType.SelectedItem.Value) = "" Then
            strErrorText = strErrorText & "Card Type, "
            blnIsValid = False
        End If

        'Check credit card number.
        If Trim(txtCreditCardNumber.Text) = "" Then
            strErrorText = strErrorText & "Card Number, "
            blnIsValid = False
        ElseIf ValidateCCNumber(sCCNumber:=Trim(txtCreditCardNumber.Text)) = False Then
            'strErrorText = strErrorText & "Card Number is not valid, "
            'blnIsValid = False
        End If

        'Check name on card.
        If Trim(txtCreditCardName.Text) = "" Then
            strErrorText = strErrorText & "Name on Card, "
            blnIsValid = False
        End If

        'Check expiration date.
        If Trim(dropExpirationMonth.SelectedItem.Value) = "" Or Trim(dropExpirationYear.SelectedItem.Value) = "" Then
            strErrorText = strErrorText & "Expiration Date, "
            blnIsValid = False
        Else
            If DateAdd(DateInterval.Day, -1, DateAdd(DateInterval.Month, 1, CDate(Trim(dropExpirationMonth.SelectedItem.Value) & "/1/" & Trim(dropExpirationYear.SelectedItem.Value)))) < Today() Then
                strErrorText = strErrorText & "Credit Card has expired, "
                blnIsValid = False
            End If
        End If

        'Check CVV.
        If Trim(txtCVV.Text) = "" Then
            strErrorText = strErrorText & "CVV Code, "
            blnIsValid = False
        End If

        'Check for errors.
        If blnIsValid = False Then
            lblErrors4.Text = Microsoft.VisualBasic.Left(strErrorText, Len(strErrorText) - 2)
            tblErrorMessage4.Visible = True
        Else
            tblErrorMessage4.Visible = False
        End If

        'Set property.
        mblnIsValid = blnIsValid

    End Sub

    Private Function ValidateCCNumber(ByVal sCCNumber As String) As Boolean

        Dim i, w, y As Integer
        Dim x As String
        y = 0

        sCCNumber = sCCNumber.Trim()

        w = 2 * (Len(sCCNumber) Mod 2)

        For i = Len(sCCNumber) - 1 To 1 Step -1
            x = Mid(sCCNumber, i, 1)

            If IsNumeric(x) Then
                Select Case (i Mod 2) + w
                    Case 0, 3
                        y = y + CInt(x)
                    Case 1, 2
                        x = CInt(x) * 2
                        If x > 9 Then
                            y = y + (x \ 10) + (x - 10)
                        Else
                            y = y + x
                        End If
                End Select
            End If

        Next
        y = 10 - (y Mod 10)
        If y > 9 Then y = 0

        Return (CStr(y) = Right(sCCNumber, 1))

    End Function

    Private Sub BuildCharges()

        Dim objCharge As Specialized.ListDictionary
        Dim intQuantity As Integer
        Dim decSetupFee As Decimal

        'Clear dictionary.
        mobjCharges.Clear()

        'Exchange.
        If chkExchange.Checked = True Then

            'Exchange.
            If Trim(txtExchange.Text) <> "" And Trim(txtExchange.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblExchangeName.Text), quantity:=Trim(txtExchange.Text), price:=Trim(lblExchange.Text))
            End If

            'Exchange Web.
            If Trim(txtExchangeWeb.Text) <> "" And Trim(txtExchangeWeb.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblExchangeWebName.Text), quantity:=Trim(txtExchangeWeb.Text), price:=Trim(lblExchangeWeb.Text))
            End If

            'Outlook.
            If Trim(txtOutlook.Text) <> "" And Trim(txtOutlook.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblOutlookName.Text), quantity:=Trim(txtOutlook.Text), price:=Trim(lblOutlook.Text))
            End If

            'Exclaimer.
            If Trim(txtDisclaimer.Text) <> "" And Trim(txtDisclaimer.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblDisclaimerName.Text), quantity:=Trim(txtDisclaimer.Text), price:=Trim(lblDisclaimer.Text))
            End If

            'Resource.
            If Trim(txtExchangeResource.Text) <> "" And Trim(txtExchangeResource.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblExchangeResourceName.Text), quantity:=Trim(txtExchangeResource.Text), price:=Trim(lblExchangeResource.Text))
            End If

            'Blackberry.
            If Trim(txtBlackberry.Text) <> "" And Trim(txtBlackberry.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblBlackberryName.Text), quantity:=Trim(txtBlackberry.Text), price:=Trim(lblBlackberry.Text))
                AddCharge(type:="One Time Charges", description:=Trim(lblBlackberrySetupName.Text), quantity:=Trim(txtBlackberry.Text), price:=Trim(lblBlackberrySetup.Text))
            End If

	

            'Archive.
            If Trim(txtArchive.Text) <> "" And Trim(txtArchive.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblArchiveName.Text), quantity:=Trim(txtArchive.Text), price:=Trim(lblArchive.Text))
                If CInt(Trim(txtArchive.Text)) <= 100 Then
                    AddCharge(type:="One Time Charges", description:=Trim(lblArchiveSetupName.Text), quantity:=1, price:=Trim(lblArchiveSetup1.Text))
                Else
                    AddCharge(type:="One Time Charges", description:=Trim(lblArchiveSetupName.Text), quantity:=1, price:=Trim(lblArchiveSetup2.Text))
                End If
            End If

        End If

        'SharePoint.
        If chkSharePoint.Checked = True Then

            'SharePoint.
            If Trim(txtSharePoint.Text) <> "" And Trim(txtSharePoint.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblSharePointName.Text), quantity:=Trim(txtSharePoint.Text), price:=Trim(lblSharePoint.Text))
            End If

            'SharePoint Users.
            If Trim(txtSPUsers.Text) <> "" And Trim(txtSPUsers.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblSPUsersName.Text), quantity:=Trim(txtSPUsers.Text), price:=Trim(lblSPUsers.Text))
            End If

            'SharePoint Space.
            If Trim(txtSPStorage.Text) <> "" And Trim(txtSPStorage.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblSPStorageName.Text), quantity:=Trim(txtSPStorage.Text), price:=Trim(lblSPStorage.Text))
            End If

        End If


        'Web Hosting.
        If chkWeb.Checked = True Then

            'Websites.
            If Trim(txtWebsites.Text) <> "" And Trim(txtWebsites.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblWebSiteName.Text), quantity:=Trim(txtWebsites.Text), price:=Trim(lblWebSite.Text))
            End If

            'Web Space.
            If Trim(txtWebSpace.Text) <> "" And Trim(txtWebSpace.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblWebSpaceName.Text), quantity:=Trim(txtWebSpace.Text), price:=Trim(lblWebSpace.Text))
            End If

            'SQL.
            If Trim(txtSQL.Text) <> "" And Trim(txtSQL.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblSQLName.Text), quantity:=Trim(txtSQL.Text), price:=Trim(lblSQL.Text))
            End If

            'SQL Space.
            If Trim(txtSQLSpace.Text) <> "" And Trim(txtSQLSpace.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblSQLSpaceName.Text), quantity:=Trim(txtSQLSpace.Text), price:=Trim(lblSQLSpace.Text))
            End If

            'Dedicated IP.
            If Trim(txtIP.Text) <> "" And Trim(txtIP.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblIPName.Text), quantity:=Trim(txtIP.Text), price:=Trim(lblIP.Text))
            End If

            'SQL Space.
            If Trim(txtSSLCert.Text) <> "" And Trim(txtSSLCert.Text) <> "0" Then
                AddCharge(type:="One Time Charges", description:=Trim(lblSSLCertName.Text), quantity:=Trim(txtSSLCert.Text), price:=Trim(lblSSLCert.Text))
            End If

        End If

        'OCS.
        If chkOCS.Checked = True Then

            'OCS Users.
            If Trim(txtOCS.Text) <> "" And Trim(txtOCS.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblOCSName.Text), quantity:=Trim(txtOCS.Text), price:=Trim(lblOCS.Text))
            End If

	   
            'OCS Users.
            If Trim(txtOCS2.Text) <> "" And Trim(txtOCS2.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblOCSName2.Text), quantity:=Trim(txtOCS2.Text), price:=Trim(lblOCS2.Text))
            End If

        End If

        'CRM.
        If chkCRM.Checked = True Then

            'CRM Setup.
            'If Trim(txtCRMSetup.Text) <> "" And Trim(txtCRMSetup.Text) <> "0" Then
            '    AddCharge(type:="One Time Charges", description:=Trim(lblCRMSetupName.Text), quantity:=Trim(txtCRMSetup.Text), price:=Trim(lblCRMSetup.Text))
            'End If

	    'CRM Users.
            If Trim(txtCRMXUsers.Text) <> "" And Trim(txtCRMXUsers.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblCRMXUsersName.Text), quantity:=Trim(txtCRMXUsers.Text), price:=Trim(lblCRMXUsers.Text))
            End If

            'CRM Users.
            If Trim(txtCRMUsers.Text) <> "" And Trim(txtCRMUsers.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblCRMUsersName.Text), quantity:=Trim(txtCRMUsers.Text), price:=Trim(lblCRMUsers.Text))
		AddCharge(type:="One Time Charges", description:=Trim(lblCRMUserSetupName.Text), quantity:=Trim(txtCRMUsers.Text), price:=Trim(lblCRMUserSetup.Text))
            End If

        End If

        'VPS.
        If chkVPS.Checked = True Then

            'VPS Web.
            If Trim(txtVPSWeb.Text) <> "" And Trim(txtVPSWeb.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblVPSWebName.Text), quantity:=Trim(txtVPSWeb.Text), price:=Trim(lblVPSWeb.Text))
            End If

            'VPS Standard.
            If Trim(txtVPSStd.Text) <> "" And Trim(txtVPSStd.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblVPSStdName.Text), quantity:=Trim(txtVPSStd.Text), price:=Trim(lblVPSStd.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblVPSStdSetupName.Text), quantity:=Trim(txtVPSStd.Text), price:=Trim(lblVPSStdSetup.Text))
            End If

            'VPS Enterprise.
            If Trim(txtVPSEnt.Text) <> "" And Trim(txtVPSEnt.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblVPSEntName.Text), quantity:=Trim(txtVPSEnt.Text), price:=Trim(lblVPSEnt.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblVPSEntSetupName.Text), quantity:=Trim(txtVPSEnt.Text), price:=Trim(lblVPSEntSetup.Text))
            End If

            'RAM.
            If Trim(txtRAM.Text) <> "" And Trim(txtRAM.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblRAMName.Text), quantity:=Trim(txtRAM.Text), price:=Trim(lblRam.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblRAMSetupName.Text), quantity:=Trim(txtRAM.Text), price:=Trim(lblRAMSetup.Text))
            End If

            'CPU.
            If Trim(txtCPU.Text) <> "" And Trim(txtCPU.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblCPUName.Text), quantity:=Trim(txtCPU.Text), price:=Trim(lblCPU.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblCPUSetupName.Text), quantity:=Trim(txtCPU.Text), price:=Trim(lblCPUSetup.Text))
            End If

            'Disk.
            If Trim(txtDisk.Text) <> "" And Trim(txtDisk.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblDiskName.Text), quantity:=Trim(txtDisk.Text), price:=Trim(lblDisk.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblDiskSetupName.Text), quantity:=Trim(txtDisk.Text), price:=Trim(lblDiskSetup.Text))
            End If

            'IP.
            If Trim(txtIPX.Text) <> "" And Trim(txtIPX.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblIPXName.Text), quantity:=Trim(txtIPX.Text), price:=Trim(lblIPX.Text))
                'AddCharge(type:="One Time Charges", description:=Trim(lblIPXSetupName.Text), quantity:=Trim(txtIPX.Text), price:=Trim(lblIPXSetup.Text))
            End If

        End If

        'Backup.
        If chkBackup.Checked = True Then

            'Workstation Backup 5.
            If Trim(txtPCBackup5.Text) <> "" And Trim(txtPCBackup5.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblPCBackup5Name.Text), quantity:=Trim(txtPCBackup5.Text), price:=Trim(lblPCBackup5.Text))
            End If

            'Workstation Backup 10.
            If Trim(txtPCBackup10.Text) <> "" And Trim(txtPCBackup10.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblPCBackup10Name.Text), quantity:=Trim(txtPCBackup10.Text), price:=Trim(lblPCBackup10.Text))
            End If

            'Workstation Backup 25.
            If Trim(txtPCBackup25.Text) <> "" And Trim(txtPCBackup25.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblPCBackup25Name.Text), quantity:=Trim(txtPCBackup25.Text), price:=Trim(lblPCBackup25.Text))
            End If

            'Server Backup 25.
            If Trim(txtServerBackup25.Text) <> "" And Trim(txtServerBackup25.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup25Name.Text), quantity:=Trim(txtServerBackup25.Text), price:=Trim(lblServerBackup25.Text))
            End If

            'Server Backup 50.
            If Trim(txtServerBackup50.Text) <> "" And Trim(txtServerBackup50.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup50Name.Text), quantity:=Trim(txtServerBackup50.Text), price:=Trim(lblServerBackup50.Text))
            End If

            'Server Backup 100.
            If Trim(txtServerBackup100.Text) <> "" And Trim(txtServerBackup100.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup100Name.Text), quantity:=Trim(txtServerBackup100.Text), price:=Trim(lblServerBackup100.Text))
            End If

            'Server Backup 250.
            If Trim(txtServerBackup250.Text) <> "" And Trim(txtServerBackup250.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup250Name.Text), quantity:=Trim(txtServerBackup250.Text), price:=Trim(lblServerBackup250.Text))
            End If

            'Server Backup 500.
            If Trim(txtServerBackup500.Text) <> "" And Trim(txtServerBackup500.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup500Name.Text), quantity:=Trim(txtServerBackup500.Text), price:=Trim(lblServerBackup500.Text))
            End If

            'Server Backup 1000.
            If Trim(txtServerBackup1000.Text) <> "" And Trim(txtServerBackup1000.Text) <> "0" Then
                AddCharge(type:="Monthly Account Fees", description:=Trim(lblServerBackup1000Name.Text), quantity:=Trim(txtServerBackup1000.Text), price:=Trim(lblServerBackup1000.Text))
            End If

        End If

        'Domain Name.
        If rdoRegisterDomain.Checked = True Then
            AddCharge(type:="One Time Charges", description:="Domain Registration " & Left(Trim(dropRegistrationYears.SelectedItem.Text), InStr(Trim(dropRegistrationYears.SelectedItem.Text), "-") - 2) & " - " & Trim(lblDomainName.Text), quantity:=Trim(dropRegistrationYears.SelectedItem.Value), price:=Trim(lblDomainPrice.Text))
        ElseIf rdoRegisterDomain.Checked = False Then
            AddCharge(type:="One Time Charges", description:="*Domain" & " - " & Trim(lblDomainName.Text), quantity:=1, price:=0)
        End If

        'Account Setup Fee.
        'AddCharge(type:="One Time Charges", description:="Account Setup Fees", quantity:=1, price:=decSetupFee)

        'Sort charges.
        SortCharges()

    End Sub

    Private Sub AddCharge(ByVal type As String, ByVal description As String, ByVal quantity As Integer, ByVal price As Decimal)

        Dim objCharge As Specialized.ListDictionary
        Dim strKey As String

        'Instantiate object.
        objCharge = New Specialized.ListDictionary

        'Set charge properties.
        objCharge(key:="Type") = type
        objCharge(key:="Description") = description
        objCharge(key:="Quantity") = quantity
        objCharge(key:="Price") = price
        objCharge(key:="Total") = quantity * price

        'Determine key.
        strKey = CStr(mobjCharges.Count + 1)

        'Add charge to dictionary.
        mobjCharges.Add(key:=strKey, value:=objCharge)

    End Sub

    Private Sub SortCharges()

        Dim objMonthlyCharges As Specialized.ListDictionary
        Dim objOneTimeCharges As Specialized.ListDictionary
        Dim objCharge As Specialized.ListDictionary
        Dim strKey As String

        'Instantiate objects.
        objMonthlyCharges = New Specialized.ListDictionary
        objOneTimeCharges = New Specialized.ListDictionary

        'Loop charges.
        For Each strKey In mobjCharges.Keys

            'Get reference to charge.	
            objCharge = mobjCharges(key:=strKey)

            'Add charge to dictionary.
            If objCharge(key:="Type") = "Monthly Account Fees" Then
                objMonthlyCharges.Add(key:=strKey, value:=objCharge)
            Else
                objOneTimeCharges.Add(key:=strKey, value:=objCharge)
            End If

        Next

        'Clear dictionary.
        mobjCharges.Clear()

        'Loop monthly charges.
        For Each strKey In objMonthlyCharges.Keys

            'Get reference to charge.	
            objCharge = objMonthlyCharges(key:=strKey)

            'Add charge to dictionary.
            mobjCharges.Add(key:=strKey, value:=objCharge)

        Next

        'Loop one time charges.
        For Each strKey In objOneTimeCharges.Keys

            'Get reference to charge.	
            objCharge = objOneTimeCharges(key:=strKey)

            'Add charge to dictionary.
            mobjCharges.Add(key:=strKey, value:=objCharge)

        Next

    End Sub

    Private Sub SendEmailMessage()

        Dim strRecipient As String
        Dim strMessage As String

        'Send email to sales department.
        strRecipient = ConfigurationSettings.AppSettings("SignupRecipient")
        strMessage = BuildEmailMessage(template:="~/templates/signup.xslt", maskCreditCard:=False)
        SendEmail(from:="Enlightened Technology Website", fromAddress:="Sales@etgroup.net", replyTo:="", to:=strRecipient, subject:="Signup Form", message:=strMessage)

        'Send welcome email to sales department.
        'strRecipient = ConfigurationSettings.AppSettings("SignupRecipient")
        'strMessage = BuildEmailMessage(template:="/templates/welcome.xslt", maskCreditCard:=True)
        'SendEmail(from:="Enlightened Technology", fromAddress:="Sales@etgroup.net", to:=strRecipient, subject:="Your Hosting Account Information", message:=strMessage)

        'Send email to customer.
        strRecipient = Trim(txtCurrentEmailAddress.Text)
        strMessage = BuildEmailMessage(template:="~/templates/signup_receipt.xslt", maskCreditCard:=True)

        'Send the email.
        If strRecipient <> "" Then
            SendEmail(from:="Enlightened Technology", fromAddress:="Sales@etgroup.net", replyTo:="", to:=strRecipient, subject:="Your Hosting Account Receipt", message:=strMessage)
        End If

    End Sub

    Private Sub BuildReceipt()

        'Domain note.
        If rdoRegisterDomain.Checked = True Then
            tblDomainNote.Visible = False
        Else
            tblDomainNote.Visible = True
        End If

        'Company name.
        If Trim(txtCompanyName.Text) <> "" Then
            lblCompanyName.Text = Trim(txtCompanyName.Text)
        Else
            lblCompanyName.Text = "- none -"
        End If

        'Set label controls.
        lblContactName.Text = Trim(txtContactName.Text)
        lblAddress.Text = Trim(txtAddress.Text)
        lblCity.Text = Trim(txtCity.Text)
        lblState.Text = Trim(dropState.SelectedItem.Text)
        lblZipCode.Text = Trim(txtZipCode.Text)
        lblPhoneNumber.Text = Trim(txtPhoneNumber.Text)

        'Current email address.
        If Trim(txtCurrentEmailAddress.Text) <> "" Then
            lblCurrentEmailAddress.Text = Trim(txtCurrentEmailAddress.Text)
        Else
            lblCurrentEmailAddress.Text = "- none -"
        End If

        'Set label controls.
        lblCreditCardType.Text = Trim(dropCreditCardType.SelectedItem.Value)

        'Mask credit card number.
        lblCreditCardNumber.Text = "**********" & Microsoft.VisualBasic.Left(Trim(txtCreditCardNumber.Text), 4)

        'Set label controls.
        lblCreditCardName.Text = Trim(txtCreditCardName.Text)
        lblExpirationMonth.Text = Trim(dropExpirationMonth.SelectedItem.Value)
        lblExpirationYear.Text = Trim(dropExpirationYear.SelectedItem.Value)

    End Sub

    Private Function BuildEmailMessage(ByVal template As String, ByVal maskCreditCard As Boolean) As String

        Dim objXmlDocument As System.Xml.XmlDocument
        Dim objXmlNode As System.Xml.XmlNode
        Dim objXmlNode2 As System.Xml.XmlNode
        Dim objXslTransform As System.Xml.Xsl.XslTransform
        Dim objMemoryStream As IO.MemoryStream
        Dim objStreamReader As IO.StreamReader
        Dim objCharge As Specialized.ListDictionary
        Dim strFileName As String
        Dim strMessage As String
        Dim decMonthlyTotal As Decimal
        Dim blnWebHosting As Boolean
        Dim blnIndexing As Boolean
        Dim blnSQLServer As Boolean
        Dim blnSharePoint As Boolean
        Dim blnExchange As Boolean
        Dim blnPOP3 As Boolean

        'Instantiate objects.
        objXmlDocument = New System.Xml.XmlDocument
        objXslTransform = New System.Xml.Xsl.XslTransform
        objMemoryStream = New IO.MemoryStream

        'Create root node.
        objXmlNode = objXmlDocument.CreateNode(type:=System.Xml.XmlNodeType.Element, name:="root", namespaceURI:="")
        objXmlDocument.AppendChild(newChild:=objXmlNode)

        'Add charges node.
        objXmlNode2 = AddXmlNode(name:="Charges", value:="", xmlElement:=objXmlDocument.DocumentElement)

        'Reset sub total.
        mdecSubTotal = 0

        'Loop charges.
        For Each objCharge In mobjCharges.Values

            'Add charges node.
            objXmlNode = AddXmlNode(name:="Charge", value:="", xmlElement:=objXmlNode2)

            'Add charge.
            AddXmlNode(name:="Type", value:=objCharge(key:="Type"), xmlElement:=objXmlNode)
            AddXmlNode(name:="Description", value:=objCharge(key:="Description"), xmlElement:=objXmlNode)
            AddXmlNode(name:="Quantity", value:=objCharge(key:="Quantity"), xmlElement:=objXmlNode)
            AddXmlNode(name:="Price", value:=objCharge(key:="Price"), xmlElement:=objXmlNode)
            AddXmlNode(name:="Total", value:=objCharge(key:="Total"), xmlElement:=objXmlNode)

            'Compute total.
            mdecSubTotal = mdecSubTotal + objCharge(key:="Total")

            'Monthly total.
            If objCharge(key:="Type") = "Monthly Account Fees" Then
                decMonthlyTotal = decMonthlyTotal + objCharge(key:="Total")
            End If

        Next

        'Sales tax.
        If Trim(dropState.SelectedItem.Text) = "Texas" Then
            mdecSalesTax = mdecSubTotal * ConfigurationManager.AppSettings("SalesTax")
        Else
            mdecSalesTax = 0
        End If

        'Final total.
        mdecTotal = mdecSubTotal + mdecSalesTax

        ''Web hosting.
        'If Trim(dropWebHostingPlan.SelectedItem.Value) <> "" Then
        '    blnWebHosting = True
        'End If

        ''Indexing.
        'If Trim(dropWebHostingPlan.SelectedItem.Value) = CStr(ETG.Database.Product.Type.WebHostingProfessional) Or Trim(dropWebHostingPlan.SelectedItem.Value) = CStr(ETG.Database.Product.Type.WebHostingEnterprise) Then
        '    blnIndexing = True
        'End If

        ''SQL Server.
        'If Trim(dropWebHostingPlan.SelectedItem.Value) = CStr(ETG.Database.Product.Type.WebHostingProfessional) Or Trim(dropWebHostingPlan.SelectedItem.Value) = CStr(ETG.Database.Product.Type.WebHostingEnterprise) Then
        '    blnSQLServer = True
        'End If

        ''SharePoint hosting.
        'If Trim(dropSharePointPlan.SelectedItem.Value) <> "" Then
        '    blnSharePoint = True
        'End If

        'Add XML nodes.
        'AddXmlNode(name:="WebHosting", value:=blnWebHosting, xmlElement:=objXmlDocument.DocumentElement)
        ''AddXmlNode(name:="Indexing", value:=blnIndexing, xmlElement:=objXmlDocument.DocumentElement)
        'AddXmlNode(name:="SQLServer", value:=blnSQLServer, xmlElement:=objXmlDocument.DocumentElement)
        'AddXmlNode(name:="SharePoint", value:=blnSharePoint, xmlElement:=objXmlDocument.DocumentElement)
        'AddXmlNode(name:="Exchange", value:=blnExchange, xmlElement:=objXmlDocument.DocumentElement)
        'AddXmlNode(name:="POP3", value:=blnPOP3, xmlElement:=objXmlDocument.DocumentElement)

        AddXmlNode(name:="RegisterDomain", value:=rdoRegisterDomain.Checked, xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="DomainName", value:=Trim(lblDomainName.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="Date", value:=FormatDateTime(Today(), DateFormat.LongDate), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="CompanyName", value:=Trim(txtCompanyName.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="ContactName", value:=Trim(txtContactName.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="Address", value:=Trim(txtAddress.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="City", value:=Trim(txtCity.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="State", value:=Trim(dropState.SelectedItem.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="ZipCode", value:=Trim(txtZipCode.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="PhoneNumber", value:=Trim(txtPhoneNumber.Text), xmlElement:=objXmlDocument.DocumentElement)
        
        AddXmlNode(name:="CurrentEmailAddress", value:=Trim(txtCurrentEmailAddress.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="CreditCardType", value:=Trim(dropCreditCardType.SelectedItem.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="CreditCardName", value:=Trim(txtCreditCardName.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="ExpirationMonth", value:=Trim(dropExpirationMonth.SelectedItem.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="ExpirationYear", value:=Trim(dropExpirationYear.SelectedItem.Text), xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="CVVCode", value:=Trim(txtCVV.Text), xmlElement:=objXmlDocument.DocumentElement)

        AddXmlNode(name:="MonthlyTotal", value:=decMonthlyTotal, xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="SubTotal", value:=mdecSubTotal, xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="SalesTax", value:=mdecSalesTax, xmlElement:=objXmlDocument.DocumentElement)
        AddXmlNode(name:="GrandTotal", value:=mdecTotal, xmlElement:=objXmlDocument.DocumentElement)

        AddXmlNode(name:="IPAddress", value:=Request.ServerVariables("REMOTE_ADDR"), xmlElement:=objXmlDocument.DocumentElement)

        'Credit card number.
        If maskCreditCard = True Then
            AddXmlNode(name:="CreditCardNumber", value:="**********" & Microsoft.VisualBasic.Left(Trim(txtCreditCardNumber.Text), 4), xmlElement:=objXmlDocument.DocumentElement)
        Else
            AddXmlNode(name:="CreditCardNumber", value:=Trim(txtCreditCardNumber.Text), xmlElement:=objXmlDocument.DocumentElement)
        End If

        'Load XSLT.
        strFileName = MapPath(virtualPath:=template)
        objXslTransform.Load(url:=strFileName)

        'Transform XML.
        objXslTransform.Transform(input:=objXmlDocument, args:=Nothing, output:=objMemoryStream, resolver:=Nothing)

        'Get stream reader.
        objMemoryStream.Position = 0
        objStreamReader = New IO.StreamReader(stream:=objMemoryStream)

        'Get message.
        strMessage = objStreamReader.ReadToEnd()

        'Close streams.
        objMemoryStream.Close()
        objStreamReader.Close()

        'Set function return.
        Return strMessage

    End Function

    Private Function AddXmlNode(ByVal name As String, ByVal value As String, ByVal xmlElement As System.Xml.XmlElement) As System.Xml.XmlNode

        Dim objXmlNode As System.Xml.XmlNode

        'Create Xml node.
        objXmlNode = xmlElement.OwnerDocument.CreateNode(type:=System.Xml.XmlNodeType.Element, name:=name, namespaceURI:="")
        objXmlNode.InnerText = value

        'Append node.
        xmlElement.AppendChild(newChild:=objXmlNode)

        'Set function return.
        Return objXmlNode

    End Function

    Private Sub SendEmail(ByVal from As String, ByVal fromAddress As String, ByVal replyTo As String, ByVal [to] As String, ByVal subject As String, ByVal message As String, Optional ByVal cc As String = "", Optional ByVal attachment As String = "")

        Dim objMailMessage As System.Net.Mail.MailMessage
        Dim objAttachment As System.Net.Mail.Attachment
        Dim objSmtpClient As System.Net.Mail.SmtpClient
        Dim strTo() As String
        Dim I As Integer

        'Split the to addresses.
        strTo = Split([to], ";")

        'Instantiate objects.
        objMailMessage = New System.Net.Mail.MailMessage(from:=from & "<" & fromAddress & ">", to:=strTo(0))
        objSmtpClient = New System.Net.Mail.SmtpClient

        'Add additional recipients.
        If strTo.Length > 1 Then
            For I = 1 To strTo.Length - 1
                objMailMessage.To.Add(New System.Net.Mail.MailAddress(strTo(I)))
            Next
        End If

        'Set message properties.
        With objMailMessage
            .Subject = subject
            .Body = message
            .IsBodyHtml = True
        End With

        'Add attachment.
        If attachment <> "" Then
            objAttachment = New System.Net.Mail.Attachment(fileName:=attachment)
            objMailMessage.Attachments.Add(item:=objAttachment)
        End If

        'Add cc.
        If cc <> "" Then
            objMailMessage.CC.Add(addresses:=cc)
        End If

        'SMTP host and port.
        If System.Configuration.ConfigurationSettings.AppSettings("SMTPServer") <> "" Then
            objSmtpClient.Host = System.Configuration.ConfigurationSettings.AppSettings("SMTPServer")
        Else
            objSmtpClient.Host = "smtp.etghost.net"
        End If
        If System.Configuration.ConfigurationSettings.AppSettings("SMTPPort") <> "" Then
            objSmtpClient.Port = System.Configuration.ConfigurationSettings.AppSettings("SMTPPort")
        Else
            objSmtpClient.Port = "25"
        End If

        'Try

            'Send the email.
            objSmtpClient.Send(message:=objMailMessage)

        'Catch

        'End Try

        'Release the attachment.
        If Not objAttachment Is Nothing Then
            objAttachment.Dispose()
        End If

        'Release the message.
        objMailMessage.Dispose()

    End Sub

    Protected Sub chkExchange_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkExchange.CheckedChanged

        'Check.
        If chkExchange.Checked = True Then
            tblExchange.Visible = True
            tdExchange1.Visible = True
            tdExchange2.Visible = True
        Else
            tblExchange.Visible = False
            tdExchange1.Visible = False
            tdExchange2.Visible = False
        End If

    End Sub

    Protected Sub chkSharePoint_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkSharePoint.CheckedChanged

        'Check.
        If chkSharePoint.Checked = True Then
            tblSharePoint.Visible = True
            tdSharePoint1.Visible = True
            tdSharePoint2.Visible = True
        Else
            tblSharePoint.Visible = False
            tdSharePoint1.Visible = False
            tdSharePoint2.Visible = False
        End If

    End Sub

    Protected Sub chkCRM_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkCRM.CheckedChanged

        'Check.
        If chkCRM.Checked = True Then
            tblCRM.Visible = True
            tdCRM1.Visible = True
            tdCRM2.Visible = True
        Else
            tblCRM.Visible = False
            tdCRM1.Visible = False
            tdCRM2.Visible = False
        End If

    End Sub

    Protected Sub chkBackup_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkBackup.CheckedChanged

        'Check.
        If chkBackup.Checked = True Then
            tblBackup.Visible = True
            tdBackup1.Visible = True
            tdBackup2.Visible = True
        Else
            tblBackup.Visible = False
            tdBackup1.Visible = False
            tdBackup2.Visible = False
        End If

    End Sub

    Protected Sub chkOCS_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkOCS.CheckedChanged

        'Check.
        If chkOCS.Checked = True Then
            tblOCS.Visible = True
            tdOCS1.Visible = True
            tdOCS2.Visible = True
        Else
            tblOCS.Visible = False
            tdOCS1.Visible = False
            tdOCS2.Visible = False
        End If

    End Sub

    Protected Sub chkWeb_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkWeb.CheckedChanged

        'Check.
        If chkWeb.Checked = True Then
            tblWeb.Visible = True
            tdWeb1.Visible = True
            tdWeb2.Visible = True
        Else
            tblWeb.Visible = False
            tdWeb1.Visible = False
            tdWeb2.Visible = False
        End If

    End Sub

    Protected Sub chkVPS_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkVPS.CheckedChanged

        'Check.
        If chkVPS.Checked = True Then
            tblVPS.Visible = True
            tdVPS1.Visible = True
            tdVPS2.Visible = True
        Else
            tblVPS.Visible = False
            tdVPS1.Visible = False
            tdVPS2.Visible = False
        End If

    End Sub

    Private Sub CreateDefaultButton()

        'Set default button.
        If tblPage1.Visible = True Then
            Page.Form.DefaultButton = btnNext1.UniqueID
        ElseIf tblPage2.Visible = True Then
            Page.Form.DefaultButton = btnNext2.UniqueID
        ElseIf tblPage3.Visible = True Then
            Page.Form.DefaultButton = btnNext3.UniqueID
        ElseIf tblPage4.Visible = True Then
            Page.Form.DefaultButton = btnFinish.UniqueID
        End If

    End Sub

    Private Sub btnNext1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext1.Click

        'Process form.
        ProcessForm(page:=1)

    End Sub

    Private Sub btnBack2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack2.Click

        'Show page.
        ShowPage(page:=1)

    End Sub

    Private Sub btnNext2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext2.Click

        'Process form.
        ProcessForm(page:=2)

    End Sub

    Private Sub btnBack3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack3.Click

        'Show page.
        ShowPage(page:=2)

    End Sub

    Private Sub btnNext3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext3.Click

        'Process form.
        ProcessForm(page:=3)

    End Sub

    Private Sub btnBack4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack4.Click

        'Show page.
        ShowPage(page:=3)

    End Sub

    Private Sub btnFinish_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFinish.Click

        'Process form.
        ProcessForm(page:=4)

    End Sub

End Class  


       
            


