Blame view

web/view/home.html.jinja2 21.5 KB
9390ec89   Goutte   Initial experimen...
1
2
3
4
{% extends 'layout.html.jinja2' %}
{% set menu_section = 'home' %}
{% block title %}Home{% endblock %}

4900d232   Goutte   Add the time inte...
5
6
7
{# This is the main template file, along with the layout. #}
{# The engine is Jinja2, close to Twig (yet not as good) #}

9390ec89   Goutte   Initial experimen...
8
9
{% block content %}

4cf497e0   Goutte   Make the targets ...
10
{% macro target_button(target) -%}
80352490   Goutte   Multi model suppo...
11
12
13
    <div class="target {{ target.slug }} {{ 'locked' if target.locked else 'active' }}"
         data-target-slug="{{ target.slug }}">
      <img width="64px" height="64px"
d1c44c51   Goutte   Enable Earth
14
           src="{{ static('img/target/'~target.slug~'_256.png') }}"
80352490   Goutte   Multi model suppo...
15
16
17
18
           title="{{ target.title }}"
           alt="{{ target.name }}">
      <img width="64px" height="64px"
           src="{{ static('img/target/empty_128.png') }}"
60b73eb1   Goutte   Change temperatur...
19
20
           title="No data at specified interval for {{ target.title }}."
           alt="NO DATA"
80352490   Goutte   Multi model suppo...
21
           class="decorator empty">
60b73eb1   Goutte   Change temperatur...
22
23
24
25
26
      <img width="64px" height="64px"
           src="{{ static('img/target/error_128.png') }}"
           title="There was an error with {{ target.title }}."
           alt="ERROR"
           class="decorator error">
80352490   Goutte   Multi model suppo...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
      <div class="decorator loading" title="Loading data for {{ target.title }}…">
        <div class="small-loader-container">
          <div class="small-loader-circle-1">
            <div class="small-loader-circle-2">
              <div class="small-loader-circle-3">
                <div class="small-loader-circle-4">
                  <div class="small-loader-circle-5">
                    <div class="small-loader-circle-6">
                      <div class="small-loader-circle-7">
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
4cf497e0   Goutte   Make the targets ...
46
47
{%- endmacro %}

23110c4a   Goutte   Add icons to the ...
48
{% macro icon(name) %}<i class="fa fa-{{ name }}" aria-hidden="true"></i>{% endmacro %}
9c0c4509   Goutte   Add a loader to t...
49
50
51
52
53
54
55
56
57
58

<div id="plots_loader">
  <p class="loader-text">Loading Heliopropa&hellip;<br>This might take a while.</p>
  <div id="plots_loader_img1" class="img"></div>
  <div id="plots_loader_img2" class="img"></div>
  <div id="plots_loader_img3" class="img"></div>
  <div id="plots_loader_img4" class="img"></div>
  <div id="plots_loader_img5" class="img"></div>
</div>

f6ed8d85   Goutte   Rework layout as ...
59
60
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer">

f6ed8d85   Goutte   Rework layout as ...
61
  <div class="mdl-layout__drawer">
297a7dfc   Goutte   Add support for i...
62

23110c4a   Goutte   Add icons to the ...
63
    <span class="mdl-layout-title" title="Two years maximum.">{{ icon('calendar') }} Time Interval</span>
297a7dfc   Goutte   Add support for i...
64

1754789b   Goutte   Decorate and clea...
65
66
67
68
69
    <form id="form_time_interval" action="#">
      <div class="mdl-textfield mdl-js-textfield">
      <input type="date" id="started_at" name="started_at" title="The date of the beginning of the interval to observe." class="mdl-textfield__input">
      <input type="date" id="stopped_at" name="stopped_at" title="The date of the end of the interval to observe. (exclusive)" class="mdl-textfield__input">
      </div>
23110c4a   Goutte   Add icons to the ...
70
      <input type="submit" id="apply_new_interval" value="Load new interval" title="Two years maximum. This may take a while." class="mdl-button mdl-js-button mdl-js-ripple-effect">
1754789b   Goutte   Decorate and clea...
71
72
73
74
    </form>

    <br>
    <hr class="clear">
4900d232   Goutte   Add the time inte...
75

23110c4a   Goutte   Add icons to the ...
76
    <span class="mdl-layout-title">{{ icon('eercast') }} Planets</span>
f6ed8d85   Goutte   Rework layout as ...
77

4900d232   Goutte   Add the time inte...
78
    <section class="targets-filters">
4cf497e0   Goutte   Make the targets ...
79
80
{% for target in planets %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
81
{% endfor %}
c42fea3a   Goutte   Rework the CSS wi...
82
    </section>
a79c5268   Goutte   Add probes and co...
83
84
85
86

    <br>
    <hr class="clear">

23110c4a   Goutte   Add icons to the ...
87
    <span class="mdl-layout-title">{{ icon('rocket') }} Probes &amp; Comets</span>
a79c5268   Goutte   Add probes and co...
88

4900d232   Goutte   Add the time inte...
89
    <section class="targets-filters">
4cf497e0   Goutte   Make the targets ...
90
91
{% for target in probes %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
92
{% endfor %}
4cf497e0   Goutte   Make the targets ...
93
94
{% for target in comets %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
95
96
97
{% endfor %}
    </section>

b550c2b0   Goutte   Rework the home s...
98
    <br>
c42fea3a   Goutte   Rework the CSS wi...
99
    <hr class="clear">
b550c2b0   Goutte   Rework the home s...
100

297a7dfc   Goutte   Add support for i...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{#    <span class="mdl-layout-title">{{ icon('database') }} Inputs</span>#}
{##}
{#    <section class="section-drawer">#}
{#{% for input in config.inputs %}#}
{#      <label class="mdl-radio mdl-js-radio mdl-js-ripple-effect" for="option-input-{{ input.slug }}" title="{{ input.desc }}">#}
{#        <input type="radio" id="option-input-{{ input.slug }}" class="mdl-radio__button" name="input_slug" value="{{ input.slug }}" {{ 'checked' if input.slug == input_slug }}>#}
{#        <span class="mdl-radio__label">{{ input.name }}</span>#}
{#      </label>#}
{#      <br />#}
{#{% endfor %}#}
{#      <br />#}
{#      <input type="button" id="apply_new_input" value="Reload for input" title="This may take a while." class="mdl-button mdl-js-button mdl-js-ripple-effect">#}
{#    </section>#}
{##}
{#    <hr class="clear">#}

23110c4a   Goutte   Add icons to the ...
117
    <span class="mdl-layout-title">{{ icon('flask') }} Parameters</span>
b550c2b0   Goutte   Rework the home s...
118
119

    <nav id="parameters" class="mdl-navigation">
bde97e4d   Goutte   Add more changes ...
120
121
122
      {% for p in parameters %}
      <a class="mdl-navigation__link parameter{{ ' active' if p.active }}" data-ts-slug="{{ p.slug }}" href="#">{{ p.name }}</a>
      {% endfor %}
b550c2b0   Goutte   Rework the home s...
123
124
    </nav>

a4a9ef03   Goutte   Cache generated C...
125
126
    <div class="mdl-layout-spacer"></div>

c42fea3a   Goutte   Rework the CSS wi...
127
  </div>
80352490   Goutte   Multi model suppo...
128
129


b7fe650c   Goutte   Misc bundle of ol...
130
  <main id="plots_wrapper" class="mdl-layout__content">
9390ec89   Goutte   Initial experimen...
131

b550c2b0   Goutte   Rework the home s...
132
    <div class="mdl-grid">
80352490   Goutte   Multi model suppo...
133
      <div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-cell--4-col-phone">
b550c2b0   Goutte   Rework the home s...
134
        <section id="orbits"></section>
cad44b6d   Goutte   Finish adding the...
135
        <div class="plots-actions plots-buttons">
3c2b15fc   Goutte   Make the Y-Axis o...
136
137
138
139
140
141
142
143
144
145
          <button id="zoom_inner_heliosphere" class="mdl-button mdl-button--raised mdl-button--primary"
                  title="Zoom to the inner heliosphere.">
            Zoom in
          </button>
          <button id="zoom_outer_heliosphere" class="mdl-button mdl-button--raised mdl-button--primary"
                  title="Zoom to the outer heliosphere.">
            Zoom out
          </button>
        </div>
        <div class="plots-actions plots-buttons">
cad44b6d   Goutte   Finish adding the...
146
          <button id="download" class="mdl-button mdl-button--raised mdl-button--primary"
dc0be992   Goutte   Support having no...
147
                  title="Download the raw data for each selected target and parameters.">
cad44b6d   Goutte   Finish adding the...
148
149
150
151
152
153
154
            Download
          </button>
          <button id="samp" class="samp mdl-button mdl-button--raised mdl-button--primary mdl-button--disabled"
                  title="Send the data to a connected SAMP hub.">
            SAMP
          </button>
        </div>
b550c2b0   Goutte   Rework the home s...
155
      </div>
80352490   Goutte   Multi model suppo...
156
      <div class="mdl-cell mdl-cell--8-col mdl-cell--8-col-tablet mdl-cell--4-col-phone">
9c0c4509   Goutte   Add a loader to t...
157
158
159
        <section id="time_series">
          <p id="zoom_controls_help" class="help mdl-cell--8-col">Drag to zoom in, double click to zoom out.</p>
        </section>
b550c2b0   Goutte   Rework the home s...
160
161
162
      </div>
    </div>

f6ed8d85   Goutte   Rework layout as ...
163
164
  </main>
</div>
9390ec89   Goutte   Initial experimen...
165
166
167
{% endblock %}


80352490   Goutte   Multi model suppo...
168
{#### CSS ####################################################################}
7d6dee0f   Goutte   Continue refacto ...
169

9390ec89   Goutte   Initial experimen...
170
171
{% block styles %}
  <style>
c42fea3a   Goutte   Rework the CSS wi...
172
    html, body {
f6ed8d85   Goutte   Rework layout as ...
173
174
{#      background-color: #322e3f;#}
{#      color: #e3e3e3;#}
c42fea3a   Goutte   Rework the CSS wi...
175
    }
23110c4a   Goutte   Add icons to the ...
176
177
    .mdl-layout__drawer > .mdl-layout-title {
      padding-left: 30px;
b500e561   Goutte   Invert the orbits...
178
179
180
181
      line-height: 42px;
    }
    .mdl-layout__drawer > .mdl-layout-title:first-of-type {
      line-height: 60px;
23110c4a   Goutte   Add icons to the ...
182
183
    }

9c0c4509   Goutte   Add a loader to t...
184
185
186
    #plots_wrapper {
{#      position: relative;#}
    }
80352490   Goutte   Multi model suppo...
187

9c0c4509   Goutte   Add a loader to t...
188
    #plots_loader {
6b149919   Goutte   Add a Download bu...
189
      position: fixed;
9c0c4509   Goutte   Add a loader to t...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
      top: 0; left: 0; bottom: 0; right: 0;
      height: 100%;
      width: 100%;
      background-color: #fff;
      z-index: 1000;
    }

    #plots_loader .loader-text {
      width: 200px;
      height: 30px;
      position: absolute;
      top: -240px; left: -32px; bottom: 0; right: 0;
      margin: auto;
      text-align: center;
      font-size: 1.0em;
      font-style: italic;
      color: darkgrey;
    }

    #plots_loader .img {
      width: 100px;
      height: 100px;
      border-radius: 100%;
      position: absolute;
      border: 1px solid #6978ff;
80352490   Goutte   Multi model suppo...
215
      animation: keyframes_rotate 1s;
9c0c4509   Goutte   Add a loader to t...
216
217
218
219
220
221
222
223
224
225
226
      animation-iteration-count: infinite;
      transition: 2s;
      border-bottom: none;
      border-right: none;
      animation-timing-function: linear;
      margin-left: -70px;
      margin-top: -70px;
      left: 50%;
      top: 50%;
    }

80352490   Goutte   Multi model suppo...
227
    @keyframes keyframes_rotate {
9c0c4509   Goutte   Add a loader to t...
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
      from {
        transform: rotate(0deg);
      }
      50% {
        transform: rotate(180deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }

    #plots_loader #plots_loader_img2 {
      width: 90px;
      height: 90px;
      left: 50.35%;
      top: 50.7%;
      animation-delay: .2s;
    }

    #plots_loader #plots_loader_img3 {
      width: 80px;
      height: 80px;
      left: 50.70%;
      top: 51.4%;
      animation-delay: .4s;
    }

    #plots_loader #plots_loader_img4 {
      width: 70px;
      height: 70px;
      left: 51.05%;
      top: 52.1%;
      animation-delay: .6s;
    }

    #plots_loader #plots_loader_img5 {
      width: 60px;
      height: 60px;
      left: 51.40%;
      top: 52.8%;
      animation-delay: .8s;
    }

cad44b6d   Goutte   Finish adding the...
271
272
    .plots-buttons {
      text-align: center;
6b149919   Goutte   Add a Download bu...
273
274
      margin: 3em auto;
    }
cad44b6d   Goutte   Finish adding the...
275
276
277
    .plots-buttons button {
      margin: auto 1em;
    }
6b149919   Goutte   Add a Download bu...
278

80352490   Goutte   Multi model suppo...
279
280
281
    #time_series svg {
      cursor: crosshair;
    }
9c0c4509   Goutte   Add a loader to t...
282
283
284
285
286
287
288
289
290
291
292
    #time_series .help {
      position: absolute;
      text-align: center;
      font-size: 0.9em;
      font-style: italic;
      color: darkgrey;
      display: none;
    }
    #time_series:hover .help {
      display: block;
    }
18f38374   Goutte   Crisp edges for a...
293
294
    .axis path, .axis line {
      fill: none;
f6ed8d85   Goutte   Rework layout as ...
295
{#      stroke: #f4f4f4;#}
18f38374   Goutte   Crisp edges for a...
296
297
298
      shape-rendering: crispEdges;
      stroke-width: 1px;
    }
c42fea3a   Goutte   Rework the CSS wi...
299
    svg text {
f6ed8d85   Goutte   Rework layout as ...
300
{#      fill: #f4f4f4;#}
c42fea3a   Goutte   Rework the CSS wi...
301
    }
08569a6b   Goutte   Add a zooming bru...
302
303
304
    #time_series svg .brush .selection {
      fill: #efa02c;
      fill-opacity: 0.382;
908b4423   Goutte   Bump to a newer j...
305
    }
9390ec89   Goutte   Initial experimen...
306
307
308
309
310
    path.line {
      fill: none;
      stroke: steelblue;
      stroke-width: 1px;
    }
81c9b2e8   Goutte   Add the values to...
311
    circle.cursor-circle {
b550c2b0   Goutte   Rework the home s...
312
313
314
315
316
317
318
319
      fill: black;
      stroke: rgba(20, 20, 20, 0.48);
    }
    text.cursor-text {
{#      font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;#}
{#      font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;#}
      font-family: "Ubuntu Mono", 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
      text-align: right;
81c9b2e8   Goutte   Add the values to...
320
321
322
    }
    text.cursor-text-shadow {
      stroke: white;
b550c2b0   Goutte   Rework the home s...
323
324
      stroke-width: 5px;
      opacity: 0.777
81c9b2e8   Goutte   Add the values to...
325
    }
c42fea3a   Goutte   Rework the CSS wi...
326
    path.orbit.orbit_section {
2d2af24b   Goutte   Add a basic orbit...
327
328
      fill: none;
      stroke: steelblue;
1324cc91   Goutte   Make the footer i...
329
      stroke-width: 1.5px;
c42fea3a   Goutte   Rework the CSS wi...
330
331
332
333
334
335
336
    }
    ellipse.orbit.orbit_ellipse {
      fill: none;
      stroke: #a3a3a3;
      stroke-width: 1px;
      stroke-dasharray: 5px;
    }
1754789b   Goutte   Decorate and clea...
337
338
339
340
341
342
343
344
345
    #form_time_interval {
      padding-left: 30px;
    }
    #form_time_interval .mdl-textfield {
      padding-top: 0;
    }
    #started_at, #stopped_at {
      width: 85%;
    }
297a7dfc   Goutte   Add support for i...
346
347
348
    .section-drawer {
      padding-left: 3em;
    }
4900d232   Goutte   Add the time inte...
349
    .targets-filters {
a79c5268   Goutte   Add probes and co...
350
351
      padding-left: 17px;
    }
4900d232   Goutte   Add the time inte...
352
    .targets-filters .target {
c42fea3a   Goutte   Rework the CSS wi...
353
      float: left;
4cf497e0   Goutte   Make the targets ...
354
      cursor: pointer;
80352490   Goutte   Multi model suppo...
355
      position: relative;
c42fea3a   Goutte   Rework the CSS wi...
356
    }
4900d232   Goutte   Add the time inte...
357
    .targets-filters .target:not(.active) {
c42fea3a   Goutte   Rework the CSS wi...
358
359
360
361
362
363
      -webkit-filter: grayscale(100%);
         -moz-filter: grayscale(100%);
           -o-filter: grayscale(100%);
          -ms-filter: grayscale(100%);
              filter: grayscale(100%);
    }
4900d232   Goutte   Add the time inte...
364
    .targets-filters .target.locked {
4cf497e0   Goutte   Make the targets ...
365
366
      cursor: not-allowed;
    }
4900d232   Goutte   Add the time inte...
367
    .targets-filters .target.loading {
6491a1f1   Goutte   Fix up the bugs l...
368
        -webkit-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
369
370
371
        -webkit-animation-duration: 4000ms;
        -webkit-animation-iteration-count: infinite;
        -webkit-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
372
        -moz-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
373
374
375
        -moz-animation-duration: 4000ms;
        -moz-animation-iteration-count: infinite;
        -moz-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
376
        -ms-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
377
378
379
        -ms-animation-duration: 4000ms;
        -ms-animation-iteration-count: infinite;
        -ms-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
380
        animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
381
382
383
384
        animation-duration: 4000ms;
        animation-iteration-count: infinite;
        animation-timing-function: linear;
    }
c42fea3a   Goutte   Rework the CSS wi...
385

80352490   Goutte   Multi model suppo...
386
387
388
389
390
391
392
393
394
    .targets-filters .target .decorator {
      position: absolute;
      top: 0;
      left: 0;
      display: none;
    }
    .targets-filters .target.empty .decorator.empty {
      display: block;
    }
60b73eb1   Goutte   Change temperatur...
395
396
397
    .targets-filters .target.error .decorator.error {
      display: block;
    }
80352490   Goutte   Multi model suppo...
398
399
400
401
402
403
404
    .targets-filters .target .decorator.loading {
      top:  19px;
      left: 19px;
    }
    .targets-filters .target.loading .decorator.loading {
      display: block;
    }
6f9a3852   Goutte   Hide time series ...
405
406
407
408
409
410
411

    #parameters .parameter {
      outline: 0;
    }
    #parameters .parameter.active {
      background-color: #c8d3e1;
    }
80352490   Goutte   Multi model suppo...
412

604616e4   Goutte   Misc changes from...
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
    .small-loader-container {
      width: 27px;
      margin: 0 auto;
      background: none;
      pointer-events: none;
    }

    .small-loader-circle-1 {
      height: 27px;
      width: 27px;
      background: rgba(255, 238, 195, 0.72);
    }

    .small-loader-circle-2 {
      height: 22px;
      width: 22px;
      background: none;
    {#	background: rgba(56, 53, 194, 0.5);#}
    }

    .small-loader-circle-3 {
      height: 18px;
      width: 18px;
      background: rgba(29, 65, 255, 0.9);
    }

    .small-loader-circle-4 {
      height: 13px;
      width: 13px;
      background: none;
    {#	background: rgba(98, 109, 237, 0.5);#}
    }

    .small-loader-circle-5 {
      height: 9px;
      width: 9px;
      background: rgba(238, 238, 238, 0.8);
    }

    .small-loader-circle-6 {
      height: 4px;
      width: 4px;
      background: none;
    {#	background: rgba(0, 0, 0, 0);#}
    }

    .small-loader-circle-7 {
      height: 2px;
      width: 2px;
      background: rgb(110, 102, 255);
    }

    .small-loader-circle-1,
    .small-loader-circle-2,
    .small-loader-circle-3,
    .small-loader-circle-4,
    .small-loader-circle-5,
    .small-loader-circle-6,
    .small-loader-circle-7 {
      border-bottom: none;
      border-radius: 50%;
        -o-border-radius: 50%;
        -ms-border-radius: 50%;
        -webkit-border-radius: 50%;
        -moz-border-radius: 50%;
      box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -o-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -ms-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -webkit-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
      animation-name: small-loader-spin;
        -o-animation-name: small-loader-spin;
        -ms-animation-name: small-loader-spin;
        -webkit-animation-name: small-loader-spin;
        -moz-animation-name: small-loader-spin;
      animation-duration: 4600ms;
        -o-animation-duration: 4600ms;
        -ms-animation-duration: 4600ms;
        -webkit-animation-duration: 4600ms;
        -moz-animation-duration: 4600ms;
      animation-iteration-count: infinite;
        -o-animation-iteration-count: infinite;
        -ms-animation-iteration-count: infinite;
        -webkit-animation-iteration-count: infinite;
        -moz-animation-iteration-count: infinite;
      animation-timing-function: linear;
        -o-animation-timing-function: linear;
        -ms-animation-timing-function: linear;
        -webkit-animation-timing-function: linear;
        -moz-animation-timing-function: linear;
    }



    @keyframes small-loader-spin {
      from {
        transform: rotate(0deg);
      }
      to {
        transform: rotate(360deg);
      }
    }

    @-o-keyframes small-loader-spin {
      from {
        -o-transform: rotate(0deg);
      }
      to {
        -o-transform: rotate(360deg);
      }
    }

    @-ms-keyframes small-loader-spin {
      from {
        -ms-transform: rotate(0deg);
      }
      to {
        -ms-transform: rotate(360deg);
      }
    }

    @-webkit-keyframes small-loader-spin {
      from {
        -webkit-transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
      }
    }

    @-moz-keyframes small-loader-spin {
      from {
        -moz-transform: rotate(0deg);
      }
      to {
        -moz-transform: rotate(360deg);
      }
    }
80352490   Goutte   Multi model suppo...
551
552
  
  
9390ec89   Goutte   Initial experimen...
553
554
555
556
  </style>
{% endblock %}


7d6dee0f   Goutte   Continue refacto ...
557

80352490   Goutte   Multi model suppo...
558
559
{#### JAVASCRIPT #############################################################}

9390ec89   Goutte   Initial experimen...
560
{% block scripts_footer %}
f7a10f28   Goutte   Make our custom m...
561
<script type="application/javascript" src="{{ static('js/vendor/d3-custom.js') }}"></script>
a4a9ef03   Goutte   Cache generated C...
562
<script type="application/javascript" src="{{ static('js/vendor/moment.min.js') }}"></script>
80352490   Goutte   Multi model suppo...
563
<script type="application/javascript" src="{{ static('js/vendor/samp.js') }}"></script>
438929a4   Goutte   Rewrite the orbit...
564
<script type="application/javascript" src="{{ static('js/swapp.js') }}"></script>
9390ec89   Goutte   Initial experimen...
565
566
<script type="application/javascript">

ae0aa7d2   Goutte   Add an x axis lab...
567
568
569
var configuration = {
  time_series_container: '#time_series',
  orbits_container: '#orbits',
bde97e4d   Goutte   Add more changes ...
570
  api: {
297a7dfc   Goutte   Add support for i...
571
572
573
      'data_for_interval': "{{ request.url_root }}<target>_{{ input_slug }}_<started_at>_<stopped_at>.csv",
      'download':          "{{ request.url_root }}<targets>_{{ input_slug }}_<started_at>_<stopped_at>.cdf",
      'samp':              "{{ request.url_root }}<targets>_{{ input_slug }}_<started_at>_<stopped_at>.cdf"
f75faf5f   Goutte   WIP
574
  },
8bd715ad   Goutte   Use a pixel art i...
575
576
577
  sun: {
    img: '{{ static('img/sun_128.png') }}'
  },
bde97e4d   Goutte   Add more changes ...
578
  targets: {
d9453685   Goutte   Clean up.
579
{% for target in targets if not target.locked %}
a21f81d9   Goutte   Enable Venus and ...
580
581
582
583
    {% if not loop.first %},{% endif %}
    '{{ target.slug }}': {
      slug: '{{ target.slug }}',
      name: '{{ target.name }}',
ae0aa7d2   Goutte   Add an x axis lab...
584
      active: true,
25071e08   Goutte   Easy fix to suppo...
585
      orbit: { a: {{ target.orbit.semimajor or 0 }}, b: {{ target.orbit.semiminor or 0 }} },
a21f81d9   Goutte   Enable Venus and ...
586
      img: '{{ static('img/target/'~target.slug~'_128.png') }}'
ae0aa7d2   Goutte   Add an x axis lab...
587
    }
a21f81d9   Goutte   Enable Venus and ...
588
{% endfor %}
aba70d3a   Goutte   Refactor time ser...
589
  },
bde97e4d   Goutte   Add more changes ...
590
591
  parameters: [
{% for p in parameters %}
aba70d3a   Goutte   Refactor time ser...
592
    {
bde97e4d   Goutte   Add more changes ...
593
594
595
596
597
598
      id: "{{ p.slug | escapejs }}",
      title: "{{ p.name | escapejs }} ({{ p.units | escapejs }})",
      active: {{ 'true' if p.active else 'false' }},
      unit: "{{ p.units | escapejs }}"
    }{{ ',' if not loop.last }}
{% endfor %}
aba70d3a   Goutte   Refactor time ser...
599
  ]
438929a4   Goutte   Rewrite the orbit...
600
};
9390ec89   Goutte   Initial experimen...
601

06a3a1f1   Goutte   Continue bug hunt...
602
var sw;
9390ec89   Goutte   Initial experimen...
603
jQuery().ready(function($){
a975b380   Goutte   Clean up.
604
  // Space Weather app itself, handling data downloads and plot draws.
06a3a1f1   Goutte   Continue bug hunt...
605
  sw = new SpaceWeather(configuration);
fe3132dd   Goutte   Refactor even more.
606
  sw.init();
ae0aa7d2   Goutte   Add an x axis lab...
607

a975b380   Goutte   Clean up.
608
609
610
611
612
613
614
615
  // User Interface (except plots' interactivity, such as mouse hovers)
  var parameters = $('#parameters');
  var isLastParameterEnabled = function(parameter_id) {
    var s = 0;
    parameters.find('.parameter[data-ts-slug]').each(function(i,p) {
      if ($(p).hasClass('active')) s++;
    });
    return s < 2;
6f9a3852   Goutte   Hide time series ...
616
  };
4cf497e0   Goutte   Make the targets ...
617
618
  var isLastTargetEnabled = function(target_slug) {
    var s = 0;
4900d232   Goutte   Add the time inte...
619
    $(".targets-filters .target:not(.locked)").each(function(i,p) {
9c0c4509   Goutte   Add a loader to t...
620
      if ($(p).hasClass('active') && ! $(p).hasClass('loading')) s++;
4cf497e0   Goutte   Make the targets ...
621
622
623
    });
    return s < 2;
  };
a975b380   Goutte   Clean up.
624
  parameters.find(".parameter").click(function(e){
b7fe650c   Goutte   Misc bundle of ol...
625
626
627
628
    var switch_on = ! $(this).hasClass('active');
    var parameter_slug = $(this).attr('data-ts-slug');
    if (switch_on) {
      sw.enableParameter(parameter_slug);
a975b380   Goutte   Clean up.
629
630
      $(this).addClass('active');
    } else if ( ! isLastParameterEnabled(parameter_slug)) {
b7fe650c   Goutte   Misc bundle of ol...
631
      sw.disableParameter(parameter_slug);
a975b380   Goutte   Clean up.
632
      $(this).removeClass('active');
b7fe650c   Goutte   Misc bundle of ol...
633
    }
6f9a3852   Goutte   Hide time series ...
634
635
    return false;
  });
4900d232   Goutte   Add the time inte...
636
  $(".targets-filters .target:not(.locked)").on("click", function(e){
9c0c4509   Goutte   Add a loader to t...
637
    if ($(this).hasClass('loading')) return false;
4cf497e0   Goutte   Make the targets ...
638
639
640
    var switch_on = ! $(this).hasClass('active');
    var target_slug = $(this).attr('data-target-slug');
    if (switch_on) {
6bb225d6   Goutte   Link the time ser...
641
      sw.enableTarget(target_slug);
4cf497e0   Goutte   Make the targets ...
642
643
      $(this).addClass('active');
    } else if ( ! isLastTargetEnabled(target_slug)) {
6bb225d6   Goutte   Link the time ser...
644
      sw.disableTarget(target_slug);
4cf497e0   Goutte   Make the targets ...
645
646
647
648
      $(this).removeClass('active');
    }
    return false;
  });
243cd8a4   Goutte   Timestamp party c...
649
650
651
652
653
  $('#apply_new_interval').on("click", function(e){
    var started_at = moment($("#started_at").val());
    var stopped_at = moment($("#stopped_at").val());
    sw.resizeDomain(started_at, stopped_at);
    return false;
6b149919   Goutte   Add a Download bu...
654
  });
297a7dfc   Goutte   Add support for i...
655
656
657
658
659
  $('#apply_new_input').on("click", function(e){
    var new_input_slug = $("input[name='input_slug']:checked").val();
    window.location = "?input_slug="+new_input_slug;
    return false;
  });
6b149919   Goutte   Add a Download bu...
660
661
  $('#download').on("click", function(e){
    var url = sw.buildDownloadUrl();
aa7247d6   Goutte   Generate a CDF fi...
662
    console.info("Downloading " + url);
6b149919   Goutte   Add a Download bu...
663
664
665
666
    $.ajax({
      type: 'GET',
      url: url,
      processData: false,
5f63c83b   Goutte   Lint.
667
      success: function (data) { window.location = url; },
6b149919   Goutte   Add a Download bu...
668
669
670
671
672
673
674
      error: function (xhr) {
        console.error('Cannot download.', xhr);
        alert("Our apologies, there was an error while downloading.");
      }
    });
    return false;
  });
3c2b15fc   Goutte   Make the Y-Axis o...
675
676
677
678
679
680
681
682
683
684
  $('#zoom_inner_heliosphere').on("click", function(e){
    console.info("Zooming to inner heliosphere…");
    sw.orbits.zoomToTarget('mars');
    return false;
  });
  $('#zoom_outer_heliosphere').on("click", function(e){
    console.info("Zooming to outer heliosphere…");
    sw.orbits.resize(true);
    return false;
  });
6f9a3852   Goutte   Hide time series ...
685

9390ec89   Goutte   Initial experimen...
686
687
});
</script>
cad44b6d   Goutte   Finish adding the...
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726

{#### SAMP ###################################################################}
<script type="text/javascript">
  jQuery().ready(function ($) {
    // Flag to know when a hub is connected or not
    var isConnected = false;

    // Show SAMP button(s) depending on whether the hub is available or not.
    var onHubAvailability = function (isHubRunning) {
      $(".samp").each(function (index, element) {
        if (isHubRunning) {
          isConnected = true;
          $(element).removeClass('disabled mdl-button--disabled');
        } else {
          isConnected = false;
          $(element).addClass('disabled mdl-button--disabled');
        }
      });
    };

    // Update the document about the presence of any SAMP hub every 10 sec.
    var connector = new samp.Connector("Sender");
    connector.onHubAvailability(onHubAvailability, 10000);
    window.onunload = function () {
      connector.unregister();
    };

    // Clicking on a SAMP button sends the CDF file to the connected hub.
    $("#samp").click(function (event) {
      event.stopPropagation();
      if ($(this).hasClass('disabled')) { return; }
      // pitfall : connector.connection is ALWAYS undefined here
      if ( ! isConnected) {  // so we use a bool flag instead
        alert("We do not detect any connected SAMP hub.\n" +
            "Wait some more, or try refreshing this page?");
        return;
      }
      var name = sw.buildSampName();
      var url = sw.buildSampUrl();
aa7247d6   Goutte   Generate a CDF fi...
727
      console.info("Trying to activate SAMP…", name, url);
cad44b6d   Goutte   Finish adding the...
728
729
730
731
732
733
734
735
736
737
738
739
740
741
      connector.runWithConnection(function (connection) {
        var msg = new samp.Message("table.load.cdf", {
          "name": name,
          "url": url // absolute URL required
        });
        connection.notifyAll([msg]);
      }, function (error) {
        var msg = 'Error: ' + error;
        console.error(msg);
        alert(msg);  // let's yell at the user as well
      });
    });
  });
</script>
9390ec89   Goutte   Initial experimen...
742
{% endblock %}