Commits

Christian Fischer committed faed421

* Das Paket ist nun dem WCF statt dem WBB untergeordnet. Damit sollte sich die Shoutbox nun auf alle Seite in jeder Endanwendung integrieren lassen
* Die SB benutzt nun auch für AJAX ein iframe, welches ein besseres Scrolling-Verhalten aufweist als das bisherige DIV-Element
* Einstellungsmöglichkeit im ACP, wie viele Nachrichten maximal in der DB gespeichert werden sollen.
* Im ACP können nun BB-Codes aktiviert werden. Dadurch läßt sich u.a. auch das IMG-Tag verwenden, um Bilder zu posten. Da sich schwer kontrollieren läßt, welche Inhalte dadurch in der SB landen, ist das Feature standardmäßig deaktivert. Wer riskieren möchte, die Shoutbox als Ziel für Bilderspam o. ä. zu machen hat nun die Möglichkeit dazu ;)
* Neue ACP-Seite unter Inhalt / Shoutbox: Hier hat der spamgeplagte Admin die Möglichkeit einzelne Nachrichten oder alle Nachrichten eines bestimmten Users zu löschen
* Man kann anderen Usern eine geflüsterte Nachricht per /w Name zusenden
* In der User-Online-Liste sind alle User in der Shoutbox entweder mit der Seite als Location eingetragen in die das Shoutbox-Frame eingebettet ist, oder einfach mit 'Shoutbox'
* Die Shoutbox benutzt ein paar CSS-Klassen, die zur Anpassung im Style benutzt werden können
* Eigene Shoutbox-Icons
* Und natürlich auch ein, zwei Fehlerkorrekturen

Build-Tool-Update

Comments (0)

Files changed (29)

acptemplates/shoutboxMessageList.tpl

+{include file='header'}
+
+<div class="mainHeadline">
+	<img src="../icon/shoutboxIcon48x48.png" alt="" />
+	<div class="headlineContainer">
+		<h1>{lang}wcf.acp.shoutbox.title{/lang}</h1>
+	</div>
+</div>
+
+{if $users|count > 0}
+	<form action="index.php?page=ShoutboxMessageList" method="POST">
+		<div class="border tabMenuContent">
+			<input type="hidden" name="packageID" value="{@PACKAGE_ID}"/>
+			<input type="hidden" name="s" value="{@SID}"/>
+			<input type="submit" value="{lang}wcf.acp.shoutbox.delete{/lang}"/>
+			{lang}wcf.acp.shoutbox.deleteMessagesFromUser{/lang}
+			<select name="selectedUser">
+				{foreach from=$users item=user}
+					<option value="{@$user['userID']}">{$user['username']}</option>
+				{/foreach}
+			</select>
+		</div>
+	</form>
+	<br/>
+	<br/>
+{/if}
+
+{if $messages|count > 0}
+	<form action="index.php?page=ShoutboxMessageList" method="POST">
+		<div class="border tabMenuContent">
+			<input type="hidden" name="packageID" value="{@PACKAGE_ID}"/>
+			<input type="hidden" name="s" value="{@SID}"/>
+			
+			<table class="tableList" width="100%">
+			<thead class="cat">
+				<tr class="tableHead">
+					<th>&nbsp;</th>
+					<th>wcf.acp.shoutbox.listheader.id</th>
+					<th>wcf.acp.shoutbox.listheader.time</th>
+					<th>wcf.acp.shoutbox.listheader.from</th>
+					<th>wcf.acp.shoutbox.listheader.message</th>
+				</tr>
+			</thead>
+			
+			{foreach from=$messages item=message}
+				<tr class="container-{cycle values='1,2'}" style="text-align:left;">
+				  <td><input type="checkbox" name="selectedMessages[]" value="{@$message['message_id']}"/></td>
+				  <td>{@$message['message_id']}</td>
+				  <td>{@$message['message_time']|shorttime}</td>
+				  <td>{$message['username']}</td>
+				  <td>{$message['message_text']}</td>
+				</tr>
+			{/foreach}
+			</table>
+		</div>
+		<input type="submit" value="{lang}wcf.acp.shoutbox.deleteSelectedMessages{/lang}"/>
+	</form>
+{else}
+	<div class="border tabMenuContent">
+		<br/>{lang}wcf.acp.shoutbox.nomessages{/lang}<br/><br/>
+	</div>
+{/if}
+
+{include file='footer'}

dist/net.northshirebund.wbb.shoutbox-0.4.tar

Binary file added.

dist/net.northshirebund.wbb.shoutbox-0.4.zip

Binary file added.

files/icon/shoutboxIcon16x16.png

Added
New image

files/icon/shoutboxIcon16x24.png

Added
New image

files/icon/shoutboxIcon24x24.png

Added
New image

files/icon/shoutboxIcon48x48.png

Added
New image

files/lib/acp/page/ShoutboxMessageListPage.class.php

+<?php
+// wcf imports
+require_once(WCF_DIR.'lib/page/AbstractPage.class.php');
+
+/**
+ * Displays a list of all messages in the shoutbox-table for deletion.
+ *
+ * @author	Christian Fischer
+ * @package	net.northshirebund.wbb.shoutbox
+ */
+class ShoutboxMessageListPage extends AbstractPage {
+	public $templateName = 'shoutboxMessageList';
+
+
+	/**
+	 * @see Page::assignVariables()
+	 */
+	public function assignVariables() {
+		parent::assignVariables();
+		$messages = array();
+		$users    = array();
+		
+		// delete selected messages
+		if(isset($_POST['selectedMessages'])) {
+			$selectedMessages = '';
+			
+			if (is_array($_POST['selectedMessages'])) {
+				$selectedMessages = join(',', ArrayUtil::toIntegerArray($_POST['selectedMessages']));
+			}
+			else {
+				$selectedMessages = intval($_POST['selectedMessages']);
+			}
+			
+			if($selectedMessages != '') {
+				WCFACP::getDB()->sendQuery('DELETE FROM wcf'.WCF_N.'_shoutbox WHERE message_id IN('.$selectedMessages.')');
+			}
+		}
+		
+		// delete messages from user
+		if(isset($_POST['selectedUser'])) {
+			$selectedUser = intval($_POST['selectedUser']);
+			
+			if($selectedUser != 0) {
+				WCFACP::getDB()->sendQuery('DELETE FROM wcf'.WCF_N.'_shoutbox WHERE userID='.$selectedUser);
+			}
+		}
+		
+		// get messages in the shoutbox
+		$sql = 'SELECT * FROM wcf'.WCF_N.'_shoutbox sb LEFT JOIN wcf'.WCF_N.'_user u USING(userid) WHERE to_user>0 ORDER BY message_time ASC';
+		$result = WCFACP::getDB()->sendQuery($sql);
+		
+		while($row = WCFACP::getDB()->fetchArray($result)) {
+			array_push($messages, $row);
+		}
+		
+		// get all users who had posted
+		$sql = 'SELECT u.userID, u.username FROM wcf'.WCF_N.'_shoutbox sb LEFT JOIN wcf'.WCF_N.'_user u USING(userid) WHERE u.userID>0 GROUP BY userID ORDER BY username ASC';
+		$result = WCFACP::getDB()->sendQuery($sql);
+		
+		while($row = WCFACP::getDB()->fetchArray($result)) {
+			array_push($users, $row);
+		}
+		
+		WCFACP::getTPL()->assign(array(
+			'messages' => $messages,
+			'users'    => $users
+		));
+	}
+
+	/**
+	 * @see Page::show()
+	 */
+	public function show() {
+
+		// activate menu item
+		WCFACP::getMenu()->setActiveMenuItem('wcf.acp.menu.link.content.shoutbox');
+
+		parent::show();
+	}
+}
+?>

files/lib/page/ShoutboxContentPage.class.php

 require_once(WCF_DIR.'lib/system/event/EventHandler.class.php');
 require_once(WCF_DIR.'lib/data/message/bbcode/MessageParser.class.php');
 require_once(WCF_DIR.'lib/data/message/bbcode/URLParser.class.php');
+require_once(WCF_DIR.'lib/data/message/bbcode/URLBBCode.class.php');
 
 
 /**
- * This class provides default implementations for the Page interface.
- * This includes the call of the default event listeners for a page: construct, readParameters, assignVariables and show.
- * 
  * @author	Christian Fischer
- * @package	com.woltlab.wcf.page
+ * @package	net.northshirebund.wbb.shoutbox
  */
 class ShoutboxContentPage extends AbstractPage {
 	/**
 	public $templateName	= 'shoutboxContent';
 	public $templateNameXml	= 'shoutboxContentXml';
 	public $messages		= array();
+	public $errormessage    = null;
 	public $lastmessage		= 0;
 	public $xmloutput		= false;
 	
 		parent::readParameters();
 		
 		if (isset($_POST['message'])) {
-			$message = MessageUtil::stripCrap(StringUtil::trim($_POST['message']));
+			$message = StringUtil::trim($_POST['message']);
 			$userid  = WCF::getUser()->userID;
 			
+			if(CHARSET != 'UTF-8') {
+				$message = StringUtil::convertEncoding('UTF-8', CHARSET, $message);
+			}
+			
 			if($message != '') {
 				if($userid || SHOUTBOX_ALLOWGUESTS) {
-					WCF::getDB()->sendQuery("
-						INSERT INTO wcf".WCF_N."_shoutbox(userid,message_text,message_time,message_ip)
-						VALUES ('".$userid."','".escapeString($message)."','".TIME_NOW."', '".UserUtil::getIpAddress()."')"
-					);
+					if(substr($message, 0, 2) == '/w') {
+						$message = ltrim(substr($message, 2));
+						$name    = null;
+						$toUser  = -1;
 						
-					$messageid = WCF::getDB()->getInsertID();
-			 		
-			 		WCF::getDB()->sendQuery("DELETE FROM wcf".WCF_N."_shoutbox WHERE message_id<'".($messageid-SHOUTBOX_MESSAGECOUNT-5)."'");
+						if(substr($message, 0, 1) == '"') {
+							$pos     = strpos($message, '"', 1);
+							$name    = trim(substr($message, 1, $pos - 1));
+							$message = ltrim(substr($message, $pos + 1));
+						}
+						else {
+							$pos     = strpos($message, ' ', 1);
+							$name    = trim(substr($message, 0, $pos));
+							$message = ltrim(substr($message, $pos));
+						}
+						
+						$result = WCF::getDB()->sendQuery('SELECT userID FROM wcf'.WCF_N.'_user WHERE username=\'' . $name . '\'');
+						while($row  = WCF::getDB()->fetchArray($result)) {
+							$toUser = $row['userID'];
+							break;
+						}
+						
+						if($toUser == -1) {
+							$this->errormessage = eval('return "' . WCF::getLanguage()->get('net.northshirebund.wbb.shoutbox.usernotfound') . '";');
+						}
+						else {
+							WCF::getDB()->sendQuery("
+								INSERT INTO wcf".WCF_N."_shoutbox(userid,to_user,message_text,message_time,message_ip)
+								VALUES ('".$userid."','".$toUser."','".escapeString($message)."','".TIME_NOW."', '".UserUtil::getIpAddress()."')"
+							);
+								
+							$messageid = WCF::getDB()->getInsertID();
+					 		
+					 		WCF::getDB()->sendQuery("DELETE FROM wcf".WCF_N."_shoutbox WHERE message_id<'".($messageid-SHOUTBOX_STOREDMESSAGES)."'");
+						}
+					}
+					else {
+						WCF::getDB()->sendQuery("
+							INSERT INTO wcf".WCF_N."_shoutbox(userid,message_text,message_time,message_ip)
+							VALUES ('".$userid."','".escapeString($message)."','".TIME_NOW."', '".UserUtil::getIpAddress()."')"
+						);
+							
+						$messageid = WCF::getDB()->getInsertID();
+				 		
+				 		WCF::getDB()->sendQuery("DELETE FROM wcf".WCF_N."_shoutbox WHERE message_id<'".($messageid-SHOUTBOX_STOREDMESSAGES)."'");
+				 	}
 				}
 			}
 		}
 		$parser = MessageParser::getInstance();
 		$parser->setOutputType('text/html');
 		
-		if($this->xmloutput) {
-			$order = 'ASC';
-		}
-		else {
-			//$order = SHOUTBOX_MESSAGEORDER;
-			$order = 'DESC';
-		}
-		
 		$sql = '
 			SELECT		sb.*, 
-						u.userID, u.username
+						u.userID, u.username,
+						u2.username AS to_username
 			FROM 		wcf'.WCF_N.'_shoutbox	sb
 			LEFT JOIN	wcf'.WCF_N.'_user		u
 			USING		(userid)
-			WHERE		message_time > '.$this->lastmessage.'
-			ORDER BY 	message_time '.$order.'
+			LEFT JOIN	wcf'.WCF_N.'_user		u2
+			ON			(sb.to_user = u2.userID)
+			WHERE		message_time > '.$this->lastmessage.' AND (to_user=0 OR to_user='.WCF::getUser()->userID.' OR u.userID='.WCF::getUser()->userID.')
+			ORDER BY 	message_time DESC
 			LIMIT		0,'.SHOUTBOX_MESSAGECOUNT.'
 		';		
 		
 		$result = WCF::getDB()->sendQuery($sql);
 		//WCF::getTPL()->assign('sql', $sql);
 		
-		while ($row = WCF::getDB()->fetchArray($result)) {
-			$message = $row['message_text'];
+		while($row = WCF::getDB()->fetchArray($result)) {
+			$message              = $row['message_text'];
+			$row['class']         = 'shoutboxMessage';
+			$row['isEmote']       = '0';
+			$row['isWhisperIn']   = '0';
+			$row['isWhisperOut']  = '0';
+			
+			// incoming whispers
+			if($row['to_user'] != 0 && $row['to_user'] == WCF::getUser()->userID) {
+				$row['class']        = 'shoutboxWhisperIn';
+				$row['isWhisperIn']  = '1';
+			}
+			// outgoing whispers
+			else if($row['to_user'] != 0) {
+				$row['class']        = 'shoutboxWhisperOut';
+				$row['isWhisperOut'] = '1';
+			}
+			// emotes
+			else if(substr($message, 0, 4) == '/me ') {
+				$row['class']        = 'shoutboxEmote';
+				$row['isEmote']      = '1';
+				$message             = substr($message, 4);
+			}
 			
 			// parse URLs
 			$message = URLParser::parse($message);
 			
 			// parse smilies
-			$message = $parser->parse($message, /*smilies*/true, /*html*/false, /*bbcode*/false, /*highlighting*/false);
+			$message = $parser->parse($message, /*smilies*/true, /*html*/false, SHOUTBOX_ALLOWBBCODE, /*highlighting*/false);
 			
 			// convert [url] into <a href...
-			$message = preg_replace('/\[url\](.+?)\[\/url\]/', '<a href="\1" target="_blank">\1</a>', $message);
+			if(!SHOUTBOX_ALLOWBBCODE) {
+				$message = preg_replace('/\[url\]([a-zA-Z]+\:\/\/.+?)\[\/url\]/', '<a href="\1" target="_blank">\1</a>', $message);
+				$message = preg_replace('/\[url\](.+?)\[\/url\]/', '<a href="http://\1" target="_blank">\1</a>', $message);
+			}
 			
 			// convert *emote* into <i>emote</i>
 			$message = preg_replace('/\*(.+?)\*/', '<i>\1</i>', $message);
 			
 			$row['message_text'] = $message;
 			
+			// set name for guests
+			if ($row['userID'] == 0) {
+				$row['username'] = WCF::getLanguage()->get('net.northshirebund.wbb.shoutbox.guest');
+			}
+			
 			array_push($this->messages, $row);
 			
 			$this->lastmessage = max($this->lastmessage, $row['message_time']);
 		}
 		
+		if($this->xmloutput) {
+			$this->messages = array_reverse($this->messages);
+		}
+		
 		return;
 	}
 	
 		
 		WCF::getTPL()->assign(array(
 			'messages'		=> $this->messages,
-			'lastmessage'	=> $this->lastmessage
+			'lastmessage'	=> $this->lastmessage,
+			'errormessage'  => $this->errormessage
 		));
 	}
 	
 	
-	/** * @see Page::show() */ public function show() { // assign variables 
-	$this->assignVariables();		
+	/** * @see Page::show() */
+	public function show() { // assign variables 
+		$this->assignVariables();		
 		
 		// call show event
 		EventHandler::fireAction($this, 'show');
 		
+		// update session with referrer as request URI,
+		// so the site, which embeds the shoutbox, will appear in the user online list
+		if(isset($_SERVER['HTTP_REFERER'])) {
+			$referrer = $_SERVER['HTTP_REFERER'];
+			
+			if(strpos($referrer, 'index.php') == -1) {
+				$referrer .= 'index.php';
+			}
+			
+			WCF::getSession()->requestURI = $referrer;
+		}
+		
 		// show template
 		if($this->xmloutput) {
-			/*
-			header('Content-type: text/xml');
-			
-			echo '<?xml version="1.0" encoding="'.CHARSET.'"?><lines>';
-			
-			foreach($this->messages as $message) {
-				echo '<line><![CDATA[' . $message['username'] . ': ' . $message['message_text'] . ']]></line>';
-			}
-			
-			echo '</lines>';
-			*/
 			if (!empty($this->templateNameXml)) {
 				header('Content-type: text/xml');
 				WCF::getTPL()->display($this->templateNameXml, false);

lang/net.northshirebund.wbb.shoutbox.xml

 <?xml version="1.0" encoding="UTF-8"?><?mso-application progid="Excel.Sheet"?>
-<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="Default" ss:Width="206.1921"/><Column ss:StyleID="Default" ss:Width="122.7118"/><Column ss:StyleID="Default" ss:Width="136.8567"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:Index="2"><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.title</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.description</Data></Cell><Cell><Data ss:Type="String">Ein Chat-Frame</Data></Cell><Cell><Data ss:Type="String">A chat frame</Data></Cell></Row><Row ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.guest</Data></Cell><Cell><Data ss:Type="String">Gast</Data></Cell><Cell><Data ss:Type="String">Guest</Data></Cell></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="Default" ss:Width="231.2504"/><Column ss:StyleID="Default" ss:Width="210.8126"/><Column ss:StyleID="Default" ss:Width="196.6394"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:Index="2"><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.title</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.description</Data></Cell><Cell><Data ss:Type="String">Ein Chat-Frame</Data></Cell><Cell><Data ss:Type="String">A chat frame</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.guest</Data></Cell><Cell><Data ss:Type="String">Gast</Data></Cell><Cell><Data ss:Type="String">Guest</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.usernotfound</Data></Cell><Cell><Data ss:Type="String">Benutzer $name wurde nicht gefunden.</Data></Cell><Cell><Data ss:Type="String">User $name not found.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.whisperTo</Data></Cell><Cell><Data ss:Type="String">An</Data></Cell><Cell><Data ss:Type="String">To</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">net.northshirebund.wbb.shoutbox.whisperFrom</Data></Cell><Cell><Data ss:Type="String">Von</Data></Cell><Cell><Data ss:Type="String">From</Data></Cell></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>

lang/wcf.acp.menu.xml

+<?xml version="1.0" encoding="UTF-8"?><?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/><Style ss:ID="ce1"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman1" ss:Size="10"/></Style></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="ce1" ss:Width="246.9543"/><Column ss:StyleID="Default" ss:Width="176.2016"/><Column ss:StyleID="Default" ss:Width="136.8567"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"/><Cell><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"><Data ss:Type="String">wcf.acp.menu.link.content.shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"><Data ss:Type="String">wcf.acp.menu.link.content.shoutbox.messages</Data></Cell><Cell><Data ss:Type="String">Nachrichten</Data></Cell><Cell><Data ss:Type="String">Messages</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65511" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65513" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65536" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>

lang/wcf.acp.option.xml

 <?xml version="1.0" encoding="UTF-8"?><?mso-application progid="Excel.Sheet"?>
-<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/><Style ss:ID="ce1"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman" ss:Size="10"/></Style><Style ss:ID="ce2"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman1" ss:Size="10"/></Style></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="ce2" ss:Width="246.9543"/><Column ss:StyleID="Default" ss:Width="176.2016"/><Column ss:StyleID="Default" ss:Width="136.8567"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"/><Cell><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"><Data ss:Type="String">wcf.acp.option.category.shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="ce1"><Data ss:Type="String">wcf.acp.option.category.shoutbox.description </Data></Cell><Cell><Data ss:Type="String">Eine einfache Chat-Box für das WBB</Data></Cell><Cell><Data ss:Type="String">A simple chatbox for the WBB</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.category.shoutbox.options </Data></Cell><Cell><Data ss:Type="String">Shoutbox-Einstellungen</Data></Cell><Cell><Data ss:Type="String">Shoutbox-Options</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.category.shoutbox.options.description </Data></Cell><Cell><Data ss:Type="String">Shoutbox-Einstellungen</Data></Cell><Cell><Data ss:Type="String">Shoutbox-Options</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_reloadtime</Data></Cell><Cell><Data ss:Type="String">Frame neu laden nach &lt;i&gt;n&lt;/i&gt; Sek.</Data></Cell><Cell><Data ss:Type="String">Refresh frame after &lt;i&gt;n&lt;/i&gt; sec.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messagecount</Data></Cell><Cell><Data ss:Type="String">Zeige die letzten &lt;i&gt;n&lt;/i&gt; Nachrichten</Data></Cell><Cell><Data ss:Type="String">Show the last &lt;i&gt;n&lt;/i&gt; messages</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_allowguests </Data></Cell><Cell><Data ss:Type="String">Erlaube es Gästen in die Shoutbox zu schreiben</Data></Cell><Cell><Data ss:Type="String">Allow guests to post into the shoutbox</Data></Cell></Row><Row ss:Index="9" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultwidth</Data></Cell><Cell><Data ss:Type="String">Standard-Breite des Shoutbox-Frames</Data></Cell><Cell><Data ss:Type="String">Default width of the shoutbox frame</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultheight</Data></Cell><Cell><Data ss:Type="String">Standard-Höhe des Shoutbox-Frames</Data></Cell><Cell><Data ss:Type="String">Default height of the shoutbox frame</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder</Data></Cell><Cell><Data ss:Type="String">Nachrichten-Reihenfolge</Data></Cell><Cell><Data ss:Type="String">Message order</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder.asc</Data></Cell><Cell><Data ss:Type="String">Neueste Nachricht unten</Data></Cell><Cell><Data ss:Type="String">Newest message at the bottom</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder.desc</Data></Cell><Cell><Data ss:Type="String">Neueste Nachricht oben</Data></Cell><Cell><Data ss:Type="String">Newest message first</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65536" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/><Style ss:ID="ce1"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman1" ss:Size="10"/></Style><Style ss:ID="ce2"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman11" ss:Size="10"/></Style><Style ss:ID="ce3"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman" ss:Size="10"/></Style></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="ce2" ss:Width="246.9543"/><Column ss:StyleID="Default" ss:Width="229.011"/><Column ss:StyleID="Default" ss:Width="183.4016"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"/><Cell><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"><Data ss:Type="String">wcf.acp.option.category.shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell><Cell><Data ss:Type="String">Shoutbox</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="ce1"><Data ss:Type="String">wcf.acp.option.category.shoutbox.description </Data></Cell><Cell><Data ss:Type="String">Eine einfache Chat-Box für das WBB</Data></Cell><Cell><Data ss:Type="String">A simple chatbox for the WBB</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.category.shoutbox.options </Data></Cell><Cell><Data ss:Type="String">Shoutbox-Einstellungen</Data></Cell><Cell><Data ss:Type="String">Shoutbox-Options</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.category.shoutbox.options.description </Data></Cell><Cell><Data ss:Type="String">Shoutbox-Einstellungen</Data></Cell><Cell><Data ss:Type="String">Shoutbox-Options</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_reloadtime</Data></Cell><Cell><Data ss:Type="String">Frame neu laden nach &lt;i&gt;n&lt;/i&gt; Sek.</Data></Cell><Cell><Data ss:Type="String">Refresh frame after &lt;i&gt;n&lt;/i&gt; sec.</Data></Cell></Row><Row ss:Index="7" ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="ce3"><Data ss:Type="String">wcf.acp.option.shoutbox_reloadtime.description </Data></Cell><Cell><Data ss:Type="String">Wenn AJAX verwendet wird:&lt;br/&gt;Legt die Zeit fest, nach der neue Nachrichte vom Server abgerufen werden.&lt;br/&gt;Ohne AJAX:&lt;br/&gt;Legt die zeit fest, nach der das verwendete iframe neu geladen wird.&lt;br/&gt;Angabe in Sekunden; 0 bedeutet keine Aktualisierung.</Data></Cell><Cell><Data ss:Type="String">If using AJAX:&lt;br/&gt;Determines the time, after which will be polled for new messages.&lt;br/&gt;Without AJAX:&lt;br/&gt;Determines the time, after wich the used iframe will be reloaded.&lt;br/&gt;0 means no reloading.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messagecount</Data></Cell><Cell><Data ss:Type="String">Zeige die letzten &lt;i&gt;n&lt;/i&gt; Nachrichten</Data></Cell><Cell><Data ss:Type="String">Show the last &lt;i&gt;n&lt;/i&gt; messages</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="ce3"><Data ss:Type="String">wcf.acp.option.shoutbox_messagecount.description </Data></Cell><Cell><Data ss:Type="String">Legt fest, wie viele Nachrichten zu Beginn angezeigt werden sollen. </Data></Cell><Cell><Data ss:Type="String">Determines the number of messages, which will be initially loaded.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_storedmessages</Data></Cell><Cell><Data ss:Type="String">Speichere maximal &lt;i&gt;n&lt;/i&gt; Nachrichten</Data></Cell><Cell><Data ss:Type="String">Store max. &lt;i&gt;n&lt;/i&gt; messages</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_storedmessages.description</Data></Cell><Cell><Data ss:Type="String">Legt die Anzahl der Nachrichten fest, die maximal in der Datenbank gespeichert werden sollen.</Data></Cell><Cell><Data ss:Type="String">Determines the number of messages, which will be stored in the Database.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_allowguests</Data></Cell><Cell><Data ss:Type="String">Erlaube es Gästen in die Shoutbox zu schreiben</Data></Cell><Cell><Data ss:Type="String">Allow guests to post into the shoutbox</Data></Cell></Row><Row ss:Index="13" ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_allowguests.description</Data></Cell><Cell ss:Index="3"/></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultwidth</Data></Cell><Cell><Data ss:Type="String">Standard-Breite des Shoutbox-Frames</Data></Cell><Cell><Data ss:Type="String">Default width of the shoutbox frame</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultwidth.description</Data></Cell><Cell ss:Index="3"/></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultheight</Data></Cell><Cell><Data ss:Type="String">Standard-Höhe des Shoutbox-Frames</Data></Cell><Cell><Data ss:Type="String">Default height of the shoutbox frame</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_defaultheight.description</Data></Cell><Cell ss:Index="3"/></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder_asc</Data></Cell><Cell><Data ss:Type="String">Nachrichten-Reihenfolge</Data></Cell><Cell><Data ss:Type="String">Message order</Data></Cell></Row><Row ss:Index="19" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:StyleID="ce3"><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder_asc.description </Data></Cell><Cell ss:Index="3"/></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder.asc</Data></Cell><Cell><Data ss:Type="String">Neueste Nachricht unten</Data></Cell><Cell><Data ss:Type="String">Newest message at the bottom</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_messageorder.desc</Data></Cell><Cell><Data ss:Type="String">Neueste Nachricht oben</Data></Cell><Cell><Data ss:Type="String">Newest message first</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_allowbbcode</Data></Cell><Cell><Data ss:Type="String">Erlaube BBCode in der Shoutbox.</Data></Cell><Cell><Data ss:Type="String">Allow BB-Codes in the shoutbox.</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell><Data ss:Type="String">wcf.acp.option.shoutbox_allowbbcode.description</Data></Cell><Cell><Data ss:Type="String">Ermöglicht die Verwendung von BB-Codes wie &lt;b&gt;[b]&lt;/b&gt;, &lt;b&gt;[img]&lt;/b&gt;, o.ä. Innrhalb der Shoutbox.</Data></Cell><Cell><Data ss:Type="String">Allows the usage of BB-Codes like &lt;b&gt;[b]&lt;/b&gt; or &lt;b&gt;[img]&lt;/b&gt; within the shoutbox.</Data></Cell></Row><Row ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65536" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>

lang/wcf.acp.shoutbox.xml

+<?xml version="1.0" encoding="UTF-8"?><?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"><OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index><RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings><ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth><WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID="Default" ss:Name="Default"/><Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/></Style><Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/><NumberFormat ss:Format="General"/></Style><Style ss:ID="Heading" ss:Name="Heading"><Alignment ss:Horizontal="Center"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="Heading1" ss:Name="Heading1"><Alignment ss:Horizontal="Center" ss:Rotate="90"/><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style><Style ss:ID="co1"/><Style ss:ID="co2"/><Style ss:ID="co3"/><Style ss:ID="co4"/><Style ss:ID="ta1"/><Style ss:ID="ce1"><Alignment ss:WrapText="1"/><Font ss:FontName="Times New Roman1" ss:Size="10"/></Style></Styles><ss:Worksheet ss:Name="Tabelle1"><Table ss:StyleID="ta1"><Column ss:StyleID="ce1" ss:Width="246.9543"/><Column ss:StyleID="Default" ss:Width="176.2016"/><Column ss:StyleID="Default" ss:Width="136.8567"/><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"/><Cell><Data ss:Type="String">De</Data></Cell><Cell><Data ss:Type="String">En</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="13.4079"><Cell ss:StyleID="Default"><Data ss:Type="String">wcf.acp.shoutbox.title</Data></Cell><Cell><Data ss:Type="String">Shoutbox Nachrichten</Data></Cell><Cell><Data ss:Type="String">Shoutbox Messages</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.delete</Data></Cell><Cell><Data ss:Type="String">Lösche</Data></Cell><Cell><Data ss:Type="String">Delete</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.deleteMessagesFromUser</Data></Cell><Cell><Data ss:Type="String">Alle Nachrichten von</Data></Cell><Cell><Data ss:Type="String">Messages from</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.listheader.id</Data></Cell><Cell><Data ss:Type="String">ID</Data></Cell><Cell><Data ss:Type="String">ID</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.listheader.time</Data></Cell><Cell><Data ss:Type="String">Zeit</Data></Cell><Cell><Data ss:Type="String">Time</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.listheader.from</Data></Cell><Cell><Data ss:Type="String">Von</Data></Cell><Cell><Data ss:Type="String">From</Data></Cell></Row><Row ss:Index="8" ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.listheader.message</Data></Cell><Cell><Data ss:Type="String">Nachricht</Data></Cell><Cell><Data ss:Type="String">Message</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.deleteSelectedMessages</Data></Cell><Cell><Data ss:Type="String">Lösche die ausgewählten Nachrichten</Data></Cell><Cell><Data ss:Type="String">Delete the selected messages</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="String">wcf.acp.shoutbox.nomessages</Data></Cell><Cell><Data ss:Type="String">Es sind keine Nachrichten vorhanden</Data></Cell><Cell><Data ss:Type="String">The Shoutbox is empty</Data></Cell></Row><Row ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65511" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65513" ss:Height="12.8409"><Cell ss:Index="3"/></Row><Row ss:Index="65536" ss:AutoFitHeight="0" ss:Height="12.8409"><Cell ss:Index="3"/></Row></Table><x:WorksheetOptions/></ss:Worksheet></Workbook>

package.properties

 package.id=net.northshirebund.wbb.shoutbox
 package.name=Shoutbox
 package.description=Ein Chat-Frame
-package.version=0.2.1
+package.version=0.4
 
 package.author.name=Christian Fischer
 package.author.url=www.northshirebund.net
 
-package.parent=com.woltlab.wbb
+package.parent=com.woltlab.wcf
 package.unique=1
 package.standalone=0
 
-package.dependencities=\
-	com.woltlab.wcf(1.0.0 Beta3)
+package.dependencities=				\
+	com.woltlab.wcf(1.0.0 Beta4);	\
+	com.woltlab.wcf.data.message.bbcode(1.0.0 Beta4)
 	
-package.optionalPackages=		\
-	shoutbox-wbb3modsportalbox;	\
+package.optionalPackages=			\
+	shoutbox-wbb3modsportalbox;		\
 	shoutbox-page
 
-package.updateableFrom=			\
-	0.1; 0.2
+package.updateableFrom=				\
+	0.1; 0.2; 0.2.1; 0.3
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="net.northshirebund.wbb.shoutbox">
+    <packageInformation>
+        <packageName>Shoutbox</packageName>
+        <packageDescription>Ein Chat-Frame</packageDescription>
+        <version>0.4</version>
+        <promptParent>com.woltlab.wcf</promptParent>
+        <standalone>0</standalone>
+        <isUnique>1</isUnique>
+    </packageInformation>
+    
+    <authorInformation>
+        <author>Christian Fischer</author>
+        <authorURL>www.northshirebund.net</authorURL>
+    </authorInformation>
+    
+    <requiredPackages>
+        <requiredPackage minversion="1.0.0 Beta6">com.woltlab.wcf</requiredPackage>
+        <requiredPackage minversion="1.0.0 Beta6">com.woltlab.wcf.data.message.bbcode</requiredPackage>
+    </requiredPackages>
+    
+    <optionalPackages>
+    	<optionalPackage build="shoutbox-page"/>
+    	<optionalPackage build="shoutbox-wbb3modsportalbox"/>
+    </optionalPackages>
+    
+    <addfiles>
+    	<file name="script/install/install.sql"			tag="sql"	/>
+    	<file name="script/install/acpmenu.xml"						/>
+    	<file name="script/install/options.xml"						/>
+    	<file name="script/install/pagelocation.xml"				/>
+    	
+    	<file type="tar" tag="files"		src="files/"			/>
+    	<file type="tar" tag="templates"	src="templates/"		/>
+    	<file type="tar" tag="acptemplates"	src="acptemplates/"		/>
+    </addfiles>
+    
+    <!--
+    <instructions type="update"	fromversion="0.1"	/>
+    <instructions type="update"	fromversion="0.2"	/>
+    <instructions type="update"	fromversion="0.2.1"	/>
+    <instructions type="update"	fromversion="0.3"	/>
+    -->
+    
+</package>

script/install/acpmenu.xml

+<?xml version="1.0"?>
+<!DOCTYPE data SYSTEM "http://www.woltlab.com/DTD/acpmenu.dtd">
+<data>
+	<import>
+		<acpmenuitem name="wcf.acp.menu.link.content.shoutbox">
+			<parent>wcf.acp.menu.link.content</parent>
+			<showorder>4</showorder>
+		</acpmenuitem>
+		
+		<acpmenuitem name="wcf.acp.menu.link.content.shoutbox.messages">
+			<parent>wcf.acp.menu.link.content.shoutbox</parent>
+			<icon>icon/shoutboxIcon24x24.png</icon>
+			<showorder>1</showorder>
+			<link>index.php?page=ShoutboxMessageList</link>
+		</acpmenuitem>
+	</import>
+</data>

script/install/install.sql

 
 CREATE TABLE `wcf1_shoutbox` (
   `message_id` int(11) NOT NULL auto_increment,
+  `guest_name` varchar(255) NULL default NULL,
   `userid` int(11) unsigned NOT NULL default '0',
-  `message_text` text NOT NULL,
+  `to_user` int(11) unsigned NOT NULL default '0',
   `message_time` int(11) NOT NULL,
   `message_ip` varchar(15) NOT NULL,
+  `message_text` text NOT NULL,
   PRIMARY KEY  (`message_id`)
 );

script/install/options.xml

 				<optiontype>integer</optiontype>
 				<defaultvalue>50</defaultvalue>
 			</option>
-			<!--
-			<option name="shoutbox_messageorder">
+			<option name="shoutbox_storedmessages">
+				<categoryname>shoutbox.options</categoryname>
+				<optiontype>integer</optiontype>
+				<defaultvalue>250</defaultvalue>
+			</option>
+			<option name="shoutbox_messageorder_asc">
 				<categoryname>shoutbox.options</categoryname>
 				<optiontype>select</optiontype>
-				<defaultvalue>DESC</defaultvalue>
-				<selectoptions><![CDATA[DESC:wcf.acp.option.shoutbox_messageorder.desc
-ASC:wcf.acp.option.shoutbox_messageorder.asc]]></selectoptions>
+				<defaultvalue>0</defaultvalue>
+				<selectoptions><![CDATA[0:wcf.acp.option.shoutbox_messageorder.desc
+1:wcf.acp.option.shoutbox_messageorder.asc]]></selectoptions>
 			</option>
-			-->
 			<option name="shoutbox_defaultwidth">
 				<categoryname>shoutbox.options</categoryname>
 				<optiontype>text</optiontype>
 				<optiontype>text</optiontype>
 				<defaultvalue>150px</defaultvalue>
 			</option>
+			<option name="shoutbox_allowbbcode">
+				<categoryname>shoutbox.options</categoryname>
+				<optiontype>boolean</optiontype>
+				<defaultvalue><![CDATA[0]]></defaultvalue>
+			</option>
 			<option name="shoutbox_allowguests">
 				<categoryname>shoutbox.options</categoryname>
 				<optiontype>boolean</optiontype>
-				<defaultvalue>true</defaultvalue>
+				<defaultvalue><![CDATA[1]]></defaultvalue>
 			</option>
 		</options>
 	</import>

script/install/pagelocation.xml

+<?xml version="1.0"?>
+<!DOCTYPE import SYSTEM "DTD/import.dtd">
+<data>
+	<import>
+		<pagelocation name="net.northshirebund.wbb.shoutbox.title">
+			<pattern><![CDATA[index\.php\?page=Shoutbox]]></pattern>
+		</pagelocation>
+	</import>
+</data>

templates/shoutboxBox.tpl

 <div class="border">
     <div class="containerHead">
 		<div class="containerIcon">
-    		<a href="javascript: void(0)" onclick="openList('shoutboxBox', true)">
-        	<img src="icons/minusS.png" id="lastthreadsboxImage" alt="" /></a>
+    		<a href="javascript: void(0)" onclick="return !openList('shoutboxBox', true)">
+        	<img id="shoutboxBoxImage" src="icon/minusS.png" id="lastthreadsboxImage" alt="" /></a>
         </div>
-        <img src="icons/postQuoteS.png" alt="" /> {lang}net.northshirebund.wbb.shoutbox.title{/lang}
+        <img src="{@RELATIVE_WCF_DIR}/icon/shoutboxIcon16x24.png" alt="" /> {lang}net.northshirebund.wbb.shoutbox.title{/lang}
     </div>
-    <div class="container-1" id="shoutboxBox" style="width:100%;">
+    <div id="shoutboxBox" style="width:100%;">
 		{include file="shoutboxFrame"}
     </div>
 </div>

templates/shoutboxContent.tpl

 {include file="documentHeader"}
 <head>
 	{include file="headInclude"}
-	<meta http-equiv="refresh" content="{SHOUTBOX_RELOADTIME};URL=index.php?page=ShoutboxContent">
+	{if SHOUTBOX_RELOADTIME}<meta http-equiv="refresh" content="{SHOUTBOX_RELOADTIME};URL=index.php?page=ShoutboxContent">{/if}
 </head>
 <body style="text-align:left; margin:0px; padding:0px;">
 <div class="container-1" style="height:100%;">
 {foreach from=$messages item=message}
-	<span class="light">[{@$message['message_time']|shorttime}]</span> {if $message['userID']}{$message['username']}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}: {@$message['message_text']}<br/>
+	{include file="shoutboxFormattedMessage"}<br/>
 {/foreach}
 </div>
 </body>

templates/shoutboxContentXml.tpl

 <?xml version="1.0" encoding="{CHARSET}"?>
 <lines>
 {foreach from=$messages item=message}
-	<line><![CDATA[<span class="light">[{@$message['message_time']|shorttime}]</span> {if $message['userID']}{$message['username']}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}: {@$message['message_text']}]]></line>
+	<line><![CDATA[{include file="shoutboxFormattedMessage"}]]></line>
 {/foreach}
+{if $errormessage}
+	<line><![CDATA[{$errormessage}]]></line>
+{/if}
 	<last>{$lastmessage}</last>
 </lines>

templates/shoutboxFormattedMessage.tpl

+<span class="light">[{@$message['message_time']|shorttime}]</span><span class="{$message['class']}">
+{if $message['isEmote']}
+	{$message['username']} {@$message['message_text']}
+{else if $message['isWhisperIn']}
+	{lang}net.northshirebund.wbb.shoutbox.whisperFrom{/lang} {if $message['userID']}<a href="javascript:top.sbWhisperTo('{$message['username']|encodeJS}');">{$message['username']}</a>{else}{$message['username']}{/if}: {@$message['message_text']}
+{else if $message['isWhisperOut']}
+	{lang}net.northshirebund.wbb.shoutbox.whisperTo{/lang} <a href="javascript:top.sbWhisperTo('{$message['to_username']|encodeJS}');">{$message['to_username']}</a>: {@$message['message_text']}
+{else}
+	{if $message['userID']}<a href="javascript:top.sbWhisperTo('{$message['username']|encodeJS}');">{$message['username']}</a>{else}{$message['username']}{/if}: {@$message['message_text']}
+{/if}
+</span>

templates/shoutboxFrame.tpl

-<table cellpadding="4" cellspacing="0" border="0" style="width:{SHOUTBOX_DEFAULTWIDTH};">
-<tr><td>
-	<div id="shoutboxcontent" style="width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; overflow:scroll;">
-		<noscript><iframe name="chat" src="index.php?page=ShoutboxContent" scrolling="yes" frameborder="0" style="width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; border:0px;"></iframe></noscript>
-	</div>
-</td></tr>
-<tr><td>
-{if $this->getUser()->userID || SHOUTBOX_ALLOWGUESTS}
-	<script language="javascript" type="text/javascript">
-		//<![CDATA[
-		
-			var ajaxRequest   = null;
-			var lastmessage   = 0;
-			var queuedmessage = null;
-			var timerPending  = false;
-			var sbcontent     = document.getElementById('shoutboxcontent');
-			
-			// prepare div element
-			sbcontent.style.overflow = 'scroll';
-			sbcontent.innerHTML = '<div id="innershoutboxcontent" style="width:100%;"></div><a name="shoutboxbottom"></a><br/>';
-			sbcontent = document.getElementById('innershoutboxcontent');
-			
-			setTimeout('shoutboxTimer()', 100);
-			
-			
-			function shoutboxTimer() {
-				this.timerPending = false;
-				sendShoutboxAjaxRequest();
-				return;
-			}
-			
-			
-			function sendShoutboxAjaxRequest() {
-				if(this.ajaxRequest == null) {
-					var appendmessage = '';
-					
-					if(this.queuedmessage != null) {
-						appendmessage = '&message=' + encodeURIComponent(this.queuedmessage);
-						this.queuedmessage = null;
-					}
-					
-					this.ajaxRequest = new AjaxRequest();
-					return this.ajaxRequest.openPost(
-										'index.php?page=ShoutboxContent&output=xml',
-										'since=' + this.lastmessage + appendmessage,
-										function() { handleShoutboxContentRequest(); }
-					);
-				}
-				
-				return true;
-			}
-			
-			function sendShoutboxMessage() {
-				this.queuedmessage = document.shoutboxInputform.message.value;
-				document.shoutboxInputform.message.value='';
-				return !sendShoutboxAjaxRequest();
-			}
-			
-			function handleShoutboxContentRequest() {
-				if (this.ajaxRequest && this.ajaxRequest.xmlHttpRequest.readyState == 4) {
-					if(this.ajaxRequest.xmlHttpRequest.status == 200 && this.ajaxRequest.xmlHttpRequest.responseXML) {
-						var lines = this.ajaxRequest.xmlHttpRequest.responseXML.getElementsByTagName('lines');
-						
-						if(lines.length > 0) {
-							for(var i=0; i<lines[0].childNodes.length; i++) {
-								var line = lines[0].childNodes[i];
-								
-								if(line.childNodes.length > 0) {
-									var node = line.childNodes[0];
-									
-									if(node.nodeType == 3 || node.nodeType == 4) {
-										if(line.tagName == 'line') {
-											// if SHOUTBOX_MESSAGEORDER=='ASC'}
-											//	this.sbcontent.innerHTML = this.sbcontent.innerHTML + node.nodeValue + '<br/>';
-											// else}
-												this.sbcontent.innerHTML = node.nodeValue + '<br/>' + this.sbcontent.innerHTML;
-											// /if}
-										}
-										else if(line.tagName == 'last') {
-											this.lastmessage = node.nodeValue;
-										}
-									}
-								}
-							}
-						}
-						
-						// if SHOUTBOX_MESSAGEORDER=="ASC"}
-							// scroll the frame to the bottom
-						//	window.location.href = '#shoutboxbottom';
-						// /if}
-						
-						// request was successfully handled...
-						this.ajaxRequest = null;
-						
-						// if a message was queued, send another request immediately
-						if(this.queuedmessage) {
-							sendShoutboxAjaxRequest();
-						}
-						else if(!this.timerPending) {
-							this.timerPending = true;
-							setTimeout('shoutboxTimer()', {SHOUTBOX_RELOADTIME*1000});
-						}
-					}
-				}
-				
-				return;
-			}
-		
-		//]]>
-	</script>
-	<form name="shoutboxInputform" action="index.php" method="post" target="chat" onsubmit="return sendShoutboxMessage();">
-		<input type="hidden" name="page" value="ShoutboxContent">
-		<noscript><span>[<a href="index.php?page=ShoutboxContent" target="chat">aktualisieren</a>]</noscript>
-			<b>{if $this->getUser()->userID}{$this->getUser()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}</b> &raquo;
-			<input type=text name="message" size="60" class="input">
-			<input type=submit value="Senden" class="input">
-		</span>
-	</form>
-{/if}
-</td></tr>
-</table>
+<table class="shoutboxFrame container-1" cellpadding="4" cellspacing="0" border="0" style="width:{SHOUTBOX_DEFAULTWIDTH};">
+<tr><td>
+	<div class="border shoutboxFrameInner container-2">
+		<div id="shoutboxcontent" style="margin:5px; padding:0px; height:{SHOUTBOX_DEFAULTHEIGHT};">
+			<noscript><iframe name="chat" src="index.php?page=ShoutboxContent" scrolling="yes" frameborder="0" allowtransparency="true" style="width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; border:0px;"></iframe></noscript>
+		</div>
+	</div>
+</td></tr>
+<tr><td>
+{if $this->getUser()->userID || SHOUTBOX_ALLOWGUESTS}
+	<script language="javascript" type="text/javascript">
+		//<![CDATA[
+		
+			var ajaxRequest   = null;
+			var lastmessage   = 0;
+			var queuedmessage = null;
+			var timerPending  = false;
+			var sbcontent     = document.getElementById('shoutboxcontent');
+			
+			// prepare div element
+		//	sbcontent.style.overflow = 'scroll';
+		//	sbcontent.innerHTML = '<div id="innershoutboxcontent" style="width:100%;"></div><a name="shoutboxbottom"></a><br/>';
+		//	sbcontent = document.getElementById('innershoutboxcontent');
+			sbcontent.innerHTML = '<iframe id="shoutboxcontentframe" name="shoutboxcontentframe" scrolling="auto" frameborder="0" allowtransparency="true" style="background-color:transparent; width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; border:0px;"></iframe>';
+			top.frames.shoutboxcontentframe.document.write('<html><head><link rel="stylesheet" type="text/css" media="screen" href="{@RELATIVE_WCF_DIR}style/style-{@$this->getStyle()->styleID}.css" /></head><body class="shoutboxFrameInner container-2" style="margin:0px; padding:0px;"><div id="shoutboxcontent" class="shoutboxFrameInner container-2" style="text-align:left; margin:0px; padding:0px;"></div></body></html>');
+			sbcontent = null;
+
+			
+			setTimeout('shoutboxTimer()', 100);
+			
+			
+			function shoutboxTimer() {
+				if (this.sbcontent == null) {
+					this.sbcontent = top.frames.shoutboxcontentframe.document.getElementById('shoutboxcontent');
+				}
+				
+				this.timerPending = false;
+				sendShoutboxAjaxRequest();
+				
+				return;
+			}
+			
+			
+			function sendShoutboxAjaxRequest() {
+				if(this.ajaxRequest == null) {
+					var appendmessage = '';
+					
+					if(this.queuedmessage != null) {
+						appendmessage = '&message=' + encodeURIComponent(this.queuedmessage);
+						this.queuedmessage = null;
+					}
+					
+					this.ajaxRequest = new AjaxRequest();
+					return this.ajaxRequest.openPost(
+										'index.php?page=ShoutboxContent&output=xml' + SID_ARG_2ND,
+										'since=' + this.lastmessage + appendmessage,
+										function() { handleShoutboxContentRequest(); }
+					);
+				}
+				
+				return true;
+			}
+			
+			function sendShoutboxMessage() {
+				this.queuedmessage = document.shoutboxInputform.message.value;
+				document.shoutboxInputform.message.value='';
+				return !sendShoutboxAjaxRequest();
+			}
+			
+			function handleShoutboxContentRequest() {
+				if (this.ajaxRequest && this.ajaxRequest.xmlHttpRequest.readyState == 4) {
+					if(this.ajaxRequest.xmlHttpRequest.status == 200 && this.ajaxRequest.xmlHttpRequest.responseXML) {
+						var lines = this.ajaxRequest.xmlHttpRequest.responseXML.getElementsByTagName('lines');
+						
+						if(lines.length > 0) {
+							for(var i=0; i<lines[0].childNodes.length; i++) {
+								var line = lines[0].childNodes[i];
+								
+								if(line.childNodes.length > 0) {
+									var node = line.childNodes[0];
+									
+									if(node.nodeType == 3 || node.nodeType == 4) {
+										if(line.tagName == 'line') {
+											{if SHOUTBOX_MESSAGEORDER_ASC}
+												this.sbcontent.innerHTML = this.sbcontent.innerHTML + node.nodeValue + '<br/>';
+											{else}
+												this.sbcontent.innerHTML = node.nodeValue + '<br/>' + this.sbcontent.innerHTML;
+											{/if}
+										}
+										else if(line.tagName == 'last') {
+											this.lastmessage = node.nodeValue;
+										}
+									}
+								}
+							}
+						}
+						
+						{if SHOUTBOX_MESSAGEORDER_ASC}
+							// scroll the frame to the bottom
+							//window.location.href = '#shoutboxbottom';
+							//document.shoutboxInputform.message.focus();
+							top.frames.shoutboxcontentframe.scrollTo(0, 999999);
+						{/if}
+						
+						// request was successfully handled...
+						this.ajaxRequest = null;
+						
+						// if a message was queued, send another request immediately
+						if(this.queuedmessage) {
+							sendShoutboxAjaxRequest();
+						}
+						{if SHOUTBOX_RELOADTIME}
+						else if(!this.timerPending) {
+							this.timerPending = true;
+							setTimeout('shoutboxTimer()', {SHOUTBOX_RELOADTIME*1000});
+						}
+						{/if}
+					}
+				}
+				
+				return;
+			}
+			
+			function sbWhisperTo(name) {
+				document.shoutboxInputform.message.value = '/w "' + name + '" ' + document.shoutboxInputform.message.value;
+				return;
+			}
+		
+		//]]>
+	</script>
+	<form name="shoutboxInputform" action="index.php" method="post" target="chat" onsubmit="return sendShoutboxMessage();">
+		<input type="hidden" name="page" value="ShoutboxContent">
+		<noscript><span>[<a href="index.php?page=ShoutboxContent" target="chat">aktualisieren</a>]</noscript>
+			<b>{if $this->getUser()->userID}{$this->getUser()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}</b> &raquo;
+			<input type=text name="message" size="60" class="input">
+			<input type=submit value="Senden" class="input">
+		</span>
+	</form>
+{/if}
+</td></tr>
+</table>

templates/shoutboxFrame.tpl.txt

+<table class="shoutboxFrame container-1" cellpadding="4" cellspacing="0" border="0" style="width:{SHOUTBOX_DEFAULTWIDTH};">
+<tr><td>
+	<div class="border shoutboxFrameInner container-2">
+		<div id="shoutboxcontent" style="margin:5px; padding:0px; height:{SHOUTBOX_DEFAULTHEIGHT};">
+			<noscript><iframe name="chat" src="index.php?page=ShoutboxContent" scrolling="yes" frameborder="0" allowtransparency="true" style="width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; border:0px;"></iframe></noscript>
+		</div>
+	</div>
+</td></tr>
+<tr><td>
+{if $this->getUser()->userID || SHOUTBOX_ALLOWGUESTS}
+	<script language="javascript" type="text/javascript">
+		//<![CDATA[
+		
+			var ajaxRequest   = null;
+			var lastmessage   = 0;
+			var queuedmessage = null;
+			var timerPending  = false;
+			var sbcontent     = document.getElementById('shoutboxcontent');
+			
+			// prepare div element
+		//	sbcontent.style.overflow = 'scroll';
+		//	sbcontent.innerHTML = '<div id="innershoutboxcontent" style="width:100%;"></div><a name="shoutboxbottom"></a><br/>';
+		//	sbcontent = document.getElementById('innershoutboxcontent');
+			sbcontent.innerHTML = '<iframe id="shoutboxcontentframe" name="shoutboxcontentframe" scrolling="auto" frameborder="0" allowtransparency="true" style="background-color:transparent; width:{SHOUTBOX_DEFAULTWIDTH}; height:{SHOUTBOX_DEFAULTHEIGHT}; border:0px;"></iframe>';
+			top.frames.shoutboxcontentframe.document.write('<html><head><link rel="stylesheet" type="text/css" media="screen" href="{@RELATIVE_WCF_DIR}style/style-{@$this->getStyle()->styleID}.css" /></head><body class="shoutboxFrameInner container-2" style="margin:0px; padding:0px;"><div id="shoutboxcontent" class="shoutboxFrameInner container-2" style="text-align:left; margin:0px; padding:0px;"></div></body></html>');
+			sbcontent = null;
+
+			
+			setTimeout('shoutboxTimer()', 100);
+			
+			
+			function shoutboxTimer() {
+				if (this.sbcontent == null) {
+					this.sbcontent = top.frames.shoutboxcontentframe.document.getElementById('shoutboxcontent');
+				}
+				
+				this.timerPending = false;
+				sendShoutboxAjaxRequest();
+				
+				return;
+			}
+			
+			
+			function sendShoutboxAjaxRequest() {
+				if(this.ajaxRequest == null) {
+					var appendmessage = '';
+					
+					if(this.queuedmessage != null) {
+						appendmessage = '&message=' + encodeURIComponent(this.queuedmessage);
+						this.queuedmessage = null;
+					}
+					
+					this.ajaxRequest = new AjaxRequest();
+					return this.ajaxRequest.openPost(
+										'index.php?page=ShoutboxContent&output=xml' + SID_ARG_2ND,
+										'since=' + this.lastmessage + appendmessage,
+										function() { handleShoutboxContentRequest(); }
+					);
+				}
+				
+				return true;
+			}
+			
+			function sendShoutboxMessage() {
+				this.queuedmessage = document.shoutboxInputform.message.value;
+				document.shoutboxInputform.message.value='';
+				return !sendShoutboxAjaxRequest();
+			}
+			
+			function handleShoutboxContentRequest() {
+				if (this.ajaxRequest && this.ajaxRequest.xmlHttpRequest.readyState == 4) {
+					if(this.ajaxRequest.xmlHttpRequest.status == 200 && this.ajaxRequest.xmlHttpRequest.responseXML) {
+						var lines = this.ajaxRequest.xmlHttpRequest.responseXML.getElementsByTagName('lines');
+						
+						if(lines.length > 0) {
+							for(var i=0; i<lines[0].childNodes.length; i++) {
+								var line = lines[0].childNodes[i];
+								
+								if(line.childNodes.length > 0) {
+									var node = line.childNodes[0];
+									
+									if(node.nodeType == 3 || node.nodeType == 4) {
+										if(line.tagName == 'line') {
+											{if SHOUTBOX_MESSAGEORDER_ASC}
+												this.sbcontent.innerHTML = this.sbcontent.innerHTML + node.nodeValue + '<br/>';
+											{else}
+												this.sbcontent.innerHTML = node.nodeValue + '<br/>' + this.sbcontent.innerHTML;
+											{/if}
+										}
+										else if(line.tagName == 'last') {
+											this.lastmessage = node.nodeValue;
+										}
+									}
+								}
+							}
+						}
+						
+						{if SHOUTBOX_MESSAGEORDER_ASC}
+							// scroll the frame to the bottom
+							//window.location.href = '#shoutboxbottom';
+							//document.shoutboxInputform.message.focus();
+							top.frames.shoutboxcontentframe.scrollTo(0, 999999);
+						{/if}
+						
+						// request was successfully handled...
+						this.ajaxRequest = null;
+						
+						// if a message was queued, send another request immediately
+						if(this.queuedmessage) {
+							sendShoutboxAjaxRequest();
+						}
+						{if SHOUTBOX_RELOADTIME}
+						else if(!this.timerPending) {
+							this.timerPending = true;
+							setTimeout('shoutboxTimer()', {SHOUTBOX_RELOADTIME*1000});
+						}
+						{/if}
+					}
+				}
+				
+				return;
+			}
+			
+			function sbWhisperTo(name) {
+				document.shoutboxInputform.message.value = '/w "' + name + '" ' + document.shoutboxInputform.message.value;
+				return;
+			}
+		
+		//]]>
+	</script>
+	<form name="shoutboxInputform" action="index.php" method="post" target="chat" onsubmit="return sendShoutboxMessage();">
+		<input type="hidden" name="page" value="ShoutboxContent">
+		<noscript><span>[<a href="index.php?page=ShoutboxContent" target="chat">aktualisieren</a>]</noscript>
+			<b>{if $this->getUser()->userID}{$this->getUser()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}</b> &raquo;
+			<input type=text name="message" size="60" class="input">
+			<input type=submit value="Senden" class="input">
+		</span>
+	</form>
+{/if}
+</td></tr>
+</table>

work/images/shoutboxIcon16x16.psd

Added
New image

work/images/shoutboxIcon16x24.psd

Added
New image

work/images/shoutboxIcon24x24.psd

Added
New image

work/images/shoutboxIcon48x48.psd

Added
New image