#ifndef _H_EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_H_ #define _H_EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_H_ #include // many thanks to https://stackoverflow.com/questions/23202966/google-weather-widget-on-my-website #define EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_LEN 30000 LPCWSTR ep_weather_provider_google_script10 = L"var final_im = 0; function ep_weather_part0() { return \"run_part_0\"; }; ep_weather_part0();"; // reference: https://github.com/Triggertrap/sun-js LPCWSTR ep_weather_provider_google_script00 = L"\ Date.prototype.sunrise = function(latitude, longitude, zenith) {\n\ return this.sunriseSet(latitude, longitude, true, zenith);\n\ }\n\ Date.prototype.sunset = function(latitude, longitude, zenith) {\n\ return this.sunriseSet(latitude, longitude, false, zenith);\n\ }\n\ Date.prototype.sunriseSet = function(latitude, longitude, sunrise, zenith) {\n\ if(!zenith) {\n\ zenith = 90.8333;\n\ }\n\ var hoursFromMeridian = longitude / Date.DEGREES_PER_HOUR,\n\ dayOfYear = this.getDayOfYear(),\n\ approxTimeOfEventInDays,\n\ sunMeanAnomaly,\n\ sunTrueLongitude,\n\ ascension,\n\ rightAscension,\n\ lQuadrant,\n\ raQuadrant,\n\ sinDec,\n\ cosDec,\n\ localHourAngle,\n\ localHour,\n\ localMeanTime,\n\ time;\n\ if (sunrise) {\n\ approxTimeOfEventInDays = dayOfYear + ((6 - hoursFromMeridian) / 24);\n\ } else {\n\ approxTimeOfEventInDays = dayOfYear + ((18.0 - hoursFromMeridian) / 24);\n\ }\n\ sunMeanAnomaly = (0.9856 * approxTimeOfEventInDays) - 3.289;\n\ sunTrueLongitude = sunMeanAnomaly + (1.916 * Math.sinDeg(sunMeanAnomaly)) + (0.020 * Math.sinDeg(2 * sunMeanAnomaly)) + 282.634;\n\ sunTrueLongitude = Math.mod(sunTrueLongitude, 360);\n\ ascension = 0.91764 * Math.tanDeg(sunTrueLongitude);\n\ rightAscension = 360 / (2 * Math.PI) * Math.atan(ascension);\n\ rightAscension = Math.mod(rightAscension, 360);\n\ lQuadrant = Math.floor(sunTrueLongitude / 90) * 90;\n\ raQuadrant = Math.floor(rightAscension / 90) * 90;\n\ rightAscension = rightAscension + (lQuadrant - raQuadrant);\n\ rightAscension /= Date.DEGREES_PER_HOUR;\n\ sinDec = 0.39782 * Math.sinDeg(sunTrueLongitude);\n\ cosDec = Math.cosDeg(Math.asinDeg(sinDec));\n\ cosLocalHourAngle = ((Math.cosDeg(zenith)) - (sinDec * (Math.sinDeg(latitude)))) / (cosDec * (Math.cosDeg(latitude)));\n\ localHourAngle = Math.acosDeg(cosLocalHourAngle)\n\ if (sunrise) {\n\ localHourAngle = 360 - localHourAngle;\n\ }\n\ localHour = localHourAngle / Date.DEGREES_PER_HOUR;\n\ localMeanTime = localHour + rightAscension - (0.06571 * approxTimeOfEventInDays) - 6.622;\n\ time = localMeanTime - (longitude / Date.DEGREES_PER_HOUR);\n\ time = Math.mod(time, 24);\n\ var midnight = new Date(0);\n\ midnight.setUTCFullYear(this.getUTCFullYear());\n\ midnight.setUTCMonth(this.getUTCMonth());\n\ midnight.setUTCDate(this.getUTCDate());\n\ var milli = midnight.getTime() + (time * 60 *60 * 1000);\n\ return new Date(milli);\n\ }\n\ Date.DEGREES_PER_HOUR = 360 / 24;\n\ Date.prototype.getDayOfYear = function() {\n\ var onejan = new Date(this.getFullYear(),0,1);\n\ return Math.ceil((this - onejan) / 86400000);\n\ }\n\ Math.degToRad = function(num) {\n\ return num * Math.PI / 180;\n\ }\n\ Math.radToDeg = function(radians){\n\ return radians * 180.0 / Math.PI;\n\ }\n\ Math.sinDeg = function(deg) {\n\ return Math.sin(deg * 2.0 * Math.PI / 360.0);\n\ }\n\ Math.acosDeg = function(x) {\n\ return Math.acos(x) * 360.0 / (2 * Math.PI);\n\ }\n\ Math.asinDeg = function(x) {\n\ return Math.asin(x) * 360.0 / (2 * Math.PI);\n\ }\n\ Math.tanDeg = function(deg) {\n\ return Math.tan(deg * 2.0 * Math.PI / 360.0);\n\ }\n\ Math.cosDeg = function(deg) {\n\ return Math.cos(deg * 2.0 * Math.PI / 360.0);\n\ }\n\ Math.mod = function(a, b) {\n\ var result = a % b;\n\ if(result < 0) {\n\ result += b;\n\ }\n\ return result;\n\ }\n\ \n\ \n\ var is_first_time = 1;\n\ var final_im = 0;\n\ var final_img2 = 0;\n\ var final_int;\n\ var final_cnt = 0;\n\ function ep_set_final_img(){\n\ //document.getElementById('wob_tci').src = final_img2;\n\ //final_cnt++;\n\ //if (final_cnt == 20)\n\ is_first_time=0;\n\ clearInterval(final_int);\n\ }\n\ function ep_download_image_blob(url) {\n\ var request = new XMLHttpRequest();\n\ request.open('GET', url, false);\n\ request.overrideMimeType('text/plain; charset=x-user-defined');\n\ request.send(null);\n\ var binary = new Uint8Array(request.responseText.length);\n\ for(var i=0;i {\n\ changes.forEach(change => {\n\ if(change.attributeName.includes('src') && (document.getElementById('wob_tci').src.includes('gstatic.com') || document.getElementById('wob_tci').src.includes('data:image/png;base64,'))){\n\ let includes_time = document.getElementById(\"wob_dts\").innerText.includes(\":\");\n\ if (includes_time) {\n\ let sp = document.getElementById(\"wob_dts\").innerText.split(':');\n\ let hrs = parseInt(sp[0].split(' ')[1]);\n\ let mins = parseInt(sp[1]);\n\ if (is_first_time) { replaceImage(document.getElementById('wob_tci'), is_day1); is_first_time = 0 }\n\ else replaceImage(document.getElementById('wob_tci'), IsDay(1, hrs, mins));\n\ } else { replaceImage(document.getElementById('wob_tci'), 1); }\n\ }\n\ });\n\ });\n\ observer.observe(document.getElementById('wob_tci'), {attributes : true});\n\ function ep_weather_part0() {\n\ return \"run_part_0\";\n\ }\n\ ep_weather_part0();\n\ "; LPCWSTR ep_weather_provider_google_script = L"\ function changeCSSStyle(ssMain, selector, cssProp, cssVal) {\n\ var cssRules = (document.all) ? 'rules': 'cssRules'; \n\ //console.log(ssMain);\n\ for (i=0, len=document.styleSheets[ssMain][cssRules].length; i \n\ c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) : \n\ encodeURIComponent(c).replace(/\\%%/g,'').toLowerCase()\n\ ).join('');\n\ }\n\ function ep_weather_drawImageToCanvas(image) {\n\ const canvas = document.createElement('canvas');\n\ const w = image.width;\n\ const h = image.height;\n\ canvas.width = w;\n\ canvas.height = h;\n\ canvas.getContext('2d').drawImage(image, 0, 0);\n\ return canvas;\n\ }\n\ function ep_weather_toHexString (byteArray) {\n\ //const chars = new Buffer(byteArray.length * 2);\n\ const chars = new Uint8Array(byteArray.length * 2);\n\ const alpha = 'a'.charCodeAt(0) - 10;\n\ const digit = '0'.charCodeAt(0);\n\ \n\ let p = 0;\n\ for (let i = 0; i < byteArray.length; i++) {\n\ let nibble = byteArray[i] >>> 4;\n\ chars[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n\ nibble = byteArray[i] & 0xF;\n\ chars[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n\ }\n\ \n\ //return chars.toString('utf8');\n\ return String.fromCharCode.apply(null, chars);\n\ }\n\ function ep_weather_getData(imageBitmap, ch) {\n\ const canvas = ep_weather_drawImageToCanvas(imageBitmap);\n\ const ctx = canvas.getContext('2d');\n\ \n\ let result = [];\n\ for (let y = 0; y < canvas.height; y++) {\n\ for (let x = 0; x < canvas.width; x++) {\n\ let data = ctx.getImageData(x, y, 1, 1).data;\n\ result.push(data[2] * data[3] / 255);\n\ result.push(data[1] * data[3] / 255);\n\ result.push(data[0] * data[3] / 255);\n\ result.push(data[3]);\n\ }\n\ }\n\ let res = (\n\ document.documentElement.getAttribute(\"dir\") + \"#\" + \n\ document.getElementsByClassName(\"ULSxyf\")[0].offsetHeight + \"#\" + \n\ document.getElementById(ch.includes('x') ? \"wob_ttm\" : \"wob_tm\").innerText + \"#\" + \n\ Array.from(document.getElementsByClassName('wob-unit')[0].getElementsByTagName('span')).filter(e => e.className == 'wob_t').filter(e => !e.style.display.toString().includes(\"none\"))[0].innerText + \"#\" + \n\ document.getElementById(\"wob_tci\").alt + \"#\" + \n\ document.getElementById(\"wob_loc\").innerText + \"#\" + \n\ ep_weather_toHexString(result)\n\ );\n\ //console.log(res);\n\ document.body.style.backgroundColor='transparent';\n\ document.body.style.backgroundColor='transparent';\n\ Array.from(document.getElementsByClassName(\"Ww4FFb\")).forEach((element) => {element.style.backgroundColor = \"transparent\";});\n\ return res;\n\ }\n\ var ep_result;\n\ let unit = Array.from(document.getElementsByClassName('wob-unit')[0].getElementsByTagName('span')).filter(e => e.className == 'wob_t')[0].innerText;\n\ let p = '%c';\n\ if (!unit.includes(p)) {\n\ Array.from(document.getElementsByClassName('wob-unit')[0].getElementsByTagName('a')).filter(e => e.className == 'wob_t').filter(e => e.innerText.includes(p))[0].click();\n\ unit = 'x';\n\ }\n\ createImageBitmap(\n\ (final_im != 0) ? final_im : document.getElementById('wob_tci'), \n\ { resizeWidth: %d, resizeHeight: %d, resizeQuality: 'high' }\n\ )\n\ .then(imageBitmap => \n\ ep_result = ep_weather_getData(imageBitmap, unit)\n\ );\n\ function ep_weather_part1() {\n\ return \"run_part_2\";\n\ }\n\ ep_weather_part1();\n\ "; LPCWSTR ep_weather_provider_google_script2 = L"\ function scrolldisable() {\n\ TopScroll = window.pageYOffset || document.documentElement.scrollTop;\n\ LeftScroll = window.pageXOffset || document.documentElement.scrollLeft;\n\ window.onscroll = function() {\n\ window.scrollTo(LeftScroll, TopScroll);\n\ };\n\ }\n\ function ep_weather_part2() {\n\ let h = document.getElementsByClassName(\"ULSxyf\")[0].offsetHeight;\n\ ////document.getElementsByClassName(\"google-weather-place\")[0].style.height = h + 'px';\n\ ////document.getElementsByClassName(\"google-weather-crop\")[0].style.height = h + 'px';\n\ //if (1) for (let j = 0; j < document.styleSheets.length; j++) changeCSSStyle(j, '.wob_ds', 'background-color', '#303134');\n\ document.getElementsByClassName(\"KFFQ0c\")[0].style.display = 'none';\n\ if (document.getElementsByClassName(\"QS5gu sy4vM\").length > 1) { document.getElementsByClassName(\"QS5gu sy4vM\")[1].click(); return \"run_part_1\"; }\n\ if (document.getElementsByClassName(\"Gfzyee VDgVie DKlyaf Loxgyb\").length > 1) { document.getElementsByClassName(\"Gfzyee VDgVie DKlyaf Loxgyb\")[1].click(); return \"run_part_1\"; }\n\ //document.getElementById(\"search\").scrollIntoView(true);\n\ return ep_result;\n\ }\n\ let banner1 = document.getElementById(\"taw\"); if (banner1) { banner1.style = \"display: none\"; }\n\ let wob_gsp = document.getElementById(\"wob_gsp\"); if (wob_gsp) { wob_gsp.style = \"width: 648.04px\"; }\n\ let weird_line = document.getElementsByClassName(\"v5jHUb\")[0]; if (weird_line) { weird_line.style = \"display: none\"; }\n\ let slim_appbar = document.getElementById(\"slim_appbar\"); if (slim_appbar) { slim_appbar.style = \"display: none\"; }\n\ scrolldisable();\n\ ep_weather_part2();\n\ "; #endif