Results Website Design's company banner with logo showing increased sales.
Results Website Design's company banner with logo showing increased sales.

Weather App

This app uses geolocation to determine your location, and then fetches a current weather report for your city, making use of the Open Weather API.  If your OS or browser settings disallow geolocation, you will be informed of that and given the opportunity to change those settings so your weather report can be displayed.  Based on your current weather conditions, the app displays the appropriate background image and weather icon.  If your computer's current clock time falls during the evening or night, the app also darkens the weather background image.

JavaScript
//get date object
var date = new Date();
var hour = date.getHours();

jQuery(document).ready(function () {

  function getLocation() {
    //credit to W3schools.com for geolocation code
    //if a geolocation object exists...
    if (navigator.geolocation) {
      //call the object's getCurrentPosition() method; once a position is obtained, execute the callback function showPosition, and in the event a geolocation error occurs, execute the callback function showError
      navigator.geolocation.getCurrentPosition(showPosition, showError);
    }
    //if a geolocation object does not exist...
    else {
      jQuery('#details-container').css('display', 'block');
      jQuery('.weather-title').html('<span>Geolocation is not supported by your browser.<span>');
      jQuery('#veil').css('display', 'none');
    }
  }

  //the callback function which uses the geolocation object to display the weather
  function showPosition(position) {

    jQuery('#details-container').css('display', 'block');

    var lat = position.coords.latitude;
    var lon = position.coords.longitude;

    var weatherURL = "https://cors-anywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&APPID=KEYGOESHERE";

    //get weather object from open weather api
    jQuery.getJSON(weatherURL, function (json) {

      jQuery('#toggle-temp').addClass('wpforms-submit').css('display', 'block');

      jQuery('.weather-title').html('<span> Current Weather Report for ' + json["name"] + ':' + '</span>');

      jQuery('.conditions').html('<span>' + json["weather"][0]["description"] + '</span>');

      var weatherID = json["weather"][0]["id"];
      var baseURL = "https://openweathermap.org/img/w/";

      //if it is night based on the date object, do the following...
      if ((hour >= 0 && hour <= 5) || (hour >= 18 && hour <= 23)) {
        console.log("It's night (b/t midnight and 5:59am or b/t 6pm and 11:59pm)");

        //display a semi-transparent black layer over the weather image for night effect
        jQuery('#veil').css('display', 'block');

        //dispay a different weather background image and weather icon for each of six weather categories
        switch (true) {
        case (weatherID >= 200 && weatherID <= 232): //thunderstorm
          jQuery('#weatherIcon').attr('src', baseURL + "11n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/thunderstorm1080x720.jpg)');
          break;
        case ((weatherID >= 300 && weatherID <= 321) || (weatherID >= 500 && weatherID <= 531)): //"drizzle" or "rain" respectively, using same pic
          jQuery('#weatherIcon').attr('src', baseURL + "09n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/rain1080x760.jpg)');
          break;
        case (weatherID >= 600 && weatherID <= 622): //snow
          jQuery('#weatherIcon').attr('src', baseURL + "13n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/snow1080x810.jpg)');
          break;
        case (weatherID >= 701 && weatherID <= 781): //mist, smoke, haze, sand/dust whirls, fog, dust, volcanic ash, squalls, tornado
          jQuery('#weatherIcon').attr('src', baseURL + "50n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/windmill1080x810.jpg)');
          break;
        case (weatherID === 800): //clear
          jQuery('#weatherIcon').attr('src', baseURL + "01n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/clear1080x720.jpg)');
          break;
        case (weatherID >= 801 && weatherID <= 804): //clouds
          jQuery('#weatherIcon').attr('src', baseURL + "03n.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/cloudy1080x720.jpg)');
          break;
        }

        //if it is day based on the date object, do the following...
      } else {
        console.log("it's day");

        //dispay a different weather background image and weather icon for each of six weather categories
        switch (true) {
        case (weatherID >= 200 && weatherID <= 232): //thunderstorm
          jQuery('#weatherIcon').attr('src', baseURL + "11d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/thunderstorm1080x720.jpg)');
          break;
        case ((weatherID >= 300 && weatherID <= 321) || (weatherID >= 500 && weatherID <= 531)): //"drizzle" or "rain" respectively, using same pic
          jQuery('#weatherIcon').attr('src', baseURL + "09d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/rain1080x760.jpg)');
          break;
        case (weatherID >= 600 && weatherID <= 622): //snow
          jQuery('#weatherIcon').attr('src', baseURL + "13d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/snow1080x810.jpg)');
          break;
        case (weatherID >= 701 && weatherID <= 781): //mist, smoke, haze, sand/dust whirls, fog, dust, volcanic ash, squalls, tornado
          jQuery('#weatherIcon').attr('src', baseURL + "50d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/windmill1080x810.jpg)');
          break;
        case (weatherID === 800): //clear
          jQuery('#weatherIcon').attr('src', baseURL + "01d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/sunny1080x723.jpg)');
          break;
        case (weatherID >= 801 && weatherID <= 804): //clouds
          jQuery('#weatherIcon').attr('src', baseURL + "03d.png");
          jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/05/cloudy1080x720.jpg)');
          break;
        }
      }

      //convert source Kelvin temp to Fahrenheit and Celsius
      var kelvinTemp = json["main"]["temp"];
      var fahrTemp = Math.round(((kelvinTemp - 273.15) * (9 / 5)) + 32);
      var celsTemp = Math.round(kelvinTemp - 273.15);

      //display Fahrenheit temp by default
      jQuery('#temp-report').html("Temperature: " + fahrTemp + "°" + " F");

      //when the toggle-temp button is clicked, check to see if it reads Celsius or Fahrenheit
      jQuery('button#toggle-temp').click(function () {

        //if the button reads "Celsius"...
        if (jQuery('button#toggle-temp:contains(Celsius)').length !== 0) {
          //display the temp in Celsius
          jQuery('#temp-report').html('Temperature: ' + celsTemp + '°' + ' C');
          //make the button text read "to Fahrenheit"
          jQuery('button#toggle-temp').html('to Fahrenheit');
        }
        //if the button reads "Fahrenheit"...
        else if (jQuery('button#toggle-temp:contains(Fahrenheit)').length !== 0) {
          //display the temp in Fahrenheit
          jQuery('#temp-report').html('Temperature: ' + fahrTemp + '°' + ' F');
          //make the button text read "to Celsius"
          jQuery('button#toggle-temp').html('to Celsius');
        }
      });
    });
  }
  getLocation();

  //callback function which handles getGeolocation() errors    
  function showError(error) {
    //credit to W3schools.com for error handling
    jQuery('#toggle-temp').css('display', 'none');
    jQuery('#details-container').css('display', 'block');
    switch (error.code) {
    case error.PERMISSION_DENIED:
      jQuery('.weather-title').html('<span>Your settings denied the request for geolocation.  Please allow geolocation in your browser and/or OS settings so your local weather may be displayed.<span>');
      jQuery('#veil').css('display', 'none');
      break;
    case error.POSITION_UNAVAILABLE:
      jQuery('.weather-title').html('<span>Location information is unavailable, so the weather for your location cannot be displayed.<span>');
      jQuery('#veil').css('display', 'none');
      break;
    case error.TIMEOUT:
      jQuery('.weather-title').html('<span>The request to get your location timed out, so weather for your location cannot be displayed.<span>');
      jQuery('#veil').css('display', 'none');
      break;
    case error.UNKNOWN_ERROR:
      jQuery('.weather-title').html('<span>An unknown error occurred, so weather for your location cannot be displayed. <span>');
      //    jQuery('#weather-report').css('background-image', 'url(https://resultswebsitedesign.com/wp-content/uploads/2017/06/geolocation1080x720.jpg)');
      jQuery('#veil').css('display', 'none');
      break;
    }
  }

  //prevent default api service failure message from flashing before a successful api call can complete and populate the widget
  setTimeout(function () {

    //detect if .weather-title has been populated due to successful api call or geolocation error info
    if (jQuery('.weather-title').text().length === 0) {

      jQuery('.weather-title').html('<span>An API service required to fetch the weather for your location is temporarily unavailable.  Please try again later.<span>');
    }
  }, 1000);
});
HTML
<section id="weather-report">
	<section id="veil">
	</section>
	<div id="details-container">
		<h3 class="weather-title"></h3>
		<div class="flex-container">
			<h3 class="conditions"></h3>
		</div>
		<div class="flex-container">
			<p id="temp-report"></p>
		</div>
		<div class="flex-container">
			<button id="toggle-temp">to Celsius</button>
		</div>
		<div class="flex-container">
			<img id="weatherIcon" src="">
		</div>
	</div>
	<section id="default-background">
	</section>
</section>
CSS
  .weather-title {
    text-align: center;
    padding-top: 15px;
  }  
  .conditions {
    text-align: center;
    text-transform: capitalize;
  } 
  .flex-container {
    display: flex;
    justify-content: center;
    width: 100%;
  } 
  #weather-report {
    max-width: 1080px;
    width: 100%;
    margin: 0 auto;
    padding: 0 15px;
    min-height: 720px;
    position: relative;
    border-radius: 10px;
    background-position: center;
  } 
  #veil,
  #default-background {
    width: 100%;
    min-height: 720px;
    position: absolute;
    top: 0;
    left: 0;
    border-radius: 10px;
  }  
  #veil {
    background-color: rgba(0, 0, 0, .5);
    z-index: 1;
    display: none;
  }  
  #default-background {
    z-index: -1;
    background: url(https://resultswebsitedesign.com/wp-content/uploads/2017/06/geolocation1080x720.jpg) center;
    display: block;
  }
  #details-container {
    /*prevent display until it is known whether geolocation is allowed*/
    display: none;
    position: relative;
    /*position weather details in layer above veil*/
    z-index: 2;
    max-width: 500px;
    background: rgba(255, 255, 255, .5);
    padding: 0 10px;
    margin: 0 auto;
    border-radius: 10px;
    top: 15px;
  } 
  #toggle-temp {
    /*prevent display until it is known whether geolocation is allowed*/
    display: none;
  }