Reset Button!

You are in Realm #3 Change to Realm:1 2 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, 5 minutes and 56 seconds since someone reset this sign.
On average, it has been reset every 37 days, 22 hours, 18 minutes and 22 seconds.
Since the beginning in September 2008 the sign has been reset a total of 84 times.

Your nick name (Max 12):

Most Recent Resets #1-20 >Next
#Nick NameReset TimeWhen
1[noname]227 days, 7 hours, 47 minutes and 57 secondsThu, 01 Jun 2017 16:09:46 -0700
2sasfd2 days, 3 hours, 58 minutes and 20 secondsMon, 17 Oct 2016 08:21:49 -0700
3Artic112218 days, 6 hours, 32 minutes and 52 secondsSat, 15 Oct 2016 04:23:29 -0700
4ino135 days, 11 hours, 8 minutes and 19 secondsThu, 10 Mar 2016 20:50:37 -0800
5Play2Win153 days, 11 minutes and 20 secondsTue, 27 Oct 2015 10:42:18 -0700
6-1'6 days, 1 hour, 59 minutes and 55 secondsWed, 27 May 2015 10:30:58 -0700
7-1'46 days, 19 hours, 36 minutes and 51 secondsThu, 21 May 2015 08:31:03 -0700
8RedditButton152 days, 2 hours, 59 minutes and 58 secondsSat, 04 Apr 2015 12:54:12 -0700
9trb.com11 days, 3 hours, 41 minutes and 13 secondsMon, 03 Nov 2014 08:54:14 -0800
10IamThatIam31 days, 19 hours, 18 minutes and 25 secondsThu, 23 Oct 2014 06:13:01 -0700
11Spirit34 days, 20 hours, 47 minutes and 30 secondsSun, 21 Sep 2014 10:54:36 -0700
12Oracle98910 days, 23 hours, 19 minutes and 26 secondsSun, 17 Aug 2014 14:07:06 -0700
13Kroisos6 days, 16 hours, 24 minutes and 11 secondsWed, 06 Aug 2014 14:47:40 -0700
14-1'63 days, 20 hours, 10 minutes and 54 secondsWed, 30 Jul 2014 22:23:29 -0700
15-1'60 days, 16 hours, 43 minutes and 26 secondsWed, 28 May 2014 02:12:35 -0700
16-1'44 days, 15 hours, 34 minutes and 56 secondsFri, 28 Mar 2014 09:29:09 -0700
17chris246 days, 9 hours, 2 minutes and 21 secondsTue, 11 Feb 2014 16:54:13 -0800
181BradMutha2 days, 5 hours, 21 minutes and 27 secondsMon, 10 Jun 2013 08:51:52 -0700
19mara!108 days, 8 hours, 38 minutes and 24 secondsSat, 08 Jun 2013 03:30:25 -0700
20Dragonator204 days, 3 hours, 24 minutes and 24 secondsTue, 19 Feb 2013 17:52:01 -0800
Top Resets #1-20 >Next
#Nick NameReset TimeWhen
1chris246 days, 9 hours, 2 minutes and 21 secondsTue, 11 Feb 2014 16:54:13 -0800
2[noname]227 days, 7 hours, 47 minutes and 57 secondsThu, 01 Jun 2017 16:09:46 -0700
3Artic112218 days, 6 hours, 32 minutes and 52 secondsSat, 15 Oct 2016 04:23:29 -0700
4Dragonator204 days, 3 hours, 24 minutes and 24 secondsTue, 19 Feb 2013 17:52:01 -0800
5OrangeNewton164 days, 39 minutes and 6 secondsMon, 30 Jul 2012 15:27:37 -0700
6Play2Win153 days, 11 minutes and 20 secondsTue, 27 Oct 2015 10:42:18 -0700
7RedditButton152 days, 2 hours, 59 minutes and 58 secondsSat, 04 Apr 2015 12:54:12 -0700
8DarkBaron149 days, 11 hours, 37 minutes and 1 secondFri, 25 Nov 2011 08:25:11 -0800
9bob143 days, 8 hours, 18 minutes and 15 secondsThu, 28 Oct 2010 13:56:08 -0700
10ino135 days, 11 hours, 8 minutes and 19 secondsThu, 10 Mar 2016 20:50:37 -0800
11Ray115 days, 14 hours, 9 minutes and 39 secondsThu, 24 Mar 2011 23:56:44 -0700
12mara!108 days, 8 hours, 38 minutes and 24 secondsSat, 08 Jun 2013 03:30:25 -0700
13Darkbaron95 days, 21 hours, 51 minutes and 26 secondsTue, 28 Jun 2011 21:48:10 -0700
14Kris83 days, 1 hour, 7 minutes and 19 secondsThu, 16 Feb 2012 09:32:30 -0800
15Kayla78 days, 11 hours, 2 minutes and 8 secondsSun, 25 Jan 2009 19:02:31 -0800
16-1'63 days, 20 hours, 10 minutes and 54 secondsWed, 30 Jul 2014 22:23:29 -0700
17-1'60 days, 16 hours, 43 minutes and 26 secondsWed, 28 May 2014 02:12:35 -0700
18attitude58 days, 10 hours, 12 minutes and 4 secondsSat, 09 Jan 2010 04:58:29 -0800
19joe55 days, 20 hours, 12 minutes and 39 secondsMon, 07 Jun 2010 05:37:53 -0700
20[noname]53 days, 20 hours, 16 minutes and 48 secondsFri, 22 May 2009 11:42:37 -0700
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>



Deleted: 1 - 59fffdf5ae1a04.78259671 --- 1296025 seconds old