summaryrefslogtreecommitdiff
path: root/static/js/src/chat.js
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2012-07-18 00:02:21 -0400
committerJules Laplace <jules@okfoc.us>2012-07-18 00:02:21 -0400
commitc4338d2ae878a167c409e91dea6d1783fc7e30ba (patch)
tree1e54fac722ac3153f9180a5a8332f2b19e11c00c /static/js/src/chat.js
parentd891a7ae1b205716c086363fba17a3249a665deb (diff)
put away back
Diffstat (limited to 'static/js/src/chat.js')
-rw-r--r--static/js/src/chat.js240
1 files changed, 240 insertions, 0 deletions
diff --git a/static/js/src/chat.js b/static/js/src/chat.js
new file mode 100644
index 0000000..07796b2
--- /dev/null
+++ b/static/js/src/chat.js
@@ -0,0 +1,240 @@
+// Called on loading a chatroom
+
+function initChat() {
+ Search.initInpage()
+
+ $('#textbutton input').attr('checked', TextEnabled).change(setTextEnable);
+ $('#imgbutton input').attr('checked', ImgsEnabled).change(setImgsEnable);
+/* $('#clearbutton input').click(function() {
+ track('UI', 'ClearScreen');
+ $('.dump').remove();
+ $(this).removeAttr('checked');
+ return false;
+ });
+*/
+
+ $('.oldmsg').each(function() {
+ var dump = $(this);
+ var content = dump.find(".content")
+ MessageContentCache[dump.attr("id").substr(8)] = content.text()
+ content.html(buildMsgContent(content.text(), Recips));
+
+ if ((ImgsEnabled && dump.hasClass('contains-image')) || (TextEnabled && !dump.hasClass('contains-image')))
+ dump.show();
+ else
+ dump.hide();
+ });
+ Drag.bindImages();
+
+ $('#msgInput').keyup(ifEnter(submitMessage));
+ $('#msgSubmit').click(sendClicked);
+ $('#palette-button').click(paletteClicked);
+
+ messageList = $("#messageList")[0]
+
+ initChatThumb();
+
+ scrollToEnd()
+ scrollWatcher()
+
+ // see /static/webcam/webcam.js
+ if ('webcam' in window) webcam.init()
+
+ startChatUpdater();
+}
+
+
+var imgZoomThreshhold = [125, 125];
+
+function initChatMsgs() {
+ $('.msgDiv .content').live('mouseenter', function(e) {
+ $(this).addClass('msg-hover');
+ });
+
+ $('.msgDiv .content').live('mouseleave', function(e) {
+ $(this).removeClass('msg-hover');
+ });
+
+ $('.msgDiv .content .img-wrapper').live('mouseenter', function(e) {
+ var img = $(this).find('img');
+
+ if (img.width() < imgZoomThreshhold[0] || img.height() < imgZoomThreshhold[1])
+ return;
+
+ var zoomlink = $('<a>')
+ .attr({'href': img.attr('src') })
+ .addClass('msg-image-zoom')
+ .append($('<img>').attr('src', 'http://dump.fm/static/img/zoom.gif')
+ .addClass('zoom-icon'))
+ .click(function() { window.open(img.attr('src')); return false; });
+ $(this).append(zoomlink);
+ });
+
+ $('.msgDiv .content .img-wrapper').live('mouseleave', function(e) {
+ $(this).find('.msg-image-zoom').remove();
+ });
+
+
+ $('.content').live('click', function(e) {
+ var tagName = e.target.tagName;
+ if (tagName == 'A' || tagName == 'EMBED' || $(e.target).hasClass('youtube-thumb')) {
+ return true;
+ }
+ var msg = $(this).parent('.msgDiv');
+ var wasFavorited = msg.hasClass("favorite");
+ var button = msg.find('.chat-thumb');
+ if (wasFavorited) {
+ $(button).attr("src", Imgs.chatThumbOff);
+ } else {
+ $(button).attr("src", Imgs.chatThumbBig);
+ $(button).stop().animate(Anim.chatThumbBig, 'fast').animate(Anim.chatThumb, 'fast', 'swing');
+ }
+ Tag.favorite(button);
+ return false;
+ });
+}
+function startChatUpdater() {
+ setTimeout(refresh, 1000);
+}
+
+function makePlainText() {
+ var j = $(this);
+ j.text(j.text());
+}
+
+
+
+function initChatThumb(){
+ $(".chat-thumb").live('mouseover mouseout',
+ function(e) {
+ var favorited = $(this).parents(".dump").hasClass("favorite") ? true : false;
+ if (e.type == "mouseover") {
+ if (favorited) {
+ $(this).attr("src", Imgs.chatThumbOff);
+ } else {
+ $(this).attr("src", Imgs.chatThumbBig);
+ $(this).stop().animate(Anim.chatThumbBig, 'fast')
+ }
+ } else { // mouseout
+ if (favorited) {
+ $(this).attr("src", Imgs.chatThumb);
+ $(this).stop().animate(Anim.chatThumb, 'fast');
+ } else {
+ $(this).delay(600).stop().animate(Anim.chatThumbTiny, 'fast', 'swing',
+ function(){
+ $(this).attr("src", Imgs.chatThumbDot)
+ $(this).animate(Anim.chatThumb, 0)
+ })
+ }
+ }
+ })
+}
+
+
+
+
+
+// grab message id etc from some element e that's inside a dump
+// (messages have something like id="message-0001" class="dump" )
+function getMessageInfo(e){
+ var message = $(e).parents(".dump")
+ var id = message.attr("id").substr(8) // cut "message-001" to "001"
+ var nick = message.attr("nick")
+ var link = "http://dump.fm/p/" + nick + "/" + id
+ var content = message.find(".linkify")
+ if (!content.length) content = message.find(".content")
+ var rawContent = content.html()
+ var img = content.find("img").attr("src")
+ var via = "via " + nick + " on dump.fm"
+ return {"nick": nick, "id": id, "link": encodeURIComponent(link),
+ "content": rawContent, "img": encodeURIComponent(img),
+ "via": encodeURIComponent(via)}
+}
+// Message Handling
+
+var ImageMsgCount = 0
+function removeOldMessages(){
+ // don't count posts that are all text
+ if (LastMsgContainsImage) ImageMsgCount += 1;
+ while (ImageMsgCount > MaxImagePosts) {
+ var imgMsg = $(".contains-image:first")
+ if (imgMsg.length) {
+ imgMsg.prevAll().remove() // remove all text messages before the image message
+ imgMsg.remove()
+ } else break;
+ ImageMsgCount -= 1;
+ }
+}
+
+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", "false");
+ track('UI', 'TextEnabled');
+ $('.dump').not('.contains-image,'+muted).show();
+ } else {
+ TextEnabled = false;
+ Preferences.setProperty("chat.textEnabled", "false");
+ track('UI', 'TextDisabled');
+ $('.dump').not('.contains-image').hide()
+ }
+};
+
+function setImgsEnable() {
+ var muted = muteSelector();
+ if ($(this).attr('checked')) {
+ ImgsEnabled = true;
+ Preferences.setProperty("chat.imgsEnabled", "true");
+ track('UI', 'ImgsEnabled');
+ $('.contains-image').not(muted).show();
+ } else {
+ ImgsEnabled = false;
+ Preferences.setProperty("chat.imgsEnabled", "false");
+ track('UI', 'ImgsDisabled');
+ $('.contains-image').hide();
+ }
+};
+
+
+// scrolling stuff
+// this code keeps the div scrolled to the bottom, but will also let the user scroll up, without jumping down
+
+function isScrolledToBottom(){
+ var threshold = 15;
+
+ var containerHeight = messageList.style.pixelHeight || messageList.offsetHeight
+ var currentHeight = (messageList.scrollHeight > 0) ? messageList.scrollHeight : 0
+
+ var result = (currentHeight - messageList.scrollTop - containerHeight < threshold);
+
+ return result;
+}
+
+function scrollIfPossible(){
+ if (lastScriptedScrolledPosition <= messageList.scrollTop || isScrolledToBottom())
+ scrollToEnd()
+}
+
+var lastScriptedScrolledPosition = 0
+function scrollToEnd(){
+ messageList.scrollTop = messageList.scrollHeight
+ lastScriptedScrolledPosition = messageList.scrollTop
+}
+
+function scrollWatcher(){
+ scrollIfPossible()
+ setTimeout(scrollWatcher, 500)
+}
+