
$(document).ready(function (){

	var storedCalendarData = [];
	var storedCalendarSearches = [];

	$('#calendar').calendar({
		daysShort	:	['S','M','T','W','T','F','S'],
		complete	:	function (days,year,month){
		
			var prevMonth = new Date(year, (month.month-1), 1); // beginning of previous month
			var nextMonth = new Date(year, (month.month+2), 0); // end of next month
			
			var dateStrPrev = prevMonth.getFullYear() + '-' + returnPaddedDate((parseInt(prevMonth.getMonth(), 10)+1));
			var dateStr = year + '-' + returnPaddedDate((parseInt(month.month, 10)+1));
			var dateStrNext = nextMonth.getFullYear() + '-' + returnPaddedDate((parseInt(nextMonth.getMonth(), 10)+1));	
			
			var calendarGroupingID = 26;
			var dateURL = '/article-search/?startDate=' + prevMonth.getFullYear() + '-' + returnPaddedDate((parseInt(prevMonth.getMonth(), 10)+1)) + '-01&endDate=' + nextMonth.getFullYear() + '-' + returnPaddedDate((parseInt(nextMonth.getMonth(), 10)+1)) + '-' + nextMonth.getDate() + '&grouping=' + calendarGroupingID;
			
			if(typeof storedCalendarSearches[dateURL] == 'undefined') {
			
				$.ajax({
					
					url: dateURL,
					dataType	:	'xml',
					type		:	'GET',
					success: function(data){
						
						// extract tags and add each tagged day as a new entry
						var extractArticles = [];
						$(data).find('xml > article').each(function (){
							
							// check if there is a multi-day tag - use highest tag attached
							var numDays = 1;
							$(this).find('tags tag tagGroup').each(function() {
								if($(this).find('name').text() == 'MULTI_DAY_EVENTS') {
									if(parseInt(($(this).parent().find('name').first().text().split('NUMBER_OF_DAYS_')[1]), 10) > numDays) {
										numDays = parseInt(($(this).parent().find('name').first().text().split('NUMBER_OF_DAYS_')[1]), 10);
									}
								}
							});
							
							// multiday event - create additional days
							if(numDays > 1) {
								
								var articleDateTime = $(this).find('vanitydate').first().text().split(" ");
								var articleDate = articleDateTime[0].split("-");
								
								for(var i = 0; i < numDays; i++) {
									
									// build date string and pass to cloned object
									var tmpDate = articleDate[0] + '-' + articleDate[1] + '-' + articleDate[2] + " " + articleDateTime[1];
									var tmpObj = $(this).clone();
									tmpObj.find('vanitydate').first().text(tmpDate);
									extractArticles.push(tmpObj);
									
									// increment day by one
									var d = new Date(articleDate[0], parseInt(articleDate[1], 10)-1, parseInt(articleDate[2], 10));
									d.setDate(d.getDate()+1);
									
									articleDate[0] = d.getFullYear();
									articleDate[1] = returnPaddedDate(d.getMonth()+1);
									articleDate[2] = returnPaddedDate(d.getDate());
								}
							
							// single day event
							} else {
								extractArticles.push($(this));
							}
						});
						
						$.each(extractArticles, function (){
							
							if($(this).find('vanitydate').first().text().length > 0 && $(this).find('vanitydate').first().text() != '') {
								
								var section = '', link = $(this).find('articlelinkurl').first().text();
								if(link.indexOf('sport', 0) != -1) { section = 'sectionSport'; }
								else if(link.indexOf('business', 0) != -1) { section = 'sectionBusiness'; }
								else if(link.indexOf('entertainment', 0) != -1) { section = 'sectionEntertainment'; }													
								
								var tmpArray = {
									'id'      : $.trim($(this).find('articleid').first().text()),
									'title'   : $(this).find('articletitle').first().text(),
									'url'     : link,
									'date'    : $(this).find('vanitydate').first().text(),
									'year'    : $(this).find('vanitydate').first().text().substr(0, 4),
									'month'   : $(this).find('vanitydate').first().text().substr(5, 2),
									'day'     : $(this).find('vanitydate').first().text().substr(8, 2),
									'section' : section
								}
								
								var tmpMonth = tmpArray.year + '-' + returnPaddedDate(tmpArray.month);
								
								if(typeof storedCalendarData[tmpMonth] == 'undefined') { storedCalendarData[tmpMonth] = []; }
								storedCalendarData[tmpMonth][tmpArray.year+tmpArray.month+tmpArray.day+"_"+tmpArray.id] = tmpArray;
								
							}
						});
						
						// store the search to ensure the same one doesn't run twice
						storedCalendarSearches[dateURL] = dateURL;
						outputCalendarDates(dateStr, dateStrPrev, dateStrNext, 'ajax');
					
					}
				});
			
			} else { // search already run - use stored data
				var timer = setTimeout(function() { outputCalendarDates(dateStr, dateStrPrev, dateStrNext, 'stored') }, 100);
			}

		}
	})

	function returnPaddedDate(num) { return parseInt(num, 10) < 10 ? "0" + parseInt(num, 10) : num; }
	function outputCalendarDates(dateStr, dateStrPrev, dateStrNext, requestType) {
		
		var datesEitherSide = false;
		
		var str = storedCalendarData[dateStr];
		for(var i in str) {
			if(!$('#calendar div.activeMonth').eq(str[i].day-1).hasClass('hasEvents')) {
				$('#calendar div.activeMonth').eq(str[i].day-1).addClass('hasEvents').append('<span class="events"><span class="top"></span><ul></ul><span class="bot"></span></span>');
			}
			$('#calendar div.activeMonth').eq(str[i].day-1).find('ul').append('<li class="' + str[i].section + '"><a href="' + str[i].url + '">' + str[i].title + '</a></li>');			
		}
		
		if(datesEitherSide) {
			var str = storedCalendarData[dateStrPrev];
			for(var i in str) {
				if(!$('#calendar div.prevMonth:contains('+ str[i].day +')').hasClass('hasEvents')) {
					$('#calendar div.prevMonth:contains('+ str[i].day +')').addClass('hasEvents').append('<span class="events"><span class="top"></span><ul></ul><span class="bot"></span></span>');
				};
				$('#calendar div.prevMonth:contains('+ str[i].day +')').find('ul').append('<li class="' + str[i].section + '"><a href="' + str[i].url + '">' + str[i].title + '</a></li>');
			}

			var str = storedCalendarData[dateStrNext];
			for(var i in str) {
				if(!$('#calendar div.nextMonth').eq(str[i].day-1).hasClass('hasEvents')) {
					$('#calendar div.nextMonth').eq(str[i].day-1).addClass('hasEvents').append('<span class="events"><span class="top"></span><ul></ul><span class="bot"></span></span>');
				}
				$('#calendar div.nextMonth').eq(str[i].day-1).find('ul').append('<li class="' + str[i].section + '"><a href="' + str[i].url + '">' + str[i].title + '</a></li>');			
			}
		}
		
		$('#calendar').delegate('div.activeMonth', 'mouseenter', function() {
			if($(this).hasClass('hasEvents')) { 
				$(this).find('span.events').css('left',((0-$(this).position().left)-4)); 
			}
		});	
	}
	
});







