|
2 | 2 | <html>
|
3 | 3 | <head>
|
4 | 4 | <title>S&P Viewer</title>
|
5 |
| - <script type="text/javascript" src="sp.json"></script> |
6 |
| - <script type="text/javascript"> |
7 |
| - var topPad = 50; |
8 |
| - |
9 |
| - var width, height, data, canvas, ctx; |
10 |
| - var startMonth, endMonth, min, max; |
11 |
| - |
12 |
| - function $(id) { return document.getElementById(id);} |
13 |
| - Number.prototype.formatMoney = function(c, d, t){ |
14 |
| - var n = this, |
15 |
| - c = isNaN(c = Math.abs(c)) ? 2 : c, |
16 |
| - d = d == undefined ? "." : d, |
17 |
| - t = t == undefined ? "," : t, |
18 |
| - s = n < 0 ? "-" : "", |
19 |
| - i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", |
20 |
| - j = (j = i.length) > 3 ? j % 3 : 0; |
21 |
| - return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); |
22 |
| - }; |
23 |
| - |
24 |
| - function loadCanvas(){ |
25 |
| - canvas = $('graph'); |
26 |
| - width = canvas.width; |
27 |
| - height = canvas.height; |
28 |
| - if (canvas.getContext){ |
29 |
| - ctx = canvas.getContext('2d'); |
30 |
| - |
31 |
| - canvas.addEventListener('mousewheel',function(event){ |
32 |
| - zoom(event); |
33 |
| - return false; |
34 |
| - }, false); |
35 |
| - |
36 |
| - data = spData["data"]; |
37 |
| - startMonth = 1200; |
38 |
| - endMonth = data.length; |
39 |
| - draw(); |
40 |
| - } |
41 |
| - } |
42 |
| - |
43 |
| - function zoom(event) { |
44 |
| - var deltaFactor = (event.deltaMode == WheelEvent.DOM_DELTA_LINE) ? 20 : 1; |
45 |
| - var delta = event.deltaY * deltaFactor; |
46 |
| - var mouseX = event.clientX - canvas.offsetLeft; |
47 |
| - |
48 |
| - var span = endMonth-startMonth; |
49 |
| - var centerMonth = startMonth + mouseX/(width/span); |
50 |
| - var factor = 1 + delta * 0.0002; |
51 |
| - endMonth = Math.round(factor*endMonth - centerMonth*(factor - 1)); |
52 |
| - startMonth = Math.round(factor*startMonth + centerMonth*(1 - factor)); |
53 |
| - |
54 |
| - startMonth = Math.max(startMonth,0); |
55 |
| - endMonth = Math.min(Math.max(endMonth,startMonth+10), data.length); |
56 |
| - draw(); |
57 |
| - } |
58 |
| - |
59 |
| - function updateStats() { |
60 |
| - var totalGrowth = data[endMonth-1]/data[startMonth]; |
61 |
| - var avgGrowth = Math.pow(totalGrowth,(12/(endMonth-startMonth)))-1; |
62 |
| - var doubled = Math.log(totalGrowth)/Math.log(2); |
63 |
| - // console.log([data[startMonth],data[endMonth],endMonth,totalGrowth]); |
64 |
| - $('stat-growth').innerHTML = String((avgGrowth*100).toFixed(2)) + '%'; |
65 |
| - $('stat-total').innerHTML = "$" + totalGrowth.formatMoney(2,'.',','); |
66 |
| - $('stat-doubled').innerHTML = String(doubled.toFixed(2)); |
67 |
| - } |
68 |
| - |
69 |
| - function dataRange(data, startMonth, endMonth) { |
70 |
| - min = Infinity; |
71 |
| - max = 0.0; |
72 |
| - for (var i = startMonth; i < endMonth; i++) { |
73 |
| - if(data[i]>max) max = data[i]; |
74 |
| - if(data[i]<min) min = data[i]; |
75 |
| - }; |
76 |
| - } |
77 |
| - |
78 |
| - function draw() { |
79 |
| - drawData(ctx, data, startMonth, endMonth); |
80 |
| - |
81 |
| - var startYear = Math.round(spData["start"] + (startMonth/12)); |
82 |
| - var endYear = Math.round(spData["start"] + (endMonth/12)); |
83 |
| - ctx.font = "20pt sans-serif"; |
84 |
| - ctx.fillText(String(startYear) + " - " + String(endYear),10,30); |
85 |
| - |
86 |
| - updateStats(); |
87 |
| - } |
88 |
| - |
89 |
| - function drawData(ctx, data, startMonth, endMonth){ |
90 |
| - dataRange(data, startMonth, endMonth); |
91 |
| - var span = endMonth-startMonth; |
92 |
| - var dx = (width/span); |
93 |
| - var jump = Math.ceil(span/width); |
94 |
| - |
95 |
| - ctx.clearRect(0,0,width, height); |
96 |
| - |
97 |
| - // Year lines |
98 |
| - var minSpace = 20; |
99 |
| - var alpha = Math.min((dx*12)/minSpace*0.7,0.7); |
100 |
| - if (alpha < 0.3) alpha = 0.0; |
101 |
| - ctx.strokeStyle = "rgba(202,226,255,"+alpha+")"; |
102 |
| - ctx.lineWidth = 1; |
103 |
| - |
104 |
| - ctx.beginPath(); |
105 |
| - for (var i = startMonth; i < endMonth; i++) { |
106 |
| - if (i % 12 == 0) { |
107 |
| - var x = (i-startMonth)*dx; |
108 |
| - ctx.moveTo(x,0); |
109 |
| - ctx.lineTo(x,height); |
110 |
| - } |
111 |
| - }; |
112 |
| - ctx.stroke(); |
113 |
| - |
114 |
| - // Graph |
115 |
| - ctx.strokeStyle = "rgb(74,144,226)"; |
116 |
| - ctx.lineWidth = 4; |
117 |
| - ctx.lineJoin = "round"; |
118 |
| - |
119 |
| - ctx.beginPath(); |
120 |
| - ctx.moveTo(0,height); |
121 |
| - for (var i = startMonth; i < endMonth; i+=jump) { |
122 |
| - var y = (data[i]-min)/(max-min)*(height-topPad); |
123 |
| - var x = (i-startMonth)*dx; |
124 |
| - ctx.lineTo(x,height - y); |
125 |
| - }; |
126 |
| - ctx.stroke(); |
127 |
| - } |
128 |
| - </script> |
| 5 | + <script type="text/javascript" src="datasets/shiller_absolute.json"></script> |
| 6 | + <script type="text/javascript" src="js/lib.js"></script> |
| 7 | + <script type="text/javascript" src="js/viewer.js"></script> |
| 8 | + <script type="text/javascript" src="js/main.js"></script> |
129 | 9 | <style type="text/css">
|
130 | 10 | body {
|
131 | 11 | font-family: sans-serif;
|
|
162 | 42 | }
|
163 | 43 | </style>
|
164 | 44 | </head>
|
165 |
| -<body onload="loadCanvas();"> |
| 45 | +<body onload="load();"> |
166 | 46 | <h1>S&P 500 Index</h1>
|
167 | 47 | <div id="widget">
|
168 |
| - <canvas id="graph" width="500" height="200"></canvas> |
| 48 | + <canvas id="graph" width="500" height="250"></canvas> |
169 | 49 | <div id="stats">
|
170 |
| - <strong>Average Growth</strong><br> |
171 |
| - <div class="num" id="stat-growth"></div><br> |
172 |
| - <strong>One Dollar Becomes</strong><br> |
173 |
| - <div class="num" id="stat-total"></div><br> |
174 |
| - <strong>Times Doubled</strong><br> |
175 |
| - <div class="num" id="stat-doubled"></div><br> |
176 | 50 | </div>
|
177 | 51 | <div class="sep"></div>
|
178 | 52 | </div>
|
179 |
| - <p><strong>Note:</strong> Scroll to zoom and move around. Better date entry coming soon.</p> |
| 53 | + <div id="datasets"> |
| 54 | + <strong>Data Set: </strong> |
| 55 | + <select name="datasets" id="dataset-chooser" onchange="setChooserChanged()"> |
| 56 | + </select> |
| 57 | + </div> |
| 58 | + |
| 59 | + |
| 60 | + <h3>Note:</h3> |
| 61 | + <p>Scroll to zoom and move around. Better date entry coming soon.</p> |
180 | 62 | </body>
|
181 | 63 | </html>
|
0 commit comments