(function($) { $.fn.extend({ dnews: function(options) { var settings = $.extend({ controls: true, switchInterval: 5000, feedurl: '', showdetail: true, moretext: '[...]', controlsalwaysvisible: true, entries: 10 }, options); return this.each(function() { var direction = "forward"; var wrapper = $(this); var interval; var prevIndex = 0; var curIndex = 0; var mode = 'auto'; //auto, manual var next, prev, play, pause; var containerWidth; var left; var total; var allHeadlines; var controlbar; var previewWraper; var mouseEntered = 0; function setPlayingStatus(isPlaying) { if (isPlaying) { play.css('display', 'none'); pause.css('display', ''); } else { play.css('display', ''); pause.css('display', 'none'); } } if (settings.showdetail) { previewWraper = $('
').attr('id', wrapper.attr('id') + '-' + 'preview').addClass('preview-wrapper').css('opacity', '0').css('visibility', 'hidden'); previewWraper.append($('').addClass('preview') .append($('')) .append($(''))).append($('').addClass('tip')); wrapper.before(previewWraper); } if (settings.controls) { controlbar = $('').addClass('control-bar').css('display', 'none'); wrapper.after(controlbar); next = $('').addClass('next'); prev = $('').addClass('prev'); play = $('').addClass('play'); pause = $('').addClass('pause'); var left = $('.news', wrapper).width() / 2 - controlbar.width() / 2; controlbar.css('left', left); controlbar.append($('').addClass('controls-wrapper').append(prev).append(pause).append(play).append(next)); setPlayingStatus(true); next.click(function() { mode = 'manual'; setPlayingStatus(false); stopAnimation(); direction = "forward"; if (prevIndex > curIndex) { var temp = curIndex; curIndex = prevIndex; prevIndex = temp; } switchNews(); }); prev.click(function() { mode = 'manual'; setPlayingStatus(false); stopAnimation(); direction = "backward"; if (prevIndex < curIndex) { var temp = curIndex; curIndex = prevIndex; prevIndex = temp; } switchNews(); }); play.click(function() { mode = 'manual'; setPlayingStatus(true); startAnimation(); }); pause.click(function() { mode = 'manual'; setPlayingStatus(false); stopAnimation(); }); } var id = 0; var descriptions = new Array(); //build news headlines from feed if (settings.feedurl != '') { $('.news', wrapper).html('
');
google.setOnLoadCallback(function OnLoad() {
var feed = new google.feeds.Feed(settings.feedurl);
feed.setNumEntries(settings.entries);
feed.setResultFormat(google.feeds.Feed.XML_FORMAT);
feed.load(feedLoaded);
});
function feedLoaded(result) {
if (!result.error) {
$('.news', wrapper).html('');
var chanels = $(result.xmlDocument).find('channel');
var newsHome = $('>link', chanels).text();
var newsDate = chanels.find('lastBuildDate').text();
var allNews = chanels.find('item');
allNews.each(function(index, news) {
id++;
var headlintext = $(news).find('title').text();
if (headlintext.length > 100)
headlintext = headlintext.substr(0, 100) + ' ...';
var headline = $('').addClass('headline').append($('').attr('id', id).html(headlintext).attr('href', $(news).find('link').text()));
descriptions.push($(news).find('description').text());
$('.news', wrapper).append(headline);
});
setupHeadlines();
}
else alert(result.error);
}
}
else {
$('.news a', wrapper).each(function(index, news) {
id++;
descriptions.push($(news).attr('title'));
$(news).attr('id', id).removeAttr('title');
});
setupHeadlines();
}
/*wrapper.find('.news').hover(stopAnimation, function() { if (mode == 'auto') startAnimation(); });*/
function stopAnimation() { clearInterval(interval); }
function startAnimation() { interval = setInterval(switchNews, settings.switchInterval); }
function setupHeadlines() {
if (settings.controls)
controlbar.css('display', '');
wrapper.prepend($('').addClass('news-title'));
containerWidth = $('.news', wrapper).width() + $('.news-title', wrapper).width();
allHeadlines = $('.headline', wrapper);
left = wrapper.find('.news').css('left');
if (left == 'auto') left = $('.news-title').width() + 'px';
allHeadlines.css('left', '-' + containerWidth + 'px');
total = allHeadlines.length;
$(allHeadlines[curIndex]).css('left', left);
interval = setInterval(switchNews, settings.switchInterval);
if (previewWraper != null) {
var previewWrapperLeft = previewWraper.offset().left;
previewWraper.animate({ opacity: 0 }, 1000, function() { $(this).css('visibility', 'hidden'); });
}
if (!settings.controlsalwaysvisible)
controlbar.slideUp("fast");
wrapper.mouseenter(function(e) {
stopAnimation();
mouseEntered = getMousePosition(e, wrapper);
if (!settings.controlsalwaysvisible)
controlbar.slideDown("fast");
});
wrapper.mouseleave(function(e) {
if (mode == 'auto') startAnimation();
var mpos = getMousePosition(e, wrapper);
var direction = mouseEntered[1] > mpos[1] ? "u" : "d";
if (direction == 'u') {
if (!settings.controlsalwaysvisible)
controlbar.slideUp("fast");
}
if (direction == 'd') {
if (previewWraper != null)
previewWraper.animate({ opacity: 0 }, 500, function() { $(this).css('visibility', 'hidden'); });
}
});
if (settings.controls) {
controlbar.mouseleave(function() {
if (!settings.controlsalwaysvisible)
controlbar.slideUp("fast");
if (previewWraper != null)
previewWraper.animate({ opacity: 0 }, 500, function() { $(this).css('visibility', 'hidden'); });
});
}
previewWraper.mouseleave(function() {
if (!settings.controlsalwaysvisible)
controlbar.slideUp("fast");
if (previewWraper != null)
previewWraper.animate({ opacity: 0 }, 500, function() { $(this).css('visibility', 'hidden'); });
});
if (settings.showdetail) {
$('.headline', wrapper).mouseenter(function(e) {
var top = -(previewWraper.height() + $('.tip').height() + 2);
previewWraper.css('top', top);
var description = descriptions[parseInt($(this).find('a').attr('id')) - 1];
if (description == '') description = $(this).find('a').html();
if (description.length > 120) description = description.substr(0, 120);
description += '' + settings.moretext + '';
var previewId = wrapper.attr('id') + '-' + 'preview';
$('#' + previewId + ' p').html(description);
$('#' + previewId + ' h4').html($(this).find('a').html());
var previewleft = $(this).offset().left - previewWrapperLeft;
previewWraper.css('left', previewleft + 'px')
.css('visibility', 'visible')
.stop()
.animate({ opacity: 1.0 }, 1000, function() {
});
});
}
}
function switchNews() {
if (direction == 'forward') {
curIndex = (prevIndex + 1) % total;
$(allHeadlines[prevIndex]).stop().animate({ 'left': containerWidth + 'px' }, "slow", function() {
$(this).css('left', '-' + containerWidth + 'px');
});
$(allHeadlines[curIndex]).stop().animate({ 'left': left }, "slow");
}
else {
curIndex = (prevIndex > 0 ? prevIndex - 1 : total - 1) % total;
$(allHeadlines[prevIndex]).stop().animate({ 'left': -containerWidth + 'px' }, "slow");
$(allHeadlines[curIndex]).css({ 'left': containerWidth + 'px' }).stop().animate({ 'left': left }, "slow");
}
prevIndex = curIndex;
}
function getMousePosition(e, el) {
var x = 0;
var y = 0;
if (e.offsetX || e.offsetY) {
x = e.offsetX;
y = e.offsetY;
}
else if (e.pageX || e.pageY) {
x = e.pageX - parseInt($(el).css('left'));
y = e.pageY - parseInt($(el).css('top'));
}
else if (e.clientX || e.clientY) {
x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
return [x, y];
}
});
}
});
})(jQuery);