<?php

require('message.inc');


class Shoutbox extends Message {
	
	private $path_to_file = '';
	private $entry_lines = array();
	private $file_resource;
	
	
	/**
	 * Setzt das Attribut $path_to_file auf den übergebenen Wert.
	 */
	function __construct ($path_to_file) {
		$this->path_to_file = $path_to_file;
	}
	
	
	/**
	 * Liest die Datenbank-Textdatei in das Attribut $entry_lines.
	 *  - überprüft, ob file resource vorhanden und setzt entweder den zeiger auf 0 oder öffnet neue
	 *  - liest aus der Datei das array aus und dreht es um (ACHTUNG: noch mit Zeilenenden)
	 */ 
	function read_file () {
		
		if ($this->file_resource) {
			fseek($this->file_resource, 0);
		}
		else {
			$this->file_resource = fopen($this->path_to_file, 'r');
			
			if (!$this->file_resource) {
				$this->error = true;
				return false;
			}
			
			flock($this->file_resource, LOCK_EX);
		}
		
		$this->entry_lines = file($this->path_to_file);
		
		if ($this->entry_lines === false) {
			$this->error = true;
			return false;
		}
		
		$this->entry_lines = array_reverse($this->entry_lines);
		
		// remove lines with incorrect syntax or comments
		$count_entry_lines = count($this->entry_lines); // necessary because count is changed by unsetting entries
		for ($i = 0; $i < $count_entry_lines; $i++) {
			if (!preg_match('~^\d{10}\t.+?\t.+$~', $this->entry_lines[$i])) {
				unset($this->entry_lines[$i]);
			}
		}

		return true;
	}
	
	
	/**
	 * Gibt den nächsten Eintrag zurück.
	 *  - gibt je Aufruf eine Zeile als Array zurück
	 *  - EOF gibt false zurück
	 *  - ähnlich wie mysql_fetch_row
	 */
	function get_next_entry ($date_format = 'j.n.y') {
		
		// eine Zeile
		$entry = current($this->entry_lines);
		next($this->entry_lines);
		
		// ende
		if ($entry === false) {
			return false;
		}
		
		$entry = trim($entry);
		
		$result = explode("\t", $entry);

		// date
		$result[0] = date($date_format, $result[0]);
		
		// body: maskierte new lines demaskieren und breaks anfügen
		$result[2] = preg_replace('~(\\\n)+~', "<br />\n", $result[2]);
		
		return $result;
	}
	
	
	/**
	 * Speichert einen neuen Eintrag.
	 *  - öffnet Datei zum schreiben (anhängen)
	 *  - schreibt die Eingabe in die letzte Zeile
	 *  - gibt bei Erfolg true zurück
	 */
	function add_entry ($sender, $message) {
		
		if ($this->contains_spam_hints($sender . $message, array($sender))) {
			return false;
		}
		
		$this->file_resource = fopen($this->path_to_file, 'a+');
		
		if (!$this->file_resource) {
			//$this->error = true; // Wird hier ein Fehler gesetzt, geht wird auch das Anzeigen der shoutbox unterbunden.
			return false;
		}
		
		flock($this->file_resource, LOCK_EX);
		
		$sender = substr($sender, 0, 25); // auf 25 Zeichen beschränken
		$sender = preg_replace(array("~\t~", '~<~', '~>~'), array(' ', '&lt;', '&gt;'), $sender);
		
		$message = substr($message, 0, 220); // auf 220 Zeichen beschränken
//		TODO Lange Wörter richtig umbrechen und zwar in der Ausgabe, nicht der Eingabe.
//		$message = wordwrap($message, 30, '-'); // nach 30 Zeichen mit '-' umbrechen
		$message = preg_replace(array("~\n~", "~\r~"), array('\n', ''), $message); // new line in \n maskieren
		$message = preg_replace(array("~\t~", '~<~', '~>~'), array('    ', '&lt;', '&gt;'), $message);
		
		$entry = "\n" . time() . "\t" . $sender . "\t" . $message;
			
		fwrite($this->file_resource, $entry);
		
		
		/* __mail__ */
		
		$to = 'Martin Stadler <martin@siarp.de>';
		$subject = utf8_decode('Neuer Eintrag in der Gruß-Box');
		$body = 
			'Name:' . $sender . "\n" . 
			'Nachricht: ' . "\n" . preg_replace('~(\\\n)+~', "\n", $message);
		$body = utf8_decode(preg_replace('~\r~', '', $body)); // prepare_for_db
		$from = 'From: Beethoven2000 Gruß-Box <gruss-box@beethoven2000.de>';
		
		mail($to, $subject, $body, $from);


		return true;
	}
	
	
	/**
	 * Schließt die Datei.
	 */	 
	function __destruct () {
		fclose($this->file_resource);
	}
}

?>