Commits

Christian Fischer committed c18403a

Shoutbox v0.8 RC1

UserOnlineMarking für Benutzernamen
ShoutboxOnIndex
Sprachen FR und TR
Viele bugfixes

  • Participants
  • Parent commits 72bffdc

Comments (0)

Files changed (53)

File incendium/dist/net.northshirebund.wbb.shoutbox.portalbox.incendium-0.8.tar

Binary file added.

File incendium/dist/net.northshirebund.wbb.shoutbox.portalbox.incendium-0.8.tar.gz

Binary file added.

File incendium/dist/net.northshirebund.wbb.shoutbox.portalbox.incendium-0.8.zip

Binary file added.

File incendium/files/lib/data/boxsystem/ShoutboxBox.class.php

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 
 class ShoutboxBox {
 	protected $shoutboxBoxData = array();

File incendium/package.xml

     <packageInformation>
         <packageName><![CDATA[Shoutbox [Incendium CMS Box]]]></packageName>
         <packageDescription><![CDATA[Incendium-Shoutbox]]></packageDescription>
-        <version>0.7</version>
+        <version>0.8</version>
 		<plugin>wbb3mods.wcf.boxsystem</plugin>
         <standalone>0</standalone>
         <isUnique>1</isUnique>
     </authorInformation>
     
     <requiredPackages>
- 		<requiredpackage minversion="1.0.0 Beta 1">wbb3mods.wcf.boxsystem</requiredpackage>
+ 		<requiredpackage minversion="1.0.0">wbb3mods.wcf.boxsystem</requiredpackage>
         <requiredPackage minversion="0.7">net.northshirebund.wbb.shoutbox</requiredPackage>
     </requiredPackages>
     
 	<addfiles>
+		<lang list="de,de-informal,en,it,fr,tr"				/>
     	<file type="tar" tag="files"		src="files/"	/>
 		<file name="config/boxsystem.xml"					/>
     </addfiles>
 	
 	<instructions type="install"/>
  	<instructions type="update"	fromversion="0.6"	/>
+  	<instructions type="update"	fromversion="0.7"	/>
    
 </package>

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta2.tar

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta2.tar.gz

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta3.tar

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta3.tar.gz

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta4.tar

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta4.tar.gz

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta5.tar

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_Beta5.tar.gz

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_RC1.tar

Binary file added.

File shoutbox/dist/net.northshirebund.wbb.shoutbox-0.8_RC1.tar.gz

Binary file added.

File shoutbox/files/js/shoutbox.js

+
+	var shoutboxAjaxRequest = null;
+	var lastmessage         = 0;
+	var queuedmessage       = null;
+	var timerPending        = false;
+	var sbcontent           = null;
+	var sbRequestParams     = null;
+	var sbCallback          = null;
+	var sbPageUrl           = null;
+	var sbSession           = null;
+	var sbOptReload         = 0;
+	var sbOptOrderAsc       = 0;
+	var sbOptWidth          = '100%';
+	var sbOptHeight         = '150px';
+	
+	
+	function initShoutbox(w, h, reload, order, url, sid, iframeheader) {
+		sbOptReload   = reload * 1000;
+		sbOptOrderAsc = order;
+		sbPageUrl     = url;
+		sbSession     = '&s=' + sid;
+		sbOptWidth    = w;
+		sbOptHeight   = h;
+		
+		// prepare div element
+		sbcontent           = document.getElementById('shoutboxcontent');
+		sbcontent.innerHTML = '<iframe src="about:blank" id="shoutboxcontentframe" name="shoutboxcontentframe" scrolling="auto" frameborder="0" allowtransparency="true" style="background-color:transparent; width:100%; height:' + sbOptHeight + '; border:0px;"></iframe>';
+		frames.shoutboxcontentframe.document.write('\x3chtml\x3e\x3chead\x3e' + iframeheader + '\x3c/head\x3e\x3cbody style="margin:0px; padding:0px;"\x3e<div class="shoutboxMessageFrame shoutboxFrameInner container-2" style="margin:0px; padding:0px; position:absolute; top:0px; left:0px; width:100%; height:100%;"><div id="shoutboxcontent" class="shoutboxMessageFrame shoutboxFrameInner container-2 smallFont" style="text-align:left; margin:0px; padding:0px;"></div></div>\x3c/body\x3e\x3c/html\x3e');
+		frames.shoutboxcontentframe.document.close();
+		sbcontent = null;
+		
+		// start shoutbox
+		setTimeout('shoutboxTimer()', 250);
+		
+		return;
+	}
+	
+	
+	function setShoutboxCallback(cb) {
+		sbCallback = cb;
+		return;
+	}
+	
+	
+	function shoutboxTimer() {
+		if (this.sbcontent == null) {
+			this.sbcontent = frames.shoutboxcontentframe.document.getElementById('shoutboxcontent');
+		}
+		
+		this.timerPending = false;
+		sendShoutboxAjaxRequest();
+		
+		return;
+	}
+	
+	
+	function sendShoutboxAjaxRequest() {
+		if(this.shoutboxAjaxRequest == null) {
+			var appendmessage = '';
+			
+			if(this.sbRequestParams != null) {
+				appendmessage += '&' + this.sbRequestParams;
+			}
+			
+			if(this.queuedmessage != null) {
+				appendmessage += '&message=' + encodeURIComponent(this.queuedmessage);
+				this.queuedmessage = null;
+			
+				if(document.getElementById('shoutboxGuestName') != null) {
+					appendmessage += '&guestname=' + encodeURIComponent(document.getElementById('shoutboxGuestName').value);
+				}
+			}
+			
+			this.shoutboxAjaxRequest = new AjaxRequest();
+			return this.shoutboxAjaxRequest.openPost(
+								sbPageUrl + '/index.php?page=ShoutboxContent&output=xml' + sbSession,
+								'since=' + this.lastmessage + appendmessage,
+								function() { handleShoutboxContentRequest(); }
+			);
+		}
+		
+		return true;
+	}
+	
+	function sendShoutboxMessage() {
+		this.queuedmessage = document.getElementById('shoutboxMessage').value;
+		document.getElementById('shoutboxMessage').value='';
+		return !sendShoutboxAjaxRequest();
+	}
+	
+	function handleShoutboxContentRequest() {
+		if (this.shoutboxAjaxRequest && this.shoutboxAjaxRequest.xmlHttpRequest.readyState == 4) {
+			if(this.shoutboxAjaxRequest.xmlHttpRequest.status == 200 && this.shoutboxAjaxRequest.xmlHttpRequest.responseXML) {
+				var lines = this.shoutboxAjaxRequest.xmlHttpRequest.responseXML.getElementsByTagName('lines');
+				
+				if(lines.length > 0) {
+					var newContent = '';
+					
+					if (this.sbCallback != null) {
+						this.sbCallback(lines[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(sbOptOrderAsc == 1) {
+										newContent = newContent + node.nodeValue + '<br/>';
+									}
+									else {
+										newContent = node.nodeValue + '<br/>' + newContent;
+									}
+								}
+								else if(line.tagName == 'last') {
+									this.lastmessage = node.nodeValue;
+								}
+							}
+						}
+					}
+					
+					if(sbOptOrderAsc == 1) {
+						this.sbcontent.innerHTML = this.sbcontent.innerHTML + newContent;
+					}
+					else {
+						this.sbcontent.innerHTML = newContent + this.sbcontent.innerHTML;
+					}
+				}
+				
+				if(sbOptOrderAsc == 1) {
+					// scroll the frame to the bottom
+					frames.shoutboxcontentframe.scrollTo(0, 999999);
+				}
+				
+				// request was successfully handled...
+				this.shoutboxAjaxRequest.xmlHttpRequest.abort();
+				this.shoutboxAjaxRequest = null;
+				
+				// if a message was queued, send another request immediately
+				if(this.queuedmessage) {
+					sendShoutboxAjaxRequest();
+				}
+				else if(sbOptReload > 0 && !this.timerPending) {
+					this.timerPending = true;
+					setTimeout('shoutboxTimer()', sbOptReload);
+				}
+			}
+		}
+		
+		return;
+	}
+	
+	function sbWhisperTo(name) {
+		document.getElementById('shoutboxMessage').value = '/w "' + name + '" ' + document.getElementById('shoutboxMessage').value;
+		return;
+	}
+	
+	function sbDeleteMsg(msgid) {
+		var line = frames.shoutboxcontentframe.document.getElementById('sbLine' + msgid);
+		var msg  = frames.shoutboxcontentframe.document.getElementById('sbMsg' + msgid);
+		var text = msg.innerHTML.replace(/[\n\r]/g, ' ').replace(/\<.*?\>/g, '');
+		
+		if(confirm(langShoutboxDeleteConfirm + '\n' + text)) {
+			// delete linebreak
+			line.parentNode.removeChild(line.nextSibling);
+			
+			// delete message node
+			line.parentNode.removeChild(line);
+			
+			// send delete command
+			var ajaxRequest = new AjaxRequest();
+			ajaxRequest.openPost(
+								'index.php?page=ShoutboxContent&output=none' + sbSession,
+								'delete=' + msgid,
+								function() { }
+			);
+
+		}
+		
+		return;
+	}
+	
+

File shoutbox/files/lib/acp/page/ShoutboxDeleteMessagesPage.class.php

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 // wcf imports
 require_once(WCF_DIR.'lib/page/AbstractPage.class.php');
 

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

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 // wcf imports
 require_once(WCF_DIR.'lib/page/SortablePage.class.php');
 

File shoutbox/files/lib/page/ShoutboxContentPage.class.php

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 require_once(WCF_DIR.'lib/page/AbstractPage.class.php');
 require_once(WCF_DIR.'lib/system/event/EventHandler.class.php');
 require_once(WCF_DIR.'lib/util/ShoutboxUtil.class.php');
 			// show template
 			if($this->output == 'xml') {
 				if (!empty($this->templateNameXml)) {
+					$data = WCF::getTPL()->fetch($this->templateNameXml, false);
 					header('Content-type: text/xml');
-					WCF::getTPL()->display($this->templateNameXml, false);
-					
-					/*
-					echo "<?xml version=\"1.0\" encoding=\"".CHARSET."\"?>\n<lines>\n";
-					
-					foreach($this->messages as $message) {
-						WCF::getTPL()->assign('message', $message);
-						echo '<line><![CDATA['.StringUtil::escapeCDATA(WCF::getTPL()->fetch('shoutboxFormattedMessage'))."]]></line>\n";
-					}
-					
-					if($this->errormessage) {
-						echo '<line><![CDATA['.StringUtil::escapeCDATA($this->errormessage)."]]></line>\n";
-					}
-					
-					if ($censoredWords = WCF::getTPL()->get('censoredWords')) {
-						echo '<line><![CDATA['.StringUtil::escapeCDATA(
-								WCF::getLanguage()->get(
-									'wcf.message.error.censoredWordsFound',
-									array('censoredWords' => $censoredWords)
-								)
-							).
-							"]]></line>\n"
-						;
-					}
-					
-					if ($this->getOnlineList) {
-						require_once(WCF_DIR.'lib/data/user/usersOnline/UsersOnlineList.class.php');
-						$usersOnlineList = new UsersOnlineList("requestURI like '%page=Shoutbox%'", true);
-						$usersOnlineList->getUsersOnline();
-						
-						if ($usersOnlineList->getUsersOnlineTotal()) {
-							echo '<onlineList><![CDATA[';
-							echo StringUtil::escapeCDATA('<p class="smallFont">'.WCF::getLanguage()->get('wbb.index.usersOnline.detail', array()).'</p>');
-							
-							foreach ($usersOnlineList->usersOnline as $userOnline) {
-								echo StringUtil::escapeCDATA(
-									'<a href="index.php?page=User&amp;userID='.$userOnline['userID'].SID_ARG_2ND.'">'.$userOnline['username'].'</a>');
-							}
-							
-							echo ']]></onlineList>';
-						}
-					}
-					
-					echo "\n<last>".$this->lastmessage."</last>\n";
-					echo "</lines>";
-					*/
+					header('Content-Length: '.strlen($data));
+					echo $data;
 					exit;
 				}
 			}

File shoutbox/files/lib/system/cache/CacheBuilderShoutbox.class.php

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 require_once(WCF_DIR.'lib/system/cache/CacheBuilder.class.php');
 
 /**
 		
 		$messages    = array();
 		$lastmessage = 0;
+		$count       = 0;
 		
 		$sql = '
 			SELECT		sb.*, 
 						u.userID, u.username,
+						g.userOnlineMarking,
 						u2.username AS to_username
 			FROM 		wcf'.WCF_N.'_shoutbox	sb
-			LEFT JOIN	wcf'.WCF_N.'_user		u
-			USING		(userid)
-			LEFT JOIN	wcf'.WCF_N.'_user		u2
-			ON			(sb.to_user = u2.userID)
+			LEFT JOIN	wcf'.WCF_N.'_user		u	USING	(userid)
+			LEFT JOIN	wcf'.WCF_N.'_group		g	ON		(u.userOnlineGroupID = g.groupID)
+			LEFT JOIN	wcf'.WCF_N.'_user		u2	ON		(sb.to_user = u2.userID)
 			ORDER BY 	message_time DESC
 		';		
 		
 			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);
+				$message = preg_replace('/\[url=\'?([a-zA-Z]+\:\/\/.+?)\'?\](.+?)\[\/url\]/', '<a href="\1" target="_blank">\2</a>', $message);
+				$message = preg_replace('/\[url=\'?(.+?)\'?\](.+?)\[\/url\]/', '<a href="http://\1" target="_blank">\2</a>', $message);
 			}
 			else {
 				// reg exp to add target="_blank" to urls
 			$row['message_text'] = $message;
 			
 			// encode username
-			$row['username'] = StringUtil::encodeHTML($row['username']);
+			$row['rawusername'] = StringUtil::encodeHTML($row['username']);
+			$row['username']    = StringUtil::encodeHTML($row['username']);
+			
+			if ($row['to_user']) {
+				$row['to_username'] = StringUtil::encodeHTML($row['to_username']);
+			}
+			
+			if (SHOUTBOX_USE_USERONLINEMARKING) {
+				$row['username']    = preg_replace('/%s/', $row['username'], $row['userOnlineMarking']);
+			}
 			
 			array_push($messages, $row);
 			
 			$lastmessage = max($lastmessage, $row['message_time']);
+			
+			if($row['to_user'] == 0) {
+				if(++$count > SHOUTBOX_MESSAGECOUNT) {
+					break;
+				}
+			}
 		}
 		
 		$data = Array(

File shoutbox/files/lib/util/ShoutboxUtil.class.php

 <?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
 require_once(WCF_DIR.'lib/util/StringUtil.class.php');
 
 
 	 *                or 0 if it should be sent to all users.
 	 */
 	public static function addMessage($message, $toUser=0) {
-		$guestname = 'NULL';
+		$guestname = null;
 		
 		// set guestname, only for guests, of course
 		if(WCF::getUser()->userID == 0) {
 			if(isset($_REQUEST['guestname']) and !empty($_REQUEST['guestname'])) {
 				$new_name = trim($_REQUEST['guestname']);
 				
+				if(CHARSET != 'UTF-8') {
+					$new_name = StringUtil::convertEncoding('UTF-8', CHARSET, $new_name);
+				}
+				
 				if($new_name == WCF::getLanguage()->get('net.northshirebund.wbb.shoutbox.guest')) {
 					// 'Guest' as username is handled in the same way as an empty name
 				}
 			}
 			
 			// if the user has still no username, we select a random number as his name
-			if($guestname == 'NULL') {
+			if($guestname == null) {
 				WCF::getSession()->setUsername($guestname = strval(rand(100, 999)));
 			}
-			
-			// quote the name for the SQL query
-			$guestname = "'$guestname'";
 		}
 		
 		// store the message in the database
 		WCF::getDB()->sendQuery("
 			INSERT INTO wcf".WCF_N."_shoutbox(userid,guest_name,to_user,message_text,message_time,message_ip)
-			VALUES ('".WCF::getUser()->userID."',$guestname,'$toUser','".escapeString($message)."','".TIME_NOW."', '".UserUtil::getIpAddress()."')"
+			VALUES (
+					'".WCF::getUser()->userID."',
+					".(($guestname == null) ? 'NULL' : ("'".($guestname)."'")).",
+					'$toUser',
+					'".escapeString($message)."',
+					'".TIME_NOW."',
+					'".UserUtil::getIpAddress()."'
+			)"
 		);
 		
 		// get the ID of the new message and delete old messages
 	
 	/**
 	 * Returns an array of messages from the shoutbox cache.
-	 * The result contains only messages which are visible to the current user.
+	 * The result contains only messages which are visible to the current user. This means, the result doesn't contain
+	 * messages which are whispered to other users and is empty if the current user has no reading permission.
 	 */
-	public static function getCachedMessages($beginAt, $count=9999) {
+	public static function getCachedMessages($beginAt, $maxMessages=SHOUTBOX_MESSAGECOUNT) {
 		WCF::getCache()->addResource('shoutbox', WCF_DIR.'cache/cache.shoutbox.php', WCF_DIR.'lib/system/cache/CacheBuilderShoutbox.class.php');
 		$messages = array();
 		
-		if ($beginAt < WCF::getCache()->get('shoutbox', 'lastmessage')) {
+		if (
+			($beginAt < WCF::getCache()->get('shoutbox', 'lastmessage'))
+		and	(WCF::getUser()->getPermission('user.shoutbox.canRead'))
+		) {
 			$cachemessages    = WCF::getCache()->get('shoutbox', 'messages');
 			$canWhisper       = WCF::getUser()->getPermission('user.shoutbox.canWhisper');
 			$guestname        = WCF::getLanguage()->get('net.northshirebund.wbb.shoutbox.guest');
 			
 			foreach($cachemessages as $message) {
 				if($message['message_time'] <= $beginAt) break;
-				if(++$counter > SHOUTBOX_MESSAGECOUNT) break;
+				if($counter > $maxMessages) break;
 				
 				// incoming whispers
 				if ($message['to_user'] != 0 && $message['to_user'] == WCF::getUser()->userID) {
 					else {
 						$message['username'] = $guestname;
 					}
+					
+					$message['username'] = StringUtil::encodeHTML($message['username']);
 				}
 				
 				// set whisperable username, if the current user is able to whisper
 				#$message['username'] = StringUtil::encodeHTML($message['username']);
 				
 				if ($message['userID'] != 0 && $message['userID'] != WCF::getUser()->userID && $canWhisper) {
-					$message['username_whisper'] = '<a href="javascript:parent.sbWhisperTo(\''.$message['username'].'\');">'.$message['username'].'</a>';
+					$message['username_whisper'] = '<a href="javascript:parent.sbWhisperTo(\''.$message['rawusername'].'\');">'.$message['username'].'</a>';
 				}
 				else {
 					$message['username_whisper'] = $message['username'];
 				}
 				
 				$messages []= $message;
+				$counter++;
 			}
-			
 		}
 		
 		return $messages;

File shoutbox/package.xml

     <packageInformation>
         <packageName>Shoutbox</packageName>
         <packageDescription>Ein Chat-Frame</packageDescription>
-        <version>0.8 Beta1</version>
+        <version>0.8 RC1</version>
         <promptParent>com.woltlab.wcf</promptParent>
         <standalone>0</standalone>
         <isUnique>1</isUnique>
     
     <optionalPackages>
     	<optionalPackage build="shoutbox/wbb3page"/>
+    	<optionalPackage build="shoutbox/wbbshoutboxonindex"/>
     	<optionalPackage build="shoutbox/wbb3modsportalbox2"/>
     	<optionalPackage build="shoutbox/incendium"/>
     </optionalPackages>
     
     <addfiles>
+		<lang list="de,de-informal,en,it,fr,tr"						/>
+		
     	<file name="script/install/acpmenu.xml"						/>
     	<file name="script/install/options.xml"						/>
 		<file name="script/install/pagelocation.xml"				/>
 	<instructions type="update"	fromversion="0.7 Beta1"	/>
 	<instructions type="update"	fromversion="0.7"		/>
 	<instructions type="update"	fromversion="0.7.1"		/>
+	<instructions type="update"	fromversion="0.8 Beta1"	/>
+	<instructions type="update"	fromversion="0.8 Beta2"	/>
+	<instructions type="update"	fromversion="0.8 Beta3"	/>
+	<instructions type="update"	fromversion="0.8 Beta4"	/>
+	<instructions type="update"	fromversion="0.8 Beta5"	/>
    
 </package>

File shoutbox/script/install/options.xml

 				<optiontype>boolean</optiontype>
 				<defaultvalue><![CDATA[0]]></defaultvalue>
 			</option>
+			<option name="shoutbox_use_useronlinemarking">
+				<categoryname>shoutbox.options</categoryname>
+				<optiontype>boolean</optiontype>
+				<defaultvalue><![CDATA[0]]></defaultvalue>
+			</option>
 			<option name="shoutbox_enable_ajax">
 				<categoryname>shoutbox.options</categoryname>
 				<optiontype>boolean</optiontype>

File shoutbox/templates/shoutboxContentXml.tpl

 <?xml version="1.0" encoding="{CHARSET}"?>
 <lines>
 {foreach from=$messages item=message}
-	<line><![CDATA[{include file="shoutboxFormattedMessage"}]]></line>
+	{capture assign=msg}{include file="shoutboxFormattedMessage"}{/capture}<line><![CDATA[{@$msg}]]></line>
 {/foreach}
 {if $errormessage}
 	<line><![CDATA[{@$errormessage}]]></line>
 {if $censoredWords|isset}
 	<line><![CDATA[{lang}wcf.message.error.censoredWordsFound{/lang}]]></line>
 {/if}
-	<last>{$lastmessage}</last>
-	{if $usersOnlineTotal|isset}
-		<onlineList><![CDATA[
-		<p class="smallFont">{lang}wbb.index.usersOnline.detail{/lang}</p>
-		{if $usersOnline|count}
-			<p class="smallFont">{implode from=$usersOnline item=userOnline}<a href="index.php?page=User&amp;userID={@$userOnline.userID}{@SID_ARG_2ND}">{@$userOnline.username}</a>{/implode}</p>
-		{/if}
-		]]></onlineList>
+	<last>{@$lastmessage}</last>
+{if $usersOnlineTotal|isset}
+	<onlineList><![CDATA[
+	<p class="smallFont">{lang}wbb.index.usersOnline.detail{/lang}</p>
+	{if $usersOnline|count}
+		<p class="smallFont">{implode from=$usersOnline item=userOnline}<a href="index.php?page=User&amp;userID={@$userOnline.userID}{@SID_ARG_2ND}">{@$userOnline.username}</a>{/implode}</p>
 	{/if}
+	]]></onlineList>
+{/if}
 </lines>

File shoutbox/templates/shoutboxCore.tpl

+{*
+<div id="shoutboxcontent" style="margin:5px; padding:0px;">
+	{fetchshoutbox assign=messages count=20}
+	{assign var=canInlineDelete value=$this->getUser()->getPermission('mod.shoutbox.canInlineDelete')}
+	{foreach item=message from=$messages}
+		{include file="shoutboxFormattedMessage"}<br/>
+	{/foreach}
+</div>
+*}
 <div id="shoutboxcontent" style="margin:5px; padding:0px;">
 	{if SHOUTBOX_ENABLE_AJAX}<noscript>{/if}
 		<div style="margin:0px; padding:0px;"><iframe name="chat" src="index.php?page=ShoutboxContent" scrolling="auto" frameborder="0" allowtransparency="true" style="width:100%; height:{if $height|isset}{@$height}{else}{SHOUTBOX_DEFAULTHEIGHT}{/if}; border:0px;"></iframe></div>
 	<script type="text/javascript">
 	//<![CDATA[
 		
+		var langShoutboxDeleteConfirm		= "{lang}net.northshirebund.wbb.shoutbox.deleteConfirm{/lang}";
+		
 		initShoutbox(
+					'{if $width|isset}{@$width}{else}{SHOUTBOX_DEFAULTWIDTH}{/if}',
+					'{if $height|isset}{@$height}{else}{SHOUTBOX_DEFAULTHEIGHT}{/if}',
 					{@SHOUTBOX_RELOADTIME},
 					{@SHOUTBOX_MESSAGEORDER_ASC},
+					"{@PAGE_URL}",
 					"{@$this->getSession()->sessionID}",
 					'<link rel="stylesheet" type="text/css" media="screen" href="{@RELATIVE_WCF_DIR}style/style-{@$this->getStyle()->styleID}.css" />'
 		);

File shoutbox/templates/shoutboxFormattedMessage.tpl

 <span id="sbLine{$message['message_id']}">
 {if $canInlineDelete}
-	<a href="index.php?page=ShoutboxContent&delete={$message['message_id']}{SID_ARG_2ND}" onClick="parent.sbDeleteMsg({$message['message_id']}); return false;"><img src="{@RELATIVE_WCF_DIR}icon/pmDeleteS.png" alt="{lang}net.northshirebund.wbb.shoutbox.delete{/lang}"></a>
+	<a href="index.php?page=ShoutboxContent&delete={@$message['message_id']}{SID_ARG_2ND}" onClick="parent.sbDeleteMsg({@$message['message_id']}); return false;"><img src="{@RELATIVE_WCF_DIR}icon/pmDeleteS.png" alt="{lang}net.northshirebund.wbb.shoutbox.delete{/lang}"></a>
 {/if}
-<span class="light">[{@$message['message_time']|shorttime}]</span><span class="{$message['class']}" id="sbMsg{$message['message_id']}">
+<span class="light">[{@$message['message_time']|shorttime}]</span><span class="{@$message['class']}" id="sbMsg{@$message['message_id']}">
 {if $message['isEmote']}
 	{$message['username']}
 {else if $message['isWhisperIn']}

File shoutbox/templates/shoutboxFrame.tpl

 {if $this->getUser()->getPermission('user.shoutbox.canRead')}
-<table class="shoutboxFrame container-1" cellpadding="0" cellspacing="0" border="0" style="width:{if $width|isset}{$width}{else}{SHOUTBOX_DEFAULTWIDTH}{/if};">
-<tr style="height:100%;"><td>
-	<table cellpadding="4" cellspacing="4" border="0" style="width:100%; height:100%;">
-	<tr>
-	{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'l' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
-		<td class="border shoutboxFrameInner container-2" id="shoutboxsmileys" style="display:none;">
-			{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}
-		</td>
-	{/if}
-		<td class="border shoutboxMessageFrame shoutboxFrameInner container-2" id="shoutboxcontainer" style="width:100%; height:100%;">
-			{include file="shoutboxCore"}
-		</td>
-	{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'r' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
-		<td class="border shoutboxFrameInner container-2" id="shoutboxsmileys" style="display:none;">
-			{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}
-		</td>
-	{/if}
-	</tr>
-	</table>
-</td></tr>
-<tr><td>
-{if $this->getUser()->getPermission('user.shoutbox.canWrite')}
-	<form action="index.php" method="post" target="chat" onsubmit="return sendShoutboxMessage();">
-		<table style="width:80%;">
+<div class="shoutboxFrame container-1" style="width:{if $width|isset}{$width}{else}{SHOUTBOX_DEFAULTWIDTH}{/if};">
+	<div>
+		<table cellpadding="4" cellspacing="4" border="0" style="width:100%; height:100%;">
 		<tr>
-			<td><noscript><div style="margin:0px; padding:0px;">[<a href="index.php?page=ShoutboxContent" target="chat">{lang}net.northshirebund.wbb.shoutbox.refresh{/lang}</a>]</div></noscript></td>
-			{if $this->getUser()->userID}
-			<td><b>{if $this->getUser()->userID}{$this->getUser()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}</b>&nbsp;&raquo;</td>
-			{else}
-			<td style="width:75px;"><input type="text" id="shoutboxGuestName" name="shoutboxGuestName" size="25" value="{if $this->getSession()->username}{$this->getSession()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}" class="inputText" style="width:75px;"/></td>
-			{/if}
-			<td style="width:100%;"><input type="text" id="shoutboxMessage" name="message" size="60" class="inputText"/></td>
-			<td>
-				<input type="hidden" name="page" value="ShoutboxContent"/>
-				<input type="hidden" name="s" value="{SID}"/>
-				<input type="submit" value="{lang}net.northshirebund.wbb.shoutbox.send{/lang}" class="input"/>
+		{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'l' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
+			<td class="border shoutboxFrameInner container-2" id="shoutboxsmileys" style="display:none;">
+				{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}
 			</td>
+		{/if}
+			<td class="border shoutboxMessageFrame shoutboxFrameInner container-2" id="shoutboxcontainer" style="width:100%; height:100%;">
+				{include file="shoutboxCore"}
+			</td>
+		{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'r' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
+			<td class="border shoutboxFrameInner container-2" id="shoutboxsmileys" style="display:none;">
+				{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}
+			</td>
+		{/if}
 		</tr>
 		</table>
-	</form>
-{/if}
-</td></tr>
-{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'b' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
-	<tr><td><div class="border shoutboxFrameInner container-2" style="margin:4px;">{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}</div></td></tr>
-{/if}
-</table>
+	</div>
+	{if $this->getUser()->getPermission('user.shoutbox.canWrite')}
+	<div>
+		<form action="index.php" method="post" target="chat" onsubmit="return sendShoutboxMessage();">
+			<table style="width:80%;">
+			<tr>
+				<td><noscript><div style="margin:0px; padding:0px;">[<a href="index.php?page=ShoutboxContent" target="chat">{lang}net.northshirebund.wbb.shoutbox.refresh{/lang}</a>]</div></noscript></td>
+				{if $this->getUser()->userID}
+				<td style="white-space:nowrap;"><b>{$this->getUser()->username}</b>&nbsp;&raquo;</td>
+				{else}
+				<td style="width:75px;"><input type="text" id="shoutboxGuestName" name="shoutboxGuestName" size="25" value="{if $this->getSession()->username}{$this->getSession()->username}{else}{lang}net.northshirebund.wbb.shoutbox.guest{/lang}{/if}" class="inputText" style="width:75px;"/></td>
+				{/if}
+				<td style="width:100%;"><input type="text" id="shoutboxMessage" name="message" size="60" class="inputText"/></td>
+				<td>
+					<input type="hidden" name="page" value="ShoutboxContent"/>
+					<input type="hidden" name="s" value="{SID}"/>
+					<input type="image" class="inputImage" src="{@RELATIVE_WCF_DIR}icon/submitS.png" alt="{lang}net.northshirebund.wbb.shoutbox.send{/lang}"/>
+				</td>
+			</tr>
+			</table>
+		</form>
+	</div>
+	{/if}
+	{if SHOUTBOX_SMILEYBOX_ORIENTATION == 'b' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
+		<div class="border shoutboxFrameInner container-2" id="shoutboxsmileys" style="margin:4px; display:none;">
+			{include file="smileybox" cols=SHOUTBOX_SMILEYBOX_COLS rows=SHOUTBOX_SMILEYBOX_ROWS width=SHOUTBOX_SMILEYBOX_WIDTH height=SHOUTBOX_SMILEYBOX_HEIGHT target="shoutboxMessage"}
+		</div>
+	{/if}
+</div>
 {if SHOUTBOX_SMILEYBOX_ORIENTATION != 'n' && $this->getUser()->getPermission('user.shoutbox.canWrite')}
 <script type="text/javascript">
 //<![CDATA[

File shoutbox/templates/shoutboxSmallFrame.tpl

 			<td style="width:100%;"><input type="text" id="shoutboxMessage" name="message" size="18" class="inputText"/></td>
 			<td>
 				<input type="hidden" name="page" value="ShoutboxContent"/>
-				<input type="submit" value="&raquo;" class="input"/>
+				<input type="image" class="inputImage" src="{@RELATIVE_WCF_DIR}icon/submitS.png" alt="{lang}net.northshirebund.wbb.shoutbox.send{/lang}"/>
 			</td>
 		</tr>
 		</table>

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.1.tar

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.1.zip

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.2.1.tar

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.2.1.zip

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.2.tar

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.2.zip

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.4.tar

Binary file removed.

File wbb3modsportalbox/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.4.zip

Binary file removed.

File wbb3modsportalbox/files/lib/data/boxes/ShoutboxBox.class.php

-<?php
-
-class ShoutboxBox {
-	protected $shoutbox = array();
-	
-	public function __construct($data, $boxname = "") {
-		$this->shoutbox['templatename'] = "shoutboxBox";
-		//$this->shoutbox['data'] = WBBCore::getCache()->get('box-'.$data['boxID']);
-	}
-
-
-	public function getData() {
-		return $this->shoutbox;
-	}
-}
-
-?>

File wbb3modsportalbox/package.properties

-package.id=net.northshirebund.wbb.shoutbox.portalbox.wbb3mods
-package.name=Shoutbox (wbb3mods.de-Portal)
-package.description=Shoutbox-Portalmodul f�r das wbb3mods.de-Portal
-package.version=0.4
-
-package.author.name=Christian Fischer
-package.author.url=www.northshirebund.net
-
-package.parent=com.woltlab.wbb
-package.unique=1
-package.standalone=0
-
-package.dependencities=						\
-	com.woltlab.wcf(1.0.0 Beta4);			\
-	net.northshirebund.wbb.shoutbox(0.4);	\
-	de.wbb3mods.wbb.portal(1.0.0 Beta2)
-
-package.optionalPackages=
-
-package.updateableFrom=			\
-	0.1; 0.2; 0.2.1; 0.3

File wbb3modsportalbox/package.xml

-<?xml version="1.0" encoding="UTF-8"?>
-<package name="net.northshirebund.wbb.shoutbox.portalbox.wbb3mods">
-    <packageInformation>
-        <packageName><![CDATA[Shoutbox [wbb3mods.de-Portal]]]></packageName>
-        <packageDescription><![CDATA[Shoutbox-Portalmodul fuer das wbb3mods.de-Portal]]></packageDescription>
-        <version>0.4</version>
-        <promptParent>com.woltlab.wbb</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 Beta2">de.wbb3mods.wbb.portal</requiredPackage>
-        <requiredPackage minversion="0.5 Beta6">net.northshirebund.wbb.shoutbox</requiredPackage>
-    </requiredPackages>
-    
-   <addfiles>
-    	<file type="tar" tag="files"		src="files/"			/>
-    </addfiles>
-    
-    <instructions type="update"	fromversion="0.2"	/>
-    <instructions type="update"	fromversion="0.2.1"	/>
-    <instructions type="update"	fromversion="0.3"	/>
-    
-</package>

File wbb3modsportalbox/script/install/install.sql

-INSERT INTO wbb1_1_portalboxes(boxID, boxName, boxType, useCache, className, cacheBuilderClass, sortOrder) VALUES (NULL, 'shoutbox', 1, 0, 'ShoutboxBox', '', 1);

File wbb3modsportalbox2/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.8.tar

Binary file added.

File wbb3modsportalbox2/dist/net.northshirebund.wbb.shoutbox.portalbox.wbb3mods-0.8.tar.gz

Binary file added.

File wbb3modsportalbox2/files/lib/data/boxes/ShoutboxBox.class.php

-<?PHP
+<?php
+/***************************************************************************
+ *   Copyright (C) 2007 by Christian Fischer                               *
+ *   christian@fi12.de                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 2 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+
 class ShoutboxBox {
 	protected $boxdata = array();
 

File wbb3modsportalbox2/package.xml

 	<packageInformation>
 		<packageName><![CDATA[Shoutbox [wbb3mods.de-Portal]]]></packageName>
 		<packageDescription><![CDATA[Shoutbox-Portalmodul fuer das wbb3mods.de-Portal]]></packageDescription>
-		<plugin>de.wbb3mods.wbb.portal</plugin>
-		<version>0.2</version>
+		<plugin>com.woltlab.wbb</plugin>
+		<version>0.8</version>
 	</packageInformation>
 
 	<authorinformation>
 	</requiredpackages>
 
 	<addfiles>
-		<file name="config/options.xml"						/>
+		<lang list="de,de-informal,en,it,fr,tr"					/>
+		
+		<file name="config/options.xml"							/>
 		<file name="config/portalbox.xml"						/>
 		<file name="config/useroptions.xml"						/>
+		
 		<file type="tar" tag="files"		src="files/"		/>
 		<file type="tar" tag="templates"	src="templates/"	/>
 	</addfiles>

File wbb3modsportalbox2/templates/shoutboxCenterWbb3modsPortalBox.tpl

-		<div class="border" id="box{$boxID}" style="border:5px red;">
+		<div class="border" id="box{$boxID}">
 			<div class="containerHead">
 				<div class="containerIcon">
 			    	<a href="javascript: void(0)" onclick="openList('shoutboxbox', true)">

File wbb3page/dist/net.northshirebund.wbb.shoutbox.page-0.8_RC1.tar

Binary file added.

File wbb3page/dist/net.northshirebund.wbb.shoutbox.page-0.8_RC1.tar.gz

Binary file added.

File wbb3page/package.xml

     <packageInformation>
         <packageName><![CDATA[Shoutbox [WBB3 Page]]]></packageName>
         <packageDescription><![CDATA[Erstellt eine neue Seite im Headermenue des WBB]]></packageDescription>
-        <version>0.8 Beta1</version>
+        <version>0.8</version>
         <promptParent>com.woltlab.wbb</promptParent>
         <standalone>0</standalone>
         <isUnique>1</isUnique>
     <requiredPackages>
         <requiredPackage minversion="3.0.0">com.woltlab.wbb</requiredPackage>
         <requiredPackage minversion="1.0.0">com.woltlab.wcf</requiredPackage>
-        <requiredPackage minversion="0.8 Beta1">net.northshirebund.wbb.shoutbox</requiredPackage>
+        <requiredPackage minversion="0.8 RC1">net.northshirebund.wbb.shoutbox</requiredPackage>
     </requiredPackages>
     
 	<addfiles>
+		<lang list="de,de-informal,en,it,fr,tr"						/>
     	<file name="script/install/headermenu.xml"					/>
     	<file name="script/install/options.xml"						/>
     	<file type="tar" tag="files"		src="files/"			/>
 	<instructions type="update"	fromversion="0.6"	/>
 	<instructions type="update"	fromversion="0.7 Beta1"	/>
 	<instructions type="update"	fromversion="0.7"	/>
+	<instructions type="update"	fromversion="0.8 Beta1"	/>
+	<instructions type="update"	fromversion="0.8 Beta2"	/>
+	<instructions type="update"	fromversion="0.8 Beta3"	/>
+	<instructions type="update"	fromversion="0.8 Beta4"	/>
     
 </package>

File wbbshoutboxonindex/dist/net.northshirebund.wbb.shoutbox.shoutboxonindex-0.8_RC1.tar

Binary file added.

File wbbshoutboxonindex/dist/net.northshirebund.wbb.shoutbox.shoutboxonindex-0.8_RC1.tar.gz

Binary file added.

File wbbshoutboxonindex/package.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<package name="net.northshirebund.wbb.shoutbox.shoutboxonindex">
+    <packageInformation>
+        <packageName>Shoutbox [ShoutboxOnIndex]</packageName>
+        <packageDescription>Zeigt die Shoutbox auf der Startseite des Forums an.</packageDescription>
+        <version>0.8</version>
+        <plugin>com.woltlab.wbb</plugin>
+        <standalone>0</standalone>
+        <isUnique>1</isUnique>
+    </packageInformation>
+    
+    <authorInformation>
+        <author>Christian Fischer</author>
+        <authorURL>www.northshirebund.net</authorURL>
+    </authorInformation>
+    
+    <requiredPackages>
+        <requiredPackage minversion="1.0.0">com.woltlab.wcf</requiredPackage>
+        <requiredPackage minversion="3.0.3">com.woltlab.wbb</requiredPackage>
+        <requiredPackage minversion="0.8 RC1">net.northshirebund.wbb.shoutbox</requiredPackage>
+    </requiredPackages>
+    
+	<instructions type="install">
+		<addfiles>
+			<patch name="index" first="patches/index.wbb.3.0.3.tpl" second="patches/index.modified.tpl" />
+		</addfiles>
+	</instructions>
+</package>

File wbbshoutboxonindex/patches/index.modified.tpl

+{include file="documentHeader"}
+<head>
+	<title>{lang}wbb.index.title{/lang} - {PAGE_TITLE}</title>
+	
+	{include file='headInclude' sandbox=false}
+	<script type="text/javascript" src="{@RELATIVE_WBB_DIR}js/BoardMarkAsRead.class.js"></script>
+	<link rel="alternate" type="application/rss+xml" href="index.php?page=Feed&amp;type=RSS2" title="RSS2" />
+	<link rel="alternate" type="application/atom+xml" href="index.php?page=Feed&amp;type=Atom" title="Atom" />
+</head>
+<body>
+{include file='header' sandbox=false}
+
+<div id="main">
+	
+	<div class="mainHeadline">
+		<img src="{@RELATIVE_WBB_DIR}icon/indexL.png" alt="" ondblclick="document.location.href=fixURL('index.php?page=Index&amp;action=markAsRead{@SID_ARG_2ND}')" title="{lang}wbb.index.markAsRead{/lang}" />
+		<div class="headlineContainer">
+			<h2>{PAGE_TITLE}</h2>
+			<p>{PAGE_DESCRIPTION}</p>
+		</div>
+	</div>
+	
+	{if $userMessages|isset}{@$userMessages}{/if}
+	
+	{include file="shoutboxBox"}
+	
+	{include file="boardList"}
+	
+	{if $usersOnlineTotal|isset || INDEX_ENABLE_STATS || $additionalBoxes|isset}
+		{cycle values='container-1,container-2' print=false advance=false}
+		<div class="border infoBox">
+			{if $usersOnlineTotal|isset}
+				<div class="{cycle}">
+					<div class="containerIcon"> <img src="{@RELATIVE_WCF_DIR}icon/membersM.png" alt="" /></div>
+					<div class="containerContent">
+						<h3><a href="index.php?page=UsersOnline{@SID_ARG_2ND}">{lang}wbb.index.usersOnline{/lang}</a></h3> 
+						<p class="smallFont">{lang}wbb.index.usersOnline.detail{/lang} {lang}wbb.index.usersOnline.record{/lang}</p>
+						{if $usersOnline|count}
+							<p class="smallFont">
+							{implode from=$usersOnline item=userOnline}<a href="index.php?page=User&amp;userID={@$userOnline.userID}{@SID_ARG_2ND}">{@$userOnline.username}</a>{/implode}
+							</p>
+							{if INDEX_ENABLE_USERS_ONLINE_LEGEND && $usersOnlineMarkings|count}
+								<p class="smallFont">
+								{lang}wcf.usersOnline.marking.legend{/lang} {implode from=$usersOnlineMarkings item=usersOnlineMarking}{@$usersOnlineMarking}{/implode}
+								</p>
+							{/if}
+						{/if}
+					</div>
+				</div>
+			{/if}
+			
+			{if INDEX_ENABLE_STATS}
+				<div class="{cycle}">
+					<div class="containerIcon"><img src="{@RELATIVE_WBB_DIR}icon/statisticsM.png" alt="" /></div>
+					<div class="containerContent">
+						<h3>{lang}wbb.index.stats{/lang}</h3> 
+						<p class="smallFont">{lang}wbb.index.stats.detail{/lang}</p>
+					</div>
+				</div>
+			{/if}
+			
+			{if $additionalBoxes|isset}{@$additionalBoxes}{/if}
+		</div>
+	{/if}
+	
+	<div class="pageOptions">
+		<a href="index.php?page=Index&amp;action=markAsRead{@SID_ARG_2ND}"><img src="{@RELATIVE_WBB_DIR}icon/boardMarkAsReadS.png" alt="" /> <span>{lang}wbb.index.markAsRead{/lang}</span></a>
+	</div>
+
+</div>
+
+{include file='footer' sandbox=false}
+
+</body>
+</html>

File wbbshoutboxonindex/patches/index.wbb.3.0.3.tpl

+{include file="documentHeader"}
+<head>
+	<title>{lang}wbb.index.title{/lang} - {PAGE_TITLE}</title>
+	
+	{include file='headInclude' sandbox=false}
+	<script type="text/javascript" src="{@RELATIVE_WBB_DIR}js/BoardMarkAsRead.class.js"></script>
+	<link rel="alternate" type="application/rss+xml" href="index.php?page=Feed&amp;type=RSS2" title="RSS2" />
+	<link rel="alternate" type="application/atom+xml" href="index.php?page=Feed&amp;type=Atom" title="Atom" />
+</head>
+<body>
+{include file='header' sandbox=false}
+
+<div id="main">
+	
+	<div class="mainHeadline">
+		<img src="{@RELATIVE_WBB_DIR}icon/indexL.png" alt="" ondblclick="document.location.href=fixURL('index.php?page=Index&amp;action=markAsRead{@SID_ARG_2ND}')" title="{lang}wbb.index.markAsRead{/lang}" />
+		<div class="headlineContainer">
+			<h2>{PAGE_TITLE}</h2>
+			<p>{PAGE_DESCRIPTION}</p>
+		</div>
+	</div>
+	
+	{if $userMessages|isset}{@$userMessages}{/if}
+	
+	{include file="boardList"}
+	
+	{if $usersOnlineTotal|isset || INDEX_ENABLE_STATS || $additionalBoxes|isset}
+		{cycle values='container-1,container-2' print=false advance=false}
+		<div class="border infoBox">
+			{if $usersOnlineTotal|isset}
+				<div class="{cycle}">
+					<div class="containerIcon"> <img src="{@RELATIVE_WCF_DIR}icon/membersM.png" alt="" /></div>
+					<div class="containerContent">
+						<h3><a href="index.php?page=UsersOnline{@SID_ARG_2ND}">{lang}wbb.index.usersOnline{/lang}</a></h3> 
+						<p class="smallFont">{lang}wbb.index.usersOnline.detail{/lang} {lang}wbb.index.usersOnline.record{/lang}</p>
+						{if $usersOnline|count}
+							<p class="smallFont">
+							{implode from=$usersOnline item=userOnline}<a href="index.php?page=User&amp;userID={@$userOnline.userID}{@SID_ARG_2ND}">{@$userOnline.username}</a>{/implode}
+							</p>
+							{if INDEX_ENABLE_USERS_ONLINE_LEGEND && $usersOnlineMarkings|count}
+								<p class="smallFont">
+								{lang}wcf.usersOnline.marking.legend{/lang} {implode from=$usersOnlineMarkings item=usersOnlineMarking}{@$usersOnlineMarking}{/implode}
+								</p>
+							{/if}
+						{/if}
+					</div>
+				</div>
+			{/if}
+			
+			{if INDEX_ENABLE_STATS}
+				<div class="{cycle}">
+					<div class="containerIcon"><img src="{@RELATIVE_WBB_DIR}icon/statisticsM.png" alt="" /></div>
+					<div class="containerContent">
+						<h3>{lang}wbb.index.stats{/lang}</h3> 
+						<p class="smallFont">{lang}wbb.index.stats.detail{/lang}</p>
+					</div>
+				</div>
+			{/if}
+			
+			{if $additionalBoxes|isset}{@$additionalBoxes}{/if}
+		</div>
+	{/if}
+	
+	<div class="pageOptions">
+		<a href="index.php?page=Index&amp;action=markAsRead{@SID_ARG_2ND}"><img src="{@RELATIVE_WBB_DIR}icon/boardMarkAsReadS.png" alt="" /> <span>{lang}wbb.index.markAsRead{/lang}</span></a>
+	</div>
+
+</div>
+
+{include file='footer' sandbox=false}
+
+</body>
+</html>