(function($){

  var url1 = /(^|&lt;|\s)(www\..+?\..+?)(\s|&gt;|$)/g,
      url2 = /(^|&lt;|\s)(((https?|ftp):\/\/|mailto:).+?)(\s|&gt;|$)/g,

      linkifyThis = function () {
        var childNodes = this.childNodes,
            i = childNodes.length;
        while(i--)
        {
          var n = childNodes[i];
          if (n.nodeType == 3) {
            var html = $.trim(n.nodeValue);
            if (html)
            {
              html = html.replace(/&/g, '&amp;')
                         .replace(/</g, '&lt;')
                         .replace(/>/g, '&gt;')
                         .replace(url1, '$1<a href="http://$2">$2</a>$3')
                         .replace(url2, '$1<a href="$2">$2</a>$5')
                         .replace(/@([A-Za-z0-9\/_]*)/g,'<a href="http://twitter.com/$1">@$1</a>')
						 .replace(/#([A-Za-z0-9\/\.]*)/g,'<a href="http://twitter.com/search?q=$1">#$1</a>');
;
              $(n).after(html).remove();
            }
          }
          else if (n.nodeType == 1  &&  !/^(a|button|textarea)$/i.test(n.tagName)) {
            linkifyThis.call(n);
          }
        }
      };

  $.fn.linkify = function () {
    return this.each(linkifyThis);
  };

})(jQuery);


var tweets = new Array();
var x_pos = 0;
var y_pos = 0;
var next_tweet = 0;

function month2num(m){

	switch(m){
		case 'Jan':
			return 0;
		case 'Feb':
			return 1;
		case 'Mar':
			return 2;
		case 'Apr':
			return 3;
		case 'May':
			return 4;
		case 'Jun':
			return 5;
		case 'Jul':
			return 6;
		case 'Aug':
			return 7;
		case 'Sep':
			return 8;
		case 'Oct':
			return 9;
		case 'Nov':
			return 10;
		case 'Dec':
			return 11;
	}
}

function get_date_diff(d){

	d.setHours(d.getHours()-Math.round(d.getTimezoneOffset()/60));
	twms = d.getTime();
	today = new Date();
	toms = today.getTime();
	
	diff = Math.floor((toms-twms)/60000);
	unit = diff == '1' ? ' minutes' : ' minute';
	
	if(diff > 60){
		diff/=60;
		unit = diff == '1' ? ' hours' : ' hour';
	}
	if(diff > 24){
		diff/=24;
		unit = diff == '1' ? ' days' : ' day';
	}
	return Math.floor(diff)+unit;
}

function tweet_loader(data){

    l = data.length;
    for(i = 0; i < l; i++){
        
 		//Tue Mar 08 07:56:36 +0000 2011
		var d = data[i].created_at.split(' ');
		var t = d[3].split(':');
		//new Date(Jahr, Monat, Tag, Stunden, Minuten, Sekunden);
		date = new Date(d[5], month2num(d[1]), d[2], t[0], t[1], t[2]);
		//alert(get_date_diff(date));

		tweets[i] = new Array(
                            data[i].user.screen_name, 
                            data[i].user.profile_image_url, 
                            data[i].text,
                            get_date_diff(date), //data[i].created_at,
                            data[i].source
                            );
							

    }
    
	tweets = arrayShuffle(tweets);
    end_this_tweet();
}

function change_tweet(){

	if(++next_tweet < tweets.length){
		new_positions();
		$('#twitter').css('left', x_pos).css('top, y_pos');
		   
		$('#twitter span.avatar').attr('title', tweets[next_tweet][0]).css('background-image', 'url(' + tweets[next_tweet][1] + ')');
		$('#twitter p').html('<span class="tweet">' + tweets[next_tweet][2] + '</span><br /><span class="meta">via <span class="client">'+tweets[next_tweet][4]+'</span>&nbsp; <span class="date">'+tweets[next_tweet][3]+'</span> ago</span>');
		$('#twitter p span.tweet').linkify();
		new_positions();
		$('#twitter').animate({
			opacity: '0.9'
		}).animate({
			left: x_pos, top: y_pos
		}, 16000, end_this_tweet);
	}
	else{
		next_tweet = 0;
		$.ajax({url: 'http://api.twitter.com/1/statuses/user_timeline.json?user_id=16453075', 
			   success: tweet_loader,
			   dataType: 'jsonp'});
	}
}

function end_this_tweet(){
    $('#twitter').animate({
        opacity: '0'
    }, 500, change_tweet);
}

function new_positions(){
    x_pos = Math.round(Math.random() * ($(window).width() - $('#twitter').css('width').replace(/px/g, "")));
    y_pos = Math.round(Math.random() * ($(window).height()));    
}

var tracks = new Array(
	new Array('_ghost_-_Lullaby', '<a href="http://freemusicarchive.org/music/_ghost/ccMixter_1108/ghost_-_Lullaby">Lullaby</a> by Ghost licensed under <a href="http://creativecommons.org/licenses/by-nc/3.0/">cc-by-nc</a>'),
	new Array('Evgeny_Grinko_-_05_-_Sunset', '<a href="http://freemusicarchive.org/music/Evgeny_Grinko/Winter_Sunshine_EP/Evgeny_Grinko_-_Winter_Sunshine_-_05_Sunset">Sunset</a> by Evgeny Grinko licensed under <a href="http://creativecommons.org/licenses/by-nc-nd/2.0/">cc-by-nc-nd</a>'),
	new Array('Peter_Johnston_-_12_-_La_ere_gymnopedie', '<a href="http://freemusicarchive.org/music/Peter_Johnston/Best_Of_Breitband_Vol_1/12_Agathe_Laforge_-_La_ere_gymnopedie">La ere gymnopedie</a> by Peter Johnston licensed under Public Domain')
);

var playPos = 0;

function arrayShuffle(arr){
	var tmp, rand;
	for(var i = 0; i < arr.length; i++){
		rand 		= Math.floor(Math.random() * arr.length);
		tmp 		= arr[i]; 
		arr[i] 		= arr[rand]; 
		arr[rand] 	= tmp;
	}
	return arr;
}

function align_player(){

	// 10 characters ~  50px; -> 1 c ~ 5px;
	var oink = $('#audio > p').html().replace(/<\/?[^>]+>/gi, '').length * 5 + 50;
	$('#audio').css({'width' : oink + 'px',
				     'left'  : Math.round($(window).width()/2 - oink/2)
					});
}

function next_audio(){
	
	if(++playPos >= tracks.length){
		playPos = 0;
		tracks  = arrayShuffle(tracks);
	}
	
	$('#audio > p > span').html(tracks[playPos][1]);
	
	player = document.getElementById('playa');
	canPlay = player.canPlayType('audio/ogg');

	if(canPlay.match(/maybe|probably/i)){
	
		player.src = 'media/' + tracks[playPos][0] + '.ogg';
	}
	else{
	
		player.src = 'media/' + tracks[playPos][0] + '.mp3';
	}
	player.load();
	player.play();
	align_player();
}

$(document).ready(function(){
	
    $.ajax({url: 'http://api.twitter.com/1/statuses/user_timeline.json?user_id=16453075', 
           success: tweet_loader,
           dataType: 'jsonp'});
           
    var i = 1;           
    var c = $('#rotator li').size();
    $('#rotator li').each(function(){
		var s = 1/i;
		var o = 1/i;
        $(this).css({
            'z-index': c*100-i,
            'top'    : (i-1)*50,             
            'left'   : c*30-(i-1)*40,

        });
        i++;
    });    

	$('#playa').bind('ended', next_audio);

	playPos = tracks.length;
	next_audio();
	
});
