// interface_common.js // 2013 Lucas Leal, Miguel Freitas // // Common interface functions to all pages, modal manipulation, button manipulation etc // Profile, mentions and hashtag modal // Post actions: submit, count characters //dispara o modal genérico //o modalClass me permite fazer tratamentos específicos de CSS para cada modal function openModal( modalClass ) { var $oldModal = $("body").children(".modal-blackout"); var $template = $( "#templates" ); var $templateModal = $template.find( ".modal-blackout" ).clone(true); $templateModal.addClass( modalClass ); if( $oldModal.length ) { $templateModal.show(); $oldModal.replaceWith($templateModal); } else { $templateModal.prependTo( "body" ).fadeIn( "fast" ); } //escondo o overflow da tela var $body = $( "body" ); $body.css({ "overflow": "hidden", }) } //fecha o modal removendo o conteúdo por detach function closeModal($this) { var $body = $( "body" ); var $modalWindows = $( "body" ).children( ".modal-blackout" ); $modalWindows.fadeOut( "fast", function() { $modalWindows.detach(); }); $body.css({ "overflow": "auto", "margin-right": "0" }); } function checkNetworkStatusAndAskRedirect(cbFunc, cbArg) { networkUpdate(function(args) { if( !twisterdConnectedAndUptodate ) { var redirect = window.confirm(polyglot.t("switch_to_network")); if( redirect ) $.MAL.goNetwork(); } else { if( args.cbFunc ) args.cbFunc(args.cbArg); } }, {cbFunc:cbFunc,cbArg:cbArg}); } function timeGmtToText(t) { var d = new Date(0); d.setUTCSeconds(t); return d.toString().replace(/GMT.*/g,""); } function timeSincePost(t) { var d = new Date(0); d.setUTCSeconds(t); var now = new Date(); var t_delta = Math.ceil((now - d) / 1000); var expression = ""; if(t_delta < 60) { expression = polyglot.t("seconds", t_delta); } else if(t_delta < 60 * 60) { expression = polyglot.t("minutes", Math.floor(t_delta/60)); } else if(t_delta < 24 * 60 * 60) { expression = polyglot.t("hours", Math.floor(t_delta/60/60)); } else { expression = polyglot.t("days", Math.floor(t_delta/24/60/60)); } return polyglot.t("time_ago", { time: expression }); } // // Profile, mentions, hashtag, and following modal // ----------------------------------- function newProfileModal(username) { var profileModalContent = $( "#profile-modal-template" ).children().clone(true); updateProfileData(profileModalContent, username); return profileModalContent; } function openProfileModal(e) { e.stopPropagation(); e.preventDefault(); var $this = $( this ); var username = $.MAL.urlToUser( $this.attr("href") ); var profileModalClass = "profile-modal"; openModal( profileModalClass ); var profileModalContent = newProfileModal( username ); profileModalContent.appendTo("." +profileModalClass + " .modal-content"); //título do modal $( "."+profileModalClass + " h3" ).text( polyglot.t("users_profile", { username: username }) ); //hed//add dinamic follow button in profile modal window if(followingUsers.indexOf(username) != -1){ $('.profile-card button.followButton').first().removeClass('follow').addClass('profileUnfollow').text(polyglot.t('Unfollow')).on('click', function(){ unfollow(username); }); }; //fix .modal-content height var $mc = $("." +profileModalClass + " .modal-content"); $mc.off('profileloaded'); $mc.on('profileloaded', function() { var viewHeader = $mc.find(".postboard > h2"); var h = viewHeader.offset().top + viewHeader.outerHeight() - $mc.parent().offset().top + 5; $mc.find(".postboard-posts-wrapper").css('border-top', parseInt(h, 10) + "px solid transparent"); }); $mc.trigger('profileloaded'); } function newHashtagModal(hashtag) { var hashtagModalContent = $( "#hashtag-modal-template" ).children().clone(true); hashtagModalContent.find( ".postboard-news").click(function (){ $(this).hide(); displayHashtagPending($(".hashtag-modal .postboard-posts")); }); clearHashtagProcessed(); updateHashtagModal( hashtagModalContent.find(".postboard-posts"), hashtag ); return hashtagModalContent; } function openHashtagModal(e) { e.stopPropagation(); e.preventDefault(); var $this = $( this ); var hashtag = $this.text().substring(1); var hashtagModalClass = "hashtag-modal"; openModal( hashtagModalClass ); $( "."+hashtagModalClass ).attr("data-resource","hashtag"); var hashtagModalContent = newHashtagModal( hashtag ); hashtagModalContent.appendTo("." +hashtagModalClass + " .modal-content"); //título do modal $( "."+hashtagModalClass + " h3" ).text( "#" + hashtag ); } function openHashtagModalFromSearch(hashtag) { var hashtagModalClass = "hashtag-modal"; openModal( hashtagModalClass ); $( "."+hashtagModalClass ).attr("data-resource","hashtag"); var hashtagModalContent = newHashtagModal( hashtag ); hashtagModalContent.appendTo("." +hashtagModalClass + " .modal-content"); //título do modal $( "."+hashtagModalClass + " h3" ).text( "#" + hashtag ); } function updateHashtagModal(postboard,hashtag) { var $hashtagModalClass = $(".hashtag-modal"); if( !$hashtagModalClass.length || $hashtagModalClass.css("display") == 'none' ) return; var resource = $hashtagModalClass.attr("data-resource"); requestHashtag(postboard,hashtag,resource); setTimeout( function() {updateHashtagModal(postboard,hashtag);}, 5000); } function openMentionsModal(e) { e.stopPropagation(); e.preventDefault(); // reuse the same hashtag modal to show mentions var hashtagModalClass = "hashtag-modal"; openModal( hashtagModalClass ); $( "."+hashtagModalClass ).attr("data-resource","mention"); var username; var $userInfo = $(this).closest("[data-screen-name]"); if( $userInfo.length ) username = $userInfo.attr("data-screen-name"); else username = defaultScreenName; var hashtagModalContent = newHashtagModal( username ); hashtagModalContent.appendTo("." +hashtagModalClass + " .modal-content"); //título do modal $( "."+hashtagModalClass + " h3" ).text( polyglot.t("users_mentions", { username: username }) ); // obtain already cached mention posts from twister_newmsgs.js processHashtag(hashtagModalContent.find(".postboard-posts"), defaultScreenName, getMentionsData() ); resetMentionsCount(); } function newFollowingModal(username) { var followingModalContent = $( "#following-modal-template" ).children().clone(true); updateFollowingData(followingModalContent, username); return followingModalContent; } function openFollowingModal(e) { e.stopPropagation(); e.preventDefault(); var $this = $( this ); var username = $.MAL.followingUrlToUser( $this.attr("href") ); var followingModalClass = "following-modal"; openModal( followingModalClass ); var followingModalContent = newFollowingModal( username ); followingModalContent.appendTo("." +followingModalClass + " .modal-content"); //título do modal $( "."+followingModalClass + " h3" ).text( polyglot.t("followed_by", { username: username }) ); } // // Post actions, submit, count characters // -------------------------------------- //dispara o modal de retweet var reTwistPopup = function( e ) { var reTwistClass = "reTwist"; openModal( reTwistClass ); //título do modal $( ".reTwist h3" ).text( polyglot.t("retransmit_this") ); var postdata = $(this).parents(".post-data").attr("data-userpost"); var postElem = postToElem($.evalJSON(postdata),""); postElem.appendTo( ".reTwist .modal-content" ); e.stopPropagation(); } //Expande Área do Novo post var replyInitPopup = function(e, post) { var replyClass = "reply"; openModal( replyClass ); //título do modal var fullname = post.find(".post-info-name").text(); $( ".reply h3" ).text( polyglot.t("reply_to", { fullname: fullname }) ); //para poder exibir a thread selecionada... var replyModalContent = $(".reply .modal-content").hide(); var retweetContent = $( "#reply-modal-template" ).children().clone(true); retweetContent.appendTo(replyModalContent); var postdata = post.find(".post-data").attr("data-userpost"); var postElem = postToElem($.evalJSON(postdata),""); postElem.appendTo(replyModalContent); var replyArea = $(".reply .post-area .post-area-new"); replyArea.addClass("open"); var replyText = replyArea.find("textarea"); var postInlineReplyText = $(".reply .post .post-area-new textarea"); var attrToCopy = ["placeholder", "data-reply-to"]; $.each(attrToCopy, function( i, attribute ) { replyText.attr( attribute, postInlineReplyText.attr(attribute) ); }); composeNewPost(e, replyArea); replyModalContent.fadeIn( "fast" ); } //abre o menu dropdown de configurações var dropDownMenu = function( e ) { var $configMenu = $( ".config-menu" ); $configMenu.slideToggle( "fast" ); e.stopPropagation(); } //fecha o config menu ao clicar em qualquer lugar da tela var closeThis = function() { $( this ).slideUp( "fast" ); }; var postExpandFunction = function( e, postLi ) { if( !postLi.hasClass( "original" ) ) { return; } var originalPost = postLi.find(".post-data.original"); var $postInteractionText = originalPost.find( ".post-expand" ); var $postExpandedContent = originalPost.find( ".expanded-content" ); var $postsRelated = postLi.find(".related"); var openClass = "open"; if( !postLi.hasClass( openClass ) ) { originalPost.detach(); postLi.empty(); postLi.addClass( openClass ); $postInteractionText.text( polyglot.t("Collapse") ); var itemOl = $("