diff options
author | BlueRaja <BlueRaja.admin@gmail.com> | 2015-05-07 23:14:47 -0500 |
---|---|---|
committer | BlueRaja <BlueRaja.admin@gmail.com> | 2015-05-07 23:14:47 -0500 |
commit | 3dc3919ce1b5336861979cde56884842615c967b (patch) | |
tree | f0a2418290cecd15f20c834bb071ffa9f3694b09 /js/chat.js | |
parent | 29e872fbc6c552ef02208fe9fa5416b69773aa38 (diff) | |
parent | c517b645c8723b5f4d20cbb91cbc4b9f45579cbb (diff) | |
download | pathery-3dc3919ce1b5336861979cde56884842615c967b.tar.xz |
Merge branch 'master' of git.raylu.net:pathery
Diffstat (limited to 'js/chat.js')
-rw-r--r-- | js/chat.js | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/js/chat.js b/js/chat.js new file mode 100644 index 0000000..6ea5f8e --- /dev/null +++ b/js/chat.js @@ -0,0 +1,436 @@ +
+//TODO: Add an initiateChat() function.
+
+var lastID = 1;
+//Internet Explorer doesn't support "const"
+//CONSTANTS: ...
+var channelTimerDelay = 30000;
+var chatTimerDelayUpper = 9000;
+var chatTimerDelayLower = 2000;
+var chatTimerDelayDefault = 5000;
+var chatTimerDelayWindowHidden = 90000;
+
+var chatTimerDelay = chatTimerDelayDefault;
+var isChatWindowVisible = true;
+var skipNextGetChat = false;
+var channel = 1;
+var chatBuffer = new Array();
+
+
+getChatTimer();
+function getChatTimer() {
+ setTimeout("getChatTimer()", chatTimerDelay);
+ if (isChatWindowVisible)
+ chatTimerDelay = Math.min(chatTimerDelay + 300, chatTimerDelayUpper);
+ if (skipNextGetChat) {
+ skipNextGetChat = false;
+ return;
+ }
+ getChat();
+ //addChatMessage("Debug", "Chat timer called!");
+}
+
+
+var pollChannelListTimer = setInterval(function () {pollChannelList()}, channelTimerDelay);
+
+var firstGetChat = true;
+function getChatDone(data) {
+ var newChats = false;
+
+ ////console.log('datalength', data.length);
+
+ if (data.length < 3 || data == 'false')
+ return;
+
+ //console.log("START BUILD");
+
+ //console.log("JSON TO PARSE", data);
+
+ json = jQuery.parseJSON(data);
+
+ //console.log("JSON PREPED");
+
+ $.each(json, function(key, chat) {
+
+ var postDate = new Date();
+ postDate.setTime(postDate.getTime() + chat.secondsSince * 1000);
+
+ if (!chat.message) return;
+
+ var isSelf = (chat.userID == userObj.ID);
+ var isServer = false;
+
+ if (chat.userID == null || chat.userID <= 0) {
+ isServer = true;
+ chat.displayName = 'SERVER'
+ }
+
+ if (chat.isJoinLeave == 'true') {
+ console.log('IsJoin Leave!')
+ //return true;
+ }
+
+ //Message is legitimately new or a server message?
+ if (chat.ID > lastID || typeof(chat.ID) == 'undefined') {
+ addChatMessage(chat.displayName, chat.message, postDate, isSelf, isServer, chat.wallColor, chat.wallEmblem,
+ chat.wallOrientation, chat.userID, chat.displayColor, chat.ID);
+ newChats = true;
+ }
+
+ //console.log("INSIDE BUILD START");
+ if (chat.ID > 0)
+ lastID = chat.ID;
+ });
+
+ //console.log("BUILD DONE");
+
+ if (newChats && !firstGetChat) {
+ if (isChatWindowVisible)
+ chatTimerDelay = chatTimerDelayLower;
+
+ if (chatIsMuted == 'false') {
+ soundManager.setVolume('charm', 20);
+ soundManager.setPan('charm', -60)
+ soundManager.setPosition('charm',150);
+ soundManager.play('charm');
+ }
+ }
+
+ firstGetChat = false;
+}
+
+function addChatMessage(displayName, message, postDate, isSelf, isServer, wallColor, wallEmblem, wallOrientation, userID, displayColor, chatID)
+{
+ if(!postDate)
+ postDate = new Date();
+ var timestamp = postDate.format("hh:MM:ss");
+ var timestampDetails = postDate.format("ddd h:MM TT");
+
+ var strClass = '';
+ if (isSelf)
+ strClass += ' self';
+ if (isServer)
+ strClass += ' server';
+
+ var usernameClass = '';
+ if (message.indexOf("/me ") == 0) {
+ message = message.substring(4);
+ usernameClass = ' me';
+ }
+
+ var isSpoiler = false;
+ if (message.indexOf("/spoiler ") == 0) {
+ message = message.substring(9);
+ isSpoiler = true;
+ }
+
+ if (!isSpoiler) {
+ document.title = displayName + ': '+ message.substring(0, 20) + ' | Pathery Chat';
+ } else {
+ document.title = displayName + ': ~Spoiler~ | Pathery Chat';
+ }
+
+ var p = '';
+ p = p+ " <div class='chatColumn1'>";
+ p = p+ " <span class='chatTimestamp' title='"+timestampDetails+"'>["+timestamp+"]</span>";
+ p = p+ " <div class='grid_td chatBadge' style='float:left; width:35px; height:35px; background:"+wallColor+" url("+linkEmblem(wallEmblem, wallOrientation)+");'>";
+ p = p+ " <div style='background-color:transparent;' class='grid_td_inner grid_td_rocks'>";
+ p = p+ " </div>";
+ p = p+ " </div>";
+ p = p+ " </div>";
+
+ p = p+ " <div class='chatColumn2'>";
+ if (userID == null || userID <= 0) {
+ p = p+ "<span class='chatUsername"+usernameClass+"'><a href='home'>";
+ } else {
+ p = p+ "<span class='chatUsername"+usernameClass+"'><a href='achievements?id="+userID+"' style='color:"+displayColor+"'>";
+ }
+ p = p+ displayName+"</a></span>";
+
+ if (isSpoiler == true) p = p+ " <span class='chatText spoiler' onclick='spoil(this);'>";
+ else p = p+ " <span class='chatText'>";
+ p = p+ chatReplaceAndEncode(message);
+ p = p+ " </span>";
+ p = p+ " </div>";
+
+ var chatContainer = $("#chatContainer");
+ var isAtBottom = (chatContainer.length == 1 && chatContainer.scrollTop() >= chatContainer[0].scrollHeight - chatContainer.outerHeight() - 1);
+
+ chatContainer.append('<div class="chatMessage'+strClass+'" id="C_' + chatID + '">' + p + '</div>');
+
+ if (isAtBottom || firstGetChat) {
+ chatContainer.scrollTop(chatContainer[0].scrollHeight);
+ }
+}
+
+function chatReplaceAndEncode(chat) {
+ chat = htmlEncode(chat);
+ chat = chat.replace(/\*\*(\S(.*?\S)?)\*\*/gm, "<b>$1</b>");
+ chat = chat.replace(/\~\~(\S(.*?\S)?)\~\~/gm, "<s>$1</s>");
+ chat = chat.replace(/\*(\S(.*?\S)?)\*/gm, "<i>$1</i>");
+
+ chat = replaceSmileys(chat);
+
+ //Surround all URLs with a <a> link
+ var URLexp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
+ chat = chat.replace(URLexp, "<a href='redirect?to=$1' target='_blank' onclick='return doNothingWhenClickingLinks(this);'>$1</a>");
+
+ //Replace # with %23, & with %26, ? with %3F
+ chat = chat.replace(/<a href='redirect\?to=(.*?)(#)(.*?)' target='_blank'/ig, "<a href='redirect?to=$1%23$3' target='_blank'");
+ chat = chat.replace(/<a href='redirect\?to=(.*?)(&)(.*?)' target='_blank'/ig, "<a href='redirect?to=$1%26$3' target='_blank'");
+ chat = chat.replace(/<a href='redirect\?to=(.*?)(\?)(.*?)' target='_blank'/ig, "<a href='redirect?to=$1%3F$3' target='_blank'");
+ //Making the bet that not all browsers do the same:
+ chat = chat.replace(/<a href='redirect\?to=(.*?)(&)(.*?)' target='_blank'/ig, "<a href='redirect?to=$1%26$3' target='_blank'");
+
+ return chat;
+}
+
+function replaceSmileys(chat) {
+ chat = chat.replace(/:\)|\(:|=\)/g, '<img title=":)" class="chatSmiley" src="images/smileys/Smiling.png" />');
+ chat = chat.replace(/:\(|=\(/g, '<img title=":(" class="chatSmiley" src="images/smileys/Unhappy.png" />');
+ chat = chat.replace(/\^\_\^/g, '<img title="^_^" class="chatSmiley" src="images/smileys/Happy_3.png" />');
+ chat = chat.replace(/\:d/gi, '<img title=":D" class="chatSmiley" src="images/smileys/Grinning.png" />');
+ chat = chat.replace(/\:o/gi, '<img title=":O" class="chatSmiley" src="images/smileys/Gasping.png" />');
+ chat = chat.replace(/\:p/gi, '<img title=":P" class="chatSmiley" src="images/smileys/Tongue_Out.png" />');
+ chat = chat.replace(/;p/gi, '<img title=";p" class="chatSmiley" src="images/smileys/Tongue_Out_Winking.png" />');
+ chat = chat.replace(/\:c/gi, '<img title=":c" class="chatSmiley" src="images/smileys/Childish.png" />');
+ chat = chat.replace(/\:s/gi, '<img title=":s" class="chatSmiley" src="images/smileys/Confused.png" />');
+ chat = chat.replace(/\>_\</g, '<img title=">_<" class="chatSmiley" src="images/smileys/Gah.png" />');
+ chat = chat.replace(/\$_\$/gi, '<img title="$_$" class="chatSmiley" src="images/smileys/Greedy.png" />');
+ chat = chat.replace(/-\.-|-_-/gi, '<img title="-.-" class="chatSmiley" src="images/smileys/Tired.png" />');
+ chat = chat.replace(/o\.O|o\_O/g, '<img title="o_O" class="chatSmiley" src="images/smileys/Huh.png" />');
+ chat = chat.replace(/O\.o|O\_o/g, '<img title="O_o" class="chatSmiley" src="images/smileys/Huh_2.png" />');
+ chat = chat.replace(/O\.O|O\_O/g, '<img title="O_O" class="chatSmiley" src="images/smileys/Madness.png" />');
+ chat = chat.replace(/\:-\//g, '<img title="O_O" class="chatSmiley" src="images/smileys/Uncertain.png" />');
+ chat = chat.replace(/\(y\)/gi, '<img title="(y)" class="chatSmiley" src="images/smileys/Thumb_Up.png" />');
+ chat = chat.replace(/\(n\)/gi, '<img title="(n)" class="chatSmiley" src="images/smileys/Thumb_Down.png" />');
+ chat = chat.replace(/\<3/g, '<img title="<3" class="chatSmiley" src="images/smileys/Heart.png" />');
+ return chat;
+}
+
+function prepChat(chat) {
+ chat = chat.join('|:|');
+ chat = chat.replace(/\&/g,'%26')
+ chat = chat.replace(/\+/g,'%2B')
+ return chat;
+}
+
+var chatIsBusy = false;
+function getChat(message) {
+ var dataString = 'getChatFromID='+lastID;
+ dataString += '&channel='+channel;
+ var backup = new Array();
+
+ var fncComplete = '';
+ if (!chatIsBusy && chatBuffer.length > 0) {
+ chatIsBusy = true;
+ dataString += '&send=true&messages='+prepChat(chatBuffer);
+ backup = chatBuffer.slice(0);
+ chatBuffer.length = 0;
+ fncComplete = function() {chatIsBusy = false;};
+ }
+ $.ajax({
+ type: "POST",
+ url: "ajax/chat.ajax.php",
+ data: dataString,
+ error: function() {
+ chatBuffer = backup.concat(chatBuffer);
+ //console.log('concated:', chatBuffer, backup);
+ },
+ success: function(data) {
+ getChatDone(data);
+ //console.log('b:', backup);
+ },
+ complete: fncComplete
+ });
+}
+
+function pollChannelList() {
+ $.ajax({
+ //type: "POST",
+ url: "ajax/chat.ajax.php?pollChannelList=1",
+ error: function() {
+ console.log('Error: Failed pollChannelList');
+ },
+ success: function(data) {
+ console.log("ChannelPoll data recieved", data);
+ pollChannelListDone(data);
+ }
+ });
+}
+
+function pollChannelListDone(data) {
+
+ console.log('data recieved:', data);
+ if (data.length < 3 || data == 'false') {
+ $("#channelContainer").html('Channel Empty');
+ return;
+ }
+ json = jQuery.parseJSON(data);
+
+ console.log('Loading channel.');
+ var c = channelListShow(json)
+ console.log(c);
+
+ var b = $("#channelContainer");
+ b.html(c);
+}
+
+
+function channelListShow(JO) {
+ console.log("Formating channelList");
+
+ var p = "<table class='membersList score' style='border-style:none; max-height:400px; width:220px; background-color:transparent; '>";
+
+ console.log('beginloop');
+
+ var previousI = 0;
+ for (var i in JO.users) {
+ console.log('loop')
+ var u = JO.users[i];
+ var styleClass = '';
+
+ if (previousI != i + 1) {
+ if (previousI < i - 1 && previousI != 0) {
+ styleClass = 'border-top: 6px solid #777799;';
+ }
+ }
+
+ // u.secFromLastActive could be used in here someplace..
+
+ var dateEntered = new Date();
+ dateEntered.setTime(dateEntered.getTime() + u.secFromEntered * 1000);
+
+ if (u.wallEmblem == undefined) u.wallEmblem = 'blank.png';
+ p = p+ "<tr style='"+styleClass+" background-color: "+u.background+"; color:"+u.displayColor+";' title='Entered channel " + dateEntered.format("ddd h:MM TT") + "'>";
+
+ p = p+ "<td style='vertical-align: middle;width:100px;'>";
+ p = p+ " <div class='grid_td' style='float:left; width:35px; height:35px; background:"+u.wallColor+" url("+linkEmblem(u.wallEmblem, u.wallOrientation)+");'>";
+ p = p+ " <div style='background-color:transparent;' class='grid_td_inner grid_td_rocks'>";
+ p = p+ " </div>";
+ p = p+ " </div>";
+ p = p+ " <span class='scoreName' style='float:left;'><a target='_blank' href='achievements?id="+u.ID+"' style='color:"+u.displayColor+"'>"+u.display+"</a></span>";
+ p = p+ "</td>";
+
+ previousI = i;
+ }
+ p = p+"</table>";
+ return p;
+}
+
+
+
+function sendChat() {
+ var message = $("input#message").val().replace("|:|", "||");
+ if (message == '') return false;
+ chatBuffer.push(message);
+ $("input#message").val('');
+ if (skipNextGetChat == false) {
+ skipNextGetChat = true;
+ }
+ getChat();
+ return false;
+}
+
+function spoil(obj) {
+ $(obj).removeClass("spoiler").hide().fadeIn(600);
+ $(obj).children().removeAttr('onclick');
+}
+
+$(document).ready(function() {
+ $('#sendChat').live("submit", function() {
+ sendChat()
+ });
+
+ //Prevent clicking on links in spoilers
+ $(document).on('click', '.spoiler > a', function()
+ {
+ addChatMessage("Debug", "Child called");
+ });
+});
+
+function htmlEncode(value){
+ if (value) {
+ return jQuery('<div />').text(value).html();
+ } else {
+ return '';
+ }
+}
+
+function doNothingWhenClickingLinks(self)
+{
+ return !$(self).closest('.spoiler').length;
+}
+
+//Code for checking if the window is currently visible or not
+//Adapted from http://stackoverflow.com/a/1060034/238419
+$(function() {
+ var hidden = "hidden";
+
+ // Standards:
+ if (hidden in document)
+ document.addEventListener("visibilitychange", onchange);
+ else if ((hidden = "mozHidden") in document)
+ document.addEventListener("mozvisibilitychange", onchange);
+ else if ((hidden = "webkitHidden") in document)
+ document.addEventListener("webkitvisibilitychange", onchange);
+ else if ((hidden = "msHidden") in document)
+ document.addEventListener("msvisibilitychange", onchange);
+ // IE 9 and lower:
+ else if ('onfocusin' in document)
+ document.onfocusin = document.onfocusout = onchange;
+ // All others:
+ else
+ window.onpageshow = window.onpagehide
+ = window.onfocus = window.onblur = onchange;
+
+ function onchange (evt) {
+ var eventMapIsWindowShown = {
+ focus:true, focusin:true, pageshow:true, blur:false, focusout:false, pagehide:false
+ };
+
+ evt = evt || window.event;
+ if (evt.type in eventMapIsWindowShown)
+ isChatWindowVisible = eventMapIsWindowShown[evt.type];
+ else
+ isChatWindowVisible = !this[hidden];
+
+ if(isChatWindowVisible)
+ onChatWindowShown();
+ else
+ onChatWindowHidden();
+ }
+});
+
+function onChatWindowShown()
+{
+ chatTimerDelay = chatTimerDelayDefault;
+ getChat();
+}
+
+function onChatWindowHidden()
+{
+ chatTimerDelay = chatTimerDelayWindowHidden;
+}
+
+
+var chatIsMuted = getCookie('pref_chatMute');
+function setChatMute() {
+ var mutePref = getCookie('pref_chatMute');
+
+ $('#chatMute').removeClass("chatMute_"+mutePref);
+ if (mutePref == 'true') {
+ mutePref = 'false';
+ soundManager.setVolume('pit', 20);
+ soundManager.setPan('pit', -60)
+ soundManager.play('pit');
+ } else {
+ mutePref = 'true';
+ }
+ chatIsMuted = mutePref;
+ $('#chatMute').addClass("chatMute_"+mutePref);
+ savePref('chatMute', mutePref);
+}
+
+pollChannelList();
+
|