Date to Percentage Progress

Answer for SO question: http://stackoverflow.com/questions/25404045/fill-css-progressbar-value-width-when-reaching-a-set-time-date

HTML

<div class="meter"> <span></span>

CSS

.meter {
    height: 5px;
    /* Can be anything */
    position: relative;
    margin: 60px 0 20px 0;
    /* Just for demo spacing */
    background: #555;
    -moz-border-radius: 25px;
    -webkit-border-radius: 25px;
    border-radius: 25px;
   
}
.meter > span {
    display: block;
    height: 100%;
    -webkit-border-top-right-radius: 8px;
    -webkit-border-bottom-right-radius: 8px;
    -moz-border-radius-topright: 8px;
    -moz-border-radius-bottomright: 8px;
    border-top-right-radius: 8px;
    border-bottom-right-radius: 8px;
    -webkit-border-top-left-radius: 20px;
    -webkit-border-bottom-left-radius: 20px;
    -moz-border-radius-topleft: 20px;
    -moz-border-radius-bottomleft: 20px;
    border-top-left-radius: 20px;
    border-bottom-left-radius: 20px;
    background-color: rgb(43, 194, 83);
    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, rgb(43, 194, 83)), color-stop(1, rgb(84, 240, 84)));
    background-image: -moz-linear-gradient(center bottom, rgb(43, 194, 83) 37%, rgb(84, 240, 84) 69%);
    -webkit-box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4);
    -moz-box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4);
    box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4);
    position: relative;
    overflow: hidden;
}

.orange > span {
    background-color: #f1a165;
    background-image: -moz-linear-gradient(top, #f1a165, #f36d0a);
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f1a165), color-stop(1, #f36d0a));
    background-image: -webkit-linear-gradient(#f1a165, #f36d0a);
}
.red > span {
    background-color: #f0a3a3;
    background-image: -moz-linear-gradient(top, #f0a3a3, #f42323);
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f0a3a3), color-stop(1, #f42323));
    background-image: -webkit-linear-gradient(#f0a3a3,...

JavaScript

var targetDate = new Date("12/25/2018");
var beginDate = new Date("01/01/2014");
var totalTime = (targetDate - beginDate);
$(function () {

    //Create a custom event on the span to handle incoming data for animation.
    $(".meter > span").bind("progress-event", function (e, data) {
        $(this)
            .width($(this).prop("width"))
            .data("origWidth", data.Complete)
            .animate({
            width: $(this).data("origWidth") + "%"
        }, 1200);
        $(this).prop("title",($(this).data("origWidth") + "%"));
    });
    //Initial animation on page load.
    $(".meter > span").each(function () {
        $(document).trigger("date-changed", {
            Date: new Date()
        });
    });
    
    //Apply the datepicker with an event handler for a selected date
    $("#date-input").datepicker({
        onSelect: function (selectedDate, obj) {
            $(document).trigger("date-changed", {
                Date: selectedDate
            });
        } // end onSelect function
    });
});

//Custom event to handle a date being picked from the datepicker
$(document).bind("date-changed", function (e, data) {
    var dateProgress = new Date(data.Date) - beginDate;
    var completionPercentage = (Math.round((dateProgress / totalTime) * 100));
    if(completionPercentage > 100) {  //Make sure we don't go past 100
        completionPercentage = 100;
    } // end if
    $(".meter > span").trigger("progress-event", {
        Date: data.Date,
        Complete: completionPercentage
    });
});