summaryrefslogtreecommitdiff
path: root/static/js/pichat.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/js/pichat.js')
-rw-r--r--static/js/pichat.js229
1 files changed, 216 insertions, 13 deletions
diff --git a/static/js/pichat.js b/static/js/pichat.js
index afddec7..6eb5553 100644
--- a/static/js/pichat.js
+++ b/static/js/pichat.js
@@ -82,7 +82,7 @@ var Preferences = {
function escapeHtml(txt) {
if (!txt) { return ""; }
-// txt = annoyingCaps(txt)
+ // txt = annoyingCaps(txt)
return $("<span>").text(txt).html()
}
@@ -223,7 +223,7 @@ function linkReplace(url) {
if (type == 'image') {
LastMsgContainsImage = true;
- return "<a target='_blank' href='" + linkUrl + "' class='img-wrapper' onclick='return imgClickHandler()'><img src='" + linkUrl + "'></a>";
+ return "<a target='_blank' href='" + linkUrl + "' class='img-wrapper' onclick='return imgClickHandler()'><img src='" + linkUrl + "' class='unbound'></a>";
} else if (type == 'youtube') {
Youtube.startAnimation();
return "<a target='_blank' class='youtube' href='" + linkUrl + "'>" +
@@ -323,15 +323,23 @@ function removeOldMessages(){
}
}
-var TextEnabled = Preferences.getProperty("chat.textEnabled", "true") == "true";
+var TextEnabled = Preferences.getProperty("chat.textEnabled", "true") == "none";
var ImgsEnabled = Preferences.getProperty("chat.imgsEnabled", "true") == "true";
+function muteSelector() {
+ var muted = [];
+ for (nick in MUTES) {
+ muted.push(".nick_" + nick);
+ }
+ return muted.join(",");
+}
function setTextEnable() {
+ var muted = muteSelector();
if ($(this).attr('checked')) {
TextEnabled = true;
- Preferences.setProperty("chat.textEnabled", "true");
+ Preferences.setProperty("chat.textEnabled", "false");
track('UI', 'TextEnabled');
- $('.dump').not('.contains-image').show();
+ $('.dump').not('.contains-image,'+muted).show();
} else {
TextEnabled = false;
Preferences.setProperty("chat.textEnabled", "false");
@@ -341,11 +349,12 @@ function setTextEnable() {
};
function setImgsEnable() {
+ var muted = muteSelector();
if ($(this).attr('checked')) {
ImgsEnabled = true;
Preferences.setProperty("chat.imgsEnabled", "true");
track('UI', 'ImgsEnabled');
- $('.contains-image').show();
+ $('.contains-image').not(muted).show();
} else {
ImgsEnabled = false;
Preferences.setProperty("chat.imgsEnabled", "false");
@@ -372,8 +381,10 @@ function buildMessageDiv(msg, opts) {
var loadingClass = opts.isLoading ? ' loading' : '';
var containsImageClass = LastMsgContainsImage ? ' contains-image' : '';
var displayStyle = ((ImgsEnabled && LastMsgContainsImage) || (TextEnabled && !LastMsgContainsImage)) ? '' : ' style="display: none"';
+ if (displayStyle === '' && MUTES[nick])
+ displayStyle = ' style="display: none"';
- return '<div class="msgDiv dump ' + loadingClass + containsImageClass + '" ' + msgId + displayStyle + '>'
+ return '<div class="msgDiv dump ' + loadingClass + containsImageClass + " nick_" + nick + '" ' + msgId + displayStyle + '>'
+ '<span class="nick"><b><a href="' + RootDomain + nick + ' ">' + nick + '</a></b>'
+ ' <img src="'+Imgs.chatThumbDot+'" class="chat-thumb" onclick="Tag.favorite(this)"> '
+ '</span>'
@@ -381,17 +392,42 @@ function buildMessageDiv(msg, opts) {
+ '</div>';
}
+var MUTES = {};
+$(".mute").live("click", function(){
+ $(this).removeClass("mute");
+ $(this).addClass("unmute");
+ $(this).html("o");
+ var nick = $(this).parent().children("a").html().replace(/<img[^>]+>/,"");
+ $(".nick_" + nick).hide();
+ MUTES[nick] = true;
+});
+$(".unmute").live("click", function(){
+ $(this).removeClass("unmute");
+ $(this).addClass("mute");
+ $(this).html("x");
+ var nick = $(this).parent().children("a").html().replace(/<img[^>]+>/,"");
+ $(".nick_" + nick).show();
+ delete MUTES[nick];
+});
+
function buildUserDiv(user) {
+ var muted = MUTES[user.nick] ? '<span class="unmute">o</span>' : '<span class="mute">x</span>';
if (user.avatar) {
return '<div class="username">'
+ + muted
+ '<a href="' + RootDomain + escapeHtml(user.nick) + '" target="_blank">'
+ '<img src="' + user.avatar + '" width="50" height="50">'
- + escapeHtml(user.nick) + '</a></div>';
+ + escapeHtml(user.nick)
+ + '</a>'
+ + '</div>';
} else {
return '<div class="username">'
+ + muted
+ '<a href="' + RootDomain + escapeHtml(user.nick) + '" target="_blank">'
+ '<img src="' + RootDomain + 'static/img/noinfo.png" width="50" height="50">'
- + escapeHtml(user.nick) + '</a></div>';
+ + escapeHtml(user.nick)
+ + '</a>'
+ + '</div>';
}
}
@@ -425,7 +461,8 @@ function showFav(f) {
function updateFavs(fs) {
if (fs.length == 0)
return;
- $('#favbox').show();
+console.log("new faves");
+ $('#favbox').show();
$(fs).each(function(i, f) { showFav(f) });
}
@@ -538,11 +575,13 @@ function ifEnter(fn) {
function addNewMessages(msgs) {
var msgStr = $.map(msgs, buildMessageDiv).join('');
$('#messageList').append(msgStr);
+ Drag.bindImages();
}
function addNewMessage(msg, isLoading) {
var msgStr = buildMessageDiv(msg, { isLoading: true });
var div = $(msgStr).appendTo('#messageList');
+ Drag.bindImages();
return div;
}
@@ -567,7 +606,7 @@ function updateUI(msgs, users, favs) {
if (users !== null) {
var flattened = flattenUserJson(users);
if (!('userlist' in cache) || flattened != cache.userlist) {
- $("#userList").html($.map(users.sort(sortUsersByAlpha), buildUserDiv).join(''));
+ $("#userList").html($.map(users.sort(sortUsersByAlpha), buildUserDiv).join(''));
}
cache.userlist = flattened
}
@@ -595,17 +634,18 @@ function refresh() {
var onSuccess = function(json) {
try {
Timestamp = json.timestamp;
- $.map(json.messages, function(msg){ MessageContentCache[msg.msg_id.toString()] = msg.content })
+ $.map(json.messages, function(msg){ MessageContentCache[msg.msg_id.toString()] = msg.content })
var messages = $.grep(
json.messages,
function(m) { return !isDuplicateMessage(m) });
updateUI(messages, json.users, json.favs);
+console.log("update ui");
if (!Away.HasFocus)
Away.UnseenMsgCounter += messages.length;
} catch(e) {
if (IsAdmin && window.console) {
- console.error(e);
+ console.log(e);
}
}
setTimeout(refresh, 1500);
@@ -667,6 +707,7 @@ function initChat() {
else
dump.hide();
});
+ Drag.bindImages();
$('#msgInput').keyup(ifEnter(submitMessage));
$('#msgSubmit').click(sendClicked);
@@ -1970,3 +2011,165 @@ var SHA1 = {
},
"bit_rol": function(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)) }
}
+
+window.Drag = {
+ 'imgSrc': "",
+ 'bindImages': function (){
+ $('.unbound').each(function(index,img){
+ img.addEventListener('dragstart', Drag.start, false);
+ $(this).removeClass('unbound');
+ });
+ },
+ 'start': function(e){
+ // console.log(this);
+ if (this.src) Drag.imgSrc = this.src;
+ },
+ 'enter': function(e){
+ Drag.chatbox.classList.add('over');
+ // console.log('enter')
+ return false;
+ },
+ 'over': function(e){
+ if (e.preventDefault) {
+ e.preventDefault(); // Necessary. Allows us to drop.
+ }
+ // console.log('over')
+ return false;
+ },
+ 'leave': function(e){
+ Drag.chatbox.classList.remove('leave');
+ // console.log('leave')
+ return false;
+ },
+ 'end': function(e){
+ Drag.chatbox.classList.remove('end');
+ // console.log('end')
+ return false;
+ },
+ 'drop': function(e){
+ Drag.chatbox.classList.remove('over');
+ if (e.stopPropagation) {
+ e.stopPropagation(); // stops the browser from redirecting.
+ }
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+ // console.log('drop');
+ Drag.chatbox.value += " " + Drag.imgSrc;
+ Drag.chatbox.value += " ";
+ Drag.chatbox.focus();
+ // console.log(Drag.imgSrc);
+ Drag.imgSrc = "";
+ // ok.onclick();
+ return false;
+ }
+}
+$(function(){
+ Drag.chatbox = document.getElementById("msgInput");
+ if (! Drag.chatbox || $.browser.mozilla) return;
+ Drag.chatbox.addEventListener('dragenter', Drag.enter, false);
+ Drag.chatbox.addEventListener('dragover', Drag.over, false);
+ Drag.chatbox.addEventListener('dragleave', Drag.leave, false);
+ Drag.chatbox.addEventListener('dragend', Drag.end, false);
+ Drag.chatbox.addEventListener('drop', Drag.drop, false);
+});
+
+// generate a new CSS rule and apply it immediately
+// (more persistent than dumping a style tag)
+window.cssRule = function (selector, declaration) {
+ var x = document.styleSheets,y=x.length-1;
+ x[y].insertRule(selector+"{"+declaration+"}",x[y].cssRules.length);
+ $(selector).css(declaration.split(": "));
+};
+
+
+// manual fave palette by ohgod
+$(function(){
+ $('#manual-palette-button').click(manPaletteClicked);
+ $('#manual-add-button').click(function () {
+ addManualFav($('#manual-add-url-txt').val().trim());
+ $('#manual-add-url-txt').val("");
+ });
+ $('#manual-remove-button').click(function () {
+ removeManualFav($('#manual-add-url-txt').val().trim());
+ $('#manual-add-url-txt').val("");
+ });
+});
+
+function manPaletteClicked() {
+ if ($("#manual-palette").css("display") == "none") {
+ manPaletteShow();
+ } else {
+ $("#manual-palette").css("display", "none");
+ $("#manual-palette-thumbs").html("");
+ }
+};
+
+function manPaletteShow() {
+ $("#manual-palette").show();
+ if (! hasLocalStorage()) {
+ $('#manual-palette-localstorage-error').show()
+ } else if (manPaletteIsEmpty()) {
+ $('#manual-palette-thumbs-empty').show();
+ } else {
+ manualPaletteBuildImageThumbs();
+ }
+};
+
+function hasLocalStorage() {
+ try {
+ return 'localStorage' in window && window['localStorage'] !== null;
+ } catch (e) {
+ return false;
+ }
+}
+
+function manPaletteIsEmpty() {
+ return localStorage.manual_favs === undefined || localStorage.manual_favs === "[]" || localStorage.manual_favs === "";
+};
+
+function getManualFaves() {
+ return localStorage.manual_favs ? JSON.parse(localStorage.manual_favs) : [];
+};
+
+function setManualFaves(mfavs) {
+ localStorage.manual_favs = JSON.stringify(mfavs);
+};
+
+function manualPaletteBuildImageThumbs() {
+ var imgs = JSON.parse(localStorage.manual_favs);
+ if (imgs && imgs.length != 0) {
+ for (var i = 0; i < imgs.length; i++) {
+ $("#manual-palette-thumbs").append("<img onclick='paletteToChat(this)' src='" + imgs[i] + "'>");
+ }
+ }
+};
+
+function addManualFav(imgsrc) {
+ if (!imgsrc) return;
+ if (hasLocalStorage()) {
+ if (manPaletteIsEmpty())
+ $("#manual-palette-thumbs").html("");
+ var mfavs = getManualFaves();
+ if ($.inArray(imgsrc, mfavs) == -1) {
+ mfavs.push(imgsrc);
+ setManualFaves(mfavs);
+ $("#manual-palette-thumbs").append("<img onclick='paletteToChat(this)' src='" + imgsrc + "'>");
+ }
+ }
+};
+
+function removeManualFav(imgsrc) {
+ if (hasLocalStorage()) {
+ var mfavs = getManualFaves();
+ var idx = $.inArray(imgsrc, mfavs);
+ if (idx != -1) {
+ mfavs.splice(idx, 1);
+ setManualFaves(mfavs);
+ $("#manual-palette-thumbs").html("");
+ manualPaletteBuildImageThumbs();
+ }
+ }
+};
+
+