JSFiddle - React, Tailwind, and code Playground

by Mike McCaughan

HTML

<script src="https://raw.github.com/timrwood/moment/1.7.2/min/moment.min.js"></script>
<p>Arguments:</p>
<ul id="args"></ul>
<p>Results:</p>
<ul id="weeks"></ul>
<ul id="days"></ul>
<ul id="hours"></ul>

JavaScript

var hourCache = {}, dayCache = {}, weekCache = {};

function makeHours(key, hours) {
        var localHours = hours || hourCache[key];
        if (hours) hourCache[key] = hours;
        if (localHours) return localHours;

        localHours = [];
        var hz = Math.ceil(moment.duration(key.lastSaturday.valueOf() - key.firstSunday.valueOf()).asHours()),
            hh = 0, h, hd, hourMoment,
            year, month, day, dow, hour;
        for (; hh < hz; hh++) {
            hourMoment = moment(key.firstSunday).startOf('day').add('hours', hh);
            year = hourMoment.year();
            month = hourMoment.month();
            dow = hourMoment.day();
            day = hourMoment.date();
            hour = hourMoment.hours();
            h = {
                index: hh,
                year: year,
                month: month,
                dow: dow,
                day: day,
                hour: hour
            };
            localHours.push(h);
        }

        hourCache[key] = localHours;
        return localHours;
    }

    function makeDays(key, hours) {
        var days = dayCache[key];

        if (days && !hours) return days;

        days = [];
        var localHours = hours || makeHours(key),
            hz = localHours.length, hh = 0, h, hd, hourMoment,
            year, month, day, dow,
            dd = 0, d, lastDay = key.firstSunday.day();

        for (; hh < hz; hh++) {
            h = localHours[hh];
            hourMoment = hourToMoment(h);
            year = hourMoment.year();
            month = hourMoment.month();
            dow = hourMoment.day();
            day = hourMoment.date();
            if (lastDay !== day) {
                hd = dd * 24;
                d = {
                    index: dd,
                    year: year,
                    month: month,
                    dow: dow,
                    day: day,
                    hours: localHours.slice(hd, hd + 24)
                };
                if...