@@ -12,6 +12,10 @@ const COLORMAPS = [
12
12
13
13
var prices ;
14
14
var since ;
15
+ const SCALES = [ 25 , 33 , 50 , 67 , 75 , 80 , 90 , 100 , 110 , 125 , 150 , 175 , 200 , 250 , 300 , 400 , 500 ] ;
16
+ var scaleIndex = 7 ;
17
+ var scaleSpanClearTimeout ;
18
+ var scrollBarWidth ;
15
19
16
20
function onLoad ( ) {
17
21
var xobj = new XMLHttpRequest ( ) ;
@@ -33,112 +37,113 @@ function init() {
33
37
if ( localStorage . getItem ( "palette" ) === null ) {
34
38
localStorage . palette = 7 ;
35
39
}
40
+ var wrapperDiv = document . getElementById ( 'wrapper' ) ;
41
+ scrollBarWidth = wrapperDiv . offsetWidth - wrapperDiv . clientWidth ;
42
+
43
+ var backgroundDiv = document . getElementById ( 'background' ) ;
44
+ backgroundDiv . style . height = 'calc(100vh - ' + ( scrollBarWidth + 16 ) + 'px)' ;
45
+ backgroundDiv . style . width = 'calc(100vw - ' + ( scrollBarWidth + 16 ) + 'px)' ;
46
+
47
+ createLabels ( ) ;
48
+ setScale ( ) ;
36
49
drawIndex ( ) ;
37
50
drawHodl ( ) ;
38
- createLabels ( ) ;
39
51
}
40
52
41
53
function drawIndex ( ) {
42
- var gradientCanvas = document . getElementById ( 'gradient ' ) ;
43
- var gradientContext = gradientCanvas . getContext ( '2d' ) ;
54
+ var colorMapCanvas = document . getElementById ( 'colormap ' ) ;
55
+ var colorMapContext = colorMapCanvas . getContext ( '2d' ) ;
44
56
45
- gradientContext . fillStyle = createIndexGradient ( gradientContext ) ;
46
- gradientContext . fillRect ( 0 , 0 , 25 , 401 ) ;
57
+ colorMapContext . fillStyle = createColorMap ( colorMapContext ) ;
58
+ colorMapContext . fillRect ( 0 , 0 , 25 , 401 ) ;
47
59
48
- gradientCanvas . style . display = 'block' ;
60
+ colorMapCanvas . style . display = 'block' ;
49
61
}
50
62
51
- function createIndexGradient ( indexContext ) {
52
- var indexGradient = indexContext . createLinearGradient ( 0 , 0 , 0 , 400 ) ;
53
- var stop = 0 ;
54
- for ( var color of COLORMAPS [ localStorage . palette ] ) {
55
- indexGradient . addColorStop ( stop , color ) ;
56
- stop += 0.1 ;
63
+ function createColorMap ( colorMapContext ) {
64
+ var colorMapGradient = colorMapContext . createLinearGradient ( 0 , 0 , 0 , 400 ) ;
65
+ var step = 0 ;
66
+ var colorMap = COLORMAPS [ localStorage . palette ] ;
67
+ for ( var color of colorMap ) {
68
+ colorMapGradient . addColorStop ( step / ( colorMap . length - 1 ) , color ) ;
69
+ step ++ ;
57
70
}
58
- return indexGradient ;
71
+ return colorMapGradient ;
59
72
}
60
73
61
74
function drawHodl ( ) {
62
- var size = prices . length ;
75
+ var size = prices . length - 1 ;
63
76
64
77
var borderDiv = document . getElementById ( 'border' ) ;
65
- borderDiv . style . width = ( size + 7 ) + 'px' ;
78
+ borderDiv . style . width = ( size + 8 ) + 'px' ;
66
79
borderDiv . style . height = ( size + 8 ) + 'px' ;
67
80
81
+ var backgroundColor = COLORMAPS [ localStorage . palette ] [ 5 ] ;
82
+
68
83
var hodlCanvas = document . getElementById ( 'hodl' ) ;
69
- hodlCanvas . width = size - 1 ;
84
+ hodlCanvas . style . backgroundColor = backgroundColor ;
85
+ hodlCanvas . style . display = 'block' ;
86
+ hodlCanvas . width = size ;
70
87
hodlCanvas . height = size ;
71
88
72
89
var hodlContext = hodlCanvas . getContext ( '2d' ) ;
73
90
drawPixels ( hodlContext ) ;
74
- drawDots ( hodlContext ) ;
75
91
76
- hodlCanvas . style . backgroundColor = COLORMAPS [ localStorage . palette ] [ 5 ] ;
77
- hodlCanvas . style . display = 'block' ;
92
+ var backgroundDiv = document . getElementById ( 'background' ) ;
93
+ backgroundDiv . style . backgroundColor = backgroundColor ;
78
94
79
95
var aboutDiv = document . getElementById ( 'about' ) ;
80
96
aboutDiv . style . display = 'block' ;
81
97
}
82
98
83
99
function drawPixels ( hodlContext ) {
84
- var size = prices . length ;
85
- var colors = getColorLookup ( ) ;
100
+ var size = prices . length - 1 ;
101
+ var colorMap = getColorMap ( ) ;
86
102
87
- var imageData = hodlContext . createImageData ( size - 1 , size ) ;
103
+ var imageData = hodlContext . createImageData ( size , size ) ;
88
104
var buffer = new ArrayBuffer ( imageData . data . length ) ;
89
- var pixelMap = new Uint32Array ( buffer ) ;
90
- var y = size - 1 ;
105
+ var pixels = new Uint32Array ( buffer ) ;
106
+ var y = 0 ;
91
107
for ( var selldate = 1 ; selldate <= size ; selldate ++ ) {
92
108
for ( var buydate = 0 ; buydate < selldate ; buydate ++ ) {
93
109
var profit = getProfit ( buydate , selldate ) ;
94
- pixelMap [ y + buydate ] = colors [ getColorIndex ( profit ) ] ;
110
+ pixels [ y + buydate ] = colorMap [ getColorIndex ( profit ) ] ;
95
111
}
96
- y += size - 1 ;
112
+ y += size ;
97
113
}
98
114
99
115
imageData . data . set ( new Uint8ClampedArray ( buffer ) ) ;
100
116
hodlContext . putImageData ( imageData , 0 , 0 ) ;
101
117
}
102
118
103
- function drawDots ( hodlContext ) {
104
- var size = prices . length ;
105
- for ( var i = 0 ; i < size ; i ++ ) {
119
+ function createLabels ( ) {
120
+ var labelsDiv = document . getElementById ( 'labels' ) ;
121
+ for ( var i = 0 ; i < prices . length ; i ++ ) {
106
122
var date = getIndexDate ( i ) ;
107
123
if ( date . getDate ( ) == 1 ) {
108
124
if ( date . getMonth ( ) == 0 ) {
109
- hodlContext . moveTo ( i + 0.5 , i + 0.5 ) ;
110
- hodlContext . lineTo ( i + 3.5 , i - 2.5 ) ;
111
- hodlContext . stroke ( ) ;
112
- } else {
113
- hodlContext . moveTo ( i + 0.5 , i + 0.5 ) ;
114
- hodlContext . lineTo ( i + 1.5 , i - 0.5 ) ;
115
- hodlContext . stroke ( ) ;
125
+ var labelDiv = document . createElement ( 'div' ) ;
126
+ labelDiv . id = 'y' + date . getFullYear ( ) ;
127
+ labelDiv . classList . add ( 'label' ) ;
128
+ labelDiv . innerHTML = date . getFullYear ( ) ;
129
+
130
+ labelsDiv . appendChild ( labelDiv ) ;
116
131
}
132
+ var labelImg = document . createElement ( 'img' ) ;
133
+ labelImg . id = 'y' + date . getFullYear ( ) + 'm' + date . getMonth ( ) ;
134
+ labelImg . classList . add ( 'dot' ) ;
135
+ if ( date . getMonth ( ) == 0 ) {
136
+ labelImg . classList . add ( 'line' ) ;
137
+ }
138
+ labelsDiv . appendChild ( labelImg ) ;
117
139
}
118
140
}
119
141
}
120
142
121
- function createLabels ( ) {
122
- var yearsDiv = document . getElementById ( 'years' ) ;
123
- for ( var i = 0 ; i < prices . length ; i ++ ) {
124
- var date = getIndexDate ( i ) ;
125
- if ( date . getDate ( ) == 1 && date . getMonth ( ) == 0 ) {
126
-
127
- var div = document . createElement ( 'div' ) ;
128
- div . classList . add ( 'year' ) ;
129
- div . style . top = ( i - 15 ) + 'px' ;
130
- div . style . left = ( i + 15 ) + 'px' ;
131
- div . innerHTML = date . getFullYear ( ) ;
132
-
133
- yearsDiv . appendChild ( div ) ;
134
- }
135
- }
136
- }
137
-
138
- function getColorLookup ( ) {
139
- var gradientCanvas = document . getElementById ( 'gradient' ) ;
140
- var gradientContext = gradientCanvas . getContext ( '2d' ) ;
141
- imageData = gradientContext . getImageData ( 0 , 0 , 1 , 400 ) ;
143
+ function getColorMap ( ) {
144
+ var colorMapCanvas = document . getElementById ( 'colormap' ) ;
145
+ var colorMapContext = colorMapCanvas . getContext ( '2d' ) ;
146
+ imageData = colorMapContext . getImageData ( 0 , 0 , 1 , 400 ) ;
142
147
return new Uint32Array ( imageData . data . buffer ) ;
143
148
}
144
149
@@ -157,15 +162,15 @@ function onMouseMove(event) {
157
162
var hodlCanvas = document . getElementById ( 'hodl' ) ;
158
163
var tipDiv = document . getElementById ( 'tip' ) ;
159
164
var markerCanvas = document . getElementById ( 'marker' ) ;
160
- var size = prices . length ;
165
+ var size = prices . length - 1 ;
161
166
if ( event . offsetX >= 0 && event . offsetX < size &&
162
167
event . offsetY >= 0 && event . offsetY < size &&
163
- event . offsetX < event . offsetY ) {
168
+ event . offsetX <= event . offsetY ) {
164
169
165
170
hodlCanvas . style . cursor = 'crosshair' ;
166
171
167
172
var buy = event . offsetX ;
168
- var sell = event . offsetY ;
173
+ var sell = event . offsetY + 1 ;
169
174
var buyDate = formatEpoch ( buy ) ;
170
175
var buyPrice = formatPrice ( buy ) ;
171
176
var sellDate = formatEpoch ( sell ) ;
@@ -271,3 +276,60 @@ function onChangePaletteClick(event) {
271
276
drawHodl ( ) ;
272
277
event . preventDefault ( ) ;
273
278
}
279
+
280
+ function onZoomInClick ( event ) {
281
+ if ( scaleIndex < SCALES . length - 1 ) {
282
+ scaleIndex ++ ;
283
+ setScale ( ) ;
284
+ }
285
+ setScaleSpan ( ) ;
286
+ event . preventDefault ( ) ;
287
+ }
288
+
289
+ function onZoomOutClick ( event ) {
290
+ if ( scaleIndex > 0 ) {
291
+ scaleIndex -- ;
292
+ setScale ( ) ;
293
+ }
294
+ setScaleSpan ( ) ;
295
+ event . preventDefault ( ) ;
296
+ }
297
+
298
+ function setScale ( ) {
299
+ var scale = SCALES [ scaleIndex ] ;
300
+ var scaleFraction = scale / 100 ;
301
+
302
+ var hodlCanvas = document . getElementById ( 'hodl' ) ;
303
+ hodlCanvas . style . transform = `scale(${ scaleFraction } )` ;
304
+
305
+ var size = prices . length * scaleFraction ;
306
+
307
+ var borderDiv = document . getElementById ( 'border' ) ;
308
+ borderDiv . style . width = ( size + 7 ) + 'px' ;
309
+ borderDiv . style . height = ( size + 8 ) + 'px' ;
310
+
311
+ for ( var i = 0 ; i < prices . length ; i ++ ) {
312
+ var date = getIndexDate ( i ) ;
313
+ if ( date . getDate ( ) == 1 ) {
314
+ if ( date . getMonth ( ) == 0 ) {
315
+ var div = document . getElementById ( 'y' + date . getFullYear ( ) ) ;
316
+ div . style . top = ( ( i * scaleFraction ) - 14 ) + 'px' ;
317
+ div . style . left = ( ( i * scaleFraction ) + 13 ) + 'px' ;
318
+ }
319
+ var img = document . getElementById ( 'y' + date . getFullYear ( ) + 'm' + date . getMonth ( ) ) ;
320
+ img . style . top = ( ( i * scaleFraction ) + 4 ) + 'px' ;
321
+ img . style . left = ( ( i * scaleFraction ) + 8 ) + 'px' ;
322
+ }
323
+ }
324
+ }
325
+
326
+ function setScaleSpan ( ) {
327
+ var scale = SCALES [ scaleIndex ] ;
328
+ var scaleSpan = document . getElementById ( 'scale' ) ;
329
+ var scalePadSpan = document . getElementById ( 'scale-pad' ) ;
330
+ scaleSpan . innerHTML = scale + '%' ;
331
+ scalePadSpan . innerHTML = ' ' + ( scaleIndex > 6 ? ' ' : '' ) ;
332
+
333
+ clearTimeout ( scaleSpanClearTimeout ) ;
334
+ scaleSpanClearTimeout = setTimeout ( function ( ) { scaleSpan . innerHTML = '' ; scalePadSpan . innerHTML = '' ; } , 2000 ) ;
335
+ }
0 commit comments