(function() { "use strict"; angular.module('shared') .filter('duration', [ function() { return function (units, unitType, atomType) { var conversionChain = [ { label: 'milliseconds', display: 'Millisecond', degree: 1000 }, { label: 'seconds', display: 'Second', degree: 60 }, { label: 'minutes', display: 'Minute', degree: 60 }, { label: 'hours', display: 'Hour', degree: 24 }, { label: 'days', display: 'Day' } ]; var unitConversionIndex = findIndexByLabel(unitType || 'seconds'); var atomIndex = atomType ? findIndexByLabel(atomType) : unitConversionIndex; if(unitConversionIndex === -1 || atomIndex === -1) { throw new Error('type not recognized'); } return buildDurationText(units, unitConversionIndex, atomIndex); function findIndexByLabel(unitType){ for(var i = 0; i < conversionChain.length; ++i){ if(conversionChain[i].label === unitType){ return i; } } return -1; } function buildDurationText(units, unitConversionIndex, atomIndex){ var atoms = reduceToAtoms(units, unitConversionIndex, atomIndex); var highestUnitIndex = Math.max(findHighestUnitIndex(atoms, atomIndex), 0); var durationParts = []; for(var i = highestUnitIndex, atomsRemaining = atoms; i >= atomIndex; --i){ var target = toTarget(atomsRemaining, i, atomIndex); durationParts.push(displayUnits(target.units, conversionChain[i].display)); atomsRemaining = target.remainder; } return durationParts.join(' '); } function reduceToAtoms(units, unitConversionIndex, atomIndex){ var i = 0; if(unitConversionIndex < atomIndex){ for(i = unitConversionIndex; i < atomIndex; ++i){ units /= conversionChain[i].degree; } } if(unitConversionIndex > atomIndex){ for(i = unitConversionIndex - 1; i >= atomIndex; --i){ units *= conversionChain[i].degree; } } return Math.floor(units); } function findHighestUnitIndex(atoms, atomIndex){ for(var i = atomIndex, units = atoms; i < conversionChain.length; ++i){ var conversion = conversionChain[i]; if(!conversion.degree){ return i; } units /= conversion.degree; if(Math.floor(units) === 0){ return i; } } return i; } function toTarget(atoms, targetIndex, atomIndex){ var multiplicity = 1; for(var i = atomIndex; i < targetIndex; ++i){ multiplicity *= conversionChain[i].degree; } return { units: Math.floor(atoms / multiplicity), remainder: atoms % multiplicity }; } function displayUnits(quantity, displayLabel){ displayLabel = quantity !== 1 ? displayLabel + 's' : displayLabel; return quantity + ' ' + displayLabel; } } }]) })();