1a26347df718ca35155013e20e48b3914effa758
[e-DoKo.git] / index.php
1 <?php
2 error_reporting(E_ALL);
3
4 include_once("config.php");
5 include_once("output.php");      /* html output only */
6 include_once("db.php");          /* database only */
7 include_once("functions.php");   /* the rest */
8
9 config_check();
10
11 if(DB_open()<0)
12   {
13     output_header();
14     echo "Database error, can't connect... Please wait a while and try again. ".
15       "If the problem doesn't go away feel free to contact $ADMIN_NAME at $ADMIN_EMAIL.";
16     output_footer();
17     exit();
18   }
19
20 /* start a session, if it is not already running */
21 session_start();
22
23 /* done major error checking, output header of HTML page */
24 output_header();
25
26 /* check if we want to start a new game */
27 if(myisset("logout"))
28   {
29     session_unset();
30     session_destroy();
31     $_SESSION = array();
32     echo "you are now logged out!";
33   }
34 else if(myisset("new"))
35   {
36     if( isset($_SESSION["name"]) )
37       {
38         $names = DB_get_all_names();
39         output_form_for_new_game($names);
40       }
41     else
42       {
43         echo "Please log in.";
44       }
45   }
46 /*check if everything is ready to set up a new game */
47  else if( myisset("PlayerA", "PlayerB","PlayerC","PlayerD","dullen","schweinchen","call" ))
48   {
49     $PlayerA = $_REQUEST["PlayerA"];
50     $PlayerB = $_REQUEST["PlayerB"];
51     $PlayerC = $_REQUEST["PlayerC"];
52     $PlayerD = $_REQUEST["PlayerD"];
53
54     $dullen      = $_REQUEST["dullen"];
55     $schweinchen = $_REQUEST["schweinchen"];
56     $call        = $_REQUEST["call"];
57
58     $EmailA  = DB_get_email_by_name($PlayerA);
59     $EmailB  = DB_get_email_by_name($PlayerB);
60     $EmailC  = DB_get_email_by_name($PlayerC);
61     $EmailD  = DB_get_email_by_name($PlayerD);
62
63     if($EmailA=="" || $EmailB=="" || $EmailC=="" || $EmailD=="")
64       {
65         echo "couldn't find one of the names, please start a new game";
66         output_footer();
67         DB_close();
68         exit();
69       }
70
71     $useridA  = DB_get_userid_by_name($PlayerA);
72     $useridB  = DB_get_userid_by_name($PlayerB);
73     $useridC  = DB_get_userid_by_name($PlayerC);
74     $useridD  = DB_get_userid_by_name($PlayerD);
75
76     /* create random numbers */
77     $randomNR       = create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD);
78     $randomNRstring = join(":",$randomNR);
79
80     /* create game */
81     $followup = NULL;
82     if(myisset("followup") )
83       {
84         $followup= $_REQUEST["followup"];
85         $session = DB_get_session_by_gameid($followup);
86         $ruleset = DB_get_ruleset_by_gameid($followup); /* just copy ruleset from old game,
87                                                          this way no manipulation is possible */
88
89         /* check if there is a game in pre or play mode, in that case do nothing */
90         if( DB_is_session_active($session) > 0 )
91           {
92             echo "<p class=\"message\"> There is already a game going on in session $session, you can't start a new one</p>";
93             output_footer();
94             DB_close();
95             exit();
96           }
97         else if ( DB_is_session_active($session) < 0 )
98           {
99             echo "<p class=\"message\"> ERROR: status of session $session couldn't be determined.</p>";
100             output_footer();
101             DB_close();
102             exit();
103           }
104
105         if($session)
106           mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', 'normal', NULL,NULL,'1',NULL,'pre',".
107                       "'$ruleset','$session' ,NULL)");
108         else
109           {
110             /* get max session */
111             $max = DB_get_max_session();
112             $max++;
113             mysql_query("UPDATE Game SET session='".$max."' WHERE id=".DB_quote_smart($followup));
114             mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', 'normal', NULL,NULL,'1',NULL,'pre',".
115                         "'$ruleset','$max' ,NULL)");
116           }
117       }
118     else
119       {
120         /* get ruleset information or create new one */
121         $ruleset = DB_get_ruleset($dullen,$schweinchen,$call);
122         if($ruleset <0)
123           {
124             myerror("Error defining ruleset: $ruleset");
125             output_footer();
126             DB_close();
127             exit();
128           };
129         /* get max session */
130         $max = DB_get_max_session();
131         $max++;
132
133         mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', 'normal', NULL,NULL,'1',NULL,'pre', ".
134                   "'$ruleset','$max' ,NULL)");
135       }
136     $game_id = mysql_insert_id();
137
138     /* create hash */
139     $TIME  = (string) time(); /* to avoid collisions */
140     $hashA = md5("AGameOfDoko".$game_id.$PlayerA.$EmailA.$TIME);
141     $hashB = md5("AGameOfDoko".$game_id.$PlayerB.$EmailB.$TIME);
142     $hashC = md5("AGameOfDoko".$game_id.$PlayerC.$EmailC.$TIME);
143     $hashD = md5("AGameOfDoko".$game_id.$PlayerD.$EmailD.$TIME);
144
145     /* create hands */
146     mysql_query("INSERT INTO Hand VALUES (NULL,".DB_quote_smart($game_id).",".DB_quote_smart($useridA).
147                 ", ".DB_quote_smart($hashA).", 'start','1',NULL,NULL,NULL,NULL)");
148     $hand_idA = mysql_insert_id();
149     mysql_query("INSERT INTO Hand VALUES (NULL,".DB_quote_smart($game_id).",".DB_quote_smart($useridB).
150                 ", ".DB_quote_smart($hashB).", 'start','2',NULL,NULL,NULL,NULL)");
151     $hand_idB = mysql_insert_id();
152     mysql_query("INSERT INTO Hand VALUES (NULL,".DB_quote_smart($game_id).",".DB_quote_smart($useridC).
153                 ", ".DB_quote_smart($hashC).", 'start','3',NULL,NULL,NULL,NULL)");
154     $hand_idC = mysql_insert_id();
155     mysql_query("INSERT INTO Hand VALUES (NULL,".DB_quote_smart($game_id).",".DB_quote_smart($useridD).
156                 ", ".DB_quote_smart($hashD).", 'start','4',NULL,NULL,NULL,NULL)");
157     $hand_idD = mysql_insert_id();
158
159     /* save cards */
160     for($i=0;$i<12;$i++)
161       mysql_query("INSERT INTO Hand_Card VALUES (NULL, '$hand_idA', '".$randomNR[$i]."', 'false')");
162     for($i=12;$i<24;$i++)
163       mysql_query("INSERT INTO Hand_Card VALUES (NULL, '$hand_idB', '".$randomNR[$i]."', 'false')");
164     for($i=24;$i<36;$i++)
165       mysql_query("INSERT INTO Hand_Card VALUES (NULL, '$hand_idC', '".$randomNR[$i]."', 'false')");
166     for($i=36;$i<48;$i++)
167       mysql_query("INSERT INTO Hand_Card VALUES (NULL, '$hand_idD', '".$randomNR[$i]."', 'false')");
168
169     /* send out email, TODO: check for error with email */
170     $message = "\n".
171       "you are invited to play a game of DoKo (that is to debug the program ;).\n".
172       "Place comments and bug reports here:\n".
173       "http://wiki.nubati.net/index.php?title=EmailDoko\n\n".
174       "The whole round would consist of the following players:\n".
175       "$PlayerA\n".
176       "$PlayerB\n".
177       "$PlayerC\n".
178       "$PlayerD\n\n".
179       "If you want to join this game, please follow this link:\n\n".
180       "".$host."?me=";
181
182     mymail($EmailA,"You are invited to a game of DoKo","Hello $PlayerA,\n".$message.$hashA);
183     mymail($EmailB,"You are invited to a game of DoKo","Hello $PlayerB,\n".$message.$hashB);
184     mymail($EmailC,"You are invited to a game of DoKo","Hello $PlayerC,\n".$message.$hashC);
185     mymail($EmailD,"You are invited to a game of DoKo","Hello $PlayerD,\n".$message.$hashD);
186
187     echo "You started a new game. The emails have been sent out!";
188   }    /* end set up a new game */
189 /* cancle a game, if nothing has happend in the last N minutes */
190 else if(myisset("cancle","me"))
191   {
192     $me = $_REQUEST["me"];
193
194     /* test for valid ID */
195     $myid = DB_get_userid_by_hash($me);
196     if(!$myid)
197       {
198         echo "Can't find you in the database, please check the url.<br />\n";
199         echo "perhaps the game has been cancled, check by login in <a href=\"$host\">here</a>.";
200         output_footer();
201         DB_close();
202         exit();
203       }
204
205     DB_update_user_timestamp($myid);
206
207     /* get some information from the DB */
208     $gameid   = DB_get_gameid_by_hash($me);
209     $myname   = DB_get_name_by_hash($me);
210
211     /* check if game really is old enough */
212     $result = mysql_query("SELECT mod_date from Game WHERE id='$gameid' " );
213     $r = mysql_fetch_array($result,MYSQL_NUM);
214     if(time()-strtotime($r[0]) > 60*60*24*30) /* = 1 month */
215       {
216         $message = "Hello, \n\n".
217           "Game ".DB_format_gameid($gameid).
218           " has been cancled since nothing happend for a while and $myname requested it.\n";
219
220         $userids = DB_get_all_userid_by_gameid($gameid);
221         foreach($userids as $user)
222           {
223             $To = DB_get_email_by_userid($user);
224             mymail($To,$EmailName."game ".DB_format_gameid($gameid)." cancled (timed out)",$message);
225           }
226
227         /* delete everything from the dB */
228         DB_cancel_game($me);
229
230         echo "<p style=\"background-color:red\";>Game ".DB_format_gameid($gameid).
231           " has been cancled.<br /><br /></p>";
232       }
233     else
234       echo "<p>You need to wait longer before you can cancle a game...</p>\n";
235   }
236 /* send out a reminder */
237 else if(myisset("remind","me"))
238   {
239     $me = $_REQUEST["me"];
240
241     /* test for valid ID */
242     $myid = DB_get_userid_by_hash($me);
243     if(!$myid)
244       {
245         echo "Can't find you in the database, please check the url.<br />\n";
246         echo "perhaps the game has been cancled, check by login in <a href=\"$host\">here</a>.";
247         output_footer();
248         DB_close();
249         exit();
250       }
251
252     DB_update_user_timestamp($myid);
253
254     /* get some information from the DB */
255     $gameid   = DB_get_gameid_by_hash($me);
256     $myname   = DB_get_name_by_hash($me);
257
258     /* check if game really is old enough */
259     $result = mysql_query("SELECT mod_date,player,status from Game WHERE id='$gameid' " );
260     $r = mysql_fetch_array($result,MYSQL_NUM);
261     if( (time()-strtotime($r[0]) > 60*60*24*7)  && ($r[2]!='gameover') ) /* = 1 week */
262       {
263         $name = DB_get_name_by_userid($r[1]);
264         $To = DB_get_email_by_userid($r[1]);
265         $userhash = DB_get_hash_from_gameid_and_userid($gameid,$r[1]);
266
267         $message = "Hello $name, \n\n".
268           "It's your turn in game ".DB_format_gameid($gameid)." \n".
269           "Actually everyone else is waiting for you for more than a week now ;)\n\n".
270           "Please visit this link now to continue: \n".
271           " ".$host."?me=".$userhash."\n\n" ;
272
273         if(DB_get_reminder($r[1],$gameid)>0)
274           {
275             echo "<p>An email has already been sent out.</p>\n";
276           }
277         else
278           {
279             DB_set_reminder($r[1],$gameid);
280             mymail($To,$EmailName."Reminder: game ".DB_format_gameid($gameid)." it's your turn",$message);
281
282             echo "<p style=\"background-color:red\";>Game ".DB_format_gameid($gameid).
283               ": an email has been sent out.<br /><br /></p>";
284           }
285       }
286     else
287       echo "<p>You need to wait longer before you can send out a reminder...</p>\n";
288   }
289 /* handle request from one specific player for one game,
290  * (the hash is set on a per game base) */
291 else if(myisset("me"))
292   {
293     $me = $_REQUEST["me"];
294
295     /* test for valid ID */
296     $myid = DB_get_userid_by_hash($me);
297     if(!$myid)
298       {
299         echo "Can't find you in the database, please check the url.<br />\n";
300         echo "perhaps the game has been cancled, check by login in <a href=\"$host\">here</a>.";
301         output_footer();
302         DB_close();
303         exit();
304       }
305
306     if(isset($_SESSION["name"]))
307       output_status($_SESSION["name"]);
308
309     /* the user had done something, update the timestamp */
310     DB_update_user_timestamp($myid);
311
312     /* get some information from the DB */
313     $gameid   = DB_get_gameid_by_hash($me);
314     $myname   = DB_get_name_by_hash($me);
315     $mystatus = DB_get_status_by_hash($me);
316     $mypos    = DB_get_pos_by_hash($me);
317     $myhand   = DB_get_handid_by_hash($me);
318     $session  = DB_get_session_by_gameid($gameid);
319
320     /* get prefs and save them */
321     DB_get_PREF($myid);
322     /* end set pref */
323
324     /* get rule set for this game */
325     $result = mysql_query("SELECT * FROM Rulesets".
326                           " LEFT JOIN Game ON Game.ruleset=Rulesets.id ".
327                           " WHERE Game.id='$gameid'" );
328     $r      = mysql_fetch_array($result,MYSQL_NUM);
329
330     $RULES["dullen"]      = $r[2];
331     $RULES["schweinchen"] = $r[3];
332     $RULES["call"]        = $r[4];
333
334     /* get some infos about the game */
335     $gametype   = DB_get_gametype_by_gameid($gameid);
336     $gamestatus = DB_get_game_status_by_gameid($gameid);
337     $GT         = $gametype;
338     if($gametype=="solo")
339       {
340         $gametype = DB_get_solo_by_gameid($gameid);
341         $GT  = $gametype." ".$GT;
342       }
343
344     /* does anyone have both foxes */
345     $GAME["schweinchen"]=0;
346     for($i=1;$i<5;$i++)
347       {
348         $hash  = DB_get_hash_from_game_and_pos($gameid,$i);
349         $cards = DB_get_all_hand($hash);
350         if( in_array("19",$cards) && in_array("20",$cards) )
351           {
352             $GAME["schweinchen"]=1;
353             $GAME["schweinchen-who"]=$hash;
354           }
355       };
356
357     /* put everyting in a form */
358     echo "<form action=\"index.php?me=$me\" method=\"post\">\n";
359
360     /* output game */
361
362     /* output extra division in case this game is part of a session */
363     if($session)
364       {
365         echo "<div class=\"session\">\n".
366           "This game is part of session $session: \n";
367         $hashes = DB_get_hashes_by_session($session,$myid);
368         $i = 1;
369         foreach($hashes as $hash)
370           {
371             if($hash == $me)
372               echo "$i \n";
373             else
374               echo "<a href=\"".$host."?me=".$hash."\">$i</a> \n";
375             $i++;
376           }
377         echo "</div>\n";
378       }
379
380     /* display the table and the names */
381     display_table();
382
383     /* mystatus gets the player through the different stages of a game.
384      * start:    yes/no
385      * init:     check values from start,
386      *           check for sickness
387      * check:    check for return values from init
388      * poverty:  handle poverty, wait here until all player have reached this state
389      *           display sickness and move on to game
390      * play:     game in progress
391      * gameover: are we revisiting a game
392      */
393     switch($mystatus)
394       {
395       case 'start':
396         if( !myisset("in") )
397           {
398             output_check_want_to_play($me);
399             break;
400           }
401         else
402           {
403             /* move on to the next stage*/
404             DB_set_hand_status_by_hash($me,'init');
405           }
406       case 'init':
407         /* first check if everything went ok  in the last step
408          * if not, send user back, if yes, check what he did
409          */
410         if( !myisset("in") )
411           {
412             echo "<p class=\"message\"> You need to answer the <a href=\"$host?me=$me\">question</a>.</p>";
413             DB_set_hand_status_by_hash($me,'start');
414           }
415         else
416           {
417             if($_REQUEST["in"] == "no")
418               {
419                 /* cancel the game */
420                 $message = "Hello, \n\n".
421                   "the game has been canceled due to the request of one of the players.\n";
422
423                 $userids = DB_get_all_userid_by_gameid($gameid);
424                 foreach($userids as $user)
425                   {
426                     $To = DB_get_email_by_userid($user);
427                     mymail($To,$EmailName."game ".DB_format_gameid($gameid)." canceled",$message);
428                   }
429
430                 /* delete everything from the dB */
431                 DB_cancel_game($me);
432               }
433             else
434               {
435                 $mycards = DB_get_hand($me);
436                 sort($mycards);
437
438                 output_check_for_sickness($me,$mycards);
439
440                 echo "<p class=\"mycards\">your cards are: <br />\n";
441                 foreach($mycards as $card)
442                   display_card($card,$PREF["cardset"]);
443                 echo "</p>\n";
444
445                 /* move on to the next stage*/
446                 DB_set_hand_status_by_hash($me,'check');
447               }
448           }
449         break;
450
451     case 'check':
452       /* ok, user is in the game, saw his cards and selected his vorbehalt
453        * so first we check what he selected
454        */
455       if(!myisset("solo","wedding","poverty","nines") )
456         {
457           /* all these variables have a pre-selected default,
458            * so we should never get here,
459            * unless a user tries to cheat ;)
460            * can also happen if user reloads the page!
461            */
462           echo "<p class=\"message\"> You need to answer the <a href=\"$host?me=$me&in=yes\">questions</a>.</p>";
463           DB_set_hand_status_by_hash($me,'init');
464         }
465       else
466         {
467           /* check if someone selected more than one vorbehalt */
468           $Nvorbehalt = 0;
469           if($_REQUEST["solo"]!="No")       $Nvorbehalt++;
470           if($_REQUEST["wedding"] == "yes") $Nvorbehalt++;
471           if($_REQUEST["poverty"] == "yes") $Nvorbehalt++;
472           if($_REQUEST["nines"] == "yes")   $Nvorbehalt++;
473
474           if($Nvorbehalt>1)
475             {
476               echo "<p class=\"message\"> You selected more than one vorbehalt, please go back ".
477                 "and answer the <a href=\"$host?me=$me&in=yes\">question</a> again.</p>";
478               DB_set_hand_status_by_hash($me,'init');
479             }
480           else
481             {
482               echo "<p class=\"message\">Processing what you selected in the last step...";
483
484               /* check if this sickness needs to be handled first */
485               $gametype    = DB_get_gametype_by_gameid($gameid);
486               $startplayer = DB_get_startplayer_by_gameid($gameid);
487
488               if( $_REQUEST["solo"]!="No")
489                 {
490                   /* user wants to play a solo */
491
492                   /* store the info in the user's hand info */
493                   DB_set_solo_by_hash($me,$_REQUEST["solo"]);
494                   DB_set_sickness_by_hash($me,"solo");
495
496                   echo "<br />Seems like you want to play a ".$_REQUEST["solo"]." solo. Got it.<br />\n";
497
498                   if($gametype == "solo" && $startplayer<$mypos)
499                     {}/* do nothing, since someone else already is playing solo */
500                   else
501                     {
502                       /* this solo comes first
503                        * store info in game table
504                        */
505                       DB_set_gametype_by_gameid($gameid,"solo");
506                       DB_set_startplayer_by_gameid($gameid,$mypos);
507                       DB_set_solo_by_gameid($gameid,$_REQUEST["solo"]);
508                     };
509                 }
510               else if($_REQUEST["wedding"] == "yes")
511                 {
512                   /* TODO: add silent solo somewhere*/
513                   echo "Ok, you don't want to play a silent solo...wedding was chosen.<br />\n";
514                   DB_set_sickness_by_hash($me,"wedding");
515                 }
516               else if($_REQUEST["poverty"] == "yes")
517                 {
518                   echo "Don't think you can win with just a few trump...? ok, poverty chosen <br />\n";
519                   DB_set_sickness_by_hash($me,"poverty");
520                 }
521               else if($_REQUEST["nines"] == "yes")
522                 {
523                   echo "What? You just don't want to play a game because you have a few nines? Well, if no one".
524                     " is playing solo, this game will be canceled.<br />\n";
525                   DB_set_sickness_by_hash($me,"nines");
526                 }
527
528               echo " Ok, done with checking, please go to the <a href=\"$host?me=$me\">next step of the setup</a>.</p>";
529
530               /* move on to the next stage*/
531               DB_set_hand_status_by_hash($me,'poverty');
532
533               /* check if everyone has reached this stage, send out email */
534               $userids = DB_get_all_userid_by_gameid($gameid);
535               $ok = 1;
536               foreach($userids as $user)
537                 {
538                   $userstat = DB_get_hand_status_by_userid_and_gameid($user,$gameid);
539                   if($userstat!='poverty' && $userstat!='play')
540                     {
541                       $ok = 0;
542                       DB_set_player_by_gameid($gameid,$user);
543                     }
544                 };
545               if($ok)
546                 {
547                   /* reset player = everyone has to do something now */
548                   DB_set_player_by_gameid($gameid,NULL);
549
550                   foreach($userids as $user)
551                     {
552                       $To       = DB_get_email_by_userid($user);
553                       $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
554                       if($userhash != $me)
555                         {
556                           $message = "Everyone finish the questionary in game ".DB_format_gameid($gameid).", ".
557                             "please visit this link now to continue: \n".
558                             " ".$host."?me=".$userhash."\n\n" ;
559                           mymail($To,$EmailName." finished setup in game ".DB_format_gameid($gameid),$message);
560                         }
561                     };
562                 };
563             };
564         };
565       break;
566
567     case 'poverty':
568       /* here we need to check if there is a solo or some other form of sickness.
569        * If so, which one is the most important one
570        * set that one in the Game table
571        * tell people about it.
572        */
573       echo "<div class=\"message\">\n";
574       echo "<p> Checking if someone else selected solo, nines, wedding or poverty.</p>";
575
576       /* check if everyone has reached this stage */
577       $userids = DB_get_all_userid_by_gameid($gameid);
578       $ok = 1;
579       foreach($userids as $user)
580         {
581           $userstat = DB_get_hand_status_by_userid_and_gameid($user,$gameid);
582           if($userstat!='poverty' && $userstat!='play')
583             $ok = 0;
584         };
585
586       if(!$ok)
587         {
588           echo "This step can only be handled after everyone finished the last step. ".
589                "Seems like this is not the case, so you need to wait a bit... ".
590                "you will get an email once that is the case, please use the link in ".
591                "that email to continue the game.<br />";
592         }
593       else
594         {
595           echo "Everyone has finished checking their cards, let's see what they said...<br />";
596
597           /* check what kind of game we are playing,  in case there are any solos this already
598            *will have the correct information in it */
599           $gametype    = DB_get_gametype_by_gameid($gameid);
600           $startplayer = DB_get_startplayer_by_gameid($gameid);
601
602           /* check for different sickness and just output a general info */
603           $nines   = 0;
604           $poverty = 0;
605           $wedding = 0;
606           $solo    = 0;
607           foreach($userids as $user)
608             {
609               $name     = DB_get_name_by_userid($user);
610               $usersick = DB_get_sickness_by_userid_and_gameid($user,$gameid);
611               if($usersick == 'nines')
612                 {
613                   $nines = $user;
614                   echo "$name has a Vorbehalt. <br />";
615                   break;
616                 }
617               else if($usersick == 'poverty')
618                 {
619                   $poverty++;
620                   echo "$name has a Vorbehalt. <br />";
621                 }
622               else if($usersick == 'wedding')
623                 {
624                   $wedding=$user;
625                   echo "$name has a Vorbehalt. <br />"  ;
626                 }
627               else if($usersick == 'solo')
628                 {
629                   $solo++;
630                   echo "$name has a Vorbehalt. <br />"  ;
631                 }
632             }
633
634           /* now check which sickness comes first and set the gametype to it */
635
636           if($gametype == "solo")
637             {
638               /* do nothing */
639             }
640           else if($nines)
641             {
642               /* cancel game */
643               /* TODO: should we keep statistics of this? */
644               $message = "Hello, \n\n".
645                 " the game has been canceled because ".DB_get_name_by_userid($nines).
646                 " has five or more nines and nobody is playing solo.\n\n".
647                 " To redeal either start a new game or, in case the game was part of a tournament, \n".
648                 " go to the last game and use the link at the bottom of the page to redeal.";
649
650               $userids = DB_get_all_userid_by_gameid($gameid);
651               foreach($userids as $user)
652                 {
653                   $To = DB_get_email_by_userid($user);
654                   mymail($To,$EmailName."game ".DB_format_gameid($gameid)." canceled",$message);
655                 }
656
657               /* delete everything from the dB */
658               DB_cancel_game($me);
659
660               echo "The game has been canceled because ".DB_get_name_by_userid($nines).
661                 " has five or more nines and nobody is playing solo.\n";
662               output_footer();
663               DB_close();
664               exit();
665             }
666           else if($poverty==1) /* one person has poverty */
667             {
668               DB_set_gametype_by_gameid($gameid,"poverty");
669               $gametype = "poverty";
670               $who      = DB_get_sickness_by_gameid($gameid);
671               if(!$who)
672                 {
673                   $firstsick = DB_get_sickness_by_pos_and_gameid(1,$gameid);
674                   if($firstsick == "poverty")
675                     DB_set_sickness_by_gameid($gameid,2); /* who needs to be asked first */
676                   else
677                     DB_set_sickness_by_gameid($gameid,1); /* who needs to be asked first */
678                 }
679             }
680           else if($poverty==2) /* two people have poverty */
681             {
682               DB_set_gametype_by_gameid($gameid,"dpoverty");
683               $gametype = "dpoverty";
684               $who      = DB_get_sickness_by_gameid($gameid);
685               if(!$who)
686                 {
687                   $firstsick = DB_get_sickness_by_pos_and_gameid(1,$gameid);
688                   if($firstsick == "poverty")
689                     {
690                       $seconsick = DB_get_sickness_by_pos_and_gameid(1,$gameid);
691                       if($secondsick == "poverty")
692                         DB_set_sickness_by_gameid($gameid,30); /* who needs to be asked first */
693                       else
694                         DB_set_sickness_by_gameid($gameid,20); /* who needs to be asked first */
695                     }
696                   else
697                     DB_set_sickness_by_gameid($gameid,10); /* who needs to be asked first */
698                 }
699             }
700           else if($wedding> 0)
701             {
702               DB_set_gametype_by_gameid($gameid,"wedding");
703               DB_set_sickness_by_gameid($gameid,'-1'); /* wedding not resolved yet */
704               $gametype = "wedding";
705             };
706
707           echo "<br />\n";
708
709           /* now the gametype is set correctly (shouldn't matter that this is calculated for every user)
710            * output what kind of game we have */
711
712           $poverty = 0;
713           foreach($userids as $user)
714             {
715               /* userids are sorted by position...
716                * so output whatever the first one has, then whatever the next one has
717                * stop when the sickness is the same as the gametype
718                */
719
720               $name     = DB_get_name_by_userid($user);
721               $usersick = DB_get_sickness_by_userid_and_gameid($user,$gameid);
722
723               if($usersick)
724                 echo "$name has $usersick. <br />"; /*TODO: perhaps save this in a string and store in Game? */
725
726               if($usersick=="poverty")
727                 $poverty++;
728               if($usersick == "wedding" && $gametype =="wedding")
729                 break;
730               if($usersick == "poverty" && $gametype =="poverty")
731                 break;
732               if($usersick == "poverty" && $gametype =="dpoverty" && $poverty==2)
733                 break;
734               if($usersick == "solo" && $gametype =="solo")
735                 break;
736             };
737
738           /* output Schweinchen in case the rules need it */
739           if( $gametype != "solo")
740             if($GAME["schweinchen"] && $RULES["schweinchen"]=="both" )
741               echo DB_get_name_by_hash($GAME["schweinchen-who"])." has Schweinchen. <br />";
742
743           echo "<br />\n";
744
745           /* finished the setup, set re/contra parties if possible, go to next stage unless there is a case of poverty*/
746           switch($gametype)
747             {
748             case "solo":
749               /* are we the solo player? set us to re, else set us to contra */
750               $pos = DB_get_pos_by_hash($me);
751               if($pos == $startplayer)
752                 DB_set_party_by_hash($me,"re");
753               else
754                 DB_set_party_by_hash($me,"contra");
755               DB_set_hand_status_by_hash($me,'play');
756               break;
757
758             case "wedding":
759               /* set person with the wedding to re, do the rest during the game */
760               $usersick = DB_get_sickness_by_userid_and_gameid($myid,$gameid);
761               if($usersick == "wedding")
762                 DB_set_party_by_hash($me,"re");
763               else
764                 DB_set_party_by_hash($me,"contra");
765
766               echo "Whoever will make the first trick will be on the re team. <br />\n";
767               echo " Ok, the game can start now, please finish <a href=\"$host?me=$me\">the setup</a>.<br />";
768               DB_set_hand_status_by_hash($me,'play');
769               break;
770
771             case "normal":
772               $hand = DB_get_all_hand($me);
773
774               if(in_array('3',$hand)||in_array('4',$hand))
775                 DB_set_party_by_hash($me,"re");
776               else
777                 DB_set_party_by_hash($me,"contra");
778               DB_set_hand_status_by_hash($me,'play');
779               break;
780             case "poverty":
781             case "dpoverty":
782               /* check if poverty resolved (e.g. DB.Game who set to NULL)
783                *   yes? =>trump was taken, start game; break;
784                */
785               $who = DB_get_sickness_by_gameid($gameid);
786               if($who<0)
787                 { /* trump has been taken */
788                   DB_set_hand_status_by_hash($me,'play');
789                   break;
790                 };
791
792               if($who>9) /*= two people still have trump on the table*/
793                 $add = 10;
794               else
795                 $add = 1;
796
797               /* check if we are being asked now
798                *    no? display wait message, e.g. player X is asked at the moment
799                */
800               $usersick = DB_get_sickness_by_userid_and_gameid($myid,$gameid);
801               if(myisset("trump") && $_REQUEST["trump"]=="no" && ($who==$mypos || $who==$mypos*10))
802                 {
803                   /* user doesn't want to take trump */
804                   /* set next player who needs to be asked */
805                   $firstsick  = (string) DB_get_sickness_by_pos_and_gameid($mypos+1,$gameid);
806                   $secondsick = (string) DB_get_sickness_by_pos_and_gameid($mypos+2,$gameid);
807
808                   if($firstsick=="poverty")
809                     {
810                       if($secondsick=="poverty")
811                         DB_set_sickness_by_gameid($gameid,$who+$add*3);
812                       else
813                         DB_set_sickness_by_gameid($gameid,$who+$add*2);
814                     }
815                   else
816                     DB_set_sickness_by_gameid($gameid,$who+$add);
817
818                   /* email next player */
819                   $who = DB_get_sickness_by_gameid($gameid);
820                   if($who>9) $who = $who/10;
821
822                   if($who<=4)
823                     {
824                       $To       = DB_get_email_by_pos_and_gameid($who,$gameid);
825                       $userhash = DB_get_hash_from_game_and_pos($gameid,$who);
826                       DB_set_player_by_gameid($gameid,$who);
827
828                       $message = "Someone has poverty, it's your turn to decide, if you want to take the trump. Please visit:".
829                         " ".$host."?me=".$userhash."\n\n" ;
830                       mymail($To,$EmailName." poverty (game ".DB_format_gameid($gameid).")",$message);
831                     }
832
833                   /* this user is done */
834                   DB_set_hand_status_by_hash($me,'play');
835                   break;
836                 }
837               else if(myisset("trump") && !myisset("exchange") && $_REQUEST["trump"]>0 && ($who==$mypos || $who==$mypos*10))
838                 {
839                   /* user wants to take trump */
840                   $trump = $_REQUEST["trump"];
841
842                   /* get hand id for user $trump */
843                   $userhand = DB_get_handid_by_gameid_and_userid($gameid,$trump);
844                   /* copy trump from player A to B */
845                   $result = mysql_query("UPDATE Hand_Card SET hand_id='$myhand' WHERE hand_id='$userhand' AND card_id<'27'" );
846
847                   /* add hidden button with trump in it to get to the next point */
848                   echo "</div><div class=\"poverty\">\n";
849                   echo "  <input type=\"hidden\" name=\"exchange\" value=\"-1\" />\n";
850                   echo "  <input type=\"hidden\" name=\"trump\" value=\"".$trump."\" />\n";
851                   echo "  <input type=\"submit\" class=\"submitbutton\" value=\"select cards to give back\" />\n";
852                   echo "</div><div>\n";
853                 }
854               else if(myisset("trump","exchange") && $_REQUEST["trump"]>0 && ($who==$mypos || $who==$mypos*10))
855                 {
856                   $trump    = $_REQUEST["trump"];
857                   $exchange = $_REQUEST["exchange"];
858                   $userhand = DB_get_handid_by_gameid_and_userid($gameid,$trump);
859
860                   /* if exchange is set to a value>0, exchange that card back to user $trump */
861                   if($exchange >0)
862                     {
863                       $result = mysql_query("UPDATE Hand_Card SET hand_id='$userhand'".
864                                             " WHERE hand_id='$myhand' AND card_id='$exchange'" );
865                     };
866
867                   /* if number of cards == 12, set status to play for both users */
868                   $result = mysql_query("SELECT COUNT(*) FROM Hand_Card  WHERE hand_id='$myhand'" );
869                   $r      = mysql_fetch_array($result,MYSQL_NUM);
870                   if(!$r)
871                     {
872                       myerror("error in poverty");
873                       die();
874                     };
875                   if($r[0]==12)
876                     {
877                       if($gametype=="poverty" || $who<9)
878                         {
879                           DB_set_sickness_by_gameid($gameid,-1); /* done with poverty */
880                         }
881                       else /* reduce poverty count by one, that is go to single digits $who */
882                         {
883                           $add = 1;
884                           $who = $who/10;
885
886                           /* whom to ask next */
887                           $firstsick  = DB_get_sickness_by_pos_and_gameid($mypos+1,$gameid);
888                           $secondsick = DB_get_sickness_by_pos_and_gameid($mypos+2,$gameid);
889
890                           if($firstsick!="poverty")
891                             DB_set_sickness_by_gameid($gameid,$who+$add);
892                           else
893                             {
894                               if($secondsick!="poverty")
895                                 DB_set_sickness_by_gameid($gameid,$who+$add*2);
896                               else
897                                 DB_set_sickness_by_gameid($gameid,$who+$add*3);
898                             };
899
900                           /* email next player */
901                           $who = DB_get_sickness_by_gameid($gameid);
902                           if($who<=4)
903                             {
904                               $To       = DB_get_email_by_pos_and_gameid($who,$gameid);
905                               $userhash = DB_get_hash_from_game_and_pos($gameid,$who);
906                               DB_set_player_by_gameid($gameid,$who);
907
908                               $message = "Someone has poverty, it's your turn to decide, ".
909                                          "if you want to take the trump. Please visit:".
910                                          " ".$host."?me=".$userhash."\n\n" ;
911                               mymail($To,$EmailName." poverty (game ".DB_format_gameid($gameid).")",$message);
912                             }
913                         }
914
915                       /* this user is done */
916                       DB_set_hand_status_by_hash($me,'play');
917                       /* and so is his partner */
918                       $hash = DB_get_hash_from_gameid_and_userid($gameid,$trump);
919                       DB_set_hand_status_by_hash($hash,'play');
920
921                       /* set party to re, unless we had dpoverty, in that case check if we need to set re/contra*/
922                       $re_set = 0;
923                       foreach($userids as $user)
924                         {
925                           $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
926                           $party    = DB_get_party_by_hash($userhash);
927                           if($party=="re")
928                             $re_set = 1;
929                         }
930                       if($re_set)
931                         {
932                           DB_set_party_by_hash($me,"contra");
933                           DB_set_party_by_hash($hash,"contra");
934                         }
935                       else
936                         {
937                           foreach($userids as $user)
938                             {
939                               $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
940                               if($userhash==$hash||$userhash==$me)
941                                 DB_set_party_by_hash($userhash,"re");
942                               else
943                                 DB_set_party_by_hash($userhash,"contra");
944                             }
945                         }
946
947
948                       break;
949                     }
950                   else
951                     {
952                       /* else show all trump, have lowest card pre-selected, have hidden setting for */
953                       echo "</div><div class=\"poverty\"> you need to get rid of a few cards</div>\n";
954
955                       set_gametype($gametype); /* this sets the $CARDS variable */
956                       $mycards = DB_get_hand($me);
957                       $mycards = mysort($mycards,$gametype);
958
959                       $type="exchange";
960                       echo "<div class=\"mycards\">Your cards are: <br />\n";
961                       foreach($mycards as $card)
962                         display_link_card($card,$PREF["cardset"],$type);
963                       echo "  <input type=\"hidden\" name=\"trump\" value=\"".$trump."\" />\n";
964                       echo "  <input type=\"submit\" class=\"submitbutton\" value=\"select one card to give back\" />\n";
965                       echo "</div><div>\n";
966                     }
967                 }
968               else if($who == $mypos || $who == $mypos*10)
969                 {
970                   echo "</div><div class=\"poverty\">\n";
971                   foreach($userids as $user)
972                     {
973                       $name     = DB_get_name_by_userid($user);
974                       $usersick = DB_get_sickness_by_userid_and_gameid($user,$gameid);
975
976                       if($usersick=="poverty")
977                         {
978                           $hash    = DB_get_hash_from_gameid_and_userid($gameid,$user);
979                           $cards   = DB_get_hand($hash);
980                           $nrtrump = count_trump($cards);
981                           /* count trump */
982                           if($nrtrump<4)
983                             echo "Player $name has $nrtrump trump. Do you want to take them?".
984                               "<a href=\"index.php?me=$me&amp;trump=$user\">yes</a> <br />\n";
985                         }
986                     }
987                   echo "<a href=\"index.php?me=$me&amp;trump=no\">No,way I take those trump...</a> <br />\n";
988                   echo "</div><div>\n";
989
990                   echo "Your cards are: <br />\n";
991                   $mycards = DB_get_hand($me);
992                   sort($mycards);
993                   echo "<p class=\"mycards\">your cards are: <br />\n";
994                   foreach($mycards as $card)
995                     display_card($card,$PREF["cardset"]);
996                   echo "</p>\n";
997                 }
998               else
999                 {
1000                   $mysick = DB_get_sickness_by_userid_and_gameid($myid,$gameid);
1001                   if($mysick=="poverty")
1002                     echo "The others are asked if they want to take your trump, you have to wait (you'll get an email).";
1003                   else
1004                     echo "it's not your turn yet to decide if you want to take the trump or not.";
1005                 }
1006             };
1007           /* check if no one wanted to take trump, in that case the gamesickness would be set to 5 or 50 */
1008           $who = DB_get_sickness_by_gameid($gameid);
1009           if($who==5 || $who==50)
1010             {
1011               $message = "Hello, \n\n".
1012                 "Game ".DB_format_gameid($gameid)." has been cancled since nobody wanted to take the trump.\n";
1013
1014               $userids = DB_get_all_userid_by_gameid($gameid);
1015               foreach($userids as $user)
1016                 {
1017                   $To = DB_get_email_by_userid($user);
1018                   mymail($To,$EmailName."game ".DB_format_gameid($gameid)." cancled (poverty not resolved)",$message);
1019                 }
1020
1021               /* delete everything from the dB */
1022               DB_cancel_game($me);
1023
1024               echo "<p style=\"background-color:red\";>Game ".DB_format_gameid($gameid)." has been cancled.<br /><br /></p>";
1025               output_footer();
1026               DB_close();
1027               exit();
1028             }
1029
1030           /* check if all players are ready to play */
1031           $ok = 1;
1032           foreach($userids as $user)
1033             if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='play')
1034               {
1035                 $ok = 0;
1036                 DB_set_player_by_gameid($gameid,$user);
1037               }
1038
1039           if($ok)
1040             {
1041               /* only set this after all poverty, etc. are handled*/
1042               DB_set_game_status_by_gameid($gameid,'play');
1043
1044               /* email startplayer */
1045               $startplayer = DB_get_startplayer_by_gameid($gameid);
1046               $email       = DB_get_email_by_pos_and_gameid($startplayer,$gameid);
1047               $hash        = DB_get_hash_from_game_and_pos($gameid,$startplayer);
1048               $who         = DB_get_userid_by_email($email);
1049               DB_set_player_by_gameid($gameid,$who);
1050
1051               if($hash!=$me && DB_get_email_pref_by_hash($hash)!="emailaddict")
1052                 {
1053                   /* email startplayer) */
1054                   $message = "It's your turn now in game ".DB_format_gameid($gameid).".\n".
1055                     "Use this link to play a card: ".$host."?me=".$hash."\n\n" ;
1056                   mymail($email,$EmailName."ready, set, go... (game ".DB_format_gameid($gameid).") ",$message);
1057                 }
1058               else
1059                 echo " Please, <a href=\"$host?me=$me\">start</a> the game.<br />";
1060             }
1061           else
1062             echo "\n <br />";
1063         }
1064       echo "</div>\n";
1065       break;
1066     case 'play':
1067     case 'gameover':
1068       /* both entries here,  so that the tricks are visible for both.
1069        * in case of 'play' there is a break later that skips the last part
1070        */
1071
1072       /* figure out what kind of game we are playing,
1073        * set the global variables $CARDS["trump"],$CARDS["diamonds"],$CARDS["hearts"],
1074        * $CARDS["clubs"],$CARDS["spades"],$CARDS["foxes"]
1075        * accordingly
1076        */
1077
1078       $gametype = DB_get_gametype_by_gameid($gameid);
1079       $GT       = $gametype;
1080       if($gametype=="solo")
1081         {
1082           $gametype = DB_get_solo_by_gameid($gameid);
1083           $GT       = $gametype." ".$GT;
1084         }
1085       else
1086         $gametype = "normal";
1087
1088       set_gametype($gametype); /* this sets the $CARDS variable */
1089
1090       /* get some infos about the game */
1091       $gamestatus = DB_get_game_status_by_gameid($gameid);
1092
1093       /* has the game started? No, then just wait here...*/
1094       if($gamestatus == 'pre')
1095         {
1096           echo "<p class=\"message\"> You finished the setup, but not everyone else finished it... ".
1097                "so you need to wait for the others. Just wait for the an email... </p>";
1098           break; /* not sure this works... the idea is that you can
1099                   * only  play a card after everyone is ready to play */
1100         }
1101
1102       /* get time from the last action of the game */
1103       $result  = mysql_query("SELECT mod_date from Game WHERE id='$gameid' " );
1104       $r       = mysql_fetch_array($result,MYSQL_NUM);
1105       $gameend = time() - strtotime($r[0]);
1106
1107       /* handel comments in case player didn't play a card, allow comments a week after the end of the game */      if( (!myisset("card") && $mystatus=='play') || ($mystatus=='gameover' && ($gameend < 60*60*24*7)) )
1108         if(myisset("comment"))
1109           {
1110             $comment = $_REQUEST["comment"];
1111             $playid = DB_get_current_playid($gameid);
1112
1113             if($comment != "")
1114               DB_insert_comment($comment,$playid,$myid);
1115           };
1116
1117       /* get everything relevant to display the tricks */
1118       $result = mysql_query("SELECT Hand_Card.card_id as card,".
1119                             "       Hand.position as position,".
1120                             "       Play.sequence as sequence, ".
1121                             "       Trick.id, ".
1122                             "       GROUP_CONCAT(CONCAT('<span>',User.fullname,': ',Comment.comment,'</span>')".
1123                             "                    SEPARATOR '\n' ), ".
1124                             "       Play.create_date, ".
1125                             "       Hand.user_id ".
1126                             "FROM Trick ".
1127                             "LEFT JOIN Play ON Trick.id=Play.trick_id ".
1128                             "LEFT JOIN Hand_Card ON Play.hand_card_id=Hand_Card.id ".
1129                             "LEFT JOIN Hand ON Hand_Card.hand_id=Hand.id ".
1130                             "LEFT JOIN Comment ON Play.id=Comment.play_id ".
1131                             "LEFT JOIN User On User.id=Comment.user_id ".
1132                             "WHERE Trick.game_id='".$gameid."' ".
1133                             "GROUP BY Trick.id, sequence ".
1134                             "ORDER BY Trick.id, sequence  ASC");
1135       $trickNR   = 1;
1136       $lasttrick = DB_get_max_trickid($gameid);
1137
1138       $play = array(); /* needed to calculate winner later  */
1139       $seq  = 1;
1140       $pos  = DB_get_startplayer_by_gameid($gameid)-1;
1141       $firstcard = ""; /* first card in a trick */
1142
1143       echo "\n<ul class=\"tricks\">\n";
1144       echo "  <li class=\"nohighlight\"> Game ".DB_format_gameid($gameid).": </li>\n";
1145
1146       while($r = mysql_fetch_array($result,MYSQL_NUM))
1147         {
1148           $pos     = $r[1];
1149           $seq     = $r[2];
1150           $trick   = $r[3];
1151           $comment = $r[4];
1152           $timeplayed = strtotime($r[5]);
1153           $user    = $r[6];
1154
1155           $offset = DB_get_user_timezone($user);
1156           $zone   = return_timezone($offset);
1157           date_default_timezone_set($zone);
1158
1159           /* check if first schweinchen has been played */
1160           if( $GAME["schweinchen"] && ($r[0] == 19 || $r[0] == 20) )
1161             $GAME["schweinchen"]++;
1162
1163           /* save card to be able to find the winner of the trick later */
1164           $play[$seq] = array("card"=>$r[0],"pos"=>$pos);
1165
1166           if($seq==1)
1167             {
1168               /* first card in a trick, output some html */
1169               if($trick!=$lasttrick)
1170                 {
1171                   /* start of an old trick? */
1172                   echo "  <li onclick=\"hl('$trickNR');\" class=\"old\"><a href=\"#\">Trick $trickNR</a>\n".
1173                     "    <div class=\"trick\" id=\"trick".$trickNR."\">\n".
1174                     "      <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n";
1175                 }
1176               else if($trick==$lasttrick)
1177                 {
1178                   /* start of a last trick? */
1179                   echo "  <li onclick=\"hl('$trickNR');\" class=\"current\"><a href=\"#\">Trick $trickNR</a>\n".
1180                     "    <div class=\"trick\" id=\"trick".$trickNR."\">\n".
1181                     "      <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n";
1182                 };
1183
1184               /* remember first card, so that we are able to check, what cards can be played */
1185               $firstcard = $r[0];
1186             };
1187
1188           /* display card */
1189           echo "      <div class=\"card".($pos-1)."\">\n";
1190
1191           /* display comments */
1192           if($comment!="")
1193             echo "        <span class=\"comment\">".$comment."</span>\n";
1194
1195           echo "        ";
1196           display_card($r[0],$PREF["cardset"]);
1197
1198           echo "      </div>\n"; /* end div card */
1199
1200           /* end of trick? */
1201           if($seq==4)
1202             {
1203               $trickNR++;
1204               echo "    </div>\n  </li>\n";  /* end div trick, end li trick */
1205             }
1206         }
1207
1208       /* whos turn is it? */
1209       if($seq==4)
1210         {
1211           $winner    = get_winner($play,$gametype); /* returns the position */
1212           $next      = $winner;
1213           $firstcard = ""; /* new trick, no first card */
1214         }
1215       else
1216         {
1217           $next = $pos+1;
1218           if($next==5) $next = 1;
1219         }
1220
1221       /* my turn?, display cards as links, ask for comments*/
1222       if(DB_get_pos_by_hash($me) == $next)
1223         $myturn = 1;
1224       else
1225         $myturn = 0;
1226
1227       /* do we want to play a card? */
1228       if(myisset("card") && $myturn)
1229         {
1230           $card   = $_REQUEST["card"];
1231           $handid = DB_get_handid_by_hash($me);
1232
1233           /* check if we have card and that we haven't played it yet*/
1234           /* set played in hand_card to true where hand_id and card_id*/
1235           $result = mysql_query("SELECT id FROM Hand_Card WHERE played='false' and ".
1236                                 "hand_id='$handid' AND card_id=".DB_quote_smart($card));
1237           $r = mysql_fetch_array($result,MYSQL_NUM);
1238           $handcardid = $r[0];
1239
1240           if($handcardid) /* everything ok, play card  */
1241             {
1242               /* update Game timestamp */
1243               DB_update_game_timestamp($gameid);
1244
1245               /* check if a call was made, must do this before we set the card status to played */
1246               if(myisset("call120") && $_REQUEST["call120"] == "yes" && can_call(120,$me))
1247                 $result = mysql_query("UPDATE Hand SET point_call='120' WHERE hash='$me' ");
1248               if(myisset("call90")  && $_REQUEST["call90"]  == "yes" && can_call(90,$me))
1249                 $result = mysql_query("UPDATE Hand SET point_call='90'  WHERE hash='$me' ");
1250               if(myisset("call60")  && $_REQUEST["call60"]  == "yes" && can_call(60,$me))
1251                 $result = mysql_query("UPDATE Hand SET point_call='60'  WHERE hash='$me' ");
1252               if(myisset("call30")  && $_REQUEST["call30"]  == "yes" && can_call(30,$me))
1253                 $result = mysql_query("UPDATE Hand SET point_call='30'  WHERE hash='$me' ");
1254               if(myisset("call0")   && $_REQUEST["call0"]   == "yes" && can_call(0,$me))
1255                 $result = mysql_query("UPDATE Hand SET point_call='0'   WHERE hash='$me' ");
1256
1257               /* mark card as played */
1258               mysql_query("UPDATE Hand_Card SET played='true' WHERE hand_id='$handid' AND card_id=".
1259                           DB_quote_smart($card));
1260
1261               /* get trick id or start new trick */
1262               $a = DB_get_current_trickid($gameid);
1263               $trickid  = $a[0];
1264               $sequence = $a[1];
1265               $tricknr  = $a[2];
1266
1267               $playid = DB_play_card($trickid,$handcardid,$sequence);
1268
1269               /* check for schweinchen */
1270               if($GAME["schweinchen"] && ($card == 19 || $card == 20) )
1271                 {
1272                   $GAME["schweinchen"]++; // count how many have been played including this one
1273                   if($GAME["schweinchen"]==3 && $RULES["schweinchen"]=="second" )
1274                     DB_insert_comment("Schweinchen! ",$playid,$myid);
1275                   if($RULES["schweinchen"]=="both" )
1276                     DB_insert_comment("Schweinchen! ",$playid,$myid);
1277                   if ($debug)
1278                     echo "schweinchen = ".$GAME["schweinchen"]." ---<br />";
1279                 }
1280
1281               /* if sequence == 4 check who one in case of wedding */
1282               if($sequence == 4 && $GT == "wedding")
1283                 {
1284                   /* is wedding resolve */
1285                   $resolved = DB_get_sickness_by_gameid($gameid);
1286                   if($resolved<0)
1287                     {
1288                       /* who has wedding */
1289                       $userids = DB_get_all_userid_by_gameid($gameid);
1290                       foreach($userids as $user)
1291                         {
1292                           $usersick = DB_get_sickness_by_userid_and_gameid($user,$gameid);
1293                           if($usersick == "wedding")
1294                             $whosick = $user;
1295                         }
1296                       /* who won the trick */
1297                       $play     = DB_get_cards_by_trick($trickid);
1298                       $winner   = get_winner($play,$gametype); /* returns the position */
1299                       $winnerid = DB_get_userid_by_gameid_and_position($gameid,$winner);
1300                       /* is tricknr <=3 */
1301                       if($tricknr <=3 && $winnerid!=$whosick)
1302                         {
1303                           /* set resolved at tricknr*/
1304                           $resolved = DB_set_sickness_by_gameid($gameid,$tricknr);
1305                           /* set partner */
1306                           $whash = DB_get_hash_from_gameid_and_userid($gameid,$winnerid);
1307                           DB_set_party_by_hash($whash,"re");
1308                         }
1309                       if($tricknr == 3 && $winnerid==$whosick)
1310                         {
1311                           /* set resolved at tricknr*/
1312                           $resolved = DB_set_sickness_by_gameid($gameid,'3');
1313                         }
1314                     }
1315                 }
1316
1317               /* if sequence == 4, set winner of the trick, count points and set the next player */
1318               if($sequence==4)
1319                 {
1320                   $play   = DB_get_cards_by_trick($trickid);
1321                   $winner = get_winner($play,$gametype); /* returns the position */
1322
1323                   /* check if someone caught a fox */
1324                   if(DB_get_gametype_by_gameid($gameid)!="solo")
1325                     foreach($play as $played)
1326                       {
1327                         if ( $played['card']==19 || $played['card']==20 )
1328                           if ($played['pos']!= $winner )
1329                             {
1330                               /* possible caught a fox, check party */
1331                               $uid1 = DB_get_userid_by_gameid_and_position($gameid,$winner);
1332                               $uid2 = DB_get_userid_by_gameid_and_position($gameid,$played['pos']);
1333
1334                               $party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
1335                               $party2 = DB_get_party_by_gameid_and_userid($gameid,$uid2);
1336
1337                               if($party1 != $party2)
1338                                 mysql_query("INSERT INTO Score".
1339                                             " VALUES( NULL,NULL,$gameid,'$party1',$uid1,$uid2,'fox')");
1340                             }
1341                       }
1342                   /* check for karlchen (jack of clubs in the last trick)*/
1343                   if(DB_get_gametype_by_gameid($gameid)!="solo" && $tricknr == 12)
1344                     foreach($play as $played)
1345                       if ( $played['card']==11 || $played['card']==12 )
1346                         if ($played['pos'] == $winner )
1347                           {
1348                             /* possible caught a fox, check party */
1349                             $uid1   = DB_get_userid_by_gameid_and_position($gameid,$winner);
1350                             $party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
1351
1352                             mysql_query("INSERT INTO Score".
1353                                         " VALUES( NULL,NULL,$gameid,'$party1',$uid1,NULL,'karlchen')");
1354                           }
1355                   /* check for doppelopf (>40 points)*/
1356                   $points = 0;
1357                   foreach($play as $played)
1358                     {
1359                       $points += DB_get_card_value_by_cardid($played['card']);
1360                     }
1361                   if($points > 39)
1362                     {
1363                       $uid1   = DB_get_userid_by_gameid_and_position($gameid,$winner);
1364                       $party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
1365
1366                       mysql_query("INSERT INTO Score".
1367                                   " VALUES( NULL,NULL,$gameid,'$party1',$uid1,NULL,'doko')");
1368                     }
1369
1370                   if($winner>0)
1371                     mysql_query("UPDATE Trick SET winner='$winner' WHERE id='$trickid'");
1372                   else
1373                     echo "ERROR during scoring";
1374
1375                   if($debug)
1376                     echo "DEBUG: position $winner won the trick <br />";
1377
1378                   /* who is the next player? */
1379                   $next = $winner;
1380                 }
1381               else
1382                 {
1383                   $next = DB_get_pos_by_hash($me)+1;
1384                 }
1385               if($next==5) $next=1;
1386
1387               /* check for coment */
1388               if(myisset("comment"))
1389                 {
1390                   $comment = $_REQUEST["comment"];
1391                   if($comment != "")
1392                     DB_insert_comment($comment,$playid,$myid);
1393                 };
1394
1395               /* display played card */
1396               $pos = DB_get_pos_by_hash($me);
1397               if($sequence==1)
1398                 {
1399                   echo "  <li onclick=\"hl('".($tricknr)."');\" class=\"current\"><a href=\"#\">Trick ".($tricknr)."</a>\n".
1400                     "    <div class=\"trick\" id=\"trick".($tricknr)."\">\n".
1401                     "      <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n";
1402                 }
1403
1404               echo "<div class=\"card".($pos-1)."\">";
1405
1406               /* display comments */
1407               display_card($card,$PREF["cardset"]);
1408               if($comment!="")
1409                 echo "  <span class=\"comment\"> ".$comment."</span>\n";
1410               echo "</div></div></li>\n";
1411
1412               /*check if we still have cards left, else set status to gameover */
1413               if(sizeof(DB_get_hand($me))==0)
1414                 {
1415                   DB_set_hand_status_by_hash($me,'gameover');
1416                   $mystatus = 'gameover';
1417                 }
1418
1419               /* if all players are done, set game status to game over,
1420                * get the points of the last trick and send out an email
1421                * to all players
1422                */
1423               $userids = DB_get_all_userid_by_gameid($gameid);
1424
1425               $done=1;
1426               foreach($userids as $user)
1427                 if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='gameover')
1428                   $done=0;
1429
1430               if($done)
1431                 DB_set_game_status_by_gameid($gameid,"gameover");
1432
1433               /* email next player, if game is still running */
1434               if(DB_get_game_status_by_gameid($gameid)=='play')
1435                 {
1436                   $next_hash = DB_get_hash_from_game_and_pos($gameid,$next);
1437                   $email     = DB_get_email_by_hash($next_hash);
1438                   $who       = DB_get_userid_by_email($email);
1439                   DB_set_player_by_gameid($gameid,$who);
1440
1441                   $message = "A card has been played in game ".DB_format_gameid($gameid).".\n\n".
1442                     "It's your turn  now.\n".
1443                     "Use this link to play a card: ".$host."?me=".$next_hash."\n\n" ;
1444                   if( DB_get_email_pref_by_uid($who)!="emailaddict" )
1445                     mymail($email,$EmailName."a card has been played in game ".DB_format_gameid($gameid),$message);
1446                 }
1447               else /* send out final email */
1448                 {
1449                   /* individual score */
1450                   $result = mysql_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party FROM Hand".
1451                                 " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
1452                                 " LEFT JOIN User ON User.id=Hand.user_id".
1453                                 " LEFT JOIN Play ON Trick.id=Play.trick_id".
1454                                 " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
1455                                 " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
1456                                 " WHERE Hand.game_id='$gameid'".
1457                                 " GROUP BY User.fullname" );
1458                   $message  = "The game is over. Thanks for playing :)\n";
1459                   $message .= "Final score:\n";
1460                   while( $r = mysql_fetch_array($result,MYSQL_NUM))
1461                     $message .= "   ".$r[0]."(".$r[2].") ".$r[1]."\n";
1462
1463                   $result = mysql_query("SELECT  Hand.party, IFNULL(SUM(Card.points),0) FROM Hand".
1464                                 " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
1465                                 " LEFT JOIN User ON User.id=Hand.user_id".
1466                                 " LEFT JOIN Play ON Trick.id=Play.trick_id".
1467                                 " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
1468                                 " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
1469                                 " WHERE Hand.game_id='$gameid'".
1470                                 " GROUP BY Hand.party" );
1471                   $message .= "\nTotals:\n";
1472                   $re     = 0;
1473                   $contra = 0;
1474                   while( $r = mysql_fetch_array($result,MYSQL_NUM))
1475                     {
1476                       $message .= "    ".$r[0]." ".$r[1]."\n";
1477                       if($r[0] == "re")
1478                         $re = $r[1];
1479                       else if($r[0] == "contra")
1480                         $contra = $r[1];
1481                     }
1482
1483                   /*
1484                    * save score in database
1485                    *
1486                    */
1487
1488                   /* get calls from re/contra */
1489                   $call_re     = NULL;
1490                   $call_contra = NULL;
1491                   foreach($userids as $user)
1492                     {
1493                       $hash  = DB_get_hash_from_gameid_and_userid($gameid,$user);
1494                       $call  = DB_get_call_by_hash($hash);
1495                       $party = DB_get_party_by_hash($hash);
1496
1497                       if($call!=NULL)
1498                         {
1499                           $call = (int) $call;
1500
1501                           if($party=="re")
1502                             {
1503                               if($call_re==NULL)
1504                                 $call_re = $call;
1505                               else if( $call < $call_re)
1506                                 $call_re = $call;
1507                             }
1508                           else if($party=="contra")
1509                             {
1510                               if($call_contra==NULL)
1511                                 $call_contra = $call;
1512                               else if( $call < $call_re)
1513                                 $call_contra = $call;
1514                             }
1515                         }
1516                     }
1517
1518                   /* figure out who one */
1519                   $winning_party = NULL;
1520
1521                   if($call_re == NULL && $call_contra==NULL)
1522                     if($re>120)
1523                       $winning_party="re";
1524                     else
1525                       $winning_party="contra";
1526                   else
1527                     {
1528                       if($call_re)
1529                         {
1530                           $offset = 120 - $call_re;
1531                           if($call_re == 0)
1532                             $offset--; /* since we use a > in the next equation */
1533
1534                           if($re > 120+$offset)
1535                             $winning_party="re";
1536                           else if ( $call_contra == NULL )
1537                             $winning_party="contra";
1538                         }
1539
1540                       if($call_contra)
1541                         {
1542                           $offset = 120 - $call_contra;
1543                           if($call_contra == 0)
1544                             $offset--; /* since we use a > in the next equation */
1545
1546                           if($contra > 120+$offset)
1547                             $winning_party="contra";
1548                           else if ( $call_contra == NULL )
1549                             $winning_party="re";
1550                         }
1551                     }
1552
1553                   /* one point for each call of the other party in case the other party didn't win
1554                    * and one point each in case the party made more than points than one of the calls
1555                    */
1556                   if($winning_party!="contra" && $call_contra!=NULL)
1557                     {
1558                       for( $p=$call_contra;$p<=120; $p+=30 )
1559                         {
1560                           mysql_query("INSERT INTO Score".
1561                                       " VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'against$p')");
1562                         }
1563
1564                       for( $p=$call_contra; $p<120; $p+=30)
1565                         {
1566                           if( $re >= $p )
1567                             mysql_query("INSERT INTO Score".
1568                                         " VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'made$p')");
1569                         }
1570                     }
1571                   if($winning_party!="re" and $call_re!=NULL)
1572                     {
1573                       for( $p=$call_re;$p<=120; $p+=30 )
1574                         {
1575                           mysql_query("INSERT INTO Score".
1576                                       " VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'against$p')");
1577                         }
1578
1579                       for( $p=$call_re; $p<120; $p+=30)
1580                         {
1581                           if( $contra>=$p )
1582                             mysql_query("INSERT INTO Score".
1583                                         " VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'made$p')");
1584                         }
1585                     }
1586
1587                   /* point in case contra won */
1588                   if($winning_party=="contra")
1589                     {
1590                       mysql_query("INSERT INTO Score".
1591                                   " VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'againstqueens')");
1592                     }
1593
1594                   /* one point each for winning and each 30 points + calls */
1595                   if($winning_party=="re")
1596                     {
1597                       foreach(array(120,150,180,210,240) as $p)
1598                         {
1599                           $offset = 0;
1600                           if($p==240 || $call_contra!=NULL)
1601                             $offset = 1;
1602
1603                           if($re>$p-$offset)
1604                             mysql_query("INSERT INTO Score".
1605                                         " VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'".(240-$p)."')");
1606                         }
1607                       /* re called something and won */
1608                       foreach(array(0,30,60,90,120) as $p)
1609                         {
1610                           if($call_re!=NULL && $call_re<$p+1)
1611                             mysql_query("INSERT INTO Score".
1612                                         " VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'call$p')");
1613                         }
1614                     }
1615                   else if( $winning_party=="contra")
1616                     {
1617                       foreach(array(120,150,180,210,240) as $p)
1618                         {
1619                           $offset = 0;
1620                           if($p==240 || $call_re!=NULL)
1621                             $offset = 1;
1622
1623                           if($contra>$p-$offset)
1624                             mysql_query("INSERT INTO Score".
1625                                         " VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'".(240-$p)."')");
1626                         }
1627                       /* re called something and won */
1628                       foreach(array(0,30,60,90,120) as $p)
1629                         {
1630                           if($call_contra!=NULL && $call_contra<$p+1)
1631                             mysql_query("INSERT INTO Score".
1632                                         " VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'call$p')");
1633                         }
1634                     }
1635
1636
1637                   /* send out final email */
1638                   $all = array();
1639
1640                   foreach($userids as $user)
1641                     $all[] = DB_get_email_by_userid($user);
1642                   $To = implode(",",$all);
1643
1644                   $help = "\n\n (you can use reply all on this email to reach all the players.)\n";
1645                   mymail($To,$EmailName."game over (game ".DB_format_gameid($gameid).") part 1(2)",$message.$help);
1646
1647                   foreach($userids as $user)
1648                     {
1649                       $To   = DB_get_email_by_userid($user);
1650                       $hash = DB_get_hash_from_gameid_and_userid($gameid,$user);
1651
1652                       $link = "Use this link to have a look at game ".DB_format_gameid($gameid).": ".$host."?me=".$hash."\n\n" ;
1653                       if( DB_get_email_pref_by_uid($user) != "emailaddict" )
1654                         mymail($To,$EmailName."game over (game ".DB_format_gameid($gameid).") part 2(2)",$link);
1655                     }
1656                 }
1657             }
1658           else
1659             {
1660               echo "can't find that card?! <br />\n";
1661             }
1662         }
1663       else if(myisset("card") && !$myturn )
1664         {
1665           echo "please wait until it's your turn! <br />\n";
1666         }
1667
1668       if($seq!=4 && $trickNR>1)
1669         echo "    </div>\n  </li>\n";  /* end div trick, end li trick */
1670
1671       /* display points in case game is over */
1672       if($mystatus=='gameover' && DB_get_game_status_by_gameid($gameid)=='gameover' )
1673         {
1674           echo "  <li onclick=\"hl('13');\" class=\"current\"><a href=\"#\">Score</a>\n".
1675             "    <div class=\"trick\" id=\"trick13\">\n";
1676           /* add pic for re/contra
1677            "      <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n";*/
1678
1679           $result = mysql_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party,Hand.position FROM Hand".
1680                                 " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
1681                                 " LEFT JOIN User ON User.id=Hand.user_id".
1682                                 " LEFT JOIN Play ON Trick.id=Play.trick_id".
1683                                 " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
1684                                 " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
1685                                 " WHERE Hand.game_id='$gameid'".
1686                                 " GROUP BY User.fullname" );
1687           while( $r = mysql_fetch_array($result,MYSQL_NUM))
1688             echo "      <div class=\"card".($r[3]-1)."\">\n".
1689                  "        <span class=\"score\">".$r[2]."<br /> ".$r[1]."</span>\n".
1690                  "      </div>\n";
1691
1692           echo "    </div>\n  </li>\n";  /* end div trick, end li trick */
1693         }
1694
1695
1696       echo "</ul>\n"; /* end ul tricks*/
1697
1698       $mycards = DB_get_hand($me);
1699       $mycards = mysort($mycards,$gametype);
1700       echo "<div class=\"mycards\">\n";
1701
1702       if($myturn && !myisset("card") && $mystatus=='play' )
1703         {
1704           echo "Hello ".$myname.", it's your turn!  <br />\n";
1705           echo "Your cards are: <br />\n";
1706
1707           /* do we have to follow suite? */
1708           $followsuit = 0;
1709           if(have_suit($mycards,$firstcard))
1710             $followsuit = 1;
1711
1712           foreach($mycards as $card)
1713             {
1714               if($followsuit && !same_type($card,$firstcard))
1715                 display_card($card,$PREF["cardset"]);
1716               else
1717                 display_link_card($card,$PREF["cardset"]);
1718             }
1719         }
1720       else if($mystatus=='play' )
1721         {
1722           echo "Your cards are: <br />\n";
1723           foreach($mycards as $card)
1724             display_card($card,$PREF["cardset"]);
1725         }
1726       else if($mystatus=='gameover')
1727         {
1728           $oldcards = DB_get_all_hand($me);
1729           $oldcards = mysort($oldcards,$gametype);
1730           echo "Your cards were: <br />\n";
1731           foreach($oldcards as $card)
1732             display_card($card,$PREF["cardset"]);
1733
1734           $userids = DB_get_all_userid_by_gameid($gameid);
1735           foreach($userids as $user)
1736             {
1737               $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
1738
1739               if($userhash!=$me)
1740                 {
1741                   echo "<br />";
1742
1743                   $name = DB_get_name_by_userid($user);
1744                   $oldcards = DB_get_all_hand($userhash);
1745                   $oldcards = mysort($oldcards,$gametype);
1746                   echo "$name's cards were: <br />\n";
1747                   foreach($oldcards as $card)
1748                     display_card($card,$PREF["cardset"]);
1749                 }
1750             };
1751         }
1752       echo "</div>\n";
1753
1754       /* if the game is over do some extra stuff, therefore exit the swtich statement if we are still playing*/
1755       if($mystatus=='play')
1756         break;
1757
1758       /* the following happens only when the gamestatus is 'gameover' */
1759       /* check if game is over, display results */
1760       if(DB_get_game_status_by_gameid($gameid)=='play')
1761         {
1762           echo "the game is over for you.. other people still need to play though";
1763         }
1764       else
1765         {
1766           $result = mysql_query("SELECT Hand.party, IFNULL(SUM(Card.points),0) FROM Hand".
1767                                 " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
1768                                 " LEFT JOIN User ON User.id=Hand.user_id".
1769                                 " LEFT JOIN Play ON Trick.id=Play.trick_id".
1770                                 " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
1771                                 " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
1772                                 " WHERE Hand.game_id='$gameid'".
1773                                 " GROUP BY Hand.party" );
1774           echo "<div class=\"total\"> Totals:<br />\n";
1775           while( $r = mysql_fetch_array($result,MYSQL_NUM))
1776             echo "  ".$r[0]." ".$r[1]."<br />\n";
1777           echo "</div>\n";
1778
1779         }
1780       break;
1781     default:
1782       myerror("error in testing the status");
1783     }
1784     /* output left menu */
1785     display_user_menu();
1786
1787     /* output right menu */
1788
1789       /* display rule set for this game */
1790     echo "<div class=\"gameinfo\">\n";
1791
1792     if($gamestatus != 'pre')
1793       echo " Gametype: $GT <br />\n";
1794
1795     echo "Rules: <br />\n";
1796     echo "10ofhearts : ".$RULES["dullen"]      ."<br />\n";
1797     echo "schweinchen: ".$RULES["schweinchen"] ."<br />\n";
1798     echo "call:        ".$RULES["call"]        ."<br />\n";
1799
1800     echo "<hr />\n";
1801     if($gamestatus == 'play' )
1802       output_form_calls($me);
1803
1804     /* get time from the last action of the game */
1805     $result  = mysql_query("SELECT mod_date from Game WHERE id='$gameid' " );
1806     $r       = mysql_fetch_array($result,MYSQL_NUM);
1807     $gameend = time() - strtotime($r[0]);
1808
1809     if($gamestatus == 'play' || $gameend < 60*60*24*7)
1810       {
1811         echo "<br />\nA short comment:<input name=\"comment\" type=\"text\" size=\"15\" maxlength=\"100\" />\n";
1812         echo "<hr />";
1813       }
1814
1815     echo "<input type=\"submit\" value=\"submit\" />\n";
1816
1817
1818     if($mystatus=='gameover' && DB_get_game_status_by_gameid($gameid)=='gameover' )
1819       {
1820         echo "<hr />\n";
1821
1822         $session = DB_get_session_by_gameid($gameid);
1823         $result  = mysql_query("SELECT id,create_date FROM Game".
1824                                " WHERE session=$session".
1825                                " ORDER BY create_date DESC".
1826                                " LIMIT 1");
1827         $r = -1;
1828         if($result)
1829           $r = mysql_fetch_array($result,MYSQL_NUM);
1830
1831         if(!$session || $gameid==$r[0])
1832           {
1833             /* suggest a new game with the same people in it, just rotated once (unless last game was solo) */
1834             $names = DB_get_all_names_by_gameid($gameid);
1835             $type  = DB_get_gametype_by_gameid($gameid);
1836
1837             if($type=="solo")
1838               output_ask_for_new_game($names[0],$names[1],$names[2],$names[3],$gameid);
1839             else
1840               output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
1841           }
1842       }
1843
1844     $session = DB_get_session_by_gameid($gameid);
1845     $score = generate_score_table($session);
1846
1847     //  if(size_of($score)>30)
1848       echo $score;
1849
1850     echo "</div>\n";
1851
1852
1853     echo "</form>\n";
1854     output_footer();
1855     DB_close();
1856     exit();
1857  }
1858 /* user status page */
1859 else if( myisset("email","password") || isset($_SESSION["name"]) )
1860    {
1861      /* test id and password, should really be done in one step */
1862      if(!isset($_SESSION["name"]))
1863        {
1864          $email     = $_REQUEST["email"];
1865          $password  = $_REQUEST["password"];
1866        }
1867      else
1868        {
1869          $name = $_SESSION["name"];
1870          $email     = DB_get_email_by_name($name);
1871          $password  = DB_get_passwd_by_name($name);
1872        };
1873
1874      if(myisset("forgot"))
1875        {
1876          $ok = 1;
1877
1878          $myid = DB_get_userid_by_email($email);
1879          if(!$myid)
1880            $ok = 0;
1881
1882          if($ok)
1883            {
1884              /* check how many entries in recovery table */
1885              $number = DB_get_number_of_passwords_recovery($myid);
1886
1887              /* if less than N recent ones, add a new one and send out email */
1888              if( $number < 5 )
1889                {
1890                  echo "Ok, I send you a new password. <br />";
1891                  if($number >1)
1892                    echo "N.B. You tried this already $number times during the last day and it will only work ".
1893                      " 5 times during a day.<br />";
1894                  echo "The new password will be valid for one day, make sure you reset it to something else.<br />";
1895                  echo "Back to the  <a href=\"$host\">main page</a>.";
1896
1897                  $TIME  = (string) time(); /* to avoid collisions */
1898                  $hash  = md5("Anewpassword".$email.$TIME);
1899                  $newpw = substr($hash,1,8);
1900
1901                  $message = "Someone (hopefully you) requested a new password. \n".
1902                    "You can use this email and the following password: \n".
1903                    "   $newpw    \n".
1904                    "to log into the server. The new password is valid for 24h, so make\n".
1905                    "sure you reset your password to something new. Your old password will\n".
1906                    " also still be valid until you set a new one\n";
1907                  mymail($email,$EmailName."recovery ",$message);
1908
1909                  DB_set_recovery_password($myid,md5($newpw));
1910                }
1911              else
1912                {
1913                  echo "Sorry you already tried 5 times during the last 24h.<br />".
1914                    "You need to use one of those passwords or wait to get a new one.<br />";
1915                  echo "Back to the <a href=\"$host\">main page</a>.";
1916                }
1917            }
1918          else
1919            {
1920              if($email=="")
1921                echo "You need to give me an email address! <br />".
1922                  "Please try <a href=\"$host\">again</a>.";
1923              else
1924                echo "Couldn't find a player with this email! <br />".
1925                  "Please contact Arun, if you think this is a mistake <br />".
1926                  "or else try <a href=\"$host\">again</a>.";
1927            }
1928        }
1929      else
1930      {
1931        /* verify password and email */
1932        if(strlen($password)!=32)
1933          $password = md5($password);
1934
1935        $ok  = 1;
1936        $myid = DB_get_userid_by_email_and_password($email,$password);
1937        if(!$myid)
1938          $ok = 0;
1939
1940        if($ok)
1941          {
1942            DB_get_PREF($myid);
1943
1944            if(myisset("setpref"))
1945              {
1946                $setpref=$_REQUEST["setpref"];
1947                switch($setpref)
1948                  {
1949                  case "germancards":
1950                  case "englishcards":
1951                    $result = mysql_query("SELECT * from User_Prefs".
1952                                          " WHERE user_id='$myid' AND pref_key='cardset'" );
1953                    if( mysql_fetch_array($result,MYSQL_NUM))
1954                      $result = mysql_query("UPDATE User_Prefs SET value=".DB_quote_smart($setpref).
1955                                            " WHERE user_id='$myid' AND pref_key='cardset'" );
1956                    else
1957                      $result = mysql_query("INSERT INTO User_Prefs VALUES(NULL,'$myid','cardset',".
1958                                            DB_quote_smart($setpref).")");
1959                    echo "Ok, changed you preferences for the cards.\n";
1960                    break;
1961                  case "emailaddict":
1962                  case "emailnonaddict":
1963                    $result = mysql_query("SELECT * from User_Prefs".
1964                                          " WHERE user_id='$myid' AND pref_key='email'" );
1965                    if( mysql_fetch_array($result,MYSQL_NUM))
1966                      $result = mysql_query("UPDATE User_Prefs SET value=".DB_quote_smart($setpref).
1967                                            " WHERE user_id='$myid' AND pref_key='email'" );
1968                    else
1969                      $result = mysql_query("INSERT INTO User_Prefs VALUES(NULL,'$myid','email',".
1970                                            DB_quote_smart($setpref).")");
1971                    echo "Ok, changed you preferences for sending out emails.\n";
1972                    break;
1973                  }
1974              }
1975            else if(myisset("passwd"))
1976              {
1977                if( $_REQUEST["passwd"]=="ask" )
1978                  {
1979                    /* reset password form*/
1980                    output_password_recovery($email,$password);
1981                  }
1982                else if($_REQUEST["passwd"]=="set")
1983                  {
1984                    /* reset password */
1985                    $ok = 1;
1986
1987                    /* check if old password matches */
1988                    $oldpasswd = md5($_REQUEST["password0"]);
1989                    if(!( ($password == $oldpasswd) || DB_check_recovery_passwords($oldpasswd,$email) ))
1990                      $ok = -1;
1991                    /* check if new passwords are types the same twice */
1992                    if($_REQUEST["password1"] != $_REQUEST["password2"] )
1993                      $ok = -2;
1994
1995                    switch($ok)
1996                      {
1997                      case '-2':
1998                        echo "The new passwords don't match. <br />";
1999                        break;
2000                      case '-1':
2001                        echo "The old password is not correct. <br />";
2002                        break;
2003                      case '1':
2004                        echo "Changed the password.<br />";
2005                        mysql_query("UPDATE User SET password='".md5($_REQUEST["password1"]).
2006                                    "' WHERE id=".DB_quote_smart($myid));
2007                        break;
2008                      }
2009                    /* set password */
2010                  }
2011              }
2012            else /* output default user page */
2013              {
2014                $time     = DB_get_user_timestamp($myid);
2015                $unixtime = strtotime($time);
2016
2017                $offset   = DB_get_user_timezone($myid);
2018                $zone     = return_timezone($offset);
2019                date_default_timezone_set($zone);
2020
2021                $myname = DB_get_name_by_email($email);
2022                $_SESSION["name"] = $myname;
2023
2024                if(isset($_SESSION["name"]))
2025                  output_status($_SESSION["name"]);
2026
2027                /* display links to settings */
2028                output_user_settings();
2029
2030                echo "<div class=\"lastlogin\">last login: ".date("r",$unixtime)."</div>";
2031
2032                DB_update_user_timestamp($myid);
2033
2034                display_user_menu();
2035
2036                echo "<div class=\"user\">";
2037                echo "<h4>These are all your games:</h4>\n";
2038                echo "<p>Session: <br />\n";
2039                echo "<span class=\"gamestatuspre\"> p </span> =  pre-game phase ";
2040                echo "<span class=\"gamestatusplay\">P </span> =  game in progess ";
2041                echo "<span class=\"gamestatusover\">F </span> =  game finished <br />";
2042                echo "</p>\n";
2043
2044                $output = array();
2045                $result = mysql_query("SELECT Hand.hash,Hand.game_id,Game.mod_date,Game.player,Game.status from Hand".
2046                                      " LEFT JOIN Game ON Game.id=Hand.game_id".
2047                                      " WHERE user_id='$myid'".
2048                                      " ORDER BY Game.session,Game.create_date" );
2049                $gamenrold = -1;
2050                echo "<table>\n <tr><td>\n";
2051                while( $r = mysql_fetch_array($result,MYSQL_NUM))
2052                  {
2053                    $game = DB_format_gameid($r[1]);
2054                    $gamenr = (int) $game;
2055                    if($gamenrold < $gamenr)
2056                      {
2057                        if($gamenrold!=-1)
2058                          echo "</td></tr>\n <tr> <td>$gamenr:</td><td> ";
2059                        else
2060                          echo "$gamenr:</td><td> ";
2061                        $gamenrold = $gamenr;
2062                      }
2063                    if($r[4]=='pre')
2064                      {
2065                        echo "\n   <span class=\"gamestatuspre\"><a href=\"".$host."?me=".$r[0]."\">p </a></span> ";
2066
2067                      }
2068                    else if ($r[4]=='gameover')
2069                      echo "\n   <span class=\"gamestatusover\"><a href=\"".$host."?me=".$r[0]."\">F </a></span> ";
2070                    else
2071                      {
2072                        echo "\n   <span class=\"gamestatusplay\"><a href=\"".$host."?me=".$r[0]."\">P </a></span> ";
2073                      }
2074                    if($r[4] != 'gameover')
2075                      {
2076                        echo "</td><td>\n    ";
2077                        if($r[3])
2078                          {
2079                            if($r[3]==$myid)
2080                              echo "(it's <strong>your</strong> turn)\n";
2081                            else
2082                              {
2083                                $name = DB_get_name_by_userid($r[3]);
2084                                $gameid = $r[1];
2085                                if(DB_get_reminder($r[3],$gameid)==0)
2086                                  if(time()-strtotime($r[2]) > 60*60*24*7)
2087                                    echo "".
2088                                      "<a href=\"$host?remind=1&amp;me=".$r[0]."\">Send a reminder.</a>";
2089                                echo "(it's $name's turn)\n";
2090                              };
2091                          }
2092                        if(time()-strtotime($r[2]) > 60*60*24*30)
2093                          echo "".
2094                            "<a href=\"$host?cancle=1&amp;me=".$r[0]."\">Cancel?</a>".
2095                            " (clicking here is final and can't be restored)";
2096
2097                      }
2098                  }
2099                echo "</td></tr>\n</table>\n";
2100                $names = DB_get_all_names();
2101                echo "<h4>Registered players:</h4>\n<p>\n";
2102                echo implode(", ",$names)."\n";
2103                echo "</p>\n</div>";
2104              }
2105          }
2106        else
2107          {
2108            echo "Sorry email and password don't match. Please <a href=\"$host\">try again</a>. <br />";
2109          }
2110      };
2111      output_footer();
2112      DB_close();
2113      exit();
2114    }
2115 /* default login page */
2116  else
2117    {
2118      $pre[0]=0;$game[0]=0;$done[0]=0;
2119      $r=mysql_query("SELECT COUNT(id) FROM Game GROUP BY status");
2120      if($r) {
2121        $pre  = mysql_fetch_array($r,MYSQL_NUM);
2122        $game = mysql_fetch_array($r,MYSQL_NUM);
2123        $done = mysql_fetch_array($r,MYSQL_NUM);
2124      }
2125
2126      $r=mysql_query("SELECT AVG(datediff(mod_date,create_date)) FROM Game where status='gameover' ");
2127      if($r)
2128        $avgage= mysql_fetch_array($r,MYSQL_NUM);
2129      else
2130        $avgage[0]=0;
2131
2132      output_home_page($pre[0],$game[0],$done[0],$avgage[0]);
2133    }
2134
2135 output_footer();
2136
2137 DB_close();
2138
2139 /*
2140  *Local Variables:
2141  *mode: php
2142  *mode: hs-minor
2143  *End:
2144  */
2145 ?>
2146
2147