﻿// jQuery Month Calendar Plugin 1.0 Copyright 2009 Jarrett Vance http://jvance.com/pages/jQueryMonthCalPlugin.xhtml
(function ($) {
$.fn.calendar = function (options) {
var opts = $.extend({}, $.fn.calendar.defaults, options);
return this.each(function () {
var $this = $(this);
$this.find('td')
.hover(function () { $(this).addClass('hover') }, function () { $(this).removeClass('hover') })
.click(function () { return changeDay($this, $(this), new Date($(this).find('a').attr('id')), opts); });
$this.find('a[rel=prev], a[rel=next]').click(function () {
changeMonth($this, opts, ($(this).attr('rel') == 'next'));
return false;
});
refreshCal($this, opts , 0);
});
}
function changeMonth($cal, opts, next) {
if (next && opts.month == 11) {
opts.year = opts.year + 1;
opts.month = 0;
} else if (!next && opts.month == 0) {
opts.year = opts.year - 1;
opts.month = 11;
} else {
opts.month = next ? opts.month + 1 : opts.month - 1;
}
refreshCal($cal, opts , 0);
}
function changeDay($cal, $cell, date, opts) {
opts.select = date;
opts.year = date.getFullYear();
opts.month = date.getMonth();
if(opts.available[date.getDate()][(date.getMonth()+1)][date.getFullYear()] > 0 || opts.available[date.getDate()][(date.getMonth()+1)][date.getFullYear()] == -2 || opts.available[date.getDate()][(date.getMonth()+1)][date.getFullYear()] == -3)
{
days = date.getDate();
if(days < 10)
days = "0"+days;
if(opts.action=='from')
$("#datefromavail").val(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+days);
else
$("#datetoavail").val(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+days);
refreshCal($cal, opts , 1);
}
return opts.dateChanged(date);
};
function refreshCal($cal, opts , change) {
if(change==0)
{
var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var sDate=0;
$cal.find('.month').text(monthNames[opts.month] + ' ' + opts.year);
$cal.find('td').removeClass('out').removeClass('today').removeClass('current').removeClass('onrequest');
var days = getDaysInMonthForDate(opts.year, opts.month, opts.current);
var tds = $cal.find('td');
for (j = 0; j < 42; j++)
{
var dAvail =  days[j].date.getDate();
var mAvail =  days[j].date.getMonth()+1;
var yAvail =  days[j].date.getFullYear();
$(tds[j]).find('a').text(days[j].date.getDate())
.attr('id', days[j].date.toDateString())
;
if (days[j].out) $(tds[j]).addClass('out');
if (days[j].current)
{
$("#selectdate"+opts.opt).val(days[j].date.getFullYear()+"-"+(days[j].date.getMonth()+1)+"-"+days[j].date.getDate());
$("#datebooking").val(days[j].date.getFullYear()+"-"+(days[j].date.getMonth()+1)+"-"+days[j].date.getDate());
sDate++;
}
if(!days[j].out)
{
if(opts.available[dAvail][mAvail][yAvail] == -2 || opts.available[dAvail][mAvail][yAvail]>0 || opts.available[dAvail][mAvail][yAvail] == -3)
$(tds[j]).addClass('current');
else
$(tds[j]).removeClass('onrequest');
if(opts.available[dAvail][mAvail][yAvail] > 0)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available for "+opts.available[dAvail][mAvail][yAvail]+"");
$(tds[j]).removeClass('onrequest');
}
if(opts.available[dAvail][mAvail][yAvail] == -2)
{
$(tds[j]).removeClass('onrequest');
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available on free sell.");
}
if(opts.available[dAvail][mAvail][yAvail] == -3)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available on request.");
$(tds[j]).addClass('onrequest');
}
if(opts.available[dAvail][mAvail][yAvail] == -1)
{
$(tds[j]).removeClass('onrequest');
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Not available.");
}
}
if (days[j].today) $(tds[j]).addClass('today');
if(days[j].date.getFullYear()+"-"+(days[j].date.getMonth()+1)+"-"+days[j].date.getDate() == opts.selectday)
{
$(tds[j]).removeClass('onrequest');
$(tds[j]).addClass('select');
$("#datebooking").val(opts.selectday);
}
}
}
else
{
var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var sDate=0;
$cal.find('.month').text(monthNames[opts.month] + ' ' + opts.year);
$cal.find('td').removeClass('out').removeClass('today').removeClass('current');
var days = getDaysInMonthForDate(opts.year, opts.month, opts.select);
var tds = $cal.find('td');
for (j = 0; j < 42; j++) {
var dAvail =  days[j].date.getDate();
var mAvail =  days[j].date.getMonth()+1;
var yAvail =  days[j].date.getFullYear();
$(tds[j]).find('a').text(days[j].date.getDate())
.attr('id', days[j].date.toDateString())
;
if (days[j].out) $(tds[j]).addClass('out');
if (days[j].select)$(tds[j]).addClass('select');else $(tds[j]).removeClass('select');
if (days[j].today)
{
$(tds[j]).addClass('today');
sDate++;
}
if (days[j].current)
{
if(opts.available[dAvail][mAvail][yAvail] > 0 || opts.available[dAvail][mAvail][yAvail] == -2 || opts.available[dAvail][mAvail][yAvail] == -3)
{
$(tds[j]).addClass('select');
$("#selectdate"+opts.opt).val(days[j].date.getFullYear()+"-"+(days[j].date.getMonth()+1)+"-"+days[j].date.getDate());
$("#optval").val(opts.opt);
}
}
if(!days[j].out)
{
if(opts.available[dAvail][mAvail][yAvail]>0 || opts.available[dAvail][mAvail][yAvail] == -2 || opts.available[dAvail][mAvail][yAvail] == -3)
$(tds[j]).addClass('current');
else
$(tds[j]).removeClass('onrequest');
if(days[j].current)
{
$(tds[j]).removeClass('current');
}
if(opts.available[dAvail][mAvail][yAvail] > 0)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available for "+opts.available[dAvail][mAvail][yAvail]+"");
}
if(opts.available[dAvail][mAvail][yAvail] == -2)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available on free sell.");
}
if(opts.available[dAvail][mAvail][yAvail] == -3)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Available on request.");
}
if(opts.available[dAvail][mAvail][yAvail] == -1)
{
$(tds[j]).find('a').text(days[j].date.getDate()).attr('title', "Not available.");
}
}
}
}
}
function getUrl(date, opts) {
var url = opts.templateUrl;
url = url.replace(opts.templateYear, date.getFullYear());
url = url.replace(opts.templateMonth, ((date.getMonth() + 1) < 10 ? "0" : "") + (date.getMonth() + 1));
url = url.replace(opts.templateDay, (date.getDate() < 10 ? "0" : "") + date.getDate());
return url;
}
function getDaysInMonthForDate(year, month, current) {
var today = new Date();
var first = new Date(year, month, 1);
first.setDate(first.getDate()+1 - first.getDay());
if(first.getDate()==2)
{
first.setDate(first.getDate() - first.getDay()-6);
}
var days = new Array(42);
for (j = 0; j < 42; j++) {
var d = new Date(first);
d.setDate(first.getDate() + j);
days[j] = {
date: d,
out: !(d.getFullYear() == year && d.getMonth() == month),
today: d.getFullYear() == today.getFullYear() && d.getMonth() == today.getMonth() && d.getDate() == today.getDate(),
current: d.getFullYear() == current.getFullYear() && d.getMonth() == current.getMonth() && d.getDate() == current.getDate()
}
}
return days;
};
$.fn.calendar.defaults = {
current: new Date(),
year: new Date().getFullYear(),
month: new Date().getMonth(),
templateYear: 'year',
templateMonth: 'month',
templateDay: 'day',
templateUrl: '/year/month/day',
dateChanged: function (date) { return true; }
};
})(jQuery);
