#/usr/local/bin/perl
#
# A very simple gopher client in Perl 4.036
#
require "chat2.pl";
require "win.pl";

$args = "gocamel feenix.metronet.com 70 1/perlinfo";
$pager = "/usr/local/bin/less";
$mailer = "/usr/local/bin/mush -h";
$title ="                      GOCAMEL: A perl script delivery tool",
$footer =
"Enter Item Number or :  f - forward page  b - back page  q - quit  u - up";

($junk, $host, $port, $path) = split(' ',$args);
# get initial menu , start recursion
&get_selection($host,$path,$port,$title,$footer);
print "\e"."["."2"."J";    # clean up
print "\e"."["."0"."m";    # restore good mode
##############################################################################

sub send_request{
 local($path, $port,$host) = @_;
 local($line,$i) = (1,0);
 local(@page);
 $timeout = 2;
 local($N) = &chat'open_port($host,$port);
 if(!defined $N){ die "open control: $!";}
 &chat'print($N,"$path\r\n");
 while(1){                 #While receiving data
  $line = &chat'expect($N, $timeout, '^(.*)\r?\n', '"$1"' );
  last if ($line =~ /^[\.]/);
  $page[$i++] = $line;
 }
&chat'close($N);
@page;
}

sub get_selection{
local($host,$path,$port,$title,$footer) = @_;
local($line,$selection,$i,$j,$b,$cur,@A,@types,@text,@paths,@hosts,@ports);
local(@cur_types,@cur_text,@cur_paths,@cur_hosts,@cur_ports,@tmpfile);
local(@win1)=(0,21,79,1,0,7,$title,$footer);
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);

local(@buffer) = &send_request($path, $port, $host);
foreach $b (@buffer){
  if($j==19){$j=0;$i++;}
  @A = split(/\t/,$b);
  $A[0] =~  s/^[0-9]// && ( $types[$i] = $1);
  $types[$i].=" #"; $text[$i].=($j+1)."> "."$A[0]#";
  $paths[$i].="$A[1]#"; $hosts[$i].="$A[2]#";$ports[$i].="$A[3]#";
  $j++;
}
while($j<19){
  $types[$i].=" #"; $text[$i].=" #";
  $paths[$i].=" #"; $hosts[$i].=" #";$ports[$i].=" #";
  $j++;
}
$cur=0;
while($selection ne "q"){
 @cur_text = split(/#/,$text[$cur]);
 &win'refresh(scalar(@cur_text),@cur_text,scalar(@win1),@win1);
 chop($selection=&win'getdata(10,23,"Enter Your Selection    > ",7));
 if( $selection =~ /^[fF]/){
   if($cur < $i) {$cur++;next;}
 }
 elsif ($selection =~ /^[bB]/){
   if($cur > 0) {$cur--;next;}
 }
 elsif ($selection =~ /^[uU]/){
   return;
 }
 elsif (($selection < 20) && ($selection > 0)){
  $selection--;
  @cur_hosts=split(/#/,$hosts[$cur]); @cur_paths=split(/#/,$paths[$cur]);
  @cur_ports=split(/#/,$ports[$cur]); @cur_types=split(/#/,$types[$cur]);
  if(($cur_paths[$selection] =~ /^1/) || ($cur_paths[$selection] =~ /^ftp/)){
    &get_selection($cur_hosts[$selection],$cur_paths[$selection],
    $cur_ports[$selection],$cur_text[$selection],$footer);
    print "\e"."["."2"."J";
    &win'title(@win1);
    &win'footer(@win1);
    next;
  }
  elsif($cur_paths[$selection] =~ /^7/){
    chop($keyword =&win'getdata(10,23,"Keyword to search for?    > ",7));
    if(length($keyword) < 1){
      &win'getdata(10,23,"Bad Keyword, hit Return > ",7);
      next;
    }
    &get_selection($cur_hosts[$selection],$cur_paths[$selection]."\t".$keyword,
    $cur_ports[$selection],$cur_text[$selection],$footer);
    print "\e"."["."2"."J";
    &win'title(@win1);
    &win'footer(@win1);
    next;
  }
  elsif($cur_types[$selection] == 0 || $cur_paths[$selection] =~ /^.*0\//){
    $cur_paths =~ s#^.*/##;
    @tmpfile = &send_request($cur_paths[$selection], $cur_ports[$selection],
                           $cur_hosts[$selection]);
    open(LOOKATME,">/tmp/gocam$$")||die "couldnt open that file, dude(ette)";
    foreach $line (@tmpfile){
     print LOOKATME $line;
     print LOOKATME "\n";
    }
    close LOOKATME;
    system "clear";
    system "$pager /tmp/gocam$$";
    print "\e"."["."2"."J";
    chop($keyword =&win'getdata(10,23,
         "s to save, m to mail, or anything else to continue   > ",7));
    if($keyword eq "m"){
      system "$mailer /tmp/gocam$$";
      system "rm -f /tmp/gocam$$";
      print "\e"."["."2"."J";
      &win'title(@win1);
      &win'footer(@win1);
      next;}
    elsif($keyword eq "s"){
     print "\e"."["."2"."J";
     chop($keyword =&win'getdata(11,23,
          "Enter name of file to save to   > ",7));
     if (length($keyword)<2){print "error there, bud"; next;}
     system "mv /tmp/gocam$$ $ENV{'HOME'}/$keyword";
     &win'title(@win1);
     &win'footer(@win1);
     next;
    }
    else{
     system "rm -f /tmp/gocam$$";
     print "\e"."["."2"."J";
     &win'title(@win1);
     &win'footer(@win1);
     next;
    }
  }
 else{print" Not implemented, sorry bout that"; next;}
 }
 else{next;}
}
print "\e"."["."2"."J";
exit 0;
}