{"version":3,"sources":["js/main.js"],"names":["t2p","t","Math","log","tan","PI","n2p","n","WeatherOverlay","boundsSW","boundsNE","image","map","this","sw","ne","image_","map_","div_","img_","opacity","visible","setMap","encodeIndex","x","y","z","ndx","normaliseIndices","decodeIndex","split","render","posZ","mp","pow","topZ","w","painter","width","h","height","sz","xMin","posX","yMin","posY","xMax","yMax","szmx","ceil","szmy","floor","xoff","yoff","tileKey","tiles","complete","canvas","drawImage","round","Image","src","tileString","onload","fillStyle","fillRect","md","Uint32Array","getImageData","data","buffer","toggleFullScreen","document","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","exitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen","documentElement","requestFullscreen","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","zoomIn","maxZ","setZoom","zoomOut","minZ","closeResAreaDlg","$","fadeOut","hide","execResAreaDlg","window","innerHeight","fadeTo","show","getNormalizedCoord","coord","zoom","tileRange","mod","a","b","url","initialize","konaOptions","getTileUrl","normalizedCoord","tileSize","google","maps","Size","maxZoom","minZoom","name","konaMapType","ImageMapType","mapOptions","center","LatLng","serverVariables","lat","lon","draggableCursor","mapTypeControl","mapTypeControlOptions","mapTypeIds","MapTypeId","HYBRID","position","ControlPosition","RIGHT_BOTTOM","mapTypeId","mapID","overviewMapControl","panControl","rotateControl","scaleControl","streetViewControl","zoomControl","weatherMap","getElementById","Map","mapTypes","set","event","addListener","getZoom","ctimer","clearTimeout","getCenter","lng","setTimeout","settings","save","animation","redraw","firstChild","style","zIndex","overlayMapTypes","insertAt","NameMapOverlay","clientHeight","clientWidth","overlay","st","Date","cmt","fn","rs","rt","sf","playBtn","weatherOverlay","meteoLatLon","saver","fr","Array","stimer","createElement","getContext","overlay2d","prototype","OverlayView","onAdd","div","border","borderWidth","img","appendChild","panes","getPanes","overlayLayer","draw","overlayProjection","getProjection","swp","fromLatLngToDivPixel","nep","swpdx","nepdx","sx","nx","wx","dx","getWorldWidth","left","top","onRemove","parentNode","removeChild","visibility","adjust","equals","setImage","imageUrl","overlayImage","idx","imageOverlay","fromLatLngToContainerPixel","globalCompositeOperation","id","im","i","putImageData","p","toDataURL","getMapTypeId","update","o","listener","off","setOptions","removeListener","on","mgUrl","Url","uid","userName","pass","password","res","latLng","sea","toString","ng","attr","click","getTile","ownerDocument","addDomListener","addEventListener","innerWidth","keyScale","KeyScale","_el","meteo","ks",1,2,4,7,8,16,32,64,128,"el","downloader","Downloader","_Limit","_FailureLimit","_frames","_failed","_id","_paused","_scheduled","start","j","push","_pm","setNext","k","reset","length","found","next","splice","bounds","getBounds","toSpan","RAD2DEG","DEG2RAD","PI_2","PI_4","wh2","ht2","cT","cN","radius","nDiameter","pixel2Deg","pixel2Rad","yCenterOffset","atan","exp","getSouthWest","getNorthEast","c","_this","_nf","_getDownloadUrl","_doDownload","_downloadSuccess","_downloadFailed","frameid","arrayBufferView","Uint8Array","blob","Blob","type","urlCreator","create","frameReady","pbar","setCached","frameFailed","setFailed","success","error","retry","ajax","dataType","processData","responseType","mt","u","stepInMinutes","get","UrlCreator","_urlCreator","URL","webkitURL","createObjectURL","revoke","revokeObjectURL","clock","Clock","setFrameDate","_custom","html","d","console","getHours","getMinutes","getSeconds","getMilliseconds","player","Player","_state","_backBtn","_playBtn","_frwdBtn","_back","_playPause","_fwd","_show","_hide","setState","state","css","backgroundImage","pause","resume","back","fwd","Animation","_TickerInterval","_FrameInterval","_currentFrame","_nextFrame","_currentFrameTimeStamp","_playing","_ticker","setInterval","_onTick","clearInterval","_revokeObjectURLs","_showNext","valueOf","_scheduleNext","_updateUI","setCurrent","now","last","undefined","PBar","_elContainer","_elStartText","find","_elEndText","_getValue","e","clientX","_elProgressBar","l","offset","rebuild","f","broadcast","Settings","_active","_getSaveUrl","s","r","m","_doSave","base","query","_base","_query","extend","_formatData","v","_joinQueryKeyValuePair","join","_joinQueryString","qs","_joinUrl","getQueryString","_","pairs","encodeData","encodeURIComponent","ajaxTransport","options","originalOptions","jqXHR","FormData","ArrayBuffer","send","headers","callback","xhr","XMLHttpRequest","async","username","response","status","statusText","getAllResponseHeaders","open","setRequestHeader","abort","_getScope","angular","element","scope","_getRoot","$root","NG","args","$apply","$broadcast","variable","value","injector"],"mappings":"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","file":"js/main.min.js","sourcesContent":["\"use strict\";\r\n\r\nfunction t2p(t) {\r\n return (33554432 * (1.0 - Math.log(Math.tan(0.25 * Math.PI * (t / 90.0 + 1.0))) / Math.PI));\r\n}\r\n\r\nfunction n2p(n) {\r\n return (33554432 * (1.0 + n / 180.0));\r\n}\r\n\r\nvar st = new Date();\r\n\r\nvar cmt = 0;\r\nvar fn = 49;\r\nvar rs = 2;\r\nvar rt = 2;\r\nvar sf = 0;\r\n\r\nvar map;\r\nvar playBtn;\r\nvar weatherMap;\r\nvar weatherOverlay;\r\nvar meteoLatLon;\r\n\r\nvar minZ = 2;\r\nvar maxZ = 10;\r\nvar topZ = 18;\r\n\r\nvar posX = n2p(serverVariables.lon);\r\nvar posY = t2p(serverVariables.lat);\r\nvar posZ = serverVariables.zoom;\r\nvar saver;\r\n\r\nvar fr = new Array(fn);\r\n\r\nvar md;\r\nvar ctimer;\r\nvar stimer;\r\nvar tiles = {};\r\nvar painter = document.createElement(\"canvas\");\r\nvar canvas = painter.getContext(\"2d\");\r\nvar overlay = document.createElement(\"canvas\");\r\nvar overlay2d = overlay.getContext(\"2d\");\r\n\r\nfunction WeatherOverlay(boundsSW, boundsNE, image, map) {\r\n this.sw = boundsSW;\r\n this.ne = boundsNE;\r\n\r\n this.image_ = image;\r\n this.map_ = map;\r\n\r\n this.div_ = null;\r\n this.img_ = null;\r\n\r\n this.opacity = 0.6;\r\n this.visible = true;\r\n\r\n this.setMap(map);\r\n}\r\n\r\nWeatherOverlay.prototype = new google.maps.OverlayView();\r\n\r\nWeatherOverlay.prototype.onAdd = function() {\r\n var div = document.createElement(\"div\");\r\n div.style.border = \"none\";\r\n div.style.borderWidth = \"0px\";\r\n div.style.position = \"absolute\";\r\n\r\n var img = document.createElement(\"img\");\r\n\r\n img.src = this.image_;\r\n img.style.width = \"100%\";\r\n img.style.height = \"100%\";\r\n img.style.position = \"absolute\";\r\n img.style.opacity = this.opacity;\r\n\r\n div.appendChild(img);\r\n this.div_ = div;\r\n this.img_ = img;\r\n\r\n var panes = this.getPanes();\r\n panes.overlayLayer.appendChild(div);\r\n}\r\n\r\nWeatherOverlay.prototype.draw = function() {\r\n var overlayProjection = this.getProjection();\r\n\r\n var swp = overlayProjection.fromLatLngToDivPixel(this.sw);\r\n var nep = overlayProjection.fromLatLngToDivPixel(this.ne);\r\n\r\n if(this.ne.lng() - this.sw.lng() >= 360) {\r\n var swpdx, nepdx, sx, nx, xx;\r\n var wx = weatherMap.clientWidth >> 1;\r\n var dx = overlayProjection.getWorldWidth() / 360;\r\n\r\n swpdx = wx - (map.getCenter().lng() - this.sw.lng()) * dx;\r\n nepdx = wx - (map.getCenter().lng() - this.ne.lng()) * dx;\r\n\r\n sx = swpdx - nepdx + nep.x;\r\n nx = nepdx - swpdx + swp.x;\r\n\r\n if(nx > weatherMap.clientWidth - sx) {\r\n swp.x = sx;\r\n }\r\n else {\r\n nep.x = nx;\r\n }\r\n\r\n if(nep.x < wx) {\r\n swp.x += overlayProjection.getWorldWidth();\r\n nep.x += overlayProjection.getWorldWidth();\r\n }\r\n else if(swp.x > wx) {\r\n swp.x -= overlayProjection.getWorldWidth();\r\n nep.x -= overlayProjection.getWorldWidth();\r\n }\r\n }\r\n\r\n var div = this.div_;\r\n\r\n div.style.left = (swp.x | 0) + \"px\";\r\n div.style.top = (nep.y | 0) + \"px\";\r\n div.style.width = ((nep.x - swp.x) | 0) + \"px\";\r\n div.style.height = ((swp.y - nep.y) | 0) + \"px\";\r\n}\r\n\r\nWeatherOverlay.prototype.onRemove = function() {\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n this.img_ = null;\r\n}\r\n\r\nWeatherOverlay.prototype.hide = function() {\r\n if(this.div_) {\r\n this.div_.style.visibility = \"hidden\";\r\n this.visible = false;\r\n }\r\n}\r\n\r\nWeatherOverlay.prototype.show = function() {\r\n if(this.div_ && !this.visible) {\r\n this.div_.style.visibility = \"visible\";\r\n this.visible = true;\r\n }\r\n}\r\n\r\nWeatherOverlay.prototype.adjust = function(boundsSW, boundsNE) {\r\n if((!this.sw.equals(boundsSW)) || (!this.ne.equals(boundsNE))) {\r\n this.sw = boundsSW;\r\n this.ne = boundsNE;\r\n this.draw();\r\n }\r\n}\r\n\r\nWeatherOverlay.prototype.setImage = function(imageUrl) {\r\n if(this.img_) {\r\n this.img_.src = imageUrl;\r\n }\r\n}\r\n\r\nWeatherOverlay.prototype.overlayImage = function(imageUrl, idx) {\r\n var imageOverlay = new Image();\r\n var overlayProjection = this.getProjection();\r\n\r\n var swp = overlayProjection.fromLatLngToContainerPixel(this.sw);\r\n var nep = overlayProjection.fromLatLngToContainerPixel(this.ne);\r\n\r\n if(nep.x < swp.x) {\r\n nep.x += overlayProjection.getWorldWidth();\r\n }\r\n\r\n imageOverlay.src = imageUrl;\r\n imageOverlay.onload = function() {\r\n overlay2d.globalCompositeOperation = \"copy\";\r\n overlay2d.drawImage(imageOverlay, 0, 0, overlay.width, overlay.height);\r\n\r\n var n = painter.width * painter.height;\r\n var id = overlay2d.getImageData(0, 0, painter.width, painter.height);\r\n var im = new Uint32Array(id.data.buffer);\r\n\r\n for(var i = n - 1; i >= 0; --i) {\r\n if(md[i] == 0xff000000) im[i] = 0xff000000;\r\n }\r\n\r\n overlay2d.putImageData(id, 0, 0);\r\n\r\n fr[idx].p = overlay.toDataURL();\r\n\r\n if(map.getMapTypeId() != google.maps.MapTypeId.HYBRID) {\r\n weatherOverlay.update(fr[idx].sw, fr[idx].ne, fr[idx].p);\r\n weatherOverlay.img_.style.opacity = 1.0;\r\n }\r\n else {\r\n weatherOverlay.update(fr[idx].sw, fr[idx].ne, fr[idx].o);\r\n weatherOverlay.img_.style.opacity = 0.6;\r\n }\r\n\r\n weatherOverlay.show();\r\n }\r\n}\r\n\r\nWeatherOverlay.prototype.update = function(boundsSW, boundsNE, imageUrl) {\r\n this.adjust(boundsSW, boundsNE);\r\n this.setImage(imageUrl);\r\n}\r\n\r\nfunction encodeIndex(x, y, z) {\r\n var ndx = normaliseIndices(x, y, z);\r\n x = ndx[0]; y = ndx[1]; z = ndx[2];\r\n return x + \",\" + y + \",\" + z;\r\n}\r\n\r\nfunction decodeIndex(t) {\r\n return t.split(\",\", 3);\r\n}\r\n\r\nfunction render() {\r\n var z = posZ;\r\n var mp = Math.pow(2, topZ - z);\r\n\r\n var w = painter.width * mp;\r\n var h = painter.height * mp;\r\n var sz = 256 * mp;\r\n\r\n var xMin = posX - w / 2;\r\n var yMin = posY - h / 2;\r\n var xMax = posX + w / 2;\r\n var yMax = posY + h / 2;\r\n var szmx = Math.ceil(xMax / sz);\r\n var szmy = Math.ceil(yMax / sz);\r\n\r\n for(var x = Math.floor(xMin / sz) ; x < szmx; ++x) {\r\n var xoff = (x * sz - xMin) / mp;\r\n\r\n for(var y = Math.floor(yMin / sz) ; y < szmy; ++y) {\r\n var yoff = (y * sz - yMin) / mp;\r\n var tileKey = encodeIndex(x, y, z);\r\n\r\n if(tiles[tileKey] && tiles[tileKey].complete) {\r\n canvas.drawImage(tiles[tileKey], Math.round(xoff), Math.round(yoff));\r\n }\r\n else {\r\n if(!tiles[tileKey]) {\r\n tiles[tileKey] = new Image();\r\n tiles[tileKey].src = tileString(x, y, posZ);\r\n tiles[tileKey].onload = function() {\r\n render();\r\n }\r\n }\r\n\r\n canvas.fillStyle = \"#ffffff\";\r\n canvas.fillRect(Math.round(xoff), Math.round(yoff), 256, 256);\r\n }\r\n }\r\n }\r\n\r\n md = new Uint32Array(canvas.getImageData(0, 0, painter.width, painter.height).data.buffer);\r\n}\r\n\r\nfunction toggleFullScreen() {\r\n if(!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) {\r\n if(document.documentElement.requestFullscreen) document.documentElement.requestFullscreen();\r\n else if(document.documentElement.msRequestFullscreen) document.documentElement.msRequestFullscreen();\r\n else if(document.documentElement.mozRequestFullScreen) document.documentElement.mozRequestFullScreen();\r\n else if(document.documentElement.webkitRequestFullscreen) document.documentElement.webkitRequestFullscreen();\r\n }\r\n else {\r\n if(document.exitFullscreen) document.exitFullscreen();\r\n else if(document.msExitFullscreen) document.msExitFullscreen();\r\n else if(document.mozCancelFullScreen) document.mozCancelFullScreen();\r\n else if(document.webkitExitFullscreen) document.webkitExitFullscreen();\r\n }\r\n}\r\n\r\n//\r\n// meteogram\r\n//\r\n\r\n$(function() {\r\n var listener = null;\r\n\r\n var off = function() {\r\n map.setOptions({ draggableCursor: \"move\" });\r\n google.maps.event.removeListener(listener);\r\n listener = null;\r\n };\r\n\r\n var on = function() {\r\n map.setOptions({ draggableCursor: \"crosshair\" });\r\n listener = google.maps.event.addListener(map, \"click\", function(event) {\r\n var mgUrl = new Url(\"getProMeteogram.aspx\", {\r\n uid: serverVariables.userName,\r\n pass: serverVariables.password,\r\n res: rs,\r\n lon: (event.latLng.lng() * 1000) | 0,\r\n lat: (event.latLng.lat() * 1000) | 0,\r\n sea: 1\r\n }).toString();\r\n ng.set(\"waiting\", true);\r\n $(\".meteogram-image\").on(\"load\", function() {\r\n $(\".meteogram-overlay\").show();\r\n $(\".meteogram\").show();\r\n ng.set(\"waiting\", false);\r\n off();\r\n }).attr(\"src\", mgUrl);\r\n });\r\n }\r\n\r\n $(\"#forecast-meteogram\").click(function() {\r\n if(listener == null)\r\n on();\r\n else\r\n off();\r\n });\r\n\r\n $(\".meteogram-close-button\").click(function() {\r\n $(\".meteogram\").hide();\r\n $(\".meteogram-overlay\").hide();\r\n });\r\n});\r\n\r\n//\r\n// zooming\r\n//\r\n\r\nfunction zoomIn() {\r\n if(posZ < maxZ) {\r\n map.setZoom(posZ + 1);\r\n }\r\n}\r\n\r\nfunction zoomOut() {\r\n if(posZ > minZ) {\r\n map.setZoom(posZ - 1);\r\n }\r\n}\r\n\r\nfunction closeResAreaDlg() {\r\n $(\"#resoverlay\").fadeOut(200);\r\n $(\"#resbox\").hide();\r\n}\r\n\r\nfunction execResAreaDlg() {\r\n $(\"#resoverlay\").height(window.innerHeight).fadeTo(200, 0.8);\r\n $(\"#resbox\").show();\r\n}\r\n\r\n// Google maps tiles normalization\r\nfunction getNormalizedCoord(coord, zoom) {\r\n var y = coord.y;\r\n var x = coord.x;\r\n\r\n // tile range in one direction range is dependent on zoom level\r\n // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc\r\n var tileRange = 1 << zoom;\r\n\r\n // do not repeat across y-axis (vertically)\r\n if(y < 0 || y >= tileRange) {\r\n return null;\r\n }\r\n\r\n // repeat across x-axis\r\n if(x < 0 || x >= tileRange) {\r\n x = (x % tileRange + tileRange) % tileRange;\r\n }\r\n\r\n return { x: x, y: y };\r\n}\r\n\r\nfunction mod(a, b) {\r\n return ((a % b) + b) % b;\r\n}\r\n\r\nfunction normaliseIndices(x, y, z) {\r\n return [mod(x, Math.pow(2, z)), mod(y, Math.pow(2, z)), z];\r\n}\r\n\r\nfunction tileString(x, y, z) {\r\n var ndx = normaliseIndices(x, y, z);\r\n x = ndx[0]; y = ndx[1]; z = ndx[2];\r\n var url = \"tiles/\" + z + \"/\" + x + \"/\" + y + \".png\";\r\n return url;\r\n}\r\n\r\nfunction initialize() {\r\n var konaOptions = {\r\n getTileUrl: function(coord, zoom) {\r\n var normalizedCoord = getNormalizedCoord(coord, zoom);\r\n\r\n if(!normalizedCoord) {\r\n return null;\r\n }\r\n\r\n var bound = Math.pow(2, zoom);\r\n\r\n return tileString(normalizedCoord.x, normalizedCoord.y, zoom);\r\n },\r\n tileSize: new google.maps.Size(256, 256),\r\n maxZoom: 10,\r\n minZoom: 2,\r\n name: \"Plain\"\r\n };\r\n\r\n var konaMapType = new google.maps.ImageMapType(konaOptions);\r\n\r\n var mapOptions = {\r\n center: new google.maps.LatLng(serverVariables.lat, serverVariables.lon),\r\n draggableCursor: \"move\",\r\n mapTypeControl: true,\r\n mapTypeControlOptions:\r\n {\r\n mapTypeIds: [google.maps.MapTypeId.HYBRID, \"Plain\"],\r\n position: google.maps.ControlPosition.RIGHT_BOTTOM\r\n },\r\n mapTypeId: (serverVariables.mapID == 0) ? google.maps.MapTypeId.HYBRID : \"Plain\",\r\n overviewMapControl: false,\r\n panControl: false,\r\n rotateControl: false,\r\n scaleControl: false,\r\n streetViewControl: false,\r\n zoom: posZ,\r\n zoomControl: false\r\n };\r\n\r\n weatherMap = document.getElementById(\"weatherMap\");\r\n\r\n map = new google.maps.Map(weatherMap, mapOptions);\r\n map.mapTypes.set(\"Plain\", konaMapType);\r\n map.minZoom = minZ;\r\n map.maxZoom = maxZ;\r\n\r\n google.maps.event.addListener(map, \"zoom_changed\", function() {\r\n posZ = map.getZoom();\r\n if(ctimer) {\r\n clearTimeout(ctimer);\r\n ctimer = null;\r\n }\r\n });\r\n\r\n google.maps.event.addListener(map, \"bounds_changed\", function() {\r\n posX = n2p(map.getCenter().lng());\r\n posY = t2p(map.getCenter().lat());\r\n if(ctimer) clearTimeout(ctimer);\r\n ctimer = setTimeout(render, 1000);\r\n settings.save();\r\n });\r\n\r\n google.maps.event.addListener(map, \"dragend\", function() {\r\n posX = n2p(map.getCenter().lng());\r\n posY = t2p(map.getCenter().lat());\r\n if(ctimer) {\r\n clearTimeout(ctimer);\r\n ctimer = null;\r\n }\r\n render();\r\n });\r\n\r\n google.maps.event.addListener(map, \"maptypeid_changed\", function(event) {\r\n animation.redraw();\r\n settings.save();\r\n });\r\n\r\n google.maps.event.addListener(map, \"tilesloaded\", function(event) {\r\n $(\"#weatherMap\")[0].firstChild.firstChild.firstChild.firstChild.style.zIndex = 200;\r\n });\r\n\r\n // insert naming overlay\r\n map.overlayMapTypes.insertAt(10, new NameMapOverlay(new google.maps.Size(256, 256)));\r\n painter.height = weatherMap.clientHeight;\r\n painter.width = weatherMap.clientWidth;\r\n overlay.height = weatherMap.clientHeight;\r\n overlay.width = weatherMap.clientWidth;\r\n\r\n render();\r\n}\r\n\r\n//\r\n// The 2nd tileset\r\n// https://developers.google.com/maps/documentation/javascript/maptypes#OverlayMapTypes\r\n\r\nvar NameMapOverlay = (function() {\r\n function NameMapOverlay(tileSize) {\r\n this.tileSize = tileSize;\r\n }\r\n\r\n NameMapOverlay.prototype.getTile = function(coord, zoom, ownerDocument) {\r\n var img = $(ownerDocument.createElement(\"img\"));\r\n img.width(this.tileSize.width);\r\n img.height(this.tileSize.height);\r\n var x = coord.x;\r\n var y = coord.y;\r\n var n = normaliseIndices(x, y, zoom);\r\n img.attr(\"src\", \"/pro2/objects/\" + n[2] + \"/\" + n[0] + \"/\" + n[1] + \".png\");\r\n return img[0];\r\n };\r\n\r\n return NameMapOverlay;\r\n})();\r\n\r\ngoogle.maps.event.addDomListener(window, \"load\", initialize);\r\n\r\nwindow.addEventListener(\"resize\", function() {\r\n document.getElementById(\"progressbar-container\").style.left = ((window.innerWidth * 0.08) | 0) + \"px\";\r\n\r\n painter.width = weatherMap.clientWidth;\r\n painter.height = weatherMap.clientHeight;\r\n overlay.height = weatherMap.clientHeight;\r\n overlay.width = weatherMap.clientWidth;\r\n\r\n render();\r\n});\r\n\r\n//\r\n// KeyScale\r\n//\r\n\r\nvar keyScale = (function() {\r\n function KeyScale() {\r\n this._el = $(\"#keyscale\");\r\n }\r\n\r\n KeyScale.prototype.show = function(meteo) {\r\n var ks = {\r\n 1: \"wind\",\r\n 2: \"pressure\",\r\n 4: \"precipitation\",\r\n 7: \"precipitation\",\r\n 8: \"temperature\",\r\n 16: \"wave\",\r\n 32: \"sst\",\r\n 64: \"tidalStream\",\r\n 128: \"nexrad\"\r\n }[meteo];\r\n\r\n (ks ? function(el) { el.attr(\"src\", \"pub/img/ks/\" + ks + \".png\").show(); }\r\n : function(el) { el.hide(); }\r\n )(this._el);\r\n }\r\n\r\n KeyScale.prototype.hide = function() {\r\n this._el.hide();\r\n }\r\n\r\n return new KeyScale();\r\n})();\r\n\r\n//\r\n// Downloader\r\n//\r\n\r\nvar downloader = (function() {\r\n function Downloader() {\r\n this._Limit = 6;\r\n this._FailureLimit = 3;\r\n this._frames = null;\r\n this._failed = null;\r\n this._id = 0;\r\n this._paused = false;\r\n this._scheduled = null;\r\n }\r\n\r\n Downloader.prototype.start = function(sf) {\r\n this._frames = [];\r\n this._failed = [];\r\n this._id++;\r\n this._paused = false;\r\n\r\n this._scheduled = [];\r\n for(var i = sf, j = 0; i < fn && j < this._Limit; i++, j++) {\r\n this._scheduled.push(i);\r\n }\r\n\r\n this._pm();\r\n }\r\n\r\n Downloader.prototype.setNext = function(i) {\r\n this._scheduled = [];\r\n for(var k = i, j = 0; k < fn && j < this._Limit; k++, j++) {\r\n this._scheduled.push(k);\r\n }\r\n if(this._paused) {\r\n this._paused = false;\r\n this._pm();\r\n }\r\n }\r\n\r\n Downloader.prototype.reset = function() {\r\n this._frames = null;\r\n this._id++;\r\n this._scheduled = null;\r\n this._paused = false;\r\n }\r\n\r\n Downloader.prototype._pm = function() {\r\n if(!this._frames) {\r\n this._paused = true;\r\n return;\r\n }\r\n\r\n // check if there's some scheduled downloads\r\n if(this._scheduled.length == 0) {\r\n this._paused = true;\r\n return;\r\n }\r\n\r\n // now we choose the next frame to download\r\n var found = false;\r\n var next = null;\r\n while(this._scheduled.length > 0) {\r\n next = this._scheduled[0];\r\n this._scheduled.splice(0, 1);\r\n if(!this._frames[next] && !this._failed[next]) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n if(!found) {\r\n this._paused = true;\r\n return;\r\n }\r\n\r\n var sw, ne;\r\n var bounds = map.getBounds();\r\n\r\n if(bounds.toSpan().lng() >= 360) {\r\n var RAD2DEG = 180 / Math.PI;\r\n var DEG2RAD = Math.PI / 180;\r\n var PI_2 = Math.PI / 2;\r\n var PI_4 = Math.PI / 4;\r\n var wh2 = weatherMap.clientWidth >> 1;\r\n var ht2 = weatherMap.clientHeight >> 1;\r\n var cT = map.getCenter().lat() * DEG2RAD;\r\n var cN = map.getCenter().lng();\r\n var radius = 128 * Math.pow(2, posZ - 1);\r\n var nDiameter = radius << 1;\r\n var pixel2Deg = 180 / nDiameter;\r\n var pixel2Rad = Math.PI / nDiameter;\r\n var yCenterOffset = Math.log(Math.tan(PI_4 + cT / 2)) / pixel2Rad;\r\n\r\n sw = new google.maps.LatLng(RAD2DEG * (2 * Math.atan(Math.exp((ht2 + yCenterOffset - weatherMap.clientHeight + 1) * pixel2Rad)) - PI_2), ((-wh2) * pixel2Deg + cN), true);\r\n ne = new google.maps.LatLng(RAD2DEG * (2 * Math.atan(Math.exp((ht2 + yCenterOffset) * pixel2Rad)) - PI_2), ((weatherMap.clientWidth - 1 - wh2) * pixel2Deg + cN), true);\r\n }\r\n else {\r\n sw = bounds.getSouthWest();\r\n ne = bounds.getNorthEast();\r\n }\r\n\r\n if(weatherOverlay == null) {\r\n weatherOverlay = new WeatherOverlay(sw, ne, null, map);\r\n }\r\n\r\n fr[next] = {\r\n w: null, o: null, p: null, sw: null, ne: null, i: null, x: null, y: null, z: null\r\n };\r\n\r\n fr[next].sw = sw;\r\n fr[next].ne = ne;\r\n fr[next].x = window.innerWidth;\r\n fr[next].y = window.innerHeight;\r\n fr[next].z = posZ;\r\n\r\n var c = map.getCenter();\r\n var lng = c.lng();\r\n var lat = c.lat();\r\n\r\n if(lng > 180)\r\n lng = lng % 180;\r\n\r\n if(lng < -180)\r\n lng = -((-lng) % 180);\r\n\r\n var _this = this;\r\n var _id = this._id;\r\n var _nf = next;\r\n var url = this._getDownloadUrl(\r\n cmt, rs,\r\n lng,\r\n lat,\r\n posZ,\r\n window.innerWidth,\r\n window.innerHeight,\r\n serverVariables.userName,\r\n serverVariables.password,\r\n next\r\n );\r\n this._doDownload(url,\r\n function(data) {\r\n _this._downloadSuccess(_id, _nf, data);\r\n },\r\n function() {\r\n _this._downloadFailed(_id, _nf);\r\n },\r\n this._FailureLimit\r\n );\r\n }\r\n\r\n Downloader.prototype._downloadSuccess = function(id, frameid, data) {\r\n if(this._id != id)\r\n return;\r\n\r\n var arrayBufferView = new Uint8Array(data);\r\n var blob = new Blob([arrayBufferView], { type: \"image/png\" });\r\n var imageUrl = urlCreator.create(blob);\r\n\r\n fr[frameid].i = data;\r\n fr[frameid].o = imageUrl;\r\n\r\n // mark as ready\r\n this._frames[frameid] = true;\r\n // notify animation\r\n animation.frameReady(frameid, imageUrl);\r\n // update progress bar\r\n pbar.setCached(frameid);\r\n // load next\r\n this._pm();\r\n }\r\n\r\n Downloader.prototype._downloadFailed = function(id, frameid) {\r\n if(id != this._id)\r\n return;\r\n\r\n // mark as failed\r\n this._failed[frameid] = true;\r\n // notify animation\r\n animation.frameFailed(frameid);\r\n // update progress bar\r\n pbar.setFailed(frameid);\r\n // load next\r\n this._pm();\r\n }\r\n\r\n Downloader.prototype._doDownload = function(url, success, error, retry) {\r\n var _this = this;\r\n $.ajax({\r\n url: url,\r\n type: \"GET\",\r\n dataType: \"binary\",\r\n processData: false,\r\n responseType: \"arraybuffer\",\r\n success: function(data) {\r\n // error emulation\r\n //if(Math.random() < 0.5) {\r\n // error();\r\n // return;\r\n //}\r\n success(data)\r\n },\r\n error: function() {\r\n if(--retry > 0) {\r\n _this._doDownload(url, success, error, retry);\r\n } else {\r\n error();\r\n }\r\n }\r\n });\r\n }\r\n\r\n Downloader.prototype._getDownloadUrl = function(mt, rs, n, t, z, w, h, u, p, id) {\r\n switch(mt) {\r\n case 64:\r\n return \"/pro2/getMapBinaryS.aspx?uid=\" + u + \"&pass=\" + p + \"&meteo=\" + mt +\r\n \"&res=\" + rs +\r\n \"&day=\" + ((id / 24) | 0) +\r\n \"&time=\" + (id % 24) +\r\n \"&lat=\" + ((t * 1000) | 0) +\r\n \"&lon=\" + ((n * 1000) | 0) +\r\n \"&radius=\" + ((128 * Math.pow(2, z - 1)) | 0) +\r\n \"&width=\" + w + \"&height=\" + h +\r\n \"&mode=\" + (mt == 7 ? 0 : 1);\r\n case 128:\r\n return \"/pro2/getMapBinaryS.aspx?uid=\" + u + \"&pass=\" + p + \"&meteo=\" + mt +\r\n \"&res=\" + rs +\r\n \"&day=0&time=\" + (id % 25) +\r\n \"&lat=\" + ((t * 1000) | 0) +\r\n \"&lon=\" + ((n * 1000) | 0) +\r\n \"&radius=\" + ((128 * Math.pow(2, z - 1)) | 0) +\r\n \"&width=\" + w + \"&height=\" + h +\r\n \"&mode=\" + (mt == 7 ? 0 : 1);\r\n default:\r\n // var stepInMinutes = resInfo(rs).stepInMinutes;\r\n var stepInMinutes = ng.get(\"selectedResource\").stepInMinutes\r\n return \"/pro2/getMapBinaryS.aspx?uid=\" + u + \"&pass=\" + p + \"&meteo=\" + mt +\r\n \"&res=\" + rs +\r\n \"&day=\" + ((id * (stepInMinutes / 60) / 24) | 0) +\r\n \"&time=\" + ((id * (stepInMinutes / 60)) % 24) +\r\n \"&lat=\" + ((t * 1000) | 0) +\r\n \"&lon=\" + ((n * 1000) | 0) +\r\n \"&radius=\" + ((128 * Math.pow(2, z - 1)) | 0) +\r\n \"&width=\" + w + \"&height=\" + h +\r\n \"&mode=\" + (mt == 7 ? 0 : 1);\r\n }\r\n }\r\n\r\n return new Downloader();\r\n})();\r\n\r\n//\r\n// URL creator\r\n//\r\n\r\nvar urlCreator = (function() {\r\n function UrlCreator() {\r\n this._urlCreator = window.URL || window.webkitURL;\r\n }\r\n\r\n UrlCreator.prototype.create = function(blob) {\r\n return this._urlCreator.createObjectURL(blob);\r\n }\r\n\r\n UrlCreator.prototype.revoke = function(url) {\r\n return this._urlCreator.revokeObjectURL(url);\r\n }\r\n\r\n return new UrlCreator();\r\n})();\r\n\r\n//\r\n// Clock control\r\n//\r\n\r\nvar clock = (function() {\r\n function Clock() {\r\n this._el = $(\"#datetime\");\r\n }\r\n\r\n Clock.prototype.reset = function() {\r\n };\r\n\r\n Clock.prototype.setFrameDate = function(i) {\r\n this._custom = true;\r\n this._el.html(ng.get(\"getDateString\")(i - sf));\r\n var d = new Date();\r\n console.log(\"Frame #\" + i + \" timestamp updated at \" +\r\n d.getHours() + \":\" + d.getMinutes() + \":\" + d.getSeconds() +\r\n \".\" + d.getMilliseconds()\r\n );\r\n }\r\n\r\n return new Clock();\r\n})();\r\n\r\n//\r\n// Player control\r\n//\r\n\r\nvar player = (function() {\r\n function Player() {\r\n this._state = null;\r\n this._backBtn = $(\"#backBtn\");\r\n this._playBtn = $(\"#playBtn\");\r\n this._frwdBtn = $(\"#frwdBtn\");\r\n var _this = this;\r\n this._backBtn.click(function() { _this._back(); });\r\n this._playBtn.click(function() { _this._playPause(); });\r\n this._frwdBtn.click(function() { _this._fwd(); });\r\n }\r\n\r\n Player.prototype._show = function() {\r\n this._backBtn.show();\r\n this._frwdBtn.show();\r\n this._playBtn.show();\r\n }\r\n\r\n Player.prototype._hide = function() {\r\n this._backBtn.hide();\r\n this._frwdBtn.hide();\r\n this._playBtn.hide();\r\n }\r\n\r\n Player.prototype.setState = function(state) {\r\n this._state = state;\r\n if(state === \"playing\") {\r\n this._playBtn.css({ backgroundImage: \"url(pub/img/player/pause.png)\" });\r\n this._show();\r\n return;\r\n }\r\n if(state === \"paused\") {\r\n this._playBtn.css({ backgroundImage: \"url(pub/img/player/play.png)\" });\r\n this._show();\r\n return;\r\n }\r\n // else\r\n this._hide();\r\n }\r\n\r\n Player.prototype._playPause = function() {\r\n if(this._state === \"playing\") {\r\n animation.pause();\r\n this.setState(\"paused\");\r\n return;\r\n }\r\n if(this._state === \"paused\") {\r\n animation.resume();\r\n this.setState(\"playing\");\r\n return;\r\n }\r\n }\r\n\r\n Player.prototype._back = function() {\r\n animation.back();\r\n }\r\n\r\n Player.prototype._fwd = function() {\r\n animation.fwd();\r\n }\r\n\r\n return new Player();\r\n})();\r\n\r\n//\r\n// animation\r\n//\r\n\r\nvar animation = (function() {\r\n function Animation() {\r\n this._TickerInterval = 50; // ms\r\n this._FrameInterval = 750; // ms\r\n this._frames = null;\r\n this._failed = null;\r\n this._currentFrame = null;\r\n this._nextFrame = null;\r\n this._currentFrameTimeStamp = null;\r\n this._playing = null;\r\n this._ticker = null;\r\n }\r\n\r\n Animation.prototype.start = function(sf) {\r\n this._frames = [];\r\n this._failed = [];\r\n this._nextFrame = sf;\r\n this._playing = true;\r\n\r\n var _this = this;\r\n this._ticker = setInterval(function() {\r\n _this._onTick();\r\n }, this._TickerInterval);\r\n }\r\n\r\n Animation.prototype.pause = function() {\r\n this._playing = false;\r\n this._nextFrame = null;\r\n }\r\n\r\n Animation.prototype.resume = function() {\r\n this._playing = true;\r\n if(this._currentFrame < fn - 1) {\r\n this._nextFrame = this._currentFrame + 1;\r\n } else {\r\n this._nextFrame = 0;\r\n }\r\n }\r\n\r\n Animation.prototype.fwd = function() {\r\n if(this._currentFrame < fn - 1) {\r\n this._nextFrame = this._currentFrame + 1;\r\n }\r\n }\r\n\r\n Animation.prototype.back = function() {\r\n if(this._currentFrame > 0) {\r\n this._nextFrame = this._currentFrame - 1;\r\n }\r\n }\r\n\r\n Animation.prototype.goto = function(i) {\r\n if(i != this._currentFrame && i >= 0 && i < fn) {\r\n this._nextFrame = i;\r\n }\r\n }\r\n\r\n Animation.prototype.frameReady = function(i, url) {\r\n this._frames[i] = url;\r\n }\r\n\r\n Animation.prototype.frameFailed = function(i) {\r\n this._failed[i] = true;\r\n }\r\n\r\n Animation.prototype.reset = function() {\r\n if(this._ticker) {\r\n clearInterval(this._ticker);\r\n this._ticker = null;\r\n }\r\n this._revokeObjectURLs();\r\n this._frames = null;\r\n this._failed = null;\r\n this._currentFrame = null;\r\n this._nextFrame = null;\r\n this._currentFrameTimeStamp = null;\r\n this._playing = null;\r\n }\r\n\r\n Animation.prototype.redraw = function() {\r\n if(weatherOverlay && weatherOverlay.img_ && this._currentFrame) {\r\n if(map.getMapTypeId() != google.maps.MapTypeId.HYBRID) {\r\n weatherOverlay.update(fr[this._currentFrame].sw, fr[this._currentFrame].ne, fr[this._currentFrame].p);\r\n weatherOverlay.img_.style.opacity = 1.0;\r\n }\r\n else {\r\n weatherOverlay.update(fr[this._currentFrame].sw, fr[this._currentFrame].ne, fr[this._currentFrame].o);\r\n weatherOverlay.img_.style.opacity = 0.6;\r\n }\r\n }\r\n }\r\n\r\n Animation.prototype._showNext = function() {\r\n var i = this._nextFrame;\r\n if(weatherOverlay == null) {\r\n weatherOverlay = new WeatherOverlay(fr[i].sw, fr[i].ne, this._frames[i], map);\r\n } else {\r\n weatherOverlay.overlayImage(this._frames[i], i);\r\n }\r\n this._currentFrame = i;\r\n this._currentFrameTimeStamp = new Date().valueOf();\r\n }\r\n\r\n // schedule next frame\r\n Animation.prototype._scheduleNext = function() {\r\n if(!this._playing) {\r\n this._nextFrame = null;\r\n return;\r\n }\r\n // _playing is true\r\n for(var i = this._nextFrame + 1; i < fn; i++) {\r\n if(!this._failed[i]) {\r\n this._nextFrame = i;\r\n return;\r\n }\r\n }\r\n // we've reached the end\r\n this._playing = false;\r\n this._nextFrame = null;\r\n }\r\n\r\n // update UI\r\n Animation.prototype._updateUI = function() {\r\n // update clock\r\n clock.setFrameDate(this._currentFrame);\r\n // update progress bar\r\n pbar.setCurrent(this._currentFrame);\r\n // update player UI\r\n player.setState(this._playing ? \"playing\" : \"paused\");\r\n }\r\n\r\n Animation.prototype._onTick = function() {\r\n // we have a frame to show\r\n if(this._nextFrame != null) {\r\n // it's time to show it\r\n var now = new Date().valueOf();\r\n var last = this._currentFrameTimeStamp;\r\n if(last == null || (now - last >= this._FrameInterval)) {\r\n // if frame ready\r\n if(this._frames[this._nextFrame]) {\r\n // then show it\r\n this._showNext();\r\n this._scheduleNext();\r\n this._updateUI();\r\n return;\r\n }\r\n if(this._failed[this._nextFrame]) {\r\n this._scheduleNext();\r\n this._updateUI();\r\n return;\r\n }\r\n else {\r\n // else request loading the frame\r\n downloader.setNext(this._nextFrame);\r\n }\r\n }\r\n }\r\n }\r\n\r\n Animation.prototype._revokeObjectURLs = function() {\r\n if(this._frames) {\r\n for(var i = 0; i < this._frames.length; i++) {\r\n if(this._frames[i]) {\r\n urlCreator.revoke(this._frames[i]);\r\n this._frames[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return new Animation();\r\n})();\r\n\r\n//\r\n// PB\r\n//\r\n\r\nvar pbar = (function() {\r\n function PBar() {\r\n this._elContainer = $(\"#progressbar-container\");\r\n this._elStartText = this._elContainer.find(\"#progressStartText\");\r\n this._elEndText = this._elContainer.find(\"#progressFinishText\");\r\n this._elContainer.css({ left: ((window.innerWidth * 0.08) | 0) });\r\n }\r\n\r\n PBar.prototype._getValue = function(e) {\r\n var x = e.clientX;\r\n var w = this._elProgressBar.width();\r\n var l = this._elContainer.offset().left;\r\n return ((x - l) * fn / w) | 0;\r\n }\r\n\r\n PBar.prototype.rebuild = function() {\r\n this._elStartText.html(ng.get(\"getDateString\")(-sf));\r\n this._elEndText.html(ng.get(\"getDateString\")(fn - sf - 1));\r\n }\r\n\r\n PBar.prototype.show = function() {\r\n this._elContainer.show();\r\n }\r\n\r\n PBar.prototype.hide = function() {\r\n this._elContainer.hide();\r\n }\r\n\r\n PBar.prototype.setCached = function(f) {\r\n ng.broadcast(\"pbar_setcached\", f);\r\n }\r\n\r\n PBar.prototype.setCurrent = function(f) {\r\n ng.broadcast(\"pbar_setcurrent\", f);\r\n }\r\n\r\n PBar.prototype.setFailed = function(f) {\r\n ng.broadcast(\"pbar_setfailed\", f);\r\n }\r\n\r\n return new PBar();\r\n})();\r\n\r\n//\r\n// Settings\r\n//\r\n\r\nvar settings = (function() {\r\n function Settings() {\r\n this._active = null;\r\n }\r\n\r\n Settings.prototype._getSaveUrl = function() {\r\n var c = map.getCenter();\r\n var lng = c.lng();\r\n var lat = c.lat();\r\n\r\n if(lng > 180)\r\n lng = lng % 180;\r\n\r\n if(lng < -180)\r\n lng = -((-lng) % 180);\r\n\r\n var s = {\r\n x: lng,\r\n y: lat,\r\n z: posZ,\r\n r: rs,\r\n m: (map.getMapTypeId() != google.maps.MapTypeId.HYBRID ? 1 : 0)\r\n };\r\n var url = new Url(\"saveSettings.aspx\", s).toString();\r\n return url;\r\n }\r\n\r\n Settings.prototype.save = function() {\r\n var _this = this;\r\n if(!this._active) {\r\n this._active = true;\r\n setTimeout(function() {\r\n _this._doSave();\r\n _this._active = false;\r\n }, 1000);\r\n }\r\n }\r\n\r\n Settings.prototype._doSave = function() {\r\n $.get(this._getSaveUrl());\r\n }\r\n\r\n return new Settings();\r\n})();\r\n\r\nvar Url = (function() {\r\n function Url(base, query) {\r\n this._base = base || \"\";\r\n this._query = $.extend({}, query || {});\r\n }\r\n\r\n function _formatData(v) {\r\n if(typeof (v) === \"undefined\" || v === null)\r\n v = \"\";\r\n return v.toString();\r\n }\r\n\r\n function _joinQueryKeyValuePair(p) {\r\n return p.join(\"=\");\r\n }\r\n\r\n function _joinQueryString(qs) {\r\n return qs.join(\"&\");\r\n }\r\n\r\n function _joinUrl(b, qs) {\r\n return [b, qs].join(\"?\");\r\n }\r\n\r\n Url.prototype.toString = function() {\r\n return _joinUrl(this._base, this.getQueryString());\r\n }\r\n\r\n Url.prototype.getQueryString = function() {\r\n return _joinQueryString(\r\n _.map(_.pairs(this._query), _joinQueryKeyValuePair)\r\n );\r\n }\r\n\r\n Url.encodeData = function(v) {\r\n return encodeURIComponent(_formatData(v));\r\n }\r\n\r\n return Url;\r\n})();\r\n\r\n//\r\n// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/\r\n//\r\n\r\n$.ajaxTransport(\"binary\", function(options, originalOptions, jqXHR) {\r\n // check for conditions and support for blob / arraybuffer response type\r\n if(window.FormData && ((options.dataType && (options.dataType == 'binary')) ||\r\n (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {\r\n return {\r\n // create new XMLHttpRequest\r\n send: function(headers, callback) {\r\n // setup all variables\r\n var xhr = new XMLHttpRequest();\r\n var url = options.url;\r\n var type = options.type;\r\n var async = options.async || true;\r\n // blob or arraybuffer. Default is blob\r\n var dataType = options.responseType || \"blob\";\r\n var data = options.data || null;\r\n var username = options.username || null;\r\n var password = options.password || null;\r\n\r\n xhr.addEventListener('load', function() {\r\n var data = {\r\n };\r\n data[options.dataType] = xhr.response;\r\n // make callback and send data\r\n callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());\r\n });\r\n\r\n xhr.open(type, url, async, username, password);\r\n\r\n // setup custom headers\r\n for(var i in headers) {\r\n xhr.setRequestHeader(i, headers[i]);\r\n }\r\n\r\n xhr.responseType = dataType;\r\n xhr.send(data);\r\n },\r\n abort: function() {\r\n jqXHR.abort();\r\n }\r\n };\r\n }\r\n});\r\n\r\n//\r\n// angular stuff\r\n//\r\n\r\nvar ng = (function() {\r\n function _getScope(el) {\r\n return angular.element(el).scope();\r\n }\r\n\r\n function _getRoot() {\r\n return angular.element(\"html\").scope().$root;\r\n }\r\n\r\n function NG() {\r\n }\r\n\r\n NG.prototype.broadcast = function(e, args) {\r\n _getRoot().$apply(function(s) {\r\n s.$broadcast(e, args);\r\n });\r\n };\r\n\r\n NG.prototype.set = function(variable, value) {\r\n _getScope(\"html\").$apply(function(s) {\r\n s[variable] = value;\r\n });\r\n }\r\n\r\n NG.prototype.get = function(variable) {\r\n return _getScope(\"html\")[variable];\r\n }\r\n\r\n NG.prototype.injector = function() {\r\n return angular.element(\"html\").injector();\r\n }\r\n\r\n return new NG();\r\n})();\r\n"],"sourceRoot":"/source/"}