add swipe functionality
This commit is contained in:
parent
ebb715d362
commit
5ace925557
2
dist/index.html
vendored
2
dist/index.html
vendored
|
@ -1 +1 @@
|
||||||
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><link rel="preload" href="fonts/Star4000.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star 4 Radar.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Extended.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Large Compressed.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Large.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Small.woff" as="font" crossorigin="anonymous"><title>WeatherStar 4000+</title><meta name="description" content="Web based WeatherStar 4000 simulator that reports current and forecast weather conditions plus a few extras!"><meta name="keywords" content="WeatherStar 4000+"><meta name="author" content="Matt Walsh"><meta name="application-name" content="WeatherStar 4000+"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link rel="manifest" href="manifest.json"><link rel="icon" href="images/Logo192.png"><link rel="stylesheet" type="text/css" href="resources/ws.min.css?_=3.6.2"><script type="text/javascript" src="resources/data.min.js?_=3.6.2"></script><script type="text/javascript" src="resources/ws.min.js?_=3.6.2"></script></head><body><div id="divQuery"><form id="frmGetLatLng"><input id="txtAddress" type="text" value="" placeholder="Zip or City, State"><button id="btnGetGps" type="button" title="Get GPS Location"><img id="imgGetGps" src="images/nav/ic_gps_fixed_black_18dp_1x.png"></button> <input id="btnGetLatLng" type="submit" value="GO"> <input id="btnClearQuery" type="reset" value="Reset"></form><div id="divLat"></div><div id="divLng"></div></div><br><img id="imgPause1x" src="images/nav/ic_pause_white_24dp_1x.png"> <img id="imgPause2x" src="images/nav/ic_pause_white_24dp_2x.png"><div id="version" style="display:none">3.6.2</div><div id="divTwc"><div id="container"><div id="loading" width="640" height="480"><div><div class="title">WeatherStar 4000+</div><div class="instructions">Enter your location above to continue</div></div></div></div><div id="divTwcBottom"><div id="divTwcBottomLeft"><img id="NavigateMenu" class="navButton" src="images/nav/ic_menu_white_24dp_1x.png" title="Menu"> <img id="NavigatePrevious" class="navButton" src="images/nav/ic_skip_previous_white_24dp_1x.png" title="Previous"> <img id="NavigateNext" class="navButton" src="images/nav/ic_skip_next_white_24dp_1x.png" title="Next"> <img id="NavigatePlay" class="navButton" src="images/nav/ic_play_arrow_white_24dp_1x.png" title="Play"></div><div id="divTwcBottomMiddle"><img id="NavigateRefresh" class="navButton" src="images/nav/ic_refresh_white_24dp_1x.png" title="Refresh"></div><div id="divTwcBottomRight"><img id="ToggleFullScreen" class="navButton" src="images/nav/ic_fullscreen_exit_white_24dp_1x.png" title="Exit Fullscreen"></div></div></div><br><div class="info"><a href="https://github.com/netbymatt/ws4kp#weatherstar-4000">More information</a></div><div class="heading">Selected displays</div><div id="enabledDisplays"></div><div id="divInfo">Location: <span id="spanCity"></span> <span id="spanState"></span><br>Station Id: <span id="spanStationId"></span><br>Radar Id: <span id="spanRadarId"></span><br>Zone Id: <span id="spanZoneId"></span><br></div><div id="divRefresh">Last Update: <span id="spanLastRefresh">(None)</span><br><input id="chkAutoRefresh" name="chkAutoRefresh" type="checkbox"><label id="lblRefreshCountDown" for="chkAutoRefresh">Auto Refresh: <span id="spanRefreshCountDown">--:--</span></label></div><div id="divUnits">Units: <input id="radEnglish" name="radUnits" type="radio" value="ENGLISH"><label for="radEnglish">English</label> <input id="radMetric" name="radUnits" type="radio" value="METRIC"><label for="radMetric">Metric</label></div></body></html>
|
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><link rel="preload" href="fonts/Star4000.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star 4 Radar.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Extended.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Large Compressed.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Large.woff" as="font" crossorigin="anonymous"><link rel="preload" href="fonts/Star4000 Small.woff" as="font" crossorigin="anonymous"><title>WeatherStar 4000+</title><meta name="description" content="Web based WeatherStar 4000 simulator that reports current and forecast weather conditions plus a few extras!"><meta name="keywords" content="WeatherStar 4000+"><meta name="author" content="Matt Walsh"><meta name="application-name" content="WeatherStar 4000+"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link rel="manifest" href="manifest.json"><link rel="icon" href="images/Logo192.png"><link rel="stylesheet" type="text/css" href="resources/ws.min.css?_=3.6.3"><script type="text/javascript" src="resources/data.min.js?_=3.6.3"></script><script type="text/javascript" src="resources/ws.min.js?_=3.6.3"></script></head><body><div id="divQuery"><form id="frmGetLatLng"><input id="txtAddress" type="text" value="" placeholder="Zip or City, State"><button id="btnGetGps" type="button" title="Get GPS Location"><img id="imgGetGps" src="images/nav/ic_gps_fixed_black_18dp_1x.png"></button> <input id="btnGetLatLng" type="submit" value="GO"> <input id="btnClearQuery" type="reset" value="Reset"></form><div id="divLat"></div><div id="divLng"></div></div><br><img id="imgPause1x" src="images/nav/ic_pause_white_24dp_1x.png"> <img id="imgPause2x" src="images/nav/ic_pause_white_24dp_2x.png"><div id="version" style="display:none">3.6.3</div><div id="divTwc"><div id="container"><div id="loading" width="640" height="480"><div><div class="title">WeatherStar 4000+</div><div class="instructions">Enter your location above to continue</div></div></div></div><div id="divTwcBottom"><div id="divTwcBottomLeft"><img id="NavigateMenu" class="navButton" src="images/nav/ic_menu_white_24dp_1x.png" title="Menu"> <img id="NavigatePrevious" class="navButton" src="images/nav/ic_skip_previous_white_24dp_1x.png" title="Previous"> <img id="NavigateNext" class="navButton" src="images/nav/ic_skip_next_white_24dp_1x.png" title="Next"> <img id="NavigatePlay" class="navButton" src="images/nav/ic_play_arrow_white_24dp_1x.png" title="Play"></div><div id="divTwcBottomMiddle"><img id="NavigateRefresh" class="navButton" src="images/nav/ic_refresh_white_24dp_1x.png" title="Refresh"></div><div id="divTwcBottomRight"><img id="ToggleFullScreen" class="navButton" src="images/nav/ic_fullscreen_exit_white_24dp_1x.png" title="Exit Fullscreen"></div></div></div><br><div class="info"><a href="https://github.com/netbymatt/ws4kp#weatherstar-4000">More information</a></div><div class="heading">Selected displays</div><div id="enabledDisplays"></div><div id="divInfo">Location: <span id="spanCity"></span> <span id="spanState"></span><br>Station Id: <span id="spanStationId"></span><br>Radar Id: <span id="spanRadarId"></span><br>Zone Id: <span id="spanZoneId"></span><br></div><div id="divRefresh">Last Update: <span id="spanLastRefresh">(None)</span><br><input id="chkAutoRefresh" name="chkAutoRefresh" type="checkbox"><label id="lblRefreshCountDown" for="chkAutoRefresh">Auto Refresh: <span id="spanRefreshCountDown">--:--</span></label></div><div id="divUnits">Units: <input id="radEnglish" name="radUnits" type="radio" value="ENGLISH"><label for="radEnglish">English</label> <input id="radMetric" name="radUnits" type="radio" value="METRIC"><label for="radMetric">Metric</label></div></body></html>
|
15
dist/resources/ws.min.js
vendored
15
dist/resources/ws.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -30,6 +30,7 @@ const js_sources = [
|
||||||
'server/scripts/vendor/auto/jquery.js',
|
'server/scripts/vendor/auto/jquery.js',
|
||||||
'server/scripts/vendor/jquery.autocomplete.min.js',
|
'server/scripts/vendor/jquery.autocomplete.min.js',
|
||||||
'server/scripts/vendor/auto/nosleep.js',
|
'server/scripts/vendor/auto/nosleep.js',
|
||||||
|
'server/scripts/vendor/auto/swiped-events.js',
|
||||||
'server/scripts/index.js',
|
'server/scripts/index.js',
|
||||||
'server/scripts/libgif.js',
|
'server/scripts/libgif.js',
|
||||||
'server/scripts/vendor/auto/luxon.js',
|
'server/scripts/vendor/auto/luxon.js',
|
||||||
|
|
|
@ -12,6 +12,7 @@ const vendor_files = [
|
||||||
'./node_modules/nosleep.js/dist/NoSleep.js',
|
'./node_modules/nosleep.js/dist/NoSleep.js',
|
||||||
'./node_modules/jquery/dist/jquery.js',
|
'./node_modules/jquery/dist/jquery.js',
|
||||||
'./node_modules/suncalc/suncalc.js',
|
'./node_modules/suncalc/suncalc.js',
|
||||||
|
'./node_modules/swiped-events/src/swiped-events.js',
|
||||||
];
|
];
|
||||||
|
|
||||||
const copy = () => gulp.src(vendor_files)
|
const copy = () => gulp.src(vendor_files)
|
||||||
|
|
2
gulpserver/jquery.min.js
vendored
2
gulpserver/jquery.min.js
vendored
File diff suppressed because one or more lines are too long
1
gulpserver/luxon.min.js
vendored
1
gulpserver/luxon.min.js
vendored
File diff suppressed because one or more lines are too long
2
gulpserver/nosleep.min.js
vendored
2
gulpserver/nosleep.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -1,310 +0,0 @@
|
||||||
/*
|
|
||||||
(c) 2011-2015, Vladimir Agafonkin
|
|
||||||
SunCalc is a JavaScript library for calculating sun/moon position and light phases.
|
|
||||||
https://github.com/mourner/suncalc
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function () { 'use strict';
|
|
||||||
|
|
||||||
// shortcuts for easier to read formulas
|
|
||||||
|
|
||||||
var PI = Math.PI,
|
|
||||||
sin = Math.sin,
|
|
||||||
cos = Math.cos,
|
|
||||||
tan = Math.tan,
|
|
||||||
asin = Math.asin,
|
|
||||||
atan = Math.atan2,
|
|
||||||
acos = Math.acos,
|
|
||||||
rad = PI / 180;
|
|
||||||
|
|
||||||
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
|
||||||
|
|
||||||
|
|
||||||
// date/time constants and conversions
|
|
||||||
|
|
||||||
var dayMs = 1000 * 60 * 60 * 24,
|
|
||||||
J1970 = 2440588,
|
|
||||||
J2000 = 2451545;
|
|
||||||
|
|
||||||
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
|
|
||||||
function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }
|
|
||||||
function toDays(date) { return toJulian(date) - J2000; }
|
|
||||||
|
|
||||||
|
|
||||||
// general calculations for position
|
|
||||||
|
|
||||||
var e = rad * 23.4397; // obliquity of the Earth
|
|
||||||
|
|
||||||
function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
|
|
||||||
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
|
|
||||||
|
|
||||||
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
|
|
||||||
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
|
|
||||||
|
|
||||||
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
|
|
||||||
|
|
||||||
function astroRefraction(h) {
|
|
||||||
if (h < 0) // the following formula works for positive altitudes only.
|
|
||||||
h = 0; // if h = -0.08901179 a div/0 would occur.
|
|
||||||
|
|
||||||
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
|
||||||
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
|
|
||||||
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
|
|
||||||
}
|
|
||||||
|
|
||||||
// general sun calculations
|
|
||||||
|
|
||||||
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
|
|
||||||
|
|
||||||
function eclipticLongitude(M) {
|
|
||||||
|
|
||||||
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
|
|
||||||
P = rad * 102.9372; // perihelion of the Earth
|
|
||||||
|
|
||||||
return M + C + P + PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sunCoords(d) {
|
|
||||||
|
|
||||||
var M = solarMeanAnomaly(d),
|
|
||||||
L = eclipticLongitude(M);
|
|
||||||
|
|
||||||
return {
|
|
||||||
dec: declination(L, 0),
|
|
||||||
ra: rightAscension(L, 0)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var SunCalc = {};
|
|
||||||
|
|
||||||
|
|
||||||
// calculates sun position for a given date and latitude/longitude
|
|
||||||
|
|
||||||
SunCalc.getPosition = function (date, lat, lng) {
|
|
||||||
|
|
||||||
var lw = rad * -lng,
|
|
||||||
phi = rad * lat,
|
|
||||||
d = toDays(date),
|
|
||||||
|
|
||||||
c = sunCoords(d),
|
|
||||||
H = siderealTime(d, lw) - c.ra;
|
|
||||||
|
|
||||||
return {
|
|
||||||
azimuth: azimuth(H, phi, c.dec),
|
|
||||||
altitude: altitude(H, phi, c.dec)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// sun times configuration (angle, morning name, evening name)
|
|
||||||
|
|
||||||
var times = SunCalc.times = [
|
|
||||||
[-0.833, 'sunrise', 'sunset' ],
|
|
||||||
[ -0.3, 'sunriseEnd', 'sunsetStart' ],
|
|
||||||
[ -6, 'dawn', 'dusk' ],
|
|
||||||
[ -12, 'nauticalDawn', 'nauticalDusk'],
|
|
||||||
[ -18, 'nightEnd', 'night' ],
|
|
||||||
[ 6, 'goldenHourEnd', 'goldenHour' ]
|
|
||||||
];
|
|
||||||
|
|
||||||
// adds a custom time to the times config
|
|
||||||
|
|
||||||
SunCalc.addTime = function (angle, riseName, setName) {
|
|
||||||
times.push([angle, riseName, setName]);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// calculations for sun times
|
|
||||||
|
|
||||||
var J0 = 0.0009;
|
|
||||||
|
|
||||||
function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }
|
|
||||||
|
|
||||||
function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
|
|
||||||
function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }
|
|
||||||
|
|
||||||
function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }
|
|
||||||
|
|
||||||
// returns set time for the given sun altitude
|
|
||||||
function getSetJ(h, lw, phi, dec, n, M, L) {
|
|
||||||
|
|
||||||
var w = hourAngle(h, phi, dec),
|
|
||||||
a = approxTransit(w, lw, n);
|
|
||||||
return solarTransitJ(a, M, L);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// calculates sun times for a given date and latitude/longitude
|
|
||||||
|
|
||||||
SunCalc.getTimes = function (date, lat, lng) {
|
|
||||||
|
|
||||||
var lw = rad * -lng,
|
|
||||||
phi = rad * lat,
|
|
||||||
|
|
||||||
d = toDays(date),
|
|
||||||
n = julianCycle(d, lw),
|
|
||||||
ds = approxTransit(0, lw, n),
|
|
||||||
|
|
||||||
M = solarMeanAnomaly(ds),
|
|
||||||
L = eclipticLongitude(M),
|
|
||||||
dec = declination(L, 0),
|
|
||||||
|
|
||||||
Jnoon = solarTransitJ(ds, M, L),
|
|
||||||
|
|
||||||
i, len, time, Jset, Jrise;
|
|
||||||
|
|
||||||
|
|
||||||
var result = {
|
|
||||||
solarNoon: fromJulian(Jnoon),
|
|
||||||
nadir: fromJulian(Jnoon - 0.5)
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0, len = times.length; i < len; i += 1) {
|
|
||||||
time = times[i];
|
|
||||||
|
|
||||||
Jset = getSetJ(time[0] * rad, lw, phi, dec, n, M, L);
|
|
||||||
Jrise = Jnoon - (Jset - Jnoon);
|
|
||||||
|
|
||||||
result[time[1]] = fromJulian(Jrise);
|
|
||||||
result[time[2]] = fromJulian(Jset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
|
|
||||||
|
|
||||||
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
|
|
||||||
|
|
||||||
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
|
|
||||||
M = rad * (134.963 + 13.064993 * d), // mean anomaly
|
|
||||||
F = rad * (93.272 + 13.229350 * d), // mean distance
|
|
||||||
|
|
||||||
l = L + rad * 6.289 * sin(M), // longitude
|
|
||||||
b = rad * 5.128 * sin(F), // latitude
|
|
||||||
dt = 385001 - 20905 * cos(M); // distance to the moon in km
|
|
||||||
|
|
||||||
return {
|
|
||||||
ra: rightAscension(l, b),
|
|
||||||
dec: declination(l, b),
|
|
||||||
dist: dt
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
SunCalc.getMoonPosition = function (date, lat, lng) {
|
|
||||||
|
|
||||||
var lw = rad * -lng,
|
|
||||||
phi = rad * lat,
|
|
||||||
d = toDays(date),
|
|
||||||
|
|
||||||
c = moonCoords(d),
|
|
||||||
H = siderealTime(d, lw) - c.ra,
|
|
||||||
h = altitude(H, phi, c.dec),
|
|
||||||
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
|
||||||
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
|
|
||||||
|
|
||||||
h = h + astroRefraction(h); // altitude correction for refraction
|
|
||||||
|
|
||||||
return {
|
|
||||||
azimuth: azimuth(H, phi, c.dec),
|
|
||||||
altitude: h,
|
|
||||||
distance: c.dist,
|
|
||||||
parallacticAngle: pa
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// calculations for illumination parameters of the moon,
|
|
||||||
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
|
||||||
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
|
||||||
|
|
||||||
SunCalc.getMoonIllumination = function (date) {
|
|
||||||
|
|
||||||
var d = toDays(date || new Date()),
|
|
||||||
s = sunCoords(d),
|
|
||||||
m = moonCoords(d),
|
|
||||||
|
|
||||||
sdist = 149598000, // distance from Earth to Sun in km
|
|
||||||
|
|
||||||
phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)),
|
|
||||||
inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)),
|
|
||||||
angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) -
|
|
||||||
cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra));
|
|
||||||
|
|
||||||
return {
|
|
||||||
fraction: (1 + cos(inc)) / 2,
|
|
||||||
phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI,
|
|
||||||
angle: angle
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function hoursLater(date, h) {
|
|
||||||
return new Date(date.valueOf() + h * dayMs / 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
|
||||||
|
|
||||||
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
|
||||||
var t = new Date(date);
|
|
||||||
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
|
||||||
else t.setHours(0, 0, 0, 0);
|
|
||||||
|
|
||||||
var hc = 0.133 * rad,
|
|
||||||
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
|
|
||||||
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
|
|
||||||
|
|
||||||
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
|
|
||||||
for (var i = 1; i <= 24; i += 2) {
|
|
||||||
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
|
|
||||||
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
|
|
||||||
|
|
||||||
a = (h0 + h2) / 2 - h1;
|
|
||||||
b = (h2 - h0) / 2;
|
|
||||||
xe = -b / (2 * a);
|
|
||||||
ye = (a * xe + b) * xe + h1;
|
|
||||||
d = b * b - 4 * a * h1;
|
|
||||||
roots = 0;
|
|
||||||
|
|
||||||
if (d >= 0) {
|
|
||||||
dx = Math.sqrt(d) / (Math.abs(a) * 2);
|
|
||||||
x1 = xe - dx;
|
|
||||||
x2 = xe + dx;
|
|
||||||
if (Math.abs(x1) <= 1) roots++;
|
|
||||||
if (Math.abs(x2) <= 1) roots++;
|
|
||||||
if (x1 < -1) x1 = x2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (roots === 1) {
|
|
||||||
if (h0 < 0) rise = i + x1;
|
|
||||||
else set = i + x1;
|
|
||||||
|
|
||||||
} else if (roots === 2) {
|
|
||||||
rise = i + (ye < 0 ? x2 : x1);
|
|
||||||
set = i + (ye < 0 ? x1 : x2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rise && set) break;
|
|
||||||
|
|
||||||
h0 = h2;
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = {};
|
|
||||||
|
|
||||||
if (rise) result.rise = hoursLater(t, rise);
|
|
||||||
if (set) result.set = hoursLater(t, set);
|
|
||||||
|
|
||||||
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// export as Node module / AMD module / browser variable
|
|
||||||
if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;
|
|
||||||
else if (typeof define === 'function' && define.amd) define(SunCalc);
|
|
||||||
else window.SunCalc = SunCalc;
|
|
||||||
|
|
||||||
}());
|
|
15
package-lock.json
generated
15
package-lock.json
generated
|
@ -3285,6 +3285,12 @@
|
||||||
"to-regex": "^3.0.1"
|
"to-regex": "^3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"natives": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"natural-compare": {
|
"natural-compare": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
|
||||||
|
@ -4515,6 +4521,15 @@
|
||||||
"es6-symbol": "^3.1.1"
|
"es6-symbol": "^3.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"swiped-events": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-r7aIa2gjDXYWFP9VgqWIbCxGV6JOoaQ8urLWwNYxdufEW3hr4NwmRQ2WU1qXMVDvxwbn+nF8I2e4nQrl5LwVXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"natives": "^1.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"version": "5.4.6",
|
"version": "5.4.6",
|
||||||
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
|
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
"jquery-touchswipe": "^1.6.19",
|
"jquery-touchswipe": "^1.6.19",
|
||||||
"luxon": "^1.25.0",
|
"luxon": "^1.25.0",
|
||||||
"nosleep.js": "^0.11.0",
|
"nosleep.js": "^0.11.0",
|
||||||
"suncalc": "^1.8.0"
|
"suncalc": "^1.8.0",
|
||||||
|
"swiped-events": "^1.1.4"
|
||||||
},
|
},
|
||||||
"dependencies": {}
|
"dependencies": {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,6 +159,10 @@ const index = (() => {
|
||||||
document.getElementById('chkAutoRefresh').checked = false;
|
document.getElementById('chkAutoRefresh').checked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// swipe functionality
|
||||||
|
document.getElementById('container').addEventListener('swiped-left', () => swipeCallBack('left'));
|
||||||
|
document.getElementById('container').addEventListener('swiped-right', () => swipeCallBack('right'));
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const changeUnits = (e) => {
|
const changeUnits = (e) => {
|
||||||
|
@ -277,24 +281,20 @@ const index = (() => {
|
||||||
|
|
||||||
postMessage('latLon', latLon);
|
postMessage('latLon', latLon);
|
||||||
|
|
||||||
const SwipeCallBack = (event, direction) => {
|
|
||||||
switch (direction) {
|
|
||||||
case 'left':
|
|
||||||
btnNavigateNext_click();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'right':
|
};
|
||||||
default:
|
|
||||||
btnNavigatePrevious_click();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// display.swipe({
|
const swipeCallBack = (direction) => {
|
||||||
// //Generic swipe handler for all directions
|
switch (direction) {
|
||||||
// swipeRight: SwipeCallBack,
|
case 'left':
|
||||||
// swipeLeft: SwipeCallBack,
|
btnNavigateNext_click();
|
||||||
// });
|
break;
|
||||||
|
|
||||||
|
case 'right':
|
||||||
|
default:
|
||||||
|
btnNavigatePrevious_click();
|
||||||
|
break;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const AssignLastUpdate = () => {
|
const AssignLastUpdate = () => {
|
||||||
|
|
156
server/scripts/vendor/auto/swiped-events.js
vendored
Normal file
156
server/scripts/vendor/auto/swiped-events.js
vendored
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
/*!
|
||||||
|
* swiped-events.js - v@version@
|
||||||
|
* Pure JavaScript swipe events
|
||||||
|
* https://github.com/john-doherty/swiped-events
|
||||||
|
* @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element
|
||||||
|
* @author John Doherty <www.johndoherty.info>
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
(function (window, document) {
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// patch CustomEvent to allow constructor creation (IE/Chrome)
|
||||||
|
if (typeof window.CustomEvent !== 'function') {
|
||||||
|
|
||||||
|
window.CustomEvent = function (event, params) {
|
||||||
|
|
||||||
|
params = params || { bubbles: false, cancelable: false, detail: undefined };
|
||||||
|
|
||||||
|
var evt = document.createEvent('CustomEvent');
|
||||||
|
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
|
||||||
|
return evt;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.CustomEvent.prototype = window.Event.prototype;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('touchstart', handleTouchStart, false);
|
||||||
|
document.addEventListener('touchmove', handleTouchMove, false);
|
||||||
|
document.addEventListener('touchend', handleTouchEnd, false);
|
||||||
|
|
||||||
|
var xDown = null;
|
||||||
|
var yDown = null;
|
||||||
|
var xDiff = null;
|
||||||
|
var yDiff = null;
|
||||||
|
var timeDown = null;
|
||||||
|
var startEl = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fires swiped event if swipe detected on touchend
|
||||||
|
* @param {object} e - browser event object
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function handleTouchEnd(e) {
|
||||||
|
|
||||||
|
// if the user released on a different target, cancel!
|
||||||
|
if (startEl !== e.target) return;
|
||||||
|
|
||||||
|
var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20px
|
||||||
|
var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms
|
||||||
|
var timeDiff = Date.now() - timeDown;
|
||||||
|
var eventType = '';
|
||||||
|
var changedTouches = e.changedTouches || e.touches || [];
|
||||||
|
|
||||||
|
if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant
|
||||||
|
if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {
|
||||||
|
if (xDiff > 0) {
|
||||||
|
eventType = 'swiped-left';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eventType = 'swiped-right';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {
|
||||||
|
if (yDiff > 0) {
|
||||||
|
eventType = 'swiped-up';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eventType = 'swiped-down';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType !== '') {
|
||||||
|
|
||||||
|
var eventData = {
|
||||||
|
dir: eventType.replace(/swiped-/, ''),
|
||||||
|
xStart: parseInt(xDown, 10),
|
||||||
|
xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),
|
||||||
|
yStart: parseInt(yDown, 10),
|
||||||
|
yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)
|
||||||
|
};
|
||||||
|
|
||||||
|
// fire `swiped` event event on the element that started the swipe
|
||||||
|
startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));
|
||||||
|
|
||||||
|
// fire `swiped-dir` event on the element that started the swipe
|
||||||
|
startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset values
|
||||||
|
xDown = null;
|
||||||
|
yDown = null;
|
||||||
|
timeDown = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records current location on touchstart event
|
||||||
|
* @param {object} e - browser event object
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function handleTouchStart(e) {
|
||||||
|
|
||||||
|
// if the element has data-swipe-ignore="true" we stop listening for swipe events
|
||||||
|
if (e.target.getAttribute('data-swipe-ignore') === 'true') return;
|
||||||
|
|
||||||
|
startEl = e.target;
|
||||||
|
|
||||||
|
timeDown = Date.now();
|
||||||
|
xDown = e.touches[0].clientX;
|
||||||
|
yDown = e.touches[0].clientY;
|
||||||
|
xDiff = 0;
|
||||||
|
yDiff = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records location diff in px on touchmove event
|
||||||
|
* @param {object} e - browser event object
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function handleTouchMove(e) {
|
||||||
|
|
||||||
|
if (!xDown || !yDown) return;
|
||||||
|
|
||||||
|
var xUp = e.touches[0].clientX;
|
||||||
|
var yUp = e.touches[0].clientY;
|
||||||
|
|
||||||
|
xDiff = xDown - xUp;
|
||||||
|
yDiff = yDown - yUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets attribute off HTML element or nearest parent
|
||||||
|
* @param {object} el - HTML element to retrieve attribute from
|
||||||
|
* @param {string} attributeName - name of the attribute
|
||||||
|
* @param {any} defaultValue - default value to return if no match found
|
||||||
|
* @returns {any} attribute value or defaultValue
|
||||||
|
*/
|
||||||
|
function getNearestAttribute(el, attributeName, defaultValue) {
|
||||||
|
|
||||||
|
// walk up the dom tree looking for data-action and data-trigger
|
||||||
|
while (el && el !== document.documentElement) {
|
||||||
|
|
||||||
|
var attributeValue = el.getAttribute(attributeName);
|
||||||
|
|
||||||
|
if (attributeValue) {
|
||||||
|
return attributeValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
el = el.parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}(window, document));
|
|
@ -1 +1 @@
|
||||||
module.exports = '3.6.2';
|
module.exports = '3.6.3';
|
|
@ -31,6 +31,7 @@
|
||||||
<script type="text/javascript" src="scripts/vendor/auto/jquery.js"></script>
|
<script type="text/javascript" src="scripts/vendor/auto/jquery.js"></script>
|
||||||
<script type="text/javascript" src="scripts/vendor/jquery.autocomplete.min.js"></script>
|
<script type="text/javascript" src="scripts/vendor/jquery.autocomplete.min.js"></script>
|
||||||
<script type="text/javascript" src="scripts/vendor/auto/nosleep.js"></script>
|
<script type="text/javascript" src="scripts/vendor/auto/nosleep.js"></script>
|
||||||
|
<script type="text/javascript" src="scripts/vendor/auto/swiped-events.js"></script>
|
||||||
<script type="text/javascript" src="scripts/vendor/jquery.touchswipe.min.js"></script>
|
<script type="text/javascript" src="scripts/vendor/jquery.touchswipe.min.js"></script>
|
||||||
<script type="text/javascript" src="scripts/index.js"></script>
|
<script type="text/javascript" src="scripts/index.js"></script>
|
||||||
<script type="text/javascript" src="scripts/data/states.js"></script>
|
<script type="text/javascript" src="scripts/data/states.js"></script>
|
||||||
|
|
Loading…
Reference in a new issue