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 14 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):

Most Recent Resets #1-20 >Next
#Nick NameReset TimeWhen
1rage58 days, 18 hours, 58 minutes and 5 secondsWed, 15 Nov 2017 12:17:02 -0800
2Bryce24 days, 2 hours, 35 minutes and 22 secondsSun, 17 Sep 2017 18:18:57 -0700
3Mike55 days, 21 hours, 3 minutes and 38 secondsThu, 24 Aug 2017 15:43:35 -0700
4[noname]15 days, 3 hours, 44 minutes and 2 secondsThu, 29 Jun 2017 18:39:57 -0700
5Redoric12 days, 22 hours, 46 minutes and 42 secondsWed, 14 Jun 2017 14:55:55 -0700
6[noname]13 days, 19 hours, 9 minutes and 18 secondsThu, 01 Jun 2017 16:09:13 -0700
7Viku7 days, 4 hours, 22 minutes and 52 secondsThu, 18 May 2017 20:59:55 -0700
8jimmothy8 days, 2 hours and 37 minutesThu, 11 May 2017 16:37:03 -0700
9Ben17 days, 6 hours, 36 minutes and 32 secondsWed, 03 May 2017 14:00:03 -0700
10ben17 days, 19 hours, 44 minutes and 59 secondsSun, 16 Apr 2017 07:23:31 -0700
11[noname]13 days, 21 hours, 16 minutes and 12 secondsWed, 29 Mar 2017 11:38:32 -0700
12aaa4 secondsWed, 15 Mar 2017 14:22:20 -0700
13aaa15 days, 3 hours, 25 minutes and 49 secondsWed, 15 Mar 2017 14:22:16 -0700
14gigi26 days, 2 hours, 40 minutes and 25 secondsTue, 28 Feb 2017 09:56:27 -0800
15TheDonald12 minutes and 9 secondsThu, 02 Feb 2017 07:16:02 -0800
16ITG19 days, 12 hours, 37 minutes and 23 secondsThu, 02 Feb 2017 07:03:53 -0800
17ccccombobrkr19 days, 18 hours, 9 minutes and 13 secondsFri, 13 Jan 2017 18:26:30 -0800
18Smallfrog_63 days, 20 hours, 39 minutes and 37 secondsSun, 25 Dec 2016 00:17:17 -0800
19bernd1 minute and 4 secondsSat, 22 Oct 2016 04:37:40 -0700
20casdr4 days, 20 hours, 15 minutes and 5 secondsSat, 22 Oct 2016 04:36:36 -0700
<Prev Top Resets #21-40 >Next
#Nick NameReset TimeWhen
21Artic11231 days, 15 hours, 22 minutes and 14 secondsSat, 15 Oct 2016 04:23:12 -0700
22[noname]30 days, 22 hours, 48 minutes and 49 secondsSat, 12 Dec 2015 15:47:54 -0800
23Sam29 days, 15 hours, 56 minutes and 55 secondsFri, 26 Oct 2012 22:58:17 -0700
24129 days, 2 hours, 8 minutes and 28 secondsMon, 20 Oct 2014 13:02:49 -0700
25uuaksmwz28 days, 20 hours, 57 minutes and 18 secondsThu, 10 Nov 2011 11:11:15 -0800
26Baron28 days, 6 hours, 40 minutes and 40 secondsFri, 20 Jan 2012 06:39:05 -0800
27DUDE27 days, 21 hours, 10 minutes and 59 secondsTue, 06 Sep 2011 10:06:54 -0700
28DarkKnight27 days, 6 hours, 19 minutes and 22 secondsTue, 29 Sep 2015 07:19:46 -0700
29Kris27 days, 2 hours, 44 minutes and 32 secondsThu, 16 Feb 2012 09:23:37 -0800
30Isaac26 days, 11 hours, 21 minutes and 44 secondsSat, 03 Aug 2013 02:08:48 -0700
31fogmind26 days, 9 hours, 37 minutes and 38 secondsTue, 03 Aug 2010 04:40:19 -0700
32gigi26 days, 2 hours, 40 minutes and 25 secondsTue, 28 Feb 2017 09:56:27 -0800
33mara!25 days, 18 hours, 48 minutes and 46 secondsSun, 07 Jul 2013 14:47:04 -0700
34Felix25 days, 18 hours, 45 minutes and 9 secondsThu, 26 May 2016 04:14:13 -0700
35dnlbct25 days, 9 hours, 33 minutes and 5 secondsSat, 30 Apr 2016 09:29:04 -0700
36Yuomay24 days, 19 hours, 47 minutes and 38 secondsThu, 15 Dec 2011 05:10:12 -0800
37Bryce24 days, 2 hours, 35 minutes and 22 secondsSun, 17 Sep 2017 18:18:57 -0700
38NoPanic23 days, 15 hours, 35 minutes and 16 secondsSun, 22 Jul 2012 07:37:51 -0700
39108_seconds22 days, 10 hours, 50 minutes and 2 secondsFri, 10 Sep 2010 20:17:43 -0700
40dennker22 days, 8 hours, 42 minutes and 32 secondsTue, 13 Sep 2016 13:00:58 -0700
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>