#!/usr/bin/perl

require "../cgi-lib.pl";
ReadParse(*params);
$setdir = "/home/dave/public_html/cgi/flashdir";
$set = $params{set};
$set =~ s/\s+/_/g;
$set =~ s/\W+//g;
%vals = read_vals($set);
if($params{action} eq "edit" && $set) {
    %vals = ();
    foreach $pkey (sort (keys %params)) {
	next unless($pkey =~ /^key_(.+)$/);
	$key = $1;
	next if($params{"del_$key"});
	$vals{$params{"key_$key"}} = $params{"val_$key"};
    }
    foreach $pkey (sort (keys %params)) {
	next unless($pkey =~ /^newkey_(.+)$/);
	$key = $1;
	next unless($params{"newkey_$key"} =~ /\S/);
	$vals{$params{"newkey_$key"}} = $params{"newval_$key"};
    }
    write_vals($set,\%vals);
}
@keys = sort (keys %vals);

#cookie for answers
@cookies = split(/; /,$ENV{HTTP_COOKIE});
foreach (@cookies) {
    my($c,$v) = split(/=/,$_,2);
    $cook{$c} = $v;
}
if(length($cook{"FLASH_$set"}) == 2*(scalar (keys %vals))) {
    #ok!
    my($new) = '';
    for($i=0;$i<@keys;$i++) {
	my $correct = substr $cook{"FLASH_$set"},($i*2),1;
	my $wrong = substr $cook{"FLASH_$set"},($i*2+1),1;
	if($params{scorekey} eq $keys[$i]) {
	    if($params{score} =~ /(right|correct)/i) {
		$correct++;
		if($correct > 9) { $correct = 9; }
	    } elsif($params{score} =~ /\S/) {
		$wrong++;
		if($wrong > 9) { $wrong = 9; }
	    }
	}
	$new .= "$correct$wrong";
	$score{$keys[$i]}{correct} = $correct;
	$score{$keys[$i]}{wrong} = $wrong;
    }
    print "Set-Cookie: FLASH_$set=$new; path=\/;\n";
} else {
    #reset them!
    print "Set-Cookie: FLASH_$set=".('00'x(scalar (keys %vals)))."; path=\/;\n";
}

print "Content-Type: text/html\n\n";

if($params{page} eq "test" && $set && !$params{goback}) {
    foreach $key (keys %vals) {
	push @choices,$key;
	for($i=0;$i<=$score{$key}{wrong};$i++) {
	    push @choices,$key;
	}
    }
    $index = int rand(scalar @choices);
    #print "Chose $index out of $#choices<br>\n";
    $newkey = $choices[$index];
    $korv = int rand(2);
    print "<form method=post>\n";
    print "<input type=hidden name=page value=test>\n";
    print "<input type=hidden name=set value=\"$params{set}\">\n";
    print "<input type=hidden name=key value=\"$newkey\">\n";
    print "<table border=1 cellpadding=1>\n";
    if($params{key}) {
	print "<input type=hidden name=scorekey value=\"$params{key}\">\n";
	print "<tr><th colspan=2 bgcolor=#AAAAFF>Previous Card:</td></tr>\n";
	print "<tr><td>Answered Correctly: $score{$params{key}}{correct}</td>\n";
	print "<td>Answered Wrong: $score{$params{key}}{wrong}</td></tr>\n";
	print "<tr><th>Word / Phrase</th><th>Description</th></tr>\n";
	print "<tr><td>$params{key}</td><td>$vals{$params{key}}</td></tr>\n";
	if($params{answer}) {
	    print "<tr><th colspan=2>You Said:</td></tr>\n";
	    print "<tr><td>";
	    if($params{korv} eq "K") {
		print "&nbsp;</td><td>$params{answer}";
	    } else {
		print "$params{answer}</td><td>&nbsp;";
	    }
	    print "</td></tr>\n";
	}
    }
    print "<tr><th colspan=2 bgcolor=#AAAAFF>Next Card:</th></tr>\n";
    print "<tr><td>Answered Correctly: $score{$newkey}{correct}</td>\n";
    print "<td>Answered Wrong: $score{$newkey}{wrong}</td></tr>\n";
    print "<tr><th>Word / Phrase</th><th>Description</th></tr>\n";
    print "<tr><td>";
    if($korv) {
	print "<input type=hidden name=korv value=\"K\">\n";
	print "$newkey</td><td>\n";
	print "<input type=text name=answer value=\"\">\n";
    } else {
	print "<input type=hidden name=korv value=\"V\">\n";
	print "<input type=text name=answer value=\"\">\n";
	print "</td><td>$vals{$newkey}\n";
    }
    print "</td></tr>\n";
    print "<tr><td colspan=2 align=center>\n";
    print "<input type=submit name=goback value=\"Back\">\n";
    if($params{key}) {
	print "<input type=submit name=score value=\"Wrong! Next &gt;\">";
	print "<input type=submit name=score value=\"Correct! Next &gt;\">";
    }
    print "<input type=submit name=next value=\"Next Card &gt;\">\n";
    print "</table>\n";
    print "</form>\n";

    foreach (keys %score) {
	$totalright+=$score{$_}{correct};
	$totalwrong+=$score{$_}{wrong};
    }
    print "<br>(Total for this set: $totalright / ".($totalright+$totalwrong).")<br>\n";
    if($params{debug}) {
	print "<table border=1>\n";
	print "<tr><td>Word</td><td>Correct</td><td>Wrong</td></tr>\n";
	foreach (keys %score) {
	    print "<tr><td>$_</td><td>$score{$_}{correct}</td><td>$score{$_}{wrong}</td></tr>\n";
	}
	print "</table>\n";
    }

} elsif($params{page} eq "edit" && $set && !$params{goback}) {
    print "Editing <b>$set</b> Flashcards<br>\n";
    print "<form method=POST>\n";
    print "<input type=hidden name=page value=edit>\n";
    print "<input type=hidden name=set value=\"$set\">\n";
    print "<input type=hidden name=action value=\"edit\">\n";
    print "<table>\n";

    print "<tr><td colspan=3>Add a new card to this set:</td></tr>\n";
    print "<tr><td>\n";
    print "<input type=text name=\"newkey_1\" value=\"\">\n";
    print "</td><td>\n";
    print "<input type=text size=40 name=\"newval_1\" value=\"\">\n";
    print "</td><td>&nbsp;\n";
    print "</td></tr>\n";

    print "<tr><td colspan=3>Cards Already in this set:</td></tr>\n";
    print "<tr><th>Word / Phrase</th>\n";
    print "<th>Description</th>\n";
    print "<th>Delete?</th></tr>\n";

    foreach $key (keys %vals) {
	$pkey = $key;
	$pkey =~ s/\s+//g;
	$pkey =~ s/\W+//g;
	print "<tr><td>\n";
	print "<input type=text name=\"key_$pkey\" value=\"$key\">\n";
	print "</td><td>\n";
	print "<input type=text size=40 name=\"val_$pkey\" value=\"$vals{$key}\">\n";
	print "</td><td align=center>\n";
	print "<input type=checkbox name=\"del_$pkey\" value=\"1\">\n";
	print "</td></tr>\n";
    }
    print "<tr><td colspan=3 align=center>\n";
    print "<input type=submit value=\"Submit\">\n";
    print "<input type=submit name=goback value=\"Submit and Go Back\">\n";
    print "</td></tr>\n";
    print "</table>\n";
    print "</form>\n";
} else {
    print "<B>Flash Cards!</B><br>\n";
    print "<br>\n";
    @sets = get_sets();
    print "There are currently ".scalar(@sets)." sets of flash cards:<br><br>\n";
    print "<table border=1 cellpadding=2>\n";
    print "<tr><th>Set Name</th>\n";
    print "<td>&nbsp;</td>\n";
    print "<td>&nbsp;</td></tr>\n";
    foreach $set (@sets) {
	print "<tr><td>$set</td>";
	print "<td><a href=\"$ENV{SCRIPT_NAME}?page=test&set=$set\">Test me on these!</a></td>\n";
	print "<td><a href=\"$ENV{SCRIPT_NAME}?page=edit&set=$set\">Edit this set of cards</a></td>\n";
	print "</tr>\n";
    }
    print "</table>\n";
    print "<form method=post><input type=hidden name=page value=\"edit\">\n";
    print "Create a new set of flash cards, called:<br>\n";
    print "<input type=text name=set value=\"\">\n";
    print "<input type=submit value=\"Create\">\n";
    print "</form>\n";
}

sub get_sets {
    opendir(DIR,$setdir);
    my(@files) = readdir(DIR);
    my(@sets);
    foreach (@files) {
	push @sets,$_ unless(/^\.\.?$/);
    }
    return @sets;
}

sub read_vals {
    my($set) = @_;
    my(%ret);
    $set =~ s/\s+/_/g;
    $set =~ s/\W+//g;
    if(open(FILE,"$setdir/$set")) {
	while(<FILE>) {
	    s/\\n/\n/g;
	    s/\\\\/\\/g;
	    if(/^([^\t]*)\t([^\t]*)$/) {
		my($key,$val) = ($1,$2);
		$key =~ s/\\t/\t/g;
		$val =~ s/\\t/\t/g;
		$ret{$key} = $val;
	    }
	}
	close FILE;
    }
    return %ret;
}

sub write_vals {
    #print "Content-Type: text/html\n\n";
    my($set,$vals) = @_;
    $set =~ s/\s+/_/g;
    $set =~ s/\W+//g;
    if(open(FILE,"> $setdir/$set")) {
	#print "File $setdir/$set opened ok\n";
	foreach (keys %{$vals}) {
	    my($key,$val) = ($_,$vals->{$_});
	    $key =~ s/\\/\\\\/g;
	    $key =~ s/\n/\\n/g;
	    $key =~ s/\t/\\t/g;
	    $val =~ s/\\/\\\\/g;
	    $val =~ s/\n/\\n/g;
	    $val =~ s/\t/\\t/g;
	    print FILE "$key\t$val\n";
	}
	close FILE;
    } else {
	#print "File $setdir/$set not opened!!!\n";
    }
}
