(function(jQuery) {
	jQuery.fn.meldcal = function(settings) {

		settings = jQuery.extend({
			displayID: '',
			url: '',
			month: 1,
			year: 2010,
			day: 1,
			daysInMonth: 31,
			startDay: 1,
			currentMonth: 0,
			currentYear: 0,
			currentDay: 0,
			selectedDay: 0,
			name: 'meldcal',
			reload: false
		}, settings);

		var _oData					= {};
		var _oCalData				= {};
		_oCalData.aMonthNames		= [ "January","February","March","April","May","June","July","August","September","October","November","December" ];
		_oCalData.aDayNames			= [ "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" ];
		_oCalData.aDayNamesShort	= [ "Sun","Mon","Tue","Wed","Thu","Fri","Sat" ];

		$useMonth = {
			events: settings.events,
			month: settings.sMonth,
			year: settings.sYear,
			day: settings.sDay,
			daysInMonth: settings.daysInMonth,
			startDay: settings.startDay
		};
		
		var $isActive		= false;
		var $isHidden		= true;
		var $isUI			= false;
		
		var $calendar		= this;

		var $thead			= $calendar.children('thead');
		var $tbody			= $calendar.children('tbody');
		var $tfoot			= $calendar.children('tfoot');
		var $tr				= $("<tr></tr>");

		var $trNav			= $("<tr class='mc-nav' id='"+settings.name+"_nav'></tr>");
		var $trDay			= $("<tr class='mc-day' id='"+settings.name+"_day'></tr>");

		var $navBack		= $("<th class='mc-lnav' id='"+settings.name+"_back'>&laquo;</th>");
		var $navNext		= $("<th class='mc-rnav' id='"+settings.name+"_next'>&raquo;</th>");
		var $navMonth		= $("<th class='mc-nav month' colspan=5 id='"+settings.name+"_month'></th>");

		var i				= 0;
		var $nDay			= 0;
		
		$calendar.keyup(function() {
		});
		
		function _drawUI() {
			for(var i=0;i<=6;i++) {
				$th = $("<th></th>");

				$th.html( _oCalData.aDayNamesShort[i] );
				$trDay.append($th);
			}
			$trNav.append($navBack);
			$trNav.append($navMonth);
			$trNav.append($navNext);

			$thead.append( $trNav );
			$thead.append( $trDay );
			_setNav();
			$isUI = true;
		}

		function _drawNextMonth(){
			var $nMonth = $useMonth.month;
			var $nYear = $useMonth.year;
			settings.selectedDay = 0;
			
			if ($nMonth == 12) {
				$nMonth = 1;
				$nYear++;
			}
			else {
				$nMonth++;
			}
		
			if (fnMonthExists($nMonth, $nYear)) {
				_drawMonth($nMonth, $nYear);
			}
			else {
				fnGetRemoteData($nMonth, $nYear);
			}
		}

		function _drawPreviousMonth(){
			var $nMonth = $useMonth.month;
			var $nYear = $useMonth.year;
			settings.selectedDay = 0;
			
			if ($nMonth == 1) {
				$nMonth = 12;
				$nYear--;
			}
			else {
				$nMonth--;
			}
		
			if (fnMonthExists($nMonth, $nYear)) {
				_drawMonth($nMonth, $nYear);
			}
			else {
				fnGetRemoteData($nMonth, $nYear);
			}
		}
		
		function _drawMonth(month,year) {
			if(!$isUI) {
				_drawUI();
			}
			$useMonth			= fnGetMonth(month,year);

			var $nDay			= $useMonth.day;
			var $nMonth			= $useMonth.month;
			var $nYear			= $useMonth.year;

			var $preCurrent		= settings.currentYear == $nYear && settings.currentMonth == $nMonth;

			var $nStartDay		= $useMonth.startDay;
			var $nLastDay		= $useMonth.daysInMonth;
			var $nDay			= 0;
			var $nWeek			= 0;
			var $dayData		= {};

			$navMonth.html( _oCalData.aMonthNames[$nMonth-1] + ", " + $nYear  );
			
//			$tfoot.find("tr").remove();
//			$footer = $("<tr></tr>");
//			$footMsg = $("<td colspan=7>" + ":" + $useMonth.processing + "</td>");
//			$footer.append($footMsg);
//			$tfoot.append($footer);
			
			// remove current month
			$tbody.find("tr").remove();

			// new row
			$tr = $("<tr class='"+settings.name+"_week"+$nWeek+"'></tr>\n");


			for(var i=1;i<=42;i++) {
				$nDay = i - $nStartDay;
				$dayData = {};
				
				$td = $("<td></td>\n");
				// add base data to the element
				$td.data('date',{day: $nDay,month: $nMonth,year: $nYear});

				if (i > $nStartDay && i <= $nLastDay+$nStartDay) {
					$td.addClass('box');
					$td.html("<div class='mc-date'>" + $nDay + "</div>\n");
					if($useMonth.events[$nDay]) {
						$td.addClass('mc-event');
//						$td.append($("<div class='mc-count'>"+$useMonth.events[$nDay].count+"</div>\n"));
//						$td.append($("<div class='mc-label'>events</div>\n"));
						$td.click(_goTo);
					}
					if($preCurrent && $nDay == settings.currentDay) {
						$td.addClass('mc-today');
					}
					if($nDay == settings.selectedDay) {
						$td.addClass('mc-selected');
					}
				}
				// add cell
				$tr.append($td);
				// add current row, start new row
				if(i > 2 && i % 7 == 0) {
					$tbody.append( $tr );
					$tr = $("<tr></tr>\n");
				}
			}
			// append on last row
			$tbody.append( $tr );
		}

		function _setNav() {
			$(".mc-lnav",	$trNav).click( function() {
				_drawPreviousMonth();
			});
			$(".mc-rnav",	$trNav).click( function() {
				_drawNextMonth();
			});
		}

		function _goTo() {
			var $this = $(this);
			var mData = fnGetMonth($this.data('date').month,$this.data('date').year);		
			var sURL = settings.url + "?y="+$this.data('date').year+"&m="+$this.data('date').month+"&d="+$this.data('date').day;
			window.location.href = sURL;
		}

		function _showData() {
			var $this = $(this);
			var mData = fnGetMonth($this.data('date').month,$this.data('date').year);
			alert( mData.events[$this.data('date').day].html() );
		}

		// Day template
		function fnDay(data) {
			var $day = $("<div class='vevent'></div>");
//			var sDay = "<h4>" + data.title + "</h4>\n";
//			sDay += "<p class='summary'>" + data.summary + "</p>";
//			sDay += "<p class='more'><a href='" + data.url + "'>" + data.more + "</a></p>";
//			$day.html(sDay);
			$day.data('list',data.list);
			$day.data('count',data.count);
			return $day;
		}

		// month data
		function fnSetMonth(settings) {
			var sMonthID = settings.month + "_" + settings.year;
			var sMonth	= {};

			if(settings.events)
				sMonth.events		= settings.events;
			else
				sMonth.events		= {};

			sMonth.processing	= settings.processing;
			sMonth.month		= settings.month;
			sMonth.year			= settings.year;
			sMonth.day			= settings.day;
			sMonth.daysInMonth	= settings.daysInMonth;
			sMonth.startDay		= settings.startDay;
						
			_oData[sMonthID]	 = sMonth;
			_drawMonth(settings.month, settings.year);
		}
		function fnGetMonth(month,year) {
			var sMonthID = month + "_" + year;
			if(!fnMonthExists(month,year))
				return [];
			
			return _oData[sMonthID];
		}
		function fnMonthExists(month,year) {
			var sMonthID = month + "_" + year;
			return( typeof( _oData[sMonthID] ) != "undefined" );
		}

		function fnGetRemoteData(month,year) {
			$isActive = true;
			if($isHidden)
				$calendar.addClass('mc-hidden');


			$.getJSON('/plugins/MeldEvents_5/lib/com/meldsolutions/meldevents/remote/RemoteMeldEvents.cfc',
				{
					method: 'getCalendarEvents',
					month: month,
					year: year,
					displayID: settings.displayID,
					returnFormat: "json"
				}
				,
				function( response ){
					if($isHidden) {
						$calendar.removeClass('mc-hidden');
						$isHidden = false;
					}
					// Check to see if the request was successful.
					if (response.success){
						$isActive = false;
						fnSetMonth(response);
					} else {
						alert("blurg");
						$isActive = false;
					}
				}
			);		
		}


/*
		var tDay = fnDay( {title: "my happy event",url: "http://www.clevertechnology.com",more: "more &raquo;",count: 47} );
		var yDay = fnDay( {title: "my happy event",url: "http://www.clevertechnology.com",more: "more &raquo;",count: 132} );
		var tEvent = {};
		tEvent[6] = tDay;
		tEvent[17] = yDay;
		var yEvent = {};
		yEvent[14] = tDay;

		fnSetMonth( {
			events: tEvent,
			month: 2,
			year: 2010,
			day: 7,
			daysinmonth: 30,
			startday: 6			
		} );
		fnSetMonth( {
			events: yEvent,
			month: 3,
			year: 2010,
			day: 2,
			daysinmonth: 31,
			startday: 2			
		} );
*/
		if( settings.reload )
			fnGetRemoteData( settings.month,settings.year );
		else
			fnSetMonth( settings );
	};

})(jQuery);

