Ei muokkausyhteenvetoa |
Ei muokkausyhteenvetoa |
||
| (157 välissä olevaa versiota samalta käyttäjältä ei näytetä) | |||
| Rivi 43: | Rivi 43: | ||
memo.graphType = jQuery( this ).attr( 'data-graph-type' ); | memo.graphType = jQuery( this ).attr( 'data-graph-type' ); | ||
memo.editUrl = jQuery( this ).attr( 'data-edit-url' ); if (typeof memo.editUrl == 'undefined') { memo.editUrl = '-'; } | memo.editUrl = jQuery( this ).attr( 'data-edit-url' ); if (typeof memo.editUrl == 'undefined') { memo.editUrl = '-'; } | ||
memo.csvfile = jQuery( this ).attr( 'data-csv-filename' ); if (typeof memo.csvfile == 'undefined') { memo.csvfile = i18n[ memo.obscode ].title[ memo.lang ] + '_SiteID-' + memo.siteid + '_Downloaded-' + today.toISOString().split( 'T' )[0] + '.csv'; } | |||
if ( typeof jQuery( this ).attr( 'data-maintainer' ) == 'undefined' ) { memo.maintainerShow = false; } | if ( typeof jQuery( this ).attr( 'data-maintainer' ) == 'undefined' ) { memo.maintainerShow = false; } | ||
else { memo.maintainerShow = ( jQuery( this ).attr( 'data-maintainer' ).toLowerCase() == 'true' ); } | else { memo.maintainerShow = ( jQuery( this ).attr( 'data-maintainer' ).toLowerCase() == 'true' ); } | ||
| Rivi 111: | Rivi 112: | ||
drawVisualization(memo); | drawVisualization(memo); | ||
}); | }); | ||
}); | }); | ||
| Rivi 195: | Rivi 194: | ||
obs.img = new Image(); | obs.img = new Image(); | ||
obs.img.src = obs.media_url; | obs.img.src = obs.media_url; | ||
obs.addInfo = ' | obs.addInfo = '<img style="max-width: 196px; max-height: 196px;" src="' + obs.media_url + '" />'; | ||
} | } | ||
if ( !!obs.printouts[ 'Lisätiedot' ][0] ) { | if ( !!obs.printouts[ 'Lisätiedot' ][0] ) { | ||
| Rivi 209: | Rivi 208: | ||
// add compare date to obses | // add compare date to obses | ||
if ( memo.season == 'summer' || obs.obsdatetime.getMonth() > 7 ) { | if ( memo.season == 'summer' || obs.obsdatetime.getMonth() > 7 ) { | ||
obs.compareDate = new Date( memo.curSeason, obs.obsdatetime.getMonth(), obs.obsdatetime.getDate() ); | obs.compareDate = new Date( memo.curSeason, obs.obsdatetime.getMonth(), obs.obsdatetime.getDate(), obs.obsdatetime.getHours(), obs.obsdatetime.getMinutes() ); | ||
} else { | } else { | ||
obs.compareDate = new Date( memo.curSeason+1, obs.obsdatetime.getMonth(), obs.obsdatetime.getDate() ); | obs.compareDate = new Date( memo.curSeason+1, obs.obsdatetime.getMonth(), obs.obsdatetime.getDate(), obs.obsdatetime.getHours(), obs.obsdatetime.getMinutes() ); | ||
} | } | ||
ms = obs.compareDate.getTime(); | ms = obs.compareDate.getTime(); | ||
| Rivi 242: | Rivi 241: | ||
obs.popup += '(' + obs.obsdatetime.inRelationToToday(memo.lang) + ')'; | obs.popup += '(' + obs.obsdatetime.inRelationToToday(memo.lang) + ')'; | ||
obs.popup += '</div>'; | obs.popup += '</div>'; | ||
if (!!obs.addInfo) { obs.popup += '<div style="margin-top: 5px;">' + obs.addInfo + '</div>'; } | if (!!obs.addInfo) { | ||
obs.popup += '<div style="margin-top: 5px;">' + obs.addInfo + '</div>'; | |||
} | |||
obs.popup += '</div>'; | obs.popup += '</div>'; | ||
| Rivi 280: | Rivi 281: | ||
if (!!obs.addInfo) { | if (!!obs.addInfo) { | ||
obs.style = 'point { shape-type: star; size: ' + (baseSize+3) + '; shape-dent: 0.5 | obs.style = 'point { shape-type: star; size: ' + (baseSize+3) + '; shape-dent: 0.5; stroke-width: 0; stroke-color: ' + maintcol + '; }'; | ||
} else { | } else { | ||
obs.style = 'point { size: ' + baseSize + '; stroke-width: 0.5; stroke-color: ' + maintcol + '; }'; | obs.style = 'point { size: ' + baseSize + '; stroke-width: 0.5; stroke-color: ' + maintcol + '; }'; | ||
| Rivi 315: | Rivi 316: | ||
} | } | ||
memo.titleEl.html( i18n[ memo.obscode ].title[ memo.lang ] ); | memo.titleEl.html( i18n[ memo.obscode ].title[ memo.lang ] ); | ||
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="' + i18n[ memo.obscode ].changes[ memo.lang ] + '">' + i18n[ 'new' ][ memo.lang ] + '</button>' ); | |||
jQuery( '[data-toggle="tooltip"]' ).tooltip(); | |||
if (memo.graphType == 'trend') { | if (memo.graphType == 'trend') { | ||
| Rivi 398: | Rivi 401: | ||
obs.xvalue = obs.seasonmiddle; | obs.xvalue = obs.seasonmiddle; | ||
obs.yvalue = obs.compareDate; | 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><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 += '<p>' + i18n[ s ].title2[ memo.lang ] + ': ' + obs.obsdatetime.toLocaleDateString( memo.lang ) + '</p>'; | ||
obs.tooltip += obs.addInfo; | |||
memo.seriesO[ s ].obses.push( obs ); | memo.seriesO[ s ].obses.push( obs ); | ||
} | } | ||
| Rivi 411: | Rivi 416: | ||
if ( typeof memo.obsesS[ obs.season ] == 'undefined' ) { | if ( typeof memo.obsesS[ obs.season ] == 'undefined' ) { | ||
memo.obsesS[ obs.season ] = {}; | memo.obsesS[ obs.season ] = { 'maintainer': obs.maintainer }; | ||
} | } | ||
if ( obs.data.cat == '2' ) { | if ( obs.data.cat == '2' ) { | ||
memo.obsesS[ obs.season ][ 'low' ] = obs.compareDate; | memo.obsesS[ obs.season ][ 'low' ] = obs.compareDate; | ||
} else if ( obs.data.cat == '5' ) { | } else if ( obs.data.cat == '5' ) { | ||
memo.obsesS[ obs.season ][ 'high' ] = obs.compareDate; | 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' ) { | 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' ) { | 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' ] = { '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, ' | 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>' } ); | ||
} | } | ||
} | } | ||
} | } | ||
| Rivi 441: | Rivi 449: | ||
memo.data.addColumn( { type: 'string', role: 'annotation' } ); | memo.data.addColumn( { type: 'string', role: 'annotation' } ); | ||
memo.options.series.push( { type: 'scatter', pointType: 'circle', pointSize: 9, color: memo.seriesA[ s ].color } ); | memo.options.series.push( { type: 'scatter', pointType: 'circle', pointSize: 9, color: memo.seriesA[ s ].color } ); | ||
memo.options.trendlines[ memo.options.series.length - 1 ] = { type: 'linear', title: i18n.trendline, lineWidth: 2.33, visibleInLegend: false, tooltip: false }; | 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' ) { | } else if ( memo.seriesA[ s ].type == 'candlestick' ) { | ||
| Rivi 587: | Rivi 599: | ||
} | } | ||
function addDataToSeasonChart(memo) { | function addDataToSeasonChart( memo ) { | ||
if ( i18n[memo.obscode]['type'] == 'cat') { | |||
memo.distF = 0.1; | |||
} else { | |||
memo.distF = 0; | |||
} | |||
// set x-axis min and max for season chart | |||
memo.axisMinDate = new Date( memo.obsMinCompDateMs ); | memo.axisMinDate = new Date( memo.obsMinCompDateMs ); | ||
memo.axisMinDate.setDate(1); | memo.axisMinDate.setDate(1); | ||
| Rivi 595: | Rivi 614: | ||
memo.axisMaxDate.setDate(0); | memo.axisMaxDate.setDate(0); | ||
// create series of each season | |||
memo.seasonsO = {}; | memo.seasonsO = {}; | ||
memo.seasonsA = []; | memo.seasonsA = []; | ||
memo.seriesO = {}; | |||
for (var o in memo.obsesA) { | memo.seriesA = []; | ||
for ( var o in memo.obsesA ) { | |||
s = memo.obsesA[o].seriesId; | s = memo.obsesA[o].seriesId; | ||
if (typeof memo.seasonsO[s] == 'undefined' ) { memo.seasonsO[s] = { 'obses': [] }; } | if ( typeof memo.seasonsO[ s ] == 'undefined' ) { memo.seasonsO[ s ] = { 'id': s, 'obses': [] }; } | ||
memo.seasonsO[s].obses.push( memo.obsesA[o] ); | memo.seasonsO[s].obses.push( memo.obsesA[o] ); | ||
} | } | ||
for ( var s in memo.seasonsO ) { memo.seasonsA.push( memo.seasonsO[ s ] ); } memo.seasonsA.sort( function(a,b) { return b-a; } ); | |||
for (var | |||
for ( var s in memo.seasonsA ) { | |||
var legend = false; | |||
var color = colors.obses; | |||
for (var s in memo.seasonsA) { | var size = 6; | ||
var line = 0; | |||
var highlight = true; | |||
if ( memo.seasonsA[ s ].id == memo.curSeason ) { | |||
legend = true; color = colors.curObses; | |||
size = 9; | |||
line = 4; | |||
highlight = false; | |||
} | } | ||
memo.seriesA.push( { 'type': 'scatter', 'title': memo.seasonsA[ s ].id, 'highlight': highlight, 'color': color, 'size': size, 'line': line, 'legend': legend, 'trendline': 'none', obses: [] } ); | |||
memo. | for ( var o in memo.seasonsA[ s ].obses ) { | ||
memo.seriesA[ memo.seriesA.length - 1 ].obses.push( { | |||
'x': memo.seasonsA[ s ].obses[ o ].compareDate, | |||
'y': memo.seasonsA[ s ].obses[ o ].value, | |||
'style': memo.seasonsA[ s ].obses[ o ].style, | |||
'tooltip': memo.seasonsA[ s ].obses[ o ].popup, | |||
'annotation': null | |||
}); | |||
} | |||
} | |||
memo.seriesA.push( { 'type': 'scatter', 'title': memo.obsMinDate.getFullYear() + '-' + memo.obsMaxDate.getFullYear(), 'highlight': false, 'color': colors.obses, 'size': 6, 'line': 0, 'legend': true, 'trendline': 'none', obses: [] } ); | |||
// 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(), 12 ); | |||
mwDate.setDate( mwDate.getDate() - mwDate.getDay() + 3 ); | |||
w = mwDate.getWeek(); | |||
v = memo.obsesA[o].value; | |||
if ( typeof memo.avgW[w] == 'undefined' ) { | |||
mwDate.setDate( mwDate.getDate() - mwDate.getDay() + 3 ); | |||
memo. | memo.avgW[w] = { week: w, cDate: new Date( mwDate.getTime() ), values: [ v ], sum: v, count: 1, avg: v }; | ||
} else { | |||
memo.avgW[w].values.push( v ); | |||
memo.avgW[w].sum += v; | |||
memo.avgW[w].count++; | |||
memo.avgW[w].avg = memo.avgW[w].sum / memo.avgW[w].count; | |||
} | |||
} | |||
memo.avgWA = []; | |||
if ( memo.season == 'summer' ) { | |||
for ( var w=1; w<54; w++ ) { | |||
if ( typeof memo.avgW[ w ] != 'undefined' ) { memo.avgWA.push( memo.avgW[ w ] ); } | |||
} | } | ||
} else { | } else { | ||
memo. | for ( var w=30; w<54; w++ ) { | ||
if ( typeof memo.avgW[ w ] != 'undefined' ) { memo.avgWA.push( memo.avgW[ w ] ); } | |||
} | |||
for ( var w=1; w<30; w++ ) { | |||
if ( typeof memo.avgW[ w ] != 'undefined' ) { memo.avgWA.push( memo.avgW[ w ] ); } | |||
} | |||
} | |||
for ( var w=0; w<(memo.avgWA.length); w++ ) { | |||
memo.avgWA[ w ].running3 = memo.avgWA[ w ].avg; | |||
memo.avgWA[ w ].running5 = memo.avgWA[ w ].avg; | |||
} | } | ||
memo. | // make running average of 3 week averages | ||
memo. | for ( var w=1; w<(memo.avgWA.length-1); w++ ) { | ||
memo.avgWA[ w ].running3 = ( memo.avgWA[ w-1 ].sum + memo.avgWA[ w ].sum + memo.avgWA[ w+1 ].sum ) / ( memo.avgWA[ w-1 ].count + memo.avgWA[ w ].count + memo.avgWA[ w+1 ].count ); | |||
//memo.avgWA[ w ].running3 = ( memo.avgWA[ w-1 ].avg + memo.avgWA[ w ].avg + memo.avgWA[ w+1 ].avg ) / ( 3 ); | |||
} | |||
// make running average of 5 week averages | |||
for ( var w=2; w<(memo.avgWA.length-2); w++ ) { | |||
memo.avgWA[ w ].running = ( memo.avgWA[ w-2 ].sum + memo.avgWA[ w-1 ].sum + memo.avgWA[ w ].sum + memo.avgWA[ w+1 ].sum + memo.avgWA[ w+2 ].sum ) / ( memo.avgWA[ w-2 ].count + memo.avgWA[ w-1 ].count + memo.avgWA[ w ].count + memo.avgWA[ w+1 ].count + memo.avgWA[ w+2 ].count ); | |||
//memo.avgWA[ w ].running = ( memo.avgWA[ w-2 ].avg + memo.avgWA[ w-1 ].avg + memo.avgWA[ w ].avg + memo.avgWA[ w+1 ].avg + memo.avgWA[ w+2 ].avg ) / ( 5 ); | |||
} | |||
// | // make raw hma | ||
memo. | for ( var w=0; w<(memo.avgWA.length); w++ ) { | ||
memo.avgWA[ w ].hma = 2*memo.avgWA[ w ].running3 - memo.avgWA[ w ].running5; | |||
memo.avgWA[ w ].hmas = memo.avgWA[ w ].hma; | |||
} | |||
// | for ( var w=1; w<(memo.avgWA.length-1); w++ ) { | ||
memo.avgWA[ w ].hmas = ( memo.avgWA[ w-1 ].hma + memo.avgWA[ w ].hma + memo.avgWA[ w+1 ].hma ) / ( 3 ); | |||
} | |||
if ( | |||
memo. | // make running average of week averages | ||
for ( var w=0; w<memo.avgWA.length; w++ ) { | |||
if ( w == 0 ) { | |||
//memo.avgWA[ w ].running = ( memo.avgWA[ w ].sum + memo.avgWA[ w+1 ].sum ) / ( memo.avgWA[ w ].count + memo.avgWA[ w+1 ].count ); | |||
memo.avgWA[ w ].running = ( memo.avgWA[ w ].avg ); | |||
} else if ( w == ( memo.avgWA.length - 1) ) { | |||
//memo.avgWA[ w ].running = ( memo.avgWA[ w ].sum + memo.avgWA[ w-1 ].sum ) / ( memo.avgWA[ w ].count + memo.avgWA[ w-1 ].count ); | |||
memo.avgWA[ w ].running = ( memo.avgWA[ w ].avg ); | |||
} else if ( w == 1 || w == (memo.avgWA.length - 2) ) { | |||
memo.avgWA[ w ].running = ( memo.avgWA[ w ].sum + memo.avgWA[ w-1 ].sum ) / ( memo.avgWA[ w ].count + memo.avgWA[ w-1 ].count ); | |||
} else { | } else { | ||
memo. | memo.avgWA[ w ].running = ( memo.avgWA[ w-2 ].sum + memo.avgWA[ w-1 ].sum + memo.avgWA[ w ].sum + memo.avgWA[ w+1 ].sum + memo.avgWA[ w+2 ].sum ) / ( memo.avgWA[ w-2 ].count + memo.avgWA[ w-1 ].count + memo.avgWA[ w ].count + memo.avgWA[ w+1 ].count + memo.avgWA[ w+2 ].count ); | ||
} | } | ||
} | |||
// calculate standard deviation | |||
devSum = 0; | |||
devC = 0; | |||
devMax = 0; | |||
for ( var w=0; w<memo.avgWA.length; w++ ) { | |||
devC++; | |||
devx = 0; | |||
for (var vi in memo.avgWA[w].values ) { | |||
devx += Math.pow( (memo.avgWA[w].values[vi] - memo.avgWA[w].avg), 2 ); | |||
} | } | ||
memo.avgWA[w].dev = Math.sqrt( devx/memo.avgWA[w].count ); | |||
devSum += memo.avgWA[w].dev; | |||
devMax = Math.max( memo.avgWA[w].dev, devMax ); | |||
} | |||
devAvg = devSum/devC; | |||
//console.log( memo.avgWA ); | |||
memo.seriesA.push( { 'type': 'area', 'title': i18n[ 'average' ][ memo.lang ], 'highlight': false, 'color': colors.average, 'size': 0, 'line': 2.33, 'legend': true, 'trendline': 'none', obses: [] } ); | |||
for ( var w in memo.avgWA ) { | |||
memo.seriesA[ memo.seriesA.length - 1 ].obses.push( { | |||
'x': memo.avgWA[ w ].cDate, | |||
'y': memo.avgWA[ w ].hmas, | |||
'style': null, | |||
'tooltip': i18n[ 'moving' ][ memo.lang ], | |||
'annotation': null | |||
}); | |||
} | |||
/* | |||
memo.seriesA.push( { 'type': 'scatter', 'title': 'Hull', 'highlight': false, 'color': 'green', 'size': 0, 'line': 2.33, 'legend': true, 'trendline': 'none', obses: [] } ); | |||
for ( var w in memo.avgWA ) { | |||
memo.seriesA[ memo.seriesA.length - 1 ].obses.push( { | |||
'x': memo.avgWA[ w ].cDate, | |||
//'y': memo.avgWA[ w ].running + Math.max( memo.avgWA[ w ].dev, devAvg ) * 2, | |||
'y': memo.avgWA[ w ].hmas, | |||
'style': null, | |||
'tooltip': i18n[ 'moving' ][ memo.lang ], | |||
'annotation': null | |||
}); | |||
} | |||
*/ | |||
for ( var w=0; w<memo.avgWA.length; w++ ) { | |||
//Integer( SquareRoot(Period) ) WMA [2 x Integer(Period/2) WMA(Price) - Period WMA(Price)] | |||
} | |||
// add columns | |||
for ( var s in memo.seriesA ) { | |||
if ( memo.seriesA[ s ].type == 'scatter' ) { | |||
memo.data.addColumn( 'number', memo.seriesA[ s ].title ); | |||
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( { label: memo.seriesA[ s ].title, type: 'line', curveType: 'function', pointType: 'circle', pointSize: memo.seriesA[ s ].size, lineWidth: memo.seriesA[ s ].line, 'color': memo.seriesA[ s ].color, 'visibleInLegend': memo.seriesA[ s ].legend, highlight: memo.seriesA[ s ].highlight } ); | |||
if ( memo.seriesA[ s ].trendline != 'none' ) { | |||
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 { | } else { | ||
memo. | 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 == 'area' ) { | |||
memo.data.addColumn( 'number', memo.seriesA[ s ].title ); | |||
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( { label: memo.seriesA[ s ].title, type: 'area', curveType: 'function', pointType: 'circle', pointSize: memo.seriesA[ s ].size, lineWidth: memo.seriesA[ s ].line, 'color': memo.seriesA[ s ].color, 'areaOpacity': 0.8, 'visibleInLegend': memo.seriesA[ s ].legend, highlight: memo.seriesA[ s ].highlight } ); | |||
if ( memo.seriesA[ s ].trendline != 'none' ) { | |||
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 { | } else { | ||
memo.options.trendlines[ memo.options.series.length - 1 ] = { type: 'linear', title: i18n.trendline, lineWidth: 0, color: 'transparent', visibleInLegend: false, tooltip: false }; | |||
} | |||
} | |||
} | } | ||
} | } | ||
} | |||
} | |||
// add data | |||
var cc = memo.data.getNumberOfColumns(); | |||
for ( var s in memo.seriesA ) { | |||
for (var o in memo.seriesA[s].obses ) { | |||
obs = memo.seriesA[s].obses[o]; | |||
dataRow = []; | dataRow = []; | ||
| Rivi 898: | Rivi 835: | ||
// x axis value | // x axis value | ||
dataRow[0] = obs. | dataRow[0] = obs.x; | ||
// data for series cols | // data for series cols | ||
if ( memo. | if ( memo.seriesA[ s ].id == memo.curSeason ) { | ||
dataRow[s*4+1] = obs. | dataRow[s*4+1] = obs.y; | ||
} else { | } else { | ||
dataRow[s*4+1] = obs. | dataRow[s*4+1] = obs.y + memo.distF*Math.random() - memo.distF*Math.random(); | ||
} | } | ||
dataRow[s*4+2] = obs.style; | dataRow[s*4+2] = obs.style; | ||
dataRow[s*4+3] = obs. | dataRow[s*4+3] = obs.tooltip; | ||
dataRow[s*4+4] = | dataRow[s*4+4] = obs.annotation; | ||
memo.dataA.push( dataRow ); | memo.dataA.push( dataRow ); | ||
| Rivi 914: | Rivi 851: | ||
} | } | ||
} | } | ||
console.log( memo.dataA ); | |||
// make ticks for x axis | // make ticks for x axis | ||
| Rivi 951: | Rivi 890: | ||
memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[m]['roman'] }); | memo.options.hAxis.ticks.push({v: middleOfMonth, f: i18n.months[m]['roman'] }); | ||
} | } | ||
} | } | ||
drawChart(memo); | drawChart(memo); | ||
} | } | ||
function drawChart(memo) { | function drawChart(memo) { | ||
| Rivi 971: | Rivi 909: | ||
memo.downloadEl.fadeIn( "slow" ); | memo.downloadEl.fadeIn( "slow" ); | ||
memo.selectedCol = | memo.selectedCol = -1; | ||
google.visualization.events.addListener( memo.chart, 'select', function () { | google.visualization.events.addListener( memo.chart, 'select', function () { | ||
for ( var c in memo.options.series ) { | |||
if ( memo.options.series[c].highlight ) { | |||
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; | |||
} | |||
} | |||
var selection = memo.chart.getSelection(); | var selection = memo.chart.getSelection(); | ||
if (selection.length > 0) { | if ( selection.length > 0 ) { | ||
var col = selection[0].column; | var col = selection[0].column; | ||
var sLabel = memo.data.getColumnLabel( selection[0].column ); | |||
var sSeries = ''; | |||
for (var c in memo.options.series) { | for (var c in memo.options.series) { | ||
if (memo.options.series[c]. | if ( memo.options.series[c].label == sLabel ) { | ||
sSeries = c; break; | |||
} | |||
} | |||
} | } | ||
if (col != memo.selectedCol && memo.options.series[ | if ( col != memo.selectedCol && memo.options.series[c].highlight ) { | ||
memo.selectedCol = col; | memo.selectedCol = col; | ||
memo.options.series[ | memo.options.series[ sSeries ].lineWidth = 3; | ||
//memo.options.series[(col-1)/4].pointSize = 12; | //memo.options.series[(col-1)/4].pointSize = 12; | ||
memo.options.series[ | memo.options.series[ sSeries ].color = colors[ 'selObses' ]; | ||
memo.options.series[ | memo.options.series[ sSeries ].visibleInLegend = true; | ||
} else { | } else { | ||
memo.selectedCol = | memo.selectedCol = -1; | ||
} | } | ||
} | } | ||
doResize(); | |||
}); | }); | ||
| Rivi 1 074: | Rivi 1 007: | ||
if ( i18n[memo.obscode].type == 'num' ) { | if ( i18n[memo.obscode].type == 'num' ) { | ||
headerCols.push( i18n[ 'Date' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'Time' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'Observation' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'Value' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'ValueUnit' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'Additionalinfo' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'Image' ][ memo.lang ] ); | |||
headerCols.push( i18n[ 'ObserverStatus' ][ memo.lang ] ); | |||
header += headerCols.join( ';' ); | |||
header += headerCols.join( | |||
for ( var o in memo.obses ) { | for ( var o in memo.obses ) { | ||
| Rivi 1 088: | Rivi 1 023: | ||
csvCols = []; | csvCols = []; | ||
csvCols.push( memo.obses[o].obsdatetime. | csvCols.push( memo.obses[o].obsdatetime.toLocaleDateString( memo.lang ) ); | ||
csvCols.push( memo.obses[o].obsdatetime.toLocaleTimeString( memo.lang ) ); | |||
//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( i18n[ memo ].title[memo.lang ] ); | |||
csvCols.push( '"' + memo.obses[o].value.toString().replace( '.', i18n['dec'][memo.lang] ) + '"' ); | csvCols.push( '"' + memo.obses[o].value.toString().replace( '.', i18n['dec'][memo.lang] ) + '"' ); | ||
csvCols.push( memo.obses[o].addInfo ); | csvCols.push( memo.obses[o].addInfo ); | ||
| Rivi 1 116: | Rivi 1 054: | ||
header += ';' + i18n[ 'Observation' ][ memo.lang ]; | header += ';' + i18n[ 'Observation' ][ memo.lang ]; | ||
header += ';' + i18n[ 'Value' ][ memo.lang ]; | header += ';' + i18n[ 'Value' ][ memo.lang ]; | ||
header += ';' + i18n[ 'ValueUnit' ][ memo.lang ]; | |||
header += ';' + i18n[ 'Additionalinfo' ][ memo.lang ]; | header += ';' + i18n[ 'Additionalinfo' ][ memo.lang ]; | ||
header += ';' + i18n[ 'Image' ][ memo.lang ]; | header += ';' + i18n[ 'Image' ][ memo.lang ]; | ||
| Rivi 1 125: | Rivi 1 064: | ||
obs = memo.seriesA[ s ].obses[ o ]; | obs = memo.seriesA[ s ].obses[ o ]; | ||
csv += '\r\n'; | csv += '\r\n'; | ||
| Rivi 1 132: | Rivi 1 071: | ||
csv += ';' + i18n[ memo.seriesA[ s ].id ].title[ memo.lang ]; | csv += ';' + i18n[ memo.seriesA[ s ].id ].title[ memo.lang ]; | ||
csv += ';' + obs. | csv += ';' + obs.value; | ||
csv += ';' + obs.valueUnit; | |||
csv += ';' + obs.addInfo; | csv += ';' + obs.addInfo; | ||
| Rivi 1 177: | Rivi 1 117: | ||
csv = header + csv; | csv = header + csv; | ||
//console.log( csv ); | //console.log( csv ); | ||
var exportedFilename = | var exportedFilename = memo.csvfile; | ||
var blob = new Blob( [csv], { type: 'text/csv;charset=utf-16LE;' }); | var blob = new Blob( [csv], { type: 'text/csv;charset=utf-16LE;' }); | ||
| Rivi 1 226: | Rivi 1 166: | ||
memo.options.chartArea = { top: t, left: l, width: (w - l - r), height: (h - t - b), backgroundColor: { fill: '#fff', stroke: '#eee', strokeWidth: 4 }}; | memo.options.chartArea = { top: t, left: l, width: (w - l - r), height: (h - t - b), backgroundColor: { fill: '#fff', stroke: '#eee', strokeWidth: 4 }}; | ||
console.log( memo.options ); | //console.log( memo.options ); | ||
memo.chart.draw( memo.data, memo.options ); | memo.chart.draw( memo.data, memo.options ); | ||
| Rivi 1 300: | Rivi 1 240: | ||
Date.prototype.getWeek = function() { | Date.prototype.getWeek = function() { | ||
var date = new Date(this.getTime()); | var date = new Date(this.getTime()); | ||
date.setHours( | date.setHours(12, 0, 0, 0); | ||
// Thursday in current week decides the year. | // Thursday in current week decides the year. | ||
date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); | date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); | ||
| Rivi 1 314: | Rivi 1 254: | ||
var seriesC = [ 'lightgray', '#3366cc', 'orange' ]; | var seriesC = [ 'lightgray', '#3366cc', 'orange' ]; | ||
var colors = { 'average': ' | var colors = { 'average': '#c1e7f7', 'trend': '#ff4500', 'obses': 'lightgray', 'curObses': '#3366cc', 'selObses': 'gold', 'noticeObses': 'tan' }; | ||
var i18n = { | var i18n = { | ||
| Rivi 1 340: | Rivi 1 280: | ||
'title': { 'fi': 'Pintaveden lämpötila', 'en': 'Surface water termperature', 'sv': 'Ytvattentemperatur', 'ru': '???' }, | 'title': { 'fi': 'Pintaveden lämpötila', 'en': 'Surface water termperature', 'sv': 'Ytvattentemperatur', 'ru': '???' }, | ||
'unit': '°C', | 'unit': '°C', | ||
'axisTitleV': { 'fi': 'Lämpötila, °C', 'en': 'Temperature, °C', 'sv': 'Temperatur, °C', 'ru': '°C' } | 'axisTitleV': { 'fi': 'Lämpötila, °C', 'en': 'Temperature, °C', 'sv': 'Temperatur, °C', 'ru': '°C' }, | ||
'changes': { | |||
'fi': 'Pintaveden lämpötilan kuvio on uudistunut.', | |||
'en': 'The surface water temperature graph has been renewed.', | |||
'sv': 'Ytvattentemperaturdiagrammet har förnyats.', | |||
'ru': '' | |||
} | |||
}, | }, | ||
'ice': { | 'ice': { | ||
| Rivi 1 347: | Rivi 1 293: | ||
'season': 'winter', | 'season': 'winter', | ||
'min': 0, | 'min': 0, | ||
'direction': -1, | //'direction': -1, | ||
'trend': { 'type': 'gaussian', 'layout': 'line' }, | 'trend': { 'type': 'gaussian', 'layout': 'line' }, | ||
'title': { 'fi': 'Jään paksuus', 'en': 'Ice thickness', 'sv': 'Isens tjocklek', 'ru': '???' }, | 'title': { 'fi': 'Jään paksuus', 'en': 'Ice thickness', 'sv': 'Isens tjocklek', 'ru': '???' }, | ||
'unit': 'cm', | 'unit': 'cm', | ||
'axisTitleV': { 'fi': 'Jääpeite, cm', 'en': 'Ice cover, cm', 'sv': 'Istäcket, cm', 'ru': 'm' } | 'axisTitleV': { 'fi': 'Jääpeite, cm', 'en': 'Ice cover, cm', 'sv': 'Istäcket, cm', 'ru': 'm' }, | ||
'changes': { | |||
'fi': 'Jääpeitteen paksuudesta kertova kuvio on uudistunut. Nyt voit esimerkiksi korostaa kuviosta tietyn vuoden kehityksen valitsemalla yksittäisen havainnon.', | |||
'en': 'The chart showing the thickness of the ice sheet has been renewed. For example, you can now highlight a particular year in the chart by selecting a single observation.', | |||
'sv': 'Diagrammet som visar isens tjocklek har förnyats. Till exempel kan du nu markera ett visst år i diagrammet genom att välja en enskild observation.', | |||
'ru': '' | |||
} | |||
}, | }, | ||
'ice_cat': { | 'ice_cat': { | ||
'catName': 'Jäätilanne', | 'catName': 'Jäätilanne', | ||
}, | }, | ||
'ice_cat_2': { 'title': { 'fi': 'Jäätyminen', 'en': ' | 'ice_cat_2': { 'title': { 'fi': 'Jäätyminen', 'en': 'Freeze-up', 'sv': 'Förfrysning', 'ru': '???' }, 'title2': { 'fi': 'Pysyvä jääpeite', 'en': 'Permanent ice cover', 'sv': 'Permanent istäcke', 'ru': '???' }, color: '#d5da26' }, | ||
'ice_cat_5': { 'title': { 'fi': 'Jäänlähtö', 'en': 'Ice- | 'ice_cat_5': { 'title': { 'fi': 'Jäänlähtö', 'en': 'Ice break-up', 'sv': 'Islossning', 'ru': '???' }, 'title2': { 'fi': 'Jäätön kausi alkoi', 'en': 'Beginning of ice-free season', 'sv': 'Början av den isfria säsongen', 'ru': '???' }, color: '#0076b0' }, | ||
'ice_cat_2,5': { | 'ice_cat_2,5': { | ||
'type': 'date', | 'type': 'date', | ||
'season': 'winter', | 'season': 'winter', | ||
'trend': { 'type': 'regression', 'layout': 'line' }, | 'trend': { 'type': 'regression', 'layout': 'line' }, | ||
'title': { 'fi': ' | 'title': { 'fi': 'Jääpeitekauden kesto', 'en': 'Duration of ice cover', 'sv': 'Längden på istäckesperioden', 'ru': '' }, | ||
//'charttitle': { 'fi': ' | //'charttitle': { 'fi': 'Jääpeite', 'en': 'Ice cover', 'sv': 'Frysning och islossning', 'ru': '' }, | ||
'color': '#c1e7f7', | 'color': '#c1e7f7', | ||
'unit': { 'fi': 'päivää', 'en': 'days', 'sv': 'dagar', 'ru': '' }, | 'unit': { 'fi': 'päivää', 'en': 'days', 'sv': 'dagar', 'ru': '' }, | ||
'axisTitleV': { 'fi': '', 'en': '', 'sv': '', 'ru': '' } | 'axisTitleV': { 'fi': '', 'en': '', 'sv': '', 'ru': '' }, | ||
'changes': { | |||
'fi': 'Jääpeitekauden pituudesta kertova kuvio on muuttunut. Aiemmat jäänlähdöstä ja jäättömän kauden alusta kertoneet erilliset graafit on yhdistetty samaan kuvaan. Jos samalta talvelta on tehty havainnot sekä pysyvän jäätilanteen että jäättömän kauden alkamisesta, piirtyy kuvioon myös jääpeitekauden pituus.', | |||
'en': 'The graph showing the length of the ice cover period has changed. Separate graphs of previous freezing and icing have now been combined into the same figure. If there are observations from the same winter about the beginning of both the permanent ice situation and the ice-free season, the length of the ice cover period is also drawn in the figure.', | |||
'sv': 'Grafen som visar längden på istäckeperioden har ändrats. Separata grafer över tidigare frysning och isbildning har nu kombinerats till samma figur. Om det finns iakttagelser från samma vinter om början av både den permanenta issituationen och den isfria säsongen, ritas även istäckesperiodens längd i figuren.', | |||
'ru': '' | |||
}, | |||
}, | }, | ||
'snow_load': { | 'snow_load': { | ||
| Rivi 1 398: | Rivi 1 356: | ||
}, | }, | ||
'Observation': { 'fi': 'Havainto', 'en': 'Observation', 'sv': 'Observation', 'ru': '???' }, | 'Observation': { 'fi': 'Havainto', 'en': 'Observation', 'sv': 'Observation', 'ru': '???' }, | ||
'new': { 'fi': 'Uusi', 'en': 'New', 'sv': 'Nytt', 'ru': '???' }, | |||
'Value': { 'fi': 'Arvo', 'en': 'Value', 'sv': 'Värde', 'ru': '???' }, | 'Value': { 'fi': 'Arvo', 'en': 'Value', 'sv': 'Värde', 'ru': '???' }, | ||
'ValueUnit': { 'fi': 'Arvon tyyppi', 'en': 'Value type', 'sv': 'Värdes typ', 'ru': '???' }, | |||
'Date': { 'fi': 'Päivämäärä', 'en': 'Date', 'sv': 'Datum', 'ru': '???' }, | 'Date': { 'fi': 'Päivämäärä', 'en': 'Date', 'sv': 'Datum', 'ru': '???' }, | ||
'Additionalinfo': { 'fi': 'Lisätiedot', 'en': 'Additional info', 'sv': 'Tillägsinformation', 'ru': '???' }, | 'Additionalinfo': { 'fi': 'Lisätiedot', 'en': 'Additional info', 'sv': 'Tillägsinformation', 'ru': '???' }, | ||
| Rivi 1 404: | Rivi 1 364: | ||
'ObserverStatus': { 'fi': 'Havainnoijan status', 'en': 'Observer status', 'sv': 'Observatörens status', 'ru': '???' }, | 'ObserverStatus': { 'fi': 'Havainnoijan status', 'en': 'Observer status', 'sv': 'Observatörens status', 'ru': '???' }, | ||
'average': { 'fi': 'Keskimäärin', 'en': 'Average', 'sv': 'Genomsnitt', 'ru': '???' }, | 'average': { 'fi': 'Keskimäärin', 'en': 'Average', 'sv': 'Genomsnitt', 'ru': '???' }, | ||
'moving': { 'fi': 'Liukuva keskiarvo', 'en': 'Moving average', 'sv': 'Glidande medelvärde', 'ru': '???' }, | |||
'trendline': { 'fi': 'Trendiviiva', 'en': 'Trend line', 'sv': 'Trendlinje', 'ru': '???' }, | 'trendline': { 'fi': 'Trendiviiva', 'en': 'Trend line', 'sv': 'Trendlinje', 'ru': '???' }, | ||
'days': { 'fi': 'päivää', 'en': 'days', 'sv': 'dygn', 'ru': '???' }, | 'days': { 'fi': 'päivää', 'en': 'days', 'sv': 'dygn', 'ru': '???' }, | ||


