/*
Soliloquy - a jQuery plugin for aggregating posts from many data sources
Copyright (c) 2010 Trevor C. Hartman
Released under MIT License
http://github.com/devth/soliloquy
*/

(function($)
{

	jQuery.fn.soliloquy = function( username, listname, options )
	{
		// SETUP SETTINGS
		var settings = jQuery.extend({}, jQuery.fn.soliloquy.defaults, options);
	  settings.username = username;
	  
		var element = this;
	
		// RETRIEVE RESULTS
		var api_twitter = "http://api.twitter.com/1/"+username+"/lists/"+listname+"/statuses.json?per_page=" + settings.posts + "&callback=?";
	
		var jqxhr = $.getJSON(api_twitter, function(data)
		{
			$.each(data, function(i, item)
			{
				//alert( $(element).html() );
				$(element).append( buildTwitterPost( item ) );
			});
		});
	
		// $(this).html("<b>" + username + "!" + settings.posts + "</b>");
	
    $.fn.extend({
      linkUrl: function() {
        var returning = [];
        var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
        this.each(function() {
          returning.push(this.replace(regexp,"<a href=\"$1\">$1</a>"));
        });
        return $(returning);
      },
      linkUser: function() {
        var returning = [];
        var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
        this.each(function() {
          returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>"));
        });
        return $(returning);
      },
      linkHash: function() {
        var returning = [];
        var regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
        this.each(function() {
          returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+[settings.username].join("%2BOR%2B")+'">#$1</a>'));
        });
        return $(returning);
      },
      capAwesome: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'));
        });
        return $(returning);
      },
      capEpic: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>'));
        });
        return $(returning);
      },
      makeHeart: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/(&lt;)+[3]/gi, "<tt class='heart'>&#x2665;</tt>"));
        });
        return $(returning);
      }
    });
	
		return this;
	};
	

	function buildTwitterPost( post )
	{
	  var profile_image_url = post.profile_image_url || post.user.profile_image_url;
	  
		var html = "<div class='tweet'>";
		  html += "<img src='" +profile_image_url+ "'>";
		  html += "<div class='tweet-content'>";
		    html += "<span class='screen-name'><a href='http://twitter.com/" +post.user['screen_name']+"'>" + post.user['screen_name'] + "</a></span> ";
		    html += processTweet(post.text);
		    html += " <span class='created-at'>" + relative_time(post.created_at) + "</span>";
		  html += "</div><div class='clear'></div>";
		html += "</div>";
		
		return html;
	}
	
	function processTweet( t )
	{
	  return $([t]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0];
	}
	
	
	function 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);

		var r = '';
		if (delta < 60)
		{
		  r = 'a minute ago';
		} else if(delta < 120) {
		  r = 'couple of minutes ago';
		} else if(delta < (45*60)) {
		  r = (parseInt(delta / 60)).toString() + ' minutes ago';
		} else if(delta < (90*60)) {
		  r = 'an hour ago';
		} else if(delta < (24*60*60)) {
		  r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
		} else if(delta < (48*60*60)) {
		  r = '1 day ago';
		} else {
		  r = (parseInt(delta / 86400)).toString() + ' days ago';
		}

		return r;
	}

  
  

	// DEFAULTS
	jQuery.fn.soliloquy.defaults = {
		posts: 10
	};
	
	
})(jQuery);

