﻿// Fusion Javascript Library 
// (c) Webfuel

if (typeof (Fsn) == 'undefined') Fsn = {};

Fsn.Date = function(settings, my) {
	my = my || {};
	settings = settings || {};
	var IDate = Fsn.Control(settings, my);

	$.extend(my, {
		selectedDate: new Date(settings.selectedDate),
		showIcons: settings.showIcons !== false,
		hideEmptyRows: settings.hideEmptyRows !== false
	});
	if (isNaN(my.selectedDate))
		my.selectedDate = new Date();
	$.extend(my, {
		year: (settings.year === undefined) ? my.selectedDate.getFullYear() : settings.year,
		month: (settings.month === undefined) ? my.selectedDate.getMonth() : settings.month
	});

	my.addGetters("");
	my.addSetters("month;year");
	my.addEvents("refreshedDate;clickDate;dblclickDate;");

	var dateAt = function(row, col, firstDayOfMonth, daysInMonth) {
		var date = row * 7 + col - firstDayOfMonth;
		if (date < 0 || date >= daysInMonth)
			return -1
		return date;
	};

	var populate = function(firstDayOfMonth, daysInMonth) {
		var last = firstDayOfMonth + daysInMonth, date = 1;
		var $tds = $(".rN td", my.element);
		var i = 0, $tdsi;
		for (; i < firstDayOfMonth; i++) {
			$tdsi = $tds[i]
			$tdsi.className = 'ety';
			$tdsi.innerHTML = "&nbsp;";
		}
		for (; i < last; i++) {
			$tdsi = $tds[i]
			$tdsi.className = 'pop';
			$tdsi.innerHTML = date;
			IDate.raiseEvent('refreshedDate', { 'date': new Date(my.year, my.month, date), 'element': $($tdsi) });
			date++;
		}
		for (; i < 42; i++) {
			$tdsi = $tds[i]
			$tdsi.className = 'ety';
			$tdsi.innerHTML = "&nbsp;";
		}
		$(".r4", my.element)[(daysInMonth + firstDayOfMonth <= 28) && (my.hideEmptyRows) ? 'hide' : 'show']();
		$(".r5", my.element)[(daysInMonth + firstDayOfMonth <= 35) && (my.hideEmptyRows) ? 'hide' : 'show']();
	};

	var dayClick = function(row, col) {
		var firstDayOfMonth = IDate.firstDayOfMonth(my.month, my.year);
		var daysInMonth = IDate.daysInMonth(my.month, my.year);
		var date = dateAt(row, col, firstDayOfMonth, daysInMonth);
		if (date == -1) return;
		return IDate.raiseEvent('clickDate', { 'date': new Date(my.year, my.month, date + 1) });
	};

	var dayDblClick = function(row, col) {
		var firstDayOfMonth = IDate.firstDayOfMonth(my.month, my.year);
		var daysInMonth = IDate.daysInMonth(my.month, my.year);
		var date = dateAt(row, col, firstDayOfMonth, daysInMonth);
		if (date == -1) return;
		return IDate.raiseEvent('dblclickDate', { 'date': new Date(my.year, my.month, date + 1) });
	};

	$.extend(IDate, {
		refresh: function() {
			var firstDayOfMonth = IDate.firstDayOfMonth(my.month, my.year);
			var daysInMonth = IDate.daysInMonth(my.month, my.year);
			populate(firstDayOfMonth, daysInMonth);
			$(".rH .c2", my.element).html($.formatDate(new Date(my.year, my.month, 1), "M yy"));
			return IDate;

		},
		firstDayOfMonth: function(month, year) {
			var firstDate = new Date(year, month, 1);
			return firstDate.getDay();
		},
		daysInMonth: function(month, year) {
			var nextMonth = new Date(year, month + 1, 1);
			nextMonth.setHours(nextMonth.getHours() - 3);
			return nextMonth.getDate();
		}
	});

	// Build the skeleton of the date control
	my.element.addClass("fui-date");
	my.$table = $("<table></table>").appendTo(my.element);
	if (my.showIcons)
		my.$header = $("<tr class='rH'><td class='c0'><span class='ui-icon ui-icon-triangle-1-w' title='Prior month'></span></td><td class='c1'><span class='ui-icon ui-icon-triangle-1-n' title='Prior year'></span></td><td colspan='3' class='c2'>Header</td><td class='c3'><span class='ui-icon ui-icon-triangle-1-s' title='Next year'></span></td><td class='c4'><span class='ui-icon ui-icon-triangle-1-e' title='Next month'></span></td></tr>").appendTo(my.$table);
	else
		my.$header = $("<tr class='rH'><td></td><td></td><td colspan='3' class='c2'>Header</td><td></td><td></td></tr>").appendTo(my.$table);
	my.$daysofweek = $("<tr class='rD'><td>Su</td><td>Mo</td><td>Tu</td><td>We</td><td>Th</td><td>Fr</td><td>Sa</td></tr>").appendTo(my.$table);
	for (var r = 0; r < 6; r++) {
		var $row = $("<tr class='rN r" + r + "'></tr>").appendTo(my.$table);
		for (var c = 0; c < 7; c++) {
			var $day = $("<td></td>").appendTo($row).click($.delegate(dayClick, this, [r, c])).dblclick($.delegate(dayDblClick, this, [r, c]));
		}
	}

	// Bind to the date change commands
	$(".rH td.c0", my.element).click(function() {
		if (my.month == 0) { my.year--; my.month = 11; } else { my.month--; }
		IDate.refresh();
	});
	$(".rH td.c4", my.element).click(function() {
		if (my.month == 11) { my.year++; my.month = 0; } else { my.month++; }
		IDate.refresh();
	});
	$(".rH td.c1", my.element).click(function() {
		my.year--;
		IDate.refresh();
	});
	$(".rH td.c3", my.element).click(function() {
		my.year++;
		IDate.refresh();
	});
	return IDate;
};
