(function($){
	
    $.tweets = function(el, options){
        var base = this;
        
        base.$el = $(el);
        base.el = el; 
        
        base.$el.data("tweets", base);
        
        base.init = function(){
            
            base.options = $.extend({},$.tweets.defaultOptions, options);
            base.months = $.extend({},$.tweets.months);
			
            $.getJSON(
		    	'http://search.twitter.com/search.json?callback=?&rpp='+base.options.tweetCount+'&q=' + base.options.query,
        		function(data) {
            		$.each(data, function(i, tweets){
                		if (tweets.length != undefined){                   			
                   			if (tweets[0] != undefined){
                   				if (tweets[0].created_at != undefined){
                  	 				
									var $tweetContainer = $(document.createElement("ul"))
														.attr("id","tweet-cont")
									    				.addClass("tweet-cont");
									base.$el.append($tweetContainer);
									
									for(var i = 0; i < tweets.length; i++){                       					
									    var tweetClass = "odd";
									    if(i%2 == 0){
									    	tweetClass = "even";
									    }
									    				
									    var $tweet = $(document.createElement("li"))
									    			.attr("id","tweet_"+tweets[i].id)
									    			.addClass(tweetClass)
									    			.addClass("tweet");
									    $tweetContainer.append($tweet);
									    
									    if(base.options.showAvatar){
									    	var $tweetPhoto = $(document.createElement("img"))
									    					.addClass("avatar")
									    					.attr("src",tweets[i].profile_image_url);
									    	$tweet.append($tweetPhoto);
									    }
									    
									    var $tweetDesc = $(document.createElement("div"))
									    				.addClass("text")
									    				.html("<a href='http://www.twitter.com/"+tweets[i].from_user+"' target='_blank'>"+tweets[i].from_user+"</a>: " + base.replaceURLs(tweets[i].text));		
									    $tweet.append($tweetDesc);
									    
									    var tweetDate = new Date(tweets[i].created_at);
									    var today = new Date();
									    
									    var timeDiff;
									    var minDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*1000));
									    var hourDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*60*1000));
									    var dayDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(24*60*60*1000));
									                           					
									    if(minDiff < 59){
									    	timeDiff = "<div class='time'>about "+minDiff+" minutes ago from "+base.fixEncHTML(tweets[i].source)+"</div>";
									    }else if(hourDiff < 24){
									    	timeDiff = "<div class='time'>about "+hourDiff+" hours ago from "+base.fixEncHTML(tweets[i].source)+"</div>";
									    }else if(dayDiff < 5){
									    	timeDiff = "<div class='time'>"+dayDiff+" days ago from "+base.fixEncHTML(tweets[i].source)+"</div>";
									    }else{
									    	var AMPM = "PM";
									    	var myHours;
									    	if(tweetDate.getHours() < 12){
									    		AMPM = "AM";
									    		if(tweetDate.getHours() == 0){
									    			myHours = "12";
									    		}else{
									    			myHours = tweetDate.getHours();
									    		}
									    	}else{
									    		myHours = tweetDate.getHours()-12;
									    	}
									    	
									    	var myDate = tweetDate.getDate() +"th";
									    	if(tweetDate.getDate() == 1 || tweetDate.getDate() == 21 || tweetDate.getDate() == 31){
									    		myDate = tweetDate.getDate() +"st";
									    	}else if(tweetDate.getDate() == 2 || tweetDate.getDate() == 22){
									    		myDate = tweetDate.getDate() +"nd";
									    	}else if(tweetDate.getDate() == 3 || tweetDate.getDate() == 23){
									    		myDate = tweetDate.getDate() +"rd";
									    	}
									    	timeDiff = "<div class='time'>"+myHours+":"+tweetDate.getMinutes()+" "+AMPM+" "+base.months[tweetDate.getMonth()]+" "+myDate+" from "+base.fixEncHTML(tweets[i].source)+"</div>";
									    }
									    
									    $tweet.append(timeDiff);
									    
									}
                  	 			}
                   			}
                   		}  		
                	});
                	
                	if(jQuery.isFunction(base.options.callback)){
            			base.options.callback();
            		}
        		}
            );
        }
        
        base.isEncHTML = function(str){
			if(str.search(/&amp;/g) != -1 || str.search(/&lt;/g) != -1 || str.search(/&gt;/g) != -1 || str.search(/&quot;/g) != -1) 
		    	return true; 
		  	else 
		    	return false;
        }
        
        base.fixEncHTML = function(str){
        	if(base.isEncHTML(str)) 
		      return str.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g,"'"); 
		    return str; 
        }
        
        base.replaceURLs = function(text){
			text = text.replace(base.options.aTagRegexp,"<a href='$1' target='_blank'>$1</a>");
			text = text.replace(base.options.userRegexp,"$1<a class='user' href='http://www.twitter.com/$2' target='_blank'>@$2</a>");
			text = text.replace(base.options.hashtagRegexp,"$1<a class='hashtag' href='http://search.twitter.com/search?q=%23$2' target='_blank'>#$2</a>");
			return text;
        }
        
        base.init();
    }
	
	$.tweets.months = new Array(
		"January",
		"February",
		"March",
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December"
	);
	
    $.tweets.defaultOptions = {
        query:"twitter",
		tweetCount:1,
		callback:null,
		aTagRegexp:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,
		hashtagRegexp:/(^|\s)#(\w+)/g,
		userRegexp:/(^|\s)@(\w+)/g,
		abrMonths:false,
		showAvatar:false
    }
	

    $.fn.tweets = function(options){
        return this.each(function(){
            (new $.tweets(this, options));
        });
    }

	
})(jQuery);
