{"version":3,"sources":["webpack:///../scripts/angular-jwt.js","webpack:///../scripts/albumConfirm.js","webpack:///../scripts/sx-wizard.js","webpack:///../scripts/sx-wizard-tpls.js","webpack:///../scripts/angular-base64-upload.js"],"names":["angular","module","provider","this","$get","$rootScope","$injector","$location","jwtHelper","jwtInterceptor","jwtOptions","config","getConfig","invokeToken","tokenGetter","Array","isArray","invoke","options","invokeRedirector","redirector","isFunction","Error","isAuthenticated","token","isTokenExpired","authenticate","unauthenticate","unauthenticatedRedirector","validateToken","$broadcast","has","get","onBefore","transition","route","to","router","stateService","data","requiresLogin","promise","catch","eventName","$on","event","next","routeData","$$route","preventDefault","getToken","redirect","checkAuthOnRefresh","onStart","redirectWhenUnauthenticated","tokenExpiresIn","expireDate","getTokenExpirationDate","urlParam","authHeader","authPrefix","whiteListedDomains","$q","urlUtils","extend","request","skipAuthorization","url","isSameOrigin","length","hostname","urlResolve","toLowerCase","i","domain","regexp","RegExp","match","isSafe","params","headers","when","then","responseError","response","status","reject","service","$window","urlBase64Decode","str","output","replace","decodeURIComponent","escape","atob","decodeToken","parts","split","decoded","fromJson","exp","d","Date","setUTCSeconds","offsetSeconds","valueOf","globalConfig","value","loginPath","unauthenticatedRedirectPath","path","JwtOptions","prototype","urlParsingNode","document","createElement","originUrl","window","location","href","setAttribute","protocol","host","search","hash","port","pathname","charAt","requestUrl","parsed","isString","controller","$scope","$uibModalInstance","copy","ok","closeMessage","close","customButtonClick","customButtonObj","cancel","dismissMessage","isUndefined","dismiss","template","defaultLabels","title","factory","$uibModal","$confirmModalDefaults","settings","defaults","resolve","size","open","result","directive","$confirm","$timeout","priority","restrict","scope","customButtonObj2","customButtonText","customButtonText2","showCustomButton","showCustomButton2","confirmIf","ngClick","confirm","confirmSettings","confirmTitle","confirmOk","confirmCancel","link","element","onSuccess","rawEl","indexOf","type","model","$setViewValue","checked","$render","unbind","bind","$event","text","$apply","$http","$templateCache","$wizardConsts","$new","opts","$wizard","wizard","_steps","_stepsOrder","_stepTemplatePromises","_options","successing","$data","$step","$isLastStep","callback","backdrop","templateUrl","shadow","addStep","step","id","noop","parameters","push","cache","_getTemplatePromise","success","self","all","$steps","$stepsOrder","$log","$current","_title","_finishTitle","finishTitle","_history","_entering","_leaving","_shadow","_cclass","cclass","$watch","$context","index","navigation","showFinish","showFinishButton","_showFinishButton","nv","ov","_disableNextButton","_disableFinishButton","_onLeaving","Number","MAX_VALUE","valid","toIndex","toStep","leaving","behavior","toStepId","forward","apply","$controller","_onEntering","fromIndex","fromStep","entering","fromStepId","entered","goById","stepOrId","isPrevious","$constants","finishStepId","pop","go","nextStepId","previous","showShadow","isLeaving","hideShadow","$compile","$init","$showShadow","$hideShadow","attributes","controllers","_stepElements","forEach","templateScope","steps","currentStepId","buttons","fn","_","append","templateElement","find","contents","stepElement","attr","show","hide","run","put","undefined","_arrayBufferToBase64","buffer","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","btoa","isolateScope","onChange","onAfterValidate","parser","FILE_READER_EVENTS","require","elem","attrs","ngModel","rawFiles","fileObjects","on","e","target","files","promises","deferredObj","defer","_setViewValue","reader","FileReader","file","fileObject","filetype","filename","name","filesize","_attachEventHandlers","readAsArrayBuffer","_readFiles","_onChange","_onAfterValidate","$isEmpty","val","base64","_clearInput","$viewValue","fReader","_attachHandlerForEvent","onload","exceedsMaxSize","maxsize","doNotParseIfOversize","fileObj","_readerOnLoad","handler","newVal","multiple","max","parseFloat","$setValidity","_maxsize","min","minsize","_minsize","maxnum","parseInt","_maxnum","minnum","_minnum","regExp","fileExt","accept","trim","test","_accept"],"mappings":"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","file":"scripts.js","sourcesContent":["import moment from \"moment\";\n(function() {\n\n\n// Create all modules and define dependencies to make sure they exist\n// and are loaded in the correct order to satisfy dependency injection\n// before all nested files are concatenated by Grunt\n\n// Modules\nangular.module(\"angular-jwt\",\n [\n \"angular-jwt.options\",\n \"angular-jwt.interceptor\",\n \"angular-jwt.jwt\",\n \"angular-jwt.authManager\"\n ]);\n\nangular.module(\"angular-jwt.authManager\", [])\n .provider(\"authManager\", function () {\n\n this.$get = [\"$rootScope\", \"$injector\", \"$location\", \"jwtHelper\", \"jwtInterceptor\", \"jwtOptions\", function ($rootScope, $injector, $location, jwtHelper, jwtInterceptor, jwtOptions) {\n\n var config = jwtOptions.getConfig();\n\n function invokeToken(tokenGetter) {\n var token = null;\n if (Array.isArray(tokenGetter)) {\n token = $injector.invoke(tokenGetter, this, {options: null});\n } else {\n token = tokenGetter();\n }\n return token;\n }\n\n function invokeRedirector(redirector) {\n if (Array.isArray(redirector) || angular.isFunction(redirector)) {\n return $injector.invoke(redirector, config, {});\n } else {\n throw new Error(\"unauthenticatedRedirector must be a function\");\n }\n }\n\n function isAuthenticated() {\n var token = invokeToken(config.tokenGetter);\n if (token) {\n return !jwtHelper.isTokenExpired(token);\n }\n }\n\n $rootScope.isAuthenticated = false;\n\n function authenticate() {\n $rootScope.isAuthenticated = true;\n }\n\n function unauthenticate() {\n invokeRedirector(config.unauthenticatedRedirector);\n \n $rootScope.isAuthenticated = false;\n }\n\n function tokenExpiresIn(){\n \n var token = invokeToken(config.tokenGetter);\n var expireDate = jwtHelper.getTokenExpirationDate(token);\n \n return moment().to(expireDate);\n }\n\n function validateToken() {\n var token = invokeToken(config.tokenGetter);\n if (token) {\n if (!jwtHelper.isTokenExpired(token)) {\n authenticate();\n } else {\n $rootScope.$broadcast(\"tokenHasExpired\", token);\n }\n }\n }\n\n function checkAuthOnRefresh() {\n if ($injector.has(\"$transitions\")) {\n var $transitions = $injector.get(\"$transitions\");\n $transitions.onStart({}, validateToken);\n } else {\n $rootScope.$on(\"$locationChangeStart\", validateToken);\n }\n }\n\n function redirectWhenUnauthenticated() {\n $rootScope.$on(\"unauthenticated\", function () {\n invokeRedirector(config.unauthenticatedRedirector);\n unauthenticate();\n });\n }\n\n function verifyRoute(event, next) {\n if (!next) {\n return false;\n }\n\n var routeData = (next.$$route) ? next.$$route : next.data;\n\n if (routeData && routeData.requiresLogin === true && !isAuthenticated()) {\n event.preventDefault();\n invokeRedirector(config.unauthenticatedRedirector);\n }\n }\n\n function verifyState(transition) {\n var route = transition.to();\n var $state = transition.router.stateService;\n if (route && route.data && route.data.requiresLogin === true && !isAuthenticated()) {\n // Ensure that transition processing is finished before calling redirector\n transition.promise.catch(function (data) {\n invokeRedirector(config.unauthenticatedRedirector);\n });\n\n // Simple \"return false` can be done here, but throwing string results in helpful error\n // message being logged by ui-router trace instead of generic \"Hook aborted transition\"\n throw \"JWT: unauthenticated\";\n }\n }\n\n if ($injector.has(\"$transitions\")) {\n var $transitions = $injector.get(\"$transitions\");\n $transitions.onBefore({}, verifyState);\n } else {\n var eventName = ($injector.has(\"$state\")) ? \"$stateChangeStart\" : \"$routeChangeStart\";\n $rootScope.$on(eventName, verifyRoute);\n }\n\n return {\n authenticate: authenticate,\n unauthenticate: unauthenticate,\n getToken: function(){ return invokeToken(config.tokenGetter); },\n redirect: function() { return invokeRedirector(config.unauthenticatedRedirector); },\n checkAuthOnRefresh: checkAuthOnRefresh,\n redirectWhenUnauthenticated: redirectWhenUnauthenticated,\n isAuthenticated: isAuthenticated,\n tokenExpiresIn:tokenExpiresIn\n };\n }];\n });\n\nangular.module(\"angular-jwt.interceptor\", [])\n .provider(\"jwtInterceptor\", function() {\n\n this.urlParam;\n this.authHeader;\n this.authPrefix;\n this.whiteListedDomains;\n this.tokenGetter;\n\n var config = this;\n\n this.$get = [\"$q\", \"$injector\", \"$rootScope\", \"urlUtils\", \"jwtOptions\", function($q, $injector, $rootScope, urlUtils, jwtOptions) {\n\n var options = angular.extend({}, jwtOptions.getConfig(), config);\n\n function isSafe (url) {\n if (!urlUtils.isSameOrigin(url) && !options.whiteListedDomains.length) {\n throw new Error(\"As of v0.1.0, requests to domains other than the application\\'s origin must be white listed. Use jwtOptionsProvider.config({ whiteListedDomains: [] }); to whitelist.\");\n }\n var hostname = urlUtils.urlResolve(url).hostname.toLowerCase();\n for (var i = 0; i < options.whiteListedDomains.length; i++) {\n var domain = options.whiteListedDomains[i];\n var regexp = domain instanceof RegExp ? domain : new RegExp(domain, \"i\");\n if (hostname.match(regexp)) {\n return true;\n }\n }\n\n if (urlUtils.isSameOrigin(url)) {\n return true;\n }\n\n return false;\n }\n\n return {\n request: function (request) {\n if (request.skipAuthorization || !isSafe(request.url)) {\n return request;\n }\n\n if (options.urlParam) {\n request.params = request.params || {};\n // Already has the token in the url itself\n if (request.params[options.urlParam]) {\n return request;\n }\n } else {\n request.headers = request.headers || {};\n // Already has an Authorization header\n if (request.headers[options.authHeader]) {\n return request;\n }\n }\n\n var tokenPromise = $q.when($injector.invoke(options.tokenGetter, this, {\n options: request\n }));\n\n return tokenPromise.then(function(token) {\n if (token) {\n if (options.urlParam) {\n request.params[options.urlParam] = token;\n } else {\n request.headers[options.authHeader] = options.authPrefix + token;\n }\n }\n return request;\n });\n },\n responseError: function (response) {\n // handle the case where the user is not authenticated\n if (response.status === 401) {\n $rootScope.$broadcast(\"unauthenticated\", response);\n }\n return $q.reject(response);\n }\n };\n }];\n });\n\n angular.module(\"angular-jwt.jwt\", [])\n .service(\"jwtHelper\", [\"$window\", function($window) {\n\n this.urlBase64Decode = function(str) {\n var output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0: { break; }\n case 2: { output += \"==\"; break; }\n case 3: { output += \"=\"; break; }\n default: {\n throw \"Illegal base64url string!\";\n }\n }\n return $window.decodeURIComponent(escape($window.atob(output))); //polyfill https://github.com/davidchambers/Base64.js\n };\n\n\n this.decodeToken = function(token) {\n var parts = token.split(\".\");\n\n if (parts.length !== 3) {\n throw new Error(\"JWT must have 3 parts\");\n }\n\n var decoded = this.urlBase64Decode(parts[1]);\n if (!decoded) {\n throw new Error(\"Cannot decode the token\");\n }\n\n return angular.fromJson(decoded);\n };\n\n this.getTokenExpirationDate = function(token) {\n \n var decoded = this.decodeToken(token);\n\n if(typeof decoded.exp === \"undefined\") {\n return null;\n }\n\n var d = new Date(0); // The 0 here is the key, which sets the date to the epoch\n d.setUTCSeconds(decoded.exp);\n\n return d;\n };\n\n this.isTokenExpired = function(token, offsetSeconds) {\n var d = this.getTokenExpirationDate(token);\n offsetSeconds = offsetSeconds || 0;\n if (d === null) {\n return false;\n }\n\n // Token expired?\n return !(d.valueOf() > (new Date().valueOf() + (offsetSeconds * 1000)));\n };\n }]);\n\nangular.module(\"angular-jwt.options\", [])\n .provider(\"jwtOptions\", function() {\n var globalConfig = {};\n this.config = function(value) {\n globalConfig = value;\n };\n this.$get = function() {\n\n var options = {\n urlParam: null,\n authHeader: \"Authorization\",\n authPrefix: \"Bearer \",\n whiteListedDomains: [],\n tokenGetter: function() {\n return null;\n },\n loginPath: \"../\",\n unauthenticatedRedirectPath: \"../\",\n unauthenticatedRedirector: [\"$location\", function($location) {\n $location.path(this.unauthenticatedRedirectPath);\n }]\n };\n\n function JwtOptions() {\n var config = this.config = angular.extend({}, options, globalConfig);\n }\n\n JwtOptions.prototype.getConfig = function() {\n return this.config;\n };\n\n return new JwtOptions();\n };\n });\n\n /**\n * The content from this file was directly lifted from Angular. It is\n * unfortunately not a public API, so the best we can do is copy it.\n *\n * Angular References:\n * https://github.com/angular/angular.js/issues/3299\n * https://github.com/angular/angular.js/blob/d077966ff1ac18262f4615ff1a533db24d4432a7/src/ng/urlUtils.js\n */\n\n angular.module(\"angular-jwt.interceptor\")\n .service(\"urlUtils\", function () {\n\n // NOTE: The usage of window and document instead of $window and $document here is\n // deliberate. This service depends on the specific behavior of anchor nodes created by the\n // browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n // cause us to break tests. In addition, when the browser resolves a URL for XHR, it\n // doesn\"t know about mocked locations and resolves URLs to the real document - which is\n // exactly the behavior needed here. There is little value is mocking these out for this\n // service.\n var urlParsingNode = document.createElement(\"a\");\n var originUrl = urlResolve(window.location.href);\n\n /**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL. Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node\"s host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL. This approach has wide\n * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers. However, the parsed components will not be set if the URL assigned did not specify\n * them. (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.) We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * References:\n * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n * http://url.spec.whatwg.org/#urlutils\n * https://github.com/angular/angular.js/pull/2902\n * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @kind function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n * | member name | Description |\n * |---------------|----------------|\n * | href | A normalized version of the provided URL if it was not an absolute URL |\n * | protocol | The protocol including the trailing colon |\n * | host | The host and port (if the port is non-default) of the normalizedUrl |\n * | search | The search params, minus the question mark |\n * | hash | The hash string, minus the hash symbol\n * | hostname | The hostname\n * | port | The port, without \":\"\n * | pathname | The pathname, beginning with \"/\"\n *\n */\n function urlResolve(url) {\n var href = url;\n\n // Normalize before parse. Refer Implementation Notes on why this is\n // done in two steps on IE.\n urlParsingNode.setAttribute(\"href\", href);\n href = urlParsingNode.href;\n urlParsingNode.setAttribute(\"href\", href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, \"\") : \"\",\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, \"\") : \"\",\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, \"\") : \"\",\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === \"/\")\n ? urlParsingNode.pathname\n : \"/\" + urlParsingNode.pathname\n };\n }\n\n /**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\n function urlIsSameOrigin(requestUrl) {\n var parsed = (angular.isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n return (parsed.protocol === originUrl.protocol &&\n parsed.host === originUrl.host);\n }\n\n return {\n urlResolve: urlResolve,\n isSameOrigin: urlIsSameOrigin\n };\n\n });\n\n}());","(function (window, angular) {\n \"use strict\";\n\n angular\n .module(\"albumConfirm\", [\"ui.bootstrap\"])\n .controller(\"ConfirmModalController\", [\n \"$scope\",\n \"$uibModalInstance\",\n \"data\",\n function ($scope, $uibModalInstance, data) {\n $scope.data = angular.copy(data);\n\n $scope.ok = function (closeMessage) {\n $uibModalInstance.close(closeMessage);\n };\n\n $scope.customButtonClick = function (customButtonObj) {\n $uibModalInstance.close(customButtonObj);\n };\n\n $scope.cancel = function (dismissMessage) {\n if (angular.isUndefined(dismissMessage)) {\n dismissMessage = \"cancel\";\n }\n $uibModalInstance.dismiss(dismissMessage);\n };\n }\n ])\n .value(\"$confirmModalDefaults\", {\n template:\n \"

{{data.title}}

\" +\n \"
{{data.text}}
\" +\n \"
\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"
\",\n controller: \"ConfirmModalController\",\n defaultLabels: {\n title: \"Bekreft\",\n ok: \"OK\",\n cancel: \"Avbryt\"\n }\n })\n .factory(\"$confirm\", [\n \"$uibModal\",\n \"$confirmModalDefaults\",\n function ($uibModal, $confirmModalDefaults) {\n return function (data, settings) {\n var defaults = angular.copy($confirmModalDefaults);\n settings = angular.extend(defaults, settings || {});\n\n data = angular.extend(\n {},\n settings.defaultLabels,\n data || {}\n );\n\n if (\"templateUrl\" in settings && \"template\" in settings) {\n delete settings.template;\n }\n\n settings.resolve = {\n data: function () {\n return data;\n }\n };\n if (data.size) {\n settings.size = data.size;\n }\n return $uibModal.open(settings).result;\n };\n }\n ])\n .directive(\"confirm\", [\n \"$confirm\",\n \"$timeout\",\n function ($confirm, $timeout) {\n return {\n priority: 1,\n restrict: \"A\",\n scope: {\n customButtonObj: \"=\",\n customButtonObj2: \"=\",\n customButtonText: \"@\",\n customButtonText2: \"@\",\n showCustomButton: \"@\",\n showCustomButton2: \"@\",\n confirmIf: \"=\",\n ngClick: \"&\",\n confirm: \"@\",\n confirmSettings: \"=\",\n confirmTitle: \"@\",\n confirmOk: \"@\",\n confirmCancel: \"@\"\n },\n link: function (scope, element) {\n function onSuccess() {\n var rawEl = element[0];\n if (\n [\"checkbox\", \"radio\"].indexOf(rawEl.type) != -1\n ) {\n var model = element.data(\"$ngModelController\");\n if (model) {\n model.$setViewValue(!rawEl.checked);\n model.$render();\n } else {\n rawEl.checked = !rawEl.checked;\n }\n }\n scope.ngClick();\n }\n\n element.unbind(\"click\").bind(\"click\", function ($event) {\n $event.preventDefault();\n\n $timeout(function () {\n if (\n angular.isUndefined(scope.confirmIf) ||\n scope.confirmIf\n ) {\n var data = {\n text: scope.confirm\n };\n if (scope.confirmTitle) {\n data.title = scope.confirmTitle;\n }\n if (scope.confirmOk) {\n data.ok = scope.confirmOk;\n }\n if (scope.confirmCancel) {\n data.cancel = scope.confirmCancel;\n }\n $confirm(\n data,\n scope.confirmSettings || {}\n ).then(onSuccess);\n } else {\n scope.$apply(onSuccess);\n }\n });\n });\n }\n };\n }\n ]);\n})(window, window.angular);\n","(function () {\n \"use strict\";\n\n var module = window.angular.module(\"sx.wizard\", [\"ui.bootstrap\", \"sx.wizard.tpls\"]);\n\n module.factory(\"$wizard\", [\"$q\", \"$http\", \"$templateCache\", \"$uibModal\", \"$wizardConsts\",\n function ($q, $http, $templateCache, $uibModal, $wizardConsts) {\n\n var _getTemplatePromise = function (step) {\n if (step.template) {\n step.template = \"
\" + step.template + \"
\";\n return $q.when(step);\n }\n else {\n return $http.get(step.templateUrl, { cache: $templateCache }).then(function (response) {\n step.template = \"
\" + response.data + \"
\";\n return step;\n });\n }\n };\n\n return {\n $new: function (opts) {\n var $wizard = this;\n var wizard = {\n _steps: {},\n _stepsOrder: [],\n _stepTemplatePromises: [],\n _options: {\n successing: function ($data, $step, $isLastStep, callback) {\n return callback(true);\n },\n size: \"lg\",\n backdrop: \"static\",\n title: \"Wizard\",\n templateUrl: $wizardConsts.template,\n shadow: true\n }\n };\n\n wizard._options = window.angular.extend({}, wizard._options, opts);\n\n wizard.addStep = function (step) {\n var self = this;\n step.title = step.title || step.id;\n step.controller = step.controller || window.angular.noop;\n step.parameters = step.parameters || {};\n self._steps[step.id] = step;\n self._stepsOrder.push(step.id);\n self._stepTemplatePromises.push(_getTemplatePromise(step));\n return wizard;\n };\n\n\n wizard.open = function (data, success, cancel) {\n var self = this;\n\n data = data || {};\n success = success || window.angular.noop;\n cancel = cancel || window.angular.noop;\n\n $q.all(self._stepTemplatePromises).then(function () {\n var instance = $uibModal.open({\n templateUrl: self._options.templateUrl,\n controller: [\"$scope\", \"$uibModalInstance\", \"$data\", \"$steps\", \"$stepsOrder\",\"$log\",\n function ($scope, $uibModalInstance, $data, $steps, $stepsOrder,$log) {\n $scope.$data = $data;\n $scope.$steps = $steps;\n $scope.$stepsOrder = $stepsOrder;\n $scope.$current = {};\n $scope.$uibModalInstance = $uibModalInstance;\n \n $scope._title = self._options.title;\n $scope._finishTitle = self._options.finishTitle || \"Ferdig\";\n \n \n $scope._history = [];\n $scope._entering = false;\n $scope._leaving = false;\n $scope._shadow = self._options.shadow;\n $scope._cclass = self._options.cclass;\n\n $scope.$watch(function () {\n if ($scope.$current.step && $scope.$current.step.$context && $scope.$current.index >= 0) {\n return $scope.$current.step.$context.navigation.showFinish || ($scope.$current.index >= self._stepsOrder.length - 1);\n }\n else {\n return true;\n }\n }, function (showFinishButton) {\n $scope._showFinishButton = showFinishButton;\n });\n\n\n\n $scope.$watch(\"$current.step.$context.navigation.disableNextButton\", function (nv, ov) {\n\n if (nv !== ov) {\n $scope._disableNextButton = nv;\n }\n });\n $scope.$watch(\"$current.step.$context.navigation.disableFinishButton\", function (nv, ov) {\n\n if (nv !== ov) {\n $scope._disableFinishButton = nv;\n }\n });\n\n\n $scope.success = function () {\n $scope._onLeaving(Number.MAX_VALUE, null, function (valid) {\n if (valid) {\n $scope._leaving = true;\n self._options.successing($scope.$data, $scope.$current.step, $scope.$current.index >= self._stepsOrder.length - 1, function (valid) {\n $scope._leaving = false;\n if (valid) {\n $uibModalInstance.close($scope.$data);\n }\n });\n }\n });\n };\n\n $scope.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n $scope._onLeaving = function (toIndex, toStep, callback) {\n // current step might be \"undefined\" when wizard was shown firstly\n if ($scope.$current.step) {\n var leaving = $scope.$current.step.$context.behavior.leaving;\n var options = {\n toStepId: toStep && toStep.id,\n forward: $scope.$current.index <= toIndex\n };\n $scope._leaving = true;\n leaving.apply($scope.$current.step.$controller, [options,\n function (valid) {\n $scope._leaving = false;\n return callback(valid);\n }\n ]);\n }\n else {\n return callback(true);\n }\n };\n\n $scope._onEntering = function (fromIndex, fromStep, callback) {\n var entering = $scope.$current.step.$context.behavior.entering;\n var options = {\n fromStepId: fromStep && fromStep.id,\n forward: fromIndex <= $scope.$current.index,\n entered: $scope.$current.step.entered || false\n };\n $scope._entering = true;\n entering.apply($scope.$current.step.$controller, [options,\n function () {\n $scope._entering = false;\n $scope.$current.step.entered = true;\n return callback();\n }\n ]);\n };\n\n $scope.goById = function (stepOrId, isPrevious) {\n var id = window.angular.isString(stepOrId) ? stepOrId : (stepOrId && stepOrId.id);\n if (id === $wizard.$constants.finishStepId) {\n $scope.success();\n }\n else {\n var step = self._steps[id];\n if (step) {\n var index = self._stepsOrder.indexOf(id);\n if (index >= 0) {\n $scope._onLeaving(index, step, function (valid) {\n if (valid) {\n var fromIndex = $scope.$current.index || -1;\n var fromStepId = $scope.$current.step && $scope.$current.step.id;\n // if it is came from previous step and contains history then pop\n if (isPrevious && $scope._history.length > 0) {\n $scope._history.pop();\n }\n // if it is not came from previous step and has current step then push current into history\n if (!isPrevious && $scope.$current.step) {\n $scope._history.push($scope.$current.step.id);\n }\n // navigate\n $scope.$current.index = index;\n $scope.$current.step = step;\n $scope._onEntering(fromIndex, self._steps[fromStepId], function () {\n $scope._showFinishButton = ($scope.$current.index >= self._stepsOrder.length - 1);\n });\n }\n });\n }\n }\n }\n };\n\n $scope.go = function (index, isPrevious) {\n if (index >= 0 && index <= self._stepsOrder.length - 1) {\n var id = self._stepsOrder[index];\n $scope.goById(id, isPrevious);\n }\n };\n\n $scope.next = function () {\n var nextStepId = $scope.$current.step.$context.navigation.nextStepId;\n if (nextStepId) {\n $scope.goById(nextStepId, false);\n }\n else {\n $scope.go($scope.$current.index + 1, false);\n }\n };\n\n $scope.previous = function () {\n if ($scope._history.length > 0) {\n // do not pop from history right now\n // pop it when validation passed \n $scope.goById($scope._history[$scope._history.length - 1], true);\n }\n };\n $scope.showShadow = function (isLeaving) {\n if (isLeaving) {\n $scope._leaving = true;\n }\n else {\n $scope._entering = true;\n }\n };\n $scope.hideShadow = function () {\n $scope._leaving = false;\n $scope._entering = false;\n };\n }\n ],\n size: self._options.size,\n resolve: {\n $data: function () {\n return window.angular.copy(data);\n },\n $steps: function () {\n return self._steps;\n },\n $stepsOrder: function () {\n return self._stepsOrder;\n }\n },\n backdrop: self._options.backdrop\n });\n instance.result.then(function (data) {\n return success(data);\n }, function () {\n return cancel();\n });\n });\n };\n\n return wizard;\n },\n $constants: {\n finishStepId: \"$$finish\"\n }\n };\n }\n ]);\n\n module.directive(\"sxWizard\", [\"$compile\", \"$controller\",\n function ($compile, $controller) {\n return {\n scope: {\n $data: \"=sxWizard\",\n $steps: \"=sxWizardSteps\",\n $current: \"=sxWizardCurrentStep\",\n $init: \"&sxWizardInit\",\n $showShadow: \"&sxWizardShowShadow\",\n $hideShadow: \"&sxWizardHideShadow\"\n },\n link: function (scope, element, attributes, controllers) {\n var _stepElements = [];\n var _steps = {};\n window.angular.forEach(scope.$steps, function (step, id) {\n _steps[id] = {\n id: id,\n title: step.title\n };\n });\n\n window.angular.forEach(scope.$steps, function (step, id) {\n var template = step.template;\n var controller = step.controller;\n var templateScope = scope.$new();\n templateScope.$context = {\n data: scope.$data,\n parameters: step.parameters,\n steps: _steps,\n currentStepId: scope.$current.step && scope.$current.step.id,\n navigation: {\n showFinish: false,\n nextStepId: null,\n buttons: []\n },\n behavior: {\n shadow: function (isLeaving, fn) {\n try {\n scope.$showShadow(isLeaving);\n return fn(function () {\n scope.$hideShadow();\n });\n }\n catch (_) {\n scope.$hideShadow();\n }\n },\n entering: function (options, callback) {\n return callback();\n },\n leaving: function (options, callback) {\n return callback(true);\n }\n }\n };\n step.$controller = $controller(controller, {\n $scope: templateScope\n });\n step.$context = templateScope.$context;\n step.entered = false;\n element.append(template);\n var templateElement = element.find(\"[sx-wizard-step-id=\\\"\" + id + \"\\\"]\");\n $compile(templateElement.contents())(templateScope);\n _stepElements.push(templateElement);\n });\n\n scope.$watch(\"$current.step\", function (step) {\n if (step) {\n window.angular.forEach(_stepElements, function (stepElement) {\n if (stepElement.attr(\"sx-wizard-step-id\") === step.id) {\n stepElement.show();\n }\n else {\n stepElement.hide();\n }\n });\n }\n });\n\n scope.$init();\n }\n };\n }\n ]);\n\n} ());","(function () {\n \"use strict\";\n\n var module = window.angular.module(\"sx.wizard.tpls\", []);\n\n module.value(\"$wizardConsts\", {\n template: \"$sx-ngtk/wizard/wizard.html\"\n });\n\n module.run([\"$templateCache\", \"$wizardConsts\",\n function ($templateCache, $wizardConsts) {\n $templateCache.put($wizardConsts.template, \"\" +\n \"
\" +\n \" \" +\n \" \" +\n \"
\" +\n\n \"
\" +\n \"
\" +\n \"
\" +\n \"
\" +\n\n \"
\" +\n \"
\" +\n \" \" +\n \"
\" +\n \"
\" +\n \" \" +\n \" \" +\n \" \" +\n \" \" +\n \"
\" +\n \"
\" +\n \"\");\n }\n ]);\n}());","(function(window, undefined) {\n\n \"use strict\";\n\n /* istanbul ignore next */\n window._arrayBufferToBase64 = function(buffer) { //http://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string\n var binary = \"\";\n var bytes = new Uint8Array(buffer);\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n };\n\n\n var mod = window.angular.module(\"naif.base64\", []);\n\n mod.directive(\"baseSixtyFourInput\", [\n \"$window\",\n \"$q\",\n function($window, $q) {\n\n var isolateScope = {\n onChange: \"&\",\n onAfterValidate: \"&\",\n parser: \"&\"\n };\n\n var FILE_READER_EVENTS = [\"onabort\", \"onerror\", \"onloadstart\", \"onloadend\", \"onprogress\", \"onload\"];\n for (var i = FILE_READER_EVENTS.length - 1; i >= 0; i--) {\n var e = FILE_READER_EVENTS[i];\n isolateScope[e] = \"&\";\n }\n\n return {\n restrict: \"A\",\n require: \"ngModel\",\n scope: isolateScope,\n link: function(scope, elem, attrs, ngModel) {\n\n /* istanbul ignore if */\n if (!ngModel) {\n return;\n }\n\n var rawFiles = [];\n var fileObjects = [];\n\n elem.on(\"change\", function(e) {\n\n if (!e.target.files.length) {\n return;\n }\n\n fileObjects = [];\n fileObjects = angular.copy(fileObjects);\n rawFiles = e.target.files; // use event target so we can mock the files from test\n _readFiles();\n _onChange(e);\n _onAfterValidate(e);\n });\n\n function _readFiles() {\n var promises = [];\n var i;\n for (i = rawFiles.length - 1; i >= 0; i--) {\n // append file a new promise, that waits until resolved\n rawFiles[i].deferredObj = $q.defer();\n promises.push(rawFiles[i].deferredObj.promise);\n // TODO: Make sure all promises are resolved even during file reader error, otherwise view value wont be updated\n }\n\n // set view value once all files are read\n $q.all(promises).then(_setViewValue);\n\n for (i = rawFiles.length - 1; i >= 0; i--) {\n var reader = new $window.FileReader();\n var file = rawFiles[i];\n var fileObject = {};\n\n fileObject.filetype = file.type;\n fileObject.filename = file.name;\n fileObject.filesize = file.size;\n \n _attachEventHandlers(reader, file, fileObject);\n reader.readAsArrayBuffer(file);\n }\n }\n\n function _onChange(e) {\n if (attrs.onChange) {\n if (scope.onChange && typeof scope.onChange() === \"function\") {\n scope.onChange()(e, rawFiles);\n }\n else {\n scope.onChange(e, rawFiles);\n }\n }\n }\n\n function _onAfterValidate(e) {\n if (attrs.onAfterValidate) {\n // wait for all promises, in rawFiles,\n // then call onAfterValidate\n var promises = [];\n for (var i = rawFiles.length - 1; i >= 0; i--) {\n promises.push(rawFiles[i].deferredObj.promise);\n }\n $q.all(promises).then(function () {\n if (scope.onAfterValidate && typeof scope.onAfterValidate() === \"function\"){\n scope.onAfterValidate()(e, fileObjects, rawFiles);\n }\n else{\n scope.onAfterValidate(e, fileObjects, rawFiles);\n }\n });\n }\n }\n\n function _attachEventHandlers(fReader, file, fileObject) {\n\n for (var i = FILE_READER_EVENTS.length - 1; i >= 0; i--) {\n var e = FILE_READER_EVENTS[i];\n if (attrs[e] && e !== \"onload\") { // don't attach handler to onload yet\n _attachHandlerForEvent(e, scope[e], fReader, file, fileObject);\n }\n }\n\n fReader.onload = _readerOnLoad(fReader, file, fileObject);\n }\n\n function _attachHandlerForEvent(eventName, handler, fReader, file, fileObject) {\n fReader[eventName] = function(e) {\n handler()(e, fReader, file, rawFiles, fileObjects, fileObject);\n };\n }\n\n function _readerOnLoad(fReader, file, fileObject) {\n\n return function(e) {\n\n var buffer = e.target.result;\n var promise;\n\n // do not convert the image to base64 if it exceeds the maximum\n // size to prevent the browser from freezing\n var exceedsMaxSize = attrs.maxsize && file.size > attrs.maxsize * 1024;\n if (attrs.doNotParseIfOversize !== undefined && exceedsMaxSize) {\n fileObject.base64 = null;\n } else {\n fileObject.base64 = $window._arrayBufferToBase64(buffer);\n }\n\n if (attrs.parser) {\n promise = $q.when(scope.parser()(file, fileObject));\n } else {\n promise = $q.when(fileObject);\n }\n\n promise.then(function(fileObj) {\n fileObjects.push(fileObj);\n // fulfill the promise here.\n file.deferredObj.resolve();\n });\n\n if (attrs.onload) {\n if (scope.onload && typeof scope.onload() === \"function\"){\n scope.onload()(e, fReader, file, rawFiles, fileObjects, fileObject);\n }\n else{\n scope.onload(e, rawFiles);\n }\n }\n\n };\n\n }\n\n function _setViewValue() {\n var newVal = attrs.multiple ? fileObjects : fileObjects[0];\n ngModel.$setViewValue(newVal);\n _maxsize(newVal);\n _minsize(newVal);\n _maxnum(newVal);\n _minnum(newVal);\n _accept(newVal);\n }\n\n ngModel.$isEmpty = function(val) {\n return !val || (angular.isArray(val) ? val.length === 0 : !val.base64);\n };\n\n // http://stackoverflow.com/questions/1703228/how-can-i-clear-an-html-file-input-with-javascript\n scope._clearInput = function() {\n elem[0].value = \"\";\n };\n\n scope.$watch(function() {\n return ngModel.$viewValue;\n }, function(val) {\n if (ngModel.$isEmpty(val)) {\n scope._clearInput();\n }\n });\n\n // VALIDATIONS =========================================================\n\n function _maxnum(val) {\n if (attrs.maxnum && attrs.multiple && val) {\n var valid = val.length <= parseInt(attrs.maxnum);\n ngModel.$setValidity(\"maxnum\", valid);\n }\n return val;\n }\n\n function _minnum(val) {\n if (attrs.minnum && attrs.multiple && val) {\n var valid = val.length >= parseInt(attrs.minnum);\n ngModel.$setValidity(\"minnum\", valid);\n }\n return val;\n }\n\n function _maxsize(val) {\n var valid = true;\n\n if (attrs.maxsize && val) {\n var max = parseFloat(attrs.maxsize) * 1000;\n\n if (attrs.multiple) {\n for (var i = 0; i < val.length; i++) {\n var file = val[i];\n if (file.filesize > max) {\n valid = false;\n break;\n }\n }\n } else {\n valid = val.filesize <= max;\n }\n ngModel.$setValidity(\"maxsize\", valid);\n }\n\n return val;\n }\n\n function _minsize(val) {\n var valid = true;\n var min = parseFloat(attrs.minsize) * 1000;\n\n if (attrs.minsize && val) {\n if (attrs.multiple) {\n for (var i = 0; i < val.length; i++) {\n var file = val[i];\n if (file.filesize < min) {\n valid = false;\n break;\n }\n }\n } else {\n valid = val.filesize >= min;\n }\n ngModel.$setValidity(\"minsize\", valid);\n }\n\n return val;\n }\n\n function _accept(val) {\n var valid = true;\n var regExp, exp, fileExt;\n if (attrs.accept) {\n exp = attrs.accept.trim().replace(/[,\\s]+/gi, \"|\").replace(/\\./g, \"\\\\.\").replace(/\\/\\*/g, \"/.*\");\n regExp = new RegExp(exp);\n }\n\n if (attrs.accept && val) {\n if (attrs.multiple) {\n for (var i = 0; i < val.length; i++) {\n var file = val[i];\n fileExt = \".\" + file.filename.split(\".\").pop();\n valid = regExp.test(file.filetype) || regExp.test(fileExt);\n\n if (!valid) {\n break; }\n }\n } else {\n fileExt = \".\" + val.filename.split(\".\").pop();\n valid = regExp.test(val.filetype) || regExp.test(fileExt);\n }\n ngModel.$setValidity(\"accept\", valid);\n }\n\n return val;\n }\n\n }\n };\n\n }\n ]);\n\n})(window);\n"],"sourceRoot":""}