function moneyFormatterFilter(){return function(n,t,i){var r,u,f;return n==null?n:(n=Math.floor(n*100)/100,t=t||"",r=t+" ",i&&(u=Math.floor(n),f=n-u,f===0))?r+u.toLocaleString()+".-":r+n.toLocaleString({},{minimumFractionDigits:2})}}(function(){"use strict";addExtraModules("app",["ui.bootstrap","ngResource","hro.directives","ngRoute","LocalStorageModule","angularPayments","topBarModule"]);angular.module("app").config(["$tooltipProvider",function(n){n.setTriggers({openBasketTooltip:"closeBasketTooltip"})}]).run(["$rootScope","currentChannel","$window",function(n,t,i){var r=i.document.title;n.$on("$routeChangeSuccess",function(n,u){i.document.title=u&&u.data&&u.data.title?u.data.title+" | "+t.name:r})}])})();angular.module("hro.directives").directive("formControl",[function(){return{require:["ngModel","^hroFormGroupWithFieldValidation","^form"],link:function(n,t,i,r){r[1].setField(r[0]);r[1].setForm(r[2]);t.addClass("form-control")}}}]);angular.module("hro.directives").directive("hroInputValidation",["$compile",function(n){return{restrict:"A",replace:!1,terminal:!0,priority:1e3,link:function(t,i){i.attr("form-control","");i.attr("hro-model-onblur","");i.removeAttr("hro-input-validation");i.removeAttr("data-hro-input-validation");n(i)(t)}}}]);angular.module("hro.directives").directive("hroFormGroupWithFieldValidation",["bsErrorMessages",function(n){return{restrict:"EA",transclude:!0,templateUrl:"/Angular/form/form-group.html",replace:!0,scope:{label:"@",errorMessages:"="},controller:["$scope","$element","$attrs",function(t){function i(n,i){t.$fieldErrors=[];t.$fieldsErrors[i]=[];angular.forEach(n,function(n,r){n&&t.$fieldsErrors[i].push(r)});angular.forEach(t.$fieldsErrors,function(n){angular.forEach(n,function(n){t.$fieldErrors.indexOf(n)===-1&&t.$fieldErrors.push(n)})})}t.$errorMessages=t.errorMessages?angular.copy(t.errorMessages):{};t.$errorMessages=angular.extend(angular.copy(n),t.$errorMessages);t.$fields=[];t.$fieldsErrors=[];this.setField=function(n){t.$fields.push(n);t.$fieldsErrors.push([]);var r=t.$fields.length-1;t.$watch("($fields["+r+"].$dirty || $form.$submitted) && $fields["+r+"].$error",function(n){i(n,r)},!0)};this.setForm=function(n){t.$form=n}}]}}]);angular.module("hro.directives").directive("showMore",[function(){return{templateUrl:"/Angular/form/show-more.html",restrict:"A",transclude:!0,scope:{showMoreHeight:"@"},controller:["$scope","$element","$interval",function(n,t,i){function r(){t.height()>=n.showMoreHeight&&n.expanded===!1&&(n.expandable=!0)}n.expanded=!1;i(function(){r()},300);n.expandable=!1;n.showLessStyle={"max-height":n.showMoreHeight+"px",overflow:"hidden"}}]}}]);angular.module("hro.directives").factory("bsErrorMessages",function(){return{required:"This field is required",email:"This field has to be a valid email address",url:"This field has to be a valid URL",number:"This field has to be a number",equals:"The value is not the same",card:"The card number is not valid",expiry:"The expiration date is not valid",cvc:"The cvc is not valid",taxNumberIsCorrect:"tax.number.validation"}});angular.module("hro.directives").filter("moneyFormatter",moneyFormatterFilter);angular.module("angularPayments",[]);angular.module("angularPayments").factory("Common",[function(){var n={};return n.parseExpiry=function(n){var i,r,t,u;return n=n||"",n=n.replace(/\s/g,""),u=n.split("/",2),i=u[0],t=u[1],(t!=null?t.length:void 0)===2&&/^\d+$/.test(t)&&(r=(new Date).getFullYear(),r=r.toString().slice(0,2),t=r+t),i=parseInt(i,10),t=parseInt(t,10),{month:i,year:t}},n}]);angular.module("angularPayments").factory("Cards",[function(){var n=/(\d{1,4})/g,t=/(?:^|\s)(\d{4})$/,i=[{type:"maestro",pattern:/^(5018|5020|5038|6304|6759|676[1-3])/,format:n,inputFormat:t,length:[12,13,14,15,16,17,18,19],cvcLength:[3],luhn:!0},{type:"dinersclub",pattern:/^(36|38|30[0-5])/,format:n,inputFormat:t,length:[14],cvcLength:[3],luhn:!0},{type:"laser",pattern:/^(6706|6771|6709)/,format:n,inputFormat:t,length:[16,17,18,19],cvcLength:[3],luhn:!0},{type:"jcb",pattern:/^35/,format:n,inputFormat:t,length:[16],cvcLength:[3],luhn:!0},{type:"unionpay",pattern:/^62/,format:n,inputFormat:t,length:[16,17,18,19],cvcLength:[3],luhn:!1},{type:"discover",pattern:/^(6011|65|64[4-9]|622)/,format:n,inputFormat:t,length:[16],cvcLength:[3],luhn:!0},{type:"mastercard",pattern:/^5[1-5]/,format:n,inputFormat:t,length:[16],cvcLength:[3],luhn:!0},{type:"amex",pattern:/^3[47]/,format:/(\d{1,4})(\d{1,6})?(\d{1,5})?/,inputFormat:/^(\d{4}|\d{4}\s\d{6})$/,length:[15],cvcLength:[3,4],luhn:!0},{type:"visa",pattern:/^4/,format:n,inputFormat:t,length:[13,14,15,16],cvcLength:[3],luhn:!0}],r=function(n){var r,t,u;for(n=(n+"").replace(/\D/g,""),t=0,u=i.length;t<u;t++)if(r=i[t],r.pattern.test(n))return r},u=function(n){for(var r,t=0,u=i.length;t<u;t++)if(r=i[t],r.type===n)return r};return{fromNumber:function(n){return r(n)},fromType:function(n){return u(n)},defaultFormat:function(){return n},defaultInputFormat:function(){return t}}}]);angular.module("angularPayments").factory("_Format",["Cards","Common","$filter",function(n,t,i){var r={},u=function(n){var t;return n.prop("selectionStart")!=null&&n.prop("selectionStart")!==n.prop("selectionEnd")?!0:(typeof document!="undefined"&&document!==null?(t=document.selection)!=null?typeof t.createRange=="function"?t.createRange().text:void 0:void 0:void 0)?!0:!1},s=function(t){var u,f,r,s,e,o,i;if(r=String.fromCharCode(t.which),u=angular.element(t.currentTarget),i=u.val(),f=n.fromNumber(i+r),s=(i.replace(/\D/g,"")+r).length,o=16,f&&(o=f.length[f.length.length-1]),!(s>=o)){if(!/^\d+$/.test(r)&&!t.meta&&t.keyCode>=46){t.preventDefault();return}if(u.prop("selectionStart")==null||u.prop("selectionStart")===i.length)return(e=n.defaultInputFormat(),f&&(e=f.inputFormat),e.test(i))?(t.preventDefault(),u.val(i+" "+r)):e.test(i+r)?(t.preventDefault(),u.val(i+r+" ")):void 0}},h=function(t){var f,i,e,r;(f=angular.element(t.currentTarget),e=String.fromCharCode(t.which),/^\d+$/.test(e))&&(u(f)||(r=(f.val()+e).replace(/\D/g,""),i=n.fromNumber(r),i?r.length<=i.length[i.length.length-1]||t.preventDefault():r.length<=16||t.preventDefault()))},c=function(n){var t,i;if(t=angular.element(n.currentTarget),i=t.val(),!n.meta)return n.which!==8?void 0:t.prop("selectionStart")!=null&&t.prop("selectionStart")!==i.length?void 0:/\d\s$/.test(i)&&!n.meta&&n.keyCode>=46?(n.preventDefault(),t.val(i.replace(/\d\s$/,""))):/\s\d?$/.test(i)?(n.preventDefault(),t.val(i.replace(/\s\d?$/,""))):void 0},f=function(t){var i,r,u,f;return(i=n.fromNumber(t),!i)?t:(u=i.length[i.length.length-1],t=t.replace(/\D/g,""),t=t.slice(0,+u+1||9e9),i.format.global?(f=t.match(i.format))!=null?f.join(" "):void 0:(r=i.format.exec(t),r!=null&&r.shift(),r!=null?r.join(" "):void 0))},l=function(n){return setTimeout(function(){var i,t;return i=angular.element(n.target),t=i.val(),t=f(t),i.val(t)})},a=function(n){return n!=null?n.replace(/\s/g,""):n},e,o;return r.card=function(n,t){n.bind("keypress",h);n.bind("keypress",s);n.bind("keydown",c);n.bind("paste",l);t.$parsers.push(a);t.$formatters.push(f)},_formatCVC=function(n){if($target=angular.element(n.currentTarget),digit=String.fromCharCode(n.which),!/^\d+$/.test(digit)&&!n.meta&&n.keyCode>=46){n.preventDefault();return}if(val=$target.val()+digit,!(val.length<=4)){n.preventDefault();return}},r.cvc=function(n){n.bind("keypress",_formatCVC)},_restrictExpiry=function(n){var i,r,t;if(i=angular.element(n.currentTarget),r=String.fromCharCode(n.which),!/^\d+$/.test(r)&&!n.meta&&n.keyCode>=46){n.preventDefault();return}if(!u(i)&&(t=i.val()+r,t=t.replace(/\D/g,""),t.length>6)){n.preventDefault();return}},_formatExpiry=function(n){var i,r,t;if(r=String.fromCharCode(n.which),!/^\d+$/.test(r)&&!n.meta&&n.keyCode>=46){n.preventDefault();return}return(i=angular.element(n.currentTarget),t=i.val()+r,/^\d$/.test(t)&&t!=="0"&&t!=="1")?(n.preventDefault(),i.val("0"+t+" / ")):/^\d\d$/.test(t)?(n.preventDefault(),i.val(""+t+" / ")):void 0},_formatForwardExpiry=function(n){var t,r,i;if(r=String.fromCharCode(n.which),/^\d+$/.test(r)||n.meta||!(n.keyCode>=46))return t=angular.element(n.currentTarget),i=t.val(),/^\d\d$/.test(i)?t.val(""+i+" / "):void 0},_formatForwardSlash=function(n){var i,r,t;if(r=String.fromCharCode(n.which),r==="/")return i=angular.element(n.currentTarget),t=i.val(),/^\d$/.test(t)&&t!=="0"?i.val("0"+t+" / "):void 0},_formatBackExpiry=function(n){var t,i;if(!n.meta)return(t=angular.element(n.currentTarget),i=t.val(),n.which!==8)?void 0:t.prop("selectionStart")!=null&&t.prop("selectionStart")!==i.length?void 0:/\d(\s|\/)+$/.test(i)?(n.preventDefault(),t.val(i.replace(/\d(\s|\/)*$/,""))):/\s\/\s?\d?$/.test(i)?(n.preventDefault(),t.val(i.replace(/\s\/\s?\d?$/,""))):void 0},e=function(n){if(n!=null){var r=t.parseExpiry(n),u=new Date(r.year,r.month-1);return i("date")(u,"MM/yyyy")}return null},o=function(n){if(n!=null){var r=t.parseExpiry(n),u=new Date(r.year,r.month-1);return i("date")(u,"MM / yyyy")}return null},r.expiry=function(n,t){n.bind("keypress",_restrictExpiry);n.bind("keypress",_formatExpiry);n.bind("keypress",_formatForwardSlash);n.bind("keypress",_formatForwardExpiry);n.bind("keydown",_formatBackExpiry);t.$parsers.push(e);t.$formatters.push(o)},function(n,t,i){if(!r[n]){types=Object.keys(r);errstr='Unknown type for formatting: "'+n+'". '+('Should be one of: "'+types.join('", "')+'"');throw errstr;}return r[n](t,i)}}]).directive("paymentsFormat",["$window","_Format",function(n,t){return{restrict:"A",require:"ngModel",link:function(n,i,r,u){t(r.paymentsFormat,i,u)}}}]);angular.module("angularPayments").factory("_Validate",["Cards","Common","$parse",function(n,t,i){var u=[].indexOf||function(n){for(var t=0,i=this.length;t<i;t++)if(t in this&&this[t]===n)return t;return-1},f=function(n){var t,r,u,f,i,e;for(u=!0,f=0,r=(n+"").split("").reverse(),i=0,e=r.length;i<e;i++)t=r[i],t=parseInt(t,10),(u=!u)&&(t*=2),t>9&&(t-=9),f+=t;return f%10==0},r={};return r.cvc=function(t,r,f,e){var s,h,o,c;return t==null||t.length==0?!0:/^\d+$/.test(t)?(e.paymentsTypeModel&&(c=i(e.paymentsTypeModel),o=c(f)),o?(s=t.length,u.call((h=n.fromType(o))!=null?h.cvcLength:void 0,s)>=0):t.length>=3&&t.length<=4):!1},r.card=function(t,r,e,o){var s,l,h,c;return(o.paymentsTypeModel&&(h=i(o.paymentsTypeModel)),c=function(){h&&h.assign(e,null);r.$card=null},t==null||t.length==0)?(c(),!0):(t=(t+"").replace(/\s+|-/g,""),!/^\d+$/.test(t))?(c(),!1):(s=n.fromNumber(t),!s)?(c(),!1):(r.$card=angular.copy(s),h&&h.assign(e,s.type),ret=(l=t.length,u.call(s.length,l)>=0)&&(s.luhn===!1||f(t)))},r.expiry=function(n){if(n==null||n.length==0)return!0;obj=t.parseExpiry(n);month=obj.month;year=obj.year;var u,i,r;return(month&&year)?/^\d+$/.test(month)?/^\d+$/.test(year)?(parseInt(month,10)<=12)?(year.length===2&&(r=(new Date).getFullYear(),r=r.toString().slice(0,2),year=r+year),i=new Date(year,month),u=new Date,i.setMonth(i.getMonth()-1),i.setMonth(i.getMonth()+1,1),i>u&&year<=2050):!1:!1:!1:!1},function(n,t,i,u,f){if(!r[n]){types=Object.keys(r);errstr='Unknown type for validation: "'+n+'". '+('Should be one of: "'+types.join('", "')+'"');throw errstr;}return r[n](t,i,u,f)}}]).factory("_ValidateWatch",["_Validate",function(n){var t={};return t.cvc=function(t,i,r,u){u.paymentsTypeModel&&r.$watch(u.paymentsTypeModel,function(f,e){if(f!=e){var o=n(t,i.$modelValue,i,r,u);i.$setValidity(t,o)}})},function(n,i,r,u){if(t[n])return t[n](n,i,r,u)}}]).directive("paymentsValidate",["$window","_Validate","_ValidateWatch",function(n,t,i){return{restrict:"A",require:"ngModel",link:function(n,r,u,f){var e=u.paymentsValidate,o;i(e,f,n,u);o=function(i){var r=t(e,i,f,n,u);return f.$setValidity(e,r),r?i:undefined};f.$formatters.push(o);f.$parsers.push(o)}}}]);angular.module("angularPayments").directive("stripeForm",["$window","$parse","Common",function(n,t,r){return _getDataToSend=function(n){var t=["number","expMonth","expYear","cvc","name","addressLine1","addressLine2","addressCity","addressState","addressZip","addressCountry"],u=function(n){return n.replace(/([A-Z])/g,function(n){return"_"+n.toLowerCase()})},r={};for(i in t)t.hasOwnProperty(i)&&(r[u(t[i])]=angular.copy(n[t[i]]));return r.number=(r.number||"").replace(/ /g,""),r},{restrict:"A",link:function(t,i,u){if(!n.Stripe)throw"stripeForm requires that you have stripe.js installed. Include https://js.stripe.com/v2/ into your html.";var f=angular.element(i);f.bind("submit",function(){expMonthUsed=t.expMonth?!0:!1;expYearUsed=t.expYear?!0:!1;expMonthUsed&&expYearUsed||(exp=r.parseExpiry(t.expiry),t.expMonth=exp.month,t.expYear=exp.year);var i=f.find("button");i.prop("disabled",!0);f.hasClass("ng-valid")?n.Stripe.createToken(_getDataToSend(t),function(){var n=arguments;t.$apply(function(){t[u.stripeForm].apply(t,n)});i.prop("disabled",!1)}):(t.$apply(function(){t[u.stripeForm].apply(t,[400,{error:"Invalid form submitted."}])}),i.prop("disabled",!1));t.expMonth=null;t.expYear=null})}}}]);var VatCalculationModes={Normal:1,VatShifted:2,VatFree:3,DisplayValue:function(n){var t="";switch(n){case 1:t="Normal";break;case 2:t="VatShifted";break;case 3:t="VatFree"}return Translator.Translate("VatMode - "+t)}};(function(){"use strict";function n(n){function u(i){if(t==null||i===!0){t==null&&(t={items:[]});var u=n.get("basket");return u==null?(u={items:[]},t=u,r()):t.items=u.items,t.items||(t.items=[]),t.vatCalculationMode||(t.vatCalculationMode=VatCalculationModes.Normal),t}return t}function f(){t=i.get();var n=0;return angular.forEach(t.items,function(t){t.productPrice&&t.productPrice.price&&(n+=t.productPrice.price)}),n}function e(){t=i.get();var n=0;return angular.forEach(t.items,function(t){t.productPrice&&t.productPrice.price&&(n+=t.productPrice.price)}),i.vatCalculationMode===VatCalculationModes.Normal?n+n*i.btw:n}function o(){return t=i.get(),!t.items||t.items.length==0}function s(){t=null;r()}function h(n){t=i.get(!0);var u=null;angular.forEach(t.items,function(t){t.product.globalId==n.product.globalId&&(u=t)});u!=null&&(i.removeItem(u),t=i.get());t.items.push(n);r()}function c(n){t=i.get();var u=t.items.indexOf(n);u>=0&&t.items.splice(u,1);r()}function l(n){var i=!1;return angular.forEach(t.items,function(t){if(t.product.globalId==n){i=!0;return}}),i}function a(n){var i=!1;return angular.forEach(t.items,function(t){if(t.product.parentGlobalId==n){i=!0;return}}),i}function r(){n.set("basket",t)}function v(n,t,r,u){i.vatCalculationMode=n===t?VatCalculationModes.Normal:r?u?VatCalculationModes.VatShifted:VatCalculationModes.Normal:VatCalculationModes.VatFree}var t,i={btw:HRO.CurrentChannel.vatRate,vatCalculationMode:VatCalculationModes.Normal,get:u,getTotalPrice:e,getSubTotalPrice:f,isEmpty:o,clear:s,addProduct:h,removeItem:c,containsItem:l,containsChildItem:a,detectVatCalculationMode:v};return i}angular.module("app").factory("basket",["localStorageService",n])})(),function(){"use strict";function n(n,t,i){var u=3e3,r=this;r.basket=t.get();r.tooltipMessage=i("item-was-added-to-basket");r.currentTimeout=null;r.currentCount=r.basket.length;n.$watch("vm.basket.items",function(n){r.currentCount!=undefined&&(setTimeout(function(){$("#basketButton").trigger("openBasketTooltip")},0),r.currentTimeout!=null&&clearTimeout(r.currentTimeout),r.currentTimeout=setTimeout(function(){$("#basketButton").trigger("closeBasketTooltip")},u));r.currentCount=n.length})}angular.module("app").controller("basketButtonController",["$scope","basket","translate",n])}(),function(){"use strict";function n(n,t){function i(i){var u=n("/api/shop/basket/:reference/status",{reference:"@reference"},{get:{method:"GET",isArray:!1}}),r=t.defer();return u.get({reference:i},function(n){r.resolve(n.status)},function(n){r.reject(n)}),r.promise}return{get:i}}angular.module("app").factory("basketStatus",["$resource","$q",n])}(),function(){"use strict";function n(n,t){function i(){var i=[],r=n.isUserLoggedIn();return i.push({step:"account",title:"Account",routeHash:"claim-license/login-or-register"}),(!r||n.hasClaim(t.canEditOrganisation))&&i.push({step:"organisation",title:"Company",routeHash:r?"/claim-license/existing-account/update-and-confirm-organisation":"/claim-license/new-account/organisation"}),i.push({step:"claim",title:"Claim",routeHash:r?"claim-license/existing-account/claim":"claim-license/new-account/claim"}),i}return{create:i}}angular.module("app").factory("claimLicenseWizardItemsFactory",["authenticationService","userClaims",n])}(),function(){"use strict";function n(){function n(){var n=[];return n.push({step:"account",title:"Account",routeHash:"/register/new-user"}),n.push({step:"organisation",title:"Company",routeHash:"/register/new-organisation"}),n.push({step:"finish",title:"Finish registration",routeHash:"/register/finish"}),n}return{create:n}}angular.module("app").factory("registerWizardItemsFactory",[n])}(),function(){"use strict";function n(n){function t(){var t=[];return t.push({step:"account",title:"Account",routeHash:"/register/invitation/"+n.invitationGlobalId}),t.push({step:"finish",title:"Finish registration",routeHash:"/register/finish-invitation/"+n.invitationGlobalId}),t}return{create:t}}angular.module("app").factory("invitationWizardItemsFactory",["$routeParams",n])}(),function(){"use strict";function n(n){function t(){var t=[];return t.push({step:"account",title:"Account",routeHash:"/register/organisation-invitation/"+n.invitationGlobalId}),t.push({step:"finish",title:"Finish registration",routeHash:"/register/finish-organisation-invitation/"+n.invitationGlobalId}),t}return{create:t}}angular.module("app").factory("organisationInvitationWizardItemsFactory",["$routeParams",n])}(),function(){"use strict";function n(n,t){function u(){r.save(i.data).$promise.then(function(){n.showThankYouMessage=!0}).catch(function(){n.showErrorMessage=!0})}var i=this,r;return i.data={firstName:null,lastName:null,email:null},i.save=u,n.showThankYouMessage=!1,n.showErrorMessage=!1,r=t("/api/newsletter-subscription"),i}angular.module("app").controller("newsletterSubscriptionController",["$scope","$resource",n])}(),function(){"use strict";function n(n){return{require:"form",link:function(t,i,r,u){u.$submitted=!1;var f=n(r.validSubmit);i.on("submit",function(n){t.$apply(function(){u.$submitted=!0;u.$valid&&(f(t,{$event:n}),u.$submitted=!1)})})}}}angular.module("hro.directives").directive("validSubmit",["$parse",n])}()