CINXE.COM
DHI Senior DevOps Engineer (Malaysia)
<!DOCTYPE html> <html lang="en-GB"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0" /> <base href="/"> <title>DHI Senior DevOps Engineer (Malaysia) </title> <meta name="description" content="Join our dynamic team at DHI Seaport, where you'll play a pivotal role in revolutionizing port and maritime software solutions using cutting-edge technology. If you're driven by innovation and eager t"> <meta property="og:title" content="DHI Senior DevOps Engineer (Malaysia) "> <meta property="og:type" content="website"> <meta property="og:url" content="https://dhi.career.emply.com/ad/senior-devops-engineer-malaysia/cqbce6/en"> <meta property="og:image" content=""> <meta property="og:description" content="Join our dynamic team at DHI Seaport, where you'll play a pivotal role in revolutionizing port and maritime software solutions using cutting-edge technology. If you're driven by innovation and eager t"> <meta property="fb:app_id" content=""> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet"> <link rel="shortcut icon" href="/img/favicon.ico"> <link href="/bundles/css?v=ym4IVaHb6jkuBKloU_CG28BUxzyZGWKkkoR7hS8hxfw1" rel="stylesheet"/> <script src="/bundles/js?v=y8nqM23MgD-BR9BqJqqcDXysymyvS9giJhpfWnCrnGY1"></script> <script type="text/javascript"> $(function () { $('.titleTooltip').tooltipster(); }); </script> <script type="text/javascript"> $(document).ready(function () { var referrer = document.referrer; if (referrer && localStorage && !referrer.startsWith(window.location.origin)) { localStorage.setItem('referrer', referrer); } }); </script> <script> var mapInits = []; var mapInitialized = false; function initMap() { mapInitialized = true; for (var i = 0; i < mapInits.length; i++) { mapInits[i](); } } </script> <script src="https://maps.googleapis.com/maps/api/js?callback=initMap&libraries=places&key=AIzaSyDDwJDtaszetWDicXKS6Fvkp-K8MO3NSxM"></script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <style> .csl_body { font-family: 'Roboto', arial, verdana !important; color: #000000; } .css_headline { color: #000000; } .css_subheadline { color: #000000; opacity: 1; } .css_heightCell { color: #000000; } .csl_top { position: relative; background: #fff; line-height: 24px; font-size: 16px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); z-index: 100; } .csl_top .css_holder { padding-top: 0; padding-bottom: 0; } .csl_topTable { float: left; display: table; width: 100%; } .csl_topLogo { display: table-cell; padding: 20px 0; vertical-align: middle; } @media (max-width: 795px) { .csl_topLogo {padding: 10px 0;} } .csl_topLogo:empty:before { content: attr(careersite); line-height: 36px; font-size: 26px; } @media (max-width: 1275px) { .csl_topLogo:empty:before {font-size: 20px;} } .csl_topLogo img { float: left; max-width: 50vw; max-height: 90px; } .csl_topMenu { display: table-cell; vertical-align: middle; } .csl_topMenu > ul { transition: all 0.25s; float: right; list-style-type: none; padding: 0; margin: 0; } @media (max-width: 795px) { .csl_topMenu > ul { position: absolute; top: 0; left: 0; width: calc(100% - 60px); background: #fff; overflow: hidden; transform: translate(0, -100%); border-bottom-right-radius: 10px; } .csl_topMenu.active > ul { transform: translate(0, 0); box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); } } .csl_topMenu > ul > li { position: relative; float: left; padding: 0 20px; box-sizing: border-box; } @media (max-width: 1275px) { .csl_topMenu > ul > li {padding: 0 10px;} } @media (max-width: 795px) { .csl_topMenu > ul > li { display: block; width: 100%; padding: 0; } } .csl_topMenu > ul > li:last-child { padding-right: 0; } .csl_topLink { transition: all 0.25s; position: relative; display: block; padding: 10px 0; text-decoration: none; color: #000; opacity: 0.75; } .csl_topLinkHolder.active .csl_topLink, .csl_topLinkHolder .csl_topLink:hover { opacity: 1; } .csl_topLink:after { transition: all 0.25s; content: ''; position: absolute; bottom: 5px; left: 50%; width: 0%; height: 2px; background: #1d9a3f; opacity: 0; transform: translate(-50%, 0); } .csl_topLink:hover:after, .csl_topLinkHolder.active .csl_topLink:after { width: 100%; opacity: 1; } @media (max-width: 795px) { .csl_topLink { padding: 15px 20px; font-weight: bold; border-bottom: 1px solid #eee; opacity: 1; } .csl_topLink:hover { background: rgba(0, 0, 0, 0.025); } .csl_topLink:after { display: none; } } .csl_topMenu ul li ul { transition: all 0.25s 0.5s; display: none; position: absolute; top: 40px; left: 0; background: #fff; list-style-type: none; padding: 5px 0; margin: 0; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); opacity: 0; } @media (max-width: 795px) { .csl_topMenu ul li ul { display: block; position: relative; top: 0 !important; padding: 0; border-radius: 0; box-shadow: none; opacity: 1 !important; } } .csl_topMenu ul li:hover ul { transition: all 0.25s; display: block; top: 60px; opacity: 0.9; } @media (min-width: 796px) { .csl_topMenu ul li ul:before { content: ''; position: absolute; top: -21px; left: 0; width: 100%; height: 21px; } } .csl_topMenu ul li ul li { white-space: nowrap; } .csl_topMenu ul li ul li a { transition: all 0.25s; display: block; padding: 5px 20px; text-decoration: none; color: #000; } @media (max-width: 795px) { .csl_topMenu ul li ul li a { padding: 10px 20px 8px 30px; border-bottom: 1px solid #eee; } } .csl_topMenu ul li ul li a:hover { text-decoration: underline; } @media (max-width: 795px) { .csl_topMenu ul li ul li a:hover { background: rgba(0, 0, 0, 0.025); text-decoration: none; } } @media (max-width: 795px) { .csl_topMenu ul li.csl_topLanguages { float: left; width: auto; padding: 20px; } } .csl_topLanguages a { float: left; padding: 11px 5px 13px 0; opacity: 0.5; } .csl_topLanguages a:hover { opacity: 1; } .csl_topLanguages a:last-child { padding-right: 0; } .csl_topLanguages a img { float: left; } @media (max-width: 795px) { .csl_topMenu ul li.csl_topLogin { padding: 0 20px; } } @media (max-width: 795px) { .csl_topMenu ul li.csl_topLogin { float: right; width: auto; margin: 20px 0; } } .csl_topLogin a { display: block; background: #3296FA; padding: 5px 10px 4px; text-decoration: none; color: #fff; border-radius: 3px; margin: 5px 0; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); } @media (max-width: 795px) { .csl_topLogin a { float: left; } } .csl_topLogin a:hover { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15), 0 0 5px rgba(255, 255, 255, 0.5) inset; } .csl_topLogin a:active { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15), 0 0 20px rgba(255, 255, 255, 0.5) inset; } .csl_topMenuIcon { float: right; position: relative; width: 20px; height: 20px; margin-left: 20px; } @media (min-width: 796px) { .csl_topMenuIcon {display: none;} } .csl_topMenuIcon span, .csl_topMenuIcon span:before, .csl_topMenuIcon span:after { transition: all 0.25s; position: absolute; top: 9px; left: 0; width: 100%; height: 2px; background: #3296FA; content: ''; } .csl_topMenu.active .csl_topMenuIcon span { background: rgba(0, 0, 0, 0); } .csl_topMenuIcon span:before { top: -6px; } .csl_topMenu.active .csl_topMenuIcon span:before { top: 0; transform: rotate(45deg); } .csl_topMenuIcon span:after { top: 6px; } .csl_topMenu.active .csl_topMenuIcon span:after { top: 0; transform: rotate(-45deg); } .css_button, .button, .button:hover, .tabs .line,.css_quote .slick-arrow { background: #1d9a3f; } .css_quoteMark { color: #1d9a3f; } .tabs .link:not(.active):not(.disabled):hover { border-color: #1d9a3f; } .css_jobsCell:hover:before { border-color: #1d9a3f; box-shadow: 0 0 0 1px #1d9a3f; } .csl_topLogin a { background: #1d9a3f; } .css_section p a, .csa_jobadText a { color: #1d9a3f; } .csl_topMenuIcon span, .csl_topMenuIcon span:before, .csl_topMenuIcon span:after { background: #1d9a3f; } .css_button { border-radius: 3px; } link-to-page-button:not(:first-child) .css_button { margin-top: 10px; } .css_jobagentNotify a.active { color: #1d9a3f; border-color: #1d9a3f; } .cse_iframe { -webkit-overflow-scrolling: touch; } .csa_jobadInfoMap agm-map { height: 192px; } @media print { body, .cse_iframe { height: 100%; overflow-y: visible; overflow-x: visible; } .css_bannerTable { height: auto !important; } .css_bannerTable * { color: #000 !important; } } .css_perksbenefitsBox { border: 5px solid #fff; box-sizing: border-box; } @media (min-width: 796px) { .csl_topLanguages { display: none; } .csl_topLanguagesDropdown { position: relative; } .csl_topLanguagesDropdown:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 50px; } .csl_topLanguagesDropdownTrigger { position: relative; float: left; width: 33px; height: 33px; background: url('/img/icons/flags/global.svg') 50% 50% no-repeat; margin-top: 5px; cursor: pointer; } .csl_topLanguagesDropdownHolder { transition: all 0.25s; display: none; position: absolute; top: 48px; left: 50%; width: calc(100% + 10px); background: #fff; padding: 10px 10px 0px 10px; border-radius: 3px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25); transform: translate(-50%, 0); } .csl_topLanguagesDropdown:hover .csl_topLanguagesDropdownHolder { display: block; } .csl_topLanguagesDropdownHolder a { display: block; line-height: 13px; font-size: 12px; white-space: nowrap; text-decoration: none; color: #000; margin-bottom: 10px; } .csl_topLanguagesDropdownHolder a img { float: left; width: 12px; margin: 0 5px 0 0; } } @media (max-width: 795px) { .csl_topLanguagesDropdown { display: none !important; } } .css_jobagentFilters.ng-star-inserted{ background-color:white; } .css_jobagentInfo.ng-star-inserted{ background-color:white; } </style> <script> </script> <script type="text/javascript"> var isPageIdle = false; $(document).idle({ onIdle: function () { isPageIdle = true; }, onActive: function () { isPageIdle = false; }, idle: 60000 }); function scheduleKeepAlive() { setTimeout('callKeepAlive()', 60000); } function callKeepAlive() { if (isPageIdle) { scheduleKeepAlive(); return; } $.ajax({ type: 'POST', url: '/api/keep-alive', error: function () { scheduleKeepAlive(); }, success: function () { scheduleKeepAlive(); } }); } $(document).ready(function () { scheduleKeepAlive(); }); </script> <script> $(document).ready(function () { const burgerMenu = document.getElementById("topMenuIcon"); const style = window.getComputedStyle(burgerMenu); const isBurgerMenuHidden = style.display === "none"; const topMenu = document.getElementsByClassName("csl_topMenu")[0]; const topMenuList = topMenu.firstElementChild; const firstPageLink = topMenuList.firstElementChild.firstElementChild; if (!isBurgerMenuHidden) { topMenuList.ariaHidden = true; setTabIndexToChildElements(topMenuList); } $('.csl_topMenuIcon').click(function () { if ($('.csl_topMenu').hasClass('active')) { hideBackgroundForElement("body-without-popups"); removeTabIndexForChildElements(topMenu); burgerMenu.ariaExpanded = true; topMenuList.ariaHidden = null; } else { showBackgroundForElement("body-without-popups"); setTabIndexToChildElements(topMenuList); burgerMenu.ariaExpanded = false; topMenuList.ariaHidden = true; } }); $('.csl_topMenuIcon').keydown(function (event) { if ($('.csl_topMenu').hasClass('active')) { if (event.key.toLowerCase() === 'tab') { if (event.shiftKey) { return; } else { event.preventDefault(); firstPageLink.focus(); } } } else { return; } }); }); </script> </head> <body class=""> <div id="body-without-popups"> <div class="csl_body"> <div class="csl_top"> <div class="css_holder"> <div class="csl_topTable"> <a href="/../"> <div class="csl_topLogo" careersite="Egen hjemmeside"><img src="/api/file/get-optimized-image/8ae4c6a6-24c3-4f9f-85e8-5a9516e96a9d"></div> </a> <div class="csl_topMenu"> <ul> <li class="csl_topLinkHolder "> <a role="tab" class="csl_topLink" href="/job-alert">Job Alert</a> </li> <li class="csl_topLinkHolder "> <a role="tab" class="csl_topLink" href="/available-positions">Available positions</a> </li> <li class="csl_topLogin"><a class="ui_login_button_popup ui_popup_open" data-popup-id="popup_login" href="javascript:void(0);" style="display: none;">Login</a><a class="ui_login_button_profile" href="/profile" style="display: none;">My profile</a><a class="ui_login_button_onboarding_profile" href="/onboarding-profile" style="display: none;">My profile</a></li> </ul> <a role="menuitem" id="topMenuIcon" class="csl_topMenuIcon" onClick="if($(this).parent().hasClass('active')){$(this).parent().removeClass('active');}else{$(this).parent().addClass('active');}" href="javascript:void(0);"><span></span></a> </div> </div> <div class="clear"></div> </div> </div> <div role="tabpanel"> <div id="section_ae924485-5a6f-4ad9-a04e-b7989b5be605" class="css_section"> <style> .css_banner h1 { animation: adHeadline 2s; } @keyframes adHeadline { 0% {margin-top: 40px; opacity: 0;} 25% {margin-top: 40px; opacity: 0;} 100% {margin-top: 0; opacity: 1;} } @media print { .csl_top, .css_section.css_banner, .css_button, .csa_jobadShare, .csa_jobadInfoMap, .css_section.bottom {display: none;} .csa_jobadLeft {width: 65%; padding-right: 40px;} .csa_jobadRight {float: none; width: auto; overflow: hidden; margin: 0 !important;} .csa_jobadInfo {width: 100%; -webkit-print-color-adjust: exact; margin: 0 !important;} } </style> <div> <img src="/api/integration/v2/files/fabc7bc1-25a7-4808-854c-5b011b16b144/content" style="float: left; width: 100%;"> <div class="clear"></div> </div> <div class="css_section csa_area csa_jobad"> <div class="css_holder"> <div class="csa_jobadLeft"> <h1 class="css_headline">Senior DevOps Engineer (Malaysia)</h1> <div class="clear"></div> <div class="csa_jobadText"><p>Join our dynamic team at DHI Seaport, where you'll play a pivotal role in revolutionizing port and maritime software solutions using cutting-edge technology. If you're driven by innovation and eager to work with the latest technology, DHI Seaport is the right place for you.</p><p><strong>About Us</strong></p><p>DHI is an independent, international consultancy with over 60 years of experience across 26 countries, delivering groundbreaking technologies in water and the environment. DHI Seaport, a part of DHI, is dedicated to the 24/7 development and operational management of cloud-based services for Ports and Waterway operators, owners, and regulators. Our flagship product, NCOS ONLINE, is the world’s most accurate large vessel traffic management system.</p><p><i>We value innovation, collaboration, and continuous learning. We encourage our team members to bring fresh ideas and take on challenges, knowing support is always there when needed.</i></p><p><strong>The Role</strong></p><p>As a Senior DevOps Engineer, you will be instrumental in building, optimizing, and maintaining our cloud-based solutions. You’ll manage Azure-based DevOps operations, expand CI/CD capabilities, and handle multi-cloud infrastructure using Docker, Helm, Kubernetes, and Terraform. This role requires an analytical mindset to navigate a complex environment focused on resilience and observability. We’re looking for someone who is passionate about technology and isn’t afraid to introduce new ideas.</p><p><strong>Key Responsibilities</strong></p><ul><li>Design, implement, and maintain scalable cloud infrastructure in Azure.</li><li>Develop and expand CI/CD pipelines.</li><li>Manage container orchestration using Docker, Kubernetes, and Helm.</li><li>Monitor system performance and troubleshoot issues.</li><li>Ensure cloud security best practices are followed.</li><li>Contribute to infrastructure automation using Terraform.</li></ul><p><strong>Skills and Qualifications</strong></p><p>Required</p><ul><li>8+ years of experience with Azure and Azure DevOps.</li><li>4+ years of experience with Docker, Kubernetes, and Helm.</li><li>Experience with Terraform or similar infrastructure as code tools.</li><li>Experience with monitoring tools like Prometheus, Grafana, or Azure Monitor.</li><li>Experience with cloud security best practices.</li><li>Strong problem-solving and analytical skills.</li><li>Ability to work effectively in a team and collaborate with skilled colleagues.</li><li>Ability to manage multiple assignments in a fast-paced environment.</li></ul><p>Desirable (Preferred but not Required):</p><ul><li>Experience with PostgreSQL, Linux, Jira, and Hasura.</li><li>An interest in Cyber Security and penetration test practices.</li><li>Experience with .net based applications</li><li>An interest in understanding and working with maritime operational forecast systems.</li></ul><p><strong>What We Offer</strong></p><ul><li>A challenging role with room for your own innovations and ideas.</li><li>Flexible working arrangements to support work-life balance.</li><li>A culture of learning and development, with clear paths for career progression.</li><li>The chance to work alongside passionate and talented colleagues from around the world.</li><li>Occasional travel to our office in Gold Coast, Australia.</li></ul><p><strong>Office Location</strong></p><p>You will be based in our office in Petaling Jaya, Malaysia.</p><p><strong>Applications</strong></p><ul><li>Please submit your application including CV via the relevant job posting on DHI’s website: <a href="http://www.dhigroup.com/careers">http://www.dhigroup.com/careers</a></li><li>The deadline for applications is 20th December 2024. Early applications are encouraged.</li><li>For further information, please contact Franz Thomsen at frt@dhigroup.com.</li></ul></div> <a class="css_button" href="https://dhi.career.emply.com/apply/senior-devops-engineer-malaysia/cqbce6" style="margin-top: 40px;"> Apply </a> <div id="share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b" class="csa_jobadShare"> <span tabindex="0">Share in your network</span> <a class="ui_share_facebook" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Share on Facebook" src="/img/careersite/share/facebook.svg" alt="Share on Facebook"></a> <a class="ui_share_twitter" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Share on X" src="/img/careersite/share/twitter.svg" alt="Share on X"></a> <a class="ui_share_linkedin" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Share on LinkedIn" src="/img/careersite/share/linkedin.svg" alt="Share on LinkedIn"></a> <a class="ui_share_googleplus" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Share on Google Plus" src="/img/careersite/share/googleplus.svg" alt="Share on Google Plus"></a> <a class="ui_share_print" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Print" src="/img/careersite/share/print.svg" alt="Print"></a> <a class="ui_share_mail" role="link" href="javascript:void(0);"><img class="titleTooltip" title="Tip a friend" src="/img/careersite/share/mail.svg" alt="Tip a friend"></a> </div> <script> $(document).ready(function() { var adLink = 'https://dhi.career.emply.com/ad/senior-devops-engineer-malaysia/cqbce6'; $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_facebook').click(function() { window.open('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(adLink), '_blank'); }); $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_twitter').click(function () { window.open('https://twitter.com/intent/tweet?url=' + encodeURIComponent(adLink), '_blank'); }); $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_linkedin').click(function () { window.open('https://www.linkedin.com/shareArticle?mini=true&url=' + encodeURIComponent(adLink), '_blank'); }); $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_googleplus').click(function () { window.open('https://plus.google.com/share?url=' + encodeURIComponent(adLink), '_blank'); }); $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_print').click(function () { const jobAdHeadlineContents = document.querySelector('.css_headline').outerHTML; const jobAdTextContents = document.querySelector('.csa_jobadText').outerHTML; const jobAdInfoContents = document.querySelector('.csa_jobadInfo').outerHTML; const printContents = jobAdHeadlineContents + jobAdTextContents + jobAdInfoContents; const printWindow = window.open('', '_blank'); printWindow.document.title = document.title; printWindow.document.head.outerHTML = document.head.outerHTML; printWindow.document.body.outerHTML = printContents; printWindow.onafterprint = function () { printWindow.close(); }; printWindow.print(); }); $('#share_91955f6b-ee28-4ab8-bf0c-3fcd1af9b46b .ui_share_mail').click(function () { window.location.href = 'mailto:?subject=' + this.mailSubject + '&body=' + encodeURIComponent(adLink); }); }); </script> <div class="clear"></div> </div> <div class="csa_jobadRight"> <div class="csa_jobadRight"> <div class="csa_jobadInfo"> <div class="csa_jobadInfoItem"> <strong>Deadline:</strong> <span data-fact-id="deadline"></span> <script> $(document).ready(function () { var dateMoment = moment('2024-12-20T15:59:00.000Z'); var datePattern = 'DD/MM/YYYY'; var timePattern = 'HH:mm'; var dateFormat = dateMoment.hours() === 23 && dateMoment.minutes() === 59 ? datePattern : datePattern + ', ' + timePattern; var dateString = dateMoment.format(dateFormat); $('span[data-fact-id="deadline"]').html(dateString); }); </script> </div> <div class="csa_jobadInfoItem"> <strong>Contact person:</strong> <div class="csa_jobadInfoContact"> <div class="csa_jobadInfoContactData"> <span>Franz Thomsen</span> <span>frt@dhigroup.com</span> </div> </div> <div class="marginBottom"></div> </div> <div class="csa_jobadInfoItem"> <strong> Position type:</strong> <span>Full time </span> </div> <div class="csa_jobadInfoItem"> <strong>Country:</strong> <span>Malaysia</span> </div> <div class="csa_jobadInfoItem"> <strong>Job type:</strong> <span>Software development and IT</span> </div> <div class="csa_jobadInfoMap" style="padding-top: 0;"> <a href="https://www.google.com/maps/place/3.1466337,101.6174378/" target="_blank"> <img src="data:image/jpeg;base64,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" alt="First Avenue, 8, 47800, Petaling Jaya, Malaysia"> </a> </div> </div> </div> <div class="clear"></div> </div> <div class="clear"></div> <br><br> DHI are the first people you should call when you have a tough challenge to solve in a water environment – be it a river, a reservoir, an ocean, a coastline, within a city or a factory. <br><br> Our knowledge of water environments is second-to-none. It represents 50 years of dedicated research and real-life experience from more than 140 countries. We strive to make this knowledge globally accessible to clients and partners by channelling it through our local teams and unique software. <br><br> Our world is water. So whether you need to save water, share it fairly, improve its quality, quantify its impact or manage its flow, we can help. Our knowledge, combined with our team's expertise and the power of our technology, holds the key to unlocking the right solution. <br><br> For more information please visit <a href="https://www.dhigroup.com">www.dhigroup.com</a> <div class="clear"></div> </div> </div> <style> #section_ae924485-5a6f-4ad9-a04e-b7989b5be605 .videoIframe , #section_ae924485-5a6f-4ad9-a04e-b7989b5be605.videoIframe { float: right; position: relative; width: 100%; padding-top: 56.25%; overflow: hidden; border-radius: 3px; margin-bottom: 30px; } #section_ae924485-5a6f-4ad9-a04e-b7989b5be605 .videoIframe iframe , #section_ae924485-5a6f-4ad9-a04e-b7989b5be605.videoIframe iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } #section_ae924485-5a6f-4ad9-a04e-b7989b5be605 .csa_jobadInfo , #section_ae924485-5a6f-4ad9-a04e-b7989b5be605.csa_jobadInfo { padding: 30px; border: 1px solid #ddd; border-radius: 3px; } #section_ae924485-5a6f-4ad9-a04e-b7989b5be605 .csa_jobadLeftLang , #section_ae924485-5a6f-4ad9-a04e-b7989b5be605.csa_jobadLeftLang { float: right; height: 50px; padding: 14px; overflow: hidden; border: 1px solid #eee; margin-left: 30px; box-sizing: border-box; } #section_ae924485-5a6f-4ad9-a04e-b7989b5be605 .css_headline , #section_ae924485-5a6f-4ad9-a04e-b7989b5be605.css_headline { font-weight: 400; } </style> <script> $(function() { $(".csa_jobadInfoItem:contains('Logo')").find('strong').remove(); }); </script> </div> </div> <div id="section_26393fb5-a17c-4589-a38b-6169f765d875" class="css_section"> <div class="css_section bottom"> <div class="css_holder"> <div class="bottom_table"> <div class="bottom_cell"> <strong>DHI A/S</strong><br /> Agern Alle 5<br /> 2970 Hørsholm<br /> Denmark<br /> hr-support@dhigroup.com<br /> </div> <div class="bottom_cell"> </div> <div class="bottom_cell bottom_social"> <a class="bottom_facebook" href="https://www.facebook.com/DHIgroup" target="_blank"></a> <a class="bottom_linkedin" href="https://www.linkedin.com/company/dhi" target="_blank"></a> <a class="bottom_youtube" href="https://www.youtube.com/user/DHIGroup" target="_blank"></a> </div> </div> </div> </div> <style> @media (max-width: 700px) { .bottom_table, .bottom_cell {display: block !important;} .bottom_cell:not(:first-child) {margin-top: 30px !important;} } </style> <style> #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom { background: #1d9a3f; color: #fff; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom a , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom a { color: #fff; text-decoration: none; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom a:hover , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom a:hover { text-decoration: underline; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_table , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_table { display: table; width: 100%; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_cell , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_cell { display: table-cell; vertical-align: top; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_phone, #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_phone, #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_mail , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_mail { height: 36px; background: url('/api/file/get/39d12231-06e0-41c5-bae9-f982451207bc') 0 5px no-repeat; padding: 0 0 0 36px; line-height: 37px; overflow: hidden; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_mail , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_mail { background-image: url('/api/file/get/1182e1bb-9042-4ddb-b93e-3b22d39fe9fd'); } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_social , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_social { width: 10px; font-size: 0px; white-space: nowrap; color: 000; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_facebook, #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_facebook, #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_instagram, #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_instagram, #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_linkedin, #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_linkedin, #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_youtube , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_youtube { display: inline-block; width: 40px; height: 40px; background: url('/img/careersite/perksbenefits/social_facebook.svg') 0 0 no-repeat; background-size: cover; margin: 16px 0 0 15px; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_facebook , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_facebook { margin-left: 0; } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_instagram , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_instagram { background-image: url('/img/careersite/perksbenefits/social_instagram.svg'); } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_linkedin , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_linkedin { background-image: url('/img/careersite/perksbenefits/social_linkedin.svg'); } #section_26393fb5-a17c-4589-a38b-6169f765d875 .bottom_youtube , #section_26393fb5-a17c-4589-a38b-6169f765d875.bottom_youtube { background-image: url('/img/careersite/perksbenefits/social_youtube.svg'); } </style> <script> </script> </div> </div> <div class="csl_bottom"> <style> .csl_bottom .css_holder { padding-top: 35px; padding-bottom: 35px; } @media (max-width: 795px) { .csl_bottom .css_holder { padding-top: 15px; padding-bottom: 15px; } } .csl_bottomPowered { transition: all 0.25s; float: left; width: 100%; display: block; height: 20px; line-height: 100px; background: url('/img/careersite/new_logo_poweredby.svg') 50% 50% no-repeat; overflow: hidden; } .csl_bottomPowered:hover { opacity: 1; filter: brightness(0) saturate(100%) invert(13%) sepia(48%) saturate(1860%) hue-rotate(186deg) brightness(95%) contrast(92%); } </style> <div class="css_holder"> <a lang="en-US" class="csl_bottomPowered" href="https://emply.com" target="_blank">Powered by Emply</a> <div class="clear"></div> </div> </div> </div> <div class="popup" role="dialog" id="popup_login" data-open-script="initLoginPopup()" style="display: none;"> <div class="holder"> <div class="content" style="width: 500px;"> <div id="showLoginDiv" class="showLogin"> <div role="dialog" aria-labelledby="login-title" aria-describedby="login-description" aria-modal="true" class="contentPadding"> <div id="login-title" class="headline marginBottom">Login</div> <div id="login-description" class="marginBottom">Have you applied for a job or created a job agent? Login below to show/change your preferences.</div> <div class="ui_login_email input icon marginBottom"> <input placeholder="Email" type="email" aria-required="true"> <div class="icon_holder" style="background-image: url('/img/icons/12/letter_bbbbbb.svg');"></div> </div> <div class="ui_login_names" style="display: none;"> <div class="ui_login_first_name input icon marginBottom"> <input placeholder="First Name" required> <div class="icon_holder" style="background-image: url('/img/icons/12/link_bbbbbb.svg');"></div> </div> <div class="ui_login_last_name input icon marginBottom"> <input placeholder="Last Name"> <div class="icon_holder" style="background-image: url('/img/icons/12/link_bbbbbb.svg');"></div> </div> </div> <div class="ui_login_password input icon marginBottomExtra"> <input type="password" placeholder="Password" aria-required="true"> <div class="icon_holder" style="background-image: url('/img/icons/12/key_bbbbbb.svg');"></div> </div> <div id="error-box" tabindex="0" role="alert" class="infomessage notallowed marginBottomExtra" hidden> Incorrect credentials </div> <a class="ui_login_login button" style="margin-right: 15px;" role="button" href="javascript:void(0);"> <span>Login</span> </a> <a class="button secondary" role="button" onClick="onForgotButtonClick()" href="javascript:void(0);"> <span>Forgot</span> </a> <a class="button cancel ui_popup_close" role="button" onClick="onMainCancelButtonClick()" href="javascript:void(0);"> <span>Cancel</span> </a> <div class="clear"></div> </div> </div> <div role="dialog" class="showForgot" style="display: none;"> <div aria-labelledby="forgot-title" aria-describedby="forgot-description" class="contentPadding"> <div id="forgot-title" class="headline marginBottom">Forgot Password</div> <div id="forgot-description" class="marginBottom"> Please fill in your email address if you have forgotten your password. We will send you an email with a link to create a new password. This link will be valid for 24 hours. </div> <div roll="form" class="showForgotForm"> <div class="ui_forgot_expired infomessage warning marginBottom" style="display: none;"> <span>Link to renewing your password has expired request a new link by entering your email below</span> <div class="clear"></div> </div> <div class="ui_forgot_email input icon"> <input type="email" aria-required="true" placeholder="Email"> <div class="icon_holder" style="background-image: url('/img/icons/12/letter_aaaaaa.svg');"></div> </div> <div class="ui_forgot_names" style="display: none;"> <div class="clear marginBottom"></div> <div class="ui_forgot_first_name input icon marginBottom"> <input placeholder="First Name"> <div class="icon_holder" style="background-image: url('/img/icons/12/link_aaaaaa.svg');"></div> </div> <div class="ui_forgot_last_name input icon"> <input placeholder="Last Name"> <div class="icon_holder" style="background-image: url('/img/icons/12/link_aaaaaa.svg');"></div> </div> </div> <div class="clear marginBottomExtra"></div> <a role="button" class="ui_forgot_renew button" href="javascript:void(0);"> <span>Renew</span> </a> <a role="button" class="button cancel" onClick="onForgotPasswordCancelClick()" href="javascript:void(0);"> <span>Cancel</span> </a> </div> <div class="showForgotSuccess" style="display: none;"> <div class="infomessage marginBottomExtra"> <span>Link to renewing your password is sent to your email.</span> <div class="clear"></div> </div> <div class="clear"></div> <a class="button secondary ui_popup_close" href="javascript:void(0);"> <span>Close</span> </a> </div> <div class="clear"></div> </div> </div> <div class="showSecure" style="display: none;"> <div class="contentPadding"> <div class="headline marginBottom">We have sent a security code to your e-mail.</div> <div class="showSecureForm"> <div class="ui_secure_code input icon"> <input placeholder="Code"> <div class="icon_holder" style="background-image: url('/img/icons/12/letter_aaaaaa.svg');"></div> </div> <div class="clear marginBottomExtra"></div> <a role="button" class="ui_secure_login button style="margin-right: 15px;" href="javascript:void(0);"> <span>Login</span> </a> <a role="button" class="button secondary" onClick="$('.showLogin, .showForgot').slideToggle(250);" href="javascript:void(0);"> <span>Forgot</span> </a> <a role="button" class="button cancel ui_popup_close" href="javascript:void(0);"> <span>Cancel</span> </a> </div> <div class="clear"></div> </div> </div> </div> </div> </div> <script> function initLoginPopup() { show('.showLogin'); hide('.showForgot'); hide('.showSecure'); hideBackgroundForElement("body-without-popups"); show('.showForgotForm') hide('.showForgotSuccess') hide('.ui_forgot_expired'); $('.ui_login_email input').val(''); $('.ui_login_first_name input').val(''); $('.ui_login_last_name input').val(''); $('.ui_login_password input').val(''); hide('.ui_login_names'); $('.ui_forgot_email input').val(''); $('.ui_forgot_first_name input').val(''); $('.ui_forgot_last_name input').val(''); $('.ui_secure_code input').val(''); hide('.ui_forgot_names'); setTimeout(() => { $('#showLoginDiv').attr('tabindex', '0').focus(); }); } function onMainCancelButtonClick() { $('.ui_login_button_popup').attr('tabindex', '0').focus(); showBackgroundForElement("body-without-popups"); hide('#error-box'); } function onForgotButtonClick() { $('.showLogin, .showForgot').slideToggle(250); hide('#error-box'); $('.showForgot').attr('tabindex', '0').focus(); } function onForgotPasswordCancelClick() { $('.showLogin, .showForgot').slideToggle(250); $('.showLogin').attr('tabindex', '0').focus(); } function openForgotPasswordWithExpired() { openPopup('popup_login'); hide('.showLogin'); hide('.showSecure'); show('.showForgot'); show('.ui_forgot_expired'); } function openSecureCodeMode() { hide('.showLogin'); hide('.showForgot'); show('.showSecure'); } function updateLoginButtonState(loggedIn, hasOnboarding) { if (loggedIn) { hide('.ui_login_button_popup'); if (hasOnboarding) { show('.ui_login_button_onboarding_profile'); hide('.ui_login_button_profile'); } else { hide('.ui_login_button_onboarding_profile'); show('.ui_login_button_profile'); } } else { show('.ui_login_button_popup'); hide('.ui_login_button_profile'); hide('.ui_login_button_onboarding_profile'); } } function show(selector) { $(selector).show(); } function hide(selector) { $(selector).hide(); } $(document).ready(function() { var loginInProgress = false; var forgotInProgress = false; var isSecureMode = false; //login status function hasLoginHash() { return window.location.hash && window.location.hash === '#login'; } function checkLoginHash() { if (hasLoginHash()) { openPopup('popup_login'); } } function checkCandidateLoggedIn() { $.ajax({ type: 'GET', contentType: 'application/json', url: '/api/integration/v2/candidate/logged-in', success: function (data) { updateLoginButtonState(data.candidateExists, data.hasOnboarding); if (!data.candidateExists) { checkLoginHash(); } }, error: function () { updateLoginButtonState(false); checkLoginHash(); } }); } checkCandidateLoggedIn(); //login function onLoginClick() { if (loginInProgress) { return; } loginInProgress = true; var loginData = { email: $('.ui_login_email input').val(), firstName: $('.ui_login_first_name input').val(), lastName: $('.ui_login_last_name input').val(), password: $('.ui_login_password input').val(), secureCode: isSecureMode ? $('.ui_secure_code input').val() : '' }; $.ajax({ type: 'POST', contentType: 'application/json', url: '/api/integration/v2/candidate/login', data: JSON.stringify(loginData), success: function (pageType) { if (pageType === 16) { openSecureCodeMode(); isSecureMode = true; loginInProgress = false; return; } if (pageType === 17) { isSecureMode = true; loginInProgress = false; return; } closePopup('popup_login'); const hasOnboarding = pageType === 14; updateLoginButtonState(true, hasOnboarding); window.location.href = hasOnboarding ? '/onboarding-profile' : '/profile'; loginInProgress = false; showBackgroundForElement("body-without-popups"); }, error: function(response) { if (response.status === 403 && response.responseJSON && response.responseJSON.requiresName) { show('.ui_login_names'); showErrorPopup('Enter first and last name to login'); } else { show('#error-box'); document.getElementById("error-box").focus(); } loginInProgress = false; } }); } $('.ui_login_login').click(onLoginClick); $('.ui_login_email input').on('enterKey', onLoginClick); $('.ui_login_password input').on('enterKey', onLoginClick); $('.ui_secure_login').click(onLoginClick); $('.ui_secure_code input').on('enterKey', onLoginClick); //forgot function onForgotClick() { if (forgotInProgress) { return; } forgotInProgress = true; var forgotData = { email: $('.ui_forgot_email input').val(), firstName: $('.ui_forgot_first_name input').val(), lastName: $('.ui_forgot_last_name input').val(), languageKey: 'en-GB' }; $.ajax({ type: 'POST', contentType: 'application/json', url: '/api/integration/v2/candidate/forgot-password', data: JSON.stringify(forgotData), success: function () { hide('.showForgotForm'); show('.showForgotSuccess'); forgotInProgress = false; }, error: function(response) { if (response.status === 403 && response.responseJSON && response.responseJSON.requiresName) { show('.ui_forgot_names'); showErrorPopup('Enter first name and last name'); } else { showErrorPopup('Incorrect e-mail'); } forgotInProgress = false; } }); } $('.ui_forgot_renew').click(onForgotClick); $('.ui_forgot_email input').on('enterKey', onForgotClick); }); </script> <div class="popup" id="popup_password" style="display: none;"> <div class="holder"> <div class="content" style="width: 500px;"> <div class="contentPadding"> <div class="headline marginBottom">Create password</div> <div class="ui_password_new_password input icon marginBottom"> <input type="password" placeholder="Password"> <div class="icon_holder" style="background-image: url('/img/icons/12/key_aaaaaa.svg');"></div> </div> <div class="ui_password_verify_password input icon marginBottomExtra"> <input type="password" placeholder="Verify password"> <div class="icon_holder" style="background-image: url('/img/icons/12/key_aaaaaa.svg');"></div> </div> <a class="ui_password_save button" style="margin-right: 15px;" href="javascript:void(0);"> <span>Save</span> </a> <div class="clear"></div> </div> </div> </div> </div> <script> $(document).ready(function() { var savePasswordInProgress = false; function getForgotCode() { return window.location.hash ? window.location.hash.replace('#newpassword/', '') : null; } function hasForgotCode() { return window.location.hash && window.location.hash.startsWith('#newpassword/') && getForgotCode(); } function setForgotCodeData() { $('#popup_password').attr('data-open-script', "document.getElementById('popup_password').setAttribute('data-code','" + getForgotCode() + "')"); } function getForgotCodeData() { return $('#popup_password').data('code'); } //check forgot code expiration function checkForgotCodeExpiration() { $.ajax({ type: 'GET', contentType: 'application/json', url: '/api/integration/v2/candidate/check-reset-code?code=' + getForgotCode(), success: function (data) { setForgotCodeData(); openPopup('popup_password'); }, error: function () { openForgotPasswordWithExpired(); } }); } if (hasForgotCode()) { checkForgotCodeExpiration(); } //save password function onSavePasswordClick() { if (savePasswordInProgress) { return; } if ($('.ui_password_new_password input').val() !== $('.ui_password_verify_password input').val()) { showErrorPopup('Passwords must match'); return; } savePasswordInProgress = true; var renewData = { code: getForgotCodeData(), password: $('.ui_password_new_password input').val() }; $.ajax({ type: 'POST', contentType: 'application/json', url: '/api/integration/v2/candidate/renew', data: JSON.stringify(renewData), success: function (pageType) { closePopup('popup_password'); const hasOnboarding = pageType === 14; updateLoginButtonState(true, hasOnboarding); window.location.href = hasOnboarding ? '/onboarding-profile' : '/profile'; savePasswordInProgress = false; }, error: function (error) { //todo: correct error message showErrorPopup(error.responseJSON.message); savePasswordInProgress = false; } }); } $('.ui_password_save').click(onSavePasswordClick); $('.ui_password_new_password input').on('enterKey', onSavePasswordClick); $('.ui_password_verify_password input').on('enterKey', onSavePasswordClick); }); </script> <div class="popup" id="popup_delete" data-open-script="initDeletePopup()" style="display: none;"> <div class="holder"> <div id="popup_delete_content" class="content"> <div class="contentPadding"> <div class="headline marginBottom"> Do you want to delete? </div> <div style="margin-bottom: 25px;"> If you delete, all related data will be lost. </div> <a class="button warning ui_popup_delete_confirm" href="javascript:void(0);"> <span>Delete</span> </a> <a class="button cancel ui_popup_delete_cancel" href="javascript:void(0);"> <span>Do not delete</span> </a> <div class="clear"></div> </div> </div> </div> </div> <script> var deleteConfirmCallback = null; function initDeletePopup() { hideBackgroundForElement("body-without-popups"); } function showDeleteConfirm(callback) { deleteConfirmCallback = callback; openPopup('popup_delete'); $('#popup_delete_content').attr('tabindex', '0').focus(); } $(document).ready(function () { $('.ui_popup_delete_confirm').click(function () { deleteConfirmCallback(); deleteConfirmCallback = null; closePopup('popup_delete'); showBackgroundForElement("body-without-popups"); }); $('.ui_popup_delete_cancel').click(function () { deleteConfirmCallback = null; closePopup('popup_delete'); showBackgroundForElement("body-without-popups"); }); }); </script> <div class="popup" id="popup_error" style="display: none;"> <div class="holder"> <div class="content"> <div class="contentPadding"> <div class="headline marginBottom"> Error </div> <div class="infomessage notallowed marginBottomExtra" style="margin-bottom: 25px;"> <span class="ui_error_message">Unknown error</span> <div class="clear"></div> </div> <a class="button secondary ui_popup_close" href="javascript:void(0);"> <span>Close</span> </a> <div class="clear"></div> </div> </div> </div> </div> <script> function showErrorPopup(message) { $('.ui_error_message').text(message); openPopup('popup_error'); } </script> </body> </html>