/*
 * The Twitter request code is based on the jquery tweet extension by http://tweet.seaofclouds.com/
 *
 * */
var LAST_UPDATE_ID;
var UPDATE_IDS = [];
var ITEM_INTERVAL = 3000;

//Reverse collection
jQuery.fn.reverse = function() {
  return this.pushStack(this.get().reverse(), arguments);
};

(function($) {

  $.fn.gettweets = function(o){
    var s = {
      username: ["thefader"],              // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"]
      avatar_size: null,                      // [integer]  height and width of avatar if displayed (48px max)
      count: 3,                               // [integer]  how many tweets to display?
      loading_text: null,                     // [string]   optional loading text, displayed while tweets load
      query: null                             // [string]   optional search query
    };

    $.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 target=\"new\" 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='+s.username.join("%2BOR%2B")+'">#$1</a>'))
        });
        return $(returning);
      }
    });

    if(o) $.extend(s, o);

    return this.each(function(){

      var loading = $('<p class="loading">'+s.loading_text+'</p>');

      var query = '';
      if(s.query) {
        query += 'q='+s.query;
      }

      var url = 'http://search.twitter.com/search.json?&'+query+'&rpp='+s.count+getSinceParameter()+'&callback=?';

      if (s.loading_text) $(this).append(loading);

      $.getJSON(url, function(data){

        if (s.loading_text) loading.remove();

        var count = 1;

        $.each(data.results.reverse(), function(i,item){

	    if (item.id != LAST_UPDATE_ID){

		var avatar_template = '<p><a class="tweet_avatar" 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" style="float: left; margin-right: 10px;"/></a>';
		var avatar = (s.avatar_size ? avatar_template : '');

		var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash()[0]+ '</span></p>';
		var user = '<p class="date"><a href="http://twitter.com/'+item.from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+item.from_user+':</a> ';
		var date = '&nbsp;<a href="http://twitter.com/'+item.from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+'<span class="time" title="' + item.created_at + '">'+relative_time(item.created_at)+'</span></a></p>';

		var li_id = "li-" + item.id;
		var li = '<li style="display:none;" id="'+ li_id + '" class="post">' + avatar + text + user + date + '</li>';
		//console.log(li);

		if (LAST_UPDATE_ID == null || (LAST_UPDATE_ID < item.id)) {
		    LAST_UPDATE_ID = item.id;
		}

		UPDATE_IDS.push(item.id);

		var time = ITEM_INTERVAL * count;
		var display_function = function() { displayTweet(li, li_id); };
		window.setTimeout(display_function,  time);

		count += 1;
	    }
        });
      });
    });
  };
})(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 a minute ago';
    } else if(delta < 120) {
	return 'about a minute ago';
    } else if(delta < (45*60)) {
	return (parseInt(delta / 60)).toString() + ' minutes 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';
    }
}

//get all span.time and recalc from title attribute
function recalcTime() {
    $('span.time').each(
	function() {
	    $(this).text(relative_time($(this).attr("title")));
	}
    )
}

function getSinceParameter() {
    if(LAST_UPDATE_ID == null) {
	return "";
    } else {
	return "&since_id=" + LAST_UPDATE_ID;
    }
}

function showAlert(message) {
    $("#alert p").text(message);
    $("#alert").fadeIn("fast");
    return;
}

function refreshMessages() {
    $(".query").gettweets({
	avatar_size: 32,
	count: 25,
	query: "fader+fort+OR+%23faderfort"
    });
    return;
}

function displayTweet(li, li_id) {
    var list = $('<ul class="tweet_list">').prependTo($(".query"));
    list.prepend(li);
    $("#"+li_id).fadeIn();
}

$(function() {
    refreshMessages();

    //set timer to reload messages every 70 secs
    window.setInterval("refreshMessages()", 85000);

    //set timer to recalc timestamps every 60 secs
    window.setInterval("recalcTime()", 60000);
});

