﻿ch.TimeSpan || (function (ch) {
	// Class written by Jose Menendez Poo
	// http://www.codeproject.com/KB/scripting/jsDateTime.aspx
	// Adopted by CareerHub
	ch.TimeSpan = function () {
		var days = 0;
		var hours = 0;
		var minutes = 0;
		var seconds = 0;
		var milliseconds = 0;

		switch (arguments.length) {
			case 0:
				break;
			case 1:
				milliseconds = arguments[0];
				break;
			case 2:
				days = arguments[0];
				hours = arguments[1];
				break;
			case 3:
				hours = arguments[0];
				minutes = arguments[1];
				seconds = arguments[2];
				break;
			case 4:
				days = arguments[0];
				hours = arguments[1];
				minutes = arguments[2];
				seconds = arguments[3];
				break;
			case 5:
				days = arguments[0];
				hours = arguments[1];
				minutes = arguments[2];
				seconds = arguments[3];
				milliseconds = arguments[4];
				break;
			default:
				throw ("No constructor of TimeSpan supports " + arguments.length + " arguments");
		}

		this._millis = (days * 86400 + hours * 3600 + minutes * 60 + seconds) * 1000 + milliseconds;

	};

	ch.TimeSpan.prototype = {
		/* Methods */
		add: function (timespan) {
			return new ch.TimeSpan(timespan._millis + this._millis);
		},

		compareTo: function (timespan) {
			if (this._millis > timespan._millis) return 1;
			if (this._millis == timespan._millis) return 0;
			if (this._millis < timespan._millis) return -1;
		},

		duration: function () {
			return new ch.TimeSpan(Math.abs(this._millis));
		},

		equals: function (timespan) {
			return this._millis == timespan._millis;
		},

		negate: function () {
			this._millis *= -1;
		},

		subtract: function (timespan) {
			return new ch.TimeSpan(this._millis - timespan._millis);
		},

		rounder: function (number) {
			if (this._millis < 0)
				return Math.ceil(number);
			return Math.floor(number);
		},

		/* Properties */

		days: function () {
			return this.rounder(this._millis / (24 * 3600 * 1000));
		},

		hours: function () {
			return this.rounder((this._millis % (24 * 3600 * 1000)) / (3600 * 1000));
		},

		milliseconds: function () {
			return this.rounder(this._millis % 1000);
		},

		minutes: function () {
			return this.rounder((this._millis % (3600 * 1000)) / (60 * 1000));
		},

		seconds: function () {
			return this.rounder((this._millis % 60000) / 1000);
		},

		totalDays: function () {
			return this._millis / (24 * 3600 * 1000);
		},

		totalHours: function () {
			return this._millis / (3600 * 1000);
		},

		totalMinutes: function () {
			return this._millis / (60 * 1000);
		},

		totalSeconds: function () {
			return this._millis / 1000;
		},

		totalMilliseconds: function () {
			return this._millis;
		},

		toString: function () {
			return (this._millis < 0 ? "-" : "") + (Math.abs(this.days()) ? ch.TimeSpan.pad(Math.abs(this.days())) + "." : "") + ch.TimeSpan.pad(Math.abs(this.hours())) + ":" + ch.TimeSpan.pad(Math.abs(this.minutes())) + ":" + ch.TimeSpan.pad(Math.abs(this.seconds())) + "." + Math.abs(this.milliseconds());
		}
	};

	ch.TimeSpan.pad = function (number) { return (number < 10 ? '0' : '') + number; };
})(ch);
