/** * Userstream @ Supertopic * @created 22.06.2008 * @updated 28.10.2008 * @author Matthias Kunze */ var lastTimestamp = 0; // timestamp of last item var lastUserID = 0; // user-id of last item var intervalIndex = []; // haystack of interval indexes var streamStarted = false; // stream already started? var newTimeout = 0; // timeout for mouseout (default: 2 sec.) var isMultiple = false; // multiple activities for one user var showNewImages = true; // display new stream images var countImages = 0; // current number of images var panelHidden = true; // is the options panel hidden? var enableDebug = false; var currentItem = {}; var itemDivProperties = { fromTop : 0, fromLeft : 0, width : 0, height : 0 }; var ajaxFile = rootdir + '/app/widgets/userstream/ajax.stream.php'; /** * interval for displaying new activities */ var interval = getCookie('stream-interval') || 5; // in seconds /** * init */ $j(document).ready(function () { $j('input[type=submit].abort').bind('click', abortStreamOptions); $j('.stream-options-trigger').bind('click', toggleOptionsPanel); $j('.stream-reload-trigger').bind('click', reloadStream); $j('#stream-options-form').bind('submit', saveStreamOptions); itemDivProperties = { fromTop : $('outer').offsetTop, fromLeft : $('outer').offsetLeft, width : $('outer').offsetWidth, height : $('outer').offsetHeight }; bindMouseEvents(); startStream(); }); function bindMouseEvents() { $j('.stream-outer').bind('mouseover', function (e) { checkOverAndOut(e); }); $j('.stream-outer').bind('mouseout', function (e) { checkOverAndOut(e); }); } function unbindMouseEvents() { $j('.stream-outer').unbind('mouseover').unbind('mouseout'); } /** * check cursor position on mouseover and -out */ function checkOverAndOut(event) { // cursor position var cursor = getPosition(event); // mouseover if (cursor.y >= itemDivProperties.fromTop && cursor.y < (itemDivProperties.fromTop + itemDivProperties.height) && cursor.x >= itemDivProperties.fromLeft && cursor.x < (itemDivProperties.fromLeft + itemDivProperties.width)) { // stop interval stopStreamInterval(); jQuery('.stream-options-trigger').fadeIn('fast'); jQuery('.stream-reload-trigger').fadeIn('fast'); } // mouseout else { newTimeout = setTimeout("startStreamInterval()", 2000); jQuery('.stream-options-trigger').fadeOut('fast'); jQuery('.stream-reload-trigger').fadeOut('fast'); } } /** * get cursor position * @param event trigger */ function getPosition(e) { e = e || window.event; var cursor = {x:0, y:0}; if (e.pageX || e.pageY) { cursor.x = e.pageX; cursor.y = e.pageY; } else { var de = document.documentElement; var b = document.body; cursor.x = e.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0); cursor.y = e.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0); } return cursor; } /** * start stream with new images */ var picIndex = 0; var userImages = []; var prevPicLink = ''; function startStream() { var helperArray = []; $j.get(ajaxFile, { ts : lastTimestamp, ui : lastUserID }, function (data) { userStream = data; if (userStream.length == 0) { if (lastTimestamp == 0 && lastUserID == 0) { jQuery('.streampfeil').fadeOut(); jQuery('#stream-images').fadeOut(); jQuery('#stream-text').html('Es wurden keine Aktivitäten gefunden.'); return false; } else { lastTimestamp = 0; lastUserID = 0; return startStream(); } } jQuery('.streampfeil').fadeIn(); jQuery('#stream-images').fadeIn(); var counter = 0; jQuery.each(userStream, function () { if (counter == 0 || this.piclink != prevPicLink) { helperArray[counter] = { image : this.image, piclink : this.piclink, items : [] }; helperArray[counter].items.push(this); counter++; } else { helperArray[counter-1].items.push(this); } prevPicLink = this.piclink; }); userStream = helperArray; prevPicLink = ''; showNewImages = true; itemCounter = 0; startStreamInterval(); }, 'json'); return false; } function startStreamInterval() { // if stream not started yet if (streamStarted === false) { parseStream(); intervalIndex.push(setInterval("parseStream()", (interval * 1000))); streamStarted = true; } } function stopStreamInterval() { // stop all collected intervals while (intervalIndex.length) { clearInterval(intervalIndex.shift()); } clearTimeout(newTimeout); streamStarted = false; } var itemIndex = 0; var itemCounter = 0; function parseStream() { if (picIndex == userStream.length) { stopStreamInterval(); picIndex = 0; startStream(); return false; } var arrowFromLeft = picIndex % 5; if (arrowFromLeft == 0 && itemCounter == 0) { // lade bilder var userImages = []; for (var i = picIndex; i < (picIndex + 5); i++) { // save new images userImages.push( '' ); if (typeof(userStream[(i+1)]) === 'undefined') { break; } } jQuery('#stream-images') .animate({'opacity': .6}, 'fast') .html(userImages.join('')) .animate({'opacity': 1}, 'fast'); } var newLeft = (75 * arrowFromLeft) + 'px'; // move the arrow to the next image jQuery('.streampfeil').animate({'left': newLeft}, 'normal'); currentItem = userStream[picIndex].items[itemIndex]; showActivityItem(currentItem); itemCounter++; if (itemIndex == userStream[picIndex].items.length) { picIndex++; itemIndex = 0; itemCounter = 0; } } /** * generate the html */ function showActivityItem(object) { var itemText = object.text; var text = '' + itemText + '
' + '' + object.relative + ''; var div = cE('div'); div.innerHTML = text; div.style.visibility = 'hidden'; div.id = 'strDiv'; // display new text $('stream-text').update(); $('stream-text').appendChild(div); globalFadeOn('strDiv'); // get the dimensions of the stream text div // for mouseover and -out events itemDivProperties = { fromTop : $('outer').offsetTop, fromLeft : $('outer').offsetLeft, width : $('outer').offsetWidth, height : $('outer').offsetHeight }; // save the last timestamp lastTimestamp = object.time; lastUserID = object.userid; itemIndex++; //alert(itemIndex); } function toggleOptionsPanel() { return panelHidden === true ? showOptionPanel() : hideOptionPanel(); } function showOptionPanel() { stopStreamInterval(); jQuery('.streamoptions').fadeIn('fast', unbindMouseEvents); panelHidden = false; return false; } function hideOptionPanel() { jQuery('.stream-options-trigger').fadeOut('fast'); jQuery('.stream-reload-trigger').fadeOut('fast'); jQuery('.streamoptions').fadeOut('fast', function () { newTimeout = setTimeout("startStreamInterval()", 2000); bindMouseEvents(); }); panelHidden = true; return false; } function abortStreamOptions() { $('stream-options-form').reset(); return hideOptionPanel(); } function reloadStream() { abortStreamOptions(); picIndex = 0; startStream(); return false; } /** * saving the stream settings */ function saveStreamOptions() { jQuery.post( ajaxFile, jQuery('#stream-options-form').serialize(), function () { lastTimestamp = 0; lastUserID = 0; interval = jQuery('select[name=interval]').val(); jQuery('.stream-options-trigger').fadeOut('fast'); jQuery('.stream-reload-trigger').fadeOut('fast'); jQuery('.streamoptions').fadeOut('fast', bindMouseEvents); panelHidden = true; picIndex = 0; setTimeout("startStream()", 700); } ); return false; }