/* * Copyright (c) 2010-2011, Diaspora Inc. This file is * licensed under the Affero General Public License version 3 or later. See * the COPYRIGHT file. */ (function() { Diaspora.Mobile.Comments = { stream: function(){ return $(".stream"); }, initialize: function() { var self = this; new Diaspora.MarkdownEditor(".comment-box"); this.stream().on("tap click", "a.show-comments", function(evt){ evt.preventDefault(); self.toggleComments($(this)); }); this.stream().on("tap click", "a.comment-action", function(evt) { evt.preventDefault(); var bottomBar = $(this).closest(".bottom-bar").first(); var toggleReactionsLink = bottomBar.find("a.show-comments").first(); if (toggleReactionsLink.length === 0) { self.showCommentBox($(this)); } else { if (toggleReactionsLink.hasClass("loading")) { return; } if (!toggleReactionsLink.hasClass("active")) { self.showComments(toggleReactionsLink); } } var commentContainer = bottomBar.find(".comment-container").first(); self.scrollToOffset(commentContainer); }); this.stream().on("submit", ".new-comment", this.submitComment); }, submitComment: function(evt){ evt.preventDefault(); var form = $(this); var commentBox = form.find(".comment-box"); var commentText = $.trim(commentBox.val()); if(!commentText){ commentBox.focus(); return false; } $.post(form.attr("action") + "?format=mobile", form.serialize(), function(data){ Diaspora.Mobile.Comments.updateStream(form, data); }, "html").fail(function(response) { Diaspora.Mobile.Alert.handleAjaxError(response); Diaspora.Mobile.Comments.resetCommentBox(form); }); autosize($(".add-comment-switcher:not(.hidden) textarea")); }, toggleComments: function(toggleReactionsLink) { if(toggleReactionsLink.hasClass("loading")) { return; } if(toggleReactionsLink.hasClass("active")) { this.hideComments(toggleReactionsLink); toggleReactionsLink.parents(".bottom-bar").find(".add-comment-switcher").addClass("hidden"); } else { this.showComments(toggleReactionsLink); } }, hideComments: function(toggleReactionsLink) { var bottomBar = toggleReactionsLink.closest(".bottom-bar").first(); this.bottomBarLazy(bottomBar).deactivate(); toggleReactionsLink.removeClass("active"); }, showComments: function(toggleReactionsLink) { var bottomBar = toggleReactionsLink.closest(".bottom-bar").first(), bottomBarContainer = this.bottomBarLazy(bottomBar), existingCommentsContainer = bottomBarContainer.getCommentsContainer(), commentActionLink = bottomBar.find("a.comment-action"); bottomBarContainer.activate(); bottomBarContainer.showLoader(); if (existingCommentsContainer.length > 0) { this.showLoadedComments(toggleReactionsLink, existingCommentsContainer, commentActionLink); bottomBarContainer.hideLoader(); } else { this.showUnloadedComments(toggleReactionsLink, bottomBar, commentActionLink); } }, showLoadedComments: function(toggleReactionsLink, existingCommentsContainer, commentActionLink) { this.showCommentBox(commentActionLink); existingCommentsContainer.find("time.timeago").timeago(); }, showUnloadedComments: function(toggleReactionsLink, bottomBar, commentActionLink) { toggleReactionsLink.addClass("loading"); var bottomBarContainer = this.bottomBarLazy(bottomBar); var self = this; $.ajax({ url: toggleReactionsLink.attr("href"), success: function (data) { toggleReactionsLink.addClass("active").removeClass("loading"); $(data).insertAfter(bottomBar.children(".show-comments").first()); self.showCommentBox(commentActionLink); bottomBarContainer.getCommentsContainer().find("time.timeago").timeago(); bottomBarContainer.activate(); }, error: function(){ bottomBarContainer.deactivate(); } }).always(function(){ toggleReactionsLink.removeClass("loading"); bottomBarContainer.hideLoader(); }); }, bottomBarLazy: function(bottomBar) { return { loader: function(){ return bottomBar.find(".ajax-loader"); }, getCommentsContainer: function(){ return bottomBar.find(".comment-container").first(); }, getShowCommentsLink: function(){ return bottomBar.find("a.show-comments"); }, showLoader: function(){ this.loader().removeClass("hidden"); }, hideLoader: function(){ this.loader().addClass("hidden"); }, activate: function(){ bottomBar.addClass("active").removeClass("inactive"); this.getShowCommentsLink().addClass("active"); this.getShowCommentsLink().find("i").removeClass("entypo-chevron-down").addClass("entypo-chevron-up"); }, deactivate: function(){ bottomBar.removeClass("active").addClass("inactive"); this.getShowCommentsLink().removeClass("active"); this.getShowCommentsLink().find("i").addClass("entypo-chevron-down").removeClass("entypo-chevron-up"); } }; }, scrollToOffset: function(commentsContainer){ var commentCount = commentsContainer.find("li.comment").length; if ( commentCount > 3 ) { var lastComment = commentsContainer.find("li:nth-child("+(commentCount-3)+")"); $("html,body").animate({ scrollTop: lastComment.offset().top }, 1000); } }, showCommentBox: function(link){ var bottomBar = link.closest(".bottom-bar").first(); var textArea = bottomBar.find("textarea.comment-box").first()[0]; bottomBar.find(".add-comment-switcher").removeClass("hidden"); autosize(textArea); }, updateStream: function(form, data) { var bottomBar = form.closest(".bottom-bar").first(); this.addNewComments(bottomBar, data); this.updateCommentCount(bottomBar); this.increaseReactionCount(bottomBar); this.handleCommentShowing(form, bottomBar); bottomBar.find("time.timeago").timeago(); }, addNewComments: function(bottomBar, data) { if ($(".comment-container", bottomBar).length === 0) { $(".show-comments", bottomBar).after($("
", {"class": "comment-container"})); $(".comment-container", bottomBar).append($("