pid . "\"\n"); fwrite($fp, $indent . " user=\"" . $this->user . "\"\n"); fwrite($fp, $indent . " title=\"" . convert_xml($this->title) . "\"\n"); fwrite($fp, $indent . " date=\"" . $this->date . "\">\n"); fwrite($fp, $indent . " " . convert_xml($this->message) . "\n"); foreach($this->replies as $reply) { $reply->write($fp, $indent . " "); } fwrite($fp, $indent . "\n"); } public function add($post) { $key = $post->pid; $this->replies[$key] = $post; } public function getPost($pid) { $result = false; foreach($this->replies as $post) { if($post->pid == $pid) return $post; $result = $post->getPost($pid); if($result) return $result; } return $result; } public function show($indent = "", $recurse = true) { global $users, $fid, $tid, $current_user, $client_is_mobile_device; $user = $users->getUser($this->user); echo $indent . "
\n"; if($client_is_mobile_device) { $avatar = "mobileavatar.gif"; } else { if($user->avatar) $avatar = $user->avatar; else $avatar = "default.gif"; } echo $indent . " \"avatar\"\n"; if(!$client_is_mobile_device) { echo $indent . "
ID: " . $this->pid . "
\n"; echo $indent . "
Title: " . convert_xml($this->title) . "
\n"; } echo $indent . "
"; if(!$client_is_mobile_device) echo "UserID: "; echo $user->name . "
\n"; echo $indent . "
"; if(!$client_is_mobile_device) echo "Date: "; echo date("j. M Y - G:i", $this->date) . "
\n"; echo $indent . "
\n"; echo parse($this->message, $indent . " ") . "\n"; echo $indent . "
\n"; echo $indent . "
\n"; if($current_user->uid == $this->user) { echo $indent . " "; echo "\"edit\"\n"; } echo $indent . " "; echo "\"quote\"\n"; echo $indent . " "; echo "\"reply\"\n"; echo $indent . "
\n"; echo $indent . "
\n"; if($recurse) { foreach($this->replies as $reply) { $reply->show($indent . " "); } } echo $indent . "
\n"; echo $indent . "
\n"; } public function Post($pid, $title, $user, $date, $message = "") { $this->pid = $pid; $this->title = $title; $this->user = $user; $this->date = $date; $this->message = $message; } } class Posts { private $file; private $posts = array(); public $thread; private $posts_linear = array(); private $maxkey = 0; public function nextkey() { $this->maxkey++; return $this->maxkey; } public function add($post) { $key = $post->pid; $this->posts[$key] = $post; } public function write() { $fp = fopen($this->file, "w"); $block = TRUE; flock($fp, LOCK_EX, $block); // do an exclusive lock fwrite($fp, "\n"); if($this->thread->lastseen) { foreach($this->thread->lastseen as $key => $value) { if($lastseenstr != "") $lastseenstr .= ","; $lastseenstr .= $key . "=" . $value; } } fwrite($fp, "thread->tid . "\"\n"); fwrite($fp, " name=\"" . convert_xml($this->thread->name) . "\"\n"); fwrite($fp, " lastpost=\"" . $this->thread->lastpost . "\"\n"); fwrite($fp, " lastseen=\"" . $lastseenstr . "\">\n"); foreach($this->posts as $post) { $post->write($fp, " "); } fwrite($fp, "\n"); fclose($fp); } public function getPost($pid) { $result = false; foreach($this->posts as $post) { if($post->pid == $pid) return $post; $result = $post->getPost($pid); if($result) return $result; } return $result; } public function show() { global $current_user; echo "

" . $this->thread->name . "

"; /* // Recursive foreach($this->posts as $post) { $post->show(); } */ // Linear foreach($this->posts_linear as $post) { $post->show("", false); } $this->thread->lastseen[$current_user->uid] = time(); $this->write(); echo "

Back to the top

"; } private function recurser($parentpost, $element) { if($element->tagName != "post") return; $post = new Post($element->getAttribute('pid'), $element->getAttribute('title'), $element->getAttribute('user'), $element->getAttribute('date')); $this->posts_linear[$post->date . "-" . $post->pid] = $post; if($post->pid > $this->maxkey) $this->maxkey = $post->pid; if($parentpost) $parentpost->add($post); else $this->add($post); foreach($element->childNodes as $child) { if($child->tagName == "post") $this->recurser($post, $child); if($child->tagName == "message") $post->message = $child->textContent; } } private function read() { $dom = new DomDocument; $dom->resolveExternals = FALSE; $dom->substituteEntities = FALSE; $dom->preserveWhiteSpace = FALSE; $dom->load($this->file); $thread = $dom->documentElement; $this->thread = new Thread($thread->getAttribute('tid'), $thread->getAttribute('name'), $thread->getAttribute('lastpost'), $thread->getAttribute('lastseen')); foreach($thread->childNodes as $child) { $this->recurser(false, $child); } // The linear list should be sorted. sort($this->posts_linear); } public function Posts($file) { $this->file = $file; if(file_exists($this->file)) $this->read(); } } ?>