/** * The heartbeat object. */ Drupal.heartbeat = Drupal.heartbeat || {}; Drupal.heartbeat.moreLink = null; /** * wait(). * Function that shows throbber while waiting a response. */ Drupal.heartbeat.wait = function(element, parentSelector) { // We wait for a server response and show a throbber // by adding the class heartbeat-messages-waiting. Drupal.heartbeat.moreLink = $(element).parents(parentSelector); // Disable double-clicking. if (Drupal.heartbeat.moreLink.is('.heartbeat-messages-waiting')) { return false; } Drupal.heartbeat.moreLink.addClass('heartbeat-messages-waiting'); } /** * doneWaiting(). * Function that is triggered if waiting period is over, to start * normal behavior again. */ Drupal.heartbeat.doneWaiting = function() { Drupal.heartbeat.moreLink.removeClass('heartbeat-messages-waiting'); } /** * getOlderMessages(). * Fetch older messages with ajax. */ Drupal.heartbeat.getOlderMessages = function(element, page, account) { Drupal.heartbeat.wait(element, '.heartbeat-more-messages-wrapper'); var post = { block: page ? 0 : 1, ajax: 1 }; if (account != undefined && account != -1) { post.account = account; } $.event.trigger('heartbeatBeforeOlderMessages', [post]); $.post(element.href, post, Drupal.heartbeat.appendMessages); } /** * pollMessages(). * Function that checks and fetches newer messages to the * current stream. */ Drupal.heartbeat.pollMessages = function(stream) { var stream_selector = '#heartbeat-stream-' + stream; if ($(stream_selector).length > 0) { var href = Drupal.settings.heartbeat_poll_url; var uaids = new Array(); var beats = $(stream_selector + ' .beat-item'); var firstUaid = 0; if (beats.length > 0) { firstUaid = $(beats.get(0)).attr('id').replace("beat-item-", ""); beats.each(function(i) { var uaid = parseInt($(this).attr('id').replace("beat-item-", "")); uaids.push(uaid); }); } var post = { latestUaid: firstUaid, language: Drupal.settings.heartbeat_language, stream: stream, uaids: uaids.join(',') }; $.event.trigger('heartbeatBeforePoll', [post]); if (firstUaid) { $.post(href, post, Drupal.heartbeat.prependMessages); } } } /** * appendMessages(). * Function that appends older messages to the stream. */ Drupal.heartbeat.appendMessages = function(data) { var result = Drupal.parseJson(data); var wrapper = Drupal.heartbeat.moreLink.parents('.heartbeat-messages-wrapper'); Drupal.heartbeat.moreLink.remove(); var data = $(result['data']); wrapper.append(data); Drupal.heartbeat.doneWaiting(); // Reattach behaviors for new added html Drupal.attachBehaviors(data); } /** * prependMessages(). * Append messages to the front of the stream. This done for newer * messages, often with the auto poller. */ Drupal.heartbeat.prependMessages = function(data) { var result = Drupal.parseJson(data); var stream_selector = '#heartbeat-stream-' + result['stream']; // Update the times in the stream if (result['time_updates'] != undefined) { var time_updates = result['time_updates']; for (uaid in time_updates) { $(stream_selector + ' #beat-item-' + uaid).find('.heartbeat_times').html(time_updates[uaid]); } } // Append the messages if (result['data'] != '') { var data = $(result['data']); $(stream_selector + ' .heartbeat-messages-wrapper').prepend(data); // Reattach behaviors for new added html Drupal.attachBehaviors(data); } } /** * splitGroupedMessage(). * * Splits a grouped message into separate ones. * * @param Integer uaid * The user activity Id for the grouped message. * @param Array uaids * The standalone user activity Ids involved in the grouped message. */ Drupal.heartbeat.splitGroupedMessage = function(uaid, uaids) { if (uaids == null) { $("#beat-item-" + uaid).show('slow'); $("#beat-item-" + uaid + "-ungrouped").hide('slow'); } else { $("#beat-item-" + uaid).hide('slow'); $("#beat-item-" + uaid + "-ungrouped").show('slow'); } } /** * Document onReady(). */ $(document).ready(function() { var span = 0; if (Drupal.settings.heartbeatPollNewerMessages != undefined) { for (n in Drupal.settings.heartbeatPollNewerMessages) { if (parseInt(Drupal.settings.heartbeatPollNewerMessages[n]) > 0) { var interval = (Drupal.settings.heartbeatPollNewerMessages[n] * 1000) + span; var poll = setInterval('Drupal.heartbeat.pollMessages("' + n + '")', interval); span += 100; } } } });