uses dos,crt,cfont,graph;

const
     no = 16;

type
    info = record
        name   : string;
        secs   : integer;
        mins   : integer;
        hours  : integer;
    end;

var
   lastno : integer;
   loop   : integer;
   loop2  : integer;
   data   : array[1..no] of info;
   gm,gd  : integer;
   co     : integer;

function lz(w : integer) : String;
var
  s : String;
begin
  Str(w:0,s);
  if Length(s) = 1 then
    s := '0' + s;
  lz := s;
end;

procedure precalc;

var
   x : integer;

begin
     x := 0;
     for loop := 1 to no do
     begin
          if data[loop].hours > 23 then
          begin
               x := data[loop].hours - 24;
               data[loop].hours := x;
          end;
          if data[loop].mins > 59 then
          begin
               x := data[loop].mins - 59;
               data[loop].mins := x;
          end;
          if data[loop].secs > 59 then
          begin
               x := data[loop].secs - 59;
               data[loop].secs := x;
          end;
     end;
end;

procedure presetclock;

var
   h,m,s,hund : word;
   loop       : integer;

begin
     GetTime(h,m,s,hund);
     for loop := 1 to no do
     begin
          data[loop].hours := data[loop].hours + h;
          data[loop].mins := data[loop].mins + m;
          data[loop].secs := data[loop].secs + s;
     end;
end;

procedure showtime;

begin
     delay(710);
     for loop := 1 to no do
     begin
          inc(data[loop].secs);
          if data[loop].secs > 59 then
          begin
               inc(data[loop].mins);
               data[loop].secs := 0;
               if data[loop].mins > 59 then
               begin
                    data[loop].mins := 0;
                    inc(data[loop].hours);
                    if data[loop].hours > 23 then
                     begin
                          data[loop].hours := 0;
                     end;
               end;
         end;
    end;
end;

begin
     gd := detect;
     initgraph(gd,gm,'\turbo\tp');  { change this !! }
     data[1].name := 'LONDON';
     data[1].secs := 0;
     data[1].mins := 0;
     data[1].hours := 0;
     data[2].name := 'PARIS';
     data[2].secs := 0;
     data[2].mins := 0;
     data[2].hours := 1;
     data[3].name := 'ATHINS';
     data[3].secs := 0;
     data[3].mins := 0;
     data[3].hours := 2;
     data[4].name := 'PEKING';
     data[4].secs := 0;
     data[4].mins := 0;
     data[4].hours := 8;
     data[5].name := 'TOKYO';
     data[5].secs := 0;
     data[5].mins := 0;
     data[5].hours := 9;
     data[6].name := 'SYDNEY';
     data[6].secs := 0;
     data[6].mins := 0;
     data[6].hours := 10;
     data[7].name := 'NEW YORK';
     data[7].secs := 0;
     data[7].mins := 0;
     data[7].hours := -5;
     data[8].name := 'MOSCOW';
     data[8].secs := 0;
     data[8].mins := 0;
     data[8].hours := 3;
     data[9].name := 'RIO';
     data[9].secs := 0;
     data[9].mins := 0;
     data[9].hours := -3;
     data[10].name := 'LOS ANGELES';
     data[10].secs := 0;
     data[10].mins := 0;
     data[10].hours := -8;
     data[11].name := 'HONOLULU';
     data[11].secs := 0;
     data[11].mins := 0;
     data[11].hours := -10;
     data[12].name := 'HONG KONG';
     data[12].secs := 0;
     data[12].mins := 0;
     data[12].hours := 8;
     data[13].name := 'SINGAPORE';
     data[13].secs := 0;
     data[13].mins := 0;
     data[13].hours := 7;
     data[14].name := 'NAIROBI';
     data[14].secs := 0;
     data[14].mins := 0;
     data[14].hours := 3;
     data[15].name := 'AUCKLAND';
     data[15].secs := 0;
     data[15].mins := 0;
     data[15].hours := 12;
     data[16].name := 'MEXICO CITY';
     data[16].secs := 0;
     data[16].mins := 0;
     data[16].hours := 6;
     presetclock;
     precalc;
     cleardevice;
     setcolor(lightblue);
     settextstyle(8,0,3);
     outtextxy(200,10,'WORLD TIME CLOCK');
     outtextxy(200,440,'By Nathan Dawson');
     rectangle(1,1,639,479);
     settextstyle(7,0,1);
     setcolor(lightgreen);
     for loop := 1 to 8 do
     begin
          outtextxy(10,10+loop*50,data[loop].name);
     end;
     co := 50;
     for loop2 := 9 to no do
     begin
          outtextxy(300,loop2+co,data[loop2].name);
          co := co + 49;
     end;
     repeat
     for loop := 1 to 8 do
     begin
          clock(200,10+loop*50,lz(data[loop].secs));
          clock(155,10+loop*50,lz(data[loop].mins));
          clock(110,10+loop*50,lz(data[loop].hours));
     end;
     co := 40;
     for loop2 := 9 to no do
     begin
          clock(520,10+loop2+co,lz(data[loop2].secs));
          clock(475,10+loop2+co,lz(data[loop2].mins));
          clock(430,10+loop2+co,lz(data[loop2].hours));
          co := co + 49;
     end;
     showtime;
     until keypressed;
     closegraph;
     gotoxy(17,1);
     textcolor(blue);
     write('Thank you for using the World Time Clock');
     gotoxy(17,3);
     textcolor(cyan);
     write('      Look out for more software by     ');
     gotoxy(17,5);
     textcolor(lightcyan);
     write('       °±²                     ²±°      ');
     gotoxy(31,5);
     textcolor(lightred+blink);
     write('NATHAN DAWSON');
     writeln;
     textcolor(lightgray);
end.

{ CFONT UNIT NEEDED FOR CLOCK.PAS }

unit cfont;

interface

procedure clock(px,y:integer;numbers:string);

implementation

uses crt,graph;

procedure clock;

var
   gm,gd  : integer;
   p1     : integer;
   p2     : integer;
   p3     : integer;
   testno : string;
   no1    : string[1];
   count  : integer;
   posx   : integer;
   posy   : integer;

function IntToStr(I: Longint): String;

var
 S: string[11];

begin
 Str(I, S);
 IntToStr := S;
end;

procedure resetvars;
begin
     p1 := 0;
     p2 := 0;
     p3 := 0;
end;

procedure section1;
begin
     resetvars;
     p3 := 3;
     repeat
           dec(p3);
           dec(p2);
           inc(p1);
           line(posx+p3,posy+p2,posx+p3,posy+5+p1);
     until p3 = 0;
end;

procedure section2;
begin
     resetvars;
     repeat
           inc(p3);
           dec(p2);
           inc(p1);
           line(posx+10+p3,posy+p2,posx+10+p3,posy+5+p1);
     until p3 = 3;
end;

procedure section3;
begin
     resetvars;
     p3 := 3;
     repeat
           dec(p3);
           dec(p2);
           inc(p1);
           line(posx+p3,posy+14+p2,posx+p3,posy+19+p1);
     until p3 = 0;
end;

procedure section4;
begin
     resetvars;
     repeat
           inc(p3);
           dec(p2);
           inc(p1);
           line(posx+10+p3,posy+14+p2,posx+10+p3,posy+19+p1);
     until p3 = 3;
end;

procedure section5;

begin
     resetvars;
     p3 := 3;
     repeat
           dec(p3);
           dec(p2);
           inc(p1);
           line(posx+5+p2,posy-5+p3,posx+8+p1,posy-5+p3);
     until p3 = 0;
end;

procedure section6;

begin
     resetvars;
     repeat
           inc(p3);
           dec(p2);
           inc(p1);
           line(posx+5+p2,posy+21+p3,posx+8+p1,posy+21+p3);
     until p3 = 3;
end;

procedure section7;

begin
     resetvars;
           line(posx+4,posy+9,posx+9,posy+9);
           line(posx+3,posy+10,posx+10,posy+10);
           line(posx+4,posy+11,posx+9,posy+11);
end;

procedure on;
begin
     setcolor(lightgreen);
{     setrgbpalette(lightgreen,0,60,0);}
end;

procedure off;
begin
     setcolor(green);
{     setrgbpalette(green,0,20,0);       }
end;

procedure shownumber(x:string);

begin
     if x = '0' then
     begin
          on;
          section1;
          section2;
          section3;
          section4;
          section5;
          section6;
          off;
          section7;
     end;
     if x = '1' then
     begin
          off;
          section1;
          on;
          section2;
          off;
          section3;
          on;
          section4;
          off;
          section5;
          section6;
          section7;

     end;
     if x = '2' then
     begin
          off;
          section1;
          on;
          section2;
          section3;
          off;
          section4;
          on;
          section5;
          section6;
          section7;
     end;
     if x = '3' then
     begin
          off;
          section1;
          on;
          section2;
          off;
          section3;
          on;
          section4;
          section5;
          section6;
          section7;

     end;
     if x = '4' then
     begin
          on;
          section1;
          section2;
          off;
          section3;
          on;
          section4;
          off;
          section5;
          section6;
          on;
          section7;
     end;
     if x = '5' then
     begin
          on;
          section1;
          off;
          section2;
          section3;
          on;
          section4;
          section5;
          section6;
          section7;
     end;
     if x = '6' then
     begin
          on;
          section1;
          off;
          section2;
          on;
          section3;
          section4;
          section5;
          section6;
          section7;
     end;
     if x = '7' then
     begin
          off;
          section1;
          on;
          section2;
          off;
          section3;
          on;
          section4;
          section5;
          off;
          section6;
          section7;
     end;
     if x = '8' then
     begin
          on;
          section1;
          section2;
          section3;
          section4;
          section5;
          section6;
          section7;
     end;
     if x = '9' then
     begin
          on;
          section1;
          section2;
          off;
          section3;
          on;
          section4;
          section5;
          section6;
          section7;
     end;
end;

procedure setup;

var
   loop : integer;

begin
     for loop := 1 to 2 do
     begin
          posx := px+loop*20;
          posy := y;
          no1 := copy(numbers,loop,loop);
          shownumber(no1);
     end;
end;

begin
     setcolor(lightgreen);
     setrgbpalette(lightgreen,0,60,0);
     setcolor(green);
     setrgbpalette(green,0,20,0);
     setup;
end;
end.