/*
	jQuery Scrolling Tweet Ticker 1.1.3 (September 6, 2011)
	Copyright 2010-2011 Scott Langendyk. All Rights Reserved.
	
	==============================================================================
	Basic Usage
	==============================================================================
		$('#tweetticker').tweetTicker({
			username : 'username'
		});
	
	*For additional documentation please reference readme.txt
*/

(function($){$.fn.tweetTicker=function(options){var options=$.extend({},$.fn.tweetTicker.defaults,options);var tweetTicker;var tweetsList;var overflowContainer;var loading;var appendThreshhold;var currentTweet;var listWidth;var currentRate;var preAppendThreshhold;var updateFlag=false;var initialFetch=true;var failedFetchAttempts=0;var preAppendCount=0;var tweetStack={tweets:new Array()}
var updateQueue={tweets:new Array(),sinceID:options.sinceID}
return this.each(function(){if(options.tickerOnly==false){tweetTicker=build();}else{tweetTicker=$('<div class="tweetticker"><div class="tweetticker-replace"></div></div>');}
$(this).append(tweetTicker);tweetsList=$('<ul class="tweetticker-tweets-list"></ul>');overflowContainer=$('<div class="tweetticker-overflow-container"></div>');loading=$('<li class="tweetticker-loading"></li>');tweetTicker.find('div.tweetticker-username a').attr('href','http://twitter.com/'+options.username).html('@'+options.username);overflowContainer.wrapInner(tweetsList);tweetTicker.find('div.tweetticker-replace').replaceWith(overflowContainer);tweetsList.append(loading);initialize();$(window).resize(function(){updatePreAppendThreshhold();});overflowContainer.mouseover(function(){currentRate=options.hoverRate;})
overflowContainer.mouseout(function(){currentRate=options.normalRate;});});function animationLoop(){var currentPosition=parseInt(tweetsList.css('left').substr(0,tweetsList.css('left').length-2));if(currentPosition<preAppendThreshhold){var tweetToAppend=tweetStack.tweets.pop();appendTweet(tweetToAppend);preAppendCount++;}
if(currentPosition<appendThreshhold){var oldTweet=currentTweet;currentTweet=currentTweet.next('li.tweetticker-tweet');oldTweet.remove();if(preAppendCount>0){var tweetToAppend=tweetStack.tweets.pop();appendTweet(tweetToAppend);}else{preAppendCount--;updatePreAppendThreshhold();}
tweetsList.css('left',currentPosition-appendThreshhold+'px');appendThreshhold=currentTweet.outerWidth(true)*-1;}
if(currentRate>0){tweetsList.animate({'left':'-=1px'},currentRate,'linear',animationLoop);}else{animationLoop();}
if(updateFlag==true){setTimeout(fetchUpdates,options.updateInterval);}
updateFlag=false;}
function initialize(){loading.text('Loading tweets...');fetchUpdates();}
function fetchUpdates(){var url='http://api.twitter.com/1/statuses/user_timeline.json?screen_name='+options.username+'&include_entities=1&include_rts=1';if(options.sinceID>0){url=url+'&since_id='+updateQueue.sinceID;}
if(initialFetch){url=url+'&count='+options.maxInitialTweets;}else{url=url+'&count='+options.maxTweetsPerUpdate;}
$.ajax({url:url,dataType:'jsonp',timeout:10000,success:function(data,textStatus,jqXHR){if(data.length>0){if(!initialFetch){var tempTweets=new Array();}
for(var status=0;status<data.length;status++){if(status==0){if(initialFetch){options.sinceID=data[status].id;updateQueue.sinceID=options.sinceID;}else{updateQueue.sinceID=data[status].id;}}
var tweet=formatTweet(data[status]);if(tweet){if(initialFetch){tweetStack.tweets.unshift(tweet);tweetsList.append(tweet);}else{tempTweets.push(tweet);}}}
if(tweetStack.tweets.length>0){if(initialFetch){currentTweet=tweetsList.children('li.tweetticker-tweet').first();appendThreshhold=currentTweet.outerWidth(true)*-1;updatePreAppendThreshhold();currentRate=options.normalRate;}else{for(var i=0;i<tempTweets.length;i++){updateQueue.tweets.push(tempTweets.pop());}}
if(options.liveUpdating==true){updateFlag=true;}
failedFetchAttempts=0;}
if(initialFetch){if(tweetStack.tweets.length>0){if(options.startOffScreen==true){tweetsList.css('left',overflowContainer.width());}
loading.remove();animationLoop();initialFetch=false;}else{if(failedFetchAttempts<options.maxFailedFetchAttempts){loading.text('Tweets loaded incorrectly. Trying again momentarily...');failedFetchAttempts++;setTimeout(initialize,5000);}else{loading.text('There was a problem parsing the Twitter feed.');}}}}else{loading.text('User hasn\'t tweeted yet.');}},error:function(jqXHR,textStatus,errorThrown){failedFetchAttempts++;console.log('There was an error');var errorMessage='Failed to load tweets.';var resetTime=5000;var rateLimited=true;$.ajax({url:'http://api.twitter.com/1/account/rate_limit_status.json',dataType:'jsonp',success:function(data,textStatus,jqXHR){if(data.remaining_hits<1){errorMessage='You are being rate limited by Twitter.';resetTime=data.reset_time_in_seconds*1000;rateLimited=true;}}});setTimeout(function(){if(failedFetchAttempts<options.maxFailedFetchAttempts||options.maxFailedFetchAttempts==0){if(!rateLimited){if(textStatus=="error"){textStatus="Error";}
if(textStatus=="timeout"){textStatus="Timeout";}
errorMessage=textStatus+' while attempting to load tweets. Trying again momentarily...';}
setTimeout(initialize,resetTime);}
if(initialFetch){loading.text(errorMessage);}},1000);},complete:function(jqXHR,textStatus){if(failedFetchAttempts<options.maxFailedFetchAttempts||options.maxFailedFetchAttempts==0){updateFlag=true;}}});}
function appendTweet(appendingTweet){if(parseInt($(appendingTweet).attr('id'))==options.sinceID){if(updateQueue.tweets.length>0){var count=updateQueue.tweets.length;for(i=0;i<count;i++){var tweet=updateQueue.tweets.pop()
tweetStack.tweets.unshift(tweet);tweetsList.append(tweet);}
options.sinceID=updateQueue.sinceID;}}
tweetStack.tweets.unshift(appendingTweet);tweetsList.append(appendingTweet);updatePreAppendThreshhold();}
function updatePreAppendThreshhold(){preAppendThreshhold=overflowContainer.width()-tweetsList.width();}
function formatTweet(data){var tweetText=data.text;var permalinkText='http://twitter.com/'+options.username+'/status/'+data.id_str;var dateText=data.created_at;var timeZoneOffset=dateText.substring(19,25);dateText=dateText.replace(timeZoneOffset,'');dateText=Date.parseExact(dateText,'ddd MMM dd HH:mm:ss yyyy');if(dateText){if(timeZoneOffset){dateText=dateText.setTimezoneOffset(timeZoneOffset)}
dateText=dateText.toString(options.dateFormat);}else{return null;}
var entities=new Array();var entity=null;var i=0;if(data.entities.urls.length>0){for(i=0;i<data.entities.urls.length;i++){entity={};entity.index1=data.entities.urls[i].indices[0];entity.index2=data.entities.urls[i].indices[1];entity.newText='<a rel="nofollow" href="'+data.entities.urls[i].url+'">'+tweetText.substring(entity.index1,entity.index2)+'</a>';entities.push(entity);}}
if(data.entities.hashtags.length>0){for(i=0;i<data.entities.hashtags.length;i++){entity={};entity.index1=data.entities.hashtags[i].indices[0];entity.index2=data.entities.hashtags[i].indices[1];entity.newText='<a rel="nofollow" href="http://search.twitter.com/search?q='+data.entities.hashtags[i].text+'">'+tweetText.substring(entity.index1,entity.index2)+'</a>';entities.push(entity);}}
if(data.entities.user_mentions.length>0){for(i=0;i<data.entities.user_mentions.length;i++){entity={};entity.index1=data.entities.user_mentions[i].indices[0];entity.index2=data.entities.user_mentions[i].indices[1];entity.newText='<a rel="nofollow" href="http://twitter.com/'+data.entities.user_mentions[i].screen_name+'">'+tweetText.substring(entity.index1,entity.index2)+'</a>';entities.push(entity);}}
if(entities.length>0){entities.sort(function(a,b){return a.index1-b.index1;});var tempTweetText=tweetText.substring(0,entities[0].index1);for(i=0;i<entities.length;i++){tempTweetText=tempTweetText+entities[i].newText;if(i+1<entities.length){tempTweetText=tempTweetText+tweetText.substring(entities[i].index2,entities[i+1].index1);}else{tempTweetText=tempTweetText+tweetText.substring(entities[i].index2);}}
tweetText=tempTweetText;}
return'<li class="tweetticker-tweet" id="'+data.id+'"><span class="tweetticker-date"><a href="'+permalinkText+'">'+dateText+'</a></span>'+tweetText+'</li>';}
function build(){var build;build+='<div class="tweetticker">';build+='<div class="tweetticker-container">';build+='<div class="tweetticker-container-left"></div>';build+='<div class="tweetticker-container-content">';build+='<div class="tweetticker-username"><a href="#">@username</a></div>';build+='<div class="tweetticker-twitter-link"><a href="http://twitter.com">Twitter</a></div>';build+='<div class="tweetticker-tweetbox">';build+='<div class="tweetticker-tweetbox-left"></div>';build+='<div class="tweetticker-tweetbox-right"></div>';build+='<div class="tweetticker-tweetbox-content">';build+='<div class="tweetticker-replace"></div>';build+='</div>';build+='</div>';build+='</div>';build+='<div class="tweetticker-container-right"></div>';build+='</div>';build+='</div>';return $(build);}};$.fn.tweetTicker.defaults={username:'twitter',maxInitialTweets:20,maxTweetsPerUpdate:20,normalRate:25,hoverRate:100,sinceID:0,startOffScreen:true,liveUpdating:true,updateInterval:60000,maxFailedFetchAttempts:5,dateFormat:'dd/MM/yyyy h:mm tt',tickerOnly:false};})(jQuery);
