#!/usr/bin/perl
## MAIN ROUTINE #######################
Setup();
Main();
#######################################
sub Main {
#######################################
        GetInfo();
        GetWeb();
        SetBase();
        CookieStuff();
        CheckBasket();
        CheckProduct();
        WriteBasket();
        OpenBasket();
        if ($FORM{CHECKOUT} eq "Y") {Translate($htmlcheckout)} else {Translate($html)};
        OutPut();
        exit 0;
}
exit 1;
#######################################
sub Setup {
#######################################
        $mailprog = '/usr/sbin/sendmail';
        $date_command = "/bin/date";
        $date = `$date_command +"%A, %B %d, %Y at %T (%Z)"`; chop($date);
        $time = `$date_command +"%T"`; chop($time); 
        $shortdate = `$date_command +"%D"`; chop($shortdate);
        $FORM{UNIXDATE} = $date;
}
#######################################
sub GetInfo {
#######################################
        $basketout = "";
        $fbItem = "";
        $fpItem = "";
        $unqnumber = $shortdate.$time;
        $unqnumber =~ s/\:|\///g;
        $servername = $ENV{'SERVER_NAME'};
        $servername =~ s/\.|www|com|net//g;
        $remaddr=$ENV{'REMOTE_ADDR'};
        $remaddr =~ s/\.//g;
}
######################################
sub GetWeb {
######################################
        if ($ENV{'QUERY_STRING'}) {
                $buffer = $ENV{'QUERY_STRING'};
                WebInputArray();
        }
        if ($ENV{'CONTENT_LENGTH'}) {
                read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
                WebInputArray();
        }
}
######################################
sub WebInputArray {
######################################
        @pairs = split(/&/, $buffer);
        foreach $pair (@pairs) {
                ($name, $value) = split(/=/, $pair);
                $value =~ tr/+/ /;
                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                $value =~ s/<!--(.|\n)*-->//g;
                $value =~ s/<([^>]|\n)*>//g;
                $FORM{$name} = $value;
        };
}
#######################################
sub SetBase {
#######################################
        $basePATH = "$ENV{'DOCUMENT_ROOT'}/shopbasket/";
        $baseBASKET = $basePATH."baskets/";
        $basePRODUCT = $basePATH."products/products.txt";
        $baseTEMPLATE = $basePATH."templates/";
        $html = $baseTEMPLATE."basket.html";
        $htmlcheckout = $baseTEMPLATE."checkout.html";
}
#######################################
sub CookieStuff {
#######################################
        if ($ENV{'HTTP_COOKIE'}) {
                @pairs = split(/; /, $ENV{'HTTP_COOKIE'});
                foreach $pair (@pairs) {
                        ($name, $value) = split(/=/, $pair);
                        $COOKIE{$name} = $value;
                }
        }
        if ($FORM{clear} ne "Y" && $COOKIE{BASKET}) {
                $cookie = "BASKET=$COOKIE{BASKET}";
                $tempbasket = "$baseBASKET$COOKIE{BASKET}";
        }
        else {
                $cookie = "BASKET=$remaddr$unqnumber";
                $tempbasket = "$baseBASKET$remaddr$unqnumber";
        }
}
#######################################
sub CheckBasket {
#######################################
        if (-e $tempbasket) {
        chmod (0775, $tempbasket);
        open (BASKET, "$tempbasket");
        while (<BASKET>) {
                ($bQty, $bItem, $bName, $bstyle, $bDiscription, $bcolor, $bsize, $bCost) = split(/\|/);
                if ("$bItem$bstyle$bcolor$bsize" eq "$FORM{item}$FORM{style}$FORM{color}$FORM{size}") {
                        if ($FORM{QTY}) {
                        $bQty += $FORM{QTY}
                        }
                        else {
                        $bQty = ($FORM{DEL} eq "Y") ? $bQty-1 : $bQty+1;
                        }
                        $fbItem ="$bQty|$bItem|$bName|$bstyle|$bDiscription|$bcolor|$bsize|$bCost|\n";
                        if ($bQty ne "0") {
                                $basketout = $fbItem.$basketout;
                        }
                }
                else {
                $basketout .= $_;
                }
        }
        close BASKET;
        }
}
#######################################
sub CheckProduct {
#######################################
        if ($fbItem eq "") {
        open (PRODUCT,"$basePRODUCT");
        while (<PRODUCT>) {
                ($pItem, $pName, $pDiscription, $pCost) = split(/\|/);
                if ($pItem eq "$FORM{item}") {
                        if ($FORM{QTY}) {
                        $pQty = $FORM{QTY}
                        }
                        else {
                        $pQty = 1
                        }
                        $fpItem = "$pQty|$pItem|$pName|$FORM{style}|$pDiscription|$FORM{color}|$FORM{size}|$pCost|\n";
                        $basketout = $fpItem.$basketout;
                }
        }
        close PRODUCT;
        }
}
#######################################
sub WriteBasket {
#######################################
        chmod (0775, $tempbasket);
        open (TEMP, ">$tempbasket");
        print TEMP $basketout;
        close TEMP;
        $FORM{basketout} = "<INPUT TYPE=\"hidden\" NAME=\"basketout\" VALUE=\"$basketout\">";
}
#######################################
sub OpenBasket {
#######################################
open (BASKET, "$tempbasket");

        while (<BASKET>) {
        ($bQty, $bItem, $bName, $bstyle, $bDiscription, $bcolor, $bsize, $bCost) = split(/\|/);
        $Cost = sprintf("%.2f", $bCost * $bQty);
#--------------------------------------
        $FORM{baskethtml} .= <<CELL;
<TR><TD ALIGN="CENTER">
<A HREF="http://$ENV{'SERVER_NAME'}/cgi-bin/shopper.pl?item=$bItem&color=$bcolor&style=$bstyle&size=$bsize">+</A> / 
<A HREF="http://$ENV{'SERVER_NAME'}/cgi-bin/shopper.pl?item=$bItem&color=$bcolor&style=$bstyle&size=$bsize&DEL=Y">_ </A></TD>
<TD ALIGN="CENTER">$bQty</TD>
<TD>$bName - $bstyle $bDiscription $bcolor $bsize</TD>
<TD ALIGN="RIGHT">\$$Cost</TD></TR>
CELL
#--------------------------------------
        $FORM{baskethtmlsans} .= <<CELLSANS;
<TR><TD ALIGN="CENTER"></TD>
<TD ALIGN="CENTER">$bQty</TD>
<TD>$bName - $bstyle $bDiscription $bcolor $bsize</TD>
<TD ALIGN="RIGHT">\$$Cost</TD></TR>
CELLSANS
#--------------------------------------
        $checkouthtml .= "[$bQty] - $bName, $bstyle $bDiscription | $Cost\n";
        $FORM{baskettotal} = sprintf ("%.2f", $FORM{baskettotal} += $Cost);
        }
#--------------------------------------
$FORM{checkouthtml} = <<CHECKOUTHTML;
<INPUT TYPE="hidden" NAME="servername" VALUE="$servername">
<INPUT TYPE="hidden" NAME="items" VALUE="$checkouthtml">
<INPUT TYPE="hidden" NAME="baskettotal" VALUE="$FORM{baskettotal}">
CHECKOUTHTML
#--------------------------------------
close BASKET;
}
#######################################
sub Translate {
######################################
        local $/;
        my ($file) = @_;
        open (TRANS,$file);
        $buffer = <TRANS>;
        close TRANS;
        $buffer =~ s/<!--#(\w+)\s*-->/$FORM{$1} || ""/ge;
}
#######################################
sub OutPut {
#######################################
        print "Content-type: text/html\n";
#       print "Set-Cookie: $cookie\n" unless $cookie;
        print "Set-Cookie: $cookie\n";
        print "\n";
        if ($FORM{DEBUG} eq "Y") {DebugOutPut()} else {print "$buffer\n"};
}
#######################################
sub DebugOutPut {
#######################################
        print "<HR>ENV<BR>\n";
        while (($key, $value) = each (%ENV)) {
                print "$key =|<B>$value</B><BR>\n"
        }
        print "<HR>COOKIE<BR>\n";
        while (($key, $value) = each (%COOKIE)) {
                print "$key =|<B>$value</B><BR>\n"
        }
        print "<HR>FORM<BR>\n";
        while (($key, $value) = each (%FORM)) {
                print "$key =|<B>$value</B><BR>\n"
        }
print "<HR>STRINGS<BR>\n";
print "remaddr =|$remaddr<BR>\n";
print "unqnumber =|$unqnumber<BR>\n";
print "basePATH =|$basePATH<BR>\n";
print "html =|$html<BR>\n";
print "htmlcheckout =|$htmlcheckout<BR>\n";
print "cell_1 =|$cell_1<BR>\n";
print "fbItem =|$fbItem<BR>\n";
print "fpItem =|$fpItem<BR>\n";
print "basketout =|$basketout<BR>\n";
print "tempbasket =|$tempbasket<BR>\n";
print "servername =|$servername<BR>\n";
print "cookie =|$cookie<BR>\n";
print "<HR>BUFFER<BR>\n";
print "buffer =|$buffer<BR>\n";
}
#######################################

