#!/usr/bin/perl
# electric sheep - a collaborative screensaver
# Copyright (C) 1999-2007  Scott Draves


require "global.pl";

use CGI;

$query = CGI::new();

$page = $query->param("p");

$gen = 247;

if (!defined($page)) {
    $page =  0;
}
$next = $page + 1;

normal_header($query, "flock $gen");

$menu = $query->param("menu");
if (! (defined $menu)) {
    $menu = "best";
}

print mk_menu($menu, "menu", "best.cgi?p=$page",
	      ( admin_privs($query) ? ["hifi", "hifi"] : ()),
	      ( admin_privs($query) ? ["edges", "edges"] : ()),
	      ["best", "best"], ["tree", "tree"],
	      ["time", "time"], ["designer", "designer"],
	      ["thumbs", "thumbs"] );

print "<p>";

if ($menu eq "best") {

    if ($page == 0) {
	$file = "best-ever/index.html";
    } else {
	$file = "best-ever/$page.html";
    }
    $prev = $page - 1;

    $mtime = localtime((stat($file))[9]);

    print "archives sorted by peak rating (updated $mtime)<p>";

    $last_page = 1;
    while (-e "best-ever/$last_page.html") {
	$last_page++;
    }
    $last_page--;

    $nav = "<a href=best.cgi?menu=$menu&p=0>first</a>\n";
    if ($prev > 0) {
	$nav .= "<a href=best.cgi?menu=$menu&p=$prev>previous</a>\n";
    }
    if ($next <= $last_page) {
	$nav .= "<a href=best.cgi?menu=$menu&p=$next>next</a>\n";
    }
    $nav .= "<a href=best.cgi?menu=$menu&p=$last_page>last</a><p>\n";
    print $nav;

    $tab = read_whole_file($file);
    $tab =~ s#\.\./##g;
    $tab =~ s#href=#href=dead.cgi?id=#g;
    print $tab;

    print $nav;

} elsif ($menu eq "thumbs") {
    $map = read_whole_file("../gen/minithumbs/0.map");
    print $map;
    print "<img src=../gen/minithumbs/0.jpg border=0 usemap=\"#minithumbmap\"><p>\n";
} elsif ($menu eq "designer") {
    if ($page == 0) {
	$file = "designers/index.html";
	$mtime = localtime((stat($file))[9]);
	print "genetic designers sorted by total rating<br>updated $mtime<p>";
	$tab = read_whole_file($file);
    } else {
	$file = "designers/$page.html";
	$tab = read_whole_file($file);
	$tab =~ s#src=../gen/244/#src=#g;
	$tab =~ s#node#dead.cgi#g;
    }
    print $tab;
} elsif ($menu eq "time") {

    # this is expensive should precompute like best?

    $prev = $page - 1;

    $paging = "";
    if ($prev >= 0) {
	$paging = "<a href=best.cgi?menu=time&p=0>first</a>\n";
    }
    if ($prev > 0) {
	$paging = $paging . "<a href=best.cgi?menu=time&p=$prev>previous</a>\n";
    }
    $paging = $paging . "<a href=best.cgi?menu=time&p=$next>next</a>\n";

    print $paging;


    print "<table class=tab cellpadding=8>\n";
    
    $col = 0;
    for ($i = 0; $i < $by_time_sheep_per_page; $i++) {
	$id = $by_time_sheep_per_page * $page + $i;
	$anim_dir = "../gen/$gen/$id";
	$astate_file = "$anim_dir/memory";
	if (-e $astate_file && -e "$anim_dir/icon.jpg") {
	    dbmopen(%ANIM_STATE, $astate_file, 0644) or die "Couldn't dbmopen $astate_file: $!\n";
	    if (ishidef() && !admin_privs($query)) {
		next;
	    }
	    if ($ANIM_STATE{'first'} eq $ANIM_STATE{'last'}) {
		$icon = "<a href=dead.cgi?id=$id><img $icon_tags src=../gen/$gen/$id/icon.jpg></a>";
		if ($col == 0) {
		    print "<tr>";
		}
		print "<td>$icon</td>";
		if ($col++ == 7) {
		    $col = 0;
		    print "</tr>\n";
		}
	    }
	    dbmclose(%ANIM_STATE);
	}
    }
    if ($col != 0) {
	print "</tr>\n";
    }
    print "</table>$paging\n";

} elsif ($menu eq "hifi") {

  $style = "icons";
  hidef_open();
  my @ids = all_hidef_ids();
  print "<table>";
  $nloops = 0;
  foreach $i (@ids) {
      if ($i < $hidef_requeue_limit) {
	  next;
      }
      ($first, $last) = split /:/, $HIDEF_STATE{$i};
      if ($first eq $last) {
	  if ($col == 0) {
	      print "<tr>";
	  }
	  $nloops++;
	  if ($style eq "faces") {
	      $colmax = 3;
	      $f = "$i/face.jpg";
	      if (!(-e $f)) {
		  $f = "../html/anon-icon.jpg";
	      }
	      print "<td><a href=dead.cgi?id=$i><img border=0 src=$f></a></td>";			
	  } else {
	      $colmax = 7;

	      $f = "$i/icon.jpg";
	      if (!(-e $f)) {
		  $f = "../html/anon-icon.jpg";
	      }
	      print "<td><a href=dead.cgi?id=$i><img $icon_tags src=$f></a></td>";
	  }
	  if ($col++ == $colmax) {
	      $col = 0;
	      print "</tr>\n";
	  }
      }
  }
  print "</table>\n";
  print "$nloops total loops";
  hidef_close();

} elsif ($menu eq "tree") {
    $file = "../gen/$gen/family_tree$page.jpg";
    $mtime = localtime((stat($file))[9]);
    $first = $page * $family_tree_sheep_per_page;
    $last = $first + $family_tree_sheep_per_page - 1;
    $prev = $page - 1;

    # would do this but STATE is not open
    # my ($last_id) = $STATE{'sequence'};
    # $last_page = int($last_id / $family_tree_sheep_per_page);

    $last_page = 1;
    while (-e "../gen/$gen/family_tree$last_page.jpg") {
	$last_page++;
    }
    $last_page--;
    
    print "combined family tree, sheep $first to $last (updated $mtime)<p>\n";

    $nav = "<a href=best.cgi?menu=tree&p=0>first</a>\n";
    
    if ($prev > 0) {
	$nav .= "<a href=best.cgi?menu=tree&p=$prev>previous</a>\n";
    }
    if ($next <= $last_page) {
	$nav .= "<a href=best.cgi?menu=tree&p=$next>next</a>\n";
    }
    $nav .= "<a href=best.cgi?menu=tree&p=$last_page>last</a><p>\n";

    print $nav;
    
    $map = read_whole_file("../gen/$gen/family_tree$page.map");
    print $map;
    print "<img src=$file border=0 usemap=\"#treemap\"><p>\n";

    print $nav;


} else {
    print "edges";
}

normal_footer($query, $license_mixed);
