(function($) {
	$.fn.kimptonEvents = function(options){ 

		var defaults = {
			path : '', /*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.*/
			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*/
		};
		
		/*Merge the default and optios, then set to settings*/
		settings = $.extend({}, defaults, options);
		
		/*loop through each tag sent.  Comma seperate to attach to multiple objects*/
		this.each(function(){
			/*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;
		};
		
		this.handleData = function(data){
			/*prepare the are for the data*/
			prepareHTMLArea();
			/*create the month navigation*/
			createMonthNavi();
			this.each(function(){
				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.Event){
					/*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);
				}
			});
			
			return this;
		};
		
		this.handleError = function(data){
			/*prepare the are for the data*/
			prepareHTMLArea();
			/*create the month navigation*/
			createMonthNavi();
			this.each(function() {
				$('#' + 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');
				});
			});
			
			return this;
		};
		
		function prepareHTMLArea(){
			/*Remove all the children*/
			$('#' + settings.monthNavContainer).children().remove();
			$('#' + settings.eventsContainer).children().remove();
			return true;
		};
		
		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);
				}
			});
		};
		
		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("","Januaray", "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;
		};

		/*To keep chainability,  return the jQuery Object*/
		return this;
	};

})(jQuery);