var WebSocketReceiver = { initialize: function(url) { ws = new WebSocket(url); //Attach onmessage to websocket ws.onmessage = WSR.onMessage; ws.onclose = function() { WSR.debug("socket closed"); }; ws.onopen = function() { ws.send(location.pathname); WSR.debug("connected..."); }; }, onMessage: function(evt) { var obj = jQuery.parseJSON(evt.data); if(obj['class'] == 'notifications') { WebSocketReceiver.processNotification(obj); } else if (obj['class'] == 'people') { WSR.debug("got a " + obj['class']); WebSocketReceiver.processPerson(obj); } else { WSR.debug("got a " + obj['class'] + " for aspects " + obj.aspect_ids); if (obj['class']=="retractions") { WebSocketReceiver.processRetraction(obj.post_id); } else if (obj['class']=="comments") { WebSocketReceiver.processComment(obj.post_id, obj.comment_id, obj.html, { 'notification': obj.notification, 'mine?': obj['mine?'], 'my_post?': obj['my_post?'] }); } else { WebSocketReceiver.processPost(obj['class'], obj.post_id, obj.html, obj.aspect_ids); } } }, processPerson: function(response) { form = $('.webfinger_form'); form.siblings('#loader').hide(); result_ul = form.siblings('#request_result'); if(response.status == 'fail') { result_ul.siblings('.error').show(); result_ul.find('.error').text(response.response).show(); } else { $('#people_stream').prepend(response.html).slideDown('slow', function(){}); var first_li = result_ul.find('li:first'); first_li.hide() first_li.after(response.html); result_ul.find("[name='request[into]']").val(result_ul.attr('aspect_id')); result_ul.children(':nth-child(2)').slideDown('fast', function(){}); } }, processNotification: function(notification){ var nBadge = $("#notification_badge_number"); nBadge.html().replace(/\d+/, function(num){ nBadge.html(parseInt(num)+1); }); if(nBadge.hasClass("hidden")){ nBadge.removeClass("hidden"); } $('#notification').html(notification['html']) .fadeIn(200) .delay(8000) .fadeOut(200, function(){ $(this).html(""); }); }, processRetraction: function(post_id){ $("*[data-guid='" + post_id + "']").fadeOut(400, function() { $(this).remove(); }); if($("#main_stream")[0].childElementCount == 0) { $("#no_posts").fadeIn(200); } }, processComment: function(postId, commentId, html, opts) { if( $(".comment[data-guid='"+commentId+"']").length == 0 ) { post = $("*[data-guid='"+postId+"']'"); $('.comments li:last', post ).before( $(html).fadeIn("fast", function(){}) ); toggler = $('.show_post_comments', post); if(toggler.length > 0){ toggler.html( toggler.html().replace(/\d+/,$('.comments', post).find('li').length -1) ); if( !$(".comments", post).is(':visible') ) { toggler.click(); } if( $(".show_comments", post).hasClass('hidden') ){ $(".show_comments", post).removeClass('hidden'); } } } Diaspora.widgets.timeago.updateTimeAgo(); }, processPost: function(className, postId, html, aspectIds) { if(WebSocketReceiver.onPageForAspects(aspectIds)) { WebSocketReceiver.addPostToStream(postId, html); } }, addPostToStream: function(postId, html) { if( $(".stream_element[data-guid='" + postId + "']").length == 0 ) { var streamElement = $(html); var showMessage = function() { $("#main_stream:not('.show')").prepend( streamElement.fadeIn("fast", function() { streamElement.find("label").inFieldLabels(); }) ); }; if( $("#no_posts").is(":visible") ) { $("#no_posts").fadeOut(400, showMessage()).hide(); } else { showMessage(); } Diaspora.widgets.timeago.updateTimeAgo(); } }, onPageForClass: function(className) { return (location.href.indexOf(className) != -1 ); }, onPageForAspects: function(aspectIds) { var streamIds = $('#main_stream').attr('data-guids'), found = false; $.each(aspectIds, function(index, value) { if(WebSocketReceiver.onStreamForAspect(value, streamIds)) { found = true; return false; }; }); return found; }, onStreamForAspect: function(aspectId, streamIds) { return (streamIds.search(aspectId) != -1); }, onPageOne: function() { var c = document.location.search.charAt(document.location.search.length-1); return ((c =='') || (c== '1')); }, debug: function(str) { $("#debug").append("<p>" + str); } }; var WSR = WebSocketReceiver;