1/// <reference path="~/Scripts/External/jquery.ui.autocomplete.js" /> 2/// <reference path="~/Scripts/External/jquery-ui.min.js" /> 3 4"use strict"; 5if (typeof (AIS) !== "object") { var AIS = new Object(); } 6 7AIS.Mobile = function () { 8 var openMenu = false; 9 function toggleMenu() { 10 document.body.classList.toggle('noscroll'); 11 if (!openMenu) { 12 stopBodyScrolling(true, true); 13 $("#mobile-inner-menu").slideDown(300); 14 } else { 15 stopBodyScrolling(false, true); 16 $("#mobile-inner-menu").slideUp(300); 17 } 18 openMenu = !openMenu; 19 } 20 var languageSelectionOpen = false; 21 function toggleLanguageSelection() { 22 document.body.classList.toggle('noscroll'); 23 if (!languageSelectionOpen) { 24 stopBodyScrolling(true, false); 25 $("#mobile-language-chooser").fadeIn(300); 26 } else { 27 stopBodyScrolling(false, false); 28 $("#mobile-language-chooser").fadeOut(300); 29 } 30 languageSelectionOpen = !languageSelectionOpen; 31 } 32 function stopBodyScrolling(bool, completely) { 33 var element = document.getElementById("ais-master"); 34 var body = document.body; 35 if (bool) { 36 element.addEventListener("touchmove", freezeBody); 37 if (completely) { 38 body.addEventListener("touchmove", freezeBody, true); 39 } 40 41 } else { 42 element.removeEventListener("touchmove", freezeBody); 43 if (completely) { 44 body.removeEventListener("touchmove", freezeBody, true); 45 } 46 } 47 } 48 function freezeBody(e) { 49 e.preventDefault(); 50 } 51 function init() { 52 document.getElementById("ais-master").addEventListener("touchmove", onMove, false); 53 } 54 function onMove(e) { 55 56 var element = document.body; 57 if (element.offsetHeight > element.scrollHeight) { 58 e.preventDefault(); 59 } 60 } 61 init(); 62 return { 63 ToggleMenu: toggleMenu, 64 ToggleLanguageSelection: toggleLanguageSelection 65 } 66}(); 67 68AIS.Tooltip = function () { 69 70 var _tooltip = null; 71 var _element = null; 72 73 var show = function (element) { 74 _element = element; 75 var data = element.getAttribute("data-tooltip"); 76 _tooltip = document.createElement("div"); 77 _tooltip.setAttribute("class", "tooltip"); 78 _tooltip.innerHTML = data; 79 element.appendChild(_tooltip); 80 } 81 82 var hide = function () { 83 _element.removeChild(_tooltip); 84 } 85 86 return { 87 Show: show, 88 Hide: hide 89 } 90}(); 91AIS.Storage = function () { 92 var memoryStorage = {}; 93 94 function get(key) { 95 if (typeof localStorage !== 'undefined') { 96 return JSON.parse(localStorage.getItem(key)); 97 } else { 98 return memoryStorage[key]; 99 } 100 }; 101 102 function set(key, value) { 103 if (typeof localStorage !== 'undefined') { 104 localStorage.setItem(key, JSON.stringify(value)); 105 } else { 106 memoryStorage[key] = value; 107 } 108 }; 109 110 function remove(key) { 111 if (typeof localStorage !== 'undefined') { 112 localStorage.removeItem(key); 113 } else { 114 delete memoryStorage[key]; 115 } 116 } 117 118 return { 119 Get: get, 120 Set: set, 121 Remove: remove 122 } 123}(); 124 125AIS.Helpers = function () { 126 127 return { 128 Show: function (element) { 129 var parent = $(element).parentsUntil("toggle-group.container"); 130 parent.children(".toggle-group.show-label").hide(); 131 parent.children(".toggle-group.hide-label").show().css({ 'display': 'inline-block', 'margin-right': '2px' }); 132 parent.children(".toggle-group.children").slideToggle("fast"); 133 }, 134 135 Hide: function (element) { 136 var parent = $(element).parentsUntil("toggle-group.container"); 137 parent.children(".toggle-group.show-label").show(); 138 parent.children(".toggle-group.hide-label").hide(); 139 parent.children(".toggle-group.children").slideToggle("fast"); 140 }, 141 ResolveUrl: function (relativePath) { 142 var baseUrl = $("#ais-base-url").val(); 143 return AIS.Helpers.Rtrim(baseUrl, "/") + "/" + AIS.Helpers.Ltrim(relativePath, "/"); 144 }, 145 146 Rtrim: function (str, chars) { 147 chars = chars || "\\s"; 148 return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); 149 }, 150 151 Ltrim: function (str, chars) { 152 chars = chars || "\\s"; 153 return str.replace(new RegExp("^[" + chars + "]+", "g"), ""); 154 }, 155 156 Trim: function (str, chars) { 157 return AIS.Helpers.Rtrim(AIS.Helpers.Ltrim(str, chars)); 158 }, 159
160 EscapeSelectorExpression: function (expression) { 161 // Special characters defined here: http://api.jquery.com/category/selectors/ 162 // Must be escaped with two backslashes, i.e. '\\' 163 if (expression) { 164 return expression.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1'); 165 } 166 return expression; 167 }, 168 169 //generic AddUserMessage function 170 AddUserMessage: function (message, type, temporary, translate) { 171 172 $.ajax({ 173 type: "get", 174 url: AIS.Helpers.ResolveUrl("helper/getusermessage"), 175 dataType: "html", 176 data: { 177 message: message, 178 type: type, 179 translate: translate, 180 temporary: temporary 181 }, 182 success: function (data) { 183 //add the markup to the user message div 184 AIS.Helpers.RemoveUserMessage(); 185 186 var currHtml = $(".ais-user-message-element").html(); 187 $(".ais-user-message-element").html(currHtml + data); 188 } 189 }); 190 }, 191 192 //Information message 193 AddInformationUserMessage: function (message, translate) { 194 AIS.Helpers.AddUserMessage(message, "Information", translate); 195 }, 196 AddTempInformationUserMessage: function (message, translate) { 197 AIS.Helpers.AddUserMessage(message, "Information", true, translate); 198 }, 199 200 //Success message 201 AddSuccessUserMessage: function (message, translate, temporary) { 202 AIS.Helpers.AddUserMessage(message, "Success", translate); 203 }, 204 AddTempSuccessUserMessage: function (message, translate) { 205 AIS.Helpers.AddUserMessage(message, "Success", true, translate); 206 }, 207 208 //Warning message 209 AddWarningUserMessage: function (message, translate) { 210 AIS.Helpers.AddUserMessage(message, "Warning", translate); 211 }, 212 AddTempWarningUserMessage: function (message, translate) { 213 AIS.Helpers.AddUserMessage(message, "Warning", true, translate); 214 }, 215 216 //Error message 217 AddErrorUserMessage: function (message, translate) { 218 AIS.Helpers.AddUserMessage(message, "Error", translate); 219 }, 220 AddTempErrorUserMessage: function (message, translate) { 221 AIS.Helpers.AddUserMessage(message, "Error", true, translate); 222 }, 223 224 //Remove user message 225 RemoveUserMessage: function () { 226 $(".ais-user-message-element").html(''); 227 }, 228 229 //Toggle menu items 230 EnableMenuItem: function (itemId) { 231 $("#" + itemId).attr("href", $("#" + itemId).parent().children("input.ais-hidden-href-value").val()); 232 $("#" + itemId).parent().removeClass("disabled"); 233 }, 234 235 DisableMenuItem: function (itemId) { 236 $("#" + itemId).removeAttr("href"); 237 $("#" + itemId).parent().removeClass("active"); 238 $("#" + itemId).parent().addClass("disabled"); 239 }, 240 241 //Request datepicker 242 RequestDatePicker: function () { 243 jQuery('input.requestdatepicker').datepicker("destroy"); 244 var currentYear = (new Date).getFullYear(); 245 var currentIsoDate = (new Date).toISOString(); 246 $('select#destination').val("READING_ROOM"); 247 $('input#requested-for-date').val(currentIsoDate.substring(0, currentIsoDate.indexOf("T"))); 248 $('input#expected-return-date').val(currentIsoDate.substring(0, currentIsoDate.indexOf("T"))); 249 $('input.requestdatepicker').datepicker({ 250 minDate: 0, 251 changeYear: true, 252 yearRange: (currentYear) + ":" + (currentYear + 1), 253 dateFormat: "yy-mm-dd", 254 showOn: 'button', 255 autoclose: true, 256 buttonText: "" 257 //buttonImage: AIS.Helpers.ResolveUrl("Content/Images/ais-calendar.png"), 258 //buttonImageOnly: true 259 }).next('button').attr("title", "Choose date").append('<i class="far fa-calendar-alt" aria-label="Choose date"></i>'); 260 }, 261 262 //Date picker 263 AttachDatePicker: function () { 264 jQuery('input.datepicker').datepicker("destroy"); 265 var currentUICultureField = $(".ais-current-ui-culture-value"); 266 var currentUICulture = ""; 267 268 if (currentUICultureField !== null && currentUICultureField !== undefined) { 269 currentUICulture = currentUICultureField.val(); 270 } 271 272 $.datepicker.setDefaults($.datepicker.regional[currentUICulture]); 273 var currentYear = (new Date).getFullYear(); 274 $('input.datepicker').datepicker({ 275 changeYear: true,
276 yearRange: "1900:" + (currentYear), 277 dateFormat: "yy-mm-dd", 278 showOn: 'button', 279 buttonText: "" 280 //buttonImage: AIS.Helpers.ResolveUrl("Content/Images/ais-calendar.png"), 281 //buttonImageOnly: true 282 }).next('button').attr("title", "Choose date").append('<i class="far fa-calendar-alt" aria-label="Choose date"></i>'); 283 }, 284 285 //Time picker 286 AttachTimePicker: function () { 287 288 $('input.timepicker').timePicker({ 289 show24Hours: true, // TODO: Use localization 290 separator: ':', 291 step: 15 292 }); 293 294 }, 295 296 //Set Focus 297 SetFocusFirstInput: function (container) { 298 299 //TODO: Review. It's not working in IE for some cases... 300 $(container).find("input[type='text']:visible:enabled:first").focus(); 301 }, 302 303 ScrollToTop: function () { 304 $('html, body').animate({ scrollTop: '0' }, 50); 305 }, 306 307 RaiseRequestCheckMaxIssues: function (sender, destination, rfd) { 308 $(".dialog-yes").prop("disabled", false).removeClass("ui-state-disabled"); 309 // check max items for this user for this date 310 // case USER: count requests with status ISSUED // on destination change 311 // case RR: count all requests for requested date which are NOT cancelled // on load // on date/destination change 312 var userId = $(".ais-raise-request-script").attr("userid"); 313 var maxdailyrequests = $(".ais-raise-request-script").attr("max_daily_requests"); 314 var searchStatement = "requester.user_reference=" + userId + " and requested_for_date='" + rfd + "' and not c1='*'"; 315 if (destination == 'USER') { 316 searchStatement = "requester.user_reference=" + userId + " and request_status='ISSUED'"; 317 } 318 319 $.ajax({
320 url: AIS.Helpers.ResolveUrl("helper/GetSearchResult"), 321 dataType: "json", 322 data: { 323 Database: "itemrequests", 324 SearchStatement: searchStatement, 325 Limit: 0, 326 Fields: "priref,request_status" 327 }, 328 success: function (data) { 329 if (data.Hits >= maxdailyrequests) { 330 $(".dialog-yes").prop("disabled", true).addClass("ui-state-disabled"); 331 $("#request-raise-msg").show(); 332 var maxMessage = AIS.Helpers.Translate("Max_Daily_Request"); 333 $("#request-raise-msg").html("<i style='color:red' class='fas fa-exclamation-circle'></i> " + maxMessage); 334 } 335 } 336 }); 337 }, 338 339 RaiseRequestPrompt: function (sender) { 340 AIS.Helpers.RequestDatePicker(); 341 var destination = sender.attr("destination"); 342 $('input#expected-return-date').datepicker("disable"); 343 if (destination == 'USER') { 344 //$('input#expected-return-date').datepicker("enable"); 345 $("#raise-request-dialog #destination").prop("disabled", false); 346 } 347 var currentIsoDate = (new Date).toISOString(); 348 var rfd = currentIsoDate.substring(0, currentIsoDate.indexOf("T")); 349 350 AIS.Helpers.RaiseRequestCheckMaxIssues(sender,"READING_ROOM",rfd); 351 352 $("#raise-request-dialog").dialog({ 353 resizable: true, 354 width: "450px", 355 buttons: [ 356 { 357 text: "OK", 358 class: "dialog-yes", 359 click: function () { 360 AIS.Helpers.RaiseRquest(sender); 361 $(this).dialog("close"); 362 } 363 }, 364 { 365 text: "Cancel", 366 click: function () { 367 $(this).dialog().resetForm(); 368 $(this).dialog("close"); 369 } 370 } 371 ] 372 }); 373 }, 374 375 RaiseRequestDates: function (sender) { 376 var dest = $("#destination").val(); 377 $("#request-raise-msg").hide().html(""); 378 var maxissuedays = $(".ais-raise-request-script").attr("max_issue_days"); 379 // check destination and expected-return-date 380 // if destination is rr > update expected-return-date to rfd 381 if (dest == "READING_ROOM") { 382 $('input#expected-return-date').val($('input#requested-for-date').val()); 383 } else { 384 // erd < tfd then erd = rfd 385 if ($('input#expected-return-date').val() < $('input#requested-for-date').val()) { 386 $('input#expected-return-date').val($('input#requested-for-date').val()); 387 } 388 var rfd = new Date($('input#requested-for-date').val()); 389 var rfd2 = new Date($('input#requested-for-date').val()); 390 var erd = new Date($('input#expected-return-date').val()); 391 var erdmax = new Date(rfd2.setDate(rfd2.getDate() + parseInt(maxissuedays))); 392 //alert(rfd +"*"+erd+"*"+erdmax); 393 if (erd > erdmax) { 394 //if ($('input#expected-return-date').val() > $('input#requested-for-date').val() + maxissuedays) { 395 $("#request-raise-msg").show(); 396 var returnMessage = AIS.Helpers.Translate("Request_Return_Date"); 397 $("#request-raise-msg").html("<i style='color:red' class='fas fa-exclamation-circle'></i> " +returnMessage + " " + $.datepicker.formatDate('yy-mm-dd', erdmax)) 398 $('input#expected-return-date').val($.datepicker.formatDate('yy-mm-dd', erdmax)); 399 } 400 } 401 }, 402 403 RaiseRquest: function (sender) { 404 var itemId = $(sender).attr("itemid"); 405 var rd = $("#raise-request-dialog #requested-for-date").val(); 406 var database = $(".ais-request-database-name").val(); 407 $(sender).append(' <i class="fas fa-spinner fa-spin"></i>'); 408 409 $.ajax({
410 url: AIS.Helpers.ResolveUrl("reservations/raiserequest"), 411 data: { 412 database: database, 413 itemId: itemId, 414 requestedDate: rd, 415 expectedReturnDate: $("#raise-request-dialog #expected-return-date").val(), 416 destination: $("#raise-request-dialog #destination").val() 417 }, 418 success: function (data) { 419 420 if (data.type === "Error") { //error 421 $(sender).html(AIS.Helpers.Translate("raise_item_error")); 422 } 423 else if (data.type === "Success") { //success 424 $(sender).html(AIS.Helpers.Translate("raise_item_success")); 425 } 426 427 if (data.message) { 428 //AIS.Helpers.AddUserMessage(data.message, data.type, true, false); 429 //$(sender).children("span").html(message); 430 431 $(sender).children('i').remove(); 432 $(sender).removeClass("ais-raise-request-script"); 433 $(sender).addClass("disabled"); 434 } 435 }, 436 error: function (data) { 437 $(sender).children("span").html(AIS.Helpers.Translate("raise_item_error")); 438 439 if (data.message) { 440 AIS.Helpers.AddUserOrderMessage("Error: " + data.message, data.type, true, false, priref); 441 } 442 sender.find('i').remove(); 443 $(sender).removeClass("ais-raise-request-script "); 444 $(sender).addClass("disabled"); 445 } 446 }); 447 }, 448 449 CreateOrder: function (sender) { 450 $("#order-confirm-dialog").dialog({ 451 buttons: [ 452 { 453 text: "Yes", 454 class: "dialog-yes", 455 click: function () { 456 var userId = $("#ais-borrower-number").val(); 457 var userInput = $("#order-request-input").val(); 458 AIS.Helpers.CreateOrderPrompt(sender); 459 $(this).dialog("close"); 460 } 461 }, 462 { 463 text: "No", 464 click: function () { 465 $(this).dialog("close"); 466 } 467 } 468 ] 469 }); 470 }, 471 CreateOrderPrompt: function (sender) { 472 var itemId = $(sender).siblings(".ais-item-number-value").val(); 473 var userId = $(sender).siblings(".ais-user-id-value").val(); 474 var resource = $(sender).siblings(".ais-resource-value").val(); 475 var priref = $(sender).parent().children(".record-selector").attr("data-priref"); 476 477 sender.append(" <i class='fa fa-spinner fa-spin'></i>"); 478 479 $.ajax({
480 url: AIS.Helpers.ResolveUrl("ordering/createorder"), 481 data: { 482 itemId: itemId, 483 userId: userId, 484 resource: resource 485 }, 486 success: function (data) { 487 if (data.type === 4) { //error 488 $(sender).children("span").html("Item not ordered"); 489 } 490 else if (data.type === 2) { //success 491 $(sender).children("span").html("Item ordered"); 492 } 493 494 if (data.message) { 495 AIS.Helpers.AddUserOrderMessage(data.message, data.type, true, false, priref); 496 } 497 sender.find('i').remove(); 498 $(sender).removeClass("ais-create-order-script"); 499 $(sender).addClass("disabled"); 500 }, 501 error: function (data) { 502 $(sender).children("span").html("Error ordering the item"); 503 504 if (data.message) { 505 AIS.Helpers.AddUserOrderMessage("Error: " + data.message, data.type, true, false, priref); 506 } 507 sender.find('i').remove(); 508 $(sender).removeClass("ais-create-order-script"); 509 $(sender).addClass("disabled"); 510 } 511 }); 512 }, 513 514 AddUserOrderMessage: function (message, type, temporary, translate, priref) { 515 516 $.ajax({
517 type: "get", 518 url: AIS.Helpers.ResolveUrl("helper/getusermessage"), 519 dataType: "html", 520 data: { 521 message: message, 522 type: type, 523 translate: translate, 524 temporary: temporary 525 }, 526 success: function (data) { 527 //add the markup to the user message div 528 AIS.Helpers.RemoveUserMessage(); 529 530 var currHtml = $(".ais-user-message-element").html(); 531 $(".ais-user-message-order-element-" + priref).html(currHtml + data); 532 $(".ais-user-message-order-element-" + priref + ">div").addClass("type" + type); 533 } 534 }); 535 }, 536 537 Translate: function (key) { 538 539 var translation; 540 541 $.ajax({ 542 type: "get", 543 url: AIS.Helpers.ResolveUrl("/helper/translate"), 544 async: false, 545 data: { 546 Key: key 547 }, 548 dataType: "text", 549 success: function (data) { 550 translation = data; 551 } 552 }); 553 554 return translation; 555 556 } 557 } 558 559}();
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.