/**
 * jCalendar 0.5
 *
 * Some code based on jQuery Date Picker (http://kelvinluck.com/assets/jquery/datePicker/)
 *
 * Copyright (c) 2007 Theodore Serbinski (http://tedserbinski.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */



jQuery.jcalendar = function(e) {
  var events  = e;
	var langTable = {
		pl : {
			months : ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
			days : ['Nd', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So'],
			navLinks : {p:'Poprzedni', n:'Następny', t:'Dziś'}
		},
		en : {
			months : ['January', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
			days : ['Sd', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'St'],
			navLinks : {p:'Previous', n:'Next', t:'Today'}
		}
	};

	var months;
	var days;
	var navLinks;
	var _firstDayOfWeek;
	var _firstDate;
	var _lastDate;
	var _selectedDate;
	var url;

	var _drawCalendar = function(dateIn, a, day, month, year) {

		var today = new Date();
		var d;

		if (dateIn == 'undefined') {
			// start from this month.
			d = new Date(today.getFullYear(), today.getMonth(), today.getDay());
			year.val(today.getFullYear());
			month.val(today.getMonth()+1);
			day.val(today.getDate());
		} else {
			// start from the passed in date
			d = dateIn;
	//		year.val(d.getFullYear());
	//		month.val(d.getMonth()+1);
	//		day.val(d.getDate());
			d.setDate(1);
		}

		// check that date is within allowed limits
		if ((d.getMonth() < _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear()) || d.getFullYear() < _firstDate.getFullYear()) {
			d = new Date(_firstDate.getFullYear(), _firstDate.getMonth(), 1);
		} else if ((d.getMonth() > _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear()) || d.getFullYear() > _lastDate.getFullYear()) {
			d = new Date(_lastDate.getFullYear(), _lastDate.getMonth(), 1);
		}

		var firstMonth = true;
		var firstDate = _firstDate.getDate();

		// create prev and next links
		if (!(d.getMonth() == _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear())) {
			// not in first display month so show a previous link
			firstMonth = false;
			var lastMonth = d.getMonth() == 0 ? new Date(d.getFullYear()-1, 11, 1) : new Date(d.getFullYear(), d.getMonth()-1, 1);
			var prevLink = jQuery('<a href="" class="link-prev">&lsaquo; '+ navLinks.p +'</a>').click(function() {
				jQuery.jcalendar.changeMonth(lastMonth, this, day, month, year);
				return false;
			});
		}

		var finalMonth = true;
		var lastDate = _lastDate.getDate();

		if (!(d.getMonth() == _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear())) {
			// in the last month - no next link
			finalMonth = false;
			var nextMonth = new Date(d.getFullYear(), d.getMonth()+1, 1);
			var nextLink = jQuery('<a href="" class="link-next">'+ navLinks.n +' &rsaquo;</a>').click(function() {
				jQuery.jcalendar.changeMonth(nextMonth, this, day, month, year);
				return false;
			});
		}

		var todayLink = jQuery('<a href="" class="link-today">'+ navLinks.t +'</a>').click(function() {
			day.val(today.getDate());
			jQuery.jcalendar.changeMonth(today, this, day, month, year);
			return false;
		});

    // update the year and month select boxes
		year.val(d.getFullYear());
		month.val(d.getMonth()+1);

		var headRow = jQuery("<tr></tr>");
		for (var i=_firstDayOfWeek; i<_firstDayOfWeek+7; i++) {
			var weekday = i%7;
			var wordday = days[weekday];
			headRow.append('<th scope="col" abbr="'+ wordday +'" title="'+ wordday +'" class="'+ (weekday == 0 || weekday == 6 ? 'weekend' : 'weekday') +'">'+ wordday +'</th>');
		}
		headRow = jQuery("<thead></thead>").append(headRow);

		var tBody = jQuery("<tbody></tbody>");
		var lastDay = (new Date(d.getFullYear(), d.getMonth()+1, 0)).getDate();
		var curDay = _firstDayOfWeek - d.getDay();
		if (curDay > 0) curDay -= 7;

		var todayDate = today.getDate();
		var thisMonth = d.getMonth() == today.getMonth() && d.getFullYear() == today.getFullYear();

    // render calendar
		do {
			var thisRow = jQuery("<tr></tr>");
			for (var i=0; i<7; i++) {
				var weekday = (_firstDayOfWeek + i) % 7;
				var atts = {'class':(weekday == 0 || weekday == 6 ? 'weekend ' : 'weekday ')};
	
				if (curDay < 0 || curDay >= lastDay) {
					dayStr = ' ';
				}
	/*
				else if (firstMonth && curDay < firstDate-1) {
					dayStr = curDay+1;
					atts['class'] += 'inactive';
				}
				else if (finalMonth && curDay > lastDate-1) {
					dayStr = curDay+1;
					atts['class'] += 'inactive';
				}
	*/  
				else {
					d.setDate(curDay+1);
	
					dayStr = jQuery('<a href="" rel="'+ d +'">'+ (curDay+1) +'</a>').click(
						function(e) {

							if( _selectedDate ) {
								_selectedDate.removeClass('selected');
							}
		
							_selectedDate = jQuery(this);
							_selectedDate.addClass('selected');
		
							day.val(new Date(_selectedDate.attr('rel')).getDate());
							updateDate(year[0].value, month[0].value, day[0].value);
		
							return false;
						}
					);  				
			
					// highlight the current selected day
					if (day.val() == d.getDate()) {
						_selectedDate = dayStr;
						// _selectedDate.removeClass();
						_selectedDate.addClass('selected');
					}
				}
						
				if( events[d.getFullYear()] != undefined ) {
					if( events[d.getFullYear()][d.getMonth()+1] != undefined ) {
						if( events[d.getFullYear()][d.getMonth()+1][curDay+1] != undefined ) {
							atts['class'] = 'withEvent';
						}
					}
				}
				
				if (thisMonth && curDay+1 == todayDate) {
					atts['class'] += ' today';
				}
				thisRow.append(jQuery("<td></td>").attr(atts).append(dayStr));
				curDay++;
			}

			tBody.append(thisRow);
		} while (curDay < lastDay);

		jQuery('div.jcalendar').html('<table cellspacing="1"></table><div class="jcalendar-links"></div>');
		jQuery('div.jcalendar table').append(headRow, tBody);
		jQuery('div.jcalendar > div.jcalendar-links').append(prevLink, todayLink, nextLink);
	};

	function updateDate(year, month, day) {
	
		$('.event').remove();
		
		if( events[year] == undefined || events[year][month] == undefined || events[year][month][day] == undefined ) {
			return;
		}
		
		var newDiv = null;
		var container = document.getElementById('events');
/*
		<div class="event">
		<div class="cal_date" style="border:1px solid red; text-align:center;">{$event.date|date_format:"%A"}<br />
		<span class="cal_date shortDate">{$event.date|date_format:"%m-%d"}</span></div>
		
		<div style="clear:both;">
			{$event.content}<br />
		</div>
		<div class="hr" style="margin-top:10px; margin-bottom:10px; width:200px;"></div>
		
		</div>
*/
		
		newDiv    = document.createElement("div");
		newDiv.className  = 'event';
		var event = null;
		
		for(var i = 0; i < events[year][month][day].length; i++ ) {
		
			if( i == 0) {
			newDiv.innerHTML  = '<div class="cal_date" style="text-align:center;">'+events[year][month][day][i].weekday+'<br /><span class="cal_date shortDate">'+events[year][month][day][i].shortDate+'</span></div>';        
			}
		
			event   = document.createElement('div');
			event.style.clear = "both";
//   event.style.margin-top  = '10px';
//   event.style.margin-bottom = '10px';
			event.innerHTML = '<br />'+events[year][month][day][i].content+'<br />';
			newDiv.appendChild(event);
			
			var hr  = document.createElement('div');
			hr.className = 'hr';
			newDiv.appendChild(hr);
//     event.style.margin-top  = '10px';
//     event.style.margin-bottom = '10px';       
		
		}
		container.appendChild(newDiv);
	};
  

	function response(response) {
/*
		$('.event').remove();
		var div = null;
		var container = document.getElementById('events');
		for(i = 0; i < response.length; i++ ) {
			newDiv    = document.createElement("div");
			newDiv.className  = 'event';
			newDiv.innerHTML  = '<div>'+response[i].date+'</div><div style="background-color: gray;"><div>'+response[i].date+'<br /></div><div>'+response[i].content+'<br /></div></div>';
			container.appendChild(newDiv);
		}
		//  alert(response +'\n\n<br />'+response[0].calendarId + ' - ' + response[1].calendarId);
*/
	};

	return {
		show: function(a, day, month, year) {
 			_firstDate = a._startDate;
			_lastDate = a._endDate;
			_firstDayOfWeek = a._firstDayOfWeek;
			
			// pass in the selected form date if one was set
			var selected;
			if (year.val() > 0 && month.val() > 0 && day.val() > 0) {
				selected = new Date(year.val(), month.val()-1, day.val());
			} else {
				selected = null;
			}

			events = a._events;
      
			_drawCalendar(selected, a, day, month, year);
			updateDate(year[0].value, month[0].value, day[0].value);
		},
		
		updateEvents: function (feedback) {
		
			for(i = 0; i < feedback.length; i++ ) {  
				if( events[feedback[i].year][feedback[i].month][feedback[i].day] == undefined) {
					events[feedback[i].year][feedback[i].month][feedback[i].day]  = [];   
				}
				
				events[feedback[i].year][feedback[i].month][feedback[i].day].push({content: feedback[i].content, date: feedback[i].date, shortDate: feedback[i].shortDate, weekday: feedback[i].weekday});
			}
		},

		changeMonth: function(d, e, day, month, year, a) {
			
			var load  = false;
			var _y,_m,_d;
			
			if (d != 'undefined') {
				// start from this month.  
				_y = d.getFullYear();
				_m = d.getMonth()+1;
				_d = d.getDate();
			} else {
				_y = year[0].value;
				_m = month[0].value;
				_d = day[0].value;           
			}
			
			if (events[_y] == undefined) {
				events[_y] = {};
				load = true;
			}
			
			if (events[_y] [_m] == undefined) {
				events[_y][_m] = {};
				load = true;
			}
			
			if (load) {
				$.get(jQuery.jcalendar.url, {"year" : _y, "month" : _m}, function(f) { jQuery.jcalendar.updateEvents(f); updateDate(_y, _m, _d); _drawCalendar(d, e, day, month, year);}, 'json');
			} else {
				_drawCalendar(d, e, day, month, year);  	
				updateDate(_y, _m, _d);		
			}
						
		},

		/**
		* Function: setLanguageStrings
		*
		* Allows you to localise the calendar by passing in relevant text for the english strings in the plugin.
		*
		* Arguments:
		* days		-	Array, e.g. ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
		* months	-	Array, e.g. ['January', 'Febuary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
		* navLinks	-	Object, e.g. {p:'Prev', n:'Next', c:'Close', b:'Choose date'}
		**/
		setLanguageStrings: function(lang) {
			days = langTable[lang].days;
			months = langTable[lang].months;
			navLinks = langTable[lang].navLinks;
		},

		/**
		* Function: setDateWindow
		*
		* Used internally to set the start and end dates for a given date select
		*
		* Arguments:
		* i			-	The id of the INPUT element this date window is for
		* w			-	The date window - an object containing startDate and endDate properties
		*				e.g. {startDate:'24-11-1981', endDate:'25-12-2012}
		**/
		setEvents: function(i, e, u) {
			i._events = e;
			i._url = u;
		},

		setDateWindow: function(i, w, year) {
			if (w == undefined) w = {};
			if (w.startDate == undefined) {
				// set the minimum browseable date equal to January of the min year in the select box
				// don't get the first option because that is an empty year

				// note we can't do this: year.find('option:eq(1)').val()
				// it doesn't work in 1.0 since find() is destructive
				// so we copy the object to a new var
				i._startDate = new Date($(year).find('option:eq(0)').val(), 0, 1);
			}
			else {
  			dateParts = w.startDate.split('-');
  			i._startDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
			}
			if (w.endDate == undefined) {
			  // set the maximum browseable date equal to December of the max year in the select box

			  // note we can't do this: year.find('option:last').val()
				// it doesn't work in 1.0 since find() is destructive
				// so we copy the object to a new var
				i._endDate = new Date($(year).find('option:last').val(), 11, 1);
			}
			else {
  			dateParts = w.endDate.split('-');
  			i._endDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
			}
			i._firstDayOfWeek = w.firstDayOfWeek == undefined ? 1 : w.firstDayOfWeek;
		}
	};
}();

jQuery.fn.jcalendar = function(e, date, url, lang, a) {

	this.each(
		function() {
			var day = $(this).find('select.jcalendar-select-day');
			var month = $(this).find('select.jcalendar-select-month');
			var year = $(this).find('select.jcalendar-select-year');
	
			$('div.jcalendar-selects').after('<div class="jcalendar"></div>');
	
			jQuery.jcalendar.setEvents(this, e, url);
	
			jQuery.jcalendar.setDateWindow(this, a, year);

			if (lang) {
				jQuery.jcalendar.setLanguageStrings(lang);
			} else {
				jQuery.jcalendar.setLanguageStrings('pl');
			}

			
			jQuery.jcalendar.url = url;
			
			jQuery.jcalendar.show(this, day, month, year, date);
			
			var t = this;
			
			day.change(
				function() {
					// only if a valid day is selected
					if (this.value > 0) {
						d = new Date(year.val(), month.val()-1, this.value);
						jQuery.jcalendar.changeMonth(d, a, day, month, year, t);
					}
				}
			);
			
			month.change(
				function() {
					// only if a valid month is selected
					if (this.value > 0) {
						d = new Date(year.val(), this.value-1, 1);
						jQuery.jcalendar.changeMonth(d, a, day, month, year, t);
					}
				}
			);
			
			year.change(
				function() {
					// only if a valid year is selected
					if (this.value > 0) {
						d = new Date(this.value, month.val()-1, 1);
						jQuery.jcalendar.changeMonth(d, a, day, month, year, t);
					}
				}
			);
	
		}
	);
	return this;
};

