Last active
August 29, 2015 13:58
-
-
Save vicolachips44/9956693 to your computer and use it in GitHub Desktop.
A calendar to remind me that coffeescript might worth it!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CalendarUtils | |
##--------------------------------------------------------------------------- | |
@padNumber = (count, value) -> | |
svalue = value.toString() | |
spad = Array(count - svalue.length + 1).join '0' | |
# return the value | |
spad + svalue | |
##--------------------------------------------------------------------------- | |
@getNextMonth = (year, month) -> | |
if month > 10 | |
next_month = 0 | |
next_year = year + 1 | |
else | |
next_month = month + 1 | |
next_year = ny | |
return [next_year, next_month] | |
##--------------------------------------------------------------------------- | |
@getPreviousMonth = (year, month) -> | |
if month < 1 | |
prev_month = 11 | |
prev_year = year - 1 | |
else | |
prev_month = month - 1 | |
prev_year = year | |
return [prev_year, prev_month] | |
##--------------------------------------------------------------------------- | |
@dayInMonth = (year, month) -> | |
# month doit etre entre 0 et 11 | |
month = month + 1 | |
if month == 1 | |
m = 12 | |
y = year - 1 | |
else | |
m = month - 1 | |
y = year | |
Math.round(((new Date(year, month)) - (new Date(y, m)))/86400000) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Calendar | |
sp = ' ' | |
constructor: (@domRoot) -> | |
##--------------------------------------------------------------------------- | |
@settings = | |
weeknames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', | |
'Friday', 'Saturday'], | |
monthnames: ['January', 'February', 'March', 'April', 'May', 'June', | |
'July', 'August', 'September', 'October', 'November', 'December'], | |
calendar: null, | |
curMonth: -1, | |
curYear: -1 | |
##--------------------------------------------------------------------------- | |
@displayCalendar = (calendar_id) -> | |
calRenderer = new Calendar(calendar_id) | |
Calendar.settings.calendar = calRenderer | |
calRenderer.render(new Date()) | |
##--------------------------------------------------------------------------- | |
@displayPreviousMonth = () -> | |
nm = Calendar.settings.curMonth | |
ny = Calendar.settings.curYear | |
if nm < 1 | |
nmb = 11 | |
nyb = ny - 1 | |
else | |
nmb = nm - 1 | |
nyb = ny | |
Calendar.settings.calendar.render(new Date(nyb, nmb, 1)) | |
Calendar.settings.curMonth = nmb | |
Calendar.settings.curYear = nyb | |
##--------------------------------------------------------------------------- | |
@displayNextMonth = () -> | |
nm = Calendar.settings.curMonth | |
ny = Calendar.settings.curYear | |
if nm > 10 | |
nms = 0 | |
nys = ny + 1 | |
else | |
nms = nm + 1 | |
nys = ny | |
Calendar.settings.calendar.render(new Date(nys, nms, 1)) | |
Calendar.settings.curMonth = nms | |
Calendar.settings.curYear = nys | |
##--------------------------------------------------------------------------- | |
render: (in_date) -> | |
# empty the div container | |
this.domRoot.empty() | |
# array of year, month , day | |
dateinf = [in_date.getFullYear(), in_date.getMonth(), in_date.getDate()] | |
Calendar.settings.curYear = dateinf[0] | |
Calendar.settings.curMonth = dateinf[1] | |
# first day in month | |
fdm = new Date(dateinf[0], dateinf[1], 1) | |
# get previous month (year, month) | |
dateinfprev = CalendarUtils.getPreviousMonth(dateinf[1], dateinf[0]) | |
# number of days in month | |
days = calcDays(CalendarUtils.dayInMonth(dateinf[0], dateinf[1])) | |
# number of days to display for previous month | |
prevdays = getPrevMonthLastDays( | |
dateinfprev[0], dateinfprev[1], fdm.getDay() - 1 | |
) | |
flushTable(this.domRoot) | |
captionValue = Calendar.settings.monthnames[in_date.getMonth()] + | |
sp + dateinf[0].toString() | |
$('#dctCalendarTable').append( | |
'<caption valign="top">' + captionValue + '</caption>' | |
) | |
calBody = $('#dctCalendarBody') | |
calBody.append('<tr id="dctWeekDaysRow">') | |
calBody.append('</tr>') | |
$('#dctWeekDaysRow').append('<td class="dct-weekday-names">' + | |
dayname + '</td>') for dayname in Calendar.settings.weeknames | |
switchMe = 0 | |
rowNum = 1 | |
for prevday in prevdays | |
if (switchMe % 7) == 0 | |
flushRow(calBody, rowNum) | |
rowNum++ | |
cell = new CellObj(prevday, rowNum) | |
cell.render(false) | |
switchMe++ | |
for day in days | |
if (switchMe % 7) == 0 | |
flushRow(calBody, rowNum) | |
rowNum++ | |
cell = new CellObj(day, rowNum) | |
cell.render(true) | |
switchMe++ | |
nmonth = 0 | |
while true | |
nmonth++ | |
break unless (switchMe % 7) != 0 | |
cell = new CellObj(nmonth, rowNum) | |
cell.render(false) | |
switchMe++ | |
##--------------------------------------------------------------------------- | |
flushTable = (root) -> | |
root.append('<table id="dctCalendarTable"><tbody id="dctCalendarBody">') | |
root.append('</tbody></table>') | |
##--------------------------------------------------------------------------- | |
flushRow = (root, rowNum) -> | |
root.append('<tr id="row_' + rowNum.toString() + '">') | |
root.append('</tr>') | |
##--------------------------------------------------------------------------- | |
getPrevMonthLastDays = (nyb, nmb, dbf) -> | |
nbd = CalendarUtils.dayInMonth(nyb, nmb) | |
if dbf < 0 then return [] | |
days for days in [(nbd - dbf)..nbd] | |
##--------------------------------------------------------------------------- | |
calcDays = (nbd) -> | |
daynum for daynum in [1..nbd] | |
##***************************************************************************** | |
class CellObj | |
##--------------------------------------------------------------------------- | |
cellDate = null | |
##--------------------------------------------------------------------------- | |
constructor: (@dayNumber, @rowNumber) -> | |
this.cellDate = new Date( | |
Calendar.settings.curYear, Calendar.settings.curMonth, dayNumber | |
) | |
##--------------------------------------------------------------------------- | |
render: (bInMonth) -> | |
tdTarget = "dct_td_" + (this.rowNumber - 1) + "_" + this.dayNumber | |
tdSelector = '#' + tdTarget | |
trElement = "#dctCalendarBody tr:eq(" + (this.rowNumber - 1) + ")" | |
$(trElement).append('<td id="' + | |
tdTarget + '" class="dct-month-day"></td>') | |
$(tdSelector).append('<div class="dct-day-header">' + | |
this.dayNumber + '</div><div class="dct-day-content"></div>') | |
headerSelector = tdSelector + " .dct-day-header" | |
if bInMonth | |
$(tdSelector).addClass("dct-cell-color") | |
$(tdSelector).hover( | |
-> $(this).addClass("dct-hightcell"), | |
-> $(this).removeClass("dct-hightcell") | |
) | |
else | |
$(tdSelector).addClass("dct-cell-color-off") | |
$(tdSelector).hover( | |
-> $(this).addClass("dct-hightcell"), | |
-> $(this).removeClass("dct-hightcell") | |
) | |
$('.dct-day-header').hover( | |
-> $(this).css("background-color", "blue"), | |
-> $(this).css("background-color", "SaddleBrown") | |
) | |
_this = this | |
$(tdSelector).find('.dct-day-header').click () -> | |
console.log("cell " + _this.cellDate.toString() + " was clicked") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
body { padding: 0px; margin: 0px; background-color: white; } | |
.dct-container { display: block; clear: both; | |
text-align: center; padding: 10px; | |
} | |
#myCalendar caption { background-color: black; color: white; } | |
#myCalendar table { margin-left: auto; margin-right: auto; | |
text-align: center; border-collapse: collapse; border: 1px black solid | |
} | |
#myCalendar td { border: 1px black solid; padding: 2px; } | |
.dct-cell-color { background-color: black; font-weight: bolder; } | |
.dct-cell-color-off { background-color: gray; } | |
.dct-cell-color-off .dct-day-content { background-color: gray; } | |
.dct-hightcell { background-color: RoyalBlue; } | |
.dct-month-day { width: 200px; height: 64px; text-align: center } | |
.dct-weekday-names { text-align: center; font-weight: bold; | |
background-color: AntiqueWhite; color: Brown; | |
} | |
.dct-day-header { -webkit-user-select: none; -moz-user-select: none; | |
-ms-user-select: none; cursor: default; padding: 0px; | |
margin: 0px; background-color: SaddleBrown; color: WhiteSmoke; | |
} | |
.dct-day-content { display: block; height:100%; width:100%; | |
text-align: left; background-color: Lightgray; | |
} | |
.dct_black { background-color: black; color: white; } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Generated by CoffeeScript 1.7.1 | |
var Calendar, CellObj; | |
Calendar = (function() { | |
var calcDays, flushRow, flushTable, getPrevMonthLastDays, sp; | |
sp = ' '; | |
function Calendar(domRoot) { | |
this.domRoot = domRoot; | |
} | |
Calendar.settings = { | |
weeknames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], | |
monthnames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], | |
calendar: null, | |
curMonth: -1, | |
curYear: -1 | |
}; | |
Calendar.displayCalendar = function(calendar_id) { | |
var calRenderer; | |
calRenderer = new Calendar(calendar_id); | |
Calendar.settings.calendar = calRenderer; | |
return calRenderer.render(new Date()); | |
}; | |
Calendar.displayPreviousMonth = function() { | |
var nm, nmb, ny, nyb; | |
nm = Calendar.settings.curMonth; | |
ny = Calendar.settings.curYear; | |
if (nm < 1) { | |
nmb = 11; | |
nyb = ny - 1; | |
} else { | |
nmb = nm - 1; | |
nyb = ny; | |
} | |
Calendar.settings.calendar.render(new Date(nyb, nmb, 1)); | |
Calendar.settings.curMonth = nmb; | |
return Calendar.settings.curYear = nyb; | |
}; | |
Calendar.displayNextMonth = function() { | |
var nm, nms, ny, nys; | |
nm = Calendar.settings.curMonth; | |
ny = Calendar.settings.curYear; | |
if (nm > 10) { | |
nms = 0; | |
nys = ny + 1; | |
} else { | |
nms = nm + 1; | |
nys = ny; | |
} | |
Calendar.settings.calendar.render(new Date(nys, nms, 1)); | |
Calendar.settings.curMonth = nms; | |
return Calendar.settings.curYear = nys; | |
}; | |
Calendar.prototype.render = function(in_date) { | |
var calBody, captionValue, cell, dateinf, dateinfprev, day, dayname, days, fdm, nmonth, prevday, prevdays, rowNum, switchMe, _i, _j, _k, _len, _len1, _len2, _ref, _results; | |
this.domRoot.empty(); | |
dateinf = [in_date.getFullYear(), in_date.getMonth(), in_date.getDate()]; | |
Calendar.settings.curYear = dateinf[0]; | |
Calendar.settings.curMonth = dateinf[1]; | |
fdm = new Date(dateinf[0], dateinf[1], 1); | |
dateinfprev = CalendarUtils.getPreviousMonth(dateinf[1], dateinf[0]); | |
days = calcDays(CalendarUtils.dayInMonth(dateinf[0], dateinf[1])); | |
prevdays = getPrevMonthLastDays(dateinfprev[0], dateinfprev[1], fdm.getDay() - 1); | |
flushTable(this.domRoot); | |
captionValue = Calendar.settings.monthnames[in_date.getMonth()] + sp + dateinf[0].toString(); | |
$('#dctCalendarTable').append('<caption valign="top">' + captionValue + '</caption>'); | |
calBody = $('#dctCalendarBody'); | |
calBody.append('<tr id="dctWeekDaysRow">'); | |
calBody.append('</tr>'); | |
_ref = Calendar.settings.weeknames; | |
for (_i = 0, _len = _ref.length; _i < _len; _i++) { | |
dayname = _ref[_i]; | |
$('#dctWeekDaysRow').append('<td class="dct-weekday-names">' + dayname + '</td>'); | |
} | |
switchMe = 0; | |
rowNum = 1; | |
for (_j = 0, _len1 = prevdays.length; _j < _len1; _j++) { | |
prevday = prevdays[_j]; | |
if ((switchMe % 7) === 0) { | |
flushRow(calBody, rowNum); | |
rowNum++; | |
} | |
cell = new CellObj(prevday, rowNum); | |
cell.render(false); | |
switchMe++; | |
} | |
for (_k = 0, _len2 = days.length; _k < _len2; _k++) { | |
day = days[_k]; | |
if ((switchMe % 7) === 0) { | |
flushRow(calBody, rowNum); | |
rowNum++; | |
} | |
cell = new CellObj(day, rowNum); | |
cell.render(true); | |
switchMe++; | |
} | |
nmonth = 0; | |
_results = []; | |
while (true) { | |
nmonth++; | |
if ((switchMe % 7) === 0) { | |
break; | |
} | |
cell = new CellObj(nmonth, rowNum); | |
cell.render(false); | |
_results.push(switchMe++); | |
} | |
return _results; | |
}; | |
flushTable = function(root) { | |
root.append('<table id="dctCalendarTable"><tbody id="dctCalendarBody">'); | |
return root.append('</tbody></table>'); | |
}; | |
flushRow = function(root, rowNum) { | |
root.append('<tr id="row_' + rowNum.toString() + '">'); | |
return root.append('</tr>'); | |
}; | |
getPrevMonthLastDays = function(nyb, nmb, dbf) { | |
var days, nbd, _i, _ref, _results; | |
nbd = CalendarUtils.dayInMonth(nyb, nmb); | |
if (dbf < 0) { | |
return []; | |
} | |
_results = []; | |
for (days = _i = _ref = nbd - dbf; _ref <= nbd ? _i <= nbd : _i >= nbd; days = _ref <= nbd ? ++_i : --_i) { | |
_results.push(days); | |
} | |
return _results; | |
}; | |
calcDays = function(nbd) { | |
var daynum, _i, _results; | |
_results = []; | |
for (daynum = _i = 1; 1 <= nbd ? _i <= nbd : _i >= nbd; daynum = 1 <= nbd ? ++_i : --_i) { | |
_results.push(daynum); | |
} | |
return _results; | |
}; | |
return Calendar; | |
})(); | |
CellObj = (function() { | |
var cellDate; | |
cellDate = null; | |
function CellObj(dayNumber, rowNumber) { | |
this.dayNumber = dayNumber; | |
this.rowNumber = rowNumber; | |
this.cellDate = new Date(Calendar.settings.curYear, Calendar.settings.curMonth, dayNumber); | |
} | |
CellObj.prototype.render = function(bInMonth) { | |
var headerSelector, tdSelector, tdTarget, trElement, _this; | |
tdTarget = "dct_td_" + (this.rowNumber - 1) + "_" + this.dayNumber; | |
tdSelector = '#' + tdTarget; | |
trElement = "#dctCalendarBody tr:eq(" + (this.rowNumber - 1) + ")"; | |
$(trElement).append('<td id="' + tdTarget + '" class="dct-month-day"></td>'); | |
$(tdSelector).append('<div class="dct-day-header">' + this.dayNumber + '</div><div class="dct-day-content"></div>'); | |
headerSelector = tdSelector + " .dct-day-header"; | |
if (bInMonth) { | |
$(tdSelector).addClass("dct-cell-color"); | |
$(tdSelector).hover(function() { | |
return $(this).addClass("dct-hightcell"); | |
}, function() { | |
return $(this).removeClass("dct-hightcell"); | |
}); | |
} else { | |
$(tdSelector).addClass("dct-cell-color-off"); | |
$(tdSelector).hover(function() { | |
return $(this).addClass("dct-hightcell"); | |
}, function() { | |
return $(this).removeClass("dct-hightcell"); | |
}); | |
} | |
$('.dct-day-header').hover(function() { | |
return $(this).css("background-color", "blue"); | |
}, function() { | |
return $(this).css("background-color", "SaddleBrown"); | |
}); | |
_this = this; | |
return $(tdSelector).find('.dct-day-header').click(function() { | |
return console.log("cell " + _this.cellDate.toString() + " was clicked"); | |
}); | |
}; | |
return CellObj; | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!doctype html> | |
<html lang="fr"> | |
<head> | |
<meta charset="utf-8"> | |
<title>Javascript calendar</title> | |
<link rel="stylesheet" type="text/css" href="calendar.css"> | |
</head> | |
<body onload="Calendar.displayCalendar($('#myCalendar'))"> | |
<div class="dct-container"> | |
<div> | |
<button name="previous" onclick="Calendar.displayPreviousMonth()">previous</button> | |
<button name="previous" onclick="Calendar.displayNextMonth()">next</button> | |
</div> | |
<br /> | |
<div id="myCalendar"></div> | |
</div> | |
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script> | |
<script src="calendar-utils.js"></script> | |
<script src="calendar.js"></script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment