PageSourceSearch

https://www.ing.com.tr/assets/scripts/ingbank.chat.js?v=20260918

js ing.com.tr collected 2026-09-24 09:15:08 UTC 83,962 bytes, 1,831 lines download raw bytes

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(/&lt;/g, '')
1676                .replace(/&gt;/g, '')
1677                .replace(/&#x3C;/g, '')
1678                .replace(/&#x3E;/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.