177 lines
5.4 KiB
JavaScript
177 lines
5.4 KiB
JavaScript
function Location() { // onReady, onRefresh, onAllComplete
|
|
|
|
var that = this,
|
|
$this = $(this),
|
|
_forecastmgr,
|
|
_observations=[];
|
|
|
|
this.temperature = function() {
|
|
if (_observations[1]!=null && _observations[1].temperature.value) {
|
|
return C2F(_observations[1].temperature.value);
|
|
} else {
|
|
return Math.round( _observations[0].temperature );
|
|
}
|
|
}
|
|
|
|
this.observations = function(i) {
|
|
return _observations[i];
|
|
};
|
|
|
|
this.forecasts=function(type){return _forecastmgr.forecast(type)};
|
|
|
|
this.init = function(searchString){
|
|
checkRefresh(searchString);
|
|
};
|
|
|
|
this.initForecasts = function() {
|
|
// start the forecast data pull
|
|
if (_observations[0] != undefined){
|
|
_forecastmgr = new ForecastManager(_observations[0].latitude, _observations[0].longitude, function() {
|
|
$this.trigger('ready');
|
|
});
|
|
}
|
|
};
|
|
|
|
|
|
|
|
// check to see if data needs to be refreshed
|
|
function checkRefresh(location) {
|
|
|
|
// check the expiration
|
|
if ( _observations[0]!=undefined && dateFns.isFuture( _observations[0].xdate ) ) {
|
|
setTimeout(checkRefresh, getRandom(5000, 10000));
|
|
return;
|
|
}
|
|
|
|
// woeid is the id for the location to pull data for
|
|
console.log(location);
|
|
if (location != undefined) {
|
|
var loclat = location.split(",")[0]
|
|
var loclong = location.split(",")[1]
|
|
//old var url = 'https://api.openweathermap.org/data/2.5/onecall?lat=' + loclat + '&lon=' + loclong + '&appid=0cb279a98124446dd16dba02fbfb60ee&units=imperial'
|
|
https://api.weather.com/v3/aggcommon/v3-wx-observations-current;v3-location-point?geocode=33.74,-84.39&language=en-US&units=e&format=json&apiKey=yourApiKey
|
|
|
|
var url = 'https://api.weather.com/v3/aggcommon/v3-wx-observations-current;v3-location-point?geocode=' + loclat + ',' + loclong + '&language=en-US&units=e&format=json&apiKey=' + api_key
|
|
|
|
// ajax the latest observation
|
|
$.getJSON(url, function(data) {
|
|
_observations[0] = json = data['v3-wx-observations-current'];
|
|
_observations[0].latitude = loclat;
|
|
_observations[0].longitude = loclong;
|
|
_observations[0].cityname = data['v3-location-point'].location.city;
|
|
$this.trigger('refresh');
|
|
|
|
// the following block only runs on init
|
|
if (that.woeid===undefined) {
|
|
|
|
that.woeid = loclat;
|
|
|
|
that.lat = loclat;
|
|
that.long = loclong;
|
|
|
|
that.city = data['v3-location-point'].location.city;
|
|
|
|
$this.trigger('init');
|
|
|
|
}
|
|
// set the expiration date/time
|
|
_observations[0].xdate = dateFns.addMinutes(json.lastBuildDate, json.ttl);
|
|
|
|
setTimeout(checkRefresh, getRandom(5000, 10000));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// pull observations from the location observation station
|
|
|
|
|
|
|
|
|
|
|
|
function ForecastManager (latitude, longitude, readyCallback) {
|
|
var _forecasts = {},
|
|
keys =['alert','daily','hourly','almanac','pollen','achesindex','breathindex','airquality','forecastuvindex', 'uvindex'],
|
|
key,
|
|
readycount = 0;
|
|
|
|
for(key of keys) {
|
|
_forecasts[key] = new Forecast(key, latitude, longitude, count);
|
|
}
|
|
|
|
|
|
function count() {
|
|
// count up completed forecast pulls
|
|
readycount++;
|
|
if (readycount===keys.length) {
|
|
readyCallback();
|
|
}
|
|
}
|
|
|
|
this.forecast = function(type) {
|
|
try{
|
|
return _forecasts[type].data;
|
|
} catch(err){}
|
|
}
|
|
|
|
}
|
|
|
|
function Forecast(type, lat, lon, readyCallback) {
|
|
|
|
var that = this;
|
|
var url;
|
|
if (type == 'hourly') {
|
|
url = 'https://api.weather.com/v3/wx/forecast/hourly/2day?geocode=' + lat + ',' + lon + "&format=json&units=e&language=en-US&apiKey=" + api_key
|
|
} else if (type == 'daily') {
|
|
url = 'https://api.weather.com/v3/wx/forecast/daily/5day?geocode=' + lat + ',' + lon + "&format=json&units=e&language=en-US&apiKey=" + api_key
|
|
} else if (type == 'alert') {
|
|
url = 'https://api.weather.com/v3/alerts/headlines?geocode=' + lat + ',' + lon + "&format=json&language=en-US&apiKey=" + api_key
|
|
} else if (type == 'almanac') {
|
|
url = 'https://api.weather.com/v3/wx/almanac/daily/1day?geocode=' + lat + ',' + lon + "&format=json&units=e" + "&day=" + dateFns.format(new Date(), "D") + "&month=" + dateFns.format(new Date(),"M") + "&apiKey=" + api_key
|
|
} else if (type == 'pollen') {
|
|
url = 'https://api.weather.com/v1/geocode/'+ lat + '/' + lon + '/observations/pollen.json?language=en-US&apiKey=' + api_key
|
|
} else if (type == 'achesindex') {
|
|
url = 'https://api.weather.com/v2/indices/achePain/daypart/3day?geocode=' + lat + ',' + lon + "&language=en-US&format=json&apiKey=" + api_key
|
|
} else if (type == 'breathindex') {
|
|
url = 'https://api.weather.com/v2/indices/breathing/daypart/3day?geocode=' + lat + ',' + lon + "&language=en-US&format=json&apiKey=" + api_key
|
|
} else if (type == 'airquality') {
|
|
url = 'https://api.weather.com/v3/wx/globalAirQuality?geocode=' + lat + ',' + lon + "&language=en-US&scale=EPA&format=json&apiKey=" + api_key
|
|
} else if (type == 'forecastuvindex') {
|
|
url = 'https://api.weather.com/v2/indices/uv/hourly/48hour?geocode=' + lat + ',' + lon + "&language=en-US&format=json&apiKey=" + api_key
|
|
}else if (type == 'uvindex') {
|
|
url = 'https://api.weather.com/v2/indices/uv/current?geocode=' + lat + ',' + lon + "&language=en-US&format=json&apiKey=" + api_key
|
|
}
|
|
|
|
this.data = {};
|
|
|
|
checkRefresh();
|
|
|
|
function checkRefresh() {
|
|
|
|
// check the expiration
|
|
if ( that.data!={} && dateFns.isFuture( that.data.xdate ) ) {
|
|
setTimeout(checkRefresh, getRandom(5000, 10000));
|
|
return;
|
|
}
|
|
|
|
// ajax the forecast
|
|
$.getJSON(url, function(data) {
|
|
|
|
that.data = data
|
|
|
|
// trigger ready callback on first data pull
|
|
|
|
// set the expiration date/time
|
|
})
|
|
.always(function() {
|
|
if (readyCallback){
|
|
readyCallback();
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|