/*jslint undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, strict: true, newcap: true, immed: true */
"use strict";

if (google) {
	google.load('language', '1');
}

Date.fromISO8601 = function (str) {
	str = str.replace(/-/g, '/').replace('Z', ' GMT').replace('T', ' ');	
	return new Date(str);
};

Date.prototype.clearTime = function () {
	var cleared = new Date('' + this);
	cleared.setHours(0);
	cleared.setMinutes(0);
	cleared.setSeconds(0);
	cleared.setMilliseconds(0);
	return cleared;
};

var today = (new Date()).clearTime(),
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

Date.prototype.ordinalDate = function () {
	var dayOfMonth = this.getDate(),
	ordinal = (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
	return dayOfMonth + ordinal;
};

Date.prototype.diffInWords = function () {
	var delta = today - this.clearTime();
	delta = delta / 86400000;

	switch (delta) {
		case 0: return 'today';
		case 1: return 'yesterday';

		case 2: case 3: case 4:
		case 5: case 6: case 7:
			return 'last ' + days[this.getDay()];
		default:
			return months[this.getMonth()] + ' ' + this.ordinalDate();
	}
};

Date.prototype.format = function () {
	var hours = this.getHours();
	return ' @ ' + (hours < 12 ? hours + 'am ' : hours - 12 + 'pm ') + this.diffInWords();
};

$(function () {

	if (google && google.language) {
		var detect = google.language.detect, translate = google.language.translate;
	}

	var os_language = (navigator.language ? navigator.language : navigator.userLanguage).split('-')[0],
	
	callback = {
		'last-fm': function (xml) {
			var item = $('item:eq(0)', xml),
			time = new Date(item.find('pubDate').text());

			return $('<a />').text(item.find('title').text()).attr('href', item.find('link').text())
			.add($('<span />').text(time.format()).attr('title', time.toLocaleString()));
		},
		'flickr': function (xml) {
			var item = $('entry:eq(0)', xml),
			time = Date.fromISO8601(item.find('published').text());
			return $('<a />').text(item.find('title').text()).attr('href', item.find('link').attr('href'))
			.add($('<span />').text(time.format()).attr('title', time.toLocaleString()));
		},
		'me2DAY': function (xml) {
			var item = $('item:eq(0)', xml),
			text = $('<span />').html(item.find('description').text()).find('p').remove().end().text(),
			time = new Date($('pubDate:eq(0)', xml).text());

			return $('<a />').text(text).attr('href', item.find('link').text())
			.add($('<span />').text(time.format()).attr('title', time.toLocaleString()));
		},
		'google-reader': function (xml) {
			var item = $('entry:eq(0)', xml),
			text = $('<span />').html(item.find('title:eq(0)').text()).text(),
			time = Date.fromISO8601($('updated:eq(0)', xml).text());
			return $('<a />').text(text).attr('href', item.find('link').attr('href'))
			.add($('<span />').text(time.format()).attr('title', time.toLocaleString()));
		}
	};


	$('#about-me a.fav').each(function () {
		var $t = $(this), feed = $t.attr('class').split(' ')[0];
		$('<img />').attr({src: '/media/img/loading.gif', alt: 'Loading...'}).insertAfter($t);
		$.ajax({
			url:'/get/' + feed,
			dataType: 'xml',
			error: function() {
				$t.next('img').remove();
			},
			success: function (xml) {
				$t.next('img').remove();
				if (callback[feed]) {
					var ret = callback[feed](xml), text;
					if (ret) {
						$('<p />').append(ret).hide().appendTo($t.parent()).slideDown('slow', function() {
							$(window).resize();
						});

						if (!detect) {
							return ;
						}

						detect(text=ret[0].innerHTML, function(result) {
							if (!result.error && result.language) {
								if (result.language == os_language) {
									return;
								}

								translate(text, result.language, os_language, function (result) {
									if (result.translation) {
									$(ret[0]).empty().append($('<em />').html(result.translation).attr('title', text));
											}
								});
							}
						});
					}
				}
			}
		});
	});

	if (os_language != 'en') {
		$('a.linkedin').attr('href', $('a.linkedin').attr('href') + '/' + os_language);
		$('span.locality, span.country-name, a.vcard').each(function(i, elem) {
			var el = $(elem);
			translate(el.text(), 'en', os_language, function(result) {
				if (result.translation) {
					el.text(result.translation);
				}
			});
		});
	}

	var fading_element= $('h1 span.type').data('overlay', false),
	    domain_element = fading_element.find('> span:eq(0)'),
	    about_me_element = $('#about-me'),
	    buffer = 100;

	$(window).resize(function() {
		var overlay = about_me_element.position().top - domain_element.outerHeight() - domain_element.position().top;
		if (overlay - buffer < 0) {
			var diff = Math.max(overlay/100, 0.3);
			fading_element.data('overlay', true).stop().fadeTo('slow', diff);
		} else {
			if (fading_element.data('overlay')) {
				fading_element.data('overlay', false).stop().fadeTo('slow', 1);
			}
		}
	}).resize();
});

