Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 401 lines (355 sloc) 19.305 kb
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
1 <!DOCTYPE html>
7ef3280 @stephjang used <code> tags for hour and minute numbers in hints
stephjang authored
2 <html data-require="math math-format graphie time interactive angles word-problems">
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
3 <head>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>Telling time 2</title>
6 <script src="../khan-exercise.js"></script>
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
7 </head>
8 <body>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
9 <div class="exercise">
10 <div class="problems">
11 <div id="set-hands" data-weight="3">
12
13 <div class="vars">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
14 <div data-ensure="!(HOUR === 1 && MINUTE === 0)">
15 <var id="HOUR">randRange(1, 12)</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
16 <var id="MINUTE_INCREMENT">15</var>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
17 <var id="MINUTE">randRange(0, (60 / MINUTE_INCREMENT) - 1) * MINUTE_INCREMENT</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
18 </div>
19 <var id="MINUTE_IS_ZERO">MINUTE === 0</var>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
20 <var id="NICE_MINUTE">MINUTE &gt; 5 ? MINUTE : "0" + MINUTE</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
21 <var id="TIME">HOUR + ":" + NICE_MINUTE</var>
22 </div>
23
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
24 <p class="question">Set the clock to <var>TIME</var>.</p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
25
26 <div class="problem">
27
28 <div class="graphie" id="clock">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
29 init({ range: [[-4, 4], [-4, 4]], scale: 45 });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
30
31 var clockRadius = 3.75;
32 var minuteSnapPoints = 12;
33 var hourSnapPoints = 12 * 60 / MINUTE_INCREMENT;
34
35 var outerPointRadius = clockRadius * 1.01;
36 var minuteRadius = clockRadius * 0.6;
37 var hourRadius = clockRadius * 0.45;
38
39 minuteStartAngle = 90;
40 hourStartAngle = 60;
41
42 minuteSnapDegrees = 360 / minuteSnapPoints;
43 hourSnapDegrees = 360 / hourSnapPoints;
44
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
45 var clock = addAnalogClock({ radius: clockRadius, minuteTicks: 60 });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
46 clock.draw();
47
48 addMouseLayer();
49
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
50 function movePartnerPoint(options) {
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
51
52 var x = options.x;
53 var y = options.y;
54 var point = options.point;
55 var outerPoint = options.outerPoint;
56 var isOuterPoint = options.isOuterPoint;
57
58 var ratio = outerPoint.constraints.fixedDistance.dist / point.constraints.fixedDistance.dist;
59
60 if (isOuterPoint) {
61 ratio = 1 / ratio;
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
62 point.setCoord([x * ratio , y * ratio]);
63 outerPoint.setCoord([x, y]);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
64 } else {
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
65 point.setCoord([x, y]);
66 outerPoint.setCoord([x * ratio, y * ratio]);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
67 }
68
69 point.updateLineEnds();
70 return true;
71 }
72
73 minutePoint = addMovablePoint({
74 coord: polar( minuteRadius, minuteStartAngle ),
75 constraints: {
76 fixedDistance: {
77 dist: minuteRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
78 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
79 snapPoints: 12
80 }
81 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
82 onMove: function(x, y) {
83 return movePartnerPoint({ x: x, y: y, point: this, outerPoint: outerMinutePoint, isOuterPoint: false });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
84 },
85 normalStyle: {
86 fill: ORANGE,
87 stroke: ORANGE
88 },
89 highlightStyle: {
90 fill: ORANGE,
91 stroke: ORANGE
92 }
93 });
94
95 outerMinutePoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
96 coord: polar(outerPointRadius, minuteStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
97 constraints: {
98 fixedDistance: {
99 dist: outerPointRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
100 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
101 snapPoints: 12
102 }
103 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
104 onMove: function(x, y) {
105 return movePartnerPoint({ x: x, y: y, point: minutePoint, outerPoint: this, isOuterPoint: true });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
106 },
107 normalStyle: {
108 fill: ORANGE,
109 stroke: ORANGE
110 },
111 highlightStyle: {
112 fill: ORANGE,
113 stroke: ORANGE
114 }
115 });
116
117 hourPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
118 coord: polar(hourRadius, hourStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
119 constraints: {
120 fixedDistance: {
121 dist: hourRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
122 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
123 snapPoints: hourSnapPoints
124 }
125 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
126 onMove: function(x, y) {
127 return movePartnerPoint({ x: x, y: y, point: this, outerPoint: outerHourPoint, isOuterPoint: false });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
128 },
129 normalStyle: {
130 fill: BLUE,
131 stroke: BLUE
132 },
133 highlightStyle: {
134 fill: BLUE,
135 stroke: BLUE
136 }
137 });
138
139 outerHourPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
140 coord: polar(outerPointRadius, hourStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
141 constraints: {
142 fixedDistance: {
143 dist: outerPointRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
144 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
145 snapPoints: hourSnapPoints
146 }
147 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
148 onMove: function(x, y) {
149 return movePartnerPoint({ x: x, y: y, point: hourPoint, outerPoint: this, isOuterPoint: true });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
150 },
151 normalStyle: {
152 fill: BLUE,
153 stroke: BLUE
154 },
155 highlightStyle: {
156 fill: BLUE,
157 stroke: BLUE
158 }
159 });
160
161 minuteHand = addMovableLineSegment({
162 pointA: minutePoint,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
163 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
164 fixed: true,
165 normalStyle: {
166 stroke: ORANGE,
167 "stroke-width": 10
168 }
169 });
170
171 hourHand = addMovableLineSegment({
172 pointA: hourPoint,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
173 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
174 fixed: true,
175 normalStyle: {
176 stroke: BLUE,
177 "stroke-width": 10
178 }
179 });
180
181 centerPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
182 coord: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
183 constraints: {
184 fixed: true
185 },
186 normalStyle: {
187 fill: "#fff",
188 stroke: "#000",
189 "stroke-width": 2
190 }
191 });
192
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
193 correctMinuteAngle = timeToDegrees(MINUTE);
194 correctHourAngle = timeToDegrees(5 * (HOUR + MINUTE / 60));
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
195
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
196 correctMinuteAngle = roundToNearest(minuteSnapDegrees, correctMinuteAngle);
197 correctHourAngle = roundToNearest(hourSnapDegrees, correctHourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
198 </div>
199 </div>
200
201 <div class="solution" data-type="custom">
202 <div class="instruction">
203 Drag the two hands so the clock reads <var>HOUR</var>:<var>NICE_MINUTE</var>.
204 </div>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
205 <div class="guess">[minutePoint.coord, hourPoint.coord]</div>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
206 <div class="validator-function">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
207 var minuteAngle = cartToPolar(guess[0])[1];
208 var hourAngle = cartToPolar(guess[1])[1];
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
209
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
210 minuteAngle = roundToNearest(minuteSnapDegrees, minuteAngle);
211 hourAngle = roundToNearest(hourSnapDegrees, hourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
212
213 // if hands have not been moved, return `""`
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
214 if (minuteAngle === minuteStartAngle &amp;&amp; hourAngle === hourStartAngle) {
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
215 return "";
216 }
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
217 if ((minuteAngle === correctHourAngle) &amp;&amp; (hourAngle === correctMinuteAngle)) {
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
218 return "Remember the hour hand is the short hand and the minute hand is the long hand";
219 }
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
220 else if ((minuteAngle === correctMinuteAngle) &amp;&amp; (hourAngle !== correctHourAngle)
221 &amp;&amp; (hourAngle === roundToNearest(hourSnapDegrees, timeToDegrees(5 * HOUR)))) {
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
222 return "Remember the hour hand needs to move over the course of the hour";
223 }
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
224 return (minuteAngle === correctMinuteAngle) &amp;&amp; (hourAngle === correctHourAngle);
225 </div>
226 <div class="show-guess">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
227 minutePoint.moveTo(guess[0][0], guess[0][1], true);
228 hourPoint.moveTo(guess[1][0], guess[1][1], true);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
229 </div>
230 </div>
231
232 <div class="hints">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
233 <p>
234 The <span class="hint_blue" style="font-weight: bold">hour</span> hand is the short
235 <span class="hint_blue" style="font-weight: bold">blue</span> bar and the
236 <span class="hint_orange" style="font-weight: bold">minute</span> hand is the long
237 <span class="hint_orange" style="font-weight: bold">orange</span> bar.
238 </p>
239
240 <p>
241 The number after the <code>\Large{:}</code> symbol represents the number of minutes past
242 the hour. So <code><var>TIME</var></code> represents <code><var>MINUTE</var></code>
243 minutes past hour <code><var>HOUR</var></code>.
244 </p>
245
246 <p>
247 First, let's set the <span class="hint_orange" style="font-weight: bold">minute</span> hand.
248 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
249
250 <div>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
251 <p>
252 Each long tick mark is an increment of 5 minutes, because
253 60 minutes / 12 tick marks = 5 minutes per tick mark.
254 </p>
255 <p>
256 Since we are <code><var>MINUTE</var></code> minutes past the hour,
257 <span data-if="MINUTE_IS_ZERO">
258 the minute hand should be at the mark numbered
259 <code class="hint_orange">12</code>, which is the first tick mark on the clock
260 and represents <code>0</code> minutes past the hour
261 </span><span data-else>
262 and there are 5 minutes per tick mark, the minute hand should be at the mark numbered
263 <code class="hint_orange"><var>fraction(MINUTE, 5)</var> = <var>MINUTE/5</var></code>
264 </span>.
265 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
266 </div>
267
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
268 <p>
269 Next, let's set the <span class="hint_blue" style="font-weight: bold">hour</span> hand.
270 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
271
272 <div>
273 <p>The 12 long tick marks correspond to the hours in the day (assuming AM/PM time).</p>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
274 <p>
275 If it is <code>0</code> minutes past the hour, the hour hand belongs directly on the
276 corresponding hour mark. But, over the hour, the hour hand must travel so it reaches
277 the next hour by the time the hour changes.
278 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
279 </div>
280
281 <div>
282 <p data-if="MINUTE_IS_ZERO">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
283 Since it's <code>0</code> minutes past the hour, the hour hand should be right on the
284 <code class="hint_blue"><var>HOUR</var></code> hour mark.
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
285 </p>
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
286 <div data-else data-unwrap>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
287 <p>
288 Since it's <code><var>MINUTE</var></code> minutes past the hour, the hour hand will have
289 traveled <code class="hint_blue"><var>fraction(MINUTE, 60)</var> =
290 <var>fraction(MINUTE, 60, false, true)</var></code> of the way to the
291 <code><span data-if="HOUR + 1 ===13">1</span><span data-else><var>HOUR + 1</var></span>
292 </code> hour mark.
293 </p>
294 <p>
295 So the hour hand needs to be placed
296 <span data-if="MINUTE === 20">just before the second
297 </span><span data-else-if="MINUTE === 40">just past the third
298 </span><span data-else-if="MINUTE === 15">just past the first
299 </span><span data-else-if="MINUTE === 30">between the second and third
300 </span><span data-else>just before the fourth </span>
301 small tick mark past the <code class="hint_blue"><var>HOUR</var></code> hour mark.
302 </p>
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
303 </div>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
304 </div>
305
306 <div class="graphie" data-update="clock">
307 var minuteRadius = minutePoint.constraints.fixedDistance.dist;
308 var hourRadius = hourPoint.constraints.fixedDistance.dist;
309
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
310 var minuteCoord = polar(minuteRadius, correctMinuteAngle);
311 var hourCoord = polar(hourRadius, correctHourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
312
313 var dotOpacity = 0.4;
314 var handOpacity = 0.3;
315
316 addMovableLineSegment({
317 coordA: minuteCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
318 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
319 fixed: true,
320 normalStyle: {
321 stroke: ORANGE,
322 "stroke-width": 10,
323 "stroke-dasharray": ".",
324 "stroke-linecap": "round",
325 "stroke-opacity": dotOpacity
326 },
327 });
328
329 addMovableLineSegment({
330 coordA: minuteCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
331 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
332 fixed: true,
333 normalStyle: {
334 stroke: ORANGE,
335 "stroke-width": 10,
336 "stroke-linecap": "round",
337 "stroke-opacity": handOpacity
338 },
339 });
340
341 addMovableLineSegment({
342 coordA: hourCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
343 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
344 fixed: true,
345 normalStyle: {
346 stroke: BLUE,
347 "stroke-width": 10,
348 "stroke-dasharray": ".",
349 "stroke-linecap": "round",
350 "stroke-opacity": dotOpacity
351 },
352 });
353
354 addMovableLineSegment({
355 coordA: hourCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
356 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
357 fixed: true,
358 normalStyle: {
359 stroke: BLUE,
360 "stroke-width": 10,
361 "stroke-linecap": "round",
362 "stroke-opacity": handOpacity
363 },
364 });
365
366 // for some reason this doesn't work, so for now, create another center point
367 // centerPoint.toFront();
368 addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
369 coord: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
370 constraints: {
371 fixed: true
372 },
373 normalStyle: {
374 fill: "#fff",
375 stroke: "#000",
376 "stroke-dasharray": "",
377 "stroke-width": 2,
378 "stroke-opacity": 1
379 }
380 });
381 </div>
382
383 </div>
384 </div>
385
386 <div id="set-hands-20-minutes" data-type="set-hands" data-weight="2">
387 <div class="vars">
388 <var id="MINUTE_INCREMENT">20</var>
389 </div>
390 </div>
391
392 <div id="set-hands-30-minutes" data-type="set-hands" data-weight="2">
393 <div class="vars">
394 <var id="MINUTE_INCREMENT">30</var>
395 </div>
396 </div>
397 </div>
398 </div>
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
399 </body>
65eec09 @spicyj Content-Type meta tag for libxml2 compatibility
spicyj authored
400 </html>
Something went wrong with that request. Please try again.