Reset Button!

You are in Realm #1 Change to Realm: 2 3 4 5
picture from xkcd.com

A project by Christopher Thomas Nicodemus.
Instructions: Just enter a nick name (or leave it blank), and then hit the reset button whenever you want!
How it works: It uses MySQL to store the resets in a database and PHP for the page generation. Then AJAX is used for showing the updated time. The comic to the left is from XKCD.com, it gave me the idea for this project. Complete source code below.
Site Updated: 2014-11-26 fixes for PEAR

It has been 80 days, 19 hours, 51 minutes and 48 seconds since someone reset this sign.
On average, it has been reset every 2 days, 13 hours, 56 minutes and 32 seconds.
Since the beginning in May 2008 the sign has been reset a total of 1466 times.

Your nick name (Max 12):

Most Recent Resets #1-20 >Next
#Nick NameReset TimeWhen
1Not_corey22 days, 5 hours, 42 minutes and 1 secondFri, 21 Sep 2018 04:57:34 -0700
2Cdmium1 day, 10 hours, 54 minutes and 31 secondsWed, 29 Aug 2018 23:15:33 -0700
3Pame13 days, 3 hours and 50 secondsTue, 28 Aug 2018 12:21:02 -0700
4DK198827 days, 10 hours, 45 minutes and 50 secondsWed, 15 Aug 2018 09:20:12 -0700
5lebroncakes15 minutes and 4 secondsWed, 18 Jul 2018 22:34:22 -0700
6FARTS1 day, 9 hours, 46 minutes and 9 secondsWed, 18 Jul 2018 22:19:18 -0700
7Nerikis11 days, 14 hours, 31 minutes and 22 secondsTue, 17 Jul 2018 12:33:09 -0700
8neoliminal10 days, 9 hours, 51 minutes and 45 secondsThu, 05 Jul 2018 22:01:47 -0700
9[noname]4 hours, 40 minutes and 8 secondsMon, 25 Jun 2018 12:10:02 -0700
10_19 hours, 31 minutes and 42 secondsMon, 25 Jun 2018 07:29:54 -0700
11rwa22 hours, 1 minute and 13 secondsSun, 24 Jun 2018 11:58:12 -0700
12pdan4 hours, 29 minutes and 7 secondsSat, 23 Jun 2018 13:56:59 -0700
13Chrispy19 hours, 50 minutes and 48 secondsSat, 23 Jun 2018 09:27:52 -0700
14[noname]22 minutes and 41 secondsFri, 22 Jun 2018 13:37:04 -0700
15Max_128 minutes and 54 secondsFri, 22 Jun 2018 13:14:23 -0700
16[noname]17 days, 11 hours, 37 minutes and 30 secondsFri, 22 Jun 2018 13:05:29 -0700
17Kristin11 days, 17 hours, 40 minutes and 2 secondsTue, 05 Jun 2018 01:27:59 -0700
18Bean12 hours, 15 minutes and 50 secondsThu, 24 May 2018 07:47:57 -0700
19lebroncakes63 days, 11 hours, 28 minutes and 32 secondsWed, 23 May 2018 19:32:07 -0700
20Liv1 minute and 8 secondsWed, 21 Mar 2018 08:03:35 -0700
<Prev Top Resets #21-40 >Next
#Nick NameReset TimeWhen
21Seamus!33 days, 18 hours, 21 minutes and 2 secondsThu, 29 Nov 2012 16:19:19 -0800
22mara!33 days, 2 hours, 12 minutes and 28 secondsSat, 08 Jun 2013 03:28:43 -0700
23DoB31 days, 19 hours, 46 minutes and 53 secondsMon, 29 Nov 2010 08:42:19 -0800
24Artic11231 days, 15 hours, 22 minutes and 14 secondsSat, 15 Oct 2016 04:23:12 -0700
25[noname]30 days, 22 hours, 48 minutes and 49 secondsSat, 12 Dec 2015 15:47:54 -0800
26Sam29 days, 15 hours, 56 minutes and 55 secondsFri, 26 Oct 2012 22:58:17 -0700
27129 days, 2 hours, 8 minutes and 28 secondsMon, 20 Oct 2014 13:02:49 -0700
28uuaksmwz28 days, 20 hours, 57 minutes and 18 secondsThu, 10 Nov 2011 11:11:15 -0800
29Baron28 days, 6 hours, 40 minutes and 40 secondsFri, 20 Jan 2012 06:39:05 -0800
30DUDE27 days, 21 hours, 10 minutes and 59 secondsTue, 06 Sep 2011 10:06:54 -0700
31DK198827 days, 10 hours, 45 minutes and 50 secondsWed, 15 Aug 2018 09:20:12 -0700
32DarkKnight27 days, 6 hours, 19 minutes and 22 secondsTue, 29 Sep 2015 07:19:46 -0700
33Kris27 days, 2 hours, 44 minutes and 32 secondsThu, 16 Feb 2012 09:23:37 -0800
34Isaac26 days, 11 hours, 21 minutes and 44 secondsSat, 03 Aug 2013 02:08:48 -0700
35fogmind26 days, 9 hours, 37 minutes and 38 secondsTue, 03 Aug 2010 04:40:19 -0700
36gigi26 days, 2 hours, 40 minutes and 25 secondsTue, 28 Feb 2017 09:56:27 -0800
37mara!25 days, 18 hours, 48 minutes and 46 secondsSun, 07 Jul 2013 14:47:04 -0700
38Felix25 days, 18 hours, 45 minutes and 9 secondsThu, 26 May 2016 04:14:13 -0700
39dnlbct25 days, 9 hours, 33 minutes and 5 secondsSat, 30 Apr 2016 09:29:04 -0700
40Yuomay24 days, 19 hours, 47 minutes and 38 secondsThu, 15 Dec 2011 05:10:12 -0800
20

The Source Code:
(index.php)
<?php
        $path
="/home/chrisnic/pear/share/pear";
        
set_include_path(get_include_path() . PATH_SEPARATOR $path);
    require_once 
'functions.php';
    require_once 
'DB.php';
    
//require_once 'Pager/Pager.php';
    
session_start();
    
extract($_REQUESTEXTR_REFS);
    
//import_request_variables('g');
    
if (isset($ref))
    {
        
file_put_contents('refs.txt',time() . ' ' $ref."\r\n",FILE_APPEND);
    }
    if (
checkRealm($r)!=0header('location: index.php?r=1'); 
    if (
$lastStart == NULL$lastStart=0;
    if (
$topStart == NULL$topStart=0;
    
?>
<html><head><title>The Reset Button Realm <?=$r?></title>
<!-- script for Google Analytics {START} -->
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-70177-4']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
<!-- script for Google Analytics {END}-->
<!-- script for Google + Button {START}-->
<!-- Place this render call where appropriate -->
<script type="text/javascript">
  (function() {
      var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
          po.src = 'https://apis.google.com/js/plusone.js';
              var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
                })();
                </script>
<!-- script for Google + Button {END}-->


<script type="text/javascript">
//This is the AJAX code that requests the time every second for a period of time.
//This will be replaced with better ajax code in the future.

function GetXmlHttpObject()
{
var xmlHttp=null;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp;
}

function stateChanged() 

    if (xmlHttp.readyState==4)
    { 
    var resp = xmlHttp.responseText;
    //This is the code to decompress the data from the server.
    /*resp = resp.replace('A',' year, ');
    resp = resp.replace('B',' years, ');
    resp = resp.replace('C',' year and ');
    resp = resp.replace('D',' years and ');
    resp = resp.replace('E',' year');
    
    resp = resp.replace('F',' day, ');
    resp = resp.replace('G',' days, ');
    resp = resp.replace('H',' day and ');
    resp = resp.replace('I',' days and ');
    resp = resp.replace('J',' day');

    resp = resp.replace('K',' hour, ');
    resp = resp.replace('L',' hours, ');
    resp = resp.replace('M',' hour and ');
    resp = resp.replace('N',' hours and ');
    resp = resp.replace('O',' hour');

    resp = resp.replace('P',' minute and ');
    resp = resp.replace('Q',' minutes and ');
    resp = resp.replace('R',' minutes');
    resp = resp.replace('S',' minute');
    resp = resp.replace('T',' seconds');
    resp = resp.replace('U',' second');
    resp = resp.replace('V',' less than 1 second');*/
    //document.getElementById("ResetTime").innerHTML=xmlHttp.responseText;
    document.getElementById("ResetTime").innerHTML=resp;
    }
}

function showTime()
{
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null)
  {
  alert ("Your browser does not support AJAX!");
  return;
  } 
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open("GET","getReset.php?r=<?=$r?>",true);
xmlHttp.send(null);
}
function t()
{
    showTime();
}
var Updateid = setInterval('t()',1100);
// Update for up to 10 days.
setTimeout('clearInterval(Updateid)', Math.random()*60000*10080);
</script>
</head>
<body>
<?php
    $t 
time();
    
$LastReset getLastReset($r);
echo 
'<table><tr><td><h1>Reset Button!<!-- Place this tag where you want the +1 button to render -->
<div class="g-plusone" data-annotation="inline" data-href="http://TheResetButton.org/"></div></h1></td><tr><td><font size="-1">You are in Realm #<b>' 
$r '</b> Change to Realm:'
    echo (
$r=='' || $r==1)?' ':'<a href="?r=1">1</a> '
    echo (
$r==2)?' ':'<a href="?r=2">2</a> ';
    echo (
$r==3)?' ':'<a href="?r=3">3</a> ';
    echo (
$r==4)?' ':'<a href="?r=4">4</a> ';
    echo (
$r==5)?'':'<a href="?r=5">5</a>';
    echo 
'</font></td></tr></table>';
    
//die();
    
echo '<table><tr><td><a href="http://xkcd.com/363/"><img alt="picture from xkcd.com" 
    src="http://imgs.xkcd.com/comics/reset.png"></a></td><td width="400">'
;
    echo 
'<font size="+1"><p>A project by Christopher Thomas Nicodemus.<br><b>Instructions: Just enter a nick name (or leave 
    it blank), and then hit the reset button whenever you want!</b><br> How it works: 
    It uses MySQL to store the resets in a database and 
    PHP for the page generation.  Then AJAX is used for showing the updated time.  
    The comic to the left is from XKCD.com, it gave me the idea for this project.
    Complete source code below.
    <br> Site Updated: 2014-11-26 fixes for PEAR<br>
    </p></font></td></tr></table>'
;
    
/*Site Updated: 2008-09-11<br>Added multiple realms with their own reset times.
    <br>Added top resets and recent resets list<br>Time data now compressed to save a little bandwidth*/
    
echo '<h2>It has been <span id="ResetTime">' createTime$t $LastReset ) . '</span> since someone reset this sign.  '
    echo 
'<br> On average, it has been reset every '.createTime(getAverageResetTime($r)) . '.';
    echo 
'<br> Since the beginning in ';
    echo ((
$r==1)?'May':'September'); 
    echo 
' 2008 the sign has been reset a total of ' getResetCount($r) . ' times.';
    echo 
'<form action="reset.php" method="post">';
    echo 
'<input type="hidden" value="' CreateResetCode$t ) . '" name="rcode">';
    echo 
'<input type="hidden" value="' $r '" name="r">';
    if (
$err == 1)
        echo 
"<br><b>Invalid reset button click.<b><br>";
    echo 
'<h3>Your nick name (Max 12):<br><input type="text" value="'.$_SESSION['nickname'].'" name="nickname" size="12" 
    maxlength="12">'
;
    echo 
'<br><input type="submit" value="RESET"></h3></form>';
    echo 
'<table>';
/*    echo '<td><b>The last 20 resets in realm ' . $r . '!</b></td>';
    echo '<td><b>The highest 20 resets in realm ' . $r . '!</b></td>';*/
    
echo '<td>';
    echo 
getLastResets(20verifyStart($lastStart), verifyStart($topStart), $r);
    echo 
'</td><td>';
    echo 
getTopResets(20verifyStart($topStart), verifyStart($lastStart), $r);
    echo 
'</td></tr></table>';
    echo 
verifyStart($topStart);
        
    
//Dump the source code!
/*    if ($src!=1)
    {
        echo '<h4><a href="index.php?r=' . $r . '&lastStart='. verifyStart($lastStart) .'&topStart='.verifyStart($topStart).'&src=1">Show Source Code</a>';
    }
    else {*/
    
echo '<h4>The Source Code: <br><B>(index.php)</B><br>';
    
highlight_file("index.php");
    echo 
'<br><br><B>(reset.php)</B><br>';
    
highlight_file("reset.php");
    echo 
'<br><br><B>(functions.php)</B><br>';
    
highlight_file("functions.php");
    echo 
'<br><br><B>(getReset.php)</B><br>';
    
highlight_file("getReset.php");
    echo 
'<br><br><B>(userstats.php)</B><br>';
    
highlight_file("userstats.php");
    echo 
'</h4>';//}
    
echo '<br><br>';
    
cleanupOldResetCodes();
    
?>
</body></html>


(reset.php)
<?php
    
//This checks the RCode and if it is a valid reset click, do the reset!
    
file_put_contents("pre1",microtime(true));
    
session_start();
        
$path="/home/chrisnic/pear/share/pear";
        
set_include_path(get_include_path() . PATH_SEPARATOR $path);
    require_once 
'functions.php';
    require_once 
'DB.php';
//    import_request_variables('gp');
    
extract($_REQUESTEXTR_REFS);
    if (
checkRealm($r) != 0$r=1;
    
$t time();
    
$LastReset getLastReset($r);
    if (
checkResetCode($rcode)!=|| checkRealm($r)!=0)
    {
        
header('Location: index.php?err=1');
        die();
    }
    
unlink(escapeshellcmd('rcodes/'.$rcode));
    if (
strlen($nickname)>12) { $nickname substr($nickname,0,12); }
    
$_SESSION['nickname'] = $nickname;
    
//if ($nickname=="") $nickname = 'rand' . mt_rand(0,99999);
    
updateReset($nickname$LastReset$t$r);
    
file_put_contents("post1",microtime(true));
    
header('Location: index.php?r=' $r)
?>


(functions.php)
<?php
function db_connect() {
    
//Here we make a connection to the database
    
$phptype "mysqli";
    require (
'PRIVATE.inc');  //login information
    
$dsn $phptype "://" $username ":" $password "@" $hostspec "/" $database;
    
$db  = & DB::connect $dsn$options );
    if (
PEAR::isError $db )) {
        die ( 
$db->getMessage () );
    }
    
$db->setFetchMode DB_FETCHMODE_ASSOC );
    return 
$db;
}

function 
CreateTime($t) {
    
// This takes a number of seconds and converts it to a format like x years, y days, and z seconds.
    
$years floor $t / (86400 365) );
    
$t -= $years * (86400 365);
    
$days floor $t / (86400) );
    
$t -= $days * (86400);
    
$hours floor $t / (3600) );
    
$t -= $hours * (3600);
    
$minutes floor $t / (60) );
    
$t -= $minutes * (60);
    
$secs round $t );
    
//Got years?
    
$msg = ($years >= $years . (($years || $years == 0) ? 'years' 'year') : '');
    
//Do we say and or put a , or is this it?
    
$msg .= ($years >= && (($days == && $hours == && $minutes == && $secs != 0) || 
    (
$days == && $hours == && $minutes != && $secs == 0) || 
    (
$days == && $hours != && $minutes == && $secs == 0) || 
    (
$days != && $hours == && $minutes == && $secs == 0))) ? ' and ' 
    ((
$years >= && ($days >= || $hours >= || $minutes >= || $seconds >= 1)) ? ', ' '');
    
//Do we have days?
    
$msg .= ($days >= $days . (($days || $days == 0) ? ' days' ' day') : '');
    
//Do we say and or put a , or is this it?
    
$msg .= ($days >= && (($hours == && $minutes == && $secs != 0) || 
    (
$hours == && $minutes != && $secs == 0) || 
    (
$hours != && $minutes == && $secs == 0))) ? ' and ' 
    ((
$days >= && ($hours >= || $minutes >= || $secs >= 1)) ? ', ' '');
    
//Got hours?
    
$msg .= ($hours >= $hours . (($hours || $hours == 0) ? ' hours' ' hour') : '');
    
//Do we say and or put a , or is this it?
    
$msg .= ($hours >= && (($minutes == && $secs != 0) || ($minutes != && $secs == 0))) ? ' and ' 
    ((
$hours >= && ($minutes >= || $secs >= 1)) ? ', ' '');
    
// Got minutes???
    
$msg .= ($minutes >= $minutes . (($minutes || $minutes == 0) ? ' minutes' ' minute') : '');
    
//Do we say and or is this it?
    
$msg .= ($minutes >= && ($secs != 0)) ? ' and ' '';
    
// finally the seconds!
    
$msg .= ($secs >= $secs . (($secs || $secs == 0) ? ' seconds' ' second') : '');
    
// Less than 1 second.....
    
if ($years == && $days == && $hours == && $minutes == && $secs == 0)
        
$msg 'less than 1 second';
    return 
$msg;
}

function 
CreateResetCode() {
    
//Create a reset code, so someone can't just reset by visiting the reset URL.
    
$id uniqID ""true );
    
file_put_contents 'rcodes/' $id"" );
    return 
$id;
}

function 
getLastReset($r=1) {
    
//Just pull the last reset time from the file...
    //We used to pull it from the database, felt it might be too much load on the DB
    //to request it every sec.
    /*    $db = db_connect();
    $query = "SELECT MAX(`reset`) FROM resetbutton";
    $res =& $db->query($query);
    if (PEAR::isError($res)) 
        die($res->getMessage().'2348');
    $row =& $res->fetchRow();
    return $row['MAX(`reset`)'];
*/
    
return file_get_contents 'LastReset' $r );
}

function 
getAverageResetTime($r=1) {
    
//This displays the average reset time on the main page.
    
$db db_connect ();
    
$query "SELECT AVG(`gap`) FROM resetbutton WHERE `realm`=$r";
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . '23fds48' );
    
$row = & $res->fetchRow ();
    return 
$row ['AVG(`gap`)'];
}

function 
getResetCount($r=1) {
    
//This function returns the total number of times the button has been hit.
    
$db db_connect ();
    
$query "SELECT count(*) FROM resetbutton WHERE `realm` = $r";
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . 'count23fds48' );
    
$row = & $res->fetchRow ();
    return 
$row ['count(*)'];
}

function 
getLastResets($count$start=0$otherStart=0$r=1) {
    
//This functions displays the last so many resets,  a person can walk through the list.
    
$rCount getResetCount($r);
    
$db db_connect ();
    
//    $limitStart = getResetCount() - $count;
    
$query "SELECT `reset` , `gap` , `user`
             FROM `resetbutton` WHERE `realm` = 
$r
             ORDER BY `reset` DESC
             LIMIT 
$start , $count
             "
;
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . 'getLastResets23fds48 ' $query);
        
//    $row = array_reverse($row);
    
$ret '<table><caption><b>';
    if (
$start 0)
        
$ret .= '<a href="index.php?r=' $r '&lastStart=' .    
            (
$start-$count>0?$start-$count:'0') . '&topStart=' $otherStart
            
'">&lt;Prev</a>';
    
$ret .= ' Most Recent Resets #'. ($start+1) . '-' . (($start+$count)>=$rCount?($rCount):($start+$count)); 
    if (
$start+$count $rCount) {
            
$ret .= ' <a href="index.php?r=' $r '&lastStart=' .    
            (
$start+(($rCount-($start+$count))>$count?$count:($rCount-($start+$count)))) . '&topStart=' $otherStart
            
'">&gt;Next</a>';//' ' . (($rCount-($start+$count))>$count?$count:($rCount-($start+$count))) . ' entries</a>';
    
}
    
$ret .= '</b></caption><tr><td>#</td><td>Nick Name</td><td>Reset Time</td><td>When</td></tr>';
    
$x $start+1;
    while ( 
$row = & $res->fetchRow () ) {
        
$ret .= '<tr><td>' $x++ . '</td><td><a href="userstats.php?user=' 
        
urlencode($row['user']) . '&r='$r '">';
        if (
$row['user']==''
            
$ret .= '[noname]';
        else 
            
$ret .= str_replace(' ','_',htmlspecialchars($row ['user'])); 
        
$ret .= '</a></td><td>' 
        
createTime $row ['gap'] ) . '</td><td>' 
        
date 'r'$row ['reset'] ) . '</td></tr>';
       }
    
$ret .= "</table>";
    return 
$ret;
}
function 
getTopResets($count,$start=0,$otherStart=0,$r=1) {
    
//This functions displays the best reset times,  a person can walk through the list.
    
    
$rCount getResetCount($r);
    
$db db_connect ();
    
$limitStart getResetCount () - $count;
    
$query "SELECT `reset` , `gap` , `user`
              FROM `resetbutton` WHERE `realm` = 
$r
              ORDER BY `gap` DESC
              LIMIT 
$start , $count";
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . 'getTopResets23fds48' );
    
$ret '<table><caption><b>';
    if (
$start 0)
        
$ret .= '<a href="index.php?r=' $r '&lastStart=' .    
            
$otherStart '&topStart=' . ($start-$count>0?$start-$count:'0')
            . 
'">&lt;Prev</a>';
    
$ret .= ' Top Resets #'. ($start+1) . '-' . (($start+$count)>=$rCount?($rCount):($start+$count)); 
    if (
$start+$count $rCount) {
            
$ret .= ' <a href="index.php?r=' $r '&lastStart=' .    
            
$otherStart '&topStart=' . ($start+(($rCount-($start+$count))>$count?$count:($rCount-($start+$count))))
            . 
'">&gt;Next</a>';//' ' . (($rCount-($start+$count))>$count?$count:($rCount-($start+$count))) . ' entries</a>';
    
}
    
$ret .= '</b></caption><tr><td>#</td><td>Nick Name</td><td>Reset Time</td><td>When</td></tr>';
    
$x $start+1;
    while ( 
$row = & $res->fetchRow () ) {
        
$ret .= '<tr><td>' $x++ . '</td><td><a href="userstats.php?user=' 
        
urlencode($row['user']) . '&r='$r '">';
        if (
$row['user']==''
            
$ret .= '[noname]';
        else 
            
$ret .= str_replace(' ','_',htmlspecialchars($row ['user'])); 
        
$ret .= '</a></td><td>' 
        
createTime $row ['gap'] ) . '</td><td>' 
        
date 'r'$row ['reset'] ) . '</td></tr>';
    }
    
$ret .= "</table>";
    return 
$ret;
}

function 
verifyStart($num) {
    
//Check that a list view number is actually a number.
    
if (isInteger($num)) return $num;
    return 
0;
}

function 
isInteger($num){
    
//Check if the provided number is an integer.
    
return(ctype_digit(strval($num)));
}

function 
getUserStats($user$r=1) {
    
//Stats for individual users.  Displays resets and average reset time.
        
$db=db_connect();
    
$query "SELECT `reset` , `gap` , `user`
             FROM `resetbutton` WHERE `realm` = 
$r AND `user` = " $db->quoteSmart(stripcslashes($user)) . 
             ORDER BY `reset` DESC
             "
;
    
$res =& $db->query($query);
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . 'getUserStats23fds48 ' $query );
    
$count=0;
    
$ret 'Resets for user: ' . ($user==''?'[noname]':stripcslashes($user)) . ' in realm #' $r '<br><table><tr><td>Reset Time</td><td>When</td></tr>';
    while ( 
$row = & $res->fetchRow () ) {
        
$ret .= '<tr><td>' createTime $row ['gap'] ) . '</td><td>' date 'r'$row ['reset'] ) . '</td></tr>';
        
$count++;
    }
    
$ret .= "</table><br>Total Resets: $count<br>Average Reset Time: ";
    
$query "SELECT AVG(`gap`) FROM resetbutton WHERE `realm`=$r AND `user` = " $db->quoteSmart($user);
//    echo  $query;
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . 'getuseraverage23fds48' );
    
$row = & $res->fetchRow ();
    
$ret .= createTime($row['AVG(`gap`)']);
    return 
$ret;
}

function 
checkResetCode($rcode) {
    
//Verify that the reset code is a valid one, then reset and delete the code.
    
if (ereg 
    
'[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 
    
'[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' .
    
'\.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'$rcode )) {
        if (!
file_exists('rcodes/'.$rcode)) {
            return - 
1;
        }
    } else {
        return - 
1;
    }
    return 
0;
}

function 
updateReset($nick$last$curr$r=1) {
    
//This occurs when a person validly hits the reset button.
    
$db db_connect ();
    
$nick str_replace('[noname]','noname',$nick);  //Don't let people call themselves [noname]
    
$query 'INSERT INTO `resetbutton` ( `reset` , `gap` , `user` , `IP` , `realm` )
                VALUES (' 
$curr ' , ' . ($curr $last) . ' , ' $db->quoteSmart $nick ) . ' , \'' $_SERVER ['REMOTE_ADDR'] . '\' , \'' $r '\');';
    
$res = & $db->query $query );
    if (
PEAR::isError $res ))
        die ( 
$res->getMessage () . '12  ' $query );
    
file_put_contents 'LastReset' $r$curr );
    return 
0;
}
function 
checkRealm($r) {
    
//verify that the supplied realm number is valid
    
if ($r==|| $r==|| $r==|| $r==|| $r==5)
        return 
0;
    return 
5;
}
function 
cleanupOldResetCodes() {
    
$days "15"// delete all files older than this many days
    
$seconds = ($days*24*60*60);

    
$dir    'rcodes/';
    
$files scandir($dir);

    foreach (
$files as $num => $fname){
        if (
$fname!='.' && $fname!='..')
        {
                if (
file_exists("{$dir}{$fname}") && ((time() - filemtime("{$dir}{$fname}")) > $seconds)) {
                
$mod_time filemtime("{$dir}{$fname}");
                if (
unlink("{$dir}{$fname}")){$del $del 1; echo "Deleted: {$del} - {$fname} --- ".(time()-$mod_time)." seconds old<br>";}
                
//if (1==1){$del = $del + 1; echo "Deleted: {$del} - {$fname} --- ".(time()-$mod_time)." seconds old";}
            
}
        }
    }
}


?>


(getReset.php)
<?php
//This is the page that is requested every second to update the last reset time to the client.
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
function 
createTime($t$r=1) {
    
//Takes a number of seconds and converts it to something like X years, Y days, and Z seconds.
    //It then compresses the result and sends it to the client.
    
$years floor($t/(86400*365));
    
$t -= $years*(86400*365);
    
$days floor($t/(86400));
    
$t -= $days*(86400);
    
$hours floor($t/(3600));
    
$t -= $hours*(3600);
    
$minutes floor($t/(60));
    
$t -= $minutes*(60);
    
$secs=round($t);
    
$msg = ($years>=$years . (($years>|| $years==0)?'years':'year') : '');
    
$msg .= ($years>=&& (($days==&& $hours==&& $minutes==&& $secs!=0) ||
                            (
$days==&& $hours==&& $minutes!=&& $secs==0) ||
                            (
$days==&& $hours!=&& $minutes==&& $secs==0) ||
                            (
$days!=&& $hours==&& $minutes==&& $secs==0))) ? ' and ':
                            ((
$years>=&& ($days>=|| $hours>=|| $minutes>=|| $seconds>=1)) ? ', ':'');
    
$msg .= ($days>=$days . (($days>|| $days==0)?' days':' day') : '');
    
$msg .= ($days>=&& (($hours==&& $minutes==&& $secs!=0) || 
                            (
$hours==&& $minutes!=&& $secs==0) ||
                            (
$hours!=&& $minutes==&& $secs==0))) ? ' and ':
                            ((
$days>=&& ($hours>=|| $minutes>=|| $secs>=1)) ? ', ':'');
    
$msg .= ($hours>=$hours . (($hours>|| $hours==0)?' hours':' hour') : '');
    
$msg .= ($hours>=&& (($minutes==&& $secs!=0) || ($minutes!=&& $secs==0))) ? ' and ':
                            ((
$hours>=&& ($minutes>=|| $secs>=1)) ? ', ':'');
    
$msg .= ($minutes>=$minutes . (($minutes>|| $minutes==0)?' minutes':' minute') : '');
    
$msg .= ($minutes>=&& ($secs!=0)) ? ' and ':'';
    
$msg .= ($secs>=$secs . (($secs>|| $secs==0)?' seconds':' second') : '');
    if (
$years==&& $days==&& $hours==&& $minutes==&& $secs==0)
        
$msg 'less than 1 second';

/*    $msg = str_replace(' year, ','A',$msg);
    $msg = str_replace(' years, ','B',$msg);
    $msg = str_replace(' year and ','C',$msg);
    $msg = str_replace(' years and ','D',$msg);
    $msg = str_replace(' year','E',$msg);
    
    $msg = str_replace(' day, ','F',$msg);
    $msg = str_replace(' days, ','G',$msg);
    $msg = str_replace(' day and ','H',$msg);
    $msg = str_replace(' days and ','I',$msg);
    $msg = str_replace(' day','J',$msg);
    
    $msg = str_replace(' hour, ','K',$msg);
    $msg = str_replace(' hours, ','L',$msg);
    $msg = str_replace(' hour and ','M',$msg);
    $msg = str_replace(' hours and ','N',$msg);
    $msg = str_replace(' hour','O',$msg);

    $msg = str_replace(' minute and ','P',$msg);
    $msg = str_replace(' minutes and ','Q',$msg);
    $msg = str_replace(' minutes','R',$msg);
    $msg = str_replace(' minute','S',$msg);
    $msg = str_replace(' seconds','T',$msg);
    $msg = str_replace(' second','U',$msg);
    
    $msg = str_replace('less than 1 second','V',$msg);*/

    
return $msg;
}
/*function CreateTime($t)
{
    $years = floor($t/(86400*365));
    $t -= $years*(86400*365);
    $days = floor($t/(86400));
    $t -= $days*(86400);
    $hours = floor($t/(3600));
    $t -= $hours*(3600);
    $minutes = floor($t/(60));
    $t -= $minutes*(60);
    $secs=round($t);
    $msg = ($years>=1 ? $years . (($years>1 || $years==0)?'years':'year') : '');
    $msg .= ($years>=1 && (($days==0 && $hours==0 && $minutes==0 && $secs!=0) ||
                            ($days==0 && $hours==0 && $minutes!=0 && $secs==0) ||
                            ($days==0 && $hours!=0 && $minutes==0 && $secs==0) ||
                            ($days!=0 && $hours==0 && $minutes==0 && $secs==0))) ? ' and ':
                            (($years>=1 && ($days>=1 || $hours>=1 || $minutes>=1 || $seconds>=1)) ? ', ':'');
    $msg .= ($days>=1 ? $days . (($days>1 || $days==0)?' days':' day') : '');
    $msg .= ($days>=1 && (($hours==0 && $minutes==0 && $secs!=0) || 
                            ($hours==0 && $minutes!=0 && $secs==0) ||
                            ($hours!=0 && $minutes==0 && $secs==0))) ? ' and ':
                            (($days>=1 && ($hours>=1 || $minutes>=1 || $secs>=1)) ? ', ':'');
    $msg .= ($hours>=1 ? $hours . (($hours>1 || $hours==0)?' hours':' hour') : '');
    $msg .= ($hours>=1 && (($minutes==0 && $secs!=0) || ($minutes!=0 && $secs==0))) ? ' and ':
                            (($hours>=1 && ($minutes>=1 || $secs>=1)) ? ', ':'');
    $msg .= ($minutes>=1 ? $minutes . (($minutes>1 || $minutes==0)?' minutes':' minute') : '');
    $msg .= ($minutes>=1 && ($secs!=0)) ? ' and ':'';
    $msg .= ($secs>=1 ? $secs . (($secs>1 || $secs==0)?' seconds':' second') : '');
    if ($years==0 && $days==0 && $hours==0 && $minutes==0 && $secs==0)
        $msg = 'less than 1 second';
    return $msg;
}*/
extract($_REQUESTEXTR_REFS);
//import_request_variables("g");
if ($r==|| $r==|| $r==|| $r==|| $r==5)
        
$x=0;
else
    die();
if (
mt_rand(0,120)==0) {
?>
<html><head><title>The Reset Button Realm <?=$r?></title>
<!-- script for Google Analytics {START}-->
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-70177-4']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
<!-- script for Google Analytics {END}-->
</head><body>
<?php
}
echo 
createTime(time()-file_get_contents('LastReset'.$r), $r);
?>


(userstats.php)
<?php
    session_start
();
        
$path="/home/chrisnic/pear/share/pear";
                
set_include_path(get_include_path() . PATH_SEPARATOR $path);
                    require_once 
'functions.php';
    require_once 
'DB.php';
    
extract($_REQUESTEXTR_REFS);
//    import_request_variables('gp');
    
if (checkRealm($r)!=0$r=1;
/*//    echo "Currently Under Development. " . urldecode($user) . '<br>';
    echo "DEBUG: RAW " . $user . "<br>";
    echo "123%2Babc%3D9<br>";
    echo urldecode("123%2Babc%3D9") . "<br>";*/
    //$user = urldecode($user);
?>
<html><head><title>The Reset Button stats for user: <?=$user?> in realm <?=$r?></title>
<!-- script for Google Analytics {START}--!>
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-70177-4']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
<!-- script for Google Analytics {END}--!>
</head><body>
<?php
    
echo getUserStats($user,$r);
?>
</body></html>