/*! * JavaScript TimeSpan Library * * Copyright (c) 2010 Michael Stum, http://www.Stum.de/ * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*global window: false */ "use strict"; (function () { // Constructor function, all parameters are optional var TimeSpan = window.TimeSpan = function (milliseconds, seconds, minutes, hours, days) { var version = "1.2", // Millisecond-constants msecPerSecond = 1000, msecPerMinute = 60000, msecPerHour = 3600000, msecPerDay = 86400000, // Internally we store the TimeSpan as Milliseconds msecs = 0, // Helper functions isNumeric = function (input) { return !isNaN(parseFloat(input)) && isFinite(input); }; // Constructor Logic if (isNumeric(days)) { msecs += (days * msecPerDay); } if (isNumeric(hours)) { msecs += (hours * msecPerHour); } if (isNumeric(minutes)) { msecs += (minutes * msecPerMinute); } if (isNumeric(seconds)) { msecs += (seconds * msecPerSecond); } if (isNumeric(milliseconds)) { msecs += milliseconds; } // Addition Functions this.addMilliseconds = function (milliseconds) { if (!isNumeric(milliseconds)) { return; } msecs += milliseconds; }; this.addSeconds = function (seconds) { if (!isNumeric(seconds)) { return; } msecs += (seconds * msecPerSecond); }; this.addMinutes = function (minutes) { if (!isNumeric(minutes)) { return; } msecs += (minutes * msecPerMinute); }; this.addHours = function (hours) { if (!isNumeric(hours)) { return; } msecs += (hours * msecPerHour); }; this.addDays = function (days) { if (!isNumeric(days)) { return; } msecs += (days * msecPerDay); }; // Subtraction Functions this.subtractMilliseconds = function (milliseconds) { if (!isNumeric(milliseconds)) { return; } msecs -= milliseconds; }; this.subtractSeconds = function (seconds) { if (!isNumeric(seconds)) { return; } msecs -= (seconds * msecPerSecond); }; this.subtractMinutes = function (minutes) { if (!isNumeric(minutes)) { return; } msecs -= (minutes * msecPerMinute); }; this.subtractHours = function (hours) { if (!isNumeric(hours)) { return; } msecs -= (hours * msecPerHour); }; this.subtractDays = function (days) { if (!isNumeric(days)) { return; } msecs -= (days * msecPerDay); }; // Functions to interact with other TimeSpans this.isTimeSpan = true; this.add = function (otherTimeSpan) { if (!otherTimeSpan.isTimeSpan) { return; } msecs += otherTimeSpan.totalMilliseconds(); }; this.subtract = function (otherTimeSpan) { if (!otherTimeSpan.isTimeSpan) { return; } msecs -= otherTimeSpan.totalMilliseconds(); }; this.equals = function (otherTimeSpan) { if (!otherTimeSpan.isTimeSpan) { return; } return msecs === otherTimeSpan.totalMilliseconds(); }; // Getters this.totalMilliseconds = function (roundDown) { var result = msecs; if (roundDown === true) { result = Math.floor(result); } return result; }; this.totalSeconds = function (roundDown) { var result = msecs / msecPerSecond; if (roundDown === true) { result = Math.floor(result); } return result; }; this.totalMinutes = function (roundDown) { var result = msecs / msecPerMinute; if (roundDown === true) { result = Math.floor(result); } return result; }; this.totalHours = function (roundDown) { var result = msecs / msecPerHour; if (roundDown === true) { result = Math.floor(result); } return result; }; this.totalDays = function (roundDown) { var result = msecs / msecPerDay; if (roundDown === true) { result = Math.floor(result); } return result; }; // Return a Fraction of the TimeSpan this.milliseconds = function () { return msecs % 1000; }; this.seconds = function () { return Math.floor(msecs / msecPerSecond) % 60; }; this.minutes = function () { return Math.floor(msecs / msecPerMinute) % 60; }; this.hours = function () { return Math.floor(msecs / msecPerHour) % 24; }; this.days = function () { return Math.floor(msecs / msecPerDay); }; // Misc. Functions this.getVersion = function () { return version; }; }; // "Static Constructors" TimeSpan.FromSeconds = function (seconds) { return new TimeSpan(0, seconds, 0, 0, 0); }; TimeSpan.FromMinutes = function (minutes) { return new TimeSpan(0, 0, minutes, 0, 0); }; TimeSpan.FromHours = function (hours) { return new TimeSpan(0, 0, 0, hours, 0); }; TimeSpan.FromDays = function (days) { return new TimeSpan(0, 0, 0, 0, days); }; TimeSpan.FromDates = function (firstDate, secondDate, forcePositive) { var differenceMsecs = secondDate.valueOf() - firstDate.valueOf(); if(forcePositive === true) { differenceMsecs = Math.abs(differenceMsecs); } return new TimeSpan(differenceMsecs, 0, 0, 0, 0); }; }());