Created
February 2, 2015 12:15
-
-
Save grimurd/71fa65c892454edcde96 to your computer and use it in GitHub Desktop.
AngularJS Vartölu Directive
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
angular.module('moduleName') | |
.directive('ssn', function () { | |
return { | |
restrict: 'A', | |
require: 'ngModel', | |
scope: { | |
leyfaUndirAtjan: '=leyfaUndirAtjan', | |
leyfaFyrirtaeki: '=leyfaFyrirtaeki' | |
}, | |
link: function (scope, elem, attr, ctrl) { | |
var parseSSN = function (value) { | |
value = value !== undefined && value !== '' ? value : false; | |
if (!value) return false; | |
value = value.toString().replace(/[^\d.]/g, ''); | |
if (value.length < 10) return false; | |
return value; | |
} | |
var verifySSN = function (value) { | |
if (!(value = parseSSN(value))) { | |
return false; | |
} | |
var sum = 0, vartala = 0, | |
multiplies = [3, 2, 7, 6, 5, 4, 3, 2]; | |
for (var i = 0; i < multiplies.length; i++) { | |
sum += value[i] * multiplies[i]; | |
} | |
vartala = (11 - (sum % 11)); | |
vartala = vartala === 11 ? 0 : vartala; | |
var valid = vartala === parseInt(value[8], 10); | |
return valid; | |
}; | |
var convertYear = function(year) { | |
if (year.match( new RegExp( "^[01]{1}", "" ))) { | |
return( "20" + year ); | |
} else { | |
return( parseInt("19" + year)); | |
} | |
}; | |
var yfirAtjan = function(kennitala) { | |
var re = /(\d{2})(\d{2})(\d{2})/; | |
var splitDate = kennitala.match(re); | |
var y = convertYear(splitDate[3]), | |
m = splitDate[2], | |
d = splitDate[1]; | |
var ageDiff = Date.now() - new Date(y, m-1, d).getTime(); | |
var ageDate = new Date(ageDiff); | |
return Math.abs(ageDate.getUTCFullYear() - 1970) > 17 | |
}; | |
var fyrirtaeki = function(kennitala) { | |
var dags = parseInt(kennitala.substr(0, 2)); | |
if(dags > 31) { | |
return true; | |
} | |
return false; | |
}; | |
ctrl.$parsers.unshift(function(value) { | |
if(value) { | |
var valid = verifySSN(value); | |
if(scope.leyfaUndirAtjan === false) { | |
if(fyrirtaeki(value) === false) { | |
valid = valid && yfirAtjan(value); | |
} | |
} | |
if(scope.leyfaFyrirtaeki === false) { | |
valid = valid && !fyrirtaeki(value); | |
} | |
ctrl.$setValidity('vartolutekk', valid); | |
} | |
return valid ? value : undefined | |
}); | |
} | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Til að banna fyrirtækjakennitölur er hægt að gera leyfa-fyrirtaeki="false" á elementinu. Til að banna undir 18 ára er hægt að gera leyfa-undir-atjan="false" á elementinu.