1 <!DOCTYPE html> 2<html lang="en-US"> 3 <head> 4 <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=1"/> 6 <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 7 <meta http-equiv="cache-control" content="no-cache,no-store"/> 8 <meta http-equiv="pragma" content="no-cache"/> 9 <meta http-equiv="expires" content="-1"/> 10 <meta name='mswebdialog-title' content='Connecting to Högskolan Väst'/> 11 12 <title>Sign In</title> 13
13<script type='text/javascript'> 14//<![CDATA[ 15function LoginErrors(){this.userNameFormatError = 'Enter your user ID in the format \u0026quot;domain\\user\u0026quot; or \u0026quot;user@domain\u0026quot;.'; this.passwordEmpty = 'Enter your password.'; this.passwordTooLong = 'Password is too long (\u0026gt; 128 characters).';}; var maxPasswordLength = 128; 16//]]> 17</script>
17 18
19<script type='text/javascript'> 20//<![CDATA[ 21// Copyright (c) Microsoft Corporation. All rights reserved. 22function InputUtil(errTextElementID, errDisplayElementID, errTextPasswordElementID, errPasswordDisplayElementID, errTextOptionElementID, errOptionDisplayElementID) { 23 24 if (!errTextElementID) errTextElementID = 'errorText'; 25 if (!errTextPasswordElementID) errTextPasswordElementID = 'errorTextPassword'; 26 if (!errTextOptionElementID) errTextOptionElementID = 'errorTextOption'; 27 if (!errDisplayElementID) errDisplayElementID = 'error'; 28 if (!errPasswordDisplayElementID) errPasswordDisplayElementID = 'errorPassword'; 29 if (!errOptionDisplayElementID) errOptionDisplayElementID = 'errorOption'; 30 31 this.hasFocus = false; 32 this.errLabel = document.getElementById(errTextElementID); 33 this.errDisplay = document.getElementById(errDisplayElementID); 34 this.errPassLabel = document.getElementById(errTextPasswordElementID); 35 this.errPassDisplay = document.getElementById(errPasswordDisplayElementID); 36 this.errOptionLabel = document.getElementById(errTextOptionElementID); 37 this.errOptionDisplay = document.getElementById(errOptionDisplayElementID); 38}; 39InputUtil.prototype.canDisplayError = function () { 40 return (this.errLabel && this.errDisplay) || (this.errPassLabel && this.errPassDisplay) || (this.errOptionLabel && this.errOptionDisplay); 41} 42InputUtil.prototype.checkError = function () { 43 if (!this.canDisplayError){ 44 throw new Error ('Error element not present'); 45 } 46 47 var hasUserError = false; 48 var hasPassError = false; 49 var hasOptionError = false; 50 var cause; 51 52 if (this.errLabel && this.errLabel.innerHTML) { 53 this.errDisplay.style.display = ''; 54 cause = this.errLabel.getAttribute('for'); 55 hasUserError = true; 56 } 57 58 if (this.errPassLabel && this.errPassLabel.innerHTML) 59 { 60 this.errPassDisplay.style.display = ''; 61 cause = this.errPassLabel.getAttribute('for'); 62 hasPassError = true; 63 } 64 65 if (this.errOptionLabel && this.errOptionLabel.innerHTML) { 66 this.errOptionDisplay.style.display = ''; 67 cause = this.errOptionLabel.getAttribute('for'); 68 hasOptionError = true; 69 } 70 71 if (cause) { 72 var causeNode = document.getElementById(cause); 73 if (causeNode && causeNode.value) { 74 causeNode.focus(); 75 this.hasFocus = true; 76 } 77 } 78 79 if (!hasUserError) { 80 if (this.errLabel && this.errLabel.innerHTML) { 81 this.errDisplay.style.display = 'none'; 82 } 83 } 84 85 if (!hasPassError) { 86 if (this.errPassLabel && this.errPassLabel.innerHTML) { 87 this.errPassDisplay.style.display = 'none'; 88 } 89 } 90 91 if (!hasOptionError) { 92 if (this.errOptionLabel && this.errOptionLabel.innerHTML) { 93 this.errOptionDisplay.style.display = 'none'; 94 } 95 } 96}; 97InputUtil.prototype.clearError = function() { 98 if (!this.canDisplayError) { 99 throw new Error('Error element not present'); 100 } 101 102 if (this.errLabel && this.errLabel.innerHTML) { 103 this.errLabel.innerHTML = ''; 104 this.errDisplay.style.display = 'none'; 105 } 106 107 if (this.errPassLabel && this.errPassLabel.innerHTML) { 108 this.errPassLabel.innerHTML = ''; 109 this.errPassDisplay.style.display = 'none'; 110 } 111 112 if (this.errOptionLabel && this.errOptionLabel.innerHTML) { 113 this.errOptionLabel.innerHTML = ''; 114 this.errOptionDisplay.style.display = 'none'; 115 } 116}; 117InputUtil.prototype.setInitialFocus = function (input) { 118 if (this.hasFocus) return; 119 var node = document.getElementById(input); 120 if (node) { 121 if ((/^\s*$/).test(node.value)) { 122 node.focus(); 123 this.hasFocus = true; 124 } 125 } 126}; 127InputUtil.prototype.setError = function (input, errorMsg, password) { 128 if (!this.canDisplayError) { 129 throw new Error('Error element not present'); 130 } 131 input.focus(); 132 133 if (errorMsg) { 134 if (password) { 135 this.errPassLabel.innerHTML = errorMsg; 136 this.errPassDisplay.style.display = ''; 137 } else { 138 this.errLabel.innerHTML = errorMsg; 139 this.errDisplay.style.display = ''; 140 } 141 } 142 143 if (password) { 144 this.errPassLabel.setAttribute('for', input.id); 145 this.errPassDisplay.style.display = ''; 146 } else { 147 this.errLabel.setAttribute('for', input.id); 148 this.errDisplay.style.display = ''; 149 } 150}; 151InputUtil.makePlaceholder = function (input) { 152 var ua = navigator.userAgent; 153 154 if (ua != null && 155 (ua.match(/MSIE 9.0/) != null || 156 ua.match(/MSIE 8.0/) != null || 157 ua.match(/MSIE 7.0/) != null)) { 158 var node = document.getElementById(input); 159 if (node) { 160 var placeholder = node.getAttribute("placeholder"); 161 if (placeholder != null && placeholder != '') { 162 var label = document.createElement('input'); 163 label.type = "text"; 164 label.value = placeholder; 165 label.readOnly = true; 166 label.style.position = 'absolute'; 167 label.style.borderColor = 'transparent';
168 label.className = node.className + ' hint'; 169 label.tabIndex = -1; 170 label.onfocus = function () { this.nextSibling.focus(); }; 171 172 node.style.position = 'relative'; 173 node.parentNode.style.position = 'relative'; 174 node.parentNode.insertBefore(label, node); 175 node.onkeyup = function () { InputUtil.showHint(this); }; 176 node.onblur = function () { InputUtil.showHint(this); }; 177 node.style.background = 'transparent'; 178 179 node.setAttribute("placeholder", ""); 180 InputUtil.showHint(node); 181 } 182 } 183 } 184}; 185InputUtil.focus = function (inputField) { 186 var node = document.getElementById(inputField); 187 if (node) node.focus(); 188}; 189InputUtil.hasClass = function(node, clsName) { 190 return node.className.match(new RegExp('(\\s|^)' + clsName + '(\\s|$)')); 191}; 192InputUtil.addClass = function(node, clsName) { 193 if (!this.hasClass(node, clsName)) node.className += " " + clsName; 194}; 195InputUtil.removeClass = function(node, clsName) { 196 if (this.hasClass(node, clsName)) { 197 var reg = new RegExp('(\\s|^)' + clsName + '(\\s|$)'); 198 node.className = node.className.replace(reg, ' '); 199 } 200}; 201InputUtil.showHint = function (node, gotFocus) { 202 if (node.value && node.value != '') { 203 node.previousSibling.style.display = 'none'; 204 } 205 else { 206 node.previousSibling.style.display = ''; 207 } 208}; 209InputUtil.updatePlaceholder = function (input, placeholderText) { 210 var node = document.getElementById(input); 211 if (node) { 212 var ua = navigator.userAgent; 213 if (ua != null && 214 (ua.match(/MSIE 9.0/) != null || 215 ua.match(/MSIE 8.0/) != null || 216 ua.match(/MSIE 7.0/) != null)) { 217 var label = node.previousSibling; 218 if (label != null) { 219 label.value = placeholderText; 220 } 221 } 222 else { 223 node.placeholder = placeholderText; 224 } 225 } 226}; 227 228//]]> 229</script>
229 230
231<script type='text/javascript'> 232//<![CDATA[ 233/* 234 * Copyright (c) Microsoft Corporation. All rights reserved. 235 * 236 * Description: Functions to perform login page pagination 237 * 238 */ 239 240PaginationUtil = { 241 /* 242 * Helper to extract a query parameter. Taken from Main_Browser.js 243 * 244 * param: Name of the parameter to extract. 245 * returns: The query parameter value if it PaginationUtil.exists otherwise it returns 246 * an empty string. 247 */ 248 ExtractQSParam: function (param) { 249 var sQS = document.location.search.toLowerCase(); 250 if (sQS) 251 sQS = sQS.substr(1); 252 return PaginationUtil.ExtractToken(sQS, param.toLowerCase(), "&", "=", ""); 253 }, 254 255 /* 256 * Extract a specific token from a string. 257 * 258 * Args: 259 * sString - the full string 260 * sName - the name of the token 261 * sDelim - the token delimiter (default '&') 262 * sSep - the name=value pair separator (default '=') 263 * 264 * Returns: string 265 * the value of the token if PaginationUtil.exists 266 * null otherwise 267 */ 268 ExtractToken: function (sString, sName, sDelim, sSep, sDefault) { 269 sDelim = PaginationUtil.valOrDefault(sDelim, "&"); 270 sSep = PaginationUtil.valOrDefault(sSep, "="); 271 var value = PaginationUtil.valOrDefault(sDefault, null); 272 273 if (!sString) 274 return value; 275 276 var start = sString.indexOf(sName + sSep); 277 278 if (0 == start) { 279 start += sName.length + 1; 280 } 281 else if (0 < start) { 282 start = sString.indexOf(sDelim + sName + sSep); 283 if (0 < start) { start += sDelim.length + sName.length + 1; } 284 } 285 286 if (-1 != start) { 287 var end = sString.indexOf(sDelim, start); 288 if (-1 == end) { end = sString.length; } 289 value = sString.substring(start, end); 290 } 291 292 return value; 293 }, 294 295 // Helper to handle supporting default values. 296 valOrDefault: function (oVal, oDefault) { 297 return ((PaginationUtil.exists(oVal)) ? oVal : oDefault); 298 }, 299 300 // Helper for testing existence. 301 exists: function (v) { 302 return ((v) ? true : (v == 0 || v == false || v == "")); 303 } 304} 305 306PaginationManager = { 307 308 /* 309 * Initialize state 310 * 'options' is an object with extra options to use. An example: 311 * { 312 * pages: ["usernamePage", "primaryOptionsPage", "passwordPage"], // required 313 * currentPageIndex: 0 // optional - default 0 314 * } 315 */ 316 Initialize: function (options) { 317 this.options = options || { pages: ["usernamePage", "primaryOptionsPage", "passwordPage"], currentPageIndex: 0 }; 318 this.debugMode = PaginationUtil.ExtractQSParam('debugMode').toLowerCase(); 319 320 var pageElements = []; 321 for (var i = 0; i < this.options.pages.length; i++) { 322 pageElements.push(document.getElementById(this.options.pages[i])); 323 } 324 325 this.options.pages = pageElements; 326 this.initializePageDisplayedElements(); 327 }, 328 329 initializePageDisplayedElements: function() { 330 _self = this; 331 332 // Hide the back button on pages that can't go back 333 if (_self.options.pages && _self.options.pages[0]) { 334 var passwordBack = document.getElementById("backButtonArea"); 335 var optionsBack = document.getElementById("optionsBackButtonArea"); 336 337 if (passwordBack && _self.options.pages[0].id === "passwordPage") { 338 passwordBack.style.display = "none"; 339 var submitButton = document.getElementById("submitButton"); 340 if (submitButton && submitButton.classList) { 341 submitButton.classList.remove("rightHalfWidthButton"); 342 } 343 } 344 345 if (optionsBack && _self.options.pages[0].id === "primaryOptionsPage") { 346 optionsBack.style.display = "none"; 347 } 348 } 349 350 // Hide all pages, and display the start page
351 _self.adjustElementDisplay(_self.options.pages, "none"); 352 _self.adjustElementDisplay([_self.options.pages[_self.options.currentPageIndex]], "block"); 353 _self.setFocus(); 354 }, 355 356 adjustElementDisplay: function (elementList, display) 357 { 358 for ( var i = 0; i < elementList.length; i++ ) 359 { 360 if ( elementList[i] && elementList[i].style ) 361 { 362 elementList[i].style.display = display; 363 } 364 } 365 }, 366 367 isValidIndex: function (index, arrayLength) { 368 if (arrayLength <= 0 || index < 0) { 369 return false; 370 } 371 372 if (index <= arrayLength - 1) { 373 return true; 374 } 375 }, 376 377 displayPage: function (args) { 378 var _self = this; 379 if (_self.options.pages && _self.options.pages.length > 0) { 380 var exp = 0; 381 if (args && args.backwards) { 382 exp = 1; 383 } 384 var pageToHideIndex = _self.options.currentPageIndex; 385 if (_self.isValidIndex(_self.options.currentPageIndex + Math.pow(-1, exp), _self.options.pages.length)) { 386 _self.options.currentPageIndex = _self.options.currentPageIndex + Math.pow(-1, exp); 387 _self.redrawPages(pageToHideIndex, _self.options.currentPageIndex); 388 } else { 389 if (_self.debugMode && console && console.log) { 390 console.log("[ADFS]: Attempted to navigate to an invalid page index"); 391 } 392 } 393 } 394 }, 395 396 updatePagesWithUsername: function (username) { 397 var idBanner = document.getElementById("identityBanner"); 398 var formUsernameInput = document.getElementById("userNameInputHolder"); 399 var optionsUsernameInput = document.getElementById("userNameInputOptionsHolder"); 400 var idBannerOptionsPage = document.getElementById("identityBannerOptions"); 401 var kmsiHolder = document.getElementById("kmsiHolder"); 402 var kmsiInput = document.getElementById("kmsiInput"); 403 404 if (idBanner) { 405 idBanner.innerText = username; 406 } 407 408 if (idBannerOptionsPage) { 409 idBannerOptionsPage.innerText = username; 410 } 411 412 if (formUsernameInput) { 413 formUsernameInput.value = username; 414 } 415 416 if (optionsUsernameInput) { 417 optionsUsernameInput.value = username; 418 } 419 420 if (kmsiInput && kmsiHolder) { 421 kmsiHolder.value = kmsiInput.value; 422 } 423 }, 424 425 validateAndNext: function () { 426 var u = new InputUtil(); 427 var e = new LoginErrors(); 428 429 var userName = document.getElementById(Login.userNameInput); 430 431 if (!userName.value || !userName.value.match('[@\\\\]')) { 432 u.setError(userName, e.userNameFormatError); 433 return false; 434 } 435 436 _self.updatePagesWithUsername(userName.value); 437 u.clearError(); 438 439 if (_self.options.currentPageIndex + 1 >= _self.options.pages.length) { 440 // POST back to ADFS since there are no more pages to go to 441 document.forms['loginFormPaginated'].submit(); 442 return true; 443 } else { 444 _self.displayNextPage(); 445 } 446 447 return true; 448 }, 449 450 displayNextPage: function () { 451 _self = this; 452 _self.displayPage({ backwards: false }); 453 }, 454 455 displayPreviousPage: function () { 456 _self = this; 457 var u = new InputUtil(); 458 u.clearError(); 459 _self.displayPage({ backwards: true }); 460 }, 461 462 redrawPages: function (pageToHideIndex, pageToShowIndex) { 463 _self = this; 464 _self.adjustElementDisplay([_self.options.pages[pageToHideIndex]], "none"); 465 _self.adjustElementDisplay([_self.options.pages[pageToShowIndex]], "block"); 466 _self.setFocus(); 467 }, 468 469 setFocus: function () { 470 var usernameInput = document.getElementById(Login.userNameInput); 471 var passwordInput = document.getElementById(Login.passwordInput); 472 var optionInput = document.getElementsByClassName("optionButton"); 473 474 if (usernameInput && _self.options.pages[_self.options.currentPageIndex] && _self.options.pages[_self.options.currentPageIndex].id === "usernamePage") { 475 usernameInput.focus(); 476 } else if (passwordInput && _self.options.pages[_self.options.currentPageIndex] && _self.options.pages[_self.options.currentPageIndex].id === "passwordPage") { 477 passwordInput.focus(); 478 } 479 else if (optionInput && optionInput.length > 0 && _self.options.pages[_self.options.currentPageIndex] && _self.options.pages[_self.options.currentPageIndex].id === "primaryOptionsPage") { 480 optionInput[0].focus(); 481 } 482 } 483}; 484 485var paginationManager = PaginationManager; 486 487 488//]]> 489</script>
489 490
491<script type='text/javascript'> 492//<![CDATA[ 493LoginManager = { 494 initialize: function () { 495 var u = new InputUtil(); 496 497 this.userNameInput = 'userNameInput'; 498 this.userNameInputHolder = 'userNameInputHolder'; 499 this.passwordInput = 'passwordInput'; 500 501 u.checkError(); 502 u.setInitialFocus(Login.userNameInput); 503 u.setInitialFocus(Login.passwordInput); 504 }, 505 506 submitLoginRequest: function () { 507 var u = new InputUtil(); 508 var e = new LoginErrors(); 509 510 var userName = document.getElementById(Login.userNameInput); 511 var userNamePaginated = document.getElementById(Login.userNameInputHolder); 512 var password = document.getElementById(Login.passwordInput); 513 514 if (!userName && userNamePaginated) { 515 userName = userNamePaginated; 516 } 517 518 if (!userName.value || !userName.value.match('[@\\\\]')) { 519 u.setError(userName, e.userNameFormatError); 520 return false; 521 } 522 523 if (!password.value) { 524 u.setError(password, e.passwordEmpty, true); 525 return false; 526 } 527 528 if (password.value.length > maxPasswordLength) { 529 u.setError(password, e.passwordTooLong, true); 530 return false; 531 } 532 533 document.forms['loginForm'].submit(); 534 return false; 535 } 536}; 537var Login = LoginManager; 538Login.initialize(); 539InputUtil.makePlaceholder(Login.userNameInput); 540InputUtil.makePlaceholder(Login.passwordInput); 541//]]> 542</script>
542 543 544 545 546 <link rel="stylesheet" type="text/css" href="/adfs/portal/css/style.css?id=3EC48654E517DC9E6F4B5B7A05BD0ACD52EF68DC860A2EA6F0216FB789FBEA6C" /><style>.illustrationClass {background-image:url(/adfs/portal/illustration/illustration.jpg?id=398B470934A884611E11C20C352E96B737A0B56B511AA8461D5E9B241B1FF5AC);}</style> 547 548 </head> 549 <body dir="ltr" class="body"> 550 <div id="noScript" style="position:static; width:100%; height:100%; z-index:100"> 551 <h1>JavaScript required</h1> 552 <p>JavaScript is required. This web browser does not support JavaScript or JavaScript in this web browser is not enabled.</p> 553 <p>To find out if your web browser supports JavaScript or to enable JavaScript, see web browser help.</p> 554 </div> 555
555<script type="text/javascript" language="JavaScript"> 556 document.getElementById("noScript").style.display = "none"; 557 </script>
557 558 <div id="fullPage"> 559 <div id="brandingWrapper" class="float"> 560 <div id="branding"></div> 561 </div> 562 <div id="contentWrapper" class="float"> 563 <div id="content"> 564 <div id="header"> 565 <img class='logoImage' id='companyLogo' src='/adfs/portal/logo/logo.jpg?id=6D1437EEFACE17D171CC216186B230B253B417C82C5C6B0A3A734A9F4099BB3E' alt='Högskolan Väst'/> 566 </div> 567 <main> 568 <div id="workArea"> 569 570 <div id="authArea" class="groupMargin"> 571 572 573 <div id="loginArea"> 574 <div id="usernamePage"> 575 <div id="loginMessage" class="groupMargin">Sign in</div> 576 <form method="post" id="loginFormPaginated" class="paginatedPageForm" autocomplete="off" novalidate="novalidate" onKeyPress="if (event && event.keyCode == 13) event.preventDefault();" action="/adfs/ls/?wtrealm=https%3A%2F%2Fwww.hv.se&wctx=WsFedOwinState%3D5y-uuPy_xAmRlNYqROITgKFc8mMeS0tQqSjGXMWZrwW6Nxw2tqw7iUoWmM5mdC2zXyaw-zENRtQdrd21zTWH99gxtK5aabT-fmoh2QO5SQtK80ViHrwuZ-oAeuiV_Jf3pSSuAd7wSZebYAOZuMFkjQ&wa=wsignin1.0&wreply=https%3A%2F%2Fwww.hv.se&client-request-id=083fbd65-8139-4810-de42-0080000000bc"> 577 <div id="formsAuthenticationArea"> 578 <div id="userNameArea"> 579 <label id="userNameInputLabel" for="userNameInput" class="hidden">User Account</label> 580 <input id="userNameInput" name="UserName" type="email" value="" tabindex="1" class="text textPaginated fullWidth" onKeyPress="if (event && event.keyCode == 13) paginationManager.validateAndNext();" 581 spellcheck="false" placeholder="[email protected]" autocomplete="off"/> 582 </div> 583 <div id="error" class="fieldMargin error errorUsernamePaginated smallText"> 584 <span id="errorText" for="" class="errorText" aria-live="assertive" role="alert"></span> 585 </div> 586 <div id="introduction" class="groupMargin signInIntroduction"> 587 <span style='font-size: 16px; line-height: 2; display: block;'>Use your username to log in<br /><br />Example:<br />[email protected] (Student)<br />[email protected] (Employees)</span> 588 </div> 589 <div id="kmsiArea" class="kmsiAreaPaginated" style="display:none"> 590 <input type="checkbox" name="Kmsi" id="kmsiInput" value="true" tabindex="2"/> 591 <label for="kmsiInput">Keep me signed in</label> 592 </div> 593 </div> 594 </form> 595 <div id="nextButtonArea"> 596 <span id="nextButton" class="next" tabindex="0" role="button" 597 onKeyPress="if (event && (event.keyCode == 32 || event.keyCode == 13)) paginationManager.validateAndNext();" 598 onclick="return paginationManager.validateAndNext();">Next</span> 599 </div> 600</div> 601 602 603 <div id="passwordPage"> 604 <div id="passwordBannerContainer" class="bannerContainer"> 605 <div id="backButton" class="back" tabindex="0" role="button" 606 onKeyPress="if (event && (event.keyCode == 32 || event.keyCode == 13)) paginationManager.displayPreviousPage();" 607 onclick="return paginationManager.displayPreviousPage();" aria-label="Back"> 608 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2048 2048" width="15" height="15" fill="currentColor" style="margin-top: 5Px;"> 609 <path d="M2048 960q0 26-19 45t-45 19H219l786 787q19 19 19 45t-19 45-45 19q-26 0-45-19L22 1008q-11-11-16-22t-6-26q0-15 5-26t17-22L915 19q19-19 45-19t45 19 19 45q0 26-19 45L219 896h1765q26 0 45 19t19 45z"></path> 610 </svg> 611 </div> 612 <div id="identityBanner" class="identityBanner"></div> 613 </div> 614 <div id="formsAuthenticationAreaPassword"> 615 <form method="post" id="loginForm" autocomplete="off" class="paginatedPageForm" novalidate="novalidate" onKeyPress="if (event && event.keyCode == 13) return Login.submitLoginRequest();" action="/adfs/ls/?wtrealm=https%3A%2F%2Fwww.hv.se&wctx=WsFedOwinState%3D5y-uuPy_xAmRlNYqROITgKFc8mMeS0tQqSjGXMWZrwW6Nxw2tqw7iUoWmM5mdC2zXyaw-zENRtQdrd21zTWH99gxtK5aabT-fmoh2QO5SQtK80ViHrwuZ-oAeuiV_Jf3pSSuAd7wSZebYAOZuMFkjQ&wa=wsignin1.0&wreply=https%3A%2F%2Fwww.hv.se&client-request-id=083fbd65-8139-4810-de42-0080000000bc"> 616 <input id="userNameInputHolder" name="UserName" value="" type="hidden"/> 617 <input id="kmsiHolder" name="Kmsi" value="" type="hidden"/> 618 <input id="formsAuthMethod" type="hidden" name="AuthMethod" value="FormsAuthentication"/> 619 <div id="passwordArea"> 620 <label id="passwordInputLabel" for="passwordInput" class="hidden">Password</label> 621 <input id="passwordInput" name="Password" type="password" tabindex="0" class="text textPaginated fullWidth" 622 placeholder="Password" autocomplete="off"/> 623 </div>
624 <span id="submitButton" class="submit submitPaginated" tabindex="0" role="button" 625 onKeyPress="if (event && (event.keyCode == 32 || event.keyCode == 13)) Login.submitLoginRequest();" 626 onclick="return Login.submitLoginRequest();">Sign in</span> 627 </form> 628 <div id="errorPassword" class="fieldMargin error smallText"> 629 <span id="errorTextPassword" for="" class="errorText" aria-live="assertive" role="alert"></span> 630 </div> 631 </div> 632</div> 633 634 635
635<script type="text/javascript"> 636 var options = { 637 pages: ["usernamePage","passwordPage"], 638 currentPageIndex: 0 639 }; 640 paginationManager.Initialize(options); 641 </script>
641 642</div> 643 644 </div> 645 646 </div> 647 </main> 648 <div id="footerPlaceholder"></div> 649 </div> 650 <footer id="footer"> 651 <div id="footerLinks" class="floatReverse"> 652 <div><span id="copyright">© 2018 Microsoft</span><a id="home" class="pageLink footerLink " href="https://www.hv.se">www.hv.se</a><a id="privacy" class="pageLink footerLink" href="https://www.hv.se/om-webbplatsen/integritetspolicy/">Dataskyddsförordningen - GDPR</a><a id="helpDesk" class="pageLink footerLink" href="https://mittkonto.hv.se/">Forgot your username and/or password?</a></div> 653 </div> 654 </footer> 655 </div> 656 </div> 657
657<script type='text/javascript'> 658//<![CDATA[ 659// HVLoginPage onload.js (AD FS 2019+) 660// Safe for Paginated (Identifier-first) + Classic UI + WCAG 2.1 661(function () { 662 "use strict"; 663 664 var CONFIG = { 665 netbiosDomain: "WAD", 666 desiredUsernamePlaceholder: "Username", 667 desiredPasswordPlaceholder: "Password", 668 debug: false 669 }; 670 671 function log() { 672 if (!CONFIG.debug || !window.console) return; 673 try { console.log.apply(console, arguments); } catch (e) { } 674 } 675 676 function $(id) { return document.getElementById(id); } 677 678 function safeAddEvent(el, evt, handler, capture) { 679 if (!el || !el.addEventListener) return; 680 el.addEventListener(evt, handler, !!capture); 681 } 682 683 // Normalize sAMAccountName -> DOMAIN\sAMAccountName 684 function shouldPrefix(value) { 685 if (!value) return false; 686 return value.indexOf("@") < 0 && value.indexOf("\\") < 0; 687 } 688 689 function normalizeUsernameField() { 690 var input = $("userNameInput"); 691 if (!input) return false; 692 693 var v = (input.value || "").trim(); 694 if (!v) return false; 695 696 if (shouldPrefix(v)) { 697 input.value = CONFIG.netbiosDomain + "\\" + v; 698 log("[HV] Normalized username =>", input.value); 699 return true; 700 } 701 return false; 702 } 703 704 // Enforce Placeholders and ARIA Attributes for WCAG / Screen Readers 705 function applyAccessibilityAndPlaceholders() { 706 var u = $("userNameInput"); 707 if (u) { 708 if (u.getAttribute("placeholder") !== CONFIG.desiredUsernamePlaceholder) { 709 u.setAttribute("placeholder", CONFIG.desiredUsernamePlaceholder); 710 } 711 if (!u.getAttribute("aria-label")) { 712 u.setAttribute("aria-label", CONFIG.desiredUsernamePlaceholder); 713 } 714 } 715 716 var p = $("passwordInput") || document.querySelector('input[type="password"]'); 717 if (p) { 718 if (p.getAttribute("placeholder") !== CONFIG.desiredPasswordPlaceholder) { 719 p.setAttribute("placeholder", CONFIG.desiredPasswordPlaceholder); 720 } 721 if (!p.getAttribute("aria-label")) { 722 p.setAttribute("aria-label", CONFIG.desiredPasswordPlaceholder); 723 } 724 } 725 726 // Fix for Next/Submit button screen reader accessibility 727 var btn = findContinueButton(); 728 if (btn) { 729 if (!btn.getAttribute("aria-label")) { 730 btn.setAttribute("aria-label", "Next"); 731 } 732 if (!btn.getAttribute("role")) { 733 btn.setAttribute("role", "button"); 734 } 735 } 736 } 737 738 // DOM Reordering for Footer/Helpdesk (ensures correct Tab order for screen readers) 739 function reorderFooterDom() { 740 var footer = $("footer"); 741 var opening = $("opening") || $("helpDesk"); 742 var forgot = $("forgotPassword") || $("forgotPasswordLink"); 743 744 if (footer && opening && opening.parentNode !== footer) { 745 footer.insertBefore(opening, footer.firstChild); 746 } 747 if (footer && forgot && forgot.parentNode !== footer) { 748 if (opening && opening.nextSibling) { 749 footer.insertBefore(forgot, opening.nextSibling); 750 } else { 751 footer.appendChild(forgot); 752 } 753 } 754 } 755 756 // Event Handlers 757 function findContinueButton() { 758 return $("nextButton") || $("submitButton") || null; 759 } 760 761 function handleEnterInUsername(e) { 762 e = e || window.event; 763 var isEnter = (e.key === "Enter") || (e.keyCode === 13); 764 if (!isEnter) return; 765 766 var u = $("userNameInput"); 767 if (!u || document.activeElement !== u) return; 768 769 var changed = normalizeUsernameField(); 770 if (!changed) return; 771 772 if (e.preventDefault) e.preventDefault(); 773 if (e.stopPropagation) e.stopPropagation(); 774 e.returnValue = false; 775 776 setTimeout(function () { 777 try { 778 var btn = findContinueButton(); 779 if (btn && typeof btn.click === "function") { 780 btn.click(); 781 } 782 } catch (ex) { 783 log("[HV] Enter continue failed:", ex); 784 } 785 }, 0); 786 787 return false; 788 } 789 790 function wireHandlers() { 791 var u = $("userNameInput"); 792 if (u && !u.getAttribute("data-hv-wired")) { 793 u.setAttribute("data-hv-wired", "1"); 794 safeAddEvent(u, "blur", normalizeUsernameField); 795 safeAddEvent(u, "change", normalizeUsernameField); 796 safeAddEvent(u, "keydown", handleEnterInUsername, true); 797 } 798 799 var next = $("nextButton"); 800 if (next && !next.getAttribute("data-hv-wired")) { 801 next.setAttribute("data-hv-wired", "1"); 802 safeAddEvent(next, "click", normalizeUsernameField, true); 803 } 804 805 var submit = $("submitButton"); 806 if (submit && !submit.getAttribute("data-hv-wired")) { 807 submit.setAttribute("data-hv-wired", "1"); 808 safeAddEvent(submit, "click", normalizeUsernameField, true); 809 } 810 } 811 812 // Single unified Observer for Paginated UI 813 function observeDom() { 814 if (window.__hvDomObserver) return; 815 try { 816 if (!window.MutationObserver) return; 817 818 window.__hvDomObserver = new MutationObserver(function () { 819 applyAccessibilityAndPlaceholders(); 820 reorderFooterDom(); 821 wireHandlers(); 822 }); 823 824 window.__hvDomObserver.observe(document.body || document.documentElement, { 825 childList: true, 826 subtree: true, 827 attributes: true, 828 attributeFilter: ["placeholder"] 829 }); 830 } catch (e) { 831 // fail silent 832 } 833 } 834 835 function start() { 836 applyAccessibilityAndPlaceholders(); 837 reorderFooterDom(); 838 wireHandlers(); 839 observeDom(); 840 normalizeUsernameField(); 841 log("[HV] onload.js initialized cleanly with accessibility enhancements"); 842 } 843 844 if (document.readyState === "loading") { 845 document.addEventListener("DOMContentLoaded", start); 846 } else { 847 start(); 848 } 849})(); 850//]]> 851</script>
851 852 853 854 </body> 855</html> 856
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.