1 2 3 4 5 6 7 8 9 10 /** 11 @description Checks if provided JavaScript NameSpace(s) exist, if not creates one. 12 @function 13*/ 14window.checkHertzNameSpace = function() { 15 var a = arguments, 16 i = 0, 17 j = 0, 18 o = null, 19 p = null, 20 n = null; 21 ref = []; 22 for (i = 0; i < a.length; i++) { 23 o = window; 24 p = a[i].split("."); 25 for (j = 0; j < p.length; j++) { 26 n = p[j]; 27 o[n] = o[n] || {}; 28 o = o[n]; 29 } 30 ref[i] = o; 31 } 32 33 return ref; 34}; 35 36window.checkHertzNameSpace('htz.utils'); 37 38/** 39 @description Various util methods 40 @class Utils 41 @requires JQuery 42 */ 43var Utils = Utils || (function() { 44 45 return /** @lends Utils */ { 46 47 //hz464486//irac-647//Update online-check in form for International 48 handlePlaceHolderFocusOut:function(e){ 49 e.stopPropagation(); 50 var target= e.currentTarget; 51 if(!htz.config.isApp){ 52 if ($(target).val() != "") { 53 $(target).next("span.floating-label").css({ 54 'font-size': '14px', 55 'margin-top': '-65px' 56 57 }); 58 } else { 59 $(target).next("span.floating-label").css("margin-top", "-65px").css("font-size", "14px").find("label").css("vertical-align", "top"); 60 61 } 62 } 63 }, 64 65 //hz464486//irac-647//Update online-check in form for International 66 handlePlaceHolderFocusIn:function(e,target){ 67 //e.stopPropagation(); 68 var target=target!=null?target:e.currentTarget; 69 70 if(!htz.config.isApp){ 71 if(!($(target)[0].id=="")){ 72 73 $(target).next("span.floating-label").css({ 74 'font-size' : '14px', 75 'margin-top' : '-65px' 76 }); 77 } 78 } 79 80 }, 81 82 //dtc4102//irac-770 83 //Display error special character handling when unsupported character is entered in a field 84 //display Error 85 handleInvalidCharsError : function(ele, error, index){ 86 var list = ele.closest(".sectionContainer").prev(".bookableErrorMsgPadding"), ul = list.find("ul"), li = $('<li>').text(error).attr("lang", index); 87 if(!ul.length || (ul.length && !ul.find('li').filter(function(){return $(this).text()===error;}).length)){ 88 if(ul.length){ 89 var last = ul.find('li[lang="1"]'); 90 if(last.length){ 91 last.before(li); 92 } 93 else { 94 ul.append(li); 95 } 96 } 97 else { 98 list.append($('<ul class="field-error-list">').append(li)) 99 } 100 } 101 list.show(); 102 }, 103 //dtc4102//irac-770 104 //Display error special character handling when unsupported character is entered in a field 105 //clear Error 106 clearInvalidCharsError : function(ele,error){ 107 ele.closest(".sectionContainer").prev(".bookableErrorMsgPadding").find('.field-error-list li').filter(function(){ 108 return $(this).text()===error; 109 }).remove(); 110 }, 111 //dtc4102//irac-770 112 //Display error special character handling when unsupported character is entered in a field 113 //checks input for special characters 114 getUsAsciiValidationPattern : function(fieldName) { 115 if (!fieldName) { 116 return null; 117 } 118 var nameFields = ['firstName', 'lastName']; 119 var addressLineFields = [ 120 'homeAddressLine1', 'homeAddressLine2', 121 'businessAddressLine1', 'businessAddressLine2', 122 'pickupServiceAddressLine1', 'pickupServiceAddressLine2' 123 ]; 124 var cityFields = ['homeCity', 'businessCity', 'pickupServiceAddressCity']; 125 var zipFields = ['homeZip', 'businessZip', 'pickupServiceAddressZipCode']; 126 var emailFields = [ 127 'emailAddress', 'verifyEmailAddress', 128 'secondaryEmailAddress', 'verifySecondaryEmailAddress', 129 'email', 'emailVerify' 130 ]; 131 132 if (nameFields.indexOf(fieldName) >= 0) { 133 return /^[a-zA-Z -']*$/; 134 }
135 if (addressLineFields.indexOf(fieldName) >= 0) { 136 return /^[a-zA-Z0-9 -'.#]*$/; 137 } 138 if (cityFields.indexOf(fieldName) >= 0 || zipFields.indexOf(fieldName) >= 0) { 139 return /^[a-zA-Z0-9 -.']*$/; 140 } 141 if (emailFields.indexOf(fieldName) >= 0) { 142 return /^[a-zA-Z0-9@._+-]*$/; 143 } 144 return null; 145 }, 146 getUsAsciiValidationError : function(referrer, fieldName) { 147 if (fieldName === 'firstName') { 148 return referrer.formData.get('firstNameInvalidCharsError'); 149 } 150 if (fieldName === 'lastName') { 151 return referrer.formData.get('lastNameInvalidCharsError'); 152 } 153 var emailFields = [ 154 'emailAddress', 'verifyEmailAddress', 155 'secondaryEmailAddress', 'verifySecondaryEmailAddress', 156 'email', 'emailVerify' 157 ]; 158 if (emailFields.indexOf(fieldName) >= 0 159 && referrer.formData.get('emailInvalidCharsError')) { 160 return referrer.formData.get('emailInvalidCharsError'); 161 } 162 return referrer.formData.get('genericInvalidCharsError'); 163 }, 164 validateInput:function(referrer,e){ 165 var self=referrer; 166 var obj = $(e.target); 167 var value = obj.val(); 168 var fieldName = obj.attr("name") || obj.attr("id"); 169 var pattern = this.getUsAsciiValidationPattern(fieldName); 170 var error = this.getUsAsciiValidationError(self, fieldName); 171 var index; 172 if(fieldName === "firstName" || fieldName === "lastName") { 173 index = fieldName === "firstName" ? 0 : 1; 174 } 175 176 if (value === "") { 177 this.clearInvalidCharsError(obj, error); 178 return; 179 } 180 181 if (pattern) { 182 if (!pattern.test(value)) { 183 this.handleInvalidCharsError(obj, error, index); 184 } else { 185 this.clearInvalidCharsError(obj, error); 186 } 187 return; 188 } 189 190 var highestCharCode = value.charCodeAt(0); 191 var lowestCharCode = value.charCodeAt(0); 192 for (let i = 0; i < String(value).length; i++) { 193 if (value.charCodeAt(i) > highestCharCode) { 194 highestCharCode = value.charCodeAt(i); 195 } 196 if (value.charCodeAt(i) < lowestCharCode) { 197 lowestCharCode = value.charCodeAt(i); 198 } 199 } 200 201 if(lowestCharCode<0 || highestCharCode>255){ 202 this.handleInvalidCharsError(obj, error, index); 203 } 204 else { 205 this.clearInvalidCharsError(obj, error); 206 } 207 }, 208 /** 209 @description Exports namespace of a module. For legacy support. 210 @function 211 */ 212 exportToNameSpace : function(namespace, definition) { 213 if(!namespace || !definition) { return; } 214 var reference = checkHertzNameSpace(namespace); 215 reference[0] = definition; 216 }, 217 /** 218 @description Returns a boolean of whether the browser is IE8 219 @function 220 @return {boolean} 221 */ 222 isIE8 : function(){ 223 return $('body').hasClass('lt-ie9') && !$('body').hasClass('lt-ie8'); 224 }, 225 /** 226 @description Returns a boolean of whether the browser is IE 227 @function 228 @return {boolean} 229 */ 230 isIE : function(){ 231 ua = navigator.userAgent; 232 233 var is_IE = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1; 234 235 return is_IE; 236 }, 237 /** 238 @description Returns a boolean of whether the body dom element has a class lt-ie8 239 @function 240 @return {boolean} 241 */ 242 isUseStoragePolyfill : function(){ 243 return $('body').hasClass('lt-ie8'); 244 }, 245 /** 246 @description Creates the item for storage in session 247 @function 248 @param {String} key 249 @param {object} value JSON object 250 */ 251 storeItemIE : function(key, value, options){ 252 var ie = new Backbone.Model({ id : key }); 253 ie.url = htz.config.rootContext + '/rest/home/save-ie/' + key; 254 255 var fOptions = {}; 256 if(options) { 257 fOptions = $.extend(fOptions, options); 258 } 259 fOptions.type = 'POST'; 260 ie.save(value, fOptions); 261 }, 262 /** 263 @description Creates the item for storage in session 264 @function 265 @param {String} key 266 @param {object} value JSON object 267 */ 268 fetchItemIE : function(key, options){ 269 var ie = new Backbone.Model(); 270 ie.url = htz.config.rootContext + '/rest/home/retrieve-ie/' + key; 271 272 var fOptions = {}; 273 if(options) { 274 fOptions = $.extend(fOptions, options); 275 } 276 fOptions.type = 'POST'; 277 ie.fetch(fOptions); 278 }, 279 /** 280 @description Remove the item from storage in session using the key parameter 281 @function 282 @param {String} key 283 */ 284 removeItemIE : function(key){ 285 var ie = new Backbone.Model({ id : key }); 286 ie.url = htz.config.rootContext + '/rest/home/clear-ie/' + key;
287 ie.save({}, { type : 'POST'}); 288 }, 289 /** 290 @description Fix for IE6 to display the select dropdown element used when hiding the lightbox 291 @function 292 */ 293 showSelects: function() { 294 if ((navigator.userAgent.toLowerCase().indexOf('msie') != -1) && (navigator.appVersion=="6.0")) { 295 $("select").each(function(i,o){ $(o).css( { 'visibility' : 'visible' } ) }) 296 } 297 }, 298 /** 299 @description Fix for IE6 to hide the select dropdown element used when showing the lightbox 300 @function 301 */ 302 hideSelects: function() { 303 if ((navigator.userAgent.toLowerCase().indexOf('msie') != -1) && (navigator.appVersion=="6.0")) { 304 $("select").each(function(i,o){ if(!$(this).hasClass('noHide')) $(o).css( { 'visibility' : 'hidden' } ) }) 305 if ($("#lboxDivLBContent")) $("#lboxDivLBContent select").each(function(i,o){ if(!$(this).hasClass('noHide')) $(o).css( { 'visibility' : 'visible' } ) }) 306 } 307 }, 308 309 /** 310 @description Look for whether session has timeout out on an ajax call and takes action on timeout 311 @function 312 @param {object} xhr 313 */ 314 sessionTimedOut : function(xhr) { 315 if(this.hasSessionTimedOut(xhr, null)) { 316 window.location.href = xhr.getResponseHeader("Location"); 317 return true; 318 } 319 320 return false; 321 }, 322 /** 323 @description Looks for whether session has timeout out on an ajax call 324 @function 325 @param {object} xhr 326 */ 327 hasSessionTimedOut : function(xhr, response) { 328 return xhr && xhr.getResponseHeader("Ajax-Session-Timeout") == "true" && xhr.getResponseHeader("Location"); 329 }, 330 /** 331 @description Gets the first error from an errors object 332 @function 333 @param {object} errors 334 @return {*} first error value 335 */ 336 getErrorToTrack : function(errors){ 337 return errors && Object.keys(errors).length ? errors[Object.keys(errors)[0]] : ""; 338 }, 339 /** 340 @description Display the errors from deeplink/hertzlink 341 @function 342 @param {object} res response object 343 */ 344 displayBootStrappedErrors : function(res){ 345 if(!res) return; 346 347 if(res.message && (res.message.fieldErrors || res.message.messages || res.message.systemErrors || res.message.errorData)){ 348 Utils.trackError(res.message); 349 htz.helpers.SessionHelper.setItem('errors', JSON.stringify(res.message)); 350 } 351 }, 352 /** 353 @description Handle and display error messages non field error messages 354 @function 355 @param {object} errors 356 @param {String} target dom element to display error message 357 */ 358 displayErrorMessage: function (errors, target){ 359 var nonFieldErrors = this.buildNonFieldErrors(errors); 360 361 if(!nonFieldErrors) return; 362 363 var errStr = '<ul>' + nonFieldErrors + '</ul>'; 364 365 if (htz.config.isApp){ 366 Utils.showErrors(errStr, target); 367 } else { 368 if(target){ 369 $(target).html(errStr).show(); 370 } 371 else { 372 $('#error-list').html(errStr).show(); 373 } 374 } 375 AmplitudeUtils.trackApiEvent("API", "", "failed", this.getErrorToTrack(errors)); 376 377 }, 378 /** 379 @description Handle and display field error messages 380 @function 381 @param {object} errors 382 @param {String} target dom element to display error message 383 */ 384 displayFieldErrors : function(errors, target) { 385 var fieldErrors = this.buildFieldErrors(errors); 386 387 if(!fieldErrors) return; 388 389 var errStr = '<ul><pre style="font-family:'+ 'Avenir'+', Verdana, sans-serif; font-size: 13px">' + fieldErrors + '</pre></ul>'; 390 if(target){ 391 $(target).html(errStr).show(); 392 } 393 else { 394 $('#error-list').html(errStr).show(); 395 } 396 AmplitudeUtils.trackApiEvent("API", "", "failed", this.getErrorToTrack(errors)); 397 }, 398 /** 399 @description Handle and display all error messages 400 @function 401 @param {object} errors 402 @param {String} target dom element to display error message 403 */ 404 displayAllErrors : function(errors, target) { 405 if(!errors) return; 406 407 var nonFieldErrors = this.buildNonFieldErrors(errors); 408 var fieldErrors = this.buildFieldErrors(errors.fieldErrors); 409 410 if(!nonFieldErrors && !fieldErrors) return; 411 412 var errStr = '<ul>'; 413 if(nonFieldErrors) { 414 errStr += nonFieldErrors; 415 } 416 if(fieldErrors) { 417 errStr += fieldErrors; 418 } 419 420 errStr += '</ul>'; 421 422 if (htz.config.isApp){ 423 Utils.showErrors(errStr, target); 424 } else { 425 if(target){ 426 $(target).html(errStr).show(); 427 } 428 else { 429 $('#error-list').html(errStr).show(); 430 } 431 } 432 }, 433 /** 434 @description Build html for non field error messages 435 @function 436 @param {object} errors 437 @return {String} 438 */ 439 buildNonFieldErrors: function (errors){ 440 if(!errors.messages && !errors.systemErrors) { return null; } 441 442 var errStr = ''; 443 444 if (errors.messages){ 445 for(var i=0; i<errors.messages.length;i++){ 446 var message = errors.messages[i]; 447 errStr += '<li><pre style="font-family:'+ 'Avenir'+', Verdana, sans-serif; font-size: 13px">' + message + '</pre></li>'; 448 449 450 } 451 } 452 453 if (errors.systemErrors){ 454 for(var i=0; i<errors.systemErrors.length;i++){ 455 var systemError = errors.systemErrors[i]; 456 errStr += '<li><pre style="font-family:'+ 'Avenir'+', Verdana, sans-serif; font-size: 13px">' + systemError + '</pre></li>'; 457 } 458 } 459 460 return errStr; 461 }, 462 /** 463 @description Build html for field error messages 464 @function 465 @param {object} errors 466 @return {String} 467 */ 468 buildFieldErrors : function(errors) { 469 if(!errors || errors.length == 0) { return null; } 470 471 var errorList = []; 472 var errStr = ''; 473 474 try { 475 for(var i in errors){ 476 for(var k in errors[i][1]){ 477 errorList[errors[i][1][k]] = ''; 478 } 479 } 480 } 481 catch(e){ } 482 483 for(var error in errorList) { 484 errStr += "<li>"+error+"</li>"; 485 } 486 487 return errStr; 488 }, 489 /** 490 @description Remove error messages 491 @function 492 */ 493 clearErrorMessage : function(target){ 494 if(!target) { 495 target = '#error-list'; 496 } 497 $(target).empty().hide(); 498 }, 499 /**
500 @description Display error messages from session storage and removes the errors item from session storage 501 @function 502 */ 503 showErrorFromSession : function(){ 504 var errors = htz.helpers.SessionHelper.getItem('errors'); 505 506 if(errors){ 507 Utils.displayAllErrors(JSON.parse(errors)); 508 htz.helpers.SessionHelper.removeItem('errors'); 509 } 510 }, 511 /** 512 @description Extracts error codes from error list 513 @function 514 */ 515 findErrorCodes : function(errors) { 516 if(!errors) { return ''; } 517 518 var errorCodes = '', error = ''; 519 520 for(var e in errors){ 521 if(errors.fieldErrors){ 522 for(var j in errors[e]){ 523 if(typeof errors[e][j] == "string"){ 524 error = errors[e][j]; 525 errorCodes += error.substring(error.lastIndexOf('[') + 1, error.lastIndexOf(']')) + ','; 526 }else{ 527 for(var i in errors[e][j][1]){ 528 error = errors[e][j][1][i]; 529 errorCodes += error.substring(error.lastIndexOf('[') + 1, error.lastIndexOf(']')) + ','; 530 } 531 } 532 } 533 } 534 else { 535 for(var i in errors[e]){ 536 if(typeof errors[e][i] == "string"){ 537 error = errors[e][i]; 538 errorCodes += error.substring(error.lastIndexOf('[') + 1, error.lastIndexOf(']')) + ','; 539 } 540 else{ 541 error = errors[e][i].errorCode; 542 errorCodes += error + ','; 543 } 544 } 545 } 546 } 547 548 if(errorCodes.length > 0){ 549 errorCodes = errorCodes.substring(0, errorCodes.length - 1); 550 } 551 552 return errorCodes; 553 }, 554 /** 555 @description Track errors 556 @function 557 @param {object} errors 558 @param {String} page 559 */ 560 trackError : function(errors, page){ 561 var errorCodes = this.findErrorCodes(errors); 562 563 if(errorCodes && typeof WebTracking !== 'undefined'){ 564 WebTracking.setError(errorCodes, page); 565 } 566 }, 567 /** 568 @description Remove the homeModel from session storage 569 @function 570 */ 571 clearReservationSession : function(){ 572 htz.helpers.SessionHelper.removeItem('homeModel'); 573 }, 574 /** 575 @description Whether or not the color code is a valid hex color code 576 @function 577 @return {boolean} 578 */ 579 isHexColorCode : function(colorCode) { 580 var regColorcode = /^#[0-9a-f]{3}([0-9a-f]{3})?$/i; 581 return regColorcode.test(colorCode); 582 }, 583 /** 584 @description Return an array of the url paramaters 585 @function 586 @return {array} 587 */ 588 getUrlVars: function(){ 589 var vars = [], hash; 590 var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 591 for(var i = 0; i < hashes.length; i++) 592 { 593 hash = hashes[i].split('='); 594 vars.push(hash[0]); 595 vars[hash[0]] = decodeURIComponent(hash[1]); 596 } 597 return vars; 598 }, 599 /** 600 @description Get url paramters 601 @function 602 @param {String} name 603 */ 604 getUrlVar: function(name){ 605 return Utils.getUrlVars()[name]; 606 }, 607 /** 608 @description Format price into a string with two decimal points 609 @function 610 @param {float} raw price 611 @param {integer} digit number of decimal places 612 @return {String} formatted price 613 */ 614 formatPrice: function(raw, digit) { 615 if(!raw && raw !== 0) { return ''; } 616 if(!digit || digit < 0) { 617 digit = 2; 618 } 619 var formatted; 620 if(typeof raw =='string') { 621 formatted = parseFloat(raw).toFixed(digit); 622 } else{ 623 formatted = raw.toFixed(digit); 624 } 625 626 if(formatted && (formatted.indexOf(".") == 0)) { 627 formatted = "0"+formatted; 628 } 629 630 return formatted; 631 }, 632 padNumber : function(rawNumber, length, placeHolder) { 633 if(!rawNumber) return ''; 634 635 placeHolder = placeHolder || '0'; 636 rawNumber = rawNumber + ''; 637 638 return rawNumber.length >= length ? rawNumber : new Array((length - rawNumber.length) + 1).join(placeHolder) + rawNumber; 639 }, 640 /** 641 @description Merge error message responses 642 @function 643 @param {object} res1 644 @param {object} res2 645 */ 646 mergeErrors : function(res1, res2) { 647 if(!res1 || !res1.message) return res2; 648 if(!res2 || !res2.message) return res1; 649 650 var res = {}; 651 res.message = {}; 652 653 if(res1.message.messages || res2.message.messages) { 654 res.message.messages = []; 655 if(res1.message.messages) { 656 res.message.messages = $.merge(res.message.messages, res1.message.messages); 657 } 658 if(res2.message.messages) { 659 res.message.messages = $.merge(res.message.messages, res2.message.messages); 660 } 661 } 662 663 if(res1.message.systemErrors || res2.message.systemErrors) { 664 res.message.systemErrors = []; 665 if(res1.message.systemErrors) { 666 res.message.systemErrors = $.merge(res.message.systemErrors, res1.message.systemErrors); 667 } 668 if(res2.message.systemErrors) { 669 res.message.systemErrors = $.merge(res.message.systemErrors, res2.message.systemErrors); 670 } 671 } 672 673 if(res1.message.fieldErrors || res2.message.fieldErrors) { 674 res.message.fieldErrors = []; 675 if(res1.message.fieldErrors) { 676 res.message.fieldErrors = $.merge(res.message.fieldErrors, res1.message.fieldErrors); 677 } 678 if(res2.message.fieldErrors) { 679 res.message.fieldErrors = $.merge(res.message.fieldErrors, res2.message.fieldErrors); 680 } 681 } 682 683 return res; 684 }, 685 /** 686 @description Build html dropdown options 687 @function 688 @param {object} list List of dropdown options 689 @param {String} valSelected Value of the selected item in the dropdown 690 @param {object} label Content of first option in dropdown list (optional) 691 @return {String} options HTML dropdwon options 692 */ 693 buildDropdown: function(list, valSelected, label) { 694 var options = ''; 695 if (label) { 696 options += '<option value="">' + label + '</option>'; 697 } 698 if (list.length > 0) { 699 for (var i in list) { 700 if (list[i].value === valSelected) { 701 options += '<option selected="selected" value="' + list[i].value + '">' + list[i].name + '</option>'; 702 } else { 703 options += '<option value="' + list[i].value + '">' + list[i].name + '</option>'; 704 } 705 } 706 } 707 return options; 708 }, 709 createElm : function(childId, elmType, isHidden, parentId, attributes) { 710 var parentElm = parentId ? $('#'+parentId) : $('body'); 711 if(!elmType) { 712 elmType = 'div'; 713 } 714 var fElm = parentElm.find('#'+childId); 715 if(fElm.length == 0) { 716 var elm = $('<'+elmType+'/>').attr('id', childId); 717 if(attributes){ 718 for(var key in attributes){ 719 val = attributes[key]; 720 elm.attr(key, val); 721 } 722 }
723 if(isHidden) { 724 elm.hide(); 725 } 726 parentElm.append(elm); 727 728 return elm; 729 } 730 731 return fElm.eq(0); 732 }, 733 /** 734 @description Returns a boolean of whether the browser is IE8 735 @function 736 @return {boolean} 737 */ 738 touchScrollElem : function(elem){ 739 if( Modernizr && Modernizr.touch ) { 740 var ua = navigator.userAgent, 741 scrollOverflowUnsupported = false; 742 743 if( ua.indexOf("Android") >= 0 ) { 744 var androidversion = parseFloat(ua.slice(ua.indexOf("Android")+8)); 745 if ( androidversion <= 2.3 ) { 746 scrollOverflowUnsupported = true; 747 } 748 } else if ( ua.indexOf("Silk") >= 0 ) { 749 scrollOverflowUnsupported = true; 750 } else { 751 return; 752 } 753 754 if ( scrollOverflowUnsupported ) { 755 var scrollStartPosY = 0; 756 var scrollStartPosX = 0; 757 $('body').on('touchstart', elem, function(e) { 758 scrollStartPosY = this.scrollTop + e.originalEvent.touches[0].pageY; 759 scrollStartPosX = this.scrollLeft + e.originalEvent.touches[0].pageX; 760 }); 761 $('body').on('touchmove', elem, function(e) { 762 if ((this.scrollTop < this.scrollHeight - this.offsetHeight && this.scrollTop + e.originalEvent.touches[0].pageY < scrollStartPosY - 5) || (this.scrollTop != 0 && this.scrollTop + e.originalEvent.touches[0].pageY > scrollStartPosY + 5)) e.preventDefault(); 763 if ((this.scrollLeft < this.scrollWidth - this.offsetWidth && this.scrollLeft + e.originalEvent.touches[0].pageX < scrollStartPosX - 5) || (this.scrollLeft != 0 && this.scrollLeft + e.originalEvent.touches[0].pageX > scrollStartPosX + 5)) e.preventDefault(); 764 this.scrollTop = scrollStartPosY - e.originalEvent.touches[0].pageY; 765 this.scrollLeft = scrollStartPosX - e.originalEvent.touches[0].pageX; 766 }); 767 } 768 } 769 }, 770 /** 771 @description For debugging purposes, returns a string of the deviceGroup, browser and browserVersion 772 @function 773 @return {String} deviceGroup-browser-browserVersion 774 */ 775 browserDeviceType : function(){ 776 var browser = 'Other', 777 browserVer = 'Unknown', 778 uaString = 'Other', 779 os = 'Other OS', 780 ua, 781 myNav = navigator.userAgent.toLowerCase(); 782 783 try { 784 if(myNav.indexOf('msie') != -1) { 785 browser = 'IE'; 786 } else if(myNav.indexOf('firefox') != -1) { 787 browser = 'Mozilla'; 788 } else if(!!window.opera || myNav.indexOf('opr') != -1) { 789 browser = 'Opera'; 790 } else if(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { 791 browser = 'Webkit'; 792 } else { 793 browser = 'Other'; 794 } 795 796 browserVer = navigator.appVersion; 797 798 ua = navigator.userAgent; 799 800 if (ua.indexOf('Win')!=-1) { 801 uaString = ua.slice(ua.indexOf('Windows NT')).split(' '); 802 os = 'Windows NT ' + uaString[2]; 803 } else if (ua.indexOf('Mac')!=-1) { 804 uaString = ua.slice(ua.indexOf('Mac OS X')).split(' '); 805 os = 'MacOSX ' + uaString[3]; 806 } else if (ua.indexOf('x11')!=-1) { 807 os = 'UNIX'; 808 } else if (ua.indexOf('linux')!=-1) { 809 os = 'Linux'; 810 } 811 812 } catch (e) {} 813 814 return htz.config.deviceGroup + '-' + browser + '-' + browserVer + '-' + os; 815 }, 816 getUniqueErrorKey : function() { 817 try { 818 var cDate = new Date(); 819 return 'UE-' + this.padNumber(cDate.getUTCMonth() + 1, 2) + '' + this.padNumber(cDate.getUTCDate(), 2) + 820 '' + this.padNumber(cDate.getUTCHours(), 2) + 821 '' + this.padNumber(cDate.getUTCMinutes(), 2) + '-' + cDate.getTimezoneOffset() + '-' + cDate.getSeconds() + 822 '-' + (cDate.getMilliseconds()*(Math.floor(Math.random()*100)+1)); 823 } catch (e) { 824 return ''; 825 } 826 }, 827 isPrivateMode : function() { 828 try { 829 sessionStorage.setItem('private-mode', 'test'); 830 sessionStorage.removeItem('private-mode'); 831 } catch(e) { 832 return true; 833 } 834 return false; 835 } 836 } 837})(); 838(typeof define=='function' && define.amd && define('utils/utils',[],function(){return Utils;})); 839htz.utils.Utils = Utils; 840 841define("config/app-config",["utils/sessionhelper","json","reservation/process-config/core/reservation-constants"],function(a,c,b){if(htz&&htz.config)try{a.getItem(b.APP_CONFIG)||a.setItem(b.APP_CONFIG,c.stringify(htz.config))}catch(d){}return htz}); 842define("config/app-info",["config/app-config"],function(){var a=footerRef=null;return{setHeader:function(b){a=b},getHeader:function(){return a},setFooter:function(a){footerRef=a},getFooter:function(){return footerRef},doCleanup:function(){a=footerRef=null}}}); 843window.checkHertzNameSpace("htz.framework");htz.framework.DependencyManager=function(){var b=[];return{addDependencies:function(a,c){a&&(c&&0<c.length)&&(b[a]=c)},removeDependencies:function(a){a&&(b[a]=null)},getDependencies:function(a){return a?b[a]:null},reset:function(){b=[]}}}();getDependencies=htz.framework.DependencyManager.getDependencies;addDependencies=htz.framework.DependencyManager.addDependencies; 844"function"==typeof define&&define.amd&&define("framework/dependency-injection/dependency-manager",[],function(){return htz.framework.DependencyManager}); 845define("framework/view/abstract-view",["backbone"],function(c){return c.View.extend({optional:!1,preInitialize:function(){},postInitialize:function(){},preSubmit:function(){return!0},preRender:function(){},postRender:function(){},doCleanup:function(){},refresh:function(){},renderView:function(a){try{return this.preRender(),this.renderYourself(a),this.postRender(),this}catch(b){if(this.isOptional())this.handleRenderFailure(b,a);else throw b;}},renderYourself:function(){},handleRenderFailure:function(){}, 846setOptional:function(a){this.optional=a},isOptional:function(){return this.optional}})}); 847define("utils/utils-proxy",["config/utilconfig"],function(c){var e={};return{getLightbox:function(){var a=e.lightbox;a||(a=[],e.lightbox=a);for(var b=null,d=0;d<a.length;d++)if(b=a[d],null!=b&&!b.isInUse())return b;b=new (c.getLightbox());a.push(b);return b},getSpinner:function(){return c.getSpinner()},getNotifier:function(){return c.getNotifier()},getSlider:function(){return c.getSlider()},getAciveLightboxes:function(){var a=e.lightbox,b=[];if(a&&0<a.length)for(var d=null,c=0;c<a.length;c++)d=a[c], 848null!=d&&d.isInUse()&&b.push(d);return b},doCleanup:function(){e={}}}}); 849define("utils/cc-tools",[],function(){return{unMaskCC:function(a,b,c){a=$(a.target);b?a.val(b.get("creditCardNumber")):a.val(c)},get3DCardType:function(a,b,c){a=$(a.target);b?a.val(b.get("creditCardType")):a.val(c)},displayLastFourDigits:function(a,b){var c=$(a.target),d=b.substr(b.length-4),e=c.val().substr(0,b.length-4);c.val(e+d)},maskCC:function(a,b,c){if(a.ctrlKey)return!1;var d=$(a.target),e=d.val(),b=/^[0-9]*$/i.test(b+a.key)?b+a.key:e;d.val(e.replace(/[\w]/g,"*"));
849c&&c.set({creditCardNumber:b}, 850{silent:!0});return b}}}); 851define("utils/tracker",[],function(){return{track:function(a){a&&(Global&&"function"===typeof Global.track)&&Global.track(a)}}}); 852//dtc4102//PRC91530//Google Data Layer 853 854define('utils/gtm-tracker', [], function() { 855 var gtmTracker = { 856 findFilter:function(str,key){ 857 var fields=str.split('/'); 858 859 try{ 860 if(key=="category"){ 861 return fields[1]; 862 }else if(key=="selection"){ 863 return fields[2]; 864 } 865 }catch(e){ 866 return ""; 867 } 868 869 }, 870 clearField:function(){ 871 window.dataLayer.push({ 'ecommerce': null }); 872 }, 873 formatDate:function(inputDate,isEuro) { 874 var dateComponents = inputDate.split('/'); 875 876 var month,day; 877 878 if(isEuro){ 879 month = dateComponents[1]; 880 day = dateComponents[0]; 881 } else { 882 month = dateComponents[0]; 883 day = dateComponents[1]; 884 } 885 886 var year = dateComponents[2]; 887 888 var formattedDate = year + '-' + month + '-'+ day ; 889 890 return formattedDate; 891 }, 892 formatDateTime:function(inputDate,inputTime,isEuro) { 893 var formattedDate = this.formatDate(inputDate,isEuro).replace(/\//g, "-"); 894 var formattedTime= this.formatTime(inputTime); 895 var combinedDateTime = formattedDate + 'T' +formattedTime; 896 var combinedDateTimeString=combinedDateTime.toString(); 897 var timeStamp = Date.parse(combinedDateTimeString) 898 899 return timeStamp; 900 }, 901 formatTime:function(timeString) { 902 var [hours, minutes] = timeString.split(':'); 903 904 // Convert hours and minutes to integers 905 hours = parseInt(hours, 10); 906 minutes = parseInt(minutes, 10); 907 908 // Add leading zeros and seconds 909 var formattedTime = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:00`; 910 911 return formattedTime; 912 }, 913 calculate:function(what,value1,value2,value3,value4,value5){ 914 var self=this; 915 switch(what){ 916 917 case 'rentalDays': 918 919 var isEuro = value5==1?true:false; 920 var pickupDateTimeStamp = self.formatDateTime(value1,value3,isEuro); 921 var dropOffDateTimeStamp = self.formatDateTime(value2,value4,isEuro); 922 923 var diff = dropOffDateTimeStamp-pickupDateTimeStamp; 924 var diffDays = diff / (24 * 60 * 60 * 1000); 925 926 if (diffDays<1){ 927 return 1; 928 } 929 else{ 930 return Math.ceil(diffDays); 931 } 932 933 break; 934 935 } 936 }, 937 track : function(options) { 938 var self=this; 939 var scenario=options.scenario; 940 var trackingObjectArray=[]; 941 942 switch(scenario){ 943 944 case 'flashbanner_select_promotion': 945 var payload=options.payload; 946 947 try{ 948 window.dataLayer.push({ 949 'event': 'select_promotion', 950 'ecommerce': { 951 'promoClick': { 952 'promotions': [{ 953 'id':payload.id, 954 'name':payload.name, 955 'creative':payload.creative, 956 'position': payload.position 957 }] 958 } 959 } 960 }); 961 962 } 963 catch(e){ 964 console.log("Error with itinerary flashbanner tracking."+e.message); 965 } 966 break; 967 968 //dtc4102/accept PTU impression 969 case 'select_promotion': 970 var payload=options.payload; 971 972 try{ 973 window.dataLayer.push({ 974 'event': 'select_promotion', 975 'ecommerce': { 976 'promoClick': { 977 'promotions': [{ 978 'id':payload.attributes.confirmationSummaryInfo.attributes.extrasDetailModel.id, 979 'name':payload.attributes.confirmationSummaryInfo.attributes.extrasDetailModel.name, 980 'creative':'PTU', 981 'position': 1, 982 'promoAmount':payload.attributes.confirmationSummaryInfo.attributes.extrasDetailModel.price 983 }] 984 } 985 } 986 }); 987 988 } 989 catch(e){ 990 console.log("Error with PTU impression."+e.message); 991 } 992 break; 993 994 //dtc4102/accept PTU impression 995 case 'view_promotion': 996 var payload=options.payload; 997 998 try{ 999 window.dataLayer.push({ 1000 'event': 'view_promotion', 1001 'ecommerce': { 1002 'promoView': { 1003 'promotions': [{ 1004 'id':payload.attributes.confirmationSummaryInfo.attributes.extrasDetailModel.id, 1005 'name':payload.attributes.confirmationSummaryInfo.attributes.extrasDetailModel.name, 1006 'creative':'PTU', 1007 'position': 1 1008 } 1009 ] 1010 } 1011 } 1012 }); 1013 1014 }catch(e){ 1015 console.log("Error with PTU impression."+e.message); 1016 } 1017 break; 1018
1019 //dtc4102//AAA CDP validation 1020 //IRAC-4849 1021 case 'cdp_validation': 1022 var payload=options.payload; 1023 var CDP=""; 1024 1025 try{ 1026 var split_string=payload.name.split("-->"); 1027 var CDP_Index=split_string[1].indexOf("AAA"); 1028 var CDP_end_Index=split_string[1].indexOf("<!--"); 1029 CDP= split_string[1].substring(CDP_Index-1,CDP_end_Index); 1030 }catch(e){ 1031 CDP=payload.name; 1032 } 1033 1034 try{ 1035 window.dataLayer.push({ 1036 'event': 'cdp_validation', 1037 'cdp_id':payload.id, 1038 'cdp_name':CDP, 1039 'cdp_status':payload.status 1040 }); 1041 } 1042 catch(e){ 1043 console.log("Error with AAA CDPvalidation."+e.message); 1044 } 1045 break; 1046 1047 //Rental Search 1048 case 'rental-search': 1049 try{ 1050 var formData=options.payload[0]; //dtc4102//IRAC-5349 Recommendation Engine Tracking 1051 var isRecommendationEngine=(options.payload[1])?options.payload[1]:"undefined"; 1052 1053 window.dataLayer.push({ 1054 'event':'rental_search', 1055 'pickUpLocationCode':(formData!=undefined)?formData.pickupHiddenEOAG:"undefined", 1056 'dropoffLocationCode':(formData!=undefined)?formData.dropoffHiddenEOAG:"undefined", 1057 'pickupCity':(formData.itinerary)?((formData.itinerary.pickupLocation!=undefined)?formData.itinerary.pickupLocation.city:"undefined"):"undefined", 1058 'dropoffCity':(formData.itinerary)?((formData.itinerary.dropoffLocation!=undefined)?formData.itinerary.dropoffLocation.city:"undefined"):"undefined", 1059 'pickupDate_mmddyy':(formData!=undefined)?formData.pickupDay:"undefined", 1060 'dropoffDate_mmddyy':(formData!=undefined)?formData.dropoffDay:"undefined", 1061 'pickupCountryCode':(formData.itinerary)?((formData.itinerary.pickupLocation!=undefined)?formData.itinerary.pickupLocation.countryCode:"undefined"):"undefined", 1062 'dropoffCountryCode':(formData.itinerary.dropoffLocation!=undefined)?formData.itinerary.dropoffLocation.countryCode:"undefined", 1063 'pickupDoW':"", 1064 'dropoffDoW':"", 1065 'pickupMonth_mm':"", 1066 'dropoffMonth_mm':"", 1067 'pickupState':(formData!=undefined)?formData.inpPickupStateCode:"undefined", 1068 'dropoffState':(formData.itinerary)?((formData.itinerary.dropoffLocation!=undefined)?formData.itinerary.dropoffLocation.state:"undefined"):"undefined", 1069 'pickupTime24HR':(formData!=undefined)?formData.pickupTime:"undefined", 1070 'dropoffTime24HR':(formData!=undefined)?formData.dropoffTime:"undefined", 1071 'pickupYear_yyyy':"", 1072 'dropoffYear_yyyy':"", 1073 'pickupOAGCode':(formData!=undefined)?formData.pickupHiddenEOAG:"undefined", 1074 'dropoffOAGCode':(formData!=undefined)?formData.dropoffHiddenEOAG:"undefined", 1075 'rentalDays':self.calculate("rentalDays",formData.pickupDay,formData.dropoffDay,formData.pickupTime,formData.dropoffTime,formData.militaryClock), 1076 'reservationLocationType':"", 1077 'isDomestic':"", 1078 'isOneWay':(formData.itinerary!=undefined)?formData.itinerary.isOneWay:"undefined", 1079 'bookingWindow':"", 1080 'ageRange':(formData.itinerary!=undefined)?formData.itinerary.age:"undefined", 1081 'isRecommendationEngine':isRecommendationEngine 1082 }); 1083 } 1084 catch(e){ 1085 console.log("Error with Rental Search."+e.message); 1086 } 1087 break; 1088 1089 //dtc4102//IRAC-5349 Recommendation Engine Tracking 1090 case 'recommendation-engine': 1091 var payload=options.payload; 1092 1093 try{ 1094 window.dataLayer.push({ 1095 'event':'recommendation_engine', 1096 'recommendation_type': 'vehicles', 1097 'recommendation_sipp': (payload.recommendationSipp!=undefined)?payload.recommendationSipp:"undefined", 1098 'recommendation_weight': (payload.recommendationWeight!=undefined)?payload.recommendationWeight:"undefined" 1099 }); 1100 } 1101 catch(e){ 1102 console.log("Error with Rental Search."+e.message); 1103 } 1104 break; 1105 1106 //Look up reservation 1107 case 'lookup-reservation': 1108 var payload=options.payload; 1109 1110 try{ 1111 window.dataLayer.push({ 1112 'event':'lookup_reservation', 1113 'lookup_status':payload.response, 1114 'lookup_code':payload.code 1115 }); 1116 } 1117 catch(e){ 1118 console.log("Error with Look up reservation."+e.message); 1119 } 1120 break; 1121 1122 1123 // Email Sign Up 1124 case 'email-sign-up': 1125 var location=options.payload; 1126 1127 try{ 1128 window.dataLayer.push({ 1129 'event':'email_signup', 1130 'notification_signup_location':location 1131 }); 1132 } 1133 catch(e){ 1134 console.log("Error with Email Sign Up."+e.message); 1135 } 1136 break; 1137 1138 // SMS Sign Up 1139 case 'sms-sign-up': 1140 var location=options.payload;
1141 try{ 1142 window.dataLayer.push({ 1143 'event':'sms_signup', 1144 'notification_signup_location':location 1145 }); 1146 } 1147 catch(e){ 1148 console.log("Error with SMS Sign Up."+e.message); 1149 } 1150 break; 1151 1152 // Error-Tracking 1153 case 'system-errordata-tracking': 1154 var defaultValue=options.payload; 1155 if(defaultValue){ 1156 for (i = 0; i < defaultValue.length; i++) { 1157 var errorDetail = defaultValue[i].match(/\[(.*?)\]/); 1158 if (errorDetail) { 1159 var errorType = errorDetail[1]; 1160 var errorMsg = errorDetail.input.replace(/ *\[[^\]]*]/, ''); 1161 var cleanErrorMsg = errorMsg.replace(/<[^>]*>/g, ''); 1162 } 1163 1164 try{ 1165 window.dataLayer.push({ 1166 'event': 'error', 1167 'error_type': errorType, 1168 'error_message': cleanErrorMsg 1169 }); 1170 } 1171 catch(e){ 1172 console.log("Error with tracking form errors."+e.message); 1173 } 1174 } 1175 } 1176 break; 1177 1178 case 'submit-reservation-tracking': 1179 var defaultValue=options.payload; 1180 try{ 1181 window.dataLayer.push({ 1182 'event': 'submit_reservation', 1183 'status': defaultValue 1184 }); 1185 } 1186 catch(e){ 1187 console.log("Error with submit-reservation-tracking"+e.message); 1188 } 1189 break; 1190 1191 case 'error-message-tracking': 1192 var defaultValue=options.payload; 1193 if(defaultValue != undefined){ 1194 var errorDetail = defaultValue.match(/\[(.*?)\]/); 1195 if (errorDetail != undefined) { 1196 var errorType = errorDetail[1]; 1197 var errorMsg = errorDetail.input.replace(/ *\[[^\]]*]/, ''); 1198 var cleanErrorMsg = errorMsg.replace(/<[^>]*>/g, ''); 1199 } 1200 1201 try{ 1202 window.dataLayer.push({ 1203 'event': 'error', 1204 'error_type': errorType, 1205 'error_message': cleanErrorMsg 1206 }); 1207 } 1208 catch(e){ 1209 console.log("Error with tracking form errors."+e.message); 1210 } 1211 } 1212 break; 1213 1214 // Filter & Sort Vehicles 1215 case 'filter-sort-vehicles': 1216 var filter=options.payload; 1217 var category=self.findFilter(filter,"category"); 1218 var selection=self.findFilter(filter,"selection"); 1219 try{ 1220 window.dataLayer.push({ 1221 'event':'filter_vehicle_list', 1222 'filter_category':category, 1223 'filter_selection':selection 1224 }); 1225 } 1226 catch(e){ 1227 console.log("Error with Filter & Sort Vehicles."+e.message); 1228 } 1229 break; 1230 1231 //Apply Discount 1232 case 'apply-discount': 1233 var discount=options.payload; 1234 var discountType=discount.discountType; 1235 var discountCode=discount.discountCode; 1236 1237 try{ 1238 window.dataLayer.push({ 1239 'event':'apply_discount', 1240 'discount_type':discountType, 1241 'discount_code':discountCode 1242 }); 1243 } 1244 catch(e){ 1245 console.log("Error with Apply Discount."+e.message); 1246 } 1247 break; 1248 1249 //ENHANCED ECOMMERCE Setup//Impressions - Product Data Car 1250 case 'impressions-car': 1251 var vehicles=options.payload; 1252 1253 for (i in vehicles){ 1254 var price; 1255 if(vehicles[i].quotes.length>1){ 1256 1257 vehicles[i]["availability"] = "vehicle list – available"; 1258 1259 if(vehicles[i].quotes[0] != null && vehicles[i].quotes[1] != null){ 1260 if(vehicles[i].quotes[0].cannotBeQuoted != undefined && vehicles[i].quotes[1].cannotBeQuoted != undefined && 1261 vehicles[i].quotes[0].cannotBeQuoted == '1' && vehicles[i].quotes[1].cannotBeQuoted == '1'){ 1262 vehicles[i]["availability"] = "vehicle list – cannot be quoted"; 1263 }else if(vehicles[i].quotes[0].unavailable != undefined && vehicles[i].quotes[1].unavailable != undefined && 1264 vehicles[i].quotes[0].unavailable == '1' && vehicles[i].quotes[1].unavailable == '1'){ 1265 vehicles[i]["availability"] = "vehicle list – no rate available"; 1266 } 1267 } 1268 if(vehicles[i].quotes[0] == null && vehicles[i].quotes[1] == null){ 1269 vehicles[i]["availability"] = "vehicle list – no rate available"; 1270 } 1271 1272 for(j in vehicles[i].quotes){ 1273 1274 if(vehicles[i].quotes[j]==null){ 1275 j++; 1276 price=vehicles[i].quotes[j].approxTotalPrice?vehicles[i].quotes[j].approxTotalPrice:vehicles[i].quotes[j].price; 1277 break; 1278 } 1279 else if(vehicles[i].quotes[j].prepaid==0){ 1280 price=vehicles[i].quotes[j].approxTotalPrice?vehicles[i].quotes[j].approxTotalPrice:vehicles[i].quotes[j].price; 1281 break; 1282 } 1283 } 1284 1285 }else{ 1286 if(vehicles[i].quotes[0]!=null){ 1287 if(vehicles[i].quotes[0].selectForQuote != undefined && vehicles[i].quotes[0].selectForQuote == '1'){ 1288 vehicles[i]["availability"] = "vehicle list – select for quote"; 1289 }else if(vehicles[i].quotes[0].soldout != undefined && vehicles[i].quotes[0].soldout == '1'){ 1290 vehicles[i]["availability"] = "vehicle list – sold out"; 1291 }else if (vehicles[i].quotes[0].call != undefined && vehicles[i].quotes[0].call == '1'){ 1292 vehicles[i]["availability"] = "vehicle list - call to book"; 1293 }else if (vehicles[i].quotes[0].unavailable != undefined && vehicles[i].quotes[0].unavailable == '1'){ 1294 vehicles[i]["availability"] = "vehicle list - Rate Not Available"; 1295 }else{ 1296 vehicles[i]["availability"] = "vehicle list – available"; 1297 } 1298 price=vehicles[i].quotes[0].approxTotalPrice; 1299 1300 if(isNaN(price)==true){ 1301 price=vehicles[i].quotes[0].price; 1302 } 1303 }else { 1304 vehicles[i]["availability"] = "vehicle list – no rate available"; 1305 } 1306 } 1307 try{ 1308 var currentObj={ 1309 'id':vehicles[i].sipp, 1310 'name':vehicles[i].name, 1311 'category':vehicles[i].carTypeDisplay, 1312 'brand': "car", 1313 'variant': vehicles[i].passengers, 1314 'price':parseFloat(price) ,//dtc4102//IRAC-4952//added condition to check quote[1] if quote[0] is null for european region 1315 'position':vehicles[i].vehicleIndex+1, 1316 'list': vehicles[i].availability 1317 } 1318 if(vehicles[i].allNotAvailableOrSoldout != undefined && !vehicles[i].allNotAvailableOrSoldout){ 1319 trackingObjectArray.push(currentObj); 1320 } 1321 }catch(e){ 1322 console.log("Error with Impressions - Product Data Car."+e.message); 1323 } 1324 } 1325 1326 window.dataLayer.push({ 1327 'event': 'view_item_list', 1328 'ecommerce':{ 1329 'impressions':trackingObjectArray 1330 } 1331 }); 1332 1333 break; 1334 1335 //ENHANCED ECOMMERCE Setup//Impressions - Product Data Add on Extras 1336 case 'impressions-addOn': 1337 var categories=options.payload; 1338 1339 for (i in categories){ 1340 for(j in categories[i].extras){ 1341 try{ 1342 var currentObj={ 1343 'id':categories[i].extras[j].id, 1344 'name':categories[i].extras[j].name, 1345 'category':categories[i].name, 1346 'brand': "add-on", 1347 'variant': '', 1348 'price':parseFloat(categories[i].extras[j].price) , 1349 'unit': categories[i].extras[j].periodText, 1350 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined", 1351 'position':parseInt(j)+1, 1352 'list': 'add on list' 1353 } 1354 1355 trackingObjectArray.push(currentObj); 1356 }catch(e){ 1357 console.log("Error with Impressions - Product Data Add on Extras."+e.message); 1358 } 1359 } 1360 } 1361 1362 self.clearField(); 1363 window.dataLayer.push({ 1364 'event': 'view_item_list', 1365 'ecommerce':{ 1366 'impressions':trackingObjectArray 1367 } 1368 }); 1369 1370 break; 1371 1372 //ENHANCED ECOMMERCE Setup//Product View - Car 1373 case 'productView-car': 1374 var details=options.payload; 1375 1376 try{ 1377 var currentObj={ 1378 'id':details.get("sipp"), 1379 'name':details.get("name"), 1380 'category':details.get("carTypeDisplay"), 1381 'brand': "car", 1382 'variant': details.get("passengers"), 1383 'price':'' ,//need price 1384 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1385 } 1386 1387 trackingObjectArray.push(currentObj); 1388 1389 }catch(e){ 1390 console.log("Error with Product View - Car ."+e.message); 1391 } 1392 1393 self.clearField(); 1394 window.dataLayer.push({ 1395 'event': 'view_item', 1396 'ecommerce':{ 1397 'currencyCode':htz.tracking.common.currencyCode, 1398 'detail': { 1399 'actionField': {'list': 'vehicle list'}, 1400 'products': trackingObjectArray 1401 } 1402 } 1403 }); 1404 1405 break; 1406 1407 //dtc4102 1408 // irac-773 1409 //Vehicle Upsell Tracking Events Update 1410 case 'upsellDisplayed': 1411 var payload =options.payload; 1412 var selectedCar={}; 1413 var selectedCarIndex; 1414 1415 try{ 1416 for (i in payload){ 1417 if(payload[i].selected && payload[i].selected==1){ 1418 selectedCar=payload[i]; 1419 selectedCarIndex=i; 1420 } 1421 } 1422 for (i in payload) { 1423 if(i!=selectedCarIndex){ 1424 var currentObj={ 1425 "upsellPriceDifference":payload[i].upsellPrice-selectedCar.upsellPrice, 1426 "currentSipp": selectedCar.sipp, 1427 "currentTotalPrice": selectedCar.upsellPrice, 1428 "upsellSipp": payload[i].sipp, 1429 "upsellTotalPrice": payload[i].upsellPrice 1430 } 1431 trackingObjectArray.push(currentObj); 1432 1433 } 1434 } 1435 1436 window.dataLayer.push({ 1437 'event': 'upsellDisplayed', 1438 'upsells':trackingObjectArray 1439 }); 1440 1441 }catch(e){ 1442 console.log("Error with upsellDisplayed View."+e.message); 1443 } 1444 1445 break; 1446 1447 //dtc4102 1448 // irac-773 1449 //Vehicle Upsell Tracking Events Update 1450 case 'upsellError': 1451 var errorCode =options.payload; 1452 1453 try{ 1454 window.dataLayer.push({ 1455 'event': 'error', 1456 "error_type": "vehicle upsell", 1457 'error_message':errorCode 1458 }); 1459 1460 }catch(e){ 1461 console.log("Error with upsellDisplayed Error View ."+e.message); 1462 } 1463 1464 break; 1465 1466 1467 //dtc4102//23.19//irac-490 1468 // Please add tracking code on checkout page for vehicle upsells - INC001777224 1469 case 'vehicleUpgrade': 1470 var details=options; 1471 1472 try{ 1473 window.dataLayer.push({ 1474 'event':details.scenario, 1475 'oldSipp':details.oldSipp, 1476 'newSipp':details.newSIPP, 1477 }); 1478 }catch(e){ 1479 console.log("Error with vehicle upgrade ."+e.message); 1480 } 1481 break; 1482 1483 //dtc4102//23.19//irac-490 1484 // Please add tracking code on checkout page for vehicle upsells - INC001777224 1485 case 'upgradeReselect': 1486 var details=options; 1487 1488 try{ 1489 window.dataLayer.push({ 1490 'event':details.scenario, 1491 'oldSipp':details.oldSipp, 1492 'newSipp':details.newSIPP, 1493 }); 1494 }catch(e){ 1495 console.log("Error with vehicle upgrade ."+e.message); 1496 } 1497 break; 1498 1499 //ENHANCED ECOMMERCE Setup//Add to Cart - Car 1500 case 'addToCart-car': 1501 var details=options.payload; 1502 1503 try{ 1504 var currentObj={ 1505 'id':details.model.id, 1506 'name':details.options.name, 1507 'category':details.options.carTypeDisplay, 1508 'brand': "car", 1509 'variant': '', 1510 'price':parseFloat(details.model.get("approxTotalPrice")) , 1511 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1512 } 1513 1514 trackingObjectArray.push(currentObj); 1515 1516 self.clearField(); 1517 window.dataLayer.push({ 1518 'event': 'add_to_cart', 1519 'ecommerce':{ 1520 'currencyCode': details.model.get("currency"), 1521 'add':{ 1522 'products':trackingObjectArray 1523 } 1524 } 1525 }); 1526 1527 }catch(e){ 1528 console.log("Error with Add to Cart - Car ."+e.message); 1529 } 1530 1531 1532 1533 break; 1534 1535 //ENHANCED ECOMMERCE Setup//Product Click - Car 1536 case 'productClick-car': 1537 var details=options.payload.model.toJSON(); 1538 if(details != undefined && details != null){ 1539 if(details.prepaid == '0' && details.price != "" && details.selectForQuote != "1" 1540 && details.call != '1'){ 1541 var propValue = 'pay later'; 1542 }else if(details.prepaid == '1' && details.price != "" && details.selectForQuote != "1" 1543 && details.call != '1'){ 1544 var propValue = 'pay now'; 1545 }else if(details.selectForQuote == '1' && details.call != '1'){ 1546 var propValue = 'select for quote'; 1547 }else if(details.call == '1' && details.selectForQuote != '1'){ 1548 var propValue = 'call to book'; 1549 }else{ 1550 var propValue = 'undefined'; 1551 } 1552 } 1553 1554 try{ 1555 var currentObj={ 1556 'id':details.id, 1557 'name':'', 1558 'category':'', 1559 'brand': "car", 1560 'variant': '', 1561 'price':parseFloat(details.approxTotalPrice) , 1562 'position': parseInt(details.quoteIndex), 1563 'availability': propValue 1564 } 1565 1566 trackingObjectArray.push(currentObj); 1567 1568 }catch(e){ 1569 console.log("Error with Product Click - Car."+e.message); 1570 } 1571 1572 self.clearField(); 1573 window.dataLayer.push({ 1574 'event': 'select_item', 1575 'ecommerce': { 1576 'click': { 1577 'actionField': {'list':'vehicle list-' + propValue }, 1578 'products': trackingObjectArray 1579 } 1580 } 1581 }); 1582 1583 break; 1584 1585 //ENHANCED ECOMMERCE Setup//Remove from Cart-Car 1586 case 'removeFromCart-car': 1587 var details=options.payload; 1588 1589 try{ 1590 var currentObj={ 1591 'id':details.get("vehicle").get("sipp"), 1592 'name':details.get("vehicle").get("name"), 1593 'category':details.get("vehicle").get("carTypeDisplay"), 1594 'brand': "car", 1595 'variant': details.get("vehicle").get("passengers"), 1596 'price':parseFloat(details.get("rateInfo").get("approxTotal")), 1597 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1598 } 1599 1600 trackingObjectArray.push(currentObj); 1601 1602 }catch(e){ 1603 console.log("Error with Remove from Cart-Car."+e.message); 1604 } 1605 1606 self.clearField(); 1607 window.dataLayer.push({ 1608 'event': 'remove_from_cart', 1609 'ecommerce':{ 1610 'currencyCode': htz.tracking.common.currencyCode, 1611 'remove': { 1612 'products': trackingObjectArray 1613 } 1614 } 1615 }); 1616 break; 1617 1618 //ENHANCED ECOMMERCE Setup//Add to Cart - Add on Extras 1619 case 'addToCart-addOnExtras': 1620 var details=options.payload; 1621 1622 try{ 1623 var currentObj={ 1624 'id':details.get("id"), 1625 'name':details.get("name"), 1626 'category':'', 1627 'brand': "add-on", 1628 'variant': '', 1629 'price':parseFloat(details.get("price")), 1630 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1631 } 1632 1633 trackingObjectArray.push(currentObj); 1634 1635 }catch(e){ 1636 console.log("Error with Add to Cart - Add on Extras."+e.message); 1637 } 1638 1639 self.clearField(); 1640 window.dataLayer.push({ 1641 'event': 'add_to_cart', 1642 'ecommerce':{ 1643 'currencyCode': htz.tracking.common.currencyCode, 1644 'add': { 1645 'products': trackingObjectArray 1646 } 1647 } 1648 }); 1649 break; 1650 1651 //ENHANCED ECOMMERCE Setup//Product Click - Add on Extras 1652 case 'productClick-addOnExtras': 1653 var details=options.payload; 1654 1655 try{ 1656 var currentObj={ 1657 'id':details.get("id"), 1658 'name':details.get("name"), 1659 'category':'', 1660 'brand': "add-on", 1661 'variant': '', 1662 'price':parseFloat(details.get("price")), 1663 'position': '' 1664 } 1665 1666 trackingObjectArray.push(currentObj); 1667 1668 }catch(e){ 1669 console.log("Error with Product Click - Car."+e.message); 1670 } 1671 1672 self.clearField(); 1673 window.dataLayer.push({ 1674 'event': 'select_item', 1675 'ecommerce': { 1676 'click': { 1677 'actionField': {'list':'add on list' }, 1678 'products': trackingObjectArray 1679 } 1680 } 1681 }); 1682 1683 break; 1684 1685 //ENHANCED ECOMMERCE Setup//Remove from Cart-Add on Extras 1686 case 'removeFromCart-addOnExtras': 1687 var details=options.payload; 1688 1689 try{ 1690 var currentObj={ 1691 'id':details.get("id"), 1692 'name':details.get("name"), 1693 'category':'', 1694 'brand': "add-on", 1695 'variant': '', 1696 'price':parseFloat(details.get("price")), 1697 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1698 } 1699 1700 trackingObjectArray.push(currentObj); 1701 1702 }catch(e){ 1703 console.log("Error with Remove from Cart-Add on Extras."+e.message); 1704 } 1705 1706 self.clearField(); 1707 window.dataLayer.push({ 1708 'event': 'remove_from_cart', 1709 'ecommerce':{ 1710 'currencyCode': htz.tracking.common.currencyCode, 1711 'remov
1711e': { 1712 'products': trackingObjectArray 1713 } 1714 } 1715 }); 1716 break; 1717 1718 //Checkout Funnel// Step 1 - Choose your vehicle 1719 case 'begin_checkout': 1720 var vehicles=options.payload; 1721 1722 for (i in vehicles){ 1723 for(j in vehicles[i].quotes){ 1724 try{ 1725 var currentObj={ 1726 'id':vehicles[i].quotes[j].id, 1727 'name':vehicles[i].name, 1728 'category':vehicles[i].carTypeDisplay, 1729 'brand': "car", 1730 'variant': vehicles[i].passengers, 1731 'price':parseFloat(vehicles[i].quotes[j].approxTotalPrice) , 1732 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined", 1733 'position':vehicles[i].quotes[j].vehicleIndex+1, 1734 'list': 'vehicle list' 1735 } 1736 1737 trackingObjectArray.push(currentObj); 1738 }catch(e){ 1739 console.log("Error with Checkout Funnel-Step 1 - Choose your vehicle"+e.message); 1740 } 1741 } 1742 } 1743 1744 self.clearField(); 1745 window.dataLayer.push({ 1746 'event': 'begin_checkout', 1747 'step_name': '1 - choose your vehicle', 1748 'ecommerce': { 1749 'checkout': { 1750 'actionField': {'step': 1} 1751 }, 1752 'impressions': trackingObjectArray 1753 } 1754 }); 1755 1756 break; 1757 1758 //Checkout Funnel- Step 2 - Choose your vehicle 1759 case 'checkout_add-ons-step': 1760 var addOnsPayload = options.payload || {}; 1761 var categories = addOnsPayload.optionals; 1762 var vehicle = addOnsPayload.vehicle; 1763 var rateInfo = addOnsPayload.rateInfo; 1764 if (!vehicle || !rateInfo) { 1765 break; 1766 } 1767 if (!categories) { 1768 categories = []; 1769 } 1770 for (i in categories){ 1771 try{ 1772 var currentObj={ 1773 'id':'', 1774 'name':categories[i].name, 1775 'category':categories[i].key, 1776 'brand': "add-on", 1777 'variant': '', 1778 'price':parseFloat(categories[i].unitRate) , 1779 'quantity': categories[i].quantity, 1780 'position':'',//need position 1781 'list': 'add on list' 1782 } 1783 1784 trackingObjectArray.push(currentObj); 1785 }catch(e){ 1786 console.log("Error with Checkout Funnel- Step 2 - Choose your vehicle."+e.message); 1787 } 1788 } 1789 1790 self.clearField(); 1791 window.dataLayer.push({ 1792 'event': 'checkout_add-ons-step', 1793 'step_name': '2 - choose add-ons', 1794 'ecommerce': { 1795 'checkout': { 1796 'actionField': {'step': 2}, 1797 'products':[{ 1798 'name': vehicle.name, 1799 'id': vehicle.sipp, 1800 'price': parseFloat(rateInfo.approxTotal), 1801 'brand': 'car', 1802 'category': vehicle.carTypeDisplay, 1803 'variant': vehicle.passengers, 1804 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1805 1806 }], 1807 }, 1808 'impressions': trackingObjectArray 1809 } 1810 }); 1811 1812 break; 1813 1814 //Checkout Funnel- Step 3 - Checkout & Payment 1815 case 'add_payment_info': 1816 var paymentPayload = options.payload || {}; 1817 var payLaterSection = paymentPayload.payLater; 1818 var payNowSection = paymentPayload.payNow; 1819 var payLaterExtras = (payLaterSection && payLaterSection.extras) ? payLaterSection.extras : []; 1820 var payNowExtras = (payNowSection && payNowSection.extras) ? payNowSection.extras : []; 1821 try{ 1822 var categories = paymentPayload.optionals; 1823 var vehicle = paymentPayload.vehicle; 1824 var rateInfo = paymentPayload.rateInfo; 1825 if (!vehicle || !rateInfo) { 1826 break; 1827 } 1828 if (!categories) { 1829 categories = []; 1830 } 1831 var selectedVehicle={ 1832 'name': vehicle.name, 1833 'id': vehicle.sipp, 1834 'price': parseFloat(rateInfo.approxTotal), 1835 'brand': 'car', 1836 'category': vehicle.carTypeDisplay, 1837 'variant': vehicle.passengers, 1838 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1839 } 1840 trackingObjectArray.push(selectedVehicle); 1841 1842 for (i in categories){ 1843 try{ 1844 var currentObj={ 1845 'id':categories[i].key, 1846 'name':categories[i].name, 1847 'category':'', 1848 'brand': "add-on", 1849 'variant': '', 1850 'price':categories[i].unitRate, 1851 'quantity': categories[i].quantity 1852 } 1853 if(categories[i].quantity>0){ 1854 trackingObjectArray.push(currentObj); 1855 } 1856 }catch(e){ 1857 console.log("Error with Checkout Funnel- Step 2 - Choose your vehicle."+e.message); 1858 } 1859 } 1860 1861 for (i in payLaterExtras) { 1862 try { 1863 var currentObj = { 1864 'id': payLaterExtras[i].id, 1865 'name': payLaterExtras[i].name, 1866 'price': payLaterExtras[i].total, 1867 'brand': 'add-on', 1868 'category': '', 1869 'variant': '', 1870 'quantity':payLaterExtras[i].quantity 1871 } 1872 if (payLaterExtras[i].quantity > 0) { 1873 trackingObjectArray.push(currentObj); 1874 } 1875 } 1876 catch (e) { 1877 console.log(e.message); 1878 } 1879 } 1880 1881 for (i in payNowExtras) { 1882 try { 1883 var currentObj = { 1884 'id': payNowExtras[i].id, 1885 'name': payNowExtras[i].name, 1886 'price': payNowExtras[i].total, 1887 'brand': 'add-on', 1888 'category': '', 1889 'variant': '', 1890 'quantity':payNowExtras[i].quantity 1891 } 1892 if (payNowExtras[i].quantity > 0) { 1893 trackingObjectArray.push(currentObj); 1894 } 1895 } 1896 catch (e) { 1897 console.log(e.message); 1898 } 1899 } 1900 1901 self.clearField(); 1902 window.dataLayer.push({ 1903 'event': 'add_payment_info', 1904 'step_name': '3 - review and book', 1905 'ecommerce': { 1906 'checkout': { 1907 'actionField': {'step': 3}, 1908 'currencyCode': rateInfo.currency, 1909 'products':trackingObjectArray 1910 } 1911 } 1912 }); 1913 }catch(e){ 1914 console.log("Error with Checkout Funnel- Purchase / Booking confirmation."+e.message); 1915 } 1916 1917 break; 1918 1919 //Checkout Funnel- Purchase / Booking confirmation 1920 case 'purchase': 1921 var confirmationSummaryInfo=options.payload.confirmationSummaryInfo; 1922 var vehicle=options.payload.model.get("rateDetails").get("vehicle"); 1923 var rateInfo=options.payload.model.get("rateDetails").get("rateInfo"); 1924 var categories=options.payload.model.get("rateDetails").get("optionals").models; 1925 var payLaterExtras=options.payload.model.get("rateDetails").get("payLater").get("extras").models; 1926 var payNowExtras=options.payload.model.get("rateDetails").get("payNow").get("extras").models; 1927 1928 try{ 1929 var selectedVehicle={ 1930 'name': vehicle.get("name"), 1931 'id': vehicle.get("sipp"), 1932 'price': parseFloat(rateInfo.get("approxTotal")), 1933 'brand': 'car', 1934 'category': vehicle.get("carTypeDisplay"), 1935 'variant': vehicle.get("passengers"), 1936 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 1937 } 1938 trackingObjectArray.push(selectedVehicle); 1939 1940 for (i in categories){ 1941 var currentObj={ 1942 'id': categories[i].get("key"), 1943 'name': categories[i].get("name"), 1944 'category':'', 1945 'brand': "add-on", 1946 'variant': '', 1947 'price': categories[i].get("unitRate") , 1948 'quantity': categories[i].get("quantity") 1949 } 1950 if (categories[i].get("quantity") > 0) { 1951 trackingObjectArray.push(currentObj); 1952 } 1953 } 1954 1955 for (i in payLaterExtras) { 1956 try { 1957 var currentObj = { 1958 'id': payLaterExtras[i].get("id"), 1959 'name': payLaterExtras[i].get("name"), 1960 'price': payLaterExtras[i].get("total"), 1961 'brand': 'add-on', 1962 'category': '', 1963 'variant': '', 1964 'quantity':payLaterExtras[i].get("quantity") 1965 } 1966 if (payLaterExtras[i].get("quantity") > 0) { 1967 trackingObjectArray.push(currentObj); 1968 } 1969 } 1970 catch (e) { 1971 console.log(e.message); 1972 } 1973 } 1974 1975 for (i in payNowExtras) { 1976 try { 1977 var currentObj = { 1978 'id': payNowExtras[i].get("id"), 1979 'name': payNowExtras[i].get("name"), 1980 'price': payNowExtras[i].get("total"), 1981 'brand': 'add-on', 1982 'category': '', 1983 'variant': '', 1984 'quantity':payNowExtras[i].get("quantity") 1985 } 1986 if (payNowExtras[i].get("quantity") > 0) { 1987 trackingObjectArray.push(currentObj); 1988 } 1989 } 1990 catch (e) { 1991 console.log(e.message); 1992 } 1993 } 1994 1995 self.clearField(); 1996 window.dataLayer.push({ 1997 'checkout_funnel_type': 'regular', 1998 'discountAmount': '', 1999 'reservationDaysOut': '', 2000 'rentalDays': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined", 2001 'carRevenue': parseFloat(rateInfo.get("approxTotal")), //car revenue 2002 'extrasAmount':'', 2003 'event': 'purchase', 2004 'ecommerce':{ 2005 'purchase': { 2006 'actionField': { 2007 'id': confirmationSummaryInfo.confirmationNumber, 2008 'affiliation':'', //payment type: pay now or later 2009 'revenue': parseFloat(rateInfo.get("approxTotal")), 2010 'tax':'', 2011 'coupon': '' //coupon code applied to booking 2012 }, 2013 'currencyCode': rateInfo.get("currency"), 2014 'products':trackingObjectArray 2015 } 2016 } 2017 }); 2018 2019 }catch(e){ 2020 console.log("Error with Checkout Funnel- Purchase / Booking confirmation."+e.message); 2021 } 2022 2023 break; 2024 2025 //Checkout Funnel- Step 4 - Modify Reservation 2026 case 'checkout_modify_reservation': 2027 var vehicle=options.payload.get("rateDetails").get("vehicle"); 2028 var rateInfo=options.payload.get("rateDetails").get("rateInfo"); 2029 var categories=options.payload.get("rateDetails").get("optionals"); 2030 2031 try{ 2032 var selectedVehicle={ 2033 'name': vehicle.get("name"), 2034 'id': vehicle.get("sipp"), 2035 'price': parseFloat(rateInfo.get("approxTotal")), 2036 'brand': 'car', 2037 'category': vehicle.get("carTypeDisplay"), 2038 'variant': vehicle.get("passengers"), 2039 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 2040 } 2041 trackingObjectArray.push(selectedVehicle); 2042 2043 for (i in categories){ 2044 try{ 2045 var currentObj={ 2046 'id':'', 2047 'name':categories.get("name"), 2048 'category':categories.get("key"), 2049 'brand': "add-on", 2050 'variant': '', 2051 'price':parseFloat(categories.get("unitRate")) , 2052 'quantity': categories.get("quantity") 2053 } 2054 if(categories[i].quantity>0){ 2055 trackingObjectArray.push(currentObj); 2056 } 2057 }catch(e){ 2058 console.log("Error with Step 4 - Modify Reservation."+e.message); 2059 } 2060 } 2061 2062 self.clearField(); 2063 window.dataLayer.push({ 2064 'event': 'checkout_modify_reservation', 2065 'step_name': '4 - modify reservation', 2066 'ecommerce': { 2067 'checkout': { 2068 'actionField':{'step':4}, 2069 'products':trackingObjectArray 2070 } 2071 } 2072 }); 2073 }catch(e){ 2074 console.log("Error with Checkout Funnel- Purchase / Booking confirmation."+e.message); 2075 } 2076 2077 break; 2078 2079 //Custom Events//Modify Reservation 2080 case 'modify_reservation': 2081 var confNumber=options.payload.confNumber; 2082 var modificationType=options.payload.modificationType; 2083 2084 window.dataLayer.push({ 2085 'event': 'modify_reservation', 2086 'modification_type':modificationType, 2087 'confirmation_code':confNumber 2088 }); 2089 2090 break; 2091 2092 //Checkout Funnel- Step 5 - Save Modification 2093 case 'modify_reservation_saved': 2094 var confirmationSummaryInfo=options.payload.confirmationSummaryInfo; 2095 var vehicle=options.payload.model.get("rateDetails").get("vehicle"); 2096 var rateInfo=options.payload.model.get("rateDetails").get("rateInfo"); 2097 var categories=options.payload.model.get("rateDetails").get("optionals").models; 2098 var payLaterExtras=options.payload.model.get("rateDetails").get("payLater").get("extras").models; 2099 var payNowExtras=options.payload.model.get("rateDetails").get("payNow").get("extras").models; 2100 2101 try{ 2102 var selectedVehicle={ 2103 'name': vehicle.get("name"), 2104 'id': vehicle.get("sipp"), 2105 'price': parseFloat(rateInfo.get("approxTotal")), 2106 'brand': 'car', 2107 'category': vehicle.get("carTypeDisplay"), 2108 'variant': vehicle.get("passengers"), 2109 'quantity': (htz.tracking!=undefined)?parseInt(htz.tracking.common.rentalDays):"undefined" 2110 } 2111 trackingObjectArray.push(selectedVehicle); 2112 2113 for (i in categories){ 2114 try{ 2115 var currentObj={ 2116 'id': categories[i].get("key"), 2117 'name': categories[i].get("name"), 2118 'category':'', 2119 'brand': "add-on", 2120 'variant': '', 2121 'price': categories[i].get("unitRate") , 2122 'quantity': categories[i].get("quantity") 2123 } 2124 if (categories[i].get("quantity") > 0) { 2125 trackingObjectArray.push(currentObj); 2126 } 2127 }catch(e){ 2128 console.log("Error with Checkout Funnel- Purchase / Booking confirmation."+e.message); 2129 } 2130 } 2131 2132 for (i in payLaterExtras) { 2133 try { 2134 var currentObj = { 2135 'id': payLaterExtras[i].get("id"), 2136 'name': payLaterExtras[i].get("name"), 2137 'price': payLaterExtras[i].get("total"), 2138 'brand': 'add-on', 2139 'category': '', 2140 'variant': '', 2141 'quantity':payLaterExtras[i].get("quantity") 2142 } 2143 if (payLaterExtras[i].get("quantity") > 0) { 2144 trackingObjectArray.push(currentObj); 2145 } 2146 } 2147 catch (e) { 2148 console.log(e.message); 2149 } 2150 } 2151 2152 for (i in payNowExtras) { 2153 try { 2154 var currentObj = { 2155 'id': payNowExtras[i].get("id"), 2156 'name': payNowExtras[i].get("name"), 2157 'price': payNowExtras[i].get("total"), 2158 'brand': 'add-on', 2159 'category': '', 2160 'variant': '', 2161 'quantity':payNowExtras[i].get("quantity") 2162 } 2163 if (payNowExtras[i].get("quantity") > 0) { 2164 trackingObjectArray.push(currentObj); 2165 } 2166 } 2167 catch (e) { 2168 console.log(e.message); 2169 } 2170 } 2171 2172 self.clearField(); 2173 window.dataLayer.push({ 2174 'event': 'modify_reservation_saved', 2175 'step_name': '5 - save modification', 2176 'ecommerce': { 2177 'checkout': { 2178 'actionField':{'step':5}, 2179 'currencyCode': rateInfo.get("currency"), 2180 'products':trackingObjectArray 2181 } 2182 } 2183 }); 2184 }catch(e){ 2185 console.log("Error with Checkout Funnel- Purchase / Booking confirmation."+e.message); 2186 } 2187 2188 break; 2189 } 2190 2191 2192 } 2193 } 2194 2195 return gtmTracker; 2196}); 2197 2198(function(){navigator.cookieEnabled||(window.location.href=htz.config.rootContext+"/errors/jsCookieErrorPage?noCookie
2198=true")})(); 2199var RestModel=Backbone.Model.extend({initialize:function(){this.on("error",this.syncError,this);this.on("sync",this.syncSuccess,this)},parse:function(a,b){if(Utils.hasSessionTimedOut(b,null))this.trackSessionTimeout(),this.handleSessionTimeout(b.getResponseHeader("Location"));else return a?a.data?this.parseModel(a.data):this.parseModel(a):this.parseModel({})},parseModel:function(a){return a},syncSuccess:function(a,b){b&&(b.message&&(b.message.fieldErrors||b.message.messages||b.message.systemErrors)? 2200(Utils.trackError(b.message,this.getPage()),this.get("preventErrorStorage")||(htz.helpers.SessionHelper.setItem("errors",JSON.stringify(b.message)),Utils.isUseStoragePolyfill()&&Utils.storeItemIE("ieErrors",b.message))):this.get("preventErrorStorage")||htz.helpers.SessionHelper.removeItem("errors"))},getErrors:function(a){try{return"string"==typeof a?null:JSON.parse(a.responseText)}catch(b){try{var c=window.location.hash,c=c?c.substring(1):"itinerary",d=""+a.responseText;0<d.length&&(d=d.replace(/(\r\n|\n|\r)/gm, 2201""),100<d.length&&(d=d.substring(0,100)));WebTracking.setError("debug-error-"+Utils.browserDeviceType()+"-"+c+"-"+this.get("href")+"-"+d+"-"+b.message,c)}catch(e){}return null}},syncError:function(a,b,c){a=b&&b.status?b.status:null;htz.helpers.SessionHelper.removeItem("errors");this.handleStatus(a,b,c);Loader.hideLoader()},handleStatus:function(a,b,c){if(htz.config.isApp&&(500==a||403==a))try{$.publish("error-"+a)}catch(d){}else 500===a?this.handleError500():403===a?this.handleError403():this.checkForErrors(this.getErrors(b), 2202c)},handleError500:function(){window.location.href=htz.config.rootContext+"/error/index.jsp"},handleError403:function(){window.location.href=htz.config.rootContext+"/reservation/"},handleSessionTimeout:function(a){a&&(window.location.href=a)},checkForErrors:function(a,b){if(a){if(a.message){this.trigger("message",this,a.message);a.message.fieldErrors&&this.trigger("fieldError",this,a.message.fieldErrors,b);if(a.message.messages||a.message.systemErrors||a.message.errorData){"phone"===htz.config.deviceGroup? 2203window.scrollTo(0,60):window.scrollTo(0,0);var c=b||this.get("errorLocation")||this.getErrorLocation();Utils.displayErrorMessage(a.message,c);a.message.messages?this.trigger("messages",this,a.message.messages):this.trigger("systemErrors",this,a.message.systemErrors);a.message.errorData&&this.trigger("errorData",this,a.message.errorData)}Utils.trackError(a.message,this.getPage())}a.data&&this.trigger("errordata",this,a.data)}},saveChanged:function(a,b,c){var d;_.isObject(a)||null==a?(d=a,c=b):(d={}, 2204d[a]=b);a=this.changedAttributes()?_.extend(this.changedAttributes(),d):d;a=this.isNew()?a:_.extend(a,{id:this.get("id")});c=c?_.clone(c):{};c=_.extend(c,{data:JSON.stringify(a),contentType:"application/json"});this.save(d,c)},url:function(){return this.get("href")},getPage:function(){return null},getErrorLocation:function(){return null},trackSessionTimeout:function(){try{"undefined"!==typeof WebTracking&&WebTracking.trackData({eVar22:"NZX305"})}catch(a){}}}); 2205"function"==typeof define&&define.amd&&define("utils/restmodel",["backbone"],function(){return RestModel}); 2206/** 2207 @description jQuery Cookie plugin - https://github.com/carhartl/jquery-cookie. 2208 Dual licensed under the MIT and GPL licenses: 2209 http://www.opensource.org/licenses/mit-license.php 2210 http://www.gnu.org/licenses/gpl.html 2211 @requires Jquery 2212 */ 2213(function(g){g.cookie=function(h,b,a){if(1<arguments.length&&(!/Object/.test(Object.prototype.toString.call(b))||null===b||void 0===b)){a=g.extend({},a);if(null===b||void 0===b)a.expires=-1;if("number"===typeof a.expires){var d=a.expires,c=a.expires=new Date;c.setDate(c.getDate()+d)}b=""+b;return document.cookie=[encodeURIComponent(h),"=",a.raw?b:encodeURIComponent(b),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure": 2214""].join("")}for(var a=b||{},d=a.raw?function(a){return a}:decodeURIComponent,c=document.cookie.split("; "),e=0,f;f=c[e]&&c[e].split("=");e++)if(d(f[0])===h)return d(f[1]||"");return null}})(jQuery); 2215window.checkHertzNameSpace("htz.utils"); 2216var LightBox=LightBox||function(){var c=function(){c.OVERLAYSEQUENCE+=1;this.id="light-box-"+c.OVERLAYSEQUENCE;this.zIndex+=10*c.OVERLAYSEQUENCE;c.INSTANCES.push(this)};c.OVERLAYSEQUENCE=0;c.INSTANCES=[];c.adjust=function(){for(var a=0;a<c.INSTANCES.length;a++){var b=c.INSTANCES[a];
2216b&&b.isInUse()&&b.adjustBackground()}};var e=null;c.prototype={inUse:!1,zIndex:1050,backBreak:600,avlWidth:0,pageContainer:null,id:"",background:null,foreground:null,dataContainer:null,orginalWidth:0,setDefaults:function(){this.params= 2217{url:"",top:0,left:0,width:500,height:"auto",hCenter:!0,vCenter:!1,scroll:!1,darkness:0.8,dismiss:!0,complete:null,error:null,close:null,zIndex:0,closeLabel:null,title:null,footNote:null,sourceElement:null,sourceElementOffset:null,bgSourceElement:null,plain:!1,referrer:null,hMargin:80,backButton:!0,showBackButton:!0,suppressClose:!1,autoScrollAdjust:!0,noPadding:!1,suppressHeader:!1,allowOverflow:!1}},getDisplayWidth:function(){return $("body").width()},ajaxError:function(a){try{this.showContent(htz.content.ajaxFail)}catch(b){}"function"== 2218typeof this.params.error&&this.params.error(a)},ajaxComplete:function(a){"function"==typeof this.params.complete&&this.params.complete(a)},renderTemplate:function(){var a=[];a.push('<div class="lb-background"></div>');a.push('<div class="lb-foreground">');this.params.backButton&&(this.params.showBackButton&&!htz.config.isApp)&&a.push('<div class="lb-back lb-close"><div><div class="icons-back_icon"></div></div><div>'+this.params.backLabel+"</div></div>");a.push('<div class="lb-foreground-cont" role="dialog" aria-label="'+ 2219this.params.title+'" tabindex="0">');if(!this.params.plain)if(this.params.suppressClose)this.params.title&&a.push('<header class="lb-header clearfix"><span class="swoosh multiline"><section>'+this.params.title+'</section></span><span class="lb-close lb-deny"></span></header>');else if(this.params.title&&this.params.closeLabel){if(a.push('<header class="lb-header clearfix"><span class="swoosh multiline"><section>'+this.params.title+'</section></span><span class="lb-close lb-deny" role="button" tabindex="0" >'+ 2220this.params.closeLabel.toUpperCase()+'<div class="icons-ic_close_x lb-close-icon"></div></span></header>'),htz.config.isApp){var b=localStorage.getItem("itineraryPageBack"),c=localStorage.getItem("vehiclePageBack"),d=$("#location-popup h1").text();b?(a.push("<a id=\"lbBackButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+d+"', 'Back', '-1');\"><span></span></a>"),a.push("<a id=\"lbCloseButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+ 2221d+"', 'X', '-1');\"><span></span></a>")):c?(a.push("<a id=\"lbBackButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Select Vehicle', '', '', '', '');\"><span></span></a>"),a.push("<a id=\"lbCloseButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Select Vehicle', '', '', '', '');\"><span></span></a>")):(a.push("<a id=\"lbBackButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+ 2222d+"', 'Back', '-1');\"><span></span></a>"),a.push("<a id=\"lbCloseButton\" onclick=\"$('.lb-back').trigger('click'); hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+d+"', 'X', '-1');\"><span></span></a>"))}}else this.params.closeLabel&&this.backBreak<=this.avlWidth&&a.push('<header class="lb-header-plain clearfix"><span class="lb-close lb-deny">'+this.params.closeLabel.toUpperCase()+'<div class="icons-ic_close_x lb-close-icon"></div></span></header>'); 2223this.params.noPadding?a.push('<div class="lb-content-box-no-padding"></div>'):a.push('<div class="lb-content-box"></div>');this.params.footNote&&a.push('<footer class="lb-footer">'+this.params.footNote+"</footer>");a.push("</div>");this.params.backButton&&(this.params.showBackButton&&htz.config.isApp)&&(b=localStorage.getItem("itineraryPageBack"),c=localStorage.getItem("vehiclePageBack"),b?(a.push("<div class=\"lb-back lb-close\"><div class=\"lb-back-btn\" onclick=\"hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+ 2224d+"', 'Back', '-1');\"><div><div class=\"icons-back_icon\"></div></div><div>"+this.params.backLabel+"</div></div></div>"),localStorage.removeItem("itineraryPageBack")):c?(a.push("<div class=\"lb-back lb-close\"><div class=\"lb-back-btn\" onclick=\"hzm.shared.googleTagManger('Select Vehicle', '', '', '', '');\"><div><div class=\"icons-back_icon\"></div></div><div>"+this.params.backLabel+"</div></div></div>"),localStorage.removeItem("vehiclePageBack")):a.push("<div class=\"lb-back lb-close\"><div class=\"lb-back-btn\" onclick=\"hzm.shared.googleTagManger('Hertz Car Rental Locations', 'Reservation Flow','"+ 2225d+"', 'Back', '-1');\"><div><div class=\"icons-back_icon\"></div></div><div>"+this.params.backLabel+"</div></div></div>"));a.push("</div>");$(".tmplPageContainer :visible").addClass("disabled").attr("tabindex",-1);$("#container :visible").addClass("disabled").attr("tabindex",-1);return a.join("")},initTemplate:function(){this.params.backLabel=this.params.closeLabel;if(!this.params.closeLabel)try{this.params.closeLabel=htz.content.close,this.params.backLabel=htz.content.back}catch(a){}this.params.closeLabel||
2226(this.params.dismiss=!0);0<this.params.zIndex&&(this.zIndex=this.params.zIndex);var b=this.renderTemplate();0==$("#"+this.id).length?(0<$(".tmplPageContainer").length?this.pageContainer=$(".tmplPageContainer"):0<$("#container").length&&(this.pageContainer=$("#container")),this.pageContainer.after($("<div />").attr("id",this.id).html(b))):$("#"+this.id).html(b);this.background=$("#"+this.id+" .lb-background").css({"z-index":this.zIndex});this.foreground=$("#"+this.id+" .lb-foreground").css({"z-index":this.zIndex+ 22275});this.dataContainer=this.params.noPadding?$("#"+this.id+" .lb-content-box-no-padding"):$("#"+this.id+" .lb-content-box");0==this.params.darkness?this.foreground.addClass("lb-foreground-shadow"):this.foreground.removeClass("lb-foreground-shadow");htz.config.isApp&&$("#"+this.id).show();this.adjustBackground()},closeOverlay:function(a){this.isInUse()&&($(".tmplPageContainer").find("*").removeClass("disabled").removeAttr("tabindex"),$("#container").find("*").removeClass("disabled").removeAttr("tabindex"), 2228!a&&"function"==typeof this.params.close&&(this.params.referrer?this.params.close.call(this.params.referrer):this.params.close()),this.hide(),htz.config.isApp&&($("#"+this.id).hide(),"Select for Quote"==localStorage.getItem("selectQuote")&&"Continue with Pay Later"==$(".lb-foreground .lb-content-box #cancel-fee-overlay button.secondary").text()&&(this.stop(),localStorage.removeItem("selectQuote"))))},makeRequest:function(){var a=this;a.showLightbox();a.showProgress();$.ajax({type:"post",url:a.params.url, 2229success:function(b,c,d){"undefined"!=typeof Utils&&Utils.sessionTimedOut(d)||a.showContent(b)},error:function(b,c,d){a.ajaxError(d)},complete:function(b){a.ajaxComplete(b)}})},adjustScroll:function(){e&&(window.scrollTo(e.x,e.y),e=null)},hide:function(){this.foreground.hide();this.background.hide();this.pageContainer.show();"undefined"!=typeof Utils&&Utils.showSelects();this.unbindEvents();this.inUse=!1;"phone"===htz.config.deviceGroup&&this.params.autoScrollAdjust&&this.adjustScroll()},show:function(a){this.showLightbox(); 2230this.showContent(a)},showLightbox:function(){this.params.backButton&&this.avlWidth<this.backBreak?(this.background.show(),this.background.css({opacity:this.params.darkness})):("undefined"!=typeof Utils&&Utils.hideSelects(),this.background.css({opacity:this.params.darkness}).show());this.foreground.show();"phone"===htz.config.deviceGroup&&window.scrollTo(0,0)},showProgress:function(){this.dataContainer.html($("<div />").addClass("lb-progress"))},showContent:function(a){this.isInUse()?("auto"===this.params.height? 2231this.params.allowOverflow?this.dataContainer.css({"overflow-y":"visible"}):this.dataContainer.css({"overflow-y":"auto"}):this.dataContainer.css({height:this.params.height,"overflow-y":"scroll"}),this.dataContainer.html(a)):this.dataContainer.html("")},setPosition:function(){"phone"===htz.config.deviceGroup&&(this.params.autoScrollAdjust&&!e)&&(e={x:void 0!==window.pageXOffset?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft,y:void 0!==window.pageYOffset? 2232window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop});this.avlWidth=this.getDisplayWidth();if(this.params.backButton&&this.avlWidth<this.backBreak)this.params.width=this.avlWidth-20,this.foreground.css({top:0,left:0,width:this.params.width}),htz.config.isApp&&this.foreground.css("max-width",this.params.width+20);else{this.pageContainer.show();this.background.show();this.params.backButton||(this.foreground.addClass("fullWidth"),this.params.hMargin=10);this.params.width= 2233this.avlWidth-this.params.hMargin<this.orginalWidth?this.avlWidth-this.params.hMargin:this.orginalWidth;0<this.params.left?this.params.left+this.params.width>this.avlWidth&&(this.params.hCenter=!0):this.params.hCenter=!0;if(this.params.sourceElement){var a=$(this.params.sourceElement).offset();this.params.left=this.params.hCenter?Math.round((this.avlWidth-this.params.width)/2):$("body").width()>a.left+this.params.width+25?a.left+25:a.left>this.params.width+5?a.left-this.params.width-5:a.left-this.params.width/ 22342;this.params.top=this.params.sourceElementOffset?a.top+this.params.sourceElementOffset:a.top;
2234this.params.dismiss&&this.background.removeClass("lb-close-ncursor")}else this.params.hCenter&&(this.params.left=Math.round((this.avlWidth-this.params.width)/2)),0==this.params.top&&(this.params.top=$(document).scrollTop()+100),this.params.dismiss&&this.background.addClass("lb-close-ncursor");this.background.css({width:$(document).width(),height:$(document).height()});this.foreground.css({width:this.params.width, 2235top:this.params.top,left:this.params.left});htz.config.isApp&&hzm.utils.isIPAD()&&($("#light-box-2 .lb-foreground.fullWidth").css("left","0px"),$("#light-box-2 .lb-foreground.fullWidth").css("top","0px"))}},adjustBackground:function(){this.params.bgSourceElement?this.background.css({width:$(document).width(),height:$(document).height(),top:$(this.params.sourceElement).offset().top}):this.background.css({width:$(document).width(),height:$(document).height()})},showPageData:function(){var a="string"== 2236typeof this.params.url?$("#"+this.params.url).get(0):this.params.url;this.show($(a).html())},bindEvents:function(){var a=this;a.params.hCenter&&($(window).on("resize.lightBox",function(){a.setPosition();a.params.bgSourceElement&&a.adjustBackground()}),$(window).on("orientationchange.lightBox",function(){a.setPosition();a.params.bgSourceElement&&a.adjustBackground()}));a.params.scroll&&$(window).bind("scroll.lightBox",function(){a.setPosition()});a.params.dismiss&&$(document).bind("keyup.lightBox", 2237function(b){27==b.keyCode&&a.closeOverlay()});a.params.dismiss?a.background.addClass("lb-close-ncursor"):a.background.removeClass("lb-close-ncursor");$("#"+a.id+" .lb-close, #"+a.id+" .lb-close-ncursor").bind("click",function(){a.closeOverlay()});$("#"+a.id+" .lb-close, #"+a.id+" .lb-close-ncursor").bind("keydown.lightBox",function(b){if(32==b.keyCode)return b.preventDefault(),a.closeOverlay(),!1})},unbindEvents:function(){$(window).off(".lightBox");this.background.off("click");$(document).off("keyup.lightBox"); 2238$("#"+this.id+" .lb-close, #"+this.id+" .lb-close-ncursor").off("click")},init:function(){this.avlWidth=this.getDisplayWidth();this.orginalWidth=this.params.width;this.initTemplate();this.bindEvents();this.setPosition()},getDataContainer:function(){return this.dataContainer},isInUse:function(){return this.inUse},overlay:function(a,b){this.inUse=!0;this.setDefaults();this.params=$.extend(this.params,a);this.init();b?this.show(b):"string"==typeof this.params.url&&0<=this.params.url.indexOf("/")?this.makeRequest(): 2239this.showPageData()}};return c}();htz.utils.LightBox=LightBox;"function"==typeof define&&define.amd&&define("utils/lightbox",[],function(){return LightBox}); 2240var LazyLoad=function(){var a=[],c=[];return{init:function(){a=a.concat(c);a.length&&function(b){var e=arguments.callee,d=a[b],c=d.complete;d.complete=function(d,f){c&&c(d,f);b+1<a.length&&e(b+1)};$.ajax(d)}(0)},queueJS:function(b,e){"high"==e?a.push(b):c.push(b)}}}(); 2241window.checkHertzNameSpace("htz.utils"); 2242var Loader=Loader||function(){function d(a,e){var b=$("body").width(),c=$(window).height();htz&&htz.config&&"desktop"===htz.config.deviceGroup?a.css({left:b/2,top:$(document).scrollTop()+100}):a.css({left:b/2,top:$(document).scrollTop()+(c-40)/2});e.css({opacity:0.4,background:"#000","z-index":99999,position:"fixed",top:0,left:0,right:0,bottom:0})}var c,b;$(document).ready(function(){$("input[type='submit'], button.submit").on("click",function(){Loader.showLoader()});$(window).on("resize.loader", 2243Loader.resize);window.onorientationchange=function(){Loader.resize()}});return{resize:function(){var a=$("#loading-fg"),b=$("#loading_bg");a.length&&b.length&&d(a,b)},spin:function(a){a||(a={});a.timeout||(a.timeout=25E3);this.showLoader(a)},showLoader:function(a){Loader.reset();var b=$("<div />").attr("id","loading_bg"),c=$("<div />").attr("id","loading-fg").addClass("loading-fg");d(c,b);b.appendTo($("body")).show();c.appendTo($("body")).show();Loader.setTimer(a)},setTimer:function(a){a&&a.timeout&& 2244(b&&window.clearTimeout(b),b=window.setTimeout(Loader.hideLoader,a.timeout),(a=a.callback)&&"function"==typeof a&&(c=a))},reset:function(){c=null;this.resetTimer();Loader.hideLoader()},resetTimer:function(){b&&window.clearTimeout(b);b=null},stop:function(){this.hideLoader()},hideLoader:function(){try{this.resetTimer()}catch(a){}$("#loading_bg, #loading-fg").remove();c&&(c(),c=null)}}}();htz.utils.Spinner=Loader;"function"==typeof define&&define.amd&&define("utils/loader",[],function(){return htz.utils.Spinner}); 2245if(typeof window.localStorage=="undefined"||typeof window.sessionStorage=="undefined")(function(){var e=function(e){function t(e,t,n){var r,i;if(n){r=new Date;r.setTime(r.getTime()+n*24*60*60*1e3);i="; expires="+r.toGMTString()}else{i=""}document.cookie=e+"="+t+i+"; path=/"}function n(e){var t=e+"=",n=document.cookie.split(";"),r,i;for(r=0;r<n.length;r++){i=n[r];while(i.charAt(0)==" "){i=i.substring(1,i.length)}if(i.indexOf(t)==0){return i.substring(t.length,i.length)}}return null}function r(n){var r=[],i,s,o;for(o in n){i=n[o];s=typeof i;
2245if(s=="string"){r.push("'"+o+"':"+String(i))}}n="{"+String(r)+"}";if(e=="session"){window.name=n}else{t("localStorage",n,365)}}function i(){if(e=="session"){window.name=""}else{t("localStorage","",365)}}function s(){var t=e=="session"?window.name:n("localStorage");try{var r=jQuery.parseJSON(t);return r!=null?r:{}}catch(i){return{}}}var o=s();return{length:0,clear:function(){o={};this.length=0;i()},getItem:function(e){return o[e]===undefined?null:o[e]},key:function(e){var t=0;for(var n in o){if(t==e)return n;else t++}return null},removeItem:function(e){delete o[e];this.length--;r(o)},setItem:function(e,t){o[e]=t+"";this.length++;r(o)}}};if(typeof window.localStorage=="undefined")window.localStorage=new e("local");if(typeof window.sessionStorage=="undefined")window.sessionStorage=new e("session")})();var HStorage=function(e,t){var n=[];return{setItem:function(r,i,s,o){var u;if(s){u='{"data":"'+i+'", "exp":'+((new Date).getTime()+s*24*60*60*1e3)+"}"}else{u='{"data":"'+i+'"}'}if(o=="s"){if(typeof e!="undefined"){try{e.setItem(r,u)}catch(a){n[r]=u}}else{n[r]=u}}else{if(typeof t!="undefined"){try{t.setItem(r,u)}catch(a){}}}},removeItem:function(r,i){if(i=="s"){if(typeof e!="undefined"){try{e.removeItem(r);n[r]=null}catch(s){n[r]=null}}else{n[r]=null}}else{if(typeof t!="undefined"){try{t.removeItem(r)}catch(s){}}}},getItem:function(r,i){if(i=="s"){if(typeof e!="undefined"){var s=null;try{s=e.getItem(r);if(!s){s=n[r]}}catch(o){s=n[r]}if(s!=null){try{return JSON.parse(s).data}catch(o){return null}}else{return null}}else{if(n[r]!=null){try{return jQuery.parseJSON(n[r]).data}catch(o){return null}}else{return null}}}else{if(typeof t!="undefined"){try{var u=t.getItem(r);var a=JSON.parse(u || "null");if(a&&a.exp){if((new Date).getTime()>a.exp){HStorage.removeItem(r);return null}}return a!=null?a.data:null}catch(o){return null}}else{return null}}}}}(window.sessionStorage,window.localStorage) 2246window.checkHertzNameSpace("htz.utils"); 2247htz.utils.Tracking=function(){function f(a){var g={cache:!1,dataType:"html",success:function(b,d,c){if(!htz.utils.Utils.sessionTimedOut(c)){d=$("#web-tracking-container");0<d.length?d.unbind().empty():(d=$("<div/>").attr("id","web-tracking-container").hide(),$("body").append(d));try{d.html(b)}catch(e){}try{"Y"==a.dataonly&&"N"!=a.omniture&&htz.utils.OmnitureHelper.track(htz.omniture,d)}catch(f){}}}},b=[];a&&(a.bt&&b.push("bt="+a.bt),a.ga&&b.push("ga="+a.ga),a.tags&&b.push("tags="+a.tags),a.omniture&& 2248b.push("omniture="+a.omniture),a.dataonly&&b.push("dataonly="+a.dataonly));0<b.length?(b=b.join("&"),b="&"+b):b="";var c=a&&a.step?a.step:document.location.hash;try{c&&0<=c.indexOf("#")&&(c=c.substring(c.indexOf("#")+1))}catch(f){}var e="webTracking.jsp";try{"Y"==a.dataonly&&"N"!=a.omniture&&(e="omnitureTracking.jsp")}catch(h){}e=a.rootContext+"/templates/framework/"+e+"?";e+="targetPage="+a.targetPage+b+"&hashValue="+c+"&originatingUrl="+document.location.href;g.url=e;return g}return{track:function(a){a&& 2249(a.isApp&&(a.bt=a.ga=a.tags="N",a.dataonly="Y"),$.ajax(f(a)))}}}(); 2250window.checkHertzNameSpace('htz.utils'); 2251 2252var Global = htz.utils.Global = (function() { 2253 if(document.addEventListener){ 2254 document.addEventListener("touchstart", function() {}, false); 2255 } else if(document.attachEvent){ 2256 document.attachEvent("touchstart", function() {}); 2257 } 2258 2259 try { 2260 $.subscribe('resource-load-failure', function(_, err) { htz.utils.Global.trackResourceLoadFailure(err); }); 2261 } catch (e) {} 2262 2263 var showBrowserUpgradeWarning = function() { 2264 if(htz.browser.upgradeWarningShown == "Y") {return;} 2265 2266 if(!Modernizr.mq('only all')){ 2267 var warningOverlay = new LightBox(); 2268 warningOverlay.overlay({ 2269 url: htz.config.rootContext + "/customersupport/templates/browserUpgradeWarningView.jsp", 2270 width:560, 2271 center:true, 2272 scroll:false, 2273 screen:70 2274 }); 2275 } 2276 }; 2277 2278 /** 2279 * Cookies Popup. 2280 * @type invoke properties and methods. 2281 * @methodOf htz.utils.Global. 2282 * @returns Loads the Cookies Popup on the current page. 2283 */ 2284 var showCookieOverlay = function() { 2285 if(window.location.href.indexOf("manage-cookies") === -1) { 2286 this.cookieOverlay = new LightBox(); 2287 2288 //dtc4102//IRAC-4800 2289 //Update the cookie overlay - INC000673612 2290 require(['common/cookie/cookieOverlay-view'], function(cookieOverlayView){ 2291 var self = this; 2292 self.cookieOverlay.overlay({ 2293 center:true, 2294 dismiss:false, 2295 width:'80%', 2296 hcenter:true, 2297 suppressClose:true, 2298 plain:true 2299 }, new cookieOverlayView({ 2300 referrer : self, 2301 template : '#cookie-overlay-tpl' 2302 }).render().el); 2303 2304 //dtc4102//IRAC-4892 2305 //moved it from lightbox.js since the css was being applied to all lightboxes instead of this one instance
2306 $("#cookiePopup-tpl").closest(".lb-foreground-cont").addClass("lb-cookie-bottom"); 2307 $("#cookiePopup-tpl").closest(".lb-content-box").css( {"padding":"0px"}); 2308 2309 }); 2310 2311 2312 } 2313 2314 $('body').bind('euCookieSaved', function(){ 2315 /** 2316 *@description EU Cookie Law: Trigger the web Tracking Call after the user has set his cookie preferences. 2317 */ 2318 prepareTracking(); 2319 }); 2320 }; 2321 2322 function prepareTracking(options) { 2323 if(!options) { options = {}; } 2324 2325 options.rootContext = htz.config.rootContext; 2326 options.isApp = htz.config.isApp; 2327 2328 var page = ''; 2329 if(options && options.targetPage) { 2330 page = options.targetPage; 2331 } else { 2332 page = (htz.config.legacyPage && htz.config.legacyPage !== '') ? htz.config.legacyPage : htz.config.targetPage; 2333 } 2334 options.targetPage = page; 2335 2336 htz.utils.Tracking.track(options); 2337 } 2338 2339 return { 2340 initiateTracking : function(options) { 2341 if(htz.config.isOmnitureToLoad) { 2342 if(!htz.config.isCountryinEuropeUnion || (htz.config.isCountryinEuropeUnion && document.cookie.indexOf('cookie_pref') != -1) ) { 2343 prepareTracking(options); 2344 } 2345 } 2346 }, 2347 track : function(options) { 2348 this.initiateTracking(options); 2349 }, 2350 loadManifest : function () { 2351 /** 2352 *@description Add Cache Manifest to show Contact Phone Numbers when user is offline 2353 */ 2354 if(htz.config.subSystemId === 'IRAC' && !navigator.userAgent.toLowerCase().indexOf('firefox') != -1) { 2355 $('<iframe />', { 2356 id: 'cache-manifest', 2357 src: htz.config.rootContext + '/templates/manifest.jsp?deviceGroup=' + htz.config.orgDeviceGroup 2358 }).appendTo('body'); 2359 } 2360 }, 2361 showEstara : function(text, url) { 2362 if(!htz.config.isApp && (text.length) && (htz.config.deviceGroup !== 'phone') && (htz.config.deviceGroup !== 'tablet')) { 2363 var eStaraLoad = { cache: false, dataType: 'script' }; 2364 2365 if(!url) { url = htz.eStara.url; } 2366 eStaraLoad.url = htz.config.protocol +"://"+ url; 2367 2368 window.eStaraText = text; 2369 $('.tmplLayoutLeftColumn').empty().append('<div id="eStaraDiv" style="height:88px;margin-top:10px;"></div>'); 2370 2371 $.ajax(eStaraLoad); 2372 } 2373 }, 2374 removeEstara : function() { 2375 $('.tmplLayoutLeftColumn').empty().hide(); 2376 var estaraDivId = this.getEstaraId(); 2377 if(estaraDivId) { 2378 $('#'+estaraDivId).remove(); 2379 } 2380 $('#estara-text').remove(); 2381 }, 2382 getEstaraId : function() { 2383 try { 2384 return wv_vars["timeout336323_layerid"]; 2385 } catch(e) {} 2386 2387 return null; 2388 }, 2389 initiateFooterMisc : function() { 2390 if($('#footer-container').length > 0) { 2391 var globalLazyLoadInfo = { cache: false, dataType: 'html', success: function(data) { 2392 htz.integrated.footer.controller.FooterController.showFooterPage(); 2393 }, 2394 complete: function() { 2395 LightBox.adjust(); 2396 }}; 2397 //tracking for emember pages need the new query string originatingUrl since those pages do not have targetpage query string 2398 globalLazyLoadInfo.url = htz.config.rootContext + '/framework/globalLazyLoad.jsp?targetPage=' + htz.config.targetPage; 2399 LazyLoad.queueJS(globalLazyLoadInfo, 'high'); 2400 } 2401 }, 2402 handleCookieLaw : function() { 2403 /** 2404 *@description Shows popup for user to manage his cookies and stores the permanent cookie in user's machine. Applied for EU countries only.
2405 *This should be shown if its an EU country and if the cookie is already not set in the user's machine and when its not a manage my cookie page. 2406 */ 2407 if(htz.config.isCountryinEuropeUnion && document.cookie.indexOf('cookie_pref') == -1) { 2408 showCookieOverlay(); 2409 } 2410 }, 2411 initiate : function () { 2412 this.bindRequireJSListener(); 2413 2414 if (htz.config.isApp) { 2415 Utils.showErrorFromSession(); 2416 2417 setTimeout('LazyLoad.init()', 1); 2418 2419 return; 2420 } 2421 2422 this.handleCookieLaw(); 2423 this.loadManifest(); 2424 this.showEstara(htz.eStara.text, htz.eStara.url); 2425 this.initiateFooterMisc(); 2426 if (!htz.config.isSPP) { 2427 this.initiateTracking(); 2428 } 2429 setTimeout('LazyLoad.init()', 1); 2430 if (htz.tracking) { 2431 sessionStorage.setItem("cp_code", htz.tracking.common.consumerProductFromHertzLink); 2432 } 2433 2434 //hz464486//irac-918,950,951,952//Add Hertzlink SEQ_ID to session storage 2435 if (htz.sessionHertzLink){ 2436 try 2437 { 2438 var jsonObj = JSON.parse(htz.sessionHertzLink); 2439 jsonObj = Object.entries(jsonObj).reduce((a, [k, v]) => (v == undefined ? a : (a[k] = v, a)), {}); 2440 this.convertToBoolean(jsonObj, "Y", true); 2441 this.convertToBoolean(jsonObj, "N", false); 2442 this.convertToBoolean(jsonObj, 0, false); 2443 this.convertToBoolean(jsonObj, 1, true); 2444 2445 sessionStorage.setItem("sessionHertzLink", JSON.stringify(jsonObj)); 2446 } 2447 catch(e){ 2448 console.error(e); 2449 } 2450 } 2451 2452 showBrowserUpgradeWarning(); 2453 Utils.showErrorFromSession(); 2454 }, 2455 //hz464486//irac-918,950,951,952//Add Hertzlink SEQ_ID to session storage 2456 convertToBoolean : function(obj,stringValue,booleanValue){ 2457 Object.keys(obj).forEach(key=>{ 2458 if(obj[key] === stringValue){ 2459 obj[key] = booleanValue; 2460 } 2461 }); 2462 }, 2463 trackResourceLoadFailure : function(err) { 2464 try { 2465 var browser_device = Utils.browserDeviceType(); 2466 2467 var pageName = window.location.hash; 2468 if(pageName) { 2469 pageName = pageName.substring(1); 2470 } else { 2471 pageName = 'itinerary'; 2472 } 2473 2474 if (err.requireModules) { 2475 var errorInfo = browser_device + '-' + pageName + '-' + err, 2476 requireType = err.requireType || 'unknown'; 2477 2478 WebTracking.setError('debug-resource-failure-' + requireType + '-' + errorInfo, pageName); 2479 } 2480 } catch(e) {} 2481 }, 2482 bindRequireJSListener : function() { 2483 var browser_device = Utils.browserDeviceType(); 2484 2485 try { 2486 if(typeof requirejs === 'undefined' || requirejs === null) { 2487 WebTracking.setError('debug-resource-requirejs-missing-' + browser_device); 2488 2489 return; 2490 } 2491 } catch(e) {} 2492 2493 requirejs.onError = htz.utils.Global.trackResourceLoadFailure; 2494 } 2495 }; 2496})(); 2497 2498$(window).on("load",function() { 2499 htz.utils.Global.initiate(); 2500}); 2501 2502var ErrorHelper=function(){function v(b){if(!b)return null;var a=null,d;for(d in b){if(b=d.match(/\[(.*?)\]/)){var h=b[1],e=b.input.replace(/ *\[[^\]]*]/,""),b=window.dataLayer;for(i=0;i<b.length;i++)if(void 0!=b[i].error_type&&b[i].error_type==h){delete b[i].event;delete b[i].error_type;delete b[i].error_message;break}}window.dataLayer=window.dataLayer||[];window.dataLayer.push({event:"error",error_type:h,error_message:e});null==a&&(a="");a+='<li aria-label="'+d+'" tabindex="0">'+d+"</li>"}a&&(a= 2503"<ul class='"+o+"' tabindex='0' aria-label='error-list'>"+a+"</ul>");return a}var o="field-error-list",m=[],s=[],p=[],k=null,l=null,t=[],u=!0,q=null;return{displayErrors:function(b,a){if(b){var d;a&&a.context?this.reset(a.context):this.reset();a&&(d=a.mappings,k=a.context,l=a.allErrTarget,"undefined"!=typeof a.showErrorWithField&&(u=a.showErrorWithField),q=a.genericError);if(d&&0!=d.length)for(var h=0;h<d.length;h++)for(var e=d[h],f=e.target,e=e.fields.split(","),n=0;n<e.length;n++)t[e[n]]=f;for(d= 25040;d<b.length;d++)if((f=b[d])&&0<f.length){h=f[0];e=null;1<f.length&&(e=f[1]);f=e;e=u;n=l;if(e&&f&&0<f.length){var j=t[h];j||(j=h+"_ut-err");var r=m[j];r||(r=[],m[j]=r);for(j=0;j<f.length;j++)e&&(r[f[j]]=""),!q&&n&&(p[f[j]]="")}q&&(p[q]="");s[h]=""}var c;k&&(c="string"==typeof k?$(k).eq(0):k);c||$(document);for(var g in m)(c=v(m[g]))&&(0<g.indexOf("_ut-err")?$("#"+g.substring(0,g.length-7)).closest("label").prepend(c):$("#"+g).html(c).show());for(var o in s)g=null,c=$("#"+o),0<c.length&&(g=c.eq(0)), 2505g&&((c=g.parent("label"))&&0<c.length?c.addClass("error"):(c=g.prop("tagName").toLowerCase(),("input"==c||"select"==c||"textarea"==c)&&g.addClass("error-input")));l&&(c=v(p))&&$(l).html(c).show()}else this.reset()},reset:function(b){var a;b?a=b:k&&(a=k);a&&(a="string"==typeof a?$(a).eq(0):a);a||(a=$(document));a.find(".error").removeClass("error");a.find(".error-input").removeClass("error-input");a.find("."+o).remove();b=$(l);0<b.length&&b.eq(0).empty().hide();m=[];s=[];p=[];k=l=null;t=[];u=!0}}}(); 2506"function"==typeof define&&define.amd&&define("utils/errorutil",[],function(){return ErrorHelper}); 2507var faq=function(a){path="&searchTerm=";"function"==typeof LightBox&&htz.faq.display&&(lbFaq=new LightBox,domain=htz.faq.URL,url=domain+path+a.value,a='<iframe id="ifrFaq" style="border:0px;" frameborder="0" width="760" height="460" src="'+url+'"></iframe>',lbFaq.overlay({width:"780",title:htz.faq.overlayTitle},a))}; 2508window.checkHertzNameSpace("htz.helpers");htz.helpers.SessionHelper=function(d){var c=[];
2508return{getItem:function(a){if("undefined"!=typeof d){var b=null;try{(b=d.getItem(a))||(b=c[a])}catch(e){b=c[a]}return b}return c[a]},setItem:function(a,b){if("undefined"!=typeof d)try{d.setItem(a,b)}catch(e){c[a]=b}else c[a]=b},removeItem:function(a){if("undefined"!=typeof d)try{d.removeItem(a),c[a]=null}catch(b){c[a]=null}else c[a]=null},removeListedItems:function(a){if(a&&0!=a.length)for(var b=0;b<a.length;b++)this.removeItem(a[b])}}}(window.sessionStorage); 2509"function"==typeof define&&define.amd&&define("utils/sessionhelper",[],function(){return htz.helpers.SessionHelper}); 2510window.checkHertzNameSpace("htz.helpers"); 2511htz.helpers.ResourceLoader=function(i,o,l){function m(a,c,b){for(var e,d=0;d<c.length;d++)if(e=c[d],e===u)a[d]?b.css=a[d]:delete b.css;else if(e===n){e=a[d];try{i.setItem(b.content,l.stringify(e))}catch(f){}b.content=e}else e===p?b.template=a[d]:e===q&&(a[d]?b.js=a[d]:delete b.js);b.callback&&b.callback(b)}function r(a){for(var a=a.requireModules,c=0;c<a.length-1;c++)requirejs.undef(a[c])}function j(a,c){a&&c&&(c[a]=null,c["is"+a+"loaderror"]=!0)}function s(a,c,b){require(a.toLoad,function(b,d,f){m(arguments, 2512a.order,c)},function(e){r(e);if(b){var d=e.requireModules;if(d)for(var f=a.toLoad,i=a.order,g=0;g<=d.length-1;g++)for(var h=0;h<=f.length-1;h++)if(0<=f[h].indexOf(d[g])){f.splice(h,1);h=i.splice(h,1);j(h,c);break}0<a.toLoad.length?require(a.toLoad,function(b,d,e){m(arguments,a.order,c)},function(b){r(b);for(var b=a.order,d=0;d<b.length-1;d++)j(b[d],c);c.callback&&c.callback(c)}):t(c);try{o.publish("resource-load-failure",e)}catch(k){}}else window.setTimeout(function(){s(a,c,!0)},v)})}function t(a){if(a){if(a.content){var c= 2513i.getItem(a.content);if(c)try{c=l.parse(c),a.content=c}catch(b){i.removeItem(a.content),a.content=null,j(n,a)}}a.callback&&a.callback(a)}}var u="css",q="js",p="template",n="content",v=500;return{load:function(a){if(a){if(a.css){var c=a.css,b=document.getElementsByTagName("head").item(0),e=o(b).find("link"),d=!1;e.each(function(a){if(c==e.eq(a).attr("href"))return d=!0,!1});if(!d){var f=document.createElement("link");f.setAttribute("href",c);f.setAttribute("type","text/css");f.setAttribute("rel","stylesheet"); 2514b.appendChild(f)}delete a.css}b=[];if(a){var f=[],j=a.template,g=a.content,h=a.js;if(g){var k=i.getItem(g);if(k)try{a.content=l.parse(k)}catch(m){i.removeItem(g),k=null}k||(g=0<g.indexOf("?")?g+"&callback=define":g+"?callback=define",f.push(n),b.push(g))}j&&(f.push(p),b.push("text!"+j));h&&(f.push(q),b.push(h));b={toLoad:b,order:f}}else b={toLoad:b};0<b.toLoad.length?s(b,a,!1):t(a)}}}}(htz.helpers.SessionHelper,$,JSON);"function"==typeof define&&define.amd&&define("helpers/resource-loader",[],function(){return htz.helpers.ResourceLoader}); 2515window.checkHertzNameSpace("htz.utils.config"); 2516htz.utils.config.UtilConfig=function(){var b,c,d,e,f,g,h,i,j;return{configure:function(a){a.spinner&&(b=a.spinner);a.lightBox&&(c=a.lightBox);a.networkHelper&&(d=a.networkHelper);a.navigator&&(e=a.navigator);a.rotar&&(f=a.rotar);a.domHelper&&(g=a.domHelper);a.router&&(h=a.router);a.notifier&&(i=a.notifier);a.slider&&(j=a.slider)},getSpinner:function(){return b},getLightbox:function(){return c},getNetworkHelper:function(){return d},getNavigator:function(){return e},getRotar:function(){return f},getDomHelper:function(){return g}, 2517getRouter:function(){return h},getNotifier:function(){return i},getSlider:function(){return j}}}();"function"==typeof define&&define.amd&&define("config/utilconfig",[],function(){return htz.utils.config.UtilConfig}); 2518var Tooltip=function(){}; 2519Tooltip.prototype={defaults:{height:200,width:300,contentBgcolor:"#FEFED9",border:"3px solid #FFD60D",scroll:!1,closeLabel:!0,footerBgcolor:"#FFD60D",close:!0,closeLabel:htz.content.close},id:null,els:{},config:{},inUse:!1,show:function(a){this.inUse=!0;var b=$(a),a=b.parent().find(".tooltip-link:eq(0)"),b=b.parent().find(".tooltip-container:eq(0)");b.is(":hidden")?($(".tooltip-container").hide(),this.displayTooltip(b,a)):this.hide(b);return this},hide:function(a){$(a).hide()},create:function(a){this.config= 2520$.extend(!0,{},this.defaults,a);a=[];a.push('<div class="tooltip-container">');a.push('<div class="tooltip-content">');a.push('<div class="user-content">');a.push("</div> ");a.push("</div>");this.config.close&&(a.push('<div class="tooltip-footer learnMoreLink"> <span class="icons-close_lg close-pointer"> </span> <span class="close-pointer">'),this.config.closeLabel&&a.push(this.config.closeLabel),a.push("</span></div>"));a.push("</div>");a.join("");a=(a+"").replace(/\,/g,"");this.els.container=$(a).appendTo("#"+ 2521this.config.containerID);this.els.tooltipContainer=this.els.container.find(".tooltip-container");this.els.innerContainer=this.els.container.find(".tooltip-content");this.els.close=this.els.container.find(".close-pointer");this.els.content=this.els.container.find(".user-content");this.els.content.append(""==this.config.content?defaults.content:this.config.content);this.els.overylay=this.els.container.find(".tooltip-container");this.els.footer=this.els.container.find(".tooltip-footer");this.els.innerContainer.css({width:""== 2522this.config.width?defaults.width:this.config.width,height:""==this.config.height?defaults.height:this.config.height,backgroundColor:""==this.config.contentBgcolor?defaults.contentBgcolor:this.config.contentBgcolor,overflow:"hidden",border:""==this.config.border?defaults.border:this.config.border,"overflow-y":!0==this.config.scroll?"scroll":"hidden"});this.els.footer.css({backgroundColor:""==this.config.footerBgcolor?defaults.footerBgcolor:this.config.footerBgcolor,width:""==this.config.width?defaults.width: 2523this.config.width});this.bindEvents();return this},displayTooltip:function(a,b){var a=$(a),b=$(b),f=b.offset().top,g=b.offset().left,h=$(window).height(),c=$(window).width(),d=b.position().top,e=b.position().left,d=f+a.height()>h+$(window).scrollTop()?b.position().top-a.height():b.position().top+b.height(),e=600<=c+$(window).scrollLeft()?g+a.width()+50>c+$(window).scrollLeft()?b.position().left-a.width():b.position().left+b.width():50;a.css({top:d,left:e});(0<$(a).parents("div").closest("#rewards-container").length|| 25240<$(a).parents("div").closest("#anydayrewards-container").length)&&$(a).attr("style","display:block");a.show();return this},bindEvents:function(){var a=this;this.els.close.bind("click",function(b){target=$(b.target);b=target.closest(".tooltip-container");a.hide(b)})},isInUse:function(){return this.inUse}}; 2525var googletag=googletag||{};googletag.cmd=googletag.cmd||[]; 2526var gptBannerAds={init:function(){var a=this;this.render();$(window).on("resize",function(){a.refreshAds()})},getCookie:function(a){for(var a=a+"=",c=decodeURIComponent(document.cookie).split(";"),d=0;d<c.length;d++){for(var b=c[d];" "==b.charAt(0);)b=b.substring(1);if(0==b.indexOf(a))return b.substring(a.length,b.length)}return""},render:function(){var a=this.getCookie("cookie_pref");if(!0==htz.config.isCountryinEuropeUnion&&(""==a||""!=a&&0>a.indexOf("_4")))return 0;var c=this;c.gptAdSlots=[];$(".gptAdBlock:visible,.gptAdBlock.gblFloatLeft").each(function(){var a= 2527$(this).find(".adDisplayBlock"),b=a.attr("data-item"),f=parseInt(a.attr("width")),g=parseInt(a.attr("height")),e=a.attr("id"),a="/rentacar/rest/banner/style/"+b+"?v="+Math.floor(100*Math.random());"/htv"==htz.config.rootContext&&(a="/htv/BannerAdHandler?style="+b);$.ajax({type:"GET",url:a,dataType:"json",async:!1,success:function(a){c.generateAd(e,a.data,b,f,g)},error:function(){console.log("Unable to Receive Response from GPT Webservice")}})})},generateAd:function(a,c,d,b,f){var g=this;googletag.cmd.push(function(){var e= 2528"hertz.irac";"/htv"==htz.config.rootContext&&(e="hertz.trucks");e=googletag.defineSlot("/5246/"+e+"/"+d,[b,f],a).addService(googletag.pubads());g.gptAdSlots.push(e);for(gptItem in c)e.setTargeting(gptItem,c[gptItem]);googletag.enableServices();googletag.display(a)})},createAd:function(a,c,d,b){var f="banner_gpt"+$(".gptAdBlock").length;a.addClass("gptAdBlock").append("<div id='banner_gpt"+f+"' class='adDisplayBlock' data-item='"+c+"' width='"+d+"' height='"+b+"'></div>")},refreshAds:function(){googletag.pubadsReady&& 2529googletag.pubads().refresh()},clean:function(){try{googletag.destroySlots()}catch(a){console.log(a)}}};googletag.cmd.push(function(){gptBannerAds.init()});(function(){var a=document.createElement("script");a.async=!0;
2529a.type="text/javascript";a.src=("https:"==document.location.protocol?"https:":"http:")+"//www.googletagservices.com/tag/js/gpt.js";var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(a,c)})(); 2530window.checkHertzNameSpace('htz.utils'); 2531 2532/** 2533@description Various functions for cookies for GDPR requirements 2534@class Utils 2535@requires JQuery 2536*/ 2537 2538htz.utils.termsAndConditions = (function(){ 2539 return{ 2540 2541 /** 2542 @description 2543 This function is loaded when the base page loads and checks if a cookie is present or not at the root level. 2544 If the cookie is not present, the given element pops up. 2545 */ 2546 checkCookie: function(cookieName,elementID,systemID){ 2547 2548 var expression = new RegExp(cookieName + "=([^;]+)"); 2549 var cookieValue = expression.exec(document.cookie); 2550 var result = (cookieValue != null) ? unescape(cookieValue[1]) : null; 2551 2552 if(systemID==="IRAC"){ 2553 this.fetchTandCcontent(); //IRAC uses web service to fetch the content.This web service is different than the usual content web service. 2554 } 2555 2556 //if no cookie is present 2557 if(result==null){ 2558 var startDate = new Date(this.getDate("startDate","hiddenStartDate")); 2559 2560 var endDate = new Date(this.getDate("endDate","hiddenEndDate")); 2561 endDate.setHours(23,59,59); 2562 2563 var todaysDate= new Date(); 2564 2565 //requirement to not show the popup till the start date is reached or if the start day has already passed 2566 if(((startDate.toDateString()===todaysDate.toDateString()) || (startDate<todaysDate)) && (todaysDate<endDate)){ 2567 $("#" +elementID).show(); 2568 } 2569 } 2570 else{ 2571 //if a cookie is present, check to see if the startDate or endDates have changed and proceed accordingly 2572 this.handleCookieDates(cookieName,elementID,result); 2573 } 2574 }, 2575 2576 /** 2577 @description 2578 This function checks to see if the startDate or endDate for a cookie/legal TandC has changed and proceed accordingly. 2579 */ 2580 handleCookieDates:function(cookieName,elementID,cookieSetDate){ 2581 2582 var todaysDate= new Date(); 2583 var startDate = new Date(this.getDate("startDate","hiddenStartDate")); 2584 var endDate = new Date(this.getDate("endDate","hiddenEndDate")); 2585 var cookieStartDate = new Date(cookieSetDate); 2586 2587 if((startDate.toDateString()!=cookieStartDate.toDateString()) && (startDate.toDateString()===todaysDate.toDateString()) ){ 2588 document.cookie=cookieName+ "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;Path = /;"; 2589 $("#"+elementID).show(); //remove the cookie and display the popup 2590 } 2591 else{ 2592 this.updateCookieExpDate(cookieName); //update the expiry date on the cookie 2593 } 2594 }, 2595 2596 /** 2597 @description 2598 This function updates the expiry date on the cookie. 2599 */ 2600 updateCookieExpDate:function(cookieName){ 2601 this.storeCookie(cookieName); 2602 }, 2603 2604 /** 2605 @description 2606 This function stores the cookie with the given name..The expiry date comes from the hidden interwoven field. 2607 */ 2608 storeCookie : function(cookieName){ 2609 2610 var cookieExpirationDate = new Date(this.getDate("endDate","hiddenEndDate")); 2611 cookieExpirationDate.setHours(23,59,59); 2612 var expiring=cookieExpirationDate.toUTCString(); 2613 2614 document.cookie =cookieName+"="+ new Date() + ";expires="+ expiring + "; Path = /;"; 2615 }, 2616 2617 /** 2618 @description 2619 This function gets the date form the HTML elment/interwoven field. 2620 */ 2621 getDate:function(type,elementID){ 2622 /*var dateHTML=$("#"+ elementID).html(); 2623 2624 var day = dateHTML.split("/")[1]; 2625 var month = (dateHTML.split("/")[0])-1; 2626 var year = dateHTML.split("/")[2]; 2627 2628 if(type =="endDate"){ 2629 var date = new Date(); 2630 return new Date(year,month,day,date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()); 2631 } 2632 else if(type=="startDate"){ 2633 return new Date(year,month,day); 2634 }*/ 2635 }, 2636 2637 /** 2638 @description 2639 This function fetches the content for the legal pop up and fills the HTML. 2640 */ 2641 fetchTandCcontent:function(){ 2642 $.ajax({ 2643 url : htz.config.apiDomain+"/rest/policy-notification/" + htz.config.systemId + "/"
2643+ htz.config.dialect+"/" + htz.config.pos, 2644 type : "GET", 2645 async:false, 2646 dataType: "json", 2647 success : function(response) { 2648 2649 var content = response.popupContent; 2650 var startDate= response.startDate; 2651 var endDate= response.endDate; 2652 2653 $("#TandC-content-text").html(content); 2654 $("#hiddenStartDate").html(startDate); 2655 $("#hiddenEndDate").html(endDate); 2656 2657 }, 2658 error:function(data,status){ 2659 console.log(data); 2660 } 2661 }); 2662 } 2663 } 2664})(); 2665 2666$(function() { 2667 window.checkHertzNameSpace('htz.integrated.header.views'); 2668 2669 htz.integrated.header.views.HeaderView = Backbone.View.extend({ 2670 el:$("header"), 2671 events: { 2672 "click .logo-box": "logoClick", 2673 "click .ra-logo-large": "raLogoClick", 2674 "click .ra-logo-small": "raLogoClick", 2675 "click .change-list": "changePos", 2676 "submit .pos-box form": "submitPos", 2677 "change #pos": "selectedCountry", 2678 "keyup #pos": "pressedCountry", 2679 "focus #search-input": "searchOnFocus", 2680 "blur #search-input": "searchOnBlur", 2681 "keydown #search-input": "searchOnKeyPress", 2682 "click .search-trigger": "openSearchOverlay", 2683 "click #search-button-trigger": "searchBtnClick", 2684 "click #mob-navigation-trigger": "slideOpenMobileNav", //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599//changed from mobMenuBtnOnClick 2685 "click #nav-close-trigger":"slideCloseMobileNav", //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599//changed to mobMenuBtnOnClick 2686 "click .mob-back": "mobBackToMenu", 2687 "click #nav-container":"trackNavigation", //dtc4102//PRC91530//Google Data Layer 2688 "click .new-open-nav":"openMobileNav", //dtc4102//IRAC-5329//Re-skin of Hertz.com legacy - INC001102442 2689 "click .new-close-nav":"closeMobileNav", 2690 "click .rental-container":"scrollToRentalContainer", 2691 "click .mob-sub-menu-div":"expandSubMenu", //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2692 "click #mob-nav-member-info-button":"slideOpenMobileMemberNav",//dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2693 "click .gtm-itin-info-mobile":"showEditPage" //dtc4102//IRAC-339-mobile-web-optimization-vehicle-page-phase-1-itinerary-inc-001660261 2694 2695 //dtc4102//IRAC-5329//Re-skin of Hertz.com legacy - INC001102442 2696 }, 2697 //dtc4102//IRAC-339-mobile-web-optimization-vehicle-page-phase-1-itinerary-inc-001660261 2698 showEditPage: function(){ 2699 $('#itinerary-info #itinerary-content .int-misc-info a.itn-edit-link').click(); 2700 }, 2701 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2702 slideOpenMobileMemberNav: function(e){ 2703 e.stopPropagation(); 2704 var target= e.currentTarget; 2705 if(localStorage.getItem("memberType") == 'G') { 2706 $("#member-nav-container .menu-header span:first").text("Account"); 2707 } 2708 else { 2709 $("#member-nav-container .menu-header span:first").text("Menu"); 2710 } 2711 var parentElement = $("#member-nav-container").parent(); 2712 parentElement.addClass("mobileNavBckgrnd"); 2713 $("#member-nav-container").css("width","85%"); 2714 2715 target.setAttribute('aria-expanded','true'); //dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 2716 2717 return false; 2718 }, 2719 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2720 expandSubMenu:function(e){ 2721 e.stopPropagation(); 2722 var target= e.currentTarget.parentElement; 2723 2724 $(target).find("ul").toggleClass("visibleSubMenu"); 2725 $(target).find(".chevron-arrow").toggleClass("arr-down").toggleClass("arr-up"); //dtc4102//23.14//irac-336//Mobile Web Optimization - Checkout page - INC001655979//changed chevron-arrow to class from id 2726 2727 return false; 2728 2729 }, 2730 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2731 slideCloseMobileNav: function(e){ 2732 e.stopPropagation(); 2733 var target= e.currentTarget; 2734 2735 $(target).closest("#sideMenuParent").removeClass("mobileNavBckgrnd"); 2736 2737 $(target).closest("#nav-container").css("width","0px"); 2738 2739 this.expandSubMenu(e); 2740 //$(target).closest(".mob-menu").find("#chevron-arrow").removeClass("arr-up").addClass("arr-down"); 2741
2742 target.setAttribute("aria-expanded","false"); //dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 2743 2744 return false; 2745 }, 2746 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 2747 slideOpenMobileNav: function(e) { 2748 e.stopPropagation(); 2749 var target= e.currentTarget; 2750 2751 var parentElement = $("#nav-container").parent(); 2752 parentElement.addClass("mobileNavBckgrnd"); 2753 $("#nav-container").css("width","85%"); 2754 2755 target.setAttribute('aria-expanded','true'); //dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 2756 2757 return false; 2758 }, 2759 mobMenuBtnOnClick: function(e) { 2760 e.stopPropagation(); 2761 var menuListHt = $(".mob-menu div").outerHeight() + $("#mobile-nav-menu-top").outerHeight(); 2762 $(".mob-nav-menu div").slideToggle(700, "swing", function() { 2763 e.currentTarget.setAttribute('aria-expanded','false'); //dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 2764 if( $(this).is(":hidden") ) { 2765 $(".mob-nav-menu").height(0); 2766 $(".mob-menu").height(0); 2767 2768 } else { 2769 e.currentTarget.setAttribute('aria-expanded','true');//dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 2770 $(".mob-nav-menu").height(menuListHt); 2771 var body = document.body, 2772 html = document.documentElement; 2773 var height = Math.max( body.scrollHeight, body.offsetHeight, 2774 html.clientHeight, html.scrollHeight, html.offsetHeight ); 2775 $(".mob-menu").height(height); 2776 2777 } 2778 }); 2779 $('#mobile-nav-menu-top').css('display','flex'); 2780 2781 return false; 2782 }, 2783 scrollToRentalContainer:function(){ 2784 window.scrollTo('1200','1200'); 2785 document.getElementById("rental-links").scrollIntoView(false); 2786 var agent = navigator.userAgent.toLowerCase(); 2787 var isUAMobile = !!(agent 2788 .match(/(iPhone|iPod|iPad|blackberry|android|htc|kindle|lg|midp|mmp|mobile|nokia|opera mini|palm|pocket|psp|sgh|smartphone|symbian|treo mini|Playstation Portable|SonyEricsson|Samsung|MobileExplorer|PalmSource|Benq|Windows Phone)/i)); 2789 if(isUAMobile){ 2790 $('#rental-policy-links').show(); 2791 2792 } 2793 }, 2794 //dtc4102//IRAC-5329//Re-skin of Hertz.com legacy - INC001102442 2795 closeMobileNav:function(){ 2796 $(".new-close-nav").addClass("new-hide") 2797 $('.new-header-content-mobile .new-open-nav').removeClass("new-hide") 2798 $('.new-header-content-dropdown').addClass("new-hide") 2799 }, 2800 //dtc4102//IRAC-5329//Re-skin of Hertz.com legacy - INC001102442 2801 openMobileNav:function(){ 2802 $(".new-open-nav").addClass("new-hide") 2803 $('.new-header-content-mobile .new-close-nav').removeClass("new-hide") 2804 $('.new-header-content-dropdown').removeClass("new-hide") 2805 }, 2806 //dtc4102//PRC91530//Google Data Layer 2807 //Navigation 2808 trackNavigation:function(e){ 2809 e.stopPropagation(); 2810 2811 var $target = $(event.target); 2812 var menu_location='navigation'; 2813 var menu_button=$target.html(); 2814 2815 window.dataLayer.push({ 2816 'event':'navigation', 2817 'menu_location':menu_location, 2818 'menu_button':menu_button 2819 }); 2820 2821 }, 2822 logoClick: function(e) { 2823 e.stopPropagation(); 2824 2825 //dtc4102//IRAC-4451 & 4478 2826 var pages=[ 2827 'vehicles', 2828 'extras', 2829 'review-and-book' 2830 ]; 2831 var resetSIPP=false; 2832 for (var p in pages){ 2833 if(window.location.href.indexOf("#"+pages[p])>0){ 2834 resetSIPP=true; 2835 break; 2836 } 2837 } 2838 if(resetSIPP==true){ 2839 window.location.href = htz.config.protocol+"://"+htz.config.startURL+htz.config.context+"/reservation/?resetSipp=T"; 2840 } 2841 else{ 2842 window.location.href = htz.navigation.homeURL; 2843 } 2844 2845 }, 2846 raLogoClick: function(e) { 2847 e.stopPropagation(); 2848 window.location.href = 'www.ryanair.com'; 2849 }, 2850 changePos: function(e) { 2851 e.stopImmediatePropagation(); 2852 if( $(".pos-tab").is(":visible") ) { 2853 $('#navArrowGtm').addClass('pointer-triangle-pos'); 2854 $(".pos-box").slideUp("1000", function(){ 2855 $(e.target).closest("li").removeClass("pos-tab"); 2856 $($('#pos-change').find('span')[0]).addClass('icons-ic_globe'); 2857 $($('#pos-change').find('span')[0]).removeClass('icons-ic_globe_black'); 2858 }); 2859 } else { 2860 $(e.target).closest("li").addClass("pos-tab"); 2861 $(".pos-box").slideDown("1000",function(){ 2862 $($('#pos-change').find('span')[0]).addClass('icons-ic_globe'); 2863 }); 2864 } 2865 $(".pos-box #pos").val( htz.config.pos ); 2866 if( $('.pos-tab').is(":visible") && htz.config.pos != $(".pos-box #pos").val() ) 2867 this.selectedCountry(); 2868 }, 2869 submitPos: function(e) { 2870 if( navigator.appVersion.indexOf("MSIE 9") > 0 ){
2871 gptBannerAds.clean(); 2872 gptBannerAds.render(); 2873 } 2874 }, 2875 pressedCountry: function(e) { 2876 if( e.keyCode == 13 ) 2877 this.selectedCountry(); 2878 }, 2879 selectedCountry: function() { 2880 var v, params; 2881 v = $("#pos").val(); 2882 params = ( v != "" ) ? "selectedPOS=" + v : ""; 2883 $.ajax({ 2884 type: "post", 2885 url: htz.config.rootContext + "/PointOfSaleHandler", 2886 data: params, 2887 success: function(data) { 2888 $("#language").empty().html(data); 2889 }, 2890 error: function() { 2891 alert(htz.content.ajaxFail); 2892 } 2893 }); 2894 }, 2895 unbindBodyClick: function(e) { 2896 if( $('.pos-tab').is(":visible") && !$.contains($('.pos-tab').get(0), e.target) ) { 2897 $("#header-container .pos-box").slideUp("1000", function(){ 2898 $("#header-container .change-link").removeClass("pos-tab"); 2899 //get default icon 2900 $($('#pos-change').find('span')[0]).addClass('icons-ic_globe') 2901 $($('#pos-change').find('span')[0]).removeClass('icons-ic_globe_black') 2902 }); 2903 } 2904 }, 2905 searchOnFocus: function() { 2906 $("#search-input").addClass("highlight"); 2907 if( $("#search-input").val() == $("#default-search").val() ) 2908 $("#search-input").val(''); 2909 else 2910 $("#search-input").val(this.value); 2911 }, 2912 searchOnBlur: function(e) { 2913 if( $("#search-input").val() == '' ) { 2914 $("#search-input").removeClass("highlight"); 2915 $("#search-input").val( $("#default-search").val() ); 2916 } 2917 }, 2918 searchOnKeyPress: function(e) { 2919 //dtc4102//retire-right-now//special character bug fix 2920 searchString=$(".lb-foreground-cont #search-input").val(); 2921 safeSearchString=searchString.replace(/["<>'\[\]\{\}|\\^%&:;=?@#$\/]/gi, ''); 2922 finalSearchString =encodeURI(safeSearchString); 2923 2924 if( e.keyCode == 13 ) { 2925 //Salesforce FAQ(e.target); 2926 if( finalSearchString != '' ){ 2927 window.location.href = htz.config.rootContext + '/customersupport/index.jsp?targetPage=faq.jsp&search=' + finalSearchString; 2928 } 2929 else 2930 window.location.href = htz.config.rootContext + '/customersupport/index.jsp?targetPage=faq.jsp'; 2931 2932 return false; 2933 } 2934 }, 2935 searchBtnClick: function() { 2936 if( $(".lb-foreground-cont #search-input").first().val() == $(".lb-foreground-cont #default-search").val() ) 2937 $(".lb-foreground-cont #search-input").first().val(''); 2938 2939 //Salesforce FAQ( $("#search-input")[0] ); 2940 2941 //dtc4102//retire-right-now//special character bug fix 2942 searchString=$(".lb-foreground-cont #search-input").val(); 2943 2944 safeSearchString=searchString.replace(/["<>'\[\]\{\}|\\^%&:;=?@#$\/]/gi, ''); 2945 finalSearchString =encodeURI(safeSearchString); 2946 2947 if( finalSearchString != '' ){ 2948 window.location.href = htz.config.rootContext + '/customersupport/index.jsp?targetPage=faq.jsp&search=' + finalSearchString; 2949 } 2950 else 2951 window.location.href = htz.config.rootContext + '/customersupport/index.jsp?targetPage=faq.jsp'; 2952 2953 return false; 2954 }, 2955 openSearchOverlay : function(e) { 2956 var self = this; 2957 var el = $(e.target); 2958 self.lightbox = (self.lightbox === undefined) ? new LightBox() : self.lightbox; 2959 self.lightbox.overlay({ dismiss : true, width : 1248, noPadding : true, suppressClose : true, suppressHeader : true, sourceElement : el, sourceElementOffset : 50, allowOverflow : true, close : self.closeSearchInterfaceCallback() }, $('#searchBoxOverlayContainer').html()); 2960 self.openSearchInterfaceUtil(); 2961 }, 2962 openSearchInterfaceUtil : function() { 2963 var self = this; 2964 $(document).on('mouseup click', '#search-button-trigger', function() { 2965 self.searchBtnClick(); 2966 }); 2967 $(document).on('keyup', '#search-input', function(e) { 2968 self.searchOnKeyPress(e); 2969 }); 2970 $('.lb-foreground-cont #search-input').trigger("focus"); 2971 $(document).on('mouseup click', '.icons-ic_close_search', function() { 2972 self.lightbox.closeOverlay(); 2973 }); 2974 }, 2975 closeSearchInterfaceCallback : function() { 2976 var self = this; 2977 $('#search-button-trigger').off('mouseup click'); 2978 $('#search-input').off('keypress'); 2979 $('.icons-ic_close_search').off('mouseup click'); 2980 }, 2981 hideMemberFeature : function() { 2982 this.$el.find(".emember-container").hide(); 2983 this.$el.find("#mobile-nav-menu-top").hide(); 2984 }, 2985 //dtc4102//IRAC-339-mobile-web-optimization-vehicle-page-phase-1-itinerary-inc-001660261 2986 showItinerary : function(itiData){ 2987 this.$el.find(".gtm-itin-info-mobile").empty().append(_.template($("#nav-itinerary-tpl").html(),itiData)); 2988 }, 2989 //dtc4102//IRAC-339-mobile-web-optimization-vehicle-page-phase-1-itinerary-inc-001660261 2990 hideItinerary : function(){ 2991 this.$el.find(".gtm-itin-info-mobile").empty(); 2992 }, 2993 showRentalQualificationLink : function() { 2994 this.$el.find(".rental-container").show(); 2995 }, 2996 hideRentalQualification : function() { 2997 this.$el.find(".rental-container").hide(); 2998 }, 2999 showMemberFeature : function() { 3000 this.$el.find(".emember-container").show(); 3001 //this.$el.find("#mobile-nav-menu-top").show(); //dtc4102//IRAC-339-mobile-web-optimization-vehicle-page-phase-1-itinerary-inc-001660261 3002 }, 3003 hidePosFeature : function() { 3004 this.$el.find(".pos-container").hide(); 3005 this.$el.find(".mob-nav").addClass("hidden-xs"); //dtc4102//23.14//irac-336//Mobile Web Optimization - Checkout page - INC001655979 3006 this.$el.find(".logo-box>img").css("margin-left","24px"); //dtc4102//23.14//irac-336//Mobile Web Optimization - Checkout page - INC001655979 3007 }, 3008 hideMenu : function(){ 3009 this.$el.find(".nav-menu").hide(); 3010 }, 3011 showMenu : function(){ 3012 this.$el.find(".nav-menu").show(); 3013 }, 3014 mobileLoginMenu : function(){ 3015 this.$el.find("#mobile-nav-menu-top").show(); 3016 }, 3017 showPosFeature : function() { 3018 this.$el.find(".pos-container .change-link").show(); 3019 this.$el.find(".mob-nav").removeClass("hidden-xs"); //dtc4102//23.14//irac-336//Mobile Web Optimization - Checkout page - INC001655979 3020 this.$el.find(".logo-box>img").css("margin-left","0px"); //dtc4102//23.14//irac-336//Mobile Web Optimization - Checkout page - INC001655979 3021 }, 3022 showDesktopPos : function() { 3023 this.$el.find(".pos-container").show(); 3024 }, 3025 showSearchMini : function() { 3026 //this.$el.find(".search-box #search-input").hide(); 3027 }, 3028 showSearchFull : function() { 3029 this.$el.find(".search-box #search-input").show(); 3030 }, 3031 navMenuTouchEnd: function() { 3032 var el = $(this); 3033 if( typeof el.attr('href') != 'undefined' && el.attr('href') != '' ) { 3034 var link = el.attr('href'); 3035 window.location = link; 3036 } 3037 }, 3038 navMenuMouseEnter: function() { 3039 $(this).find("dl").addClass("menu-show"); 3040 //$(this).closest("td:last-child").find("dl").addClass("last-menu-show");//IRAC-5472 Top navigation isn't working on Firefox browser - INC001233682IRAC-5481 3041 $(this).find("> a").addClass("menu-hover"); 3042 $(this).find("> span").addClass("menu-hover"); 3043 $(this).find("> article").addClass("pointer-triangle"); 3044 $(this).find("dd").first().children().addClass("no-pipe"); 3045 var navItemWt = $(this).width() - 1;
3046 var subNavItemWt = $(this).find("dl").outerWidth(); 3047 if( navItemWt >= subNavItemWt && subNavItemWt != null ) 3048 $(this).find("dl").width(navItemWt); 3049 }, 3050 navMenuEnter: function(e){ 3051 target = e.keyCode; 3052 if(target == 32 || target == 40) { 3053 e.preventDefault(); 3054 $(this).find("dl").addClass("menu-show"); 3055 //$(this).closest("td:last-child").find("dl").addClass("last-menu-show");//IRAC-5472 Top navigation isn't working on Firefox browser - INC001233682IRAC-5481 3056 $(this).find("> a").addClass("menu-hover"); 3057 $(this).find("> span").addClass("menu-hover"); 3058 $(this).find("dd").first().children().addClass("no-pipe"); 3059 var navItemWt = $(this).width() - 1; 3060 var subNavItemWt = $(this).find("dl").outerWidth(); 3061 if( navItemWt >= subNavItemWt && subNavItemWt != null ) 3062 $(this).find("dl").width(navItemWt); 3063 } 3064 if(target == 40){ 3065 $(this).closest("td").find("dl").find("dd").first().children().focus(); 3066 } 3067 3068 }, 3069 navMenuMouseLeave: function() { 3070 $(this).find("dl").removeClass("menu-show"); 3071 $(this).find("dl").removeClass("last-menu-show"); 3072 $(this).find("> a").removeClass("menu-hover"); 3073 $(this).find("> span").removeClass("menu-hover"); 3074 $(this).find("dl").removeAttr("class"); 3075 $(this).find("> a").removeAttr("class"); 3076 $(this).find("> span").removeAttr("class"); 3077 $(this).find("> article").removeAttr("class"); 3078 }, 3079 navMenuEscape: function(e){ 3080 target = e.keyCode; 3081 if(target == 27 || target == 38 || target == 35 || target == 46 || target == 8) { 3082 e.preventDefault(); 3083 $(this).find("dl").removeClass("menu-show"); 3084 $(this).find("dl").removeClass("last-menu-show"); 3085 $(this).find("> a").removeClass("menu-hover"); 3086 $(this).find("> span").removeClass("menu-hover"); 3087 $(this).find("dl").removeAttr("class"); 3088 $(this).find("> a").removeAttr("class"); 3089 $(this).find("> span").removeAttr("class"); 3090 } 3091 }, 3092 navMenuMouseEnterIE: function() { 3093 $(this).find("dl").addClass("menu-show"); 3094 //$(this).closest("td:last-child").find("dl").addClass("last-menu-show");//IRAC-5472 Top navigation isn't working on Firefox browser - INC001233682IRAC-5481 3095 $(this).find("> a").addClass("menu-hover"); 3096 $(this).find("> span").addClass("menu-hover"); 3097 $(this).find("> a").closest("td").addClass("menu-hover"); 3098 $(this).find("> span").closest("td").addClass("menu-hover"); 3099 $(this).find("dd").first().children().addClass("no-pipe"); 3100 var myNav = navigator.userAgent.toLowerCase(); 3101 if( (myNav.indexOf('msie') != -1) &&( (parseInt(myNav.split('msie')[1])) <= 7 )) { 3102 var topShow = $("#container").outerHeight() - ($("#page").outerHeight() + $("#container > footer").outerHeight()); 3103 $(this).closest(".nav-menu").css('position', 'static'); 3104 $("#nav-container").css('position', 'static'); 3105 //$(this).find(".menu-show").css('top', topShow + 'px'); 3106 } 3107 var navItemWt = $(this).width() - 1; 3108 var subNavItemWt = $(this).find("dl").outerWidth(); 3109 if( navItemWt >= subNavItemWt && subNavItemWt != null ) 3110 $(this).find("dl").width(navItemWt); 3111 var nwSubNavWt = $(this).find("dl").width(); 3112 $(this).find("dl dd").width(nwSubNavWt); 3113 }, 3114 navMenuMouseLeaveIE: function() { 3115 $(this).find("dl").removeClass("menu-show"); 3116 $(this).removeClass("menu-hover"); 3117 $(this).find("dl").removeAttr("class"); 3118 $(this).removeAttr("class"); 3119 $(this).find("> a").removeAttr("class"); 3120 $(this).find("> span").removeAttr("class"); 3121 }, 3122 navMenuOnClickIE: function() { 3123 if( (!$(this).find("dl").length > 0) && ($(this).find("> a").length > 0) ) 3124 window.location.href = $(this).find("> a").attr("href"); 3125 }, 3126 mobSubMenuOnClick: function(e) { 3127 e.stopPropagation(); 3128 var offWid = $("#container").width(); 3129 $(this).closest(".mob-menu").animate({ left: '-' + offWid + 'px'}, '1000' , function(){}); 3130 $(".mob-sub-menu ul").hide(); 3131 $(".mob-nav-menu").height($(this).children("ul").outerHeight()); 3132 var offTop = $(this).offset().top - $(".mob-menu div").offset().top; 3133 offWid = offWid - 10; 3134 $(this) 3135 .children("ul").show() 3136 .width($(this).parent().width()) 3137 .css({'top': '-' + offTop + 'px', 'left': offWid + 'px'}); 3138 }, 3139 mobBackToMenu: function(e) { 3140 e.stopPropagation();
3141 var offWid = $("#container").width(); 3142 var menuListHt = $(".mob-menu div").outerHeight(); 3143 $(this).closest(".mob-menu").animate({ left: 0 }, '1000' , function(){}); 3144 $(".mob-nav-menu").height(menuListHt); 3145 $(".mob-sub-menu ul").hide(); 3146 }, 3147 navigationItems: function(isMobile, isMember) { 3148 var navData = htz.template.topNavJson.data.navigationInfoMap, 3149 rootSubMenus = [], 3150 sourceItems = (isMobile) ? navData.navigationItemsMobile : navData.navigationItems; 3151 3152 function parseSubMenus(subMenus) { 3153 var result = []; 3154 3155 _.each(subMenus, function(subMenu) { 3156 var menuItem = {}; 3157 menuItem.displayText = subMenu.displayText; 3158 menuItem.url = subMenu.url; 3159 menuItem.imageUrl = subMenu.imageUrl; //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 3160 menuItem.webContext = subMenu.webContext; 3161 3162 if( subMenu.subMenus && subMenu.subMenus.length > 0 ) { 3163 menuItem.subMenus = parseSubMenus(subMenu.subMenus); 3164 menuItem.isLeaf = false; 3165 } else { 3166 menuItem.isLeaf = true; 3167 } 3168 3169 result.push(menuItem); 3170 3171 }); 3172 3173 return result; 3174 } 3175 3176 $.each(sourceItems, function(index, navItem) { 3177 rootSubMenus = rootSubMenus.concat(parseSubMenus(navItem.subMenus)); 3178 }) 3179 3180 for(var x = 0; x<rootSubMenus.length; x++){ 3181 if(rootSubMenus[x].webContext === "JOIN" && isMember){ 3182 rootSubMenus.splice(x,1); 3183 } 3184 } 3185 3186 return rootSubMenus; 3187 }, 3188 isLoggedIn: function () { 3189 var loginStatus = false, 3190 loginData = htz.template.topNavJson.data.navigationInfoMap; 3191 3192 if( loginData.navigationItems && loginData.navigationItems[0] ) { 3193 loginStatus = loginData.navigationItems[0].loggedIn; 3194 } else if( loginData.navigationItemsMobile && loginData.navigationItemsMobile[0] ) { 3195 loginStatus = loginData.navigationItemsMobile[0].loggedIn; 3196 } 3197 3198 return loginStatus; 3199 }, 3200 initialize: function() { 3201 topNavInitialized = true; 3202 var self = this, member; 3203 var isMember; 3204 3205 try{ 3206 isMember = htz.template.topNavJson.data.loggedIn; 3207 }catch(ex){ 3208 3209 } 3210 let wlClientId = htz.template.topNavJson.data.wlClientId; 3211 let wlAudience = htz.template.topNavJson.data.wlAudience; 3212 let localStorageAccessKey = '@@auth0spajs@@::' + wlClientId + '::' + wlAudience + '::openid profile email offline_access'; 3213 let localStorageIdKey = '@@auth0spajs@@::' + wlClientId + '::@@user@@'; 3214 3215 if (!isMember && localStorage.getItem(localStorageAccessKey) !== null && localStorage.getItem(localStorageIdKey) !== null && localStorage.getItem('loginAttempted') === null) { 3216 let currentUrl = window.location.href; 3217 let anchor = currentUrl.indexOf('#') > -1 ? currentUrl.substring(currentUrl.indexOf('#')) : null; 3218 if (anchor !== null && anchor !== undefined && anchor !== '') { 3219 currentUrl = currentUrl.substring(0, (currentUrl.length - anchor.length)); 3220 } 3221 currentUrl = currentUrl + (currentUrl.indexOf('?') !== -1 ? "&" : "?") + "member=auth0"; 3222 if (anchor !== null && anchor !== undefined && anchor !== '') { 3223 currentUrl += "&urlAnchor=" + anchor.substring(1); 3224 } 3225 localStorage.setItem('loginAttempted', 'Y'); 3226 window.location.href = currentUrl; 3227 } 3228 3229 if (isMember) { 3230 let wlAccessData = htz.template.topNavJson.data.accessData; 3231 let wlIdData = htz.template.topNavJson.data.idData; 3232 if (wlAccessData !== undefined && wlAccessData !== null && wlAccessData !== '' && wlIdData !== undefined && wlIdData !== null && wlIdData !== '') { 3233 if (localStorage.getItem("localStorageAccessKey") !== null && 3234 localStorage.getItem("localStorageIdKey") !== null && 3235 localStorage.getItem(localStorageAccessKey) == null && 3236 localStorage.getItem(localStorageIdKey) == null) { 3237 window.location.href = '/rentacar/emember/submitLogout.do'; 3238 } 3239 else { 3240 localStorage.setItem(localStorageAccessKey, wlAccessData); 3241 localStorage.setItem(localStorageIdKey, wlIdData); 3242 localStorage.setItem("localStorageAccessKey", localStorageAccessKey); 3243 localStorage.setItem("localStorageIdKey", localStorageIdKey); 3244 } 3245 } 3246 } 3247 3248 var mainNav = self.navigationItems(false, isMember), 3249 mobNav = self.navigationItems(true, isMember), 3250 loggedData = self.isLoggedIn(); 3251 3252 self.data = { 3253 navigation: htz.template.topNavJson.data.content.navigation, 3254 topNav: htz.template.topNavJson.data.topNavigationInfo, 3255 member: htz.template.topNavJson.data, 3256 menuItems: mainNav, 3257 menuItemsMobile: mobNav, 3258 loggedIn: loggedData 3259 }; 3260 3261 if( htz.config.renderHtml ) 3262 self.render(); 3263 }, 3264 render: function() { 3265 var compiledTemplate, 3266 topNav, 3267 self = this, 3268 searchRE, 3269 queryStr = {}; 3270 3271 searchRE = new RegExp("&search=", "g"); 3272 if( searchRE.test(location.href) == true ) { 3273 $.each(document.location.search.substr(1).split('&'),function(c, q) { 3274 var i = q.split('='); 3275 queryStr[i[0].toString()] = i[1].toString(); 3276 }); 3277 $("#search-input").val(queryStr.search); 3278 } 3279 3280 topNav = self.data.topNav; 3281 topNav.rootContext = htz.config.rootContext; 3282 topNav.headerImageUrl = htz.config.protocol + "://images.hertz.com" + topNav.logoUrl; 3283 topNav.ryanairHeaderImage = htz.config.protocol + "://images.hertz.com" + topNav.raLargeLogoUrl; 3284 topNav.ryanairHeaderImageSmall = htz.config.protocol + "://images.hertz.com" + topNav.raSmallLogoUrl; 3285 topNav.nvpLanguageSelected = topNav.nvpLanguageSelected.toUpperCase(); 3286 topNav.pos = topNav.pos.toUpperCase(); 3287 3288 $.each(topNav.nvpCountries, function (index, country) { 3289 if( country.value === htz.config.pos ) { 3290 topNav.countrySelectedName = country.name; 3291 return -1; 3292 } 3293 }); 3294 3295 $.each(topNav.nvpLanguages, function (index, language) { 3296 if( language.value === topNav.nvpLanguageSelected ) { 3297 topNav.languageSelectedName = language.name; 3298 return -1; 3299 } 3300 }); 3301 3302 $("#nav-container").empty().append(_.template($("#nav-tpl").html(), self.data)); 3303 $("#member-nav-container").empty().append(_.template($("#mobile-member-nav-tpl").html(), self.data)); //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 3304 compiledTemplate = _.template($("#header-tpl").html()); 3305 $("#header-container").html(compiledTemplate(self.data)); 3306 memNavloginModel = new sdlLoginModel(); 3307 memNavloginView = new sdlLoginView({ el: "header", model: memNavloginModel }); 3308 3309 if( Modernizr && Modernizr.touch ) 3310 $(".nav-menu a").on("touchend", self.navMenuTouchEnd); 3311 3312 var myNav = navigator.userAgent.toLowerCase(); 3313 3314 if( (myNav.indexOf('msie') != -1) &&( (parseInt(myNav.split('msie')[1])) <= 8 )) { 3315 $(".nav-menu ul li").on("mouseenter", self.navMenuMouseEnterIE); //dtc4102//irac-61//Accessibility Fixes for Rental Car Deals Page - INC001290931 3316 $(".nav-menu ul li").on("mouseleave", self.navMenuMouseLeaveIE); //changed td to ul li 3317 $(".nav-menu ul li").on("click", self.navMenuOnClickIE); 3318 } else { 3319 $(".nav-menu ul li").on("mouseenter", self.navMenuMouseEnter); //dtc4102//irac-61//Accessibility Fixes for Rental Car Deals Page - INC001290931 3320 $(".nav-menu ul li").on("mouseleave", self.navMenuMouseLeave); //changed td to ul li 3321 $(".nav-menu ul li").on("keydown", self.navMenuEnter); // nh52943 HER-14 Nav-links control using tab 3322 $(".nav-menu ul li").on("keydown", self.navMenuEscape); 3323 } 3324 3325 $("body, html").on("click", this.unbindBodyClick); 3326 3327 //hz464486//irac-1142 3328 //Update POS US Mobile Nav for view / modify /cancel 3329 if(htz.config.pos == "US" && htz.config.dialect == "enUS"){ 3330 this.$el.find(".mobile-nav-menu").find('a[href*="/rentacar/reservation/modify/home?defaultTab=2"]').attr('href','/us/en/reservation/lookup'); 3331 } 3332 return this; 3333 } 3334 }); 3335 3336 var topHeader = new htz.integrated.header.views.HeaderView(); 3337 if( typeof define == 'function' && typeof require == 'function' && define.amd ) { 3338 require(['config/app-info'], function(appInfo){ 3339 appInfo.setHeader(topHeader); 3340 }); 3341 } 3342}); 3343 3344var sdlLoginModel = Backbone.Model.extend({ 3345 defaults: { 3346 "loggedIn" : false, 3347 "firstInit" : "", 3348 "firstName" : "", 3349 "lastName" : "", 3350 "prefix" : "", 3351 "suffix" : "", 3352 "memberNumber" : "", 3353 "memberType" : "", 3354 "legacyPage" : htz.config.legacyPage, 3355 "fullContext" : htz.config.fullContext 3356 }, 3357 3358 url: htz.config.rootContext+"/member/authentication" 3359}) 3360var sdlLoginView = Backbone.View.extend({ 3361 events: { 3362 'click #loginLink': 'toggleLoginForm', 3363 'click #arrowDropdown': 'toggleLoginForm', 3364 'click #cookieLink': 'toggleLoginForm', 3365 'click .switchProfileLink':'handleSwitchProfile', 3366 'click #loginButton': 'homePageloginSubmit', 3367 'click #logOut': 'logOut', 3368 'click #forgotMemberNumberLink': 'forgotMemberNumberLink', 3369 'click #forgotPwdLink': 'forgotPwdLink', 3370 "click .learnMoreLink": "infoOverlay", 3371 /* P U - This works on iOS, Android and Desktop */ 3372 'mouseover #loginButton' : "lockBlack", 3373 'mouseout #loginButton' : "lockWhite", 3374 'touchstart #loginButton' : "lockWhite", 3375 'touchend #loginButton' : "lockWhite", 3376 'mousedown #loginButton' : "lockBlack", 3377 'mouseup #loginButton' : "lockWhite", 3378 "click #loginCreateUserId": "loginCreateUserId", 3379 "keypress #loginFormContainer ": "onEnterLogin", 3380 "mouseover .loginLink": "yellowChange", 3381 "mouseout .loginLink": "blueChange", 3382 "touchstart .loginLink": "yellowChange", 3383 "click #upgradeToGold": "upgradeToGold", 3384 "click #loggedInTravelAgent":"toggleLogOutMenu", 3385 "click #mobile-nav-close-trigger":"slideCloseMobileMemberNav"//dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 3386 }, 3387 initialize: function(){ 3388 3389 _.bindAll(this, 'renderTopNav', 'isCookied', 'renderLogin', 'toggleLoginForm', 'showLogin', 'hideLogin', 'homePageloginSubmit', 'logOut', 'forgotPwdLink', 'forgotMemberNumberLink', 'loginCreateUserId'); 3390 this.isCookied(); 3391 this.useridInfo = new Tooltip(); 3392 3393 this.lightbox = null; 3394 3395 this.utilsProxy = null; 3396 var self = this; 3397 3398 requirejs(['utils/utils-proxy'], function(utilsProxy) { 3399 3400 if (!htz.utils.config.UtilConfig.getLightbox()){ 3401 var options = {}; 3402 options.lightBox = htz.utils.LightBox; 3403 htz.utils.config.UtilConfig.configure(options); 3404 } 3405 3406 self.utilsProxy = utilsProxy; 3407 }); 3408 }, 3409 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 3410 slideCloseMobileMemberNav: function(e){ 3411 e.stopPropagation(); 3412 var target= e.currentTarget; 3413 3414 $(target).closest("#sideMenuMember").removeClass("mobileNavBckgrnd"); 3415 3416 $(target).closest("#member-nav-container").css("width","0px"); 3417 3418 this.expandSubMenu(e); 3419 //$(target).closest(".mob-menu").find("#chevron-arrow").removeClass("arr-up").addClass("arr-down"); 3420
3421 target.setAttribute("aria-expanded","false"); //dtc4102//22.23//Accessibility(HER-89) - Unlabelled Button - INC001221352 3422 3423 return false; 3424 }, 3425 onEnterLogin: function(e){ 3426 target = e.keyCode; 3427 if(target == 13) { 3428 e.preventDefault(); 3429 $("#loginButton").trigger('click'); 3430 } 3431 }, 3432 isCookied: function(){ 3433 var self = this; 3434 $.ajax({ 3435 url: htz.config.rootContext+"/member/top/navigation", 3436 dataType: "json", 3437 cache: false, 3438 contentType: "application/json", 3439 beforeSend: function(req){}, 3440 success: function(data, req, status) { 3441 self.model.set({ 3442 'prefix': data.data.prefix, 3443 'firstName': data.data.firstName, 3444 'lastName': data.data.lastName, 3445 'suffix': data.data.suffix, 3446 'loggedIn': data.data.loggedIn, 3447 'memberNumber': data.data.memberNumber, 3448 'memberType': data.data.memberType, 3449 'cookieLaw': htz.config.isCountryinEuropeUnion, 3450 'auth0': data.data.auth0 3451 }); 3452 3453 if (data.data.show2FA !== undefined && data.data.show2FA !== null && data.data.show2FA !== '') { 3454 htz.helpers.SiftIracLogin.otpForm(true); 3455 } 3456 3457 //hz464486
3458 //IRAC-1759 3459 //fire amplitude reset function on login 3460 if (data.data.memberNumber && data.data.memberNumber !== '') { 3461 AmplitudeUtils.whenReady(function(amplitude) { 3462 amplitude.setUserId(data.data.memberNumber); 3463 }); 3464 } 3465 3466 if ((self.model.get('firstName') != null) && (self.model.get('firstName') != '')){ 3467 self.model.set('firstInit', self.model.get('firstName').substring(0,1)); 3468 } 3469 3470 if(data.data.displayLogin) { // hides login and top nav in platinum -PJ 3471 self.renderTopNav(); 3472 self.renderLogin(); 3473 } 3474 3475 if(data.data.displayJoin == 'N'){ 3476 $('#logIn').parent().css('display','none'); 3477 $('#loginLink').css('border-right','none'); 3478 } 3479 3480 if (self.getParameterByName('mN') == 't') { 3481 if (self.model.attributes.lastName) {$('#cookieLink').trigger('click');} 3482 else {$('#loginLink').trigger('click');} 3483 } 3484 3485 }, 3486 error: function(req, status){} 3487 }); 3488 3489 }, 3490 hideDropdowns: function(){ 3491 $("#loginFormContainer").hide(); 3492 $(".loginLink, .myaccount, .cookieLink").removeClass("loginActive").addClass("loginInActive"); 3493 if($(".loginLink")) { 3494 $(".loginLink").trigger("blur"); 3495 $(".loginLink").addClass("topNavPrimary"); 3496 } 3497 }, 3498 renderTopNav: function(){ 3499 3500 var pathName = window.location.pathname; 3501 if(pathName.indexOf("hertzlink/index.jsp") != -1){ 3502 this.templateNav = _.template($("#topNavLinks").html()); 3503 this.$(".pos-container").html(this.templateNav(this.model.attributes)); 3504 $(window).on('resize', function(){ 3505 var win = $(this); 3506 if (win.width() < 768) { 3507 $('#nav-container').css('display','none'); 3508 } 3509 if (win.width() > 768){ 3510 $('#nav-container').css('display','contents'); 3511 } 3512 }); 3513 }else{ 3514 this.templateNav = _.template($("#topNavLinks").html()); 3515 this.$(".emember-container").html(this.templateNav(this.model.attributes)); 3516 } 3517 3518 //dtc4102//PR013993 GPR 3519 //render the new mobile web dropdown menus 3520 this.templateMobileNavInfo = _.template($("#mobileWebtopNavMemberInfo").html()); 3521 this.$("#mobile-nav-header-member-info").html(this.templateMobileNavInfo(this.model.attributes)); 3522 3523 //dtc4102//IRAC-260-Optimize-hertz.com-Mobile-Web-Login-and-Navigation-INC001561599 3524 this.mobileNavTemplate = _.template($("#mobiletopNavMemberInfo").html()); 3525 this.$("#mobile-nav-member-info").html(this.mobileNavTemplate(this.model.attributes)); 3526 3527 return this; 3528 }, 3529 3530 //dtc4102//PR013993 GPR 3531 showMemberDropdown:function(e){ 3532 e.stopPropagation(); 3533 3534 3535 $("#mobileWebMemberInfoUL>li>a[href$='/rentacar/emember/modify/profile.do?']").parent().remove(); //remove the Modify Profile element from the DOM for mobile web //PR013993 GPR 3536 $("#mobileWebArrowDropdown").toggleClass("mobileWebArrowOpen").toggleClass("mobileWebArrowClose"); 3537 $("#mobile-nav-member-info").toggleClass("border-bottom"); 3538 $("#mobile-nav-member-info-more").toggleClass("border-bottom"); 3539 3540 $("#mobile-nav-member-menu").slideToggle(700, "swing",function(){ 3541 3542 var menuListHt = $("#mobile-nav-member-info-more").outerHeight() + $("#mobileWebMemberInfoUL").outerHeight(); 3543 $("#mobile-nav-member-menu").height(menuListHt); 3544 3545 }); 3546 3547 return false; 3548 }, 3549 3550 handleSwitchProfile:function(e){ 3551 e.stopPropagation(); 3552 }, 3553 toggleLogOutMenu:function(){ 3554 if ($('.new-agent-logout').hasClass('new-hide')) { 3555 $('.new-agent-logout').removeClass('new-hide') 3556 } else { 3557 $('.new-agent-logout').addClass('new-hide') 3558 } 3559 }, 3560 renderLogin:function(){ 3561 var self=this; 3562 3563 this.template = _.template($("#sdlLoginFromTemplate").html()); 3564 this.$("#loginFormContainer").html(this.template(this.model.attributes)); 3565 3566 if(this.model.attributes.loggedIn){ 3567 $.ajax({ 3568 url: htz.config.rootContext + "/member/account/navigation", 3569 dataType: "json", 3570 cache: false, 3571 contentType: "application/json", 3572 beforeSend: function(req){}, 3573 success: function(accountData, req, status){ 3574 var showMyAccount = false; 3575 if(typeof accountData.data !== "undefined") { 3576 3577 if(( accountData.data.clubType != "1") && ( accountData.data.clubType != 'express')) { 3578 $("#upgradeToGold").hide(); //This button should only show for members of type #1 Club 3579 } 3580 if(accountData.data.goldPermission == 'goldnotallowed'){ 3581 $("#upgradeToGold").hide(); 3582 } 3583 3584 clubType = accountData.data.clubType; 3585 clubTier = accountData.data.clubTier; 3586 switch (clubType) { 3587 case "G": 3588 showMyAccount = true; 3589 if (clubTier == "PC") { 3590 $('#memberNavClubHeaderName').html($('#numberOneClubPresidentCircle').html()); 3591 $('#mobileWebMemberInfo-clubtier').html($('#numberOneClubPresidentCircle').html()); 3592 } 3593 else if (clubTier == "FS") { 3594 $('#memberNavClubHeaderName').html($('#numberOneClubFiveStar').html()); 3595 $('#mobileWebMemberInfo-clubtier').html($('#numberOneClubFiveStar').html()); 3596 } 3597 else { 3598 //dtc4102//PR013993 GPR 3599 //desktop 3600 $('#memberNavClubHeaderName').html($('#numberOneClubGold').html()); 3601 3602 //dtc4102//PR013993 GPR 3603 //mobile web 3604 $('#mobileWebMemberInfo-clubtier').html($('#numberOneClubGold').html()); 3605 3606 } 3607 break; 3608 case "P": 3609 showMyAccount = true; 3610 $("#memberNavClubHeaderName").html($('#numberOneClubPlatinum').html()); 3611 $('#mobileWebMemberInfo-clubtier').html($('#numberOneClubPlatinum').html()); 3612 break; 3613 case "1": 3614 showMyAccount = true; 3615 $("#memberNavClubHeaderName").html($('#numberOneClub').html()); 3616 $('#mobileWebMemberInfo-clubtier').html($('#numberOneClub').html()); 3617 break; 3618 case "TA": 3619 if (accountData.data.displayExactlyRewardsLink) { 3620 $('.taNavLink').attr('href',accountData.data.hertzPartnersLink).html(accountData.data.hertzPartnersText).show(); 3621 } 3622 $('#loggedInMember').hide(); 3623 $('#loggedInTravelAgent').show(); 3624 break; 3625 } 3626 3627 $('#memberNavClubHeaderPoints').html(accountData.data.rewardsPoints+" pts"); 3628 $('#memberNavClubHeaderMemberNo span').html(self.model.attributes.memberNumber); 3629 3630 $('#mobileWebMemberInfo-points').html(accountData.data.rewardsPoints+" pts"); 3631 $('#mobileWebMemberInfo-memberNumber span').html(self.model.attributes.memberNumber); 3632 3633 3634 // Temporary removed rental display - IRAC-824 part of 15.2 release - Gopal 3635 /* 3636 if (accountData.data.rentalCount == 0) { $('#rentalYTD').hide(); } 3637 else { $("#rentalCount").html(accountData.data.rentalCount); } 3638 */ 3639 3640 if (accountData.data.rewardsPoints == 0) { $('#mobileNavAwards').hide(); } 3641 else { $("#mobileGoldPoints").html(accountData.data.rewardsPoints); } 3642 3643 if (htz.config.subSystemId != "IRAC") { 3644 $('#mobileNavAwards').hide(); 3645 } 3646 3647 for (i = 0; i<accountData.data.items.length; i++) { 3648 $("#loggedUserDetails").append("<li><a href="+ htz.config.rootContext+accountData.data.items[i].url +">" + accountData.data.items[i].displayText +"</a></li>"); //desktop 3649 $("#mobileWebMemberInfoUL").append("<li><a href="+ htz.config.rootContext+accountData.data.items[i].url +">" + accountData.data.items[i].displayText +"</a></li>"); //mobile web 3650 } 3651 3652 $("#mobileWebMemberInfoUL>li>a[href$='/rentacar/emember/modify/profile.do?']").parent().remove(); 3653 3654 //dtc4102//PR013993 GPR 3655 //append the logout button to the bottom of the dropdown menu 3656 $("#loggedUserDetails").append('<li id="logOut"> <a href="'+htz.config.rootContext+'/emember/submitLogout.do">Logout</a></li>'); 3657 3658 if (showMyAccount){ $("#myaccount").show(); } 3659 3660 3661 } else { 3662 $('#myaccount').hide(); 3663 } 3664 3665 }, 3666 error: function(req, status){} 3667 }); 3668 } 3669 3670 return this; 3671 }, 3672 lockWhite: function(){ 3673 $("#loginButton span").addClass("icons-white_lock").removeClass("icons-lock"); 3674 }, 3675 lockBlack: function(){ 3676 $("#loginButton span").removeClass("icons-white_lock").addClass("icons-lock"); 3677 }, 3678 yellowChange: function(){ 3679 if($('.loginLink').hasClass("topNavPrimary")) 3680 $('.loginLink').addClass("topNavPrimaryHover"); 3681 3682 var self = this; 3683 if('ontouchstart' in document.documentElement) { 3684 3685 $('body').on('touchmove', function(ev){ 3686 if(!$('#loginFormContainer').is(":visible") && $('.loginLink').hasClass("topNavPrimaryHover")){ 3687 self.blueChange(); 3688 $('body').off(ev); 3689 } 3690 }); 3691 } 3692 3693 }, 3694 blueChange: function(){ 3695 if($('.loginLink').hasClass("topNavPrimary")) 3696 $('.loginLink').removeClass("topNavPrimaryHover"); 3697 }, 3698 toggleLoginForm: _.debounce(function(e){ 3699 e.preventDefault(); 3700 e.stopPropagation(); 3701 3702 var self = this; 3703 if (self.model.get('auth0')) { 3704 this.homePageloginSubmit(); 3705 } 3706 else { 3707 var $overlayStub = null; 3708 if(htz.config.protocol === 'https'){ 3709 var loginEvent = 'ontouchstart' in document.documentElement ? "touchstart" : "click"; 3710 3711 if($('#loginFormContainer').is(":visible")){ 3712 self.hideLogin(); 3713 $("#arrowDropdown").removeClass("arrowClose").addClass("arrowOpen"); 3714 3715 } else { 3716 var obj = $(e.target); 3717 if (!(self.model.get('loggedIn')) && ((self.model.get('lastName') != null) && (self.model.get('lastName') != ''))) { obj = obj.closest('#cookieLink'); } 3718 self.showLogin(obj); 3719 $('#pos-change').on('click',function(){self.hideLogin();}); 3720 $(window).on('resize', function(){ 3721 clearTimeout(this.resizeEventHandler); 3722 resizeEventHandler = setTimeout(function(){if($('#loginFormContainer').is(":visible")){self.showLogin(obj);}}, 100); 3723 }); 3724 $('body').not(e.currentTarget).not('#loginFormContainer').on(loginEvent, { originEle: e.currentTarget.id }, function(ev){ 3725 var sourceEle = $('#'+ev.data.originEle); 3726 if($('#loginFormContainer').is(":visible") && sourceEle.has(ev.target).length==0 && ev.target.id!=ev.data.originEle && $('#loginFormContainer').has(ev.target).length==0 ){ 3727 self.hideLogin(); 3728 $('body').off(ev); 3729 } 3730 }); 3731 } 3732 3733 3734 // window.scrollTo(0,0); 3735 // self.getLightBox().overlay({ title: "<img src="+htz.localLoyaltyLogo.hertzGoldPlusImage+" alt='' />", close : close, dismiss : false }, $('#homePageloginBox')); 3736 3737 // $overlayStub = $('#hp-overlays') 3738 // if ( !( $overlayStub.length) ) {
3739 // $overlayStub = $('<div id="member-login-response-container" class="hidden"></div>'); 3740 // $('body').append($overlayStub); 3741 // } 3742 // 3743 // $.ajax({ 3744 // url : self.appConfig.config.rootContext + "/member/login/overlay", 3745 // cache : false, 3746 // dataType: 'html', 3747 // success : function(res){ 3748 // $($overlayStub).append(res); 3749 // window.scrollTo(0,0); 3750 // new LightBox().overlay({ title: "<img src="+htz.localLoyaltyLogo.hertzGoldPlusImage+" alt='' />", dismiss : true }, $('#homePageloginBox')); 3751 // 3752 // var lm = new loginModel(); 3753 // var lv = new loginView({el: "#homePageloginBox", model: lm, isRes: true, metaModel: self.model.get('metaData')}); 3754 // } 3755 // }); 3756 3757 3758 3759 } else { 3760 if('ontouchstart' in document.documentElement && $('.loginLink')) { 3761 self.blueChange(); 3762 } 3763 var step = location.hash; 3764 var baseUrl = document.URL.split(step)[0]; 3765 var del = (document.URL.indexOf('?') == -1) ? '?':'&'; 3766 window.location.href = baseUrl.replace('http:','https:') + del + 'mN=t' + step; 3767 } 3768 } 3769 3770 3771 },500), 3772 showLogin: function(obj){ 3773 var self = this; 3774 3775 $("#loggedUserDetails>li>a[href$='/rentacar/emember/modify/profile.do?']").parent().remove(); //remove the Modify Profile element from the DOM for desktop //PR013993 GPR 3776 $("#arrowDropdown").removeClass("arrowOpen").addClass("arrowClose"); 3777 if ( !$("#loginLink")){ 3778 3779 $overlayStub = $('#hp-overlays') 3780 if ( !( $overlayStub.length) ) { 3781 $overlayStub = $('<div id="member-login-response-container" class="hidden"></div>'); 3782 $('body').append($overlayStub); 3783 } 3784 3785 $.ajax({ 3786 url : htz.config.rootContext + "/member/login/overlay", 3787 cache : false, 3788 dataType: 'html', 3789 success : function(res){ 3790 $($overlayStub).append(res); 3791 window.scrollTo(0,0); 3792 self.utilsProxy.getLightbox().overlay({ title: "<img src="+htz.localLoyaltyLogo.hertzGoldPlusImage+" alt='' class='gold-plus-lightbox-logo' />", dismiss : true, width : 762, noPadding : true }, $('#homePageloginBox')); 3793 3794 var lm = new loginModel(); 3795 var lv = new loginView({el: "#homePageloginBox", model: lm, isRes: false, isInLightBox: true, metaModel: self.model.get('metaData'), referrer:self});//dtc4102//3DS-II-PR015031//added referrer 3796 } 3797 }); 3798 } else { 3799 if ($('.tmplPageContainer').length){ $(".tmplPageContainer").css({"position":"static"}); } 3800 3801 if(!obj.is(':visible') && $('.loginActive:visible')) 3802 obj = $('.loginActive:visible'); 3803 3804 var offset = obj.offset(); 3805 var width = obj.outerWidth(); 3806 var height = obj.outerHeight()+23; 3807 var widthBox = $("#loginFormContainer").outerWidth(); 3808 var top= offset.top + height; 3809 var left = offset.left + width + 10 - widthBox; 3810 this.$("#loginFormContainer").css({ 3811 "left": left 3812 }) 3813 if($(".loginLink")) 3814 $(".loginLink").removeClass("topNavPrimary").removeClass("topNavPrimaryHover"); 3815 obj.removeClass("loginInActive").addClass("loginActive"); 3816 this.$("#loginFormContainer").slideDown('1000'); 3817 } 3818 }, 3819 hideLogin: function(){ 3820 this.$("#loginFormContainer").slideUp('1000', function(){ 3821 $("#arrowDropdown").removeClass("arrowClose").addClass("arrowOpen"); 3822 $(".loginLink, .myaccount, .cookieLink").removeClass("loginActive").addClass("loginInActive"); 3823 if($(".loginLink")) { 3824 $(".loginLink").trigger("blur"); 3825 $(".loginLink").addClass("topNavPrimary"); 3826 } 3827 }); 3828 }, 3829 logOut: function(e){ 3830 e.stopPropagation(); 3831 let localStorageAccessKey = localStorage.getItem("localStorageAccessKey"); 3832 let localStorageIdKey = localStorage.getItem("localStorageIdKey"); 3833 if (localStorageAccessKey !== undefined && localStorageAccessKey !== null && localStorageAccessKey !== "") { 3834 localStorage.removeItem(localStorageAccessKey); 3835 localStorage.removeItem("localStorageAccessKey"); 3836 } 3837 if (localStorageIdKey !== undefined && localStorageIdKey !== null && localStorageIdKey !== "") { 3838 localStorage.removeItem(localStorageIdKey); 3839 localStorage.removeItem("localStorageIdKey"); 3840 } 3841 localStorage.removeItem("accessToken"); 3842 localStorage.removeItem("refreshToken"); 3843 localStorage.removeItem("member"); 3844 //hz464486 3845 //IRAC-1759 3846 //fire amplitude reset function on logout 3847 AmplitudeUtils.whenReady(function(amplitude) { 3848 amplitude.reset(); 3849 }); 3850 3851 Utils.clearReservationSession(); 3852 }, 3853 forgotMemberNumberLink: function(){ 3854 window.location.href= htz.config.rootContext+"/emember/reset/memberNumberRetrieval.do"; 3855 }, 3856 forgotPwdLink: function(){ 3857 $("#loginForgotPasswordNav").val("forgotPassword"); 3858 this.homePageloginSubmit(); 3859 }, 3860 loginCreateUserId: function(){ 3861 $("#loginCreateUserId").val("true"); 3862 this.homePageloginSubmit(); 3863 }, 3864 infoOverlay: function(event){ 3865 var target = $(event.target); 3866 if(!this.useridInfo.isInUse()){ 3867 this.useridInfo.create({ 3868 containerID : 'userid-info', 3869 content : this.$('#username-desc').html(), 3870 width:"inherit" 3871 }); 3872 } 3873 this.useridInfo.show(target); 3874 }, 3875 homePageloginSubmit: function(){ 3876 Loader.showLoader(); 3877 var self = this; 3878
3879 localStorage.clear('localStorageAccessKey'); 3880 localStorage.clear('localStorageIdKey'); 3881 3882 if(this.model.attributes.lastName){ 3883 this.model.clear(); 3884 this.model.set({cookieMemberOnLogin: true, loginId: 'cookie', password: $('#homePagePassword').val(), loginForgotPassword: $("#loginForgotPasswordNav").val()}); 3885 } 3886 else { 3887 this.model.clear(); 3888 this.model.set({loginCreateUserID: $("#loginCreateUserId").val(), loginId: $("#homePageloginId").val(), password: $("#homePagePassword").val(), cookieMemberOnLogin: $('#cookieMemberOnLogin').is(':checked'), loginForgotPassword: $("#loginForgotPasswordNav").val()}); 3889 } 3890 3891 this.model.save(this.model.attributes, { 3892 success: function(collection, response){ 3893 var resultStatus = response.resultInfo.result; 3894 //lets handle error first 3895 Loader.hideLoader(); 3896 3897 if(resultStatus == "input" || resultStatus == "login"){ 3898 if (response.resultInfo.url.indexOf(htz.config.rootContext)!= -1) { 3899 window.location.href = response.resultInfo.url; 3900 } else { 3901 window.location.href = htz.config.rootContext+response.resultInfo.url; 3902 3903 } 3904 } else if(resultStatus === "success"){ 3905 if(window.location.href.indexOf('join') > 0 3906 || window.location.href.indexOf('legacy') > 0 3907 || window.location.href.indexOf('reset') > 0 3908 || window.location.href.indexOf('enrollment') > 0){ 3909 window.location.href = response.resultInfo.url; 3910 } else { 3911 window.location.reload(); 3912 } 3913 } else if(resultStatus == "success_to_profile" || resultStatus == "success_to_upgrade") { 3914 if (response.resultInfo.url.indexOf(htz.config.rootContext)!= -1) { 3915 window.location.href = response.resultInfo.url+"?curPage="+response.resultInfo.result; 3916 } else { 3917 window.location.href = htz.config.rootContext+response.resultInfo.url+"?curPage="+response.resultInfo.result; 3918 } 3919 } else { 3920 if ((response.resultInfo.url != null) && (response.resultInfo.url !== undefined)) { 3921 if (response.resultInfo.url.indexOf(htz.config.rootContext)!= -1) { 3922 window.location.href = response.resultInfo.url+"?curPage="+response.resultInfo.result; 3923 } else { 3924 window.location.href = htz.config.rootContext+response.resultInfo.url+"?curPage="+response.resultInfo.result; 3925 } 3926 } else { 3927 window.location.hreg = htz.config.rootContext + "?curPage=" + response.resultInfo.result; 3928 } 3929 3930 } 3931 }, 3932 error: function(model, response){ 3933 3934 var errors = $.parseJSON(response.responseText).message; 3935 3936 if(Utils.isUseStoragePolyfill()){ 3937 Utils.storeItemIE('ieLoginError', errors); 3938 }else { 3939 var strErrors = JSON.stringify(errors); 3940 htz.helpers.SessionHelper.setItem("errorData", strErrors); 3941 } 3942 3943 model.set({errorLocation: '#homePageloginBox #error-list'},{silent:true}); 3944 self.model.trigger('error', model, response); 3945 Loader.hideLoader(); 3946 var parsedResponse = $.parseJSON(response.responseText); 3947 if ((parsedResponse.resultInfo.url != null) && (parsedResponse.resultInfo.url !== undefined)) { 3948 window.location.href = htz.config.rootContext+parsedResponse.resultInfo.url+"?curPage="+parsedResponse.resultInfo.result; 3949 } else { 3950 window.location.href = htz.config.rootContext+"?curPage="+parsedResponse.resultInfo.result; 3951 } 3952 } 3953 }); 3954 }, 3955 getParameterByName : function(name){ 3956 name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); 3957 var regexS = "[\\?&]" + name + "=([^&#]*)"; 3958 var regex = new RegExp(regexS); 3959 var results = regex.exec(window.location.search); 3960 if(results == null) { return ""; } 3961 else { return decodeURIComponent(results[1].replace(/\+/g, " ")); } 3962 }, 3963 upgradeToGold: function(){ 3964 $.ajax({ 3965 url: htz.config.rootContext+"/rest/member/upgrade/gold", 3966 dataType: "json", 3967 cache: false, 3968 contentType: "application/json", 3969 beforeSend: function(req){}, 3970 success: function(data, req, status){ 3971 window.location.href = 'https://' + window.location.hostname + htz.config.rootContext + data.resultInfo.url; 3972 3973 }, 3974 error: function(req, status){} 3975 }); 3976 } 3977}); 3978 3979 3980// var lazyLoadMemberNav = { cache: false, dataType: 'html', success: function(data) { 3981// $('#homePageLoginOverlay').html(data); 3982 3983//removed the lines inside document.ready.. those will now be called from navigation.js after the top nav container is rendered 3984// }}; 3985$(document).ready(function(){ 3986 if(window.topNavInitialized === undefined){ 3987 3988 memNavloginModel = new sdlLoginModel(); 3989 memNavloginView = new sdlLoginView({el: "header", model: memNavloginModel}); 3990 } 3991 3992 3993}); 3994 3995// lazyLoadMemberNav.url = htz.config.rootContext + '/templates/emember/login/memberLoginView.jsp'; 3996// LazyLoad.queueJS(lazyLoadMemberNav, 'low'); 3997 3998 3999memberViewUtil = Backbone.View.extend({ 4000 events:{}, 4001 initialize: function(){ 4002 _.bindAll(this, 'infoMessage', 'closeOverlay', 'displayOverlay', 'hideLightBoxCloseBtn'); 4003 }, 4004 hideLightBoxCloseBtn: function(){ 4005 $(".lb-close").hide(); 4006 }, 4007 infoMessage: function(target){ 4008 var self = this; 4009 4010 var container = $(target); 4011 var posLink = container.closest(".overlayPopup").find(".overlayPopupLink:eq(0)"); 4012 var element = container.closest(".overlayPopup").find(".overlayPopupContent:eq(0)"); 4013 4014 if( element.is(":hidden") ){ 4015 $(".overlayPopupContent").hide();
4016 self.displayOverlay(element, posLink, false) 4017 } else { 4018 self.closeOverlay(element, false); 4019 } 4020 4021 }, 4022 displayOverlay: function(element, posLink, useScreen){ 4023 element = $( element ); 4024 posLink = $( posLink ); 4025 var myNav = navigator.userAgent.toLowerCase(); 4026 if( (myNav.indexOf('msie') != -1) &&( (parseInt(myNav.split('msie')[1])) == 6 )) { 4027 $('select').css("visibility", "hidden"); 4028 } 4029 4030 var scrollW = $(document).width(); 4031 var scrollH = $(document).height(); 4032 var posLinkTop = true ? posLink.offset().top : posLink.position().top; 4033 var posLinkLeft = true ? posLink.offset().left : posLink.position().left; 4034 4035 var windowHieight = $( window ).height(); 4036 var windowWidth = $( window ).width(); 4037 var cssTopPosLink = posLink.position().top; 4038 var cssLeftPosLink = posLink.position().left; 4039 4040 if (posLinkTop+element.height()>windowHieight+$(window).scrollTop()){ 4041 cssTopPosLink = posLink.position().top-element.height(); 4042 } else { 4043 cssTopPosLink = posLink.position().top+posLink.height(); 4044 } 4045 4046 if (posLinkLeft+element.width()+50>windowWidth+$(window).scrollLeft()){ 4047 cssLeftPosLink = posLink.position().left-element.width(); 4048 } else { 4049 cssLeftPosLink = posLink.position().left+posLink.width(); 4050 } 4051 4052 element.css({'top':cssTopPosLink,'left':cssLeftPosLink}); 4053 4054 if ( useScreen ){ 4055 var screen = $('#overlayScreen'); 4056 4057 if ( screen.length == 0 ) { 4058 screen = $('<div>') 4059 .attr("id", 'overlayScreen') 4060 .css({ 4061 width: scrollW, 4062 height: scrollH 4063 }) 4064 .addClass("overlayScreen") 4065 .appendTo(document.body); 4066 } 4067 4068 screen.show(); 4069 } 4070 4071 element.show(); 4072 }, 4073 closeOverlay: function(element, hasScreen){ 4074 var myNav = navigator.userAgent.toLowerCase(); 4075 if( (myNav.indexOf('msie') != -1) &&( (parseInt(myNav.split('msie')[1])) == 6 )) { 4076 $('select').css("visibility", "visible"); 4077 } 4078 if(hasScreen){ 4079 $(".overlayPopupContent").hide(); 4080 $('#overlayScreen').hide(); 4081 } 4082 $(element).hide(); 4083 } 4084}); 4085window.memUtil = new memberViewUtil({el : 'body'}); 4086 4087 4088function loginAndCreateUserIdSubmit(formToSubmit){ 4089 formToSubmit.prop('method','post'); 4090 formToSubmit.prop('action',htz.config.rootContext+'/emember/submitLogin'); 4091 4092 $('#loginCreateUserID').val('true'); 4093 formToSubmit.submit(); 4094} 4095 4096var passwordStrengthView=Backbone.View.extend({initialize:function(){this.template=this.options.template;this.content=this.options.content;this.setElement(this.options.el)},render:function(a){var b=_.template($(this.template).html(),{content:this.content});$(this.options.el).html(b);this.display(this.getPasswordStrength(a))},display:function(a){0<=a?($(this.options.el).show(),7==a?($(this.options.el).closest(".password-div").find(".passwordVerify").removeAttr("disabled"),$(this.options.el).closest(".password-div").find(".passwordVerifyBox").removeClass("disabled")): 4097($(this.options.el).closest(".password-div").find(".passwordVerify").attr("disabled","true"),$(this.options.el).closest(".password-div").find(".passwordVerifyBox").addClass("disabled"))):$(this.options.el).hide()},handleCheckmark:function(a,b,c){a?(b.addClass("checkmark"),c++):b.removeClass("checkmark").addClass("crossmark");return c},getSpecialCharFlag:function(a){return/[#\$%\^&!@]/.test(a)&&!1===/[^a-zA-Z0-9#$%\\^&!@]/.test(a)?!0:!1},getPasswordStrength:function(a){var b=0;if(0!=a.length){var c= 4098/[0-9]/.test(a),d=this.getSpecialCharFlag(a),e=/[A-Z]/.test(a),f=8<=a.length?!0:!1,g=30>=a.length?!0:!1,h=/[a-z]/.test(a),i=/\b(\w*password\w*)\b/.test(a.toLowerCase()),a=/(.)\1{3,}/.test(a),b=this.handleCheckmark(c,$("li#passStrenghtNums"),b),b=this.handleCheckmark(d,$("li#passSymbols"),b),b=this.handleCheckmark(e,$("li#passStrenghtUpper"),b),b=this.handleCheckmark(h,$("li#passStrenghtLower"),b),b=this.handleCheckmark(!i,$("li#passPassword"),b),b=this.handleCheckmark(!a,$("li#passRepeat"),b);f&& 4099g?($("li#passStrenghtMinChars").addClass("checkmark"),b++):$("li#passStrenghtMinChars").removeClass("checkmark").addClass("crossmark");return 7==b?7:1}return-1},checkPasswordMatch:function(a){var a=$(a.target),b=a.closest(".password-div").find("#password").val(),c=a.val();7==this.getPasswordStrength(b)&&setTimeout(function(){$(".password-strength-div").empty()},300);b===c?a.closest(".password-div").find("#errorPasswordMismatch").hide():a.closest(".password-div").find("#errorPasswordMismatch").show()}}); 4100/* pin reset confirmation */ 4101 4102var resetConfirmationView = Backbone.View.extend({ 4103 events: { 4104 "click #home-btn": "redirectHome", 4105 "click #profile-btn": "gotoProfile", 4106 "click #continue-res": "continueRes", 4107 "click #oci-review-ok": "handleOCIandReview" 4108 }, 4109 initialize: function(){ 4110 _.bindAll(this, 'renderResetConfirmation', 'redirectHome', 'gotoProfile'); 4111 this.renderResetConfirmation(); 4112 }, 4113 renderResetConfirmation: function() { 4114 var template = _.template( $("#pinResetConfirmationTemplate").html(), {} ); 4115 $(this.el).html( template ); 4116 4117 if(isRes || isOCI || isResReview) { 4118 $("#profile-btn, #home-btn").hide(); 4119 $("#pinResetConfirmationSection").css('width', 'auto'); 4120 $(".containerTableThickBorder, .containerTableBorder").css('border', 'none'); 4121 4122 if(isOCI || isResReview) { 4123 $("#continue-res").hide(); 4124 } else { 4125 $("#oci-review-ok").hide(); 4126 } 4127 4128 memUtil.hideLightBoxCloseBtn(); 4129 } else { 4130 $("#navLogout").css('display','block'); 4131 $("#navLogin").hide(); 4132 $("#continue-res, #oci-review-ok").hide(); 4133 memNavloginView.isCookied(); 4134 } 4135 }, 4136 redirectHome: function(){ 4137 document.location.href = htz.config.rootContext+'/reservation/'; 4138 }, 4139 gotoProfile: function(e){ 4140 document.location.href = htz.config.rootContext+'/emember/modify/profile'; 4141 }, 4142 continueRes: function(){ 4143 HomePage.bookAsMemberSubmitRes(); 4144 }, 4145 handleOCIandReview: function() { 4146 if(isOCI) { 4147 window.location.reload(); 4148 } else if(isResReview) { 4149 var callback = (this.handleMemberRes || handleMemberRes); 4150 if(callback && typeof callback === 'function') { 4151 callback(); 4152 } else { 4153 window.location.href = htz.config.rootContext+"/reservation/"; 4154 } 4155 } 4156 } 4157}); 4158 4159/* pin reset confirmation */ 4160 4161/* Reset password page */ 4162var resetPwdModel = RestModel.extend({ 4163 url: htz.config.rootContext+"/member/reset/password" 4164}); 4165 4166var resetPwdView = Backbone.View.extend({ 4167 defaults: { 4168 isRes: false, 4169 isOCI: false, 4170 isResReview: false, 4171 clearError: false 4172 }, 4173 events: { 4174 "click #resetSubmit": "resetPwdSubmit", 4175 "keyup #password": "checkPassword", 4176 "click .learnMoreLink": "learnMoreoverlay", 4177 "click .bookAsGuest,#bookAsGuest": "bookAsGuestFromresetPage", 4178 "click #strong-password-info" : "showStrongPasswordInformation", 4179 "blur #password" : "hideStrongPasswordInformation",
4180 "focusout #passwordVerify":"checkPasswordMatch" //dtc4102 //IRAC 4514-15 4181 }, 4182 initialize: function(){ 4183 _.bindAll(this, 'renderResetPwd', 'resetPwdSubmit', 'checkPassword', 'learnMoreoverlay'); 4184 this.renderResetPwd(); 4185 this.resetPassTooltip = new LightBox(); 4186 this.model.on('fieldError', this.highlight, this); 4187 this.passwordStrengthView = new passwordStrengthView({el : '#membershipDetailsPasswordIndicatorSection', template : '#password-strength-indicator'}); 4188 }, 4189 4190 //dtc4102 4191 //IRAC 4514-15 4192 checkPasswordMatch:function(e){ 4193 this.passwordStrengthView.checkPasswordMatch(e); 4194 }, 4195 4196 renderResetPwd: function(){ 4197 var template = _.template( $("#pinResetSectionTemplate").html(), {deviceGroup : htz.config.deviceGroup} ); 4198 $(this.el).html( template ); 4199 4200 if(isRes || isOCI || isResReview){ 4201 $("#pinResetSection").css('width', '550px'); 4202 $(".containerTableThickBorder, .containerTableBorder").css('border', '6px solid #EDEDED'); 4203 $(".overlayPopup").hide(); 4204 if(isOCI || isResReview){ 4205 $(".bookAsGuest").hide(); 4206 $("#bookAsGuest").hide(); 4207 } 4208 } 4209 this.isClickedOutside = false;
4210 this.collapsed = false; 4211 this.IsUserExpanded = false; 4212 this.IsUserClosed = false; 4213 }, 4214 bookAsGuestFromresetPage: function(e){ 4215 var target = $(e.target); 4216 target.closest(".lb-close").triggerHandler('click'); 4217 HomePage.bookAsGuestSubmitRes(); 4218 }, 4219 learnMoreoverlay: function(e){ 4220 if(!this.resetPassTooltip.isInUse()){ 4221 this.resetPassTooltip.overlay({title : this.$('#password-tooltip-label').html()}, this.$('#instruction-content').html()); 4222 } 4223 4224// target = $(e.target); 4225// memUtil.infoMessage(target); 4226 }, 4227 resetPwdSubmit: function(){ 4228 var self = this; 4229 self.hidePasswordIndicator(); 4230 Loader.showLoader(); 4231 if (clearError) 4232 this.model.clear(); 4233 4234 this.model.set({ 4235 password: $("#password").val(), 4236 passwordVerify: $("#passwordVerify").val() 4237 }); 4238 this.model.save(this.model.attributes, { 4239 success: function(collection, response){ 4240 clearError = false; 4241 var resultStatus = response.resultInfo.result; 4242 if (resultStatus == "success") { 4243 var urlOverlay = htz.config.rootContext+response.resultInfo.url; 4244 $.ajax({ 4245 url: urlOverlay, 4246 cache: false, 4247 beforeSend: function(){}, 4248 success: function(data, status, req){ 4249 if (isRes || isOCI || isResReview){ 4250 $(".lb-content-box-no-padding").html("").html(data); 4251 } 4252 4253 else { 4254 $(".sectionWidthSmall").html("").html(data); 4255 } 4256 4257 4258 var newUrl = sessionStorage.getItem("platinum"); 4259 if (newUrl) { 4260 sessionStorage.removeItem("platinum"); 4261 sessionStorage.setItem("resetPasswordConfirmationMessage", true); 4262 document.location.href = htz.config.rootContext + newUrl; 4263 } else { 4264 new resetConfirmationView({el: "#pinResetConfirmationSection"}); 4265 } 4266 4267 4268 }, 4269 error: function(){} 4270 }); 4271 } else if(resultStatus == "success_platinum") { 4272 sessionStorage.setItem("resetPasswordConfirmationMessage", true); 4273 window.location.href = htz.config.rootContext + response.resultInfo.url; 4274 } 4275 Loader.hideLoader(); 4276 }, 4277 error: function(model, response){ 4278 clearError = true; 4279 if (clearError) 4280 self.model.clear(); 4281 model.set({errorLocation: '#pinResetSection .error-list'},{silent:true}); 4282 self.model.trigger('error', model, response); 4283 Loader.hideLoader(); 4284 } 4285 }); 4286 }, 4287 checkPassword : function (e) { 4288 var target = $(e.target); 4289 var password = target.val(); 4290 this.passwordStrengthView.render(password); 4291 this.checkIndicatorStatus(); 4292 }, 4293 highlight : function(model, errors){ 4294 ErrorHelper.reset(); 4295 var mappings = [ 4296 {"fields":"password", "target":"errorPassword"}, 4297 {"fields":"passwordVerify", "target":"errorPasswordVerify"} 4298 ]; 4299 ErrorHelper.displayErrors(errors, {'mappings': mappings, 'allErrTarget': '#pinResetSection .error-list'}); 4300 }, 4301 showStrongPasswordInformation : function(e){ 4302 var self = this; 4303 var target = $(e.target); 4304 if(this.isClickedOutside){ 4305 this.isClickedOutside = false;
4306 }else{ 4307 self.$('.password-info').slideToggle(); 4308 if(target.hasClass('icons-blue-plus-box')) { 4309 target.addClass('icons-grey-minus-box') 4310 .removeClass('icons-blue-plus-box'); 4311 self.IsUserExpanded = true; 4312 self.IsUserClosed = false; 4313 } else { 4314 target.removeClass('icons-grey-minus-box') 4315 .addClass('icons-blue-plus-box'); 4316 self.IsUserClosed = true; 4317 self.IsUserExpanded = false; 4318 } 4319 } 4320 }, 4321 hideStrongPasswordInformation: function(){ 4322 if(!this.collapsed){ 4323 $('.password-info').slideToggle(); 4324 $('#strong-password-info').removeClass('icons-grey-minus-box') 4325 .addClass('icons-blue-plus-box'); 4326 this.collapsed = true; 4327 this.isClickedOutside = true; 4328 } 4329 this.bindClickEvent(); 4330 }, 4331 checkIndicatorStatus: function(){ 4332 if((this.collapsed && !this.IsUserExpanded) || (this.collapsed && this.IsUserClosed)){ 4333 $('.password-info').slideToggle(); 4334 $('#strong-password-info').removeClass('icons-grey-minus-box') 4335 .addClass('icons-blue-plus-box'); 4336 $('.password-info').hide(); 4337 } 4338 }, 4339 hidePasswordIndicator : function(){ 4340 var target = $('#strong-password-info'); 4341 if(target.hasClass('icons-grey-minus-box')) { 4342 $('.password-info').slideToggle(); 4343 target.removeClass('icons-grey-minus-box') 4344 .addClass('icons-blue-plus-box'); 4345 $('.password-info').hide(); 4346 } 4347 }, 4348 bindClickEvent : function(){ 4349 var self = this; 4350 $('body').bind('click', function(e){ 4351 var target = $(e.target)[0].id; 4352 if(target == 'password' || target == 'strong-password-info'){ 4353 self.isClickedOutside = false;
4354 } 4355 else{ 4356 self.isClickedOutside = false; 4357 } 4358 $('body').unbind('click'); 4359 }); 4360 } 4361}); 4362 4363/* Reset password page */ 4364/* Forgot password view */ 4365var CardType = Backbone.Model.extend(); 4366var CardTypes = Backbone.Collection.extend({ 4367 url: htz.config.rootContext+'/rest/member/creditcard-list', 4368 model: CardType 4369}); 4370var CardTypeView = Backbone.View.extend({ 4371 tagName: "option", 4372 4373 initialize: function(){ 4374 _.bindAll(this, 'render'); 4375 }, 4376 render: function(){ 4377 $(this.el).attr('value', this.model.value).html(this.model.name); 4378 return this; 4379 } 4380}); 4381var CardTypesView = Backbone.View.extend({ 4382 initialize: function(){ 4383 var ctr = this.collection.model.length; 4384 for(i=0; i<ctr; i++) 4385 this.addOne(this.collection.model[i]); 4386 //this.collection.each(this.addOne, this); 4387 _.bindAll(this, 'addOne', 'addAll'); 4388 // this.collection.bind('reset', this.addAll); 4389 }, 4390 addOne: function(cardType){ 4391 $(this.el).append(new CardTypeView({ model: cardType }).render().el); 4392 }, 4393 addAll: function(){ 4394 this.collection.each(this.addOne); 4395 } 4396}); 4397var Country = Backbone.Model.extend(); 4398 var Countries = Backbone.Collection.extend({ 4399 url: htz.config.rootContext+'/rest/member-drivers-license/country-list', 4400 model: Country 4401 }); 4402 var CountryView = Backbone.View.extend({ 4403 tagName: "option", 4404 initialize: function(){ 4405 _.bindAll(this, 'render'); 4406 }, 4407 render: function(){ 4408 $(this.el).attr('value', this.model.value).html(this.model.name); 4409 return this; 4410 } 4411 }); 4412 var CountriesView = Backbone.View.extend({ 4413 initialize: function(){ 4414 var counter = this.collection.model.length; 4415 for(i=0; i<counter; i++) 4416 this.addOne(this.collection.model[i]); 4417 4418 //this.collection.each(this.addOne, this); 4419 _.bindAll(this, 'addOne', 'addAll'); 4420 // this.collection.bind('reset', this.addAll); 4421 }, 4422 addOne: function(city){ 4423 $(this.el).append(new CountryView({ model: city }).render().el); 4424 }, 4425 addAll: function(){ 4426 this.collection.each(this.addOne); 4427 } 4428 }); 4429 4430 var FPModel = RestModel.extend({ 4431 defaults: {}, 4432 url: htz.config.rootContext+"/member/reset/authentication" 4433 }); 4434 4435 var forgotPasswordView = Backbone.View.extend({ 4436 defaults: { 4437 isRes: false, 4438 isOCI: false, 4439 isResReview: false, 4440 isInLightBox: false, 4441 clearError: false 4442 }, 4443 events: { 4444 "click #fpSubmit": "fpSubmit", 4445 "click #forgotPasswordSection input": "memberAuthentication", 4446 "change #forgotPasswordSection select": "memberAuthentication", 4447 "click .captchaRefresh": "getImage", 4448 "click .learnMoreLink": "learnMoreoverlay", 4449 "click .bookAsGuest,#bookAsGuest": "bookAsGuestFromFp", 4450 'focusout #cardNumber':'maskCC', //dtc4102//IRAC-4499//Credit Card masking 4451 "focusin #cardNumber":"unMaskCC" //dtc4102//IRAC-4499//Credit Card masking 4452 }, 4453 initialize: function(){ 4454 _.bindAll(this, 'renderFP', 'fpSubmit'); 4455 this.options.attempts = 0; 4456 this.options.limit = 10; 4457 this.forgotPasswordTooltip = new LightBox(); 4458 this.renderFP(); 4459 this.model.on('fieldError', this.highlight, this); 4460 4461 }, 4462 //dtc4102 4463 //IRAC-4499//Credit Card masking 4464 unMaskCC:function(e){ 4465 var self=this; 4466 4467 require(['utils/cc-tools'], function(cctools){ 4468 cctools.unMaskCC(e,null,self.finalCC); 4469 }); 4470 }, 4471 maskCC:function(e){ 4472 e.stopImmediatePropagation(); 4473 var self=this; 4474 4475 require(['utils/cc-tools'], function(cctools){ 4476 self.finalCC=cctools.maskCC(e,self.finalCC); 4477 cctools.displayLastFourDigits(e,self.finalCC); 4478 }); 4479 }, 4480 renderFP: function(){ 4481 var template = _.template( $("#forgotPasswordTemplate").html(), {} ); 4482 $(this.el).html( template ); 4483 4484 if(isRes || isOCI || isResReview || isInLightBox) { 4485 $("#forgotPasswordContainer .sectionWidthSmall").css('width', 'auto'); 4486 $(".containerTableThickBorder, .containerTableBorder").css('border', 'none'); 4487 if(isOCI || isResReview ){ 4488 $(".bookAsGuest").hide(); 4489 $("#bookAsGuest").hide(); 4490 } 4491 } 4492 4493 var countries = new Countries(); 4494 countries.fetch({ 4495 success: function(collection, response){ 4496 new CountriesView({el: $("#driversLicenseCountryState"), collection: response.data}); 4497 } 4498 }); 4499 4500 var cardTypes = new CardTypes(); 4501 cardTypes.fetch({ 4502 success: function(collection, response){ 4503 new CardTypesView({el: $("#cardType"), collection: response.data}); 4504 } 4505 }); 4506 4507 4508 4509 }, 4510 fpSubmit: function(){ 4511 4512 var captchaDisplayed; 4513 var captchaString = null; 4514 if (($("#captchaDiv").length >0) && $("#captchaDiv").css('display').toLowerCase()=='block') { 4515 captchaDisplayed = "true"; 4516 captchaString = grecaptcha.enterprise.getResponse(); 4517 } 4518 else { 4519 captchaDisplayed = "false"; 4520 } 4521 4522 var self = this; 4523 Loader.showLoader(); 4524 if (clearError) 4525 this.model.clear(); 4526 this.model.set({ 4527 resetMemberNumber: $("#resetMemberNumber").val(), 4528 authenticationType: $('input:radio[name=authenticationType]:checked').val(), 4529 driversLicense: $("#driversLicense").val(), 4530 driversLicenseCountryState: $("#driversLicenseCountryState").val(), 4531 cardNumber: this.finalCC, 4532 cardType: $("#cardType").val(), 4533 captchaCode: $("#captchaCode").val(), 4534 isCaptchaDisplayed: captchaDisplayed, 4535 captchaString: captchaString 4536 }); 4537 this.model.save(this.model.attributes, { 4538 success: function(collection, response){ 4539 clearError = false;
4540 var resultStatus = response.resultInfo.result; 4541 if(resultStatus == "success") { 4542 var urlOverlay = htz.config.rootContext+response.resultInfo.url+"/overlay"; 4543 $.ajax({ 4544 url: urlOverlay, 4545 cache: false, 4546 beforeSend: function(){}, 4547 success: function(data, status, req){ 4548 if (isRes || isOCI || isResReview){ 4549 $(".lb-content-box-no-padding").html("").html(data); 4550 } 4551 4552 else { 4553 $(".sectionWidthSmall").html("").html(data); 4554 } 4555 4556 4557 var rpm = new resetPwdModel(); 4558 var rpv = new resetPwdView({el: "#pinResetSection", model: rpm, passwordLevel : ''}); 4559 }, 4560 error: function(){} 4561 }); 4562 } else if (resultStatus == 'locked') { 4563 self.getLockedPage(); 4564 } else if (resultStatus == 'login' || resultStatus == 'login_platinum') { 4565 window.location.href = htz.config.rootContext+response.resultInfo.url; 4566 } 4567 Loader.hideLoader(); 4568 $("#captchaCode").val(""); 4569 }, 4570 error: function(model, response){ 4571 //bug fix WEBCELLTHREENEW-1364, mask fields, start 4572 if(response && response.responseText) { 4573 var responseJson = JSON.parse(response.responseText); 4574 if(responseJson && responseJson.data) { 4575 if(responseJson.data.resetMemberNumber) 4576 $("#resetMemberNumber").val(responseJson.data.resetMemberNumber) 4577 if(responseJson.data.driversLicense) 4578 $("#driversLicense").val(responseJson.data.driversLicense) 4579 if(responseJson.data.cardNumber) 4580 $("#cardNumber").val(responseJson.data.cardNumber); 4581 } 4582 } 4583 //bug fix WEBCELLTHREENEW-1364, mask fields, end 4584 4585 // Code Added By Bob Weld (dtc4324) for ReCaptcha Project PR013988 IRAC-4433 4586 if(($("#captchaDiv").length >0) &&($("#captchaDiv").css('display').toLowerCase()=='block')){ 4587 grecaptcha.enterprise.reset(); 4588 }else{ 4589 grecaptcha.enterprise.render('captchaDiv', { 4590 'sitekey' : '6LdjI9YrAAAAAJQ8n-D109MM5ppx1Z5ZOBdHbFcH' 4591 }); 4592 $('#captchaDiv').css("display","block"); 4593 } 4594 // End of Code Added By Bob Weld (dtc4324) for ReCaptcha Project PR013988 IRAC-4433 4595 4596 clearError = true; 4597 if (clearError) 4598 self.model.clear(); 4599 model.set({errorLocation: '#forgotPasswordContainer .error-list'},{silent:true}); 4600 self.model.trigger('error', model, response); 4601 // $(".captchaRefresh").eq(0).trigger('click'); 4602 // $("#captchaCode").val(""); 4603 Loader.hideLoader(); 4604 } 4605 }); 4606 4607 }, 4608 getLockedPage: function(){ 4609 $.ajax({ 4610 url: htz.config.rootContext+"/member/locked/overlay", 4611 cache: false, 4612 beforeSend: function(){}, 4613 success: function(data, status, req){ 4614 if (isRes || isOCI || isResReview) 4615 $(".lb-content-box-no-padding").html("").html(data); 4616 else 4617 $(".sectionWidthSmall").html("").html(data); 4618 4619 new lockedView({el: "#lockedSection"}); 4620 }, 4621 error: function(){} 4622 }); 4623 }, 4624 memberAuthentication: function(e){ 4625 var target = $(e.target); 4626 $(target) 4627 .closest(".memberAuthenticationRadioRow") 4628 .find(".memberAuthenticationRadioInput:eq(0)") 4629 .prop("checked", true); 4630 }, 4631 getImage: function(){ 4632 attempts = this.options.attempts++; 4633 limit = this.options.limit; 4634 if(attempts < limit) 4635 $('#memberAuthenticationCaptchaImage').attr("src", $('#memberAuthenticationWebContextRoot').html() + "/emember/displayCaptcha.do?img=" + new Date().getTime() + ".jpg"); 4636 else 4637 this.getLockedPage(); 4638 4639 }, 4640 learnMoreoverlay: function(e){ 4641 if(!this.forgotPasswordTooltip.isInUse()){ 4642 this.forgotPasswordTooltip.overlay({title : this.$('#captcha-tooltip-title').html()}, this.$('#imagedec-content').html()); 4643 } 4644 }, 4645 bookAsGuestFromFp: function(e){ 4646 var target = $(e.target); 4647 target.closest(".lb-close").triggerHandler('click'); 4648 HomePage.bookAsGuestSubmitRes(); 4649 }, 4650 highlight : function(model, errors){ 4651 ErrorHelper.reset(); 4652 var mappings = [ 4653 {"fields":"resetMemberNumber", "target":"errorresetMemberNumber"},
4654 {"fields":"driversLicense", "target":"errorDriversLicense"}, 4655 {"fields":"driversLicenseCountryState", "target":"errorDriversLicenseCountryState"}, 4656 {"fields":"cardNumber", "target":"errorCardNumber"}, 4657 {"fields":"cardType", "target":"errorCardType"}, 4658 {"fields":"captchaCode", "target":"errorCaptchaCode"}, 4659 {"fields":"personalAddress1", "target":"errorPersonalAddress1"}, 4660 {"fields":"personalZipCode", "target":"errorPersonalZipCode"} 4661 ]; 4662 ErrorHelper.displayErrors(errors, {'mappings': mappings, 'allErrTarget': '#forgotPasswordContainer .error-list'}); 4663 } 4664 }); 4665 4666 /* Forgot password view */ 4667 4668 //dtc4102//for PR13988 (Secure Link Password Reset Process Phase 1) 4669 //password reset request/password reset confirmation view 4670 var confMsgView = Backbone.View.extend({ 4671 events: { 4672 "click #close>img":"closeMsg" 4673 }, 4674 initialize: function(data){ 4675 this.model=data; 4676 this.render(); 4677 }, 4678 render: function(){ 4679 4680 var msgTemplate=_.template($("#confirmation-msg-div").html()); 4681 4682 $(".loginSectionInnner").before(msgTemplate(this.model.attributes)); 4683 4684 if(this.model.get('confirmationMsgCode')=='resetError'){ 4685 $("#loginSection").find("#reset-error-list").css("display","block"); 4686 } 4687 }, 4688 4689 closeMsg:function(e){ 4690 e.stopPropagation(); 4691 e.target.closest("#confirmationDiv").remove(); 4692 } 4693 }); 4694 4695 /*Start - Login view*/ 4696 var loginModel = RestModel.extend({ 4697 defaults: { 4698 "loggedIn" : false, 4699 "firstName" : "", 4700 "lastName" : "", 4701 "prefix" : "", 4702 "suffix" : "", 4703 "cookieLaw" : htz.config.isCountryinEuropeUnion, 4704 "memberNumberDisplay" : "" 4705 }, 4706 url: htz.config.rootContext+"/member/authentication" 4707 }); 4708 loginView = Backbone.View.extend({ 4709 defaults: { 4710 isRes: false, 4711 isOCI: false, 4712 isResReview: false, 4713 isInLightBox: false, 4714 clearError: false 4715 4716 4717 }, 4718 events: { 4719 "click #loginBtn": "loginSubmit", 4720 "click #forgotPasswordLink": "forgotPassword", 4721 "click #forgotMemberNumberLink": "forgotMembernumber", 4722 "click #bookAsGuest": "bookAsGuest", 4723 "click #inPageUserIDTooltipLink": "infoOverlay", 4724 "mouseover #loginBtn" : "lockBlack", /* P U - This works on iOS, Android and Desktop */ 4725 "mouseout #loginBtn" : "lockWhite", 4726 "touchstart #loginBtn" : "lockWhite", 4727 "touchend #loginBtn" : "lockWhite", 4728 "mouseup #loginBtn" : "lockWhite", 4729 "mousedown #loginBtn" : "lockBlack", 4730 "click #loginCreate": "loginCreate", 4731 "keydown #loginBox ": "onEnterLogin", 4732 //Added for Brute Force 4733 "click .captchaLearnMoreLink": "learnMoreoverlay", 4734 "click .captchaRefresh": "getImage" 4735 }, 4736 initialize: function(data){ 4737 _.bindAll(this, 'render', 'loginSubmit', 'createBlocker', 'href', 'forgotPassword', 4738 'forgotMembernumber', 'bookAsGuest', 'isCookied', 'infoOverlay', 'loginCreate', 'onEnterLogin','learnMoreoverlay','getImage'); 4739 isRes = this.options.isRes; 4740 isOCI = this.options.isOCI; 4741 isInLightBox = this.options.isInLightBox; 4742 isResReview = this.options.isResReview; 4743 var isUserCookied = false; 4744 var isCaptchaOn = false;//Added for Brute Force 0n 25 may 4745 this.loginTooltip = new LightBox(); 4746 clearError = false; 4747 this.options.attempts = 0; 4748 this.options.limit = 7; 4749 this.memberLoginTooltip = new LightBox(); 4750 handleMemberRes = this.handleMemberRes = data.handleMemberRes; 4751 //this.render(); 4752 this.isCookied(); 4753 if(htz.config.deviceGroup === 'phone') { 4754 $(".lb-foreground-cont, .lb-content-box").css('background', 'none'); 4755 $("header.lb-header").hide(); 4756 } 4757 this.model.on('fieldError', this.highlight, this); 4758 4759 var loc = window.location.toString(); 4760 var curTemplate = loc.split("=")[1]; 4761 4762 if(curTemplate == "reset_locked" || curTemplate == "reset_platinum_clublink_locked") 4763 new lockedView({el: "#lockedSection"}); 4764 else if(curTemplate == "reset_question" || curTemplate == "reset_platinum_clublink_question") 4765 new forgotPasswordView({el: "#forgotPasswordContainer", model: new FPModel(), limit: 10, attempts: 0}); 4766 else { 4767 if(curTemplate === "input" || curTemplate === "login") { 4768 if(Utils.isUseStoragePolyfill()) 4769 this.showErrorsFromSession(false, false, true); 4770 else 4771 if( htz.helpers.SessionHelper.getItem("errorData") ) 4772 this.showErrorsFromSession(false, false, true); 4773 } 4774 } 4775 4776 const params = new Proxy(new URLSearchParams(window.location.search), { 4777 get: (searchParams, prop) => searchParams.get(prop), 4778 }); 4779 if (params.auth0 !== null) { 4780 this.loginSubmit(); 4781 } 4782 }, 4783 onEnterLogin: function(e){ 4784 target = e.keyCode; 4785 if(target == 13){ 4786 e.preventDefault(); 4787 $("#loginBtn").trigger('click'); 4788 } 4789 }, 4790 lockWhite: function(){ 4791 $("#loginBtn span").addClass("icons-white_lock").removeClass("icons-lock"); 4792 }, 4793 lockBlack: function(){ 4794 $("#loginBtn span").removeClass("icons-white_lock").addClass("icons-lock"); 4795 }, 4796 isCookied: function(){ 4797 var self = this;
4798 const urlParams = new URLSearchParams(window.location.search); 4799 const memberIdParam = urlParams.get('memberId'); 4800 $.ajax({ 4801 url: htz.config.rootContext+"/member/top/navigation" + (memberIdParam !== null && memberIdParam !== "" ? ("?memberId=" + memberIdParam) : ""), 4802 dataType: "json", 4803 cache: false, 4804 contentType: "application/json", 4805 beforeSend: function(req){}, 4806 success: function(data, req, status){ 4807 self.model.set({ 4808 'prefix': data.data.prefix, 4809 'firstName': data.data.firstName, 4810 'lastName': data.data.lastName, 4811 'suffix' : data.data.suffix, 4812 'loggedIn': data.data.loggedIn, 4813 'memberNumberDisplay': data.data.memberNumberDisplay, 4814 'displayConfirmationMsg':data.data.displayConfirmationMsg, 4815 'confirmationMsgCode':data.data.confirmationMsgCode, 4816 'email':data.data.email, 4817 'errorMessage':data.data.errMsg 4818 }); 4819 if(data.data.lastName != "" && typeof data.data.lastName != "undefined") 4820 isUserCookied = true; 4821 else 4822 isUserCookied = false; 4823 4824 self.render(); 4825 }, 4826 error: function(req, status){} 4827 }); 4828 4829 }, 4830 render: function(){ 4831 if($("#homePageloginTemplate").length){ 4832 this.template = _.template($("#homePageloginTemplate").html()); 4833 $(this.el).html(this.template(this.model.attributes)); 4834 4835 //dtc4102//PR13988 4836 if(this.model.get('displayConfirmationMsg')==true){ 4837 var confMessage=new confMsgView(this.model); 4838 4839 $("#close>img").on("click", function(e){ 4840 e.stopPropagation(); 4841 e.target.closest("#confirmationDiv").remove(); 4842 }); 4843 } 4844 } 4845 if(isUserCookied && ( htz.config.deviceGroup == 'tablet' || htz.config.deviceGroup == 'desktop' || htz.config.deviceGroup == 'all')){ 4846 $('.loginBoxColumn1').css("float", "none"); 4847 } 4848 if($.trim(this.model.get('memberNumberDisplay')).length > 0) { 4849 $('#loginId').val(this.model.get('memberNumberDisplay')); 4850 } 4851 if(isRes){ 4852 $("#bookAsGuest").show(); 4853 } else 4854 $("#bookAsGuest").hide(); 4855 if(document.cookie){ 4856 $('.rememberMe').removeClass('mobileHide'); 4857 } 4858 4859 const params = new Proxy(new URLSearchParams(window.location.search), { 4860 get: (searchParams, prop) => searchParams.get(prop), 4861 }); 4862 4863 if (params.logout !== null) { 4864 $('#pwChange').css("display", "block"); 4865 } 4866 else { 4867 $('#pwChange').css("display", "none"); 4868 } 4869 }, 4870 4871 //Added for Brute Force 4872 4873 getImage: function(){ 4874 attempts = this.options.attempts++; 4875 limit = this.options.limit; 4876 if(attempts < limit) 4877 $('#memberAuthenticationCaptchaImage').attr("src", htz.config.protocol+"://"+htz.config.startURL+htz.config.rootContext + "/emember/displayCaptcha.do?img=" + new Date().getTime() + ".jpg"); 4878 else 4879 this.getLockedPage(); 4880 4881 }, 4882 learnMoreoverlay: function(e){ 4883 if(!this.memberLoginTooltip.isInUse()){ 4884 this.memberLoginTooltip.overlay({title : this.$('#captcha-tooltip-title').html()}, this.$('#imagedec-content').html()); 4885 } 4886 }, 4887 4888 //dtc4102 4889 //PRO13515 CLEAR 4890 //this function will check if the URL contains "/rentacar/link/clear" and return true or false 4891 //which will then be passed to login web service so that the user can come back to "/clear" once logged in 4892 isLINK:function(){ 4893 return (window.location.href.indexOf("/rentacar/link/clear/about")>-1) 4894 }, 4895 4896 loginSubmit: function(){ 4897 var captchaString = null; 4898 var captchaDisplayed; 4899 if(($("#showCaptcha").length >0) && ($("#showCaptcha").css('display').toLowerCase()=='block')){ 4900 captchaDisplayed = "true"; 4901 captchaString = grecaptcha.enterprise.getResponse(); 4902 } 4903 else { 4904 captchaDisplayed = "false"; 4905 } 4906 4907 var self = this; 4908 Utils.clearReservationSession(); 4909 Loader.showLoader(); 4910 if (clearError) 4911 this.model.clear(); 4912 4913 if(this.model.attributes.lastName){ 4914 this.model.clear(); 4915 this.model.set({cookieMemberOnLogin: true, loginId: 'cookie', password: $('#password').val(), loginForgotPassword: $("#loginForgotPassword").val(), isCaptchaDisplayed: captchaDisplayed}); 4916 } 4917 else { 4918 this.model.clear(); 4919 if($('#cookieMemberOnLoginInPage').is(':hidden')){ 4920 this.model.set({loginCreateUserID: $("#loginCreateUserID").val(), enteredcaptcha: captchaString, loginId: $("#loginId").val(), password: $("#password").val(), cookieMemberOnLogin: false, loginForgotPassword: $("#loginForgotPassword").val(),isLINK:this.isLINK(), isCaptchaDisplayed: captchaDisplayed}); 4921 }else{ 4922 this.model.set({loginCreateUserID: $("#loginCreateUserID").val(), enteredcaptcha: captchaString, loginId: $("#loginId").val(), password: $("#password").val(), cookieMemberOnLogin: $('#cookieMemberOnLoginInPage').is(':checked'), loginForgotPassword: $("#loginForgotPassword").val(),isLINK:this.isLINK(), isCaptchaDisplayed: captchaDisplayed}); 4923 } 4924 } 4925 4926 4927 this.model.save(this.model.attributes, { 4928 success: function(collection, response){ 4929 var resultStatus = response.resultInfo.result; 4930 clearError = false; 4931 4932 //dtc4102//PRC91530//Google Data Layer 4933 //Account Login 4934 window.dataLayer = window.dataLayer || []; 4935 window.dataLayer.push({ 4936 'event':'login' 4937 }); 4938 4939 4940 //handle password reset because it is a single page app 4941 if (resultStatus == "reset_locked" || resultStatus == "reset_platinum_clublink_question" || resultStatus == "reset_platinum_clublink_locked" || resultStatus =="session_locked") { 4942 var urlOverlay = htz.config.rootContext+response.resultInfo.url+"/overlay"; 4943 $.ajax({ 4944 url: urlOverlay, 4945 cache: false, 4946 beforeSend: function(){}, 4947 success: function(data, status, req){ 4948 if (isRes || isOCI || isResReview || isInLightBox) 4949 $(".lb-content-box-no-padding").html("").html(data); 4950 else 4951 $("#loginSection").html("").html(data); 4952 if(resultStatus == "reset_question" || resultStatus == "reset_platinum_clublink_question") { 4953 FPm = new FPModel(); 4954 new forgotPasswordView({el: "#forgotPasswordContainer", model: FPm, limit: 10, attempts: 0}); 4955 Loader.hideLoader(); 4956 } 4957 if(resultStatus == "reset_locked" || resultStatus == "reset_platinum_clublink_locked" || resultStatus =="session_locked") { 4958 new lockedView({el: "#lockedSection"}); 4959 Loader.hideLoader(); 4960 } 4961 }, 4962 error: function(){} 4963 }); 4964 Loader.hideLoader(); 4965 } else if(resultStatus == "reset_question"){ //dtc4102//for PR13988 (Secure Link Password Reset Process Phase 1) 4966 window.location.href = htz.config.protocol+"://"+htz.config.startURL+htz.config.rootContext+response.resultInfo.url; //redirect to password-reset-request-form or to login page with confirmation message 4967 } else if (resultStatus == "request_success"){ 4968 window.location.href = htz.config.protocol+"://"+htz.config.startURL+htz.config.rootContext+"/member/reset-confirmation"; 4969 } else if ("phone"== htz.config.deviceGroup) { 4970 4971 4972 //handle phone redirects 4973 if (resultStatus == "success_econsent_required" || resultStatus == "success_to_profile" || resultStatus == "success_to_erenewal" 4974 || resultStatus == "login_sms_failed" || resultStatus == "success" || resultStatus == "success_to_upgrade") { 4975 if (isRes) { 4976 HomePage.bookAsMemberSubmitRes(response.data.firstName); 4977 } else if(isOCI) { 4978 window.location.reload(); 4979 } else if(isResReview) { 4980 var callback = (self.handleMemberRes || handleMemberRes); 4981 if(callback && typeof callback === 'function'){ 4982 callback(); 4983 } else { 4984 4985 window.location.href = htz.config.rootContext+response.resultInfo.url; 4986 4987 } 4988 } else { 4989 if(response.resultInfo.url.indexOf("/rentacar/")>-1){ 4990 window.location.href = response.resultInfo.url; 4991 } 4992 else{ 4993 window.location.href = htz.config.rootContext+response.resultInfo.url; 4994 } 4995 } 4996 } else { 4997 window.location.href = htz.config.rootContext+response.resultInfo.url; 4998 } 4999 } else if (resultStatus == "success" && (isRes || isOCI || isResReview)) { 5000 5001 //dtc4102//USAA 5002 memNavloginModel = new sdlLoginModel(); 5003 memNavloginView = new sdlLoginView({ el: "header", model: memNavloginModel }); 5004 5005 if (isRes) { 5006 // handle success for res 5007 HomePage.bookAsMemberSubmitRes(response.data.firstName); //dtc4102//AAA verification //passing in logged in member firstname to show in bookAsMember popup 5008 } else if(isResReview) { 5009 var callback = (self.handleMemberRes || handleMemberRes); 5010 if(callback && typeof callback === 'function'){ 5011 callback(); 5012 } 5013 else { 5014 window.location.href = htz.config.rootContext+"/reservation/"; 5015 } 5016 }else { 5017 window.location.reload(); 5018 } 5019 }else { 5020 // direct to the page 5021 if (response.resultInfo.url.indexOf(htz.config.rootContext)!= -1) { 5022 window.location.href = response.resultInfo.url; 5023 } else { 5024 window.location.href = htz.config.rootContext+response.resultInfo.url; 5025 } 5026 } 5027 }, 5028 error: function(model, response){ 5029 5030 var responseJson = JSON.parse(response.responseText); 5031 5032 5033 clearError = true; 5034 if (clearError) 5035 self.model.clear(); 5036 5037 if(isUserCookied) 5038 self.showErrorsFromSession(model, response, false); 5039 else { 5040 var sessionValue1= $("#ca").val(); 5041 sessionStorage.setItem("captchaOn", true); 5042 model.set({errorLocation: '#homePageloginBox .error-list'},{silent:true}); 5043 self.model.trigger('error', model, response); 5044 5045 if(sessionValue1){ 5046 $(".captchaRefresh").eq(0).trigger('click');//Added on 25 may and is working fine. 5047 } 5048 } 5049 5050 // Code Added By Bob Weld (dtc4324) for ReCaptcha Project PR013988 IRAC-4433 5051 if(($("#showCaptcha").length >0) &&($("#showCaptcha").css('display').toLowerCase()=='block')){ 5052 grecaptcha.enterprise.reset(); 5053 }else{ 5054 grecaptcha.enterprise.render('showCaptcha', { 5055 'sitekey' : '6LdjI9YrAAAAAJQ8n-D109MM5ppx1Z5ZOBdHbFcH' 5056 }); 5057 $('#showCaptcha').css("display","block"); 5058 } 5059 // End of Code Added By Bob Weld (dtc4324) for ReCaptcha Project PR013988 IRAC-4433 5060 5061 $("#loginId").val(""); 5062 $("#password").val(""); 5063 $("#captchaSwitchOn").val(true); 5064 Loader.hideLoader(); 5065 } 5066 }); 5067 5068 }, 5069 showErrorsFromSession: function(model, response, isErrorsPersisted){ 5070 var self = this; 5071 var showErrors = ""; 5072 var errorData = ""; 5073 if(!isErrorsPersisted){ 5074 var errors = $.parseJSON(response.responseText).message; 5075 5076 if(Utils.isUseStoragePolyfill()){ 5077 Utils.storeItemIE('ieLoginError', errors); 5078 }else { 5079 var strErrors = JSON.stringify(errors); 5080 htz.helpers.SessionHelper.setItem("errorData", strErrors); 5081 } 5082 self.initialize(model); 5083 } 5084 5085 loadLogin = function(){ 5086 if($("#loginId").length > 0){ 5087 if(Utils.isUseStoragePolyfill()){ 5088 var url = htz.config.rootContext+"/rest/home/retrieve-ie/ieLoginError"; 5089 $.ajax({ 5090 url: url, 5091 cache: false, 5092 type: 'POST', 5093 beforeSend: function(req){}, 5094 success: function(data, status, req){ 5095 errorData = $.parseJSON(req.responseText); 5096 if(errorData != null && errorData != "") { 5097 if(errorData.fieldErrors && typeof errorData.fieldErrors !== "undefined")
5098 for(i=0; i<errorData.fieldErrors.length; i++) 5099 showErrors += "<li>"+errorData.fieldErrors[i][1]+"</li>"; 5100 if(errorData.systemErrors && typeof errorData.systemErrors !== "undefined" && errorData != "") 5101 for(j=0; j<errorData.systemErrors.length; j++) 5102 showErrors += "<li>"+errorData.systemErrors[j]+"</li>"; 5103 5104 $("<ul></ul>").append(showErrors).appendTo(".error-list"); 5105 $("#homePageloginBox .error-list").show(); 5106 } 5107 }, 5108 error: function(req, status){} 5109 }); 5110 Utils.removeItemIE('ieLoginError'); 5111 }else { 5112 var getErrorData = htz.helpers.SessionHelper.getItem("errorData"); 5113 errorData = JSON.parse(getErrorData); 5114 if(errorData != null && errorData != "") { 5115 if(errorData.fieldErrors && typeof errorData.fieldErrors !== "undefined") 5116 for(i=0; i<errorData.fieldErrors.length; i++) 5117 showErrors += "<li>"+errorData.fieldErrors[i][1]+"</li>"; 5118 5119 if(errorData.systemErrors && typeof errorData.systemErrors !== "undefined" && errorData != "") 5120 for(j=0; j<errorData.systemErrors.length; j++) 5121 showErrors += "<li>"+errorData.systemErrors[j]+"</li>"; 5122 5123 $("<ul></ul>").append(showErrors).appendTo(".error-list"); 5124 $("#homePageloginBox .error-list").show(); 5125 htz.helpers.SessionHelper.removeItem('errorData'); 5126 } 5127 } 5128 clearInterval(timer); 5129 } 5130 } 5131 var timer = setInterval(loadLogin, 100); 5132 }, 5133 bookAsGuest: function(e){ 5134 var target = $(e.target); 5135 target.closest(".lb-close").triggerHandler('click'); 5136 5137 $('#redeem').prop('checked', false); 5138 5139 this.options.metaModel.set({isRedeemPoints : false}); 5140 HomePage.bookAsGuestSubmitRes(); 5141 }, 5142 createBlocker: function(link){ 5143 link = $(link).trigger("blur"); 5144 $('<div></div>') 5145 .addClass("formSubmitterOverlay") 5146 .css({ 5147 width: link.outerWidth() + 25, 5148 height: link.outerHeight() + 10, 5149 top: link.offset().top - 5, 5150 left: link.offset().left - 10 5151 }) 5152 .appendTo("body"); 5153 }, 5154 href: function(link, url){ 5155 this.createBlocker(link); 5156 location.href = url; 5157 }, 5158 loginCreate: function(){ 5159 $("#loginCreateUserID").val('true'); 5160 this.loginSubmit(); 5161 }, 5162 forgotPassword: function(e){ 5163 Loader.showLoader(); 5164 if (clearError) { 5165 clearError = false; 5166 this.model.clear(); 5167 } 5168 $("#loginForgotPassword").val("forgotPassword"); 5169 this.loginSubmit(); 5170 }, 5171 forgotMembernumber: function(e){ 5172 this.createBlocker($( e.target )); 5173 this.href($( e.target ), htz.config.rootContext + '/emember/reset/memberNumberRetrieval.do'); 5174 }, 5175 infoOverlay: function(e){ 5176 if(!this.loginTooltip.isInUse()){ 5177 this.loginTooltip.overlay({ title : this.$('#userIdTitleContent').html() }, this.$('#inPage-useridInfo').html()); 5178 } 5179 }, 5180 highlight : function(model, errors){ 5181 ErrorHelper.reset(); 5182 var mappings = [ 5183 {"fields":"loginId", "target":"errorLoginId"}, 5184 {"fields":"password", "target":"errorPassword"}, 5185 {"fields":"captchaCode", "target":"errorCaptchaCode"} 5186 ]; 5187 ErrorHelper.displayErrors(errors, {'mappings': mappings, 'allErrTarget': '#homePageloginBox .error-list'}); 5188 } 5189 }); 5190 5191/* Upgrade Dialogue Box */ 5192 var warningView = Backbone.View.extend({ 5193 // where code needs to be appended 5194 el: "#loginSection", 5195 events: { 5196 "click button#warningButton" : "hideMe" 5197 }, 5198 initialize: function(){ 5199 //lazyLoadMemberNav.url = htz.config.rootContext + '/templates/emember/login/memberLoginView.jsp'; 5200 //LazyLoad.queueJS(lazyLoadMemberNav, 'high'); 5201 5202 _.bindAll(this, 'render', 'hideMe'); 5203 this.render(); 5204 }, 5205 render: function(){ 5206 5207 // Refreshing the Suffix and last name 5208 memNavloginModel = new sdlLoginModel(); 5209 memNavloginView = new sdlLoginView({el: "header", model: memNavloginModel}); 5210 5211 // changin Login to Logout in navigation 5212 $("#navLogin").hide(); 5213 $("#navLogout").css('display','block'); 5214 5215 // the template is in memberLoginView.jsp 5216 var template= _.template($("#warningMessageTemplate").html(), {}); 5217 5218 Loader.hideLoader(); 5219 $(this.el).html(template); 5220 5221 }, 5222 hideMe:function() { 5223 Loader.showLoader(); 5224 window.location.href = htz.config.rootContext+"/reservation/"; 5225 } 5226 }); 5227
5228/* Locked View */ 5229 var lockedView = Backbone.View.extend({ 5230 events: { 5231 "click #forgotPassword": "gotoForgotPassword", 5232 "click .bookAsGuest, #bookAsGuest": "bookAsGuestFromlockPage" 5233 5234 }, 5235 initialize: function(){ 5236 5237 _.bindAll(this, 'render', 'gotoForgotPassword'); 5238 this.render(); 5239 }, 5240 render: function(){ 5241 var template = _.template( $("#lockedSectionTemplate").html(), {} ); 5242 $(this.el).html( template ); 5243 if(isRes || isOCI || isResReview) { 5244 $("#lockedSection").css('width', 'auto'); 5245 $(".containerTableThickBorder, .containerTableBorder").css('border', 'none'); 5246 $("#bookAsGuest").show(); 5247 if(isOCI || isResReview){ 5248 $(".bookAsGuest").hide(); 5249 $("#bookAsGuest").hide(); 5250 } 5251 } 5252 else 5253 $("#bookAsGuest").hide(); 5254 5255 }, 5256 bookAsGuestFromlockPage: function(e){ 5257 var target = $(e.target); 5258 target.closest(".lb-close").triggerHandler('click'); 5259 HomePage.bookAsGuestSubmitRes(); 5260 }, 5261 gotoForgotPassword: function(){ 5262 5263 Loader.hideLoader(); 5264 5265 window.location.href = htz.config.protocol+"://"+htz.config.startURL+htz.config.rootContext+"/member/password-reset-request"; 5266 5267 } 5268 }); 5269 5270/* Locked View */ 5271 5272 5273 5274 5275window.checkHertzNameSpace("htz.integrated.footer.model"); 5276htz.integrated.footer.model.FooterModel=RestModel.extend({initialize:function(){this.constructor.__super__.initialize.apply(this,arguments)},defaults:{taLoggedIn:!1,isDisplayExternalFooter:!1,isIncludeExternalFooter:!1,isIncludeHertzLinkFooter:!1,externalFooterHeight:0,footerContentHTML:"",twitterUserInfo:{followersCount:""},footerContent:{"footer.footerHide":"","footer.copyRightLine":"","footer.mobFooter.footerHide":"","footer.mobFooter.head":[{sublinks:[{footerLinks:"",footerUrl:""}],footerHeader:""}], 5277"footer.mobFooter.footerMore":"","footer.column":[{link:[{link:[{url:"",label:""}],header:""}]}],"footer.footerMore":"","footer.mobSite":""},seoPageFooter:"",seoPageTitle:""},url:htz.config.partnerId?htz.config.rootContext+"/rest/footer/pos/"+htz.config.pos+"/dialect/"+htz.config.dialect+"/id/"+htz.config.partnerId+"?systemId="+htz.config.systemId+"&subSystemId="+htz.config.subSystemId:htz.config.rootContext+"/rest/footer/pos/"+htz.config.pos+"/dialect/"+htz.config.dialect+"?systemId="+htz.config.systemId+ 5278"&subSystemId="+htz.config.subSystemId}); 5279//irac 732 dynamic copyright year update hertz web 5280 5281window.checkHertzNameSpace("htz.integrated.footer.views"); 5282htz.integrated.footer.views.FooterView=Backbone.View.extend({el:"#footer-container",events:{"click #bttnClick":"clickRevokeBttn","click #title-links .tab":"tabToggleLinks","click #mob-links .tab":"mobToggleLinks","click #social-bar button":"emailSignUpButton","focus #social-email":"emailSignUpFocus","blur #social-email":"emailSignUpBlur","keydown #social-email":"emailSignUpKeyPress","click #social-bar>ul>li":"trackSocial"},filteriFrames:function(){var a=this;0<$("iframe").length&&$("iframe").each(function(){a.updateCopyrightYr($(this))})}, 5283updateCopyrightYr:function(){var a=(new Date).getFullYear(),b=/^\u00a9 \d{4}/,c={},c=$("*").filter(function(){return b.test($(this).text())});c.each(function(){var b=$(this).html().replace(/\u00a9 \d{4}/,"\u00a9 "+a);$(this).html(b)})},tabToggleLinks:function(a){if($(a.target)!==$(".tab")){$(a.target).closest(".tab").toggleClass("highlight");$(a.target).closest(".tab").siblings("dl").slideToggle("1000");var b=$(a.currentTarget).hasClass("highlight");992>$(window).width()&&($(a.target).hasClass("icons-ft_arrow_down")|| 5284b)&&$(a.target).parent().closest("div").siblings("ul").css({display:"contents"});($(a.target).hasClass("icons-ft_arrow_up")||!b)&&$(a.target).parent().closest("div").siblings("ul").css({display:"none"})}else $(a.target).toggleClass("highlight"),$(a.target).siblings("dl").slideToggle("1000");return!1},mobToggleLinks:function(a){$(a.target)!=$(".tab")?($(a.target).closest(".tab").toggleClass("highlight"),$(a.target).closest(".tab").siblings("dl").slideToggle("1000")):($(a.target).toggleClass("highlight"), 5285$(a.target).siblings("dl").slideToggle("1000"));return!1},trackSocial:function(a){a=$(a.currentTarget).find("img").attr("alt");window.dataLayer=window.dataLayer||[];window.dataLayer.push({event:"select_social",social_network:a})},emailSignUpButton:function(){var a,b;a=htz.config.dialect;b=$.trim($("#social-email").val());b==HStorage.getItem("signUpVal","s")&&(b="");a="//email.hertz.com/apps/JoinMarketing?lang="+a.substring(0,2)+"&pos="+htz.config.pos+(""!==b?"&email="+b:b);$("#social-bar form").attr("target", 5286"_blank");$("#social-bar form").attr("method","POST");$("#social-bar form").attr("action",a);$("#social-bar form").trigger("submit");window.dataLayer=window.dataLayer||[];window.dataLayer.push({event:"email_signup",notification_signup_location:"footer"});return!1},clickRevokeBttn:function(){$("#bttn-revoke").trigger("click")},emailSignUpFocus:function(){$("#social-email").addClass("highlight");$("#social-email").val("")},emailSignUpBlur:function(){""==$("#social-email").val()&&($("#social-email").removeClass("highlight"), 5287$("#social-email").val(HStorage.getItem("signUpVal","s")))}
5287,emailSignUpKeyPress:function(a){if(13===a.keyCode){var b,a=htz.config.dialect;b=$.trim($("#social-email").val());b==HStorage.getItem("signUpVal","s")&&(b="");a="//email.hertz.com/apps/JoinMarketing?lang="+a.substring(0,2)+"&pos="+htz.config.pos+(""!==b?"&email="+b:b);$("#social-bar form").attr("target","_blank");$("#social-bar form").attr("method","POST");$("#social-bar form").attr("action",a);$("#social-bar form").submit();return!1}},resizeDocument:function(){$(window).on("resize", 5288function(){var a=$("#container").width();992<=a&&($("#title-links dl").show(),$("#title-links .tab").addClass("highlight"),$("#title-links").find("ul").find("ul").css({display:"contents"}));600<=a&&992>a&&($("#title-links dl").hide(),$("#title-links .tab").removeClass("highlight"),$("#title-links").find("ul").find("ul").css({display:"none"}));600>a&&($("#title-links").find("ul").find("ul").css({display:"none"}),$("#title-links .tab").removeClass("highlight"))})},initialize:function(){this.template= 5289this.options.template;this.data=this.options.model;this.render();this.updateCopyrightYr(this)},render:function(){var a=this;"IRAC"===htz.config.subSystemId&&(a.footerContentView=new htz.integrated.footer.views.FooterContentView({el:"#footer-container",template:"#footer-tpl",data:a.data.get("footerContentHTML")}),HStorage.setItem("signUpVal",$("#social-email").val(),"","s"),$("#bottom-links li:last-child").addClass("no-pipe"),$("#title-links span.coln:last-child").append($('<div id="feedback-footer-container" class="parsys"><ul></ul></div>')), 5290a.intervalId=setInterval(function(){var b=$("#feedback-tab");0<b.length&&(clearInterval(a.intervalId),$("#feedback-footer-container ul").append(b.html()))},1E3),a.resizeDocument());if("RYANAIR"===htz.config.subSystemId){var b=this.data.get("footerContent");a.footerDesktopView=new htz.integrated.footer.views.FooterDesktopView({el:"#title-links",template:"#desk-tpl",data:b["footer.column"],more:b["footer.footerMore"],hide:b["footer.footerHide"]});a.footerMobileView=new htz.integrated.footer.views.FooterMobileView({el:"#mob-links", 5291template:"#mob-tpl",data:b["footer.mobFooter.head"],more:b["footer.mobFooter.footerMore"],hide:b["footer.mobFooter.footerHide"]});a.footerCopyrightView=new htz.integrated.footer.views.FooterCopyrightView({el:"#copyright-content",template:"#copyright-tpl",copyright:b["footer.copyRightLine"]});a.footerSeoView=new htz.integrated.footer.views.FooterSeoView({el:"#mixed-content",template:"#mixed-tpl",data:a.data.attributes.data})}return this}}); 5292htz.integrated.footer.views.FooterContentView=Backbone.View.extend({initialize:function(){this.render()},iconMouseEnter:function(){this.src=this.src.replace("origin","hover")},iconMouseLeave:function(){this.src=this.src.replace("hover","origin")},render:function(){try{this.$el.append(_.template($(this.options.template).html(),{footerContent:this.options.data}))}catch(a){}var b=$("#social-bar li img");"reservationOnHomepage.jsp"!==htz.config.legacyPage&&$("#footer-container #seo-content").empty().hide(); 5293b.length&&(b.on("mouseenter",this.iconMouseEnter),b.on("mouseleave",this.iconMouseLeave));if(""!=htz.config.securitiId&&("IRAC"==htz.config.systemId&&!htz.config.isApp&&null!=htz.config.securitiId&&"null"!=htz.config.securitiId)&&0<$("#copyright-content").length){var b=$("#copyright-content").find(".address span:first").find("> a:last").attr("data-dcs-inspected"),c=$("#copyright-content").find(".address span:first").find("> a:last").attr("href");"undefined"==b&&-1<c.indexOf("undefined")&&($("#copyright-content").find(".address span:first").find("> a:last").attr("id", 5294"bttnClick"),$("#copyright-content").find(".address span:first").find("> a:last").removeAttr("href data-dcs-inspected"))}return this}}); 5295htz.integrated.footer.views.FooterDesktopView=Backbone.View.extend({initialize:function(){this.render()},render:function(){this.$el.append(_.template($(this.options.template).html(),{deskList:this.options.data,more:this.options.more,hide:this.options.hide}));var a=$("#title-links a"),b=this;a.each(function(c){-1!=$(a).eq(c).attr("href").search("lightBox")||-1!=$(a).eq(c).attr("href").search("openPopup")?(b.$el.find(a).eq(c).attr("name",$(a).eq(c).attr("href")),b.$el.find(a).eq(c).attr("href","javascript: void(0);")):
5296(-1!=$(a).eq(c).attr("href").search("legalView.jsp")||-1!=$(a).eq(c).attr("href").search("privacyPolicyView.jsp"))&&b.$el.find(a).eq(c).attr("target","_blank")});return this}});htz.integrated.footer.views.FooterMobileView=Backbone.View.extend({initialize:function(){this.render()},render:function(){this.$el.append(_.template($(this.options.template).html(),{mobList:this.options.data,more:this.options.more,hide:this.options.hide}));return this}}); 5297htz.integrated.footer.views.FooterCopyrightView=Backbone.View.extend({initialize:function(){this.render()},render:function(){this.$el.append(_.template($(this.options.template).html(),{copyright:this.options.copyright}));return this}});htz.integrated.footer.views.FooterSeoView=Backbone.View.extend({initialize:function(){this.render()},render:function(){this.$el.append(_.template($(this.options.template).html(),{data:this.options.data}));return this}}); 5298htz.integrated.footer.views.footerUtilityView=Backbone.View.extend({el:"#footer-container",initialize:function(){this.template=this.options.template},openLightBox:function(a,b){lbFooter=new LightBox;lbFooter.overlay({width:600,url:a,title:b,center:!0})},openPopUp:function(a,b){wo=window.open(a,b,"toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=480,height=440,left="+(window.screen.width/2-240));wo.focus()}});Footer=new htz.integrated.footer.views.footerUtilityView; 5299window.checkHertzNameSpace("htz.integrated.footer.controller"); 5300htz.integrated.footer.controller.FooterController=function(){return{showFooterPage:function(){var b=$.Deferred(),c=new htz.integrated.footer.model.FooterModel;c.fetch({cache:!1,dataType:"json",success:function(a){b.resolve(a)},error:function(){new htz.integrated.footer.views.FooterView({model:c})}});$.when(b).done(function(a){new htz.integrated.footer.views.FooterView({model:a});!1==htz.config.digitalWalletFooter.displayMasterpassLogo&&$('img[title="masterpass"]').css({display:"none"})})}}}(); 5301 5302 5303var Slider=function(){function h(){if($(window).width()>k){l.find(".pagination-prev, .pagination-next").hide();for(var a=0;a<b.length;a++)b[a].pageCont.show()}else if(!(0>g||g>b.length-1))for(a=0;a<b.length;a++)a==g?(b[a].pageCont.show(),b[a].pageCont.find(".pagination-prev, .pagination-next").show(),window.scrollTo(0,0)):b[a].pageCont.hide()}function e(a){if(!b||1>=b.length||0>a||a>b.length-1)return!1;g=a;return!0}var g=0,b=null,k=480,l=null,n=k;return{goTo:function(a){e(a)&&h()},previous:function(){var a= 5304b[g],c=a.handler;c&&"function"==typeof c?c(a.pageCont,"P")&&e(g-1)&&h():e(g-1)&&h()},next:function(){var a=b[g],c=a.handler;c&&"function"==typeof c?c(a.pageCont,"N")&&e(g+1)&&h():e(g+1)&&h()},first:function(){e(0)&&h()},last:function(){e(b.length-1)&&h()},currentSlide:function(){return b&&0<b.length&&$(window).width()<=k?b[g]:null},checkWidth:function(){var a=$(window).width();if(n>=k&&a<=k||n<=k&&a>=k)n=a,h()},startWithConfig:function(a,c){if(a&&!(1>=a.length||Modernizr&&!Modernizr.mq("only screen and (min-width: 0px)"))){c&& 5305(c.context&&(l="string"==typeof c.context?$(c.context).eq(0):c.context),c.maxWidth&&(n=k=c.maxWidth));l||(l=$("body").eq(0));for(var i=[],e=0;e<a.length;e++){var f=a[e],d=l.find("#"+f.id);0<d.length&&(f.cont=d.eq(0),i.push(f))}if(i&&!(1>=i.length)){g=0;b=[];for(var e=i.length,j,m,f=0;f<e;f++){j=i[f];0==f?(d=null,m=i[f+1]):f==e-1?(d=i[f-1],m=null):(d=i[f-1],m=i[f+1]);d&&(j.prevLabel=d.title?d.title:htz.content.previous);m&&(j.nextLabel=m.title?m.title:htz.content.next);if(d=j)d.prevLabel&&$("<div />").addClass("pagination-prev").html("<div><div class='icons-ft_arrow_left'></div></div><div>"+ 5306d.prevLabel+"</div>").prependTo(d.cont).hide(),d.nextLabel&&$("<div />").addClass("pagination-next").html("<div>"+d.nextLabel+"</div><div><div class='icons-ft_arrow_right'></div></div>").appendTo(d.cont).hide();b[b.length]=j.handler?{pageCont:j.cont,handler:j.handler}:{pageCont:j.cont};j.isActive&&(g=f)}0<b.length&&($(window).on("resize.slider",Slider.checkWidth),l.find(".pagination-prev").on("click",function(){Slider.previous()}),l.find(".pagination-next").on("click",function(){Slider.next()}),h())}}}}}(); 5307window.checkHertzNameSpace("htz.utils.helpers");htz.utils.helpers.NetworkHelper=function(){return{isOnline:function(){return!0}}}(); 5308window.checkHertzNameSpace("htz.utils.web.helpers");htz.utils.web.helpers.Navigator=function(b){var a;return{navigate:function(c){var d=b(c);0<d.length&&(a&&b(a).hide(),d.show(),a=c)},getCurrentPage:function(){return a}}}($); 5309window.checkHertzNameSpace("htz.utils.web.helpers");htz.utils.web.helpers.Rotar=function(b){return{rotateTo:function(a){a&&(b.href=a)}}}(window.location); 5310window.checkHertzNameSpace("htz.utils.web");htz.utils.web.DOMHelper=function(a){return{createPageElm:function(b,c,d){return a.createElm(c+"-"+b+"-page-container","div",!0,d)}}}(htz.utils.Utils); 5311(function(a){a.configure({spinner:htz.utils.Spinner,lightBox:htz.utils.LightBox,networkHelper:htz.utils.helpers.NetworkHelper,navigator:htz.utils.web.helpers.Navigator,rotar:htz.utils.web.helpers.Rotar,domHelper:htz.utils.web.DOMHelper,notifier:window,slider:Slider})})(htz.utils.config.UtilConfig); 5312window.checkHertzNameSpace('htz.helpers'); 5313 5314htz.helpers.SiftIracLogin = (function() { 5315 var memIdResp = ""; 5316 5317 return { 5318 hideLoader : function () { 5319 $('#loading_bg').length ? $('#loading_bg').hide() : null; 5320 $('#loading_fg').length ? $('#loading_fg').hide() : null; 5321 $('#loading-fg').length ? $('#loading-fg').hide() : null; 5322 }, 5323 showLoader : function () { 5324 $('#loading_bg').length ? $('#loading_bg').show() : null; 5325 $('#loading_fg').length ? $('#loading_fg').show() : null; 5326 $('#loading-fg').length ? $('#loading-fg').show() : null; 5327 }, 5328 verifyOtp : async function(code){ 5329 var verifyType = "resend"; 5330 var params = { 5331 "type": "verification", 5332 "mem_id": memIdResp, 5333 "data": { 5334 "event": "$login" 5335 } 5336 }; 5337 5338 if(code){ 5339 params.data.code = code; 5340 verifyType = "check"; 5341 } 5342 else { 5343 params.data.code = 'resend' 5344 } 5345 5346 var verify; 5347 try { 5348 verify = await fetch('/rentacar/rest/auth0/2fa', { 5349 "body": JSON.stringify(params), 5350 "method": "POST" 5351 }); 5352 verify = await verify.json(); 5353 console.log("Sift verify response: ", verify); 5354 5355 if(verify){ 5356 this.otpForm(false,verify,verifyType); 5357 } 5358 } catch (error) { 5359 console.log("Sift verify error: ", error); 5360 } 5361 }, 5362 otpForm : function(init,resp,type){ 5363 //init OTP form 5364 var self = this; 5365 5366 if(init && !$('#memValModal').length){ 5367 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- shown","login_message": memIdResp}) : null; 5368 5369 this.hideLoader(); 5370 $('body').prepend('<style>#memValModal{display: -webkit-flex; display: flex;
5370 -webkit-justify-content: center; justify-content: center; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,.7); z-index: 1000; overflow-y: auto; -webkit-overflow-scrolling: touch; -webkit-align-items: center; align-items: center;}.memModalPresent{overflow: hidden;}#val-mem-input-container{display: flex; flex-direction: column; margin-bottom: 45px;}/* Spinner */ #val-mem-spinner{display: block; justify-content: center; align-items: center; background: #fff; margin-bottom: 45px;}.val-mem-loading-cont{width: 100%; display: flex; flex-direction: column; align-items: center}.val-mem-loader{border: 3px solid #E8E8E8; border-top: 3px solid #FFCC00; border-right: 3px solid #FFCC00; border-left: 3px solid #FFCC00; border-radius: 50%; width: 89px; height: 89px; animation: loadingScreenSpin 2s linear infinite}@keyframes loadingScreenSpin{0%{transform: rotate(0deg)}100%{transform: rotate(360deg)}}</style>'); 5371 $('body').prepend(_.template($('#sift-2fa-tpl').html())); 5372 $('body').addClass('memModalPresent'); 5373 5374 //setup listeners 5375 if (document.querySelector('#val-mem-button a:not(.listening)')) { 5376 document.querySelector('#val-mem-button a:not(.listening)').classList.add('listening'); 5377 5378 document.querySelector('#val-mem-close').addEventListener('click', function () { 5379 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- member closed modal","login_message": memIdResp}) : null; 5380 $('#memValModal').remove(); 5381 $('body').removeClass('memModalPresent'); 5382 }); 5383 5384 document.querySelector('#val-mem-button a').addEventListener('click', function () { 5385 var inputVal = document.getElementById('val-mem-input').value; 5386 if (inputVal.match(/^[0-9]{6}$/g)) { 5387 //console.log('matched 6 digits'); 5388 $('div.val-mem-error').hide(); 5389 $('#val-mem-input-container').hide(); 5390 $('#val-mem-spinner').show(); 5391 self.verifyOtp(inputVal); 5392 } 5393 else { 5394 $('div.val-mem-error').show(); 5395 document.getElementById('val-mem-input').value = ""; 5396 } 5397 }); 5398 5399 document.querySelector('#val-mem-resend a').addEventListener('click', function () { 5400 //resend otp 5401 $('div.val-mem-error').hide(); 5402 $('#val-mem-input-container').hide(); 5403 $('#val-mem-spinner').show(); 5404 self.verifyOtp(); 5405 }); 5406 } 5407 }else{ 5408 //handles callbacks from verifyOtp() 5409 $('#val-mem-spinner').hide(); 5410 $('#val-mem-input-container').show(); 5411 5412 if(type && resp && typeof resp.status !== 'undefined'){ 5413 5414 if(type == "check"){ 5415 5416 if(resp.status == 0){ 5417 //Code is valid 5418 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- valid code","login_message": memIdResp}) : null; 5419 $('#memValModal').remove(); 5420 $('body').removeClass('memModalPresent'); 5421 if (resp.domainRedirect !== undefined && resp.domainRedirect !== null && resp.domainRedirect !== "") { 5422 location.href = resp.domainRedirect; 5423 } 5424 else { 5425 location.reload(); 5426 5427 if(window.authSend && window.authSend.this && window.authSend.args){ 5428 this.showLoader(); 5429 origSend.apply(window.authSend.this, window.authSend.args); 5430 } 5431 } 5432 }else if(resp.status == 50 && resp.error_message){ 5433 //Invalid Code 5434 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- invalid code","login_message": memIdResp}) : null; 5435 $('div.val-mem-error p').text("Your code was mis-typed, expired, or already used. Click resend to receive a new code."); 5436 $('div.val-mem-error').show(); 5437 }else if(resp.status == 60 && resp.error_message){ 5438 //Rate limited; too many events have been received in a short period of time. Contact us if you have questions. 5439 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- rate limited on check code","login_message": memIdResp}) : null; 5440 $('div.val-mem-error p').text(resp.error_message); 5441 $('div.val-mem-error').show(); 5442 }else{ 5443 var msg = resp.status && resp.error_message ? "Member: " +memIdResp+ " Status: " +resp.status+ " Message: "+ resp.error_message : ""; 5444 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- unmapped status on check code","login_message": msg}) : null; 5445 5446 //Allow the member to proceed 5447 $('#memValModal').remove(); 5448 $('body').removeClass('memModalPresent'); 5449
5450 if(window.authSend && window.authSend.this && window.authSend.args){ 5451 this.showLoader(); 5452 origSend.apply(window.authSend.this, window.authSend.args); 5453 } 5454 } 5455 }else{ 5456 //resend code resp 5457 5458 if(resp.status == 0){ 5459 //successful resend 5460 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- successful resend code","login_message": memIdResp}) : null; 5461 }else if(resp.status == 60 && resp.error_message){ 5462 //Too many requests made for sending the code 5463 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- rate limited on resend code","login_message": memIdResp}) : null; 5464 $('div.val-mem-error p').text(resp.error_message); 5465 $('div.val-mem-error').show(); 5466 }else{ 5467 var msg = resp.status && resp.error_message ? "Member: " +memIdResp+ " Status: " +resp.status+ " Message: "+ resp.error_message : ""; 5468 window.dataLayer ? window.dataLayer.push({"event": "mem_login","login_status": "2fa -- unmapped status on resend code","login_message": msg}) : null; 5469 } 5470 } 5471 } 5472 } 5473 } 5474 }; 5475})(); 5476(typeof define=='function' && define.amd && define('utils/SiftIracLogin',[],function(){return htz.helpers.SiftIracLogin;})); 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564/* EOF */
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.