(function($) {
	
    $.fn.milestones = function(options) {
		
        settings = jQuery.extend({
		
		}, options);
		
		var milestones = $(this);
		
		switch(settings.lang) {
			
			case 'de':
				
				var lang = {
					
					prevText			: 'Letzte Woche',
					nextText			: 'Nächste Woche',
					dayNames			: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
					dayNamesShort		: ['Son','Mon','Die','Mit','Don','Fre','Sam'],
					multipleMilestones	: 'Mehrere Meilensteine'
				};
				
				break;
			
			case 'en':
				
				var lang = {
					
					prevText			: 'Last week',
					nextText			: 'Next week',
					dayNames			: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
					dayNamesShort		: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
					multipleMilestones	: 'Multiple milestones'
				};
				
				break;
			
			case 'nl':
				
				var lang = {
					
					prevText			: 'Vorige week',
					nextText			: 'Volgende week',
					dayNames			: ['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'],
					dayNamesShort		: ['Zon','Maa','Din','Woe','Don','Vri','Zat'],
					multipleMilestones	: 'Meerdere mijlpalen'
				};
				
				break;
			
			case 'sv':
				
				var lang = {
					
					prevText			: 'Förra veckan',
					nextText			: 'Nästa vecka',
					dayNames			: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
					dayNamesShort		: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
					multipleMilestones	: 'Flera milstolpar'
				};
				
				break;
		}
		
		milestones.addClass('milestones milestones-' + settings.lang);
		
		var milestonesNav = $('<div class="milestones-nav"></div>').appendTo(milestones);
		
		var milestonesNavPrev = $('<p class="milestones-nav-prev"></p>').appendTo(milestonesNav);
		var milestonesNavPrevAnchor = $('<a href="#"></a>').text(lang.prevText).attr('title', lang.prevText).bind('click', navigateToPrevWeek).appendTo(milestonesNavPrev);
		
		var milestonesDays = $('<ul class="milestones-days"></ul>').appendTo(milestonesNav);
		
		$('<li class="monday"></li>').text(lang.dayNamesShort[1]).attr('title', lang.dayNames[1]).appendTo(milestonesDays);
		$('<li class="tuesday"></li>').text(lang.dayNamesShort[2]).attr('title', lang.dayNames[2]).appendTo(milestonesDays);
		$('<li class="wednesday"></li>').text(lang.dayNamesShort[3]).attr('title', lang.dayNames[3]).appendTo(milestonesDays);
		$('<li class="thursday"></li>').text(lang.dayNamesShort[4]).attr('title', lang.dayNames[4]).appendTo(milestonesDays);
		$('<li class="friday"></li>').text(lang.dayNamesShort[5]).attr('title', lang.dayNames[5]).appendTo(milestonesDays);
		$('<li class="saturday"></li>').text(lang.dayNamesShort[6]).attr('title', lang.dayNames[6]).appendTo(milestonesDays);
		$('<li class="sunday"></li>').text(lang.dayNamesShort[0]).attr('title', lang.dayNames[0]).appendTo(milestonesDays);
		
		var milestonesNavNext = $('<p class="milestones-nav-next"></p>').appendTo(milestonesNav);
		var milestonesNavNextAnchor = $('<a href="#"></a>').text(lang.nextText).attr('title', lang.nextText).bind('click', navigateToNextWeek).appendTo(milestonesNavNext);
		
		var milestonesContent = $('<div class="milestones-content"></div>').appendTo(milestones);
		
		var milestonesWeeks = $('<div class="milestones-weeks"></div>').appendTo(milestonesContent);
		
		var today = new Date();
		
		var startDay = today;
		
		while (getWeek(startDay) !== 1) {
			
			startDay = new Date(startDay.valueOf() - (24 * 60 * 60 * 1000));
		}
		
		startDay = new Date(startDay.valueOf() - ((24 * 60 * 60 * 1000) * 6));
		
		var endDay = today;
		
		while (getWeek(endDay) !== 1) {
			
			endDay = new Date(endDay.valueOf() + (24 * 60 * 60 * 1000));
		}
		
		endDay = new Date(endDay.valueOf() - (24 * 60 * 60 * 1000));
		
		for(var day = new Date(startDay); day.valueOf() <= endDay.valueOf(); day = new Date(day.valueOf() + (24 * 60 * 60 * 1000))) {
			
			if (day.getDay() == 1) {
				
				var milestonesWeek = $('<ul></ul>').addClass('week-' + getWeek(day)).appendTo(milestonesWeeks);
			}
			
			$('<li class="empty"></li>').addClass('milestone-' + day.getFullYear() + '-' + (day.getMonth() + 1) + '-' + day.getDate()).appendTo(milestonesWeek);
		}
		
		$.each(settings.milestones, function(index, milestone) {
			
			var date = $.datepicker.parseDate('d-m-yy', milestone.date);
		
			var day = date.getDate();
			var month = date.getMonth() + 1;
			var year = date.getFullYear();
			
			var li = $('.milestone-' + year + '-' + month + '-' + day);
			
			if (li.text()) {
				if (li.hasClass(milestone.country) === false) {
					li.attr('class', '').addClass('multiple');
				}
				if (li.find('.quantity').length) {
					li.find('.quantity').text(parseInt(li.find('.quantity').text()) + 1);
				} else {
					li.find('.title a').html(lang.multipleMilestones + ' (<span class="quantity">2</span>)');
				}
			} else {
				
				li.removeClass('empty').addClass(milestone.country);
				$('<p class="date"></span></p>').html('<span class="flag"></span>' + day + ' / ' + month + ' / ' + year).appendTo(li);
				$('<p class="title"></p>').html('<a href="' + milestone.url + '">' + milestone.title + '</a>').appendTo(li);
			}
		});
		
		var weekIndex = getWeek(today);
		
		navigate(weekIndex);
		
		function getWeek(date) {
			
			var checkDate = new Date(date.getTime()); 
			checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); 
			var time = checkDate.getTime(); 
			checkDate.setMonth(0);
			checkDate.setDate(1); 
			return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; 
		}
		
		function navigateToPrevWeek(e) {
			
			e.preventDefault();
			weekIndex = weekIndex - 1;
			navigate(weekIndex);
		}
		
		function navigateToNextWeek(e) {
			
			e.preventDefault();
			weekIndex = weekIndex + 1;
			navigate(weekIndex);
		}
		
		function navigate(week) {
			
			$.each(milestonesWeeks.find('ul'), function(index, ul) {
				$(ul).hide();
			});
			
			milestonesWeeks.find('.week-' + week).show();
			
			if (week == getWeek(startDay)) {
				milestonesNavPrevAnchor.hide();
			} else {
				milestonesNavPrevAnchor.show();
			}
			
			if (week == getWeek(endDay)) {
				milestonesNavNextAnchor.hide();
			} else {
				milestonesNavNextAnchor.show();
			}
		}
	}
	
})(jQuery);
