Files
Facilitor/APPL/CHAT/Chatter.asp
Erik Groener 139b7ded01 FCLT#91046 LCL's zijn HTML safe maar niet String-safe of SQL-safe
svn path=/Website/trunk/; revision=71041
2025-11-24 15:49:07 +00:00

249 lines
10 KiB
Plaintext

<%@language = "javascript" %>
<% /*
$Revision$
$Id$
Chatter.asp
Chat dialoog zodra from en to bekend zijn
*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="./chat.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<%
var chatReadchannelId = getQParam("chatreadid", shared.random()); // wijzelf
var chatSendchannelId = getQParam("chatsendid"); // de ander
var prs_key = getQParamInt("prs_key", -1); // de ander
var dis_key = getQParamInt("dis_key", -1); // discipline
var ins_discipline_omschrijving = get_disc_name(dis_key);
var acceptor = getQParamInt("accept", -1); // am I the acceptor?
var startMessage = getQParam("message", ""); // initial message
var other = getQParam("naam", ""); // the other person
if (prs_key > 0)
var otherPerslid = new Perslid(prs_key);
Application.Lock(); // wis de wanting
var chat_queue = JSON.parse(Application(chat_queue_name) || "{}");
if (chat_queue.wanting)
{
delete chat_queue.wanting[chatReadchannelId]; // we weten niet wie van de twee de wanting was
delete chat_queue.wanting[chatSendchannelId]; // en wissen gewoon beide
}
Application(chat_queue_name) = JSON.stringify(chat_queue);
Application.UnLock();
function user_photo_icon(prs_key)
{
// details of a different user
var chat_user = new Perslid(prs_key);
var info = chat_user.photoinfo();
var initialen = "";
var initials;
var classes;
var src;
if (info.isDefault)
{
var alle_namen = chat_user.naam().split(" ");
var initialen = alle_namen[0].substring(0,1);
if (alle_namen.length > 1)
{
initialen += alle_namen[alle_namen.length - 1].substring(0,1);
}
classes = "userphoto circle initials align-middle";
initials = initialen.toUpperCase();
}
else
{
classes = "userphoto profile";
src = info.photopaththumb;
}
var userphotoResult = '<span class="' + classes + '"{0}>{1}</span>';
var onclick = (prs_key > 0 ? ' onclick="iface.persoonDetails(null, null, ' + prs_key + ')"' : '');
if (initials)
{
return userphotoResult.format(onclick, safe.html(initials));
}
else
{
return userphotoResult.format(onclick, '<img alt="' + safe.htmlattr(L("fac_profiel")) + " " + safe.htmlattr(L("lcl_photos")) + '" src="' + safe.htmlattr(src) + '">');
}
}
FCLTHeader.Requires({plugins:["jQuery"], js: ["jquery-ui.js", "date.js", "./notify.js"]})
%>
<html>
<head>
<%
FCLTHeader.Generate();
%>
<script>
var chatReadchannelId = "<%=safe.jsstring(chatReadchannelId)%>"; // wijzelf
var chatSendchannelId = "<%=safe.jsstring(chatSendchannelId)%>"; // de ander
notify.signal(chatSendchannelId, chatReadchannelId);
function add2chat(messages)
{
for (var i = 0; i < messages.length; i++)
{
var extraClass = messages[i].system?' system' : '';
extraClass += messages[i].aborted?' aborted' : '';
extraClass += messages[i].inactive?' inactive' : '';
extraClass += messages[i].mine?' self' : ' other';
$("#chathistory").prepend($('<span>').addClass('chatmsg'+extraClass).html(messages[i].safe_message))
.prepend($('<span>').addClass('chatfrom'+extraClass).text(messages[i].fromname))
.prepend($('<span>').addClass('chattime').text(messages[i].sincetime));
}
$('#chat').focus();
}
// === receiving ===
function process_chat_message(data)
{
if (data.messages && data.messages.length)
{
add2chat(data.messages);
warning_1 = false;
warning_2 = false;
ended = false;
}
check_chat_queue();
}
var warning_1 = false;
var warning_2 = false;
var ended = false;
function get_chat_message(data)
{
// Haal het bericht echt op
if (data.message) {
$.post("ChatGet.asp?channelId=" + chatReadchannelId, process_chat_message);
} else {
if ("end" in data)
{
// session ended due to inactivity
if (data.end == 1)
{
add2chat([{safe_message: L('lcl_chat_inactive_ended'), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), inactive: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
return false; // stop polling notify
}
// session aborted by user
else if (data.end == 2)
{
add2chat([{safe_message: L('lcl_chat_user_ended'), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), aborted: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
return false; // stop polling notify
}
}
else
{
var last_alive = data.last_alive;
var ago10 = new Date(data.ts);
var ago14 = new Date(data.ts);
var ago15 = new Date(data.ts);
ago10.setMinutes(ago10.getMinutes() - 10);
ago14.setMinutes(ago14.getMinutes() - 14);
ago15.setMinutes(ago15.getMinutes() - 15);
if (!ended && last_alive < ago15.getTime())
{
add2chat([{safe_message: L("lcl_chat_ended"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), inactive: true, system: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
notify.end(chatSendchannelId, chatReadchannelId, 1); // session ended due to inactivity
ended = true;
return false;
} else if (!warning_2 && last_alive < ago14.getTime())
{
add2chat([{safe_message: L("lcl_chat_inactive_warning_2"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), system: true, mine: false}]);
warning_2 = true;
} else if (!warning_1 && last_alive < ago10.getTime())
{
add2chat([{safe_message: L("lcl_chat_inactive_warning_1"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), system: true, mine: false}]);
warning_1 = true;
}
}
}
return true;
}
function check_chat_queue() // Zijn er berichten voor mij?
{
notify.wait(chatReadchannelId, chatSendchannelId, get_chat_message);
}
$(check_chat_queue); // start de check-loop
// === sending ===
function process_chat_send(data)
{
warning_1 = false;
warning_2 = false;
ended = false;
notify.signal(chatSendchannelId, chatReadchannelId); // Signal new message
}
function chat_send()
{
var msg = $("textarea#chat").val();
if (msg) {
$("textarea#chat").val("");
$.post("../Shared/get_shared_info.asp", {
req_info: "eval_bb_code",
fcltlinks: 1,
input: msg
}, function (json) {
add2chat([{ safe_message: json.fclthtml, sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_selfname'), mine: true }]);
chat_dosend(msg);
});
}
}
function chat_dosend(msg)
{
$.post( "./ChatSend.asp",
{
fromchannelId: chatReadchannelId,
channelId: chatSendchannelId,
message: msg,
acceptor: (<%=acceptor%> > 0 ? "1" : "0")
},
process_chat_send);
}
function unloadHandler()
{
notify.end(chatSendchannelId, chatReadchannelId, 2); // Session aborted by user
}
$(process_chat_send); // activeert de andere kant
$(get_chat_message); // Misschien staat er al eentje te wachten (welkomsbericht)
$(function () {
FcltMgr.startEdit(window); // hot tab
add2chat([{safe_message: L("lcl_chat_initialmsg"), sincetime: toTimeString(new Date(), true), fromname: "<%=(prs_key > 0 ? L('lcl_chat_selfname') : L('lcl_chatter_naam'))%>", mine: <%=prs_key > 0 ? "true" : "false"%> }]);
add2chat([{safe_message: "<%=safe.jsstring(safe.fclthtml(startMessage, { "fcltlinks": true }))%>", sincetime: toTimeString(new Date(), true), fromname: "<%=safe.jsstring(prs_key > 0 ? other : L('lcl_chat_selfname'))%>", mine: <%=prs_key > 0 ? "false" : "true"%> }]);
$("#chat").on("keydown", function(event) {
if (event.keyCode == 13 && !event.shiftKey) {
event.preventDefault();
chat_send();
}
});
});
</script>
</head>
<body class="chatbody">
<% PAGE_START(); %>
<%BLOCK_START("chat", (prs_key > 0 ? L("lcl_chatter_incoming") : L("lcl_chatter_outgoing")).format(ins_discipline_omschrijving), { ishtmlsafe1: true, html: (prs_key > 0 ? user_photo_icon(prs_key) : ""), icon: (prs_key < 0 ? "fa-user-headset" : ""), center: true });%>
<!--Debug: reading channel <%=safe.html(chatReadchannelId)%><br>sending channel <%=safe.html(chatSendchannelId)%>-->
<div id="chatinput" class="chatinput">
<div class="text-wrapper">
<textarea id="chat" class="fldtxt" placeholder="<%=L("lcl_chat_entermessage")%>"></textarea>
<span class="sendbutton" onclick="chat_send()" title="<%=safe.htmlattr(L("lcl_chat_send"))%>"><%=I("fa-paper-plane fa-lg")%></span>
</div>
<div id="chathistory" class="chathistory"></div>
<%BLOCK_END();%>
<% PAGE_END(); %>
</body>
</html>
<% ASPPAGE_END(); %>