(function($) {
  $.fn.tweet = function(o){
    var s = {
      avatar_size: null,                      // [integer]  height and width of avatar if displayed (48px max)
      count: 3,                               // [integer]  how many tweets to display?
      large_view:  null,                       // [string]   optional text in between date and tweet, try setting to "auto"
      single_view:  null,                       // [string]   optional text in between date and tweet, try setting to "auto"
      loading_text: null,                     // [string]   optional loading text, displayed while tweets load
      query: "lunch"                             // [string]   optional search query
    };
	if(o) $.extend(s, o);
    return this.each(function(){
	
	 if(s.large_view){
	      var list = jQuery('<ul class="tweet_list_large">').appendTo(this);
	  }else{
	     var list = jQuery('<ul class="tweet_list">').appendTo(this);
	   }
	  var intro = '<p class="tweet_intro">'+s.intro_text+'</p>';
	  var outro = '<p class="tweet_outro">'+s.outro_text+'</p>';
      var loading = jQuery('<p class="loading">'+s.loading_text+'</p>');
      var noresult = jQuery("<p>There are currently no results on Twitter for <em>'" +s.query+"'</em>&nbsp;&nbsp;&nbsp;:(</p>");
     
      var query = '';
      if(s.query) {
        query += 'q='+s.query;
      }
      var url = 'http://search.twitter.com/search.json?&lang=&'+query+'&rpp='+s.count+'&callback=?';
      if (s.loading_text) jQuery(this).append(loading);
      $.getJSON(url, function(data){
							  
							  
        if(! data.results || data.results.length<1){
			loading.replaceWith(noresult);
			return;
		}else{
			if (s.loading_text) loading.remove();
       
			if (s.intro_text) list.before(intro);
		 
        $.each(data.results, function(i,item){
		//	if(item.text.indexOf("lunch.com")<0){
			  var avatar_template = '<a class="tweet_avatar" target="_blank" href="http://twitter.com/'+ item.from_user+'"><img src="'+item.profile_image_url+'" height="'+s.avatar_size+'" width="'+s.avatar_size+'" alt="'+item.from_user+'\'s avatar" border="0"/></a>';
			  var avatar = (s.avatar_size ? avatar_template : '')
			  var newlink = ' - <a href="http://twitter.com/'+item.from_user+'/statuses/'+item.id+'" target="_blank" title="view tweet on twitter" class="tweet_view">View</a>';
			 	if(s.large_view){
					var text = '<span class="tweet_text">' +item.text.linkify().linkuser().linktag().highlight(s.query)+ '</span>';
			 		list.append('<li>'+ avatar + '<a target="_blank" href="http://twitter.com/'+ item.from_user+'">'+item.from_user+'</a> - '  + text + '<br><small>'+relative_time(item.created_at)+newlink+ '</small></li>');
			 	}else if (s.single_view){
					var text = '<span class="tweet_text">' +item.text.linkuser().linktag().highlight(s.query)+ '</span>';
			 		list.append('<li>'+ avatar + '<a target="_blank" href="http://twitter.com/'+ item.from_user+'">'+item.from_user+'</a> - '  + text + '<br><small style="font-size:11px; color:#999999">'+relative_time(item.created_at)+ '</small></li>');
			 	}else{
					var text = '<span class="tweet_text">' +item.text.linkify().linkuser().linktag().highlight(s.query)+ '</span>';
			 		list.append('<li>'+ avatar + '<a target="_blank" href="http://twitter.com/'+ item.from_user+'">'+item.from_user+'</a> - '  + text+ '</li>');
			 	}
		//	}
			  list.children('li:first').addClass('tweet_first');
			  list.children('li:odd').addClass('tweet_even');
			  list.children('li:even').addClass('tweet_odd');
			
        });
		}
      //  if (s.outro_text) list.after(outro);
      });

    });
  };
})(jQuery);


 function relative_time(time_value) {
      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);
      if(delta < 60) {
      return 'less than 1 min ago';
      } else if(delta < 120) {
      return '1 min ago';
      } else if(delta < (45*60)) {
      return (parseInt(delta / 60)).toString() + ' min ago';
      } else if(delta < (90*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.linkify = function() {
  return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
  return m.link(m);
  });
};
String.prototype.linkuser = function() {
  return this.replace(/[@]+[A-Za-z0-9-_]+/, function(u) {
    var username = u.replace("@","")
    return u.link("http://twitter.com/"+username);
  });
};
String.prototype.linktag = function() {
  return this.replace(/[#]+[A-Za-z0-9-_]+/, function(t) {
    var tag = t.replace("#","%23")
    return t.link("http://search.twitter.com/search?q="+tag);
  });
};

String.prototype.highlight = function(q) {
	var reg= new RegExp(q, "gi");
   	 return this.replace(reg,"<b>"+q+"</b>");
};

