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: '=',
fieldId : "@",
futureValidationDate : "=",
label : "@"
},
link: function(scope, elem, attrs, ngModelCtrl) {
var inputArea = elem.find('input');

scope.$watch('ngModel', function(){
var time = new Date("12/12/1212 " + scope.ngModel);
var hours = time.getHours();
var minutes = time.getMinutes();

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

var validator = function(value) {
var isValidPattern = isFormattedTime(value);
ngModelCtrl.$setValidity('pattern', isValidPattern || scope.ngDisabled || !value);
if(scope.futureValidationDate) {
ngModelCtrl.$setValidity('future', !futureTime(scope.futureValidationDate, value));
}
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.$watch('ngDisabled', function (newVal) {
validator(scope.ngModel);
}, true);

scope.$watch("futureValidationDate", function(newVal){
if(newVal){
ngModelCtrl.$setValidity('future', !futureTime(newVal, scope.ngModel));
} else {
ngModelCtrl.$setValidity('future', true);
}
});

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

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 = /^(0[1-9]?|1[0-2]?)?$/;
var minuteRegExp = /^([0-5][0-9]?)?$/;
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: 'modules/ui-components/form/controls/composite/input-time-picker/time-control_template.html'
};
});

var isFormattedTime = function (timeString) {
return /^(0[1-9]|1[0-2])\:([0-5][0-9]) ([APap][Mm])$/.test(timeString);
};

var futureTime = function (date, time) {
var inputTime = new Date(date + " " + time);
var today = new Date();
return /^(\d{2})\:(\d{2}) (AM|PM|am|pm)$/.test(time) && inputTime.toString() !== "Invalid Date" && inputTime > today;
};
});