1(function ($) { 2 function Chat() { 3 let _self = this; 4 let _connected = false; 5 let _livesupportconnected = false; 6 let _livesupportusername = ""; 7 let _livesupporttoken = ""; 8 let _cometdUrl = ''; 9 let _cometdSubscription = null; 10 let _typingNow = false; 11 let _otpWindow = false; 12 let _redirectedToLiveSupport = false; 13 let _disconnectMessagePrinted = false; 14 let _notificationCount = 0; 15 let _timeInterval = null; 16 let _insertingHistory = false; 17 let options = { 18 mode: 'status', 19 message: '', 20 payloadId: '', 21 addHistory: '1', 22 postback: 'Y', 23 rateFeedback: null 24 }; 25 let chatMode = null; 26 let isOpen = null; 27 let closeButtonClicked = false; 28 let currentIndex = 0; 29 let _rateMeEventsRegistered = false; 30 31 function updateSlider() { 32 const $track = $('.owl-stage'); 33 const $items = $('.owl-item'); 34 const totalItems = $items.length; 35 36 currentIndex = Math.max(0, Math.min(currentIndex, totalItems - 1)); 37 38 const itemWidth = $items.outerWidth(true); 39 const targetLeft = currentIndex * itemWidth; 40 41 const trackEl = $track.get(0); 42 if (trackEl.scrollTo) { 43 trackEl.scrollTo({ left: targetLeft, behavior: 'smooth' }); 44 } else { 45 // Fallback 46 $track.scrollLeft(targetLeft); 47 } 48 49 $('#chat .owl-prev').toggleClass('disabled', currentIndex === 0); 50 $('#chat .owl-next').toggleClass('disabled', currentIndex === totalItems - 1); 51 } 52 53 const emojis = [ 54 { key: '8)', code: '\uD83D\uDE0E' }, 55 { key: ':)', code: '\uD83D\uDE42' }, 56 { key: ':(', code: '\uD83D\uDE41' }, 57 { key: ':D', code: '\uD83D\uDE00' }, 58 { key: ':P', code: '\uD83D\uDE0B' }, 59 { key: ':confused:', code: '\uD83D\uDE15' }, 60 { key: ':|', code: '\uD83D\uDE10' }, 61 { key: ":'(", code: '\uD83D\uDE22' }, 62 { key: ':wink:', code: '\uD83D\uDE09' }, 63 { key: ':muscle:', code: '\uD83D\uDCAA' }, 64 { key: ':musical_note:', code: '\uD83C\uDFB5' }, 65 { key: ':mega:', code: '\uD83D\uDCE3' }, 66 { key: ':airplane:', code: '\u2708\uFE0F' }, 67 { key: ':dancer:', code: '\uD83D\uDC83' }, 68 { key: ':clap:', code: '\uD83D\uDC4F' }, 69 { key: ':robot:', code: '\uD83E\uDD16' }, 70 { key: ':heart:', code: '\u2764\uFE0F' }, 71 { key: ':heart_eyes:', code: '\uD83D\uDE0D' }, 72 { key: ':unamused:', code: '\uD83D\uDE12' }, 73 { key: ':money_with_wings:', code: '\uD83D\uDCB8' }, 74 { key: ':eyes:', code: '\uD83D\uDC40' }, 75 { key: ':sunbehindcloud:', code: '\u26C5\uFE0F' }, 76 { key: ':sunny:', code: '\u2600\uFE0F' }, 77 { key: ':cloudy:', code: '\u2601\uFE0F' }, 78 { key: ':windy:', code: '\uD83C\uDF2A\uFE0F' }, 79 { key: ':snowy:', code: '\uD83C\uDF28\uFE0F' }, 80 { key: ':rainy:', code: '\uD83C\uDF27\uFE0F' }, 81 { key: ':star:', code: '\u2B50\uFE0F' }, 82 { key: ':earth_africa:', code: '\uD83C\uDF0D' }, 83 { key: ':rocket:', code: '\uD83D\uDE80' }, 84 { key: ':moneybag:', code: '\uD83D\uDCB0' }, 85 { key: ':house:', code: '\uD83C\uDFE0' }, 86 { key: ':car:', code: '\uD83D\uDE97' }, 87 { key: ':confetti_ball:', code: '\uD83C\uDF8A' }, 88 { key: ':sparkles:', code: '\u2728' }, 89 { key: ':clock3:', code: '\uD83D\uDD52' }, 90 { key: ':calendar:', code: '\uD83D\uDDD3\uFE0F' }, 91 { key: ':revolving_hearts:', code: '\uD83D\uDC9E' }, 92 { key: ':innocent:', code: '\uD83D\uDE07' }, 93 { key: ':star_struck:', code: '\uD83E\uDD29' }, 94 { key: ':hugging_face:', code: '\uD83E\uDD17' }, 95 { key: ':locked:', code: '\uD83D\uDD12' }, 96 { key: ':hourglass_not_done:', code: '\u23F3' }, 97 { key: ':receipt:', code: '\uD83E\uDDFE' }, 98 { key: ':point_down:', code: '\uD83D\uDC47' }, 99 { key: ':party:', code: '\uD83C\uDF89' }, 100 { key: ':orange_heart:', code: '\uD83E\uDDE1' }, 101 { key: ':trflag:', value: 'trflag' }, 102 { key: ':nlflag:', value: 'nlflag' } 103 ]; 104 105 this.initialize = function () { 106 _self.configureChat(); 107 $('.notify-bubble').hide(); 108 _self.registerEventListeners(); 109 } 110 111 this.registerEventListeners = function () { 112 $('#chat-small').click(function () { 113 _self.setIngoMode('default'); 114 _self.openChatBox(); 115 }); 116 117 $('.chat-compliant').click(function () { 118 if (chatMode == "LiveSupport") { 119 _self.openChatBox(); 120 return false; 121 } 122 123 if (_self.getIngoMode() != 'complaint') { 124 _self.disconnectAll('keephistory'); 125 _self.setIngoMode('complaint'); 126 _self.resetVars();
127 chatMode = "INGo"; 128 _self.openChatBox(); 129 } 130 else { 131 _self.openChatBox(); 132 _self.printCompliantRecurrenceMessage(); 133 } 134 return false; 135 }); 136 137 $(".question-mark").click(function () { 138 if ($("#INGo-container").hasClass("on")) { 139 _self.hideIngoContainer(); 140 } 141 else { 142 _self.showIngoContainer(); 143 } 144 }); 145 146 $('#chat #minimize').click(function () { 147 $('#chat').removeClass('on'); 148 isOpen = false; 149 }); 150 151 $('#chat #close').click(function () { 152 if ($("#INGo-container").hasClass("on")) { 153 $("#INGo-container").removeClass("on"); 154 $('#chat #minimize').show(); 155 return; 156 } 157 158 if (!closeButtonClicked) { 159 closeButtonClicked = true; 160 _self.closingMessage(); 161 setTimeout(function () { 162 _self.resetVars(); 163 _self.closeChatPanel(); 164 _self.removeChatBubbles(); 165 closeButtonClicked = false; 166 _self.disconnectAll(); 167 }, 2500); 168 } 169 }); 170 171 $('#chat .submitbutton').click(function () { 172 if ($('#chat .chatmsg').val() == '') 173 return; 174 175 if (chatMode != "LiveSupport") 176 _self.answer({ mode: 'getanswer', message: $('#chat .chatmsg').val() }); 177 else 178 _self.liveSupportSendMessage($('#chat .chatmsg').val()); 179 180 $('#chat .chatmsg').val(''); 181 }) 182 183 $('#chat .chatmsg').keyup(function (e) { 184 if (e.keyCode == 13) { 185 if ($('#chat .chatmsg').val() == '') 186 return; 187 188 if (chatMode != "LiveSupport") 189 _self.answer({ mode: 'getanswer', message: $('#chat .chatmsg').val() }); 190 else 191 _self.liveSupportSendMessage($('#chat .chatmsg').val()); 192 193 $('#chat .chatmsg').val(''); 194 } 195 }) 196 197 $('#chat').on('click', '.submit-button-date', function () { 198 const dateString = $("#chat #date-picker").val().split('/').reverse(); 199 const date = new Date(dateString); 200 201 if (!isNaN(date)) { 202 _otpWindow = false; 203 const payloadText = $("#chat #payload-text").text(); 204 $('#chat .chatmsg').prop('readonly', false); 205 $('#chat .chatinput').removeClass('disabled'); 206 $('#chat .date-box').remove(); 207 _self.renderTemplate({ 208 text: payloadText 209 }, 5); 210 _self.answer({ 211 mode: 'getanswer', 212 message: `startDate:${date.toISOString()}`, 213 addHistory: '1' 214 }); 215 } 216 }); 217 218 219 $('#chat').on('click', '.submit-button-formatted-input', function () { 220 const formattedString = $("#chat #formatted-input").val(); 221 if (formattedString) { 222 _otpWindow = false; 223 const payloadText = $("#chat #payload-text").text(); 224 $('#chat .chatmsg').prop('readonly', false); 225 $('#chat .chatinput').removeClass('disabled'); 226 $('#chat .formatted-input-box').remove(); 227 _self.renderTemplate({ 228 text: payloadText 229 }, 5); 230 _self.answer({ 231 mode: 'getanswer', 232 message: formattedString, 233 addHistory: '1' 234 }); 235 } 236 }); 237 238 $('#chat').on('click', '.buttons a[data-payload]', function () { 239 _self.answer({ 240 mode: 'getpayloadanswer', 241 message: $(this).text(), 242 payloadId: $(this).data('payload') 243 }); 244 }) 245 246 $('#chat').on('click', '.answers a[data-payload]', function () { 247 var answerParent = $(this).closest('.answers'); 248 if (answerParent) answerParent.css('display', 'none'); 249 _self.answer({ 250 mode: 'getquickreplyanswer', 251 message: $(this).text(), 252 payloadId: $(this).data('payload'), 253 postback: $(this).data('postback') || 'Y' 254 }); 255 }) 256 257 $('#chat').on('keyup', ".otp .password", function (e) { 258 if (e.keyCode == 13) { 259 _self.answer({ 260 mode: 'getanswer', 261 message: $(this).val(), 262 addHistory: '0' 263 }); 264 _self.clearTimeCounter(); 265 } 266 }) 267 268 $('#chat').on('click', ".otp input[type='submit']", function () { 269 _self.answer({ 270 mode: 'getanswer', 271 message: $("#chat .otp .password:last").val(), 272 addHistory: '0' 273 }); 274 _self.clearTimeCounter(); 275 }) 276 277 $('#chat').on('click', 'a[role="link"]', function () { 278 _self.answer({ mode: 'getanswer', message: this.getAttribute("data-custom-payload") }); 279 _self.hideIngoContainer(); 280 }) 281 282 $('#chat').on('click', 'a[data-action]', function (event) { 283 var action = event.target.getAttribute("data-action"); 284 var href = event.target.getAttribute("href"); 285 if (typeof action !== typeof undefined && action !== false && action !== "undefined") { 286 if (action === "Current") { 287 event.target.removeAttribute("data-action"); 288 event.target.removeAttribute("data-payload"); 289 event.target.removeAttribute("href"); 290 event.target.className += " disabled-button"; 291 } 292 else if (action === "All") { 293 var parent = event.target.closest('article[class^="left"]'); 294 var elements = parent.closest('article[class^="left"]').querySelectorAll(".buttons li a"); 295 if (typeof elements !== typeof undefined) { 296 var elementsArr = Array.prototype.slice.call(elements); 297 elementsArr.forEach(function (element) { 298 element.removeAttribute("data-action"); 299 element.removeAttribute("data-payload"); 300 element.removeAttribute("href"); 301 element.className += " disabled-button"; 302 }); 303 } 304 } 305 306 if (href && href !== "#") { 307 window.open(href, "_blank"); 308 } 309 310 event.preventDefault(); 311 } 312 }); 313 314 $('#chat').on('click', '.owl-next', function () { 315 const $items = $('.owl-item'); 316 const totalItems = $items.length; 317 if (currentIndex < totalItems - 1) { 318 currentIndex++; 319 updateSlider(); 320 } 321 }); 322 323 324 $('#chat').on('click', '.owl-prev', function () { 325 if (currentIndex > 0) { 326 currentIndex--; 327 updateSlider(); 328 } 329 }); 330 } 331 332 this.registerRateMePopupEvents = function () { 333 if (_rateMeEventsRegistered) return; 334
335 _rateMeEventsRegistered = true; 336 337 $(document).on('click', '.c-rating__item', function () { 338 $(this).closest('.c-rating') 339 .find('.c-rating__item') 340 .removeClass('is-selected') 341 .attr('aria-checked', 'false'); 342 343 $(this) 344 .addClass('is-selected') 345 .attr('aria-checked', 'true'); 346 347 _selectedRating = $(this).attr('data-rating'); 348 }); 349 350 $(document).on('input', '#survey-comment', function () { 351 const max = 140; 352 const $this = $(this); 353 const value = $this.val(); 354 355 if (value.length > max) { 356 $this.val(value.slice(0, max)); 357 } 358 359 $('#char-count').text($this.val().length); 360 }); 361 362 $(document).on('click', '[data-close-modal]', function () { 363 $('.c-modal').remove(); 364 $('html').css('overflow', ''); 365 }); 366 367 $(document).on('click', '[data-submit-survey]', function () { 368 const comment = $('#survey-comment').val(); 369 const payloadText = $('#survey-modal').data('payload-text') || ''; 370 371 _self.answer({ 372 mode: 'getquickreplyanswer', 373 payloadId: payloadText, 374 message: payloadText, 375 rateFeedback: { 376 rate: parseInt(_selectedRating), 377 customFeedback: _self.xssFilter(comment || '') 378 }, 379 addHistory: '0', 380 postback: 'Y' 381 }); 382 383 $('.c-modal').remove(); 384 385 const feedbackTemplate = ` 386 <div class="c-modal" 387 id="feedback-modal" 388 role="dialog" 389 aria-modal="true" 390 aria-labelledby="modal-title" 391 aria-describedby="modal-desc"> 392 <div class="c-modal__dialog" tabindex="-1"> 393 <div class="c-modal__header"> 394 <h2 class="c-modal__title" id="modal-title">DeÄerlendirme</h2> 395 <button class="c-modal__close" 396 type="button" 397 aria-label="Kapat" 398 data-close-modal> 399 <img src="/assets/img/chat/close.svg" alt="" width="18" height="18" /> 400 </button> 401 </div> 402 403 <div class="c-modal__body c-modal__body--feedback"> 404 <div class="c-modal__illustration" aria-hidden="true"> 405 <img src="/assets/img/chat/happy-woman.svg" alt="" width="160" height="160" /> 406 </div> 407 408 <p class="c-modal__headline"> 409 Geri bildiriminiz için teÅekkür ederiz 410 </p> 411 <p class="c-modal__text" id="modal-desc"> 412 Deneyiminizi iyileÅtirmemiz adına olumlu veya olumsuz görüÅleriniz 413 bizim için çok önemli. 414 </p> 415 </div> 416 417 <div class="c-modal__footer"> 418 <button class="c-btn c-btn--primary" type="button" data-close-modal> 419 Kapat 420 </button> 421 </div> 422 </div> 423 </div>`; 424 425 _self.appendMsg(feedbackTemplate); 426 $('html').css('overflow', 'hidden'); 427 428 _selectedRating = null; 429 }); 430 } 431 432 this.isConnected = function () { 433 return _connected; 434 } 435 436 this.resetNotificationCount = function () { 437 _notificationCount = 0; 438 } 439 440 this.switchChatMode = function (mode, status) { 441 if (chatMode == null) { 442 chatMode = mode; 443 if (chatMode == "INGo") { 444 if (isOpen) 445 _self.connect(status); 446 } 447 else { 448 _self.connectLiveSupport(status); 449 } 450 } 451 else if (mode == undefined || mode == null || mode == "" || mode == chatMode) { 452 return; 453 } 454 else { 455 _self.setChatMode(mode); 456 if (chatMode == "INGo") 457 _self.connect(status); 458 else 459 _self.connectLiveSupport(status); 460 } 461 } 462 463 this.setChatMode = function (mode) { 464 if (mode == "LiveSupport") { 465 chatMode = mode;
466 //_self.changeChatBoxHeader("Canlı Destek"); 467 _self.setSessionChatMode("LiveSupport"); 468 } 469 470 if (mode == "INGo") { 471 chatMode = mode; 472 //_self.changeChatBoxHeader("INGo"); 473 _self.setSessionChatMode("INGo"); 474 } 475 } 476 477 this.resetCometd = function () { 478 if (_cometdSubscription != null) { 479 $.cometd.unsubscribe(_cometdSubscription); 480 } 481 482 _livesupportconnected = false; 483 $.cometd.disconnect(); 484 _cometdSubscription = null; 485 } 486 487 this.clearSession = function () { 488 _self.sendLiveSupport( 489 { 490 mode: 'clearsession', 491 message: '' 492 }, 493 function (data) { 494 }, 495 function (data) { 496 } 497 ); 498 } 499 500 this.changeChatBoxHeader = function (headerText) { 501 var headers = $('#chat .h2'); 502 jQuery.each(headers, function (i, header) { 503 header.innerHTML = headerText; 504 }); 505 } 506 507 this.connectLiveSupport = function (status) { 508 if (typeof status != 'undefined' 509 && typeof status.LiveSupportStatus != 'undefined' && status.LiveSupportStatus == true 510 && typeof status.LiveSupportUserID != 'undefined' && status.LiveSupportUserID != "" && status.LiveSupportUserID != null 511 && typeof status.Token != 'undefined' && status.Token != "" && status.Token != null) { 512 _livesupportconnected = true; 513 _self.cometdConnection(status.LiveSupportUserID, status.Token); 514 return; 515 } 516 517 _self.sendLiveSupport( 518 { 519 mode: 'connect', 520 message: '' 521 }, 522 function (data) { 523 if (data.d) { 524 var response = data.d; 525 if (response == null || response == "" || response == "FAIL") { 526 _livesupportconnected = false; 527 _self.errorComment(); 528 } 529 else { 530 var status = JSON.parse(response); 531 532 _livesupportusername = status.LiveSupportUserID; 533 _livesupporttoken = status.Token; 534 _livesupportconnected = true; 535 _self.cometdConnection(status.LiveSupportUserID, status.Token); 536 } 537 } 538 }, 539 function (data) { 540 _livesupportconnected = false; 541 _self.errorComment(); 542 } 543 ); 544 545 } 546 547 this.cometdConnection = function (username, token) { 548 $.ajaxSetup({ async: true }); 549 $.cometd.websocketEnabled = false; 550 551 try { 552 $.cometd.configure({ 553 url: _cometdUrl, 554 requestHeaders: { 555 "GMS-User": username, "sessionToken": token, ApplicationId: "Public", AuthKey: "Public" 556 } 557 }); 558 cometdConnectListener = $.cometd.addListener("/meta/connect", function (message) { 559 if ($.cometd.isDisconnected()) { 560 _self.disconnectLiveSupport(); 561 return; 562 } 563 }); 564 cometdDisconnectListener = $.cometd.addListener("/meta/disconnect", function (message) { 565 _self.disconnectLiveSupport(); 566 }); 567 $.cometd.handshake(); 568 _cometdSubscription = $.cometd.subscribe("/_genesys", function (response) { 569 570 if (response.data != undefined && response.data != null 571 && response.data.message != undefined && response.data.message != null 572 && response.data.message.chatIxnState != undefined && response.data.message.chatIxnState != null) { 573 if (response.data.message.chatIxnState == "DISCONNECTED") { 574 _self.disconnectLiveSupport(); 575 } 576 } 577 578 if (response.data != undefined 579 && response.data.message != undefined 580 && response.data.message.transcriptToShow != undefined 581 && response.data.message.transcriptToShow.length > 0) { 582 583 jQuery.each(response.data.message.transcriptToShow, function (i, transcript) { 584 if (transcript[4] != null 585 && transcript[4] != undefined 586 && (transcript[4] == "EXTERNAL" || transcript[4] == "AGENT")) { 587 if (transcript[0] != "Notice.Left" 588 && transcript[0] != "Notice.Joined" 589 && transcript[0] != "Notice.TypingStarted" 590 && transcript[0] != "Notice.TypingStopped" 591 && transcript[0] != "Notice.Custom") { 592 593 if (_typingNow) { 594 _self.removeTyping(); 595 } 596 _livesupportconnected = true; 597 _self.agentMessage(_self.xssFilter(transcript[2])); 598 _self.liveSupportAddHistory(2, transcript[2]); 599 600 _self.setNotifyBubble(); 601 } 602 if (transcript[0] == "Notice.TypingStarted") { 603 _self.addTyping(); 604 _typingNow = true; 605 } 606 if (transcript[0] == "Notice.TypingStopped") { 607 _self.removeTyping(); 608 } 609 } 610 }); 611 } 612 }); 613 } catch (e) { 614 _self.printLiveChatErrorMessage(); 615 _self.switchChatMode("INGo"); 616 } 617 } 618 619 this.openChatBox = function (mode) { 620 var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 621 622 $('#chat').addClass('on'); 623 if (!iOS) { 624 $('#chat .chatmsg').get(0).focus(); 625 } 626 627 isOpen = true; 628 $('.notify-bubble').hide(); 629 630 _self.resetNotificationCount(); 631 632 if (chatMode == "INGo") { 633 if (_self.isConnected() == false) { 634 chatMode = null; 635 _self.switchChatMode("INGo"); 636 } 637 } 638 639 640 if (iOS) { 641 $('input.chatmsg').focus(function (e) { 642 e.preventDefault(); 643 e.stopPropagation(); 644 645 setTimeout(function () { 646 _self.scrollToBottom(); 647 }, 1000); 648 }); 649 } 650 setTimeout(function () { 651 window.scrollBy(0, 1); 652 }); 653 654 setTimeout(function () { 655 _self.scrollToBottom(); 656 }, 500); 657 } 658 659 this.disconnectLiveSupport = function () { 660 _self.printLiveChatDisconnectedMessage(); 661 _self.clearSession(); 662 _self.resetCometd(); 663 _self.switchChatMode("INGo"); 664 _self.setIngoMode('default'); 665 } 666 667 this.disconnectAll = function (keephistory) { 668 var disconnectMessage = '' 669 670 if (keephistory != undefined) { 671 disconnectMessage = keephistory 672 } 673 674 _self.sendLiveSupport( 675 { 676 mode: 'disconnect', 677 message: disconnectMessage 678 }, 679 function (data) { 680 if (typeof data.d != 'undefined' && data.d != null) { 681 if (data.d == "true") {
682 //if (copiedChatMode == "LiveSupport") { 683 _livesupportconnected = false; 684 _self.resetCometd(); 685 //} 686 //else { 687 _connected = false; 688 //} 689 chatMode = "INGo"; 690 //_self.setIngoMode('default'); 691 } 692 } 693 }, 694 function (data) { 695 } 696 ); 697 } 698 699 this.removeChatBubbles = function () { 700 $('article.left').remove(); 701 $('article.right').remove(); 702 } 703 704 this.closeChatPanel = function () { 705 $('#chat .chatmsg').get(0).blur(); 706 $('#chat').removeClass('on'); 707 isOpen = false; 708 } 709 710 this.resetVars = function () { 711 chatMode = null; 712 _connected = false; 713 _livesupportconnected = false; 714 _livesupportusername = ""; 715 _livesupporttoken = ""; 716 _cometdSubscription = null; 717 _typingNow = false; 718 _otpWindow = false; 719 _redirectedToLiveSupport = false; 720 _disconnectMessagePrinted = false; 721 _notificationCount = 0; 722 } 723 724 this.setNotifyBubble = function () { 725 if (!isOpen) { 726 _notificationCount++; 727 $('.notify-bubble .h2').text(_notificationCount); 728 $('.notify-bubble').show(); 729 } 730 } 731 732 this.addTyping = function () { 733 if ($('#chat-writing').length) 734 return; 735 736 var leftBlockAgentTemplate = '<article class="left" id="chat-writing"><img src="/assets/img/chat/waiting_animation.gif" alt="" height="36"></article>'; 737 var leftBlockINGoTemplate = '<article class="left" id="chat-writing"><img src="/assets/img/chat/waiting_animation.gif" alt="" height="36"></article>'; 738 739 var template = chatMode == "LiveSupport" ? leftBlockAgentTemplate : leftBlockINGoTemplate; 740 741 $('#chat .view').append(template); 742 743 bodymovin.loadAnimation({ 744 container: document.getElementById('ingow'), 745 path: '/assets/css/loading.json', 746 renderer: 'svg', 747 loop: true, 748 autoplay: true, 749 scaleMode: 'noScale', 750 }) 751 752 _self.scrollToBottom(); 753 754 if (chatMode == "LiveSupport") 755 return; 756 757 $('#chat .chatmsg').prop('readonly', true); 758 $('#chat .chatinput').addClass('disabled'); 759 } 760 761 this.removeTyping = function () { 762 if (!_otpWindow) { 763 $('#chat .chatmsg').prop('readonly', false); 764 $('#chat .chatinput').removeClass('disabled') 765 } 766 $('#chat-writing').remove(); 767 } 768 769 this.printLiveChatDisconnectedMessage = function () { 770 if (_livesupportconnected == true && _disconnectMessagePrinted != true) { 771 _self.agentMessage("Canlı destek oturumunuz sonlanmıÅtır."); 772 _disconnectMessagePrinted = true; 773 } 774 } 775 776 this.printLiveChatErrorMessage = function () { 777 _self.renderTemplate({ text: 'Devrelerimde bir karıÅıklık oldu, sizi Canlı Destek ekibimize baÄlayamıyorum :( Size ben destek olabilirim. Hangi konuda destek olmamı istersiniz?' }, 5); 778 } 779 780 this.printChatbotErrorMessage = function () { 781 _self.renderTemplate({ text: 'ÃÄrenme aÅamasında olan bir bankacılık robotuyum, Åuan size destek veremiyorum.:( Lütfen daha sonra tekrar deneyin.' }, 5); 782 } 783 784 this.printCompliantRecurrenceMessage = function () { 785 if (typeof IsCompliantRecurrenceMessagePrinted !== 'undefined' && IsCompliantRecurrenceMessagePrinted) return; 786 else IsCompliantRecurrenceMessagePrinted = true; 787 788 _self.renderTemplate({ text: 'Soru ve görüÅlerinizi bana iletebilirsiniz, tüm kodlarım size hizmet etmek için yazıldı :robot:' }, 5);
789 } 790 791 this.liveSupportSendMessage = function (message) { 792 _self.userMessage(message); 793 794 _self.sendLiveSupport( 795 { 796 mode: 'sendmessage', 797 message: message 798 }, 799 function (data) { 800 if (data.d) { 801 _livesupportconnected = true; 802 } 803 }, 804 function (data) { 805 _self.renderTemplate({ text: 'Galiba elektrikler kesildi, en son yazdıÄınızı göremedim. :( Lütfen tekrar yazar mısınız?' }, 5); 806 } 807 ); 808 } 809 810 this.liveSupportAddHistory = function (type, message) { 811 _self.sendLiveSupport( 812 { 813 mode: type == 1 ? 'adduserhistory' : 'addagenthistory', 814 message: message 815 }, 816 function (data) { 817 if (data.d) { 818 _livesupportconnected = true; 819 } 820 }, 821 function (data) { 822 _livesupportconnected = false; 823 _self.errorComment(); 824 } 825 ); 826 } 827 828 this.setSessionChatMode = function (mode) { 829 _self.sendLiveSupport( 830 { 831 mode: 'setchatmode', 832 message: mode 833 }, 834 function (data) { 835 }, 836 function (data) { 837 } 838 ); 839 } 840 841 this.configureChat = function () { 842 var ingoMessage = ''; 843 844 if (_self.queryString('IsINGo') == '0') 845 ingoMessage = 'd'; 846 847 if (_self.queryString('IsINGo') == '1') 848 _self.openChatBox(); 849 850 if (_self.queryString('INGoWM') == 'l') 851 _self.setIngoMode('loan'); 852 853 if (_self.queryString('IsINGo') == '2') { 854 _self.setIngoMode('complaint'); 855 _self.openChatBox(); 856 } 857 858 //.. 859 var opts = $.extend({ 860 }, options, { 861 mode: 'status', 862 message: ingoMessage 863 }); 864 865 _self.send(opts, 866 function (data) { 867 if (typeof data.d !== 'undefined' && data.d != null) { 868 var status = JSON.parse(data.d); 869 870 if (typeof status.Active != 'undefined') { 871 if (status.Active) $('#chat').show(); 872 else $('#chat').hide(); 873 } 874 875 if (typeof status.History != 'undefined' && status.History != null && status.History.length > 0) { 876 _self.loadHistory(status.History); 877 } 878 879 if (typeof status.CometdUrl != 'undefined' && status.CometdUrl != null && status.CometdUrl != "") { 880 _cometdUrl = status.CometdUrl; 881 } 882 883 if (status != null && status.ChatMode != null && typeof status.ChatMode != 'undefined' && status.ChatMode != "") { 884 if (status.ChatMode == "INGo" && typeof status.INGoStatus != 'undefined' && status.INGoStatus != null && status.INGoStatus == true) { 885 _connected = true; 886 } 887 _self.switchChatMode(status.ChatMode, status); 888 } 889 else { 890 _self.switchChatMode("INGo"); 891 } 892 } 893 }, 894 function (data) { 895 _connected = false; 896 _self.errorComment(); 897 } 898 ); 899 } 900 901 this.loadHistory = function (history) { 902 var histories = JSON.parse(history); 903 904 _insertingHistory = true; 905 for (var i = 0; i < histories.length; i++) { 906 if (histories[i].Type == 1) { 907 _self.rightComment(histories[i].Log); 908 } 909 else if (histories[i].Type == 2) { 910 var _log = JSON.parse(histories[i].Log); 911 _self.render(_log, true, i === histories.length - 1); 912 } 913 else if (histories[i].Type == 3) { 914 _self.agentMessage(histories[i].Log); 915 } 916 } 917 _insertingHistory = false; 918 _self.scrollToBottom(); 919 } 920 921 this.answer = function (pData) { 922 if (typeof pData.message == 'undefined' || pData.message == '') 923 return; 924 925 pData.message = _self.xssFilter(pData.message); 926 927 var opts = $.extend({}, options, pData); 928 929 if (opts.addHistory == '1') 930 _self.rightComment(opts.message); 931 932 _self.send(opts, 933 function (data) { 934 if (typeof data.d == 'undefined') { 935 _self.errorComment(); 936 return; 937 } 938 939 try { 940 var resp = JSON.parse(data.d); 941 _self.render(resp); 942 } catch (e) { 943 _self.errorComment(); 944 return; 945 } 946 }, 947 function (data) { 948 _self.errorComment(); 949 } 950 ); 951 } 952 953 this.connect = function (status) { 954 if (_connected) { 955 return; 956 } 957 958 if (typeof status != 'undefined' && typeof status.INGoStatus != 'undefined' && status != null && status.INGoStatus != null && status.INGoStatus != false) { 959 _connected = true; 960 return; 961 } 962 963 //.. 964 var connectionMessage = _self.getIngoMode(); 965 966 if (_self.checkCBUNQID()) { 967 var unqid = _self.generateUNQID(); 968 _self.setCBUNQID(unqid); 969 } 970 971 var opts = $.extend({ 972 }, options, { 973 mode: 'createsession', 974 message: connectionMessage, 975 }); 976 977 _self.send(opts, 978 function (data) { 979 if (data.d) { 980 _connected = true; 981 982 try { 983 var resp = JSON.parse(data.d); 984 _self.render(resp); 985 } catch (e) { 986 _self.errorComment(); 987 return; 988 } 989 } 990 else { 991 if (typeof data.d == 'undefined') { 992 _self.errorComment(); 993 return; 994 } 995 996 if (data.d == 'blocked') { 997 _self.errorComment(); 998 return; 999 } 1000 1001 if (data.d == '') { 1002 _self.printChatbotErrorMessage(); 1003 return; 1004 } 1005 } 1006 }, 1007 function (data) { 1008 _connected = false; 1009 _self.errorComment(); 1010 } 1011 ); 1012 } 1013 1014 this.render = function (payload, replay, isLastPayload) { 1015 if (payload.gotogenesys && payload.gotogenesys == 'Y') { 1016 _self.liveChatWelcomeMessage(); 1017 _self.switchChatMode("LiveSupport"); 1018 return; 1019 } 1020 1021 if (payload.length == 0 || !payload.length) { 1022 _self.errorComment(); 1023 return; 1024 } 1025 var i = 0; 1026 for (i; i < payload.length; i++) { 1027 if (payload[i]) { 1028 _self.renderPayload(payload[i], replay, isLastPayload); 1029 1030 } 1031 } 1032 } 1033 1034 this.renderPayload = function (singlePost, passedReplay, isLastPayload) { 1035 const componentId = singlePost.component !== undefined ? singlePost.component : 5; 1036 if (passedReplay) { 1037 if (!isLastPayload && (componentId == 8 || componentId == 11)) { 1038 _self.renderTemplate({ 1039 text: singlePost.message.text 1040 }, 5);
1041 return; 1042 } else if (componentId == 10 || componentId == 17) return; 1043 } 1044 1045 if (singlePost.message.attachment) { 1046 _self.renderTemplate(singlePost.message.attachment.payload, componentId, passedReplay); 1047 } 1048 else { 1049 _self.renderTemplate(singlePost.message, componentId, passedReplay); 1050 } 1051 } 1052 1053 this.renderTemplate = function (payload, componentId, replay) { 1054 _otpWindow = false; 1055 1056 if (componentId == 1) { 1057 //generic 1058 var template = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><div class="imagebox"><img class="cover" src="## IMGURL ##" alt=""></div><div class="content"><div class="h2">## TITLE ##</div><div class="autoh h3">## SUBTITLE ##</div></div><ul class="buttons">## BUTTONS ##</ul></div></article>'; 1059 1060 payload = payload.elements[0]; 1061 var _subtitle = _self.renderEmoji(payload.subtitle || ''); 1062 var _title = _self.h2Fix(payload.title || ''); 1063 _title = _self.renderEmoji(_title); 1064 1065 var output = template.replace('## TITLE ##', _title) 1066 .replace('## SUBTITLE ##', _subtitle) 1067 .replace('## IMGURL ##', payload.media_url); 1068 1069 var buttons = _self.renderButtons(payload); 1070 if (buttons) 1071 output = output.replace('## BUTTONS ##', buttons); 1072 1073 _self.appendMsg(output); 1074 } 1075 else if (componentId == 2 || componentId == 5) { 1076 var template = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><img class="hat" src="/assets/img/hat-left.png" alt="" srcset="/assets/img/hat-left.png 1x, /assets/img/[email protected] 2x"><p>## TEXT ##</p></div>## QUICKREPLIES ##</article>'; 1077 1078 var msg = _self.renderEmoji(payload.text); 1079 var output = template.replace('## TEXT ##', msg); 1080 1081 if (payload.quick_replies) { 1082 var buttons = _self.renderQuickReplyButtons(payload); 1083 if (buttons) output = output.replace('## QUICKREPLIES ##', buttons); 1084 } 1085 1086 output = output.replace('## QUICKREPLIES ##', ''); 1087 1088 _self.appendMsg(output); 1089 } 1090 else if (componentId == 3) { 1091 var buttonTemplate = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><div class="pbox"><p>## TEXT ##</p></div><ul class="buttons">## BUTTONS ##</ul></div></article>'; 1092 1093 var msg = _self.renderEmoji(payload.text); 1094 var output = buttonTemplate.replace('## TEXT ##', msg); 1095 1096 var buttons = _self.renderButtons(payload); 1097 if (buttons) 1098 output = output.replace('## BUTTONS ##', buttons); 1099 1100 _self.appendMsg(output); 1101 } 1102 else if (componentId == 6) { 1103 var template = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><div class="imagebox"><img class="cover" src="## IMGURL ##" alt=""></div><ul class="buttons">## BUTTONS ##</ul></div></article>'; 1104 1105 var output = template.replace('## IMGURL ##', payload.imageUrl); 1106 var listButtons = ''; 1107 1108 for (var i = 0; i < payload.elements.length; i++) { 1109 listButtons += _self.renderListButtons(payload.elements[i], payload.elements.length, i); 1110 } 1111 1112 if (payload.elements.length > 2) { 1113 listButtons += _self.addShowAllButton(); 1114 } 1115 listButtons += _self.renderButtons(payload); 1116 1117 1118 if (listButtons) 1119 output = output.replace('## BUTTONS ##', listButtons); 1120 1121 _self.appendMsg(output); 1122 } 1123 else if (componentId == 7) { 1124 1125 if (payload.elements) 1126 payload = payload.elements[0]; 1127 1128 if (payload.media_type == 'video') { 1129 var template = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><div class="imagebox"><a class="item fb-video" href="## VIDEOURL ##" rel="media-gallery"><input type="button" class="player"><div class="boxoverlay"></div><img class="player" src="## IMGURL ##" alt=""></a></div><ul class="buttons">## BUTTONS ##</ul></div></article>'; 1130 1131 var output = template.replace('## IMGURL ##', payload.media_url) 1132 .replace('## VIDEOURL ##', payload.media_url); 1133 1134 var buttons = _self.renderButtons(payload); 1135 if (buttons) 1136 output = output.replace('## BUTTONS ##', buttons); 1137 1138 _self.appendMsg(output); 1139 1140 jING.popup.init(); 1141 } 1142 } 1143 else if (componentId == 8) { 1144 const template = `<article class="left date-box"> 1145 <div class="avatar"> 1146 <img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"> 1147 </div> 1148 <div class="bubble"> 1149 <div class="pbox" style="border: 1px solid #d9d9d9; padding: 12px; border-radius: 4px; font-size: 15px; line-height: 20px;">
1150 <span id="payload-text">${payload.text}</span> 1151 <div id="caltemp" style="display: none;"> 1152 <div id="__ID__" class="datepicker dp-container" style="display: none;"> 1153 <span class="dp-arrow"></span> 1154 <div class="content"> 1155 <div class="header neue" style="border: none;"> 1156 <span class="ui-layout close">X</span> 1157 </div> 1158 <div class="dp-wrapper m-b20"> 1159 </div> 1160 </div> 1161 </div> 1162 </div> 1163 <input type="text" class="date pickADate" id="date-picker" style="border-bottom: 1px solid #d0d0d0; width: 100%; cursor: pointer;" value="${payload.startDate.replaceAll('.', '/')}" /> 1164 <input type="submit" class="submit-button-date" value="Onayla" style="margin-top: 12px; cursor: pointer;" /> 1165 </div> 1166 </div> 1167 </article>`; 1168 _self.appendMsg(template); 1169 $('#date-picker').pickADate({ 1170 editable: false, 1171 selectableDate: true, 1172 disabledWeekends: false, 1173 disabledHolidays: false, 1174 showOnlyFutureDates: false, 1175 showOnlyPreviousDates: false, 1176 startDate: payload.minDate.replaceAll('.', '/'), 1177 endDate: payload.maxDate.replaceAll('.', '/'), 1178 onOpen: () => { 1179 _self.scrollToBottom(); 1180 }, 1181 }); 1182 _otpWindow = true; 1183 } 1184 else if (componentId == 9) { 1185 var template = '<article class="left"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div>## CAROUSEL ##</article>'; 1186 1187 var output = template.replace('## CAROUSEL ##', _self.renderCarousel(payload.elements)); 1188 1189 _self.appendMsg(output); 1190 } 1191 else if (componentId == 10) { 1192 var template = '<article class="left otpbox"><div class="avatar"><img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><div class="pbox"><p class="mw228">## TEXT ##<span class="timer">Kalan Süre: <span id="countdownBox">0:00</span></p></div><ul class="buttons"><li class="otp"><input type="password" value="" class="password"><div class="submitbutton"><input type="submit" value="" class="button-sendSmall"></div></li></ul></div></article>'; 1193 1194 var msg = _self.renderEmoji(payload.text); 1195 var output = template.replace('## TEXT ##', msg); 1196 1197 _self.clearTimeCounter(); 1198 1199 _self.appendMsg(output); 1200 1201 _otpWindow = true; 1202 1203 $("#chat .otp .password:last").focus(); 1204 1205 var tMin = '4:00'; 1206 $('#countdownBox:last').text(tMin); 1207 1208 _timeInterval = setInterval(function () { 1209 var timer = tMin.split(':'); 1210 var minutes = parseInt(timer[0], 10); 1211 var seconds = parseInt(timer[1], 10); 1212 --seconds; 1213 minutes = (seconds < 0) ? --minutes : minutes; 1214 seconds = (seconds < 0) ? 59 : seconds; 1215 seconds = (seconds < 10) ? '0' + seconds : seconds; 1216 $('#countdownBox:last').text(minutes + ':' + seconds); 1217 if (minutes + ':' + seconds == '0:00') { 1218 _self.answer({ mode: 'getanswer', message: 'timeout_999', addHistory: '0' }); 1219 _self.clearTimeCounter(); 1220 } 1221 tMin = minutes + ':' + seconds; 1222 }, 1000); 1223 } 1224 else if (componentId == 11) { 1225 const template = `<article class="left formatted-input-box"> 1226 <div class="avatar"> 1227 <img src="/assets/img/chat-bot-avatar.png" alt="" srcset="/assets/img/chat-bot-avatar.png 1x, /assets/img/[email protected] 2x"> 1228 </div> 1229 <div class="bubble"> 1230 <div class="pbox" style="border: 1px solid #d9d9d9; padding: 12px; border-radius: 4px; font-size: 15px; line-height: 20px;">
1231 <span id="payload-text">${payload.text}</span> 1232 <div style="display: flex; height: 32px; width: 100%; margin-top: 8px; gap: 8px;"> 1233 ${payload.icon ? `<img src="${payload.icon}" />` : ''} 1234 <input id="formatted-input" placeholder="${payload.format.replaceAll('-', '_').replaceAll('#', '*')}" data-slots="_" style="font-family: monospace; height: auto; width: 100%; margin-right: 6px; letter-spacing: 1.5px; padding: 6px;"> 1235 </div> 1236 <input type="submit" class="submit-button-formatted-input" value="Onayla" style="margin-top: 12px;" /> 1237 </div> 1238 </div> 1239 </article>`; 1240 _self.appendMsg(template); 1241 1242 const el = document.querySelector('#formatted-input'); 1243 const pattern = el.getAttribute('placeholder'), 1244 slots = new Set(el.dataset.slots || '_'), 1245 prev = (j => Array.from(pattern, (c, i) => slots.has(c) ? j = i + 1 : j))(0), 1246 first = [...pattern].findIndex(c => slots.has(c)), 1247 accept = new RegExp(el.dataset.accept || '\\d', 'g'), 1248 clean = input => { 1249 input = input.match(accept) || []; 1250 return Array.from(pattern, c => 1251 input[0] === c || slots.has(c) ? input.shift() || c : c 1252 ); 1253 }, 1254 format = () => { 1255 const [i, j] = [el.selectionStart, el.selectionEnd].map(i => { 1256 i = clean(el.value.slice(0, i)).findIndex(c => slots.has(c)); 1257 return i < 0 ? prev[prev.length - 1] : back ? prev[i - 1] || first : i; 1258 }); 1259 el.value = clean(el.value).join``; 1260 el.setSelectionRange(i, j); 1261 back = false; 1262 }; 1263 let back = false; 1264 el.addEventListener('keydown', (e) => back = e.key === 'Backspace'); 1265 el.addEventListener('input', format); 1266 el.addEventListener('focus', format); 1267 el.addEventListener('blur', () => el.value === pattern && (el.value = '')); 1268 _otpWindow = true; 1269 } 1270 else if (componentId == 17) { 1271 _self.registerRateMePopupEvents(); 1272 1273 if ($('#survey-modal').length) { 1274 $('#survey-modal').remove(); 1275 } 1276 1277 const template = 1278 `<div class="c-modal" 1279 id="survey-modal" 1280 role="dialog" 1281 aria-modal="true" 1282 aria-labelledby="survey-title" 1283 aria-describedby="survey-desc" 1284 data-payload-text="${payload.text || ''}"> 1285 <div class="c-modal__dialog" tabindex="-1"> 1286 <div class="c-modal__header"> 1287 <h2 class="c-modal__title" id="survey-title">DeÄerlendirme</h2> 1288 <button class="c-modal__close" 1289 type="button" 1290 aria-label="Kapat" 1291 data-close-modal> 1292 <img src="/assets/img/chat/close.svg" alt="" width="18" height="18" /> 1293 </button> 1294 </div> 1295 1296 <div class="c-modal__body c-modal__body--survey"> 1297 <div class="c-form"> 1298 <p class="c-form__headline">Hizmetimizden memnun kaldınız mı?</p> 1299 <p class="c-form__sub" id="survey-desc"> 1300 GörüÅleriniz bizim için çok deÄerli. ð 1301 </p> 1302 1303 <div class="c-rating" role="radiogroup" aria-label="Memnuniyet"> 1304 <!-- 1 --> 1305 <button class="c-rating__item" 1306 type="button" 1307 role="radio" 1308 aria-checked="false" 1309 data-rating="1" 1310 aria-label="Ãok memnun deÄilim"> 1311 <!-- inline SVG (fill uses currentColor) --> 1312 <svg xmlns="http://www.w3.org/2000/svg" 1313 width="40" 1314 height="40"
1315 viewBox="0 0 40 40" 1316 fill="none"> 1317 <path fill-rule="evenodd" 1318 clip-rule="evenodd" 1319 d="M20 2.5C29.65 2.5 37.5 10.35 37.5 20C37.5 29.65 29.65 37.5 20 37.5C10.35 37.5 2.5 29.65 2.5 20C2.5 10.35 10.35 2.5 20 2.5ZM20 5C11.7288 5 5 11.7288 5 20C5 28.2712 11.7288 35 20 35C28.2712 35 35 28.2712 35 20C35 11.7288 28.2712 5 20 5ZM20.0025 23.75C24.155 23.76 27.0037 26.4888 27.1225 26.605L25.3813 28.3988C25.3588 28.3775 23.1138 26.2588 20 26.25C16.8863 26.2588 14.6412 28.3775 14.6187 28.3988L12.8775 26.605C12.9975 26.4888 15.845 23.76 19.9975 23.75H20.0025ZM15.625 15C16.66 15 17.5 15.8387 17.5 16.875C17.5 17.9113 16.66 18.75 15.625 18.75C14.59 18.75 13.75 17.9113 13.75 16.875C13.75 15.8387 14.59 15 15.625 15ZM24.375 15C25.41 15 26.25 15.8387 26.25 16.875C26.25 17.9113 25.41 18.75 24.375 18.75C23.34 18.75 22.5 17.9113 22.5 16.875C22.5 15.8387 23.34 15 24.375 15ZM26.3916 9.04225L27.5004 11.2822L22.5129 13.7498L21.4054 11.5098L26.3916 9.04225ZM13.6085 9.04225L18.5947 11.5098L17.4873 13.7498L12.4998 11.2822L13.6085 9.04225Z" 1320 fill="currentColor" /> 1321 </svg> 1322 </button> 1323 1324 <!-- 2 --> 1325 <button class="c-rating__item" 1326 type="button" 1327 role="radio" 1328 aria-checked="false" 1329 data-rating="2" 1330 aria-label="Memnun deÄilim"> 1331 <svg viewBox="0 0 40 40" 1332 width="36" 1333 height="36" 1334 aria-hidden="true" 1335 focusable="false"> 1336 <path fill-rule="evenodd" 1337 clip-rule="evenodd" 1338 d="M20 2.5C29.65 2.5 37.5 10.35 37.5 20C37.5 29.65 29.65 37.5 20 37.5C10.35 37.5 2.5 29.65 2.5 20C2.5 10.35 10.35 2.5 20 2.5ZM20 5C11.7287 5 5 11.7287 5 20C5 28.2713 11.7287 35 20 35C28.2713 35 35 28.2713 35 20C35 11.7287 28.2713 5 20 5ZM20.0027 23.7503C24.1552 23.7603 27.0028 26.489 27.1228 26.6053L25.3802 28.399C25.359 28.3778 23.114 26.259 20.0003 26.2503C16.8865 26.259 14.6415 28.3778 14.619 28.399L12.8778 26.6053C12.9965 26.489 15.8453 23.7603 19.9978 23.7503H20.0027ZM15.625 13.75C16.66 13.75 17.5 14.5888 17.5 15.625C17.5 16.6612 16.66 17.5 15.625 17.5C14.59 17.5 13.75 16.6612 13.75 15.625C13.75 14.5888 14.59 13.75 15.625 13.75ZM24.375 13.75C25.41 13.75 26.25 14.5888 26.25 15.625C26.25 16.6612 25.41 17.5 24.375 17.5C23.34 17.5 22.5 16.6612 22.5 15.625C22.5 14.5888 23.34 13.75 24.375 13.75Z" 1339 fill="currentColor" /> 1340 </svg> 1341 </button> 1342 1343 <!-- 3 --> 1344 <button class="c-rating__item" 1345 type="button" 1346 role="radio" 1347 aria-checked="false" 1348 data-rating="3" 1349 aria-label="Kararsızım"> 1350 <svg viewBox="0 0 40 40" 1351 width="36" 1352 height="36" 1353 aria-hidden="true" 1354 focusable="false"> 1355 <path fill-rule="evenodd" 1356 clip-rule="evenodd" 1357 d="M20 2.5C29.65 2.5 37.5 10.35 37.5 20C37.5 29.65 29.65 37.5 20 37.5C10.35 37.5 2.5 29.65 2.5 20C2.5 10.35 10.35 2.5 20 2.5ZM20 5C11.7287 5 5 11.7287 5 20C5 28.2713 11.7287 35 20 35C28.2713 35 35 28.2713 35 20C35 11.7287 28.2713 5 20 5ZM26.25 23.75V26.25H13.75V23.75H26.25ZM15.625 13.75C16.66 13.75 17.5 14.5888 17.5 15.625C17.5 16.6612 16.66 17.5 15.625 17.5C14.59 17.5 13.75 16.6612 13.75 15.625C13.75 14.5888 14.59 13.75 15.625 13.75ZM24.375 13.75C25.41 13.75 26.25 14.5888 26.25 15.625C26.25 16.6612 25.41 17.5 24.375 17.5C23.34 17.5 22.5 16.6612 22.5 15.625C22.5 14.5888 23.34 13.75 24.375 13.75Z" 1358 fill="currentColor" /> 1359 </svg> 1360 </button> 1361 1362 <!-- 4 --> 1363 <button class="c-rating__item" 1364 type="button" 1365 role="radio" 1366 aria-checked="false" 1367 data-rating="4" 1368 aria-label="Memnunum"> 1369 <svg viewBox="0 0 40 40" 1370 width="36" 1371 height="36" 1372 aria-hidden="true" 1373 focusable="false"> 1374 <path fill-rule="evenodd" 1375 clip-rule="evenodd" 1376 d="M20 2.5C29.65 2.5 37.5 10.35 37.5 20C37.5 29.65 29.65 37.5 20 37.5C10.35 37.5 2.5 29.65 2.5 20C2.5 10.35 10.35 2.5 20 2.5ZM20 5C11.7287 5 5 11.7287 5 20C5 28.2713 11.7287 35 20 35C28.2713 35 35 28.2713 35 20C35 11.7287 28.2713 5 20 5ZM25.381 22.851L27.1222 24.6447C22.4397 29.1847 15.9735 27.646 12.8772 24.6447L14.6197 22.851C16.586 24.7085 21.4335 26.5797 25.381 22.851ZM15.625 13.75C16.66 13.75 17.5 14.5888 17.5 15.625C17.5 16.6612 16.66 17.5 15.625 17.5C14.59 17.5 13.75 16.6612 13.75 15.625C13.75 14.5888 14.59 13.75 15.625 13.75ZM24.375 13.75C25.41 13.75 26.25 14.5888 26.25 15.625C26.25 16.6612 25.41 17.5 24.375 17.5C23.34 17.5 22.5 16.6612 22.5 15.625C22.5 14.5888 23.34 13.75 24.375 13.75Z" 1377 fill="currentColor" /> 1378 </svg> 1379 </button> 1380 1381 <!-- 5 --> 1382 <button class="c-rating__item is-selected" 1383 type="button" 1384 role="radio" 1385 aria-checked="true" 1386 data-rating="5" 1387 aria-label="Ãok memnunum"> 1388 <svg viewBox="0 0 40 40" 1389 width="36" 1390 height="36" 1391 aria-hidden="true" 1392 focusable="false"> 1393 <path fill-rule="evenodd" 1394 clip-rule="evenodd" 1395 d="M20 2.5C29.65 2.5 37.5 10.35 37.5 20C37.5 29.65 29.65 37.5 20 37.5C10.35 37.5 2.5 29.65 2.5 20C2.5 10.35 10.35 2.5 20 2.5ZM20 5C11.7288 5 5 11.7288 5 20C5 28.2712 11.7288 35 20 35C28.2712 35 35 28.2712 35 20C35 11.7288 28.2712 5 20 5ZM25.381 22.851L27.1222 24.6447C22.4397 29.1847 15.9735 27.646 12.8772 24.6447L14.6198 22.851C16.586 24.7085 21.4335 26.5798 25.381 22.851ZM15.3124 13.1249C15.9624 12.0711 18.1249 12.2811 18.1249 14.2836C18.1249 15.9586 16.1574 17.1174 15.5136 17.4511C15.3886 17.5161 15.2374 17.5161 15.1111 17.4511C14.4674 17.1174 12.4999 15.9586 12.4999 14.2836C12.4999 12.2811 14.6636 12.0711 15.3124 13.1249ZM24.6874 13.1249C25.3374 12.0711 27.4999 12.2811 27.4999 14.2836C27.4999 15.9586 25.5324 17.1174 24.8886 17.4511C24.7636 17.5161 24.6124 17.5161 24.4861 17.4511C23.8424 17.1174 21.8749 15.9586 21.8749 14.2836C21.8749 12.2811 24.0386 12.0711 24.6874 13.1249Z" 1396 fill="currentColor" /> 1397 </svg> 1398 </button> 1399 </div> 1400 1401 <div class="c-field"> 1402 <label for="survey-comment" class="c-field__label">Açıklama</label> 1403 <textarea id="survey-comment" 1404 class="c-textarea" 1405 maxlength="140" 1406 placeholder="GörüÅünüzü yazın..."></textarea> 1407 <div class="c-counter" aria-live="polite">
1408 <span id="char-count">0</span>/140 1409 </div> 1410 </div> 1411 </div> 1412 </div> 1413 1414 <div class="c-modal__footer"> 1415 <button class="c-btn c-btn--primary" type="button" data-submit-survey> 1416 Gönder 1417 </button> 1418 </div> 1419 </div> 1420 </div>`; 1421 1422 _self.appendMsg(template); 1423 $('html').css('overflow', 'hidden'); 1424 1425 _selectedRating = '5'; 1426 } 1427 else if (componentId == 99) { 1428 var template = '<article class="left"><div class="avatar"><img src="/assets/img/operator2.png" alt="" srcset="/assets/img/operator2.png 1x, /assets/img/[email protected] 2x"></div><div class="bubble"><img class="hat" src="/assets/img/hat-left.png" alt="" srcset="/assets/img/hat-left.png 1x, /assets/img/[email protected] 2x"><p>## TEXT ##</p></div></article>'; 1429 1430 var msg = _self.renderEmoji(payload.text); 1431 var output = template.replace('## TEXT ##', msg); 1432 1433 _self.appendMsg(output); 1434 1435 } 1436 else { 1437 _self.errorComment(); 1438 } 1439 1440 } 1441 1442 this.closingMessage = function () { 1443 _self.renderTemplate({ text: 'Ben Åimdilik gidiyorum, tekrar konuÅmak isterseniz INGo butonuna basmanız yeterli :)' }, 5); 1444 } 1445 1446 this.liveChatWelcomeMessage = function () { 1447 _self.renderTemplate({ text: 'Size yardımcı olması için hemen Canlı Destek ekibinden bir arkadaÅımı çaÄırıyorum.' }, 5); 1448 }; 1449 1450 this.agentMessage = function (message) { 1451 _self.renderTemplate({ text: message }, 99); 1452 } 1453 1454 this.userMessage = function (message) { 1455 _self.rightComment(message); 1456 } 1457 1458 this.appendMsg = function (output) { 1459 $('#chat .view').append(output); 1460 _self.fixScreen(); 1461 } 1462 1463 this.fixScreen = function () { 1464 _self.scrollToBottom(); 1465 var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 1466 if (!iOS) { 1467 $('#chat .chatmsg').get(0).focus(); 1468 } 1469 } 1470 1471 this.getUrlTarget = function (url) { 1472 var a = new RegExp('/' + window.location.host + '/'); 1473 if (!a.test(url)) { 1474 return '_blank'; 1475 } 1476 1477 return '_self'; 1478 } 1479 1480 this.renderButtons = function (payload) { 1481 var webUrlTemplate = '<li><a href="## LINK ##" target="## TARGET ##" data-action="## ACTION ##" class="orange weburl">## TEXT ##</a></li>'; 1482 var postbackTemplate = '<li><a href="#" class="orange" data-payload="## PAYLOAD ##" data-action="## ACTION ##">## TEXT ##</a></li>'; 1483 var buttons = ''; 1484 1485 if (!payload.buttons) 1486 return ''; 1487 1488 for (var i = 0; i < payload.buttons.length; i++) { 1489 var buttonType = payload.buttons[i].type; 1490 if (buttonType == 'showmore') 1491 buttonType = 'postback'; 1492 1493 if (!payload.buttons[i].clickAction) { 1494 payload.buttons[i].clickAction = "undefined"; 1495 } 1496 1497 if (buttonType == 'web_url') { 1498 buttons += webUrlTemplate.replace('## TEXT ##', payload.buttons[i].title).replace('## LINK ##', payload.buttons[i].url).replace('## ACTION ##', payload.buttons[i].clickAction) 1499 .replace('## TARGET ##', _self.getUrlTarget(payload.buttons[i].url)); 1500 } 1501 else if (buttonType == 'postback') { 1502 buttons += postbackTemplate.replace('## TEXT ##', payload.buttons[i].title).replace('## PAYLOAD ##', payload.buttons[i].payload).replace('## ACTION ##', payload.buttons[i].clickAction); 1503 } 1504 } 1505 1506 return buttons; 1507 } 1508 1509 this.addShowAllButton = function () { 1510 var showAllButtonTemplate = '<li>
1510<input type="submit" value="Tümünü Görüntüle" class="orange showAllButton"></li>'; 1511 1512 setTimeout(function () { 1513 $('.showAllButton').on('click', function () { 1514 $(this).closest('.buttons').find('.fxInfoContainer').each(function () { 1515 $(this).removeClass('hidden'); 1516 }); 1517 $(this).closest('li').remove(); 1518 _self.scrollToBottom(); 1519 }); 1520 1521 }, 100); 1522 1523 return showAllButtonTemplate; 1524 } 1525 1526 this.renderQuickReplyButtons = function (payload) { 1527 var postbackTemplate = '<a href="#" data-payload="## PAYLOAD ##" data-postback="## POSTBACK ##"><li>## TEXT ##</li></a>'; 1528 var buttons = ''; 1529 1530 for (var i = 0; i < payload.quick_replies.length; i++) { 1531 var postback = payload.quick_replies[i].content_type === 'text' ? 'N' : 'Y'; 1532 buttons += postbackTemplate.replace('## TEXT ##', payload.quick_replies[i].title) 1533 .replace('## PAYLOAD ##', payload.quick_replies[i].payload) 1534 .replace('## POSTBACK ##', postback); 1535 } 1536 1537 if (buttons) 1538 buttons = '<div class="answers"><ul class="scrollable-list">' + buttons + '</ul></div>'; 1539 1540 return buttons; 1541 } 1542 1543 this.renderListButtons = function (payload, elementsCount, elementOrder) { 1544 var template = '<li class="fxInfoContainer"><div class="fx-info"><img class="fx" src="## IMGURL ##" alt=""><div class="h2">## TITLE ##</div><div class="data"><div class="h3">## SUBTITLE ##</div></div></div>## BUTTONS ##</li>'; 1545 var webUrlTemplate = '<a href="## LINK ##" target="## TARGET ##" class="orange inline-chat-button">## TEXT ##</a>'; 1546 var postbackTemplate = '<a href="#" class="orange inline-chat-button" data-payload="## PAYLOAD ##">## TEXT ##</a>'; 1547 var buttons = ''; 1548 1549 if (elementsCount > 2 && elementOrder > 1) { 1550 template = template.split('fxInfoContainer').join('fxInfoContainer hidden'); 1551 } 1552 1553 for (var i = 0; i < payload.buttons.length; i++) { 1554 if (payload.buttons[i].type == 'web_url') { 1555 buttons += webUrlTemplate.replace('## TEXT ##', payload.buttons[i].title).replace('## LINK ##', payload.buttons[i].url) 1556 .replace('## TARGET ##', _self.getUrlTarget(payload.buttons[i].url)); 1557 } 1558 else if (payload.buttons[i].type == 'postback') { 1559 buttons += postbackTemplate.replace('## TEXT ##', payload.buttons[i].title).replace('## PAYLOAD ##', payload.buttons[i].payload); 1560 } 1561 } 1562 1563 var title = _self.renderEmoji(payload.title); 1564 var subtitle = _self.renderEmoji(payload.subtitle); 1565 1566 var output = template.replace('## TITLE ##', title) 1567 .replace('## IMGURL ##', payload.media_url) 1568 .replace('## SUBTITLE ##', subtitle) 1569 .replace('## BUTTONS ##', buttons); 1570 1571 return output; 1572 } 1573 1574 this.renderCarousel = function (payload) { 1575 var template = '<div class="owl-item"><div class="bubble animate fadeInLeft"><div class="imagebox"><img class="cover" src="## IMGURL ##" alt=""></div><div class="content">## TITLE ##<div class="h3">## SUBTITLE ##</div></div>## BUTTONS ##</div></div>'; 1576 var carousels = ''; 1577 1578 for (var i = 0; i < payload.length; i++) { 1579 var _subtitle = payload[i].subtitle || ''; 1580 var _title = payload[i].title || ''; 1581 1582 if (!_subtitle && _title) { 1583 _subtitle = _title; 1584 _title = ''; 1585 } 1586 else if (_subtitle && _title) { 1587 _title = '<div class="h2">' + _self.h2Fix(_title) + '</div>'; 1588 } 1589 1590 carousels += template.replace('## IMGURL ##', payload[i].media_url) 1591 .replace('## TITLE ##', _title) 1592 .replace('## SUBTITLE ##', _self.h3Fix(_subtitle)); 1593 1594 if (payload[i].buttons) { 1595 1596 var buttons = _self.renderButtons(payload[i]); 1597 if (buttons) { 1598 buttons = '<ul class="buttons">' + buttons + '</ul>'; 1599 carousels = carousels.replace('## BUTTONS ##', buttons); 1600 } 1601 } 1602 } 1603 1604 if (carousels) 1605 carousels = `<div class="carousel owl-loaded owl-drag"><div class="owl-stage-outer"><div class="owl-stage">${carousels}</div></div><div class="owl-nav"><button type="button" role="presentation" class="owl-prev disabled"><span aria-label="Previous">â¹</span></button><button type="button" role="presentation" class="owl-next"><span aria-label="Next">âº</span></button></div></div>`; 1606 1607 return carousels; 1608 } 1609 1610 this.sendLiveSupport = function (pData, successCallback, errorCallback) { 1611 1612 $.ajax({
1613 url: '/ProxyManagement/SiteManagerService_Script.aspx/LiveSupport', 1614 type: "POST", 1615 data: JSON.stringify(pData), 1616 contentType: "application/json; charset=utf-8", 1617 dataType: "json", 1618 cache: false, 1619 success: function (data) { 1620 if (typeof successCallback == 'function') { 1621 successCallback.call(this, data); 1622 } 1623 }, error: function (data) { 1624 if (typeof errorCallback == 'function') { 1625 errorCallback.call(this, data); 1626 } 1627 } 1628 }); 1629 } 1630 1631 this.send = function (pData, successCallback, errorCallback) { 1632 _self.addTyping(); 1633 1634 $.ajax({ 1635 url: '/ProxyManagement/SiteManagerService_Script.aspx/Chat', 1636 type: "POST", 1637 data: JSON.stringify(pData), 1638 contentType: "application/json; charset=utf-8", 1639 dataType: "json", 1640 cache: false, 1641 success: function (data) { 1642 if (typeof successCallback == 'function') { 1643 successCallback.call(this, data); 1644 _self.removeTyping(); 1645 } 1646 }, error: function (data) { 1647 if (typeof errorCallback == 'function') { 1648 errorCallback.call(this, data); 1649 _self.removeTyping(); 1650 } 1651 } 1652 }); 1653 } 1654 1655 this.renderEmoji = function (str) { 1656 emojis.forEach(({ key, value, code }) => { 1657 if (str.includes(key)) { 1658 const replacement = value 1659 ? `<img src="/assets/img/emoji/${value}.png" alt="" class="emoji">` 1660 : code; 1661 str = _self.replaceAll(str, key, replacement); 1662 } 1663 }); 1664 1665 return str.replace(/\n/g, "<br />"); 1666 } 1667 1668 //.. 1669 this.xssFilter = function (str) { 1670 return str.replace("<3", ':heart:') 1671 .replace("<script>", '') 1672 .replace("</script>", '') 1673 .replace(/</g, '') 1674 .replace(/>/g, '') 1675 .replace(/</g, '') 1676 .replace(/>/g, '') 1677 .replace(/</g, '') 1678 .replace(/>/g, ''); 1679 } 1680 1681 this.rightComment = function (msg) { 1682 msg = _self.xssFilter(msg); 1683 1684 const startDatePrefix = 'startDate:'; 1685 if (msg.startsWith(startDatePrefix)) { 1686 const date = msg.split(startDatePrefix)[1]; 1687 msg = (new Date(date)).toLocaleDateString('tr-TR'); 1688 } 1689 1690 var template = '<article class="right"><div class="bubble"><p>## TEXT ##</p><img class="hat" src="/assets/img/hat-right.png" alt="" srcset="/assets/img/hat-right.png 1x, /assets/img/[email protected] 2x"></div><div class="avatar"><img src="/assets/img/avatar.png" alt="" srcset="/assets/img/avatar.png 1x, /assets/img/[email protected] 2x"></div></article>'; 1691 1692 msg = _self.renderEmoji(msg); 1693 1694 if ($('#chat-writing').length && !_insertingHistory) { 1695 $(template.replace('## TEXT ##', msg)).insertBefore("#chat-writing"); 1696 } 1697 else { 1698 $('#chat .view').append(template.replace('## TEXT ##', msg)); 1699 } 1700 1701 $('#chat .chatmsg').val(''); 1702 _self.scrollToBottom(); 1703 1704 IsCompliantRecurrenceMessagePrinted = false; 1705 } 1706 1707 this.errorComment = function () { 1708 _self.renderTemplate({ text: 'Teknik nedenle iÅleminiz gerçekleÅtirilemedi. Lütfen daha sonra tekrar deneyin.' }, 5); 1709 } 1710 1711 this.scrollToBottom = function () { 1712 if ($('#chat .scroll .view').length) { 1713 $('#chat .scroll .view').scrollTop($('#chat .scroll .view').get(0).scrollHeight); 1714 } 1715 } 1716 1717 this.clearTimeCounter = function () { 1718 if (_timeInterval != null) 1719 clearInterval(_timeInterval); 1720 1721 $('#chat .view .otpbox').remove(); 1722 _otpWindow = false; 1723 } 1724 1725 this.showLoading = function () { 1726 $('#chat .view').append('<article class="loading"><img src="/assets/img/loader_icon_gif.gif"></article>'); 1727 $('#chat .chatmsg').prop('readonly', true); 1728 $('#chat .chatinput').addClass('disabled') 1729 _self.scrollToBottom(); 1730 } 1731 1732 this.hideLoading = function () { 1733 if (!_otpWindow) { 1734 $('#chat .chatmsg').prop('readonly', false); 1735 $('#chat .chatinput').removeClass('disabled') 1736 } 1737 $('#chat .loading').remove(); 1738 } 1739 1740 this.h2Fix = function (str) { 1741 var len = str.length; 1742 if (len > 30) {
1743 return str.substr(0, 30) + '...'; 1744 } 1745 return str; 1746 } 1747 1748 this.h3Fix = function (str) { 1749 var len = str.length; 1750 if (len > 80) { 1751 return str.substr(0, 80) + '...'; 1752 } 1753 return str; 1754 } 1755 1756 this.replaceAll = function (str, search, replacement) { 1757 return str.split(search).join(replacement); 1758 } 1759 1760 this.queryString = function (name) { 1761 name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 1762 var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 1763 results = regex.exec(location.search); 1764 return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 1765 } 1766 1767 this.setIngoMode = function (mode) { 1768 $.cookie('ingomode', mode, { path: '/', expires: 1, secure: true }); 1769 } 1770 1771 this.getIngoMode = function () { 1772 if (typeof $.cookie('ingomode') === 'undefined') 1773 _self.setIngoMode('default'); 1774 1775 return $.cookie('ingomode'); 1776 } 1777 1778 this.setCBUNQID = function (id) { 1779 var date = new Date(); 1780 var days = 365; 1781 date.setTime(date.getTime() + (days * 8640000)); 1782 $.cookie('CBUNQID', id, { path: '/', expires: date, secure: true, domain: '.ing.com.tr' }); 1783 } 1784 1785 this.checkCBUNQID = function () { 1786 var index = document.cookie.indexOf('CBUNQID='); 1787 return index == -1; 1788 } 1789 1790 this.generateUNQID = function () { 1791 var d = new Date().getTime(); 1792 if (typeof performance !== 'undefined' && typeof performance.now === 'function') { 1793 d += performance.now(); 1794 } 1795 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 1796 var r = (d + _self.cryptoRandom() * 16) % 16 | 0; 1797 d = Math.floor(d / 16); 1798 return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); 1799 }); 1800 } 1801 1802 this.cryptoRandom = function () { 1803 var cryptoObj = window.crypto || window.msCrypto; 1804 var array = new Uint32Array(1), 1805 max = Math.pow(2, 32), 1806 randomValue = cryptoObj.getRandomValues(array)[0] / max; 1807 1808 return randomValue; 1809 } 1810 1811 this.hideIngoContainer = function () { 1812 $("#INGo-container").removeClass("on"); 1813 $("#question-mark").removeClass("active"); 1814 $("#question-mark").addClass("passive"); 1815 $('#chat #minimize').show(); 1816 } 1817 1818 this.showIngoContainer = function () { 1819 1820 $("#INGo-container").addClass("on"); 1821 $("#question-mark").addClass("active"); 1822 $("#question-mark").removeClass("passive"); 1823 $('#chat #minimize').hide(); 1824 } 1825 } 1826 1827 $(function () { 1828 var chat = new Chat(); 1829 chat.initialize(); 1830 }); 1831})(jQuery);
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.