<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
<button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
<button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
{{if $is_owner}}
<form id="chat-destroy" method="post" action="chat">
<input type="hidden" name="room_name" value="{{$room_name}}" />
<input type="hidden" name="action" value="drop" />
<button class="btn btn-danger btn-xs" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$drop}}</button>
</form>
{{/if}}
</div>
<h2>{{$room_name}}</h2>
<div class="clear"></div>
</div>
<div id="chatContainer" class="section-content-wrapper">
<div id="chatTopBar">
<div id="chatLineHolder"></div>
</div>
<div class="clear"></div>
<div id="chatBottomBar" >
<form id="chat-form" method="post" action="#">
<input type="hidden" name="room_id" value="{{$room_id}}" />
<div class="form-group">
<textarea id="chatText" name="chat_text" class="form-control"></textarea>
</div>
<div id="chat-submit-wrapper">
<div id="chat-submit" class="dropup pull-right">
<button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-caret-up"></i></button>
<button class="btn btn-primary btn-sm" type="submit" id="chat-submit" name="submit" value="{{$submit}}">{{$submit}}</button>
<ul class="dropdown-menu">
<li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online"><i class="fa fa-circle online"></i> {{$online}}</a></li>
<li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away"><i class="fa fa-circle away"></i> {{$away}}</a></li>
<li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave"><i class="fa fa-circle leave"></i> {{$leave}}</a></li>
{{if $bookmark_link}}
<li class="divider"></li>
<li class="nav-item"><a class="nav-link" href="{{$bookmark_link}}" target="_blank" ><i class="fa fa-bookmark"></i> {{$bookmark}}</a></li>
{{/if}}
</ul>
</div>
<div id="chat-tools" class="btn-toolbar pull-left">
<div class="btn-group">
<button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
<button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'chatText'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
<button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'chatText'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
<button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'chatText'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
<button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'chatText'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
<div class="btn-group hidden-xs">
<button id="chat-link-wrapper" class="btn btn-default btn-sm" onclick="chatJotGetLink(); return false;" >
<i id="chat-link" class="fa fa-link jot-icons" title="{{$insert}}" ></i>
</button>
</div>
{{if $feature_encrypt}}
<div class="btn-group hidden-xs">
<button id="chat-encrypt-wrapper" class="btn btn-default btn-sm" onclick="red_encrypt('{{$cipher}}', '#chatText', $('#chatText').val()); return false;">
<i id="chat-encrypt" class="fa fa-key jot-icons" title="{{$encrypt}}" ></i>
</button>
</div>
{{/if}}
<div class="btn-group dropup visible-xs">
<button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<i id="more-tools-icon" class="fa fa-caret-up jot-icons"></i>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="menu">
<li class="visible-xs"><a href="#" onclick="chatJotGetLink(); return false;" ><i class="fa fa-link"></i> {{$insert}}</a></li>
{{if $feature_encrypt}}
<li class="divider"></li>
<li class="visible-xs"><a href="#" onclick="red_encrypt('{{$cipher}}', '#chatText' ,$('#chatText').val()); return false;"><i class="fa fa-key"></i> {{$encrypt}}</a></li>
{{/if}}
</ul>
</div>
</div>
<div id="chat-rotator-wrapper" class="pull-left">
<div id="chat-rotator"></div>
</div>
<div class="clear"></div>
</div>
</form>
</div>
</div>
</div>
<script>
var room_id = {{$room_id}};
var last_chat = 0;
var chat_timer = null;
$(document).ready(function() {
$('#chatTopBar').spin('small');
chat_timer = setTimeout(load_chats,300);
$('#chatroom_bookmarks, #vcard').hide();
$('#chatroom_list, #chatroom_members').show();
adjustInlineTopBarHeight();
chatNotificationInit();
});
$(window).resize(function () {
if($('main').hasClass('fullscreen')) {
adjustFullscreenTopBarHeight();
}
else {
adjustInlineTopBarHeight();
}
});
$('#chat-form').submit(function(ev) {
$('body').css('cursor','wait');
$.post("chatsvc", $('#chat-form').serialize(),function(data) {
if(chat_timer) clearTimeout(chat_timer);
$('#chatText').val('');
load_chats();
$('body').css('cursor','auto');
},'json');
ev.preventDefault();
});
function load_chats() {
$.get("chatsvc?f=&room_id=" + room_id + '&last=' + last_chat + ((stopped) ? '&stopped=1' : ''),function(data) {
if(data.success && (! stopped)) {
update_inroom(data.inroom);
update_chats(data.chats);
$('#chatTopBar').spin(false);
}
});
chat_timer = setTimeout(load_chats,10000);
}
var previousChatRoomMembers = null; // initialize chat room member change register
var currentChatRoomMembers = null; // initialize chat room member change register
function update_inroom(inroom) {
var html = document.createElement('div');
var count = inroom.length;
$.each( inroom, function(index, item) {
var newNode = document.createElement('div');
newNode.setAttribute('class', 'member-item');
$(newNode).html('<img style="height: 32px; width: 32px;" src="' + item.img + '" alt="' + item.name + '" /> ' + '<span class="name">' + item.name + '</span><br /><span class="' + item.status_class + '">' + item.status + '</span>');
html.appendChild(newNode);
});
memberChange = chatRoomMembersChange(inroom); // get list of arrivals and departures
if(memberChange.membersArriving.length > 0) {
// Issue pop-up notification if anyone enters the room.
chat_issue_notification(JSON.stringify(memberChange.membersArriving.pop().name) + ' entered the room', 'Hubzilla Chat');
}
$('#chatMembers').html(html);
}
// Determine if the new list of chat room members has any new members or if any have left
function chatRoomMembersChange(inroom) {
previousChatRoomMembers = currentChatRoomMembers;
currentChatRoomMembers = inroom;
var membersArriving = [];
var membersLeaving = [];
if(previousChatRoomMembers !== null) {
var newMember = false;
$.each( currentChatRoomMembers, function(index, currMember) {
newMember = true;
$.each( previousChatRoomMembers, function(index, prevMember) {
if (prevMember.name === currMember.name) {
newMember = false;
}
});
if (newMember === true) {
membersArriving.push(currMember);
}
});
}
return {membersArriving: membersArriving, membersLeaving: membersLeaving};
}
function update_chats(chats) {
var count = chats.length;
$.each( chats, function(index, item) {
last_chat = item.id;
var newNode = document.createElement('div');
if(item.self) {
newNode.setAttribute('class', 'chat-item-self clear');
$(newNode).html('<div class="chat-body-self"><div class="chat-item-title-self wall-item-ago"><span class="chat-item-name-self">' + item.name + ' </span><span class="autotime chat-item-time-self" title="' + item.isotime + '">' + item.localtime + '</span></div><div class="chat-item-text-self">' + item.text + '</div></div><img class="chat-item-photo-self" src="' + item.img + '" alt="' + item.name + '" />');
}
else {
newNode.setAttribute('class', 'chat-item clear');
$(newNode).html('<img class="chat-item-photo" src="' + item.img + '" alt="' + item.name + '" /><div class="chat-body"><div class="chat-item-title wall-item-ago"><span class="chat-item-name">' + item.name + ' </span><span class="autotime chat-item-time" title="' + item.isotime + '">' + item.localtime + '</span></div><div class="chat-item-text">' + item.text + '</div></div>');
}
$('#chatLineHolder').append(newNode);
$(".autotime").timeago();
var elem = document.getElementById('chatTopBar');
elem.scrollTop = elem.scrollHeight;
});
}
var chat_notify_granted = false; // Initialize notification permission to denied
// Request notification access from the user
// TODO: Check Hubzilla member config setting before requesting permission
function chatNotificationInit() {
if (!("Notification" in window)) {
window.console.log("This browser does not support system notifications");
}
// Let's check whether notification permissions have already been granted
else if (Notification.permission === "granted") {
// If it's okay let's create a notification
chat_notify_granted = true; //var notification = new Notification("Hi there!");
}
// Otherwise, we need to ask the user for permission
else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
// If the user accepts, let's create a notification
if (permission === "granted") {
chat_notify_granted = true; //var notification = new Notification("Hi there!");
}
});
}
}
// Issue a pop-up notification using the web standard Notification API
// https://developer.mozilla.org/docs/Web/API/notification
var chat_issue_notification = function (theBody,theTitle) {
if ( !chat_notify_granted ) {
return;
}
var nIcon = "/images/icons/48/group.png";
var options = {
body: theBody,
icon: nIcon,
silent: false
}
var n = new Notification(theTitle,options);
n.onclick = function (event) {
setTimeout(n.close.bind(n), 300);
}
// TODO: Allow audio notification option
//chat_notify_audio.play();
}
function chatJotGetLink() {
reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
$('#chat-rotator').spin('tiny');
$.get('linkinfo?f=&url=' + reply, function(data) {
addmailtext(data);
$('#chat-rotator').spin(false);
});
}
}
function addmailtext(data) {
var currentText = $("#chatText").val();
$("#chatText").val(currentText + data);
}
function adjustFullscreenTopBarHeight() {
$('#chatTopBar').height($(window).height() - $('#chatBottomBar').outerHeight(true) - $('.section-title-wrapper').outerHeight(true) - 16);
$('#chatTopBar').scrollTop($('#chatTopBar').prop('scrollHeight'));
}
function adjustInlineTopBarHeight() {
$('#chatTopBar').height($(window).height() - $('#chatBottomBar').outerHeight(true) - $('.section-title-wrapper').outerHeight(true) - $('nav').outerHeight(true) - 23);
$('#chatTopBar').scrollTop($('#chatTopBar').prop('scrollHeight'));
}
function isMobile() {
if( navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPad/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)
){
return true;
}
else {
return false;
}
}
$(function(){
$('#chatText').keypress(function(e){
if (e.keyCode == 13 && e.shiftKey||isMobile()) {
//do nothing
}
else if (e.keyCode == 13) {
e.preventDefault();
$('#chat-form').trigger('submit');
}
});
});
</script>