+ /* output score for each game */
+ $i=0;
+ foreach($score as $game)
+ {
+ $i++;
+ if($i-1<$max-6) continue;
+
+ foreach($game['players'] as $id=>$points)
+ $output.=str_pad($points,6," ",STR_PAD_LEFT)."|";
+ $output.=str_pad($game['points'],4," ",STR_PAD_LEFT);
+
+ /* check for solo */
+ if($game['solo'])
+ $output.= " S|";
+ else
+ $output.= " |";
+
+ $output.="\n";
+ }
+ return $output;
+}
+
+function format_score_table_html($score,$userid)
+{
+ global $INDEX;
+
+ if(sizeof($score)==0)
+ return "";
+
+ $output = "<div class=\"scoretable\">\n<table class=\"score\">\n";
+
+ /* output header */
+ $header = "";
+ $header.= " <thead>\n <tr>\n";
+ $header.= " <th> No </th>";
+ foreach($score[0]['players'] as $id=>$points)
+ {
+ $name = DB_get_name('userid',$id); /*TODO*/
+ $header.= "<th> ".substr($name,0,2)." </th>";
+ }
+ $header.="<th>P</th>\n </tr>\n </thead>\n";
+
+ /* use the same as footer */
+ $footer = "";
+ $footer.= " <tfoot>\n <tr>\n";
+ $footer.= " <td> No </td>";
+ foreach($score[0]['players'] as $id=>$points)
+ {
+ $name = DB_get_name('userid',$id); /*TODO*/
+ $footer.= "<td> ".substr($name,0,2)." </td>";
+ }
+ $footer.="<td>P</td>\n </tr>\n </tfoot>\n";
+
+ /* body */
+ $body = "";
+ $body.= " <tbody>\n";
+ $i=0;
+ foreach($score as $game)
+ {
+ $i++;
+ $body.=" <tr>";
+ $userhash = DB_get_hash_from_gameid_and_userid($game['gameid'],$userid);
+ /* create link to old games only if you are logged in and its your game*/
+ if(isset($_SESSION['id']) && $_SESSION['id']==$userid)
+ $body.=" <td> <a href=\"".$INDEX."?action=game&me=".$userhash."\">$i</a></td>";
+ else
+ $body.=" <td>$i</td>";
+
+ foreach($game['players'] as $id=>$points)
+ $body.="<td>".$points."</td>";
+ $body.="<td>".$game['points'];
+
+ /* check for solo */
+ if($game['solo'])
+ $body.= " S";
+ $body.="</td></tr>\n";
+ }
+
+ $output.=$header;
+ if($i>12)
+ $output.=$footer;
+ $output.=$body;
+
+ $output.=" </tbody>\n</table>\n</div>\n";
+
+ return $output;
+}
+
+function createCache($content, $cacheFile)
+{
+ $fp = fopen($cacheFile,"w");
+ if($fp)
+ {
+ fwrite($fp,$content);
+ fclose($fp);
+ }
+ else
+ echo "WARNING: couldn't create cache file";
+
+ return;
+}
+
+function getCache($cacheFile, $expireTime)
+{
+ if( file_exists($cacheFile) &&
+ filemtime($cacheFile )>( time() - $expireTime ) )
+ {
+ return file_get_contents($cacheFile);
+ }
+
+ return false;
+}
+
+function check_vacation($userid)
+{
+ /* get start date */
+ $result = DB_query_array("SELECT value FROM User_Prefs".
+ " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation start'" );
+ if($result)
+ $start = $result[0];
+ else
+ return NULL;
+
+ /* get end date */
+ $result = DB_query_array("SELECT value FROM User_Prefs".
+ " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation stop'" );
+ if($result)
+ $stop = $result[0];
+ else
+ return NULL;
+
+ /* get comment */
+ $result = DB_query_array("SELECT value FROM User_Prefs".
+ " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation comment'" );
+ if($result)
+ $comment = $result[0];
+ else
+ $comment = '';
+
+ /* check if user is on vacation. TODO: use user's timezone */
+ if( (time() - strtotime($start) >0) &&
+ (strtotime($stop) - time() >0))
+ return array ($start,$stop,$comment);
+ else
+ return NULL;
+}
+
+function cancel_game($why,$gameid)
+{
+ $gameid = DB_quote_smart($gameid);
+
+ /* update the game table */
+ switch($why)
+ {
+ case 'timedout':
+ DB_query("UPDATE Game SET status='cancel-timedout' WHERE id=$gameid");
+ break;
+ case 'nines':
+ DB_query("UPDATE Game SET status='cancel-nines' WHERE id=$gameid");
+ break;
+ case 'trump':
+ DB_query("UPDATE Game SET status='cancel-trump' WHERE id=$gameid");
+ break;
+ case 'noplay':
+ DB_query("UPDATE Game SET status='cancel-noplay' WHERE id=$gameid");
+ break;
+ case 'lowtrump':
+ DB_query("UPDATE Game SET status='cancel-lowtrump' WHERE id=$gameid");
+ break;
+ }
+ /* set each player to gameover */
+ $result = DB_query("SELECT id FROM Hand WHERE game_id=".DB_quote_smart($gameid));
+ while($r = DB_fetch_array($result))
+ {
+ $id = $r[0];
+ DB_query("UPDATE Hand SET status='gameover' WHERE id=".DB_quote_smart($id));
+ }
+
+ return;
+}
+
+function get_user_token($userid)
+{
+
+ $token = NULL;
+
+ $date = DB_get_user_creation_date($userid);
+ $name = DB_get_name('userid',$userid);
+
+ if($date && $name)
+ $token = md5("token".$name.$date);
+
+ return $token;
+}
+
+function verify_password($email, $password)
+{
+ /* verify password, if old password has length 32 assume it's an old md5, else use new password scheme */
+ /* return 0 if verified, else return error code
+ * 1 can't find email
+ * 2 can't calculate correct hash
+ * 3 misc error
+ */
+
+ /* check user email by getting his id */
+ $userid = DB_get_userid('email',$email);
+ if(!$userid)
+ return 1;
+
+ /* test for temporary passwords, only valid for one date (tested in the DB) */
+ $tmppasswd = md5($password);
+ if(DB_check_recovery_passwords($tmppasswd,$email))
+ return 0;
+
+ /* get saved password */
+ $existingpassword = DB_get_passwd_by_userid($userid);
+
+ if(strlen($existingpassword)==32) /* old password type */
+ {
+ if ($existingpassword == md5($password))
+ {
+ /* update password to new crypt version */
+ // create a password hash using the crypt function, need php 5.3 for this
+ // create and random salt
+ $salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
+ // hash incoming password using 12 rounds of blowfish
+ $hash = crypt($password, '$2y$12$' . $salt);
+ if(strlen($hash)>13)
+ DB_query("UPDATE User SET password='$hash' where id='$userid'");
+ else
+ return 2;
+
+ return 0;
+ }
+ }
+ else
+ {
+ if ($existingpassword == crypt($password, $existingpassword))
+ return 0;
+ };
+
+ return 3;
+}
+
+/* language functions */
+function detectlanguage()
+{
+ /* read out browser's prefered language, taken from php-manual*/
+ $langcode = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ $langcode = explode(",", $langcode['0']);
+ return $langcode['0'];
+}
+
+function set_language($l,$type='lang')
+{
+ if($type=='uid')
+ {
+ $userPREF = DB_get_PREF($l);
+ $l = $userPREF['language'];
+ };
+
+ switch($l)
+ {
+ case 'de':
+ putenv("LC_ALL=de_DE");
+ setlocale(LC_ALL, "de_DE");
+ break;
+ default:
+ putenv("LC_ALL=en_US");
+ setlocale(LC_ALL, "en_US");
+ break;
+ }
+
+ // Specify location of translation tables
+ bindtextdomain("edoko", "./locale");
+ bind_textdomain_codeset("edoko", 'UTF-8');
+ // Choose domain
+ textdomain("edoko");
+
+ return;
+}
+
+function get_display_gametype($gameid)
+{
+ /* return a readable string that can be displayed to show the game type
+ * this means hiding silent solo from the user
+ */
+
+ $gametype = DB_get_gametype_by_gameid($gameid);
+
+ if ($gametype == 'normal')
+ $GT = _('normal');
+ else if($gametype=='solo')
+ {
+ $solotype = DB_get_solo_by_gameid($gameid);
+
+ switch($solotype)
+ {
+ case 'trumpless':
+ $GT = _('trumpless solo');
+ break;
+ case 'jack':
+ $GT = _('jack solo');
+ break;
+ case 'queen':
+ $GT = _('queen solo');
+ break;
+ case 'trump':
+ $GT = _('trump solo');
+ break;
+ case 'club':
+ $GT = _('club solo');
+ break;
+ case 'spade':
+ $GT = _('spade solo');
+ break;
+ case 'heart':
+ $GT = _('heart solo');
+ break;
+ case 'silent':
+ $GT = _('normal'); /* this is change compared to $gametype */
+ break;
+ }
+ }
+ else if ($gametype == 'wedding')
+ $GT = _('wedding');
+ else if ($gametype == 'poverty')
+ $GT = _('poverty');
+ else if ($gametype == 'dpoverty')
+ $GT = _('double poverty');
+
+ return $GT;
+}