(function($){if(!$.fn.reverse){$.fn.reverse=function(){return this.pushStack(this.get().reverse(),arguments)}}$.fn.liveTwitter=function(query,options,callback){var domNode=this;$(this).each(function(){var settings={};if(this.twitter){settings=$.extend(this.twitter.settings,options);this.twitter.settings=settings;if(query){this.twitter.query=query}if(this.twitter.interval){this.twitter.refresh()}if(callback){this.twitter.callback=callback}}else{settings=$.extend({mode:'search',rate:15000,limit:10,imageSize:24,refresh:true,timeLinks:true,retweets:false,service:false,localization:{seconds:'seconds ago',minute:'a minute ago',minutes:'minutes ago',hour:'an hour ago',hours:'hours ago',day:'a day ago',days:'days ago'}},options);if(typeof settings.showAuthor==="undefined"){settings.showAuthor=(settings.mode==='user_timeline')?false:true}if(!window.twitter_callback){window.twitter_callback=function(){return true}}this.twitter={settings:settings,query:query,interval:false,container:this,lastTimeStamp:0,callback:callback,relativeTime:function(timeString){var parsedDate=Date.parse(timeString);var delta=(Date.parse(Date())-parsedDate)/1000;var r='';if(delta<60){r=delta+" "+settings.localization.seconds}else if(delta<120){r=settings.localization.minute}else if(delta<(45*60)){r=(parseInt(delta/60,10)).toString()+" "+settings.localization.minutes}else if(delta<(90*60)){r=settings.localization.hour}else if(delta<(24*60*60)){r=''+(parseInt(delta/3600,10)).toString()+" "+settings.localization.hours}else if(delta<(48*60*60)){r=settings.localization.day}else{r=(parseInt(delta/86400,10)).toString()+" "+settings.localization.days}return r},updateTimestamps:function(){var twitter=this;$(twitter.container).find('span.time').each(function(){var time_element=twitter.settings.timeLinks?$(this).find('a'):$(this);time_element.html(twitter.relativeTime(this.timeStamp))})},apiURL:function(){var params={};var protocol=(window.location.protocol==='https:')?'https:':'http:';var baseURL='api.twitter.com/1/';var endpoint='';if(this.settings.service){baseURL=this.settings.service+'/api/'}if(this.settings.mode==='search'){baseURL=(this.settings.service)?this.settings.service+'/api/':'search.twitter.com/';endpoint='search';params={q:(this.query&&this.query!=='')?this.query:null,geocode:this.settings.geocode,lang:this.settings.lang,rpp:(this.settings.rpp)?this.settings.rpp:this.settings.limit}}else if(this.settings.mode==='user_timeline'||this.settings.mode==='home_timeline'){endpoint='statuses/'+this.settings.mode+'/'+encodeURIComponent(this.query);params={count:this.settings.limit,include_rts:(this.settings.mode==='user_timeline'&&this.settings.retweets)?'1':null}}else if(this.settings.mode==='favorites'){endpoint='favorites';params={id:encodeURIComponent(this.query)}}else if(this.settings.mode==='list'){endpoint=encodeURIComponent(this.query.user)+'/lists/'+encodeURIComponent(this.query.list)+'/statuses';params={per_page:this.settings.limit}}var queryString=[];for(var param in params){if(params.hasOwnProperty(param)&&typeof params[param]!=='undefined'&&params[param]!==null){queryString[queryString.length]=param+'='+encodeURIComponent(params[param])}}queryString=queryString.join("&");return protocol+'//'+baseURL+endpoint+'.json?'+queryString+'&callback=?'},parseTweet:function(json){var tweet={id:(json.id_str)?json.id_str:json.id,text:json.text,created_at:json.created_at};if(this.settings.mode==='search'){tweet=$.extend(tweet,{screen_name:json.from_user,profile_image_url:json.profile_image_url})}else{tweet=$.extend(tweet,{screen_name:json.user.screen_name,profile_image_url:json.user.profile_image_url,created_at:json.created_at.replace(/^(\w+)\s(\w+)\s(\d+)(.*)(\s\d+)$/,"$1, $3 $2$5$4")})}if(this.settings.service){tweet=$.extend(tweet,{url:'http://'+this.settings.service+'/notice/'+tweet.id,profile_url:'http://'+this.settings.service+'/'+json.from_user});if(window.location.protocol==='https:'){tweet.profile_image_url=tweet.profile_image_url.replace('http:','https:')}}else{tweet=$.extend(tweet,{url:'http://twitter.com/#!/'+tweet.screen_name+'/status/'+tweet.id,profile_url:'http://twitter.com/#!/'+tweet.screen_name});if(window.location.protocol==='https:'){var matches=tweet.profile_image_url.match(/http[s]?:\/\/a[0-9]\.twimg\.com\/(\w+)\/(\w+)\/(.*?)\.(\w+)/i);if(matches){tweet.profile_image_url="https://s3.amazonaws.com/twitter_production/"+matches[1]+"/"+matches[2]+"/"+matches[3]+"."+matches[4]}else{tweet.profile_image_url=tweet.profile_image_url.replace('http:','https:')}}}return tweet},parseText:function(text){text=text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g,function(m){return'<a href="'+m+'" rel="external">'+m+'</a>'});if(!this.settings.service){text=text.replace(/@[A-Za-z0-9_]+/g,function(u){return'<a href="http://twitter.com/#!/'+u.replace(/^@/,'')+'" rel="external">'+u+'</a>'});text=text.replace(/#[A-Za-z0-9_\-]+/g,function(u){return'<a href="http://twitter.com/#!/search?q='+u.replace(/^#/,'%23')+'" rel="external">'+u+'</a>'})}else{text=text.replace(/@[A-Za-z0-9_]+/g,function(u){return'<a href="http://'+settings.service+'/'+u.replace(/^@/,'')+'" rel="external">'+u+'</a>'});text=text.replace(/#[A-Za-z0-9_\-]+/g,function(u){return'<a href="http://'+settings.service+'/search/notice?q?'+u.replace(/^#/,'%23')+'" rel="external">'+u+'</a>'})}return text},renderTweet:function(tweet){var html='<div class="tweet tweet-'+tweet.id+'">';if(this.settings.showAuthor){html+='<img width="'+this.settings.imageSize+'" height="'+this.settings.imageSize+'" src="'+tweet.profile_image_url+'" />';html+='<p class="text"><span class="username"><a href="'+tweet.profile_url+'" rel="external">'+tweet.screen_name+'</a>:</span> '}else{html+='<p class="text"> '}html+=this.parseText(tweet.text);if(this.settings.timeLinks){html+=' <span class="time">';html+='<a href="'+tweet.url+'" rel="external">';html+=this.relativeTime(tweet.created_at);html+='</a></span>'}else{html+=' <span class="time">'+this.relativeTime(tweet.created_at)+'</span>'}html+='</p></div>';return html},refresh:function(initialize){var twitter=this;if(twitter.settings.refresh||initialize){$.getJSON(twitter.apiURL(),function(json){var newTweets=0;var results=(twitter.settings.mode==='search')?json.results:json;$(results).reverse().each(function(){var tweet=twitter.parseTweet(this);if(!twitter.settings.filter||twitter.settings.filter(this)){if(Date.parse(tweet.created_at)>twitter.lastTimeStamp){$(twitter.container).prepend(twitter.renderTweet(tweet));$(twitter.container).find('span.time:first').each(function(){this.timeStamp=tweet.created_at});if(!initialize){$(twitter.container).find('.tweet-'+tweet.id).hide().fadeIn()}twitter.lastTimeStamp=Date.parse(tweet.created_at);newTweets+=1}}});if(newTweets>0){$(twitter.container).find('div.tweet:gt('+(twitter.settings.limit-1)+')').remove();if(twitter.callback){twitter.callback(domNode,newTweets)}$(domNode).trigger('tweets')}})}},start:function(){var twitter=this;if(!this.interval){this.interval=setInterval(function(){twitter.refresh()},twitter.settings.rate);this.refresh(true)}},stop:function(){if(this.interval){clearInterval(this.interval);this.interval=false}},clear:function(){$(this.container).find('div.tweet').remove();this.lastTimeStamp=null}};var twitter=this.twitter;this.timeInterval=setInterval(function(){twitter.updateTimestamps()},5000);this.twitter.start()}});return this}})(jQuery);
