{"version":3,"sources":["app.js","au-fallback.js","au.js","au-helpers.js","au-navigation.js","au-cookies.js","au-ipure.js","au-design.js","au-social.js","au-databox.js","au-flowbox.js","au-alphabox.js","au-responsive.js","au-news.js","au-maps.js","au-piechart.js","au-defaults.js","au-search.js","au-init.js"],"names":["pressed","url","location","href","pres","replaceall","s","x","y","length","found","indexOf","substring","multipressed","xx","urlPattern","StartValue","allow","OK","i","elements","type","selectedIndex","options","value","toLowerCase","window","alert","AU","pageLang","cdn","version","bss","ready","addReadyFunction","fn","push","console","log","error","load","addLoadFunction","resize","addResizeFunction","scroll","addScrollFunction","navigation","helpers","getUnicodeKey","e","unicode","keyCode","charCode","rewriteLink","text","trim","replace","getQuerystring","key","default_","regex","RegExp","qs","exec","getInternetExplorerVersion","rv","navigator","userAgent","ua","re","parseFloat","$1","isMobileDevice","test","getXML","source","callback","jQuery","ajax","dataType","success","data","isElementInViewport","element","rect","getBoundingClientRect","top","left","bottom","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","isElementPartlyInViewport","offsetTop","offsetLeft","width","offsetWidth","height","offsetHeight","offsetParent","pageYOffset","pageXOffset","trimText","label","amount","end","validateEmail","email","componentToHex","c","hex","toString","rgbToHex","r","g","b","this","getPageContent","retrieveSelector","insertSelector","urlAllowed","protocolAndHost","protocol","host","insertElement","accentMap","é","ä","ö","á","ü","normalizeAccents","term","ret","charAt","menu","setClick","on","headerMenu","parents","hasClass","removeClass","addClass","setUtility","databox","init","alphabox","setBreadcrumb","bc","crumbs","crumbCutOff","eq","after","toggleClass","addExtraMenuItem","topLevelMenuItems","each","topLevelMenuItem","topLevelSubMenu","prepend","attr","setTopBar","topBarLinks","topBarContent","parent","responsive","state","NAME","topBarTimeout","setTimeout","show","css","hide","clearTimeout","preventDefault","not","toggle","selectedUM","search","val","focus","frontpage","setTargetGroups","buttons","groups","toggleGroup","group","btn","button","cookies","set","c_name","exdays","path","exdate","Date","setDate","getDate","c_value","encodeURI","toUTCString","cookie","get","c_start","c_end","decodeURI","alertElement","noAlertPeriod","strings","header","paragraph","alertCookies","replaceCookieTexts","createElement","setAttribute","innerHTML","globalFooter","querySelector","insertAdjacentElement","style","display","allowCookies","initCookieScript","cookieScriptId","head","cookieScriptManipulationCode","cookieScriptVersion","insertBefore","firstElementChild","addEventListener","accept","duration","byGUI","undefined","ipure","searchCrossSite","searchDetailsCrossSite","photos","getPerson","xml","name","$","find","room","lastname","firstname","details","detailsSource","person","getPersonDetails","func","multipleDepartments","centerMap","street","zip","city","address","nameNode","photoNode","addressNode","webNode","phoneNode","departmentNode","firstName","lastName","auid","photoSrc","found_addresses","j","k","officePhone","buildingNumber","personHTML","mobilePhone","n","getPeople","people","peopleXML","p","id","design","setFocusFieldIds","setBuildingLinks","elementToSearchSelector","elementToSearch","mapUrl","buildingPhrase","html","onCollapseOpen","onCollapseClose","setCollapse","openEvent","createEvent","initEvent","closeEvent","collapsibles","me","domElement","unbind","dispatchEvent","d","target","openCollapsibleFromHash","hash","scrollIntoView","grayscale","src","supportsCanvas","getContext","imageData","px","gray","canvas","context","img","Image","drawImage","getImageData","putImageData","toDataURL","err","setBannerElementsReady","hover","stop","animate","opacity","setBannerElementsLoad","setHero","hero","scrollTop","parseInt","setMagnificPopup","lightbox","rels","Object","keys","index","magnificPopup","gallery","enabled","modal","newsImgs","setTopWarning","topWarning","class","topWarningTextDa","topWarningTextEn","social","config","mode","container","tracking","links","classname","sharing","direction","icons","spacing","title","size","color","initFunc","sharers","newsSharer","peopleXsSharer","mergeOptions","sharer","hasOwnProperty","conf","renderButtons","shareTitle","shareUrl","services","dirClass","iconClass","spacedClass","append","disableAddThisForOldNews","trackingFunc","box","fb","twitter","linkedin","mail","loaded","openShareDialog","open","instashow","getScript","yottie","ajaxSetup","cache","boxes","scriptLoaded","loadExternal","db","AUDatabox","componentsUrl","flowbox","AUFlowbox","ab","AUAlphabox","stateHistory","modes","PHONE","ID","MAX","TABLET","DESKTOP","detectDevice","Foundation","MediaQuery","current","setMarkup","markupRenderFunctions","runMarkupFunctions","utilityLinks","sectionHeader","pageNav","titleBar","menuTitle","leftMenu","tablesScroll","wrap","before","table","wasPhone","states","is","unwrap","edutables","tables","dg","AUDiagramme","disqus_no_style","disqus_shortname","disqus_url","disqus_loaded","news","feeds","setPopup","AUNews","AUNewsCollage","body","popup","appendChild","fc","componentsUri","String","prototype","hashCode","ch","l","Math","abs","charCodeAt","namespace","history","replaceHash","newhash","replaceState","back","GOOGLE_MAPS_API_KEY","maps","loadGoogleMapsScript","shouldLoadGoogleMapsScript","shouldLoadGoogleMapsScriptAsync","loadGoogleMapsScriptAsync","scriptUrl","script","onload","onerror","event","googleMapsScriptLoaded","googleMapsScriptCallback","CustomEvent","create","zoomLevel","center","scrollWheel","draggable","clickable","streetView","pco","zco","svco","mapOptions","zoom","scrollwheel","streetViewControl","mapTypeControlOptions","mapTypeIds","google","MapTypeId","ROADMAP","HYBRID","MapTypeControlStyle","DROPDOWN_MENU","position","ControlPosition","RIGHT_TOP","mapTypeId","panControlOptions","zoomControlOptions","streetViewControlOptions","map","Map","isNaN","setBounds","markers","bounds","LatLngBounds","extend","fitBounds","marker","add","point","markerIcon","markerDraggable","markerClickable","markerPanTo","markerClickZoom","markerClickZoomLevel","infoWindow","windowContent","Marker","icon","addListener","setContent","panTo","getPosition","getZoom","setZoom","trigger","route","destinationFrom","destinationTo","directionsDisplay","directionsService","calc","from","to","travelMode","waypointLocations","waypoints","stopover","request","origin","destination","response","status","DirectionsStatus","getMap","setMap","setDirections","createDirectionObjects","rendererOptions","DirectionsRenderer","panel","setPanel","geocodePersonAddress","geocoder","geocode","results","GeocoderStatus","LatLng","geometry","lat","lng","markerDrag","markerClick","clickPanTo","clickZoom","clickZoomLevel","getDistanceBetweenPoints","point1","point2","spherical","computeDistanceBetween","convertFromLatLng","coord","round","convertToLatLng","getCurrentDate","date","month","getMonth","currentDate","getFullYear","getCurrentTime","hours","getHours","minutes","getMinutes","currentTime","sortSelect","selectedValue","sort","a","sortAlphaObj","single","image","_markerDrag","_markerClick","_clickPanTo","_clickZoom","_clickZoomLevel","defaultZoomLevel","_defaultZoomLevel","_scrollWheel","_draggable","_clickable","_streetView","centerLat","_centerLat","centerLng","_centerLng","mapWidth","mapHeight","mapDivs","firstMapLoaded","findFirstMap","firstMap","getElementById","loadMaps","dataFunc","locations","combinedPoints","names","latitude","longitude","points","name_en","switchmode","getJSON","DirectionsService","InfoWindow","Geocoder","divUsed","currentMap","m","mapContainer","setMapContent","span","link","option","selected","click","idSplit","split","switchMode","change","onchangeHybrid","setMapTypeId","clear","setCenter","setMapClickEvent","widget","googleMaps","widgets","constants","BUILDING","DEPARTMENT","OVERLAY","markerWidth","markerHeight","overlayMarkerWidth","overlayMarkerHeight","pin","loadMap","loadData","w","building","department","overlay","setAutoCompletes","checkForSearchQuery","ieVersion","xdr","XDomainRequest","parseJSON","responseText","onprogress","send","loc","acLocOptions","minLength","autoFocus","select","ui","item","setBuildingMarker","getBuilding","setDepartmentMarkers","getDepartment","setOverlayMarker","getOverlay","acPeopleOptions","setPersonMarker","autocomplete","getBuildingString","query","containsBuildingNumber","match","cbn","bs","bldg","querySplit","clearMarkers","clearOld","showContent","MarkerImage","Size","content","empty","searchDetailsWrapper","departmentsdetails","buildingNode","buildings","place","groupid","groupname","iw","number","departmentId","wdgt","piechart","colors","pie","highlight","col","amt","usePound","slice","num","getData","colorIndex","pd","createLegend","Chart","legendHolder","generateLegend","firstChild","childNodes","legendNode","addEvent","activeSegment","segments","save","fillColor","highlightColor","showTooltip","restore","draw","parentNode","pies","mountNode","visible","getComputedStyle","chartPie","Pie","tooltipTemplate","animation","pieLegend","DEFAULT_util_staffportal_da","alphabet","stacked","background","DEFAULT_util_staffportal_en","DEFAULT_util_department_da","DEFAULT_util_department_en","DEFAULT_util_staffservice_da","description","noResultsAlphabet","noResultsSearch","noResultsUri","placeHolder","DEFAULT_util_staffservice_en","DEFAULT_util_phdportal_da","DEFAULT_util_phdportal_en","DEFAULT_util_student_da","linkColor","DEFAULT_util_student_en","DEFAULT_staff_staffservice_da","DEFAULT_staff_staffservice_en","CludoSearch","searchUrl","primaryDanish","baseUrlAppend","baseUrl","engineId","cludoEngineId","filters","DomainName","cludoSettings","customerId","searchInputs","initSearchBoxText","loading","endlessScroll","stopAfterPage","resultsPerPage","bottomOffset","language","disableAutocomplete","disableCludoAutocomplete","customCallbackAfterSearch","checkForBanners","Cludo","banners","wrapInner","foundation","AUCDNPATH","classList","contains","langAttr","getAttribute","newsLists","cludoDanishPath","cludoEnglishPath","defaultTracking","cmForms","form","privacyEmail","findBtn","basic","sz","async","getElementsByTagName"],"mappings":"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","file":"app.js","sourcesContent":["'use strict';\n\n/**\r\n * @author TRH\r\n */\n\n/*** GLOBALT AU OBJEKT ***/\n\nvar AU = {\n pageLang: 'da', // Default sprog\n cdn: 'https://cdn.au.dk',\n version: '202204211100',\n bss: false,\n ready: [],\n addReadyFunction: function addReadyFunction(fn) {\n if (typeof fn === 'function') {\n // Check if the function reference already exists in the ready array\n if (AU.ready.indexOf(fn) === -1) {\n AU.ready.push(fn);\n } else {\n console.log(\"Function already exists in AU.ready and will not be added again.\");\n }\n } else {\n console.error(\"Attempted to add a non-function to AU.ready.\");\n }\n },\n load: [],\n addLoadFunction: function addLoadFunction(fn) {\n if (typeof fn === 'function') {\n // Check if the function reference already exists in the load array\n if (AU.load.indexOf(fn) === -1) {\n AU.load.push(fn);\n } else {\n console.log(\"Function already exists in AU.load and will not be added again.\");\n }\n } else {\n console.error(\"Attempted to add a non-function to AU.load.\");\n }\n },\n resize: [],\n addResizeFunction: function addResizeFunction(fn) {\n if (typeof fn === 'function') {\n // Check if the function reference already exists in the resize array\n if (AU.resize.indexOf(fn) === -1) {\n AU.resize.push(fn);\n } else {\n console.log(\"Function already exists in AU.resize and will not be added again.\");\n }\n } else {\n console.error(\"Attempted to add a non-function to AU.resize.\");\n }\n },\n scroll: [],\n addScrollFunction: function addScrollFunction(fn) {\n if (typeof fn === 'function') {\n // Check if the function reference already exists in the scroll array\n if (AU.scroll.indexOf(fn) === -1) {\n AU.scroll.push(fn);\n } else {\n console.log(\"Function already exists in AU.scroll and will not be added again.\");\n }\n } else {\n console.error(\"Attempted to add a non-function to AU.scroll.\");\n }\n },\n navigation: {}\n};\n'use strict';\n\n/**\r\n * Titel: HELPERS\r\n * Beskrivelse: hjælpemetoder som kan anvendes på tværs af alle scripts\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\n\nAU.helpers = {\n getUnicodeKey: function getUnicodeKey(e) {\n var unicode = e.keyCode ? e.keyCode : e.charCode;\n return unicode;\n },\n rewriteLink: function rewriteLink(text) {\n return text.trim().toLowerCase().replace(/ /g, '_').replace(/æ/g, 'ae').replace(/ø/g, 'oe').replace(/å/g, 'aa');\n },\n getQuerystring: function getQuerystring(key, default_) {\n if (!default_) {\n default_ = '';\n }\n\n key = key.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + key + \"=([^&#]*)\");\n\n var qs = regex.exec(window.location.href);\n\n if (qs === null) {\n return default_;\n } else {\n return qs[1];\n }\n },\n getInternetExplorerVersion: function getInternetExplorerVersion() {\n var rv = -1;\n if (navigator.userAgent.indexOf('Trident') > -1) {\n var ua = navigator.userAgent;\n var re = new RegExp(\"rv:([0-9]{1,}[.0-9]{0,})\");\n if (re.exec(ua) !== null) {\n rv = parseFloat(RegExp.$1);\n }\n }\n return rv;\n },\n isMobileDevice: function isMobileDevice() {\n return (/Mobile|iP(hone|od|ad)|Android|IEMobile/i.test(navigator.userAgent)\n );\n },\n getXML: function getXML(source, callback) {\n jQuery.ajax({\n type: 'GET',\n url: source,\n dataType: 'xml',\n success: function success(data) {\n if (typeof callback === 'function') {\n callback(data);\n }\n }\n });\n },\n isElementInViewport: function isElementInViewport(element) {\n if (element === null) {\n return false;\n }\n\n var rect = element.getBoundingClientRect();\n\n return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth);\n },\n isElementPartlyInViewport: function isElementPartlyInViewport(element) {\n var top = element.offsetTop;\n var left = element.offsetLeft;\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n while (element.offsetParent) {\n element = element.offsetParent;\n top += element.offsetTop;\n left += element.offsetLeft;\n }\n\n return top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset;\n },\n trimText: function trimText(label, amount, end) {\n if (label.length > amount) {\n return label.substring(0, amount) + end;\n }\n\n return label;\n },\n validateEmail: function validateEmail(email) {\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(email);\n },\n componentToHex: function componentToHex(c) {\n var hex = c.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n },\n rgbToHex: function rgbToHex(r, g, b) {\n return this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);\n },\n getPageContent: function getPageContent(url, retrieveSelector, insertSelector, callback) {\n var urlAllowed = function urlAllowed(url) {\n var protocolAndHost = location.protocol + '//' + location.host;\n return url.indexOf(protocolAndHost) === 0;\n };\n\n var insertElement = jQuery(insertSelector);\n if (urlAllowed(url)) {\n insertElement.load(url + ' ' + retrieveSelector, function () {\n if (typeof callback === 'function') {\n callback();\n }\n });\n return true;\n } else {\n return false;\n }\n },\n accentMap: {\n 'é': 'e',\n 'ä': 'æ',\n 'ö': 'ø',\n 'á': 'a',\n 'ü': 'y'\n },\n normalizeAccents: function normalizeAccents(term, accentMap) {\n if (!accentMap) {\n accentMap = this.accentMap;\n }\n\n var ret = '';\n for (var i = 0; i < term.length; i++) {\n ret += accentMap[term.charAt(i)] || term.charAt(i);\n }\n return ret;\n }\n};\n'use strict';\n\n/**\r\n * Titel: NAVIGATION\r\n * Beskrivelse: initialisering af menuer, fade (som stadig bruges til news), brødkrummer m.m.\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\n\nAU.navigation.menu = {\n setClick: function setClick() {\n jQuery('button.menu-icon').on('click', function () {\n var headerMenu = jQuery(this).parents('.header-menu');\n if (headerMenu.hasClass('open')) {\n headerMenu.removeClass('open');\n if (!AU.bss) {\n jQuery('.search').removeClass('hide');\n }\n } else {\n headerMenu.addClass('open');\n if (!AU.bss) {\n jQuery('.search').addClass('hide');\n }\n }\n });\n },\n setUtility: function setUtility() {\n jQuery(document).on('show.zf.dropdown', 'header .dropdown-pane', function () {\n AU.databox.init();\n AU.alphabox.init();\n });\n },\n setBreadcrumb: function setBreadcrumb() {\n var bc = jQuery('#au_breadcrumb');\n var crumbs = jQuery('> a', bc);\n var crumbCutOff = 3;\n if (crumbs.length > crumbCutOff) {\n bc.addClass('collapse');\n crumbs.eq(0).after('
   
');\n jQuery('.bc-expand span').on('click', function () {\n bc.toggleClass('collapse');\n });\n }\n },\n addExtraMenuItem: function addExtraMenuItem() {\n // Fix til den mobile menu, hvor der indsættes et ekstra top-level menupunkt\n var topLevelMenuItems = jQuery('.top-bar > div > ul.menu li.has-submenu');\n topLevelMenuItems.each(function () {\n var topLevelMenuItem = jQuery('> a', this);\n var topLevelSubMenu = jQuery('ul.submenu', this);\n topLevelSubMenu.prepend('
  • ' + topLevelMenuItem.text() + '
  • ');\n });\n },\n setTopBar: function setTopBar() {\n var topBarLinks = jQuery('body:not(.department):not(.neutral) .top-bar .menu > li > a, body.department:not(.omnibus) .top-bar.custom .menu > li > a');\n var headerMenu = jQuery('.header-menu');\n topBarLinks.each(function () {\n var topBarContent = jQuery('.top-bar-content', jQuery(this).parent());\n jQuery(this).on('mouseover', function () {\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\n AU.navigation.topBarTimeout = setTimeout(function () {\n topBarContent.show().css('width', headerMenu.css('width'));\n }, 300);\n }\n }).on('mouseout', function () {\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\n topBarContent.hide();\n clearTimeout(AU.navigation.topBarTimeout);\n }\n }).on('click', function (e) {\n if (AU.helpers.isMobileDevice()) {\n e.preventDefault();\n jQuery('.top-bar-content').not(topBarContent).hide();\n topBarContent.toggle().css('width', headerMenu.css('width'));\n }\n });\n });\n\n jQuery('.top-bar-content').on('mouseover', function () {\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\n jQuery(this).show();\n }\n }).on('mouseout', function () {\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\n jQuery(this).hide();\n }\n });\n\n if (typeof window.selectedUM !== 'undefined' && window.selectedUM !== 100) {\n // 100 = ingenting.\n jQuery('.top-bar .menu > li:eq(' + (window.selectedUM - 1) + ')').addClass('active');\n }\n }\n};\n\nAU.navigation.search = {\n setClick: function setClick() {\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').on('focusout', function () {\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').val('');\n jQuery('.section-header').removeClass('opensearch');\n });\n\n jQuery('.au_searchbox').on('click', function () {\n jQuery('.section-header').addClass('opensearch');\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').focus();\n });\n }\n};\n\nAU.navigation.frontpage = {\n setTargetGroups: function setTargetGroups() {\n var buttons = jQuery('.target-groups .button');\n var groups = jQuery('.target-groups + div > div > .csc-default');\n var toggleGroup = function toggleGroup(i) {\n var group = groups.eq(i);\n group.toggleClass('active');\n groups.not(group).removeClass('active');\n };\n buttons.each(function (i, btn) {\n var button = jQuery(btn);\n button.on('click', function (e) {\n e.preventDefault();\n jQuery(this).toggleClass('active');\n buttons.not(button).removeClass('active');\n toggleGroup(i);\n });\n });\n }\n};\n'use strict';\n\n/**\r\n * Titel: COOKIES\r\n * Beskrivelse: Hjælpemetoder til get/set af cookies samt initialisering af cookievarsling\r\n * Status: er ikke blevet ændret siden 2011-designet. Cookieadvarslen kunne med fordel skrives om til ES6/React\r\n */\n\nAU.cookies = {\n set: function set(c_name, value, exdays, path) {\n if (typeof path === 'undefined') {\n path = ';path=/;domain=au.dk';\n }\n\n var exdate = new Date();\n exdate.setDate(exdate.getDate() + exdays);\n var c_value = encodeURI(value) + (exdays === null ? '' : '; expires=' + exdate.toUTCString());\n document.cookie = c_name + '=' + c_value + path;\n },\n get: function get(c_name) {\n var c_value = document.cookie;\n var c_start = c_value.indexOf(' ' + c_name + '=');\n if (c_start === -1) {\n c_start = c_value.indexOf(c_name + '=');\n }\n if (c_start === -1) {\n c_value = null;\n } else {\n c_start = c_value.indexOf('=', c_start) + 1;\n var c_end = c_value.indexOf(';', c_start);\n if (c_end === -1) {\n c_end = c_value.length;\n }\n c_value = decodeURI(c_value.substring(c_start, c_end));\n }\n return c_value;\n },\n alertElement: null,\n noAlertPeriod: 365,\n strings: {\n header: '',\n paragraph: '',\n button: ''\n },\n init: function init() {\n if (window.alertCookies) {\n var replaceCookieTexts = function replaceCookieTexts(text) {\n return text.replace('{0}', AU.cookies.strings.header).replace('{1}', AU.cookies.strings.paragraph).replace('{2}', AU.cookies.strings.button);\n };\n\n var alertElement = document.createElement('div');\n alertElement.setAttribute('id', 'au_cookiesalert');\n alertElement.innerHTML = replaceCookieTexts('

    {0}

    {1}

    ');\n var globalFooter = document.querySelector('footer.global');\n if (globalFooter) {\n globalFooter.insertAdjacentElement('afterend', alertElement);\n alertElement.style.display = 'none';\n this.alertElement = alertElement;\n }\n\n var allowCookies = this.get('allow_cookies');\n if (allowCookies === null) {\n this.alert();\n }\n }\n },\n initCookieScript: function initCookieScript() {\n if (typeof window.cookieScriptId !== 'undefined') {\n // Insert scripts and CSS for Pop Up\n var head = document.head;\n var cookieScriptManipulationCode = document.createElement('script');\n cookieScriptManipulationCode.setAttribute('src', '//cdn.au.dk/res/cookiescript/cookie-modal.min.js?a=' + (typeof window.cookieScriptVersion !== 'undefined' ? window.cookieScriptVersion : '1'));\n cookieScriptManipulationCode.setAttribute('charset', 'UTF-8');\n cookieScriptManipulationCode.setAttribute('type', 'text/javascript');\n head.insertBefore(cookieScriptManipulationCode, head.firstElementChild);\n }\n },\n alert: function alert() {\n if (this.alertElement !== null) {\n this.alertElement.style.display = 'block';\n\n document.querySelector('#au_cookiesalert_yes button').addEventListener('click', function (e) {\n e.preventDefault();\n AU.cookies.accept(AU.cookies.noAlertPeriod, true);\n });\n }\n },\n accept: function accept(duration, byGUI) {\n var path = location.host.indexOf('au.dk') > -1 ? undefined : ';path=/';\n this.set('allow_cookies', 'true', duration, path);\n if (byGUI) {\n this.alertElement.style.display = 'none';\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: IPURE\r\n * Beskrivelse: Globale funktioner til kald af iPure-personsøgning - bruges på kort og i nyt medarbejderdesign\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\n\nAU.ipure = {\n source: {\n searchCrossSite: '//ipure.nfit.au.dk/searchPeople.php?sort=lno&q=',\n searchDetailsCrossSite: '//ipure.nfit.au.dk/current/da_DK/lno/',\n photos: 'http://ipure.nfit.au.dk/current/'\n },\n getPerson: function getPerson(xml) {\n var name = $(xml).find('name');\n var room = name.attr('room');\n var lastname = name.attr('lastName');\n var firstname = name.attr('firstName');\n var details = $(xml).find('details');\n var detailsSource = details.attr('external');\n\n var person = {\n lastname: lastname,\n firstname: firstname,\n room: room,\n detailsSource: detailsSource\n };\n\n return person;\n },\n getPersonDetails: function getPersonDetails(xml, func, multipleDepartments) {\n\n var nameNode = $(xml).find('name');\n var photoNode = $(xml).find('photo');\n var addressNode = $(xml).find('address');\n var webNode = $(xml).find('web');\n var phoneNode = $(xml).find('phone');\n var departmentNode = $(xml).find('department');\n\n var firstName = nameNode.attr('firstName');\n var lastName = nameNode.attr('lastName');\n var auid = nameNode.attr('employeeId');\n var photoSrc = photoNode.attr('external');\n var centerMap, street, zip, city, address;\n\n // Vi løber alle tilknyttede enheder igennem og finder ud af, om adresserne er forskellige\n var found_addresses = [];\n for (var j = 0; j < departmentNode.length; j++) {\n street = $(addressNode[j]).attr('street');\n zip = $(addressNode[j]).attr('zip');\n city = $(addressNode[j]).attr('city');\n address = street + \", \" + zip + \" \" + city;\n var found = false;\n for (var k = 0; k < found_addresses.length; k++) {\n if (found_addresses[k] === address) {\n found = true;\n }\n }\n if (j === 0 || !found) {\n found_addresses.push(address);\n }\n }\n\n var email;\n var officePhone;\n var buildingNumber;\n var personHTML = '
    ';\n // Vi løber alle enheder igennem\n for (var i = 0; i < departmentNode.length; i++) {\n street = $(addressNode[i]).attr('street');\n zip = $(addressNode[i]).attr('zip');\n city = $(addressNode[i]).attr('city');\n buildingNumber = $(addressNode[i]).attr('building');\n var room = $(addressNode[i]).attr('room');\n officePhone = $(phoneNode[i]).attr('office');\n var mobilePhone = $(phoneNode[i]).attr('mobile');\n email = $(webNode[i]).attr('email');\n\n personHTML += '

    ' + firstName + ' ' + lastName + '

    ';\n personHTML += '

    ';\n if (typeof photoSrc !== 'undefined') {\n personHTML += '\"\"';\n }\n\n if (found_addresses.length === 1) {\n for (var n = 0; n < departmentNode.length; n++) {\n personHTML += '' + $(departmentNode[n]).attr('name') + '
    ';\n }\n centerMap = true;\n } else {\n personHTML += '' + $(departmentNode[i]).attr('name') + '
    ';\n centerMap = false;\n }\n\n if (typeof buildingNumber !== 'undefined') {\n personHTML += (AU.pageLang === \"da\" ? \"Bygning \" : \"Building \") + buildingNumber;\n if (typeof room !== 'undefined') {\n personHTML += \", \" + (AU.pageLang === \"da\" ? \"Kontor \" : \"Office \") + room + \"
    \";\n } else {\n personHTML += \"\";\n }\n }\n\n personHTML += '' + street + ', ' + zip + ' ' + city + '

    ';\n\n if (typeof officePhone !== 'undefined') {\n if (AU.helpers.isMobileDevice()) {\n personHTML += 'T: ' + officePhone + '
    ';\n } else {\n personHTML += 'T: ' + officePhone + '
    ';\n }\n }\n\n if (typeof mobilePhone !== 'undefined') {\n if (AU.helpers.isMobileDevice()) {\n personHTML += 'M: ' + mobilePhone + '
    ';\n } else {\n personHTML += 'M: ' + mobilePhone + '
    ';\n }\n }\n\n if (typeof email !== 'undefined') {\n personHTML += 'E: ' + email + '
    ';\n }\n\n /*\r\n if (typeof auid !== 'undefined') {\r\n personHTML += 'ID: AU' + auid + '';\r\n }\r\n */\n\n personHTML += '

    ';\n\n if (i === 0 && !multipleDepartments) {\n break;\n }\n }\n\n personHTML += '
    ';\n\n if (typeof func === 'function') {\n func(personHTML, buildingNumber, email, officePhone, address, auid, centerMap);\n }\n },\n getPeople: function getPeople(xml) {\n var people = [];\n var peopleXML = $(xml).find('person');\n\n $.each(peopleXML, function (i, p) {\n var name = $(p).find('name');\n var room = name.attr('room');\n var lastname = name.attr('lastName');\n var firstname = name.attr('firstName');\n var details = $(p).find('details');\n var detailsSource = details.attr('external');\n\n var person = {\n id: i,\n lastname: lastname,\n firstname: firstname,\n room: room,\n detailsSource: detailsSource,\n label: firstname + ' ' + lastname,\n value: firstname + ' ' + lastname,\n url: detailsSource\n };\n\n people[i] = person;\n });\n\n return people;\n }\n};\n'use strict';\n\n/**\r\n * Titel: DESIGN\r\n * Beskrivelse: metoder som udbedrer en række \"shortcomings\" i designet eller tilføjer ekstra features til elementer\r\n * Status: er en blanding af nyt og gammelt. ES5-syntax hele vejen igennem\r\n */\n\nAU.design = {\n setFocusFieldIds: function setFocusFieldIds() {\n jQuery('.au_focus').each(function (i) {\n if (!jQuery(this).attr('id')) {\n jQuery(this).attr('id', 'focusid_' + i);\n }\n });\n },\n setBuildingLinks: function setBuildingLinks(elementToSearchSelector) {\n var elementToSearch = jQuery(elementToSearchSelector);\n\n if (elementToSearch.length > 0) {\n var mapUrl = AU.pageLang === \"da\" ? '//www.au.dk/kort/' : '//www.au.dk/en/map/';\n var buildingPhrase = AU.pageLang === \"da\" ? 'bygning' : 'building';\n var re = new RegExp('(' + buildingPhrase + ' (\\\\d{4}))', 'ig');\n jQuery.each(elementToSearch, function () {\n jQuery(this).html(jQuery(this).html().replace(re, '$1'));\n });\n }\n },\n onCollapseOpen: [],\n onCollapseClose: [],\n setCollapse: function setCollapse() {\n\n var openEvent = document.createEvent('Event');\n openEvent.initEvent('collapsible-open', true, true);\n\n var closeEvent = document.createEvent('Event');\n closeEvent.initEvent('collapsible-close', true, true);\n\n var collapsibles = jQuery('.csc-frame.au_collapsible');\n collapsibles.each(function () {\n var me = jQuery(this);\n var domElement = me.get(0);\n var header = jQuery('> .csc-header', me);\n\n header.unbind('click').on('click', function () {\n me.toggleClass('au_collapsed');\n if (me.hasClass('au_collapsed')) {\n domElement.dispatchEvent(closeEvent);\n } else {\n domElement.dispatchEvent(openEvent);\n }\n });\n\n var d = AU.design;\n domElement.addEventListener('collapsible-open', function (e) {\n for (var i = 0; i < d.onCollapseOpen.length; i++) {\n if (typeof d.onCollapseOpen[i] === 'function') {\n d.onCollapseOpen[i](e.target);\n }\n }\n }, false);\n\n domElement.addEventListener('collapsible-close', function (e) {\n for (var i = 0; i < d.onCollapseClose.length; i++) {\n if (typeof d.onCollapseClose[i] === 'function') {\n d.onCollapseClose[i](e.target);\n }\n }\n }, false);\n });\n\n this.openCollapsibleFromHash(location.hash);\n\n jQuery(window).on('hashchange', function () {\n AU.design.openCollapsibleFromHash(location.hash);\n });\n },\n openCollapsibleFromHash: function openCollapsibleFromHash(hash) {\n if (hash.indexOf('c') === 1) {\n jQuery(hash + '.csc-frame.au_collapsible, ' + hash + ' > .csc-frame.au_collapsible, ' + hash + ' > .csc-frame.au_collapsible').removeClass('au_collapsed');\n jQuery(hash).parents('.au_collapsible').removeClass('au_collapsed');\n document.querySelector(hash).scrollIntoView();\n }\n },\n grayscale: function grayscale(src) {\n try {\n var supportsCanvas = !!document.createElement('canvas').getContext;\n if (supportsCanvas) {\n var canvas = document.createElement('canvas'),\n context = canvas.getContext('2d'),\n imageData,\n px,\n length,\n i = 0,\n gray,\n img = new Image();\n\n img.src = src;\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0);\n\n imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n px = imageData.data;\n length = px.length;\n\n for (; i < length; i += 4) {\n gray = px[i] * 0.3 + px[i + 1] * 0.59 + px[i + 2] * 0.11;\n px[i] = px[i + 1] = px[i + 2] = gray;\n }\n\n context.putImageData(imageData, 0, 0);\n return canvas.toDataURL();\n } else {\n return src;\n }\n } catch (err) {\n console.log(err);\n return src;\n }\n },\n setBannerElementsReady: function setBannerElementsReady() {\n jQuery('.aubanner a').hover(function () {\n jQuery(this).find('.gotcolors').stop().animate({ opacity: 1 }, 200);\n }, function () {\n jQuery(this).find('.gotcolors').stop().animate({ opacity: 0 }, 500);\n });\n },\n setBannerElementsLoad: function setBannerElementsLoad() {\n jQuery('.aubanner:not(.aubanner-2) img').each(function () {\n // Fordi det er fuldstændig utænkeligt, at vi kan få fjernet Prototype fra pure.au.dk...\n var bc = jQuery('.aubanner-content', jQuery(this).parents('.aubanner'));\n bc.css('background-image', \"url('\" + AU.design.grayscale(this.src) + \"')\");\n }).animate({ opacity: 1 }, 500);\n },\n setHero: function setHero() {\n var hero = jQuery('.hero');\n if (hero.length > 0) {\n jQuery(window).scroll(function () {\n var x = jQuery(this).scrollTop() + (jQuery('body').hasClass('layout13') ? 0 : -200);\n hero.css('background-position-y', parseInt(x / 10) + 'px');\n });\n }\n },\n setMagnificPopup: function setMagnificPopup() {\n var lightbox = jQuery('.csc-textpic a[rel*=\"lightbox\"], .image a[rel*=\"lightbox\"]');\n\n // http://stackoverflow.com/questions/6900958/using-jquery-to-perform-a-function-on-elements-with-unique-rel-attribute\n var rels = {};\n lightbox.each(function () {\n var r = jQuery(this).attr('rel');\n rels[r] = 1;\n });\n\n rels = Object.keys(rels);\n jQuery.each(rels, function (index, value) {\n jQuery('a[rel=\"' + value + '\"]').magnificPopup({\n type: 'image',\n gallery: {\n enabled: true\n },\n modal: false\n });\n });\n\n var newsImgs = jQuery('.au_news-single-sub-images a, .au_news-single-img a, .news-set1-img1all a');\n newsImgs.magnificPopup({\n type: 'image',\n gallery: {\n enabled: true\n },\n modal: false\n });\n },\n setTopWarning: function setTopWarning() {\n if (window.topWarning) {\n jQuery('body').prepend(jQuery('
    ', {\n 'class': 'ie-warning',\n 'html': AU.pageLang == 'da' ? window.topWarningTextDa : window.topWarningTextEn\n }));\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: SOCIAL\r\n * Beskrivelse: #SoME-deling\r\n * Status: er kun i nogen grad omskrevet fra 2011/2015-udgaven. Kunne med fordel ændres til ES6/React (hvis behovet er der?)\r\n */\n\nAU.social = {\n options: {\n config: {\n mode: 'sharing',\n container: '.au_social_sharebox',\n tracking: '/virtual/social/sharing/',\n links: [{\n classname: 'facebook',\n text: 'AU på Facebook',\n url: 'https://www.facebook.com/UniAarhus'\n }, {\n classname: 'twitter',\n text: 'AU på Twitter',\n url: 'https://twitter.com/AarhusUni'\n }, {\n classname: 'linkedin',\n text: 'AU på LinkedIn',\n url: 'http://www.linkedin.com/company/aarhus-university-denmark-?trk=hb_tab_compy_id_4648'\n\n }, {\n classname: 'youtube',\n text: 'AU på YouTube',\n url: 'http://www.youtube.com/user/AarhusUniversity'\n\n }, {\n classname: 'vimeo',\n text: 'AU på Vimeo',\n url: 'http://vimeo.com/channels/181624'\n }, {\n classname: 'instagram',\n text: 'AU på Instagram',\n url: 'http://instagram.com/aarhusuni'\n }],\n sharing: [{\n classname: 'facebook',\n text: 'Del på Facebook'\n }, {\n classname: 'twitter',\n text: 'Del på Twitter'\n }, {\n classname: 'linkedin',\n text: 'Del på LinkedIn'\n }, {\n classname: 'email',\n text: 'Send til en ven'\n }],\n direction: '',\n icons: true,\n spacing: false,\n title: '',\n url: '',\n size: 'medium',\n color: 'real',\n initFunc: null\n }\n },\n sharers: [],\n newsSharer: {\n config: {\n container: '#au_content .au_news-single-item',\n tracking: '/virtual/ttnews/sharing/',\n direction: 'horizontal'\n }\n },\n peopleXsSharer: {\n config: {\n container: '#au_content .peoplexs-single',\n tracking: '/virtual/peoplexs/sharing/',\n direction: 'horizontal'\n }\n },\n mergeOptions: function mergeOptions(sharer) {\n if (!sharer.hasOwnProperty('config')) {\n sharer.config = {};\n }\n\n for (var conf in this.options.config) {\n if (!sharer.config.hasOwnProperty(conf)) {\n sharer.config[conf] = this.options.config[conf];\n }\n }\n },\n renderButtons: function renderButtons(sharer) {\n\n var html = \"\";\n if (sharer.config.mode === 'sharing') {\n\n var shareTitle = sharer.config.title;\n var shareUrl = sharer.config.url;\n\n var direction = sharer.config.direction;\n var icons = sharer.config.icons;\n var spacing = sharer.config.spacing;\n var services = sharer.config.sharing;\n\n var dirClass = direction === '' ? '' : ' ' + direction;\n var iconClass = icons ? ' icons' : '';\n var spacedClass = spacing ? ' spacing' : '';\n\n html += '';\n } else {\n\n var links = sharer.config.links;\n var color = sharer.config.color === 'real' ? '' : ' style=\"color: ' + sharer.config.color + ';\"';\n\n html += '';\n }\n\n sharer.container.append(html);\n },\n disableAddThisForOldNews: function disableAddThisForOldNews() {\n $('.au_news-single-item .addthis_toolbox').hide();\n },\n trackingFunc: function trackingFunc(sharer) {\n $('ul.au_social_sharing a', sharer.container).on('click', function () {\n // Used to track old Google Analytics\n });\n },\n init: function init() {\n\n if (this.sharers.length > 0) {\n\n var c = this.options.config;\n if (AU.pageLang !== 'da') {\n c.links[0].text = 'AU on Facebook';\n c.links[1].text = 'AU on Twitter';\n c.links[2].text = 'AU on LinkedIn';\n c.links[3].text = 'AU on YouTube';\n c.links[4].text = 'AU on Vimeo';\n c.links[5].text = 'AU on Instagram';\n c.sharing[0].text = 'Facebook share';\n c.sharing[1].text = 'Twitter share';\n c.sharing[2].text = 'LinkedIn share';\n c.sharing[3].text = 'Send to a friend';\n }\n\n c.title = $('title').text();\n c.url = location.href;\n c.initFunc = function (box) {\n if (box.config.mode === 'sharing') {\n var s = AU.social;\n s.fb.setClick(box);\n s.twitter.setClick(box);\n s.linkedin.setClick(box);\n s.mail.setClick(box);\n }\n };\n\n for (var i = 0; i < this.sharers.length; i++) {\n var s = this.sharers[i];\n\n if (!s.loaded) {\n this.mergeOptions(s);\n s.container = $(s.config.container).eq(0);\n this.renderButtons(s);\n s.loaded = true;\n s.config.initFunc(s);\n\n this.trackingFunc(s);\n }\n }\n }\n },\n fb: {\n openShareDialog: function openShareDialog(url) {\n window.open('https://www.facebook.com/sharer/sharer.php?u=' + url, '', 'width=600,height=450');\n },\n setClick: function setClick(sharer) {\n $('ul.au_social_sharing .facebook a', sharer.container).on('click', function (e) {\n e.preventDefault();\n var shareUrl = $(this).data('url');\n AU.social.fb.openShareDialog(shareUrl);\n });\n }\n },\n twitter: {\n openShareDialog: function openShareDialog(title, url) {\n url = encodeURI(url);\n title = encodeURI(title);\n window.open('https://twitter.com/intent/tweet?text=' + title + '&url=' + url, '', 'width=550,height=450');\n },\n setClick: function setClick(sharer) {\n $('ul.au_social_sharing .twitter a', sharer.container).on('click', function (e) {\n e.preventDefault();\n var shareTitle = $(this).data('title');\n var shareUrl = $(this).data('url');\n AU.social.twitter.openShareDialog(shareTitle, shareUrl);\n });\n }\n },\n linkedin: {\n openShareDialog: function openShareDialog(url) {\n url = encodeURI(url);\n window.open('https://www.linkedin.com/shareArticle?mini=true&url=' + url, '', 'width=850,height=550');\n },\n setClick: function setClick(sharer) {\n $('ul.au_social_sharing .linkedin a', sharer.container).on('click', function (e) {\n e.preventDefault();\n var shareUrl = $(this).data('url');\n AU.social.linkedin.openShareDialog(shareUrl);\n });\n }\n },\n mail: {\n setClick: function setClick(sharer) {\n $('ul.au_social_sharing .email > a', sharer.container).on('click', function (e) {\n e.preventDefault();\n $('> ul', $(this).parent()).toggle();\n $(this).toggleClass('active');\n });\n }\n }\n};\n\nAU.social.instashow = {\n loaded: false,\n load: function load(callback) {\n if (typeof callback === 'function') {\n if (callback()) {\n $.getScript('https://apps.elfsight.com/p/platform.js');\n AU.social.instashow.loaded = true;\n }\n }\n }\n};\n\nAU.social.yottie = {\n loaded: false,\n load: function load(callback) {\n if (typeof callback === 'function') {\n if (callback()) {\n $.getScript('https://cdn.au.dk/vendor/js/jquery.yottie.bundled.js');\n AU.social.yottie.loaded = true;\n }\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: DATABOX\r\n * Beskrivelse: dynamiske søgebokse, som er strøet ud med lind hånd over hele websitet\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\n\n$.ajaxSetup({\n cache: true\n});\n\nAU.databox = {\n boxes: [],\n scriptLoaded: false,\n loadExternal: function loadExternal() {\n var db = new AUDatabox(AU.databox.boxes);\n db.init();\n },\n init: function init() {\n if (this.boxes.length > 0) {\n if (!this.scriptLoaded) {\n var componentsUrl = AU.cdn + '/components/umd/databox.js?v=' + AU.version;\n jQuery.getScript(componentsUrl, function () {\n AU.databox.loadExternal();\n AU.databox.scriptLoaded = true;\n });\n } else {\n this.loadExternal();\n }\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: FLOWBOX\r\n * Beskrivelse: bruges primært til visning af kontaktpersoner på medarbejdersider, samt til åbningstider for it-supporten\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\n\nAU.flowbox = {\n boxes: [],\n scriptLoaded: false,\n loadExternal: function loadExternal() {\n var fb = new AUFlowbox(AU.pageLang, AU.flowbox.boxes);\n fb.init();\n },\n init: function init() {\n if (this.boxes.length > 0) {\n if (!this.scriptLoaded) {\n var componentsUrl = AU.cdn + '/components/umd/flowbox.js?v=' + AU.version;\n jQuery.getScript(componentsUrl, function () {\n AU.flowbox.loadExternal();\n AU.flowbox.scriptLoaded = true;\n });\n } else {\n this.loadExternal();\n }\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: ALPHABOX\r\n * Beskrivelse: benyttes fx til medarbejderserviceboks\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\n\n$.ajaxSetup({\n cache: true\n});\n\nAU.alphabox = {\n boxes: [],\n scriptLoaded: false,\n loadExternal: function loadExternal() {\n var ab = new AUAlphabox(AU.alphabox.boxes);\n ab.init();\n },\n init: function init() {\n if (this.boxes.length > 0) {\n if (!this.scriptLoaded) {\n var componentsUrl = AU.cdn + '/components/umd/alphabox.js?v=' + AU.version;\n jQuery.getScript(componentsUrl, function () {\n AU.alphabox.loadExternal();\n AU.alphabox.scriptLoaded = true;\n });\n } else {\n this.loadExternal();\n }\n }\n }\n};\n'use strict';\n\n/**\r\n * Titel: FALLBACK\r\n * Beskrivelse: består af den ældgamle 'pingAnalytics' til GA-tracking og nogle ukendte/LF-udviklede funktioner, der kan ske at være i brug rundt omkring...\r\n * Status: Do. Not. Touch.\r\n */\n\nfunction pressed(url) {\n location.href = url;\n}\n\nfunction pres(url) {\n location.href = url;\n}\n\nfunction replaceall(s, x, y) {\n if (x.length > 0) {\n var found = s.indexOf(x);\n while (found >= 0) {\n s = s.substring(0, found) + y + s.substring(found + x.length, s.length);\n found = s.indexOf(x, found + y.length);\n }\n }\n return s;\n}\n\nfunction multipressed(xx, urlPattern, StartValue) {\n var url = urlPattern;\n var allow = StartValue;\n var OK = true;\n for (var i = 0; i < xx.elements.length; i++) {\n if (xx.elements[i].type === 'select-one') {\n if (OK) {\n OK = xx.elements[i].selectedIndex >= allow;\n }\n url = replaceall(url, '$' + (i + 1), xx.elements[i].options[xx.elements[i].selectedIndex].value);\n url = replaceall(url, '¤' + (i + 1), xx.elements[i].options[xx.elements[i].selectedIndex].value);\n }\n }\n url = url.toLowerCase();\n if (OK) {\n location.href = url;\n } else {\n window.alert('Vælg en værdi i alle felter!');\n }\n}\n\n// En kommentar\n'use strict';\n\n/**\r\n * Titel: RESPONSIVE\r\n * Beskrivelse: indeholder efterhånden primært logik til omsættelse af tabeller til responsiv opførsel (lister), herunder studiediagrammerne. Derudover er der en lille smule logik til det nye design\r\n * Status: er kun i nogen grad omskrevet fra 2011/2015-udgaven\r\n */\n\nAU.responsive = {\n state: null,\n stateHistory: [],\n modes: {\n PHONE: {\n ID: 0,\n NAME: 'PHONE',\n MAX: 640\n },\n TABLET: {\n ID: 1,\n NAME: 'TABLET',\n MAX: 1024\n },\n DESKTOP: {\n ID: 2,\n NAME: 'DESKTOP'\n }\n },\n detectDevice: function detectDevice() {\n\n var state = null;\n var modes = AU.responsive.modes;\n if (Foundation.MediaQuery.current === 'small') {\n state = modes.PHONE;\n } else if (Foundation.MediaQuery.current === 'medium') {\n state = modes.TABLET;\n } else {\n state = modes.DESKTOP;\n }\n\n if (state !== AU.responsive.state) {\n AU.responsive.state = state;\n AU.responsive.stateHistory.push(state.NAME);\n console.log(state.NAME);\n AU.responsive.setMarkup();\n }\n },\n markupRenderFunctions: [],\n runMarkupFunctions: function runMarkupFunctions() {\n for (var i = 0; i < this.markupRenderFunctions.length; i++) {\n if (typeof this.markupRenderFunctions[i] === 'function') {\n this.markupRenderFunctions[i]();\n }\n }\n },\n setMarkup: function setMarkup() {\n var state = AU.responsive.state;\n\n var utilityLinks = jQuery('.utility-links');\n var headerMenu = jQuery('.header-menu');\n var sectionHeader = jQuery('.section-header .logo');\n\n var pageNav = jQuery('#au_section_nav_inner_list');\n var titleBar = jQuery('.title-bar');\n var menuTitle = jQuery('.menu-title');\n var leftMenu = jQuery('.left-menu');\n var tablesScroll = jQuery('table.au_responsive_table_scroll');\n\n if (state.NAME === 'PHONE') {\n\n headerMenu.append(utilityLinks);\n if (jQuery('body').hasClass('universe')) {\n headerMenu.after(pageNav);\n pageNav.wrap('
    ');\n } else {\n utilityLinks.before(pageNav);\n }\n titleBar.before(menuTitle);\n pageNav.addClass('responsive-pagenav');\n\n tablesScroll.each(function () {\n var table = jQuery(this);\n table.wrap('
    ');\n });\n } else {\n\n var wasPhone = function wasPhone() {\n var states = AU.responsive.stateHistory.length;\n return states > 1 ? AU.responsive.stateHistory[states - 2] === 'PHONE' : false;\n };\n\n if (wasPhone()) {\n sectionHeader.append(utilityLinks);\n leftMenu.append(pageNav);\n pageNav.before(menuTitle);\n }\n\n tablesScroll.each(function () {\n var table = jQuery(this);\n if (table.parent().is('div.responsive-table-container')) {\n table.unwrap();\n }\n });\n }\n\n this.runMarkupFunctions();\n }\n};\n\nAU.edutables = {\n tables: [],\n scriptLoaded: false,\n loadExternal: function loadExternal() {\n var dg = new AUDiagramme(AU.pageLang, AU.edutables.tables);\n dg.init();\n },\n init: function init() {\n if (this.tables.length > 0) {\n if (!this.scriptLoaded) {\n var componentsUrl = AU.cdn + '/components/umd/diagramme.js';\n jQuery.getScript(componentsUrl, function () {\n AU.edutables.loadExternal();\n AU.edutables.scriptLoaded = true;\n });\n } else {\n this.loadExternal();\n }\n }\n }\n};\n\nAU.addReadyFunction(function () {\n AU.responsive.detectDevice();\n AU.edutables.init();\n});\n\nAU.addResizeFunction(function () {\n AU.responsive.detectDevice();\n});\n'use strict';\n\n/**\r\n * Titel: NEWS\r\n * Beskrivelse: de 'nye nyheder', som indlæses asynkront og åbnes (nogle gange) i overlay\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\n\nvar disqus_no_style = true;\nvar disqus_shortname = 'aukom';\nvar disqus_url = '';\nvar disqus_loaded = false;\n\n$.ajaxSetup({\n cache: true\n});\n\nAU.news = {\n feeds: [],\n scriptLoaded: false,\n loadExternal: function loadExternal() {\n this.setPopup();\n var news = new AUNews(AU.pageLang, AU.news.feeds);\n news.init();\n new AUNewsCollage(AU.pageLang, document.querySelector('#featured-content'));\n },\n setPopup: function setPopup() {\n var body = document.querySelector('body');\n var popup = document.createElement('div');\n popup.setAttribute('id', 'au_news_popup');\n body.appendChild(popup);\n },\n init: function init() {\n var fc = document.querySelector('#featured-content');\n if ((this.feeds && this.feeds.length) > 0 || fc) {\n if (!this.scriptLoaded) {\n var componentsUrl = (typeof window.componentsUri !== 'undefined' ? window.componentsUri : AU.cdn) + '/components/umd/news.js?v=' + AU.version;\n jQuery.getScript(componentsUrl, function () {\n AU.news.loadExternal();\n AU.news.scriptLoaded = true;\n });\n } else {\n this.loadExternal();\n }\n }\n }\n};\n\nString.prototype.hashCode = function () {\n var hash = 0,\n i,\n ch,\n l;\n if (this.length === 0) {\n return '_' + Math.abs(hash);\n }\n for (i = 0, l = this.length; i < l; i++) {\n ch = this.charCodeAt(i);\n hash = (hash << 5) - hash + ch;\n hash |= 0; // Convert to 32bit integer\n }\n return '_' + Math.abs(hash);\n};\n\n//http://stackoverflow.com/questions/9235304/how-to-replace-the-location-hash-and-only-keep-the-last-history-entry\n(function (namespace) {\n if ('replaceState' in history) {\n namespace.replaceHash = function (newhash) {\n if (('' + newhash).charAt(0) !== '#') {\n newhash = '#' + newhash;\n }\n history.replaceState('', '', newhash);\n };\n } else {\n var hash = location.hash;\n namespace.replaceHash = function (newhash) {\n if (location.hash !== hash) {\n history.back();\n }\n location.hash = newhash;\n };\n }\n})(window);\n'use strict';\n\n/**\r\n * Titel: MAPS\r\n * Beskrivelse: Google Maps-baseret kortløsning.\r\n * Status: er noget af det ældste kode, vi har kørende. Virker som sådan fint nok, men ved et større kortprojekt ville det være oplagt at få omskrevet\r\n */\n\nvar GOOGLE_MAPS_API_KEY = \"AIzaSyBP04DSgKVcqkYGO_Xb4GgqXHMzRO_2jzo\";\n\nAU.maps = {\n loadGoogleMapsScript: function loadGoogleMapsScript() {\n // Check if the global variable for loading Google Maps is defined, if not default to false\n var shouldLoadGoogleMapsScript = typeof window.loadGoogleMapsScript !== 'undefined' ? window.loadGoogleMapsScript : false;\n var shouldLoadGoogleMapsScriptAsync = typeof window.loadGoogleMapsScriptAsync !== 'undefined' ? window.loadGoogleMapsScriptAsync : true; // Default to true for async\n\n // Early return if we should not load the Google Maps script\n if (shouldLoadGoogleMapsScript) {\n console.log(\"Google Maps script will be loaded manually on this page\");\n } else {\n return;\n }\n\n // Construct the base URL with the API key\n var scriptUrl = 'https://maps.googleapis.com/maps/api/js?key=' + GOOGLE_MAPS_API_KEY;\n\n // Conditionally add the async loading parameter to the URL\n if (shouldLoadGoogleMapsScriptAsync) {\n scriptUrl += '&loading=async';\n }\n\n scriptUrl += '&callback=AU.maps.googleMapsScriptCallback';\n\n // Create a script element and set the constructed URL\n var script = document.createElement('script');\n script.src = scriptUrl;\n\n // Handle the script load success\n script.onload = function () {\n console.log(\"Google Maps script has been loaded successfully. Now waiting for the callback to initialize.\");\n };\n\n // Handle script load failure and capture details\n script.onerror = function (event) {\n console.error(\"Error loading Google Maps script:\", event);\n console.error(\"Script URL:\", event.target.src); // URL of the failed script\n };\n\n // Append the script to the document's head to initiate the load\n document.head.appendChild(script);\n },\n // If the Google maps script is loaded, we use this callback to dispatch an googleMapsScriptLoadedEvent event\n googleMapsScriptLoaded: false,\n googleMapsScriptCallback: function googleMapsScriptCallback() {\n AU.maps.googleMapsScriptLoaded = true;\n console.log(\"Google Maps script callback has been executed. Google Maps is ready for use.\");\n\n // Dispatch a custom event to notify that Google Maps is ready\n var event = new CustomEvent('googleMapsScriptLoadedEvent');\n window.dispatchEvent(event);\n },\n create: function create(container, width, height, zoomLevel, center, scrollWheel, draggable, clickable, streetView, pco, zco, svco) {\n\n var mapOptions = {\n zoom: zoomLevel,\n center: center,\n scrollwheel: AU.helpers.isMobileDevice() || AU.responsive.state.NAME == 'PHONE' ? false : scrollWheel,\n draggable: draggable,\n clickable: clickable,\n streetViewControl: streetView,\n mapTypeControlOptions: {\n mapTypeIds: ['default', google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID],\n style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\n position: google.maps.ControlPosition.RIGHT_TOP\n },\n mapTypeId: google.maps.MapTypeId.ROADMAP,\n panControlOptions: !pco ? {} : pco,\n zoomControlOptions: !zco ? {} : zco,\n streetViewControlOptions: !svco ? {} : svco\n };\n\n // Opretter kort\n var map = new google.maps.Map(container, mapOptions);\n\n // Kortets størrelse sættes\n container.style.width = !isNaN(width) ? width + 'px' : width;\n container.style.height = !isNaN(height) ? height + 'px' : height;\n\n return map;\n },\n setBounds: function setBounds(map, markers) {\n var bounds = new google.maps.LatLngBounds();\n for (var i = 0; i < markers.length; i++) {\n for (var j = 0; j < markers[i].length; j++) {\n bounds.extend(markers[i][j].position);\n }\n }\n map.fitBounds(bounds);\n },\n marker: {\n add: function add(map, point, markerIcon, markerDraggable, markerClickable, markerPanTo, markerClickZoom, markerClickZoomLevel, infoWindow, windowContent, title, id) {\n var marker = new google.maps.Marker({\n position: point,\n map: map,\n icon: markerIcon,\n draggable: markerDraggable,\n title: title\n });\n\n if (typeof id !== 'undefined') {\n marker.set('id', id);\n }\n\n // Listeners tilføjes markør\n google.maps.event.addListener(marker, 'click', function () {\n if (windowContent !== '

    ') {\n // Infowindow åbner ved klik\n infoWindow.open(map, this);\n infoWindow.setContent(windowContent);\n }\n\n if (markerClickable) {\n if (markerPanTo) {\n map.panTo(this.getPosition());\n }\n\n if (!markerClickZoom || map.getZoom() > markerClickZoomLevel) {\n map.setZoom(map.getZoom());\n } else {\n map.setZoom(markerClickZoomLevel);\n }\n }\n });\n\n // At flytte en markør betragtes som et klik på kortet (det giver tilsyneladende ingen problemer, skulle der ikke være defineret click-event på kortet)\n if (markerDraggable) {\n google.maps.event.addListener(marker, 'dragend', function (point) {\n google.maps.event.trigger(map, 'click', point);\n });\n }\n\n return marker;\n }\n },\n route: {\n destinationFrom: false,\n destinationTo: false,\n directionsDisplay: null,\n directionsService: null,\n calc: function calc(map, from, to, travelMode, directionsService, directionsDisplay, waypointLocations) {\n if (from !== '') {\n var waypoints = [];\n if (typeof waypointLocations !== 'undefined') {\n for (var i = 0; i < waypointLocations.length; i++) {\n waypoints.push({\n location: waypointLocations[i],\n stopover: false\n });\n }\n }\n\n var request = {\n origin: from,\n destination: to,\n travelMode: travelMode,\n waypoints: waypoints\n };\n\n directionsService.route(request, function (response, status) {\n if (status === google.maps.DirectionsStatus.OK) {\n if (directionsDisplay.getMap() === null) {\n directionsDisplay.setMap(map);\n }\n directionsDisplay.setDirections(response);\n } else {\n window.alert(status);\n }\n });\n }\n },\n createDirectionObjects: function createDirectionObjects(map, container) {\n var rendererOptions = {\n draggable: true\n };\n\n var directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);\n var panel = container;\n\n directionsDisplay.setMap(map);\n directionsDisplay.setPanel(panel);\n\n return directionsDisplay;\n }\n },\n geocodePersonAddress: function geocodePersonAddress(map, options, icon, address, centerMap, infoWindow, windowContent, func) {\n AU.maps.geocoder.geocode({\n 'address': address\n }, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n var point = new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());\n var marker = AU.maps.marker.add(map, point, icon, options.markerDrag, options.markerClick, options.clickPanTo, options.clickZoom, options.clickZoomLevel, infoWindow, windowContent, '');\n\n if (typeof func === 'function') {\n func(marker, point, centerMap, infoWindow, windowContent);\n }\n }\n });\n },\n helpers: {\n getDistanceBetweenPoints: function getDistanceBetweenPoints(point1, point2) {\n return google.maps.geometry.spherical.computeDistanceBetween(point1, point2);\n },\n convertFromLatLng: function convertFromLatLng(coord) {\n return Math.round(coord * 1000000);\n },\n convertToLatLng: function convertToLatLng(coord) {\n var c;\n if (coord.length === 7) {\n c = coord.substring(0, 1) + '.' + coord.substring(1);\n }\n if (coord.length === 8) {\n c = coord.substring(0, 2) + '.' + coord.substring(2);\n }\n if (coord.length === 9) {\n c = coord.substring(0, 3) + '.' + coord.substring(3);\n }\n return c;\n },\n getCurrentDate: function getCurrentDate() {\n var d = new Date();\n var date = d.getDate();\n var month = d.getMonth() + 1;\n var currentDate = (date < 10 ? '0' + date : date) + '.' + (month < 10 ? '0' + month : month) + '.' + ('' + d.getFullYear()).substring(2);\n return currentDate;\n },\n getCurrentTime: function getCurrentTime() {\n var d = new Date();\n var hours = d.getHours();\n var minutes = d.getMinutes();\n var currentTime = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes);\n return currentTime;\n },\n sortSelect: function sortSelect(element) {\n $(element).each(function () {\n var selectedValue = $(this).val();\n $(this).html($('option', $(this)).sort(function (a, b) {\n return a.text === b.text ? 0 : a.text < b.text ? -1 : 1;\n }));\n $(this).val(selectedValue);\n });\n },\n sortAlphaObj: function sortAlphaObj(a, b) {\n if (typeof a.name !== 'undefined' && typeof b.name !== 'undefined') {\n return a.name > b.name ? 1 : -1;\n }\n return 0;\n }\n },\n infoWindow: null,\n geocoder: null\n};\n\n// Slut på det generelle (\"biblioteket\") – nedenstående omhandler de små kort, som (primært) sidder på institutsiderne\n\nvar maps = [];\n\nAU.maps.single = {\n options: {\n image: '',\n markerDrag: !window._markerDrag ? false : window._markerDrag,\n markerClick: !window._markerClick ? true : window._markerClick,\n clickPanTo: !window._clickPanTo ? false : window._clickPanTo,\n clickZoom: !window._clickZoom ? false : window._clickZoom,\n clickZoomLevel: window._clickZoomLevel || 12,\n defaultZoomLevel: window._defaultZoomLevel || 16,\n scrollWheel: !window._scrollWheel ? false : window._scrollWheel,\n draggable: !window._draggable ? true : window._draggable,\n clickable: !window._clickable ? true : window._clickable,\n streetView: !window._streetView ? false : window._streetView,\n centerLat: window._centerLat || 56.20,\n centerLng: window._centerLng || 10.50,\n mapWidth: '99.5%',\n mapHeight: 275\n },\n center: null,\n maps: window.maps,\n mapDivs: [],\n firstMapLoaded: false,\n findFirstMap: function findFirstMap() {\n var i = 1;\n var firstMap;\n do {\n firstMap = document.getElementById('au_map' + (i === 1 ? '' : i));\n i++;\n } while (!firstMap && i <= 2);\n\n return firstMap;\n },\n loadMaps: function loadMaps() {\n // Enten populeres kortet med manuelle punkter (fra sourcen) eller også henter vi fra datakilde (iPure / XML)\n if (AU.maps.single.maps.length > 0) {\n AU.maps.single.init();\n } else {\n if (typeof window.path !== 'undefined') {\n\n var dataFunc = function dataFunc(data) {\n var locations = data.locations;\n var combinedPoints = [];\n var name;\n for (var l = 0; l < locations.length; l++) {\n name = locations[l].names[0].name;\n var lat = locations[l].latitude;\n var lng = locations[l].longitude;\n var url = locations[l].url;\n var text = locations[l].text;\n\n var points = [];\n var point = {\n latitude: lat,\n longitude: lng,\n title: name,\n text: text\n };\n points.push(point);\n combinedPoints.push(point);\n\n if ($('#au_map').length > 0) {\n AU.maps.single.maps.push({\n name: name,\n name_en: name,\n container: '#au_map',\n mapWidth: AU.maps.single.options.mapWidth,\n mapHeight: AU.maps.single.options.mapHeight,\n href: url,\n points: points,\n switchmode: 'dropdown',\n load: false\n });\n }\n }\n\n if ($('#au_map2').length > 0) {\n AU.maps.single.maps.push({\n name: name,\n name_en: name,\n container: '#au_map2',\n mapWidth: AU.maps.single.options.mapWidth,\n mapHeight: AU.maps.single.options.mapHeight,\n href: '',\n points: combinedPoints,\n load: true\n });\n }\n\n AU.maps.single.init();\n };\n\n $.getJSON(window.path, function (data) {\n dataFunc(data);\n });\n }\n }\n\n AU.maps.single.firstMapLoaded = true;\n },\n init: function init() {\n\n AU.maps.route.directionsService = new google.maps.DirectionsService();\n AU.maps.infoWindow = new google.maps.InfoWindow();\n AU.maps.geocoder = new google.maps.Geocoder();\n\n var divUsed = false;\n for (var i = 0; i < AU.maps.single.maps.length; i++) {\n\n var currentMap = AU.maps.single.maps[i];\n\n currentMap.map = null;\n currentMap.markers = [];\n\n // Finder ud af, om vi allerede har brugt den angivne div\n for (var k = 0; k < AU.maps.single.mapDivs.length; k++) {\n if (AU.maps.single.mapDivs[k] === currentMap.container) {\n divUsed = true;\n break;\n } else {\n divUsed = false;\n }\n }\n\n // Hvis vi ikke har brugt div'en, opretter vi kortet\n if (!divUsed) {\n var mapContainer = $(currentMap.container).get(0);\n var options = AU.maps.single.options;\n\n currentMap.map = AU.maps.create(mapContainer, currentMap.mapWidth, currentMap.mapHeight, options.defaultZoomLevel, AU.maps.single.center, options.scrollWheel, options.draggable, options.clickable, options.streetView);\n AU.maps.single.mapDivs.push(AU.maps.single.maps[i].container);\n\n if (currentMap.load) {\n this.setMapContent(currentMap, false);\n }\n\n $(currentMap.container).after($('
    ', {\n 'class': 'au_maps_switchlink'\n }));\n\n if (typeof currentMap.switchmode !== 'undefined' && currentMap.switchmode === 'dropdown') {\n $(currentMap.container + ' + div').append($('');\n jQuery(form).append('');\n }\n });\n\n // Alle funktioner, som er pushet til ready-objektet, løbes igennem\n for (var i = 0; i < AU.ready.length; i++) {\n if (typeof AU.ready[i] === 'function') {\n try {\n // Attempt to execute the function\n AU.ready[i]();\n } catch (e) {\n // Catch any error and log it, but don't stop execution\n console.error(\"Error in AU.ready function loop (au-init.js) at index: \" + i, e);\n }\n }\n }\n\n /*\r\n if (typeof findWidgetInit === 'function') {\r\n var dropdownWidgetLoaded = false;\r\n jQuery(document).on('show.zf.dropdown', function () {\r\n if (!dropdownWidgetLoaded) {\r\n findWidgetInit('header .find-container');\r\n dropdownWidgetLoaded = true;\r\n }\r\n });\r\n }\r\n */\n\n var findBtn = document.querySelector('header .find-button');\n if (findBtn) {\n findBtn.setAttribute('href', AU.pageLang === 'da' ? 'https://www.au.dk/kort/' : 'https://www.au.dk/en/map/');\n }\n\n if ((typeof AU.basic === 'undefined' || !AU.basic) && (typeof window.defaultTracking === 'undefined' || window.defaultTracking)) {\n // Siteimprove\n (function () {\n var sz = document.createElement('script');\n sz.type = 'text/plain';\n sz.async = true;\n sz.setAttribute('data-cookiescript', 'accepted');\n sz.setAttribute('data-cookiecategory', 'performance');\n sz.src = '//siteimproveanalytics.com/js/siteanalyze_4573657.js';\n var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(sz, s);\n })();\n }\n });\n\n jQuery(window).on('load', function () {\n AU.design.setBannerElementsLoad();\n\n for (var i = 0; i < AU.load.length; i++) {\n if (typeof AU.load[i] === 'function') {\n AU.load[i]();\n }\n }\n });\n\n jQuery(window).on('resize', function () {\n for (var i = 0; i < AU.resize.length; i++) {\n if (typeof AU.resize[i] === 'function') {\n AU.resize[i]();\n }\n }\n });\n\n jQuery(window).on('scroll', function () {\n for (var i = 0; i < AU.scroll.length; i++) {\n if (typeof AU.scroll[i] === 'function') {\n AU.scroll[i]();\n }\n }\n });\n})();","/**\r\n * Titel: FALLBACK\r\n * Beskrivelse: består af den ældgamle 'pingAnalytics' til GA-tracking og nogle ukendte/LF-udviklede funktioner, der kan ske at være i brug rundt omkring...\r\n * Status: Do. Not. Touch.\r\n */\r\n\r\nfunction pressed(url) {\r\n location.href = url;\r\n}\r\n\r\nfunction pres(url) {\r\n location.href = url;\r\n}\r\n\r\nfunction replaceall(s, x, y) {\r\n if (x.length > 0) {\r\n var found = s.indexOf(x);\r\n while (found >= 0) {\r\n s = s.substring(0, found) + y + s.substring(found + x.length, s.length);\r\n found = s.indexOf(x, found + y.length);\r\n }\r\n }\r\n return s;\r\n}\r\n\r\nfunction multipressed(xx, urlPattern, StartValue) {\r\n var url = urlPattern;\r\n var allow = StartValue;\r\n var OK = true;\r\n for (var i = 0; i < xx.elements.length; i++) {\r\n if (xx.elements[i].type === 'select-one') {\r\n if (OK) {\r\n OK = (xx.elements[i].selectedIndex >= allow);\r\n }\r\n url = replaceall(url, '$' + (i + 1), xx.elements[i].options[xx.elements[i].selectedIndex].value);\r\n url = replaceall(url, '¤' + (i + 1), xx.elements[i].options[xx.elements[i].selectedIndex].value);\r\n }\r\n }\r\n url = url.toLowerCase();\r\n if (OK) {\r\n location.href = url;\r\n } else {\r\n window.alert('Vælg en værdi i alle felter!');\r\n }\r\n}\r\n\r\n// En kommentar","/**\r\n * @author TRH\r\n */\r\n\r\n/*** GLOBALT AU OBJEKT ***/\r\n\r\nvar AU = {\r\n pageLang: 'da', // Default sprog\r\n cdn: 'https://cdn.au.dk',\r\n version: '202204211100',\r\n bss: false,\r\n ready: [],\r\n addReadyFunction: function(fn) {\r\n if (typeof fn === 'function') {\r\n // Check if the function reference already exists in the ready array\r\n if (AU.ready.indexOf(fn) === -1) {\r\n AU.ready.push(fn);\r\n } else {\r\n console.log(\"Function already exists in AU.ready and will not be added again.\");\r\n }\r\n } else {\r\n console.error(\"Attempted to add a non-function to AU.ready.\");\r\n }\r\n },\r\n load: [],\r\n addLoadFunction: function(fn) {\r\n if (typeof fn === 'function') {\r\n // Check if the function reference already exists in the load array\r\n if (AU.load.indexOf(fn) === -1) {\r\n AU.load.push(fn);\r\n } else {\r\n console.log(\"Function already exists in AU.load and will not be added again.\");\r\n }\r\n } else {\r\n console.error(\"Attempted to add a non-function to AU.load.\");\r\n }\r\n },\r\n resize: [],\r\n addResizeFunction: function(fn) {\r\n if (typeof fn === 'function') {\r\n // Check if the function reference already exists in the resize array\r\n if (AU.resize.indexOf(fn) === -1) {\r\n AU.resize.push(fn);\r\n } else {\r\n console.log(\"Function already exists in AU.resize and will not be added again.\");\r\n }\r\n } else {\r\n console.error(\"Attempted to add a non-function to AU.resize.\");\r\n }\r\n },\r\n scroll: [],\r\n addScrollFunction: function(fn) {\r\n if (typeof fn === 'function') {\r\n // Check if the function reference already exists in the scroll array\r\n if (AU.scroll.indexOf(fn) === -1) {\r\n AU.scroll.push(fn);\r\n } else {\r\n console.log(\"Function already exists in AU.scroll and will not be added again.\");\r\n }\r\n } else {\r\n console.error(\"Attempted to add a non-function to AU.scroll.\");\r\n }\r\n },\r\n navigation: {}\r\n};","/**\r\n * Titel: HELPERS\r\n * Beskrivelse: hjælpemetoder som kan anvendes på tværs af alle scripts\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\r\n\r\nAU.helpers = {\r\n getUnicodeKey: function (e) {\r\n var unicode = e.keyCode ? e.keyCode : e.charCode;\r\n return unicode;\r\n },\r\n rewriteLink: function (text) {\r\n return text.trim().toLowerCase().replace(/ /g, '_').replace(/æ/g, 'ae').replace(/ø/g, 'oe').replace(/å/g, 'aa');\r\n },\r\n getQuerystring: function (key, default_) {\r\n if (!default_) {\r\n default_ = '';\r\n }\r\n\r\n key = key.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\r\n var regex = new RegExp(\"[\\\\?&]\" + key + \"=([^&#]*)\");\r\n\r\n var qs = regex.exec(window.location.href);\r\n\r\n if (qs === null) {\r\n return default_;\r\n } else {\r\n return qs[1];\r\n }\r\n },\r\n getInternetExplorerVersion: function () {\r\n var rv = -1;\r\n if (navigator.userAgent.indexOf('Trident') > -1) {\r\n var ua = navigator.userAgent;\r\n var re = new RegExp(\"rv:([0-9]{1,}[.0-9]{0,})\");\r\n if (re.exec(ua) !== null) {\r\n rv = parseFloat(RegExp.$1);\r\n }\r\n }\r\n return rv;\r\n },\r\n isMobileDevice: function () {\r\n return (/Mobile|iP(hone|od|ad)|Android|IEMobile/i).test(navigator.userAgent);\r\n },\r\n getXML: function (source, callback) {\r\n jQuery.ajax({\r\n type: 'GET',\r\n url: source,\r\n dataType: 'xml',\r\n success: function (data) {\r\n if (typeof callback === 'function') {\r\n callback(data);\r\n }\r\n }\r\n });\r\n },\r\n isElementInViewport: function (element) {\r\n if (element === null) {\r\n return false;\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n\r\n return (rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth));\r\n },\r\n isElementPartlyInViewport: function (element) {\r\n var top = element.offsetTop;\r\n var left = element.offsetLeft;\r\n var width = element.offsetWidth;\r\n var height = element.offsetHeight;\r\n\r\n while (element.offsetParent) {\r\n element = element.offsetParent;\r\n top += element.offsetTop;\r\n left += element.offsetLeft;\r\n }\r\n\r\n return (\r\n top < (window.pageYOffset + window.innerHeight) &&\r\n left < (window.pageXOffset + window.innerWidth) &&\r\n (top + height) > window.pageYOffset &&\r\n (left + width) > window.pageXOffset\r\n );\r\n },\r\n trimText: function (label, amount, end) {\r\n if (label.length > amount) {\r\n return label.substring(0, amount) + end;\r\n }\r\n\r\n return label;\r\n },\r\n validateEmail: function (email) {\r\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(email);\r\n },\r\n componentToHex: function (c) {\r\n var hex = c.toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n },\r\n rgbToHex: function (r, g, b) {\r\n return this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);\r\n },\r\n getPageContent: function (url, retrieveSelector, insertSelector, callback) {\r\n var urlAllowed = function (url) {\r\n var protocolAndHost = location.protocol + '//' + location.host;\r\n return url.indexOf(protocolAndHost) === 0;\r\n };\r\n\r\n var insertElement = jQuery(insertSelector);\r\n if (urlAllowed(url)) {\r\n insertElement.load(url + ' ' + retrieveSelector, function () {\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n });\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n accentMap: {\r\n 'é': 'e',\r\n 'ä': 'æ',\r\n 'ö': 'ø',\r\n 'á': 'a',\r\n 'ü': 'y'\r\n },\r\n normalizeAccents: function (term, accentMap) {\r\n if (!accentMap) {\r\n accentMap = this.accentMap;\r\n }\r\n\r\n var ret = '';\r\n for (var i = 0; i < term.length; i++) {\r\n ret += accentMap[term.charAt(i)] || term.charAt(i);\r\n }\r\n return ret;\r\n }\r\n};","/**\r\n * Titel: NAVIGATION\r\n * Beskrivelse: initialisering af menuer, fade (som stadig bruges til news), brødkrummer m.m.\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\r\n\r\nAU.navigation.menu = {\r\n setClick: function () {\r\n jQuery('button.menu-icon').on('click', function () {\r\n var headerMenu = jQuery(this).parents('.header-menu');\r\n if (headerMenu.hasClass('open')) {\r\n headerMenu.removeClass('open');\r\n if (!AU.bss) {\r\n jQuery('.search').removeClass('hide');\r\n }\r\n } else {\r\n headerMenu.addClass('open');\r\n if (!AU.bss) {\r\n jQuery('.search').addClass('hide');\r\n }\r\n }\r\n });\r\n },\r\n setUtility: function () {\r\n jQuery(document).on('show.zf.dropdown', 'header .dropdown-pane', function () {\r\n AU.databox.init();\r\n AU.alphabox.init();\r\n });\r\n },\r\n setBreadcrumb: function () {\r\n var bc = jQuery('#au_breadcrumb');\r\n var crumbs = jQuery('> a', bc);\r\n var crumbCutOff = 3;\r\n if (crumbs.length > crumbCutOff) {\r\n bc.addClass('collapse');\r\n crumbs.eq(0).after('
       
    ');\r\n jQuery('.bc-expand span').on('click', function () {\r\n bc.toggleClass('collapse');\r\n });\r\n }\r\n },\r\n addExtraMenuItem: function () { // Fix til den mobile menu, hvor der indsættes et ekstra top-level menupunkt\r\n var topLevelMenuItems = jQuery('.top-bar > div > ul.menu li.has-submenu');\r\n topLevelMenuItems.each(function () {\r\n var topLevelMenuItem = jQuery('> a', this);\r\n var topLevelSubMenu = jQuery('ul.submenu', this);\r\n topLevelSubMenu.prepend('
  • ' + topLevelMenuItem.text() + '
  • ');\r\n });\r\n },\r\n setTopBar: function () {\r\n var topBarLinks = jQuery('body:not(.department):not(.neutral) .top-bar .menu > li > a, body.department:not(.omnibus) .top-bar.custom .menu > li > a');\r\n var headerMenu = jQuery('.header-menu');\r\n topBarLinks.each(function () {\r\n var topBarContent = jQuery('.top-bar-content', jQuery(this).parent());\r\n jQuery(this).on('mouseover', function () {\r\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\r\n AU.navigation.topBarTimeout = setTimeout(function () {\r\n topBarContent.show().css('width', headerMenu.css('width'));\r\n }, 300);\r\n }\r\n }).on('mouseout', function () {\r\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\r\n topBarContent.hide();\r\n clearTimeout(AU.navigation.topBarTimeout);\r\n }\r\n }).on('click', function (e) {\r\n if (AU.helpers.isMobileDevice()) {\r\n e.preventDefault();\r\n jQuery('.top-bar-content').not(topBarContent).hide();\r\n topBarContent.toggle().css('width', headerMenu.css('width'));\r\n }\r\n });\r\n });\r\n\r\n jQuery('.top-bar-content').on('mouseover', function () {\r\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\r\n jQuery(this).show();\r\n }\r\n }).on('mouseout', function () {\r\n if (AU.responsive.state.NAME != 'PHONE' && !AU.helpers.isMobileDevice()) {\r\n jQuery(this).hide();\r\n }\r\n });\r\n\r\n if (typeof window.selectedUM !== 'undefined' && window.selectedUM !== 100) { // 100 = ingenting.\r\n jQuery('.top-bar .menu > li:eq(' + (window.selectedUM - 1) + ')').addClass('active');\r\n }\r\n }\r\n};\r\n\r\nAU.navigation.search = {\r\n setClick: function () {\r\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').on('focusout', function () {\r\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').val('');\r\n jQuery('.section-header').removeClass('opensearch');\r\n });\r\n\r\n jQuery('.au_searchbox').on('click', function () {\r\n jQuery('.section-header').addClass('opensearch');\r\n jQuery('#tx_googlequery_searchform_ss_q, #cludo-search-form-input').focus();\r\n });\r\n }\r\n};\r\n\r\nAU.navigation.frontpage = {\r\n setTargetGroups: function () {\r\n var buttons = jQuery('.target-groups .button');\r\n var groups = jQuery('.target-groups + div > div > .csc-default');\r\n var toggleGroup = function (i) {\r\n var group = groups.eq(i);\r\n group.toggleClass('active');\r\n groups.not(group).removeClass('active');\r\n }\r\n buttons.each(function (i, btn) {\r\n var button = jQuery(btn);\r\n button.on('click', function (e) {\r\n e.preventDefault();\r\n jQuery(this).toggleClass('active');\r\n buttons.not(button).removeClass('active');\r\n toggleGroup(i);\r\n });\r\n });\r\n }\r\n};\r\n","/**\r\n * Titel: COOKIES\r\n * Beskrivelse: Hjælpemetoder til get/set af cookies samt initialisering af cookievarsling\r\n * Status: er ikke blevet ændret siden 2011-designet. Cookieadvarslen kunne med fordel skrives om til ES6/React\r\n */\r\n\r\nAU.cookies = {\r\n set: function (c_name, value, exdays, path) {\r\n if (typeof path === 'undefined') {\r\n path = ';path=/;domain=au.dk';\r\n }\r\n\r\n var exdate = new Date();\r\n exdate.setDate(exdate.getDate() + exdays);\r\n var c_value = encodeURI(value) + ((exdays === null) ? '' : '; expires=' + exdate.toUTCString());\r\n document.cookie = c_name + '=' + c_value + path;\r\n },\r\n get: function (c_name) {\r\n var c_value = document.cookie;\r\n var c_start = c_value.indexOf(' ' + c_name + '=');\r\n if (c_start === -1) {\r\n c_start = c_value.indexOf(c_name + '=');\r\n }\r\n if (c_start === -1) {\r\n c_value = null;\r\n }\r\n else {\r\n c_start = c_value.indexOf('=', c_start) + 1;\r\n var c_end = c_value.indexOf(';', c_start);\r\n if (c_end === -1) {\r\n c_end = c_value.length;\r\n }\r\n c_value = decodeURI(c_value.substring(c_start, c_end));\r\n }\r\n return c_value;\r\n },\r\n alertElement: null,\r\n noAlertPeriod: 365,\r\n strings: {\r\n header: '',\r\n paragraph: '',\r\n button: ''\r\n },\r\n init: function () {\r\n if (window.alertCookies) {\r\n var replaceCookieTexts = function (text) {\r\n return text.replace('{0}', AU.cookies.strings.header).replace('{1}', AU.cookies.strings.paragraph).replace('{2}', AU.cookies.strings.button);\r\n };\r\n\r\n var alertElement = document.createElement('div');\r\n alertElement.setAttribute('id', 'au_cookiesalert');\r\n alertElement.innerHTML = replaceCookieTexts('

    {0}

    {1}

    ');\r\n var globalFooter = document.querySelector('footer.global');\r\n if (globalFooter) {\r\n globalFooter.insertAdjacentElement('afterend', alertElement);\r\n alertElement.style.display = 'none';\r\n this.alertElement = alertElement;\r\n }\r\n\r\n var allowCookies = this.get('allow_cookies');\r\n if (allowCookies === null) {\r\n this.alert();\r\n }\r\n }\r\n },\r\n initCookieScript: function () {\r\n if (typeof window.cookieScriptId !== 'undefined') {\r\n // Insert scripts and CSS for Pop Up\r\n var head = document.head;\r\n var cookieScriptManipulationCode = document.createElement('script');\r\n cookieScriptManipulationCode.setAttribute('src', '//cdn.au.dk/res/cookiescript/cookie-modal.min.js?a=' + (typeof window.cookieScriptVersion !== 'undefined' ? window.cookieScriptVersion : '1'));\r\n cookieScriptManipulationCode.setAttribute('charset', 'UTF-8');\r\n cookieScriptManipulationCode.setAttribute('type', 'text/javascript');\r\n head.insertBefore(cookieScriptManipulationCode, head.firstElementChild);\r\n }\r\n },\r\n alert: function () {\r\n if (this.alertElement !== null) {\r\n this.alertElement.style.display = 'block';\r\n\r\n document.querySelector('#au_cookiesalert_yes button').addEventListener('click', function (e) {\r\n e.preventDefault();\r\n AU.cookies.accept(AU.cookies.noAlertPeriod, true);\r\n });\r\n }\r\n },\r\n accept: function (duration, byGUI) {\r\n var path = location.host.indexOf('au.dk') > -1 ? undefined : ';path=/';\r\n this.set('allow_cookies', 'true', duration, path);\r\n if (byGUI) {\r\n this.alertElement.style.display = 'none';\r\n }\r\n }\r\n};","/**\r\n * Titel: IPURE\r\n * Beskrivelse: Globale funktioner til kald af iPure-personsøgning - bruges på kort og i nyt medarbejderdesign\r\n * Status: er kun i mindre grad blevet modificeret fra 2011/2015-udgaven\r\n */\r\n\r\nAU.ipure = {\r\n source: {\r\n searchCrossSite: '//ipure.nfit.au.dk/searchPeople.php?sort=lno&q=',\r\n searchDetailsCrossSite: '//ipure.nfit.au.dk/current/da_DK/lno/',\r\n photos: 'http://ipure.nfit.au.dk/current/'\r\n },\r\n getPerson: function(xml) {\r\n var name = $(xml).find('name');\r\n var room = name.attr('room');\r\n var lastname = name.attr('lastName');\r\n var firstname = name.attr('firstName');\r\n var details = $(xml).find('details');\r\n var detailsSource = details.attr('external');\r\n\r\n var person = {\r\n lastname: lastname,\r\n firstname: firstname,\r\n room: room,\r\n detailsSource: detailsSource\r\n };\r\n\r\n return person;\r\n },\r\n getPersonDetails: function(xml, func, multipleDepartments) {\r\n\r\n var nameNode = $(xml).find('name');\r\n var photoNode = $(xml).find('photo');\r\n var addressNode = $(xml).find('address');\r\n var webNode = $(xml).find('web');\r\n var phoneNode = $(xml).find('phone');\r\n var departmentNode = $(xml).find('department');\r\n\r\n var firstName = nameNode.attr('firstName');\r\n var lastName = nameNode.attr('lastName');\r\n var auid = nameNode.attr('employeeId');\r\n var photoSrc = photoNode.attr('external');\r\n var centerMap, street, zip, city, address;\r\n\r\n // Vi løber alle tilknyttede enheder igennem og finder ud af, om adresserne er forskellige\r\n var found_addresses = [];\r\n for (var j = 0; j < departmentNode.length; j++) {\r\n street = $(addressNode[j]).attr('street');\r\n zip = $(addressNode[j]).attr('zip');\r\n city = $(addressNode[j]).attr('city');\r\n address = street + \", \" + zip + \" \" + city;\r\n var found = false;\r\n for (var k = 0; k < found_addresses.length; k++) {\r\n if (found_addresses[k] === address) {\r\n found = true;\r\n }\r\n }\r\n if (j === 0 || !found) {\r\n found_addresses.push(address);\r\n }\r\n }\r\n\r\n var email;\r\n var officePhone;\r\n var buildingNumber;\r\n var personHTML = '
    ';\r\n // Vi løber alle enheder igennem\r\n for (var i = 0; i < departmentNode.length; i++) {\r\n street = $(addressNode[i]).attr('street');\r\n zip = $(addressNode[i]).attr('zip');\r\n city = $(addressNode[i]).attr('city');\r\n buildingNumber = $(addressNode[i]).attr('building');\r\n var room = $(addressNode[i]).attr('room');\r\n officePhone = $(phoneNode[i]).attr('office');\r\n var mobilePhone = $(phoneNode[i]).attr('mobile');\r\n email = $(webNode[i]).attr('email');\r\n\r\n personHTML += '

    ' + firstName + ' ' + lastName + '

    ';\r\n personHTML += '

    ';\r\n if (typeof photoSrc !== 'undefined') {\r\n personHTML += '\"\"';\r\n }\r\n\r\n if (found_addresses.length === 1) {\r\n for (var n = 0; n < departmentNode.length; n++) {\r\n personHTML += '' + $(departmentNode[n]).attr('name') + '
    ';\r\n }\r\n centerMap = true;\r\n } else {\r\n personHTML += '' + $(departmentNode[i]).attr('name') + '
    ';\r\n centerMap = false;\r\n }\r\n\r\n if (typeof buildingNumber !== 'undefined') {\r\n personHTML += (AU.pageLang === \"da\" ? \"Bygning \" : \"Building \") + buildingNumber;\r\n if (typeof room !== 'undefined') {\r\n personHTML += \", \" + (AU.pageLang === \"da\" ? \"Kontor \" : \"Office \") + room + \"
    \";\r\n } else {\r\n personHTML += \"\";\r\n }\r\n }\r\n\r\n personHTML += '' + street + ', ' + zip + ' ' + city + '

    ';\r\n\r\n if (typeof officePhone !== 'undefined') {\r\n if (AU.helpers.isMobileDevice()) {\r\n personHTML += 'T: ' + officePhone + '
    ';\r\n } else {\r\n personHTML += 'T: ' + officePhone + '
    ';\r\n }\r\n }\r\n\r\n if (typeof mobilePhone !== 'undefined') {\r\n if (AU.helpers.isMobileDevice()) {\r\n personHTML += 'M: ' + mobilePhone + '
    ';\r\n } else {\r\n personHTML += 'M: ' + mobilePhone + '
    ';\r\n }\r\n }\r\n\r\n if (typeof email !== 'undefined') {\r\n personHTML += 'E: ' + email + '
    ';\r\n }\r\n\r\n /*\r\n if (typeof auid !== 'undefined') {\r\n personHTML += 'ID: AU' + auid + '';\r\n }\r\n */\r\n\r\n personHTML += '

    ';\r\n\r\n if (i === 0 && !multipleDepartments) {\r\n break;\r\n }\r\n\r\n }\r\n\r\n personHTML += '
    ';\r\n\r\n if (typeof func === 'function') {\r\n func(personHTML, buildingNumber, email, officePhone, address, auid, centerMap);\r\n }\r\n\r\n },\r\n getPeople: function(xml) {\r\n var people = [];\r\n var peopleXML = $(xml).find('person');\r\n\r\n $.each(peopleXML, function(i, p) {\r\n var name = $(p).find('name');\r\n var room = name.attr('room');\r\n var lastname = name.attr('lastName');\r\n var firstname = name.attr('firstName');\r\n var details = $(p).find('details');\r\n var detailsSource = details.attr('external');\r\n\r\n var person = {\r\n id: i,\r\n lastname: lastname,\r\n firstname: firstname,\r\n room: room,\r\n detailsSource: detailsSource,\r\n label: firstname + ' ' + lastname,\r\n value: firstname + ' ' + lastname,\r\n url: detailsSource\r\n };\r\n\r\n people[i] = person;\r\n });\r\n\r\n return people;\r\n }\r\n};","/**\r\n * Titel: DESIGN\r\n * Beskrivelse: metoder som udbedrer en række \"shortcomings\" i designet eller tilføjer ekstra features til elementer\r\n * Status: er en blanding af nyt og gammelt. ES5-syntax hele vejen igennem\r\n */\r\n\r\nAU.design = {\r\n setFocusFieldIds: function () {\r\n jQuery('.au_focus').each(function (i) {\r\n if (!jQuery(this).attr('id')) {\r\n jQuery(this).attr('id', 'focusid_' + i);\r\n }\r\n });\r\n },\r\n setBuildingLinks: function (elementToSearchSelector) {\r\n var elementToSearch = jQuery(elementToSearchSelector);\r\n\r\n if (elementToSearch.length > 0) {\r\n var mapUrl = AU.pageLang === \"da\" ? '//www.au.dk/kort/' : '//www.au.dk/en/map/';\r\n var buildingPhrase = AU.pageLang === \"da\" ? 'bygning' : 'building';\r\n var re = new RegExp('(' + buildingPhrase + ' (\\\\d{4}))', 'ig');\r\n jQuery.each(elementToSearch, function () {\r\n jQuery(this).html(jQuery(this).html().replace(re, '$1'));\r\n });\r\n }\r\n },\r\n onCollapseOpen: [],\r\n onCollapseClose: [],\r\n setCollapse: function () {\r\n\r\n var openEvent = document.createEvent('Event');\r\n openEvent.initEvent('collapsible-open', true, true);\r\n\r\n var closeEvent = document.createEvent('Event');\r\n closeEvent.initEvent('collapsible-close', true, true);\r\n\r\n var collapsibles = jQuery('.csc-frame.au_collapsible');\r\n collapsibles.each(function () {\r\n var me = jQuery(this);\r\n var domElement = me.get(0);\r\n var header = jQuery('> .csc-header', me);\r\n\r\n header.unbind('click').on('click', function () {\r\n me.toggleClass('au_collapsed');\r\n if (me.hasClass('au_collapsed')) {\r\n domElement.dispatchEvent(closeEvent);\r\n } else {\r\n domElement.dispatchEvent(openEvent);\r\n }\r\n });\r\n\r\n var d = AU.design;\r\n domElement.addEventListener('collapsible-open', function (e) {\r\n for (var i = 0; i < d.onCollapseOpen.length; i++) {\r\n if (typeof d.onCollapseOpen[i] === 'function') {\r\n d.onCollapseOpen[i](e.target);\r\n }\r\n }\r\n }, false);\r\n\r\n\r\n domElement.addEventListener('collapsible-close', function (e) {\r\n for (var i = 0; i < d.onCollapseClose.length; i++) {\r\n if (typeof d.onCollapseClose[i] === 'function') {\r\n d.onCollapseClose[i](e.target);\r\n }\r\n }\r\n }, false);\r\n });\r\n\r\n this.openCollapsibleFromHash(location.hash);\r\n\r\n jQuery(window).on('hashchange', function () {\r\n AU.design.openCollapsibleFromHash(location.hash);\r\n });\r\n },\r\n openCollapsibleFromHash: function (hash) {\r\n if (hash.indexOf('c') === 1) {\r\n jQuery(hash + '.csc-frame.au_collapsible, ' + hash + ' > .csc-frame.au_collapsible, ' + hash + ' > .csc-frame.au_collapsible').removeClass('au_collapsed');\r\n jQuery(hash).parents('.au_collapsible').removeClass('au_collapsed');\r\n document.querySelector(hash).scrollIntoView();\r\n }\r\n },\r\n grayscale: function (src) {\r\n try {\r\n var supportsCanvas = !!document.createElement('canvas').getContext;\r\n if (supportsCanvas) {\r\n var canvas = document.createElement('canvas'),\r\n context = canvas.getContext('2d'),\r\n imageData, px, length, i = 0, gray,\r\n img = new Image();\r\n\r\n img.src = src;\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n context.drawImage(img, 0, 0);\r\n\r\n imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n px = imageData.data;\r\n length = px.length;\r\n\r\n for (; i < length; i += 4) {\r\n gray = px[i] * 0.3 + px[i + 1] * 0.59 + px[i + 2] * 0.11;\r\n px[i] = px[i + 1] = px[i + 2] = gray;\r\n }\r\n\r\n context.putImageData(imageData, 0, 0);\r\n return canvas.toDataURL();\r\n } else {\r\n return src;\r\n }\r\n } catch(err) {\r\n console.log(err);\r\n return src;\r\n }\r\n },\r\n setBannerElementsReady: function () {\r\n jQuery('.aubanner a').hover(\r\n function () {\r\n jQuery(this).find('.gotcolors').stop().animate({ opacity: 1 }, 200);\r\n },\r\n function () {\r\n jQuery(this).find('.gotcolors').stop().animate({ opacity: 0 }, 500);\r\n }\r\n );\r\n },\r\n setBannerElementsLoad: function () {\r\n jQuery('.aubanner:not(.aubanner-2) img').each(function () { // Fordi det er fuldstændig utænkeligt, at vi kan få fjernet Prototype fra pure.au.dk...\r\n var bc = jQuery('.aubanner-content', jQuery(this).parents('.aubanner'));\r\n bc.css('background-image', \"url('\" + AU.design.grayscale(this.src) + \"')\");\r\n }).animate({ opacity: 1 }, 500);\r\n },\r\n setHero: function () {\r\n var hero = jQuery('.hero');\r\n if (hero.length > 0) {\r\n jQuery(window).scroll(function () {\r\n var x = jQuery(this).scrollTop() + (jQuery('body').hasClass('layout13') ? 0 : -200);\r\n hero.css('background-position-y', parseInt(x / 10) + 'px');\r\n });\r\n }\r\n },\r\n setMagnificPopup: function () {\r\n var lightbox = jQuery('.csc-textpic a[rel*=\"lightbox\"], .image a[rel*=\"lightbox\"]');\r\n\r\n // http://stackoverflow.com/questions/6900958/using-jquery-to-perform-a-function-on-elements-with-unique-rel-attribute\r\n var rels = {};\r\n lightbox.each(function () {\r\n var r = jQuery(this).attr('rel');\r\n rels[r] = 1;\r\n });\r\n\r\n rels = Object.keys(rels);\r\n jQuery.each(rels, function (index, value) {\r\n jQuery('a[rel=\"' + value + '\"]').magnificPopup({\r\n type: 'image',\r\n gallery: {\r\n enabled: true\r\n },\r\n modal: false\r\n });\r\n });\r\n\r\n var newsImgs = jQuery('.au_news-single-sub-images a, .au_news-single-img a, .news-set1-img1all a');\r\n newsImgs.magnificPopup({\r\n type: 'image',\r\n gallery: {\r\n enabled: true\r\n },\r\n modal: false\r\n });\r\n },\r\n setTopWarning: function () {\r\n if (window.topWarning) {\r\n jQuery('body').prepend(jQuery('
    ', {\r\n 'class': 'ie-warning',\r\n 'html': AU.pageLang == 'da' ? window.topWarningTextDa : window.topWarningTextEn\r\n }));\r\n }\r\n }\r\n};","/**\r\n * Titel: SOCIAL\r\n * Beskrivelse: #SoME-deling\r\n * Status: er kun i nogen grad omskrevet fra 2011/2015-udgaven. Kunne med fordel ændres til ES6/React (hvis behovet er der?)\r\n */\r\n\r\nAU.social = {\r\n options: {\r\n config: {\r\n mode: 'sharing',\r\n container: '.au_social_sharebox',\r\n tracking: '/virtual/social/sharing/',\r\n links: [\r\n {\r\n classname: 'facebook',\r\n text: 'AU på Facebook',\r\n url: 'https://www.facebook.com/UniAarhus'\r\n },\r\n {\r\n classname: 'twitter',\r\n text: 'AU på Twitter',\r\n url: 'https://twitter.com/AarhusUni'\r\n },\r\n {\r\n classname: 'linkedin',\r\n text: 'AU på LinkedIn',\r\n url: 'http://www.linkedin.com/company/aarhus-university-denmark-?trk=hb_tab_compy_id_4648'\r\n\r\n },\r\n {\r\n classname: 'youtube',\r\n text: 'AU på YouTube',\r\n url: 'http://www.youtube.com/user/AarhusUniversity'\r\n\r\n },\r\n {\r\n classname: 'vimeo',\r\n text: 'AU på Vimeo',\r\n url: 'http://vimeo.com/channels/181624'\r\n },\r\n {\r\n classname: 'instagram',\r\n text: 'AU på Instagram',\r\n url: 'http://instagram.com/aarhusuni'\r\n }\r\n ],\r\n sharing: [\r\n {\r\n classname: 'facebook',\r\n text: 'Del på Facebook'\r\n }, {\r\n classname: 'twitter',\r\n text: 'Del på Twitter'\r\n }, {\r\n classname: 'linkedin',\r\n text: 'Del på LinkedIn'\r\n }, {\r\n classname: 'email',\r\n text: 'Send til en ven'\r\n }\r\n ],\r\n direction: '',\r\n icons: true,\r\n spacing: false,\r\n title: '',\r\n url: '',\r\n size: 'medium',\r\n color: 'real',\r\n initFunc: null\r\n }\r\n },\r\n sharers: [],\r\n newsSharer: {\r\n config: {\r\n container: '#au_content .au_news-single-item',\r\n tracking: '/virtual/ttnews/sharing/',\r\n direction: 'horizontal'\r\n }\r\n },\r\n peopleXsSharer: {\r\n config: {\r\n container: '#au_content .peoplexs-single',\r\n tracking: '/virtual/peoplexs/sharing/',\r\n direction: 'horizontal'\r\n }\r\n },\r\n mergeOptions: function (sharer) {\r\n if (!sharer.hasOwnProperty('config')) {\r\n sharer.config = {};\r\n }\r\n\r\n for (var conf in this.options.config) {\r\n if (!sharer.config.hasOwnProperty(conf)) {\r\n sharer.config[conf] = this.options.config[conf];\r\n }\r\n }\r\n },\r\n renderButtons: function (sharer) {\r\n\r\n var html = \"\";\r\n if (sharer.config.mode === 'sharing') {\r\n\r\n var shareTitle = sharer.config.title;\r\n var shareUrl = sharer.config.url;\r\n\r\n var direction = sharer.config.direction;\r\n var icons = sharer.config.icons;\r\n var spacing = sharer.config.spacing;\r\n var services = sharer.config.sharing;\r\n\r\n var dirClass = direction === '' ? '' : ' ' + direction;\r\n var iconClass = icons ? ' icons' : '';\r\n var spacedClass = spacing ? ' spacing' : '';\r\n\r\n html += '';\r\n\r\n } else {\r\n\r\n var links = sharer.config.links;\r\n var color = sharer.config.color === 'real' ? '' : ' style=\"color: ' + sharer.config.color + ';\"';\r\n\r\n html += '
      ';\r\n for (var j = 0; j < links.length; j++) {\r\n html += '
    • ';\r\n }\r\n html += '
    ';\r\n }\r\n\r\n sharer.container.append(html);\r\n },\r\n disableAddThisForOldNews: function () {\r\n $('.au_news-single-item .addthis_toolbox').hide();\r\n },\r\n trackingFunc: function (sharer) {\r\n $('ul.au_social_sharing a', sharer.container).on('click', function () {\r\n // Used to track old Google Analytics\r\n });\r\n },\r\n init: function () {\r\n\r\n if (this.sharers.length > 0) {\r\n\r\n var c = this.options.config;\r\n if (AU.pageLang !== 'da') {\r\n c.links[0].text = 'AU on Facebook';\r\n c.links[1].text = 'AU on Twitter';\r\n c.links[2].text = 'AU on LinkedIn';\r\n c.links[3].text = 'AU on YouTube';\r\n c.links[4].text = 'AU on Vimeo';\r\n c.links[5].text = 'AU on Instagram';\r\n c.sharing[0].text = 'Facebook share';\r\n c.sharing[1].text = 'Twitter share';\r\n c.sharing[2].text = 'LinkedIn share';\r\n c.sharing[3].text = 'Send to a friend';\r\n }\r\n\r\n c.title = $('title').text();\r\n c.url = location.href;\r\n c.initFunc = function (box) {\r\n if (box.config.mode === 'sharing') {\r\n var s = AU.social;\r\n s.fb.setClick(box);\r\n s.twitter.setClick(box);\r\n s.linkedin.setClick(box);\r\n s.mail.setClick(box);\r\n }\r\n };\r\n\r\n for (var i = 0; i < this.sharers.length; i++) {\r\n var s = this.sharers[i];\r\n\r\n if (!s.loaded) {\r\n this.mergeOptions(s);\r\n s.container = $(s.config.container).eq(0);\r\n this.renderButtons(s);\r\n s.loaded = true;\r\n s.config.initFunc(s);\r\n\r\n this.trackingFunc(s);\r\n }\r\n }\r\n }\r\n },\r\n fb: {\r\n openShareDialog: function (url) {\r\n window.open('https://www.facebook.com/sharer/sharer.php?u=' + url, '', 'width=600,height=450');\r\n },\r\n setClick: function (sharer) {\r\n $('ul.au_social_sharing .facebook a', sharer.container).on('click', function (e) {\r\n e.preventDefault();\r\n var shareUrl = $(this).data('url');\r\n AU.social.fb.openShareDialog(shareUrl);\r\n });\r\n }\r\n },\r\n twitter: {\r\n openShareDialog: function (title, url) {\r\n url = encodeURI(url);\r\n title = encodeURI(title);\r\n window.open('https://twitter.com/intent/tweet?text=' + title + '&url=' + url, '', 'width=550,height=450');\r\n },\r\n setClick: function (sharer) {\r\n $('ul.au_social_sharing .twitter a', sharer.container).on('click', function (e) {\r\n e.preventDefault();\r\n var shareTitle = $(this).data('title');\r\n var shareUrl = $(this).data('url');\r\n AU.social.twitter.openShareDialog(shareTitle, shareUrl);\r\n });\r\n }\r\n },\r\n linkedin: {\r\n openShareDialog: function (url) {\r\n url = encodeURI(url);\r\n window.open('https://www.linkedin.com/shareArticle?mini=true&url=' + url, '', 'width=850,height=550');\r\n\r\n },\r\n setClick: function (sharer) {\r\n $('ul.au_social_sharing .linkedin a', sharer.container).on('click', function (e) {\r\n e.preventDefault();\r\n var shareUrl = $(this).data('url');\r\n AU.social.linkedin.openShareDialog(shareUrl);\r\n });\r\n }\r\n },\r\n mail: {\r\n setClick: function (sharer) {\r\n $('ul.au_social_sharing .email > a', sharer.container).on('click', function (e) {\r\n e.preventDefault();\r\n $('> ul', $(this).parent()).toggle();\r\n $(this).toggleClass('active');\r\n });\r\n }\r\n }\r\n};\r\n\r\nAU.social.instashow = {\r\n loaded: false,\r\n load: function (callback) {\r\n if (typeof callback === 'function') {\r\n if (callback()) {\r\n $.getScript('https://apps.elfsight.com/p/platform.js');\r\n AU.social.instashow.loaded = true;\r\n }\r\n }\r\n }\r\n};\r\n\r\nAU.social.yottie = {\r\n loaded: false,\r\n load: function (callback) {\r\n if (typeof callback === 'function') {\r\n if (callback()) {\r\n $.getScript('https://cdn.au.dk/vendor/js/jquery.yottie.bundled.js');\r\n AU.social.yottie.loaded = true;\r\n }\r\n }\r\n }\r\n};\r\n","/**\r\n * Titel: DATABOX\r\n * Beskrivelse: dynamiske søgebokse, som er strøet ud med lind hånd over hele websitet\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\r\n\r\n$.ajaxSetup({\r\n cache: true\r\n});\r\n\r\nAU.databox = {\r\n boxes: [],\r\n scriptLoaded: false,\r\n loadExternal: function () {\r\n const db = new AUDatabox(AU.databox.boxes);\r\n db.init();\r\n },\r\n init: function () {\r\n if (this.boxes.length > 0) {\r\n if (!this.scriptLoaded) {\r\n const componentsUrl = AU.cdn + '/components/umd/databox.js?v=' + AU.version;\r\n jQuery.getScript(componentsUrl, function () {\r\n AU.databox.loadExternal();\r\n AU.databox.scriptLoaded = true;\r\n });\r\n } else {\r\n this.loadExternal();\r\n }\r\n }\r\n }\r\n};","/**\r\n * Titel: FLOWBOX\r\n * Beskrivelse: bruges primært til visning af kontaktpersoner på medarbejdersider, samt til åbningstider for it-supporten\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\r\n\r\nAU.flowbox = {\r\n boxes: [],\r\n scriptLoaded: false,\r\n loadExternal: function () {\r\n const fb = new AUFlowbox(AU.pageLang, AU.flowbox.boxes);\r\n fb.init();\r\n },\r\n init: function () {\r\n if (this.boxes.length > 0) {\r\n if (!this.scriptLoaded) {\r\n const componentsUrl = AU.cdn + '/components/umd/flowbox.js?v=' + AU.version;\r\n jQuery.getScript(componentsUrl, function () {\r\n AU.flowbox.loadExternal();\r\n AU.flowbox.scriptLoaded = true;\r\n });\r\n } else {\r\n this.loadExternal();\r\n }\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * Titel: ALPHABOX\r\n * Beskrivelse: benyttes fx til medarbejderserviceboks\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\r\n\r\n$.ajaxSetup({\r\n cache: true\r\n});\r\n\r\nAU.alphabox = {\r\n boxes: [],\r\n scriptLoaded: false,\r\n loadExternal: function () {\r\n const ab = new AUAlphabox(AU.alphabox.boxes);\r\n ab.init();\r\n },\r\n init: function () {\r\n if (this.boxes.length > 0) {\r\n if (!this.scriptLoaded) {\r\n const componentsUrl = AU.cdn + '/components/umd/alphabox.js?v=' + AU.version;\r\n jQuery.getScript(componentsUrl, function () {\r\n AU.alphabox.loadExternal();\r\n AU.alphabox.scriptLoaded = true;\r\n });\r\n } else {\r\n this.loadExternal();\r\n }\r\n }\r\n }\r\n};","/**\r\n * Titel: RESPONSIVE\r\n * Beskrivelse: indeholder efterhånden primært logik til omsættelse af tabeller til responsiv opførsel (lister), herunder studiediagrammerne. Derudover er der en lille smule logik til det nye design\r\n * Status: er kun i nogen grad omskrevet fra 2011/2015-udgaven\r\n */\r\n\r\nAU.responsive = {\r\n state: null,\r\n stateHistory: [],\r\n modes: {\r\n PHONE: {\r\n ID: 0,\r\n NAME: 'PHONE',\r\n MAX: 640\r\n },\r\n TABLET: {\r\n ID: 1,\r\n NAME: 'TABLET',\r\n MAX: 1024\r\n },\r\n DESKTOP: {\r\n ID: 2,\r\n NAME: 'DESKTOP'\r\n }\r\n },\r\n detectDevice: function () {\r\n\r\n var state = null;\r\n var modes = AU.responsive.modes;\r\n if (Foundation.MediaQuery.current === 'small') {\r\n state = modes.PHONE;\r\n }\r\n else if (Foundation.MediaQuery.current === 'medium') {\r\n state = modes.TABLET;\r\n }\r\n else {\r\n state = modes.DESKTOP;\r\n }\r\n\r\n if (state !== AU.responsive.state) {\r\n AU.responsive.state = state;\r\n AU.responsive.stateHistory.push(state.NAME);\r\n console.log(state.NAME);\r\n AU.responsive.setMarkup();\r\n }\r\n },\r\n markupRenderFunctions: [],\r\n runMarkupFunctions: function () {\r\n for (var i = 0; i < this.markupRenderFunctions.length; i++) {\r\n if (typeof this.markupRenderFunctions[i] === 'function') {\r\n this.markupRenderFunctions[i]();\r\n }\r\n }\r\n },\r\n setMarkup: function () {\r\n var state = AU.responsive.state;\r\n\r\n var utilityLinks = jQuery('.utility-links');\r\n var headerMenu = jQuery('.header-menu');\r\n var sectionHeader = jQuery('.section-header .logo');\r\n\r\n var pageNav = jQuery('#au_section_nav_inner_list');\r\n var titleBar = jQuery('.title-bar');\r\n var menuTitle = jQuery('.menu-title');\r\n var leftMenu = jQuery('.left-menu');\r\n var tablesScroll = jQuery('table.au_responsive_table_scroll');\r\n\r\n if (state.NAME === 'PHONE') {\r\n\r\n headerMenu.append(utilityLinks);\r\n if (jQuery('body').hasClass('universe')) {\r\n headerMenu.after(pageNav);\r\n pageNav.wrap('
    ');\r\n } else {\r\n utilityLinks.before(pageNav);\r\n }\r\n titleBar.before(menuTitle);\r\n pageNav.addClass('responsive-pagenav');\r\n\r\n tablesScroll.each(function () {\r\n var table = jQuery(this);\r\n table.wrap('
    ');\r\n });\r\n\r\n } else {\r\n\r\n var wasPhone = function () {\r\n var states = AU.responsive.stateHistory.length;\r\n return states > 1 ? AU.responsive.stateHistory[states - 2] === 'PHONE' : false;\r\n };\r\n\r\n if (wasPhone()) {\r\n sectionHeader.append(utilityLinks);\r\n leftMenu.append(pageNav);\r\n pageNav.before(menuTitle);\r\n\r\n }\r\n\r\n tablesScroll.each(function () {\r\n var table = jQuery(this);\r\n if (table.parent().is('div.responsive-table-container')) {\r\n table.unwrap();\r\n }\r\n });\r\n }\r\n\r\n this.runMarkupFunctions();\r\n }\r\n};\r\n\r\nAU.edutables = {\r\n tables: [],\r\n scriptLoaded: false,\r\n loadExternal: function () {\r\n const dg = new AUDiagramme(AU.pageLang, AU.edutables.tables);\r\n dg.init();\r\n },\r\n init: function () {\r\n if (this.tables.length > 0) {\r\n if (!this.scriptLoaded) {\r\n const componentsUrl = AU.cdn + '/components/umd/diagramme.js';\r\n jQuery.getScript(componentsUrl, function () {\r\n AU.edutables.loadExternal();\r\n AU.edutables.scriptLoaded = true;\r\n });\r\n } else {\r\n this.loadExternal();\r\n }\r\n }\r\n }\r\n};\r\n\r\nAU.addReadyFunction(function () {\r\n AU.responsive.detectDevice();\r\n AU.edutables.init();\r\n});\r\n\r\nAU.addResizeFunction(function () {\r\n AU.responsive.detectDevice();\r\n});\r\n","/**\r\n * Titel: NEWS\r\n * Beskrivelse: de 'nye nyheder', som indlæses asynkront og åbnes (nogle gange) i overlay\r\n * Status: er fuldstændig omskrevet til ES6/React og indlæses nu via components-biblioteket for at holde React ude af dette projekt\r\n */\r\n\r\nconst disqus_no_style = true;\r\nconst disqus_shortname = 'aukom';\r\nlet disqus_url = '';\r\nlet disqus_loaded = false;\r\n\r\n$.ajaxSetup({\r\n cache: true\r\n});\r\n\r\nAU.news = {\r\n feeds: [],\r\n scriptLoaded: false,\r\n loadExternal: function () {\r\n this.setPopup();\r\n const news = new AUNews(AU.pageLang, AU.news.feeds);\r\n news.init();\r\n new AUNewsCollage(AU.pageLang, document.querySelector('#featured-content'));\r\n },\r\n setPopup: function () {\r\n var body = document.querySelector('body');\r\n var popup = document.createElement('div');\r\n popup.setAttribute('id', 'au_news_popup');\r\n body.appendChild(popup);\r\n },\r\n init: function () {\r\n const fc = document.querySelector('#featured-content');\r\n if ((this.feeds && this.feeds.length) > 0 || fc) {\r\n if (!this.scriptLoaded) {\r\n const componentsUrl = (typeof window.componentsUri !== 'undefined' ? window.componentsUri : AU.cdn) + '/components/umd/news.js?v=' + AU.version;\r\n jQuery.getScript(componentsUrl, function () {\r\n AU.news.loadExternal();\r\n AU.news.scriptLoaded = true;\r\n });\r\n } else {\r\n this.loadExternal();\r\n }\r\n }\r\n }\r\n}\r\n\r\nString.prototype.hashCode = function () {\r\n var hash = 0, i, ch, l;\r\n if (this.length === 0) {\r\n return '_' + Math.abs(hash);\r\n }\r\n for (i = 0, l = this.length; i < l; i++) {\r\n ch = this.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + ch;\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n return '_' + Math.abs(hash);\r\n};\r\n\r\n//http://stackoverflow.com/questions/9235304/how-to-replace-the-location-hash-and-only-keep-the-last-history-entry\r\n(function (namespace) {\r\n if ('replaceState' in history) {\r\n namespace.replaceHash = function (newhash) {\r\n if (('' + newhash).charAt(0) !== '#') {\r\n newhash = '#' + newhash;\r\n }\r\n history.replaceState('', '', newhash);\r\n };\r\n } else {\r\n var hash = location.hash;\r\n namespace.replaceHash = function (newhash) {\r\n if (location.hash !== hash) {\r\n history.back();\r\n }\r\n location.hash = newhash;\r\n };\r\n }\r\n})(window);","/**\r\n * Titel: MAPS\r\n * Beskrivelse: Google Maps-baseret kortløsning.\r\n * Status: er noget af det ældste kode, vi har kørende. Virker som sådan fint nok, men ved et større kortprojekt ville det være oplagt at få omskrevet\r\n */\r\n\r\nconst GOOGLE_MAPS_API_KEY = \"AIzaSyBP04DSgKVcqkYGO_Xb4GgqXHMzRO_2jzo\";\r\n\r\nAU.maps = {\r\n loadGoogleMapsScript: function () {\r\n // Check if the global variable for loading Google Maps is defined, if not default to false\r\n var shouldLoadGoogleMapsScript = typeof window.loadGoogleMapsScript !== 'undefined' ? window.loadGoogleMapsScript : false;\r\n var shouldLoadGoogleMapsScriptAsync = typeof window.loadGoogleMapsScriptAsync !== 'undefined' ? window.loadGoogleMapsScriptAsync : true; // Default to true for async\r\n\r\n // Early return if we should not load the Google Maps script\r\n if (shouldLoadGoogleMapsScript) {\r\n console.log(\"Google Maps script will be loaded manually on this page\");\r\n } else{\r\n return;\r\n }\r\n\r\n // Construct the base URL with the API key\r\n var scriptUrl = 'https://maps.googleapis.com/maps/api/js?key=' + GOOGLE_MAPS_API_KEY;\r\n\r\n // Conditionally add the async loading parameter to the URL\r\n if (shouldLoadGoogleMapsScriptAsync) {\r\n scriptUrl += '&loading=async';\r\n }\r\n\r\n scriptUrl += '&callback=AU.maps.googleMapsScriptCallback';\r\n\r\n // Create a script element and set the constructed URL\r\n var script = document.createElement('script');\r\n script.src = scriptUrl;\r\n\r\n // Handle the script load success\r\n script.onload = function () {\r\n console.log(\"Google Maps script has been loaded successfully. Now waiting for the callback to initialize.\");\r\n };\r\n\r\n // Handle script load failure and capture details\r\n script.onerror = function (event) {\r\n console.error(\"Error loading Google Maps script:\", event);\r\n console.error(\"Script URL:\", event.target.src); // URL of the failed script\r\n };\r\n\r\n // Append the script to the document's head to initiate the load\r\n document.head.appendChild(script);\r\n },\r\n // If the Google maps script is loaded, we use this callback to dispatch an googleMapsScriptLoadedEvent event\r\n googleMapsScriptLoaded: false,\r\n googleMapsScriptCallback: function () {\r\n AU.maps.googleMapsScriptLoaded = true;\r\n console.log(\"Google Maps script callback has been executed. Google Maps is ready for use.\");\r\n\r\n // Dispatch a custom event to notify that Google Maps is ready\r\n const event = new CustomEvent('googleMapsScriptLoadedEvent');\r\n window.dispatchEvent(event);\r\n },\r\n create: function (container, width, height, zoomLevel, center, scrollWheel, draggable, clickable, streetView, pco, zco, svco) {\r\n\r\n var mapOptions = {\r\n zoom: zoomLevel,\r\n center: center,\r\n scrollwheel: (AU.helpers.isMobileDevice() || AU.responsive.state.NAME == 'PHONE') ? false : scrollWheel,\r\n draggable: draggable,\r\n clickable: clickable,\r\n streetViewControl: streetView,\r\n mapTypeControlOptions: {\r\n mapTypeIds: ['default', google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID],\r\n style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\r\n position: google.maps.ControlPosition.RIGHT_TOP\r\n },\r\n mapTypeId: google.maps.MapTypeId.ROADMAP,\r\n panControlOptions: !pco ? {} : pco,\r\n zoomControlOptions: !zco ? {} : zco,\r\n streetViewControlOptions: !svco ? {} : svco\r\n };\r\n\r\n // Opretter kort\r\n var map = new google.maps.Map(container, mapOptions);\r\n\r\n // Kortets størrelse sættes\r\n container.style.width = !isNaN(width) ? width + 'px' : width;\r\n container.style.height = !isNaN(height) ? height + 'px' : height;\r\n\r\n return map;\r\n },\r\n setBounds: function (map, markers) {\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0; i < markers.length; i++) {\r\n for (var j = 0; j < markers[i].length; j++) {\r\n bounds.extend(markers[i][j].position);\r\n }\r\n }\r\n map.fitBounds(bounds);\r\n },\r\n marker: {\r\n add: function (map, point, markerIcon, markerDraggable, markerClickable, markerPanTo, markerClickZoom, markerClickZoomLevel, infoWindow, windowContent, title, id) {\r\n var marker = new google.maps.Marker({\r\n position: point,\r\n map: map,\r\n icon: markerIcon,\r\n draggable: markerDraggable,\r\n title: title\r\n });\r\n\r\n if (typeof id !== 'undefined') {\r\n marker.set('id', id);\r\n }\r\n\r\n // Listeners tilføjes markør\r\n google.maps.event.addListener(marker, 'click', function () {\r\n if (windowContent !== '

    ') {\r\n // Infowindow åbner ved klik\r\n infoWindow.open(map, this);\r\n infoWindow.setContent(windowContent);\r\n }\r\n\r\n if (markerClickable) {\r\n if (markerPanTo) {\r\n map.panTo(this.getPosition());\r\n }\r\n\r\n if (!markerClickZoom || map.getZoom() > markerClickZoomLevel) {\r\n map.setZoom(map.getZoom());\r\n } else {\r\n map.setZoom(markerClickZoomLevel);\r\n }\r\n }\r\n });\r\n\r\n // At flytte en markør betragtes som et klik på kortet (det giver tilsyneladende ingen problemer, skulle der ikke være defineret click-event på kortet)\r\n if (markerDraggable) {\r\n google.maps.event.addListener(marker, 'dragend', function (point) {\r\n google.maps.event.trigger(map, 'click', point);\r\n });\r\n }\r\n\r\n return marker;\r\n }\r\n },\r\n route: {\r\n destinationFrom: false,\r\n destinationTo: false,\r\n directionsDisplay: null,\r\n directionsService: null,\r\n calc: function (map, from, to, travelMode, directionsService, directionsDisplay, waypointLocations) {\r\n if (from !== '') {\r\n var waypoints = [];\r\n if (typeof waypointLocations !== 'undefined') {\r\n for (var i = 0; i < waypointLocations.length; i++) {\r\n waypoints.push({\r\n location: waypointLocations[i],\r\n stopover: false\r\n });\r\n }\r\n }\r\n\r\n var request = {\r\n origin: from,\r\n destination: to,\r\n travelMode: travelMode,\r\n waypoints: waypoints\r\n };\r\n\r\n directionsService.route(request, function (response, status) {\r\n if (status === google.maps.DirectionsStatus.OK) {\r\n if (directionsDisplay.getMap() === null) {\r\n directionsDisplay.setMap(map);\r\n }\r\n directionsDisplay.setDirections(response);\r\n } else {\r\n window.alert(status);\r\n }\r\n });\r\n }\r\n },\r\n createDirectionObjects: function (map, container) {\r\n var rendererOptions = {\r\n draggable: true\r\n };\r\n\r\n var directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);\r\n var panel = container;\r\n\r\n directionsDisplay.setMap(map);\r\n directionsDisplay.setPanel(panel);\r\n\r\n return directionsDisplay;\r\n }\r\n },\r\n geocodePersonAddress: function (map, options, icon, address, centerMap, infoWindow, windowContent, func) {\r\n AU.maps.geocoder.geocode({\r\n 'address': address\r\n }, function (results, status) {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n var point = new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());\r\n var marker = AU.maps.marker.add(map, point, icon, options.markerDrag, options.markerClick, options.clickPanTo, options.clickZoom, options.clickZoomLevel, infoWindow, windowContent, '');\r\n\r\n if (typeof func === 'function') {\r\n func(marker, point, centerMap, infoWindow, windowContent);\r\n }\r\n\r\n }\r\n });\r\n\r\n },\r\n helpers: {\r\n getDistanceBetweenPoints: function (point1, point2) {\r\n return google.maps.geometry.spherical.computeDistanceBetween(point1, point2);\r\n },\r\n convertFromLatLng: function (coord) {\r\n return Math.round(coord * 1000000);\r\n },\r\n convertToLatLng: function (coord) {\r\n var c;\r\n if (coord.length === 7) {\r\n c = coord.substring(0, 1) + '.' + coord.substring(1);\r\n }\r\n if (coord.length === 8) {\r\n c = coord.substring(0, 2) + '.' + coord.substring(2);\r\n }\r\n if (coord.length === 9) {\r\n c = coord.substring(0, 3) + '.' + coord.substring(3);\r\n }\r\n return c;\r\n },\r\n getCurrentDate: function () {\r\n var d = new Date();\r\n var date = d.getDate();\r\n var month = d.getMonth() + 1;\r\n var currentDate = (date < 10 ? ('0' + date) : date) + '.' + (month < 10 ? ('0' + month) : month) + '.' + ('' + d.getFullYear()).substring(2);\r\n return currentDate;\r\n },\r\n getCurrentTime: function () {\r\n var d = new Date();\r\n var hours = d.getHours();\r\n var minutes = d.getMinutes();\r\n var currentTime = (hours < 10 ? ('0' + hours) : hours) + ':' + (minutes < 10 ? ('0' + minutes) : minutes);\r\n return currentTime;\r\n },\r\n sortSelect: function (element) {\r\n $(element).each(function () {\r\n var selectedValue = $(this).val();\r\n $(this).html($('option', $(this)).sort(function (a, b) {\r\n return a.text === b.text ? 0 : a.text < b.text ? -1 : 1;\r\n }));\r\n $(this).val(selectedValue);\r\n });\r\n },\r\n sortAlphaObj: function (a, b) {\r\n if (typeof a.name !== 'undefined' && typeof b.name !== 'undefined') {\r\n return a.name > b.name ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n },\r\n infoWindow: null,\r\n geocoder: null\r\n};\r\n\r\n// Slut på det generelle (\"biblioteket\") – nedenstående omhandler de små kort, som (primært) sidder på institutsiderne\r\n\r\nvar maps = [];\r\n\r\nAU.maps.single = {\r\n options: {\r\n image: '',\r\n markerDrag: !window._markerDrag ? false : window._markerDrag,\r\n markerClick: !window._markerClick ? true : window._markerClick,\r\n clickPanTo: !window._clickPanTo ? false : window._clickPanTo,\r\n clickZoom: !window._clickZoom ? false : window._clickZoom,\r\n clickZoomLevel: window._clickZoomLevel || 12,\r\n defaultZoomLevel: window._defaultZoomLevel || 16,\r\n scrollWheel: !window._scrollWheel ? false : window._scrollWheel,\r\n draggable: !window._draggable ? true : window._draggable,\r\n clickable: !window._clickable ? true : window._clickable,\r\n streetView: !window._streetView ? false : window._streetView,\r\n centerLat: window._centerLat || 56.20,\r\n centerLng: window._centerLng || 10.50,\r\n mapWidth: '99.5%',\r\n mapHeight: 275\r\n },\r\n center: null,\r\n maps: window.maps,\r\n mapDivs: [],\r\n firstMapLoaded: false,\r\n findFirstMap: function () {\r\n var i = 1;\r\n var firstMap;\r\n do {\r\n firstMap = document.getElementById('au_map' + (i === 1 ? '' : i));\r\n i++;\r\n } while (!firstMap && i <= 2);\r\n\r\n return firstMap;\r\n },\r\n loadMaps: function () {\r\n // Enten populeres kortet med manuelle punkter (fra sourcen) eller også henter vi fra datakilde (iPure / XML)\r\n if (AU.maps.single.maps.length > 0) {\r\n AU.maps.single.init();\r\n } else {\r\n if (typeof window.path !== 'undefined') {\r\n\r\n var dataFunc = function (data) {\r\n var locations = data.locations;\r\n var combinedPoints = [];\r\n var name;\r\n for (var l = 0; l < locations.length; l++) {\r\n name = locations[l].names[0].name;\r\n var lat = locations[l].latitude;\r\n var lng = locations[l].longitude;\r\n var url = locations[l].url;\r\n var text = locations[l].text;\r\n\r\n var points = [];\r\n var point = {\r\n latitude: lat,\r\n longitude: lng,\r\n title: name,\r\n text: text\r\n };\r\n points.push(point);\r\n combinedPoints.push(point);\r\n\r\n if ($('#au_map').length > 0) {\r\n AU.maps.single.maps.push({\r\n name: name,\r\n name_en: name,\r\n container: '#au_map',\r\n mapWidth: AU.maps.single.options.mapWidth,\r\n mapHeight: AU.maps.single.options.mapHeight,\r\n href: url,\r\n points: points,\r\n switchmode: 'dropdown',\r\n load: false\r\n });\r\n }\r\n }\r\n\r\n if ($('#au_map2').length > 0) {\r\n AU.maps.single.maps.push({\r\n name: name,\r\n name_en: name,\r\n container: '#au_map2',\r\n mapWidth: AU.maps.single.options.mapWidth,\r\n mapHeight: AU.maps.single.options.mapHeight,\r\n href: '',\r\n points: combinedPoints,\r\n load: true\r\n });\r\n }\r\n\r\n AU.maps.single.init();\r\n };\r\n\r\n $.getJSON(window.path, function (data) {\r\n dataFunc(data);\r\n });\r\n }\r\n }\r\n\r\n AU.maps.single.firstMapLoaded = true;\r\n },\r\n init: function () {\r\n\r\n AU.maps.route.directionsService = new google.maps.DirectionsService();\r\n AU.maps.infoWindow = new google.maps.InfoWindow();\r\n AU.maps.geocoder = new google.maps.Geocoder();\r\n\r\n var divUsed = false;\r\n for (var i = 0; i < AU.maps.single.maps.length; i++) {\r\n\r\n var currentMap = AU.maps.single.maps[i];\r\n\r\n currentMap.map = null;\r\n currentMap.markers = [];\r\n\r\n // Finder ud af, om vi allerede har brugt den angivne div\r\n for (var k = 0; k < AU.maps.single.mapDivs.length; k++) {\r\n if (AU.maps.single.mapDivs[k] === currentMap.container) {\r\n divUsed = true;\r\n break;\r\n } else {\r\n divUsed = false;\r\n }\r\n }\r\n\r\n // Hvis vi ikke har brugt div'en, opretter vi kortet\r\n if (!divUsed) {\r\n var mapContainer = $(currentMap.container).get(0);\r\n var options = AU.maps.single.options;\r\n\r\n currentMap.map = AU.maps.create(mapContainer, currentMap.mapWidth, currentMap.mapHeight, options.defaultZoomLevel, AU.maps.single.center, options.scrollWheel, options.draggable, options.clickable, options.streetView);\r\n AU.maps.single.mapDivs.push(AU.maps.single.maps[i].container);\r\n\r\n if (currentMap.load) {\r\n this.setMapContent(currentMap, false);\r\n }\r\n\r\n $(currentMap.container).after($('
    ', {\r\n 'class': 'au_maps_switchlink'\r\n }));\r\n\r\n if (typeof currentMap.switchmode !== 'undefined' && currentMap.switchmode === 'dropdown') {\r\n $(currentMap.container + ' + div').append($('');\r\n jQuery(form).append('');\r\n }\r\n });\r\n\r\n // Alle funktioner, som er pushet til ready-objektet, løbes igennem\r\n for (var i = 0; i < AU.ready.length; i++) {\r\n if (typeof (AU.ready[i]) === 'function') {\r\n try {\r\n // Attempt to execute the function\r\n AU.ready[i]();\r\n } catch (e) {\r\n // Catch any error and log it, but don't stop execution\r\n console.error(\"Error in AU.ready function loop (au-init.js) at index: \" + i, e);\r\n }\r\n }\r\n }\r\n\r\n /*\r\n if (typeof findWidgetInit === 'function') {\r\n var dropdownWidgetLoaded = false;\r\n jQuery(document).on('show.zf.dropdown', function () {\r\n if (!dropdownWidgetLoaded) {\r\n findWidgetInit('header .find-container');\r\n dropdownWidgetLoaded = true;\r\n }\r\n });\r\n }\r\n */\r\n\r\n var findBtn = document.querySelector('header .find-button');\r\n if (findBtn) {\r\n findBtn.setAttribute('href', AU.pageLang === 'da' ? 'https://www.au.dk/kort/' : 'https://www.au.dk/en/map/');\r\n }\r\n\r\n if ((typeof AU.basic === 'undefined' || !AU.basic) && (typeof window.defaultTracking === 'undefined' || window.defaultTracking)) {\r\n // Siteimprove\r\n (function () {\r\n var sz = document.createElement('script'); \r\n sz.type = 'text/plain'; \r\n sz.async = true;\r\n sz.setAttribute('data-cookiescript', 'accepted');\r\n sz.setAttribute('data-cookiecategory', 'performance');\r\n sz.src = '//siteimproveanalytics.com/js/siteanalyze_4573657.js';\r\n var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(sz, s);\r\n })();\r\n }\r\n });\r\n\r\n jQuery(window).on('load', function () {\r\n AU.design.setBannerElementsLoad();\r\n\r\n for (var i = 0; i < AU.load.length; i++) {\r\n if (typeof (AU.load[i]) === 'function') {\r\n AU.load[i]();\r\n }\r\n }\r\n });\r\n\r\n jQuery(window).on('resize', function () {\r\n for (var i = 0; i < AU.resize.length; i++) {\r\n if (typeof (AU.resize[i]) === 'function') {\r\n AU.resize[i]();\r\n }\r\n }\r\n });\r\n\r\n jQuery(window).on('scroll', function () {\r\n for (var i = 0; i < AU.scroll.length; i++) {\r\n if (typeof (AU.scroll[i]) === 'function') {\r\n AU.scroll[i]();\r\n }\r\n }\r\n });\r\n})();\r\n"]}