/* * ############################################################################################# * EuroBlitz v.2016.04 - May 2016 * Made by Henkka, nordicweather.net * * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. * To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-nd/3.0/. * ############################################################################################# */ var bovid=false,vidtyp="eur",heightoffset=1.3; var vidmindate = new Date(2014, 02 - 1, 20); var videopath=".nordicweather.net/videos/bo/bo"; var bgcolor = new Array("#00FF00", "#FFFF00", "#C00000", "#FF00FF"); var chart2,gbl,gbl2,gbo,gfi,lc,aTimer,bTimer,ajx=0,boTimer,alive=true; var wsmap2,map2,basemap,linemap,centercross,bolstorms,bolostorms,lastCounter=0,nSoc=0,locChange=false; var glLayer,canvas,gl,pixelsToWebGLMatrix,mapMatrix,numPoints,u_matLoc,verts=[],times=[],pings=[]; var cookieage=32000000000; var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0)); var rwest,reast,rnorth,rsouth,bbc,isFocused=true; var boset = {"hidecounter":false,"hidelegend":false,"hidecross":false,"lescale":4,"timesteps":[2,2,2,2,2,2,2]}; if(bo){boset.bostrike=true;} if(boltek&&!bo){boset.bolstrike=true;} if(isTouch){ boset.hidecounter=true; boset.hidelegend=true; } var strData=[],strCache={"bo":[],"boltek":[],"fmi":[]},stormCache={"bo":[],"boltek":[],"fmi":[]},strLast={"bo":0,"boltek":0,"fmi":0}; var strTrend={"bo":[],"boltek":[],"fmi":[]}; var paths = { "bo":{"strs":"https://a.nordicweather.net/bostrs.json","real":bopath+"bo.json"}, "boltek":{"strs":boltekpath+"NSDStrikes.json","real":boltekpath+"NSDRealtime.json"}, "fmi":{"strs":"https://euweather.eu/cache/fmiStrikes.json","real":"https://euweather.eu/cache/fmiReal.json"}, }; var fmiradar,yrradar,dwdradar,knmiradar,ukmoradar,euradar,defradar="fmiradar"; var lsteps = [[],[1,2,4,6,8,10],[2,4,8,12,16,20],[5,10,20,30,45,60],[10,20,40,60,90,120]]; var shader={ "vertex": "uniform mat4 u_matrix;attribute vec4 a_vertex;attribute float a_pointSize;attribute vec4 a_color;varying vec4 v_color;void main() {gl_PointSize = a_pointSize;gl_Position = u_matrix * a_vertex;v_color = a_color;}", "fragment": "precision mediump float;varying vec4 v_color;void main() {gl_FragColor = v_color;gl_FragColor =vec4(v_color[0], v_color[1], v_color[2], 1);}" }; var screenheight = $(window).height(); var screenwidth = $(window).width(); $("#map").css({height: screenheight+"px"}); var isInIframe = (window.location != window.parent.location) ? true : false; if(bo){gbl=0,gbl2=1,gfi=2;} if(boltek){gbo=0,gfi=1;} if(bo&&boltek){gbl=0,gbl2=1,gbo=2,gfi=3;} $(window).resize(function(){ setTimeout( function() { var screenheight = $(window).height(); $("#map").css({height: screenheight+"px"}); }, 200); }); var stTime = Date.now(); var quarter = Math.round((Date.now()-(15*60000)) / (15 * 60000)) * (15 * 60000); var q = new Date(quarter); var utc = new Date(q.getTime() + q.getTimezoneOffset() * 60000); var eudate = utc.format("yyyymmdd.HHMM"); var rdate = utc.format("yyyy-mm-dd")+"T"+utc.format("HH:MM")+"Z"; var ukdate = utc.format("yyyy-mm-dd")+"T"+utc.format("HH:MM")+":00Z"; /*#############################################################################*/ /* MAP */ var centerMarker = L.icon({iconUrl:ebpath+"img/geolocation_marker.png",iconSize:[12,12],iconAnchor:[8,8]}); map2 = L.map("map", {fullscreenControl: true}).setView([deflat, deflon], defzoom); map2.attributionControl.setPrefix(""); map2.options.maxZoom = 16; map2.options.minZoom = 4; if(mousewheel==0){ map2.scrollWheelZoom.disable(); } $('#rightbar, #tipbasemaps').on('mouseover mousedown touchstart', function() {map2.dragging.disable();}); $('#rightbar, #tipbasemaps').on('mouseout mouseup touchend', function() {map2.dragging.enable();}); /* LAYERS */ //basemap = L.tileLayer("https://a.maps.nordicweather.net/tiles/gray/{z}/{x}/{y}.png", { basemap = L.tileLayer("https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png", { attribution: "",zIndex:2}).addTo(map2); linemap = L.tileLayer("https://a.maps.nordicweather.net/tiles/lines_sat/{z}/{x}/{y}.png", { attribution: "",zIndex:3}); var southWest = L.latLng(55,9), northEast = L.latLng(72,32), bounds = L.latLngBounds(southWest, northEast); fmiradar = L.tileLayer("https://a.nordicweather.net/tiles/fmi/esri_fmidbz1/{z}/{x}/{y}.png", {opacity:0.55,zIndex:3,bounds:bounds}); var southWest = L.latLng(49,0), northEast = L.latLng(55,11), bounds = L.latLngBounds(southWest, northEast); knmiradar = L.tileLayer("https://144.76.141.140/knmiradar/{z}/{x}/{y}.png", {attribution: "Radar: KNMI",opacity:0.55,zIndex:3, bounds:bounds}); var southWest = L.latLng(47,5.5), northEast = L.latLng(55,14.5), bounds = L.latLngBounds(southWest, northEast); dwdradar = L.tileLayer("https://188.165.139.117/dwd/1/{z}/{x}/{y}.png", {attribution: "Radar: DWD",opacity:0.55,zIndex:3, bounds:bounds}); var southWest = L.latLng(52.5,0), northEast = L.latLng(72.5,32.5), bounds = L.latLngBounds(southWest, northEast); yrradar = L.tileLayer.wms("https://public-wms.met.no/verportal/verportal.map", {"layers":"radar_precipitation_intensity","format":"image/png","time":rdate,"transparent":true, opacity:0.55,zIndex:10,bounds:bounds}); var imageUrl = "https://datapoint.metoffice.gov.uk/public/data/layer/wxobs/RADAR_UK_Composite_Highres/png?TIME="+ukdate+"&key=9e00f6aa-29e1-43bb-8ea9-9a9bdad0142c"; var imageBounds = [[48, -12], [61, 5]]; ukmoradar = L.imageOverlay(imageUrl, imageBounds,{opacity:0.55}); var imageUrl = "https://www.radareu.cz/data/radar/radar.anim."+eudate+".0.png"; var imageBounds = [[30.968189526345665, -14.618225054687514], [72.62025190354672, 45.314636273437486]]; euradar = L.imageOverlay(imageUrl, imageBounds,{opacity:0.55}); /* SETUP WEBGL */ glLayer = L.canvasOverlay({opacity:1}).drawing(drawingOnCanvas).addTo(map2); canvas = glLayer.canvas(); glLayer.canvas.width = canvas.clientWidth; glLayer.canvas.height = canvas.clientHeight; WebGLsetup(); var storms = L.layerGroup([]).addTo(map2); storms.setZIndex(40); var options = { lng: function(d){ return d[0]; }, lat: function(d){ return d[1]; }, duration: 10000, fps: 24 }; var pingLayer = L.pingLayer(options).addTo(map2); pingLayer.radiusScale().range([14, 0]); pingLayer.opacityScale().range([1.0, 0.0]); (function(){ if($.jStorage.get("eb2016")){boset=$.jStorage.get("eb2016");} if(boset.deflat){ deflat = boset.deflat;} if(boset.deflon){ deflon = boset.deflon;} if(!boset.bostrike&&!boset.bolstrike&&!boset.fmistrike){ if(bo){boset.bostrike=true;} if(boltek&&!bo){boset.bolstrike=true;} } map2.setView([deflat, deflon], defzoom); centercross=L.marker([deflat,deflon], {icon: centerMarker}).addTo(map2); /* GET STRIKES */ var wpaths=[]; if(bo&&boset.bostrike){var dpath = paths.bo.strs;}else if(bo){wpaths.push(paths.bo.strs);} if(boltek&&boset.bolstrike){var dpath = paths.boltek.strs;}else if(boltek){wpaths.push(paths.boltek.strs);} if(fmi&&boset.fmistrike){var dpath = paths.fmi.strs;}else if(fmi){wpaths.push(paths.fmi.strs);} wget([dpath], function(points) { strData=JSON.parse(points); if(strData.constructor===Array && strData.length>0){ if(dpath==paths.bo.strs){ strCache.bo=strData; strLast.bo=getLast(strData); WebGLdraw(strLast.bo); } if(dpath==paths.boltek.strs){ strCache.boltek=strData; strLast.boltek=getLast(strData); WebGLdraw(strLast.boltek); } if(dpath==paths.fmi.strs){ strCache.fmi=strData; strLast.fmi=getLast(strData); WebGLdraw(strLast.fmi); } } }); if(wpaths.length>0){ wget(wpaths, function(apoints,bpoints) { pointsa=JSON.parse(apoints); if(pointsa.constructor===Array && pointsa.length>0){ if(wpaths[0]==paths.bo.strs){ strCache.bo=pointsa; strLast.bo=getLast(pointsa); } if(wpaths[0]==paths.boltek.strs){ strCache.boltek=pointsa; strLast.boltek=getLast(pointsa); } if(wpaths[0]==paths.fmi.strs){ strCache.fmi=pointsa; strLast.fmi=getLast(pointsa); } } if(wpaths.length>1){ pointsb=JSON.parse(bpoints); if(pointsb.constructor===Array && pointsb.length>0){ if(wpaths[1]==paths.bo.strs){ strCache.bo=pointsb; strLast.bo=getLast(pointsb); } if(wpaths[1]==paths.boltek.strs){ strCache.boltek=pointsb; strLast.boltek=getLast(pointsb); } if(wpaths[1]==paths.fmi.strs){ strCache.fmi=pointsb; strLast.fmi=getLast(pointsb); } } } }); } $.ajaxSetup({ cache: false }); $("#hidecross").prop("checked", false); if(boltek){$("#bolstrikes").prop("checked", true);} if(bo){$("#bostrikes").prop("checked", true);} if(boset.bostrike){$("#bostrikes").prop("checked", true);} if(boset.bostorm){$("#bostorms").prop("checked", true);} if(boset.boown){$("#boown").prop("checked", true);} if(boset.bolstrike){$("#bolstrikes").prop("checked", true);} if(boset.bolstorm){$("#bolstorms").prop("checked", true);} if(boset.fmistrike){$("#fmistrikes").prop("checked", true);} if(boset.hidecross){$("#hidecross").prop("checked", true);} if(boset.hidecounter){$("#hidecounter").prop("checked", true);} if(boset.hidelegend){$("#hidelegend").prop("checked", true);} if(boset.basemap){ defbase = boset.basemap;} if(boset.radarmap){ defradar = boset.radarmap;} for(i=0;i<=7;i++){ if(boset.timesteps[i]!==undefined&&boset.timesteps[i] == 2){ $("#"+i).prop("checked", true); }else{ $("#"+i).prop("checked", false); } } $("#"+defbase).prop("checked", true); $(".leaflet-control-fullscreen a").addClass("leaffulloff"); $('.leaflet-control-fullscreen').attr('data-toggle', 'tooltip'); $('.leaflet-control-fullscreen').attr('data-placement', 'right'); $('.leaflet-control-fullscreen').attr('title', txtFullscreen); $('.leaflet-control-fullscreen-button').removeAttr("title") map2.on('fullscreenchange', function () { if (map2.isFullscreen()) { $(".leaflet-control-fullscreen a").removeClass("leaffulloff"); $(".leaflet-control-fullscreen a").addClass("leaffullon"); } else { $(".leaflet-control-fullscreen a").removeClass("leaffullon"); $(".leaflet-control-fullscreen a").addClass("leaffulloff"); } }); $("#tipbasemaps, #attributes, #rightbar").appendTo(".leaflet-control-container"); $(".leaflet-control-settings").appendTo("div.leaflet-top.leaflet-left"); /* GEOLOCATION */ var locOptions={enableHighAccuracy: true,maximumAge: 9000,timeout: 3000000}; var toggle=0; if(!isTouch){ lc = L.control.locate({follow:false,setView:true,keepCurrentZoomLevel:true,locateOptions:locOptions}).addTo(map2); $(".leaflet-control-locate a span").removeClass("fa fa-map-marker").addClass("leafgpsoff"); }else{ lc = L.control.locate({follow:true,setView:true,keepCurrentZoomLevel:true,locateOptions:locOptions}).addTo(map2); $(".leaflet-control-locate a span").removeClass("fa fa-map-marker").addClass("leafgpson"); $(".leaflet-control-locate a").on("click", function(e){ if(toggle===0){ $(".leafgpson").css({"color":"#00CD00"}); toggle=1; }else{ $(".leafgpson").css({"color":"#69C"}); toggle=0; } }); } map2.on('locationfound', onLocationFound); map2.on('locationerror', onLocationError); $('.leaflet-control-locate').attr('data-toggle', 'tooltip'); $('.leaflet-control-locate').attr('data-placement', 'right'); $('.leaflet-control-locate').attr('title', txtLocateme); $('.leaflet-control-locate a').removeAttr("title") $('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="popover"]').popover(); /* LAYERSWITCH ON ZOOMLEVEL */ map2.on('moveend', function(e) { var cz = map2.getZoom(); var sw = map2.getBounds()._southWest; var ne = map2.getBounds()._northEast; // Show normal maps for closest zooms if(cz>10){ if($("#gray").is(":checked")){ // basemap.setUrl("https://b.maps.nordicweather.net/tiles/normnight/{z}/{x}/{y}.png"); map2.removeLayer(linemap); } if($("#blue").is(":checked")||$("#sat").is(":checked")){ basemap.setUrl("https://b.maps.nordicweather.net/tiles/normday/{z}/{x}/{y}.png"); map2.removeLayer(linemap); } $("#blue, #gray, #sat, #fmiradar, #knmiradar, #dwdradar").attr("disabled", true); $('label[for="blue"], label[for="gray"], label[for="sat"], label[for="fmiradar"], label[for="knmiradar"], label[for="dwdradar"]').css('color', '#222'); }else{ checkbasemap(); $("#blue, #gray, #sat, #fmirardar, #knmiradar, #dwdradar").attr("disabled", false); $('label[for="blue"], label[for="gray"], label[for="sat"], label[for="fmiradar"], label[for="knmiradar"], label[for="dwdradar"]').css('color', '#ccc'); } if(cz>12){ $("#yrradar").attr("disabled", true); $('label[for="yrradar"]').css('color', '#222'); }else{ $("#yrradar").attr("disabled", false); $('label[for="yrradar"]').css('color', '#ccc'); } }); $("#fmiradar").attr("disabled", false); $("#fmistrikes").attr("disabled", false); $("#yrradar").attr("disabled", false); /* SET CENTERICON (NON-MOBILE) */ if(!isTouch){ $("#setCenter").click(function(){ g=$("#map").width(); h=$("#map").height(); hh=$("#map").height()-60; $("#coordsmapwrap").css({width: g+"px",height: h+"px",}).slideToggle("slow"); $("#coordsmap").css({width: g+"px",height: hh+"px",}); if(!wsmap2){ wsmap2 = L.map("coordsmap").setView([deflat, deflon], 11); L.tileLayer("https://b.maps.nordicweather.net/tiles/normday/{z}/{x}/{y}.png",{attribution:""}).addTo(wsmap2); var centercross2=L.marker([deflat,deflon], {icon: centerMarker,draggable:'true'}).addTo(wsmap2); centercross2.on('dragend', function(event){ var marker = event.target; var position = marker.getLatLng(); boset.deflat=position.lat; boset.deflon=position.lng; deflat=position.lat; deflon=position.lng; centercross.setLatLng(position); locChange=true; liststrikes(); savestorage(); }); } }); $(".mapcenter-popup-close-button").click(function(){ $("#coordsmapwrap").slideToggle("slow"); $("#tipbasemaps").slideToggle("slow"); }); }else{ $("#setCenter").hide(); } /* CHECKBOXES */ checktimesteps(); $(".checkboxesl").change(function(){ boset.settimesteps=true; checktimesteps(); }); checkbasemap(); $(".checkboxesb").change(function(){ checkbasemap(); }); $(".leaflet-control-settings a").on("click", function(e){ $("#tipbasemaps").slideToggle("slow"); }); $(".maptip-popup-close-button").click(function(){ $("#tipbasemaps").slideToggle("slow"); }); checkcounter(); $("#hidecounter").change(function(){ checkcounter(); }); checklegend(); $("#hidelegend").change(function(){ checklegend(); }); checkcross(); $("#hidecross").change(function(){ checkcross(); }); $('.checkboxesd').change(function(){ checkstrikes(); }); $('.checkboxese').change(function(){ checkstorms(); }); /* BO socket */ if(bo && $("#bostrikes").is(":checked")){ boconnect = function(recon){ if(recon){ bbc = io.connect('https://a.nordicweather.net:5530',{"forceNew":true}); }else{ bbc = io.connect('https://a.nordicweather.net:5530'); } bbc.on('connect', function() { bbc.send({"ts":ts,"s":slat,"n":nlat,"w":wlon,"e":elon}); }); bbc.on('message', function(message) { data=JSON.parse(message); jsn = (Date.now() / 1000); if(data.err!=undefined&&data.err=="keyerror"){ $("#mapinfo, #pausemsg").show(); }else{ strCache.bo.push([data.time,data.lat,data.lon]); nSoc=1; } }); } boconnect(false); window.onfocus= function() { if (!(isFocused)) { isFocused = true; if (bbc != undefined && bbc.readyState != 1 && $("#bostrikes").is(":checked") && alive) { boconnect(true); } } }; window.onblur= function() { if ((isFocused)) { isFocused = false; if (bbc != undefined) { bbc.disconnect(); } } }; if(boset.bostrike){ boTimer=setInterval(function(){ strData=strCache.bo; if(nSoc==1||ajx%3==0){ WebGLdraw(-1); nSoc=0; } },1000); } } // IF BO if(boset.lescale===undefined){boset.lescale=4;} checkscale(); $("#leslider").slider({ value:boset.lescale, min: 1, max: 4, step: 1, change: function( event, ui ) { v=ui.value; boset.lescale=v; checkscale(); savestorage(); } }); /* RADARSTUFF */ if(boset.radarOpacity===undefined){boset.radarOpacity=2;} $("#opslider").slider({ value:(boset.radarOpacity*10), min: 1, max: 10, step: 0.1, change: function( event, ui ) { v=(ui.value/10); boset.radarOpacity=v; checkradars(); savestorage(); } }); $("#"+defradar).prop("checked", true); checkradars(); $(".checkboxesc").change(function(){ checkradars(); }); setInterval(function(){ Time = new Date(); $("#clock").html(Time.format("HH:MM:ss")); },1000); setInterval(function(){ counterCheck(); },2000); loadAjax(); aTimer=setInterval(function(){ loadAjax(); },10000); bTimer=setInterval(function(){ now = new Date(); jsn = (Date.now() / 1000); if(now.format("MM") % 5 == 0 && $("#fmiradar").is(":checked")){ fmiradar.setUrl("https://a.nordicweather.net/tiles/fmi/esri_fmidbz1/{z}/{x}/{y}.png?"+jsn); } if(now.format("MM") % 5 == 0 && $("#knmiradar").is(":checked")){ fmiradar.setUrl("https://144.76.141.140/knmiradar/{z}/{x}/{y}.png?"+jsn); } if(now.format("MM") % 5 == 0 && $("#dwdradar").is(":checked")){ fmiradar.setUrl("https://188.165.139.117/dwd/1/{z}/{x}/{y}.png?"+jsn); } if(now.format("MM") % 15 == 0){ var quarter = Math.round((Date.now()-(15*60000)) / (15 * 60000)) * (15 * 60000); var q = new Date(quarter); var utc = new Date(q.getTime() + q.getTimezoneOffset() * 60000); var eudate = utc.format("yyyymmdd.HHMM"); var rdate = utc.format("yyyy-mm-dd")+"T"+utc.format("HH:MM")+"Z"; if($("#yrradar").is(":checked")){ yrradar.setParams({"LAYERS":"radar_precipitation_intensity","FORMAT":"image/png","TIME":rdate,"TRANSPARENT":true}); }else if($("#euradar").is(":checked")){ euradar.setUrl("https://www.radareu.cz/data/radar/radar.anim."+eudate+".0.png"); } } },60000); $(".topPanel, .topBtn").click(function () { var target = $(this).attr("data-layer"); $(".tabcontent").hide(); $("#topPanels .selected, #topBtns .selected").removeClass("selected"); $(this).addClass("selected"); target = target.replace("Panel", "Div"); $("#"+target).show(); if(target=="videoDiv"){dovideo();} if(target=="statsDiv"){dostats();} if(target=="stormsDiv"){dostorms();} return false; }); /*#####################################################################*/ function loadAjax(){ if(fmi&&ajx%6==0){ wget([paths.fmi.real], function(data) { s=JSON.parse(data); do_fmi(s); }); } if(boltek){ wget([paths.boltek.real], function(str) { s=JSON.parse(str); do_boltek(s); }); } if(bo&&ajx%3==0){ wget([paths.bo.real], function(data) { s=JSON.parse(data); do_bo(s); }); } ajx++; $("#mapinfo, #loading").hide(); if(ajx>900){ clearInterval(aTimer); clearInterval(bTimer); clearInterval(boTimer); $("#mapinfo, #pausemsg").show(); if (bbc != undefined) {bbc.disconnect();} alive=false; } } function counterCheck(){ var sTime = Date.now()/1000; var n=0; strData.map(function (d, i) { age=sTime - d[0]; if(age<60){n++;} }); if(lastCounter!=n){ if(n>lastCounter){cty="chevron-up";col="#32CD32";} else if(n'); } lastCounter=n; } function onLocationFound(e) { if(!isTouch){ lc.stop(); } var radius = e.accuracy / 2; deflat=e.latlng.lat; deflon=e.latlng.lng; boset.deflat=e.latlng.lat; boset.deflon=e.latlng.lng; centercross.setLatLng(e.latlng); locChange=true; liststrikes(); savestorage(); } function onLocationError(e) {} function do_fmi(data){ fmit=data.fmitime; strs=data.strikes; addStrikes(strs,strLast.fmi,"FMI"); do_fmistat(data.stat); if(chart2){chart2.series[gfi].update({data: data.fmigraph}, true);} } function do_bo(data){ if(ajx==0||!$("#bostrikes").is(":checked")||($("#bostrikes").is(":checked")&&!isFocused)){ strs=data.strikes; addStrikes(strs,strLast.bo,"BO"); } if(chart2){chart2.series[gbl].update({data: data.graph2}, true);} if(chart2){chart2.series[gbl2].update({data: data.stgraph2}, true);} stormCache.bo=data.clusters; if($("#bostorms").is(":checked")){addStorms(data.clusters);} do_boStormtable(data.clusters); do_bostat(data.stat); } function do_boltek(data){ addStrikes(data.strikes,strLast.boltek,"BOLTEK"); bolstorms=data.storms; bolostorms=data.ostorms; tracreport(measure); oldstorms(measure); do_bolstat(data.real); if(chart2){chart2.series[gbo].update({data: data.graph}, true);} } function do_boStormtable(data){ var table = ''; if(data.length>0){ table+= '' + '' + txtPos + '' + ''+txtStr+'' + ''+txtInte+'' + ''; if(data!==null&&data.length>0){ data.map(function (d, i) { if(i%2 !== 1) { tblcl = "tracrow"; } else { tblcl = "tracrowodd"; } if(d[0]<0){ss=d[0]*-1;s="S";}else{ss=d[0];s="N";} if(d[1]<0){ff=d[1]*-1;f="W";}else{ff=d[1];f="E";} table+= '' + ''+ss.toFixed(4)+'°'+s+', '+ff.toFixed(4)+'°'+f+'' + '' + d[2] + '' + '' + getIntens(d[2]) + ''; }); } table+= ""; $("#stormsBo").html(table).css({paddingBottom: "20px"}); if(data.length>11){$("#trac3").dataTable(tractable);} }else{ $("#stormsBo").html(txtNost).css({paddingBottom: "10px"}); } } function do_bostat(stat){ var g = new Date(stat[7]*1000); var h = new Date(parseInt(stat[7]*1000-3600000)); $("#BOSTR").html(stat[0]); $("#BOMAXHR").html(stat[6]+" ("+h.format("HH:MM")+" - "+g.format("HH:MM")+")"); $("#BOMAX").html(stat[8]); var j = new Date(stat[3]*1000); var k = new Date(parseInt(stat[3]*1000-3600000)); $("#STSTR").html(stat[1]); $("#STMAXHR").html(stat[2]+" ("+k.format("HH:MM")+" - "+j.format("HH:MM")+")"); $("#STMINDIST").html(stat[5]+' km'); $("#STMAXDIST").html(stat[4]+' km'); } function do_bolstat(stat){ $("#MIDNIGHT").html(stat[8]); $("#LMINTOTAL").html(stat[7]); $("#PEAKRATE").html("" + stat[11] + "/min"); $("#PEAKBURSTRATE").html("" + stat[13] + "/"+txtsec); $("#PEAKTIME").html(" ("+stat[12]+")"); $("#PEAKBURSTTIME").html(" ("+stat[14]+")"); midnight = stat[8]; cg = parseFloat(stat[15]); cg += parseFloat(stat[16]); cg = ((cg/midnight)*100).toFixed(0); if(cg === 0) { cg = 0; } $("#CG-TODPREC").html(cg+" %"); cc = parseFloat(stat[17]); cc += parseFloat(stat[18]); cc = ((cc/midnight)*100).toFixed(0); if(cc === 0) { cc = 0; } $("#CC-TODPREC").html(cc+" %"); } function do_fmistat(stat){ var g = new Date(stat[6]*1000); var h = new Date(parseInt(stat[6]*1000-3600000)); $("#FMIMIDNIGHT").html(parseFloat(stat[2])); $("#FMIMAXPEAK").html(parseFloat(stat[0]) + " kA"); $("#FMIMAXMULTI").html(parseFloat(stat[1])); $("#FMIMAXHR").html(stat[5]+" ("+h.format("HH:MM")+" - "+g.format("HH:MM")+")"); midnight = stat[2]; cg = parseFloat(stat[3]); if(cg === "NaN") { cg = 0; } else { cg = ((cg/midnight)*100).toFixed(0); } $("#FMICG").html(cg+" %"); cc = parseFloat(stat[4]); if(cc === "NaN") { cc = 0 ; } else { cc = ((cc/midnight)*100).toFixed(0); } $("#FMICC").html(cc+" %"); } function getPopup(feature) { if(feature.get('sid')){ pop=''+feature.get('sid')+''+ ''+feature.get('flat').toFixed(3)+'°NLatitude:'+ ''+feature.get('flon').toFixed(3)+'°ELongitude:'+ ''+feature.get('sdist')+' '+measure+''+txtDist+':'+ ''+feature.get('sinte')+''+txtInte+':'+ ''+feature.get('stren')+''+txtTren+':'; return pop; } } function checkstrikes(){ if($("#bostrikes").is(":checked")){ boset.bostrike=true; strData=strCache.bo; WebGLdraw(-1); boTimer=setInterval(function(){ strData=strCache.bo; if(nSoc==1||ajx%3==0){ WebGLdraw(-1); nSoc=0; } },1300); }else{ boset.bostrike=false; clearInterval(boTimer); } if($("#bolstrikes").is(":checked")){ boset.bolstrike=true; strData=strCache.boltek; WebGLdraw(-1); }else{ boset.bolstrike=false; } if($("#fmistrikes").is(":checked")){ boset.fmistrike=true; strData=strCache.fmi; WebGLdraw(-1); }else{ boset.fmistrike=false; } savestorage(); } function checkstorms(){ storms.clearLayers(); if($("#bostorms").is(":checked")){ boset.bostorm=true; addStorms(stormCache.bo); }else{ boset.bostorm=false; } if($("#bolstorms").is(":checked")){ boset.bolstorm=true; addStorms(stormCache.boltek); }else{ boset.bolstorm=false; } if($("#fmistorms").is(":checked")){ boset.fmistorm=true; addStorms(stormCache.fmi); }else{ boset.fmistorm=false; } savestorage(); } function checkcounter(){ if($("#hidecounter").is(":checked")){ $("#counterwrap").hide(); boset.hidecounter=true; }else{ $("#counterwrap").show(); boset.hidecounter=false; } checkrightbar(); savestorage(); } function checkscale(){ WebGLdraw(-1); var l=lsteps[boset.lescale]; $("#scale1").html(l[0]); $("#scale2").html(l[0]+"-"+l[1]); $("#scale3").html(l[1]+"-"+l[2]); $("#scale4").html(l[2]+"-"+l[3]); $("#scale5").html(l[3]+"-"+l[4]); $("#scale6").html(l[4]+"-"+l[5]); $("#scale7").html(l[5]); } function checklegend(){ if($("#hidelegend").is(":checked")){ $("#legendwrap").hide(); boset.hidelegend=true; }else{ $("#legendwrap").show(); boset.hidelegend=false; } checkrightbar(); savestorage(); } function checkcross(){ if($("#hidecross").is(":checked")){ centercross.setOpacity(0); boset.hidecross=true; }else{ centercross.setOpacity(1); boset.hidecross=false; } savestorage(); } function checkrightbar(){ if($("#hidelegend").is(":checked")&&$("#hidecounter").is(":checked")){ $("#rightbar").hide(); }else{ $("#rightbar").show(); if($("#hidelegend").is(":checked")){ $("#rightbar").css({maxWidth:"120px",minWidth:"20px",width:"unset"}); $(".onmap").css({marginBottom:"0px"}); if(isTouch){ $(".onmap").hide(); $(".counterhead").hide(); $(".counter").css({lineHeight:"1"}); } }else{ $("#rightbar").css({maxWidth:"115px",width:"115px"}); $(".onmap").css({marginBottom:"10px"}); if(isTouch){ $(".onmap").show(); $(".counterhead").show(); $(".counter").css({lineHeight:"1.5"}); } } } } function checktimesteps(){ for(i=0;i<=7;i++){ if($("#"+i).is(":checked")){ $("#"+i).prop("checked", true); boset.timesteps[i]=2; }else{ $("#"+i).prop("checked", false); boset.timesteps[i]=1; } } savestorage(); WebGLdraw(-1); } function checkradars(){ $("#radarattr").html(""); $("#attributes").show(); if($("#fmiradar").is(":checked")){ map2.addLayer(fmiradar); fmiradar.setOpacity(boset.radarOpacity); boset.radarmap="fmiradar"; $("#radarattr").html(pradar+": FMI, SMHI"); }else{map2.removeLayer(fmiradar);} if($("#yrradar").is(":checked")){ map2.addLayer(yrradar); yrradar.setOpacity(boset.radarOpacity); boset.radarmap="yrradar"; $("#radarattr").html(pradar+": YR"); }else{map2.removeLayer(yrradar);} if($("#knmiradar").is(":checked")){ map2.addLayer(knmiradar); knmiradar.setOpacity(boset.radarOpacity); boset.radarmap="knmiradar"; $("#radarattr").html(pradar+": KNMI"); }else{map2.removeLayer(knmiradar);} if($("#dwdradar").is(":checked")){ map2.addLayer(dwdradar); dwdradar.setOpacity(boset.radarOpacity); boset.radarmap="dwdradar"; $("#radarattr").html(pradar+": DWD"); }else{map2.removeLayer(dwdradar);} if($("#ukmoradar").is(":checked")){ map2.addLayer(ukmoradar); ukmoradar.setOpacity(boset.radarOpacity); boset.radarmap="ukmoradar"; $("#radarattr").html(pradar+": UKMO"); }else{map2.removeLayer(ukmoradar);} if($("#euradar").is(":checked")){ map2.addLayer(euradar); euradar.setOpacity(boset.radarOpacity); euradar.bringToBack(); boset.radarmap="euradar"; $("#radarattr").html(pradar+": RadarCZ"); }else{map2.removeLayer(euradar);} if($("#radardis").is(":checked")){ boset.radarmap="radardis"; $("#attributes").hide(); } savestorage(); } function checkbasemap() { if($("#gray").is(":checked")){ //basemap.setUrl("https://b.maps.nordicweather.net/tiles/gray/{z}/{x}/{y}.png"); basemap.setUrl("https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"); map2.removeLayer(linemap); boset.basemap="gray"; } if($("#blue").is(":checked")){ basemap.setUrl("https://b.maps.nordicweather.net/tiles/blue/{z}/{x}/{y}.png"); map2.removeLayer(linemap); boset.basemap="blue"; } if($("#sat").is(":checked")){ basemap.setUrl("https://b.maps.nordicweather.net/tiles/sat/{z}/{x}/{y}.png"); linemap.addTo(map2); boset.basemap="sat"; } if($("#norm").is(":checked")){ basemap.setUrl("https://b.maps.nordicweather.net/tiles/normday/{z}/{x}/{y}.png"); map2.removeLayer(linemap); boset.basemap="norm"; } if($("#normnight").is(":checked")){ basemap.setUrl("https://b.maps.nordicweather.net/tiles/normnight/{z}/{x}/{y}.png"); map2.removeLayer(linemap); boset.basemap="normnight"; } savestorage(); } function savestorage(){ boset.deflat = deflat; boset.deflon = deflon; $.jStorage.set("eb2016", boset); $.jStorage.setTTL("eb2016", cookieage); return false; } function dostorms(){ if(bo){ $("#BoStormBtn").addClass("active"); $("#BolStormBtn").removeClass("active"); $("#BolOldstormBtn").removeClass("active"); $("#stormsBo").show(); $("#stormsBol").hide(); $("#ostormsBol").hide(); }else{ $("#BolStormBtn").addClass("active"); $("#stormsBo").hide(); $("#ostormsBol").hide(); } $(".stormbuttons").click(function(){ var target = $(this).attr("id"); $(".stormbuttons").removeClass("active"); $(".stormdivs").hide(); if(target == "BoStormBtn"){ $("#BoStormBtn").addClass("active"); $("#stormsBo").show(); }else if (target == "BolStormBtn"){ $("#BolStormBtn").addClass("active"); $("#stormsBol").show(); }else{ $("#BolOldstormBtn").addClass("active"); $("#ostormsBol").show(); } }); } function dovideo(){ var s = $("#videoDiv").width(); var w = $("#videowrap").width(); $("#videodate").css({width:(s-540)+"px"}); $("#boplayer").css({height:(w*heightoffset)+"px"}); $("#videowrap,#videobox").css({height:((w*heightoffset)+20)+"px"}); $("video").html(''); if(bovid==false){ $("#labeleur").addClass("active"); $.getScript("https://static.nordicweather.net/jquery/flowplayer.min.js", function(data, textStatus, jqxhr) { $("#boplayer").flowplayer({ }); api = flowplayer($("#boplayer")); api.load("https://a"+videopath+vidtyp+dateTex); bovid=true; }); } videopicker(); $(".videobuttons").click(function(){ var target = $(this).attr("id"); if(target == "labeleur"){ vidtyp="eur"; heightoffset=1.3; $("#labeleur").addClass("active"); $("#labelnordic").removeClass("active"); vidmindate=new Date(2014, 2 - 1, 20); $("#videopicker").datepicker("destroy"); videopicker(); var w = $("#videowrap").width(); $("#boplayer").css({height:(w*heightoffset)+"px"}); api = flowplayer($("#boplayer")); api.load("https://a"+videopath+vidtyp+dateTex); } if(target == "labelnordic"){ vidtyp=""; heightoffset=1.2; $("#labelnordic").addClass("active"); $("#labeleur").removeClass("active"); vidmindate=new Date(2013, 8 - 1, 7); $("#videopicker").datepicker("destroy"); videopicker(); var w = $("#videowrap").width(); $("#boplayer").css({height:(w*heightoffset)+"px"}); api = flowplayer($("#boplayer")); api.load("https://a"+videopath+vidtyp+dateTex); } }); if(s<780){$("#videodate,#videobox").css({width:"100%"});} $(window).resize(function () { var s = $("#videoDiv").width(); var w = $("#videowrap").width(); $("#boplayer").css({height:(w*heightoffset)+"px"}); $("#videowrap,#videobox").css({height:((w*heightoffset)+20)+"px"}); if(s<780){ $("#videodate,#videobox").css({width:"100%"}); }else{ $("#videodate").css({width:(s-500)+"px"}); $("#videobox").css({width:"500px"}); } $("#boplayer").css({height:(w*heightoffset)+"px"}); $("#videowrap,#videobox").css({height:((w*heightoffset)+20)+"px"}); }); } function videopicker(){ $("#videopicker").datepicker({ inline: true, numberOfMonths: [1,1], dateFormat: "yymmdd", minDate: vidmindate, maxDate: new Date(), monthNames: mon, dayNamesMin: das, firstDay: 1, onSelect: function(dateText, inst) { dateTex=dateText+".mp4"; api = flowplayer($("#boplayer")); api.load("https://a"+videopath+vidtyp+dateTex); } }); return false } function dostats(){ $(".statdivs").hide(); $("#statsbuttons").removeClass("active"); $("#statsTodayBtn").addClass("active"); $("#statsToday").show(); $(".statsbuttons").click(function(){ var target = $(this).attr("id"); target = target.replace("Btn", ""); $(".statsbuttons").removeClass("active"); $(".statdivs").hide(); $("#"+target+"Btn").addClass("active"); $("#"+target).show(); }); } Highcharts.setOptions({ chart: { renderTo: "EBGraph", defaultSeriesType: "spline", backgroundColor: "#212121", plotBackgroundColor: "#333", plotBorderColor: "#424242", plotBorderWidth: 0.5, marginRight: 0, marginLeft: 45, marginTop: 10, marginBottom: 60, style: {fontFamily: '"opensans",Verdana,Helvetica,sans-serif',fontSize:'12px',color:"#fff"} }, global: {useUTC: false}, title: {text: ""}, lang: {thousandsSep: ""}, credits: {enabled: false}, plotOptions: { series: {marker: { radius: 0,states: {hover: {enabled: true}}}}, spline: {lineWidth: 1.5, shadow: false, cursor: "pointer",states:{hover:{enabled: false}}}, column: {stacking: 'normal',pointPadding: 0.2,lineWidth:0,pointWidth:25,borderColor:"#CD6600"}, areaspline: {lineWidth: 1.5, shadow: false,states:{hover:{enabled: false}}} }, tooltip: { borderColor: "#222", borderRadius: 1, borderWidth: 0.5, backgroundColor: "rgba(0, 0, 0, .85)", style: {color: '#ccc',fontSize: '12px',padding: '8px'}, shared: true, useHTML: true, crosshairs: { width: 0.5,color: "#666"}, formatter: function () { var index = this.points[0].point.index; var ret = "" + Highcharts.dateFormat('%H:%M', this.x-3600000)+" - "; ret += Highcharts.dateFormat('%H:%M', this.x) +""; ret += ''; Highcharts.each(this.points, function (point) { var series = point.series; ret += '\u25CF ' + series.name + ': ' + Highcharts.pick(point.point.value, point.y) + ''; }); ret += ''; return ret; } }, legend: { borderWidth: 0,itemStyle: {fontFamily: '"opensans",Verdana,Helvetica,sans-serif',fontSize:'12px',color:"#fff",fontWeight:300}}, exporting: {enabled:false} }); var globalX = [{ gridLineWidth: 0.4, gridLineColor: "#424242", lineWidth: 0, title: {text: null}, tickLength:0, tickInterval: 2 * 3600 * 1000, labels: {y: 16,style:{fontSize:'12px',color: "#fff"},formatter: function() {return Highcharts.dateFormat('%H', this.value);}} }]; if(bo == 1){var gr_bo = {name: totstr,data: a2,color:"#FFA500",type:"areaspline"};} if(bo == 1){var gr_bob = {name: owntotstr,data: a3,color:"#FF0113",type:"areaspline"};} if(boltek == 1){var gr_bol = {name: bolstr,data: n2,color:"#20FE02",type:"areaspline"};} if(fmi == 1){var gr_fmi = {name: "FMI",data: f1,color:"#9FB6CD",type:"areaspline"};} var gdata = []; if(bo == 1){gdata.push(gr_bo);gdata.push(gr_bob);} if(boltek == 1){gdata.push(gr_bol);} if(fmi == 1){gdata.push(gr_fmi);} var tempoptions = { chart:{events: {spacingTop:4}}, xAxis: globalX, yAxis: [{ gridLineWidth: 0.4,min:0,gridLineColor: "#424242",title: {text: ""}, labels:{x:-4,style:{fontSize:'12px',color:"#fff"},formatter: function(){return this.axis.defaultLabelFormatter.call(this);}} }], series: gdata }; $("#EBGraph").appear(function() { chart2 = new Highcharts.Chart(tempoptions); }); tractable = { "sPaginationType": "full_numbers", "bPaginate": true, "bLengthChange": false, "bFilter": false, "bSort": false, "bAutoWidth": false, "oLanguage": { "sInfo": txttablecount, "oPaginate":{"sFirst": txtfirst,"sLast":txtlast,"sNext":txtnext,"sPrevious":txtprev} } }; // BOLTEK CURRENT STORMS-TABLE function tracreport(measure) { if(bolstorms.length>0){ var table = ''; var trends = Array("No", "Weakening", "Intensifying", "Undetermined"); var intensitys = Array("Weak", "Moderate", "Strong", "Severe"); table+= '' + 'ID' + '' + txtDete + '' + '' + txtBear + '' + '' + txtDist + '' + '' + txtInte + '' + '' + txtTren+ '' + '' + txtRate + '' + '' + txtPeak + ''; if(ld250!==1){ table+= 'CG' + 'CC '; } table+= '' + txtTota + '' + '' + txtAge + ''; storm=[]; for (var i = 0; i <= bolstorms.length-1; i++) { part = bolstorms[i]; id = part[0]; var d = new Date(part[1]*1000); detec = d.format("HH:MM:ss"); dbear = (parseInt(part[2])/10)-180; if(dbear < 0){dbear=dbear+360;} getpoint(dbear, part[3], centerlat, centerlon, measure); dlat=plat,dlon=plon; bear = parseInt(part[5])/10; if(bear < 0){bear=bear+360;} getpoint(bear, part[6], centerlat, centerlon, measure); dbear = getbearing(dlat, dlon, plat, plon); if(dbear < 0){dbear=dbear+360;} txtdbear = windDir(dbear); var f = new Date(); var take = (f.getTimezoneOffset() * 60) + parseInt(part[4]) - parseInt(part[1]); //var take = (2*60) + parseInt(part[4]) - parseInt(part[1]); disti = distance(deflat, deflon, plat, plon, measure).toFixed(0); bbear = (parseInt(part[5])/10)-strmrot; if(bbear < 0){bbear=bbear+360;} getpoint(bbear, part[6], centerlat, centerlon, measure); blat=plat,blon=plon; txtbear = windDir(bbear); var a = new Date((take + 3600) *1000); age = a.format("HH:MM:ss"); curate = part[7]; prate = part[8]; totst = parseInt(part[11],10); cga = parseInt(part[12],10); cga+= parseInt(part[13],10); cg = (cga/totst*100).toFixed(0); cca = parseInt(part[14],10); cca+= parseInt(part[15],10); cc = (cca/totst*100).toFixed(0); tt = trendtxt[part[10]]; jj = intensitytxt[part[9]]; jcolor = bgcolor[part[9]]; storm.push([blat,blon,curate,10000]); if(disti < 50) {nearby = 'on';} var tblcl; if(i%2 !== 1) {tblcl = "tracrow"; } else {tblcl = "tracrowodd"; } table+= '' + '' + id + '' + '' + detec + '' + '' + txtbear + '' + '' + disti + ' '+ measure +'' + '' + jj + '' + '' + tt + '' + '' + curate + '' + '' + prate + ''; if(ld250!==1){ table+= '' + cg + '%' + '' + cc + '%'; } table+= '' + totst + '' + '' + age + ''; } // EOF each if($("#bolstorms").is(':checked')){ addStorms(storm); stormCache.boltek=storm; } table+= ""; $("#stormsBol").html(table).css({paddingBottom: "20px"}); if(part.length>11){$("#trac1").dataTable(tractable);} }else{ $("#stormsBol").html(txtNost).css({paddingBottom: "10px"}); stormCache.boltek=[]; } } //################################################################## // BOLTEK OLD STORMS-TABLE function oldstorms(measure) { if(parseInt(bolostorms.length) > 0) { var table = ''; var trends = Array("No", "Weakening", "Intensifying", "Undetermined"); var intensitys = Array("Weak", "Moderate", "Strong", "Severe"); var r = new Date(); var n = (r.getTimezoneOffset() * 60); table+= '' + 'ID' + '' + txtDete + '' + '' + txtLast + '' + '' + txtClBear + '' + '' + txtClDist + '' + '' + txtMaxInte + '' + '' + txtPeak + ''; if(ld250!==1){ table+= 'CG' + 'CC '; } table+= '' + txtTota + '' + '' + txtDura + ''; for (var i = 0; i <= bolostorms.length-1; i++) { part = bolostorms[i]; id = part[0]; var d = new Date(part[1]*1000); detec = d.format("HH:MM:ss"); bear = parseInt(part[2])/10; getpoint(bear, part[3], centerlat, centerlon, measure); disti = distance(deflat, deflon, plat, plon, measure).toFixed(0); bear = getbearing(deflat, deflon, plat, plon); bear = windDir(bear); var f = new Date(part[4]*1000); lastact = f.format("HH:MM:ss"); var take = n + parseInt(part[4]) - parseInt(part[1]); var a = new Date((take+3600)*1000); age = a.format("HH:MM:ss"); curate = part[7]; prate = part[8]; totst = parseInt(part[11],10); cga = parseInt(part[12],10); cga+= parseInt(part[13],10); cg = (cga/totst*100).toFixed(0); cca = parseInt(part[14],10); cca+= parseInt(part[15],10); cc = (cca/totst*100).toFixed(0); tt = trendtxt[part[10]]; jj = intensitytxt[part[9]]; jcolor = bgcolor[part[9]]; var tblcl; if(i%2 !== 1) { tblcl = "tracrow"; } else { tblcl = "tracrowodd"; } table+= '' + '' + id + '' + '' + detec + '' + '' + lastact + '' + '' + bear +'' + '' + disti + ' '+ measure +'' + '' + jj + '' + '' + prate + ''; if(ld250!==1){ table+= '' + cg + '%' + '' + cc + '%'; } table+= '' + totst + '' + '' + age + ''; } // EOF each table+= ""; $("#ostormsBol").html(table).css({paddingBottom: "20px"}); if(part.length>11){$("#trac2").dataTable(tractable);} }else{ $("#bolostorms").html(txtOldNost).css({paddingBottom: "10px"}); } return false; } // EOF OLD TABLE })(jQuery) // EOF jQ //######################################################################################### function liststrikes(){ var list=[]; var now = (Date.now() / 1000); var thead=''+txtTime+''+txtPos+'' +''+txtDist+''+txtBear+''; var outlist = thead; var boutlist = thead; var list = strData; if(list!==null&&list.length>0){ list.map(function (d, i) { if(locChange==true||list[i][3]===undefined){ list[i][3] = parseFloat(distance(list[i][1], list[i][2], deflat, deflon, measure).toFixed(2)); list[i][4] = 1; } }); locChange=false; list.sort(function(a,b) {return (b[0]a[0]?1:0));}); //list.reverse(); var listlength = list.length >= 10 ? 10 : list.length; for (var i = 0; i < listlength; ++i) { if(i%2===0){var ro="even";}else{var ro="odd";} var da = new Date(list[i][0]*1000); stime = da.format("HH:MM:ss"); sbear = windDir(getbearing(list[i][1], list[i][2], deflat, deflon)); if(list[i][1]<0){ss=list[i][1]*-1;s="S";}else{ss=list[i][1];s="N";} if(list[i][2]<0){dd=list[i][2]*-1;d="W";}else{dd=list[i][2];d="E";} outlist += ''+stime+''+ss.toFixed(4)+'°'+s+''+dd.toFixed(4)+'°'+d+'' +''+list[i][3].toFixed(2)+' km'+sbear+''; }; list.sort(function(a,b) {return (a[3]b[3]?1:0));}); for (var i = 0; i < listlength; ++i) { if(i%2===0){var ro="even";}else{var ro="odd";} var d = new Date(list[i][0]*1000); stime = d.format("HH:MM:ss"); sbear = windDir(getbearing(list[i][1], list[i][2], deflat, deflon)); if(list[i][1]<0){ss=list[i][1]*-1;s="S";}else{ss=list[i][1];s="N";} if(list[i][2]<0){dd=list[i][2]*-1;d="W";}else{dd=list[i][2];d="E";} boutlist += ''+stime+''+ss.toFixed(4)+'°'+s+''+dd.toFixed(4)+'°'+d+'' +''+list[i][3].toFixed(2)+' km'+sbear+''; } } $("#strikelist").show(); $("#laststrtable").html(outlist); $("#closeststrtable").html(boutlist); } function getcolor(age) { var l=lsteps[boset.lescale]; if(age<(l[0]*60)){return [getGLcolor(scolors[0]), 1];} else if(age<(l[1]*60)){return [getGLcolor(scolors[1]), 2];} else if(age<(l[2]*60)){return [getGLcolor(scolors[2]), 3];} else if(age<(l[3]*60)){return [getGLcolor(scolors[3]) ,4];} else if(age<(l[4]*60)){return [getGLcolor(scolors[4]) ,5];} else if(age<(l[5]*60)){return [getGLcolor(scolors[5]), 6];} else{return [getGLcolor(scolors[6]), 7];} } function getGLcolor(hex) { if (hex.length < 6) return null; hex = hex.toLowerCase(); if (hex[0] === '#') { hex = hex.substring(1, hex.length); } var r = parseInt(hex[0] + hex[1], 16), g = parseInt(hex[2] + hex[3], 16), b = parseInt(hex[4] + hex[5], 16); return {r: r / 255, g: g / 255, b: b / 255}; } function WebGLdraw(last){ var strTime = Date.now(); verts=[]; pings=[]; s=0; if(strData!==null&&strData.length>0){ if(last==-1){last=getLast(strData);} strData.sort(function(a,b) {return (a[0]b[0]?1:0));}); //console.log("1:"+ (Date.now()-strTime) +"ms"); strData.map(function (d, i) { pixel = LatLongToPixelXY(d[1], d[2]); age=((strTime/1000) - d[0]); color = getcolor(age); step = color[1]; if(boset.timesteps[step] === 2){ verts.push(pixel.x, pixel.y, color[0]["r"], color[0]["g"], color[0]["b"]); if(age<60&&d[4]===undefined){pings.push([d[2], d[1]]);} s++; } }); } //console.log("2:"+ (Date.now()-strTime) +"ms"); numPoints = s; vertArray = new Float32Array(verts); fsize = vertArray.BYTES_PER_ELEMENT; gl.bindBuffer(gl.ARRAY_BUFFER, vertBuffer); gl.bufferData(gl.ARRAY_BUFFER, vertArray, gl.STATIC_DRAW); gl.vertexAttribPointer(vertLoc, 2, gl.FLOAT, false,fsize*5,0); gl.enableVertexAttribArray(vertLoc); gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, fsize*5, fsize*2); gl.enableVertexAttribArray(colorLoc); glLayer.redraw(); //console.log("3:"+ (Date.now()-strTime) +"ms"); pings.map(function (d, i) { pingLayer.ping([d[0], d[1]]); }); //console.log("4:"+ (Date.now()-strTime) +"ms"); $("#totcounter").html(s); liststrikes(); console.log("upd:"+ (Date.now()-strTime) +"ms"); } function WebGLsetup(){ gl = canvas.getContext('experimental-webgl', { antialias: true }); pixelsToWebGLMatrix = new Float32Array(16); mapMatrix = new Float32Array(16); // -- WebGl setup vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, shader.vertex); gl.compileShader(vertexShader); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, shader.fragment); gl.compileShader(fragmentShader); // link shaders to create our program program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); gl.enable(gl.BLEND); // look up the locations for the inputs to our shaders. u_matLoc = gl.getUniformLocation(program, "u_matrix"); colorLoc = gl.getAttribLocation(program, "a_color"); vertLoc = gl.getAttribLocation(program, "a_vertex"); gl.aPointSize = gl.getAttribLocation(program, "a_pointSize"); pixelsToWebGLMatrix.set([2 / canvas.width, 0, 0, 0, 0, -2 / canvas.height, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1]); gl.viewport(0, 0, canvas.width, canvas.height); gl.uniformMatrix4fv(u_matLoc, false, pixelsToWebGLMatrix); vertBuffer = gl.createBuffer(); } function drawingOnCanvas(canvasOverlay, params) { if (gl == null) return; gl.clear(gl.COLOR_BUFFER_BIT); pixelsToWebGLMatrix.set([2 / canvas.width, 0, 0, 0, 0, -2 / canvas.height, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1]); gl.viewport(0, 0, canvas.width, canvas.height); var zo=map2.getZoom(); if(zo<8){var pointSize = 3;} else if(zo<11){var pointSize = 4;} else {var pointSize = 5;} gl.vertexAttrib1f(gl.aPointSize, pointSize); mapMatrix.set(pixelsToWebGLMatrix); var bounds = map2.getBounds(); var topLeft = new L.LatLng(bounds.getNorth(), bounds.getWest()); var offset = LatLongToPixelXY(topLeft.lat, topLeft.lng); var scale = Math.pow(2, map2.getZoom()); scaleMatrix(mapMatrix, scale, scale); translateMatrix(mapMatrix, -offset.x, -offset.y); gl.uniformMatrix4fv(u_matLoc, false, mapMatrix); gl.drawArrays(gl.POINTS, 0, numPoints); } function getLast(arr){ var times=[]; if(arr!==null&&arr.length>0){ arr.map(function (d, i) { if(typeof d[0] == 'number'){ times.push(d[0]); } }); } return Math.max.apply(Math, times); } function addStrikes(arr,last,dataset){ if(arr!==null&&arr.length>0){ arr.map(function (d, i) { if(d[0]>last){ if(dataset=="BO"){strCache.bo.push(d);} if(dataset=="BOLTEK"){strCache.boltek.push(d);} if(dataset=="FMI"){strCache.fmi.push(d);} } }); } var d = new Date(); if(bo&&boset.bostrike){ strData=strCache.bo; if(dataset=="BO"&&arr.length>0){strLast.bo=getLast(strCache.bo);} if(dataset=="BO"&&$("#bostrikes").is(":checked")){WebGLdraw(strLast.bo);} } if(boltek&&boset.bolstrike){ strData=strCache.boltek; if(dataset=="BOLTEK"&&arr.length>0){strLast.boltek=getLast(strCache.boltek);} if(dataset=="BOLTEK"&&$("#bolstrikes").is(":checked")){WebGLdraw(strLast.boltek);} } if(fmi&&boset.fmistrike){ strData=strCache.fmi; if(dataset=="FMI"&&arr.length>0){strLast.fmi=getLast(strCache.fmi);} if(dataset=="FMI"&&$("#fmistrikes").is(":checked")){WebGLdraw(strLast.fmi);} } return false; } function addStorms(arr){ storms.clearLayers(); if(arr!==null&&arr.length>0){ arr.map(function (d, i) { circ = L.circle([d[0], d[1]], d[3],{color:getStormcolor(d[2])}); storms.addLayer(circ); }); } } function getStormcolor(val){ if(val>250){return bgcolor[3];} if(val>125){return bgcolor[2];} if(val>50){return bgcolor[1];} return bgcolor[0] } function getIntens(val){ if(val>250){return ''+intensitytxt[3]+'';} if(val>125){return ''+intensitytxt[2]+'';} if(val>50){return ''+intensitytxt[1]+'';} return ''+intensitytxt[0]+''; } function randomInt(range) { return Math.floor(Math.random() * range); } function LatLongToPixelXY(latitude, longitude) { var pi_180 = Math.PI / 180.0; var pi_4 = Math.PI * 4; var sinLatitude = Math.sin(latitude * pi_180); var pixelY = (0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (pi_4)) * 256; var pixelX = ((longitude + 180) / 360) * 256; var pixel = { x: pixelX, y: pixelY }; return pixel; } function translateMatrix(matrix, tx, ty) { // translation is in last column of matrix matrix[12] += matrix[0] * tx + matrix[4] * ty; matrix[13] += matrix[1] * tx + matrix[5] * ty; matrix[14] += matrix[2] * tx + matrix[6] * ty; matrix[15] += matrix[3] * tx + matrix[7] * ty; } function scaleMatrix(matrix, scaleX, scaleY) { // scaling x and y, which is just scaling first two columns of matrix matrix[0] *= scaleX; matrix[1] *= scaleX; matrix[2] *= scaleX; matrix[3] *= scaleX; matrix[4] *= scaleY; matrix[5] *= scaleY; matrix[6] *= scaleY; matrix[7] *= scaleY; } function wget(urls, fn) { var results = [],complete = 0,total = urls.length; urls.forEach(function(url, i) { var request = new XMLHttpRequest(); request.open('GET', url, true); request.onload = function () { if (request.status < 200 && request.status > 400) return; results[i] = request.responseText; complete++; if (complete === total) fn.apply(null, results); }; request.send(); }); } function abs (mixed_number) {return Math.abs(mixed_number) || 0;} function atan2(y, x) {return Math.atan2(y, x);} function asin(arg) {return Math.asin(arg);} function sin(arg) {return Math.sin(arg);} function deg2rad(angle) {return (angle / 180) * Math.PI;} function cos(arg) {return Math.cos(arg);} function acos(arg) {return Math.acos(arg);} function rad2deg (angle) {return (angle / Math.PI) * 180;} function windDir($winddir){ $windlabel = new Array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"); return $windlabel[Math.floor(((parseInt($winddir, 10) + 11) / 22.5) % 16 )]; } function distance(lat1, lon1, lat2, lon2, unit) { if (unit === 'km' || measure === '0') { R = 6372.797; // earth's mean radius in kilometers } else { R = 3956; // earth's mean radius in miles (default) } var dLat = deg2rad((lat2-lat1)),dLon = deg2rad((lon2-lon1)); lat1 = deg2rad(lat1), lat2 = deg2rad(lat2); var a = Math.sin(dLat/2) * Math.sin(dLat/2) +Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; return d; } function getpoint(angle, distance, lat, lon, measure) { if (measure === 'km' || measure === '0') { R = 6372.797; // earth's mean radius in kilometers } else { R = 3956; // earth's mean radius in miles (default) } var lat1 = deg2rad(lat), lon1 = deg2rad(lon),brng = deg2rad(angle),d = distance; var lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) + Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) ); var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2)); lon2 = (lon2+Math.PI)%(2*Math.PI) - Math.PI; // normalise to -180...+180 if (isNaN(lat2) || isNaN(lon2)) {return null;} plat = rad2deg(lat2),plon = rad2deg(lon2); return; } function getbearing(lat1,lon1,lat2,lon2) { var lat1 = deg2rad(lat1), lat2 = deg2rad(lat2); var dLon = deg2rad((lon2-lon1)); var y = Math.sin(dLon) * Math.cos(lat2); var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); var brng = Math.atan2(y, x); var bear = ((rad2deg(brng)+360) % 360)+180; if(bear>360){bear=bear-360;} return bear; } if(!dateFormat){ var dateFormat = function () { var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function (val, len) { val = String(val); len = len || 2; while (val.length < len) val = "0" + val; return val; }; return function (date, mask, utc) { var dF = dateFormat; if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { mask = date; date = undefined; } date = date ? new Date(date) : new Date; //if (isNaN(date)) throw SyntaxError("invalid date"); mask = String(dF.masks[mask] || mask || dF.masks["default"]); if (mask.slice(0, 4) == "UTC:") { mask = mask.slice(4); utc = true; } var _ = utc ? "getUTC" : "get", d = date[_ + "Date"](), D = date[_ + "Day"](), m = date[_ + "Month"](), y = date[_ + "FullYear"](), H = date[_ + "Hours"](), M = date[_ + "Minutes"](), s = date[_ + "Seconds"](), L = date[_ + "Milliseconds"](), o = utc ? 0 : date.getTimezoneOffset(), flags = { d: d, dd: pad(d), ddd: dF.i18n.dayNames[D], dddd: dF.i18n.dayNames[D + 7], m: m + 1, mm: pad(m + 1), mmm: dF.i18n.monthNames[m], mmmm: dF.i18n.monthNames[m + 12], yy: String(y).slice(2), yyyy: y, h: H % 12 || 12, hh: pad(H % 12 || 12), H: H, HH: pad(H), M: M, MM: pad(M), s: s, ss: pad(s), l: pad(L, 3), L: pad(L > 99 ? Math.round(L / 10) : L), t: H < 12 ? "a" : "p", tt: H < 12 ? "am" : "pm", T: H < 12 ? "A" : "P", TT: H < 12 ? "AM" : "PM", Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] }; return mask.replace(token, function ($0) { return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); }); }; }(); // Some common format strings dateFormat.masks = { "default": "ddd mmm dd yyyy HH:MM:ss", shortDate: "m/d/yy", mediumDate: "mmm d, yyyy", longDate: "mmmm d, yyyy", fullDate: "dddd, mmmm d, yyyy", shortTime: "h:MM TT", mediumTime: "h:MM:ss TT", longTime: "h:MM:ss TT Z", isoDate: "yyyy-mm-dd", isoTime: "HH:MM:ss", isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" }; // Internationalization strings dateFormat.i18n = { dayNames: [], monthNames: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] }; // For convenience... Date.prototype.format = function (mask, utc) { return dateFormat(this, mask, utc); }; }