#!/usr/bin/perl
#Time-stamp: "2000-12-30 22:35:25 MST"
require 5;
use strict;

my $map = <<'EOMAP'; # I found this in an ASCII art archive.  Artist unknown.
               ,_   .  ._. _.  .
           , _-\','|~\~      ~/     gg-'_   _-'     ,;_;_,    ~~-
  /~~-\_/-'~'--' \~~| ',    ,'  ff  /  / ~|-_\_/~/~      ~~--~~~~'--_
  /              ,/'-/~ '\ ,' _  , '|,'|                    ._/-, /~
  ~/-'~\_,       '-,| '|. '   ~  ,\ /'~                /    /_  /~
.-~      '|        '',\~|\       _\~     ,_  ,               /|
          '\      dd/'~          |_/~\\,-,~  \ "         ,_,/ |
           |aa  cc /            ._-~'\_ _~|              \ ) jj
            \ bb__-\           '/      ~ |\  \_          /  ~
  .,         '\ |,  ~-_      - |          \\_' ~|  /\  \~ ,
               ~-_'  _;       '\           '-,   \,' /\/  |
                 '\_,~'\_       \_ _,       /'    '  |, /|'
                   /     \_       ~ |      /         \  ~'; -,_.
                   |       ~\        |    |  ,        '-_, ,; ~ ~\
                    \,      /        \    / /|            ,-, ,   -,
                     |    ,/          |  |' |/          ,-   ~ \   '.
                    ,|   ,/           \ ,/              \mm   kk|
                    /    |             ~                 -~~-, /   _
                    |  ,-'                                    ~    /
                    ',|  ~                                         ll
                      ~'
EOMAP
 
my %tz = (
	'll' => [ 13, 12 ], # don't bother with DST
	'kk' => [ 11, 11 ], # don't bother with DST
	'gg' => 2,
	'mm' => 8,
	'jj' => 9,
	'ff' => 0,
	'dd' => -5,
	'cc' => -6,
	'bb' => -7,
	'aa' => -8,
       )
;
chomp $map;
my @map = split m/([a-z]{2})/, $map;
my $code;

my $m;

my $b_on  = "\x1b\x5b\x37\x6d";         # tput rev
my $b_off = "\x1b\x5b\x6d\x00";         # tput sgr0
my $clear = "\x1B\x5B\x48\x1B\x5B\x4a"; # tput clear
$code = "sub print_map { print '$clear',\n";
for(my $i = 0; $i < @map; ++$i) {
  if(($m = $map[$i]) =~ m<^[a-z]{2}$>s) {
    die "Unknown tag $m in map" unless defined $tz{$m};
    if(ref $tz{$m}) {
      $code .=  "sprintf('$b_on%02d$b_off', (\$h + 24 + " . (
	($tz{$m}[1] == $tz{$m}[0])
	 ? $tz{$m}[1]
	 : "(\$dst ?  $tz{$m}[1] : $tz{$m}[0])"
        ) . ") % 24), \n"
      ;
    } else {
      $code .=  "sprintf('$b_on%02d$b_off', (24 + $tz{$m} + \$dst + \$h)%24), \n";
    }
  } else {
    $code .= '$map[' . $i . "],\n";
  }
}

$code .= 'sprintf("       $b_on %02d:%02d $b_off\n", $h, $m)}';
#print $code;

my($h, $m, $s, $dst);
eval $code;
$@ and die $@;

$|++;

while(1) {
  ($h,$m,$s) = (gmtime)[2,1,0];
  $dst = (localtime)[8] ? 1 : 0;
  print_map();
  sleep((60 - $s) || 60);
}
