Contributor: SCOTT KANE

{
Here's a snippet I thought some programmers could use on this list, its'
from the Webhub list...  Calculates the checksum of a credit card.

The webhub javascript directory contains a nice bit of code from
Mauricio Korbman that does the mod10 credit card checksum for validating
that an entered credit card number is ok.  This is very important for
us, but because we still want to maintain backward compatibility for
mission critical events (and what's more critical than getting money
over the web?) I have "ported" this code into delphi.

I only have one credit card, a visa, and the code works right for it.
So I'm sending this to the list for two purposes, to share this with
everyone and to get anybody else who finds it useful to take a look at
it and see if it's running right for other card types (and to catch any
dumb mistakes I've committed).

-Mark Wladika
markw@kweb.com
}

procedure TMainForm.Button1Click(Sender: TObject);

var
cardNumber: String;
CalcCard, calcs, CC, i: Integer;
R: Real;

begin


cardNumber := Edit1.Text;

R := Length(cardNumber) / 2;

        if (Length(cardNumber) - (R*2) = 0)     then
        begin
           for i := Length(cardNumber)-1 downto  1 do
              R := i / 2;
              if (R < 1) then
                R := R + 1;

              if (i - (R * 2) <> 0) then
                 calcs := StrToInt((Copy(cardNumber, (i-1), 1))) * 2
              else
                 calcs := StrToInt((Copy(cardNumber, (i-1), 1)));

              if (calcs >= 10) then
                 calcs := calcs - 10 + 1;

              CalcCard := CalcCard + calcs;

        end
        else
           begin
           for i := Length(cardNumber)-1 downto 1 do
              R := i / 2;
              if (R < 1) then
                R := R + 1;

              if (i - (R * 2) <> 0) then
                 calcs := StrToInt((Copy(cardNumber, (i-1), 1)))
              else
                 calcs := StrToInt((Copy(cardNumber, (i-1), 1))) * 2;

              if (calcs >= 10)then
                 calcs := calcs - 10 + 1;

              CalcCard := CalcCard + calcs;
            end;

        calcs := 10 - (CalcCard mod 10);
        if (calcs = 10)  then
           calcs := 0;

        if (calcs = StrToInt((Copy(cardNumber, Length(cardNumber)-1,1)))) then
           Edit2.Text := 'Credit Card Number Valid'
        else
           Edit2.Text := 'Credit Card Number Not Valid';



end;