Subversion Repositories taios

Compare Revisions

Ignore whitespace Rev 119 → Rev 442

/photos/album.php
0,0 → 1,114
<?php
 
require '../_taios.php';
 
function getImageSizes($sourceImageFilePath, $maxResizeWidth, $maxResizeHeight) {
 
$size = getimagesize($sourceImageFilePath);
$origWidth = $size[0];
$origHeight = $size[1];
 
$resizedWidth = $origWidth;
$resizedHeight = $origHeight;
if ($resizedWidth > $maxResizeWidth)
{
$aspectRatio = $maxResizeWidth / $resizedWidth;
$resizedWidth = round($aspectRatio * $resizedWidth);
$resizedHeight = round($aspectRatio * $resizedHeight);
}
if ($resizedHeight > $maxResizeHeight)
{
$aspectRatio = $maxResizeHeight / $resizedHeight;
$resizedWidth = round($aspectRatio * $resizedWidth);
$resizedHeight = round($aspectRatio * $resizedHeight);
}
return array($resizedWidth, $resizedHeight);
}
 
$page = new Taios_Page('Photo Albums', '../');
$page->drawHeader();
$page->drawMiddle();
 
$dirName = $_GET['dir'];
if (empty($dirName))
{
$page->redirect('index.php');
}
 
write('<p class="bold"><a href="index.php">Back to Photos</a></p><br />');
 
if (file_exists("albums/" . $dirName . "/description.txt"))
{
write('<p>' . $page->replaceBBCode(file_get_contents("albums/" . $dirName . "/description.txt")) . '</p><br />');
}
 
write('<p><a href="rss.php?dir=' . $dirName . '">RSS Feed</a></p>');
 
write('<table>');
write('<tr>');
 
$directory = "albums/" . $dirName . "/";
$sortOrder = "newestFirst";
 
$results = array();
$handler = opendir($directory);
while ($file = readdir($handler))
{
if ($file != '.' && $file != '..' && $file != "robots.txt" && $file != ".htaccess" && getimagesize($directory . $file))
{
$currentModified = filectime($directory . $file);
$file_names[] = $file;
$file_dates[] = $currentModified;
}
}
 
closedir($handler);
 
if ($sortOrder == "newestFirst")
{
arsort($file_dates);
}
else
{
asort($file_dates);
}
$file_names_Array = array_keys($file_dates);
foreach ($file_names_Array as $idx => $name) $name=$file_names[$name];
$file_dates = array_merge($file_dates);
$i = 0;
 
$indexInArray = 0;
$i = 0;
 
foreach ($file_dates as $$file_dates)
{
$j = $file_names_Array[$indexInArray];
$file = $file_names[$j];
if ($i >= 3)
{
write('</tr><tr>');
$i = 0;
}
$filename = $directory . $file;
$size = getImageSizes($filename, 280, 260);
 
write('<td><a href="' . str_replace(" ", "%20", $filename) . '"><img width="' . $size[0] . '" height="' . $size[1] . '" src="' . str_replace(" ", "%20", $filename) . '" /></a></td>');
$i++;
$indexInArray++;
}
 
write('</tr>');
write('</table>');
 
$page->drawFooter();
 
?>
 
/photos/rss.php
0,0 → 1,76
<?php
 
require '../_taios.php';
 
header("Content-type: application/rss+xml");
 
$page = new Taios_Page('Photos RSS Feed', '../');
 
$dirName = $_GET['dir'];
if (empty($dirName))
{
$dirName = "Lassitor";
}
 
write('<?xml version="1.0" encoding="UTF-8" ?>');
write('<rss version="2.0">');
write('<channel>');
write('<title>Tim32 Photo RSS ' . $dirName . '</title>');
write('<description>This is the RSS feed for the Tim32 Photos.</description>');
write('<link>http://tim32.org/photos/album.php?dir=' . $dirName . '</link>');
$directory = "albums/" . $dirName . "/";
$sortOrder = "newestFirst";
 
$results = array();
$handler = opendir($directory);
while ($file = readdir($handler))
{
if ($file != '.' && $file != '..' && $file != "robots.txt" && $file != ".htaccess" && getimagesize($directory . $file))
{
$currentModified = filectime($directory . $file);
$file_names[] = $file;
$file_dates[] = $currentModified;
}
}
 
closedir($handler);
 
if ($sortOrder == "newestFirst")
{
arsort($file_dates);
}
else
{
asort($file_dates);
}
$file_names_Array = array_keys($file_dates);
foreach ($file_names_Array as $idx => $name) $name=$file_names[$name];
$file_dates = array_merge($file_dates);
 
$indexInArray = 0;
 
foreach ($file_dates as $date)
{
$j = $file_names_Array[$indexInArray];
$file = $file_names[$j];
$filename = $directory . $file;
write('<item>');
write('<title>' . $file . '</title>');
write('<link>http://tim32.org/photos/' . str_replace(" ", "%20", $filename) . '</link>');
write('<guid>' . $indexInArray . '</guid>');
write('<pubDate>' . date('D, d M Y H:i:s O', $date). '</pubDate>');
write('<description>&lt;img src="http://tim32.org/photos/' . str_replace(" ", "%20", $filename) . '" /&gt;</description>');
write('</item>');
$indexInArray++;
}
 
write('</channel>');
write('</rss>');
 
?>
/photos/index.php
1,14 → 1,31
<?php
 
require '../_taios.php';
 
$page = new Taios_Page('Photos', '../');
$page->drawHeader();
$page->drawMiddle();
 
write('<br /><p class="bold">This page is currently under construction.</p>');
 
$page->drawFooter();
 
?>
 
<?php
 
require '../_taios.php';
 
$page = new Taios_Page('Photo Albums', '../');
$page->drawHeader();
$page->drawMiddle();
 
write('<p>Here we have all sorts of photos from Tim32.</p><br />');
 
$dirs = array();
$dir = dir('albums/');
while (($file = $dir->read()) !== false)
{
array_push($dirs, $file);
}
 
asort($dirs);
 
foreach ($dirs as $file)
{
if ($file[0] != '.')
{
write('<p><a href="album.php?dir=' . $file . '">' . $file . '</a></p>');
}
}
 
$page->drawFooter();
 
?>
 
/photos/albums/Lassitor/Lassitor.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/photos/albums/Lassitor/Lassitor.png
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: photos/albums/Lassitor/Lassitor-3d.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: photos/albums/Lassitor/Lassitor-3d.png
===================================================================
--- photos/albums/Lassitor/Lassitor-3d.png (nonexistent)
+++ photos/albums/Lassitor/Lassitor-3d.png (revision 442)
/photos/albums/Lassitor/Lassitor-3d.png
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: _taios.php
===================================================================
--- _taios.php (revision 119)
+++ _taios.php (revision 442)
@@ -88,6 +88,7 @@
{
if (!$this->drawnFooter)
{
+ write('
');
write('');
write('');
write('');
@@ -116,17 +117,24 @@
{
$post = $this->getBlogPost($id);
if ($first)
+ {
write('

' . $post->title. ' ^

');
+ }
else
+ {
write('

' . $post->title. '

');
+ }
write('
Posted On ' . date('l j F Y', $post->datePosted) . ' by ' . $post->user->name . ' (' . $post->user->username . ')
');
- write('

' . $post->content . '

');
- write('
');
+ write('

' . $this->replaceBBCode($post->content) . '

');
+
if ($this->isUserNormal($this->getLoggedInUser()))
{
echo '

Add Comment';

- if ($this->isUserAdmin($this->getLoggedInUser()) || $this->getLoggedInUser() == $post->author->ID)
- echo ' · Delete Post';
+ if ($this->isUserAdmin($this->getLoggedInUser()) || $this->getLoggedInUser()->ID == $post->author->ID)
+ {
+ echo '   ·   Edit Post';
+ echo '   ·   Delete Post';
+ }
write('


');
}
@@ -159,7 +167,72 @@
$this->drawMenuItem($cats[$i], 'blog/index.php?cat=' . $cats[$i]);
}
}
+
+ function replaceBBCode($str)
+ {
+ /*$newstrarray = explode("\n", $str);
+ $newstr = "";
+ foreach ($newstrarray as $line)
+ {
+ if ($line == "\n" || $line == " \n" || $line == "\n " || $line == "\n\r")
+ {
+ $line = "

";

+ }
+
+ $newstr .= ($line . "\n");
+ }*/
+
+ $newstr = $str;
+ $newstr = str_replace("<", "[", $newstr);
+ $newstr = str_replace(">", "]", $newstr);
+ $newstr = str_replace("\n", "

", $newstr);

+ $newstr = str_replace("\\'", "'", $newstr);
+ $newstr = str_replace("\\\"",'"', $newstr);
+ $newstr = str_replace(' ', '  ', $newstr);
+ $newstr = str_replace(' :)', ' ', $newstr);
+ $newstr = str_replace(' :p', ' ', $newstr);
+ $newstr = str_replace(' :P', ' ',$newstr);
+ $newstr = str_replace(' :|', ' ',$newstr);
+ $newstr = str_replace(' :D', ' ',$newstr);
+ $newstr = str_replace(' =D', ' ',$newstr);
+ $newstr = str_replace(' :(', ' ',$newstr);
+ $newstr = str_replace(' :0', ' ',$newstr);
+ $newstr = str_replace(' :o', ' ',$newstr);
+ $newstr = str_replace(' :O', ' ',$newstr);
+ $newstr = str_replace(' :/', ' ',$newstr);
+ $newstr = str_replace(' ;)', ' ',$newstr);
+
+ $bbcode = array(
+ '/\[b\](.+?)\[\/b\]/is',
+ '/\[i\](.+?)\[\/i\]/is',
+ '/\[u\](.+?)\[\/u\]/is',
+ '/\[url\](.+?)\[\/url\]/is',
+ '/\[url=(.+?)\](.+?)\[\/url\]/is',
+ '/\[code\](.+?)\[\/code\]/is',
+ '/\[img\](.+?)\[\/img\]/is',
+ '/\[ul\](.+?)\[\/ul\]/is',
+ '/\[ol\](.+?)\[\/ol\]/is',
+ '/\[li\](.+?)\[\/li\]/is'
+ );
+ $html = array(
+ '$1',
+ '$1',
+ '$1',
+ '$1',
+ '$2',
+ '
$1
',
+ '',
+ '
    $1
',
+ '
    $1
',
+ '
  • $1
  • '
    + );
    +
    + $newstr = preg_replace($bbcode, $html, $newstr);
    +
    + return $newstr;
    + }
    +
    function redirect($u)
    {
    header('Location: ' . $u);
    @@ -224,6 +297,24 @@
    return false;
    }
    + function checkChallengeStatus($challengeID, $previous, $next)
    + {
    + $currentChallengeID = $this->getLoggedInUser()->challengeID;
    +
    + if (!$this->isLoggedIn())
    + {
    + $this->redirect('index.php');
    + }
    + else if ($currentChallengeID > $challengeID)
    + {
    + $this->redirect($next . '.php');
    + }
    + else if ($currentChallengeID < $challengeID)
    + {
    + $this->redirect($previous . '.php');
    + }
    + }
    +
    function checkLoggedIn()
    {
    if (!$this->isLoggedIn())
    @@ -237,7 +328,7 @@
    $result = mysql_query($query);
    if (!$result)
    {
    - $this->drawError('MySQL Error: ' . mysql_error());
    + $this->drawError('Query Failed: ' . $query . "\n" . 'MySQL Error: ' . mysql_error());
    }
    return $result;
    @@ -327,13 +418,78 @@
    $this->drawError('Cannot find blog post, #' . $id);
    }
    + function getProject($id)
    + {
    + $result = $this->query('SELECT * FROM Projects WHERE ID = ' . $id);
    + while ($row = mysql_fetch_array($result))
    + {
    + $project = new Project;
    +
    + $project->ID = $row['ID'];
    + $project->author = $this->getUserByID($row['AuthorID']);
    + $project->title = $row['Title'];
    + $project->description = $row['Description'];
    + $project->logoURL = $row['LogoURL'];
    + $project->downloadURL = $row['DownloadURL'];
    + $project->websiteURL = $row['WebsiteURL'];
    + $project->latestVersion = $row['LatestVersion'];
    + $project->lastUpdate = strtotime($row['LastUpdate']);
    +
    + return $project;
    + }
    +
    + return false;
    + }
    +
    + function getForumCategory($id)
    + {
    + $result = $this->query('SELECT * FROM ForumCategories WHERE ID = ' . $id);
    + while ($row = mysql_fetch_array($result))
    + {
    + $f = new ForumCategory;
    +
    + $f->ID = $row['ID'];
    + $f->parent = $this->getForumCategory($row['ParentID']);
    + $f->title = $row['Title'];
    + $f->description = $row['Description'];
    +
    + return $f;
    + }
    +
    + return false;
    + }
    +
    + function getForumPost($id)
    + {
    + $result = $this->query('SELECT * FROM ForumPosts WHERE ID = ' . $id);
    + while ($row = mysql_fetch_array($result))
    + {
    + $f = new ForumPost;
    +
    + $f->ID = $row['ID'];
    + $f->author = $this->getUserByID($row['AuthorID']);
    + $f->category = $this->getForumCategory($row['CategoryID']);
    + $f->parent = $this->getForumPost($row['ParentID']);
    + $f->title = $row['Title'];
    + $f->content = $row['Content'];
    + $f->datePosted = strtotime($row['DatePosted']);
    + $f->spam = $row['Spam'];
    +
    + return $f;
    + }
    +
    + return false;
    + }
    +
    function delBlogPost($id)
    {
    $ids = $this->findIDs('BlogPosts', 'WHERE ParentID=' . $id);
    for ($i = 0; $i < count($ids); $i++)
    + {
    $this->delBlogPost($ids[$i]);
    + }
    - $this->query('delete from BlogPosts where ID=' . $id);
    + $this->query('DELETE FROM BlogPosts WHERE ID=' . $id);
    }
    function getGetID()
    @@ -383,6 +539,42 @@
    public $spam;
    }
    +class Project
    +{
    + public $ID;
    + public $author;
    + public $title;
    + public $description;
    +
    +
    + public $logoURL;
    + public $downloadURL;
    + public $websiteURL;
    + public $latestVersion;
    + public $lastUpdate;
    +}
    +
    +class ForumCategory
    +{
    + public $ID;
    + public $parent;
    + public $title;
    + public $description;
    +
    +}
    +
    +class ForumPost
    +{
    + public $id;
    + public $author;
    + public $category;
    + public $parent;
    + public $title;
    + public $content;
    + public $datePosted;
    + public $spam;
    +}
    +
    function write($str)
    {
    echo $str;
    /blog/rss.php
    0,0 → 1,34
    <?php
     
    require '../_taios.php';
     
    header("Content-type: application/rss+xml");
     
    $page = new Taios_Page('Blog RSS Feed', '../');
     
    write('<?xml version="1.0" encoding="UTF-8" ?>');
    write('<rss version="2.0">');
    write('<channel>');
    write('<title>Tim32 Blog RSS</title>');
    write('<description>This is the RSS feed for the Tim32 Blog.</description>');
    write('<link>http://tim32.org/blog/</link>');
    $ids = $page->findIDs('BlogPosts', 'WHERE ParentID = -1 ORDER BY DatePosted DESC');
    for ($i = 0; $i < count($ids); $i++)
    {
    $id = $ids[$i];
    $post = $page->getBlogPost($id);
    write('<item>');
    write('<title>' . $post->title . '</title>');
    write('<link>http://tim32.org/blog/post.php?id=' . $id . '</link>');
    write('<guid>' . $id . '</guid>');
    write('<pubDate>' . date('D, d M Y H:i:s O', $post->datePosted). '</pubDate>');
    write('<description>' . str_replace(">", "&gt;", str_replace("<", "&lt;", $page->replaceBBCode($post->content))) . '</description>');
    write('</item>');
    }
     
    write('</channel>');
    write('</rss>');
     
    ?>
    /blog/index.php
    5,6 → 5,8
    $page = new Taios_Page('Blog Posts', '../');
    $page->drawHeader();
    $page->drawBlogCategoriesMenu();
    write('<br /><h3>RSS</h3>');
    $page->drawMenuItem('RSS Feed', 'blog/rss.php');
    $page->drawMiddle();
     
    if ($page->isUserGM($page->getLoggedInUser()))
    21,17 → 23,20
    write('<p>Only showing blog posts from the ' . $_GET['cat'] . ' category. <a href="index.php">Reset Filtering</a></p><br />');
    }
     
    $query = $query . " ORDER BY DatePosted DESC";
     
    $ids = $page->findIDs('BlogPosts', $query);
    for ($i = 0; $i < count($ids); $i++)
    {
    $id = $ids[$i];
    $post = $page->getBlogPost($id);
    write('<a href="post.php?id=' . $id . '"><h3>' . $post->title. '</h3></a>');
    write('<h5 style="color: #666666;">Posted On ' . date('l j F Y', $post->datePosted) . ' by ' . $post->user->name . ' (' . $post->user->username . ')</h5>');
    write('<p>' . $post->content . '</p>');
    write('<p>' . $page->replaceBBCode($post->content) . '</p>');
    write('<br />');
    }
     
     
    $page->drawFooter();
     
    ?>
    /blog/edit-post.php
    0,0 → 1,93
    <?php
     
    require '../_taios.php';
     
    $page = new Taios_Page('Edit Post', '../');
     
    if (isset($_GET['id']))
    {
    $id = $_GET['id'];
    }
    else if (isset($_POST['id']))
    {
    $id = $_POST['id'];
    }
    else
    {
    $page->drawError('No ID set.');
    }
     
    $page->checkLoggedIn();
     
    $post = $page->getBlogPost($id);
    if (!$page->isUserAdmin($page->getLoggedInUser()) && $page->getLoggedInUser()->ID != $post->author->ID)
    {
    $page->drawError('You do not have permission to access this page.');
    }
     
    $error = '';
     
    if (isset($_POST['id']))
    {
    $title = $_POST['title'];
    $content = $_POST['content'];
    $category = $_POST['category'];
     
    if (empty($title))
    {
    $error = "No Title Specified";
    }
    else if (empty($content))
    {
    $error = "No Content Specified";
    }
    else
    {
    $page->query('UPDATE BlogPosts SET Content = "' . $content . '", Title = "' . $title . '", Category = "' . $category . '" WHERE ID = ' . $id);
    $page->redirect('post.php?id=' . $id);
    }
    }
     
    $page->drawHeader();
    $page->drawBlogCategoriesMenu();
    $page->drawMiddle();
     
    if (!empty($error))
    {
    $page->drawError($error, false);
    }
     
    ?>
     
    <form action="edit-post.php" method="post">
    <table>
    <tr>
    <td class="bold">Title: </td>
    <td><input type="text" name="title" value="<?php echo $post->title; ?>"/></td>
    </tr>
    <tr>
    <td class="bold">Content: </td>
    <td><textarea name="content"><?php echo $post->content; ?></textarea></td>
    </tr>
    <tr>
    <td class="bold">Catagory: </td>
    <td><input type="text" name="category" value="<?php echo $post->category; ?>" /></td>
    </tr>
     
    <?php
    write('<input type="hidden" name="id" value="' . $id . '" />');
    ?>
     
    <tr>
    <td class="bold"></td>
    <td><input type="submit" value="Edit" /></td>
    </tr>
    </table>
    </form>
     
    <?php
     
    $page->drawFooter();
     
    ?>
     
    /blog/post.php
    4,17 → 4,16
     
    $page = new Taios_Page('Blog Posts', '../');
     
    if (!isset($_GET['id']) || $_GET['id'] == "" || $_GET['id'] == -1)
    if (empty($_GET['id']) || $_GET['id'] == -1)
    {
    $page->redirect('index.php');
    }
     
    if (!isset($_GET['id']))
    $page->redirect("index.php");
     
    $page->drawHeader();
    $page->drawBlogCategoriesMenu();
    $page->drawMiddle();
     
    $page->drawBlogPostTree($_GET['id'], true);
    $page->drawBlogPostTree($page->getGetID(), true);
     
    $page->drawFooter();
     
    /blog/add-post.php
    1,58 → 1,96
    <?php
     
    require '../_taios.php';
     
    $page = new Taios_Page('Blog Posts', '../');
     
    if (!$page->isUserGM($page->getLoggedInUser()))
    $page->redirect("index.php");
     
    if (isset($_POST['title']) && isset($_POST['content']) && isset($_POST['catagory']) && isset($_POST['parentID']))
    {
    $page->query('insert into BlogPosts VALUES(0, ' . $_POST['parentID'] . ', "' . $page->getLoggedInUser()->ID . '", "' . $_POST['title'] . '", "' . $_POST['content'] . '", NOW(), "' . $_POST['catagory'] . '", 0)');
    $page->redirect('index.php');
    }
     
    $page->drawHeader();
    $page->drawBlogCategoriesMenu();
    $page->drawMiddle();
     
    if ($page->isUserGM($page->getLoggedInUser()))
    {
    write('<p class="bold"><a href="add-post.php">Add Post</a></p>');
    write('<br />');
    }
     
    ?>
     
    <form action="add-post.php" method="post">
    <table>
    <tr>
    <td class="bold">Title: </td>
    <td><input type="text" name="title" /></td>
    </tr>
    <tr>
    <td class="bold">Content: </td>
    <td><textarea name="content" style="width: 523px; height: 543px">Content Here</textarea></td>
    </tr>
    <tr>
    <td class="bold">Catagory: </td>
    <td><input type="text" name="catagory" /></td>
    </tr>
     
    <?php
    write('<input type="hidden" name="parentID" value="' . $_GET['id'] . '"/>');
    ?>
     
    <tr>
    <td class="bold"></td>
    <td><input type="submit" value="Post" /></td>
    </tr>
    </table>
    </form>
     
    <?php
     
    $page->drawFooter();
     
    ?>
    <?php
     
    function getParentID()
    {
    if (isset($_GET['id']))
    {
    return $_GET['id'];
    }
    else
    {
    return -1;
    }
    }
     
    require '../_taios.php';
     
    $page = new Taios_Page('Add Post', '../');
    $page->checkLoggedIn();
     
    $error = '';
     
    if (isset($_POST['post']))
    {
    $title = $_POST['title'];
    $content = $_POST['content'];
    $parentID = $_POST['parentID'];
    $category = $_POST['category'];
     
    if (empty($title))
    {
    $error = "No Title Specified";
    }
    else if (empty($content))
    {
    $error = "No Content Specified";
    }
    else if (empty($parentID))
    {
    $error = "No Parent ID Specified";
    }
    else
    {
    if ($page->getLoggedInUser()->accessID >= 2 && $parentID == -1)
    {
    $page->drawError('You do not have permission to access this page.');
    }
    $page->query('INSERT INTO BlogPosts VALUES(0, ' . $parentID . ', "' . $page->getLoggedInUser()->ID . '", "' . $title . '", "' . $content . '", NOW(), "' . $category . '", 0)');
    $page->redirect('post.php?id=' . $parentID);
    }
    }
     
    $page->drawHeader();
    $page->drawBlogCategoriesMenu();
    $page->drawMiddle();
     
    if (!empty($error))
    {
    $page->drawError($error, false);
    }
     
    ?>
     
    <form action="add-post.php?id=<?php echo getParentID(); ?>" method="post">
    <table>
    <tr>
    <td class="bold">Title: </td>
    <td><input type="text" name="title" /></td>
    </tr>
    <tr>
    <td class="bold">Content: </td>
    <td><textarea name="content" style="width: 500px; height: 300px;"></textarea></td>
    </tr>
    <tr>
    <td class="bold">Catagory: </td>
    <td><input type="text" name="category" /></td>
    </tr>
     
    <input type="hidden" name="post" value="yes" />
     
    <?php
    write('<input type="hidden" name="parentID" value="' . getParentID() . '" />');
    ?>
     
    <tr>
    <td class="bold"></td>
    <td><input type="submit" value="Post" /></td>
    </tr>
    </table>
    </form>
     
    <?php
     
    $page->drawFooter();
     
    ?>
    /blog/del-post.php
    2,13 → 2,26
     
    require '../_taios.php';
     
    $page = new Taios_Page('Blog Posts', '../');
    $page = new Taios_Page('Delete Blog Post', '../');
     
    if (isset($_GET['id']))
    $id = $_GET['id'];
    if ($id)
    {
    if ($page->isUserAdmin($page->getLoggedInUser()) || $page->getLoggedInUser == $page->getBlogPost($_GET['id'])->author->ID)
    $page->delBlogPost($_GET['id']);
    if ($page->isUserAdmin($page->getLoggedInUser()) || $page->getLoggedInUser()->ID == $page->getBlogPost($id)->author->ID)
    {
    $page->delBlogPost($id);
    }
    else
    {
    $page->drawError('You do not have permission to access this page.');
    }
    }
    $page->redirect("index.php");
    else
    {
    $page->drawError('No ID Specified');
    }
     
    $page->redirect('index.php');
     
    ?>
     
    /wiki/index.php
    1,14 → 1,64
    <?php
     
    require '../_taios.php';
     
    $page = new Taios_Page('Wiki', '../');
    $page->drawHeader();
    $page->drawMiddle();
     
    write('<br /><p class="bold">This page is currently under construction.</p>');
     
    $page->drawFooter();
     
    ?>
     
    <?php
     
    function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, -$testlen) === 0;
    }
     
    require '../_taios.php';
     
    $pageName = $_GET['page'];
    if (empty($pageName))
    {
    $pageName = 'Index';
    }
     
    $page = new Taios_Page('Wiki - ' . $pageName, '../');
     
    if (isset($_GET['random']))
    {
    $results = array();
    $handler = opendir('pages/');
    while ($file = readdir($handler))
    {
    if ($file != '.' && $file != '..' && endswith($file, ".txt"))
    {
    $results[] = substr($file, 0, count($file) - 5);
    }
    }
    $index = rand() % count($results);
    $result = $results[$index];
    $page->redirect('index.php?page=' . $result);
    }
     
    $page->drawHeader();
    write('<h3>Wiki</h3>');
    $page->drawMenuItem('Index', 'wiki/index.php');
    $page->drawMenuItem('Random Page', 'wiki/index.php?random');
    $page->drawMiddle();
     
    if ($page->isUserGM($page->getLoggedInUser()))
    {
    write('<p class="bold"><a href="edit.php?page=' . $pageName . '">Edit Page</a></p><br />');
    }
     
    $filename = 'pages/' . $pageName . '.txt';
     
    $fp = @fopen($filename, 'r');
    if ($fp)
    {
    write('<p>' . $page->replaceBBCode(fread($fp, filesize($filename))) . '</p>');
    fclose($fp);
    }
    else
    {
    write('<p>This page is empty.</p>');
    }
     
    $page->drawFooter();
     
    ?>
     
    /wiki/edit-do.php
    0,0 → 1,40
    <?php
     
    require '../_taios.php';
     
    $pageName = $_POST['page'];
    if (empty($pageName))
    {
    $pageName = 'Index';
    }
     
    $page = new Taios_Page('Edit Page - ' . $pageName, '../');
     
    $page->checkLoggedIn();
     
    if ($page->isUserGM($page->getLoggedInUser()))
    {
    $filename = 'pages/' . $pageName . '.txt';
    $fp = @fopen($filename, 'w');
    if ($fp)
    {
    fwrite($fp, $_POST['content']);
    fclose($fp);
    $page->redirect('index.php?page=' . $pageName);
    }
    else
    {
    $page->drawError('Failed to write file.');
    }
    }
    else
    {
    $page->drawError('You do not have permission to access this page.');
    }
     
    $page->drawFooter();
     
    ?>
     
    /wiki/edit.php
    0,0 → 1,54
    <?php
     
    require '../_taios.php';
     
    $pageName = $_GET['page'];
    if (empty($pageName))
    {
    $pageName = 'Index';
    }
     
    $page = new Taios_Page('Edit Page - ' . $pageName, '../');
    $page->drawHeader();
    $page->drawMiddle();
     
    $page->checkLoggedIn();
     
    if ($page->isUserGM($page->getLoggedInUser()))
    {
    $filename = 'pages/' . $pageName . '.txt';
    $content = "";
     
    $fp = @fopen($filename, 'r');
    if ($fp)
    {
    $content = fread($fp, filesize($filename));
    fclose($fp);
    }
    ?>
     
    <form action="edit-do.php" method="POST">
    <input type="hidden" name="page" value="<?php echo $pageName; ?>" />
    <table>
    <tr>
    <td><textarea name="content"><?php echo $content; ?></textarea></td>
    </tr>
    <tr>
    <td><input type="submit" value="Edit" /></td>
    </tr>
    </table>
    </form>
     
    <?php
    }
    else
    {
    $page->drawError('You do not have permission to access this page.');
    }
     
    $page->drawFooter();
     
    ?>
     
    /wiki/pages/Index.txt
    0,0 → 1,4
    [b]Welcome to the Tim32 Wiki![/b]
     
    Here you can talk about pretty much anything!
     
    Property changes:
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
    Index: styles.css
    ===================================================================
    --- styles.css (revision 119)
    +++ styles.css (revision 442)
    @@ -1,124 +1,181 @@
    -body {
    - background-color: #FFFFFF;
    - color: #000000;
    -
    - font-family: Droid Sans, Tahoma, sans-serif;
    - font-size: 11pt;
    -}
    -
    -h1 {
    - font-size: 28pt;
    - margin: 6px;
    - margin-top: 0px;
    - color: #000089;
    - border-bottom: 1px solid #000000;
    -}
    -
    -h2 {
    - font-size: 20pt;
    - margin: 6px;
    - margin-left: 8px;
    - color: #00004B;
    -}
    -
    -h3 {
    - font-size: 16pt;
    - margin: 6px;
    - margin-left: 10px;
    - color: #000055;
    -}
    -
    -h4 {
    - font-size: 12pt;
    - margin: 6px;
    - margin-left: 12px;
    - color: #00005F;
    -}
    -
    -h5 {
    - font-size: 10pt;
    - margin: 6px;
    - margin-left: 14px;
    - color: #000069;
    -}
    -
    -p, table, span {
    - font-size: 11pt;
    - margin: 6px;
    - margin-left: 16px;
    -}
    -
    -a {
    - text-decoration: none;
    - color: #000050;
    -}
    -
    -a:hover {
    - text-decoration: underline;
    -}
    -
    -input {
    - border: 1px solid #000000;
    - color: #000000;
    - background-color: #B5D7FF;
    -}
    -
    -table {
    - border: 1px solid #222222;
    -}
    -
    -td {
    - padding: 3px;
    - border: 1px solid #888888;
    -}
    -
    -.sidebar {
    - left: 0px;
    - top: 0px;
    - position: fixed;
    - padding: 0px;
    - padding-left: 32px;
    - border-right: 1px solid #000089;
    - background-color: #FFFF73;
    - background-image: url('data/sidebar-gradient.png');
    - background-repeat: repeat-x;
    - background-position: center bottom;
    -
    -}
    -
    -.sidebar-header {
    - left: 0px;
    - width: 140px;
    - padding: 6px;
    - text-align: right;
    -}
    -
    -.sidebar-menu {
    - text-align: right;
    - padding: 6px;
    -}
    -
    -.sidebar-menu h3 {
    - margin: 6px;
    -}
    -
    -.sidebar-menu p {
    - font-size: 12pt;
    - margin: 4px;
    -}
    -
    -.content {
    - left: 200px;
    - top: 0px;
    - position: absolute;
    - margin-right: 32px;
    -}
    -
    -.bold {
    - font-weight: bold;
    -}
    -
    -.indent {
    - margin-left: 14px;
    - border-left: 1px solid #BBBBBB;
    -}
    +body {
    + background-color: #FFFFFF;
    + color: #000000;
    +
    + font-family: Droid Sans, Tahoma, sans-serif;
    + font-size: 10pt;
    +
    + margin: 0px;
    + padding: 0px;
    +}
    +
    +h1 {
    + font-size: 28pt;
    + margin: 8px;
    + margin-top: 0px;
    + color: #FFFFFF;
    + border-bottom: 1px solid #FFFFFF;
    +}
    +
    +h2 {
    + font-size: 20pt;
    + margin: 8px;
    + margin-left: 8px;
    + color: #00004B;
    +}
    +
    +h3 {
    + font-size: 16pt;
    + margin: 8px;
    + margin-left: 10px;
    + color: #000055;
    +}
    +
    +h4 {
    + font-size: 12pt;
    + margin: 8px;
    + margin-left: 12px;
    + color: #00005F;
    +}
    +
    +h5 {
    + font-size: 10pt;
    + margin: 8px;
    + margin-left: 14px;
    + color: #000069;
    +}
    +
    +p, table, span {
    + font-size: 10pt;
    + margin: 8px;
    + margin-left: 16px;
    +}
    +
    +a {
    + text-decoration: none;
    + color: #000050;
    +}
    +
    +a:hover {
    + text-decoration: underline;
    +}
    +
    +input {
    + border: 1px solid #000000;
    + color: #000000;
    + background-color: #B5D7FF;
    + width: 500px;
    +}
    +
    +table {
    + border: 1px solid #222222;
    +}
    +
    +td {
    + padding: 3px;
    + border: 1px solid #888888;
    +}
    +
    +img {
    + border: 2px solid #333333;
    +}
    +
    +textarea {
    + width: 500px;
    + height: 300px;
    +}
    +
    +.smiley {
    + border: 0px;
    + vertical-align: middle;
    +}
    +
    +.sidebar {
    + float: left;
    + width: 156px;
    + padding: 0px;
    + padding-left: 32px;
    + border-right: 0px solid #000089;
    + background-color: #032865;
    + color: #FFFFFF;
    +}
    +
    +.sidebar-header {
    + width: 140px;
    + padding: 6px;
    + text-align: right;
    +}
    +
    +.sidebar-menu {
    + text-align: right;
    + padding: 6px;
    + color: #FFFFFF;
    +}
    +
    +.sidebar-menu h3 {
    + margin: 6px;
    + color: #FFFFFF;
    +}
    +
    +.sidebar-menu p {
    + font-size: 12pt;
    + margin: 4px;
    +}
    +
    +.sidebar-menu a {
    + color: #FFFFFF;
    +}
    +
    +.content {
    + top: 0px;
    + left: 190px;
    + position: absolute;
    + margin-right: 32px;
    +}
    +
    +.bold {
    + font-weight: bold;
    +}
    +
    +.italic {
    + font-style: italic;
    +}
    +
    +.indent {
    + margin-left: 14px;
    + border-left: 1px solid #BBBBBB;
    +}
    +
    +.code {
    + border-top: 2px solid #999999;
    + border-bottom: 2px solid #999999;
    + margin: 14px;
    + background-color: #DDDDDD;
    + font-family: Droid Sans Mono, Monospace, Fixed;
    + font-size: 9px;
    + line-height: 80%;
    +}
    +
    +.copyright {
    + color: #BBBBBB;
    + text-align: left;
    + font-size: 9pt;
    +}
    +
    +.copyright a {
    + color: #BBBBBB;
    +}
    +
    +.recaptchatable .recaptcha_image_cell, #recaptcha_table {
    + background-color: #4B9DE0 !important; //reCaptcha widget background color
    +}
    +
    +#recaptcha_table {
    + border-color: #3874A4 !important; //reCaptcha widget border color
    +}
    +
    +#recaptcha_response_field {
    + border-color: #000000 !important; //Text input field border color
    + background-color:#FFFFFF !important; //Text input field background color
    +}
    +
    Index: index.php
    ===================================================================
    --- index.php (revision 119)
    +++ index.php (revision 442)
    @@ -1,39 +1,42 @@
    -
    -
    -require '_taios.php';
    -
    -$page = new Taios_Page('Home');
    -$page->drawHeader();
    -write('

    Pages

    ');
    -$page->drawMenuItem('Biggles', '/~biggles/');
    -$page->drawMenuItem('Freddie', '/~freddie/');
    -$page->drawMenuItem('Muzer', '/~muzer/');
    -$page->drawMenuItem('Sh4rk', '/~szabot/');
    -$page->drawMenuItem('Tom', '/~tom/');
    -$page->drawMiddle();
    -
    -?>
    -
    -

    Welcome to Tim32!

    -

    Tim32 is a 10 year-old laptop running Ubuntu Server Edition 10.04.

    -
    -
    -

    Latest Blog Posts

    -
    -
    -
    -$ids = $page->findIDs('BlogPosts', 'WHERE ParentID = -1');
    -for ($i = 0; $i < 5 && $i < count($ids); $i++)
    -{
    - $id = $ids[$i];
    - $post = $page->getBlogPost($id);
    -
    - write('

    ' . $post->title. '

    ');
    - write('
    Posted On ' . date('l j F Y', $post->datePosted) . ' by ' . $post->user->name . ' (' . $post->user->username . ')
    ');
    - write('

    ' . $post->content . '

    ');
    - write('
    ');
    -}
    -
    -$page->drawFooter();
    -
    -?>
    +
    +
    +require '_taios.php';
    +
    +$page = new Taios_Page('Home');
    +$page->drawHeader();
    +write('

    Pages

    ');
    +$page->drawMenuItem('Biggles', '/~biggles/');
    +$page->drawMenuItem('Freddie (FredFace)', '/~freddie/');
    +$page->drawMenuItem('Muzer', '/~muzer/');
    +$page->drawMenuItem('Sh4rk', '/~szabot/');
    +$page->drawMenuItem('Tom (TomMan)', '/~tom/');
    +write('

    Downtime-o-meter

    ');
    +write('

    No planned down.

    ');
    +$page->drawMiddle();
    +
    +?>
    +
    +

    Welcome to Tim32!

    +

    Tim32 is a 10 year-old laptop running Ubuntu Server Edition 10.04.

    +
    +
    +

    Latest Blog Posts

    +

    Rss Feed

    +
    +
    +
    +$ids = $page->findIDs('BlogPosts', 'WHERE ParentID = -1 ORDER BY DatePosted DESC');
    +for ($i = 0; $i < 4 && $i < count($ids); $i++)
    +{
    + $id = $ids[$i];
    + $post = $page->getBlogPost($id);
    +
    + write('

    ' . $post->title. '

    ');
    + write('
    Posted On ' . date('l j F Y', $post->datePosted) . ' by ' . $post->user->name . ' (' . $post->user->username . ')
    ');
    + write('

    ' . $page->replaceBBCode($post->content) . '

    ');
    + write('
    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    Index: register.php
    ===================================================================
    --- register.php (revision 119)
    +++ register.php (revision 442)
    @@ -1,56 +1,69 @@
    -
    -
    -require '_taios.php';
    -
    -$page = new Taios_Page('Register');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -?>
    -
    -

    Here you can create an account with Tim32.

    -
    -
    -
    -
    -if (isset($_GET['error']))
    -{
    - $page->drawError($_GET['error'], false);
    -}
    -
    -?>
    -
    -
    -: :
    -
    -Username:
    -
    -
    -
    -Password:
    -
    -
    -
    -Repeat Password:
    -
    -
    -
    -Email Address
    -
    -
    -
    -Name
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -$page->drawFooter();
    -
    -?>
    +
    +
    +require '_taios.php';
    +require_once '_recaptchalib.php';
    +
    +$page = new Taios_Page('Register');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +?>
    +
    +

    Here you can create an account with Tim32.

    +
    +
    +
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +?>
    +
    +
    +
    +
    +
    +
    +Username:
    +
    +
    +
    +Password:
    +
    +
    +
    +Repeat Password:
    +
    +
    +
    +Email Address:
    +
    +
    +
    +Name:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    By registering to Tim32, you agree to be reasonable in all your suggestion/accusations and advoid subjectivity. Suvbjective posts/comments are subject to removal by a Subject of the Tim32 Admins.

    +
    +
    +
    +
    +$page->drawFooter();
    +
    +?>
    Index: challenge/index.php
    ===================================================================
    --- challenge/index.php (nonexistent)
    +++ challenge/index.php (revision 442)
    @@ -0,0 +1,23 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Tim32 Challenge', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +if ($page->isLoggedIn())
    +{
    + write('

    Take the Tim32 challenge here!

    ');
    + write('

    Once you\'ve passed a challenge, your progress will automatically be saved.

    ');
    + write('

    Enter!

    ');
    +}
    +else
    +{
    + write('

    You need to be logged in to take the Tim32 challenge.

    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: challenge/00.php
    ===================================================================
    --- challenge/00.php (nonexistent)
    +++ challenge/00.php (revision 442)
    @@ -0,0 +1,37 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Challenge - 00', '../');
    +$page->checkChallengeStatus(0, "index", "01");
    +
    +$page->drawHeader();
    +write('

    Challenge

    ');
    +$page->drawMenuItem('Index', 'challenge/index.php');
    +$page->drawMiddle();
    +
    +?>
    +
    +
    +
    +
    +Morse:
    +.. .-.. .. -.- . -- --- --- ... .
    +
    +
    +Moose:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: challenge/01.php
    ===================================================================
    --- challenge/01.php (nonexistent)
    +++ challenge/01.php (revision 442)
    @@ -0,0 +1,18 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Challenge - 01', '../');
    +$page->checkChallengeStatus(1, "index", "02");
    +
    +$page->drawHeader();
    +write('

    Challenge

    ');
    +$page->drawMenuItem('Index', 'challenge/index.php');
    +$page->drawMiddle();
    +
    +
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: challenge/00-do.php
    ===================================================================
    --- challenge/00-do.php (nonexistent)
    +++ challenge/00-do.php (revision 442)
    @@ -0,0 +1,19 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Challenge - 00', '../');
    +$page->checkChallengeStatus(0, "index", "01");
    +
    +if ($_POST['moose'] == 'i like moose')
    +{
    + $page->query('UPDATE Users SET ChallengeID = 1 WHERE ID = ' . $page->getLoggedInUser()->ID);
    + $page->redirect('01.php');
    +}
    +else
    +{
    + $page->redirect('index.php');
    +}
    +
    +?>
    +
    Index: 404.php
    ===================================================================
    --- 404.php (nonexistent)
    +++ 404.php (revision 442)
    @@ -0,0 +1,30 @@
    +
    +
    +require '_taios.php';
    +
    +$page = new Taios_Page('404 - Pagee not found', '/');
    +$page->drawHeader();
    +write('

    Pages

    ');
    +$page->drawMenuItem('Biggles', '/~biggles/');
    +$page->drawMenuItem('Freddie', '/~freddie/');
    +$page->drawMenuItem('Muzer', '/~muzer/');
    +$page->drawMenuItem('Sh4rk', '/~szabot/');
    +$page->drawMenuItem('Tom', '/~tom/');
    +$page->drawMiddle();
    +
    +?>
    +
    +

    404 - Page not found

    +

    The page you requested could not be found.

    +
    +
    +

    Useful Links

    +
    +
    +
    +$page->drawMenuItem('Tim32 Homepage', 'index.php');
    +$page->drawMenuItem('Youfail.org', 'http://youfail.org');
    +
    +$page->drawFooter();
    +
    +?>
    Index: register-do.php
    ===================================================================
    --- register-do.php (revision 119)
    +++ register-do.php (revision 442)
    @@ -1,34 +1,44 @@
    -
    -
    -require '_taios.php';
    -
    -$page = new Taios_Page('Login');
    -
    -$username = $_POST['username'];
    -$password = $_POST['password'];
    -$password2 = $_POST['password2'];
    -$email = $_POST['email'];
    -$name = $_POST['name'];
    -
    -if (empty($username))
    -{
    - $page->redirect('register.php?error=No Username Specified');
    -}
    -if (empty($password))
    -{
    - $page->redirect('register.php?error=No Password Specified');
    -}
    -if (empty($password2))
    -{
    - $page->redirect('register.php?error=No Repeat Password Specified');
    -}
    -if ($password != $password2)
    -{
    - $page->redirect('register.php?error=Passwords do not match');
    -}
    -
    -$page->query('INSERT INTO Users (AccessID, Username, Password, EmailAddress, Name, ChallengeID) VALUES (2, "' . $username . '", "' . sha1($password) . '", "' . $email . '", "' . $name . '", 0)');
    -
    -$page->redirect('login.php');
    -
    -?>
    +
    +
    +require '_taios.php';
    +require_once '_recaptchalib.php';
    +
    +$page = new Taios_Page('Login');
    +
    +$username = $_POST['username'];
    +$password = $_POST['password'];
    +$password2 = $_POST['password2'];
    +$email = $_POST['email'];
    +$name = $_POST['name'];
    +
    +if (empty($username))
    +{
    + $page->redirect('register.php?error=No Username Specified');
    +}
    +if (empty($password))
    +{
    + $page->redirect('register.php?error=No Password Specified');
    +}
    +if (empty($password2))
    +{
    + $page->redirect('register.php?error=No Repeat Password Specified');
    +}
    +if ($password != $password2)
    +{
    + $page->redirect('register.php?error=Passwords do not match');
    +}
    +
    +$resp = recaptcha_check_answer(RECAPTCHA_PRIVATEKEY, $_SERVER["REMOTE_ADDR"],
    + $_POST["recaptcha_challenge_field"],
    + $_POST["recaptcha_response_field"]);
    +
    +if (!$resp->is_valid)
    +{
    + $page->redirect('register.php?error=Incorrect reCAPTCHA response');
    +}
    +
    +$page->query('INSERT INTO Users (AccessID, Username, Password, EmailAddress, Name, ChallengeID) VALUES (2, "' . $username . '", "' . sha1($password) . '", "' . $email . '", "' . $name . '", 0)');
    +
    +$page->redirect('login.php');
    +
    +?>
    Index: _recaptchalib.php
    ===================================================================
    --- _recaptchalib.php (nonexistent)
    +++ _recaptchalib.php (revision 442)
    @@ -0,0 +1,277 @@
    +
    +/*
    + * This is a PHP library that handles calling reCAPTCHA.
    + * - Documentation and latest version
    + * http://recaptcha.net/plugins/php/
    + * - Get a reCAPTCHA API Key
    + * https://www.google.com/recaptcha/admin/create
    + * - Discussion group
    + * http://groups.google.com/group/recaptcha
    + *
    + * Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
    + * AUTHORS:
    + * Mike Crawford
    + * Ben Maurer
    + *
    + * Permission is hereby granted, free of charge, to any person obtaining a copy
    + * of this software and associated documentation files (the "Software"), to deal
    + * in the Software without restriction, including without limitation the rights
    + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    + * copies of the Software, and to permit persons to whom the Software is
    + * furnished to do so, subject to the following conditions:
    + *
    + * The above copyright notice and this permission notice shall be included in
    + * all copies or substantial portions of the Software.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    + * THE SOFTWARE.
    + */
    +
    +/**
    + * The reCAPTCHA server URL's
    + */
    +define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api");
    +define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api");
    +define("RECAPTCHA_VERIFY_SERVER", "www.google.com");
    +
    +/**
    + * Encodes the given data into a query string format
    + * @param $data - array of string elements to be encoded
    + * @return string - encoded request
    + */
    +function _recaptcha_qsencode ($data) {
    + $req = "";
    + foreach ( $data as $key => $value )
    + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&';
    +
    + // Cut the last '&'
    + $req=substr($req,0,strlen($req)-1);
    + return $req;
    +}
    +
    +
    +
    +/**
    + * Submits an HTTP POST to a reCAPTCHA server
    + * @param string $host
    + * @param string $path
    + * @param array $data
    + * @param int port
    + * @return array response
    + */
    +function _recaptcha_http_post($host, $path, $data, $port = 80) {
    +
    + $req = _recaptcha_qsencode ($data);
    +
    + $http_request = "POST $path HTTP/1.0\r\n";
    + $http_request .= "Host: $host\r\n";
    + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
    + $http_request .= "Content-Length: " . strlen($req) . "\r\n";
    + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
    + $http_request .= "\r\n";
    + $http_request .= $req;
    +
    + $response = '';
    + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
    + die ('Could not open socket');
    + }
    +
    + fwrite($fs, $http_request);
    +
    + while ( !feof($fs) )
    + $response .= fgets($fs, 1160); // One TCP-IP packet
    + fclose($fs);
    + $response = explode("\r\n\r\n", $response, 2);
    +
    + return $response;
    +}
    +
    +
    +
    +/**
    + * Gets the challenge HTML (javascript and non-javascript version).
    + * This is called from the browser, and the resulting reCAPTCHA HTML widget
    + * is embedded within the HTML form it was called from.
    + * @param string $pubkey A public key for reCAPTCHA
    + * @param string $error The error given by reCAPTCHA (optional, default is null)
    + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)
    +
    + * @return string - The HTML to be embedded in the user's form.
    + */
    +function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
    +{
    + if ($pubkey == null || $pubkey == '') {
    + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create");
    + }
    +
    + if ($use_ssl) {
    + $server = RECAPTCHA_API_SECURE_SERVER;
    + } else {
    + $server = RECAPTCHA_API_SERVER;
    + }
    +
    + $errorpart = "";
    + if ($error) {
    + $errorpart = "&error=" . $error;
    + }
    + return '
    +
    +
    +
    +
    +
    + ';
    +}
    +
    +
    +
    +
    +/**
    + * A ReCaptchaResponse is returned from recaptcha_check_answer()
    + */
    +class ReCaptchaResponse {
    + var $is_valid;
    + var $error;
    +}
    +
    +
    +/**
    + * Calls an HTTP POST function to verify if the user's guess was correct
    + * @param string $privkey
    + * @param string $remoteip
    + * @param string $challenge
    + * @param string $response
    + * @param array $extra_params an array of extra variables to post to the server
    + * @return ReCaptchaResponse
    + */
    +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
    +{
    + if ($privkey == null || $privkey == '') {
    + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create");
    + }
    +
    + if ($remoteip == null || $remoteip == '') {
    + die ("For security reasons, you must pass the remote ip to reCAPTCHA");
    + }
    +
    +
    +
    + //discard spam submissions
    + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
    + $recaptcha_response = new ReCaptchaResponse();
    + $recaptcha_response->is_valid = false;
    + $recaptcha_response->error = 'incorrect-captcha-sol';
    + return $recaptcha_response;
    + }
    +
    + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
    + array (
    + 'privatekey' => $privkey,
    + 'remoteip' => $remoteip,
    + 'challenge' => $challenge,
    + 'response' => $response
    + ) + $extra_params
    + );
    +
    + $answers = explode ("\n", $response [1]);
    + $recaptcha_response = new ReCaptchaResponse();
    +
    + if (trim ($answers [0]) == 'true') {
    + $recaptcha_response->is_valid = true;
    + }
    + else {
    + $recaptcha_response->is_valid = false;
    + $recaptcha_response->error = $answers [1];
    + }
    + return $recaptcha_response;
    +
    +}
    +
    +/**
    + * gets a URL where the user can sign up for reCAPTCHA. If your application
    + * has a configuration page where you enter a key, you should provide a link
    + * using this function.
    + * @param string $domain The domain where the page is hosted
    + * @param string $appname The name of your application
    + */
    +function recaptcha_get_signup_url ($domain = null, $appname = null) {
    + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname));
    +}
    +
    +function _recaptcha_aes_pad($val) {
    + $block_size = 16;
    + $numpad = $block_size - (strlen ($val) % $block_size);
    + return str_pad($val, strlen ($val) + $numpad, chr($numpad));
    +}
    +
    +/* Mailhide related code */
    +
    +function _recaptcha_aes_encrypt($val,$ky) {
    + if (! function_exists ("mcrypt_encrypt")) {
    + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
    + }
    + $mode=MCRYPT_MODE_CBC;
    + $enc=MCRYPT_RIJNDAEL_128;
    + $val=_recaptcha_aes_pad($val);
    + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
    +}
    +
    +
    +function _recaptcha_mailhide_urlbase64 ($x) {
    + return strtr(base64_encode ($x), '+/', '-_');
    +}
    +
    +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
    +function recaptcha_mailhide_url($pubkey, $privkey, $email) {
    + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
    + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
    + "you can do so at http://www.google.com/recaptcha/mailhide/apikey");
    + }
    +
    +
    + $ky = pack('H*', $privkey);
    + $cryptmail = _recaptcha_aes_encrypt ($email, $ky);
    +
    + return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
    +}
    +
    +/**
    + * gets the parts of the email to expose to the user.
    + * eg, given johndoe@example,com return ["john", "example.com"].
    + * the email is then displayed as john...@example.com
    + */
    +function _recaptcha_mailhide_email_parts ($email) {
    + $arr = preg_split("/@/", $email );
    +
    + if (strlen ($arr[0]) <= 4) {
    + $arr[0] = substr ($arr[0], 0, 1);
    + } else if (strlen ($arr[0]) <= 6) {
    + $arr[0] = substr ($arr[0], 0, 3);
    + } else {
    + $arr[0] = substr ($arr[0], 0, 4);
    + }
    + return $arr;
    +}
    +
    +/**
    + * Gets html to display an email address given a public an private key.
    + * to get a key, go to:
    + *
    + * http://www.google.com/recaptcha/mailhide/apikey
    + */
    +function recaptcha_mailhide_html($pubkey, $privkey, $email) {
    + $emailparts = _recaptcha_mailhide_email_parts ($email);
    + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email);
    +
    + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]);
    +
    +}
    +
    +
    +?>
    Index: admin/all-accounts.php
    ===================================================================
    --- admin/all-accounts.php (revision 119)
    +++ admin/all-accounts.php (revision 442)
    @@ -1,51 +1,51 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Manage All Accounts', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -$page->checkLoggedIn();
    -
    -if ($page->isUserAdmin($page->getLoggedInUser()))
    -{
    - write('

    Use this to manage all the accounts on the Tim32 Website.


    ');
    -
    - write('');');');');');');');');');');');');');');');');');');');
    - write('
    - write('ID
    - write('AccessID
    - write('Username
    - write('Password
    - write('Name
    - write('Email Address
    - write('Challenge ID
    - write('
    -
    - $ids = $page->findIDs('Users');
    - for ($i = 0; $i < count($ids); $i++)
    - {
    - $user = $page->getUserByID($ids[$i]);
    - write('
    - write('' . $user->ID . '
    - write('' . $user->accessID . '
    - write('' . $user->username . '
    - write('' . $user->password . '
    - write('' . $user->name . '
    - write('' . $user->emailAddress . '
    - write('' . $user->challengeID . '
    - write('
    - }
    -
    - write('
    ');
    -}
    -else
    -{
    - drawError('You do not have permission to access this page.');
    -}
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage All Accounts', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('

    Use this to manage all the accounts on the Tim32 Website.


    ');
    +
    + write('');');');');');');');');');');');');');');');');');');');
    + write('
    + write('ID
    + write('AccessID
    + write('Username
    + write('SHA1 Password
    + write('Name
    + write('Email Address
    + write('Challenge ID
    + write('
    +
    + $ids = $page->findIDs('Users');
    + for ($i = 0; $i < count($ids); $i++)
    + {
    + $user = $page->getUserByID($ids[$i]);
    + write('
    + write('' . $user->ID . '
    + write('' . $user->accessID . '
    + write('' . $user->username . '
    + write('' . $user->password . '
    + write('' . $user->name . '
    + write('' . $user->emailAddress . '
    + write('' . $user->challengeID . '
    + write('
    + }
    +
    + write('
    ');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/all-forum-posts.php
    ===================================================================
    --- admin/all-forum-posts.php (nonexistent)
    +++ admin/all-forum-posts.php (revision 442)
    @@ -0,0 +1,67 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage All Forum Posts', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('

    Use this to manage all the forum categories on the Tim32 Website.


    ');
    +
    + write('');');');');');');');');');');');');');');');');');');');');');');');
    + write('
    + write('ID
    + write('Author
    + write('Category
    + write('Parent
    + write('Title
    + write('Content
    + write('Date Posted
    + write('Spam
    + write('
    +
    + $ids = $page->findIDs('ForumPosts');
    + for ($i = 0; $i < count($ids); $i++)
    + {
    + $post = $page->getForumPost($ids[$i]);
    + write('
    + write('' . $post->ID . '
    + write('' . $post->author->name . '
    + if (!$post->category)
    + {
    + write('No Category
    + }
    + else
    + {
    + write('' . $post->category->title . '
    + }
    + if (!$post->parent)
    + {
    + write('No Parent
    + }
    + else
    + {
    + write('' . $post->parent->title . '
    + }
    + write('' . $post->title . '
    + write('' . str_replace("\n", ' ', $post->content) . '
    + write('' . date('j/m/Y H:i', $post->datePosted) . '
    + write('' . $post->spam . '
    + write('
    + }
    +
    + write('
    ');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/all-forum-categories.php
    ===================================================================
    --- admin/all-forum-categories.php (nonexistent)
    +++ admin/all-forum-categories.php (revision 442)
    @@ -0,0 +1,52 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage All Forum Categories', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('

    Use this to manage all the forum categories on the Tim32 Website.


    ');
    +
    + write('');');');');');');');');');');');');');');
    + write('
    + write('ID
    + write('Parent
    + write('Title
    + write('Description
    + write('
    +
    + $ids = $page->findIDs('ForumCategories');
    + for ($i = 0; $i < count($ids); $i++)
    + {
    + $cat = $page->getForumCategory($ids[$i]);
    + write('
    + write('' . $cat->ID . '
    + if (!$cat->parent)
    + {
    + write('No Parent
    + }
    + else
    + {
    + write('' . $cat->parent->title . '
    + }
    + write('' . $cat->title . '
    + write('' . $cat->description . '
    + write('
    + }
    +
    + write('
    ');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/index.php
    ===================================================================
    --- admin/index.php (revision 119)
    +++ admin/index.php (revision 442)
    @@ -1,27 +1,26 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Administration', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -$page->checkLoggedIn();
    -$user = $page->getLoggedInUser();
    -
    -write('

    Manage Account

    ');
    -
    -if ($page->isUserAdmin($user))
    -{
    - write('

    Manage All Accounts

    ');
    - write('

    Manage All Blog Posts

    ');
    - write('

    Manage All Projects

    ');
    - write('

    Manage All Forum Categories

    ');
    - write('

    Manage All Forum Topics

    ');
    - write('

    Manage All Forum Posts

    ');
    -}
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Administration', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +$user = $page->getLoggedInUser();
    +
    +write('

    Manage Account

    ');
    +
    +if ($page->isUserAdmin($user))
    +{
    + write('

    Manage All Accounts

    ');
    + write('

    Manage All Blog Posts

    ');
    + write('

    Manage All Projects

    ');
    + write('

    Manage All Forum Categories

    ');
    + write('

    Manage All Forum Posts

    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/all-projects.php
    ===================================================================
    --- admin/all-projects.php (nonexistent)
    +++ admin/all-projects.php (revision 442)
    @@ -0,0 +1,55 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage All Projects', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('

    Use this to manage all the projects on the Tim32 Website.


    ');
    +
    + write('');');');');');');');');');');');');');');');');');');');');');');');
    + write('
    + write('ID
    + write('Author
    + write('Title
    + write('Description
    + write('Logo
    + write('Download
    + write('Website
    + write('Latest Version
    + write('Last Update
    + write('
    +
    + $ids = $page->findIDs('Projects');
    + for ($i = 0; $i < count($ids); $i++)
    + {
    + $project = $page->getProject($ids[$i]);
    + write('
    + write('' . $project->ID . '
    + write('' . $project->author->name . '
    + write('' . $project->title . '
    + write('' . str_replace("\n", '
    ', $project->description) . '
    + write('
    + write('Link
    + write('Link
    + write('' . $project->latestVersion . '
    + write('' . date('j/m/Y H:i', $project->lastUpdate) . '
    + write('
    + }
    +
    + write('
    ');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/all-blog-posts.php
    ===================================================================
    --- admin/all-blog-posts.php (revision 119)
    +++ admin/all-blog-posts.php (revision 442)
    @@ -1,60 +1,60 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Manage All Blog Posts', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -$page->checkLoggedIn();
    -
    -if ($page->isUserAdmin($page->getLoggedInUser()))
    -{
    - write('

    Use this to manage all the blog posts on the Tim32 Website.


    ');
    -
    - write('');');');');');');');');');');');');');');');');');');');');');');
    - write('
    - write('ID
    - write('Parent
    - write('Author
    - write('Title
    - write('Content
    - write('Date Posted
    - write('Category
    - write('Spam
    - write('
    -
    - $ids = $page->findIDs('BlogPosts');
    - for ($i = 0; $i < count($ids); $i++)
    - {
    - $post = $page->getBlogPost($ids[$i]);
    - write('
    - write('' . $post->ID . '
    - if ($post->parent == -1)
    - {
    - write('No Parent
    - }
    - else
    - {
    - write('' . $post->parent->title . '
    - }
    - write('' . $post->author->name . '
    - write('' . $post->title . '
    - write('' . $post->content . '
    - write('' . date('j/m/Y H:i', $post->datePosted) . '
    - write('' . $post->category . '
    - write('' . $post->spam . '
    - write('
    - }
    -
    - write('
    ');
    -}
    -else
    -{
    - drawError('You do not have permission to access this page.');
    -}
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage All Blog Posts', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('

    Use this to manage all the blog posts on the Tim32 Website.


    ');
    +
    + write('');');');');');');');');');');');');');');');');');');');');');');
    + write('
    + write('ID
    + write('Parent
    + write('Author
    + write('Title
    + write('Content
    + write('Date Posted
    + write('Category
    + write('Spam
    + write('
    +
    + $ids = $page->findIDs('BlogPosts', 'ORDER BY DatePosted DESC');
    + for ($i = 0; $i < count($ids); $i++)
    + {
    + $post = $page->getBlogPost($ids[$i]);
    + write('
    + write('' . $post->ID . '
    + if ($post->parent == -1)
    + {
    + write('No Parent
    + }
    + else
    + {
    + write('' . $post->parent->title . '
    + }
    + write('' . $post->author->name . '
    + write('' . $post->title . '
    + write('' . str_replace("\n", '
    ', $post->content) . '
    + write('' . date('j/m/Y H:i', $post->datePosted) . '
    + write('' . $post->category . '
    + write('' . $post->spam . '
    + write('
    + }
    +
    + write('
    ');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/account.php
    ===================================================================
    --- admin/account.php (revision 119)
    +++ admin/account.php (revision 442)
    @@ -1,60 +1,60 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Manage Account', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -$page->checkLoggedIn();
    -
    -$userID = $page->getGetID();
    -$user = $page->getUserByID($userID);
    -
    -if (($page->getLoggedInUser()->ID == $userID || $page->isUserAdmin($page->getLoggedInUser())) && $user)
    -{
    -?>
    -
    -

    Here you can edit your account.

    -

    Only change the password value if you want to change your password.

    -
    -
    -
    -');');
    -
    ID: ID; ?>
    -
    -if ($page->isUserAdmin($page->getLoggedInUser()))
    -{
    - write('
    AccessID:
    -}
    -else
    -{
    - write('
    AccessID: ' . $user->accessID . '
    -}
    -?>
    -
    Username: username; ?>
    -
    Password:
    -
    Email Address:
    -
    Name:
    -
    -
    -
    -
    -
    -}
    -else
    -{
    - if (!$user)
    - {
    - drawError('No such user, #' . $userID);
    - }
    - else
    - {
    - drawError('You do not have permission to access this page.');
    - }
    -}
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Manage Account', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +$userID = $page->getGetID();
    +$user = $page->getUserByID($userID);
    +
    +if (($page->getLoggedInUser()->ID == $userID || $page->isUserAdmin($page->getLoggedInUser())) && $user)
    +{
    +?>
    +
    +

    Here you can edit your account.

    +

    Only change the password value if you want to change your password.

    +
    +
    +
    +');');
    +
    ID: ID; ?>
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + write('
    AccessID:
    +}
    +else
    +{
    + write('
    AccessID: ' . $user->accessID . '
    +}
    +?>
    +
    Username: username; ?>
    +
    Password:
    +
    Email Address:
    +
    Name:
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + if (!$user)
    + {
    + $page->drawError('No such user, #' . $userID);
    + }
    + else
    + {
    + $page->drawError('You do not have permission to access this page.');
    + }
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: admin/account-do.php
    ===================================================================
    --- admin/account-do.php (revision 119)
    +++ admin/account-do.php (revision 442)
    @@ -1,53 +1,53 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Update Account', '../');
    -$userID = $page->getPostID();
    -
    -$page->checkLoggedIn();
    -
    -$accessID = $_POST['accessID'];
    -$password = $_POST['password'];
    -$email = $_POST['email'];
    -$name = $_POST['name'];
    -
    -$user = $page->getUserByID($userID);
    -if (($page->getLoggedInUser()->ID == $userID || $page->isUserAdmin($page->getLoggedInUser())) && $user)
    -{
    - if (isset($accessID) && $page->isUserAdmin($page->getLoggedInUser()))
    - {
    - $page->query('UPDATE Users SET AccessID = "' . $accessID . '" WHERE ID = ' . $userID);
    - }
    -
    - if (!empty($password))
    - {
    - $page->query('UPDATE Users SET Password = "' . sha1($password) . '" WHERE ID = ' . $userID);
    - }
    -
    - if (!empty($email))
    - {
    - $page->query('UPDATE Users SET EmailAddress = "' . $email . '" WHERE ID = ' . $userID);
    - }
    -
    - if (!empty($name))
    - {
    - $page->query('UPDATE Users SET Name = "' . $name . '" WHERE ID = ' . $userID);
    - }
    -}
    -else
    -{
    - if (!$user)
    - {
    - drawError('No such user, #' . $userID);
    - }
    - else
    - {
    - drawError('You do not have permission to access this page.');
    - }
    -}
    -
    -$page->redirect('account.php?id=' . $userID);
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Update Account', '../');
    +$userID = $page->getPostID();
    +
    +$page->checkLoggedIn();
    +
    +$accessID = $_POST['accessID'];
    +$password = $_POST['password'];
    +$email = $_POST['email'];
    +$name = $_POST['name'];
    +
    +$user = $page->getUserByID($userID);
    +if (($page->getLoggedInUser()->ID == $userID || $page->isUserAdmin($page->getLoggedInUser())) && $user)
    +{
    + if (isset($accessID) && $page->isUserAdmin($page->getLoggedInUser()))
    + {
    + $page->query('UPDATE Users SET AccessID = "' . $accessID . '" WHERE ID = ' . $userID);
    + }
    +
    + if (!empty($password))
    + {
    + $page->query('UPDATE Users SET Password = "' . sha1($password) . '" WHERE ID = ' . $userID);
    + }
    +
    + if (!empty($email))
    + {
    + $page->query('UPDATE Users SET EmailAddress = "' . $email . '" WHERE ID = ' . $userID);
    + }
    +
    + if (!empty($name))
    + {
    + $page->query('UPDATE Users SET Name = "' . $name . '" WHERE ID = ' . $userID);
    + }
    +}
    +else
    +{
    + if (!$user)
    + {
    + $page->drawError('No such user, #' . $userID);
    + }
    + else
    + {
    + $page->drawError('You do not have permission to access this page.');
    + }
    +}
    +
    +$page->redirect('account.php?id=' . $userID);
    +
    +?>
    +
    Index: forums/index.php
    ===================================================================
    --- forums/index.php (revision 119)
    +++ forums/index.php (revision 442)
    @@ -1,14 +1,81 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Forums', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -write('

    This page is currently under construction.

    ');
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Forums', '../');
    +
    +$parentID = $_GET['parentID'];
    +if (empty($parentID))
    +{
    + $parentID = -1;
    +}
    +else if ($parentID != -1)
    +{
    + $page->title = $page->getForumCategory($parentID)->title;
    +}
    +
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +write('

    The forums are still under construction.

    ');
    +
    +write('

    ');

    +if ($parentID != -1)
    +{
    + write('Back to root');
    +}
    +if ($page->isLoggedIn())
    +{
    + if ($parentID != -1)
    + {
    + write(' · ');
    + }
    + write('Add Post');
    +}
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + if ($page->isLoggedIn())
    + {
    + write(' · ');
    + }
    + write('Add Category');
    +}
    +write('


    ');
    +
    +$ids = $page->findIDs('ForumCategories', 'WHERE ParentID = ' . $parentID . ' ORDER BY Title ASC');
    +
    +if (count($ids) >= 1)
    +{
    + write('

    Categories

    ');
    +}
    +
    +for ($i = 0; $i < count($ids); $i++)
    +{
    + $forumCategory = $page->getForumCategory($ids[$i]);
    + write('

    ' . $forumCategory->title . '

    ');
    + write('

    ' . $forumCategory->description . '

    ');
    + if ($page->isUserAdmin($page->getLoggedInUser()))
    + {
    + write('

    Edit Category   ·   Delete Category

    ');
    + }
    + write('
    ');
    +}
    +
    +$ids = $page->findIDs('ForumPosts', 'WHERE CategoryID = ' . $parentID . ' AND ParentID = -1 ORDER BY Title ASC');
    +
    +if (count($ids) >= 1)
    +{
    + write('

    Topics

    ');
    +}
    +
    +for ($i = 0; $i < count($ids); $i++)
    +{
    + $forumPost = $page->getForumPost($ids[$i]);
    + write('

    ' . $forumPost->title . '

    ');
    + write('
    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: forums/post.php
    ===================================================================
    --- forums/post.php (nonexistent)
    +++ forums/post.php (revision 442)
    @@ -0,0 +1,45 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Forum Post', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$id = $page->getGetID();
    +$forumPost = $page->getForumPost($id);
    +write('

    Back to Topics


    ');
    +write('

    ' . $forumPost->title . '

    ');
    +write('
    Posted On ' . date('l j F Y', $forumPost->datePosted) . ' by ' . $forumPost->author->name . ' (' . $forumPost->author->username . ')
    ');
    +write('

    ' . $page->replaceBBCode($forumPost->content) . '

    ');
    +if ($page->isLoggedIn())
    +{
    + write('

    Post Reply');

    + if ($page->isUserAdmin($page->getLoggedInUser()) || $forumPost->author->ID == $page->getLoggedInUser()->ID)
    + {
    + write('   ·   Edit Post');
    + write('   ·   Delete Post');
    + }
    + write('

    ');
    +}
    +write('
    ');
    +
    +$ids = $page->findIDs('ForumPosts', 'WHERE ParentID = ' . $id . ' ORDER BY DatePosted ASC');
    +for ($i = 0; $i < count($ids); $i++)
    +{
    + $forumPost = $page->getForumPost($ids[$i]);
    + write('

    ' . $forumPost->title . '

    ');
    + write('
    Posted On ' . date('l j F Y', $forumPost->datePosted) . ' by ' . $forumPost->author->name . ' (' . $forumPost->author->username . ')
    ');
    + write('

    ' . $page->replaceBBCode($forumPost->content) . '

    ');
    + if ($page->isUserAdmin($page->getLoggedInUser()) || $forumPost->author->ID == $page->getLoggedInUser()->ID)
    + {
    + write('

    Edit Post');

    + write('   ·   Delete Post

    ');
    + }
    + write('
    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: forums/delete-post-do.php
    ===================================================================
    --- forums/delete-post-do.php (nonexistent)
    +++ forums/delete-post-do.php (revision 442)
    @@ -0,0 +1,30 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Delete Post', '../');
    +
    +$page->checkLoggedIn();
    +
    +$id = $page->getGetID();
    +$post = $page->getForumPost($id);
    +
    +if (($page->isUserAdmin($page->getLoggedInUser()) || $post->author->ID == $page->getLoggedInUser()->ID) && $post)
    +{
    + $page->query('DELETE FROM ForumPosts WHERE ID = ' . $id);
    + $page->redirect('index.php');
    +}
    +else
    +{
    + if (!$post)
    + {
    + $page->drawError('No such forum post, #' . $id);
    + }
    + else
    + {
    + $page->drawError('You do not have permission to access this page.');
    + }
    +}
    +
    +?>
    +
    Index: forums/add-post-do.php
    ===================================================================
    --- forums/add-post-do.php (nonexistent)
    +++ forums/add-post-do.php (revision 442)
    @@ -0,0 +1,36 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Category', '../');
    +
    +$page->checkLoggedIn();
    +
    +$parentID = $_POST['parentID'];
    +if (empty($parentID))
    +{
    + $parentID = -1;
    +}
    +$categoryID = $_POST['categoryID'];
    +if (empty($categoryID))
    +{
    + $parentID = -1;
    +}
    +
    +$title = $_POST['title'];
    +$content = $_POST['content'];
    +
    +if (empty($title))
    +{
    + $page->redirect('add-post.php?error=No Title Specified');
    +}
    +if (empty($title))
    +{
    + $page->redirect('add-post.php?error=No Content Specified');
    +}
    +
    +$page->query('INSERT INTO ForumPosts VALUES (0, ' .$page->getLoggedInUser()->ID . ', ' . $categoryID . ', ' . $parentID . ', "' . $title . '", "' . $content . '", NOW(), FALSE)');
    +$page->redirect('index.php?parentID=' . $categoryID);
    +
    +?>
    +
    Index: forums/add-post.php
    ===================================================================
    --- forums/add-post.php (nonexistent)
    +++ forums/add-post.php (revision 442)
    @@ -0,0 +1,62 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Post', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +$parentID = $_GET['parentID'];
    +if (empty($parentID))
    +{
    + $parentID = -1;
    +}
    +
    +$categoryID = $_GET['categoryID'];
    +if (empty($categoryID))
    +{
    + $categoryID = -1;
    +}
    +
    +if ($page->isLoggedIn())
    +{
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +?>
    +
    +
    +
    +
    +
    +
    +Title:
    +
    +
    +
    +Content:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: forums/edit-category.php
    ===================================================================
    --- forums/edit-category.php (nonexistent)
    +++ forums/edit-category.php (revision 442)
    @@ -0,0 +1,59 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Edit Category', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +$id = $page->getGetID();
    +$cat = $page->getForumCategory($id);
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()) && $cat)
    +{
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +?>
    +
    +
    +
    +
    +
    +Title:
    +
    +
    +
    +Description:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + if (!$cat)
    + {
    + $page->drawError('No such Forum Category, #' . $id);
    + }
    + else
    + {
    + $page->drawError('You do not have permission to access this page.');
    + }
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: forums/edit-category-do.php
    ===================================================================
    --- forums/edit-category-do.php (nonexistent)
    +++ forums/edit-category-do.php (revision 442)
    @@ -0,0 +1,30 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Edit Category', '../');
    +
    +$page->checkLoggedIn();
    +
    +$id = $page->getPostID();
    +
    +$title = $_POST['title'];
    +$description = $_POST['description'];
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + if (empty($title))
    + {
    + $page->redirect('edit-category.php?error=No Title Specified');
    + }
    +
    + $page->query('UPDATE ForumCategories SET Title = "' . $title . '", Description = "' . $description . '" WHERE ID = ' . $id);
    + $page->redirect('index.php');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +?>
    +
    Index: forums/delete-category-do.php
    ===================================================================
    --- forums/delete-category-do.php (nonexistent)
    +++ forums/delete-category-do.php (revision 442)
    @@ -0,0 +1,22 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Delete Category', '../');
    +
    +$page->checkLoggedIn();
    +
    +$id = $page->getGetID();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + $page->query('DELETE FROM ForumCategories WHERE ID = ' . $id);
    + $page->redirect('index.php');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +?>
    +
    Index: forums/add-category-do.php
    ===================================================================
    --- forums/add-category-do.php (nonexistent)
    +++ forums/add-category-do.php (revision 442)
    @@ -0,0 +1,34 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Category', '../');
    +
    +$page->checkLoggedIn();
    +
    +$parentID = $_POST['parentID'];
    +if (empty($parentID))
    +{
    + $parentID = -1;
    +}
    +
    +$title = $_POST['title'];
    +$description = $_POST['description'];
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    + if (empty($title))
    + {
    + $page->redirect('add-category.php?error=No Title Specified');
    + }
    +
    + $page->query('INSERT INTO ForumCategories VALUES (0, ' . $parentID . ', "' . $title . '", "' . $description . '")');
    + $page->redirect('index.php?parentID=' . $parentID);
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +?>
    +
    Index: forums/add-category.php
    ===================================================================
    --- forums/add-category.php (nonexistent)
    +++ forums/add-category.php (revision 442)
    @@ -0,0 +1,55 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Category', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +$parentID = $_GET['parentID'];
    +if (empty($parentID))
    +{
    + $parentID = -1;
    +}
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()))
    +{
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +?>
    +
    +
    +
    +
    +
    +Title:
    +
    +
    +
    +Description:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: projects/edit-project.php
    ===================================================================
    --- projects/edit-project.php (nonexistent)
    +++ projects/edit-project.php (revision 442)
    @@ -0,0 +1,77 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Edit Project', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +$page->checkLoggedIn();
    +
    +$project = $page->getProject($page->getGetID());
    +if (!$project)
    +{
    + $page->drawError('No such project, #' . $page->getGetID());
    +}
    +
    +?>
    +
    +

    Here you can edit a project from the Tim32 database.

    +

    Leave an input blank to keep it as it is.

    +
    +
    +
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()) || $page->getLoggedInUser()->ID == $project->author->ID)
    +{
    +?>
    +
    +
    +
    +
    +
    +Title:
    +
    +
    +
    +Description:
    +
    +
    +
    +Logo URL:
    +
    +
    +
    +Website URL:
    +
    +
    +
    +DownloadURL:
    +
    +
    +
    +Latest Version:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    Index: projects/index.php
    ===================================================================
    --- projects/index.php (revision 119)
    +++ projects/index.php (revision 442)
    @@ -1,14 +1,60 @@
    -
    -
    -require '../_taios.php';
    -
    -$page = new Taios_Page('Projects', '../');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -write('

    This page is currently under construction.

    ');
    -
    -$page->drawFooter();
    -
    -?>
    -
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Projects', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +write('

    Here you can find all the projects that are created by members of Tim32!


    ');
    +if ($page->isUserGM($page->getLoggedInUser()))
    +{
    + write('

    Add Project

    ');
    + write('
    ');
    +}
    +
    +$ids = $page->findIDs('Projects', 'ORDER BY LastUpdate DESC');
    +for ($i = 0; $i < count($ids); $i++)
    +{
    + $id = $ids[$i];
    + $project = $page->getProject($id);
    +
    + write('

    ' . $project->title . '

    ');
    + write('');');');');
    + write('
    + write('
    + write('');
    + if (empty($project->latestVersion))
    + {
    + write('

    No Releases

    ');
    + }
    + else
    + {
    + write('

    Latest Version: ' . $project->latestVersion . '

    ');
    + }
    + write('

    Project Author: ' . $project->author->name . '

    ');
    + write('

    ' . $page->replaceBBCode($project->description) . '

    ');
    + write('

    ');

    + if (!empty($project->websiteURL))
    + {
    + write('Website');
    + }
    + if (!empty($project->downloadURL))
    + {
    + write(' · Download');
    + }
    + write('

    ');
    + write('');
    + write('
    + write('
    ');
    + if ($page->isUserAdmin($page->getLoggedInUser()) || $user->ID == $project->author->ID)
    + {
    + write('

    Edit Project    ·    Delete Project

    ');
    + }
    + write('
    ');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    +
    Index: projects/edit-project-do.php
    ===================================================================
    --- projects/edit-project-do.php (nonexistent)
    +++ projects/edit-project-do.php (revision 442)
    @@ -0,0 +1,59 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Edit Project', '../');
    +
    +$project = $page->getProject($page->getPostID());
    +if (!$project)
    +{
    + $page->drawError('No such project, #' . $page->getPostID());
    +}
    +
    +$title = $_POST['title'];
    +$description = $_POST['description'];
    +$logoURL = $_POST['logourl'];
    +$websiteURL = $_POST['websiteurl'];
    +$downloadURL = $_POST['downloadurl'];
    +$latestVersion = $_POST['latestversion'];
    +
    +$page->checkLoggedIn();
    +$user = $page->getLoggedInUser();
    +
    +if ($page->isUserAdmin($page->getLoggedInUser()) || $page->getLoggedInUser()->ID == $project->author->ID)
    +{
    + if (!empty($title))
    + {
    + $page->query('UPDATE Projects SET Title = "' . $title . '" WHERE ID = ' . $project->ID);
    + }
    + if (!empty($description))
    + {
    + $page->query('UPDATE Projects SET Description = "' . $description . '" WHERE ID = ' . $project->ID);
    + }
    + if (!empty($logoURL))
    + {
    + $page->query('UPDATE Projects SET LogoURL = "' . $logoURL . '" WHERE ID = ' . $project->ID);
    + }
    + if (!empty($websiteURL))
    + {
    + $page->query('UPDATE Projects SET WebsiteURL = "' . $websiteURL . '" WHERE ID = ' . $project->ID);
    + }
    + if (!empty($downloadURL))
    + {
    + $page->query('UPDATE Projects SET DownloadURL = "' . $downloadURL . '" WHERE ID = ' . $project->ID);
    + }
    + if (!empty($latestVersion))
    + {
    + $page->query('UPDATE Projects SET LatestVersion = "' . $latestVersion . '" WHERE ID = ' . $project->ID);
    + }
    +
    + $page->query('UPDATE Projects SET LastUpdate = NOW() WHERE ID = ' . $project->ID);
    +
    + $page->redirect('index.php');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +?>
    Index: projects/delete-project-do.php
    ===================================================================
    --- projects/delete-project-do.php (nonexistent)
    +++ projects/delete-project-do.php (revision 442)
    @@ -0,0 +1,28 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Delete Project', '../');
    +
    +$page->checkLoggedIn();
    +$id = $page->getGetID();
    +$project = $page->getProject($id);
    +
    +if (($page->isUserAdmin($page->getLoggedInUser()) || $page->getLoggedInUser()->ID == $project->author->ID) && $project)
    +{
    + $page->query('DELETE FROM Projects WHERE ID = ' . $id);
    + $page->redirect('index.php');
    +}
    +else
    +{
    + if (!$project)
    + {
    + $page->drawError('No such project, #' . $id);
    + }
    + else
    + {
    + $page->drawError('You do not have permission to access this page.');
    + }
    +}
    +
    +?>
    Index: projects/add-project-do.php
    ===================================================================
    --- projects/add-project-do.php (nonexistent)
    +++ projects/add-project-do.php (revision 442)
    @@ -0,0 +1,36 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Project', '../');
    +
    +$title = $_POST['title'];
    +$description = $_POST['description'];
    +$logoURL = $_POST['logourl'];
    +$websiteURL = $_POST['websiteurl'];
    +$downloadURL = $_POST['downloadurl'];
    +$latestVersion = $_POST['latestversion'];
    +
    +$page->checkLoggedIn();
    +$user = $page->getLoggedInUser();
    +
    +if (empty($title))
    +{
    + $page->redirect('add-project.php?error=No Title Specified');
    +}
    +if (empty($description))
    +{
    + $page->redirect('add-project.php?error=No Title Specified');
    +}
    +
    +if ($page->isUserGM($user))
    +{
    + $page->query('INSERT INTO Projects VALUES (0, ' . $user->ID . ', "' . $title . '", "' . $description . '", "' . $logoURL . '", "' . $downloadURL . '", "' . $websiteURL . '", "' . $latestVersion . '", NOW())');
    + $page->redirect('index.php');
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +?>
    Index: projects/add-project.php
    ===================================================================
    --- projects/add-project.php (nonexistent)
    +++ projects/add-project.php (revision 442)
    @@ -0,0 +1,69 @@
    +
    +
    +require '../_taios.php';
    +
    +$page = new Taios_Page('Add Project', '../');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +?>
    +
    +

    Here you can add a project to the Tim32 database.

    +
    +
    +
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +$page->checkLoggedIn();
    +
    +if ($page->isUserGM($page->getLoggedInUser()))
    +{
    +?>
    +
    +
    +
    +
    +Title:
    +
    +
    +
    +Description:
    +
    +
    +
    +Logo URL:
    +
    +
    +
    +Website URL:
    +
    +
    +
    +DownloadURL:
    +
    +
    +
    +Latest Version:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +}
    +else
    +{
    + $page->drawError('You do not have permission to access this page.');
    +}
    +
    +$page->drawFooter();
    +
    +?>
    Index: install.sql
    ===================================================================
    --- install.sql (revision 119)
    +++ install.sql (revision 442)
    @@ -1,75 +1,72 @@
    -DROP DATABASE Tim32;
    -CREATE DATABASE Tim32;
    -
    -USE Tim32;
    -
    -CREATE TABLE Users
    -(
    - ID INT NOT NULL AUTO_INCREMENT,
    - AccessID INT,
    - Username TEXT,
    - Password TEXT,
    - EmailAddress TEXT,
    - Name TEXT,
    - ChallengeID INT,
    - PRIMARY KEY(ID)
    -);
    -
    -CREATE TABLE BlogPosts
    -(
    - ID INT NOT NUll AUTO_INCREMENT,
    - ParentID INT,
    - AuthorID INT,
    - Title TEXT,
    - Content TEXT,
    - DatePosted DATETIME,
    - Category TEXT,
    - Spam BOOLEAN,
    - PRIMARY KEY(ID)
    -);
    -
    -CREATE TABLE Projects
    -(
    - ID INT NOT NUll AUTO_INCREMENT,
    - AuthorID INT,
    - Title TEXT,
    - Description TEXT,
    - LogoURL TEXT,
    - WebsiteURL TEXT,
    - LatestVersion TEXT,
    - PRIMARY KEY(ID)
    -);
    -
    -CREATE TABLE ForumCategories
    -(
    - ID INT NOT NUll AUTO_INCREMENT,
    - ParentID INT,
    - Title TEXT,
    - Description TEXT,
    - PRIMARY KEY(ID)
    -);
    -
    -CREATE TABLE ForumTopics
    -(
    - ID INT NOT NUll AUTO_INCREMENT,
    - AuthorID INT,
    - CategoryID INT,
    - Title TEXT,
    - DatePosted DATETIME,
    - PRIMARY KEY(ID)
    -);
    -
    -CREATE TABLE ForumPosts
    -(
    - ID INT NOT NUll AUTO_INCREMENT,
    - AuthorID INT,
    - TopicID INT,
    - Title TEXT,
    - Content TEXT,
    - DatePosted DATETIME,
    - Spam BOOLEAN,
    - PRIMARY KEY(ID)
    -);
    -
    -INSERT INTO Users VALUES (1, 0, "admin", SHA1("password"), "admins@tim32.org", "Tim32 Admin", 0);
    -INSERT INTO BlogPosts VALUES(1, -1, 1, "Welcome to Tim32!", "Welcome to the new Tim32 website! It has had a complete design re-think to make it simpler and easier to use!", NOW(), "Tim32", FALSE);
    +DROP DATABASE Tim32;
    +CREATE DATABASE Tim32;
    +
    +USE Tim32;
    +
    +CREATE TABLE Users
    +(
    + ID INT NOT NULL AUTO_INCREMENT,
    + AccessID INT,
    + Username TEXT,
    + Password TEXT,
    + EmailAddress TEXT,
    + Name TEXT,
    + ChallengeID INT,
    + PRIMARY KEY(ID)
    +);
    +
    +CREATE TABLE BlogPosts
    +(
    + ID INT NOT NUll AUTO_INCREMENT,
    + ParentID INT,
    + AuthorID INT,
    + Title TEXT,
    + Content TEXT,
    + DatePosted DATETIME,
    + Category TEXT,
    + Spam BOOLEAN,
    + PRIMARY KEY(ID)
    +);
    +
    +CREATE TABLE Projects
    +(
    + ID INT NOT NUll AUTO_INCREMENT,
    + AuthorID INT,
    + Title TEXT,
    + Description TEXT,
    + LogoURL TEXT,
    + DownloadURL TEXT,
    + WebsiteURL TEXT,
    + LatestVersion TEXT,
    + LastUpdate DATETIME,
    + PRIMARY KEY(ID)
    +);
    +
    +CREATE TABLE ForumCategories
    +(
    + ID INT NOT NUll AUTO_INCREMENT,
    + ParentID INT,
    + Title TEXT,
    + Description TEXT,
    + PRIMARY KEY(ID)
    +);
    +
    +CREATE TABLE ForumPosts
    +(
    + ID INT NOT NUll AUTO_INCREMENT,
    + AuthorID INT,
    + CategoryID INT,
    + ParentID INT,
    + Title TEXT,
    + Content TEXT,
    + DatePosted DATETIME,
    + Spam BOOLEAN,
    + PRIMARY KEY(ID)
    +);
    +
    +INSERT INTO Users VALUES (1, 0, "admin", SHA1("password"), "admins@tim32.org", "Tim32 Admin", 0);
    +INSERT INTO BlogPosts VALUES(1, -1, 1, "Welcome to Tim32!", "Welcome to the new Tim32 website! It has had a complete design re-think to make it simpler and easier to use!", NOW(), "Tim32", FALSE);
    +INSERT INTO Projects VALUES (1, 1, "TAIOS", "TAIOS (The All In One System) is a PHP based system to make the Tim32 website very self contained and altogether.", "http://websvn.kde.org/*checkout*/trunk/kdesupport/oxygen-icons/64x64/categories/applications-internet.png", "", "http://tim32.org/~tom/taios/", "SVN", NOW());
    +INSERT INTO ForumCategories VALUES (1, -1, "Tim32", "Talk about Tim32 in here");
    +INSERT INTO ForumCategories VALUES (2, 1, "TAIOS", "Talk about TAIOS in here");
    +INSERT INTO ForumPosts VALUES (1, 1, 2, -1, "TAIOS Almost Finished", "As I speak we are currently in the process of finilising TAIOS so it works perfectly! I'm pleased to accounce that TAIOS should be ready within the next week or so! :D", NOW(), FALSE);
    Index: data/smilies/face-laugh.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-laugh.png
    ===================================================================
    --- data/smilies/face-laugh.png (nonexistent)
    +++ data/smilies/face-laugh.png (revision 442)
    /data/smilies/face-laugh.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-plain.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-plain.png
    ===================================================================
    --- data/smilies/face-plain.png (nonexistent)
    +++ data/smilies/face-plain.png (revision 442)
    /data/smilies/face-plain.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-sad.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-sad.png
    ===================================================================
    --- data/smilies/face-sad.png (nonexistent)
    +++ data/smilies/face-sad.png (revision 442)
    /data/smilies/face-sad.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-uncertain.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-uncertain.png
    ===================================================================
    --- data/smilies/face-uncertain.png (nonexistent)
    +++ data/smilies/face-uncertain.png (revision 442)
    /data/smilies/face-uncertain.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-wink.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-wink.png
    ===================================================================
    --- data/smilies/face-wink.png (nonexistent)
    +++ data/smilies/face-wink.png (revision 442)
    /data/smilies/face-wink.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-raspberry.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-raspberry.png
    ===================================================================
    --- data/smilies/face-raspberry.png (nonexistent)
    +++ data/smilies/face-raspberry.png (revision 442)
    /data/smilies/face-raspberry.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-surprise.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-surprise.png
    ===================================================================
    --- data/smilies/face-surprise.png (nonexistent)
    +++ data/smilies/face-surprise.png (revision 442)
    /data/smilies/face-surprise.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: data/smilies/face-smile.png
    ===================================================================
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Index: data/smilies/face-smile.png
    ===================================================================
    --- data/smilies/face-smile.png (nonexistent)
    +++ data/smilies/face-smile.png (revision 442)
    /data/smilies/face-smile.png
    Property changes:
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
    Index: login-do.php
    ===================================================================
    --- login-do.php (revision 119)
    +++ login-do.php (revision 442)
    @@ -1,37 +1,37 @@
    -
    -
    -require '_taios.php';
    -
    -$page = new Taios_Page('Login');
    -
    -$username = $_POST['username'];
    -$password = $_POST['password'];
    -$remember = $_POST['remember'] == 'yes';
    -
    -if (empty($username))
    -{
    - $page->redirect('login.php?error=No Username Specified');
    -}
    -if (empty($password))
    -{
    - $page->redirect('login.php?error=No Password Specified');
    -}
    -
    -$user = $page->getUserByUsername($username);
    -if (!$user || $user->password != sha1($password))
    -{
    - $page->redirect('login.php?error=Incorrect Username or Password');
    -}
    -
    -$expires = -1;
    -
    -if ($remember)
    -{
    - $expires = time() + 60 * 60 * 24 * 30;
    -}
    -
    -setcookie('Tim32_Login', $user->username . '|~|' . $user->password, $expires, '/');
    -
    -$page->redirect('index.php');
    -
    -?>
    +
    +
    +require '_taios.php';
    +
    +$page = new Taios_Page('Login');
    +
    +$username = $_POST['username'];
    +$password = $_POST['password'];
    +$remember = $_POST['remember'] == 'yes';
    +
    +if (empty($username))
    +{
    + $page->redirect('login.php?error=No Username Specified');
    +}
    +if (empty($password))
    +{
    + $page->redirect('login.php?error=No Password Specified');
    +}
    +
    +$user = $page->getUserByUsername($username);
    +if (!$user || $user->password != sha1($password))
    +{
    + $page->redirect('login.php?error=Incorrect Username or Password');
    +}
    +
    +$expires = -1;
    +
    +if ($remember)
    +{
    + $expires = time() + 60 * 60 * 24 * 30;
    +}
    +
    +setcookie('Tim32_Login', $user->username . '|~|' . $user->password, $expires, '/');
    +
    +$page->redirect('index.php');
    +
    +?>
    Index: login.php
    ===================================================================
    --- login.php (revision 119)
    +++ login.php (revision 442)
    @@ -1,48 +1,48 @@
    -
    -
    -require '_taios.php';
    -
    -$page = new Taios_Page('Login');
    -$page->drawHeader();
    -$page->drawMiddle();
    -
    -?>
    -
    -

    Here you can login to Tim32 using your Tim32 account.

    -
    -
    -
    -
    -if (isset($_GET['error']))
    -{
    - $page->drawError($_GET['error'], false);
    -}
    -
    -?>
    -
    -
    -
    -
    -Username:
    -
    -
    -
    -Password:
    -
    -
    -
    -Remember Me:
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -$page->drawFooter();
    -
    -?>
    +
    +
    +require '_taios.php';
    +
    +$page = new Taios_Page('Login');
    +$page->drawHeader();
    +$page->drawMiddle();
    +
    +?>
    +
    +

    Here you can login to Tim32 using your Tim32 account.

    +
    +
    +
    +
    +if (isset($_GET['error']))
    +{
    + $page->drawError($_GET['error'], false);
    +}
    +
    +?>
    +
    +
    +
    +
    +Username:
    +
    +
    +
    +Password:
    +
    +
    +
    +Remember Me:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +$page->drawFooter();
    +
    +?>
    Index: logout-do.php
    ===================================================================
    --- logout-do.php (revision 119)
    +++ logout-do.php (revision 442)
    @@ -1,6 +1,6 @@
    -
    -
    -setcookie('Tim32_Login', '', -1, '/');
    -header('Location: index.php');
    -
    -?>
    +
    +
    +setcookie('Tim32_Login', '', -1, '/');
    +header('Location: index.php');
    +
    +?>