Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

define(['angular'], function (angular) {
"use strict";

angular.module('TimeControls', [])
.directive('timeControl', function ($timeout, formatter) {
return {
restrict: 'AE',
require: 'ngModel',
scope: {
ngModel : "=",
ngReadonly: '=',
ngRequired: '=',
ngDisabled: '=',
ngShow: '=',
fieldId : "@",
label : "@",
increment: '=?',
incremFive: "=?",
isMilitary: '=?',
showLabel: "=?"
},
link: function(scope, elem, attrs, ngModelCtrl) {
scope.ngModel = scope.ngModel || "";

var inputArea = elem.find('input');

if(scope.incremFive) {
scope.increment = 5;
scope.$watch('ngModel', function(){
var time = new Date("12/12/1212 " + scope.ngModel);
var hours = time.getHours();
var minutes = 5*Math.floor(time.getMinutes()/5);

if (isFormattedTime(scope.ngModel, scope.isMilitary)) {
scope.ngModel = scope.isMilitary ? formatter.getFormattedMilitaryTime(hours + ":" + minutes) : formatter.getFormattedFrontendTime(hours + ":" + minutes);
}
});
}

var validator = function(value) {
var isValidPattern = isFormattedTime(value, scope.isMilitary);
ngModelCtrl.$setValidity('pattern', isValidPattern || scope.ngDisabled || value !== false);

return value;
};
ngModelCtrl.$parsers.push(validator);
ngModelCtrl.$formatters.push(validator);

var label = (scope.label.lastIndexOf(":") === scope.label.length - 1)?
scope.label.substr(0, scope.label.length - 1) : scope.label;

scope.errorHandling = {
'required' : {
message : label + ' field is required.',
priority : 1
},
'pattern' : {
message: label + (scope.isMilitary ? " must be formatted HH:MM." : " must be formatted HH:MM (AM/PM)."),
priority: 2
},
'future' : {
message: label + " cannot be a future time.",
priority: 3
}
};

scope.$watch('ngDisabled', function (newVal) {
validator(scope.ngModel);
}, true);


var tokenizeTimeString = function(timeString){
var tokens;
var timeSplit;
if(timeString !== undefined && timeString !== null){
var start = 0;
var end = timeString.indexOf(":");

tokens = ["", "", "", "", ""];

if(end === -1) {
end = timeString.length;
} else {
tokens[1] = ":";
}

end = end - start > 2 ? 2 : end - start;

tokens[0] = timeString.substr(start, end);

start = start + end + (tokens[1] === ":" ? 1 : 0);
end = timeString.indexOf(" ");

if(end === -1) {
end = timeString.length
} else {
tokens[3] = " ";
}

end = end - start > 2 ? 2 : end - start;

tokens[2] = timeString.substr(start, end);

tokens[4] = timeString.substr(start + end + (tokens[3] === " " ? 1 : 0), 2);

}

return tokens || ["", "", "", "", ""];
};


var prevTimeTokens = tokenizeTimeString(scope.ngModel);

var hourRegExp = scope.isMilitary ? /^([0-1][0-9]?|2[0-3]?)?$/ : /^(0[1-9]?|1[0-2]?)?$/;
var minuteRegExp = !scope.incremFive ? /^([0-5][0-9]?)?$/ : /^([0-5][05]?)?$/;
var periodRegExp = /^([APap][Mm]?)?$/;

var selectionStart = inputArea[0].selectionStart;
var selectionEnd = inputArea[0].selectionEnd;

scope.onChange = function(){
var timeTokens = tokenizeTimeString(scope.ngModel);
var prevTime = prevTimeTokens.join("");
var formattedTime = "";

if(hourRegExp.test(timeTokens[0])) {
formattedTime += timeTokens[0];
} else {
formattedTime += prevTimeTokens[0];
}

if(timeTokens[1] === "" && prevTimeTokens[1] === ":" && timeTokens[2] === "" && timeTokens[0].length <= 3
|| timeTokens[1] === ":" && hourRegExp.test(timeTokens[0]) && timeTokens[0].length === 2) {
formattedTime += timeTokens[1];
} else {
formattedTime += prevTimeTokens[1];
}
if(formattedTime.lastIndexOf(":") !== -1) {
if(minuteRegExp.test(timeTokens[2])){
formattedTime += timeTokens[2];
} else {
formattedTime += prevTimeTokens[2];
}
}

if(timeTokens[3] === "" && prevTimeTokens[3] === " " && timeTokens[4] === "" && timeTokens[0].length <= 3
|| timeTokens[3] === " " && minuteRegExp.test(timeTokens[2]) && timeTokens[2].length === 2) {
formattedTime += timeTokens[3];
} else {
formattedTime += prevTimeTokens[3];
}

if(formattedTime.lastIndexOf(" ") !== -1) {
if(periodRegExp.test(timeTokens[4])) {
formattedTime += timeTokens[4];
} else {
formattedTime += prevTimeTokens[4];
}
}

prevTimeTokens = tokenizeTimeString(formattedTime);
scope.ngModel = formattedTime;

if(prevTime === formattedTime && formattedTime !== "") {
$timeout(function(){
inputArea[0].setSelectionRange(selectionStart, selectionEnd);
});
}
};

scope.onKeydown = function(e) {
selectionStart = inputArea[0].selectionStart;
selectionEnd = inputArea[0].selectionEnd;
};



},
templateUrl: 'src/ui-components/form/controls/composite/input-time-picker/time-control_template.html'
};
});

var isFormattedTime = function (timeString, isMilitary) {
var timeRegex = isMilitary ? /^([0-1][0-9]|2[0-3])\:([0-5][0-9])$/ : /^(0[1-9]|1[0-2])\:([0-5][0-9]) ([ap]m)$/i;
return timeRegex.test(timeString);
};

var futureTime = function (date, time, isMilitary) {
var inputTime = new Date(date + " " + time);
var today = new Date();
var timeRegex = isMilitary ? /^(\d{2})\:(\d{2})$/ : /^(\d{2})\:(\d{2}) ([ap]m)$/i;
return timeRegex.test(time) && inputTime.toString() !== "Invalid Date" && inputTime > today;
};
});