Reset Button!

You are in Realm #2 Change to Realm:1 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 172 days, 7 hours, 7 minutes and 10 seconds since someone reset this sign.
On average, it has been reset every 34 days, 15 hours, 10 minutes and 47 seconds.
Since the beginning in September 2008 the sign has been reset a total of 92 times.

Your nick name (Max 12):

Most Recent Resets #1-20 >Next
#Nick NameReset TimeWhen
1[noname]227 days, 7 hours, 47 minutes and 43 secondsThu, 01 Jun 2017 16:09:29 -0700
2sasfd2 days, 3 hours, 58 minutes and 23 secondsMon, 17 Oct 2016 08:21:46 -0700
3Artic112353 days, 17 hours, 40 minutes and 17 secondsSat, 15 Oct 2016 04:23:23 -0700
4Play2Win205 days, 21 hours, 49 minutes and 9 secondsTue, 27 Oct 2015 10:43:06 -0700
5RedditButton163 days, 6 hours, 41 minutes and 9 secondsSat, 04 Apr 2015 12:53:57 -0700
6IamThatIam13 days, 10 hours, 52 minutes and 21 secondsThu, 23 Oct 2014 06:12:48 -0700
7-1'18 days, 8 hours, 25 minutes and 56 secondsThu, 09 Oct 2014 19:20:27 -0700
8Spirit41 days, 21 minutes and 5 secondsSun, 21 Sep 2014 10:54:31 -0700
9Cheese-Its29 days, 19 hours, 10 minutes and 3 secondsMon, 11 Aug 2014 10:33:26 -0700
10-1'11 days, 11 hours, 23 minutes and 21 secondsSat, 12 Jul 2014 15:23:23 -0700
11-1'2 days, 1 hour, 8 minutes and 30 secondsTue, 01 Jul 2014 04:00:02 -0700
12-1'16 days, 4 hours, 11 minutes and 40 secondsSun, 29 Jun 2014 02:51:32 -0700
13-1'3 days, 16 hours, 26 minutes and 46 secondsThu, 12 Jun 2014 22:39:52 -0700
14-1'4 days, 3 hours, 53 minutes and 18 secondsMon, 09 Jun 2014 06:13:06 -0700
15-1'4 days, 20 hours, 31 minutes and 19 secondsThu, 05 Jun 2014 02:19:48 -0700
16-1'2 days, 22 hours, 20 minutes and 37 secondsSat, 31 May 2014 05:48:29 -0700
17-1'5 hours, 20 minutes and 42 secondsWed, 28 May 2014 07:27:52 -0700
18-1'14 days, 3 hours, 26 minutes and 27 secondsWed, 28 May 2014 02:07:10 -0700
19-1'5 days, 11 hours, 3 minutes and 11 secondsTue, 13 May 2014 22:40:43 -0700
20-1'3 days, 1 hour, 30 minutes and 23 secondsThu, 08 May 2014 11:37:32 -0700
Top Resets #1-20 >Next
#Nick NameReset TimeWhen
1Artic112353 days, 17 hours, 40 minutes and 17 secondsSat, 15 Oct 2016 04:23:23 -0700
2chris246 days, 9 hours and 25 secondsTue, 11 Feb 2014 16:52:09 -0800
3[noname]227 days, 7 hours, 47 minutes and 43 secondsThu, 01 Jun 2017 16:09:29 -0700
4Dragonator212 days, 11 hours, 12 minutes and 48 secondsTue, 19 Feb 2013 17:52:05 -0800
5Play2Win205 days, 21 hours, 49 minutes and 9 secondsTue, 27 Oct 2015 10:43:06 -0700
6RedditButton163 days, 6 hours, 41 minutes and 9 secondsSat, 04 Apr 2015 12:53:57 -0700
7NoPanic155 days, 16 hours, 48 minutes and 12 secondsSun, 22 Jul 2012 07:39:17 -0700
8Baron103 days, 13 hours and 50 minutesFri, 20 Jan 2012 06:38:27 -0800
9Nickod_#1!101 days, 20 hours and 38 secondsSat, 08 Oct 2011 17:48:27 -0700
10I\'m_#1!97 days, 6 hours, 46 minutes and 33 secondsSun, 12 Sep 2010 12:24:18 -0700
11I'm_#6!95 days, 23 hours, 29 minutes and 14 secondsSun, 26 May 2013 18:21:19 -0700
12Darkbaron95 days, 21 hours, 51 minutes and 10 secondsTue, 28 Jun 2011 21:47:49 -0700
13Ray72 days, 4 hours, 25 minutes and 3 secondsThu, 24 Mar 2011 23:56:39 -0700
14chris58 days, 5 hours, 6 minutes and 22 secondsMon, 05 Jan 2009 13:06:41 -0800
15joe55 days, 20 hours, 12 minutes and 51 secondsMon, 07 Jun 2010 05:37:45 -0700
16[noname]53 days, 20 hours, 16 minutes and 48 secondsFri, 22 May 2009 11:42:27 -0700
17frederific52 days, 10 hours, 1 minute and 53 secondsSun, 03 Jan 2010 15:19:54 -0800
18bob46 days, 1 hour, 31 minutes and 45 secondsThu, 28 Oct 2010 13:56:03 -0700
19-1'45 days, 8 hours, 50 minutes and 2 secondsTue, 15 Apr 2014 02:19:02 -0700
20Jmonkey9043 days, 9 hours, 44 minutes and 36 secondsTue, 11 Jan 2011 18:31:36 -0800
0

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>