├── .gitignore ├── LICENSE.md ├── README.md ├── calendar.html ├── calendar.js └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | .c9/ 2 | index.html 3 | javascript-tests.js 4 | react-example/ 5 | sandbox.html 6 | sandbox.js -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Michael Duane Mooring 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ,-----.,--. ,--. ,---. ,--.,------. ,------. 2 | ' .--./| | ,---. ,--.,--. ,-| || o \ | || .-. \ | .---' 3 | | | | || .-. || || |' .-. |`..' | | || | \ :| `--, 4 | ' '--'\| |' '-' '' '' '\ `-' | .' / | || '--' /| `---. 5 | `-----'`--' `---' `----' `---' `--' `--'`-------' `------' 6 | ----------------------------------------------------------------- 7 | 8 | 9 | Hi there! Welcome to Cloud9 IDE! 10 | 11 | To edit this repository in Cloud9 go here: 12 | - Cloud9 Workspace: https://ide.c9.io/mikeumus/vanilla-js-cal GitHub Pages: 13 | 14 | 15 | ## Support & Documentation 16 | 17 | Visit http://docs.c9.io for documentation, or http://support.c9.io for support. 18 | To watch some training videos, visit http://www.youtube.com/user/c9ide 19 | -------------------------------------------------------------------------------- /calendar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Vanilla JS Calendar 9 | 10 | 11 | 12 | 13 | 14 | 23 | 24 |

Vanilla JavaScript Calendar

25 | 26 |
27 | 28 | 29 |
30 | 31 |
32 |

How To Use:

33 |
34 | // Target an element ID you want to render the calendar inside of:       
35 | renderCalendar(calendarThis); 
36 | 
37 | // Something like this in your HTML file:
38 | <div id="calendarThis"> <div> 
39 | 
40 | // Source code:
41 | https://github.com/mikeumus/vanilla-js-calendar
42 |         
43 |
44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /calendar.js: -------------------------------------------------------------------------------- 1 | /* Vanilla JS Calendar */ 2 | (function vanillaJsCalendar(){ 3 | 4 | "use strict"; 5 | 6 | var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 7 | var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 8 | 9 | document.addEventListener("DOMContentLoaded", function(event){ 10 | 11 | var theDate = new Date(); 12 | 13 | var DateObject = function DateObject(theDate) { 14 | this.theDay = theDate.getDate(); 15 | this.dayName = dayNames[theDate.getDay()]; 16 | this.theMonth = monthNames[theDate.getMonth()]; 17 | this.theYear = theDate.getFullYear(); 18 | this.daysInMonth = new Date(theDate.getFullYear(), theDate.getMonth()+1, 0).getDate(); 19 | this.firstDayOfMonth = dayNames[new Date(theDate.getFullYear(), theDate.getMonth(), 1).getDay()]; 20 | }; 21 | 22 | var currentDate = new DateObject(theDate); 23 | 24 | function renderCalendar(targetElem){ 25 | 26 | // Custom function to make new elements easier: 27 | function addElem(elementType, elemClass, appendTarget){ 28 | appendTarget.innerHTML += "<"+elementType+" class="+elemClass+"> "; 29 | } 30 | 31 | currentDate = new DateObject(theDate); 32 | 33 | // Refreshing Calendar 34 | var renderTarget = document.getElementById(targetElem); 35 | renderTarget.remove(); 36 | renderTarget = document.createElement("div"); 37 | renderTarget.id = targetElem; 38 | document.getElementsByTagName('body')[0].appendChild(renderTarget); 39 | 40 | // Monday, dayView 41 | addElem("div", "day-view", renderTarget); 42 | var dayView = document.querySelector('.day-view'); 43 | var dayNameElem = document.createElement("div"); // i.e.: Wednesday 44 | dayNameElem.className = "day-header"; 45 | var dayNameNode = document.createTextNode(currentDate.dayName); 46 | dayNameElem.appendChild(dayNameNode); 47 | dayView.appendChild(dayNameElem); 48 | // 21st, dayNumber 49 | addElem("time", "day-number", dayView); 50 | var dayNumber = document.querySelector('.day-number'); 51 | var dayNumNode = document.createTextNode(currentDate.theDay); 52 | dayNumber.appendChild(dayNumNode); 53 | dayView.appendChild(dayNumber); 54 | 55 | addElem("div", "month-view", renderTarget); 56 | var monthView = document.querySelector('.month-view'); 57 | 58 | var prevMonthSpan = document.createElement("SPAN"); 59 | prevMonthSpan.addEventListener('click', function(){ 60 | goToMonth(currentDate, false); // Go To Previous Month 61 | }); 62 | prevMonthSpan.classList.add('arrow', 'float-left', 'prev-arrow'); 63 | var backArrow = document.createTextNode("<"); 64 | prevMonthSpan.appendChild(backArrow); 65 | 66 | var nextMonthSpan = document.createElement("SPAN"); 67 | nextMonthSpan.addEventListener('click', function(){ 68 | goToMonth(currentDate, true); // Go To Next Month 69 | }); 70 | nextMonthSpan.classList.add('arrow', 'float-right', 'next-arrow'); 71 | var nextArrow = document.createTextNode(">"); 72 | nextMonthSpan.appendChild(nextArrow); 73 | 74 | document.onkeydown = function() { 75 | switch (window.event.keyCode) { 76 | case 37: //Left key 77 | goToMonth(currentDate, false); 78 | break; 79 | case 39: //Right key 80 | goToMonth(currentDate, true); 81 | break; 82 | } 83 | }; 84 | 85 | var monthSpan = document.createElement("SPAN"); 86 | monthSpan.className = "month-header"; 87 | var monthOf = document.createTextNode( 88 | currentDate.theMonth +" "+ currentDate.theYear 89 | ); 90 | 91 | monthSpan.appendChild(prevMonthSpan); 92 | monthSpan.appendChild(monthOf); 93 | monthSpan.appendChild(nextMonthSpan); 94 | monthView.appendChild(monthSpan); 95 | 96 | for(var i=0; i < dayNames.length; i++){ 97 | var dayOfWeek = document.createElement('div'); 98 | dayOfWeek.className = "day-of-week"; 99 | var charOfDay = document.createTextNode(dayNames[i].charAt(0)); 100 | dayOfWeek.appendChild(charOfDay); 101 | monthView.appendChild(dayOfWeek); 102 | } 103 | 104 | // renderTarget.appendChild(document.createElement("ul")); 105 | var calendarList = document.createElement("ul"); 106 | for(i = 0; i < currentDate.daysInMonth; i++){ 107 | var calendarCell = document.createElement("li"); 108 | var calCellTime = document.createElement("time"); 109 | calendarList.appendChild(calendarCell); 110 | calendarCell.id = 'day_'+(i+1); 111 | var dayDataDate = new Date(theDate.getFullYear(), theDate.getMonth(), (i+1)); 112 | calCellTime.setAttribute('datetime', dayDataDate.toISOString()); 113 | calCellTime.setAttribute('data-dayofweek', dayNames[dayDataDate.getDay()]); 114 | 115 | calendarCell.className = "calendar-cell"; 116 | if(i === currentDate.theDay-1){ 117 | calendarCell.className = "today"; 118 | } 119 | var dayOfMonth = document.createTextNode(i+1); 120 | calCellTime.appendChild(dayOfMonth); 121 | calendarCell.appendChild(calCellTime); 122 | monthView.appendChild(calendarList); 123 | 124 | } // daysInMonth for loop ends 125 | 126 | var dayOne = document.getElementById('day_1'); 127 | if (currentDate.firstDayOfMonth == "Monday"){ 128 | dayOne.style.marginLeft = "49px"; 129 | } else if (currentDate.firstDayOfMonth == "Tuesday"){ 130 | dayOne.style.marginLeft = "98px"; 131 | } else if (currentDate.firstDayOfMonth == "Wednesday"){ 132 | dayOne.style.marginLeft = "147px"; 133 | } else if (currentDate.firstDayOfMonth == "Thursday"){ 134 | dayOne.style.marginLeft = "196px"; 135 | } else if (currentDate.firstDayOfMonth == "Friday"){ 136 | dayOne.style.marginLeft = "245px"; 137 | } else if (currentDate.firstDayOfMonth == "Saturday"){ 138 | dayOne.style.marginLeft = "304px"; 139 | } 140 | 141 | var dayHeader = document.getElementsByClassName('day-header'); 142 | var dayNumNode = document.getElementsByClassName('day-number'); 143 | var updateDay = function(){ 144 | var thisCellTime = this.querySelector('time'); 145 | dayHeader[0].textContent = thisCellTime.getAttribute('data-dayofweek'); 146 | 147 | dayNumNode[0].textContent = this.textContent; 148 | 149 | } 150 | 151 | var calCells = document.getElementsByClassName('calendar-cell'); 152 | for(i = 0; i < calCells.length; i++){ 153 | calCells[i].addEventListener('click', updateDay, false); 154 | } 155 | 156 | } // renderCalener function ends 157 | 158 | // console.log(new DateObject(theDate)); 159 | renderCalendar("calendarThis"); 160 | 161 | function goToMonth(currentDate, direction) { 162 | if (direction == false){ 163 | theDate = new Date(theDate.getFullYear(), theDate.getMonth()-1, 1); 164 | } else{ 165 | theDate = new Date(theDate.getFullYear(), theDate.getMonth()+1, 1); 166 | } 167 | return renderCalendar("calendarThis"); 168 | } 169 | 170 | }); // DOMContentLoaded event listener ends 171 | 172 | })(); // iife (immediately invoked function expressions) ends 173 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | color: #82500D; 3 | height: 100vh; 4 | margin: auto; 5 | text-align: center; 6 | } 7 | a{ 8 | color:#d89f52; 9 | } 10 | pre{ 11 | text-align:left; 12 | border: antiquewhite 1px solid; 13 | padding: 13px 33px; 14 | } 15 | hr{ 16 | border: #d89f52 1px solid; 17 | } 18 | 19 | .container{ 20 | text-align: left; 21 | width: 57%; 22 | margin: 7% auto 0; 23 | } 24 | 25 | #calendarThis{ 26 | margin: 3% auto; 27 | display: inline-block; 28 | transition: box-shadow .25s; 29 | border-radius: 2px; 30 | padding: 9px 7px 9px 7px; 31 | background: #FFFCF9; 32 | box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12); 33 | } 34 | #calendarThis li, .day-of-week{ 35 | display: inline-block; 36 | padding: 13px 7px; 37 | width: 33px; 38 | border: #FFF9F2 1px solid; 39 | text-align: center; 40 | background: antiquewhite; 41 | cursor: pointer; 42 | } 43 | #calendarThis li:hover{ 44 | border: #F9E0B6 1px solid; 45 | background: #fff; 46 | } 47 | .float-left, .day-view{ 48 | float: left; 49 | } 50 | .float-right, .month-view{ 51 | float: right; 52 | } 53 | .month-view ul{ 54 | padding: 0; 55 | margin: 0 0 0 8px; 56 | text-align: left; 57 | } 58 | 59 | .day-view{ 60 | text-align: center; 61 | font-weight: bold; 62 | } 63 | .day-header{ 64 | padding: 13px 0; 65 | border: antiquewhite 2px solid; 66 | background: #fff; 67 | } 68 | .day-number{ 69 | display:block; 70 | margin: 10% auto; 71 | font-size: 144px; 72 | background: #fff; 73 | width: 83%; 74 | border-radius: 2px; 75 | border: #FFE2BB 1px dotted; 76 | position: relative; 77 | top: 64%; 78 | transform: translateY(12%); 79 | } 80 | 81 | .day-view, .month-view{ 82 | width: 357px; 83 | display: block; 84 | } 85 | .day-of-week{ 86 | background: #FFFCF9 !important; 87 | font-weight: bold; 88 | border: #fff 1px solid; 89 | color: #D89F52; 90 | } 91 | 92 | .month-header{ 93 | width: 99%; 94 | display: block; 95 | text-align: center; 96 | padding: 13px 0; 97 | border: antiquewhite 2px solid; 98 | background: #fff; 99 | margin: 0 0 2px 0; 100 | font-weight: bold; 101 | } 102 | .today{ 103 | background: #FFFDFA !important; 104 | } 105 | .arrow{ 106 | width: 45px; 107 | height: 35px; 108 | margin: auto 0 auto 0; 109 | text-align: center; 110 | font-weight: bold; 111 | cursor: pointer; 112 | } 113 | 114 | /* Portrait and Landscape */ 115 | @media (max-width: 767px) { 116 | #calendarThis{ 117 | width: 358px; 118 | } 119 | } --------------------------------------------------------------------------------