{"version":3,"file":"js/main.min.js?h=037c80097461a4025f48","mappings":"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","sources":["webpack://photo-engine-web/webpack/runtime/chunk loaded","webpack://photo-engine-web/./src/js/app/main/ctrl/blog.js","webpack://photo-engine-web/./src/js/app/main/module/index.js","webpack://photo-engine-web/./src/js/app/shared/directives/comments.js","webpack://photo-engine-web/./src/js/app/shared/directives/add-filter.js","webpack://photo-engine-web/./src/js/app/shared/directives/advanced-search.js","webpack://photo-engine-web/./src/js/app/shared/directives/light-box.js","webpack://photo-engine-web/./src/js/app/shared/directives/image-info.js","webpack://photo-engine-web/./src/js/app/main/directives/index.js","webpack://photo-engine-web/./src/js/app/shared/directives/image-selector.js","webpack://photo-engine-web/./src/js/app/shared/directives/when-in-view.js","webpack://photo-engine-web/./src/js/app/shared/directives/typeahead.js","webpack://photo-engine-web/./src/js/app/shared/directives/index-selector.js","webpack://photo-engine-web/./src/js/app/shared/directives/ng-picture.js","webpack://photo-engine-web/./src/js/app/shared/directives/zoom.js","webpack://photo-engine-web/./src/js/app/main/ctrl/albums.js","webpack://photo-engine-web/./src/js/app/main/ctrl/image.js","webpack://photo-engine-web/./src/js/app/main/ctrl/archives.js","webpack://photo-engine-web/./src/js/app/main/ctrl/archive.js","webpack://photo-engine-web/./src/js/app/main/ctrl/albums-search.js","webpack://photo-engine-web/./src/js/app/main/ctrl/registry.js","webpack://photo-engine-web/./src/js/app/main/ctrl/search.js","webpack://photo-engine-web/./src/js/app/main/ctrl/crowdsource.js","webpack://photo-engine-web/./src/js/app/main/ctrl/audio-listing.js","webpack://photo-engine-web/./src/js/app/main/ctrl/audio.js","webpack://photo-engine-web/./src/js/app/main/ctrl/index.js","webpack://photo-engine-web/./src/js/app/main/factories/index.js","webpack://photo-engine-web/./src/js/app/main/filters/index.js","webpack://photo-engine-web/./src/js/app/main/index.js","webpack://photo-engine-web/./src/js/app/main/routes/index.js","webpack://photo-engine-web/./src/js/app/shared/tools/index.js","webpack://photo-engine-web/webpack/bootstrap","webpack://photo-engine-web/webpack/runtime/compat get default export","webpack://photo-engine-web/webpack/runtime/define property getters","webpack://photo-engine-web/webpack/runtime/get javascript chunk filename","webpack://photo-engine-web/webpack/runtime/global","webpack://photo-engine-web/webpack/runtime/hasOwnProperty shorthand","webpack://photo-engine-web/webpack/runtime/make namespace object","webpack://photo-engine-web/webpack/runtime/node module decorator","webpack://photo-engine-web/webpack/runtime/runtimeId","webpack://photo-engine-web/webpack/runtime/publicPath","webpack://photo-engine-web/webpack/runtime/jsonp chunk loading","webpack://photo-engine-web/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","\nconst $ = require('jquery');\n\nfunction blogController($scope, $routeParams, $http, $rootScope){\n\n  $scope.showDraft = false;\n\n  $scope.specialClass = function specialClass(suggestion){\n    const len = suggestion.length;\n    if (len < 2) return 'col-md-3';\n    if (len < 3) return 'col-md-6';\n    return '';\n  } \n\n  if ($routeParams.id){\n    const req = $http.get(`/api/blog/${$routeParams.id}`);\n\n    req.then(res => {\n      $scope.blog = res.data;\n    })\n  } else {\n    fetchListing();\n  }\n\n  function fetchListing(draft){\n    const req = $http.get(`/api/blog?draft=${draft}`);\n    req.then(res => {\n      $scope.blogs = res.data;\n    })\n  }\n\n  const interval = 5000;\n\n  $scope.isPlaying = false;\n  $scope.togglePlay = function togglePlay(){\n    \n    const elm = $('#carousel');\n        \n    if ($scope.isPlaying){\n      $scope.isPlaying = !$scope.isPlaying;\n      return elm.carousel('pause');\n    }\n    $scope.isPlaying = !$scope.isPlaying;\n    elm.carousel({\n      interval,\n      ride: true,\n    })\n  }\n\n  $scope.isFullscreen = false;\n\n  $scope.toggleFullscreen = function toggleFullscreen(){\n    const elm = document.getElementById('carousel');\n    $scope.isPlaying = true;\n    $('#carousel').carousel({\n      interval,\n      ride: true,\n      pause: false,\n    });\n    elm.requestFullscreen();\n\n    elm.addEventListener('fullscreenchange', function (event) {\n      if (! document.fullscreenElement){\n        $scope.isPlaying = false;\n        $('#carousel').carousel('pause');\n        $scope.$applyAsync();\n      }\n    })\n  } \n\n\n\n\n\n  $scope.toggleDraft = function toggleDraft(){\n    $scope.showDraft = !$scope.showDraft;\n    fetchListing($scope.showDraft);\n  }\n\n  $scope.isAdmin = function isAdmin(){\n    const required = ['tenant::admin', 'tenant::user', ];\n\n    if (!$rootScope.me) return false;\n    if (!$rootScope.me.permissions) return false;\n    if (!$rootScope.me.permissions.current) return false;\n    if (! required.includes($rootScope.me.permissions.current)) return false;\n    return true;\n  }\n}\n\n\n\n\nblogController.$inject = ['$scope', '$routeParams', '$http', '$rootScope'];\n\nmodule.exports = blogController;","require('angular/angular.min.js');\nrequire('angular-scroll/dist/angular-scroll.min.js');\nrequire('angular-sanitize/angular-sanitize.min.js');\nrequire('angular-ui-notification/dist/angular-ui-notification.min.js');\nrequire('angular-moment/angular-moment.min.js');\nrequire('ui-select/dist/select.min.js');\nrequire('angular-resource/angular-resource.min.js');\nrequire('angular-route/angular-route.min.js');\nrequire('angular-cache/dist/angular-cache.min.js');\nrequire('angular-ui-tree/dist/angular-ui-tree.js');\nimport service from '../../shared/services';\nimport applicationRun from '../../shared/run/';\n\nconst app = angular.module('main', [\n    'ngRoute',\n    'ui.select',\n    'ngSanitize',\n    'angularMoment',\n    'angularScroll',\n    'angular-cache',\n    'ui-notification',\n    'ngResource',\n    'ui.tree',\n]);\nservice(app);\napp.run(applicationRun);\nexport default app;\n","const storage = window.localStorage;\nwindow.__recaptchaKey = \"\";\n\nwindow.__recaptchaValid = function __recaptchaValid(response){\n  console.log('__recaptchaValid', response)\n  const elem = document.getElementById('recap')\n  var event = new Event('__reCAPTCHAVALID__');\n  elem.dispatchEvent(event);\n}\n\n\nwindow.__recaptchaNotValid = function __recaptchaNotValid(response){\n  console.error('__recaptchaNotValid', response)\n  const elem = document.getElementById('recap')\n  var event = new Event('__reCAPTCHANOTVALID__');\n  elem.dispatchEvent(event);\n}\nwindow.__loadRecaptcha = function (){\n  if (! document.getElementById('recap')) return console.warn('recaptca not ready');\n\n  window.__recap_render = grecaptcha.render('recap', {\n    'sitekey' : window.__recaptchaKey,\n    callback : __recaptchaValid,\n    'expired-callback' : __recaptchaNotValid,\n    'data-error-callback': __recaptchaNotValid,\n  });\n}\n\nexport default  function commentsDirective($http, Api){\n  return {\n    restrict : 'E',\n    templateUrl : 'templates/comments.html',\n    scope:{\n      index : '<',\n      tenant :'<',\n      doc :'<',\n    },\n    link : function ($scope){\n      $scope.submitMessage = \"Senda\";\n      $scope.disableCommentSubmit = true;\n\n      $scope.token = fetchToken();\n\n      $scope.tokenValid = false;\n      console.log('Loading comment directive')\n      $scope.alert = {\n        show : false,\n        message: ''\n      }\n\n      if (!$scope.tenant || !$scope.index || !$scope.doc) return console.error('Tenant attr, doc or index is not defined', {\n        index: $scope.index,\n        tenant: $scope.tenant,\n        doc : $scope.doc\n      });\n\n      const recapElement =  document.getElementById('recap');\n      if (recapElement) {\n        recapElement.addEventListener('__reCAPTCHANOTVALID__', function (e, data) {\n          console.error(`__reCAPTCHANOTVALID__`, {e, data})\n          $scope.$applyAsync(function (){\n            $scope.validReCAPTCHA = false;\n            $scope.disableCommentSubmit = true;\n          });\n        }, false);\n\n        recapElement.addEventListener('__reCAPTCHAVALID__', function (e, data) {\n          console.error(`__reCAPTCHAVALID__`, {e, data})\n          $scope.$applyAsync(function (){\n            $scope.disableCommentSubmit = false;\n            $scope.validReCAPTCHA = true;\n          });\n        }, false);\n      }\n\n      function saveToken(token){\n        console.log('Save Token', {token, storage});\n        storage.setItem('comments_jwt_token', JSON.stringify(token));\n      }\n\n\n\n      function fetchToken(){\n        const json = storage.getItem('comments_jwt_token');\n        if (!json) return false;\n        try {\n          return JSON.parse(json);\n        } catch (e) {\n          return false;\n        }\n      }\n\n      function isTokenValid(){\n        const token = fetchToken();\n\n        if (!token) return false;\n        const url = getUrl();\n        $scope.alert.show = false;\n        $http({\n          method:'HEAD',\n          url: url.toString(),\n        }).then(function succes(res){\n          console.log('Check if token is valid', { res })\n          if (res.status === 204) {\n            $scope.tokenValid = true;\n            $scope.disableCommentSubmit = false;\n            $scope.validReCAPTCHA = true;\n            console.log('Success valid token', res);\n          } else {\n            console.log('Token was not valid')\n          }\n        }, function error(err){\n          $scope.alert = {\n            show: true,\n            message: 'Villa við það að greina aðgang',\n          };\n          console.error('error validate token', err);\n        });\n      }\n\n      isTokenValid();\n\n      console.log('last token', $scope.token)\n\n      function getUrl(){\n        const url = new URL(window.location.origin);\n\n        const token = fetchToken();\n        url.pathname = `/api/tenants/${$scope.tenant}/comments`;\n        if (token){\n          url.searchParams.set('token', token.jwt);\n        }\n        return url;\n      }\n\n      $scope.message= {};\n      $scope.sendMessage = function sendMessage(){\n        $scope.alert.show = false;\n        $scope.disableCommentSubmit = true;\n        $scope.message.tenantId =$scope.tenant;\n        $scope.message.metadata = $scope.doc;\n        $scope.message.indexId = $scope.index;\n        $scope.message.id = $scope.doc._id;\n        $scope.message.href = window.location.href;\n\n        if (!$scope.tokenValid){\n          $scope.message.recaptcha = grecaptcha.getResponse();\n        }\n        $scope.message.navigator = {\n          connection: navigator.connection,\n          appVersion : navigator.appVersion,\n          language : navigator.language,\n          languages : navigator.languages,\n          platform : navigator.platform,\n          userAgent : navigator.userAgent,\n          vendor : navigator.vendor,\n        };\n\n        const url = getUrl();\n\n        $http({\n          method: 'PUT',\n          url : url.toString(),\n          data : $scope.message,\n        }).then(function success(response){\n          console.log('Message response', response);\n\n          if (angular.isObject(response.data.token)){\n            saveToken(response.data.token);\n          }\n          $scope.submitMessage = 'Ábending send!';\n        }, function error(err){\n\n          $scope.alert = {\n            show: true,\n            message: `Villa við skráningu ábendingar '${err.data.message}'`,\n          };\n          console.error('Message error',err)\n        });\n      }\n\n      function addRecaptcha(reCAPTCHA){\n\n        const element = document.getElementById('recap');\n\n        if (!element) return console.log('Element recap not found');\n\n        const sitekey = element.getAttribute('data-sitekey');\n\n        if (sitekey) return ;\n        element.setAttribute('data-sitekey', reCAPTCHA)\n        setTimeout(function (){\n          const script = document.createElement('script');\n          script.type = 'text/javascript';\n          script.src = 'https://www.google.com/recaptcha/api.js?onload=__loadRecaptcha&render=explicit';\n          document.body.appendChild(script);\n        }, 1000);\n      }\n\n\n      Api.siteConfig().then( function (response){\n        const config = response.config;\n        if (config.comments && config.reCAPTCHA){\n          $scope.enableComments = true;\n          window.__recaptchaKey = config.reCAPTCHA\n          console.log('Apply recaptcha');\n          addRecaptcha(config.reCAPTCHA);\n        }\n      });\n\n\n      $scope.fetchingComments = false;\n      $scope.comments = false;\n\n      $scope.$watch('doc', function (n, o){\n        if (typeof n === 'object' && n._id && $scope.fetchingComments === false){\n          return fetchExistingComments();\n        }\n      })\n\n\n      function fetchExistingComments(){\n        const docid = $scope.doc._id;\n        if (! docid) return console.warn(`doc._id not set, got: ${docid}`, $scope.doc);\n\n        $scope.fetchingComments = true;\n        const req = $http.get(`/api/tenants/${$scope.tenant}/comments?filter=id:${docid}`);\n\n        req.then(function (res){\n          $scope.comments = res.data.comments;\n        });\n      }\n    }\n  }\n}\n","\n\nconst $ = require('jquery');\nrequire('bootstrap/dist/js/bootstrap.min.js');\n\nexport default function directiveAddFilter($timeout){\n\n  function random(max){\n    return Math.floor(Math.random() * max) + 1\n  }\n\n  function randomId(){\n    const chars = 'qwertyuiopasdfghjklzxcvbnm0123456789'.split('');\n    const arr = ['add_filter_'];\n    for (let i = 0; i < 10; i ++){\n      const r = random(chars.length -1);\n      const s = chars[r];\n      arr.push(s);\n    }\n    return arr.join('')\n  }\n\n  function getId(key){\n    return `add_filter_${key}`;\n  }\n\n  return {\n    restrict: 'C',\n    transclude: true,\n    template: function (element,attrs){\n      // console.log({element,attrs})\n      attrs._id = randomId();\n      return `\n      <div class=\"add-filter-wraper\">\n        <div id=\"${attrs._id}\" class=\"add-filter-popover-container\"></div>\n        <a href=\"#\"\n          class=\"add-filter-parent\"\n          data-placement=\"top\" >\n          <ng-transclude></ng-transclude>\n        </a>\n      </div>`;\n    },\n    scope : {\n      filters : '<',\n      value : '<'\n    },\n    link : function($scope, element, attrs){\n\n      if (typeof $scope.value === 'object'){\n        $scope._value = $scope.value[attrs.key];\n      } else {\n        $scope._value = $scope.value;\n      }\n\n      const id = randomId();\n      const keywordField = (attrs.keyword === 'true') ? `${attrs.key}.keyword` : `${attrs.key}`\n      $(element).attr('id', id)\n\n      $timeout(function (){\n\n        const container = $(`#${id}`).find('.add-filter-popover-container');\n        $scope.popoverElement = $(`#${id} .add-filter-parent`);\n        $scope.popoverElement .popover({\n          trigger:'click',\n          html : true,\n          title:'Bæta við síu',\n          placement:'top',\n          sanitize : false,\n          container: container,\n          content : function (){\n            return `<div>\n              <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n                <button type=\"button\" class=\"btn btn-sm btn-success add-filter-button\">\n                  <i class=\"fa fa-check\"  title=\"Verður að innihalda ${$scope._value}\"></i>\n                </button>\n                <button type=\"button\" class=\"btn btn-sm btn-danger add-not-filter-button\">\n                  <i class=\"fa fa-remove\" title=\"Má ekki innihalda ${$scope._value}\"></i>\n                </button>\n                <button type=\"button\" class=\"btn btn-sm btn-secondary close-popover\">\n                  <i class=\"fa fa-remove\" title=\"loka\"></i>\n                </button>\n              </div>\n            </div>`;\n          }\n        });\n\n        container.on('click', '.add-filter-button', function (){\n          const filter ={\n            type : 'term',\n            field: keywordField,\n            value: $scope._value,\n          };\n          $scope.$applyAsync(function (){\n            $scope.filters.push(filter);\n            $scope.popoverElement.popover('hide');\n          })\n        })\n\n        container.on('click', '.add-not-filter-button', function (){\n          const filter ={\n            type : 'term',\n            field: keywordField,\n            value: $scope._value,\n            not : true,\n          };\n          $scope.$applyAsync(function (){\n            $scope.filters.push(filter);\n            $scope.popoverElement.popover('hide');\n          })\n        })\n        container.on('click', '.close-popover', function (){\n          $scope.$applyAsync(function (){\n            $scope.popoverElement.popover('hide');\n          })\n        })\n      }, 10);\n    }\n  }\n};\n","\n\nimport defaultMap from '../tools/mapping.js';\n\nfunction directiveAdvancedSearch(es, bodybuilder){\n\n  return {\n    restrict : 'E',\n    scope : {\n      index: '<',\n      filters: '=',\n      config: '<',\n    },\n    templateUrl: 'templates/search/advanced.html',\n    link : function ($scope, element, attrs){\n\n      $scope.mapping = {};\n      if ($scope.config && $scope.config.then){\n        $scope.config.then(function (conf){\n          if (! conf.config.search || ! conf.config.search.mappings){\n            return defaultMappings();\n          }\n          initMappings(conf.config.search.mappings);\n        });\n      }\n\n\n      function initMappings(mappings){\n        Object.keys(mappings).forEach(function (key){\n          const map = mappings[key];\n          if (map.type === 'text') {\n            if (! map.name ){\n              map.name = key;\n            }\n            if (! map.key ){\n              map.key = key;\n            }\n\n            if (map.show === false) return;\n            $scope.mapping[key] = map;\n          }\n        });\n      }\n\n      function defaultMappings(){\n        return initMappings(defaultMap);\n      }\n\n      $scope.aggSize = 25;\n\n      $scope.mapTypeIcon = function mapTypeIcon(map){\n        if (map.type === 'text') return 'fa-italic';\n        if (map.type === 'date') return 'fa-calendar';\n        if (map.type === 'long') return 'fa-pie-chart';\n      }\n\n\n      $scope.agg = function agg(key, map, reload){\n        if ( map.success && !reload ) return;\n\n\n        map.update = function update(){\n          $scope.addFilter(key, map, map._agg);\n        }\n\n        const query = bodybuilder();\n\n        $scope.filters.forEach(function (filter){\n          query.filter(filter.type, filter.field, filter.value);\n        })\n\n        if (map.type === 'text'){\n          query.agg('terms', `${key}.keyword`, 'agg', {\n            size : $scope.aggSize\n          });\n        }\n\n        if (map.type === 'date'){\n          query.agg('date_histogram', key, 'agg', {\n            // calendar_interval: 'month',\n            // size : $scope.aggSize,\n            interval: 'week',\n          });\n        }\n\n        if (map.type === 'long'){\n          query.agg('terms', key, 'agg', {\n            size : $scope.aggSize\n          });\n        }\n\n\n\n        const cacheSeed = JSON.stringify({\n          filters: angular.copy($scope.filters),\n          q: query.build(),\n        });\n\n        const request = es.search({\n          index: $scope.index,\n          body: query.build(),\n          size: 0\n        }, true, `${$scope.index}/advsearch/agg/${key}/${cacheSeed}`);\n\n        map.loading = true;\n\n\n        request.then(function success(res){\n          map.loading = false;\n\n          if (res.aggregations.agg.buckets.length < 1) {\n            map.error = `Engar niðurstöður`;\n            return;\n          }\n          map.success = true;\n\n          if (map.type === 'date'){\n            map._agg = dateAggParser(res.aggregations.agg);\n\n            const filter = getFilter(key);\n            map.filter = {};\n            if (filter && filter.value && filter.value.gte){\n              console.log('Already have filter, applying', filter);\n              map.filter.range = filter.value;\n            } else {\n              map.filter.range = {\n                gte: map._agg.value.min,\n                lte: map._agg.value.max,\n              };\n            }\n\n          }\n\n          if (map.type === 'text' || map.type === 'long'){\n            map._agg = res.aggregations.agg;\n          }\n\n          map._agg.total = res.hits.total;\n        });\n\n        request.catch(function error(err){\n\n          $scope.$applyAsync(function (){\n            map.loading = false;\n            map.error = `Gat ekki sótt samantekt fyrir '${key}'`;\n            console.error(`Unable to fetch aggrigation for: '${key}'`, err);\n          })\n        });\n      }\n\n      function getFilter(key){\n        return $scope.filters.filter(function (f){\n          return (f.field === key);\n        }).pop();\n      }\n\n      $scope.addFilter = function addFliter(key, map, agg, not){\n\n        const field = (map.type === 'text') ? `${key}.keyword` : key;\n\n        const filter = {\n          value: agg.key,\n          type: 'term',\n          field,\n          not,\n        };\n\n        if (map.type === 'date') {\n\n          filter.type = 'range';\n          filter.value = map.filter.range;\n        }\n\n        const currentIndex = $scope.filters.findIndex(function (filter){\n          return (filter.field === field);\n        });\n\n        if (currentIndex > -1){\n          $scope.filters.splice(currentIndex, 1);\n        }\n\n\n        $scope.filters.push(filter);\n\n        map.success = false;\n\n        $scope.agg(key, map, true);\n      }\n\n      $scope.$watchCollection('filters', function (post, pre){\n        console.log('Modification of filters');\n\n        const j1 = JSON.stringify(post);\n        const j2 = JSON.stringify(pre);\n\n        if (j1 === j2) return;\n        Object.keys(defaultMap).forEach(function (key){\n          const map = defaultMap[key];\n\n          if (map.success){\n            return $scope.agg(key, map, true);\n          }\n        });\n      });\n\n      function dateAggParser(agg){\n        agg.buckets = agg.buckets.map(function (d){\n          d.key = new Date(d.key);\n          return d;\n        }).sort(function (a,b){\n          return a.key - b.key;\n        }).filter(function (a){\n          return (a.doc_count > 0);\n        });\n\n\n        agg.value = {\n          min: agg.buckets[0].key,\n          max: agg.buckets[agg.buckets.length -1 ].key,\n        };\n\n        return agg;\n      }\n    }\n  }\n}\n\ndirectiveAdvancedSearch.$inject = ['es', 'bodybuilder'];\n\nexport default directiveAdvancedSearch;\n","\nimport 'bootstrap/js/dist/carousel.js'\nimport base64url from 'base64-url/index.mjs';\nconst $ = require('jquery');\n\n\nexport default function LightBox(createImageUri, $document, $anchorScroll, $location){\n\n  return {\n    restrict : 'E',\n    templateUrl : 'templates/directives/light-box.html',\n    replace:true,\n    scope:{\n      active: '=',\n      index: '<',\n      tenant:'<',\n      images:'<',\n      config:'<',\n      i:'<',\n      onOpen: '&',\n      onClose: '&',\n      onImage: '&',\n      doOpen: '<'\n    },\n    link : function ($scope, elem, attrs){\n      $scope.isAdmin = function isAdmin(){\n        if (! $scope.config ) return false;\n        if (! $scope.config.user ) return false;\n        if (! $scope.config.user._role ) return false;\n        if (! $scope.config.user._role.user_role ) return false;\n\n        const required = ['tenant::user', 'tenant::admin'];\n        return required.includes($scope.config.user._role.user_role)\n      }\n\n\n      $scope.getIndexUrl = function getIndexUrl(img){\n\n        if (!img || !img._source) return '#'\n\n        const index = img._source._indexID;\n        const tenant = $scope.tenant;\n        const id = img._id;\n\n        return `/admin/settings/${tenant}/indices/${index}/browse?imageId=${id}`;\n      }\n\n\n      function getAggregateConfig(config){\n        if ( typeof $scope.config !== 'object' ) return false;\n        if ( typeof $scope.config.albums !== 'object' ) return false;\n        if ( typeof $scope.config.albums.aggregate !== 'object' ) return false;\n        return $scope.config.albums.aggregate;\n      }\n\n      $scope.getAggregateValue = function getAggregateValue(hit){\n        if ( typeof hit !== 'object' ) return '';\n\n        const conf = getAggregateConfig();\n        if (! conf ) return '';\n\n        const field = conf.field;\n\n        const value = hit._source[field];\n        if ( ! value ) return '';\n\n        return value;\n      }\n\n      $scope.getAggregateFilter = function getAggregateFilter(hit){\n        if ( typeof hit !== 'object' ) return '';\n        const conf = getAggregateConfig();\n        if (! conf ) return '';\n\n        const field = conf.field;\n        const value = hit._source[field];\n        if ( ! value ) return '';\n        return $scope.getImageSearchFilter('term', `${field}.keyword`, value, hit._index );\n      }\n\n\n      $scope.getImageSearchFilter = function getImageSearchFilter(type, field, value, index){\n        const filter =  [\n          { type: type, field : field, value : value }\n        ];\n\n        const filterParam = base64url.encode(JSON.stringify(filter));\n        return `/main/albums/${$scope.tenant}/${$scope.index}?filter=${filterParam}`;\n      };\n\n\n      if (typeof $scope.config === 'object'){\n        const config = $scope.config\n        if (config.comments && config.reCAPTCHA){\n          $scope.enableComments = true;\n        }\n        if (typeof config.albums === 'object' && config.albums.showadvancedmetadata === undefined){\n          $scope.showAdvancedMatadata = true;\n        } else {\n          $scope.showAdvancedMatadata = config.albums.showadvancedmetadata;\n        }\n      }\n\n      const onImageCallback = (typeof $scope.onImage() === 'function') ? $scope.onImage() : function (){};\n\n      $scope.image = $scope.images[$scope.i];\n\n      $scope.$watch('doOpen', function (before, after){\n        if (! $scope.image ) return;\n\n        if ($scope.image._id === $scope.doOpen){\n\n          return $scope.open();\n        }\n\n      })\n\n      $scope.isOpen = false;\n\n      $scope.carousel = false;\n\n      $scope.showInfo = true;\n      $scope.showComment = false;\n\n      let i = $scope.i;\n\n      let carousel = false;\n\n      $scope.srcset = function srcset(img){\n        return createImageUri(img).srcset;\n      }\n\n      $scope.largeImage = function largeImage(img){\n        const url = createImageUri(img);\n        return url.large;\n      }\n\n      $scope.getImageDownloadName = function getImageDownloadName(img){\n        if (!img || ! img._source) return '#noneset';\n        const rights = (img._source.Rights || '') ? img._source.Rights.replace(/ /g, '-') : '';\n        const hash = (img._source.sourceHash || '') ? img._source.sourceHash.MD5.substring(0,4) : '';\n        const title = img._source.Title || 'ljósmnyd';\n        return `${rights}-${hash}-${title}`;\n      }\n\n      $scope.xxlargeImage = function largeImage(img){\n        const url = createImageUri(img);\n        return url['xx-large'];\n      }\n\n      $scope.doShowInfo = function doShowInfo(){\n        $scope.showComment = false;\n        $scope.showInfo =! $scope.showInfo;\n      }\n      $scope.doShowComment = function doShowComment(){\n        $scope.showInfo = false;\n        $scope.showComment =! $scope.showComment;\n      }\n      $scope.showSidebars = function showSidebars(){\n        return ($scope.showInfo || $scope.showComment)\n      }\n\n\n      $scope.isFullscreen = false;\n      $scope.fullscreen = function fullscreen(){\n        $scope.showInfo = false;\n        $scope.showComment = false;\n        if (!document.fullscreenElement) {\n          document.documentElement.requestFullscreen().then(function (){\n            $scope.$applyAsync(async function (){\n              $scope.isFullscreen = document.fullscreen;\n            })\n          })\n        } else {\n          if (document.exitFullscreen) {\n            document.exitFullscreen().then(function (){\n              $scope.$applyAsync(async function (){\n                $scope.isFullscreen = document.fullscreen;\n              })\n            })\n          }\n        }\n\n      }\n\n      function getbackdropId(){\n        return `light-box-backdrop_${$scope.image._id}`\n      }\n\n      function hideOverflow(){\n        document.body.style.overflowY = 'hidden';\n        document.body.style.overflowX = 'hidden';\n      }\n\n      function showOverflow(){\n        document.body.style.overflowY = '';\n        document.body.style.overflowX = '';\n      }\n\n      $scope.open = function open(){\n\n        console.log('Open lightbox', $scope.onOpen);\n\n        if ($scope.isOpen) return console.warn('Already open', $scope.isOpen);\n\n\n        hideOverflow();\n        $scope.isOpen = true;\n        const backdropId = getbackdropId();\n        const backdropElement = document.getElementById(backdropId);\n        // console.log('opening this stuff', {backdropId, backdropElement});\n\n        $location.search('image', $scope.image._id);\n\n\n        const onOpenCallback = $scope.onOpen();\n        onOpenCallback({image : $scope.image });\n        onImageCallback({image : $scope.image });\n\n\n\n        setTimeout(function (){\n          applyCarousel();\n          registerKeyhandler();\n          registerNextHandler();\n          registerMouseHandler();\n          initTooltips();\n          document.body.classList.add('render-ready');\n\n        }, 100);\n      }\n\n      function initTooltips(){\n\n        $(document).tooltip({\n          selector: '[data-toggle=\"tooltip\"]'\n        })\n        // $('[data-toggle=\"tooltip\"]').tooltip();\n\n      }\n\n      function applyCarousel(){\n        const carousel = getCarousel();\n        carousel.carousel('dispose');\n        // console.log('applyCarousel', {carousel})\n        $scope.carousel = carousel.carousel({\n          keyboard: false,\n          wrap: false,\n          interval: false,\n          ride: false,\n        });\n\n        $scope.carousel.carousel('pause');\n      }\n\n      function getElement(){\n        const backdropId = getbackdropId();\n        const backdropElement = document.getElementById(backdropId);\n        return backdropElement;\n      }\n\n      function getCarousel(){\n        const backdropId = getbackdropId();\n        const target = `#${backdropId} .carousel`;\n        const element = $(target);\n\n        // console.log('getCarousel', {backdropId, target, element})\n        return element;\n      }\n\n      let hideHeaderTimeout = null;\n\n      function showHeader(){\n        const backdropId = getbackdropId();\n        const elm = $(`#${backdropId} .light-box-header`);\n        if (hideHeaderTimeout){\n          clearTimeout(hideHeaderTimeout);\n        }\n\n        if (! elm ) return console.error(`Unable to find element`, elm);\n\n        elm.removeClass('hide');\n\n        hideHeaderTimeout = setTimeout(function (){\n          elm.addClass('hide');\n        }, 5000);\n      }\n\n      function onMouseMove(e){\n        showHeader();\n      }\n\n      function registerMouseHandler(){\n        showHeader();\n        document.addEventListener(\"mousemove\", onMouseMove);\n      }\n      function unRegisterMousehandler(){\n        document.removeEventListener(\"mousemove\", onMouseMove);\n      }\n\n      function registerNextHandler(){\n        // console.log('carousel registerNextHandler', {carousel: $scope.carousel})\n        $scope.carousel.on('slide.bs.carousel', function slide(event, data){\n          $scope.$applyAsync(function (){\n\n            // console.log('slide.bs.carousel', {event, $anchorScroll});\n\n            const nextImage = $scope.images[event.to];\n\n            $scope.image = nextImage;\n\n            onImageCallback({image : $scope.image });\n\n            const nextImageId = $scope.image._id;\n            $location.search('image', nextImageId);\n            const nextElementId = `light-box-image-${nextImageId}`;\n            $anchorScroll(nextElementId);\n            console.log({nextImage, nextImageId, count: $scope.images.length})\n          });\n        });\n      }\n      function play(){\n        // $scope.carousel.carousel('dispose');\n        // $scope.carousel = $scope.carousel.carousel({\n        //   keyboard: false, interval: 5000, ride: true\n        // });\n        $scope.carousel.carousel('cycle');\n        $scope.isPlaying = true;\n        // console.log('now plaing...');\n        // registerNextHandler();\n        // registerKeyhandler();\n      }\n\n      function pause(){\n        console.log('cs pause', $scope.carousel)\n        $scope.carousel.carousel('pause');\n        $scope.isPlaying = false;\n      }\n\n\n      function next(){\n        $scope.carousel.carousel('next');\n        pause();\n      }\n      function prev(){\n        $scope.carousel.carousel('prev');\n        pause();\n      }\n      $scope.prev = prev;\n      $scope.next = next;\n\n      $scope.isPlaying = false;\n\n      $scope.togglePlay = function togglePlay(){\n        if ($scope.isPlaying) return pause();\n        return play();\n      };\n\n\n      function keyEventHandler(event){\n\n        const tagName = (event.srcElement.tagName || '').toLowerCase();\n\n        if (['input', 'textarea'].includes(tagName)){\n          return;\n        }\n\n        // return console.log('Keydown event', {e});\n        switch (event.keyCode) {\n          case 37:\n            // esc\n            return prev();\n            break;\n          case 39:\n            // esc\n            return next();\n            break;\n          case 27:\n            // esc\n            return $scope.$applyAsync(close)\n            break;\n        }\n      }\n      function registerKeyhandler(){\n        document.addEventListener(\"keydown\", keyEventHandler);\n      }\n\n      function unRegisterKeyhandler(){\n        document.removeEventListener(\"keydown\", keyEventHandler);\n      }\n\n      $scope.isActive = function isActive(index){\n        return (i === index) ? 'active' : '';\n      }\n\n      function close(){\n        console.log('Close');\n        const carousel = getCarousel();\n\n        carousel.carousel('dispose');\n        $scope.isOpen = false;\n\n        showOverflow();\n        unRegisterKeyhandler();\n        unRegisterMousehandler();\n\n        const onCloseCallback = $scope.onClose();\n        onCloseCallback({image : $scope.image });\n\n        $location.search('image', null);\n      }\n      $scope.close = close;\n\n      $scope.urls = createImageUri($scope.image);\n\n      // console.log({urls : $scope.urls})\n      // console.log('Lightboxing!!', {createImageUri, image: $scope.image})\n    }\n  }\n}\n\n\nLightBox.$inject = ['createImageUri', '$document', '$anchorScroll', '$location']\n","\nconst tools = require('../../shared/tools');\nimport base64url from 'base64-url/index.mjs';\n\nexport default function imageInfo($http, hasPermission, $anchorScroll){\n\n  return {\n    restrict : 'E',\n    templateUrl : 'templates/directives/image-info.html',\n    replace:true,\n    scope:{\n      image:'<',\n      tenant: '<',\n      index: '<',\n      config: '<',\n    },\n    link : function ($scope){\n      console.log('Image info...', $scope);\n      $scope.anchorScroll = $anchorScroll;\n\n      const userInfoRequest = $http.get('/api/me');\n\n      userInfoRequest.then( function (response){\n        if (response.data){\n          $scope.userinfo = response.data;\n        }\n      }, tools.logHttpError);\n\n      $scope.getImageSearchFilter = function getImageSearchFilter(type, field, value, index){\n        const filter =  [\n          { type: type, field : field, value : value }\n        ];\n\n        const filterParam = base64url.encode(JSON.stringify(filter));\n        return `/main/albums/${$scope.tenant}/${$scope.index}?filter=${filterParam}`;\n      };\n\n\n      $scope.hasPermission = function hasPermissionLookup(premRequired){\n        if ( !userInfoRequest || ! userInfoRequest.$$state ) return false;\n        if ( userInfoRequest.$$state.status !== 1 ) return false;\n        const perms = $scope.userinfo.permissions;\n        if (!perms) return false;\n\n        const perm = perms[$scope.tenant] || perms.global;\n\n        return hasPermission(premRequired, perm);\n      }\n    }\n  }\n}\n\n\nimageInfo.$inject = ['$http', 'hasPermission', '$anchorScroll']\n","\n\nimport loadingDirective from '../../shared/directives/loading.js';\nimport directiveTypeahead from '../../shared/directives/typeahead.js';\nimport directiveFilterable from '../../shared/directives/filterable.js';\nimport albumCoverImage from '../../shared/directives/album-cover-image.js';\nimport lozadController from '../../shared/directives/lozad.js';\nimport parseCron from '../../shared/directives/parse-cron.js';\nimport appNavbar from '../../shared/directives/app-navbar.js';\nimport whenInView from '../../shared/directives/when-in-view.js';\nimport markdown from '../../shared/directives/markdown.js';\nimport indexSelector from '../../shared/directives/index-selector.js';\nimport printMetadata from '../../shared/directives/print-metadata.js';\nimport commentsDirective from '../../shared/directives/comments.js';\nimport ngPicture from '../../shared/directives/ng-picture.js';\nimport addFilter from '../../shared/directives/add-filter.js';\nimport infoDirective from '../../shared/directives/info.js';\nimport indexCount from '../../shared/directives/index-count.js';\nimport imageSelector from '../../shared/directives/image-selector.js';\nimport advancedSearch from '../../shared/directives/advanced-search.js';\nimport createFilter from '../../shared/directives/create-filter.js';\nimport lightBox from '../../shared/directives/light-box.js';\nimport imageInfo from '../../shared/directives/image-info.js';\nimport copy from '../../shared/directives/copy.js';\nimport zoom from '../../shared/directives/zoom.js';\nimport textEditor from '../../shared/directives/text-editor.js';\nimport alertDirective from '../../shared/directives/alert.js'\n\n\nconst app = angular.module('main');\napp.directive('imageSelector', [\n  imageSelector\n]);\napp.directive('addFilter', [\n  '$timeout', addFilter\n]);\napp.directive('indexCount', [\n  '$http', '$interval', 'es', indexCount\n]);\napp.directive('whenInView', [\n  whenInView\n]);\napp.directive('textEditor', [\n  textEditor\n]);\napp.directive('appNavbar', [\n  '$http', '$rootElement', '$rootScope', 'CacheFactory', '$location', 'Api',\n  appNavbar\n]);\napp.directive('whileLoading', [\n  '$compile', loadingDirective\n]);\napp.directive('typeahead', [\n  'es', 'bodybuilder', directiveTypeahead\n]);\napp.directive('filterable', [\n  directiveFilterable\n]);\napp.directive('albumCoverImage', albumCoverImage);\napp.directive('lozad', [\n  lozadController\n]);\napp.directive('markdown', [\n  markdown\n]);\napp.directive('indexSelector', [\n  'Api','$location', indexSelector\n]);\napp.directive('printMetadata', [\n  printMetadata\n]);\napp.directive('comments', [\n  '$http', 'Api', commentsDirective\n]);\napp.directive('ngPicture', [\n  'createImageUri', '$timeout', ngPicture\n]);\napp.directive('info', [\n  infoDirective\n]);\n\napp.directive('advancedSearch', advancedSearch);\n\napp.directive('createFilter', createFilter);\napp.directive('lightBox', lightBox);\napp.directive('imageInfo', imageInfo);\napp.directive('copy', copy);\napp.directive('zoom', zoom);\napp.directive('alert', alertDirective);\n","export default function imageSelector(){\n  return {\n    restrict: 'E',\n    replace: true,\n    templateUrl : `templates/directives/image-selector.html`,\n    scope: {\n      onOpen: '&',\n    },\n    link: function link($scope, element, attrs ){\n      console.log('imageSelector', $scope)\n\n    }\n  }\n}\n","\n\n\nexport default function whenInView(){\n  return {\n\n    restrict: 'A',\n    scope : {\n      whenInView : '&'\n    },\n    link: function(scope, elm, attrs){\n\n\n     const observer = new IntersectionObserver(callback);\n     const element = angular.element(elm)[0];\n     observer.observe(element);\n\n     console.log('When in vieew?')\n\n     function callback(ent){\n       if (ent[0].intersectionRatio <= 0) return;\n       scope.whenInView(arguments)\n     }\n\n    }\n }\n}\n","\n\n\nfunction directiveTypeahead(es, bodybuilder){\n  const $ = require('jquery');\n  const typeahead = require('corejs-typeahead');\n\n\n  return {\n    restrict : 'E',\n    template : `<input type=\"text\" class=\"form-control\">`,\n    replace : true,\n    scope : {\n      indices : '<indices',\n      onSearch : '&callback',\n      filters : '<filters',\n    },\n    link : function ($scope, element, attrs, controller, transcludeFn){\n\n\n      function getIndicesToSearchIn(){\n        return $scope.indices.filter(function (index){\n          return index.use;\n        }).map( i => i.index);\n      }\n\n      const engine = $(element).typeahead({\n          minLength: 2,\n          highlight: true\n        },\n        {\n          name: 'my-dataset',\n          limit:10,\n          source: function (queryString, syncCb, asyncCb){\n            const parts = queryString.split(' ');\n            const searchFor = parts.pop();\n            const prefix = parts.join(' ');\n            const body = bodybuilder().rawOption('suggest', {\n                text : searchFor,\n                description : {\n                  term : {\n                    string_distance : 'levenshtein',\n                    min_word_length : 1,\n                    prefix_length : 4,\n\n                    field : 'Description'\n                  }\n                },\n                comment : {\n                  term : {\n                    string_distance : 'levenshtein',\n                    min_word_length : 1,\n                    prefix_length : 4,\n\n                    field : 'Comment'\n                  }\n                }\n              })\n\n            const indices = getIndicesToSearchIn();\n\n            if (Array.isArray($scope.filters)){\n              $scope.filters.forEach(function (filter){\n                if (! filter.type || ! filter.field || ! filter.value ) return;\n                body.filter(filter.type, filter.field, filter.value);\n              })\n            }\n            const request = es.search({\n              index : indices,\n              type :'_doc',\n              body : body.build()\n            });\n\n            request.then(function success(data){\n              const hits = [];\n              const keys = Object.keys(data.suggest);\n              keys.forEach(function (key){\n                const value = data.suggest[key];\n                value.forEach(function (hit){\n                  hit.options.forEach(function (obj){\n                    hits.push(`${prefix} ${obj.text}`);\n                  });\n                });\n              });\n\n              asyncCb(hits);\n            }, function error(err){\n              const message = err.message;\n              if (err.statusCode === 404) return;\n              return console.error(message)\n            })\n          }\n        });\n        engine.on('typeahead:active', function (event,a,b){\n          //console.log('typeahead:active', event, a,b );\n        });\n        engine.on('typeahead:idle', function (event,a,b){\n          //console.log('typeahead:idle', event, a,b );\n        });\n        engine.on('typeahead:open', function (event,a,b){\n          //console.log('typeahead:open', event, a,b );\n        });\n        engine.on('typeahead:close', function (event,a,b){\n          //console.log('typeahead:close', event, a,b );\n        });\n        engine.on('typeahead:change', function (event,a,b){\n          //console.log('typeahead:change', event, a,b );\n        });\n        engine.on('typeahead:render', function (event,a,b){\n          //console.log('typeahead:render', event, a,b );\n        });\n        engine.on('typeahead:select', function (event,a,b){\n          //console.log('typeahead:select', event, a,b );\n        });\n        engine.on('typeahead:autocomplete', function (event,a,b){\n          //console.log('typeahead:autocomplete', event, a,b );\n        });\n        engine.on('typeahead:cursorchange', function (event,a,b){\n          //console.log('typeahead:cursorchange', event, a,b );\n        });\n        engine.on('typeahead:asyncrequest', function (event,a,b){\n          //console.log('typeahead:asyncrequest', event, a,b );\n        });\n        engine.on('typeahead:asynccancel', function (event,a,b){\n          //console.log('typeahead:asynccancel', event, a,b );\n        });\n        engine.on('typeahead:asyncreceive', function (event,a,b){\n          //console.log('typeahead:asyncreceive', event, a,b );\n        });\n    }\n  }\n}\n\n\nexport default directiveTypeahead;\n","\n\nexport default function (Api, $location){\n\n  return {\n    restrict : 'E',\n    scope : {\n      indices : '<',\n      selected : '=',\n    },\n    templateUrl : 'templates/directives/index-selector.html',\n    link : function ($scope, element, attrs){\n\n      $scope.tenant = \"\";\n\n      $scope.config = {};\n\n      $scope.show = false;\n\n      $scope.expandIndices = true;\n\n      Api.siteConfig().then(function (res){\n        $scope.config = res;\n        $scope.tenant = res.tenant;\n        $scope.user = res.config.user;\n        $scope.show = showMe($scope.user);\n      });\n\n      $scope.toggleShowIndices = function toggleShowIndices(){\n        $scope.expandIndices = !$scope.expandIndices;\n      }\n\n      $scope.$watch('expandIndices', function (v){\n        if (v){\n          $scope.btnName = 'Fela vísa';\n        } else {\n          $scope.btnName = 'Sýna vísa'\n        }\n      })\n\n      const user = $scope.user;\n      function showMe(user){\n        if (!user) return false;\n        if (!user._role) return false;\n        const perm = user._role.global_role || user._role.user_role;\n        return ['tenant::user', 'tenant::admin', 'tenant::superuser', 'global::admin'].includes(perm);\n      }\n\n\n      $scope.indexQuerySelected = getQuerySelected();\n\n      $scope.selected = mapQuerySelected($scope.selected);\n\n      function mapQuerySelected(selected){\n\n        const uriSelected = $scope.indexQuerySelected;\n\n        if (!Array.isArray(uriSelected)) return selected;\n        if (!selected) return;\n        return selected.filter(function (index){\n          return uriSelected.includes(index.id);\n        })\n      }\n\n      function getQuerySelected(){\n        const queryParams = $location.search();\n\n        if (! queryParams.selected && Array.isArray($scope.selected)){\n          return $scope.selected.map(function (index){\n            return index.id;\n          });\n        }\n\n        if (typeof queryParams.selected !== 'string') return [];\n        const arr = queryParams.selected.split(',')\n        return arr;\n      }\n\n\n      $scope.indexLink = function indexLink(index){\n        if (index.isAlias) {\n          return `/admin/settings/${$scope.tenant}/alias/${index.id}/edit`\n        }\n        return `/admin/settings/${$scope.tenant}/indices/${index.id}/edit`\n      }\n\n      $scope.$watch('indices', function (){\n        $scope.availableIndices = angular.copy($scope.indices);\n\n        if ($scope.availableIndices?.length > 4){\n          $scope.expandIndices = false;\n        } else {\n          $scope.expandIndices = true;\n        }\n      });\n\n      function updateQueryParams(){\n        const ids = $scope.selected.map(function (index){\n          return index.id;\n        })\n        $location.search('selected', ids.join(','))\n      }\n\n      $scope.selectAll = function selectAll(){\n        if ($scope.availableIndices.length === $scope.selected.length){\n          $scope.selected = [];\n          return updateQueryParams();\n        }\n        $scope.selected = angular.copy($scope.availableIndices);\n        updateQueryParams();\n      }\n\n      $scope.setSelected = function setSelected(index){\n        const int = $scope.selected.findIndex(function (i){\n          return (i.id === index.id);\n        });\n\n        if (int === -1){\n          $scope.selected.push(index);\n        }else {\n          $scope.selected.splice(int, 1);\n        }\n        updateQueryParams();\n      }\n\n      $scope.isSelected = function isSelected(index){\n        const int = $scope.selected.findIndex(function (i){\n          return (i.id === index.id);\n        });\n        return (int > -1)\n      }\n    }\n  }\n\n}\n","export default function ngPicture(createImageUri, $timeout){\n  const lozad = require('lozad')\n  const $ = require('jquery')\n  return {\n    restrict : 'E',\n    replace : false,\n    scope : {\n      image : '<',\n    },\n    template : `\n      <picture class=\"d-block ng-picture-lozad\"  data-iesrc=\"{{ieImage}}\">\n        <source\n        ng-repeat=\"img in imageSizes\"\n        class=\"d-block\"\n        type=\"image/jpeg\"\n        media=\"(min-width: {{img.minWidth}}px)\"\n        srcset=\"{{img.source}}\">\n        <img style=\"max-height: 100vh\" class=\"d-block mx-auto mw-100 \" src=\"{{placeholder}}\">\n      </picture>\n    `,\n    link : function ($scope, element, attrs) {\n      const order = [\n        'xx-large',\n        'x-large',\n        'large',\n        'medium',\n        'small',\n        'x-small',\n        'xx-small',\n      ];\n\n      function sortSizes(a,b){\n        const indexA = order.indexOf(a);\n        const indexB = order.indexOf(b);\n        if (indexA > indexB) return 1;\n        if (indexA < indexB) return -1;\n        return 0;\n      }\n\n      const thumbs = createImageUri($scope.image);\n\n      $scope.imageSizes = [];\n\n      $scope.placeholder = thumbs['xx-small'];\n\n      $scope.ieImage=thumbs['xx-large'];\n\n      Object.keys(thumbs.sizeHash).sort(sortSizes).forEach(function (key){\n        const size = thumbs.sizeHash[key];\n        $scope.imageSizes.push({\n          key,\n          size,\n          minWidth : (size / 1.8).toFixed(0),\n          source : thumbs[key]\n        });\n      });\n\n      const pictureElement = element.find('picture')[0];\n\n\n      const pics = element.find('picture');\n\n      const observer = lozad('.ng-picture-lozad', {\n        rootMargin: \"300px 0px\",\n        loaded: function(el) {\n          $(el).find('img').addClass('img-loaded')\n        }\n      });\n      if (observer){\n        return observer.observe();\n      }\n\n    }\n  }\n}\n","\nfunction preLoadImage(link){\n  return new Promise(function (resolve, reject){\n    const img = new Image();\n    img.src = link;\n    img.onload = function (){\n      resolve();\n    };\n    img.onerror = reject\n  })\n}\n\nfunction zoom(){\n  return {\n    restrict: 'C',\n    scope: {\n      zoomControl: '='\n    },\n    link:function ($scope, element, attrs){\n      const e = element[0];\n      e.draggable = true;\n      e.classList.add('zoom-active');\n      const step = 0.1;\n      let observer = new IntersectionObserver(function (elements){\n        elements.forEach(function (item){\n          if (item.intersectionRatio > 0.5){\n            return loadLarge();\n          }\n        });\n      }, {\n        rootMargin: '0px',\n        threshold: 1.0\n      });\n\n      observer.observe(e);\n      function initVars(){\n        $scope.largeAvailable = false;\n        $scope.largeLoaded = false;\n        $scope.imageReplaced = false;\n        $scope.dragDisabled = true;\n        $scope.current = 1;\n        $scope.isDirty = false;\n      }\n\n      initVars();\n\n      $scope.isLoadingLarge = false;\n      function loadLarge(){\n\n        if ($scope.isLoadingLarge) return;\n        if (attrs.zoomLarge){\n          $scope.isLoadingLarge = true;\n          $scope.largeAvailable = true;\n          const load = preLoadImage(attrs.zoomLarge);\n          load.then(function loaded(image){\n            if ( !$scope.imageReplaced ){\n              e.src = attrs.zoomLarge;\n              $scope.imageReplaced = true;\n            }\n            $scope.largeLoaded = true;\n          }).catch(function error(){\n            $scope.largeAvailable = false;\n          })\n        }\n      }\n\n      let mousedown = false;\n      let cancel = false;\n      let mouselocation = {\n        x: 0,\n        y: 0,\n      }\n\n      e.addEventListener('mousedown', function (event){\n        if ($scope.dragDisabled) return;\n        mousedown = true;\n        cancel = false;\n        mouselocation.x = event.clientX;\n        mouselocation.y = event.clientY;\n      }, true);\n\n      let currentTranslate = {\n        x: 0,\n        y: 0,\n      };\n\n      let tmpTranslate = {\n        x: 0,\n        y: 0,\n      }\n\n      e.addEventListener('mouseup', function (event){\n        mousedown = false;\n        currentTranslate = Object.assign({}, tmpTranslate);\n      }, true);\n\n      document.addEventListener('mouseup', function (event){\n        cancel = true;\n      }, true);\n\n      e.addEventListener('mousemove', function(event) {\n        event.preventDefault();\n        if (! mousedown) return;\n        if (cancel) return;\n        const deltaX = ((event.clientX - mouselocation.x) / $scope.current) + currentTranslate.x;\n        const deltaY = ((event.clientY - mouselocation.y) / $scope.current) + currentTranslate.y;\n        const fixed = $scope.current.toFixed(1);\n\n        tmpTranslate.x = deltaX;\n        tmpTranslate.y = deltaY;\n        event.target.style.transform =`scale(${fixed}) translate(${deltaX}px, ${deltaY}px)`;\n      }, true);\n\n      e.addEventListener('wheel', function zooming(event){\n        if (event.wheelDelta > 0) return zoomin();\n        return zoomout();\n      });\n\n      function resetzoom(){\n        if (! $scope.isDirty ) return;\n        initVars();\n        e.style.transform = '';\n      }\n\n      function zoomin(){\n        $scope.isDirty = true;\n        $scope.current = $scope.current + step;\n\n        if ($scope.current > 1) {\n          $scope.dragDisabled = false;\n        }\n        setTransform();\n      }\n\n      function zoomout(){\n        if ($scope.current <= 1){\n          $scope.dragDisabled = true;\n          return resetzoom();\n        }\n        $scope.current = $scope.current - step;\n        setTransform();\n      }\n\n      function setTransform() {\n        const fixed = $scope.current.toFixed(1);\n        e.style.transform = `scale(${fixed}) translate(${currentTranslate.x}px, ${currentTranslate.y}px)`;\n      }\n\n\n      $scope.zoomControl.in = zoomin;\n      $scope.zoomControl.out = zoomout;\n      $scope.zoomControl.reset = resetzoom;\n\n    }\n  }\n}\n\n\nexport default zoom;\n","\nimport base64url from 'base64-url/index.mjs';\n\nfunction albumsController($scope, $http, Api, es, bodybuilder, createImageUri, CacheFactory, MetaService){\n\n  const siteConfig = Api.siteConfig();\n\n  $scope.tenant = \"\";\n  $scope.albums = [];\n  $scope.indices= \"\";\n  $scope.availableIndices = [];\n  $scope.deepSearch = true;\n  $scope.quickQuery = \"\";\n  $scope.postedQuickQuery = \"\";\n  $scope.quickSearchState = {\n    loading: false,\n  };\n\n  $scope.orderKey = \"doc_count\";\n  $scope.orderType = true;\n\n  $scope.indexSelected = [];\n\n  MetaService.set({\n    Title: 'Leit í myndaalbúmi',\n    Description: 'Gamlar myndir, nýjar myndir',\n    Keywords: 'myndir gamlar nýjar',\n  });\n\n  $scope.docCount = function docCount(count){\n    if (typeof count === 'object') return count.value;\n    return count;\n  }\n\n  function getKey(object){\n    return Object.keys(object).pop();\n  }\n\n\n  if (!CacheFactory.get('currentLocation')) {\n    // or CacheFactory('bookCache', { ... });\n    CacheFactory.createCache('currentLocation', {\n      deleteOnExpire: 'aggressive',\n      maxAge: 60 * 60 * 1000, // 1 hour\n      recycleFreq: 60 * 60 * 1000,\n      storageMode : 'localStorage',\n    });\n  }\n\n  $scope.backCache = CacheFactory.get('currentLocation');\n\n  $scope.removeTargetCache = function ($event){\n\n    const href = $event.currentTarget.attributes.href.nodeValue;\n    const cached = $scope.backCache.get(href);\n    if (cached){\n      $scope.backCache.remove(href);\n    }\n\n    //$event.preventDefault()\n  };\n\n  $scope.getFilter = function getFilter(item){\n\n    if (!item.filter) return;\n\n    const filter =  [\n      { type: 'term', field : item.filter.field, value : item.filter.value }\n    ];\n\n    return base64url.encode(JSON.stringify(filter));\n  }\n\n  $http.get('/api/me').then(function (response){\n    $scope.me = response.data;\n  })\n\n  function getIndicesCacheKeys(indices){\n    const keys = indices.map(function (index){\n      return index.cachekey;\n    }).filter(function (key) {\n      return key;\n    });\n    if (keys.length < 1) return new Date().toISOString();\n    return keys.join(':');\n  }\n\n\n\n  $scope.doDeepSearch = function doDeepSearch(){\n    if (!$scope.deepSearch) return;\n\n    if ($scope.quickQuery.length < 3 && $scope.quickQuery.length !== \"\") {\n      $scope.quickSearchState = {\n        error: 'Texti þarf að vera lengri en 3 stafir',\n      };\n      return;\n    }\n\n    delete $scope.quickSearchState.error;\n\n    $scope.postedQuickQuery = $scope.quickQuery;\n    return fetchAlbums($scope.quickQuery);\n  }\n\n\n  $scope.albumLink = function albumLink(item){\n    const filter = $scope.getFilter(item);\n    const tenant = $scope.tenant;\n    const indices = $scope.indices;\n    const url = `/main/albums/${tenant}/${indices}?filter=${filter}`;\n\n    if ($scope.deepSearch && $scope.postedQuickQuery){\n      const queryString = $scope.postedQuickQuery;\n      return `${url}&query_string=${queryString}`;\n    }\n\n    return url;\n  }\n\n\n  $scope.filterView = function filterView(query) {\n    return function each(item) {\n      // Disable this search on deep search enabled.\n      if ($scope.deepSearch) return true;\n      if (!query) return true;\n      const regex = new RegExp(query.toUpperCase());\n\n      return regex.test(item.key.toUpperCase());\n    }\n  }\n\n\n  function fetchAlbums(quickQuery){\n    const query = bodybuilder()\n    \n    query.agg('terms', $scope.aggrigateKey, 'credit', { \n      size : 500\n    }, function (q){\n        return q.agg('multi_terms', {terms: [\n          { field: 'thumbnails.small.location.keyword' },\n          { field: 'thumbnailsStore.keyword' },\n        ]}, 'thumbnails', {\n          size: 1\n        });\n      return q.agg('terms', 'thumbnails.x-small.location.keyword', 'thumbnails', {\n        size: 1\n      }); \n    });\n\n    if (quickQuery){\n      query.query('query_string', 'query', quickQuery);\n    }\n\n    const indicesToSearchIn = $scope.indexSelected.map(function (index){\n      return index.index;\n    });\n\n\n    const cacheKey = getIndicesCacheKeys($scope.indexSelected);\n\n    // console.log('Indices',  getIndicesCacheKeys($scope.indexSelected))\n    $scope.indices = indicesToSearchIn.join(',');\n    if (indicesToSearchIn.length < 1) {\n      $scope.albums = [];\n      return console.log('No index available');\n    }\n\n    const qObject = query.build();\n\n    qObject.track_total_hits = true;\n\n    $scope.quickSearchState.loading = true;\n    es.search({\n      index : indicesToSearchIn,\n      type : '_doc',\n      body : qObject,\n      size : 0,\n    }, true, cacheKey).then(function success(response){\n      $scope.quickSearchState.loading = false;\n\n      if (!response.aggregations || typeof response.aggregations !== 'object') return;\n      if (response.aggregations.credit.buckets.length < 1){\n        return $scope.albums = [{\n          _index : indicesToSearchIn,\n          _type : '_doc',\n          key : 'Allar myndir',\n          doc_count : response.hits.total\n        }];\n      }\n      $scope.albums = [{\n        _index : indicesToSearchIn,\n        _type : '_doc',\n        key : 'Allar myndir',\n        doc_count : response.hits.total\n      }];\n\n      const agg = response.aggregations.credit;\n\n      if (! Array.isArray(agg.buckets)) return;\n\n      const albums = agg.buckets.map(function (hit){\n        hit._index = indicesToSearchIn;\n        hit._type = '_doc';\n        hit.filter = {\n          type : 'term',\n          field : $scope.aggrigateKey,\n          value : hit.key,\n        };\n        return hit;\n      });\n      $scope.albums = $scope.albums.concat(albums);\n    });\n  }\n\n  $scope.siteInit = false;\n\n  siteConfig.then(function (response){\n\n    $scope.config = response;\n    $scope.aggrigateKey = \"UserDefined4.keyword\";\n\n    const config = response.config;\n    if (\n      typeof config.albums === 'object' &&\n      typeof config.albums.aggregate === 'object' &&\n      typeof config.albums.aggregate.value === 'string'\n    ) {\n      $scope.aggrigateKey = config.albums.aggregate.value;\n\n\n      if ( typeof config.albums.aggregate.order === 'string' ) {\n\n        if (config.albums.aggregate.doc_count === true){\n          $scope.orderKey = \"doc_count\";\n        }else{\n          $scope.orderKey = \"key\";\n        }\n        $scope.orderType = (config.albums.aggregate.order === 'ASC') ? false : true;\n      }\n    }\n\n    $scope.tenant = response.tenant;\n    $scope.availableIndices = response.indices.filter(function (index){\n      return (index.type === 'album');\n    })\n\n    $scope.indexSelected = $scope.availableIndices;\n    fetchAlbums();\n    $scope.siteInit = true;\n  });\n\n  $scope.$watch('indexSelected', function (a,b){\n    if (!$scope.siteInit) return console.error('Site not init');\n    fetchAlbums();\n  }, true);\n}\n\nalbumsController.$inject = ['$scope', '$http', 'Api', 'es', 'bodybuilder', 'createImageUri', 'CacheFactory', 'MetaService'];\n\nexport default albumsController;\n","const tools = require('../../shared/tools');\nimport base64url from 'base64-url/index.mjs';\nconst $ = require('jquery');\n\nfunction imageController(\n  $scope, es, bodybuilder, $routeParams, $location,\n  createImageUri, $http, $anchorScroll, Api, navStatusProgress, hasPermission, MetaService){\n\n\n  const carousel = $('#carouselPrimaryImagesSlides');\n\n  const tenantId = $routeParams.tenantID;\n  $scope.tenant = tenantId;\n  $scope.index = $routeParams.index;\n  $scope.primaryImageUri = \"\";\n  $scope.image = {};\n  $scope.disableCommentSubmit = true;\n  $scope.validReCAPTCHA = false;\n  $scope.enableComments = false;\n  $scope.thumbs = {};\n  $scope.images = [];\n  $scope.showAlert = false;\n\n  const lastQueryEncoded = $location.search().query;\n\n  $scope.lastQuery = loadLastQuery();\n  $scope.imageIndex = parseNumber($location.search().i) || 0;\n  $scope.total = parseNumber($location.search().total) || 0;\n\n  $scope.prevUrl = $location.search().prev\n\n  $scope.alias = $location.search().alias;\n\n  $scope.nextImageLoading=false;\n  $scope.prevImageLoading=false;\n\n  $scope.userinfo = {};\n\n  const userInfoRequest = $http.get('/api/me');\n\n  userInfoRequest.then( function (response){\n    if (response.data){\n      $scope.userinfo = response.data;\n    }\n  }, tools.logHttpError);\n\n  $scope.hasPermission = function hasPermissionLookup(premRequired){\n    if ( !userInfoRequest || ! userInfoRequest.$$state ) return false;\n    if ( userInfoRequest.$$state.status !== 1 ) return false;\n    const perms = $scope.userinfo.permissions;\n    if (! perms) return false;\n\n    const perm = perms[tenantId] || perms.global;\n\n    return hasPermission(premRequired, perm);\n  }\n\n  function notifyUser(message, css){\n    $scope.alertMessage = message || \"\";\n    $scope.alertClass = css;\n    $scope.showAlert = true;\n\n    return function (){\n      $scope.showAlert= false;\n    }\n  }\n\n  function isNextAvailable(){\n    return !(($scope.total - 1) <= $scope.imageIndex);\n  };\n  function isPrevAvailable(){\n    return ($scope.imageIndex > 0);\n  };\n  $scope.prevImageAvailable = isPrevAvailable();\n  $scope.nextImageAvailable = isNextAvailable();\n\n  function updateSlideAvailabillity(){\n    $scope.prevImageAvailable = isPrevAvailable();\n    $scope.nextImageAvailable = isNextAvailable();\n  }\n\n  function loadLastQuery(){\n    const fallbackQuery = bodybuilder().query('match_all', '')\n\n    const query = $location.search().query;\n    const bQuery = $location.search().bquery;\n    if (!bQuery) return fallbackQuery;\n    let object = {};\n    let decoded;\n    try {\n      decoded = base64url.decode(bQuery);\n      object = JSON.parse(decoded);\n    } catch (e) {\n      console.error('Unable to parse object',{\n        error : e,\n        bQuery,\n        decoded,\n      });\n      return fallbackQuery;\n    }\n\n    console.log('Query decoded and using for search of next elements',{\n      query : object\n    })\n    return object;\n  }\n\n  function parseNumber(string){\n    const int = parseInt(string);\n    if (isNaN(int)) return false;\n    return int;\n  }\n\n  $scope.anchorScroll = $anchorScroll;\n\n\n  $scope.getImageSearchFilter = function getImageSearchFilter(type, field, value, index){\n    const filter =  [\n      { type: type, field : field, value : value }\n    ];\n\n    const filterParam = base64url.encode(JSON.stringify(filter));\n    return `/main/albums/${$scope.tenant}/${$routeParams.index}?filter=${filterParam}`;\n  };\n\n\n  $scope.getFilter = function getFilter(item){\n\n    if (!item.filter) return;\n\n    const filter =  [\n      { type: 'term', field : item.filter.field, value : item.filter.value }\n    ];\n\n    return base64url.encode(JSON.stringify(filter));\n  }\n\n\n  function fetchImageUri(hit, size){\n    size = size || 'medium';\n    const thumbs = createImageUri(hit);\n\n    $scope.thumbs = thumbs;\n    return thumbs[size];\n\n  }\n\n  function getCurrentImageMetadata(){\n    const image = es.search({\n      type: '_doc',\n      index: $routeParams.index,\n      size: 1,\n      body: bodybuilder().filter('term', '_id', $routeParams.id).build(),\n    });\n\n    image.then(function (response){\n\n      const doc = response.hits.hits.pop();\n\n\n      if (doc._source){\n        MetaService.updateWithDoc(doc);\n      }\n\n\n      $scope.image = parseHit(doc);\n      doc.active = true;\n      $scope.images = [doc];\n      prefetchImages();\n    }, function error(err){\n      if (err.status === 404){\n        notifyUser('Mynd fannst ekki', 'alert-danger')\n      }\n    })\n\n  }\n\n  function esSearch(size, from){\n\n    console.log('$scope.lastQuery', $scope.lastQuery)\n    const searchParams = {\n      size,\n      from,\n      body : $scope.lastQuery,\n      index: $scope.alias || $routeParams.index,\n    };\n\n    return es.search(searchParams, true, '', navStatusProgress);\n  }\n\n  function parseHit(hit){\n    hit.primaryImageUri = fetchImageUri(hit, 'x-large');\n    return hit;\n  }\n\n  function fetchNextImages(notify){\n    const request = esSearch(10, $scope.imageIndex + 1)\n    let done;\n    if (notify){\n      done = notifyUser('Er að sækja fleiri myndir', 'alert-info');\n    }\n\n    if ($scope.imageIndex > $scope.total) return;\n\n    request.then(function success(res){\n      if (typeof done === 'function') done();\n\n      if (Array.isArray(res.hits.hits)){\n        res.hits.hits.forEach(function (hit){\n          if (!isItemAvailable(hit._id)){\n            $scope.images.push(parseHit(hit));\n          }\n        });\n      }\n    });\n  }\n  function fetchPrevImages(notify){\n    let prevSize;\n    let prevFrom;\n\n    if ($scope.imageIndex >= 10) {\n      prevFrom = $scope.imageIndex - 10;\n      prevSize = 10;\n    } else {\n      prevFrom = 0;\n      prevSize = $scope.imageIndex;\n    }\n    if (prevSize < 1) return;\n\n    const request = esSearch( prevSize, prevFrom );\n    let done;\n    if (notify){\n      done = notifyUser('Er að sækja fleiri myndir', 'alert-info');\n    }\n\n    request.then(function success(res){\n      if (typeof done === 'function') done();\n\n      if (Array.isArray(res.hits.hits)){\n\n        const hits = res.hits.hits.reverse();\n\n        hits.forEach(function (hit){\n          console.log('already?', isItemAvailable(hit._id));\n          if (!isItemAvailable(hit._id)){\n            $scope.images.unshift(parseHit(hit));\n          }\n        });\n      }\n    });\n  }\n\n\n  function prefetchImages(){\n    fetchNextImages(false);\n    fetchPrevImages(false);\n  }\n\n  function setItemActive(id){\n    $scope.images.forEach(function (hit){\n      hit.active = (hit._id === id);\n    });\n  }\n\n  function isItemAvailable(id){\n\n    return ($scope.images.findIndex(function (hit){\n      return (hit._id === id);\n    }) > -1);\n\n  }\n\n  function getActive(){\n    const items = carousel.find('.carousel-item');\n\n    items.each(function (i, hit){\n      const element = $(hit);\n      const id = hit.id;\n      const isActive = element.hasClass('active');\n      if (isActive){\n        setItemActive(id);\n      }\n    });\n    return $scope.images.filter(function (hit){\n      return (hit.active);\n    }).pop();\n  }\n\n  function getCurrentIndex(){\n    return $scope.images.findIndex(function (hit){\n      return hit.active;\n    });\n  }\n\n  function updateRouteParams(){\n    const current = $scope.images.filter(function (hit){\n      return hit.active;\n    }).pop();\n\n    const id = current._id;\n\n    $location.search('i', $scope.imageIndex);\n    $routeParams.id = id;\n    const path = `/main/image/${$routeParams.tenantID}/${$routeParams.index}/${$routeParams.id}`;\n    $location.path(path);\n  }\n\n  function initCarouselEvents(ev){\n    if (ev.direction === 'left'){\n      $scope.imageIndex ++;\n    }\n\n    if (ev.direction === 'right'){\n      $scope.imageIndex --;\n    }\n    $scope.$applyAsync(function (){\n      $scope.image = getActive();\n\n      const currentLength = $scope.images.length;\n      const currentIndex = getCurrentIndex();\n\n      updateRouteParams();\n      updateSlideAvailabillity();\n\n\n      if ( (currentIndex + 3) > currentLength && ev.direction === 'left'){\n        return fetchNextImages(true);\n      }\n\n      if (currentIndex < 4 && (ev.direction === 'right')){\n        return fetchPrevImages(true);\n      }\n    });\n  }\n\n  $(document).ready(function (){\n    carousel.on('slid.bs.carousel', initCarouselEvents);\n  });\n\n\n\n  document.addEventListener('keydown', function (e){\n    if(e.keyCode == 37) { // left\n      if (!$scope.prevImageAvailable) return console.log('Very much at the left end')\n      return carousel.carousel('prev');\n    }\n    if(e.keyCode == 39) { // right\n      if (!$scope.nextImageAvailable) return console.log('Very much at the right end!')\n      return carousel.carousel('next');\n    }\n  });\n\n  Api.siteConfig().then( function (response){\n    const config = response.config;\n    $scope.config = response.config;\n    if (config.comments && config.reCAPTCHA){\n      $scope.enableComments = true;\n    }\n    if (typeof config.albums === 'object' && config.albums.showadvancedmetadata === undefined){\n      $scope.showAdvancedMatadata = true;\n    } else {\n      $scope.showAdvancedMatadata = config.albums.showadvancedmetadata;\n    }\n\n  });\n\n\n\n  getCurrentImageMetadata();\n}\n\n\nimageController.$inject = [\n  '$scope', 'es', 'bodybuilder', '$routeParams', '$location', 'createImageUri', '$http', '$anchorScroll', 'Api', 'navStatusProgress', 'hasPermission', 'MetaService'\n];\n\nexport default imageController;\n","\nfunction herarkSpecialSort(){\n  function toNumber(str){\n    const n = parseInt(str);\n    if (isNaN(n)) return 0;\n    return n;\n  }\n\n\n  function multiplyYear(val, i){\n    if (i === 0){\n      return val * 100;\n    }\n    return val;\n  }\n\n  function magnitude(str){\n    const numbs = str.split('-')\n                  .map(toNumber)\n                  .reverse()\n                  .map(multiplyYear)\n\n    if (numbs.length === 1){\n      numbs.push(0)\n    };\n\n    return numbs.reduce(function (a,b){\n      return a + b;\n    });\n  }\n  const matcher = new RegExp(/^[0-9]{1}\\-[0-9]{4}$/);\n  return function herakSpecialSortFn(a,b){\n    const aNumber = magnitude(a.value);\n    const bNumber = magnitude(b.value);\n    return (aNumber > bNumber) ? 1 : -1;\n  };\n}\n\n\nfunction archivesController($scope, es, bodybuilder, $routeParams, $http, Api, $location, MetaService){\n  \n  $scope.navigation = [];\n  $scope.postedQuickQuery = \"\";\n  $scope.quickSearchState = {\n    loading: false,\n  };\n  \n  function getUrlQuery(){\n    if ($routeParams.query) return $routeParams.query;\n    return '';\n  }\n  \n  $scope.quickQuery = getUrlQuery();\n  $scope.deepSearch = true; // ($scope.quickQuery) ? true : false;\n\n\n  $scope.doDeepSearch = function doDeepSearch() {\n\n\n    if ($scope.quickQuery === '') {\n      $location.search('query', '');\n      return init('');\n    }\n\n    if (!$scope.deepSearch) return;\n\n\n    // console.log('Dooooing deep search', $scope.quickQuery, $scope.quickQuery.length )\n    if ($scope.quickQuery.length < 3 && $scope.quickQuery !== \"\") {\n      $scope.quickSearchState = {\n        error: 'Texti þarf að vera lengri en 3 stafir',\n      };\n      return;\n    }\n\n    delete $scope.quickSearchState.error;\n\n    $scope.postedQuickQuery = $scope.quickQuery;\n\n    $location.search('query', $scope.quickQuery);\n    return init($scope.quickQuery);\n  }\n\n\n  $scope.filterView = function filterView(query) {\n    return function each(item) {\n      // Disable this search on deep search enabled.\n      if ($scope.deepSearch) return true;\n      if (!query) return true;\n      const regex = new RegExp(query.toUpperCase());\n\n      return regex.test(item.key.toUpperCase());\n    }\n  }\n\n  const siteConfig = Api.siteConfig();\n  const customSortsFns = {\n    custom_herak_1 : herarkSpecialSort,\n  };\n\n  $scope.docCount = function docCount(count){\n    if (typeof count === 'object') return count.value;\n    return count;\n  }\n\n\n  function addFilter(index){\n    const already = $scope.filters.some(function (i){\n      return (index.field === i.field);\n    });\n\n    if (already) return;\n\n    $scope.filters.push(index);\n  }\n\n  $scope.customcompare = undefined;\n  $scope.siteInit = false;\n\n  const defaultLevels = [\n    { id:0, sort: { count: false, order: 'ASC', }, key: 'Source.keyword' },\n    { id:1, sort: { count: false, order: 'ASC', }, key: 'UserDefined4.keyword' },\n    { id:2, sort: { count: false, order: 'ASC', }, key: 'UserDefined12.keyword' },\n    { id:3, sort: { count: false, order: 'ASC', }, key: 'UserDefined14.keyword' },\n  ];\n\n  $scope.levels = defaultLevels;\n\n  function currentLevel(){\n    return $scope.levels[$scope.level];\n  }\n\n  function lastKey(){\n    return $scope.levels[$scope.level - 1].key;\n  }\n\n  function currentKey(){\n    return currentLevel().key;\n  }\n\n  function getSortKey(){\n    const level = currentLevel();\n    if (level.sort.count === true){\n      return 'doc_count';\n    }\n    return 'key';\n  }\n\n  function getSortOrder(){\n    const level = currentLevel();\n    const reverse = (level.sort.order.toLowerCase() === 'desc');\n    return reverse;\n  }\n\n  function populateNavication(){\n\n\n    $scope.navigation = [{\n      name: 'Yfirlit',\n      uri: '/main/archives',\n    }];\n    const levels = Object.keys($routeParams).filter(key => {\n      return /level[0-9]/.test(key);\n    });\n    function getNavUri(arr, name){\n      const lastUri = arr.map(n => n.uri ).pop();\n\n      const uriParts = [lastUri];\n      uriParts.push(\n        encodeURIComponent(name)\n      );\n      return uriParts.join('/');\n    }\n\n    levels.forEach((level, i) => {\n      const nextLevel = levels[i + 1];\n\n      const name = $routeParams[level];\n      const uri = getNavUri($scope.navigation, name);\n      $scope.navigation.push({\n        uri,\n        name,\n        active: (nextLevel === undefined),\n      });\n    });\n  }\n\n  $scope.levelSet = false;\n\n  function init(queryString){\n\n\n    populateNavication();\n    $scope.siteInit = true;\n    if ($routeParams.level1){\n      $scope.level = 1;\n      addFilter({\n        type : 'term',\n        field : lastKey(),\n        value : $routeParams.level1\n      });\n    }\n    if ($routeParams.level2){\n      $scope.level = 2;\n      addFilter({\n        type : 'term',\n        field : lastKey(),\n        value : $routeParams.level2\n      });\n    }\n    if ($routeParams.level3){\n      $scope.level = 3;\n      addFilter({\n        type : 'term',\n        field : lastKey(),\n        value : $routeParams.level3\n      });\n    }\n    if ($routeParams.level4){\n      $scope.level = 4;\n      addFilter({\n        type : 'term',\n        field : lastKey(),\n        value : $routeParams.level4\n      });\n    }\n\n\n    const arr = $scope.filters.map(function (filter){\n      return filter.value;\n    });\n\n    const title = ($scope.filters.length > 0) ? $scope.filters[$scope.filters.length -1 ].value : 'Miðlunarvefur';\n\n    MetaService.set({\n      Title: title,\n      Description: arr.join('/'),\n    });\n\n    $scope.levelSet = true;\n\n    $scope.sortKey = getSortKey();\n    $scope.sortOrder = getSortOrder();\n\n\n    const level = currentLevel();\n\n    if (angular.isObject(level) &&\n        angular.isObject(level.sort) &&\n        angular.isObject(level.sort.fn) &&\n        angular.isString(level.sort.fn.key)){\n      const fnKey = level.sort.fn.key;\n      const fn = customSortsFns[fnKey];\n      if (angular.isFunction(fn)){\n        $scope.customcompare = fn();\n      }\n    }\n\n    // console.log('init',{\n    //   level: level,\n    //   sortKey : $scope.sortKey,\n    //   sortOrder : $scope.sortOrder,\n    //   customcompare: $scope.customcompare,\n    // })\n\n    if (queryString || queryString === ''){\n      \n      return fetchTree($scope.filters, $scope.level, queryString);\n      \n    }\n    const uriq = getUrlQuery() || false;\n    const q = queryString || uriq;\n    return fetchTree($scope.filters, $scope.level, q);\n\n  }\n\n  siteConfig.then(function (res){\n    const data = res;\n    if (data.config.archive && Array.isArray(data.config.archive.levels)){\n      const aLevels = data.config.archive.levels;\n      $scope.levels = aLevels.map(function (level){\n        level.key = level.agg.value;\n        return level;\n      }).sort(function (a,b){\n        if (!a.id || !b.id) return;\n        return a.id - b.id;\n      })\n\n    }\n\n    $scope.tenant = data.tenant;\n\n    $scope.settings = data;\n\n    const indices = data.indices.filter(function (index){\n      return (index.type === 'archive');\n    });\n\n    $scope.indices = indices.map(function (index){\n      index.use = true;\n      return index;\n    });\n\n\n    $scope.availableIndices = data.indices.filter(function (index){\n      return (index.type === 'archive');\n    })\n\n    $scope.indexSelected = $scope.availableIndices;\n\n    $scope.level = 0;\n\n    $scope.filters = [];\n\n    init();\n  });\n\n\n  $scope.customSort = function customSort(item){\n    const level = currentLevel();\n    return false;\n  }\n\n  function getArchiveConfig(){\n    if (typeof $scope.settings !== 'object') return false;\n    if (typeof $scope.settings.config !== 'object') return false;\n    if (typeof $scope.settings.config.archive !== 'object') return false;\n\n    return $scope.settings.config.archive;\n\n  }\n\n  $scope.albumFilterSet = false;\n\n  $scope.customFilter = function customFilter(filter, record){\n    const archiveConfig = getArchiveConfig();\n    const clone = angular.copy($scope.filters);\n\n    clone.push(filter);\n\n    if (!$scope.levelSet) return;\n\n    if (record._albumFilter) return record._albumFilter;\n    if (typeof archiveConfig.thumbnail === 'object' &&\n      typeof archiveConfig.thumbnail.filter === 'object' &&\n      (\n        typeof archiveConfig.thumbnail.filter.value === 'string' ||\n        typeof archiveConfig.thumbnail.filter.value === 'number'\n      )\n      ){\n      clone.push(archiveConfig.thumbnail.filter);\n      record._albumFilter = clone;\n      return clone;\n    }\n\n    record._albumFilter = filter;\n    return filter;\n  }\n\n  $scope.archives = [];\n\n  function fetchTree(filters, level, queryString){\n\n\n    const field = $scope.levels[level].key;\n\n\n    const nextLevel = $scope.levels[level + 1];\n\n    let nextField = false;\n\n    if (angular.isObject(nextLevel) && angular.isString(nextLevel.key)){\n      nextField = nextLevel.key;\n    }\n\n    // console.log(JSON.stringify (nextLevel, null, 2),{level, nextLevel, nextField, k : nextField.key, ob : angular.isObject(nextLevel), st : angular.isString(nextField.key)})\n    let query;\n\n    if (nextField){\n      query = bodybuilder().agg('terms', field, 'source', {size : 500}, function (q){\n        return q.agg('terms', nextField, 'nextLevel', { size : 1});\n      });\n    } else {\n      query = bodybuilder().agg('terms', field, 'source', {size : 500});\n    }\n    const indices = $scope.indexSelected.map((i) => i.index);\n\n    if (Array.isArray(filters)){\n      filters.forEach(function (filter){\n        query.filter(filter.type, filter.field, filter.value);\n      })\n    }\n\n    if (indices.length < 1){\n      return $scope.archives = [];\n    }\n\n    if (queryString){\n      query.query('query_string', 'query', queryString);\n    }\n\n    const request = es.search({\n      index : indices,\n      type : '_doc',\n      body : query.build()\n    });\n\n    request.then(function success(response){\n      // console.log('fetchTree', {response})\n      const agg = response.aggregations.source;\n      if (!agg) return;\n\n      $scope.archives = agg.buckets.map(function (hit){\n        hit._index = indices,\n        hit._type = '_doc';\n        hit._nextAvailable = isNextAvailable(hit);\n        hit.filter = {\n          type : 'term',\n          value : hit.key,\n          field : field\n        };\n        hit.next = getNext(level, hit);\n        return hit;\n      });\n    });\n\n    function getNext(level, hit){\n\n      if (level < 3 && hit._nextAvailable === false){\n        return createArchiveUri(hit);\n      }\n      const indicesSelected = $location.search().selected || \"\";\n\n      const key = encodeURIComponent(hit.key);\n      if (level === 0) return `/main/archives/${key}?selected=${indicesSelected}&query=${$scope.postedQuickQuery}`;\n      if (level === 1) return `/main/archives/${$routeParams.level1}/${key}?selected=${indicesSelected}&query=${$scope.postedQuickQuery}`;\n      if (level === 2) return `/main/archives/${$routeParams.level1}/${$routeParams.level2}/${key}?selected=${indicesSelected}&query=${$scope.postedQuickQuery}`;\n      if (level === 3) return `/main/archive/${$routeParams.level1}/${$routeParams.level2}/${$routeParams.level3}/${key}?meta=true`;\n    }\n  }\n\n  function createArchiveUri(hit){\n\n    const levelKeys = [\n      'level1',\n      'level2',\n      'level3',\n    ];\n\n    const uriArray = levelKeys.map(function (key){\n      return $routeParams[key];\n    }).filter(function (item){\n      return item;\n    })\n    uriArray.push(hit.key)\n\n    const paths = uriArray.join('/');\n    const url = `/main/archive/${paths}?meta=true`;\n    return url;\n  }\n\n  function isNextAvailable(hit){\n    if (! angular.isObject(hit)) return false;\n    if (! angular.isObject(hit.nextLevel)) return false;\n    if (! angular.isArray(hit.nextLevel.buckets)) return false;\n    if (hit.nextLevel.buckets.length < 1) return false;\n    return true;\n  }\n\n  $scope.$watch('indexSelected', function (a,b){\n    if (!$scope.siteInit) return;\n\n    if (!b) return;\n    init();\n  }, true);\n};\n\narchivesController.$inject = ['$scope', 'es', 'bodybuilder', '$routeParams', '$http', 'Api', '$location', 'MetaService'];\n\nexport default archivesController;\n","\n\nconst $ = require('jquery');\nwindow.jQuery = $;\n// require('jquery.guillotine');\nconst async = require('async-es');\n\nfunction archiveController(\n    $scope, $http, es, bodybuilder, $routeParams,\n    $location, createImageUri, Notification, Api, Slide, MetaService, createLink){\n\n\n  const carouselElement = $('#carouselIdicator');\n  const carousel = carouselElement.carousel({\n    interval:0,\n    keyboard: true,\n    ride: false,\n    wrap: false,\n  })\n\n  $scope.docCount = function docCount(count){\n    if (typeof count === 'object') return count.value;\n    return count;\n  }\n\n  const siteConfig = Api.siteConfig();\n  // const guillotineCache = {};\n\n  const scrollElement = document.getElementById('thumbnail-scroll-container');\n  if (scrollElement){\n    scrollElement.addEventListener('wheel', function (e){\n      e.preventDefault();\n      scrollElement.scrollBy({\n        left: e.deltaY < 0 ? -100 : 100,\n      });\n    });\n  }\n\n  $scope.zoom = {};\n  $scope.config = false;\n  $scope.disableRouteChange = false;\n  $scope.showMetadata = isMetaInQuery();\n  $scope.showThumbs = false;\n  $scope.isPrinting = false;\n  $scope.userinfo = {};\n  $scope.size = getQueryParamAsInt('size', 1200);\n  $scope.from = getQueryParamAsInt('from', 0);\n  $scope.slide = getQueryParamAsInt('slide', 0);\n  $scope.imageCount = 1000000;\n  $scope.hasInit = false;\n\n  const marginForNextFetch = 10;\n\n  function toNumber(string, def){\n    return (isNaN(parseInt(string))) ? (def || 0) : parseInt(string);\n  }\n\n  function getQueryParamAsInt(name, def){\n    const params = $location.search();\n    const value = params[name];\n    return toNumber(value, def);\n  }\n\n  $http.get('/api/me').then(function success(response){\n    $scope.userinfo = response.data;\n  });\n\n  $scope.print = function printDoc(){\n    $scope.isPrinting = true;\n\n    setTimeout(function (){\n      window.print();\n      $scope.$applyAsync(function (){\n        $scope.isPrinting = false;\n      });\n    }, 100);\n  }\n\n  $scope.imageDownloadUri = function imageDownloadUri(doc){\n    if (!doc) return false;\n    if (!doc._source) return false;\n    const loc = createImageUri(doc);\n    return loc['x-large'];\n  }\n\n  $scope.imageName = function imageName(doc){\n    if (!doc) return;\n    if (!doc._source) return;\n    return doc._source.ObjectName;\n  }\n\n  $scope.currentImageInZoom = false;\n  function isMetaInQuery(){\n    const meta = $location.search().meta;\n    if (!meta) return false;\n    if (meta === \"true\") return true;\n    if (meta === \"false\") return false;\n    return false;\n  }\n\n  $scope.toggleShowMetadata = function toggleShowMetadata(){\n    $scope.showMetadata = ! $scope.showMetadata;\n    const meta = ($scope.showMetadata) ? 'true' : 'false';\n    $location.search('meta', meta)\n  }\n\n  $scope.thumbMinWidth = function thumbMinWidth(image, size){\n    if (! image || !image._source) return;\n    const thumb = image._source.thumbnails[size];\n    return `min-width: ${thumb.size.width}px;`;\n  }\n\n  $scope.isLoadingThumbs = false;\n  $scope.hasLoadedAllImages = false;\n\n  function fetchAllRecords(progressCallback){\n\n    progressCallback = progressCallback || function (){}\n    return new Promise(function promise(resolve, reject) {\n      const indices = $scope.indices.map((i) => i.index);\n      const slider = new Slide(indices.join(','), $scope.queryObj.build(), $scope.size, 0);\n      const init = slider.fetch();\n      let arr;\n\n      init.then(function (res){\n        arr = res.hits.hits;\n\n        const total = (typeof res.hits.total === 'object') ? res.hits.total.value : res.hits.total;\n\n        async.doWhilst(function (callback){\n          const req = slider.next();\n          return req.then(function (data){\n            if(data) {\n              arr = arr.concat(data.hits.hits);\n              const finished = arr.length;\n              const percentage = Math.floor((finished / total) * 100);\n              progressCallback({\n                finished : finished,\n                total : total,\n                percentage : percentage,\n              });\n              return callback(null , true);\n            }\n\n            return callback(null, false);\n          }, function error(err){\n            console.error('Error in next request', err);\n            return callback(err);\n          })\n\n        }, function test( arg, callback){\n          if (!arg) return callback();\n\n          return callback(null, 'data?');\n        }, function done(err){\n          if (err) return reject(err);\n          resolve(arr);\n        });\n      }, function error(err){\n        return reject(err);\n      });\n    });\n  }\n\n  $scope.errorLoadingThumbs = false;\n\n  function recordExists(id){\n    if (! $scope.images ) return false;\n    return $scope.images.some(function (img){\n      return img._id === id;\n    })\n  }\n\n  $scope.toggleShowThumbs = function toggleShowThumbs(){\n    let i = 0;\n    $scope.showThumbs = ! $scope.showThumbs;\n    $scope.isLoadingThumbs = true;\n    const fetching = fetchAllRecords(function (status){\n      $scope.$applyAsync(function (){\n        $scope.loadingThumbsStatus = status.percentage\n      });\n    });\n\n    fetching.then(function (res){\n      $scope.$applyAsync(function (){\n        res.forEach(function (item){\n          const exists = recordExists(item._id);\n          if (! exists ){\n            $scope.images.push(item);\n          }\n        });\n      });\n      // const arr = res.map(function (item, i){\n      //   if (i === $scope.slide){\n      //     item.active = true;\n      //   }\n      //   return item;\n      // });\n\n\n\n      // $scope.$applyAsync(function (){\n      //   $scope.images = arr;\n      //   $scope.isLoadingThumbs = false;\n      //   $scope.hasLoadedAllImages = true;\n      // });\n    }, function (err){\n      console.error(`Unable to load thumbnails`, err);\n    });\n  }\n\n  $scope.regAvailable = function regAvailable(doc){\n    if (!doc) return false;\n    if (!$scope.registryIndexAvailable) return false;\n    if (!doc._source) return false;\n    if (doc._source.CustomField10) return true;\n  }\n  $scope.getRegistryUri = function getRegistryUri(doc){\n    if (!doc) return \"\";\n    if (!doc._source) return \"\";\n/*\nconst firstChar = hit._source.skjalamyndari.substring(0,1);\nconst myndari = encodeURIComponent(hit._source.skjalamyndari);\nconst primaryCategory = encodeURIComponent(hit._source.yfirskjalafl);\nconst categoryName = encodeURIComponent(hit._source['heiti-skjalafl']);\nconst release = encodeURIComponent(hit._source.afhnumer);\n\nconst id = generateFilemakerId(hit);\nurl.pathname = `/main/registry/${firstChar}/${myndari}/${release}/${primaryCategory}/${categoryName}`;\nurl.searchParams.set('id', id);\nreturn url.toString();\n */\n\n\n    const id = doc._source.ReferenceNumber;\n    const category = doc._source.CustomField10;\n    const box = doc._source.CustomField11;\n    const sheet = doc._source.CustomField12;\n    return `/main/registry?id=${id}&category=${category}&box=${box}&sheet=${sheet}`;\n  }\n\n  $scope.selectThumbnail = function selectThumbnail(i, image){\n    $scope.showThumbs = false;\n\n    $scope.changeImage( i );\n  }\n\n  $scope.getCurrentMagnification = function getCurrentMagnification(){\n    if (!$scope.currentImageInZoom) return 1;\n    return $scope.currentImageInZoom.__magnification;\n  }\n\n  const tooltips = $('[data-toggle=\"tooltip\"]');\n\n  function updateTooltips(){\n    setTimeout(function (){\n      tooltips.each(function (key, value){\n        const elm = $(value);\n        const current = elm.attr('title');\n        const desc = elm.attr('aria-describedby');\n        if (desc){\n          elm.attr('data-original-title', current);\n          elm.tooltip('dispose').tooltip('show')\n        }\n      });\n    }, 100)\n\n  }\n\n  $scope.registryIndexAvailable = false;\n  const indexMap = {};\n  siteConfig.then(function (res){\n    $scope.config = res;\n    const data = res;\n    $scope.tenant = data.tenant;\n    const indices = data.indices.filter(function (index){\n      return (index.type === 'archive');\n    });\n    $scope.registryIndexAvailable = data.indices.some(function (index){\n      return (index.type === 'filemaker');\n    });\n    $scope.indices = indices.map(function (index){\n      index.use = true;\n      return index;\n    });\n\n    $scope.indices.forEach(function (index){\n      indexMap[index.id] = index;\n    });\n\n    fetchArhive()\n  });\n\n  $scope.fetchImageUri = function fetchImageUri(hit, size){\n    size = size || 'medium';\n    const thumbs = createImageUri(hit);\n    const image = thumbs[size];\n    if (!image) return thumbs['medium'];\n\n    return image;\n  }\n\n  $scope.getImagesrcset = function getImagesrcset(hit){\n    const thumbs = createImageUri(hit);\n    return thumbs.srcset;\n  }\n\n  $scope.setLocation = function setLocation(event){\n    console.log(event, event.offsetX , angular.element(event.target));\n  }\n\n  $scope.currentSlide = 0;\n\n  $scope.curDoc = {};\n\n  $scope.log = function (item){\n    console.log('LOG', item)\n  }\n\n  function fetchIfNeeded(){\n\n    if ($scope.hasLoadedAllImages) return console.log('All images loaded');\n\n\n    if ( ! angular.isObject($scope.curDoc) ) return console.error('Current doc not valid', $scope.curDoc);\n\n    if ( ! angular.isNumber($scope.curDoc._slide)) return console.error('Current doc not valid', $scope.curDoc);\n    const inx = $scope.curDoc._slide;\n    const topMargin = inx + marginForNextFetch;\n    const ceil = $scope.elasticSlider.nextFrom;\n    const marginBottom = inx - marginForNextFetch;\n\n    if (marginBottom < ($scope.elasticSlider.prevFrom + $scope.size)) {\n      return fetchPrev();\n    }\n\n    if (topMargin >= ceil){\n      return fetchNext();\n    }\n  }\n\n  carousel.on('slide.bs.carousel', function (event, data) {\n    $scope.$applyAsync(function (){\n      $scope.slide = event.to;\n    });\n  });\n\n\n  $scope.isLookingUpRegistry = false;\n  $scope.registryRecord = false;\n\n  const registryCache = {};\n\n  $scope.lookupRegistry = function lookupRegistry(doc){\n    if (! $scope.config) return false;\n    if (! Array.isArray($scope.config.indices)) return false;\n    const indices = $scope.config.indices.filter(index => {\n      return (index.type === 'filemaker');\n    });\n\n    if (indices.length < 1) return false;\n    const src = doc._source;\n\n    if (! src ) return false;\n\n    if (registryCache[doc._id]) return registryCache[doc._id];\n\n    const fieldsRequired = [\n      'ReferenceNumber',\n      'CustomField10',\n      'CustomField11',\n      'CustomField12'\n    ];\n\n    const exists = fieldsRequired.every(function (field){\n      return src[field];\n    });\n\n    if (! exists) return registryCache[doc._id];\n\n    registryCache[doc._id] = {\n      link: \"#loading\",\n      ready: false,\n      loading: true,\n      text: `${src.ReferenceNumber} ${src.CustomField10}/${src.CustomField11} - ${src.CustomField12}`\n    };\n\n\n    const ref = src.ReferenceNumber;\n    const category = src.CustomField10;\n    const box = src.CustomField11_number;\n    const sheet = src.CustomField12_number;\n\n    const query = bodybuilder();\n\n\n    query.addFilter('term', 'afhnumer.keyword', ref);\n    query.addFilter('term', 'kassanumer', box);\n    query.addFilter('term', 'skjalaflokkur.keyword', category);\n    query.addFilter('term', 'ork', sheet);\n\n    const index = indices.map(function (index){\n      return index.index || index.id;\n    }).join(',');\n    function generateFilemakerId(doc){\n      const key = `level5-${doc._source['heiti-skjalafl']}`;\n      const hash = hashString(key);\n      return `tree_${hash}`;\n    }\n\n    es.search({\n      index,\n      body: query.build(),\n    }).then(function (res){\n      registryCache[doc._id].loaded = true;\n      const hit = res.hits.hits.pop();\n\n      if (! hit || ! hit._source ) return;\n\n      const link = createLink('filemaker', hit, $scope.config, []);\n      registryCache[doc._id].link = link;\n      registryCache[doc._id].ready = true;\n\n    }).catch(function error(err){\n      console.error('Unable to lookup registry', err);\n    });\n\n    return registryCache[doc._id];\n  }\n\n  function resetZooms(){\n    $scope.images.forEach(function (hit){\n      if (typeof hit.reset === 'function'){\n        hit.reset();\n      }\n    });\n  }\n\n  carousel.on('slid.bs.carousel', function (event, data) {\n    resetZooms();\n    $scope.$applyAsync(function (){\n      const trueIndex = $scope.images.findIndex(function (item,x){\n        const id = `#${item._id}`;\n        return $(id).hasClass('active');\n      });\n      $location.search('slide', $scope.slide);\n      $scope.curDoc = $scope.images[trueIndex];\n\n      updateMetaservice($scope.curDoc);\n      fetchIfNeeded();\n\n    });\n  });\n\n  function getVirtualIndex(int){\n    return $scope.images.findIndex(function (item){\n      return item._slide === int;\n    })\n  }\n\n  $scope.changeImage = function changeImage(int){\n    $scope.$applyAsync(function (){\n      if (typeof int === 'number'){\n\n        // $location.search('slide', int + 1);\n        carousel.carousel( int );\n      }\n    })\n  }\n\n  $scope.images = [];\n\n  $scope.navigation = [{\n    name : 'Yfirlit',\n    uri : '/main/archives',\n    active : false,\n  }];\n\n  $(\"body\").keydown(function(e) {\n    if(e.keyCode == 37) { // left\n      const int = $scope.slide - 1;\n      if ( int < 0) return console.log('Very much at the left end')\n      return $scope.changeImage(int);\n    }\n    if(e.keyCode == 39) { // right\n      const int = $scope.slide + 1;\n      if ( int>= $scope.images.length) return console.log('Very much at the right end!')\n      return $scope.changeImage(int);\n    }\n  });\n\n\n  function fetchPrev(){\n\n    if (!$scope.elasticSlider._prevAvailable) return console.log('At the end');\n    const request = $scope.elasticSlider.prev();\n    request.then(function response(response){\n      const hits = parseHits(response.hits.hits, false);\n      hits.reverse().forEach(function (hit){\n        $scope.images.unshift(hit);\n      });\n    });\n\n    return request;\n  }\n\n\n  function fetchNext(){\n    if (!$scope.elasticSlider._nextAvailable) return console.log('At the end');\n    const request = $scope.elasticSlider.next();\n    request.then(function response(response){\n      if (!response || !response.hits) return console.error('response not valid', response)\n      const hits = parseHits(response.hits.hits, false);\n      $scope.images = $scope.images.concat(hits);\n    });\n\n    return request;\n  }\n\n  $scope.nextSlide = function nextSlide(){\n    carousel.carousel('next');\n  }\n\n  $scope.prevSlide = function prevSlide(){\n    carousel.carousel('prev');\n  }\n\n  $scope.showEditLink = true;\n\n  $scope.getEditLink = function getEditLink(){\n\n    if (!$scope.curDoc) {\n      $scope.showEditLink = false;\n      return \"\";\n    }\n    $scope.showEditLink = true;\n\n    const levels = {\n      level1: $routeParams.level1,\n      level2: $routeParams.level2,\n      level3: $routeParams.level3,\n      level4: $routeParams.level4,\n      index: $scope.curDoc._index,\n      id: $scope.curDoc._id,\n    };\n\n    const template = '/main/crowdsource/archive/:index/:level1/:level2/:level3/:level4/:id';\n\n    const path = template.split('/').map(function (part){\n      if (part.charAt(0) === ':'){\n        const key = part.substring(1, part.length );\n        const value = levels[key];\n        if (!value) return false;\n        return encodeURI(value);\n      }\n      return part;\n    }).filter( e => {\n      return (e !== false);\n    }).join('/');\n    const url = `${path}?i=${$scope.slide}`;\n    if ( ! $scope.userinfo || ! $scope.userinfo.id) {\n      return `/login?login=iceland&return=${encodeURI(url)}`;\n    }\n\n    return url;\n  }\n\n  $scope.showMetadataDetails = function showMetadataDetails(user){\n    if ( typeof user !== 'object' ) return false;\n\n    const permissions = user.permissions;\n\n\n    if (permissions && (permissions.current || permissions.global) ){\n      const hasPerm = [\n        'global::admin',\n        'tenant::user',\n        'tenant::admin',\n        'tenant::superuser' ].includes(permissions.current || permissions.global);\n      return hasPerm;\n    }\n    return false;\n  }\n\n  const csCache = {};\n\n\n  $scope.getCrowdsourceText = function getCrowdsourceText(page, doc){\n\n    const id = doc._id;\n    if (! $scope.tenant) return \"\";\n\n    \n    const cached = csCache[id];\n    const fallback = \"Enginn texti skráður\";\n    \n    if (cached) {\n      if (cached.active && cached.active.record){\n        $scope.curDoc.crowdsource = cached.active.record;\n\n        if (page === 'available'){\n          return true;\n        }\n\n        // if (page === 'right'){\n        //   return cached.active.record.pageRight || fallback;\n        // }\n        // if (page === 'left'){\n        //   return cached.active.record.pageLeft || fallback;\n        // }else {\n        //   console.log(`Page ${page} does not exists in record`, cached.active);\n        //   return \"\";\n        // }\n      }\n      if (page === 'available'){\n        return false;\n      }\n      return fallback;\n    }\n\n    const currentCs = Api.crowdsource.get({\n      documentId: id,\n      indexId: doc._index,\n      tenantId: $scope.tenant,\n      id: '_active',\n    });\n\n    csCache[id] = currentCs;\n\n    return \"\";\n  }\n\n  const csIndexCache = {};\n\n\n  $scope.isCrowdsource = function isCrowdsource(hit){\n\n    if (! hit || ! hit._index ) return false;\n    const index = hit._index;\n    if (! $scope.tenant) return false;\n    const ccs = csIndexCache[index];\n    if (ccs) {\n      if (! ccs.$resolved ) return false;\n\n      if (ccs.aggregations) return true;\n      return false;\n    }\n\n    const cs = Api.crowdsource.get({\n      indexId: index,\n      tenantId: $scope.tenant,\n    });\n\n    cs.$promise.catch(function error(err){\n      console.error('Unable to fetch crowdsource', err);\n    });\n\n    csIndexCache[index] = cs;\n    return false;\n  }\n\n  $scope.textAvailable = function textAvailable(){\n    return $scope.getCrowdsourceText('available', $scope.curDoc);\n  }\n\n  function updateMetaservice(doc){\n    const thumbUris = createImageUri(doc);\n    MetaService.set({\n      Title: `${doc._source.Description}/${doc._source.Title}`,\n      Thumbnail: thumbUris.large,\n    });\n  }\n\n  function fetch(){\n\n    const indices = $scope.indices.map((i) => i.index);\n    $scope.elasticSlider = new Slide(indices.join(','), $scope.queryObj.build(), $scope.size, $scope.slide);\n    const firstFetch = $scope.elasticSlider.fetch();\n    firstFetch.then(function (response){\n      $scope.imageCount = (typeof response.hits.total === 'object') ? response.hits.total.value : response.hits.total;\n      const hits = parseHits(response.hits.hits, response._slide.from);\n      $scope.$applyAsync(function (){\n        const pre = $scope.images.length;\n        $scope.images = hits;\n        if ($scope.curDoc && $scope.curDoc._source){\n          updateMetaservice($scope.curDoc);\n        }\n      });\n    });\n\n    return firstFetch;\n  }\n\n  function parseHits(hits, from){\n    const size = from || 0;\n    let i = $scope.slide;\n    return hits.map(function (hit, n){\n      const index = size + n;\n      hit.active = false;\n      if (index === i && from !== false){\n        hit.active = true;\n        $scope.curDoc = hit;\n      }\n      return hit;\n    });\n  }\n\n  $scope.queryObj = {};\n\n  $scope.isPrevAvailable = function isPrevAvailable(){\n    const s = $scope.slide + 1;\n    if (s === 1) return false;\n    return true;\n  }\n  $scope.isNextAvailable = function isNextAvailable(){\n    const s = $scope.slide + 1;\n    if (s < $scope.imageCount) return true;\n    return false;\n  }\n\n  $scope.getSlideIndex = function getSlideIndex(slide) {\n    return (slide + 1);\n  }\n\n\n  function getFilterMap(){\n\n    const defaultMap = {\n      level1 : 'Source.keyword',\n      level2 : 'UserDefined4.keyword',\n      level3 : 'UserDefined12.keyword',\n      level4 : 'UserDefined14.keyword',\n    };\n\n    if ( ! $scope.config ){\n      console.error('No config set, using default map');\n      return defaultMap;\n    }\n\n    const config = $scope.config.config;\n\n    const levels = config.archive.levels;\n\n    if ( ! Array.isArray(levels) ) {\n      console.error('Levels not array', { config });\n      return defaultMap;\n    }\n\n    const map = {};\n    levels.sort(function (a,b) {\n      return a.id - b.id;\n    }).forEach(function (level, i){\n      const id = i + 1;\n      const key = `level${id}`;\n      const value = level.agg.value;\n      map[key] = value;\n    });\n\n    return map;\n  }\n\n  function fetchArhive(){\n\n    $scope.queryObj = bodybuilder();\n    const filterMap = getFilterMap();\n    let uri = [];\n\n    const filterMapKeys = Object.keys(filterMap);\n\n    const toObjArray = filterMapKeys.map(function (key){\n      const field = filterMap[key];\n      const value = $routeParams[key];\n      if (!value) return false;\n      return {\n        key : key,\n        field: field,\n        value: value,\n      };\n    }).filter(function (item){\n      return item;\n    });\n\n    toObjArray.forEach(function (item, i){\n      const field = item.field;\n      const value = item.value;\n      const lastNav = $scope.navigation[ i ];\n      const lastUri = lastNav.uri;\n      $scope.queryObj.filter('term', field, value)\n      $scope.navigation.push({\n        name : value,\n        uri : `${lastUri}/${value}`,\n        active : false,\n      });\n    });\n\n    $scope.navigation[ $scope.navigation.length -1  ].active = true;\n\n\n    const defaultSortKey = '_sortedFileObject';\n    const defaultSortOrder = 'asc';\n\n    const archiveConfig = $scope.config.config.archive;\n\n    const sortBy = archiveConfig?.sortImagesBy?.value || defaultSortKey;\n    const sortByOrder = archiveConfig?.sortImagesBy?.order || defaultSortOrder;\n    $scope.queryObj.sort(sortBy, sortByOrder);\n\n    fetch().then(function (){\n      $scope.hasInit = true;\n      fetchIfNeeded();\n      setTimeout(function (){\n        document.body.classList.add('render-ready');\n      }, 100)\n    })\n  }\n}\n\narchiveController.$inject = ['$scope', '$http', 'es', 'bodybuilder', '$routeParams',\n'$location', 'createImageUri', 'Notification', 'Api', 'Slide', 'MetaService', 'createLink']\n\nexport default archiveController;\n","\nimport Search from '../../shared/tools/search.js';\nimport base64url from 'base64-url/index.mjs';\nconst $ = require('jquery');\n\nfunction albumsSearch( $scope, $routeParams, $location, $filter, $window, Api, createImageUri, CacheFactory, MetaService, es){\n\n\n  $scope.loading = true;\n  $scope.size = 60;\n  $scope.from = 0;\n  $scope.filterToEdit = false;\n  $scope.sorts = [];\n  $scope.filters = decodeUriFilters();\n  $scope.indices = [];\n  $scope.thumbnailView = true;\n  $scope.scrollDisabled = true;\n  $scope.metadata = { };\n  $scope.fuzzy = true;\n\n  $scope.currentImageId = $location.search().image;\n\n  $scope.openImageId = false;\n\n\n  $scope.docCount = function docCount(count){\n    if (typeof count === 'object') return count.value;\n    return count;\n  }\n\n\n  const filterHash = {\n    'Credit.keyword' : 'Ljósmyndari',\n    'Comment.keyword' : 'Myndatexti',\n    'Description.keyword': 'Lýsing',\n    'SupplementalCategories.keyword': 'Lykilorð',\n    'Source.keyword': 'Tegund',\n    'Category.keyword': 'Flokkur',\n    'SupplementalCategories.keyword': 'Undirflokkur',\n    'Country.keyword': 'Land',\n    'State.keyword': 'Sýsla',\n    'City.keyword': 'Bær',\n    'DateCreated.keyword': 'Tekin',\n    'Rights.keyword': 'Rétthafi',\n    'CaptionWriter.keyword': 'Skrásetjari',\n    'ReleaseDate.keyword': 'Skráningardagur',\n    'LocalCaption.keyword': 'Ítarupplýsingar',\n    'UserDefined3.keyword': 'Heimild',\n    'UserDefined4.keyword': 'Ljósmyndasafn',\n  };\n\n  $scope.$watch('sort', function (post, pre){\n    if (typeof post !== 'object') return;\n    if (typeof pre !== 'object') return;\n\n    if (post.name === pre.name) return console.log('Sort: no change', {pre, post});\n    $scope.submitSearch( true );\n  })\n\n\n  $scope.tenant = $routeParams.tenantID;\n  $scope.indices = getIndicesToSearchIn();\n\n  $scope.alias = $routeParams.indexId;\n  $scope.uriIndex = $routeParams.indexId;\n  $scope.showAdvancedSearch = ($location.hash() === 'advsearch');\n  $scope.index = $routeParams.indexId;\n\n  $scope.editFilter = function (filter){\n    // filterToEdit = filter; showAddFilter = true\n    $scope.filterToEdit = filter;\n    $scope.showAddFilter = true;\n  }\n\n  const uriCacheId = 'album/search/uri';\n\n  if (!CacheFactory.get(uriCacheId)) {\n  // or CacheFactory('bookCache', { ... });\n    CacheFactory.createCache(uriCacheId, {\n      deleteOnExpire: 'aggressive',\n      maxAge: 60 * 60 * 1000, // 1 hour\n      recycleFreq: 60 * 60 * 1000,\n      storageMode : 'localStorage',\n    });\n  }\n\n\n  const uriCache = CacheFactory.get(uriCacheId);\n\n  $scope.currentUri = $location.$$url\n\n\n  function getIndicesToSearchIn(){\n    return $routeParams.indexId;\n  }\n\n  $scope.getImageUri = function getImageUri(item){\n    const thumbs = createImageUri(item, ['x-small', 'small', 'medium']);\n    return thumbs;\n  }\n\n  $scope.getCurrentUri = function getCurrentUri(){\n    return $location.$$url;\n  }\n\n\n  $scope.removeKeyword = function removeKeyword(field){\n    const key = field.replace(/\\.keyword/g, '');\n\n    if ($scope.siteConfig && $scope.siteConfig.$$state && $scope.siteConfig.$$state.status === 1 ){\n      if (! $scope.config.search ) return key;\n      const map = $scope.config.search.mappings;\n      if (typeof map !== 'object' ) return key;\n\n      const prop = map[key];\n      if (prop && prop.name) return prop.name;\n    }\n\n    return key;\n  }\n\n\n\n  function encodeFilters(){\n    const filters = angular.copy($scope.filters);\n\n    const json = JSON.stringify(filters);\n\n    const base64 = base64url.encode(json);\n    return $location.search('filter', base64)\n\n    // console.log('encodeFilters', filters, base64);\n  }\n\n\n  $scope.$watchCollection('filters', function filterChange(post, pre){\n    const f1 = JSON.stringify(pre);\n    const f2 = JSON.stringify(post);\n    if (f1 === f2) return;\n\n    encodeFilters();\n    $scope.submitSearch(true);\n  })\n\n  function onPageLoad(state){\n\n    const queryString = $location.search().query_string;\n\n    if (queryString) {\n      $scope.searchInput = queryString;\n    }\n\n    const config = $scope.config;\n    if (config.albums && typeof config.albums.sort === 'object'){\n      let field = config.albums.sort.field;\n      if (config.albums.sort.isString !== false){\n        field = `${field}.keyword`;\n      }\n\n      const order = (typeof config.albums.sort.order === 'string') ? config.albums.sort.order : 'ASC';\n      const i = $scope.sorts.findIndex(function (s){\n        return (s.field === config.albums.sort.field);\n      });\n\n      if (i > 0) {\n        $scope.sort = $scope.sorts[i] || {};\n        $scope.sort.order = config.albums.sort.order;\n      }\n\n\n      console.log(i, $scope.sort);\n    }\n\n    const routeParamIndices = $routeParams.indexId.split(',');\n\n    const seedArray = [];\n\n    $scope.indices = $scope.allIndices.map(function (index){\n      index.use = true;\n      if (routeParamIndices.includes(index.id)){\n        seedArray.push(index.cachekey);\n      }\n      return index;\n    });\n\n    const indicesSetToSearch = getIndicesToSearchIn().split(',');\n\n    const priv = indicesSetToSearch.map(function (indexId){\n      const index = $scope.allIndices.filter(function (i){\n        const idx = i.es_index || i.id;\n        return (indexId === idx);\n      }).pop();\n\n      return (index && index.public !== true)\n    })\n\n    $scope.hasPrivateIndex = priv.some( i => i);\n\n    $scope.cacheSeedKey = seedArray.join(':');\n\n    $scope.submitSearch( true );\n  }\n\n  function addSortable(){\n\n\n    // console.log('Making sorts..', { conf : $scope.config});\n\n\n    const mappings = $scope.config.search.mappings;\n\n\n    const mapArray = Object.keys(mappings).map(function (key){\n      return mappings[key];\n    });\n\n\n    const arr = mapArray.map(function (val, i){\n\n      console.log('Adding sort', val, val.key, i);\n      if (! val.sortable) return false;\n\n      if (val.type === 'string'){\n        val.value=`${val.key}.keyword`;\n      }else {\n        val.value=val.key;\n      }\n\n      val.order = 'ASC';\n      return val;\n    }).filter( e => e);\n\n    $scope.sorts = arr;\n\n    $scope.sorts.push({\n      name: \"Einkunn\",\n      field: '_score',\n      isString: false,\n      id: 1001\n    });\n\n    const i = $scope.sorts.findIndex(function (s){\n      return (s.field === '_sortedFileObject');\n    });\n\n    if (i > 0) {\n      $scope.sort = $scope.sorts[i];\n    } else {\n      $scope.sort = $scope.sorts[0];\n    }\n\n  }\n\n\n  $scope.$on('$routeChangeSuccess', function (scope, next, current){\n    $scope.siteConfig = Api.siteConfig();\n\n    $scope.siteConfig.then(function (data){\n\n      $scope.allIndices = data.indices.filter(function (index){\n        return (index.type === 'album');\n      })\n\n      $scope.config = data.config;\n      addSortable();\n      onPageLoad();\n\n    });\n  });\n\n\n  $scope.onLightboxClose = function onLightboxClose(data){\n    // console.log('onLightboxClose', {data})\n  }\n  $scope.onLightboxOpen = function onLightboxOpen(data){\n    // console.log('onLightboxOpen', {data})\n  }\n\n  $scope.onLightboxImage = function onLightboxImage(data){\n    // console.log('onLightboxImage', {data});\n\n    if (data.image && data.image._source){\n      MetaService.updateWithDoc(data.image);\n    }\n  }\n\n\n  function getQuery(queryString = ''){\n\n    if (queryString === ''){\n      return null;\n    }\n\n    function replaceFlags(queryString){\n      return queryString.replace(/ OR /g, ' | ')\n                        .replace(/ AND /g, ' + ');\n    }\n\n    const q = replaceFlags(queryString);\n\n\n    const fields = [\n      { field: 'Description', boost : 3, },\n      { field: 'Comment', boost : 3, },\n      { field: 'Subject', boost : 2, },\n      { field: 'Credit'},\n      { field: 'CaptionWriter'},\n      { field: 'Category'},\n      { field: 'State'},\n      { field: 'Country'},\n      { field: 'LocalCaption'},\n      { field: 'Keywords'},\n      { field: 'SupplementalCategories'},\n      { field: 'Title' },\n      { field: 'City' },\n    ];\n\n\n    function parseFields(arr){\n      return arr.map(function (item){\n        if (typeof item.boost !== 'number') return item.field;\n        return `${item.field}^${item.boost}`;\n      });\n    }\n\n    return [\n      {\n        type: 'simple_query_string', field: {\n          query : q,\n          default_operator: 'and',\n          analyze_wildcard: true,\n          flags: 'ALL',\n          fields: parseFields(fields),\n        }\n      }\n    ];\n  }\n\n  function updateMetadata(data){\n    $scope.$applyAsync(function (){\n      $scope.totalResults = data.hits.total;\n      $scope.metadata.count = data.hits.total;\n      $scope.metadata.took = data.took;\n      $scope.metadata.show = true;\n\n      // console.log('Data hits??', data.hits)\n      if (data.hits.total === 0){\n        $scope.moreResults = false;\n        $scope.scrollDisabled = true;\n        return console.log('Data hits', $scope.moreResults)\n      }\n\n      if (data.hits.total === data.hits.hits.length) {\n        $scope.moreResults = false;\n        $scope.scrollDisabled = true;\n        return;\n      }\n\n      if ( ($scope.size + $scope.from) > data.hits.total && $scope.results.length === data.hits.total){\n        $scope.moreResults = false;\n        $scope.scrollDisabled = true;\n      }else{\n        $scope.scrollDisabled = false;\n      }\n    });\n  }\n\n  function decodeUriFilters(){\n    const filter = $location.search().filter;\n\n    try {\n      const decode = base64url.decode(filter);\n      return JSON.parse(decode);\n    } catch (e) {\n      console.warn(`Unable to decode uri filters`, e);\n      return [];\n    }\n  };\n\n  $scope.queryToHuman = function queryToHuman(q){\n    if (typeof q === 'string') return q;\n    const dateFilter = $filter('date');\n    if ( typeof q === 'object' && q.gte && q.lte ) {\n      const gte = dateFilter(q.gte, 'dd.MM.yyyy')\n      const lte = dateFilter(q.lte, 'dd.MM.yyyy')\n      return `>= ${gte} & <= ${lte}`;\n    }\n    return q;\n  }\n\n  $scope.submitSearch = function submitSearch( isNew ){\n    hideTooltips();\n\n    const input = $scope.searchInput;\n\n    $scope.lastQueryString = input;\n\n    $location.search('query_string', input );\n\n    const query = getQuery($scope.searchInput);\n\n\n    const sort = [];\n\n    let sField = $scope.sort.field || $scope.sort?.key;\n\n    if ( sField && $scope.sort.isString !== false ){\n      sField = `${sField}.keyword`;\n    }\n\n    \n    const s = {};\n\n    if (sField){\n      s[sField] = $scope.sort.order;\n      sort.push(s);\n    }\n\n    console.log({\n      $scope_sort: $scope.sort,\n      sField,\n      s,\n      sort,\n    });\n\n    const searchParams = {\n      sort,\n      query,\n      index: $routeParams.indexId,\n      filter: $scope.filters,\n      size: $scope.size,\n      from: $scope.from,\n      queryMinimumShouldMatch: 1,\n    };\n\n\n\n    $scope.search = new Search(searchParams);\n\n    hideTooltips();\n\n\n    $scope.search.query().then(function success(data){\n      $scope.loading = false;\n      $scope.$applyAsync(function (){\n        // console.log('Search.query() res', {data})\n        $scope.from = data.from;\n        $scope.size = data.size;\n        $scope.results = data.data.hits.hits;\n        findLastImage();\n      });\n\n\n\n      return updateMetadata(data.data);\n    }).catch(function error(err){\n      console.error(`Error from search`, err);\n      $scope.alert = {\n        message : 'Villa, ekki náðist að framkvæma leit.'\n      };\n      $scope.loading = false;\n      $scope.results = [];\n    });\n  }\n\n  function openImage(id){\n    $scope.openImageId = id;\n  }\n\n  function findLastImage(){\n    if ($scope.currentImageId){\n      const found = $scope.results.some( item => {\n        if (item._id === $scope.currentImageId){\n          return true;\n        }\n      });\n\n      if (found){\n        return openImage($scope.currentImageId);\n      }\n      const id = $scope.currentImageId;\n      const queryBody = {\n        query: {\n           ids: {\n             values: [ id ]\n           }\n         }\n      }\n      const search = es.search({\n        body: queryBody,\n        index: $routeParams.indexId,\n        type: '_doc',\n      });\n\n      search.then(function success(res){\n\n        if (res.hits && res.hits.hits && res.hits.hits.length === 1){\n          $scope.$applyAsync(function (){\n            const doc = res.hits.hits.pop();\n            $scope.results.push(doc);\n            return openImage($scope.currentImageId);\n          })\n        } else {\n          console.error(`Unable to find ${id}`, {res, id, queryBody});\n        }\n      });\n    }\n  }\n\n  $scope.loadMoreResults = function loadMoreResults(cb){\n    if ($scope.scrollDisabled) return console.log('Loading more is disabled');\n\n    const next = $scope.search.next();\n\n    next.then(function (data){\n      $scope.$applyAsync(function (){\n        $scope.results = $scope.results.concat(data.data.hits.hits);\n      })\n      cb();\n    });\n  }\n\n  function hideTooltips(){\n    $('[data-toggle=\"tooltip\"]').tooltip('hide');\n  }\n};\n\n\n\nalbumsSearch.$inject = [\n  '$scope',\n  '$routeParams',\n  '$location',\n  '$filter',\n  '$window',\n  'Api',\n  'createImageUri',\n  'CacheFactory',\n  'MetaService',\n  'es',\n];\n\n\nexport default albumsSearch;\n","const async = require('async');\n\nexport default function registryCtrl($scope, es, bodybuilder, $location, $routeParams, Api, createLink){\n\n  const minQueryLength = 3;\n\n  // Structure A\n  /*\n  ~~~\n  A\n  - Aðalstaður\n  - Aðalsteinn\n    - 2018/24\n      - A-Dagbækur\n        - AA-Grímsneshreppur\n          - AA/1\n            - Örk 1\n            - Örk 2\n            - Örk 3\n          - AA/2\n          - AA/3\n    - 2014/22\n    -\n    -\n  ~~~*/\n\n  $scope.indices = [];\n  $scope.tenant = \"\";\n  $scope.config = {};\n\n  function fetchAndCollapse(item, callback){\n    // console.log('fetchAndCollapse', {item, callback})\n    return item.fetchNext(function (buckets){\n      item.tree = buckets;\n      item.collapsed = true;\n\n      callback(item);\n    });\n  }\n\n  function matchLevelAndCollapse(root, levelId, value, callback){\n    // console.log('matchLevelAndCollapse', {root, levelId, value});\n    root.forEach((item, i) => {\n      const decoded = decodeURIComponent(value);\n      // console.log({decoded, value, item});\n      if (item.key.toString() === value || item.key.toString() === decoded){\n        // console.log(`${item.key} macthes ${levelId} fetching data and collapsing tree size:`, item.tree.length, item.filters);\n        return fetchAndCollapse(item, callback);\n      }\n    });\n  }\n\n  $scope.$on('$routeChangeSuccess', function ev(event){\n    const fn = function (){}\n    Api.siteConfig().then(function (config){\n      $scope.config = config;\n      $scope.indices = config.indices.filter( (index) => {\n        return (index.type === \"filemaker\");\n      });\n      updateTreeAndView();\n    })\n  });\n  $scope.toggleType = function toggleType(){\n\n    let base = '/main/registry';\n    if ($scope.selectedTree.id === 'A') {\n      base = `${base}?type=B`;\n      return window.location = base;\n    }\n\n    base = `${base}?type=A`;\n\n    return window.location = base;\n  }\n\n  function updateTreeAndView(){\n    fetchTree(function done(){\n\n      const levels = fetchLevels();\n      let root = $scope.tree;\n      let lastItem = false;\n\n      // console.log('updateMainView', {levels});\n      async.forEachSeries(levels, function each(levelId, callback){\n        const value = $routeParams[levelId]\n\n        // console.log('async.forEachSeries', {levelId, value});\n        matchLevelAndCollapse(root, levelId, value, function (current){\n          // console.log('matchLevelAndCollapse', current);\n          root = current.tree;\n          lastItem = current;\n          return callback();\n        });\n\n      }, function done(err){\n        // console.log('Done??', err, lastItem);\n\n        if (lastItem && lastItem.currentLevel && lastItem.currentLevel.fetchMain){\n          return updateMainView(lastItem);\n         }\n      });\n\n    });\n  }\n\n  const sidebar = document.getElementById('sidebar');\n\n  $scope.scrollToMe = function scrollToMe(item){\n    const hash = $location.search().id;\n    let loops = 0;\n    function getElement(hash, callback){\n\n      const element = document.getElementById(hash);\n\n      if (! element) {\n\n        if (loops > 10){\n          return callback(`Error finding element ${loops}`);\n        }\n\n        loops++;\n        return setTimeout(function (){\n          return getElement(hash, callback);\n        }, 10);\n      }\n      return callback(null, element);\n    }\n\n    if (hash === item._id){\n      // console.log('Match, waiting for element to render', hash, item._id)\n      getElement(hash, function (err, element){\n        if (err) return console.error('Error finding element', err);\n        const top = element.offsetTop - 100;\n\n        sidebar.scrollTo({\n          top,\n          left: 0,\n          behavior: 'smooth'\n        });\n\n        // const x = t + 100;\n        // element.scrollTo(10,0);\n        // element.scrollIntoView({\n        //   alignToTop: false,\n        //   behavior: \"smooth\",\n        //   block: 'end',\n        // });\n      });\n    }\n  }\n\n  $scope.treeQueryString = $location.search().query;\n\n  function removeDuplicates(arr, key){\n    const cache = {};\n\n    const output = arr.filter(item => {\n      const value = item[key];\n      if ( cache[value] ){\n        cache[value]++;\n        return false;\n      }\n      cache[value] = 1;\n      return true;\n    });\n\n    return output.map(item => {\n      const value = item[key];\n      item.doc_count = cache[value];\n      return item;\n    });\n  }\n\n  const trees = {\n    A: {\n      id: 'A',\n      name: 'Eftir skjalamyndara',\n      levels: {\n        level1: {\n          field: 'skjalamyndari.keyword',\n          parser: function parser(agg){\n            agg._original = agg.buckets;\n            agg.buckets = removeDuplicates(agg.buckets.map( b => {\n              b._original = b.key;\n              b.key = b.key.substring(0,1).toUpperCase();\n              return b;\n            }), 'key').sort(sortIcelandic);\n            return agg;\n          },\n          textfn: function (bucket){\n            return bucket.key;\n          },\n          addFilter: false,\n          dataProvider: function dataProvider(item, buckets, level, callback){\n\n            const arr = level.originalBuckets.filter(function each(obj){\n              return (obj.key === item.key);\n            }).map(function (obj){\n              const output = {\n                key: obj._original,\n                textValue: obj._original,\n                doc_count: obj.doc_count,\n              };\n              return output;\n            });\n\n            const next = item.level.next;\n\n            return callback(parseBuckets(arr, next, item));\n          },\n          prev: false,\n        },\n        level2: {\n          field: 'skjalamyndari.keyword',\n        },\n        level3: {\n          fetchMain: true,\n          field: 'afhnumer.keyword',\n        },\n        level4: {\n          fetchMain: true,\n          field: 'yfirskjalafl.keyword',\n        },\n        level5: {\n          fetchMain: true,\n          field: 'heiti-skjalafl.keyword',\n        },\n        level6: {\n          fetchMain: true,\n          field: 'skjalaflokkur.keyword',\n        },\n      },\n    },\n    B: {\n      id: 'B',\n      name: 'Eftir afhendingu',\n      levels: {\n        level1: {\n          reverse: true,\n          field: 'afh-ar',\n        },\n        level2: {\n          field: [\n            'afhnumer.keyword',\n            'skjalamyndari.keyword'\n          ],\n          textfn: function (bucket){\n            const sub = bucket.sub_agg.buckets.pop().key;\n            return `${bucket.key} - ${sub}`;\n          },\n          fetchMain: true,\n        },\n        level3: {\n          fetchMain: true,\n          field: 'yfirskjalafl.keyword',\n        },\n        level4: {\n          fetchMain: true,\n          field: 'kassanumer',\n          textfn: function (agg){\n            return `Askja ${agg.key}`;\n          }\n        },\n        level5: {\n          fetchMain: true,\n          field: 'ork',\n          textfn: function (agg){\n            return `Örk ${agg.key}`;\n          }\n        },\n      },\n    }\n  };\n\n  function prepTree(tree){\n    const arr = Object.keys(tree.levels);\n    arr.forEach((key, i) => {\n      const lastLevel = arr[i - 1];\n      const nextLevel = arr[i + 1];\n      const level = tree.levels[key];\n      level.id = key;\n      level.next = nextLevel || false;\n      level.last = lastLevel || false;\n    });\n  }\n\n  Object.keys(trees).forEach((key, i) => {\n    prepTree(trees[key]);\n  });\n\n\n  $scope.getOtherText = function getOtherText(current){\n    if (current.id === 'A') return trees.B.name;\n    return trees.A.name;\n  }\n\n\n  const selectedTreeType = $location.search().type || 'A';\n\n  // console.log({\n  //   selectedTreeType\n  // });\n\n  $scope.treeTypes = ['A', 'B'];\n\n\n  if ($scope.treeTypes.includes(selectedTreeType)){\n    const i = $scope.treeTypes.indexOf(selectedTreeType);\n    $scope.treeType = $scope.treeTypes[i];\n  } else {\n    $scope.treeType = $scope.treeTypes[0];\n  }\n\n\n\n  $scope.tree = [];\n\n  function getIndices(){\n    return $scope.indices.map( i => {\n      return i.index || i.id;\n    });\n  }\n\n  function fetchLevels(){\n    return Object.keys($routeParams).filter( (key) => {\n      return /level/.test(key);\n    });\n  }\n\n\n\n  $scope.selectedTree = trees[$scope.treeType];\n\n  function fetchTree(callback){\n    const levels = fetchLevels();\n\n    const treeType = $scope.selectedTree;\n    const root = treeType.levels.level1;\n    function noop(a){\n      return a;\n    }\n\n\n    fetchAgg('terms', root.field, []).then(function (res){\n      const agg = res.aggregations.agg;\n      root.originalBuckets = agg.buckets.slice();\n      const parser = root.parser || noop;\n      const parsed = parser(agg);\n      $scope.tree = parseBuckets(parsed.buckets, root, false);\n      callback();\n    });\n  }\n\n  function getUrl(item){\n    const cache = {};\n\n    const levelid = item.levelId;\n    cache[levelid] = item.key;\n\n\n    function recurse(parent){\n      if (typeof parent !== 'object') return console.error('No parent??', parent  )\n      const key = parent.levelId;\n      // const value = parent.textValue;\n      const value = parent.key;\n      // console.log(parent.textValue, key);\n      cache[key] = value;\n      // console.log('The endless loop?', parent);\n\n      if (parent.parent) {\n        return recurse(parent.parent);\n      }\n    }\n\n    if (item.parent){\n      recurse(item.parent);\n    }\n\n\n    const arr = Object.keys(cache).map(function (key){\n      const value = cache[key];\n      return {\n        key, value\n      }\n    }).sort(function (a,b){\n      const inta = parseInt(a.key.substring(a.key.length -1));\n      const intb = parseInt(b.key.substring(b.key.length -1));\n      return (inta - intb);\n    });\n\n    const values = arr.map(function (item){\n      return encodeURIComponent(item.value);\n    });\n\n    if (item.collapsed){\n      values.pop();\n    }\n    const url = `/main/registry/${values.join('/')}?id=${item._id}&type=${$scope.treeType}`;\n    if ($scope.treeQueryString){\n      return `${url}&query=${$scope.treeQueryString}`;\n    }\n    return url;\n  }\n\n  $scope.printResults = function printResults(){\n    return window.print();\n  }\n\n  $scope.linkUrl = function linkUrl(item){\n    if (item.currentLevel && item.currentLevel.next === false){\n      return '#';\n    }\n    return getUrl(item);\n  }\n\n  $scope.dateNow = function (){\n    return new Date();\n  }\n\n  function updateMainView(item){\n    const query = bodybuilder();\n\n    item.filters.forEach(function (filter){\n      const field = (Array.isArray(filter.field)) ? filter.field[0] : filter.field;\n\n      query.filter(filter.type, field, filter.value);\n    });\n\n    // ORder : skjalaflokkur -> kassanumer -> Arkir\n    query.agg('terms', 'afhnumer.keyword', 'deliveries', {size: 100}, function (q1){\n      return q1.agg('terms', 'yfirskjalafl.keyword', 'categories', {size: 100}, function (q2){\n        return q2.agg('terms', 'heiti-skjalafl.keyword', 'sub_categories', {size: 100});\n      });\n    });\n\n    query.sort([\n      { 'skjalaflokkur.keyword' : 'asc' }, // .keyword vs analized field.\n      { 'kassanumer' : 'asc' },\n      { 'ork' : 'asc' }\n    ]);\n\n    if ($scope.treeQueryString && $scope.treeQueryString.length > minQueryLength){\n      // query.query('query_string', {\n      //   default_operator : 'AND',\n      //   query : $scope.treeQueryString\n      // })\n      query.query('simple_query_string', {\n        query : $scope.treeQueryString,\n        default_operator: 'and',\n        analyze_wildcard: true,\n        flags: 'ALL',\n        // fields: parseFields(fields),\n      })\n    }\n    const eQuery = query.build();\n    // const indexCacheKey = getIndexCacheKey();\n\n    const req = es.search({\n      index : getIndices(),\n      type : '_doc',\n      size : 1000,\n      body  : eQuery\n    }, true);\n\n    req.then(function response(res){\n      $scope._mainResult = res;\n      $scope.$applyAsync(function (){\n        $scope.mainFetched = true;\n\n        $scope.mainResults = createFilemakerObject(res);\n\n        // console.log({mainResults: $scope.mainResults})\n      })\n    });\n\n  }\n\n  function getNextLevel(levelId){\n    return $scope.selectedTree.levels[levelId];\n  }\n\n  function hashString(str){\n    let hash = 0;\n    if (str.length == 0) {\n        return hash;\n    }\n    for (let i = 0; i < str.length; i++) {\n        let char = str.charCodeAt(i);\n        hash = ((hash<<5)-hash)+char;\n        hash = hash & hash; // Convert to 32bit integer\n    }\n\n    const s = (hash * -1).toString()\n    return `${s}-${str.length}`;\n  }\n\n  function generateId(doc){\n    const key = `${doc.levelId}-${doc.key}`;\n    const hash = hashString(key);\n    return `tree_${hash}`;\n  }\n\n\n\n\n  function sortIcelandic(a,b){\n\n    function isAfh(str){\n      const regex = new RegExp('([0-9]{4}\\/[0-9]{1,3})');\n      return regex.test(str);\n    }\n\n    function compareAfh(afhA,afhB){\n      const a = parseInt(afhA.replace('/', '0'));\n      const b = parseInt(afhB.replace('/', '0'));\n      return a-b;\n    }\n\n    if (isAfh(a.key) && isAfh(b.key)){\n      return compareAfh(a.key, b.key);\n    }\n\n    if (typeof a.key === 'number' && typeof b.key === 'number') {\n      return a.key - b.key;\n    }\n\n    return a.key.localeCompare(b.key, 'is');\n  }\n\n  function parseBuckets(buckets, level, parent){\n    function fn(a){\n      return a;\n    }\n\n    function noop(bucket){\n      return bucket.key;\n    }\n    const nextId = level.next || false;\n\n    // console.log('Parse bucket', {buckets, level, parent});\n\n    const data = buckets.map(function (b){\n\n      const textfn = level.textfn || noop;\n      b.textValue = textfn(b);\n      b.loading = false;\n      b.parent = parent;\n      b.tree = [];\n      b.field = level.field;\n      b.filters = (parent) ? parent.filters.slice() : [];\n      b.levelId = level.id;\n      b.currentLevel = level;\n\n      b._id = generateId(b);\n\n      const filter = {\n        type: 'term',\n        value: b._original || b.key,\n        field: level.field\n      }\n\n      if (level.addFilter !== false){\n        b.filters.push(filter);\n      }\n      b.level = {};\n\n\n      if (nextId){\n        b.level.next = getNextLevel(level.next);\n      } else {\n        b.level.next = false;\n      }\n\n      function fetchNext( callback ){\n        const self = this;\n        // console.log('fetchNext.callback', { self });\n        const next = this.level.next;\n        self.loading = true;\n        // console.log('Fetching next', {filter, currentTree : this });\n        fetchAgg('terms', next.field, this.filters ).then(function success(res){\n          const agg = res.aggregations.agg;\n          const parser = (typeof next.parser === 'function') ? next.parser : fn;\n          self.originalBuckets = agg.buckets.slice();\n          const parsed = parser(agg);\n          const buckets = parseBuckets(parsed.buckets, next, self);\n          self.loading = false;\n          return callback(buckets);\n        })\n      };\n\n      if (typeof level.dataProvider === 'function'){\n\n        // console.log('level.dataProvider',level.dataProvider,{ buckets, level, parent});\n        b.fetchNext = function (callback){\n          return level.dataProvider(b, buckets, level, callback);\n        };\n      } else {\n        b.fetchNext = fetchNext;\n      }\n\n\n      return b;\n    }).sort(sortIcelandic);\n    if (level.reverse){\n      return data.reverse();\n    }\n    return data;\n  }\n\n  $scope.submitSearch = function submitSearch(){\n    updateTreeAndView();\n  }\n\n  $scope.$watch('treeQueryString', function (after, before){\n    // console.log('treeQueryString', {before, after});\n\n    if (after && after.length > minQueryLength){\n      updateTreeAndView();\n    }\n\n    $location.search('query', after);\n  })\n\n\n  function fetchAgg(type, field, filters){\n    const query = bodybuilder();\n\n\n    if (Array.isArray(field)){\n      query.agg(type, field[0], 'agg', {\n        size: 1000,\n      }, function (q){\n        return q.agg(type, field[1], 'sub_agg', {\n          size: 1\n        });\n      });\n    } else {\n      query.agg(type, field, 'agg', {\n        size: 1000,\n      });\n    }\n\n    const queryString = $scope.treeQueryString;\n\n    if (queryString && queryString.length > minQueryLength){\n      query.query('simple_query_string', {\n        query : queryString,\n        default_operator: 'and',\n        analyze_wildcard: true,\n        flags: 'ALL',\n        // fields: parseFields(fields),\n      })\n    }\n\n    filters.forEach(function (filter){\n      const field = (Array.isArray(filter.field)) ? filter.field[0] : filter.field;\n      query.filter(filter.type, field, filter.value);\n    });\n\n    // const loc = $location.href;\n    const loc = $location.$$path;\n\n    const request = es.search({\n      type:'_doc',\n      index: getIndices().join(','),\n      body: query.build(),\n      size: 0,\n    }, true);\n\n    request.catch(function error(err){\n      console.error(`Server returned error for aggregation`, err);\n    })\n\n    return request;\n  }\n\n\n\n\n  function getFieldValue(hits, field, filter){\n\n    const arr = hits.map(function (hit){\n      return hit._source;\n    })\n\n    const filtered = arr.filter(function (item){\n      return (item[filter.key] === filter.value);\n    });\n\n    const first = filtered.shift();\n\n    return first[field];\n  }\n\n  function getRelationLink(hit){\n    const relation = hit._source.relation; /// FIXME\n\n    if (typeof relation !== 'object') return;\n    if (!relation.updated) return;\n\n    return createLink('archive', {\n      _source: relation\n    }, $scope.config)\n  }\n\n  function createFilemakerObject(response){\n    const hits = response.hits.hits.map(hit => {\n      hit.searchLink = getRelationLink(hit);\n      return hit;\n    })\n\n    if (hits.length < 1) return;\n\n    const deliveries = response.aggregations.deliveries.buckets;\n\n    const object = {\n      deliveries : deliveries.map(function (delivery){\n        return {\n          id : delivery.key,\n          name : getFieldValue(hits, 'skjalamyndari', { key:'afhnumer', value : delivery.key }),\n          categories : delivery.categories.buckets.map(function (cate){\n            return {\n              name : cate.key,\n              count : cate.doc_count,\n              sub_categories : cate.sub_categories.buckets.map(function (subcate){\n                return {\n                  name : subcate.key,\n                  count : subcate.doc_count,\n                  sheets : response.hits.hits.filter(function (hit){\n                    const s = hit._source;\n                    return (s.yfirskjalafl === cate.key && s['heiti-skjalafl'] === subcate.key);\n                  })//.sort(sortResults)\n                }\n              }).sort(aggregationSort)\n            }\n          }).sort(aggregationSort)\n        }\n      }),\n      hits : hits,\n    };\n\n    return object;\n  }\n\n  function aggregationSort(a,b){\n    if (a.name > b.name) return 1;\n    if (a.name < b.name) return -1;\n    if (a.name === b.name) return 0;\n  }\n\n\n}\n\n\n\nregistryCtrl.$inject = [\n  '$scope',\n  'es',\n  'bodybuilder',\n  '$location',\n  '$routeParams',\n  'Api',\n  'createLink',\n];\n","\n\n\n\n\nfunction searchController($scope, Api, es, bodybuilder, $location, $rootScope, createImageUri, createLink){\n  $scope.queryString = $location.search().q || \"\";\n\n  // $(document).popover({\n  //   selector: '[data-toggle=\"popover\"]',\n  //   trigger: 'hover',\n  //   body: true,\n  // });\n\n  $scope.docCount = function docCount(count){\n    if (typeof count === 'object') return count.value;\n    return count;\n  }\n\n  $scope.audioLink = function audioLink(hit){\n\n    \n    hit._hasAudio = (hit._source?.audio?.location);\n    if (! hit._hasAudio) return '#';\n    \n    return `/static/${hit._source.audio.location}`\n  }\n\n\n  $scope.indices = {};\n\n  $scope.isSearching = false;\n\n  $scope.noResults = false;\n\n\n\n  $scope.copyOfQueryString = \"\";\n\n  $scope.fieldNames = {\n    'Keywords' : 'Lykilorð',\n    'Source' : 'Tegund myndar',\n    'UserDefined4' : 'Heiti myndasafns',\n    'UserDefined12' : 'Heiti bókar',\n    'UserDefined14' : 'Ártal',\n  }\n\n  $scope.fields = {\n    album : [\n      { fuzzy : true, field : 'Description', boost : 3, },\n      { fuzzy : true, field : 'Comment', boost : 3, },\n      { fuzzy : true, field : 'Subject', boost : 2, },\n      { fuzzy : true, field : 'Credit'},\n      { field : 'CaptionWriter'}\n    ],\n    archive : [\n      { fuzzy : true, field : 'Description', boost : 2, },\n      { fuzzy : true, field : 'Source', boost : 3, },\n      { fuzzy : true, field : 'UserDefined4', boost : 3, },\n      { fuzzy : true, field : 'UserDefined12', boost : 3, },\n      { fuzzy : true, field : 'UserDefined14', boost : 2, },\n      { fuzzy : true, field : 'UserDefined102', boost : 2, },\n      { fuzzy : true, field : 'UserDefined104', boost : 2, },\n      { fuzzy : true, field : 'Credit'},\n      { field : 'CaptionWriter'}\n    ],\n    filemaker: [],\n  }\n\n\n  $scope.displayTotal = function displayTotal(res){\n    if (typeof res.total === 'object') return res.total.value;\n    return res.total;\n  }\n\n  $scope.filters = [];\n\n  $scope.$watch('filters', function (n, o){\n    if (n[0] === o[0]) return;\n    $scope.submitForSearch();\n  }, true)\n\n  $scope.size = 10;\n  $scope.from = 0;\n\n  $scope.page = getPage();\n\n  function parseNumber(string){\n    const n = parseInt(string);\n    return (isNaN(n)) ? 1 : n;\n  }\n\n  function getPage(){\n    const uriPage = $location.search().p;\n\n    // console.log({uriPage, n : parseNumber(uriPage)})\n    return parseNumber(uriPage);\n  }\n\n  function hasType(indices, type){\n    return indices.some(function (index){\n      return (index.type === type);\n    });\n  }\n\n  $rootScope.$on('search::request', function (event, data){\n    $scope.queryString = data.query;\n    $scope.submitForSearch();\n  });\n\n  $scope.prevPage = function prevPage(){\n    const next = $scope.page - 1;\n    if (next < 0) return console.warn('Page not available', next);\n    $scope.selectPage(next);\n  }\n\n  $scope.nextPage = function nextPage(){\n    const next = $scope.page + 1;\n    if (next > $scope.pageCount) return console.warn('Page not available', next);\n    $scope.selectPage(next);\n  }\n\n  $scope.selectPage = function selectPage(page){\n    $scope.page = page;\n    $location.search('p', page);\n    $scope.from = ((page -1) * $scope.size);\n    $scope.submitForSearch();\n  };\n\n  $scope.submitForSearch = function submitForSearch(){\n    $location.search('q', $scope.queryString)\n    intiSearch($scope.indices, $scope.type);\n  }\n\n\n\n  Api.siteConfig().then(function (res){\n    const indicesTypes = {};\n\n    const archiveName = res.config.archive?.name;\n\n    const names = {\n      'album': 'Myndasöfn',\n      'archive': archiveName || 'Miðlun',\n      'filemaker': 'Skjalaskrár',\n      'audio': 'Hljóðskrár',\n    };\n\n    $scope.config = res;\n    res.indices.forEach(function (index){\n      const type = index.type;\n      if (!type) return;\n      if (!indicesTypes[type]){\n\n        const name = names[type];\n        indicesTypes[type] = {\n          name : name,\n          result : {},\n          indices : []\n        };\n      }\n      indicesTypes[type].indices.push(index);\n    });\n    $scope.indices = indicesTypes;\n    $scope.defaultType = hasType(res.indices, 'album') ? 'album' : 'archive';\n    $scope.type = $location.search().t || $scope.defaultType;\n    intiSearch(indicesTypes, $scope.type);\n  });\n\n  function getIndicesSetForSearch(indices){\n    return indices;\n  }\n\n  $scope.imageSource = function imageSource(hit, type){\n    const images = createImageUri(hit);\n    const image = images['xx-small'];\n    return image;\n  }\n  $scope.hasImage = function hasImage(hit, type){\n    if (type === 'filemaker') return false;\n    if (hit._source.thumbnails) return true;\n    return false;\n  }\n\n\n  function filemakerQueryBuilder(queryString, fields){\n    return bodybuilder()\n        .orQuery('query_string', 'query', queryString)\n        .orQuery('multi_match', {\n            zero_terms_query: 'all',\n            query: queryString,\n            fuzziness: 'AUTO',\n            fields : ['all'],\n        });\n  }\n\n  function intiSearch(indicesTypes, requestedType){\n    $scope.results = [];\n    const defaultQuery = queryStringBuilder($scope.queryString, $scope.fields[requestedType]);\n    const querys = {\n      filemaker : filemakerQueryBuilder($scope.queryString, $scope.fields[requestedType]),\n      // album : defaultQuery,\n      // archive : defaultQuery,\n      // audio: defaultQuery,\n    };\n    const types = Object.keys(indicesTypes);\n    types.forEach(function (type){\n      const indices = getIndicesSetForSearch(indicesTypes[type].indices);\n      const indicesArray = indicesTypes[type].indices.map(function (index){\n        return index.es_index || index.id;\n      });\n\n      const eQuery = querys[type] || defaultQuery;\n\n      $scope.filters.forEach(function (filter){\n        if (filter.not){\n          eQuery.notFilter(filter.type, filter.field, filter.value);\n        } else {\n          eQuery.filter(filter.type, filter.field, filter.value);\n        }\n      })\n\n      if (type === requestedType) return search(type, eQuery, indicesArray);\n      fetchCount(type, eQuery, indicesArray);\n    });\n  }\n\n  $scope.filterName = function filterName(field){\n    const name = field.split('.')[0];\n    if ($scope.fieldNames[name]){\n      return $scope.fieldNames[name];\n    }\n    return field;\n  }\n\n  $scope.removeFilter = function removeFilter(filter, index){\n    $scope.filters.splice(index, 1);\n  }\n\n  function queryStringBuilder(queryString, fields = []){\n    function parseFields(arr){\n      return arr.map(function (item){\n        if (typeof item.boost !== 'number') return item.field;\n        return `${item.field}^${item.boost}`;\n      });\n    }\n    const keyRegex = /[a-zA-Z0-9]{1,20}\\:/g;\n    const query = bodybuilder();\n    let fuzzy = true;\n\n    const hasAndOr = (\n      queryString.includes('AND') || queryString.includes('OR')\n    );\n\n    if (hasAndOr) {\n      fuzzy = false;\n    }\n\n    if (queryString.includes('\"') ){\n      fuzzy = false;\n    }\n\n    if (keyRegex.test(queryString)){\n      query.query('query_string', 'query', queryString)\n    }else{\n      query.orQuery('query_string', 'query', queryString)\n    }\n    //   console.log('Match!', queryString.match(keyRegex))\n    const fuzzys = fields.filter( i => i.fuzzy);\n\n    if (fuzzy){\n      fuzzys.forEach(function (item){\n        const q = {};\n        q[item.field] = {\n          value : queryString,\n          fuzziness: 'AUTO',\n        };\n        query.orQuery('fuzzy', q);\n      });\n    }\n\n    if (fuzzy || hasAndOr){\n      query.orQuery('multi_match', {\n        zero_terms_query: 'all',\n        query: queryString,\n        fuzziness: (fuzzy) ? 'AUTO' : undefined,\n        fields : parseFields(fields),\n        operator: 'AND',\n      });\n    }\n    return query;\n  }\n\n  $scope.isActive = function isActive(type){\n    if (type === $scope.type) return 'active';\n    return '';\n  }\n\n  $scope.results = [];\n\n  $scope.setType = function setType(type){\n    $scope.type = type;\n    $location.search('p', 1);\n    $location.search('t', type);\n    $scope.page = 1;\n    intiSearch($scope.indices, $scope.type);\n  }\n\n  $scope.log = function log(item){\n    console.log('log', item)\n  }\n\n  $scope.prevAvailable = function prevAvailable(page){\n    if (page > 1) return true;\n    return false;\n  }\n\n  $scope.nextAvailable = function nextAvailable(page){\n    if (page < $scope.pageCount - 1) return true;\n    return false;\n  }\n\n  $scope.getPageClass = function (page){\n    if (page.disabled) return 'disabled';\n    if (page.active) return 'active';\n    return '';\n  }\n\n  $scope.pages = [];\n\n  function createPages(res, current){\n    const total = (typeof res.hits.total === 'object') ? res.hits.total.value : res.hits.total;\n\n    const count = Math.ceil(total / $scope.size);\n\n    $scope.pageCount = count;\n\n    function inRange(range, number){\n\n      // console.log(range, number, {\n      //   min : (range.min < number),\n      //   max : (number < range.max)\n      // });\n\n      if (!range.neg){\n        if (range.min < 0) return false;\n      }\n      return (range.min <= number && number <= range.max);\n    }\n\n    function showPage(i, count, current){\n      const maxPages = 5;\n      const prev = (current - maxPages);\n\n      if (i === current) return true;\n\n\n      const showAsPrev= inRange({\n        neg : ( current <= maxPages),\n        min : prev,\n        max : current,\n      }, i);\n\n\n      const showAsNext= inRange({\n        min : current,\n        max : current + maxPages,\n      }, i);\n      if (i > (count - 2)) return true;\n      return showAsPrev || showAsNext;\n    }\n    const array = [];\n\n    for ( let i = 1; i < count; i ++){\n      array.push(i);\n    };\n\n    const arr = array.map(function (i){\n      return {\n        i,\n        active : (i === current),\n        page : i,\n        show : showPage(i, array.length, current),\n      }\n    }).filter(function (i){\n      return i.show;\n    });\n\n\n    function addNone(arr){\n      let sliced = false;\n      arr.forEach(function (item, index){\n        const next = arr[index + 1];\n\n        if (!next) return;\n        if (sliced) return;\n\n        if ((next.i - item.i) > 1) {\n          sliced = true;\n          return arr.splice(index + 1, 0, {\n            page : '...',\n            disabled : true,\n            i : index,\n            active : false,\n          });\n        }\n      });\n      return arr;\n    }\n\n    return addNone(arr);\n  }\n\n\n  $scope.searchResultClass = function searchResultClass(res){\n    if (res.error){\n      return 'fa-warning'\n    }\n    if (res.loading === true){\n      return 'fa-spinner fa-spin'\n    }\n  }\n  $scope.searchError = false;\n\n  function fetchCount(type, query, indicesArray){\n    // console.log('fetchCount', type, query, indicesArray);\n    //\n    const itemResult = $scope.indices[type];\n    itemResult.loading = true;\n\n    console.log({type, query, indicesArray})\n\n    es.count({\n      index : indicesArray.join(','),\n      body : query.build(),\n    }).then(function (res){\n      $scope.$applyAsync(function (){\n        itemResult.loading = false;\n        itemResult.result = {\n          took : res.took,\n          total : (typeof res.hits.total === 'object') ? res.hits.total.value : res.hits.total,\n        };\n      });\n    }, function countError(err){\n      $scope.$applyAsync(function (){\n        itemResult.error = err;\n      })\n      console.error(`Unable to fetch count`, err);\n    });\n  }\n\n\n  function search(type, query, indicesArray){\n    const sorts = [{'_score' : 'desc'}];\n\n    if (type !== 'filemaker'){\n      sorts.push({'indexedAt': 'desc'})\n    }\n\n    $scope.noResults = false;\n    if ($scope.isSearching) return;\n\n    query.sort(sorts)\n\n    const itemResult = $scope.indices[type];\n    itemResult.loading = true;\n\n\n    const queryBuilt = query.build();\n\n    $scope.copyOfQueryString = $scope.queryString;\n    es.search({\n      index : indicesArray.join(','),\n      body : queryBuilt,\n      size : $scope.size,\n      from : $scope.from,\n    }, true).then(function (res){\n      $scope.searchError = false;\n      $scope.isSearching = false;\n      itemResult.loading = false;\n      itemResult.result = {\n        took : res.took,\n        total : res.hits.total,\n      };\n      const hits = res.hits.hits;\n\n      if (res.hits.total.value === 0){\n        $scope.noResults = true;\n      }\n\n      $scope.$applyAsync(function (){\n        $scope.results = parseHits(hits, type, indicesArray, queryBuilt, $scope.from, res.hits.total);\n        $scope.pages = createPages(res, $scope.page);\n      });\n    }, function error(err){\n      $scope.$applyAsync(function (){\n        itemResult.error = err;\n\n        if (typeof err.data === 'object' && err.data.message){\n          $scope.searchError = `${err.data.message}`;\n        } else {\n          $scope.searchError = true;\n        }\n        console.error('Error fetching search results', {err})\n        $scope.isSearching = false;\n      })\n    });\n  }\n\n  $scope.$on('$locationChangeStart', function( event ) {\n    $scope.results.forEach((hit, i) => {\n      if (! hit._popover || !hit._popover.popover) return;\n      hit._popover.popover('dispose')\n    });\n  });\n\n  function parseHits(hits, type, indices, queryUsed, from, total){\n    return hits.map(function (hit, n){\n      hit._index_type = type;\n      hit.link = createLink(type, hit, $scope.config, indices, queryUsed, {\n        total : total,\n        i : from + n,\n      });\n      return hit;\n    })\n  }\n\n  $scope.showPopover = function showPopover(hit){\n\n    if (hit._popover){\n      return;\n    }\n\n    const elementId = `#img-result-${hit._id}`;\n    const element = $(elementId);\n    if (! element) return console.log('Element not found', elementId);\n    const imgUrls = createImageUri(hit);\n    hit._popover = element.popover({\n      title: hit._source.Title,\n      trigger: 'hover',\n      placement: 'right',\n      html: true,\n      content: `\n        <img class=\"popover-image img-fluid\" src=\"${imgUrls.medium}\">\n        `\n    });\n\n    hit._popover.popover('show');\n  }\n  $scope.hidePover = function hidePover(hit){\n    if (hit && hit._popover && hit._popover.popover){\n      hit._popover.popover('hide');\n    }\n  }\n};\n\nsearchController.$inject = [\n  '$scope',\n  'Api',\n  'es',\n  'bodybuilder',\n  '$location',\n  '$rootScope',\n  'createImageUri',\n  'createLink'\n];\n\n\nexport default searchController;\n","\n\n\nfunction number(str, def){\n  const i = parseInt(str);\n  if (isNaN(i)) return (def === undefined) ? 0 : def;\n  return i;\n}\n\nconst filterMap = {\n  level1 : 'Source.keyword',\n  level2 : 'UserDefined4.keyword',\n  level3 : 'UserDefined12.keyword',\n  level4 : 'UserDefined14.keyword',\n};\n\nfunction crowdsourceController($scope, $routeParams, Api, createImageUri, Notification, $location, fetchArchive){\n  $scope.page = 'left';\n  $scope.user = Api.me.get();\n  $scope.tenantId = false;\n  const config = Api.siteConfig();\n\n  $scope.enableSubmit = false; \n  $scope.showBackButton = true;\n  $scope.isNextAvailable = false;\n  $scope.isPrevAvailable = false;\n\n  $scope.archive = false;\n\n  $scope.archiveReady = false;\n\n  $scope.i = number($routeParams.i, false);\n\n\n  if ($scope.i > 0 ){\n    $scope.isPrevAvailable = true;\n  }\n\n  if ($routeParams.level1 === \"_\"){\n    $scope.showBackButton = false;\n  }\n\n\n  function getFilterMap(config) {\n    const defaultMap = {\n      level1: 'Source.keyword',\n      level2: 'UserDefined4.keyword',\n      level3: 'UserDefined12.keyword',\n      level4: 'UserDefined14.keyword',\n    }\n    const levels = config.archive.levels;\n\n    if (!Array.isArray(levels)) {\n      console.error('Levels not array', { config });\n      return defaultMap;\n    }\n\n    const map = {};\n    levels.sort(function (a, b) {\n      return a.id - b.id;\n    }).forEach(function (level, i) {\n      const id = i + 1;\n      const key = `level${id}`;\n      const value = level.agg.value;\n      map[key] = value;\n    });\n\n    return map;\n  }\n\n\n  $scope.getBackUrl = function getBackUrl(){\n\n    const template = `:type/:level1/:level2/:level3/:level4`;\n    const parts = template.split('/').map(function each(level){\n      const key = level.substring(1, level.length);\n      return $routeParams[key];\n    }).filter( e => e).map(encodeURIComponent);\n    const i = number($routeParams.i, 0);\n\n    return `/main/${parts.join('/')}?meta=true&slide=${i}`\n  }\n\n  $scope.nextImageAvailable = function nextImageAvailable() {\n    if (!$scope.archive || !$scope.archiveReady) {\n      return false;\n    }\n    if (!$scope.archive.state.isNextAvailable) {\n\n      console.log('Next is not available?', $scope.archive.state);\n      return false;\n    }\n\n    return true;\n  }\n  $scope.prevImageAvailable = function prevImageAvailable() {\n    if (!$scope.archive || !$scope.archiveReady) {\n      return false;\n    }\n    if (!$scope.archive.state.isPrevAvailable) {\n\n      console.log('Prev is not available?', $scope.archive.state);\n      return false;\n    }\n\n    return true;\n  }\n\n  function buildArchiveUrl(archiveHit, i){\n    const map = getFilterMap($scope.config.config);\n    console.log('BuildArhive uri stuff', {archiveHit, map, $routeParams});\n\n    const levels = [\n      $routeParams.type,\n      $routeParams.index,\n    ];\n\n    let hasUndefined = false;\n\n    Object.keys(map).forEach(level => {\n\n      if (!map[level] || hasUndefined) return false;\n      const field = map[level].split('.').shift();\n\n      const value = archiveHit._source[field];\n\n\n      if (value === undefined){\n        hasUndefined = true;\n      }\n\n      levels.push(value);\n    })\n   \n    levels.push(archiveHit._id);\n    const uriValues = levels.filter(level => {\n      return (level !== undefined);\n    }).map(value => {\n      return encodeURIComponent(value);\n    })\n    \n    return `/main/crowdsource/${uriValues.join('/')}?i=${i}`;\n  }\n\n  $scope.prevImage = function prevImage(){\n    if (!$scope.archive || !$scope.archiveReady) {\n      return '#';\n    }\n\n\n    if ( ! $scope.archive.state.isPrevAvailable ){\n      return '#';\n    }\n\n    const i = number($routeParams.i, 0);\n    const url = buildArchiveUrl($scope.archive.state.prev, i - 1);\n    console.log({url, state: $scope.archive.state});\n    window.location = url;\n    // $location.url(url);\n  }\n\n  $scope.nextImage = function nextImage(){\n    if (!$scope.archive || !$scope.archiveReady){\n      return '#';\n    }\n\n    if ( ! $scope.archive.state.isNextAvailable ){\n      return '#';\n    }\n\n    const i = number($routeParams.i, 0);\n    const url = buildArchiveUrl($scope.archive.state.next, i + 1);\n    console.log({url, state: $scope.archive.state});\n    window.location = url;\n    // $location.url(url);\n  }\n\n  $scope.adminUrl = function adminUrl(){\n\n    const tenantId = $scope.tenantId;\n    const index = $routeParams.index;\n    const id = $routeParams.id;\n    return `/admin/settings/${tenantId}/crowdsource/${index}/${id}`;\n  }\n\n\n  config.then(function (res){\n    $scope.config = res;\n    $scope.tenantId = res.tenant;\n    const archive = fetchArchive(res, $routeParams, number($routeParams.i, 0));\n    archive.then(result => {\n      $scope.archive = result;\n      $scope.archiveReady = true;\n\n      const currentIndex = result.hits.hits.findIndex(hit => {\n        return (hit._id === $routeParams.id);\n      });\n\n      const next = result.hits.hits[currentIndex + 1];\n      const prev = result.hits.hits[currentIndex - 1];\n\n      const isNextAvailable = (next) ? true : false;\n      const isPrevAvailable = (prev) ? true : false;\n\n      $scope.archive.state = {\n        current: result.hits.hits[currentIndex],\n        next,\n        prev,\n        isNextAvailable,\n        isPrevAvailable,\n        currentIndex,\n      };\n\n\n      console.log('Yes success!', { result, currentIndex})\n      $scope.$applyAsync();\n    }).catch(error => {\n      console.error('Unable to fetch archive', error);\n    });\n\n    getCurrentRecord();\n  });\n\n  function cacheKeys(){\n    return {\n      left: `/cache/crowdsource/${$scope.tenantId}/${$routeParams.index}/${$routeParams.id}/pageLeft`,\n      right: `/cache/crowdsource/${$scope.tenantId}/${$routeParams.index}/${$routeParams.id}/pageRight`,\n      timestamp: `/cache/crowdsource/${$scope.tenantId}/${$routeParams.index}/${$routeParams.id}/timestamp`,\n    };\n  }\n\n  function clearCache(){\n    window.localStorage.removeItem(cacheKeys().right);\n    window.localStorage.removeItem(cacheKeys().left);\n  }\n\n  function checkCache(){\n    return {\n      right: window.localStorage.getItem(cacheKeys().right),\n      left: window.localStorage.getItem(cacheKeys().left),\n      timestamp: window.localStorage.getItem(cacheKeys().timestamp),\n    };\n  }\n\n\n  [ { id: 'record.pageRighOutput',   key: 'left' },\n    { id : 'record.pageLeftOutput', key: 'right' }].forEach(function (i){\n    $scope.$watch(i.id, function (a,b){\n      const keys = cacheKeys();\n      if (!b) return;\n      if (!$scope.tenantId) return;\n      $scope.enableSubmit = true;\n      $scope.showNotify = false;\n      // window.localStorage.setItem(keys[i.key], b);\n      // window.localStorage.setItem(keys.timestamp, new Date().getTime());\n    });\n  });\n\n  function updateCache(){\n    const keys = cacheKeys();\n    console.log('update cache', $scope.record)\n    window.localStorage.setItem(keys.left, $scope.record.pageLeft);\n    window.localStorage.setItem(keys.right, $scope.record.pageRight);\n    window.localStorage.setItem(keys.timestamp, new Date().getTime());\n  }\n\n  $scope.setPageActive  = function setPageActive(page){\n    $scope.page = page;\n    $scope.showInfo  = false;\n  }\n\n  $scope.getActiveClass = function getActiveClass(expected){\n    if ($scope.showInfo) return '';\n    return (expected === $scope.page) ? 'active' : '';\n  }\n\n  const imgSize = 'xx-large';\n\n  $scope.getImageHeight = function getImageHeight(){\n    if (!$scope.record) return '100px';\n    if (!$scope.record.metadata) return '100px';\n    if (!$scope.record.metadata.document) return '100px';\n\n    const source = $scope.record.metadata.document._source;\n    const thumbs = source.thumbnails;\n    const img = thumbs[imgSize];\n\n    if (!img) return '100px';\n\n    return `${img.size.height}px`;\n  }\n\n  $scope.saveAndSetActive = function saveAndSetActive(){\n    const save = $scope.saveContent(true);\n\n    function accept(id){\n      const d = new Api.crowdsource({\n        tenantId : $scope.tenantId,\n        indexId : $routeParams.index,\n        documentId : $routeParams.id,\n        id,\n      });\n\n      const accept = d.$accept();\n\n      accept.then(function success(res){\n        Notification.success('Breytingar vistaðar og samþykktar');\n      }, function error(err){\n        console.error('Unable to accept', err);\n        Notification.error('Gat ekki vistað');\n      })\n    }\n\n    save.then(function (res){\n      accept(res.id);\n    });\n  }\n\n  $scope.isAdmin = function isAdmin(){\n    if (!$scope.user) return false;\n    const perms = $scope.user.permissions;\n\n    if (!perms) return false;\n\n    const role = perms.global;\n\n    const roles = [\n      'global::admin',\n      'tenant::user',\n      'tenant::admin',\n      'tenant::superuser'\n    ];\n    return roles.includes(role);\n  }\n\n\n\n  $scope.record = {};\n  $scope.images = {};\n\n  function fetchImages(tenantId, indexId, recordId){\n    Api.crowdsource.get({\n      tenantId,\n      indexId,\n      documentId:recordId,\n      id: '_'\n    }).$promise.then(function (res){\n      if (res.metadata) {\n\n        console.log('Metadata for img?', res, $scope.record)\n        $scope.record.metadata = res.metadata;\n        $scope.images = createImageUri(res.metadata.document);\n      }\n    })\n  }\n\n  function fetchCache(active){\n    const cache = checkCache();\n    let timestamp = 0;\n\n    if (active && active.timestamp){\n      timestamp = new Date(active.timestamp).getTime();\n    }\n\n    if (cache.left) {\n      $scope.enableSubmit = true;\n      $scope.record.pageLeft = cache.left;\n    }\n    if (cache.right) {\n      $scope.enableSubmit = true;\n      $scope.record.pageRight = cache.right;\n    }\n  }\n\n  function getCurrentRecord(){\n\n    const  id = $routeParams.changeId || '_active';\n\n    const rec = Api.crowdsource.get({\n      tenantId: $scope.tenantId,\n      indexId: $routeParams.index,\n      documentId: $routeParams.id,\n      id,\n    });\n    fetchImages($scope.tenantId, $routeParams.index, $routeParams.id);\n    rec.$promise.then(function success(res){\n\n      if ($routeParams.changeId && res.record && res.metadata){\n        $scope.record = res.record._source;\n        return console.log('Fetching older record', {rec: res.record});\n      }\n\n      console.log('Oke fetch now', id, res)\n\n      if (! res.active ){\n        // return fetchCache();\n        return;\n      };\n\n      if (res.active.record){\n        $scope.record = res.active.record;\n      }\n\n      // fetchCache(res.active);\n    });\n  }\n  \n\n\n  function getRecordText(page) {\n    if (typeof page === 'object' && page.text ) return page.text;\n    return page;\n  }\n\n  function getRecordHtml(page) {\n    console.log({getRecoordHtml: page})\n    if (typeof page === 'object' && page.html ) return page.html;\n    return page;\n  }\n\n  $scope.saveContent = function saveContent(ignoreSuccess){\n    let objectName = \"\";\n    $scope.enableSubmit = false;\n\n    const metadata = $scope.record.metadata;\n    if (metadata && metadata.document && metadata.document._source){\n      objectName = metadata.document._source.ObjectName;\n    }\n\n\n    console.log({rec: $scope.record});\n\n    const record = new Api.crowdsource({\n      tenantId: $scope.tenantId,\n      indexId: $routeParams.index,\n      documentId: $routeParams.id,\n      pageLeft: getRecordHtml($scope.record.pageLeftOutput),\n      pageRight: getRecordHtml($scope.record.pageRightOutput),\n      objectName: objectName,\n      text: {\n        left: getRecordText($scope.record.pageLeftOutput),\n        right: getRecordText($scope.record.pageRighOutput),\n      },\n      editor: 'suneditor',\n\n    });\n\n    const create = record.$create();\n    create.then(function success(res){\n\n      // updateCache(); Fixme: Enable cache again laiter.\n      //clearCache(); // Kannski ekki sniðugt þar se þeirra breytingar hverfa við refresh.\n      if (! ignoreSuccess ) {\n        $scope.showNotify = true;\n        Notification.success(`Send til samþykktar.`);\n      }\n    }, function error(err){\n      Notification.error(`Gat ekki sent til samþykkar.`);\n      $scope.enableSubmit = true;\n      console.error(`Unable to save`, err);\n    });\n\n    return create;\n\n  }\n\n}\n\ncrowdsourceController.$inject = [\n  '$scope',\n  '$routeParams',\n  'Api',\n  'createImageUri',\n  'Notification',\n  '$location',\n  'fetchArchive',\n];\n\nexport default crowdsourceController;\n","\n// import Search from '../../shared/tools/search.js';\nimport base64url from 'base64-url/index.mjs';\nconst slug = require('slug')\nfunction audioListingController($scope, Api, es, bodybuilder, MetaService){\n\n  MetaService.set({\n    Title: 'Hljóðskrár',\n    Description: 'Leit í hljóðskrám',\n    Keywords: 'hljóðskrár gamalt gamlar',\n  });\n\n  const masterAudio = document.getElementById('masterAudio');\n  $scope.audioSelected = false;\n\n  $scope.quickSearchState = {};\n\n  $scope.keys = [\n    { id: 'Title', name: 'Titill' },\n    { id: 'Description', name: 'Description' },\n    { id: 'Rights', name: 'Rights' },\n    { id: 'ObjectName', name: 'ObjectName' },\n    { id: 'CaptionWriter', name: 'CaptionWriter' },\n    { id: 'City', name: 'City' },\n    { id: 'Country', name: 'Country' },\n    { id: 'UserDefined19', name: 'UserDefined19' },\n    { id: 'UserDefined3', name: 'UserDefined3' },\n    { id: 'UserDefined4', name: 'UserDefined4' },\n    { id: 'Subject', name: 'Subject' },\n    { id: 'Keywords', name: 'Keywords' },\n  ];\n\n  $scope.editCover = function editCover($event, item){\n    $event.preventDefault();\n\n    const attr = $scope.getAttrKey(item);\n    window.location.pathname = `/admin/attribute-editor/${attr}`;\n    return false;\n  }\n\n\n  $scope.isFieldString = function isFieldString(item, field){\n    const data = $scope.getFieldMetadata(item, field);\n    return (typeof data === 'string' );\n  }\n  $scope.isFieldArrayOfStrings = function isFieldArrayOfStrings(item, field) {\n    const data = $scope.getFieldMetadata(item, field);\n\n    if (!Array.isArray(data)) return false;\n\n    return data.every(value => {\n      return (typeof value === 'string');\n    });\n  }\n\n  $scope.getFieldMetadata = function getFieldMetadata(item, field){\n    return item[field.id]\n  }\n\n  $scope.stopAndClose = function stopAndClose(item){\n    item._isPlaying = false;\n    $scope.audioSelected = false;\n    masterAudio.pause();\n  }\n\n\n  function setNotPlaying(){\n    $scope.list.forEach(arrayItem => {\n      arrayItem._isPlaying = false;\n    });\n  }\n\n  $scope.displayCount = function displayCount(count){\n    \n    if (typeof count === 'object' && count.value){\n      return count.value;\n    }\n\n    return count;\n  }\n\n  $scope.filterView = function filterView(query) {\n    return function each(item) {\n      // Disable this search on deep search enabled.\n      if ($scope.deepSearch) return true;\n      if (!query) return true;\n      const regex = new RegExp(query.toUpperCase());\n\n      return regex.test(item.key.toUpperCase());\n    }\n  }\n\n  function getFilter(item) {\n\n    if (!item.filter) return false;\n\n    const filter = [\n      { type: 'term', field: item.filter.field, value: item.filter.value }\n    ];\n\n    return base64url.encode(JSON.stringify(filter));\n  }\n\n  $scope.getAttrKey = function getAttrKey(item){\n    const field = (item.filter) ? item.filter.field : '_';\n    const fieldWithoutKeyword = field.replace('.keyword', '');\n    const slugged = slug(item.key); \n\n    return `audio/${fieldWithoutKeyword}:${slugged}`;\n  }\n\n  $scope.itemLink = function itemLink(item){\n\n    const indicesString = item._index.join(',');\n    const filter = getFilter(item);\n    const base = `/main/audio/${indicesString}`;\n    \n\n    const attrKey = $scope.getAttrKey(item);\n    if (filter){\n      return `${base}?filter=${filter}&attrkey=${attrKey}`;\n    }\n    return base;\n  }\n\n  $scope.togglePlay = function togglePlay(item){\n\n    const isPlaying = item._isPlaying;\n    setNotPlaying();\n    \n    if (isPlaying){\n      return masterAudio.pause();\n      // pause\n    } else {\n      item._isPlaying = true;\n      $scope.audioSelected = item;\n      const audioLink = getAudioSource(item);\n      masterAudio.src = audioLink;\n      masterAudio.play();\n      // Play\n    }\n  }\n\n  function getAudioSource(item){\n    if (! item || ! item.id) return false;\n    return `/static/dev/wav/${item.id}.mp3`;\n  }\n\n\n  $scope.aggrigateKey = 'UserDefined3.keyword';\n\n  function getIndicesCacheKeys(indices) {\n    const keys = indices.map(function (index) {\n      return index.cachekey;\n    }).filter(function (key) {\n      return key;\n    });\n    if (keys.length < 1) return new Date().toISOString();\n    return keys.join(':');\n  }\n\n\n  function fetchRecords(quickQuery){\n\n    const query = bodybuilder().agg('terms', $scope.aggrigateKey, 'credit', { size: 500 });\n\n    if (quickQuery) {\n      query.query('query_string', 'query', quickQuery);\n    }\n\n    const indicesToSearchIn = $scope.indexSelected.map(function (index) {\n      return index.index;\n    });\n\n\n    const cacheKey = getIndicesCacheKeys($scope.indexSelected);\n\n    $scope.indices = indicesToSearchIn.join(',');\n    if (indicesToSearchIn.length < 1) {\n      $scope.hits = [];\n      return console.warn('No index available');\n    }\n\n    const qObject = query.build();\n\n    qObject.track_total_hits = true;\n\n    $scope.quickSearchState.loading = true;\n    es.search({\n      index: indicesToSearchIn,\n      type: '_doc',\n      body: qObject,\n      size: 0,\n    }, true, cacheKey).then(function success(response) {\n      $scope.quickSearchState.loading = false;\n\n      if (!response.aggregations || typeof response.aggregations !== 'object') return;\n      if (response.aggregations.credit.buckets.length < 1) {\n        return $scope.hits = [{\n          _index: indicesToSearchIn,\n          _type: '_doc',\n          key: 'Allar hljóðskrár',\n          doc_count: response.hits.total\n        }];\n      }\n      $scope.hits = [{\n        _index: indicesToSearchIn,\n        _type: '_doc',\n        key: 'Allar hljóðskrár',\n        doc_count: response.hits.total\n      }];\n\n      const agg = response.aggregations.credit;\n\n      if (!Array.isArray(agg.buckets)) return;\n\n      const hits = agg.buckets.map(function (hit) {\n        hit._index = indicesToSearchIn;\n        hit._type = '_doc';\n        hit.filter = {\n          type: 'term',\n          field: $scope.aggrigateKey,\n          value: hit.key,\n        };\n        return hit;\n      });\n      $scope.hits = $scope.hits.concat(hits);\n    });\n  }\n\n\n  $scope.config = Api.siteConfig();\n\n  $scope.availableIndices = [];\n  $scope.indexSelected = [];\n\n  const getCurrentUser = Api.me.get();\n\n  getCurrentUser.$promise.then(function success(currentUser) {\n    if (currentUser && currentUser.permissions && currentUser.permissions.current ) {\n      $scope.showAttrEditorLink = true;\n    }\n  })\n\n  $scope.config.then(function success(res){\n    $scope.availableIndices = res.indices.filter(index => {\n      return (index.type === 'audio');\n    });\n\n\n    $scope.tenant = res.tenant;\n\n    $scope.indexSelected = $scope.availableIndices;\n\n    fetchRecords();\n\n    $scope.indices = res.indices;\n  })\n};\n\n\n\naudioListingController.$inject = [\n  '$scope',\n  'Api',\n  'es',\n  'bodybuilder',\n  'MetaService',\n];\n\n\nexport default audioListingController;\n","\n// import Search from '../../shared/tools/search.js';\nimport base64url from 'base64-url/index.mjs';\n\nfunction audioController($scope, Api, es, bodybuilder, $routeParams, $location, $http, MetaService){\n\n  // const listUrl = '/static/dev/wav/manifest.json';\n  // const metadataUrl = '/static/dev/wav/exif.json';\n  MetaService.set({\n    Title: 'Hljóðskrár',\n    Description: 'Leit í hljóðskrám',\n    Keywords: 'hljóðskrár gamalt gamlar',\n  });\n  const masterAudio = document.getElementById('masterAudio');\n\n\n  $scope.showAttrEditorLink = false;\n\n  $scope.attributeKey = $location.search().attrkey;\n\n  $scope.audioSelected = false;\n\n  $scope.quickSearchState = {};\n\n  $scope.keys = [\n    { id: 'Title', name: 'Titill' },\n    { id: 'Description', name: 'Description' },\n    { id: 'Rights', name: 'Rights' },\n    { id: 'ObjectName', name: 'ObjectName' },\n    { id: 'CaptionWriter', name: 'CaptionWriter' },\n    { id: 'City', name: 'City' },\n    { id: 'Country', name: 'Country' },\n    { id: 'UserDefined19', name: 'UserDefined19' },\n    { id: 'UserDefined3', name: 'UserDefined3' },\n    { id: 'UserDefined4', name: 'UserDefined4' },\n    { id: 'Subject', name: 'Subject' },\n    { id: 'Keywords', name: 'Keywords' },\n  ];\n\n\n  $scope.isFieldString = function isFieldString(item, field){\n    const data = $scope.getFieldMetadata(item, field);\n    return (typeof data === 'string' );\n  }\n  $scope.isFieldArrayOfStrings = function isFieldArrayOfStrings(item, field) {\n    const data = $scope.getFieldMetadata(item, field);\n\n    if (!Array.isArray(data)) return false;\n\n    return data.every(value => {\n      return (typeof value === 'string');\n    });\n  }\n\n  $scope.getFieldMetadata = function getFieldMetadata(item, field){\n    return item[field.id]\n  }\n\n  $scope.stopAndClose = function stopAndClose(item){\n    item._isPlaying = false;\n    $scope.audioSelected = false;\n    masterAudio.pause();\n  }\n\n  function setNotPlaying(items){\n    items.forEach(arrayItem => {\n      arrayItem._isPlaying = false;\n    });\n  }\n\n\n  $scope.togglePlay = function togglePlay(item, items){\n\n    const isPlaying = item._isPlaying;\n    setNotPlaying(items);\n    \n    if (isPlaying){\n      return masterAudio.pause();\n      // pause\n    } else {\n      item._isPlaying = true;\n      $scope.audioSelected = item;\n      const audioLink = getAudioSource(item);\n      masterAudio.src = audioLink;\n      masterAudio.play();\n      // Play\n    }\n  }\n\n  function getAudioSource(item){\n    const url = item._source.audio.location;\n    return `/static/${url}`;\n  }\n\n  function getUriFilters(){\n    const uriFilter = $location.search().filter;\n    if (uriFilter){\n      try {\n        //return base64url.encode(JSON.stringify(filter));\n        const json = base64url.decode(uriFilter);\n\n        return JSON.parse(json);\n      } catch (e){\n        return false;\n      }\n    }\n  }\n\n  $scope.hits = [];\n\n\n  function fetchRecords(quickQuery){\n\n    const filters = getUriFilters();\n\n    const query = bodybuilder();\n\n    if (filters){\n      filters.forEach(filter => {\n        query.filter(filter.type, filter.field, filter.value);\n      });\n    }\n\n    const search = es.search({\n      index: $routeParams.index,\n      body:  query.build(),\n    });\n\n\n    search.then(function success(res){\n      $scope.hits = res.hits.hits;\n    })\n  }\n\n\n  function getAttributes(tenantId, attrId){\n    const req = $http.get(`/api/tenants/${tenantId}/attributes/${attrId}`);\n\n\n    return req.then(function (response){\n      return response.data;\n    })\n  }\n\n\n\n  const getCurrentUser = Api.me.get();\n  \n  getCurrentUser.$promise.then(function success(currentUser){\n    if (currentUser && currentUser.permissions && currentUser.permissions.current && $scope.attributeKey){\n      $scope.showAttrEditorLink = true;\n    }\n  })\n  \n\n  $scope.config = Api.siteConfig();\n\n  $scope.availableIndices = [];\n  $scope.indexSelected = [];\n\n  $scope.config.then(function success(configResponse){\n    fetchRecords();\n\n    if ($scope.attributeKey){\n\n      const id = $scope.attributeKey.split('/').pop()\n      getAttributes(configResponse.tenant, id).then(function success(attrs){\n\n        if (attrs){\n          $scope.attrs = attrs;\n        }\n\n      })\n    }\n  })\n};\n\n\n\naudioController.$inject = [\n  '$scope',\n  // '$http',\n  'Api',\n  'es',\n  'bodybuilder',\n  '$routeParams',\n  '$location',\n  '$http',\n  'MetaService',\n  // '$filter',\n  // '$window',\n  // 'Api',\n  // 'createImageUri',\n  // 'CacheFactory',\n  // 'es',\n];\n\n\nexport default audioController;\n","import notFoundCtrl from '../../shared/ctrl/not-found.js';\nimport albumsCtrl from './albums.js';\nimport imageCtrl from './image.js';\nimport archivesCtrl from './archives.js';\nimport archiveCtrl from './archive.js';\nimport albumsSearchCtrl from './albums-search.js';\nimport registryCtrl from './registry.js';\nimport searchCtrl from './search.js';\nimport infoCtrl from '../../shared/ctrl/info-controller.js';\nimport confirmCtrl from '../../shared/ctrl/confirm.js';\nimport crowdsourceController from './crowdsource.js';\nimport cookieController from '../../shared/ctrl/cookies.js';\nimport audioListingController from './audio-listing.js';\nimport audioController from './audio.js';\nimport blogController from './blog.js';\n\n\nconst app = angular.module('main');\n\napp.controller('cookies',  ['$scope', 'Api', cookieController ]);\n\napp.controller('confirmModal', [\n  '$scope', 'Confirm', '$q', confirmCtrl\n]);\napp.controller('notFound', [\n  '$scope',  notFoundCtrl\n]);\napp.controller('registry', registryCtrl);\napp.controller('albumsSearch', albumsSearchCtrl);\napp.controller('search', searchCtrl);\napp.controller('image', imageCtrl);\napp.controller('archive', archiveCtrl);\napp.controller('archives', archivesCtrl)\napp.controller('albums', albumsCtrl);\napp.controller('siteInfoController', [\n  '$scope', '$location', 'Api', infoCtrl\n]);\napp.controller('crowdsource', crowdsourceController);\n\napp.controller('audio', audioController);\napp.controller('audioListing', audioListingController);\napp.controller('blog', blogController);\n\n","\nimport confirmFactory  from '../../shared/factories/confirm.js';\nimport indexCache  from '../../shared/factories/index-cache.js';\nimport searchCache  from '../../shared/factories/search-cache.js';\n\nconst app = angular.module('main');\napp.factory('indexCache', ['$cacheFactory', indexCache ]);\napp.factory('searchCache', ['CacheFactory', searchCache ]);\napp.factory('Confirm', [ confirmFactory ]);\n","\nimport humanNumbers from '../../shared/filters/human-number';\nimport bytesFilter from '../../shared/filters/bytes.js';\n\nconst app = angular.module('main');\napp.filter('humanNumbers', humanNumbers);\napp.filter('bytes', [bytesFilter]);\n","import helpers from '../../helpers';\n\nhelpers.addWebPClass();\nhelpers.initLozad();\nhelpers.initTooltips();\n\nimport './module';\nimport './directives';\nimport './ctrl';\nimport './routes';\nimport './factories';\nimport './filters';\n","const app = angular.module('main');\napp.config([\n  '$routeProvider',\n  '$locationProvider',\n  'uiSelectConfig',\n  '$httpProvider',\n  'NotificationProvider',\n  function ($routeProvider,\n            $locationProvider,\n            uiSelectConfig,\n            $httpProvider,\n            NotificationProvider ){\n\n  // Admin stuff\n  $routeProvider.when('/main/albums', {\n    templateUrl : 'views/albums.html',\n    reloadOnSearch : false,\n    reloadOnUrl: false,\n    controller  : 'albums',\n  })\n  .when('/main/albums/:tenantID/:indexId', {\n    templateUrl : 'views/search-album.html',\n    controller  : 'albumsSearch',\n    reloadOnSearch : false,\n  })\n  .when('/main/image/:tenantID/:index/:id', {\n    templateUrl : 'views/image.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'image',\n  })\n  .when('/main/archives', {\n    templateUrl : 'views/archives.html',\n    reloadOnSearch : false,\n    controller  : 'archives',\n  })\n  .when('/main/registry', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2/:level3', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2/:level3/:level4', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2/:level3/:level4/:level5', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2/:level3/:level4/:level5/:level6', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/registry/:level1/:level2/:level3/:level4/:level5/:level6/:level7', {\n    templateUrl : 'views/registry.html',\n    reloadOnSearch : false,\n    controller  : 'registry',\n  })\n  .when('/main/archives/:level1', {\n    templateUrl : 'views/archives.html',\n    reloadOnSearch : false,\n    controller  : 'archives',\n  })\n  .when('/main/archives/:level1/:level2', {\n    templateUrl : 'views/archives.html',\n    reloadOnSearch : false,\n    controller  : 'archives',\n  })\n  .when('/main/archives/:level1/:level2/:level3', {\n    templateUrl : 'views/archives.html',\n    reloadOnSearch : false,\n    controller  : 'archives',\n  })\n  .when('/main/archive/:level1', {\n    templateUrl : 'views/archive.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'archive',\n  })\n  .when('/main/archive/:level1/:level2', {\n    templateUrl : 'views/archive.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'archive',\n  })\n  .when('/main/archive/:level1/:level2/:level3', {\n    templateUrl : 'views/archive.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'archive',\n  })\n  .when('/main/archive/:level1/:level2/:level3/:level4', {\n    templateUrl : 'views/archive.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'archive',\n  })\n  .when('/main/crowdsource/:type/:index/:level1/:id', {\n    templateUrl : 'views/crowdsource.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'crowdsource',\n  })\n  .when('/main/crowdsource/:type/:index/:level1/:level2/:id', {\n    templateUrl : 'views/crowdsource.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'crowdsource',\n  })\n  .when('/main/crowdsource/:type/:index/:level1/:level2/:level3/:id', {\n    templateUrl : 'views/crowdsource.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'crowdsource',\n  })\n  .when('/main/crowdsource/:type/:index/:level1/:level2/:level3/:level4/:id', {\n    templateUrl : 'views/crowdsource.html',\n    reloadOnSearch : false,\n    reloadOnUrl : false,\n    controller  : 'crowdsource',\n  })\n  .when('/main/search', {\n    templateUrl : 'views/search.html',\n    reloadOnSearch : false,\n    controller  : 'search',\n  })\n  .when('/main/audio', {\n    templateUrl: 'views/main/audio-listing.html',\n    reloadOnSearch: false,\n    controller: 'audioListing',\n  })\n  .when('/main/audio/:index', {\n    templateUrl: 'views/main/audio.html',\n    reloadOnSearch: false,\n    controller: 'audio',\n  })\n  .when('/main/blog', {\n    templateUrl: 'views/main/blog-listing.html',\n    reloadOnSearch: false,\n    controller: 'blog',\n  })\n  .when('/main/blog/:id', {\n    templateUrl: 'views/main/blog.html',\n    reloadOnSearch: false,\n    controller: 'blog',\n  })\n  .otherwise({\n    templateUrl : 'views/not-found.html',\n    controller  : 'notFound'\n  });\n\n  $locationProvider.html5Mode(true);\n  uiSelectConfig.theme = 'bootstrap';\n  uiSelectConfig.resetSearchInput = true;\n  uiSelectConfig.appendToBody = true;\n\n  NotificationProvider.setOptions({\n      positionX: 'left',\n      positionY: 'bottom'\n  });\n}]);\n","\n\nfunction logHttpError(err){\n  console.log(`Unable to fetch, ${err.status} ${err.config.method} ${err.config.url} got: `, err.data, {error: err});\n}\n\n\n\nmodule.exports = {\n  logHttpError\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"js/bundle-\" + chunkId + \".js?h=\" + \"bbe6c00d8855362734e4\" + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 179;","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkphoto_engine_web\"] = self[\"webpackChunkphoto_engine_web\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [216,458,513], () => (__webpack_require__(79861)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","$","require","blogController","$scope","$routeParams","$http","$rootScope","fetchListing","draft","get","concat","then","res","blogs","data","showDraft","specialClass","suggestion","len","length","id","blog","isPlaying","togglePlay","elm","carousel","interval","ride","isFullscreen","toggleFullscreen","document","getElementById","pause","requestFullscreen","addEventListener","event","fullscreenElement","$applyAsync","toggleDraft","isAdmin","me","permissions","current","includes","$inject","module","exports","app","angular","service","run","applicationRun","storage","window","localStorage","__recaptchaKey","__recaptchaValid","response","console","log","elem","Event","dispatchEvent","__recaptchaNotValid","error","__loadRecaptcha","warn","__recap_render","grecaptcha","render","callback","directiveAdvancedSearch","es","bodybuilder","restrict","scope","index","filters","config","templateUrl","link","element","attrs","initMappings","mappings","Object","keys","forEach","key","map","type","name","show","mapping","conf","search","defaultMap","aggSize","mapTypeIcon","agg","reload","success","update","addFilter","_agg","query","filter","field","value","size","cacheSeed","JSON","stringify","copy","q","build","request","body","loading","aggregations","buckets","d","Date","sort","a","b","doc_count","min","max","f","pop","getFilter","gte","range","lte","total","hits","catch","err","not","currentIndex","findIndex","splice","push","$watchCollection","post","pre","LightBox","createImageUri","$document","$anchorScroll","$location","replace","active","tenant","images","i","onOpen","onClose","onImage","doOpen","getAggregateConfig","_typeof","albums","aggregate","user","_role","user_role","getIndexUrl","img","_source","_indexID","_id","getAggregateValue","hit","getAggregateFilter","getImageSearchFilter","_index","filterParam","base64url","encode","comments","reCAPTCHA","enableComments","undefined","showadvancedmetadata","showAdvancedMatadata","onImageCallback","image","$watch","before","after","open","isOpen","showInfo","showComment","getbackdropId","getCarousel","backdropId","target","srcset","largeImage","large","getImageDownloadName","rights","Rights","hash","sourceHash","MD5","substring","title","Title","xxlargeImage","doShowInfo","doShowComment","showSidebars","fullscreen","exitFullscreen","_asyncToGenerator","_regeneratorRuntime","_callee2","_context2","prev","next","stop","documentElement","_callee","_context","style","overflowY","overflowX","onOpenCallback","setTimeout","keyboard","wrap","keyEventHandler","on","nextImage","to","nextImageId","nextElementId","count","showHeader","onMouseMove","tooltip","selector","classList","add","hideHeaderTimeout","clearTimeout","removeClass","addClass","e","tagName","srcElement","toLowerCase","keyCode","close","removeEventListener","onCloseCallback","isActive","urls","tools","imageInfo","hasPermission","anchorScroll","userInfoRequest","userinfo","logHttpError","premRequired","$$state","status","perms","perm","global","directive","$timeout","randomId","chars","split","arr","s","Math","floor","random","join","transclude","template","_value","keywordField","keyword","attr","container","find","popoverElement","popover","trigger","html","placement","sanitize","content","indexCount","whenInView","observer","IntersectionObserver","ent","intersectionRatio","arguments","observe","textEditor","appNavbar","loadingDirective","indices","onSearch","controller","transcludeFn","engine","typeahead","minLength","highlight","limit","source","queryString","syncCb","asyncCb","parts","searchFor","prefix","rawOption","text","description","term","string_distance","min_word_length","prefix_length","comment","use","Array","isArray","suggest","options","obj","message","statusCode","directiveFilterable","albumCoverImage","lozadController","markdown","Api","selected","updateQueryParams","ids","uriSelected","queryParams","expandIndices","siteConfig","global_role","showMe","toggleShowIndices","v","btnName","indexQuerySelected","indexLink","isAlias","_$scope$availableIndi","availableIndices","selectAll","setSelected","int","isSelected","printMetadata","doc","submitMessage","disableCommentSubmit","token","fetchToken","tokenValid","alert","recapElement","json","getItem","parse","getUrl","url","URL","location","origin","pathname","searchParams","set","jwt","validReCAPTCHA","method","toString","isTokenValid","sendMessage","tenantId","metadata","indexId","href","recaptcha","getResponse","navigator","connection","appVersion","language","languages","platform","userAgent","vendor","isObject","setItem","getAttribute","setAttribute","script","createElement","src","appendChild","addRecaptcha","fetchingComments","n","o","docid","fetchExistingComments","lozad","order","thumbs","imageSizes","placeholder","ieImage","sizeHash","indexA","indexOf","indexB","minWidth","toFixed","rootMargin","loaded","el","infoDirective","advancedSearch","createFilter","lightBox","zoomControl","initVars","largeAvailable","largeLoaded","imageReplaced","dragDisabled","isDirty","draggable","elements","item","isLoadingLarge","zoomLarge","Promise","resolve","reject","Image","onload","onerror","threshold","mousedown","cancel","mouselocation","x","y","clientX","clientY","currentTranslate","tmpTranslate","resetzoom","transform","zoomin","setTransform","zoomout","fixed","assign","preventDefault","deltaX","deltaY","wheelDelta","in","out","reset","alertDirective","albumsController","CacheFactory","MetaService","fetchAlbums","quickQuery","aggrigateKey","terms","indicesToSearchIn","indexSelected","cacheKey","cachekey","toISOString","qObject","track_total_hits","quickSearchState","credit","_type","deepSearch","postedQuickQuery","orderKey","orderType","Description","Keywords","docCount","createCache","deleteOnExpire","maxAge","recycleFreq","storageMode","backCache","removeTargetCache","$event","currentTarget","attributes","nodeValue","remove","doDeepSearch","albumLink","filterView","RegExp","toUpperCase","test","siteInit","imageController","navStatusProgress","tenantID","primaryImageUri","showAlert","lastQuery","fallbackQuery","bQuery","bquery","decoded","object","decode","loadLastQuery","imageIndex","parseNumber","prevUrl","alias","nextImageLoading","prevImageLoading","notifyUser","css","alertMessage","alertClass","isNextAvailable","isPrevAvailable","string","parseInt","isNaN","esSearch","from","parseHit","fetchImageUri","fetchNextImages","notify","done","isItemAvailable","fetchPrevImages","prevSize","prevFrom","reverse","unshift","initCarouselEvents","ev","direction","each","hasClass","setItemActive","currentLength","path","updateRouteParams","prevImageAvailable","nextImageAvailable","ready","updateWithDoc","herarkSpecialSort","toNumber","str","multiplyYear","val","magnitude","numbs","reduce","archivesController","getUrlQuery","navigation","init","customSortsFns","custom_herak_1","some","currentLevel","levels","level","lastKey","uri","nextLevel","uriParts","encodeURIComponent","getNavUri","populateNavication","level1","level2","level3","level4","levelSet","sortKey","sortOrder","fn","isString","fnKey","isFunction","customcompare","fetchTree","uriq","nextField","archives","_nextAvailable","uriArray","paths","createArchiveUri","indicesSelected","getNext","archive","aLevels","settings","customSort","albumFilterSet","customFilter","record","archiveConfig","clone","_albumFilter","thumbnail","jQuery","async","archiveController","Notification","Slide","createLink","meta","scrollElement","scrollBy","left","zoom","disableRouteChange","showMetadata","showThumbs","isPrinting","getQueryParamAsInt","slide","imageCount","hasInit","def","print","imageDownloadUri","imageName","ObjectName","currentImageInZoom","toggleShowMetadata","thumbMinWidth","thumb","thumbnails","width","isLoadingThumbs","hasLoadedAllImages","errorLoadingThumbs","toggleShowThumbs","progressCallback","loadingThumbsStatus","percentage","slider","queryObj","fetch","doWhilst","finished","arg","regAvailable","registryIndexAvailable","CustomField10","getRegistryUri","ReferenceNumber","category","box","CustomField11","sheet","CustomField12","selectThumbnail","changeImage","getCurrentMagnification","__magnification","indexMap","fetchIfNeeded","curDoc","isNumber","_slide","inx","topMargin","ceil","elasticSlider","nextFrom","_prevAvailable","parseHits","fetchPrev","fetchNext","_archiveConfig$sortIm","_archiveConfig$sortIm2","filterMap","getFilterMap","lastUri","sortBy","sortImagesBy","sortByOrder","firstFetch","updateMetaservice","fetchArhive","getImagesrcset","setLocation","offsetX","currentSlide","isLookingUpRegistry","registryRecord","registryCache","lookupRegistry","every","ref","CustomField11_number","CustomField12_number","trueIndex","keydown","nextSlide","prevSlide","showEditLink","getEditLink","part","charAt","encodeURI","showMetadataDetails","csCache","getCrowdsourceText","page","cached","crowdsource","currentCs","documentId","csIndexCache","thumbUris","Thumbnail","isCrowdsource","ccs","$resolved","cs","$promise","textAvailable","getSlideIndex","albumsSearch","$filter","$window","_filterHash","filterToEdit","sorts","decodeUriFilters","thumbnailView","scrollDisabled","fuzzy","currentImageId","openImageId","_defineProperty","submitSearch","getIndicesToSearchIn","uriIndex","showAdvancedSearch","editFilter","showAddFilter","uriCacheId","openImage","hideTooltips","currentUri","$$url","getImageUri","getCurrentUri","removeKeyword","prop","base64","$on","allIndices","sortable","addSortable","state","query_string","searchInput","routeParamIndices","seedArray","priv","idx","es_index","public","hasPrivateIndex","cacheSeedKey","onPageLoad","onLightboxClose","onLightboxOpen","onLightboxImage","queryToHuman","dateFilter","isNew","_$scope$sort","input","lastQueryString","replaceFlags","default_operator","analyze_wildcard","flags","fields","boost","getQuery","sField","$scope_sort","queryMinimumShouldMatch","Search","results","queryBody","values","findLastImage","totalResults","took","moreResults","updateMetadata","loadMoreResults","cb","registryCtrl","minQueryLength","updateTreeAndView","fetchLevels","root","selectedTree","noop","fetchAgg","originalBuckets","slice","parsed","parser","tree","parseBuckets","lastItem","forEachSeries","levelId","decodeURIComponent","collapsed","fetchAndCollapse","matchLevelAndCollapse","fetchMain","q1","q2","treeQueryString","eQuery","getIndices","_mainResult","mainFetched","mainResults","searchLink","relation","updated","getRelationLink","deliveries","delivery","getFieldValue","categories","cate","sub_categories","subcate","sheets","yfirskjalafl","aggregationSort","createFilemakerObject","updateMainView","toggleType","base","sidebar","scrollToMe","loops","getElement","top","offsetTop","scrollTo","behavior","trees","A","cache","_original","sortIcelandic","textfn","bucket","dataProvider","textValue","level5","level6","B","sub","sub_agg","lastLevel","last","getOtherText","selectedTreeType","treeTypes","treeType","isAfh","afhA","afhB","localeCompare","parent","nextId","charCodeAt","hashString","self","this","$$path","shift","printResults","linkUrl","levelid","recurse","dateNow","searchController","intiSearch","indicesTypes","requestedType","defaultQuery","hasAndOr","orQuery","fuzzys","fuzziness","zero_terms_query","operator","queryStringBuilder","querys","filemaker","indicesArray","notFilter","noResults","isSearching","itemResult","queryBuilt","copyOfQueryString","searchError","result","queryUsed","_index_type","pages","sliced","inRange","number","neg","showPage","showAsPrev","showAsNext","pageCount","array","disabled","createPages","fetchCount","audioLink","_hit$_source","_hasAudio","audio","fieldNames","album","displayTotal","submitForSearch","p","prevPage","selectPage","nextPage","_res$config$archive","names","defaultType","t","imageSource","hasImage","filterName","removeFilter","setType","prevAvailable","nextAvailable","getPageClass","searchResultClass","_popover","showPopover","elementId","imgUrls","medium","hidePover","crowdsourceController","fetchArchive","buildArchiveUrl","archiveHit","hasUndefined","uriValues","getRecordText","getRecordHtml","getRecoordHtml","enableSubmit","showBackButton","archiveReady","getBackUrl","prevImage","adminUrl","rec","recordId","changeId","showNotify","setPageActive","getActiveClass","expected","getImageHeight","height","saveAndSetActive","saveContent","$accept","role","ignoreSuccess","objectName","create","pageLeft","pageLeftOutput","pageRight","pageRightOutput","right","pageRighOutput","editor","$create","slug","audioListingController","masterAudio","audioSelected","editCover","getAttrKey","isFieldString","getFieldMetadata","isFieldArrayOfStrings","stopAndClose","_isPlaying","displayCount","fieldWithoutKeyword","slugged","itemLink","indicesString","attrKey","list","arrayItem","getAudioSource","play","currentUser","showAttrEditorLink","fetchRecords","audioController","attributeKey","attrkey","items","setNotPlaying","configResponse","uriFilter","getUriFilters","attrId","cookieController","confirmCtrl","notFoundCtrl","albumsSearchCtrl","searchCtrl","imageCtrl","archiveCtrl","archivesCtrl","albumsCtrl","infoCtrl","factory","indexCache","searchCache","confirmFactory","humanNumbers","bytesFilter","helpers","addWebPClass","initLozad","initTooltips","$routeProvider","$locationProvider","uiSelectConfig","$httpProvider","NotificationProvider","when","reloadOnSearch","reloadOnUrl","otherwise","html5Mode","theme","resetSearchInput","appendToBody","setOptions","positionX","positionY","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","m","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","definition","defineProperty","enumerable","u","chunkId","g","globalThis","Function","prototype","hasOwnProperty","Symbol","toStringTag","nmd","children","baseURI","installedChunks","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","__webpack_exports__"],"sourceRoot":""}