/*
	getTweets v.1.5.2 - a script get tweets from accounts
	(c) 2011 Adam Randlett : monkdevelopment.com
*/  

(function($){
	$.fn.getTweets = function(settings){ 
		var defaults = {
			twitter_api_url: "http://api.twitter.com/1/statuses/user_timeline",
			twitter_users: ["thebridgefresno"],
			format: "json",
			howmany: 3,
			rate_limit_status:false,
			tweetstring:"<li class='tweet'><span class='tweet-text'>{tweettext}</span><span class='tweet-sep'>~</span><span class='tweet-meta'>{tweetdate} from&nbsp;&nbsp;</span><span class='tweet-name'><a href='http://twitter.com/{tweetuser:screenname}'>{tweetuser:name}</span></li>",
		  
		 retweetstring:"<li class='tweet'><span class='tweet-text'>{tweettext}</span><span class='tweet-sep'>~</span><span class='tweet-meta'>{tweetdate} from&nbsp;&nbsp;</span><span class='tweet-name'><a href='http://twitter.com/{tweetuser:screenname}'>{tweetuser:name}</span></li>"
    }
        var options = $.extend(defaults, settings); 
        return this.each(function(){
		      var $this = $(this),
	  	      	tweetoptions = { 
	  				    twitter_users:options.twitter_users,
	  				    howmany:options.howmany,
	  				    tweetstring:options.tweetstring,
	  				    retweetstring:options.retweetstring,
					      rate_limit_status:options.rate_limit_status
	  			    },
				  global_tweets = [],
				  user_count,
				  twitter_users_last = tweetoptions.twitter_users.length -1;
			
			//$.ajaxSetup({ cache: true });
			
			function twitter_relative_time(time_value) {
			  var values=time_value.split(" ");
			  time_value=values[1]+" "+values[2]+", "+values[5]+" "+values[3];
			  var parsed_date=Date.parse(time_value);
			  var relative_to=(arguments.length>1)?arguments[1]:new Date();
			  var delta=parseInt((relative_to.getTime()-parsed_date)/1000);
			  delta=delta+(relative_to.getTimezoneOffset()*60);
			  if(delta<60){return 'less than a minute ago';}else if(delta<120){return 'about a minute ago';
			  }else if(delta<(60*60)){return (parseInt(delta/60)).toString()+' minutes ago';
			  }else if(delta<(120*60)){return 'about an hour ago';
			  }else if(delta<(24*60*60)){return 'about '+(parseInt(delta/3600)).toString()+' hours ago';
			  }else if(delta<(48*60*60)){return '1 day ago';
			  }else{return(parseInt(delta/86400)).toString()+' days ago';}
			} 
			
			String.prototype.parseUrl = function(){
			  var urlRegex = new RegExp(/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi);
			  return this.replace(urlRegex, function(url) {
			          return '<a href="' + url + '">' + url + '</a>';
			  });
			};
			String.prototype.parseUsername = function() {
				return this.replace(new RegExp(/[@]+[A-Za-z0-9-_]+/g), function(u) {
					var username = u.replace("@","")
					return u.link("http://twitter.com/"+username);
				});
			};
			String.prototype.parseHashtag = function() {
				return this.replace(new RegExp(/[#]+[A-Za-z0-9-_]+/g), function(t) {
					var tag = t.replace("#","%23")
					return t.link("http://search.twitter.com/search?q="+tag);
				});
			};
			
			String.prototype.multiReplace = function ( hash ) {
				var str = this, key;
				for ( key in hash ) {
					str = str.replace( new RegExp( key, 'g' ), hash[ key ] );
					
				}
				return str;
			};
			
			function twitter_parser(tweets){
				$.each(tweets, function(i,tweet){
					if(tweet.text !== undefined) {
					    var tweettext = tweet.text;
					    var tweetapi = {
					    	'{tweetdate}' : twitter_relative_time(tweet.created_at) , // Calculate how many hours ago was the tweet posted  
					    	'{tweeturl}'  : 'http://www.twitter.com/' +  tweet.user.name + '/status/' + tweet.id ,
					    	'{tweettext}' : tweettext.parseUrl().parseUsername().parseHashtag(),
					    	'{tweetuser:name}' : tweet.user.name,
					    	'{tweetuser:screenname}' : tweet.user.screen_name,
					    	'{tweetuser:location}' : tweet.user.location,
					    	'{tweetuser:description}' : tweet.user.description,
					    	'{tweetuser:url}': tweet.user.url,
					    	'{tweetuser:image}': tweet.user.profile_image_url,
					    	'{tweetsource}': tweet.source
					    }
					    
					    var tweet_html,
					        output;
					    if(tweet.retweeted_status){
					       //console.log(tweet.retweeted_status.user.name);
                tweetapi['{retweetuser:name}'] = tweet.retweeted_status.user.name;
                tweetapi['{retweetuser:screenname}'] = tweet.retweeted_status.user.screen_name;
                tweetapi['{retweetuser:image}'] = tweet.retweeted_status.user.profile_image_url;
                
                output = tweetoptions.retweetstring;
					    }else{
					      output = tweetoptions.tweetstring;
					    }
					   var tweet_html = output.multiReplace(tweetapi); 
						
						global_tweets.push({
							id:tweet.id,
							status:tweet_html
						});
	        }
				});	
			}

			function twitter_output(){
				global_tweets.sort(function(a,b){return(b.id-a.id)});
				twitter_count=global_tweets.length;

				for(var i=0; i<tweetoptions.howmany; i++){
					$this.append(global_tweets[i].status);
				}
			} 
			
			function rate_limit_return(request){
				$.getJSON("http://api.twitter.com/1/account/rate_limit_status.json?&callback=?",function(data){
				  console.log("-------------------------------------------------------");
					console.log("RATE LIMIT STATUS");
					console.log("  Hourly Limit: "+ data.hourly_limit);
					console.log("  Remaining Hits: "+ data.remaining_hits);
					console.log("  Reset Time: "+ data.reset_time);
					console.log("-------------------------------------------------------");
				}); 
			}
			
			function get_tweets(curuser){ 
				//console.log(tweetoptions.twitter_users);
				$.ajax({
			  	    dataType:"jsonp", 
			  	    url: options.twitter_api_url+'.'+options.format+'?&screen_name='+tweetoptions.twitter_users[curuser]+'&include_rts=true&count='+tweetoptions.howmany+'&callback=?',
			  	    timeout: 1000,
			  	    type:"GET",
			  	    async:false,
					    crossDomain:true,
			  	    error: function(){ 
						    //console.log("An error has occured fetching tweets.");
			  	    },
					success:function(data){ 
					//console.log(data);
						twitter_parser(data);
					},
					complete:function(){
						if(curuser<twitter_users_last){
					      //run this function (recursivly) to get all tweets for the next user
					      get_tweets(++curuser);
					    }else{
					      //if all tweets are loaded into the global_tweets array and launch twitter_render function
					      twitter_output();
					    }
					}//@end success	
				});	//@end ajax
			} // @end get_tweets 
		   if(tweetoptions.rate_limit_status){
			   rate_limit_return(); 
		   }
		   get_tweets(0);
		   
	  });
	};
})(jQuery);
