| /*! |
| * 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); |
| }; |
| }()); |