diff options
author | Michael Vogel <icarus@dabo.de> | 2012-05-09 14:56:48 +0200 |
---|---|---|
committer | Michael Vogel <icarus@dabo.de> | 2012-05-09 14:56:48 +0200 |
commit | f2e648d62fe7cafb9a55c7505687ea4d1c294778 (patch) | |
tree | 07a1b31339ccd871bb4fbfe73e3f0d4911689795 /view/theme/diabook/js/jquery.twitter.search.js | |
parent | a3f08c44be78d4517e9f1619811def09b2ec7e7a (diff) | |
parent | 53157bb954acb7597347c6b4a87e64e7a2f6cc79 (diff) | |
download | volse-hubzilla-f2e648d62fe7cafb9a55c7505687ea4d1c294778.tar.gz volse-hubzilla-f2e648d62fe7cafb9a55c7505687ea4d1c294778.tar.bz2 volse-hubzilla-f2e648d62fe7cafb9a55c7505687ea4d1c294778.zip |
Merge remote branch 'upstream/master'
Diffstat (limited to 'view/theme/diabook/js/jquery.twitter.search.js')
-rw-r--r-- | view/theme/diabook/js/jquery.twitter.search.js | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/view/theme/diabook/js/jquery.twitter.search.js b/view/theme/diabook/js/jquery.twitter.search.js new file mode 100644 index 000000000..d3ccfe68e --- /dev/null +++ b/view/theme/diabook/js/jquery.twitter.search.js @@ -0,0 +1,289 @@ +/*! + * jQuery Twitter Search Plugin + * Examples and documentation at: http://jquery.malsup.com/twitter/ + * Copyright (c) 2010 M. Alsup + * Version: 1.04 (15-SEP-2011) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * Requires: jQuery v1.3.2 or later + */ + +;(function($) { + $.fn.twitterSearch = function(options) { + if (typeof options == 'string') + options = { term: options }; + return this.each(function() { + var grabFlag = false, + grabbing = false, + $frame = $(this), text, $text, $title, $bird, $cont, height, paused = false, + opts = $.extend(true, {}, $.fn.twitterSearch.defaults, options || {}, $.metadata ? $frame.metadata() : {}); + + opts.formatter = opts.formatter || $.fn.twitterSearch.formatter; + opts.filter = opts.filter || $.fn.twitterSearch.filter; + + if (!opts.applyStyles) { // throw away all style defs + for (var css in opts.css) + opts.css[css] = {}; + } + + if (opts.title === null) // user can set to '' to suppress title + opts.title = opts.term; + + opts.title = opts.title || ''; + text = opts.titleLink ? ('<a href="'+ opts.titleLink +'">'+ opts.title + '</a>') : ('<span>' + opts.title +'</span>'); + $text = $(text); + if (opts.titleLink) + $text.css(opts.css['titleLink']); + $title = $('<div class="twitterSearchTitle"></div>').append($text).appendTo($frame).css(opts.css['title']); + if (opts.bird) { + $bird = $('<img class="twitterSearchBird" src="'+opts.birdSrc+'" />').appendTo($title).css(opts.css['bird']); + if (opts.birdLink) + $bird.wrap('<a href="'+ opts.birdLink +'"></a>'); + } + $cont = $('<div class="twitterSearchContainter"></div>').appendTo($frame).css(opts.css['container']); + cont = $cont[0]; + if (opts.colorExterior) + $title.css('background-color',opts.colorExterior); + if (opts.colorInterior) + $cont.css('background-color',opts.colorInterior); + + $frame.css(opts.css['frame']); + if (opts.colorExterior) + $frame.css('border-color',opts.colorExterior); + + height = $frame.innerHeight() - $title.outerHeight(); + $cont.height(height); + + if (opts.pause) + $cont.hover(function(){paused = true;},function(){paused = false;}); + + $('<div class="twitterSearchLoading">Loading tweets..</div>').css(opts.css['loading']).appendTo($cont); + + grabTweets(); + + function grabTweets() { + var url = opts.url + opts.term; + grabFlag = false; + grabbing = true; + // grab twitter stream + $.getJSONP({ + url: url, + timeout: 30000, + error: function(xhr, status, e) { + failWhale(e); + }, + complete: function() { + grabbing = false; + if (opts.refreshSeconds) + setTimeout(regrab, opts.refreshSeconds * 1000); + }, + success: function(json) { + if (json.error) { + failWhale(json.error); + return; + } + $cont.fadeOut('fast',function() { + $cont.empty(); + + // iterate twitter results + $.each(json.results, function(i) { + if (!opts.filter.call(opts, this)) + return; // skip this tweet + var $img, $text, w, + tweet = opts.formatter(this, opts), + $tweet = $(tweet); + $tweet.css(opts.css['tweet']); + $img = $tweet.find('.twitterSearchProfileImg').css(opts.css['img']); + $tweet.find('.twitterSearchUser').css(opts.css['user']); + $tweet.find('.twitterSearchTime').css(opts.css['time']); + $tweet.find('a').css(opts.css['a']); + $tweet.appendTo($cont); + $text = $tweet.find('.twitterSearchText').css(opts.css['text']); + if (opts.avatar) { + w = $img.outerWidth() + parseInt($tweet.css('paddingLeft')); + $text.css('paddingLeft', w); + } + }); + + $cont.fadeIn('fast'); + + if (json.results.length < 2) { + if (opts.refreshSeconds) + setTimeout(grabTweets, opts.refreshSeconds * 1000); + return; + } + + // stage first animation + setTimeout(go, opts.timeout); + }); + } + }); + }; + + function regrab() { + grabFlag = true; + } + + function failWhale(msg) { + var $fail = $('<div class="twitterSearchFail">' + msg + '</div>').css(opts.css['fail']); + $cont.empty().append($fail); + }; + + function go() { + if (paused || grabbing) { + setTimeout(go, 500); + return; + } + var h, $el = $cont.children(':first'), el = $el[0]; + $el.animate(opts.animOut, opts.animOutSpeed, function() { + h = $el.outerHeight(); + $el.animate({ marginTop: -h }, opts.animInSpeed, function() { + $el.css({ marginTop: 0, opacity: 1 }); + /*@cc_on + try { el.style.removeAttribute('filter'); } // ie cleartype fix + catch(smother) {} + @*/ + $el.css(opts.css['tweet']).show().appendTo($cont); + + setTimeout(grabFlag ? grabTweets : go, opts.timeout); + }); + }); + } + }); + }; + + $.fn.twitterSearch.filter = function(tweet) { + return true; + }; + + $.fn.twitterSearch.formatter = function(json, opts) { + var str, pretty, + text = json.text; + if (opts.anchors) { + text = json.text.replace(/(http:\/\/\S+)/g, '<a href="$1">$1</a>'); + text = text.replace(/\@(\w+)/g, '<a href="http://twitter.com/$1">@$1</a>'); + } + str = '<div class="twitterSearchTweet">'; + if (opts.avatar) + str += '<img class="twitterSearchProfileImg" src="' + json.profile_image_url + '" />'; + str += '<div><span class="twitterSearchUser"><a href="http://www.twitter.com/'+ json.from_user+'/status/'+ json.id_str +'">' + + json.from_user + '</a></span>'; + pretty = prettyDate(json.created_at); + if (opts.time && pretty) + str += ' <span class="twitterSearchTime">('+ pretty +')</span>' + str += '<div class="twitterSearchText">' + text + '</div></div></div>'; + return str; + }; + + $.fn.twitterSearch.defaults = { + url: 'http://search.twitter.com/search.json?callback=?&q=', + anchors: true, // true or false (enable embedded links in tweets) + animOutSpeed: 500, // speed of animation for top tweet when removed + animInSpeed: 500, // speed of scroll animation for moving tweets up + animOut: { opacity: 0 }, // animation of top tweet when it is removed + applyStyles: true, // true or false (apply default css styling or not) + avatar: true, // true or false (show or hide twitter profile images) + bird: true, // true or false (show or hide twitter bird image) + birdLink: false, // url that twitter bird image should like to + birdSrc: 'http://cloud.github.com/downloads/malsup/twitter/tweet.gif', // twitter bird image + colorExterior: null, // css override of frame border-color and title background-color + colorInterior: null, // css override of container background-color + filter: null, // callback fn to filter tweets: fn(tweetJson) { /* return false to skip tweet */ } + formatter: null, // callback fn to build tweet markup + pause: false, // true or false (pause on hover) + refreshSeconds: 0, // number of seconds to wait before polling for newer tweets + term: '', // twitter search term + time: true, // true or false (show or hide the time that the tweet was sent) + timeout: 4000, // delay betweet tweet scroll + title: null, // title text to display when frame option is true (default = 'term' text) + titleLink: null, // url for title link + css: { + // default styling + a: { textDecoration: 'none', color: '#3B5998' }, + bird: { width: '50px', height: '20px', position: 'absolute', left: '-30px', top: '-20px', border: 'none' }, + container: { overflow: 'hidden', backgroundColor: '', height: '600px' }, + fail: { background: '#6cc5c3 url(http://cloud.github.com/downloads/malsup/twitter/failwhale.png) no-repeat 50% 50%', height: '100%', padding: '10px' }, + frame: { border: '0px solid #C2CFF1', borderRadius: '0px', '-moz-border-radius': '0px', '-webkit-border-radius': '0px' }, + tweet: { padding: '5px 10px', clear: 'left' }, + img: { 'float': 'left', margin: '5px', width: '48px', height: '48px' }, + loading: { padding: '20px', textAlign: 'center', color: '#888' }, + text: {}, + time: { fontSize: 'smaller', color: '#888' }, + title: { 'display': 'none'}, + titleLink: { textDecoration: 'none', color: '#3B5998' }, + user: { fontWeight: 'bold' } + } + }; + + // fn to handle jsonp with timeouts and errors + // hat tip to Ricardo Tomasi for the timeout logic + $.getJSONP = function(s) { + s.dataType = 'jsonp'; + $.ajax(s); + + // figure out what the callback fn is + var $script = $(document.getElementsByTagName('head')[0].firstChild); + var url = $script.attr('src') || ''; + var cb = (url.match(/callback=(\w+)/)||[])[1]; + if (!cb) + return; // bail + var t = 0, cbFn = window[cb]; + + $script[0].onerror = function(e) { + $script.remove(); + handleError(s, {}, "error", e); + clearTimeout(t); + }; + + if (!s.timeout) + return; + + window[cb] = function(json) { + clearTimeout(t); + cbFn(json); + cbFn = null; + }; + + t = setTimeout(function() { + $script.remove(); + handleError(s, {}, "timeout"); + if (cbFn) + window[cb] = function(){}; + }, s.timeout); + + function handleError(s, xhr, msg, e) { + s.error && s.error.call(s.context, xhr, msg, e); + s.global && $.event.trigger("ajaxError", [xhr, s, e || msg]); + s.complete && s.complete.call(s.context, xhr, e || msg); + } + }; + + /* + * JavaScript Pretty Date + * Copyright (c) 2008 John Resig (jquery.com) + * Licensed under the MIT license. + */ + // converts ISO time to casual time + function prettyDate(time){ + var date = new Date((time || "").replace(/-/g,"/").replace(/TZ/g," ")), + diff = (((new Date()).getTime() - date.getTime()) / 1000), + day_diff = Math.floor(diff / 86400); + + if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 ) + return; + var v = day_diff == 0 && ( + diff < 60 && "just now" || + diff < 120 && "1 minute ago" || + diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" || + diff < 7200 && "1 hour ago" || + diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") || + day_diff == 1 && "Yesterday" || + day_diff < 7 && day_diff + " days ago" || + day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago"; + if (!v) + window.console && console.log(time); + return v ? v : ''; + } + +})(jQuery); |