(function($){
	$.simpleTweet = function(el, options){
		var base = this;
        
        base.$el = $(el);
		base.el = el;
        
		base.$el.data("simpleTweet", base);
        
        base.types = {
			hash:1,
        	username:2,
        	search:3,
        	list:4
        };
        
        base.searchType = 1;
        base.tweets = -1;
        base.searchURL = "http://search.twitter.com/search.json?callback=?";
        base.fadeTimeout = "";
        
        base.init = function(){
            base.options = $.extend(true,{},$.simpleTweet.defaultOptions, options);
            //fix this...
            if(base.options.maxTweets > 200){
            	base.options.maxTweets = 200;
            }
            //set search type
            base.searchType = base.getSearchType();
            //show load screen
            base.loadScreen();
            //get tweets
            base.getData();
        };
        
        base.buildTweets = function(){
        	var tString = "<ul class='tweet-container'>"; 
        	for(i = 0; i < base.tweets.length; i++){
        		var tweetClass = "odd",fadeDisplay = "";
				if(i%2 == 0){
					tweetClass = "even";
				}
				
				if(base.options.fade && i > 0){
					fadeDisplay = " style='display:none;'"
				}
				
				tString += "<li class='"+tweetClass+" tweet' tweetid='"+base.tweets[i].id+"'"+fadeDisplay+">";
				if(base.searchType === base.types.hash || base.searchType === base.types.search){
					tString += "<div class='avatar'><img wdth='48' height='48' src='"+base.tweets[i].profile_image_url+"' border='0'/></div>";
					tString += "<a href='http://www.twitter.com/"+base.tweets[i].from_user+"'>"+base.tweets[i].from_user+"</a>&nbsp;";
				}
				
				tString += base.replaceURLs(base.tweets[i].text);
				tString += "<div class='tweet-info'><span class='date'>" + base.writeDate(base.tweets[i].created_at) + "</span>";
				tString += "&nbsp;from&nbsp;<span class='source'>" + base.fixEncHTML(base.tweets[i].source) + "</span></div>";
				tString += "<br style='clear:both;'></li>";
        	}
        	tString += base.writeTweetFooter() + "</ul>";
        	base.$el.fadeOut("slow",function(){
        		base.$el.html(tString).fadeIn();
        		if(base.options.fade){
        		    base.fadeTimeout = setTimeout(function(){base.fadeTweets()},base.options.speed);
        		}
        	});
        };
        
        base.buildTweetList = function(){
        	var tString = "<ul class='tweet-container'>"; 
        	for(i = 0; i < base.tweets.length; i++){
        		var tweetClass = "odd";
				if(i%2 == 0){
					tweetClass = "even";
				}
				
				if(base.options.fade && i > 0){
					fadeDisplay = " style='display:none;'"
				}
				
				tString += "<li class='"+tweetClass+" tweet' tweetid='"+base.tweets[i].id+"'"+fadeDisplay+">";
				tString += "<div class='avatar'><img wdth='48' height='48' src='"+base.tweets[i].user.profile_image_url+"' border='0'/></div>";
				tString += "<a href='http://www.twitter.com/"+base.tweets[i].user.name+"'>"+base.tweets[i].user.name+"</a>&nbsp;" + base.replaceURLs(base.tweets[i].text);
				tString += "<br><span class='date'>" + base.writeDate(base.tweets[i].created_at) + "</span>";
				tString += "&nbsp;from&nbsp;<span class='source'>" + base.fixEncHTML(base.tweets[i].source) + "</span>";
				tString += "<br style='clear:both;'></li>";
        	}
        	tString += base.writeTweetFooter() + "</ul>";
        	base.$el.fadeOut("slow",function(){
        		base.$el.html(tString).fadeIn();
        		if(base.options.fade){
        		    base.fadeTimeout = setTimeout(function(){base.fadeTweets()},base.options.speed);
        		}
        	});
        };
        
        base.fadeTweets = function(){
        	var $ct = $(".tweet:visible"),lastid = $(".tweet:last").attr("tweetid");
    		var $next = $ct.next();
        	if($ct.attr("tweetid") == lastid){
        		$next = $(".tweet:first");
        	}
        	$ct.fadeOut(500,function(){
        		$next.fadeIn();
        	});
        	base.fadeTimeout = setTimeout(function(){base.fadeTweets()},base.options.speed);
        };
        
        base.writeTweetFooter = function(){
        	if(base.options.showSignature){
        		var ret = "<li class='footer'>";
        		if(base.searchType == base.types.username){
        			ret += "<div class='avatar'><img wdth='48' height='48' src='"+base.tweets[0].profile_image_url+"' border='0'/></div>";
					ret += "<div class='tweet-identifier'><a href='http://www.twitter.com/"+base.tweets[0].from_user+"'>"+base.tweets[0].from_user+"</a></div>";
					
					        	
        		}else{
        			ret += "<div class='tweet-identifier'>";
        			if(base.searchType == base.types.search || base.searchType == base.types.hash){
        				ret += "search results for: " + base.options.search;
        			}else if(base.searchType == base.types.list){
        				ret += "<a href='http://www.twitter.com/"+base.options.search.user+"/"+base.options.search.list+"' target='_blank'>@"+base.options.search.user+"/"+base.options.search.list+"</a>";
        			}
        			ret += "</div>";
        		}
        		ret += "<br style='clear:both;'></li><br style='clear:both;'>";
        		return ret;
        	}
        	return "";
        };
        
        base.writeDate = function(date){
        	if(!base.options.useRelativeTime){
        		return date;
        	}
        	var tweetDate = new Date(date),today = new Date(),timeDiff = "",
        	minDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*1000)),
			hourDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*60*1000)),
			dayDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(24*60*60*1000));
			                       					
			if(minDiff < 59){
			    timeDiff = minDiff+" minutes ago";
			}else if(hourDiff < 24){
			    timeDiff = hourDiff+" hours ago";
			}else if(dayDiff < 5){
			    timeDiff = dayDiff+" days ago";
			}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 = myHours+":"+tweetDate.getMinutes()+"&nbsp;"+AMPM+"&nbsp;"+base.options.months[tweetDate.getMonth()]+"&nbsp;"+myDate;
			}
			return timeDiff;
        };
                
        base.loadScreen = function(){
        	base.$el.html("<div class='loader'><div class='loader-img'><!-- --></div><div class='loader-text'>Loading</div></div>");
        };
        
        base.getData = function(){
        	$.getJSON(base.searchURL,function(data){
        		if(typeof data.error !== "undefined"){
        			base.$el.html("error: " + data.error);
        			return;
        		}
        		if(base.searchType === base.types.list){
        			base.tweets = data;
        			base.buildTweetList();
        		}
        		$.each(data, function(i, tweets){
                    if (typeof tweets.length != "undefined"){                   			
                   		if (typeof tweets[0] != "undefined"){
                   			if (typeof tweets[0].created_at != "undefined"){
                   				base.tweets = tweets;
                   				base.buildTweets();
                   			}
                   		}
                   	}
                });
        	});
        };
        
        base.getSearchType = function(){
        	var search = base.options.search;
        	if(typeof search.user !== "undefined" && typeof search.list !== "undefined"){
        			base.searchURL = "http://api.twitter.com/1/"+search.user+"/lists/"+search.list+"/statuses.json?callback=?&per_page=" + base.options.maxTweets;
        			return base.types.list;
        	}
        	
        	var fChar = search.charAt(0);
        	base.searchURL += "&rpp="+base.options.maxTweets + "&q=";
        	switch(fChar){
        		case "#":
        			base.searchURL += "%23" + search.split('#')[1];
        			return base.types.hash;
        			break;
        		case "@":
        			base.searchURL += "from:" + search.split('@')[1];
        			return base.types.username;
        			break;
        		default:
        			var secCheck = search.slice(0,4);
        			switch(secCheck){
        				case "from":
        						base.searchURL += search;
        						return base.types.username;
        					break;
        				default:
        						base.searchURL += search;
        						return base.types.search;
        					break;
        			}
        			break;
        	}
        };
        
        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();
    };
    
    $.simpleTweet.defaultOptions = {
    	search:"#heroes",
    	maxTweets:5,
    	fade:false,
    	speed:500,
    	showSignature:true,
    	aTagRegexp:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,
		hashtagRegexp:/(^|\s)#(\w+)/g,
		userRegexp:/(^|\s)@(\w+)/g,
		useRelativeTime:true,
		months:["January","February","March","April","May","June","July","August","September","October","November","December"]
    };
    
    $.fn.simpleTweet = function(options){
        return this.each(function(){
            (new $.simpleTweet(this, options));
        });
    };
})(jQuery);
