Created
June 26, 2014 11:34
-
-
Save ptb/876279eaf672c7f136f4 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 class='no-js' lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'> | |
| <head> | |
| <meta charset='UTF-8' /> | |
| <title></title> | |
| <meta content='initial-scale=1, maximum-scale=1, user-scalable=0, width=device-width' name='viewport' /> | |
| <style> | |
| #calendar table { | |
| font-weight: 700; | |
| font-family: "Helvetica Neue", sans-serif; | |
| border-collapse: collapse; | |
| -webkit-user-select: none; | |
| -webkit-touch-callout: none; | |
| margin-right: auto; | |
| margin-left: auto; | |
| width: 100%; | |
| min-width: 320px; | |
| max-width: 568px; | |
| } | |
| #calendar thead a[rel='prev'] { | |
| content: url("data:image/svg+xml;charset=utf-8,<svg viewBox='0 0 120 120' xmlns='http://www.w3.org/2000/svg'><path d='m3 60l93 54v-108z'/></svg>"); | |
| } | |
| #calendar thead a[rel='next'] { | |
| content: url("data:image/svg+xml;charset=utf-8,<svg viewBox='0 0 120 120' xmlns='http://www.w3.org/2000/svg'><path d='m24 114v-108l93 54z'/></svg>"); | |
| } | |
| #calendar thead a[rel='prev'], #calendar thead a[rel='next'] { | |
| display: inline-block; | |
| width: 15px; | |
| height: 15px; | |
| } | |
| #calendar thead abbr { | |
| text-shadow: 0 1px white; | |
| font-size: 10px; | |
| color: #545454; | |
| border-bottom: 0 none transparent; | |
| } | |
| #calendar tbody { | |
| background-color: #d5d5d9; | |
| } | |
| #calendar th, #calendar td { | |
| text-align: center; | |
| padding: 0; | |
| width: 14.2857142857%; | |
| } | |
| #calendar td { | |
| font-size: 24px; | |
| line-height: 1.8; | |
| border-color: #a1a4ad; | |
| border: 1px solid rgba(117, 124, 138, 0.55); | |
| } | |
| #calendar td:first-child { | |
| border-left: 0 none transparent; | |
| } | |
| #calendar td:last-child { | |
| border-right: 0 none transparent; | |
| } | |
| #calendar time, #calendar a { | |
| -webkit-user-drag: none; | |
| display: block; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| #calendar time { | |
| box-shadow: inset -1px 1px rgba(255, 255, 255, 0.6); | |
| } | |
| #calendar time a { | |
| text-decoration: none; | |
| text-shadow: 0 1px white; | |
| position: relative; | |
| color: #293649; | |
| } | |
| #calendar time a[aria-disabled='true'] { | |
| cursor: not-allowed; | |
| background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0.125, rgba(0, 0, 0, 0.15)), color-stop(0.125, transparent), color-stop(0.25, transparent), color-stop(0.25, rgba(0, 0, 0, 0.15)), color-stop(0.375, rgba(0, 0, 0, 0.15)), color-stop(0.375, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(0, 0, 0, 0.15)), color-stop(0.625, rgba(0, 0, 0, 0.15)), color-stop(0.625, transparent), color-stop(0.75, transparent), color-stop(0.75, rgba(0, 0, 0, 0.15)), color-stop(0.875, rgba(0, 0, 0, 0.15)), color-stop(0.875, transparent)); | |
| background-image: -webkit-linear-gradient(135deg, rgba(0, 0, 0, 0.15) 12.5%, transparent 12.5%, transparent 25%, rgba(0, 0, 0, 0.15) 25%, rgba(0, 0, 0, 0.15) 37.5%, transparent 37.5%, transparent 50%, rgba(0, 0, 0, 0.15) 50%, rgba(0, 0, 0, 0.15) 62.5%, transparent 62.5%, transparent 75%, rgba(0, 0, 0, 0.15) 75%, rgba(0, 0, 0, 0.15) 87.5%, transparent 87.5%); | |
| background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.15) 12.5%, transparent 12.5%, transparent 25%, rgba(0, 0, 0, 0.15) 25%, rgba(0, 0, 0, 0.15) 37.5%, transparent 37.5%, transparent 50%, rgba(0, 0, 0, 0.15) 50%, rgba(0, 0, 0, 0.15) 62.5%, transparent 62.5%, transparent 75%, rgba(0, 0, 0, 0.15) 75%, rgba(0, 0, 0, 0.15) 87.5%, transparent 87.5%); | |
| } | |
| #calendar time a:not([aria-disabled='true']):hover { | |
| background-color: #babac1; | |
| } | |
| #calendar time.today a { | |
| text-shadow: 0 1px rgba(0, 0, 0, 0.5); | |
| color: white; | |
| box-shadow: inset 0 0 6px black; | |
| background-color: #8b5d5a; | |
| } | |
| #calendar time.today a:hover { | |
| background-color: #6c4846; | |
| } | |
| #calendar time.today a span[aria-hidden='false']::before { | |
| content: "Today: "; | |
| } | |
| #calendar time a[aria-selected='true'] { | |
| text-shadow: 0 -1px rgba(0, 0, 0, 0.5); | |
| color: white; | |
| background-color: #b71415; | |
| } | |
| #calendar time a[aria-selected='true']:hover { | |
| background-color: #890f10; | |
| } | |
| #calendar time:not(.today) a[aria-selected='true'] { | |
| background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), color-stop(2%, rgba(223, 223, 223, 0.5098039216)), color-stop(50%, rgba(163, 163, 163, 0.262745098)), color-stop(50%, rgba(0, 0, 0, 0.1137254902))); | |
| background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.5), rgba(223, 223, 223, 0.5098039216) 1px, rgba(163, 163, 163, 0.262745098) 50%, rgba(0, 0, 0, 0.1137254902) 50%); | |
| background-image: linear-gradient(rgba(255, 255, 255, 0.5), rgba(223, 223, 223, 0.5098039216) 1px, rgba(163, 163, 163, 0.262745098) 50%, rgba(0, 0, 0, 0.1137254902) 50%); | |
| } | |
| #calendar time.prev a { | |
| opacity: 0.45; | |
| } | |
| #calendar [aria-hidden='false'] { | |
| font-size: 0; | |
| position: absolute; | |
| width: 0; | |
| height: 0; | |
| overflow: hidden; | |
| color: transparent; | |
| } | |
| @font-face { | |
| font-family: "ptbkit"; | |
| src: url("/fonts/ptbkit/ptbkit.eot"); | |
| src: url("/fonts/ptbkit/ptbkit.eot?#iefix") format("embedded-opentype"), url("/fonts/ptbkit/ptbkit.woff") format("woff"), url("/fonts/ptbkit/ptbkit.ttf") format("truetype"), url("/fonts/ptbkit/ptbkit.svg#ptbkit") format("svg"); | |
| font-style: "normal"; | |
| font-weight: "400"; | |
| } | |
| #calendar time a#dts, #calendar time a#dte { | |
| cursor: col-resize; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id='calendar'></div> | |
| <script type='text/javascript'> | |
| (function() { | |
| console.log(['a=a', '&b=a', '&b=b', '&c[]=a', '&c[]=b', '&d[a]=a', '&d[a]=x', '&e[a][]=a', '&e[a][]=b', '&f[a][b]=a', '&f[a][b]=x', '&g[a][b][]=a', '&g[a][b][]=b', '&h=%2B+%25'].join('')); | |
| }).call(this); | |
| </script> | |
| <script src='//cdnjs.cloudflare.com/ajax/libs/moment.js/2.7.0/moment.min.js'></script> | |
| <script type='text/javascript'> | |
| (function() { | |
| var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; | |
| window.Calendar = (function() { | |
| function Calendar() { | |
| this.ev = __bind(this.ev, this); | |
| } | |
| Calendar.prototype.opts = { | |
| min: 1, | |
| max: 90, | |
| weeks: 5 | |
| }; | |
| Calendar.prototype.sm = {}; | |
| Calendar.prototype.ac = function(a, c) { | |
| var b, _i, _j, _len, _len1; | |
| if (a.classList) { | |
| for (_i = 0, _len = c.length; _i < _len; _i++) { | |
| b = c[_i]; | |
| a.classList.add(b); | |
| } | |
| return a; | |
| } else { | |
| for (_j = 0, _len1 = c.length; _j < _len1; _j++) { | |
| b = c[_j]; | |
| a.className += " " + b; | |
| } | |
| return a; | |
| } | |
| }; | |
| Calendar.prototype.ap = function(a, c) { | |
| var b, _i, _len; | |
| for (_i = 0, _len = c.length; _i < _len; _i++) { | |
| b = c[_i]; | |
| a.appendChild(b); | |
| } | |
| return a; | |
| }; | |
| Calendar.prototype.ce = function(a) { | |
| return document.createElement(a); | |
| }; | |
| Calendar.prototype.du = function(a) { | |
| return decodeURIComponent(a.replace(/\+/g, ' ')); | |
| }; | |
| Calendar.prototype.ga = function(a, b) { | |
| return a.getAttribute(b); | |
| }; | |
| Calendar.prototype.ge = function(a) { | |
| return document.getElementById(a); | |
| }; | |
| Calendar.prototype.ih = function(a, b) { | |
| a.innerHTML = b; | |
| return a; | |
| }; | |
| Calendar.prototype.ls = function() { | |
| var a, b, c, d; | |
| a = {}; | |
| b = window.location.search.substring(1); | |
| c = function(a) { | |
| return a && decodeURIComponent(a.replace(/\+/g, ' ')); | |
| }; | |
| d = function(f, g, h) { | |
| var i, j, k, l; | |
| i = g.indexOf('['); | |
| if (i !== -1) { | |
| j = g.slice(0, i); | |
| k = g.slice(1 + i).slice(0, g.slice(1 + i).indexOf(']')); | |
| l = g.slice(1 + i).slice(1 + g.slice(1 + i).indexOf(']')); | |
| if (k) { | |
| if (typeof f[j] !== 'object') { | |
| f[j] = {}; | |
| } | |
| f[j][k] = l ? d(f[j], k + l, h) : h; | |
| } else { | |
| if (typeof f[j] !== 'object') { | |
| f[j] = []; | |
| } | |
| f[j].push(h); | |
| } | |
| return f[j]; | |
| } else { | |
| if (f.hasOwnProperty(g)) { | |
| if (typeof f[g] === 'object') { | |
| f[g].push(h); | |
| } else { | |
| f[g] = [].concat.apply([f[g]], [h]); | |
| } | |
| } else { | |
| f[g] = h; | |
| } | |
| return f[g]; | |
| } | |
| }; | |
| b.split('&').forEach(function(m) { | |
| var n, o, _ref; | |
| _ref = [c(m.split('=')[0]), c(m.split('=')[1])], n = _ref[0], o = _ref[1]; | |
| return d(a, n, o); | |
| }); | |
| return a; | |
| }; | |
| Calendar.prototype.pa = function(a, b) { | |
| while (a.parentNode) { | |
| a = a.parentNode; | |
| if (a.tagName === b.toUpperCase()) { | |
| return a; | |
| } | |
| } | |
| return null; | |
| }; | |
| Calendar.prototype.qa = function(a, b) { | |
| return a.querySelectorAll(b); | |
| }; | |
| Calendar.prototype.qs = function(a, b) { | |
| return a.querySelector(b); | |
| }; | |
| Calendar.prototype.ra = function(a, c) { | |
| var b, _i, _len; | |
| for (_i = 0, _len = c.length; _i < _len; _i++) { | |
| b = c[_i]; | |
| a.removeAttribute(b); | |
| } | |
| return a; | |
| }; | |
| Calendar.prototype.sa = function(a, c) { | |
| var b; | |
| for (b in c) { | |
| a.setAttribute(b, c[b]); | |
| } | |
| return a; | |
| }; | |
| Calendar.prototype.cc = function() { | |
| var ab, da, dd, dl, dn, ds, dt, dy, i, j, ne, pr, ta, tb, tc, th, ti, tn, tp, tt, tw, tx, wd, _i, _len; | |
| ta = this.ce('table'); | |
| this.sa(ta, { | |
| 'aria-labelledby': 'month', | |
| "class": 'vevent', | |
| itemscope: 'itemscope', | |
| itemtype: 'http://schema.org/Event', | |
| role: 'presentation' | |
| }); | |
| th = this.ce('thead'); | |
| tc = this.ce('tr'); | |
| tp = this.ce('th'); | |
| pr = this.ce('a'); | |
| this.sa(pr, { | |
| rel: 'prev', | |
| role: 'button', | |
| title: 'Previous Month' | |
| }); | |
| this.ap(tp, [pr]); | |
| tt = this.ce('th'); | |
| this.sa(tt, { | |
| colspan: 5 | |
| }); | |
| ti = this.ce('time'); | |
| this.sa(ti, { | |
| id: 'month' | |
| }); | |
| this.ap(tt, [ti]); | |
| tx = this.ce('th'); | |
| ne = this.ce('a'); | |
| this.sa(ne, { | |
| rel: 'next', | |
| role: 'button', | |
| title: 'Next Month' | |
| }); | |
| this.ap(tx, [ne]); | |
| this.ap(tc, [tp, tt, tx]); | |
| tn = this.ce('tr'); | |
| this.sa(tn, { | |
| 'aria-hidden': 'true' | |
| }); | |
| wd = moment.weekdays(); | |
| for (_i = 0, _len = wd.length; _i < _len; _i++) { | |
| dn = wd[_i]; | |
| da = this.ce('th'); | |
| this.sa(da, { | |
| scope: 'col' | |
| }); | |
| ab = this.ce('abbr'); | |
| this.sa(ab, { | |
| title: dn | |
| }); | |
| this.ih(ab, dn.slice(0, 3)); | |
| this.ap(da, [ab]); | |
| this.ap(tn, [da]); | |
| } | |
| this.ap(th, [tc, tn]); | |
| tb = this.ce('tbody'); | |
| i = this.opts.weeks + 1; | |
| while (i -= 1) { | |
| tw = this.ce('tr'); | |
| j = 7 + 1; | |
| while (j -= 1) { | |
| dy = this.ce('td'); | |
| dt = this.ce('time'); | |
| dl = this.ce('a'); | |
| this.sa(dl, { | |
| 'aria-selected': 'false', | |
| role: 'button' | |
| }); | |
| ds = this.ce('span'); | |
| this.sa(ds, { | |
| 'aria-hidden': 'false' | |
| }); | |
| dd = this.ce('span'); | |
| this.ap(dl, [ds, dd]); | |
| this.ap(dt, [dl]); | |
| this.ap(dy, [dt]); | |
| this.ap(tw, [dy]); | |
| } | |
| this.ap(tb, [tw]); | |
| } | |
| this.ap(ta, [th, tb]); | |
| return ta; | |
| }; | |
| Calendar.prototype.sb = function(a, b) { | |
| return this.sa(a, { | |
| href: "?during=" + (b.format('YYYY-MM')) | |
| }); | |
| }; | |
| Calendar.prototype.st = function(a, b) { | |
| this.sa(a, { | |
| datetime: b.format('YYYY-MM') | |
| }); | |
| return this.ih(a, b.format('MMMM YYYY')); | |
| }; | |
| Calendar.prototype.pc = function(a, b) { | |
| var i, ne, nm, pm, pr, sm, td, ti, tm; | |
| td = moment().startOf('day'); | |
| tm = moment().startOf('month'); | |
| pm = moment(b).startOf('month').add(-1, 'month'); | |
| sm = moment(b).startOf('month'); | |
| nm = moment(b).startOf('month').add(1, 'month'); | |
| pr = this.qs(a, '[rel=prev]'); | |
| this.sb(pr, pm); | |
| this.sa(pr, { | |
| 'aria-disabled': pm < tm ? 'true' : 'false' | |
| }); | |
| ti = this.qs(a, '#month'); | |
| this.st(ti, sm); | |
| ne = this.qs(a, '[rel=next]'); | |
| this.sb(ne, nm); | |
| i = moment(b).startOf('week').subtract(1, 'week'); | |
| return [].forEach.call(this.qa(a, 'tbody time'), (function(_this) { | |
| return function(dt) { | |
| var cl, dd, dl, ds, im; | |
| _this.sa(dt, { | |
| datetime: i.format('YYYY-MM-DD') | |
| }); | |
| im = i.clone().startOf('month'); | |
| cl = []; | |
| if (im.unix() === pm.unix()) { | |
| cl.push('prev'); | |
| } | |
| if (i.unix() === td.unix()) { | |
| cl.push('today'); | |
| } | |
| if (im.unix() === nm.unix()) { | |
| cl.push('next'); | |
| } | |
| _this.ac(dt, cl); | |
| dl = _this.qs(dt, 'a'); | |
| if (i < td) { | |
| _this.sa(dl, { | |
| 'aria-disabled': true | |
| }); | |
| _this.ra(dl, ['href']); | |
| } else { | |
| _this.sa(dl, { | |
| 'aria-disabled': false, | |
| href: "?starting=" + (i.format('YYYY-MM-DD')) | |
| }); | |
| } | |
| ds = _this.qs(dl, 'span[aria-hidden=false]'); | |
| _this.ih(ds, i.format('dddd, MMMM ')); | |
| dd = _this.qs(dl, 'span + span'); | |
| _this.ih(dd, i.format('D')); | |
| return i = i.add(1, 'day'); | |
| }; | |
| })(this)); | |
| }; | |
| Calendar.prototype.gd = function(a) { | |
| var b, c, d; | |
| b = this.pa(a, 'time'); | |
| if (b) { | |
| c = this.qs(b, 'a[aria-disabled=false]'); | |
| } | |
| if (c) { | |
| d = moment(this.ga(b, 'datetime')); | |
| } | |
| if (d && d.isValid()) { | |
| return d; | |
| } else { | |
| return null; | |
| } | |
| }; | |
| Calendar.prototype.rr = function() { | |
| var z; | |
| z = this.qa(this.sm.ca, 'time a[aria-disabled=false]'); | |
| return [].forEach.call(z, (function(_this) { | |
| return function(el) { | |
| var a; | |
| a = _this.gd(el); | |
| if (_this.sm.dts <= a && _this.sm.dte >= a) { | |
| _this.sa(el, { | |
| 'aria-selected': 'true' | |
| }); | |
| } else { | |
| _this.sa(el, { | |
| 'aria-selected': 'false' | |
| }); | |
| } | |
| if (_this.sm.dts.isSame(a)) { | |
| return _this.sa(el, { | |
| id: 'dts' | |
| }); | |
| } else if (_this.sm.dte.isSame(a)) { | |
| return _this.sa(el, { | |
| id: 'dte' | |
| }); | |
| } else { | |
| return _this.ra(el, ['id']); | |
| } | |
| }; | |
| })(this)); | |
| }; | |
| Calendar.prototype.vr = function(a, b, e) { | |
| var eh, s, sh; | |
| if (a && b && a.isValid() && b.isValid()) { | |
| this.sm.dts = moment.min(a, b); | |
| this.sm.dte = moment.max(a, b); | |
| this.rr(); | |
| s = this.ge('start'); | |
| this.sa(s, { | |
| value: this.sm.dts.format('ddd, MMMM Do') | |
| }); | |
| e = this.ge('end'); | |
| this.sa(e, { | |
| value: this.sm.dte.format('ddd, MMMM Do') | |
| }); | |
| sh = this.ge('dtstart'); | |
| this.sa(sh, { | |
| value: this.sm.dts.format('YYYY-MM-DD') | |
| }); | |
| eh = this.ge('dtend'); | |
| return this.sa(eh, { | |
| value: this.sm.dte.format('YYYY-MM-DD') | |
| }); | |
| } | |
| }; | |
| Calendar.prototype.ev = function(e) { | |
| var a, b; | |
| e.preventDefault(); | |
| e.stopPropagation(); | |
| switch (e.type) { | |
| case 'click': | |
| case 'mousedown': | |
| case 'mouseover': | |
| case 'mouseup': | |
| a = e.target; | |
| b = this.gd(a); | |
| break; | |
| case 'touchstart': | |
| a = e.touches[0].target; | |
| b = this.gd(a); | |
| break; | |
| case 'touchmove': | |
| a = document.elementFromPoint(e.touches[0].pageX, e.touches[0].pageY); | |
| b = this.gd(a); | |
| break; | |
| case 'touchend': | |
| this.sm.cl = null; | |
| } | |
| if (!b) { | |
| return; | |
| } | |
| switch (e.type) { | |
| case 'click': | |
| case 'touchstart': | |
| if (this.sm.cl) { | |
| this.vr(b, this.sm.cl, e); | |
| this.sm.cl = null; | |
| } else { | |
| this.vr(b, b, e); | |
| this.sm.cl = b; | |
| } | |
| return this.sm.md = null; | |
| case 'mousedown': | |
| if (!(this.sm.md || this.sm.cl)) { | |
| this.vr(b, b, e); | |
| return this.sm.md = b; | |
| } | |
| break; | |
| case 'mouseover': | |
| case 'touchmove': | |
| if (!b.isSame(this.sm.mo)) { | |
| if (this.sm.cl) { | |
| this.vr(b, this.sm.cl, e); | |
| } | |
| if (this.sm.md) { | |
| this.vr(b, this.sm.md, e); | |
| } | |
| } | |
| return this.sm.mo = b; | |
| case 'mouseup': | |
| if (!b.isSame(this.sm.md)) { | |
| this.vr(b, this.sm.md, e); | |
| return this.sm.md = null; | |
| } | |
| } | |
| }; | |
| Calendar.prototype.al = function() { | |
| var a; | |
| a = this.qa(this.sm.ca, 'time a[aria-disabled=false]'); | |
| return [].forEach.call(a, (function(_this) { | |
| return function(b) { | |
| return [].forEach.call(['mousedown', 'mouseover', 'mouseup', 'click', 'touchstart', 'touchmove', 'touchend'], function(c) { | |
| return b.addEventListener(c, _this.ev); | |
| }); | |
| }; | |
| })(this)); | |
| }; | |
| Calendar.prototype.init = function() { | |
| var a, ed, eh, l, sd, sh, t; | |
| this.sm.ca = this.ge('calendar'); | |
| t = this.cc(); | |
| this.pc(t, new Date()); | |
| sd = this.ce('input'); | |
| this.sa(sd, { | |
| id: 'start', | |
| type: 'text' | |
| }); | |
| sh = this.ce('input'); | |
| this.sa(sh, { | |
| id: 'dtstart', | |
| type: 'hidden' | |
| }); | |
| a = this.ce('span'); | |
| this.ih(a, ' to '); | |
| ed = this.ce('input'); | |
| this.sa(ed, { | |
| id: 'end', | |
| type: 'text' | |
| }); | |
| eh = this.ce('input'); | |
| this.sa(eh, { | |
| id: 'dtend', | |
| type: 'hidden' | |
| }); | |
| this.ap(this.sm.ca, [t, sd, sh, a, ed, eh]); | |
| this.al(); | |
| l = this.ls(); | |
| console.log(l); | |
| return console.log(JSON.stringify(l)); | |
| }; | |
| return Calendar; | |
| })(); | |
| new Calendar().init(); | |
| }).call(this); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment