;(function($) {
	
	/*Sets up and displays the events for this Kimpton Hotel*/
	$.fn.kimptonEvents = function(options) {
		var settings = $.extend({}, $.fn.kimptonEvents.defaults, options);

		this.each(function() {
			var $this = $(this);
			/*Support for the Metadata Plugin.*/
			var o = $.meta ? $.extend({}, settings, $this.data()) : settings;
			/*set up the initial structure*/
			settings.currPage = 'INDEX';
			$('<div/>').attr('id', settings.monthNavContainer).appendTo(this);
			$('<div/>').attr('id', settings.eventsContainer).appendTo(this);
		});

		this.grabData = function(options){
			/*go ahead and fetch the data*/
			this.each(function(){
				internalGrabData(settings.path + '' + settings.pageName + '.json');
				/*set the current page number*/
				settings.currPageNumber = 1;
			});
			return this;
		};

		/*Once data is grabed,  a function named data_callback() is called.  In that function you need to call this funtion.*/
		this.handleData = function(data){
			calendar_type = '';
			/*Get the calendar type to determine which view to show*/
			if(data.data[0] === undefined){
				calendar_type = data.data.Property.event_calendar_type_text;
			}else{
				calendar_type = data.data[0].Property.event_calendar_type_text;
			}
			/*trim any white spaces*/
			calendar_type = calendar_type.replace(/^\s+|\s+$/g,"");
			if(calendar_type == 'full'){
				/*They want the full calendar*/
				data = prepareDataForFullView(data);
				$(this).fullCalendar({
					header: {
						left: 'prev,next today',
						center: 'title',
						right: 'month,basicWeek'
					},
					editable: false,
					weekMode: 'liquid',
					events: data,
					eventRender: function(event, element, view) {
						currentDate = new Date(view.start);
						currentMonth = currentDate.getMonth();
						if(currentMonth < event.month){
							$(element).addClass('next_month_event');
						}else if(event.month < currentMonth){
							$(element).addClass('prev_month_event');
						}
					},
					eventMouseover: function(calEvent,jsEvent, view) {
							ie = document.all ? true : false;
              $('body').append("<div class='event_tooltip' id='event_desc_"+calEvent.id+"'>"+calEvent.description+"</div>");
              tooltip = $('#event_desc_'+calEvent.id);
              offsetTop = tooltip.height();
							$("#event_desc_"+calEvent.id)
								.hide()
								.css("top", jsEvent.pageY - offsetTop - 15)
								.css("left", jsEvent.pageX + 15)
								.fadeIn("slow");
					},
					eventMouseout: function(calEvent,jsEvent, view) {
						$("#event_desc_"+calEvent.id).fadeOut("slow").remove();	
					}
				});
			}else if(calendar_type == 'list'){
				/*They want the standard list view*/
				$(this).kimptonListStyle(settings, data, false);
			}
			
			return this;
		};

		this.handleError = function(data){
			$(this).kimptonListStyle(settings, data, true);
			return this;
		};

		function internalGrabData(data_url){
			/*internal function to grab JSON*/
			$.ajax({
				url: data_url,
				dataType: 'jsonp',
				data: settings.conditions,
				success: function(data, textStatus, XMLHttpRequest) {},
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					alert(textStatus);
				}
			});
		};
		
		/*We need to prepare the data to be sent to the full calendar*/
		function prepareDataForFullView(data){
			new_data = [];
			$.each(data.data, function(i,item)
			{
				var date = new Date($.fullCalendar.parseDate(item['Event']['date_of_event']+' '+item['Event']['start_time']));
				var end_time = '';
				/*console.log(item);*/
				if(item['Event']['hide_end_time'] == 0 || item['Event']['hide_end_time']==undefined) {
				  end_time = " to "+item['Event']['fend_time'];
				} 
				new_data[i] = {id: item['Event']['id'], title: item['Event']['title']+"<br />"+item['Event']['fstart_time']+end_time, description: item['Event']['description'], start: $.fullCalendar.parseDate(item['Event']['date_of_event']+" "+item['Event']['start_time']), end: $.fullCalendar.parseDate(item['Event']['date_of_event']+" "+item['Event']['end_time']), month: date.getMonth()};
			});
			return new_data;
		};
		
		// private function for debugging
		function debug($obj) {
			if (window.console && window.console.log) {
				window.console.log($obj);
			}
		};

		return this;

	};
	
	/*default options*/
	$.fn.kimptonEvents.defaults = {
		path : 'http://cms-specials.kimptongroup.com/events/', /*The path to all the data*/
		pageName : '', /*The page name where all json lives*/
		monthNavContainer : 'month_nav_container', /*The id for the month navigation*/
		eventsContainer : 'event_container', /*The id for the month navigation*/
		pagingContainer : 'paging_container', /*The class name for the paging container*/
		naviType : 'single', /*single or all - single displays 1 month with next and prev.,  all displays all monthes with year next and prev.*/
		calType : 'list', /*list or full - Default type of calendar to use.*/
		eventSeperator : '<div class="seperator">&nbsp;</div>', /*html for the seperator between events*/
		showPagination : false, /*set true to use pagination*/
		conditions : {} /*url to get all events*/
	};
	
	/*Sets up and displays the events for this Kimpton Hotel*/
	$.fn.kimptonListStyle = function(settings, data, error) {

		this.each(function() {
			var $this = $(this);
			
			/*Support for the Metadata Plugin.*/
			var o = $.meta ? $.extend({}, settings, $this.data()) : settings;
			prepareHTMLArea();
			/*create the month navigation*/
			createMonthNavi();
			if(error){
				handleError();
			}else{
				if(settings.currPage == 'VIEW'){
					view_all_link = $('<a/>').attr('href','#').attr('class','view_all_link').html('&laquo; Back to Events').click(function(){
						if(settings.currPageNumber > 1){
							internalGrabData(settings.path + '' + settings.pageName + '/page:' + settings.currPageNumber + '.json');
						}else{
							internalGrabData(settings.path + '' + settings.pageName + '.json');
						}
						settings.currPage = 'INDEX';
						return false;
					}).appendTo('#' + settings.eventsContainer);
				}
				if(data.data[0] === undefined){
					/*a single event*/
					createEvent(data.data.Event, true);
				}else{
					var last_elem = data.data.length-1;
					$.each(data.data, function(i,item)
					{
						if(i == last_elem){
							last_event = true;
						}else{
							last_event = false;
						}
						createEvent(item['Event'], last_event);
					});
				}
				if(settings.showPagination){
					addPaging(data);
				}
			}

		});

		/*Layout the appropriate divs for attaching the calendar events*/
		function prepareHTMLArea(){
			/*Remove all the children*/
			$('#' + settings.monthNavContainer).children().remove();
			$('#' + settings.eventsContainer).children().remove();
			return true;
		};

		function createEvent(event_item, last_elem){
			/*Create one event element*/
			event_div = $('<div/>').attr('id','event_'+event_item['id']).hide();
			$('#' + settings.eventsContainer).append(event_div);
			$('<h1/>').html(event_item['title']).appendTo(event_div);
			$('<h2/>').html(event_item['fdate_of_event']).appendTo(event_div);
			$('<h3/>').html(event_item['fstart_time'] + ' - ' + event_item['fend_time']).appendTo(event_div);
			$('<div/>').attr('class','event').html(event_item['description']).appendTo(event_div);
			if(settings.currPage != 'VIEW'){
				view_event_link = $('<a/>').attr('href','#').attr('class','view_one_link_' + event_item['id']).html('View this Event &raquo;').click(function(){
					item_id = $(this).attr('class').split('view_one_link_')[1];
					internalGrabData(settings.path + '' + settings.pageName + '/' + item_id + '.json');
					settings.currPage = 'VIEW';
					return false;
				}).appendTo(event_div);
			}
			if(!last_elem){
				$(settings.eventSeperator).appendTo(event_div);
			}
			$(event_div).fadeIn('slow');
			return true;
		};

		function createMonthNavi(){
			if(settings.naviType == 'all'){
				createAllMonthNavi();
			}else{
				createSingleMonthNavi();
			}
			return true;
		};

		function createAllMonthNavi(){
			/*Create the month navigation to display all months*/
			$('#' + settings.monthNavContainer).hide().append('<ul/>');
			m_names = new Array("Jan.", "Feb.", "March", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec.");
			today = new Date();
			var this_month = today.getMonth()+1;
			var this_year = today.getFullYear();
			if (settings.conditions['year'] == this_year){
				/*since it is this year,  satrt with this month events*/
				var start_month = today.getMonth()+1;	
			}else{
				var start_month = 1;
			}
			$.each(m_names, function(i,item)
			{
				var month = i+1;
				if(month >= start_month){
				$('<a/>').attr('href','#').attr('class','month_' + month + '_link').html('<span>' + item + ' ' + settings.conditions['year'] + '</span>').click(function(){
				settings.conditions['month'] = month;
				internalGrabData(settings.path + '' + settings.pageName + '.json');
				settings.currPage = 'INDEX';
				return false;
			}).appendTo('#' + settings.monthNavContainer + ' ul');
			}else{
				$('<a/>').attr('href','#').attr('class','month_' + month + '_link disabled').html('<span>' + item + ' ' + settings.conditions['year'] + '</span>').click(function(){
					return false;
				}).appendTo('#' + settings.monthNavContainer + ' ul');
			}
			});
			var next_year = settings.conditions['year']+1;
			/*add the next year link*/
			$('<a/>').attr('href','#').attr('class','next_year_link').html('<span>' + (settings.conditions['year']+1) + ' &raquo;</span>').click(function(){
				settings.conditions['month'] = 1;
				settings.conditions['year'] = next_year;
				internalGrabData(settings.path + '' + settings.pageName + '.json');
				settings.currPage = 'INDEX';
				return false;
			}).appendTo('#' + settings.monthNavContainer + ' ul');
			if(settings.conditions['year'] != this_year){
				var prev_year = settings.conditions['year']-1;
				if(prev_year == this_year){
					var prev_month = this_month;
				}else{
					var prev_month = 1;
				}
				/*add the next year link*/
				$('<a/>').attr('href','#').attr('class','prev_year_link').html('<span>&laquo;' + (settings.conditions['year']-1) + ' </span>').click(function(){
					settings.conditions['month'] = prev_month;
					settings.conditions['year'] = prev_year;
					internalGrabData(settings.path + '' + settings.pageName + '.json');
					settings.currPage = 'INDEX';
				return false;
				}).prependTo('#' + settings.monthNavContainer + ' ul');
			}else{
				$('<a/>').attr('href','#').attr('class','prev_year_link disabled').html('<span>&laquo;' + (settings.conditions['year']-1) + ' </span>').click(function(){
					return false;
				}).prependTo('#' + settings.monthNavContainer + ' ul');
			}
			$('#' + settings.monthNavContainer + ' a').wrap('<li/>');
			appendClearDiv('#' + settings.monthNavContainer);
			$('#' + settings.monthNavContainer).show();
			setCurrentMonth();
			return true;
		};

		function createSingleMonthNavi(){
			/*Create the month navigation with only the current month, and next and back buttons*/
			m_names = new Array("","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
			today = new Date();
			var this_month = today.getMonth()+1;
			var this_year = today.getFullYear();
			prev_month = settings.conditions['month']-1;
			prev_year = settings.conditions['year'];
			next_month = settings.conditions['month']+1;
			next_year = settings.conditions['year'];
			if(settings.conditions['month'] == 1){
				/*previous month is december of last year*/
				prev_month = 12;
				prev_year = settings.conditions['year']-1;
			}else if(settings.conditions['month'] == 12){
				/*next month is january of next year*/
				next_month = 1;
				next_year = settings.conditions['year']+1;
			}
			$('#' + settings.monthNavContainer).hide().append('<ul/>');
			if((this_month == settings.conditions['month']) && (this_year == settings.conditions['year'])){
				$('<a/>').attr('href','#').attr('class','prev_month_link disabled').attr('title', m_names[prev_month]).html('<span>&laquo; </span>').click(function(){
					return false;
				}).appendTo('#' + settings.monthNavContainer + ' ul');
			}else{
				/*add the prev month link, if the month has not passed*/
				$('<a/>').attr('href','#').attr('class','prev_month_link').attr('title', m_names[prev_month]).html('<span>&laquo; </span>').click(function(){
					settings.conditions['month'] = prev_month;
					settings.conditions['year'] = prev_year;
					internalGrabData(settings.path + '' + settings.pageName + '.json');
					settings.currPage = 'INDEX';
					return false;
				}).appendTo('#' + settings.monthNavContainer + ' ul');	
			}
			/*create the month title*/
			$('<a/>').attr('href','#').attr('class','current_month_link current').html('<span> ' + m_names[settings.conditions['month']] + ' ' + settings.conditions['year'] + '</span>').click(function(){
				return false;
			}).appendTo('#' + settings.monthNavContainer + ' ul');
			/*add the next month link*/
			$('<a/>').attr('href','#').attr('class','next_month_link').attr('title', m_names[next_month]).html('<span> &raquo;</span>').click(function(){
				settings.conditions['month'] = next_month;
				settings.conditions['year'] = next_year;
				internalGrabData(settings.path + '' + settings.pageName + '.json');
				settings.currPage = 'INDEX';
				return false;
			}).appendTo('#' + settings.monthNavContainer + ' ul');
			$('#' + settings.monthNavContainer + ' a').wrap('<li/>');
			appendClearDiv('#' + settings.monthNavContainer);
			$('#' + settings.monthNavContainer).show();
			return true;
		};

		function setCurrentMonth(){
			$('#' + settings.monthNavContainer + ' a').removeClass('current');
			$('a.month_' + settings.conditions['month'] + '_link').addClass('current');
			return true;
		};

		function setCurrentPage(curr_page){
			$('div.' + settings.pagingContainer + ' a').removeClass('current');
			$('a.page_' + curr_page + '_link').addClass('current');
			return true;
		};

		function addPaging(data){
			/*Create pagination links*/
			curr_page = data.Pagination['current_page'];
			total_pages = data.Pagination['total_pages'];
			if((curr_page == 'single') && (total_pages == 'single')){
				return true;
			}
			settings.currPageNumber = curr_page;
			paging_div = $('<div/>').attr('class', settings.pagingContainer).hide().appendTo('#' + settings.eventsContainer);
			paging_ul = $('<ul/>').appendTo(paging_div);
			for (var i=1; i <= total_pages; i++) {
				$('<a/>').attr('href','#').attr('class','page_' + i + '_link').attr('rel','paging_link_' + i).html('<span>' + i + '</span>').appendTo(paging_ul);
			};
			$('div.' + settings.pagingContainer + ' a').wrap('<li/>').click(function(){
				var page_num = $(this).attr('rel').split('paging_link_')[1];
				internalGrabData(settings.path + '' + settings.pageName + '/page:' + page_num +'.json');
				settings.currPage = 'INDEX';
				return false;
			});
			$('<p/>').attr('class','current_paging').html('Page ' + curr_page + ' of ' + total_pages).appendTo('#' + settings.eventsContainer);
			setCurrentPage(curr_page);
			appendClearDiv('div.' + settings.pagingContainer);
			$('div.' + settings.pagingContainer).show();
			return true;
		};

		function appendClearDiv(elem){
			$('<div\>').attr('class','clear_div').html('&nbsp;').appendTo(elem);
			return true;
		};
		
		/*internal function to grab JSON*/
		function internalGrabData(data_url){
			$.ajax({
				url: data_url,
				dataType: 'jsonp',
				data: settings.conditions,
				success: function(data, textStatus, XMLHttpRequest) {},
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					alert(textStatus);
				}
			});
		};
		
		function handleError(){
			$('#' + settings.eventsContainer).fadeOut('fast', function(){
				setCurrentMonth();
				$('#' + settings.eventsContainer).children().remove();
				$('<p/>').html('<strong>Sorry, no events were found.</strong>').appendTo('#' + settings.eventsContainer);
				$('#' + settings.eventsContainer).fadeIn('slow');
			});
		};
		
		// private function for debugging
		function debug($obj) {
			if (window.console && window.console.log) {
				window.console.log($obj);
			}
		}

		return this;

	};

})(jQuery);
