(***********************************************************
*                                                          *
*  DCV na PGM                                              *
*                                                          *
*  Autor: Jan Pacner                                       *
*                                                          *
*  Zadani:                                                 *
*    caesarovska sifra:                                    *
*    zadame o kolik se ma dany text posunout               *
*    zadame text k posunuti                                *
*    program vypise posunuty text,                         *
*    pote se zepta, jestli chceme zasifrovanou vetu        *
*    odsifrovat, kdyz ano, zepta se na "posun"             *
*      (sifrovaci klic)                                    *
*    kdyz nebudeme chtit odsifrovavat, zepta se jestli     *
*    chceme skoncit nebo znovu cele od zacatku             *
*                                                          *
*  made 26.2.2008 and last modified 1.3.2008 16:31         *
*                                                          *
***********************************************************)

program caesar_sifra;

var
input,output,keyin,odsifrovat,exit:string[99];
key,pozice,numtrue:integer;
i:byte;

begin
repeat

    (***  KLIC  ***)

writeln ('napiste sifrovaci klic (cislo - o kolik se ma posunovat)');
{abcde fghij klmno pqrst uvwxy z}
writeln ('(v abecede o 26 znacich - tzn. od -25 do 25)');
repeat
  readln (keyin);
  val(keyin,key,numtrue);
  if not(numtrue=0) then
    writeln ('zadane znaky nelze povazovat za cislo',chr(10),'zkuste to znovu:');
until numtrue=0;
//writeln ('posunuti: ',key);

if key<0 then begin
  repeat key:=key+26 until key>=0;
  writeln ('posunovat se bude o ',key,' znaku');
  end;
if key>=26 then begin
  repeat key:=key-26 until key in [0..26];
  writeln ('posunovat se bude o ',key,' znaku');
  end;


    (***  ZASIFROVANI - VETA 2.POKUS  ***)

writeln ('zadejte vetu, ktera ma byt zasifrovana:');
readln (input);
output:=('');
for i:=1 to length(input) do begin

if (input[i] in ['A'..'Z']) or (input[i] in ['a'..'z']) then begin
  if input[i] in ['A'..'Z'] then begin
    pozice:=ord(input[i])+key;
    if not(pozice in [65..90]) then begin
      pozice:=65+(pozice-90)-1;
      end;
    end
    else begin (* if input[i] in ['a'..'z'] *)
      pozice:=ord(input[i])+key;
      if not(pozice in [97..122]) then begin
        pozice:=97+(pozice-122)-1;
        end;
      end;
  end
  else pozice:=ord(input[i]);
  output:=concat(output,chr(pozice));
end;
writeln ('toto je zasifrovana veta:');
writeln (output);


    (*** ODSIFROVANI  ***)

writeln ('chcete zasifrovanou vetu zase odsifrovat? (ano/ne):');
repeat
  readln (odsifrovat);
  if not(odsifrovat=('ano')) or not(odsifrovat=('ne'))
    then writeln ('neodpovedela jste "ano" nebo "ne"',chr(10),'zkuste to znovu:');
//  writeln ('toto je promenna odsifrovat: ',odsifrovat);
until (odsifrovat=('ano')) or (odsifrovat=('ne'));


    (***  KLIC  ***)

if odsifrovat=('ano') then begin
writeln ('napiste sifrovaci klic (cislo - o kolik je veta posunuta)');
writeln ('(v abecede o 26 znacich - tzn. od -25 do 25)');
repeat
  readln (keyin);
  val(keyin,key,numtrue);
  if not(numtrue=0) then
    writeln ('zadane znaky nelze povazovat za cislo',chr(10),'zkuste to znovu:')
    else writeln ('posunuti: ',key);
until numtrue=0;

key:=-key;
if key<0 then begin
  repeat key:=key+26 until key>=0;
  writeln ('posunovat se bude o ',key,' znaku');
  end;
if key>=26 then begin
  repeat key:=key-26 until key in [0..26];
  writeln ('posunovat se bude o ',key,' znaku');
  end;


    (***  ODSIFROVANI - VETA  ***)

input:=output;
output:=('');
for i:=1 to length(input) do begin
if (input[i] in ['A'..'Z']) or (input[i] in ['a'..'z']) then begin
  if input[i] in ['A'..'Z'] then begin
    pozice:=ord(input[i])+key;
    if not(pozice in [65..90]) then begin
      pozice:=65+(pozice-90)-1;
      end;
    end
    else begin (* if input[i] in ['a'..'z'] *)
      pozice:=ord(input[i])+key;
      if not(pozice in [97..122]) then begin
        pozice:=97+(pozice-122)-1;
        end;
      end;
  end
  else pozice:=ord(input[i]);
  output:=concat(output,chr(pozice));
end;
writeln ('toto je odsifrovana veta:');
writeln (output);
end
else exit:=('ukoncit');
    (*konec odsifrovani*)

writeln (chr(10),'chcete ukoncit program, nebo si to cele dat znovu?');
writeln ('pro pokracovani napiste: pokracovat, pro ukonceni napiste: ukoncit');
repeat
  readln (exit);
  if not(exit=('ukoncit')) or not(exit=('pokracovat')) then begin
    writeln ('napsali jste neco jineho nez "pokracovat" nebo "ukoncit"');
    writeln ('zkuste to znovu:');
    end;
until (exit=('ukoncit')) or (exit=('pokracovat'));
until (exit=('ukoncit'));

writeln ('this program was made by Globator007 and');
writeln ('is licenced under GNU-GPLv3 or higher');
writeln ('pro ukonceni stisknete klavesu Enter');
readln;
end.