var dayArray = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var monthArray = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var eventTypeArray = ['ALL', 'MOLTEN', 'STJAMES', 'RESTAURANT', 'SLOT', 'TABLE'];
var loadedMonth = null;
var currentDayEvents = null;
var activeButtons = [];
var buttonsActive = 0;

$(document).ready(function() {
 var calendar = $("#calendar");
 if(calendar.length > 0) {
  var anchor = $.address.value();
  
  var currentDate = new Date();
  var thisMonthDate = new Date(currentDate.getFullYear(), currentDate.getMonth());
  
  var thisMonth = [thisMonthDate, []];
  if(anchor != "/") {
   pullMonth = createMonthFromAnchor(anchor);
   if(pullMonth[0].getTime() >= thisMonth[0].getTime()) {
    thisMonth = pullMonth;
   }
  }
  loadCalendarData(thisMonth);
  setupCalendarNav();
  setupCalendarJS();
 }
});

function createMonthFromAnchor(anchor) {
	if(anchor.length > 0 && anchor.substr(0,1)=='/') {
        anchor = anchor.substr(1);
    }
	var anchorArray = anchor.split("/");
	
	if(anchorArray[0] && anchorArray[1]) {
		var monthDate = new Date(anchorArray[0], (anchorArray[1]-1));
		var buttonsToActivate = []
		if(anchorArray[2]) {
			buttonsToActivate = anchorArray[2].split(",");
		}
		return [monthDate, buttonsToActivate];
	}
	else {
		var monthDate = new Date();
		var buttonsToActivate = []
		if(anchorArray[2]) {
			buttonsToActivate = anchorArray[2].split(",");
		}
		return [monthDate, buttonsToActivate];
	}
}

function setNewAnchor(month) {
	var monthYear = month[0].getFullYear();
	var monthMonth = month[0].getMonth() + 1;
	var buttonString = activeButtons.join(',');
	$.address.value(monthYear + "/" + monthMonth + "/" + buttonString);
}

function resetButtons(newButtons) {
	hideAllEvents();
	activeButtons = newButtons;
	$(".calendar_button").removeClass("down");
	for(var i = 0; i < activeButtons.length; i++) {
		var buttonId = "button_type" + activeButtons[i];
		showEvents(buttonId);
		$("#button_type" + activeButtons[i]).addClass("down");
		buttonsActive++;
	}
	
	if(buttonsActive > 0) {
		$("#button_type0").removeClass("down");
	}
	else {
		showAllEvents();
		$("#button_type0").addClass("down");
	}
}

function loadCalendarData(month) {
	monthDate = month[0];

	//var thisMonthString = "xml/calendar-" + (monthDate.getMonth() + 1) + "-" + monthDate.getFullYear() + ".xml?var=" + Math.floor(Math.random() * 1000001);
	var thisMonthString = "/xml/calendar.ashx?m=" + (monthDate.getMonth() + 1) + "&y=" + monthDate.getFullYear() + "&var=" + Math.floor(Math.random() * 1000001);
	
	$.ajax({type: "GET", url: thisMonthString , dataType: "xml", success: function(xml) {
		loadedMonth = month;
		
		var currentDate = new Date();
		if(monthDate.getMonth() == currentDate.getMonth()) {
			$("#calendar_banner .prev_month_link").hide();
		}
		else {
			$("#calendar_banner .prev_month_link").show();
		}
		
		var isLastMonth = $(xml).find('lastmonth').text();
		if (isLastMonth == 'Yes') {
			$("#calendar_banner .next_month_link").hide();
		}
		else {
			$("#calendar_banner .next_month_link").show();
		}
		
		setupCalendar(monthDate);
		
		$(xml).find('event').each(function(){
			
			var eventType = $(this).find('type').text();
			var eventTypeId = $.inArray(eventType, eventTypeArray);
			
			
			if(eventTypeId > -1) {
				var eventTitle = $(this).find('title').text();
				var dayOfMonth = $(this).find('dayofmonth').text();
				var eventUrl = $(this).find('url').text();
				var eventThumb = $(this).find('thumbnail').text();
				
				var eventDateText = $(this).find('datetext').text();
				var eventTimeText = $(this).find('timetext').text();
				
				var eventFacebook = $(this).find('facebook').text();
				var eventTwitter = $(this).find('twitter').text();
				var eventMyspace = $(this).find('myspace').text();
			
				$("#day_" + dayOfMonth).children('.event_titles').append('<span class="event_title event_type' + eventTypeId + '">' + eventTitle + '</span>');
				var newEvent = '<div class="event event_type' + eventTypeId + '">';
					newEvent += '<div class="event_thumb">';
						newEvent += '<a href="' + eventUrl + '">';
							newEvent += '<img src="' + eventThumb + '" alt="' + eventTitle + '" title="' + eventTitle + '" />';
						newEvent += '</a>';
					newEvent += '</div>';
					newEvent += '<div class="event_info">';
						newEvent += '<p><a href="' + eventUrl + '">' + eventTitle + '</a></p>';
						newEvent += '<p>' + eventDateText + '</p>';
						newEvent += '<p>' + eventTimeText + '</p>';
					newEvent += '</div>';
					newEvent += '<div class="event_share">';
						newEvent += '<a class="share_fb" href="' + eventFacebook + '">Share</a>';
						newEvent += '<a class="share_twit" href="' + eventTwitter + '">Tweet</a>';
						newEvent += '<a class="share_mys" href="' + eventMyspace + '">Post</a>';
					newEvent += '</div>';
				newEvent += '</div>';
				$("#day_" + dayOfMonth + " .event_container .contents").append(newEvent);
			}
		});
		
		if(activeButtons != month[1]) {
			resetButtons(month[1]);
		}
		
		resetLastEvents();
		
		setNewAnchor(month);
	}});
}

function setupCalendar(monthDate) {
	monthDate.setDate(1);
	var thisMonthMonth = monthDate.getMonth();
	var thisMonthYear = monthDate.getFullYear();
	var thisMonthFirstDay = monthDate.getDay();
	var thisMonthLastDay = daysInMonth(thisMonthMonth, thisMonthYear);

	try {

	    document.getElementById("calmonth").innerHTML = monthArray[thisMonthMonth];

	} catch (err) { } 
	
	
	var dayRows = $("#calendar tbody").children("tr");
	var dayCells = $("#calendar tbody").children("tr").children("td");
	dayCells.show();
	dayRows.show();
	dayCells.attr("id", "");
	dayCells.children(".day").html("");
	dayCells.children(".event_titles").html("");
	dayCells.children(".event_container").children(".contents").html("");
	
	$("#calendar_banner h2 strong").html(monthArray[thisMonthMonth]);
	if((thisMonthMonth - 1) < 0) {
		$("#calendar_banner .prev_month_link span").html(monthArray[11]);
	}
	else {
		$("#calendar_banner .prev_month_link span").html(monthArray[thisMonthMonth - 1]);
	}
	
	if((thisMonthMonth + 1) > 11) {
		$("#calendar_banner .next_month_link span").html(monthArray[0]);
	}
	else {
		$("#calendar_banner .next_month_link span").html(monthArray[thisMonthMonth + 1]);
	}
	
	var cellCounter = 0;
	var dayCounter = 1;
	var endOfLastWeekDone = false;
	dayCells.each(function() {
		if(cellCounter >= thisMonthFirstDay && dayCounter <= thisMonthLastDay) {
			$(this).attr("id", "day_" + dayCounter);
			$(this).children(".day").html(dayCounter);
			var dayOfWeek = cellCounter % 7;
			$(this).find(".event_container .contents").append('<h3>Events on ' + dayArray[dayOfWeek] + ', ' + monthArray[thisMonthMonth] + ' ' + getGetOrdinal(dayCounter) + ' ' + thisMonthYear + '</h3>');
			dayCounter++;
		}
		else {
			if(cellCounter >= thisMonthLastDay) {
				var dayOfWeek = cellCounter % 7;
				if(dayOfWeek == 0) {
					endOfLastWeekDone = true;
				}
			}
			
			if(endOfLastWeekDone == true) {
				$(this).hide();
			}
		}
		cellCounter++;
	});
	
	dayRows.each(function() {
		var visibleDays = $(this).children("td:visible");
		if(visibleDays.length == 0) {
			$(this).hide();
		}
	});
}

function setupCalendarNav() {
	$("#calendar_banner .next_month_link").click(function() {
		var loadedMonthMonth = loadedMonth[0].getMonth();
		var nextMonthDate = new Date(loadedMonth[0].getFullYear(), (loadedMonthMonth + 1));
		var nextMonth = [nextMonthDate, activeButtons];
		loadCalendarData(nextMonth);
		
	});
	
	$("#calendar_banner .prev_month_link").click(function() {
		var loadedMonthMonth = loadedMonth[0].getMonth();
		var prevMonthDate = new Date(loadedMonth[0].getFullYear(), (loadedMonthMonth - 1));
		var prevMonth = [prevMonthDate, activeButtons];
		loadCalendarData(prevMonth);
	});
}

function getGetOrdinal(n) {
   var s=["th","st","nd","rd"],
       v=n%100;
   return n+(s[(v-20)%10]||s[v]||s[0]);
}

function daysInMonth(month,year) {
	month = month + 1;
	var dd = new Date(year, month, 0);
	return dd.getDate();
}

function setupCalendarJS() {
	var horizOffset = 50;
	var vertOffset = 25;
	
	$(".calendar_button, .calendar_reset").mouseenter(function() {
		$(this).addClass("hover");
	});
	
	$(".calendar_button, .calendar_reset").mouseleave(function() {
		$(this).removeClass("hover");
	});
	
	$(".calendar_button").click(function() {
		if(!$(this).hasClass("down")) {
			if(buttonsActive == 0) {
				hideAllEvents();
			}
			var buttonId = $(this).attr("id");
			showEvents(buttonId);
			$(this).addClass("down");
			buttonsActive++;
			activeButtons.push(buttonId.substring(buttonId.length - 1));
			setNewAnchor(loadedMonth);
		}
		else {
			var buttonId = $(this).attr("id");
			hideEvents(buttonId);
			$(this).removeClass("down");
			buttonsActive--;
			activeButtons = jQuery.grep(activeButtons, function(value) {return value != (buttonId.substring(buttonId.length - 1));});
			setNewAnchor(loadedMonth);
			if(buttonsActive == 0) {
				showAllEvents();
			}
		}
		
		resetLastEvents();
	});
	
	$(".calendar_reset").click(function() {
		if(!$(this).hasClass("down")) {
			showAllEvents();
			$(".calendar_button").removeClass("down");
			buttonsActive = 0;
		}
	});
	
	$("#calendar tbody").mouseleave(function(){
		if(currentDayEvents != null && dontHidePopup == false) {
			currentDayEvents.hide();
			currentDayEvents = null;
		}
	});
	
	$("#calendar td").mouseenter(function(){
		$(this).addClass("hover");
		if(currentDayEvents != null) {
			currentDayEvents.hide();
			currentDayEvents = null;
		}
		var day_id = $(this).attr("id");
		
		if(day_id !== undefined) {
			var dayOffset = $(this).offset();
			var event = $(this).children(".event_container");
			var eventsShowing = event.find(".contents .event:not(.event[class~='hide'])");
			if(event !== undefined && eventsShowing.length > 0) {
				currentDayEvents = event;
				
				var windowWidth = $(window).width();
				var newHoriz = dayOffset.left + $(this).width() - horizOffset;
				var newVert = dayOffset.top + vertOffset;
				if((newHoriz + event.width()) >= windowWidth) {
					newHoriz = dayOffset.left - event.width() + horizOffset;
				}
				
				event.css("left", newHoriz + "px");
				event.css("top", newVert + "px");
				event.show();
			}
		}
	});
	
	$("#calendar td").mouseleave(function(){
		$(this).removeClass("hover");
		if(currentDayEvents != null) {
			currentDayEvents.hide();
			currentDayEvents = null;
		}
	});
}

function showEvents(buttonId) {
	var eventClass = buttonId.replace("button", "event");
	$("#calendar span." + eventClass).css("text-indent", "");
	$(".event_container div." + eventClass).show();
	$(".event_container div." + eventClass).removeClass("hide");
}

function hideEvents(buttonId) {
	var eventClass = buttonId.replace("button", "event");
	$("#calendar span." + eventClass).css("text-indent", "-1000px");
	$(".event_container div." + eventClass).hide();
	$(".event_container div." + eventClass).addClass("hide");
}

function hideAllEvents() {
	$("#calendar span.event_title").css("text-indent", "-1000px");
	$(".event_container div.event").hide();
	$(".event_container div.event").addClass("hide");
	$(".calendar_reset").removeClass("down");
	activeButtons = [];
	resetLastEvents();
}

function showAllEvents() {
	$("#calendar span.event_title").css("text-indent", "");
	$(".event_container div.event").show();
	$(".event_container div.event").removeClass("hide");
	$(".calendar_reset").addClass("down");
	activeButtons = [];
	resetLastEvents();
}

function resetLastEvents() {
	$(".event_container div.event").removeClass("last");
	var eventContainers = $(".event_container")
	eventContainers.each(function() {
		$(this).find("div.event:not(.event[class~='hide']):last").addClass("last");
	});
}

function setuptarget(linkEle) {
    monthDate = loadedMonth[0];

    var thisMonthString = "/Templates/calendar-print.aspx/#/" + monthDate.getFullYear() + "/" + (monthDate.getMonth() + 1);
    linkEle.href = thisMonthString;

    return true;
}
