unit mdc_unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb; 

type

  { TFPWebModule1 }

  TFPWebModule1 = class(TFPWebModule)
    procedure calculoRequest(Sender: TObject; ARequest: TRequest;
      AResponse: TResponse; var Handled: Boolean);
    procedure inicioRequest(Sender: TObject; ARequest: TRequest;
      AResponse: TResponse; var Handled: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  FPWebModule1: TFPWebModule1; 

implementation

{$R *.lfm}

{ TFPWebModule1 }

procedure TFPWebModule1.calculoRequest(Sender: TObject; ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
var
  MdcOk: Boolean;

  PrimeiroIndice: LongInt;
  SegundoIndice: LongInt;

  PrimeiroNumero: LongInt;
  SegundoNumero: LongInt;

  StringListPrimeiroNumero: TStringList;
  StringListSegundoNumero: TStringList;
begin
  AResponse.ContentType := 'text/html;charset=utf-8';

  AResponse.Contents.Add('<big><big><big>Cálculo do Máximo Divisor Comum</big></big></big><br><br>');

  PrimeiroNumero := StrToIntDef(ARequest.ContentFields.Values['TextPrimeiroNumero'], 0);
  SegundoNumero  := StrToIntDef(ARequest.ContentFields.Values['TextSegundoNumero'], 0);

  if (PrimeiroNumero > 0) and (SegundoNumero > 0) then begin
    StringListPrimeiroNumero := TStringList.Create;
    StringListSegundoNumero  := TStringList.Create;

    StringListPrimeiroNumero.Delimiter := ',';
    StringListSegundoNumero.Delimiter  := ',';

    with AResponse.Contents do begin
      for PrimeiroIndice := 1 to PrimeiroNumero do begin
        if PrimeiroNumero mod PrimeiroIndice = 0 then StringListPrimeiroNumero.Add(IntToStr(PrimeiroNumero div PrimeiroIndice));
      end;

      for SegundoIndice := 1 to SegundoNumero do begin
        if SegundoNumero mod SegundoIndice = 0 then StringListSegundoNumero.Add(IntToStr(SegundoNumero div SegundoIndice));
      end;

      try
        MdcOk := false;

        for PrimeiroIndice := 0 to StringListPrimeiroNumero.Count - 1 do begin
          for SegundoIndice := 0 to StringListSegundoNumero.Count - 1 do
            if StringListPrimeiroNumero.Strings[PrimeiroIndice] = StringListSegundoNumero.Strings[SegundoIndice] then begin
              MdcOk := true;

              StringListPrimeiroNumero.Strings[PrimeiroIndice] := '<span style=' + QuotedStr('font-weight: bold; color: red;') + '>' + StringListPrimeiroNumero.Strings[PrimeiroIndice] + '</span>';
              StringListSegundoNumero.Strings[SegundoIndice]   := '<span style=' + QuotedStr('font-weight: bold; color: red;') + '>' + StringListSegundoNumero.Strings[SegundoIndice] + '</span>';

              Break;
            end;

          if MdcOk then Break;
        end;
      finally
      end;

      Add('Divisores de ' + IntToStr(PrimeiroNumero) + ' = (' + StringReplace(StringListPrimeiroNumero.DelimitedText, '"', '', [rfReplaceAll, rfIgnoreCase]) + ')<br>');
      Add('Divisores de ' + IntToStr(SegundoNumero) + ' = (' + StringReplace(StringListSegundoNumero.DelimitedText, '"', '', [rfReplaceAll, rfIgnoreCase]) + ')<br>');

      Add('<br><a href="/cgi-bin/mdc.cgi?mdc=inicio">Outro cálculo</a>');
    end;

    StringListPrimeiroNumero.Free;
    StringListSegundoNumero.Free;
  end else begin
    with AResponse.Contents do begin
      Add('Número(s) inválido(s).<br>');

      Add('<br><a href="javascript:history.go(-1)">Voltar</a>');
    end;
  end;

  AResponse.SendContent;
end;

procedure TFPWebModule1.inicioRequest(Sender: TObject; ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
begin
  try
    AResponse.Contents.LoadFromFile('mdc.html');
  finally
    AResponse.SendContent;
  end;
end;

initialization
  RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
end.

