|
|
(196 välissä olevaa versiota samalta käyttäjältä ei näytetä) |
Rivi 27: |
Rivi 27: |
| jQuery.getScript( "//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js", function() { | | jQuery.getScript( "//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js", function() { |
| jQuery.getScript( "//www.jarviwiki.fi/citobsjs/jwapi.js", function() { | | jQuery.getScript( "//www.jarviwiki.fi/citobsjs/jwapi.js", function() { |
| jQuery.getScript( '//www.gstatic.com/charts/loader.js', function() { | | allReady(); |
| google.charts.load( 'current', { 'packages':[ 'corechart' ], 'language': 'fi' } );
| | //jQuery.getScript( '//www.gstatic.com/charts/loader.js', function() { |
| google.charts.setOnLoadCallback( allReady );
| | // google.charts.load( 'current', { 'packages':[ 'corechart' ], 'language': 'fi' } ); |
| }); | | // google.charts.setOnLoadCallback( allReady ); |
| | //}); |
| }); | | }); |
| }); | | }); |
Rivi 37: |
Rivi 38: |
|
| |
|
| function allReady() { | | function allReady() { |
|
| | |
| // resize all when window resizes
| |
| jQuery( window ).resize(function() {
| |
| for ( var c in window.jwcurrentchart ) {
| |
| if ( window.jwcurrentchart[c].memo.widgetEl.is( ':visible' ) ) {
| |
| doResize( window.jwcurrentchart[c].memo ); | |
| }
| |
| }
| |
| });
| |
|
| |
| loadObservations(); | | loadObservations(); |
| } | | } |
Rivi 170: |
Rivi 162: |
| memo.editEl = jQuery( this ).find( '.edit-button' ); | | memo.editEl = jQuery( this ).find( '.edit-button' ); |
| memo.editEl.on( 'click', function() { window.location.href = memo.editUrl; }); | | memo.editEl.on( 'click', function() { window.location.href = memo.editUrl; }); |
| }
| |
|
| |
| // add download data button
| |
| if ( memo.download ) {
| |
| memo.headerEl.append( '<div class="obschartbutton download-button" style="display: none; margin-left: 10px; float: right; Xbackground-color: rgba( 255, 255, 255, 1 ); border-radius: 50%; Xborder: 1px solid rgba( 0, 0, 0, 0.5 ); Xpadding: 1px;"><button title="' + i18n['download'][memo.lang] + '" style="width: 24px; height: 24px; padding: 0; margin: 0; color: #1B599B; background: none; border: none;"><i class="fas fa-download"></i></button></div>' );
| |
| memo.downloadEl = jQuery( this ).find( '.download-button' );
| |
|
| |
| memo.downloadEl.on( 'click', function() {
| |
|
| |
| var header = '';
| |
| header += '\uFEFF'; // BOM
| |
| var csv = '';
| |
| //csv += '\r\nsep=,\r\n';
| |
|
| |
| var headerCols = [];
| |
| var csvCols = [];
| |
|
| |
| if ( i18n[memo.obscode].type == 'num' ) {
| |
|
| |
| //headerCols.push( i18n[ 'Date' ][ memo.lang ] );
| |
| //headerCols.push( i18n[ 'Date' ][ memo.lang ] );
| |
| headerCols.push( '"' + i18n[memo.obscode].axisTitleV[memo.lang] + '"' );
| |
| headerCols.push( 'Lisätiedot' );
| |
| headerCols.push( 'Valokuva' );
| |
| headerCols.push( 'Havainnoijan status' );
| |
|
| |
| header += headerCols.join( i18n['sep'][memo.lang] );
| |
|
| |
| for ( var o in memo.obses ) {
| |
|
| |
| csvCols = [];
| |
|
| |
| csvCols.push( memo.obses[o].obsdatetime.getFullYear() + '-' + ( memo.obses[o].obsdatetime.getMonth() + 1 ) + '-' + memo.obses[o].obsdatetime.getDate() );
| |
|
| |
| if ( memo.obses[o].obsdatetime.getUTCHours() == 0 && memo.obses[o].obsdatetime.getUTCMinutes() == 0 && memo.obses[o].obsdatetime.getUTCSeconds() == 0 ) {
| |
| csvCols.push( '' );
| |
| } else {
| |
| csvCols.push( ( "0" + memo.obses[o].obsdatetime.getUTCHours() ).slice(-2) + ':' + ( "0" + memo.obses[o].obsdatetime.getUTCMinutes() ).slice(-2) );
| |
| }
| |
|
| |
| csvCols.push( '"' + memo.obses[o].value.toString().replace( '.', i18n['dec'][memo.lang] ) + '"' );
| |
| csvCols.push( memo.obses[o].addInfo );
| |
| csvCols.push( '' );
| |
| csvCols.push( memo.obses[o].maintainer );
| |
|
| |
| csv += '\r\n' + csvCols.join( i18n['sep'][memo.lang] );
| |
|
| |
| }
| |
|
| |
|
| |
| } else if ( i18n[memo.obscode].type == 'date' ) {
| |
|
| |
| if ( i18n[memo.obscode].season == 'winter' ) {
| |
| header += i18n[ 'season' ][ i18n[memo.obscode].season ][ memo.lang ];
| |
| } else {
| |
| header += i18n[ 'year' ][ memo.lang ];
| |
| }
| |
|
| |
| header += ';' + i18n[ 'Observation' ][ memo.lang ];
| |
| header += ';' + i18n[ 'Value' ][ memo.lang ];
| |
| header += ';' + i18n[ 'ValueUnit' ][ memo.lang ];
| |
| header += ';' + i18n[ 'Additionalinfo' ][ memo.lang ];
| |
| header += ';' + i18n[ 'Image' ][ memo.lang ];
| |
| header += ';' + i18n[ 'ObserverStatus' ][ memo.lang ];
| |
|
| |
| for ( var s in memo.seriesA ) {
| |
|
| |
| for ( var o in memo.seriesA[ s ].obses ) {
| |
|
| |
| obs = memo.seriesA[ s ].obses[ o ];
| |
|
| |
| csv += '\r\n';
| |
|
| |
| csv += obs.season + '-' + (obs.season+1);
| |
|
| |
| csv += ';' + i18n[ memo.seriesA[ s ].id ].title[ memo.lang ];
| |
|
| |
| csv += ';' + obs.value;
| |
| csv += ';' + obs.valueUnit;
| |
|
| |
| csv += ';' + obs.addInfo;
| |
| csv += ';';
| |
| csv += ';' + obs.maintainer;
| |
|
| |
| }
| |
|
| |
| }
| |
|
| |
| } else if ( i18n[memo.obscode].type == 'cat' ) {
| |
|
| |
| header += 'Päivämäärä';
| |
| header += ';' + 'Kellonaika';
| |
| header += ';' + i18n[memo.obscode].title[memo.lang];
| |
| header += ';' + i18n[memo.obscode].title[memo.lang];
| |
| header += ';' + utf8StringToUtf16String( 'Lisätiedot' );
| |
| header += ';' + 'Valokuva';
| |
| header += ';' + 'Havainnoijan status';
| |
|
| |
| for ( var o in memo.obses ) {
| |
|
| |
| csv += '\r\n';
| |
|
| |
| csv += memo.obses[o].obsdatetime.toLocaleDateString(); //.toISOString();
| |
|
| |
| if ( memo.obses[o].obsdatetime.getUTCHours() == 0 && memo.obses[o].obsdatetime.getUTCMinutes() == 0 && memo.obses[o].obsdatetime.getUTCSeconds() == 0 ) {
| |
| csv += ';';
| |
| } else {
| |
| csv += ';' + ( "0" + memo.obses[o].obsdatetime.getUTCHours() ).slice(-2) + ':' + ( "0" + memo.obses[o].obsdatetime.getUTCMinutes() ).slice(-2);
| |
| }
| |
|
| |
| csv += ';' + memo.obses[o].value;
| |
| csv += ';' + i18n[memo.obscode].catNames[memo.obses[o].value][memo.lang];
| |
|
| |
| csv += ';' + memo.obses[o].addInfo;
| |
| csv += ';';
| |
| csv += ';' + memo.obses[o].maintainer;
| |
|
| |
| }
| |
|
| |
| }
| |
|
| |
| csv = header + csv;
| |
|
| |
| var exportedFilename = memo.csvfile;
| |
|
| |
| var blob = new Blob( [csv], { type: 'text/csv;charset=utf-16LE;' });
| |
| if (navigator.msSaveBlob) { // IE 10+
| |
| navigator.msSaveBlob(blob, exportedFilename);
| |
| } else {
| |
| var link = document.createElement("a");
| |
| if (link.download !== undefined) { // feature detection
| |
| // Browsers that support HTML5 download attribute
| |
| var url = URL.createObjectURL(blob);
| |
| link.setAttribute("href", url);
| |
| link.setAttribute("download", exportedFilename);
| |
| link.style.visibility = 'hidden';
| |
| document.body.appendChild(link);
| |
| link.click();
| |
| document.body.removeChild(link);
| |
| }
| |
| }
| |
|
| |
| });
| |
| } | | } |
|
| |
|
Rivi 332: |
Rivi 181: |
| memo.jwR = new jwApi(); | | memo.jwR = new jwApi(); |
| | | |
| var so = { 'startdate': memo.startDate, 'custom': '' }; | | var custom = ''; |
| //var so = { 'custom': '' };
| |
|
| |
| if ( typeof memo.obscodeParts[1] != 'undefined' ) { | | if ( typeof memo.obscodeParts[1] != 'undefined' ) { |
| if ( typeof memo.obscodeParts[2] != 'undefined' ) { | | if ( typeof memo.obscodeParts[2] != 'undefined' ) { |
| so.custom += '[[' + i18n[memo.obscodeParts[0]].catName + '::' + memo.obscodeParts[2].split(',').join('||') +']]'; | | custom += '[[' + i18n[memo.obscodeParts[0]].catName + '::' + memo.obscodeParts[2].split(',').join('||') +']]'; |
| } else { | | } else { |
| so.custom += '[[' + i18n[memo.obscode].catName + '::>0]]'; | | custom += '[[' + i18n[memo.obscode].catName + '::>0]]'; |
| } | | } |
| } | | } |
|
| | |
| if ( memo.refcode == '-' ) { | |
| so.obscode = memo.obscodeParts[0];
| |
| } else {
| |
| so.custom += '[[ObsCode::' + memo.obscodeParts[0] + ' || ' + memo.refcode + ']]';
| |
| }
| |
|
| |
| if ( memo.siteid != '-' ) { | | if ( memo.siteid != '-' ) { |
| so.siteid = memo.siteid; | | so = { 'obscode': memo.obscodeParts[0], 'siteid': memo.siteid, 'startdate': memo.startDate, 'custom': custom }; |
| } else { | | } else { |
| so.waterbody = memo.waterbody; | | so = { 'obscode': memo.obscodeParts[0], 'waterbody': memo.waterbody, 'startdate': memo.startDate, 'custom': custom }; |
| } | | } |
|
| | |
| memo.jw.loadObses( so, function( o ) { | | memo.jw.loadObses( so, function( o ) { |
| memo.obses = memo.jw.obs; | | memo.obses = memo.jw.obs; |
| drawVisualization(memo); | | if ( memo.refcode != '-' ) { |
| | memo.jwR.loadObses( { "obscode": memo.refcode, "siteid": memo.siteid, "sort": "SiteID", "custom": memo.reffilter }, function( r ) { |
| | memo.refs = memo.jwR.obs; |
| | drawVisualization(memo); |
| | }); |
| | } else { |
| | drawVisualization(memo); |
| | } |
| }); | | }); |
| } else { | | } else { |
Rivi 564: |
Rivi 412: |
| // sort | | // sort |
| memo.obsesA.sort( function(a, b) { return a.obsdatetime - b.obsdatetime; }); | | memo.obsesA.sort( function(a, b) { return a.obsdatetime - b.obsdatetime; }); |
|
| |
| // create DataTable
| |
| memo.data = new google.visualization.DataTable();
| |
|
| |
| // col for xAxis values
| |
| memo.data.addColumn( 'date', 'time' );
| |
|
| |
|
| // make ticks for y axis on cat types | | // make ticks for y axis on cat types |
Rivi 604: |
Rivi 446: |
| | | |
| if ( typeof memo.info != 'undefined' ) { | | if ( typeof memo.info != 'undefined' ) { |
| memo.titleEl.append( ' <button style="padding: 0 0.25em; font-size: 13px; margin-bottom: 3px;" type="button" class="btn btn-secondary btn-info" data-toggle="tooltip" data-placement="top" title="' + memo.info + '"><span class="fontawesome"></span></button>' ); | | memo.titleEl.append( ' <button style="padding: 0 0.25em; font-size: 13px; margin-bottom: 3px; color: #0076b0;" type="button" class="btn Xbtn-secondary Xbtn-info" data-toggle="tooltip" data-placement="top" title="' + memo.info + '"><span class="fontawesome"></span></button>' ); |
| jQuery( '[data-toggle="tooltip"]' ).tooltip(); | | jQuery( '[data-toggle="tooltip"]' ).tooltip(); |
| } | | } |
Rivi 644: |
Rivi 486: |
| | | |
| if ( typeof memo.info != 'undefined' ) { | | if ( typeof memo.info != 'undefined' ) { |
| addToTitle = ' <button style="padding: 0 0.25em; font-size: 13px; margin-bottom: 3px;" type="button" class="btn btn-secondary btn-info" data-toggle="tooltip" data-placement="top" title="' + memo.info + '"><span class="fontawesome"></span></button>'; | | addToTitle = ' <button style="padding: 0 0.25em; font-size: 13px; margin-bottom: 3px; color: #0076b0;" type="button" class="btn Xbtn-secondary Xbtn-info" data-toggle="tooltip" data-placement="top" title="' + memo.info + '"><span class="fontawesome"></span></button>'; |
| } else { | | } else { |
| addToTitle = ''; | | addToTitle = ''; |
Rivi 655: |
Rivi 497: |
|
| |
|
| if ( memo.obscode == 'level' ) { | | if ( memo.obscode == 'level' ) { |
| console.log( memo.obsesA );
| |
| // make week averages
| |
| memo.avgW = {}; | | memo.avgW = {}; |
| for (var o in memo.obsesA) { | | for (var o in memo.obsesA) { |
Rivi 676: |
Rivi 516: |
| } | | } |
|
| |
|
| obs = memo.obsesA[0]; | | if ( memo.obsesA.length > 0 ) { |
| for (var r in memo.refs) {
| | obs = memo.obsesA[0]; |
| ref = memo.refs[r];
| | for (var r in memo.refs) { |
| break; | | ref = memo.refs[r]; |
| | break; |
| | } |
| | |
| | refdata = JSON.parse( ref.printouts.DataJSON ); |
| | refn = refdata.val/100; |
| | |
| | diff = obs.value - refn; |
| | diff = Math.round( diff*100 ); |
| | diffStr = diff.toString() + ' cm'; |
| | if ( diff > 0 ) { diffStr = '+' + diffStr; } |
| | } else { |
| | diff = -999; |
| | diffStr = ''; |
| } | | } |
|
| |
| refdata = JSON.parse( ref.printouts.DataJSON );
| |
| refn = refdata.val/100;
| |
|
| |
| diff = obs.value - refn;
| |
| diff = Math.round( diff*100 );
| |
| diffStr = diff.toString() + ' cm';
| |
| if ( diff > 0 ) { diffStr = '+' + diffStr; }
| |
| | | |
| var levelsvg = '<?xml version="1.0" encoding="utf-8"?><svg role="img" aria-label="XXX" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 99.6;" xml:space="preserve"><style type="text/css">.st0{fill:#ccc;} .st1{fill:#0076B0;}</style>'; | | var levelsvg = '<?xml version="1.0" encoding="utf-8"?><svg role="img" aria-label="XXX" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 99.6;" xml:space="preserve"><style type="text/css">.st0{fill:#ccc;} .st1{fill:#0076B0;}</style>'; |
| | | |
| var levelclass = 'st0'; | | var levelclass = 'st0'; |
| | |
| if ( diff > 20 ) { levelclass = "st1"; } | | if ( diff > 20 ) { levelclass = "st1"; } |
| levelsvg += '<path class="' + levelclass + '" d="M46.8,1.2c1.9-1.5,4.5-1.5,6.4,0c3.9,3,8.7,5.1,13.5,5.1c4.7,0,9.6-2.1,13.4-5.1l0,0c2.1-1.7,4.9-1.5,6.8,0.3c2.5,2.3,5.6,4.1,8.8,4.9c3,0.8,4.8,4.1,4.2,7.5s-3.7,5.4-6.7,4.7c-4.3-1.1-7.8-3.2-10.1-4.9c-5,3-10.7,5.1-16.4,5.1c-5.5,0-10.5-1.9-14-3.7c-1-0.5-1.9-1-2.7-1.5c-0.8,0.5-1.7,1-2.7,1.5c-3.4,1.8-8.4,3.7-14,3.7c-5.7,0-11.4-2-16.4-5c-2.3,1.6-5.9,3.8-10.1,4.9c-3,0.8-6-1.3-6.7-4.7s1.2-6.7,4.2-7.5c3.1-0.8,6.3-2.6,8.8-4.9c1.9-1.9,4.7-2,6.8-0.3l0,0c3.9,3,8.8,5.1,13.5,5.1C38.1,6.3,42.9,4.2,46.8,1.2z"/>'; | | levelsvg += '<path class="' + levelclass + '" d="M46.8,1.2c1.9-1.5,4.5-1.5,6.4,0c3.9,3,8.7,5.1,13.5,5.1c4.7,0,9.6-2.1,13.4-5.1l0,0c2.1-1.7,4.9-1.5,6.8,0.3c2.5,2.3,5.6,4.1,8.8,4.9c3,0.8,4.8,4.1,4.2,7.5s-3.7,5.4-6.7,4.7c-4.3-1.1-7.8-3.2-10.1-4.9c-5,3-10.7,5.1-16.4,5.1c-5.5,0-10.5-1.9-14-3.7c-1-0.5-1.9-1-2.7-1.5c-0.8,0.5-1.7,1-2.7,1.5c-3.4,1.8-8.4,3.7-14,3.7c-5.7,0-11.4-2-16.4-5c-2.3,1.6-5.9,3.8-10.1,4.9c-3,0.8-6-1.3-6.7-4.7s1.2-6.7,4.2-7.5c3.1-0.8,6.3-2.6,8.8-4.9c1.9-1.9,4.7-2,6.8-0.3l0,0c3.9,3,8.8,5.1,13.5,5.1C38.1,6.3,42.9,4.2,46.8,1.2z"/>'; |
Rivi 720: |
Rivi 566: |
| } else if ( diff > -20 ) { | | } else if ( diff > -20 ) { |
| levelsvg.replace( 'XXX', 'Vedenpinta matala' ); | | levelsvg.replace( 'XXX', 'Vedenpinta matala' ); |
| | } else if ( diff > -100 ) { |
| | levelsvg.replace( 'XXX', 'Vedenpinta erittäin matala' ); |
| } else { | | } else { |
| levelsvg.replace( 'XXX', 'Vedenpinta erittäin matala' ); | | levelsvg.replace( 'XXX', 'Ei tuloksia' ); |
| } | | } |
| | | |
Rivi 727: |
Rivi 575: |
| memo.widgetEl.append( '<h3 style="text-align: center; font-size: 18px; margin-top: 0;">Vedenkorkeus' + addToTitle + '</h3>' ); | | memo.widgetEl.append( '<h3 style="text-align: center; font-size: 18px; margin-top: 0;">Vedenkorkeus' + addToTitle + '</h3>' ); |
| memo.widgetEl.append( '<div style="width: 120px; height: 120px; margin: 12px auto; padding: 10px; border-radius: 6px; Xborder: 3px solid rgba( 213, 218, 38, 0.5 );">' + levelsvg + '</div>'); | | memo.widgetEl.append( '<div style="width: 120px; height: 120px; margin: 12px auto; padding: 10px; border-radius: 6px; Xborder: 3px solid rgba( 213, 218, 38, 0.5 );">' + levelsvg + '</div>'); |
| memo.widgetEl.append( '<p style="text-align: center; line-height: 20px;" class="huomio">' + diffStr + '<br /><span class="Xsmall">(' + obs.obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span></p>' ); | | memo.widgetEl.append( '<p style="text-align: center; line-height: 20px;" class="huomio">' + diffStr + '<br /><span class="smaller">(' + obs.obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span></p>' ); |
| //' + obs.obsdatetime.inRelationToToday(memo.lang) + ' | | //' + obs.obsdatetime.inRelationToToday(memo.lang) + ' |
|
| |
|
| } else if ( memo.obscode == 'ice' ) { | | } else if ( memo.obscode == 'ice' ) { |
| | | |
| obs = memo.obsesA[0]; | | var sites = {}; |
| | var obsesA = []; |
| | for ( var o in memo.obsesA ) { |
| | obs = memo.obsesA[o]; |
| | if ( typeof sites[ obs.printouts.SiteID[0] ] == 'undefined' ) { |
| | sites[ obs.printouts.SiteID[0] ] = true; |
| | obsesA.push( obs ); |
| | } |
| | } |
| | |
| | memo.obsesA = obsesA; |
| | |
| | var ivalsum = 0; |
| | var ivalcount = 0; |
| | var ivc = 0; |
| | var ivalmin = 999; |
| | var ivalmax = 0; |
| | var ivalavg = -1; |
| | |
| | var icatsum = 0; |
| | var icount = 0; |
| | var icatcount = 0; |
| | console.log( memo.obsesA ); |
| | for ( var o in memo.obsesA ) { |
| | |
| | obs = memo.obsesA[o]; |
| | iw = ( 7 - Math.round( ( today.getTime() - memo.obsesA[o].obsdatetime.getTime() ) / ( 24*60*60*1000 ) ) ); |
| | |
| | if ( obs.data.cat == '0' || obs.data.cat == '5' ) { |
| | icat = 0; |
| | } else if ( obs.data.cat == '1' || obs.data.cat == '4' ) { |
| | icat = 0.5; |
| | } else { |
| | icat = 1; |
| | } |
| | |
| | if ( obs.data.val > 0 ) { |
| | ivc++; |
| | ivalsum += iw * obs.data.val; |
| | ivalcount += iw; |
| | ivalmin = Math.min( ivalmin, obs.data.val ); |
| | ivalmax = Math.max( ivalmax, obs.data.val ); |
| | } |
| | |
| | icatsum += icat * iw; |
| | icount++; |
| | icatcount += iw; |
| | } |
| | |
| | |
| | if ( icount > 0 ) { |
| | |
| | iavg = ( icatsum/icatcount ); |
| | |
| | //console.log( iavg ); |
| | |
| | if ( iavg > 0.7 && ivc > 0 ) { |
| | |
| | ivalavg = Math.round( ivalsum/ivalcount ); |
| | ivalmin = Math.round( ivalmin ); |
| | ivalmax = Math.round( ivalmax ); |
| | //console.log( ivalavg ); |
| | if ( ivalmax > ivalmin ) { |
| | istr = ivalmin + '–' + ivalmax + ' cm'; |
| | } else { |
| | istr = ivalmin + ' cm'; |
| | } |
| | |
| | if ( ivc == 1 ) { |
| | istr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } else { |
| | istr += '<br /><span class="smaller">('; |
| | istr += '<button style="margin-left: -1px; padding: 0; font-size: 13px; margin-bottom: 3px; color: #59B500;" type="button" class="btn Xbtn-secondary Xbtn-info" data-toggle="tooltip" data-placement="top" title="" data-original-title="Perustuu yhteensä ' + icount + ' havaintoon ajanjaksolla: ' + memo.obsesA[ memo.obsesA.length-1 ].obsdatetime.toLocaleDateString() + '-' + memo.obsesA[0].obsdatetime.toLocaleDateString() + '."><span class="fontawesome"></span></button>'; |
| | istr += ' ⋯' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } |
|
| |
|
| iceT =obs.value.toString() + ' cm';
| | |
| memo.widgetEl.html('');
| | } else { |
| memo.widgetEl.append( '<p style="text-align: center; line-height: 20px;" class="huomio">' + obs.obsdatetime.inRelationToToday(memo.lang) + '</p>' );
| | |
| memo.widgetEl.append( '<div style="width: 100px; height: 100px; margin: 0 auto;"><svg style="width: 100px; height: 100px;" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="1.70666in" height="1.70666in" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"viewBox="0 0 1.70666 1.70666" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <style type="text/css"> <![CDATA[ .fil0 {fill:#D9F1FF} .fil1 {fill:#DAEBF6} .fil3 {fill:#EAF3F8} .fil2 {fill:#EDF8FF} ]]> </style> </defs> <g id="Layer_x0020_1"> <metadata id="CorelCorpID_0Corel-Layer"/> <g id="_379292064"> <path id="_379292760" class="fil0" d="M1.40329 1.24609c-0.00840157,0 -0.0159921,-0.00530709 -0.0188386,-0.0133543l-0.175606 -0.498173 -0.0287165 0.120094c-0.00475197,0.0199409 -0.0329843,0.0203937 -0.0386417,0.000917323l-0.0844843 -0.290622 -0.0838858 0.219394c-0.00578346,0.0151614 -0.0262677,0.0173661 -0.0352362,0.00405118l-0.0845315 -0.125091 -0.0845276 0.12511c-0.00902756,0.0133583 -0.0294764,0.011063 -0.035252,-0.00405118l-0.0838858 -0.21939 -0.0844882 0.290622c-0.00549606,0.018878 -0.0337677,0.0194409 -0.0386378,-0.000917323l-0.0287244 -0.120094 -0.175606 0.498169c-0.00683858,0.0194094 -0.0351457,0.0168858 -0.0385512,-0.00332283l-0.0963465 -0.570858 -0.0470787 0.133386c-0.00603937,0.017122 -0.0296969,0.0176575 -0.0370276,0.0016811 -0.0107323,-0.0233858 -0.0905197,-0.192185 -0.0907756,-0.201878l-0.0121339 -0.436732c-0.000314961,-0.0112402 0.00874409,-0.0205512 0.0199843,-0.0205512l1.66607 0c0.0112441,0 0.0202953,0.00931102 0.0199843,0.0205512 -0.00126772,0.045122 -0.0096378,0.435122 -0.0139567,0.444508l-0.0889528 0.194102c-0.00762205,0.0166654 -0.0311772,0.0148976 -0.0370118,-0.0016811l-0.0470945 -0.133386 -0.0963307 0.570839c-0.00161417,0.00958661 -0.0099685,0.0166772 -0.0197205,0.0166772z"/> <path id="_379292832" class="fil1" d="M1.40329 1.24609c-0.00840157,0 -0.0159921,-0.00530709 -0.0188386,-0.0133543l-0.175606 -0.498173 -0.0287165 0.120094c-0.00475197,0.0199409 -0.0329843,0.0203937 -0.0386417,0.000917323l-0.0844843 -0.290622 -0.0838858 0.219394c-0.00578346,0.0151614 -0.0262677,0.0173661 -0.0352362,0.00405118l-0.0845315 -0.125091 -1.5748e-005 2.3622e-005 0 -0.52885 0.833039 0c0.0112441,0 0.0202953,0.00931102 0.0199843,0.0205512 -0.00126772,0.045122 -0.0096378,0.435122 -0.0139567,0.444508l-0.0889528 0.194102c-0.00762205,0.0166654 -0.0311772,0.0148976 -0.0370118,-0.0016811l-0.0470945 -0.133386 -0.0963307 0.570839c-0.00161417,0.00958661 -0.0099685,0.0166772 -0.0197205,0.0166772z"/> <path id="_379293384" class="fil2" d="M0.00429921 0.298594l-0.00398819 -0.143559c-0.000314961,-0.0112402 0.00874409,-0.0205512 0.0199843,-0.0205512l1.66607 0c0.0112441,0 0.0202953,0.00931102 0.0199843,0.0205512 -0.000444882,0.0158346 -0.00176378,0.0741457 -0.00347638,0.143559l-0.183831 0 0 0.0628976c6.29921e-005,0.0635315 -0.0523228,0.10285 -0.100862,0.10285 -0.0555709,0 -0.10052,-0.0458071 -0.10052,-0.103965 -0.0459685,0.0349803 -0.108213,0.025122 -0.141409,-0.0201969 -0.0338425,0.0453346 -0.0970984,0.0549055 -0.14148,0.0205079 0,0.0645945 -0.0522795,0.103654 -0.100925,0.103654 -0.0357362,0 -0.0630157,-0.018878 -0.0801614,-0.0418307 -0.0183189,0.0253583 -0.0477402,0.0418307 -0.0808543,0.0418307 -0.0486417,0 -0.100925,-0.0390748 -0.100925,-0.103654 -0.0444331,0.0343898 -0.107654,0.0248189 -0.14148,-0.0205079 -0.033189,0.0453189 -0.0954449,0.0551732 -0.141409,0.0201969 0,0.13778 -0.201445,0.13598 -0.201445,0.00111417l0 -0.0628976 -0.183276 0z"/> <path id="_379293264" class="fil3" d="M0.853331 0.134484l0.833039 0c0.0112441,0 0.0202953,0.00931102 0.0199843,0.0205512 -0.000444882,0.0158346 -0.00176378,0.0741457 -0.00347638,0.143559l-0.183831 0 0 0.0628976c6.29921e-005,0.0635315 -0.0523228,0.10285 -0.100862,0.10285 -0.0555709,0 -0.10052,-0.0458071 -0.10052,-0.103965 -0.0459685,0.0349803 -0.108213,0.025122 -0.141409,-0.0201969 -0.0338425,0.0453346 -0.0970984,0.0549055 -0.14148,0.0205079 0,0.0645945 -0.0522795,0.103654 -0.100925,0.103654 -0.0357362,0 -0.0630157,-0.018878 -0.0801614,-0.0418307l-0.000358268 0.000488189 0 -0.288516z"/> <path id="_379292544" class="fil0" d="M0.546008 1.30221c-0.0527835,0 -0.0957441,-0.0429567 -0.0957441,-0.095748 0,-0.036685 0.0484291,-0.111787 0.0780315,-0.16826 0.00746063,-0.0142441 0.0279331,-0.0142283 0.0353976,0 0.0296614,0.0565157 0.0780197,0.131618 0.0780315,0.168256 3.14961e-005,0.0527953 -0.0429134,0.095752 -0.0957165,0.095752z"/> <path id="_379292472" class="fil0" d="M0.752256 1.10498c-0.0527835,0 -0.0957441,-0.0429567 -0.0957441,-0.095748 0,-0.0365394 0.0482717,-0.111673 0.0780315,-0.16826 0.00749213,-0.014252 0.0279291,-0.0142323 0.0353976,0 0.0296496,0.0565 0.0780394,0.131602 0.0780394,0.168244 7.87402e-006,0.0528071 -0.042937,0.0957638 -0.0957244,0.0957638z"/> <path id="_379291920" class="fil1" d="M1.16068 1.19411c-0.0527992,0 -0.095748,-0.0429567 -0.095748,-0.095748 0,-0.0367283 0.0484252,-0.111728 0.0780433,-0.168252 0.00748031,-0.0142756 0.0279528,-0.0141929 0.0353976,0 0.0296378,0.0564764 0.0780354,0.13161 0.0780433,0.168248 7.87402e-006,0.0527953 -0.0429449,0.095752 -0.0957362,0.095752z"/> <path id="_379292352" class="fil1" d="M1.4033 1.57217c-0.0527992,0 -0.0957441,-0.0429567 -0.0957441,-0.0957441 0,-0.0366496 0.0484134,-0.11178 0.0780433,-0.168264 0.0074685,-0.0142362 0.0279409,-0.0142362 0.0354016,0 0.0296496,0.0565591 0.0780354,0.131583 0.0780394,0.168264 1.5748e-005,0.0527992 -0.042937,0.0957441 -0.0957402,0.0957441z"/> <path id="_379291944" class="fil0" d="M0.303386 1.57217c-0.0527835,0 -0.0957441,-0.0429567 -0.0957441,-0.0957441 0,-0.0366457 0.0483898,-0.111748 0.0780394,-0.168264 0.00747244,-0.0142402 0.0279331,-0.0142283 0.0354016,0 0.0296693,0.0565315 0.0780276,0.131642 0.0780276,0.168264 7.87402e-006,0.0527992 -0.0429409,0.0957441 -0.0957244,0.0957441z"/> <path id="_379292328" class="fil0" d="M0.121409 1.11937c-0.0527874,0 -0.095748,-0.0429567 -0.095748,-0.095748 0,-0.0365945 0.0483465,-0.111724 0.0780433,-0.16826 0.00747638,-0.0142362 0.0279252,-0.0142441 0.0353976,0 0.0296654,0.0565236 0.0780354,0.13161 0.0780394,0.16826 1.1811e-005,0.0527913 -0.0429488,0.095748 -0.0957323,0.095748z"/> <path id="_379292256" class="fil1" d="M1.5853 1.13601c-0.0528031,0 -0.095748,-0.0429567 -0.095748,-0.095748 0,-0.0366929 0.048437,-0.11176 0.0780433,-0.16826 0.00747244,-0.0142638 0.0279291,-0.0142087 0.0353976,0 0.0296811,0.0564882 0.0780315,0.131677 0.0780315,0.16826 3.93701e-006,0.0528071 -0.0429409,0.095748 -0.0957244,0.095748z"/> </g> </g></svg>');
| | if ( iavg < 0.25 || memo.obsesA[0].data.cat == '5' ) { istr = 'Ei jäätä'; } |
| memo.widgetEl.append( '<p style="text-align: center; line-height: 20px;" class="huomio">Jäätilanne<br />' + iceT + '</p>' ); | | else if ( iavg < 0.75 ) { istr = 'Osittain jäässä'; } |
| | else { istr = 'Yhtenäinen jääpeite'; } |
| | |
| | if ( icount == 1 ) { |
| | istr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } else { |
| | istr += '<br /><span class="smaller">('; |
| | istr += '<button style="margin-left: -1px; padding: 0; font-size: 13px; margin-bottom: 3px; color: #59B500;" type="button" class="btn Xbtn-secondary Xbtn-info" data-toggle="tooltip" data-placement="top" title="" data-original-title="Perustuu yhteensä ' + icount + ' havaintoon ajanjaksolla: ' + memo.obsesA[ memo.obsesA.length-1 ].obsdatetime.toLocaleDateString() + '-' + memo.obsesA[0].obsdatetime.toLocaleDateString() + '."><span class="fontawesome"></span></button>'; |
| | istr += ' ↦' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } |
| | } |
| | } else { |
| | iavg = -1; |
| | istr = 'Ei tuoreita<br />havaintoja'; |
| | } |
| | |
| | var isvg = '<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">'; |
| | isvg += '<style type="text/css">.ice0{fill:#0076B0;} .ice1{fill:#D5DA26;} .icex{fill:#ccc;}</style>'; |
| | |
| | var rx = 10; |
| | var ry = 10; |
| | |
| | //ic = 1; |
| | //iavg = 0.5; |
| | |
| | for ( var row=0; row<10; row++ ) { |
| | for ( var col=0; col<10; col++ ) { |
| | x = col * 10 + 1; |
| | y = row * 10 + 1; |
| | //console.log( 1 + ivalavg/10 ); |
| | if ( icount > 0 ) { |
| | if ( ivalavg > 0 ) { |
| | if ( row < ivalavg/10 ) { |
| | aclass = 'ice1'; |
| | } else { |
| | aclass = 'ice0'; |
| | } |
| | } else { |
| | dist = Math.sqrt( Math.pow( (4.5-col), 2 ) + Math.pow( (4.5-row), 2 ) )/ Math.sqrt( 40.5 ); |
| | if ( today.getMonth() > 0 && today.getMonth() < 6 ) { dist = 1- dist; } |
| | random = (Math.random()-0.5)*0.25; |
| | if ( ( (dist+random) > (1-iavg) ) ) { |
| | aclass = 'ice1'; |
| | } else { |
| | aclass = 'ice0'; |
| | } |
| | } |
| | } else { |
| | aclass = 'icex'; |
| | } |
| | isvg += '<rect x="' + x.toString() +'" y="' + y.toString() +'" class="' + aclass + '" width="8" height="8"/>'; |
| | } |
| | } |
| | |
| | isvg += '</svg>'; |
| | |
| | memo.widgetEl.html(''); |
| | memo.widgetEl.append( '<h3 style="text-align: center; font-size: 18px; margin-top: 0;">Jäätilanne' + addToTitle + '</h3>' ); |
| | memo.widgetEl.append( '<div style="width: 120px; height: 120px; margin: 10px auto; padding: 10px; border-radius: 6px; Xborder: 3px solid rgba( 213, 218, 38, 0.5 );">' + isvg + '</div>'); |
| | memo.widgetEl.append( '<p style="text-align: center; line-height: 22px;" class="huomio">' + istr + '</p>' ); |
| | | |
|
| |
|
Rivi 751: |
Rivi 732: |
| var tsum = 0; | | var tsum = 0; |
| var tc = 0; | | var tc = 0; |
| | var tcsum = 0; |
| | | |
| for ( var o in memo.obsesA ) { | | for ( var o in memo.obsesA ) { |
| tsum += memo.obsesA[o].data.val; | | tw = ( 7 - Math.round( ( today.getTime() - memo.obsesA[o].obsdatetime.getTime() ) / ( 24*60*60*1000 ) ) ); |
| | tsum += memo.obsesA[o].data.val * tw; |
| | tcsum = tcsum + tw; |
| tc++; | | tc++; |
| } | | } |
|
| |
|
| if ( tc > 0 ) { | | if ( tcsum > 0 ) { |
| tavg = Math.round( tsum/tc*10 ) / 10; | | tavg = Math.round( tsum/tcsum*10 ) / 10; |
| tstr = tavg.toString().replace( '.', ',' ) + ' °C'; | | tstr = tavg.toString().replace( '.', ',' ) + ' °C'; |
| if ( tc == 1 ) { | | if ( tc == 1 ) { |
| tstr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; | | tstr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } else { |
| | //tstr += '<br /><span>(' + tc.toString() + ' havaintoa)</span>'; |
| | //tstr += ' <span class="smaller">(n=' + tc.toString() + ')</span><br /><span>(viimeisin ' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | tstr += '<br /><span class="smaller">(n=' + tc.toString() + ', viimeisin ' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| } | | } |
| up = Math.round( (tavg/33)*50 ); | | up = Math.round( (tavg/33)*50 ); |
Rivi 786: |
Rivi 774: |
| //fill = '#' + rgb[0].toString(16).padStart(2, '0') + rgb[1].toString(16).padStart(2, '0') + rgb[2].toString(16).padStart(2, '0'); | | //fill = '#' + rgb[0].toString(16).padStart(2, '0') + rgb[1].toString(16).padStart(2, '0') + rgb[2].toString(16).padStart(2, '0'); |
|
| |
|
| if ( tavg < 0 ) { fill ='#ccc'; } | | if ( tavg < 10 ) { fill = '#0076b0'; } |
| else if ( tavg < 10 ) { fill = '#0076b0'; }
| |
| else if ( tavg < 20 ) { fill = '#d5da26'; } | | else if ( tavg < 20 ) { fill = '#d5da26'; } |
| | else if ( tavg < 25 ) { fill = '#ff9933'; } |
| else { fill = '#da2626'; } | | else { fill = '#da2626'; } |
| | | |
Rivi 820: |
Rivi 808: |
| | | |
| var asum = 0; | | var asum = 0; |
| | var acsum = 0; |
| var ac = 0; | | var ac = 0; |
| | | |
| for ( var o in memo.obsesA ) { | | for ( var o in memo.obsesA ) { |
| asum += memo.obsesA[o].data.val; | | aw = ( 7 - Math.round( ( today.getTime() - memo.obsesA[o].obsdatetime.getTime() ) / ( 24*60*60*1000 ) ) ); |
| ac++; | | asum += memo.obsesA[o].data.val * aw; |
| | acsum = acsum + aw; |
| | ac++; |
| } | | } |
|
| |
|
| if ( ac > 0 ) { | | if ( acsum > 0 ) { |
| var aavg = Math.round( asum/ac ); | | |
| if ( aavg < 0.5 ) { astr = 'Ei sinilevää'; } | | var aavg = asum/acsum; |
| else if ( aavg < 1.5 ) { astr = 'Hieman sinilevää'; } | | if ( aavg < 0.25 ) { astr = 'Ei sinilevää'; } |
| else if ( aavg < 2.5 ) { astr = 'Runsaasti sinilevää'; } | | else if ( aavg < 1.25 ) { astr = 'Hieman sinilevää'; } |
| | else if ( aavg < 2.25 ) { astr = 'Runsaasti sinilevää'; } |
| else { astr = 'Erittäin runsaasti sinilevää'; } | | else { astr = 'Erittäin runsaasti sinilevää'; } |
| if ( ac == 1 ) { | | if ( ac == 1 ) { |
| astr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; | | astr += '<br /><span>(' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| | } else { |
| | astr += ' <span class="smaller"><br />(n=' + ac.toString() + ', viimeisin ' + memo.obsesA[0].obsdatetime.inRelationToToday(memo.lang).toLowerCase() + ')</span>'; |
| } | | } |
| } else { | | } else { |
Rivi 877: |
Rivi 871: |
|
| |
|
| } | | } |
| | | |
| function addDataToDateOfYearChart( memo ) {
| |
| | |
| // do X axis min and max for this chart type
| |
| memo.options.hAxis.minValue = new Date( memo.obsMinDateMs );
| |
| if ( memo.season = 'winter' && memo.options.hAxis.minValue.getMonth() < 8 ) { memo.options.hAxis.minValue.setFullYear( memo.options.hAxis.minValue.getFullYear()-1 ); }
| |
| memo.options.hAxis.minValue.setMonth(0);
| |
| memo.options.hAxis.minValue.setDate(1);
| |
| memo.options.hAxis.viewWindow.min = memo.options.hAxis.minValue;
| |
| | |
| memo.options.hAxis.maxValue = new Date( memo.obsMaxDateMs );
| |
| if ( memo.season = 'winter' && memo.options.hAxis.maxValue.getMonth() > 7 ) { memo.options.hAxis.maxValue.setFullYear( memo.options.hAxis.maxValue.getFullYear()+1 ); }
| |
| else { memo.options.hAxis.maxValue.setFullYear( memo.options.hAxis.maxValue.getFullYear()+1 ); }
| |
| memo.options.hAxis.maxValue.setMonth(11);
| |
| memo.options.hAxis.maxValue.setDate(31);
| |
| memo.options.hAxis.viewWindow.max = memo.options.hAxis.maxValue;
| |
| | |
| // do Y axis min and max for this chart type
| |
| memo.options.vAxis.minValue = new Date( memo.obsMinCompDate.getTime() );
| |
| memo.options.vAxis.minValue.setDate(1);
| |
| memo.options.vAxis.viewWindow.min = memo.options.vAxis.minValue;
| |
| | |
| memo.options.vAxis.maxValue = new Date( memo.obsMaxCompDate.getTime() );
| |
| memo.options.vAxis.maxValue.setMonth( memo.options.vAxis.maxValue.getMonth()+1 );
| |
| memo.options.vAxis.maxValue.setDate(0);
| |
| memo.options.vAxis.viewWindow.max = memo.options.vAxis.maxValue;
| |
| | |
| // do Y axis ticks and gridlines
| |
| memo.options.vAxis.ticks = [];
| |
| memo.vAxisGridlines = [];
| |
| memo.options.vAxis.gridlines = { color: 'transparent' };
| |
| memo.options.vAxis.minorGridlines = { color: 'transparent' };
| |
| minM = memo.options.vAxis.minValue.getMonth();
| |
| maxM = memo.options.vAxis.maxValue.getMonth();
| |
| | |
| if ( minM > maxM ) { mc = 13-minM+maxM; }
| |
| else { mc = maxM-minM+1; }
| |
| | |
| for ( mi = 0; mi < mc; mi++ ) {
| |
| | |
| mx = minM+mi;
| |
| yx = memo.options.vAxis.minValue.getFullYear();
| |
| if ( mx > 11 ) { yx = memo.options.vAxis.maxValue.getFullYear(); mx = mx - 12; }
| |
| | |
| startOfMonth = new Date( yx, mx, 1 );
| |
| middleOfMonth = new Date( yx, mx, 15 );
| |
| | |
| // ticks
| |
| memo.options.vAxis.ticks.push( { v: middleOfMonth, f: i18n['months'][mx]['long'][memo.lang] } );
| |
| | |
| // gridlines except for first
| |
| if (mi > 0) {
| |
| memo.vAxisGridlines.push( new Date( startOfMonth.getTime() ) );
| |
| }
| |
| }
| |
| | |
| memo.seriesO = {};
| |
| | |
| for ( var o in memo.obsesA ) {
| |
| obs = memo.obsesA[ o ];
| |
| s = obs.seriesId;
| |
| if ( typeof memo.seriesO[ s ] == 'undefined' ) {
| |
| memo.seriesO[ s ] = { 'id': s, 'order': parseInt( obs.data.cat ), 'title': i18n[ s ].title[ memo.lang ], 'type': 'scatter', 'color': i18n[ s ].color, 'obses': [] };
| |
| }
| |
| obs.xvalue = obs.seasonmiddle;
| |
| obs.yvalue = obs.compareDate;
| |
| obs.value = obs.obsdatetime.toLocaleDateString( memo.lang );
| |
| obs.valueUnit = i18n[ 'Date' ][ memo.lang ];
| |
| obs.tooltip = '<p><b>' + i18n[ 'season' ][ 'winter' ][ memo.lang ] + ' ' + obs.season + '–' + (obs.season+1) + '</b></p>';
| |
| obs.tooltip += '<p>' + i18n[ s ].title2[ memo.lang ] + ': ' + obs.obsdatetime.toLocaleDateString( memo.lang ) + '</p>';
| |
| obs.tooltip += obs.addInfo;
| |
| memo.seriesO[ s ].obses.push( obs );
| |
| }
| |
| | |
| // create ice cover series
| |
| if ( memo.obscode == 'ice_cat_2,5' ) {
| |
| memo.obsesS = {};
| |
| for ( var o in memo.obsesA ) {
| |
| var obs = memo.obsesA[ o ];
| |
| | |
| if ( typeof memo.obsesS[ obs.season ] == 'undefined' ) {
| |
| memo.obsesS[ obs.season ] = { 'maintainer': obs.maintainer };
| |
| }
| |
| | |
| if ( obs.data.cat == '2' ) {
| |
| memo.obsesS[ obs.season ][ 'low' ] = obs.compareDate;
| |
| } else if ( obs.data.cat == '5' ) {
| |
| memo.obsesS[ obs.season ][ 'high' ] = obs.compareDate;
| |
| }
| |
| if ( memo.obsesS[ obs.season ][ 'maintainer' ] != obs.maintainer ) { memo.obsesS[ obs.season ][ 'maintainer' ] = ''; }
| |
| | |
| if ( typeof memo.obsesS[ obs.season ][ 'low' ] != 'undefined' && typeof memo.obsesS[ obs.season ][ 'high' ] != 'undefined' ) {
| |
| days = Math.round( ( memo.obsesS[ obs.season ][ 'high' ].getTime() - memo.obsesS[ obs.season ][ 'low' ].getTime() ) / ( 1000*60*60*24 ) );
| |
| if ( typeof memo.seriesO[ 'ice_cat_2,5' ] == 'undefined' ) {
| |
| memo.seriesO[ 'ice_cat_2,5' ] = { 'id': 'ice_cat_2,5', 'order': 10, 'title': i18n[ 'ice_cat_2,5' ].title[ memo.lang ], 'type': 'candlestick', 'color': i18n[ 'ice_cat_2,5' ].color, obses: [] };
| |
| }
| |
| memo.seriesO[ 'ice_cat_2,5' ].obses.push( { 'obsdatetime': obs.obsdatetime, 'season': obs.season, 'value': days, 'valueUnit': i18n[ 'days' ][ memo.lang ], 'addInfo': '', 'maintainer': memo.obsesS[ obs.season ][ 'maintainer' ], 'xvalue': obs.seasonmiddle, 'low': memo.obsesS[ obs.season ][ 'low' ], 'high': memo.obsesS[ obs.season ][ 'high' ], 'tooltip': '<p><b>' + i18n[ 'season' ][ 'winter' ][ memo.lang ] + ' ' + obs.season + '–' + (obs.season+1) + '</b></p><p>' + i18n[ 'ice_cat_2,5' ].title[ memo.lang ] + ': ' + days + ' ' + i18n[ 'days' ][ memo.lang ] + '</p>' } );
| |
| }
| |
| | |
| }
| |
| }
| |
| | |
| memo.seriesA = []; for ( var s in memo.seriesO ) { memo.seriesA.push( memo.seriesO[s] ) };
| |
| memo.seriesA.sort( function( a, b ) { return a.order-b.order; } );
| |
| | |
| for ( var s in memo.seriesA ) {
| |
| | |
| if ( memo.seriesA[ s ].type == 'scatter' ) {
| |
| | |
| memo.data.addColumn( 'date', memo.seriesA[ s ].title ); // + ' ' + memo.obsMinYear + '-' + memo.obsMaxYear );
| |
| memo.data.addColumn( { type: 'string', 'role': 'style' } );
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| memo.data.addColumn( { type: 'string', role: 'annotation' } );
| |
| | |
| memo.options.series.push( { type: 'scatter', pointType: 'circle', pointSize: 9, color: memo.seriesA[ s ].color, XstrokeWidth: 2, Xstroke: '#000000' } );
| |
| | |
| if ( memo.seriesA[ s ].obses.length > 1 ) {
| |
| memo.options.trendlines[ memo.options.series.length - 1 ] = { type: 'linear', title: i18n.trendline, lineWidth: 2.33, visibleInLegend: false, tooltip: false };
| |
| } else {
| |
| memo.options.trendlines[ memo.options.series.length - 1 ] = { type: 'linear', title: i18n.trendline, lineWidth: 0, color: 'transparent', visibleInLegend: false, tooltip: false };
| |
| }
| |
| | |
| } else if ( memo.seriesA[ s ].type == 'candlestick' ) {
| |
| | |
| memo.data.addColumn( 'date', memo.seriesA[ s ].title );
| |
| memo.data.addColumn( 'date', '' );
| |
| memo.data.addColumn( 'date', '' );
| |
| memo.data.addColumn( 'date', '' );
| |
| memo.data.addColumn({ role: 'tooltip', 'p': { 'html': true } });
| |
| | |
| memo.options.series.push( { type: 'candlesticks', color: memo.seriesA[ s ].color, strokeWidth: 2, stroke: '#cccccc' } );
| |
| | |
| }
| |
| | |
| }
| |
| | |
| // add data to table
| |
| cc = memo.data.getNumberOfColumns();
| |
| var st = 0;
| |
| for ( var s in memo.seriesA ) {
| |
| | |
| for ( var o in memo.seriesA[ s ].obses ) {
| |
| | |
| obs = memo.seriesA[ s ].obses[ o ];
| |
| | |
| dataRow = [];
| |
| | |
| // fill row with nulls
| |
| for ( var i=0; i<cc; i++ ) { dataRow.push( null ); }
| |
| | |
| // x axis value
| |
| dataRow[ 0 ] = obs.xvalue;
| |
| | |
| if ( memo.seriesA[ s ].type == 'candlestick' ) {
| |
| | |
| dataRow[ st+1 ] = obs.low;
| |
| dataRow[ st+2 ] = obs.low;
| |
| dataRow[ st+3 ] = obs.high;
| |
| dataRow[ st+4 ] = obs.high;
| |
| dataRow[ st+5 ] = obs.tooltip;
| |
| | |
| } else if ( memo.seriesA[ s ].type == 'scatter' ) {
| |
| | |
| dataRow[ st+1 ] = obs.yvalue;
| |
| dataRow[ st+2 ] = obs.style;
| |
| dataRow[ st+3 ] = obs.tooltip;
| |
| dataRow[ st+4 ] = null;
| |
| }
| |
| | |
| memo.dataA.push( dataRow );
| |
| | |
| }
| |
| | |
| if ( memo.seriesA[ s ].type == 'candlestick' ) {
| |
| st += 5;
| |
| } else if ( memo.seriesA[ s ].type == 'scatter' ) {
| |
| st += 4;
| |
| }
| |
| | |
| }
| |
| | |
| drawChart(memo);
| |
| | |
| }
| |
|
| |
| function addDataToSeasonWithRefsChart(memo) {
| |
| | |
| // do axis min and max
| |
| memo.axisMinDate = new Date( memo.curSeason, 0, 1 );
| |
| memo.axisMaxDate = new Date( memo.curSeason, 11, 31 );
| |
| | |
| memo.data.addColumn( 'number', '1991-2020' );
| |
| memo.data.addColumn( { id:'i0', type:'number', role:'interval' } );
| |
| memo.data.addColumn( { id:'i0', type:'number', role:'interval' } );
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| memo.data.addColumn( 'number', memo.curSeason );
| |
| memo.data.addColumn( {'type': 'string', 'role': 'style' } );
| |
| memo.data.addColumn( { type: 'string', role: 'annotation' } );
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| | |
| // series for trend line
| |
| //memo.options.trendlines[0] = { labelInLegend: i18n['trendline'][memo.lang], tooltip: false, color: colors['trend'], lineWidth: 2, opacity: 0.5, type: 'linear', visibleInLegend: memo.trendType!='moving' };
| |
|
| |
| for (var o in memo.obsesA) {
| |
| if ( memo.obsesA[o].printouts.ObsCode == memo.refcode ) {
| |
| memo.obsesA[o].compareDate = getDateOfISOWeek( memo.obsesA[o].data.week, memo.curSeason )
| |
| memo.obsesA[o].compareDate.setDate( memo.obsesA[o].compareDate.getDate() + 3 );
| |
| }
| |
| }
| |
|
| |
| var weekdata = [];
| |
| for ( var w=1; w<=53; w++ ) {
| |
| weekdata.push( { 'week': w, 'val': null, 'mw': null, 'low': null, 'high': null, 'style': null } );
| |
| }
| |
|
| |
| for (var o in memo.obsesA) {
| |
| if ( memo.obsesA[ o ].printouts.ObsCode == memo.obscode ) {
| |
| weekdata[ memo.obsesA[ o ].data.week-1 ].val = memo.obsesA[ o ].data.val;
| |
| weekdata[ memo.obsesA[ o ].data.week-1 ].style = memo.obsesA[ o ].style;
| |
| } else {
| |
| weekdata[ memo.obsesA[ o ].data.week-1 ].mw = memo.obsesA[ o ].data.val;
| |
| weekdata[ memo.obsesA[ o ].data.week-1 ].low = memo.obsesA[ o ].data.low / 100;
| |
| weekdata[ memo.obsesA[ o ].data.week-1 ].high = memo.obsesA[ o ].data.high / 100;
| |
| }
| |
| }
| |
|
| |
| for ( var w in weekdata ) {
| |
|
| |
| mow = getDateOfISOWeek( weekdata[w].week, memo.curSeason );
| |
| mow.setDate( mow.getDate() + 3 );
| |
|
| |
| memo.dataA.push( [
| |
| mow,
| |
| weekdata[w].mw,
| |
| weekdata[w].low,
| |
| weekdata[w].high,
| |
| '<div style="padding: 5px;"><b>Vertailukauden 1991-2020 havainnot viikolla ' + weekdata[w].week + '</b><br />Suurin arvo (HW): ' + weekdata[w].high + '<br />Keskiarvo (MW): ' + weekdata[w].mw + '<br />Pienin arvo (LW): ' + weekdata[w].low + '</div>',
| |
| weekdata[w].val,
| |
| weekdata[w].style,
| |
| null,
| |
| '<div style="padding: 5px;"><b>Kuluvan vuoden vedenkorkeus viikolla ' + weekdata[w].week + '</b><br />Keskiarvo (MW): ' + weekdata[w].val + '</div>',
| |
| ] );
| |
| }
| |
|
| |
| // make ticks for x axis
| |
| memo.options.hAxis.ticks = [];
| |
| for (i=0; i<12; i++) {
| |
| //m = i+1;
| |
| middleOfMonth = new Date( memo.curSeason, i, 16 );
| |
| //console.log(m);
| |
| memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[i]['roman'] });
| |
| }
| |
| | |
| memo.options.seriesType = 'line';
| |
| memo.options.series[0] = { type: 'line', pointSize: 0, color: colors.average, lineWidth: 2.33 };
| |
| memo.options.curveType = 'function';
| |
| memo.options.intervals = { 'style': 'area' };
| |
| memo.options.series[1] = { type: 'line', pointSize: 2, color: colors.curObses, lineWidth: 5 };
| |
|
| |
| memo.options.vAxis.viewWindow.min = 80.5;
| |
| memo.options.vAxis.viewWindow.max = 81.7;
| |
|
| |
| memo.chart = new google.visualization.LineChart( memo.chartEl[0] ); // document.getElementById(memo.id)
| |
|
| |
| drawChart(memo);
| |
| }
| |
| | |
| function addDataToTrendWithHighLowChart (memo) {
| |
| | |
| //console.log( 'high low chart');
| |
| | |
| // do axis min and max
| |
| memo.axisMinDate = new Date(memo.obsMinDate.getTime());
| |
| memo.axisMaxDate = new Date(memo.obsMaxDate.getTime());
| |
| memo.axisMinDate.setMonth(0);
| |
| memo.axisMaxDate.setMonth(11);
| |
| memo.axisMinDate.setDate(1);
| |
| memo.axisMaxDate.setDate(31);
| |
| | |
| memo.data.addColumn( 'number', memo.obsMinYear + '-' + memo.obsMaxYear );
| |
| memo.data.addColumn( { id:'i0', type:'number', role:'interval' } );
| |
| memo.data.addColumn( { id:'i0', type:'number', role:'interval' } );
| |
| memo.data.addColumn( {'type': 'string', 'role': 'style' } );
| |
| memo.data.addColumn( { type: 'string', role: 'annotation' } );
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| | |
| // series for trend line
| |
| //memo.options.trendlines[0] = { labelInLegend: i18n['trendline'][memo.lang], tooltip: false, color: colors['trend'], lineWidth: 2, opacity: 0.5, type: 'linear', visibleInLegend: memo.trendType!='moving' };
| |
| | |
| //console.log( memo );
| |
| | |
| for (var o in memo.obsesA) {
| |
|
| |
| dateStr = memo.obsesA[o].popup.match( /\([^)]*\)/g );
| |
| yearStr = dateStr[0].match( /[0-9]{4}/g );
| |
| memo.obsesA[o].popup = memo.obsesA[o].popup.replace( dateStr[0], '(' + yearStr[0] + ')' );
| |
| memo.dataA.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, memo.obsesA[o].data.low/100, memo.obsesA[o].data.high/100, memo.obsesA[o].style, null, memo.obsesA[o].popup ] );
| |
| }
| |
| | |
| memo.options.hAxis.ticks = [];
| |
| for (i=memo.axisMinDate.getFullYear(); i<=memo.axisMaxDate.getFullYear(); i++) {
| |
| middleOfYear = new Date( i, 6, 1 );
| |
| memo.options.hAxis.ticks.push({v: middleOfYear, f: String(i) });
| |
| }
| |
| | |
| memo.options.seriesType = 'line';
| |
| memo.options.series[0] = { type: 'line', pointSize: 3, color: '#3366cc' };
| |
| memo.options.curveType = 'function';
| |
| memo.options.intervals = { 'style': 'area' };
| |
|
| |
| memo.options.vAxis.viewWindow.min = 80;
| |
| memo.options.vAxis.viewWindow.max = 82;
| |
|
| |
|
| |
| memo.chart = new google.visualization.LineChart( memo.chartEl[0] ); // document.getElementById(memo.id)
| |
|
| |
| drawChart(memo);
| |
| | |
| }
| |
| | |
| function addDataToTrendChart(memo) {
| |
| | |
| // do axis min and max
| |
| memo.axisMinDate = new Date(memo.obsMinDate.getTime());
| |
| memo.axisMaxDate = new Date(memo.obsMaxDate.getTime());
| |
| memo.axisMinDate.setMonth(0);
| |
| memo.axisMaxDate.setMonth(11);
| |
| memo.axisMinDate.setDate(1);
| |
| memo.axisMaxDate.setDate(31);
| |
| | |
| memo.data.addColumn( 'number', memo.obsMinYear + '-' + memo.obsMaxYear );
| |
| memo.data.addColumn( {'type': 'string', 'role': 'style' } );
| |
| memo.data.addColumn( { type: 'string', role: 'annotation' } );
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| | |
| // series for trend line
| |
| memo.options.trendlines[0] = { labelInLegend: i18n['trendline'][memo.lang], tooltip: false, color: colors['trend'], lineWidth: 2, opacity: 0.5, type: 'linear', visibleInLegend: memo.trendType!='moving' };
| |
| | |
| | |
| for (var o in memo.obsesA) {
| |
| | |
| //dataRow = [];
| |
| | |
| //if (!!memo.obsesA[o].addInfo) {
| |
| //dataArr.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, 0, memo.obsesA[o].value, memo.obsesA[o].value, 'point { size: 5; fill-color: #0076b0; stroke-width: 2; stroke-color: ' + maintColors[memo.obsesA[o].maintainer] + '; }', '', memo.obsesA[o].popup ] );
| |
| //memo.dataA.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, 'point { size: 5; fill-color: #0076b0; stroke-width: 2; stroke-color: ' + maintColors[memo.obsesA[o].maintainer] + '; }', null, memo.obsesA[o].popup ] );
| |
| memo.dataA.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, memo.obsesA[o].style, null, memo.obsesA[o].popup ] );
| |
| //} else {
| |
| //dataArr.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, 0, memo.obsesA[o].value, memo.obsesA[o].value, 'point { size: 4; fill-color: #5893b0; stroke-width: 2; stroke-color: ' + maintColors[memo.obsesA[o].maintainer] + '; }', '', memo.obsesA[o].popup ] );
| |
| //memo.dataA.push( [ memo.obsesA[o].obsdatetime, memo.obsesA[o].value, 'point { size: 4; fill-color: #5893b0; stroke-width: 2; stroke-color: ' + maintColors[memo.obsesA[o].maintainer] + '; }', null, memo.obsesA[o].popup ] );
| |
| //}
| |
| | |
| //memo.dataA.push( dataRow );
| |
| | |
| }
| |
| | |
| memo.options.hAxis.ticks = [];
| |
| for (i=memo.axisMinDate.getFullYear(); i<=memo.axisMaxDate.getFullYear(); i++) {
| |
| middleOfYear = new Date( i, 6, 1 );
| |
| memo.options.hAxis.ticks.push({v: middleOfYear, f: String(i) });
| |
| }
| |
| | |
| memo.options.series[0] = {type: 'scatter', pointSize: 6, color: '#3366cc' };
| |
| | |
| drawChart(memo);
| |
| | |
| }
| |
| | |
| function addDataToSeasonChart(memo) {
| |
| | |
| memo.axisMinDate = new Date( memo.obsMinCompDateMs );
| |
| memo.axisMinDate.setDate(1);
| |
| memo.axisMaxDate = new Date( memo.obsMaxCompDateMs );
| |
| memo.axisMaxDate.setMonth( memo.axisMaxDate.getMonth()+1 );
| |
| memo.axisMaxDate.setDate(0);
| |
| | |
| memo.seasonsO = {};
| |
| memo.seasonsA = [];
| |
| | |
| for (var o in memo.obsesA) {
| |
| | |
| s = memo.obsesA[o].seriesId;
| |
| if (typeof memo.seasonsO[s] == 'undefined' ) { memo.seasonsO[s] = { 'obses': [] }; }
| |
| memo.seasonsO[s].obses.push( memo.obsesA[o] );
| |
| }
| |
| | |
| for (var o in memo.seasonsO) { memo.seasonsA.push(o); } memo.seasonsA.sort( function(a,b) { return b-a; } );
| |
| | |
| // create cols for each series
| |
| var sc = 0;
| |
| for (var s in memo.seasonsA) {
| |
| | |
| // data
| |
| if ( memo.season == 'summer' ) {
| |
| memo.data.addColumn( 'number', memo.seasonsA[s].toString() );
| |
| } else {
| |
| memo.data.addColumn( 'number', memo.seasonsA[s].toString() + '-' + (parseInt(memo.seasonsA[s])+1).toString() );
| |
| }
| |
| // style
| |
| memo.data.addColumn( { type: 'string', role: 'style' } );
| |
| // tooltip
| |
| memo.data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
| |
| // annotation
| |
| memo.data.addColumn( { type: 'string', role: 'annotation' } );
| |
| | |
| // add to series
| |
| if ( memo.seasonsA[s] == memo.curSeason ) {
| |
| if ( memo.type == 'cat' ) {
| |
| memo.options.series[sc++] = { type: 'scatter', curveType: 'function', color: colors['curObses'], XpointSize: 3, lineWidth: 0, visibleInLegend: true, hideThis: false, origSize: 10 };
| |
| } else {
| |
| if ( memo.obscode == 'secchi' ) {
| |
| //console.log('secchi');
| |
| memo.options.series[sc++] = { type: 'area', curveType: 'function', color: colors['curObses'], pointSize: 3, lineWidth: 4, visibleInLegend: true, hideThis: false, origSize: 10 };
| |
| } else {
| |
| memo.options.series[sc++] = { type: 'scatter', curveType: 'function', color: colors['curObses'], XpointSize: 3, lineWidth: 4, visibleInLegend: true, hideThis: false, origSize: 10 };
| |
| }
| |
| }
| |
| } else {
| |
| memo.options.series[sc++] = { type: 'scatter', curveType: 'function', color: colors['obses'], XpointSize: 5, lineWidth: 0, visibleInLegend: false, hideThis: true, origSize: 5 };
| |
| }
| |
| }
| |
| | |
| // legend entry for timespan
| |
| memo.data.addColumn( 'number', memo.obsMinDate.getFullYear() + '-' + memo.obsMaxDate.getFullYear() );
| |
| memo.options.series[sc++] = { type: 'scatter', color: colors['obses'], pointSize: 5, visibleInLegend: true, hideThis: false };
| |
| | |
| // series for average
| |
| memo.data.addColumn( 'number', i18n['average'][memo.lang] );
| |
| if ( i18n[memo.obscode].trend.layout == 'area') {
| |
| memo.options.series[sc++] = { type: 'area', curveType: 'function', lineWidth: 2, pointSize: 0, color: colors['average'], areaOpacity: 0.25, lineDashStyle: [2,2], enableInteractivity: false, visibleInLegend: memo.trendType=='moving' };
| |
| } else {
| |
| memo.options.series[sc++] = { type: 'line', curveType: 'function', lineWidth: 3, pointSize: 5, color: colors['average'], dataOpacity: 0.75, lineDashStyle: [6,3], enableInteractivity: false, visibleInLegend: memo.trendType=='moving' };
| |
| }
| |
| memo.data.addColumn( { id: 'dev', type: 'number', role: 'interval' } );
| |
| memo.data.addColumn( { id: 'dev', type: 'number', role: 'interval' } );
| |
| | |
| if ( memo.seasonsA.length == 1 && memo.seasonsA[0] == memo.curSeason ) {
| |
| memo.options.series[ sc-1 ].lineWidth = 0;
| |
| memo.options.series[ sc-1 ].pointSize = 0;
| |
| memo.options.series[ sc-1 ].labelInLegend = false;
| |
| memo.options.intervals = { 'style':'none' };
| |
| }
| |
|
| |
| // series for trend line
| |
| memo.data.addColumn( 'number', 'trend' );
| |
| //memo.options.trendlines[sc] = { labelInLegend: i18n['trendline'][memo.lang], tooltip: false, color: colors['trend'], lineWidth: 2, opacity: 0.5, type: 'polynomial', degree: 15, visibleInLegend: memo.trendType!='moving' };
| |
| memo.options.series[sc++] = { type: 'scatter', pointSize: 0, enableInteractivity: false, visibleInLegend: false, hideThis: false };
| |
| | |
| // do average
| |
| if (memo.trendType == 'gaussian') {
| |
| | |
| memo.gSmoothing = 4;
| |
| if ( i18n[memo.obscode]['type'] == 'cat') {
| |
| memo.distF = 0.1;
| |
| } else {
| |
| memo.distF = 0;
| |
| }
| |
| | |
| // sort according to compare date
| |
| memo.obsesA.sort( function( a, b ) { return a.compareDate - b.compareDate; });
| |
| | |
| // make week averages
| |
| memo.avgW = {};
| |
| for (var o in memo.obsesA) {
| |
| | |
| mwDate = new Date( memo.obsesA[o].compareDate.getFullYear(), memo.obsesA[o].compareDate.getMonth(), memo.obsesA[o].compareDate.getDate() );
| |
| y = mwDate.getFullYear();
| |
| w = mwDate.getWeek();
| |
| v = memo.obsesA[o].value + memo.distF*Math.random() - memo.distF*Math.random();
| |
| | |
| if ( typeof memo.avgW[y] == 'undefined' ) { memo.avgW[y] = {}; }
| |
| | |
| if ( typeof memo.avgW[y][w] == 'undefined' ) {
| |
| mwDate.setDate( mwDate.getDate() - mwDate.getDay() + 3 )
| |
| memo.avgW[y][w] = { cDate: mwDate, values: [ v ], sum: v, count: 1, avg: v };
| |
| } else {
| |
| memo.avgW[y][w].values.push( v );
| |
| memo.avgW[y][w].sum += v;
| |
| memo.avgW[y][w].count++;
| |
| memo.avgW[y][w].avg = memo.avgW[y][w].sum / memo.avgW[y][w].count;
| |
| }
| |
| }
| |
|
| |
| // calculate standard deviation
| |
| devSum = 0;
| |
| devC = 0;
| |
| devMax = 0;
| |
| for ( var y in memo.avgW ) {
| |
| for ( var w in memo.avgW[y] ) {
| |
| devC++;
| |
| devx = 0;
| |
| for (var vi in memo.avgW[y][w].values ) {
| |
| devx += Math.pow( (memo.avgW[y][w].values[vi] - memo.avgW[y][w].avg), 2 );
| |
| }
| |
| memo.avgW[y][w].dev = Math.sqrt( devx/memo.avgW[y][w].count );
| |
| devSum += memo.avgW[y][w].dev;
| |
| devMax = Math.max( memo.avgW[y][w].dev, devMax );
| |
| }
| |
| }
| |
| | |
| devAvg = devSum/devC;
| |
| | |
| for ( var y in memo.avgW ) {
| |
| for ( var w in memo.avgW[y] ) {
| |
| if ( memo.avgW[y][w].count < 5 ) {
| |
| //memo.avgW[y][w].dev = Math.max( memo.avgW[y][w].dev, devAvg );
| |
| }
| |
| }
| |
| }
| |
| | |
| memo.avgWlist = [];
| |
| | |
| for ( var y in memo.avgW ) {
| |
| for ( var w in memo.avgW[y] ) {
| |
| memo.avgWlist.push( { y: parseInt(y), w: parseInt(w), avg: memo.avgW[y][w].avg, dev: memo.avgW[y][w].dev } );
| |
| }
| |
| }
| |
| | |
| memo.avgWlist.sort( function(a, b) { return (a.y*100+a.w) - (b.y*100+b.w); });
| |
| | |
| firstY = memo.avgWlist[0].y;
| |
| firstW = memo.avgWlist[0].w;
| |
| lastY = memo.avgWlist[memo.avgWlist.length-1].y;
| |
| lastW = memo.avgWlist[memo.avgWlist.length-1].w;
| |
| | |
| memo.avgMlist = [];
| |
| memo.avgLlist = [];
| |
| memo.avgHlist = [];
| |
| | |
| for ( var y=firstY; y<=lastY; y++ ) {
| |
| | |
| if ( y == firstY ) { w1 = firstW; }
| |
| else { w1 = 1; }
| |
| | |
| if ( y == lastY ) { w2 = lastW; }
| |
| else { w2 = 52; }
| |
| | |
| for ( var w=w1; w<=w2; w++) {
| |
| | |
| //console.log( y + '/' + w );
| |
| | |
| if ( typeof(memo.avgW[y][w]) == 'undefined' ) {
| |
| | |
| memo.avgMlist.push( null );
| |
| memo.avgLlist.push( null );
| |
| memo.avgHlist.push( null );
| |
| | |
| | |
| } else {
| |
| memo.avgMlist.push( memo.avgW[y][w].avg );
| |
| | |
| if ( memo.avgW[y][w].count < 2 ) {
| |
| d = Math.max( devMax, memo.avgW[y][w].dev );
| |
| } else if ( memo.avgW[y][w].count < 4 ) {
| |
| d = Math.max( devAvg, memo.avgW[y][w].dev );
| |
| } else {
| |
| d = memo.avgW[y][w].dev;
| |
| }
| |
| | |
| if ( i18n[memo.obscode].type == 'cat' && ( memo.avgW[y][w].avg - 2*memo.avgW[y][w].dev ) < -memo.distF ) {
| |
| memo.avgLlist.push( -memo.distF*Math.random()*2 );
| |
| } else {
| |
| memo.avgLlist.push( memo.avgW[y][w].avg - 2*d ); //memo.avgW[y][w].dev );
| |
| }
| |
| | |
| memo.avgHlist.push( memo.avgW[y][w].avg + 2*d ); //memo.avgW[y][w].dev );
| |
| }
| |
| }
| |
| }
| |
| | |
| //console.log(memo.avgLlist);
| |
| | |
| for ( var i=0; i<memo.avgMlist.length; i++ ) {
| |
| | |
| if ( memo.avgMlist[i] === null ) {
| |
| | |
| lastM = memo.avgMlist[i-1];
| |
| lastL = memo.avgLlist[i-1];
| |
| lastH = memo.avgHlist[i-1];
| |
| | |
| for ( var ix=(i+1); ix < memo.avgMlist.length; ix++ ) {
| |
| | |
| if ( memo.avgMlist[ix] !== null ) {
| |
| | |
| memo.avgMlist[i] = lastM + (memo.avgMlist[ix]-lastM) / (ix-i+1);
| |
| memo.avgLlist[i] = lastL + (memo.avgLlist[ix]-lastL) / (ix-i+1);
| |
| memo.avgHlist[i] = lastH + (memo.avgHlist[ix]-lastH) / (ix-i+1);
| |
| | |
| break;
| |
| }
| |
| }
| |
| }
| |
| }
| |
| | |
| if ( memo.avgMlist.length >= 52 ) {
| |
| | |
| memo.avgMlist = memo.avgMlist.slice( memo.avgMlist.length - memo.gSmoothing/2 - 2 ).concat( memo.avgMlist ).concat( memo.avgMlist.slice( 0, memo.gSmoothing/2 + 2 ) );
| |
| memo.avgLlist = memo.avgLlist.slice( memo.avgLlist.length - memo.gSmoothing/2 - 2 ).concat( memo.avgLlist ).concat( memo.avgLlist.slice( 0, memo.gSmoothing/2 + 2 ) );
| |
| memo.avgHlist = memo.avgHlist.slice( memo.avgHlist.length - memo.gSmoothing/2 - 2 ).concat( memo.avgHlist ).concat( memo.avgHlist.slice( 0, memo.gSmoothing/2 + 2 ) );
| |
| | |
| //console.log( memo.avgMlist );
| |
| | |
| } else {
| |
| | |
| for (var x=0; x < ( memo.gSmoothing/2 + 3 ); x++) {
| |
| | |
| if ( memo.obscode == 'secchi' ) {
| |
| prev = Math.max ( memo.avgMlist[0], 0 );
| |
| next = Math.max ( memo.avgMlist[memo.avgMlist.length-1], 0 );
| |
| } else {
| |
| prev = Math.max ( 2 * memo.avgMlist[0] - memo.avgMlist[1], 0 );
| |
| next = Math.max ( 2 * memo.avgMlist[memo.avgMlist.length-1] - memo.avgMlist[memo.avgMlist.length-2], 0 );
| |
| }
| |
| | |
| memo.avgMlist.unshift( prev );
| |
| memo.avgMlist.push( next );
| |
| | |
| memo.avgLlist.unshift( prev - 2 * devAvg );
| |
| memo.avgLlist.push( next - 2 * devAvg );
| |
| | |
| memo.avgHlist.unshift( prev + 2 * devAvg );
| |
| memo.avgHlist.push( next + 2 * devAvg );
| |
| }
| |
| | |
| }
| |
| | |
| memo.avgMsmooth = smooth( memo.avgMlist, memo.gSmoothing );
| |
| memo.avgLsmooth = smooth( memo.avgLlist, memo.gSmoothing );
| |
| memo.avgHsmooth = smooth( memo.avgHlist, memo.gSmoothing );
| |
| | |
| cc = memo.data.getNumberOfColumns();
| |
| | |
| msW = 7*24*60*60*1000;
| |
| | |
| for ( var i=0; i < ( memo.avgMsmooth.length ); i++ ) {
| |
| | |
| // put data into dataArr
| |
| dataRow = [];
| |
| for (var e=0; e<cc; e++) { dataRow.push( null ); }
| |
|
| |
| xdate = new Date( memo.avgW[firstY][firstW].cDate.getTime() + ( i + 1 - memo.gSmoothing/2 ) * msW );
| |
| if ( xdate.getTime() < memo.axisMinDate.getTime() ) {
| |
| dataRow[0] = memo.axisMinDate;
| |
| } else if ( xdate.getTime() > memo.axisMaxDate.getTime() ) {
| |
| dataRow[0] = memo.axisMaxDate;
| |
| } else {
| |
| dataRow[0] = xdate; //new Date( memo.avgW[firstY][firstW].cDate.getTime() + ( i + 1 - memo.gSmoothing/2 ) * msW );
| |
| }
| |
|
| |
| dataRow[cc-4] = memo.avgMsmooth[i];
| |
|
| |
| if ( memo.obscode == 'level' ) {
| |
| dataRow[cc-3] = memo.avgLsmooth[i];
| |
| } else {
| |
| dataRow[cc-3] = Math.max( memo.avgLsmooth[i], 0 );
| |
| }
| |
| dataRow[cc-2] = memo.avgHsmooth[i];
| |
| | |
| memo.dataA.push( dataRow );
| |
| }
| |
|
| |
| } else if (memo.trendType == 'moving') {
| |
| | |
| //
| |
| }
| |
| | |
| // add data to table
| |
| cc = memo.data.getNumberOfColumns();
| |
| | |
| for (var s in memo.seasonsA) {
| |
| | |
| for (var o in memo.seasonsO[memo.seasonsA[s]].obses) {
| |
| | |
| obs = memo.seasonsO[memo.seasonsA[s]].obses[o];
| |
| | |
| dataRow = [];
| |
| | |
| // fill row with nulls
| |
| for (var i=0; i<cc; i++) { dataRow.push( null ); }
| |
| | |
| // x axis value
| |
| dataRow[0] = obs.compareDate;
| |
| | |
| // data for series cols
| |
| if ( memo.seasonsA[s] == memo.curSeason ) {
| |
| dataRow[s*4+1] = obs.value;
| |
| } else {
| |
| dataRow[s*4+1] = obs.value + memo.distF*Math.random() - memo.distF*Math.random();
| |
| }
| |
| dataRow[s*4+2] = obs.style;
| |
| dataRow[s*4+3] = obs.popup;
| |
| //console.log( obs.compareDate );
| |
| if ( ( today.getTime() - obs.compareDate.getTime() < 10*24*60*60*1000 ) && s == 0 && o == ( memo.seasonsO[memo.seasonsA[s]].obses.length - 1 ) ) {
| |
| | |
| var diff = obs.value - memo.avgW[ obs.compareDate.getFullYear() ][ obs.compareDate.getWeek() ].avg;
| |
| var diff = Math.round( diff*100 );
| |
| var diffStr = diff.toString() + ' cm';
| |
| if ( diff > 0 ) { diffStr = '+' + diffStr; }
| |
| | |
| dataRow[s*4+4] = null; //diffStr; //annotation
| |
| } else {
| |
| dataRow[s*4+4] = null; //annotation
| |
| }
| |
| | |
| memo.dataA.push( dataRow );
| |
| | |
| }
| |
| | |
| }
| |
| | |
| // make ticks for x axis
| |
| | |
| var minM = memo.axisMinDate.getMonth();
| |
| var minY = memo.axisMinDate.getFullYear();
| |
| var maxM = memo.axisMaxDate.getMonth();
| |
| | |
| if (maxM < minM) {
| |
| mCount = 13 - minM + maxM; // 13-10+4 = 1+4
| |
| } else {
| |
| mCount = maxM - minM + 1;
| |
| }
| |
| | |
| memo.options.hAxis.viewWindow.min = memo.axisMinDate;
| |
| memo.options.hAxis.viewWindow.max = memo.axisMaxDate;
| |
| memo.options.hAxis.ticks = [];
| |
| | |
| for (i=0; i<mCount; i++) {
| |
| | |
| m = minM + i;
| |
| maxY = minY;
| |
| | |
| if (m > 11) {
| |
| m = minM + i - 12;
| |
| maxY++;
| |
| }
| |
| | |
| middleOfMonth = new Date( maxY, m, 16 );
| |
| | |
| if (mCount < 5) {
| |
| memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[m]['long'][memo.lang] });
| |
| } else if ( mCount < 10 ) {
| |
| memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[m]['short'][memo.lang] });
| |
| } else {
| |
| memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[m]['roman'] });
| |
| }
| |
| }
| |
| | |
| drawChart(memo);
| |
| | |
| }
| |
| | |
| function drawChart(memo) {
| |
|
| |
| memo.loaderEl.fadeOut( "slow", function() { memo.loaderEl.remove(); } );
| |
| | |
| if (memo.dataA.length > 0) {
| |
| | |
| memo.data.addRows(memo.dataA);
| |
| | |
| if ( typeof memo.chart == 'undefined' ) {
| |
| memo.chart = new google.visualization.ComboChart( memo.chartEl[0] ); // document.getElementById(memo.id)
| |
| }
| |
| | |
| //doResize();
| |
| | |
| memo.fullscreenEl.fadeIn( "slow" );
| |
| if ( memo.download) { memo.downloadEl.fadeIn( "slow" ); }
| |
| | |
| memo.selectedCol = 0;
| |
| google.visualization.events.addListener( memo.chart, 'select', function () {
| |
| | |
| var selection = memo.chart.getSelection();
| |
| | |
| if (selection.length > 0) {
| |
| | |
| var col = selection[0].column;
| |
| | |
| for (var c in memo.options.series) {
| |
| if (memo.options.series[c].hideThis) {
| |
| memo.options.series[c].lineWidth = 0;
| |
| //memo.options.series[c].pointSize = memo.options.series[c].origSize;
| |
| memo.options.series[c].color = colors['obses'];
| |
| memo.options.series[c].visibleInLegend = false;
| |
| }
| |
| }
| |
| | |
| if (col != memo.selectedCol && memo.options.series[(col-1)/4].hideThis) {
| |
| memo.selectedCol = col;
| |
| memo.options.series[(col-1)/4].lineWidth = 3;
| |
| //memo.options.series[(col-1)/4].pointSize = 12;
| |
| memo.options.series[(col-1)/4].color = colors['selObses'];
| |
| memo.options.series[(col-1)/4].visibleInLegend = true;
| |
| } else {
| |
| memo.selectedCol = 0;
| |
| }
| |
| | |
| } else {
| |
| | |
| memo.selectedCol = 0;
| |
| | |
| for (var c in memo.options.series) {
| |
| if (memo.options.series[c].hideThis) {
| |
| memo.options.series[c].lineWidth = 0;
| |
| //memo.options.series[c].pointSize = memo.options.series[c].origSize;
| |
| memo.options.series[c].color = colors['obses'];
| |
| memo.options.series[c].visibleInLegend = false;
| |
| }
| |
| }
| |
| | |
| }
| |
| | |
| doResize( memo );
| |
| | |
| });
| |
| | |
| | |
| } else {
| |
| | |
| jQuery( jQuery( document.getElementById(memo.id) ) ).hide();
| |
| | |
| }
| |
| | |
| doResize( memo );
| |
| | |
| }
| |
|
| |
| var doResize = function( memo ) {
| |
|
| |
| function wait() {
| |
|
| |
| //console.log( memo );
| |
|
| |
| var w = memo.chartEl.width();
| |
| var h = memo.chartEl.height();
| |
|
| |
| //console.log( w );
| |
|
| |
| if ( typeof memo.oldW == 'undefined' ) { memo.oldW = 1; }
| |
| if ( typeof memo.oldH == 'undefined' ) { memo.oldH = 1; }
| |
|
| |
| if ( ( w != memo.oldW || h != memo.oldH ) && w*h != 0 ) {
| |
|
| |
| memo.oldW = w; memo.oldH = h;
| |
| | |
| memo.margins = { top: 10, right: 10, bottom: 80, left: 80 };
| |
| | |
| var w = memo.chartEl.width();
| |
| var h = memo.chartEl.height();
| |
| | |
| var l = Math.max( memo.margins.left, 0.1*w );
| |
| var r = Math.max( memo.margins.right, 0.02*w );
| |
| var t = Math.max( memo.margins.top, 0.02*h );
| |
| var b = Math.max( memo.margins.bottom, 0.15*h );
| |
| | |
| memo.options.chartArea = { top: t, left: l, width: (w - l - r), height: (h - t - b), backgroundColor: { fill: '#fff', stroke: '#eee', strokeWidth: 4 }};
| |
| | |
| memo.chart.draw( memo.data, memo.options );
| |
| | |
| // hide every second vaxis gridline on cat charts
| |
| if ( i18n[memo.obscode]['type'] == 'cat') {
| |
| var glc = 0;
| |
| jQuery( document.getElementById(memo.id) ).find( 'rect[height="1"]' ).each( function() {
| |
| if ( ( glc++ % 2 ) == 0 ) {
| |
| jQuery( this ).attr( 'fill', 'none' );
| |
| }
| |
| });
| |
| }
| |
| | |
| // add dash to trendlines
| |
| jQuery( document.getElementById(memo.id) ).find( 'path[stroke-width="2.33"]' ).each( function() {
| |
| jQuery( this ).attr('stroke-dasharray', '5, 5');
| |
| });
| |
| | |
| // move current observations to top
| |
| gEl = jQuery( document.getElementById(memo.id) ).find( 'svg' ).append( 'g' );
| |
| jQuery( document.getElementById(memo.id) ).find( 'path[stroke="#3366cc"]' ).detach().appendTo( gEl );
| |
| jQuery( document.getElementById(memo.id) ).find( 'circle[fill="#3366cc"]' ).detach().appendTo( gEl );
| |
| jQuery( document.getElementById(memo.id) ).find( 'circle[stroke-width="3"]' ).each( function() { jQuery( this ).parent().append( jQuery( this ) ); });
| |
| | |
| }
| |
| }
| |
| //wait();
| |
| if ( typeof memo.chartEl != 'undefined' ) {
| |
| setTimeout( wait, 500 );
| |
| }
| |
| | |
| }
| |
| window.jwcurrentchartresize = doResize;
| |
| | |
| function smooth( list, degree ) {
| |
| var win = degree*2-1;
| |
| weight = _.range(0, win).map(function (x) { return 1.0; });
| |
| weightGauss = [];
| |
| for (i in _.range(0, win)) {
| |
| i = i-degree+1;
| |
| frac = i/win;
| |
| gauss = 1 / Math.exp((4*(frac))*(4*(frac)));
| |
| weightGauss.push(gauss);
| |
| }
| |
| weight = _(weightGauss).zip(weight).map(function (x) { return x[0]*x[1]; });
| |
| smoothed = _.range(0, (list.length+1)-win).map(function (x) { return 0.0; });
| |
| for (i=0; i < smoothed.length; i++) {
| |
| smoothed[i] = _(list.slice(i, i+win)).zip(weight).map(function (x) { return x[0]*x[1]; }).reduce(function (memo, num){ return memo + num; }, 0) / _(weight).reduce(function (memo, num){ return memo + num; }, 0);
| |
| }
| |
| return smoothed;
| |
| }
| |
| | |
| function dec2hex( dec, padding ) { | | function dec2hex( dec, padding ) { |
| return parseInt( dec, 10 ).toString( 16 ).padStart( padding, '0' ); | | return parseInt( dec, 10 ).toString( 16 ).padStart( padding, '0' ); |