Solved

.net implementing simple javascript luhn check

Posted on 2013-06-28
10
428 Views
Last Modified: 2013-06-28
I have inherited a fairly basic .net site which allows users to register, part of the sign up procedure requires that they enter a valid 19 digit number, the last number of which needs to be checked by a basic luhn checker. Basicaly I want to hook up the code at this url
http://imei.sms.eu.sk/
In to the PRN field on this page, if it was a standard html form I could hook it in easy enough but I am not familiar with .net and thisis using a "wizard" type registration process so do not understand when it is passing post or validation information.

I have included the full .aspx page below.
<%@ Page Language="VB" AutoEventWireup="false" EnableViewStateMac="false" CodeFile="customerDetails.aspx.vb"
  Inherits="customerDetails" MasterPageFile="~/Site.Master" %>

<asp:Content ID="Content3" ContentPlaceHolderID="HeadContent" runat="server">
  <script type="text/javascript" src="/Scripts/countrycodes.js"></script>
  <script type="text/javascript" src="/Scripts/customerDetails.js"></script>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
    });
  </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
  Your Details
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="SubHeading" runat="server">
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  <div class="sign_up_lft">

  <asp:Panel ID="pnlError" runat="server" Visible="False" CssClass="alert-error">

    <div class="alert-error">
      <asp:Label Font-Bold="false" ID='lblError' runat="server"></asp:Label>
    </div>
    
  </asp:Panel>
  <asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="False" Width="700px" OnNextButtonClick="OnNextButtonClick" FinishStepButtonText="Next" FinishCompleteButtonText="Next" StepPreviousButtonText="Back" CellPadding="10" CssClass="tablewidth">
    <CancelButtonStyle CssClass="btn btn-primary" />
    <NavigationButtonStyle CssClass="btn btn-primary" />
    <StepNextButtonStyle CssClass="btn btn-primary" />
    <StepPreviousButtonStyle CssClass="btn btn-primary" />
    
    <WizardSteps>
      <asp:WizardStep ID="WizardStep1" runat="server" Title="">
       <div class="req"><span class="red">*</span> fields are mandatory. </div>
	   
	   <%-- <h2>
          Your Name</h2>--%>
           <%--<label for="txtBillingFirstnames">
            First Name: <span class="red">*</span> <span style="font-size: smaller">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* a mandatory field</span></label>--%>
          <span class="profile_01"><h2><b>1.</b> Your Name </h2></span>
            <div class="quote_form">
          <label for="txtBillingFirstnames" class="lft_name">
            First Name:<span class="red"> *</span> </label>
          <asp:TextBox ID="txtBillingFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingFirstnames"
                                      runat="server" ErrorMessage="Please enter first name" 
                                      ControlToValidate="txtBillingFirstnames" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

          <label for="txtBillingSurname" class="lft_name">
            Last Name:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingSurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingSurname"
                                      runat="server" ErrorMessage="Please enter surname" 
                                      ControlToValidate="txtBillingSurname" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

        </div>
        
		<asp:RequiredFieldValidator ID="valBillingAddress1"
                                      runat="server" ErrorMessage="Please enter address line 1" 
                                      ControlToValidate="txtBillingAddress1" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
		
		<%--<h3>
          Your Address<a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></h3>--%>
          <span class="profile_01 profile_tx"><h2><b>2.</b> Your Address </h2><a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></span>
          <div class="quote_form">
          <label for="txtBillingAddress1" class="lft_name">
            Address Line 1:<span class="red"> *</span></label>
          &nbsp;<asp:TextBox ID="txtBillingAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          
             
          <label for="txtBillingAddress2" class="lft_name">
            Address Line 2:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
         
             
          <label for="txtBillingCity" class="lft_name">
            City / Town:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCity"
                                      runat="server" ErrorMessage="Please enter city" 
                                      ControlToValidate="txtBillingCity" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingPostCode" class="lft_name">
            Postcode:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingPostCode"
                                      runat="server" ErrorMessage="Please enter postcode" 
                                      ControlToValidate="txtBillingPostCode" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingCountry" class="lft_name">
            Country:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static"
                       ReadOnly="True" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCountry"
                                      runat="server" ErrorMessage="Please enter country" 
                                      ControlToValidate="txtBillingCountry" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
        </div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep2" runat="server" Title="">
      <%--  <h3>
          Your Contact Details</h3>--%>
          <span class="profile_01 profile_tx"><h2>Your Contact Details</h2></span>

        <div class="quote_form">
          <label for="txtBillingPhone" class="lft_name">
            Your Telephone Number:<a rel="tooltip" href="#" title="Please enter your telephone number">?</a></label>
          <asp:TextBox ID="txtBillingPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 

          <label for="txtCustomerEMail" class="lft_name">
           Your Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail"
                                      runat="server" ErrorMessage="Please enter email" 
                                      ControlToValidate="txtCustomerEMail" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
                                      
          <asp:RegularExpressionValidator ID="valEmailFormat1" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
          
          <label for="txtCustomerEMail2" class="lft_name">
            Confirm Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail2" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail2"
                                      runat="server" ErrorMessage="Please re-enter your email" 
                                      ControlToValidate="txtCustomerEMail2" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
          
           <asp:RegularExpressionValidator ID="valEmailFormat2" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail2" ForeColor="Red" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
                                       
          <asp:CompareValidator ID="valCompareEmail" 
                                      runat="server" ErrorMessage="Email addresses do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtCustomerEMail" ControlToValidate="txtCustomerEMail2"></asp:CompareValidator>


          <asp:Panel runat="server" ID="pnlAdditional" Visible="True">
            <label for="ddlGender" class="lft_name">
              Lead Soucre:</label>
            <asp:DropDownList ID="ddlMarketing" runat="server">
              <asp:ListItem Value="Leaflet" Text="Leaflet" />
              <asp:ListItem Value="Poster in rent payment office" Text="Poster in rent payment office" />
		<asp:ListItem Value="Twitter/ Facebook" Text="Twitter/ Facebook" />
		<asp:ListItem Value="Newsletter/ Magazine" Text="Newsletter/ Magazine" />
		<asp:ListItem Value="Friend/ family recommendation" Text="Friend/ family recommendation" />
		<asp:ListItem Value="Rent Statement" Text="Rent Statement" />
		<asp:ListItem Value="Website" Text="Website" />
		<asp:ListItem Value="Google/ bing/ yahoo" Text="Google/ bing/ yahoo" />
		<asp:ListItem Value="Other" Text="Other" />
            </asp:DropDownList>
            
            <label for="txtPRN" class="lft_name">
              PRN<span class="red"> *</span></label>
            <asp:TextBox ID="txtPRN" MaxLength="19" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
            
              
          </asp:Panel>
</div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep3" runat="server" Title="">
        <asp:Panel ID="pnlDeliveryAddress" runat="server">
          <h4>
            Delivery Details</h4>

    <div class="delivery">     
            <!-- delivery same checkbox -->
			<div class="check">
            <asp:CheckBox ID="IsDeliverySame" runat="server" OnCheckedChanged="IsDeliverySame_Clicked" AutoPostBack="True" /></div>
            <label class="checkbox-label" for="IsDeliverySame">
              Is your delivery address the same as your billing address?</label>
  </div>

            <h4>
              Your Name</h4>

            <div>
              <label for="txtDeliveryFirstnames">
                First Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryFirstnames"
                                          runat="server" ErrorMessage="Please enter first name" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliverySurname">
                Last Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliverySurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliverySurname"
                                          runat="server" ErrorMessage="Please enter surname" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
            



            <div class="profile_01"><h4>
              Your Address</h4></div>

              <label for="txtDeliveryAddress1">
                Address line 1:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryAddress1"
                                          runat="server" ErrorMessage="Please enter address line 1" 
                                          ControlToValidate="txtDeliveryAddress1" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryAddress2">
                Address line 2:</label>
              <asp:TextBox ID="txtDeliveryAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>

              <label for="txtDeliveryCity">
                City:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryCity"
                                          runat="server" ErrorMessage="Please enter city" 
                                          ControlToValidate="txtDeliveryCity" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryPostCode">
                Postcode:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryPostcode"
                                          runat="server" ErrorMessage="Please enter poscode" 
                                          ControlToValidate="txtDeliveryPostCode" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryCountry">
                Country:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static" ReadOnly="True"/>
              <asp:RequiredFieldValidator ID="valDeliveryCountry"
                                          runat="server" ErrorMessage="Please enter country" 
                                          ControlToValidate="txtDeliveryCountry" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
                                          
              <label for="txtDeliveryPhone">
                Phone:</label>
              <asp:TextBox ID="txtDeliveryPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              
            



           

        </asp:Panel>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep4" runat="server" Title="">
        <asp:Panel ID="pnlRegOptions1" runat="server">
          <div><h4>
            Security Settings</h4></div>

            <label for="txtPassword">
              Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword"
                                          runat="server" ErrorMessage="Please enter password" 
                                          ControlToValidate="txtPassword" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <label for="txtPassword2">
              Confirm Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword2" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword2"
                                          runat="server" ErrorMessage="Please re-enter password" 
                                          ControlToValidate="txtPassword2" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
            <asp:CompareValidator ID="valComparePassword" 
                                      runat="server" ErrorMessage="Passwords do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtPassword" ControlToValidate="txtPassword2"></asp:CompareValidator>

            <label for="ContentPlaceHolder1_ddlSecurityQuestion">
              Security Question:<span class="red"> *</span></label>
            <asp:DropDownList ID="ddlSecurityQuestion" runat="server">
              <asp:ListItem>
              </asp:ListItem>
              <asp:ListItem>Favourite Pet</asp:ListItem>
              <asp:ListItem>First School Attended</asp:ListItem>
              <asp:ListItem>Mother's Maiden Name</asp:ListItem>
              <asp:ListItem>Childhood Nickname</asp:ListItem>
            </asp:DropDownList>
            <asp:RequiredFieldValidator ID="valSecurityQuestion"
                                          runat="server" ErrorMessage="Please select a security question" 
                                          ControlToValidate="ddlSecurityQuestion" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
            <br />
            <label for="txtSecurityAnswer">
              Security Answer:<span class="red"> *</span></label>
            <asp:TextBox ID="txtSecurityAnswer" MaxLength="50" runat="server" Text="" ClientIDMode="Static" TextMode="SingleLine" />
            <asp:RequiredFieldValidator ID="valSecurityAnswer"
                                          runat="server" ErrorMessage="Please enter security answer" 
                                          ControlToValidate="txtSecurityAnswer" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <br />
        



        </asp:Panel>
      </asp:WizardStep>
      
    </WizardSteps>
  </asp:Wizard>
  </div>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="RightSide">
  <asp:Panel ID="pnlRightSide" runat="server">
  </asp:Panel>
</asp:Content>


<asp:Content runat="server" ContentPlaceHolderID="ProgressBar">
  <asp:Panel ID="pnlProgressBar" runat="server">
    
  <%--<asp:Image id="ProgBar" runat="server" CssClass="float_m progress"></asp:Image>--%>
  
  </asp:Panel>
</asp:Content>

Open in new window

0
Comment
Question by:ScorchD
  • 6
  • 4
10 Comments
 
LVL 51

Expert Comment

by:Julian Hansen
ID: 39284030
So basically lines 9-14 you want to do this
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
/* If you want to check the number immediately after the field looses focus */
     $('#txtPRN').blur(function() {
        var val = $(this).val();
        // perform LUHN check here - can put luhn check in a function and call it here
        // or put the code directly
        if (!ValidateLuhn(val)) {
         // errror here
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

You can also pick up the button clicks and check there as well.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284252
Brilliant, I cant quite get it to work though, I also want to prevent the default actiioon for the form if the PRN field isnt valid, its rather crude but I have been trying to do so by preventing the default action of the next button like this.
jQuery(document).ready(function(){
jQuery.fn.exists = function(){return this.length>0;}
if ($("#txtPRN").length > 0) {

$("#ContentPlaceHolder1_Wizard1_StepNavigationTemplateContainerID_StepNextButton").click(function(event) {

event.preventDefault();
$('#ContentPlaceHolder1_Wizard1_pnlAdditional').append('<span id="prn-msg">Please enter a valid PRN</span>')
});

}

Open in new window

That aside for some reason I cannot get the above code that you gave me to work and I cannot work out why. In simplest form why does this not work?
jQuery(document).ready(function () {
     
     $('#txtPRN').blur(function() {
        var val = $(this).val();
		if (ValidateLuhn(val)) {
		alert('Valid');
		}else{
         alert('Invalid');
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

});

Open in new window

0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284329
I have the function working, apologies, it was a typo within the Calculate function.
Still not sure how best to prevent and then allow the user through, there isn't anyway to revert to default action of the onclick handler? I realize that it is not action based.

Many thanks for your time.
0
 
LVL 51

Accepted Solution

by:
Julian Hansen earned 500 total points
ID: 39284385
If you have a form you can catch the submit event
$('#idofform').submit(function() {
   // check here
  //  return false if fails - this will prevent form being submitted
});

Open in new window

If there is only one form then you can select like so
$('form').submit( ....

Open in new window

For the click
$('#idofbutton').click(function(e) {
    if (ValidateLuhn(val)) {
      return true;
    }
    e.preventDefault(); 
    return false;
   return rv;
});

Open in new window

0
 
LVL 4

Author Closing Comment

by:ScorchD
ID: 39284437
Excellent, thank you.

If I could award more points for this I would :)
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 51

Expert Comment

by:Julian Hansen
ID: 39284448
You are most welcome - thanks for the points and good luck with your project.

Just saw a typo in the last bit of script

the return rv - shoud be removed.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284453
Yes I noticed that, thank you
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284601
Julian if you are still there could I ask a really quick one, I also need to do a quick check to make sure the luhn value is 19 long, however this doesnt seem to be working?
function ValidateLuhn(Luhn)
 {
 
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	var LuhnLength = Luhn.length;
	if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

0
 
LVL 51

Expert Comment

by:Julian Hansen
ID: 39284686
Common mistake

if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))

You are using the assignment '=' instead of equality check '==' here so you are setting the length to 19 irrespective of the length.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284717
Ah of course, thank you!
You are right at the top of my Christmas list.
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

The task A number given should be formatted for easy reading by separating digits into triads. Format must be made inline via JavaScript, i.e., frameworks / functions are not welcome. So let’s take a number like this “12345678.91¿ and format i…
This article discusses how to create an extensible mechanism for linked drop downs.
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now