
(function($){
	$(document).ready(function () {

		window.Calendar = {};

		/**
		 * @param date A date object
		 */
		Calendar.showEventsByDate = function(date) {
			
			var dateId = $.datepicker.formatDate('dd-mm-yy', date);
			$('.pf-calendar-grid .pf-event[date="' + dateId + '"]').show();
			$('.pf-calendar-grid .pf-event[date!="' + dateId + '"]').hide();
			
		}
		
		Calendar.requestEventsByMonth = function (year, month) {

			Calendar.requestEvents({
				data: {
					year: year,
					month: month,
					method: 'grid'
				},
				callback: Calendar.displayEventGrid
			});

		}

		/**
		 * Make a request to receive the previous events
		 */
		Calendar.requestPreviousEvents = function () {
			
			if (calendarMustWait) return;
			calendarMustWait = true;
			
			var previous = $("#previous-event-number").val();

			Calendar.requestEvents({
				data: {
					e: previous,
					method: 'list'
				},
				go: 'back',
				callback: Calendar.displayEventList 
			});
		}

		/**
		 * Make a request to receive the next events
		 */
		Calendar.requestNextEvents = function () {

			if (calendarMustWait) return;
			calendarMustWait = true;
			
			var next = $("#next-event-number").val();

			Calendar.requestEvents({
				data: {
					e: next,
					method: 'list'
				},
				go: 'forward',
				callback: Calendar.displayEventList
			});
		}
		
		/**
		 * Generate HTML from event data and appends it to the specified element (using jquery selector)
		 * 
		 *  @param event.title
		 *  @param event.date
		 *  @param event.url
		 *  @param event.display
		 *  @param event.appendTo: jQuery selector of the element to which the event should be appended
		 */
		Calendar.createHtmlEvent = function ($event) {
			var css= $event.display? '':'pb-hide';
			$event = $event || {};
			$('<div class="pf-event ' + css + '" date="' + $event.date + '"><div class="pf-date">' + $event.date + '</div><div class="pf-content"><a href="' + $event.url + '">' + $event.title + '</a></div></div>').appendTo($event.appendTo);
		}
		
		Calendar.displayEventGrid = function(config) {

				$('.pf-calendar-grid .pf-event').remove();

				$(config.content).find('event').each(function() {
					var $date = $(this).find('date').text();
					var $title = $(this).find('title').text();
					var $url = $(this).find('url').text();
					
					Calendar.createHtmlEvent({
						date: $date,
						title: $title,
						url: $url,
						display: false,
						appendTo: '.pf-calendar-grid .pf-list-events'
					});
					
				});
				$('.js-datepicker').datepicker( "refresh" );

		}

		/**
		 * @param config.content: html content to display
		 */
		Calendar.displayEventList = function(config) {
				
				var slider =  $('.js-event-slider').data('AnythingSlider');
				var page = slider.currentPage
				var incoming = page;
				var outgoing = page

				if (incoming == 1) {
					incoming = 2;
				}
				else {
					incoming = 1;
				}
				
				$(config.content).find('event').each(function() {
					var $date = $(this).find('date').text();
					var $title = $(this).find('title').text();
					var $url = $(this).find('url').text();
					
					Calendar.createHtmlEvent({
						date: $date,
						title: $title,
						url: $url,
						display: true,
						appendTo: $('.pf-list-events .eventsDiv-' + incoming) //slider.$currentPage
					});
					
				});


				if (config.go == 'back') {
					slider.goBack();
				}
				else {
					slider.goForward();
				}
				$('.eventsDiv-' + outgoing).empty();
				
				var previous = $(config.content).find('previous-event-number').text();
				var next = $(config.content).find('next-event-number').text();
				
				$('#previous-event-number').val(previous);
				$('#next-event-number').val(next);
				
				if (previous == 'no') {
					$("span#calendar_previous_btn").hide();
				}else{
					$("span#calendar_previous_btn").show(); 
				}
				
				if (next == 'no'){
					$("span#calendar_next_btn").hide();
				}else{
					$("span#calendar_next_btn").show(); 
				}
		}
		
		/**
		 * Do the actual Ajax request to get events from the server
		 * 
		 * @param config.data 
		 * @param config.callback
		 * 
		 */

		Calendar.requestEvents = function (config) {

			config = config || {};
			var data = config.data || {};
			
			var calendarUpdateUrl = $("input#url").val();
			
			$.ajax({
				type: "GET",
				url: calendarUpdateUrl,
				data: data,
 				dataType : "xml",
				success: function(responseXML) {
					var content = $(responseXML);
					var status = $(content).find('status').text();
					window.responseXML = responseXML
					if (status == "OK" || status == "ok"){
						config.content = content;
						config.callback.call(this, config)
					} else {
						calendarMustWait = false;
					}
					
					
				},
				error: function() {
					//alert("error");
					calendarMustWait = false;
				}
			});

		}
		
		
		$("#calendar_previous_btn").click(function() {
			Calendar.requestPreviousEvents();
			return false;
		});
		
		$("#calendar_next_btn").click(function() {
			Calendar.requestNextEvents();
			return false;
		});
	});
})(jQuery);
