<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->
<html xmlns:wicket="http://wicket.apache.org">
	<wicket:head>
		<script type="text/javascript">
			function toggleChat() {
				var chat = $('#chat');
				$('#chat #controlBlock #control')
					.removeClass('ui-icon-carat-1-' + (chat.height() < 24 ? 'n' : 's'))
					.addClass('ui-icon-carat-1-' + (chat.height() < 24 ? 's' : 'n'));
				chat.animate({ height: chat.height() < 24 ? "320px" : "20px" }, 1000);
			}
			function addChatMessageInternal(m) {
				if (m && m.type == "chat") {
					var msg = $('<div><span class="from">' + m.msg.from + '</span><span class="date">'
							+ m.msg.sent + '</span>' + m.msg.message + '</div>');
					$('#messageArea').append(msg);
					msg[0].scrollIntoView();
				}
			}
			function addChatMessage(m) {
				if (m && m.type == "chat") {
					addChatMessageInternal(m)
					$('#messageArea').emoticonize();
				}
			}
			Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
				addChatMessage(jQuery.parseJSON(msg)); 
			});
		</script>
	</wicket:head>
	<wicket:panel>
		<div id="chat" class="ui-state-default">
			<div id="controlBlock" onclick="toggleChat();" class="ui-state-active clickable"><span id="control" class="ui-icon ui-icon-carat-1-n sort-icon"></span><span><wicket:message key="244"/></span></div>
			<div wicket:id="messages"></div>
			<form wicket:id="sendForm">
				<div wicket:id="toolbarContainer"></div>
				<table style="width: 100%">
					<tr>
						<td><div id="chatMessage" wicket:id="chatMessage"></div></td>
						<td style="width: 50px"><div wicket:id="send"><wicket:message key="220"/></div></td>
					</tr>
				</table>
			</form>
		</div>
	</wicket:panel>
</html>
