#!/usr/bin/nesla
# poker sample prog by Dan Cahill
include("_cards.nes");
include("_ajax.nes");

function getcard() {
        do {
                x=math.rand(52);
        } while (CARDS[x].dealt!=null);
        CARDS[x].dealt=true;
        return x;
}

function regcard(p) {
        if (p==null) return null;
        x=tonumber(p);
        CARDS[x].dealt=true;
        return x;
}

function showscore(r) {
        hand_vals = {
                { name="NONE",            val=0   },
                { name="JACKS OR HIGHER", val=1   },
                { name="2 PAIRS",         val=2   },
                { name="3 OF A KIND",     val=3   },
                { name="STRAIGHT",        val=5   },
                { name="FLUSH",           val=7   },
                { name="FULL HOUSE",      val=10  },
                { name="4 OF A KIND",     val=40  },
                { name="STR FLUSH",       val=100 },
                { name="ROYAL FLUSH",     val=500 }
        };
        print("<TABLE BORDER=1 CELLPADDING=2 CELLSPACING=0 WIDTH=400>\n");
        print("<TR ID=row9"); if (r==9) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>ROYAL FLUSH     </TD><TD ALIGN=right>", hand_vals[9].val, "</TD></TR>\n");
        print("<TR ID=row8"); if (r==8) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>STRAIGHT FLUSH  </TD><TD ALIGN=right>", hand_vals[8].val, "</TD></TR>\n");
        print("<TR ID=row7"); if (r==7) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>FOUR OF A KIND  </TD><TD ALIGN=right>", hand_vals[7].val, "</TD></TR>\n");
        print("<TR ID=row6"); if (r==6) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>FULL HOUSE      </TD><TD ALIGN=right>", hand_vals[6].val, "</TD></TR>\n");
        print("<TR ID=row5"); if (r==5) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>FLUSH           </TD><TD ALIGN=right>", hand_vals[5].val, "</TD></TR>\n");
        print("<TR ID=row4"); if (r==4) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>STRAIGHT        </TD><TD ALIGN=right>", hand_vals[4].val, "</TD></TR>\n");
        print("<TR ID=row3"); if (r==3) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>THREE OF A KIND </TD><TD ALIGN=right>", hand_vals[3].val, "</TD></TR>\n");
        print("<TR ID=row2"); if (r==2) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>TWO PAIRS       </TD><TD ALIGN=right>", hand_vals[2].val, "</TD></TR>\n");
        print("<TR ID=row1"); if (r==1) print(" BGCOLOR=#00FF7F"); print(">");
        print("<TD>JACKS OR HIGHER </TD><TD ALIGN=right>", hand_vals[1].val, "</TD></TR>\n");
        print("</TABLE><BR>\n");
        return;
}

function ratehand() {
        flush    = { };
        kind     = { };
        straight = { };

        for (i=0;i<5;i++) CARDS[c[i]].dealt=true;
//	CHECK FOR ROYAL FLUSH
//	for (n=0;n<4;n++) print("[", CARDS[n+36].dealt==true, CARDS[n+40].dealt==true, CARDS[n+44].dealt==true, CARDS[n+48].dealt==true, CARDS[n+0].dealt==true, "]");
//	for (n=0;n<4;n++) print("[", ((CARDS[n+36].dealt==true)&&(CARDS[n+40].dealt==true)&&(CARDS[n+44].dealt==true)&&(CARDS[n+48].dealt==true)&&(CARDS[n+0].dealt==true)), "]");
        for (n=0;n<4;n++) if ((CARDS[n+36].dealt==true)&&(CARDS[n+40].dealt==true)&&(CARDS[n+44].dealt==true)&&(CARDS[n+48].dealt==true)&&(CARDS[n+0].dealt==true)) return 9;
//#	CHECK FOR STRAIGHT FLUSH
        for (n=0;n<36;n++) if ((CARDS[n+0].dealt==true)&&(CARDS[n+4].dealt==true)&&(CARDS[n+8].dealt==true)&&(CARDS[n+12].dealt==true)&&(CARDS[n+16].dealt==true)) return 8;
//	CHECK FOR 4 OF A KIND
        kind     = { };
        for (n=0;n<5;n++)  kind[math.floor(tonumber(c[n])/4)]++;
        for (n=0;n<13;n++) if (kind[n]==4) return 7;
//	CHECK FOR A FULL HOUSE
        kind     = { };
        pair=0;
        for (n=0;n<5;n++)  kind[math.floor(tonumber(c[n])/4)]++;
        for (n=0;n<13;n++) {
                if (kind[n]==3) global pair=pair+1.5;
                if (kind[n]==2) global pair=pair+1;
        }
        if (pair==2.5) return 6;
//	CHECK FOR A FLUSH
        flush    = { };
        for (n=0;n<13;n++) {
                if (CARDS[n*4+0].dealt==true) flush[0]++;
                if (CARDS[n*4+1].dealt==true) flush[1]++;
                if (CARDS[n*4+2].dealt==true) flush[2]++;
                if (CARDS[n*4+3].dealt==true) flush[3]++;
        }
        for (n=0;n<3;n++) if (flush[n]==5) return 5;
//	CHECK FOR A STRAIGHT
        straight = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
//	straight = { };
        for (n=0;n<5;n++)  straight[math.floor(tonumber(c[n])/4)]=1;
        straight[13]=straight[0];
        for (n=0;n<10;n++) if (straight[n]+straight[n+1]+straight[n+2]+straight[n+3]+straight[n+4]==5) return 4;
//	CHECK FOR 3 OF A KIND
        kind     = { };
        for (n=0;n<5;n++)  kind[math.floor(tonumber(c[n])/4)]++;
        for (n=0;n<13;n++) if (kind[n]==3) return 3;
//	CHECK FOR 2 PAIRS
        global pair=0;
        kind     = { };
        for (n=0;n<5;n++)  kind[math.floor(tonumber(c[n])/4)]++;
        for (n=0;n<13;n++) if (kind[n]==2) global pair=pair+1;
        if (pair==2) return 2;
//	CHECK FOR HIGH PAIR
        kind     = { };
        for (n=0;n<5;n++)  kind[math.floor(tonumber(c[n])/4)]++;
        if ((kind[10]==2)||(kind[11]==2)||(kind[12]==2)||(kind[0]==2)) return 1;
        return 0;
}

function printredraw() {
        print("<SCRIPT LANGUAGE=JavaScript>\n<!--\n");
        print("function redraw(c) {\n");

        print(
                "	r=c.responseXML.documentElement;\n"
//		"	r=c.responseText;\n",
//		"	document.getElementById('remstatus').innerHTML=r;\n",
        );
        for (n=0;n<5;n++) {
                print("	document.game.C",n,".value=r.getElementsByTagName('C",n,"')[0].firstChild.data;\n");
                print("	document.card",n,".src=r.getElementsByTagName('C",n,"F')[0].firstChild.data;\n");
                print("	document.card",n,".alt=r.getElementsByTagName('C",n,"N')[0].firstChild.data;\n");
                print("	document.card",n,".title=r.getElementsByTagName('C",n,"N')[0].firstChild.data;\n");
        }
        print(
                "	rating=r.getElementsByTagName('rating')[0].firstChild.data;\n",
                "	for (var i=1;i<10;i++) {\n",
                "		if (i==rating) {\n",
                "			document.getElementById('row'+i).bgColor='#00FF7F';\n",
                "		} else {\n",
                "			document.getElementById('row'+i).bgColor='#FFFFFF';\n",
                "		}\n",
                "	}\n",
                "}\n"
        );
        print(
                "function toggle(hc) {\n",
                "	if (document.getElementById('H'+hc).value==0) {\n",
                "		document.getElementById('H'+hc).value=1;\n",
                "		document.getElementById('hbut'+hc).bgColor='#00FF7F';\n",
                "	} else {\n",
                "		document.getElementById('H'+hc).value=0;\n",
                "		document.getElementById('hbut'+hc).bgColor='#FFFFFF';\n",
                "	}\n",
                "}\n"
        );
        print("// -->\n</SCRIPT>\n");
        return;
}

function xmlmain() {
        global c = { regcard(_POST['C0']), regcard(_POST['C1']), regcard(_POST['C2']), regcard(_POST['C3']), regcard(_POST['C4']) };
        global held = { 0, 0, 0, 0, 0 };

        if (tonumber(_POST['H0'])) held[0]=1; else c[0]=getcard();
        if (tonumber(_POST['H1'])) held[1]=1; else c[1]=getcard();
        if (tonumber(_POST['H2'])) held[2]=1; else c[2]=getcard();
        if (tonumber(_POST['H3'])) held[3]=1; else c[3]=getcard();
        if (tonumber(_POST['H4'])) held[4]=1; else c[4]=getcard();
//	print("<PRE>");printvar(_GLOBALS);print("</PRE>");
        global opt = _POST['OPT'];
        global r=ratehand();
//	if response header isn't text/xml, IE will choke on this
        _HEADER['CONTENT_TYPE']="text/xml";
        print("<?xml version='1.0' encoding='UTF-8' standalone='yes'?>\n");
        print("<response>\n");
        for (n=0;n<5;n++) print("<C",n,">",c[n],"</C",n,">\n<C",n,"F>/cards/",CARDS[c[n]].file,"</C",n,"F>\n<C",n,"N>",CARDS[c[n]].name,"</C",n,"N>\n");
        print("	<rating>",r,"</rating>\n");
        print("</response>\n");
        return;
}

function main() {
        global c = { getcard(), getcard(), getcard(), getcard(), getcard() };
        global held = { 0,0,0,0,0 };
        global opt = "";

/*
	if (_SERVER==null) { // this is a debug block
		global _SERVER = { REQUEST_METHOD="POST", PATH_INFO="/nesla/blah" }
		global _POST = { c0=12, c1=16, c2=20, c3=24, c4=28, h0=1, h1=1, h2=1, h3=1, h4=1 }
	}
*/
        print("<HTML>\n<HEAD>\n<TITLE>Nesla-AJAX Poker</TITLE>\n");
        print("<STYLE TYPE=text/css>\n");
        print("A       { color: #0000FF; text-decoration: none; }\n");
        print("A:HOVER { background-color: #E0E0FF; }\n");
        print("</STYLE>\n");
        print("</HEAD>\n<BODY>\n<CENTER>\n");
        printxml();
        printredraw();
        print("<SPAN ID='remstatus'>");
        print("<FORM ACTION='", _SERVER['PATH_INFO'], "' METHOD='POST' NAME='game'>\n");
        global r=ratehand();
        showscore(r);
        for (n=0;n<5;n++) {
                print("<INPUT TYPE=hidden NAME=C", n, " VALUE='", c[n], "'>");
                print("<INPUT TYPE=hidden NAME=H", n, " VALUE='", held[n], "'>\n");
        }
        print("<TABLE BORDER=1 CELLPADDING=2 CELLSPACING=0><TR>\n");
        for (n=0;n<5;n++) {
                local i=tonumber(c[n]);
                print("<TD ALIGN=LEFT WIDTH=71><IMG NAME=card", n, " WIDTH=71 HEIGHT=96 SRC='/cards/", CARDS[i].file ,"' ALT='", CARDS[i].name, "' TITLE='", CARDS[i].name, "'></TD>\n");
        }
        print("</TR>\n");
//	if (string.cmp(opt, "Deal")!=0) {
                print("<TR>\n");
                for (n=0;n<5;n++) {
                        print("<TD ID=hbut",n," ALIGN=CENTER WIDTH=71");
                        if (held[n]==1) print(" FONT COLOR=green");
                        print(" onClick=\"toggle(",n,")\">HOLD</TD>\n");
                }
                print("</TR>\n");
                print("<TR><TD ALIGN=CENTER COLSPAN=5>[<A HREF=javascript:nexthand('Deal');> DEAL </A>]</TD></TR>\n");
//	}
        print("</TABLE>\n");
/*
	if (string.cmp(opt, "Deal")==0) {
		print("<A HREF='", _SERVER['PATH_INFO'], "' 'onClick=location.replace('", _SERVER['PATH_INFO'], "');return false;'>Play again</A>\n");
	}
*/
        print("</FORM>\n");
//	CARDS=null;print("<PRE>");printvar(_GLOBALS);print("</PRE>");
        if (_SERVER['REQUEST_METHOD']=='GET') {
                print("</SPAN>\n");
                print("</CENTER>\n</BODY>\n</HTML>\n");
        }
        return;
}
if (typeof(_SERVER)=='table') {
        if (_SERVER['REQUEST_METHOD']=='POST') {
                xmlmain();
        } else {
                main();
        }
}