/** * 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) { Drupal.heartbeat.wait(element, '.heartbeat-more-messages-wrapper'); $.post(element.href, {block: page ? 0 : 1, ajax: 1}, 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.basePath + 'heartbeat/js/poll'; 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(); wrapper.append(result['data']); Drupal.heartbeat.doneWaiting(); // Reattach behaviors for new added html Drupal.attachBehaviors($('.heartbeat-messages-wrapper')); } /** * 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'] != '') { $(stream_selector + ' .heartbeat-messages-wrapper').prepend(result['data']); // Reattach behaviors for new added html Drupal.attachBehaviors($(stream_selector + ' .heartbeat-messages-wrapper')); } } /** * 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; } } } });