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 5 days, 9 hours, 59 minutes and 34 seconds since someone reset this sign.
On average, it has been reset every 2 days, 10 hours, 1 minute and 14 seconds.
Since the beginning in May 2008 the sign has been reset a total of 1437 times.

Your nick name (Max 12):

<Prev Most Recent Resets #21-40 >Next
#Nick NameReset TimeWhen
21sasfd2 days, 3 hours, 58 minutes and 19 secondsMon, 17 Oct 2016 08:21:31 -0700
22Artic11231 days, 15 hours, 22 minutes and 14 secondsSat, 15 Oct 2016 04:23:12 -0700
23dennker22 days, 8 hours, 42 minutes and 32 secondsTue, 13 Sep 2016 13:00:58 -0700
24kev63 days, 13 hours, 27 minutes and 23 secondsMon, 22 Aug 2016 04:18:26 -0700
25IV20 days, 19 hours, 53 minutes and 35 secondsSun, 19 Jun 2016 14:51:03 -0700
26Zecjala3 days, 14 hours, 43 minutes and 15 secondsSun, 29 May 2016 18:57:28 -0700
27Felix25 days, 18 hours, 45 minutes and 9 secondsThu, 26 May 2016 04:14:13 -0700
28dnlbct25 days, 9 hours, 33 minutes and 5 secondsSat, 30 Apr 2016 09:29:04 -0700
29Ward38 days, 12 hours, 33 minutes and 37 secondsMon, 04 Apr 2016 23:55:59 -0700
30Liz4 days, 21 hours, 43 minutes and 46 secondsFri, 26 Feb 2016 10:22:22 -0800
31Shy_Monkeys17 days, 3 hours, 57 minutes and 56 secondsSun, 21 Feb 2016 12:38:36 -0800
32David53 days, 16 hours, 52 minutes and 46 secondsThu, 04 Feb 2016 08:40:40 -0800
33[noname]30 days, 22 hours, 48 minutes and 49 secondsSat, 12 Dec 2015 15:47:54 -0800
34matgg5 secondsWed, 11 Nov 2015 16:59:05 -0800
35matgg5 secondsWed, 11 Nov 2015 16:59:00 -0800
36matgg15 days, 7 hours, 17 minutes and 39 secondsWed, 11 Nov 2015 16:58:55 -0800
37Play2Win2 secondsTue, 27 Oct 2015 10:41:16 -0700
38Play2Win26 secondsTue, 27 Oct 2015 10:41:14 -0700
39Play2Win7 days, 22 hours, 52 minutes and 46 secondsTue, 27 Oct 2015 10:40:48 -0700
40fesferfe12 days, 6 hours, 50 minutes and 46 secondsMon, 19 Oct 2015 11:48:02 -0700
Top Resets #1-20 >Next
#Nick NameReset TimeWhen
1Nickod77797 days, 20 hours, 47 minutes and 55 secondsThu, 07 Mar 2013 13:07:44 -0800
2Z92 days, 3 hours, 34 minutes and 52 secondsFri, 15 Aug 2008 18:00:04 -0700
3JJJJJJJJJ71 days, 20 hours, 21 minutes and 45 secondsFri, 16 Jan 2015 14:47:32 -0800
4Smallfrog_63 days, 20 hours, 39 minutes and 37 secondsSun, 25 Dec 2016 00:17:17 -0800
5kev63 days, 13 hours, 27 minutes and 23 secondsMon, 22 Aug 2016 04:18:26 -0700
6Freedom62 days, 16 hours, 44 minutes and 25 secondsThu, 06 Feb 2014 10:39:53 -0800
7rage58 days, 18 hours, 58 minutes and 5 secondsWed, 15 Nov 2017 12:17:02 -0800
8Mike55 days, 21 hours, 3 minutes and 38 secondsThu, 24 Aug 2017 15:43:35 -0700
9Rinna54 days, 21 hours, 20 minutes and 8 secondsFri, 27 Apr 2012 22:52:54 -0700
10David53 days, 16 hours, 52 minutes and 46 secondsThu, 04 Feb 2016 08:40:40 -0800
11No49 days, 16 hours and 27 secondsMon, 06 May 2013 01:15:39 -0700
12frederific44 days, 12 hours, 15 minutes and 41 secondsMon, 25 Oct 2010 08:33:24 -0700
13Cristine42 days, 17 hours, 59 minutes and 8 secondsSat, 26 Oct 2013 10:43:38 -0700
14Ward38 days, 12 hours, 33 minutes and 37 secondsMon, 04 Apr 2016 23:55:59 -0700
15blunamaxl36 days, 5 hours, 7 minutes and 3 secondsWed, 12 Oct 2011 15:13:57 -0700
16enough35 days, 14 hours, 45 minutes and 42 secondsWed, 11 Sep 2013 04:32:45 -0700
17Kris34 days, 23 hours, 51 minutes and 33 secondsSun, 26 Aug 2012 07:29:24 -0700
18Seamus!33 days, 18 hours, 21 minutes and 2 secondsThu, 29 Nov 2012 16:19:19 -0800
19mara!33 days, 2 hours, 12 minutes and 28 secondsSat, 08 Jun 2013 03:28:43 -0700
20DoB31 days, 19 hours, 46 minutes and 53 secondsMon, 29 Nov 2010 08:42:19 -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>