// JS document
var disp = "week";

$(document).ready(function(){

	//Set up the view change buttons
	$('.view-week').click(function(){
		disp = "week";
		$(this).parent().siblings().removeClass('selected');
		$(this).parent().addClass('selected');
		$('#tempDisp').val('week');
		selectWeek(true);
		return false;
	});
	$('.view-day').click(function(){
		disp = "day";
		$(this).parent().siblings().removeClass('selected');
		$(this).parent().addClass('selected');
		$('#tempDisp').val('day');
		selectDay(true);
		return false;
	});
	$('.view-month').click(function(){
		disp = "month";
		$(this).parent().siblings().removeClass('selected');
		$(this).parent().addClass('selected');
		$('#tempDisp').val('month');
		selectMonth(true);
		return false;
	});
	
	//Remember last state and reload it if necessary
	var cachedDisp = $('#tempDisp').val();
	
	if(cachedDisp != null && cachedDisp.length > 0){
		disp = cachedDisp;
		$('.view-' + disp).parent().siblings().removeClass('selected');
		$('.view-' + disp).parent().remove('selected');
	}
	
	initSearchResultControls();
	selectCurrentDayWeekMonth();
	
	//set up the datepicker
	$( "#datepicker" ).datepicker({
		changeMonth: true,
		changeYear: true,
		showOtherMonths: true,
		selectOtherMonths: true,
		dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
		firstDay: 1,
		prevText: '',
		nextText: '',
		monthNamesShort: ['January','February','March','April','May','June','July','August','September','October','November','December'],
		minDate: 0,
		onSelect: function(dateText, inst) {
			$('#tempDate').val($(this).datepicker("getDate"));
			selectCurrentDayWeekMonth();
			reloadSearchResults();	
		},
		 onChangeMonthYear: function(year, month, inst) { 
			if(disp=="month"){
				var newDate = new Date(year, (month-1), 1);
				$( "#datepicker" ).datepicker("setDate",newDate);
				$('#tempDate').val(newDate);
				
				selectCurrentDayWeekMonth();
				//reloadSearchResults();	
			}
		}
	});
	
	//Remember last state and reload it if necessary
	var cachedDate = $('#tempDate').val();
	
	if(cachedDate != null && cachedDate.length > 0){
		$( "#datepicker" ).datepicker("setDate",new Date(cachedDate));
	}
	
	selectCurrentDayWeekMonth();
	
	reloadSearchResults();
	
})

function selectCurrentDayWeekMonth(){
	if ( disp == "week" )
		selectWeek(false);
	else if ( disp == "day" ) 
		selectDay(false);
	else if ( disp == "month" ) 
		selectMonth(false);
}

function initSearchResultControls(){
	//set up the sliding regions for the results
	$(".calendar-button").css("display", "block"); 
	
	// funtionality for the results accordion
	$('.calendar-button').click(function(){
		$(this).parent().parent().find('.results-content').slideToggle('slow');
		$(this).toggleClass('content-open');
		return false;
	});	
}

//functionality for prev and next buttons
function nextPrevious(isNext){

	var d = $( "#datepicker" ).datepicker("getDate");
	
	var daysToChange = 0;
	
	if(disp == "month") {
		daysToChange = 31;
	}else if(disp == "week") {
		daysToChange = 7;
	}else if(disp == "day") {
		daysToChange = 1;
	}
	
	
	if(disp == "week" || disp == "day"){
		if(isNext)
			var newDate = addSubtractDaysFromDate(d, daysToChange);
		else
			var newDate = addSubtractDaysFromDate(d, -daysToChange);
	}else if(disp=="month"){
		if(isNext)
			var newDate = addSubtractMonthsFromDate(d, 1);
		else
			var newDate = addSubtractMonthsFromDate(d, -1);
	}

	$("#datepicker").datepicker("setDate", newDate);

	if(disp == "month") {
		selectMonth(false);
	}else if(disp == "week") {
		selectWeek(false);
	}else if(disp == "day") {
		selectDay(false);
	}
	
	reloadSearchResults();
	
	return false;
}

function addSubtractMonthsFromDate(date, months){
	date.setMonth(date.getMonth() + months);
	
	var newDate = date.toDateString(); 
	newDate = new Date(Date.parse(newDate));
	return newDate;
}

function addSubtractDaysFromDate(date, days){
	date.setDate(date.getDate() + days);
	
	var newDate = date.toDateString(); 
	newDate = new Date(Date.parse(newDate));
	return newDate;
}

function selectWeek(withDelay) {
	$( '.previous' ).html('previous week');
	$( '.next' ).html('next week');
	
	if(withDelay)
		var delay = 250;
	else
		var delay = 0;

	var t=setTimeout("$( '#datepicker .ui-datepicker-current-day' ).parent().siblings().removeClass( 'selected-week' );$( '#datepicker .ui-datepicker-current-day' ).parent().addClass( 'selected-week' );",delay);
}

function selectDay(withDelay) {
	$( '.previous' ).html('previous day');
	$( '.next' ).html('next day');
	
	if(withDelay)
		var delay = 250;
	else
		var delay = 0;
		
	var t=setTimeout("$( '#datepicker .ui-datepicker-current-day' ).parent().siblings().removeClass( 'selected-week' );$( '#datepicker .ui-datepicker-current-day' ).parent().removeClass( 'selected-week' )",delay);
}

function selectMonth(withDelay) {
	$( '.previous' ).html('previous month');
	$( '.next' ).html('next month');
	
	if(withDelay)
		var delay = 250;
	else
		var delay = 0;
		
	var t=setTimeout("$( '#datepicker .ui-datepicker-current-day' ).parent().siblings().addClass( 'selected-week' );$( '#datepicker .ui-datepicker-current-day' ).parent().addClass( 'selected-week' )",delay);
}

function reloadSearchResults(){
	var d = $( "#datepicker" ).datepicker("getDate");
	//alert(d);
	var csvEventType = getCheckboxesListAsCsv("whatson_eventSubType_checkbox");
	var csvLocation = getCheckboxesListAsCsv("whatson_location_checkbox");
	
	var eventType = $('#calEventType').val();
	
	var showInternal = $('#showInternal').val();
	var showExternal = $('#showExternal').val();
	var isIntranetCal = $('#isIntranetCal').val();

	csvEventType = csvEventType.replace(/&/g,'%26');
	
	var params = 
		"&date=" + d.getDate() +
		"&month=" + (d.getMonth()+1) +
		"&year=" + d.getFullYear() +
		"&disp=" + disp +
		"&garden=" + csvLocation +
		"&showInternal=" + showInternal +
		"&showExternal=" + showExternal +
		"&isIntranetCal=" + isIntranetCal +
		"&eventType=" + eventType +
		"&eventSubType=" + csvEventType +
		"&location=" + csvLocation;

	var dateNow = new Date();	
	
	var url = "?IdcService=KEW_DISPLAY_INC&incName=kew_calendar_whatson_get_results" + params + "&t=" + dateNow.getTime();
	
	var isDebug = (window.location.href.indexOf('isDebug=1') != -1);
	
	if(isDebug){
		url += "&isDebug=1";
	}
	
	$.get(url, function(returnHtml){
		//Add debug to page if necessaru
		if(isDebug){
			returnHtml = url + "<br/>" + returnHtml;
		}
	
		$('#calendar-results').html(returnHtml);
		initSearchResultControls();
	});
}

//Loop through checkboxes with the given class and if selected, add them to a csv list
function getCheckboxesListAsCsv(checkboxClass){
	var csvVals = "";
	
	$('.' + checkboxClass + ":checked").each(function(i,e){
		csvVals += $(this).attr('id') + ",";
	});
	
	return csvVals;
}

function setLocation(location){
	csvLocation = location;
	reloadSearchResults();
}

function CalendarEvent(dDocName,divClass,altText,HttpCgiPath,src,overlayDiv,strHeadline,festivalLink,strDescription,ssUrl,startDate,endDate){
// ***********   divClass,altText,HttpCgiPath,src,overlayDiv,strHeadline,festivalLink,strDescription,ssUrl
	this.dDocName = dDocName;
	this.divClass = divClass;
	this.HttpCgiPath = HttpCgiPath;
	this.src = src;
	this.overlayDiv = overlayDiv;
	this.strHeadline = strHeadline;
	this.festivalLink = festivalLink;
	this.strDescription = strDescription;
	this.altText= altText;
	this.ssUrl=ssUrl;
	this.startDate=parseDateWithSeconds(startDate);
	this.endDate=parseDateWithSeconds(endDate);
}

function getCalendarEventHtmlWeek(objCalendarEvent){
	return "<div class='image'> " +
		"<div class='float-left thumb " + objCalendarEvent.divClass + "'>" +
		"<img  alt='" + objCalendarEvent.altText + "' src='" + objCalendarEvent.HttpCgiPath + "" + objCalendarEvent.src + "' />" +
		objCalendarEvent.overlayDiv + 
		"</div> " +
		"<h2 class='header3'><a title='" + objCalendarEvent.strHeadline + "' href='" + objCalendarEvent.ssUrl + "'>" + objCalendarEvent.strHeadline + "</a></h2> " +
		objCalendarEvent.festivalLink +  
		"<p>" + objCalendarEvent.strDescription + "</p> " +
		"<div class='hr'><hr /></div>" +
	"</div>";
}

function getCalendarEventHtmlMonthIntranet(objCalendarEvent){	

	/*
	To display month results as weekly results:
	
	"<div class='image'> " +
		"<div class='float-left thumb " + objCalendarEvent.divClass + "'>" +
		"<img  alt='" + objCalendarEvent.altText + "' src='" + objCalendarEvent.HttpCgiPath + "" + objCalendarEvent.src + "' />" +
		objCalendarEvent.overlayDiv + 
		"</div> " +
		"<h2 class='header3'><a title='" + objCalendarEvent.strHeadline + "' href='" + objCalendarEvent.ssUrl + "'>" + objCalendarEvent.strHeadline + "</a></h2> " +
		objCalendarEvent.festivalLink +  
		"<p>" + toFriendlyFormat2(objCalendarEvent.startDate)+ " - " + toFriendlyFormat2(objCalendarEvent.endDate) + "</p> " +
		"<p>" + objCalendarEvent.strDescription + "</p> " +
		"<div class='hr'><hr /></div>" +
	"</div>";
	*/
	return "<div class='month-result'>"+
				"<a title='" + objCalendarEvent.strHeadline + "' href='" + objCalendarEvent.ssUrl + "'>" + objCalendarEvent.strHeadline + "</a> " +
				"<div class='hr'><hr /></div>" +
			"</div>";
}

function getCalendarEventsHtmlMonth(objCalendarEvent){
	return "<div class='month-result'>" +
		"	<a title='" + objCalendarEvent.strHeadline + "' href='" + objCalendarEvent.ssUrl + "'>" + objCalendarEvent.strHeadline + "</a>" +
		objCalendarEvent.festivalLink +
		"	<div class='hr'><hr></div>"+
		"</div>";

}

function getCalendarCatStartHtml(date){
	return "<div class='results-section'>"+
	"<div class='results-head'>"+
	"	<h2 class='float-left'>" + toFriendlyFormat(date) + "</h2>"+
	"	<a href='#' title='Expand' class='float-right calendar-button'>Expand</a>"+
	"</div>"+
	"<div class='results-content'>";
}

function getCalendarCatEndHtml(){
	return "<div class='clear-both'></div>" +
	"</div>" +
	"</div>";
}


//Returns dates in 'Thursday 17 March' format
function toFriendlyFormat(date){
    var days = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
    
	return days[date.getDay()] + " " + date.getDate() + " " + months[date.getMonth()] ;
}

//Returns dates in '17 March 12:00 AM' format
function toFriendlyFormat2(date){
 
	var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
    
	var hour = date.getHours();
	var min = date.getMinutes();
	var a_p = "";

	if (hour < 12){
		a_p = "AM";
   }else{
		a_p = "PM";
   }
   
	if (hour == 0){
		hour = 12;
	}

	if (hour > 12){
		hour = hour - 12;
	}

	min = min + "";

	if (min.length == 1){
		min = "0" + min;
	}
	
	return date.getDate() + " " + months[date.getMonth()] + " " + hour + ":" + min + " " + a_p;
}

/* Draws the events for weekly calendar
*/
function drawEvents(events, startDateStr, endDateStr, calType){
	var html = "";
	
	var startDate = parseDate(startDateStr);
	var endDate = parseDate(endDateStr);
	
	var dateIterator = startDate;
	var numEventsDrawn = 0;

	do{
		html += getCalendarCatStartHtml(dateIterator);
		for(var i=0; i<events.length; i++){
			//alert(toFriendlyFormat(dateIterator) + " between " + toFriendlyFormat(events[i].startDate) + " and " + toFriendlyFormat(events[i].endDate));
			
			//if(dateIterator >= events[i].startDate && dateIterator <= events[i].endDate){
			//create the end of the date period for comparison
			//basically we want to check if the dateIterator period overlaps with the event time
			dateIteratorEnd = new Date(Date.parse(dateIterator));
			dateIteratorEnd = addSubtractDaysFromDate(dateIteratorEnd, 1);
			if(dateIteratorEnd > events[i].startDate && dateIterator <= events[i].endDate){
			
			//console.log(dateIterator + " >= " + events[i].startDate + " and <= " + events[i].endDate);
			//alert(calType);
				if(calType == "week"){
					html += getCalendarEventHtmlWeek(events[i]);
					numEventsDrawn++;
				}else if(calType == "month"){
					html += getCalendarEventsHtmlMonth(events[i]);
					numEventsDrawn++;
				}
			}
		}
		
		html += getCalendarCatEndHtml();
		
		dateIterator = addSubtractDaysFromDate(dateIterator, 1);
	}while(dateIterator <= endDate);
	
	if(numEventsDrawn == 0){
		$('#calendar-results').append("No events found - please try another search");
	}else{
		$('#weekly_events_placeholder').html(html);
	}
}

function weekOfMonth(startDate, endDate){
	this.startDate = startDate;
	this.endDate = endDate;
}

/*Display the calendar events in their four constituant weeks within the month view*/
function drawMonthIntranetEvents(events, startDateStr, endDateStr, calType){

	var html = "";
	
	var SUNDAY = 0;
	
	var startDate = parseDateWithSeconds(startDateStr);
	var endDate = parseDateWithSeconds(endDateStr);
	
	//Create weekly sections of the month
	var dateIterator = startDate;
	
	var weekSegmentStart =  new Date(startDate);
	
	var weeksOfMonth = [];
	
	do{
		//If the current day iterator is Sunday, create a new week segment
		if(dateIterator.getDay() == SUNDAY || (dateIterator.getDate() == endDate.getDate())){
			weeksOfMonth.push(new weekOfMonth(new Date(weekSegmentStart), new Date(dateIterator)));
			weekSegmentStart = new Date(addSubtractDaysFromDate(dateIterator, 1));
		}
		
		dateIterator = addSubtractDaysFromDate(dateIterator, 1);
	}while(dateIterator <= endDate);
	
	var numEventsDrawn = 0;			
	var html = "";
	
	for(var j=0; j<weeksOfMonth.length; j++){
		var eventsInSegment = 0;
		var weekSegmentHtml = "<div class='results-section'>" + 
								"<div class='results-head'>	" + 
									"<h2 class='float-left'>" + toFriendlyFormat(weeksOfMonth[j].startDate) + " - " + toFriendlyFormat(weeksOfMonth[j].endDate) + "</h2>" +
									"<a class='float-right calendar-button' title='Expand' href='#' style='display: block;'>Expand</a>" + 
								"</div><div class='results-content'>";
		
		var addedEventDocNames = [];
		
		for(var i=0; i<events.length; i++){
			if(((events[i].startDate >= weeksOfMonth[j].startDate) && (events[i].startDate <= weeksOfMonth[j].endDate)) //If the event starts within the week segment
				|| ((events[i].startDate < weeksOfMonth[j].startDate) && (events[i].endDate >= weeksOfMonth[j].startDate)) //If the event runs into the week segment but starts before it
				){
				
				if($.inArray(events[i].dDocName,addedEventDocNames) == -1){
				
					weekSegmentHtml += getCalendarEventHtmlMonthIntranet(events[i]);
					numEventsDrawn++;
					eventsInSegment++;
					addedEventDocNames.push(events[i].dDocName);
				}
			}
		}
		weekSegmentHtml += "<div class='clear-both'></div></div></div>";
		
		if(eventsInSegment > 0)
			html += weekSegmentHtml;
	}
	
	if(numEventsDrawn == 0){
		$('#calendar-results').append("No events found - please try another search");
	}else{
		$('#monthly_events_placeholder').html(html);
	}
}

function parseDate(dateStr){

	dateStr = dateStr.substring(0, 10);

	var dateArr = dateStr.split("/");
	//alert("In: " + dateStr + "\n Out: " + new Date(dateArr[2], (parseInt(dateArr[1],10) -1), dateArr[0]));
	return new Date(dateArr[2], (parseInt(dateArr[1],10) -1), dateArr[0]);
}

function parseDateWithSeconds(dateStr){

	dateStr = dateStr.substring(0, 16);

	var dateArr = dateStr.split("/");
	
	var timeArr = dateArr[2].split(" ");
	var timeArr2 = timeArr[1].split(":");
	//alert("In: " + dateStr + "\n Out: " + new Date(timeArr[0], (parseInt(dateArr[1],10) -1), dateArr[0], timeArr2[0], timeArr2[1]));
	return new Date(timeArr[0], (parseInt(dateArr[1],10) -1), dateArr[0], timeArr2[0], timeArr2[1]);
}


