jQuery.extend( jQuery.easing, {
	def: 'easeInOutExpo',
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	}
});


$(document).ready(function() {
    $('body').removeClass('no-js');

	var countdownTimer = setInterval(countdown, 1000);

	// Logo hover
	$('#logo').hover(function() { $('#logo .overlay').fadeIn('fast'); },
					function() { $('#logo .overlay').fadeOut('fast'); }
		);

	// Setup year menu
    $('#years ul.months').css('display', 'none');
    $('#years li.year.selected ul.months').css('display', 'block');
    $('#years div.year').click(function() {
    	var oldYear = $('li.year.selected');
    	oldYear = (oldYear.length) ? oldYear.attr('id').replace(/year/, '') : 3000;
    	var newYear = $(this).parent().attr('id').replace(/year/, '');
    	var direction = (oldYear < newYear) ? 1 : -1;
		if (oldYear == newYear) return;

    	$('li.month.selected').removeClass('selected');
		$('li.year.selected').removeClass('selected').find('ul.months').animate({marginRight: (725 * direction) + 'px'}, 'fast');

    	var parent = $(this).parent();
    	parent.addClass('selected');
		parent.find('ul.months').css({ marginRight: -(725 * direction) + 'px', display: 'block'}).delay(25).animate({marginRight: '0px'}, 'fast');
    });
    
    $('a.month').click(function() {
    	$(this).parent().toggleClass('selected');
    	return false;
    });
    
    // Blog/Tumblr link
	$('#blog-links').hover(function() {
			$('#tumblr-link').css({ marginTop: '5px', opacity: 0, display: 'block' }).animate({ marginTop: 0, opacity: 1}, 100);
		}, function() {
			$('#tumblr-link').css({ marginTop: '0px', opacity: 1 }).animate({ marginTop: 5, opacity: 1}, 100, function() { $(this).hide(); });
		});



	// Fixed tags
	var tagsX = ($('#tags-container').length > 0) ? $('#tags-container').offset().top - $(window).height() + 50 : 0;
	$(document).scroll(function() {
		var scroll = $(document).scrollTop();
		if (scroll >= tagsX) {
			try {
				$('#tags.fixed').removeClass('fixed');
			} catch(e) { alert(e); }
		} else if (scroll < tagsX) {
			tagsFixed();
		}
	});

	function tagsFixed() {
		$('#tags:not(.fixed)').addClass('fixed').css('bottom', '-50px').animate({bottom: '0'}, 500);
	}
	tagsFixed();
	
	// Sidebar calendars
	var cal = $('.calcont.selected');
	var y = cal.offset().top - $(window).scrollTop();
	$('#sidebar .background').css('height', (y-1)+'px');
	$('#sidebar .background2').css('top', y+cal.outerHeight()+'px');

	$('#calendars .week:not(.disabled) a:not(.dl)').click(sidebarPopup);
	function sidebarPopup(e) {
		if ($('#sidebar-popup').is(':visible')) return false;

		$('#sidebar-popup .playlist').attr('href', $(this).attr('href'));
		$('#sidebar-popup .dl').attr('href', $(this).siblings('.dl').attr('href'));

		var calendar = $(this).parents('.calcont');
		var calHeight = calendar.height();
		var y = calendar.offset().top - $(window).scrollTop();

		$('#sidebar .background').animate({ height: y-1 }, 200);
		$('#sidebar .background2').animate({ top: y+calHeight+20 }, 200);

		$('#sidebar-popup').css({ top: y - 21, height: calHeight + 60});

		$('.calcont.selected').animate({ backgroundColor: 'rgba(57,70,91,0.01)'}, 50, function() {
			$(this).css('background-color', 'transparent').removeClass('selected');
		});
		calendar.addClass('selected').css('background-color', 'rgba(57,70,91,0)').animate({ backgroundColor: 'rgba(57,70,91,1)'}, 200);

	    $('#sidebar-popup .inner').hide();
	    $('#x-button').hide();
	    $('#sidebar-popup').show().css('width', 0).animate({width: 350}, 200, function() {
	        $('#sidebar-popup .inner').fadeIn('fast');
	        $('#x-button').fadeIn('slow');
	    });
	    
	    return false;
	}

	$('#x-button').click(function() {
        $('#sidebar-popup .inner').fadeOut(50);
        $('#x-button').fadeOut('fast', function() {
        	$('#sidebar-popup').animate({width: 0}, 200, function() {
        		$(this).hide();
				$('.calcont.selected').animate({ backgroundColor: 'rgba(57,70,91,0)'}, 100, function() {
					$(this).animate({ opacity: '0.5' }, 50).removeClass('selected');
				});
    		}); 
        });
	});

	// Sidebar extras
	$('#searchbox').focus(function() { if ($(this).val() == 'Search') $(this).val(''); });
	$('#searchbox').blur(function() { if ($(this).val() == '') $(this).val('Search'); });

	// Twitter popup
	$('#icon-twitter').hover(function() {
			if ($('#twitter-bubble .loading').length > 0) getTweet();
	
			$('#twitter-bubble').css({ top: '10px', opacity: 0, display: 'block' }).animate({ top: 5, opacity: 1}, 'fast');
			$('#twitter-bubble .container:not(.loading)').css('width', 'auto');
    	}, function() {
	        $('#twitter-bubble').css({ top: '5px', opacity: 1 }).animate({ top: 10, opacity: 0}, 'fast', function() { $(this).hide(); } );
		});

	$('#icon-twitter').append(
		$('<div />')
		.attr({ id: 'twitter-bubble' })
		.hide()
		.append(
			$('<div />').addClass('left')
		)
		.append(
			$('<div />').addClass('container loading')
				.append($('<div />').addClass('icon'))
		)
		.append(
			$('<div />').addClass('right')
		)
		.append(
			$('<a />').addClass('twitter-link').attr({ href: $('#icon-twitter').attr('href') }).text('@MidnightSnacks').hide()
		)
		.append(
			$('<div />').addClass('shadow')
		)
	);

	function getTweet() {
		$.ajaxSetup({ cache: true });
		$.getJSON(
			'http://api.twitter.com/1/statuses/user_timeline.json?callback=?&count=5&screen_name=MidnightSnacks',
			function(data) {
				$.each(data, function(i, tweet) {
					if (tweet.text !== undefined) {
						if (/^@\w+/.test(tweet.text)) return;

						var date_tweet = new Date(tweet.created_at);
						var date_now   = new Date();
						var date_diff  = date_now - date_tweet;
						var hours      = Math.round(date_diff/(1000*60*60));
	
						var tweet_html = '<div class="tweet">' + tweet.text + '<span>' + hours + ' hours ago<\/span><\/div>';
	
						$('#twitter-bubble').append($('<div />').attr({id:'tweet-width'}).css({position: 'absolute', whiteSpace: 'nowrap', display: 'none'}).html(tweet.text));
						var maxWidth = $(window).width() - 170;
						var tweetWidth = $('#tweet-width').width();
						if (tweetWidth > maxWidth) tweetWidth = maxWidth;
						$('#tweet-width').remove();
						$('#twitter-bubble .container').css({ width: '32px' }).html(tweet_html).animate({width: tweetWidth}, 'fast', function() {
							$(this).removeClass('loading');
							$('#twitter-bubble .twitter-link, #twitter-bubble .tweet span').fadeIn('fast');
						});

						return false;
					}
				});
			}
		);
	}

	// Sidebar Facebook
	$('#icon-facebook').hover(function() {
		$('#icon-facebook > *').css('height', 0).show().animate({ height: 110 }, 100);
	}, function() {
		$('#icon-facebook > *').animate({ height: 0 }, 100, function() { $(this).hide(); });
	});

	// Artist functions
	var lastfmInfo = {};
	$('td.artist, td.track').contents().filter(function(){ return(this.nodeType == 3); }).wrap('<span />');
	$('td.artist').each(function() {
		$(this).hover(function() {
			lastfmTimeout = window.setTimeout(loadLastfmInfo, 1000, [this]);
			$('.lastfmPopup').slideUp('fast');
		}, function() {
			window.clearTimeout(lastfmTimeout);
			$(this).find('.lastfmPopup').slideUp('fast');
		});
	});

	$(window).blur(function() {
		if (typeof(lastfmTimeout) !== 'undefined') window.clearTimeout(lastfmTimeout);
		$('.lastfmPopup').slideUp('fast');
	});

	function loadLastfmInfo(what) {
		if ($(what).find('img').length > 0) {
			$('.lastfmPopup').slideUp('fast');
			$(what).find('.lastfmPopup').slideDown('fast');
			return;
		}

		var artistName = $(what).find('span').text();

		var popup = $('<div/>').css({width:$(what).width()-16, borderColor: $(what).css('borderRightColor') }).addClass('lastfmPopup').append( $('<div/>').addClass('line') );
		var frame = $('<a/>').addClass('frame').attr({ target: '_blank', href: 'http://www.last.fm/music/' + encodeURIComponent(artistName) });
		$(what).append(popup);
		popup.slideDown('fast');

		var popupWidth = popup.width();
		var popupImg = '';

		if (lastfmInfo[artistName.toLowerCase()]) {
			popup.append(frame);
			appendLastfmImage(popup, lastfmInfo[artistName.toLowerCase()].image, artistName);
		} else {
			var loader = $('<div/>').addClass('ajax-load');
			popup.append(loader);
			$.ajaxSetup({ cache: true });
			var getImg = $.getJSON('http://ws.audioscrobbler.com/2.0/?callback=?', {
				method: 'artist.getimages',
				limit: '1',
				autocorrect: '1',
				artist: artistName,
				api_key: 'e6b3c08b934314dc2217fe35b5a41e39',
				format: 'json' },
				function(data) {
					if (data.error || !data.images.image) {
						var error = data.message || 'unknown error';
						console.log(error);
						popup.slideUp('fast');
						return;
					}
					$.each(data.images.image.sizes.size, function(i, image) {
						if (image.name == 'extralarge') popupImg = image['#text'];
					});
	
					if (!lastfmInfo[artistName.toLowerCase()]) lastfmInfo[artistName.toLowerCase()] = {};
					lastfmInfo[artistName.toLowerCase()].image = popupImg;
	
					loader.remove();
					popup.append(frame);

					appendLastfmImage(popup, popupImg, artistName);
				}
			).error(function() { console.log('Error getting artist image from last.fm'); });
		}
	}

	function appendLastfmImage(popup, popupImg, artistName) {
		var frame = popup.find('.frame');
		var img = $('<img/>').attr('src', popupImg)
			.load(function() {
				if (!this.complete || (!$.browser.opera && (typeof this.naturalWidth == 'undefined' || this.naturalWidth == 0))) {
					console.log('error loading image?');
				} else {
					frame.append($('<div/>').addClass('icon').append($('<div/>').text('View artist on last.fm')));
					frame.append(img);
					popup.find('.line').animate({height: img.height() }, 'fast');
					loadLastfmTags(popup, artistName);
				}
		});
	}

	function loadLastfmTags(what, artistName) {
		var frame = $(what).find('.frame');

		if (!lastfmInfo[artistName.toLowerCase()].tags) {
			$.ajaxSetup({ cache: true });
			var getImg = $.getJSON('http://ws.audioscrobbler.com/2.0/?callback=?', {
				method: 'artist.gettoptags',
				autocorrect: '1',
				artist: artistName,
				api_key: 'e6b3c08b934314dc2217fe35b5a41e39',
				format: 'json' },
				function(data) {
					if (data.error || !data.toptags.tag) return;
					var tagsArr = [];
					$.each(data.toptags.tag, function(i, tag) {
						tagsArr[tagsArr.length] = tag.name;
						if (i == 5) return false;
					});
	
					if (!lastfmInfo[artistName.toLowerCase()]) lastfmInfo[artistName.toLowerCase()] = {};
					lastfmInfo[artistName.toLowerCase()].tags = tagsArr.join(', ');
	
					var tagsDiv = appendLastfmTags(what, artistName);
					tagsDiv.hide().fadeIn('fast');
				});
		} else{
			var tagsDiv = appendLastfmTags(what, artistName);
			//tagsDiv.show();
		}
	}
	
	function appendLastfmTags(what, artistName) {
		var frame = $(what).find('.frame');
		var tagsDiv = $('<div/>').addClass('tag-container').html('last.fm users have tagged this artist with:').append(
				$('<div/>').addClass('tags').html(lastfmInfo[artistName.toLowerCase()].tags)
			);
		if ($.browser.mozilla) { // Way to not have text-overflow: ellipses, Firefox.
			$(what).addClass('fx');
			tagsDiv.append('<span/>');
		}
		frame.append(tagsDiv);
		
		return tagsDiv;
	}
	// End!
});

function countdown() {
	var ts, d, today, diff, cd;
	
	ts = $('#clock').attr('class').substring(2);
	d = new Date();
	today = Math.round(d.getTime()/1000.0);

	diff = ts - today;
	if (diff < 0) diff = 0;

	cd = { day: Math.floor(diff/60/60/24) };
	cd.hour = Math.floor((diff - cd.day*60*60*24)/60/60);
	cd.min = Math.floor((diff - cd.day*60*60*24 - cd.hour*60*60)/60);
	cd.sec = Math.floor(diff - cd.day*60*60*24 - cd.hour*60*60 - cd.min*60);

	$.each(cd, function(t, v) {
		var e, ele, d, i;
		e = '#clock-' + t;
		v = (v < 10) ? '0' + v : v.toString();
		for (i = 1; i < 3; i++) {
			ele = (t == 'day') ? e : e + i;
			d = (t == 'day') ? v.toString()[1] : v.toString()[i-1];
			$(ele).attr('class', 'dig' + d);
		}
	});
}

