1/** 2 * Frontend JavaScript for MAX WIDGET. 3 */ 4 5(function($) { 6 'use strict'; 7 8 var MaxMessenger = { 9 init: function() { 10 this.setupFloatingWidget(); 11 this.setupMessengerLinks(); 12 this.detectMobile(); 13 }, 14 15 detectMobile: function() { 16 var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 17 18 if (isMobile) { 19 $('body').addClass('max-msg-mobile-device'); 20 } 21 22 return isMobile; 23 }, 24 25 setupFloatingWidget: function() { 26 var $floatBtn = $('#maxMsgFloatBtn'); 27 var $floatMenu = $('#maxMsgFloatMenu'); 28 var $menuClose = $('#maxMsgMenuClose'); 29 var isMenuOpen = false; 30 31 if (!$floatBtn.length || !$floatMenu.length) { 32 return; 33 } 34 35 $floatBtn.on('click', function(e) { 36 e.preventDefault(); 37 e.stopPropagation(); 38 39 if (isMenuOpen) { 40 MaxMessenger.closeFloatMenu($floatMenu, $floatBtn); 41 isMenuOpen = false; 42 } else { 43 MaxMessenger.openFloatMenu($floatMenu, $floatBtn); 44 isMenuOpen = true; 45 } 46 }); 47 48 $menuClose.on('click', function(e) { 49 e.preventDefault(); 50 e.stopPropagation(); 51 MaxMessenger.closeFloatMenu($floatMenu, $floatBtn); 52 isMenuOpen = false; 53 }); 54 55 $(document).on('click', function(e) { 56 if (isMenuOpen && !$(e.target).closest('.max-msg-floating-widget').length) { 57 MaxMessenger.closeFloatMenu($floatMenu, $floatBtn); 58 isMenuOpen = false; 59 } 60 }); 61 62 $(document).on('keydown', function(e) { 63 if (e.key === 'Escape' && isMenuOpen) { 64 MaxMessenger.closeFloatMenu($floatMenu, $floatBtn); 65 isMenuOpen = false; 66 } 67 }); 68 }, 69 70 openFloatMenu: function($menu, $button) { 71 $menu.fadeIn(220); 72 $button.attr('aria-expanded', 'true'); 73 }, 74 75 closeFloatMenu: function($menu, $button) { 76 $menu.fadeOut(180); 77 $button.attr('aria-expanded', 'false'); 78 }, 79 80 setupMessengerLinks: function() { 81 var self = this; 82 83 $(document).on('click', 'a[data-messenger]', function(e) { 84 var $link = $(this); 85 var messenger = $link.attr('data-messenger'); 86 var href = $link.attr('href'); 87 88 if (!messenger || !href || href === '#') { 89 return; 90 } 91 92 e.preventDefault(); 93 self.openMessenger(messenger, href); 94 }); 95 }, 96 97 openMessenger: function(messenger, url) { 98 var isMobile = this.detectMobile(); 99 100 if (messenger === 'telegram') { 101 this.openTelegram(url, isMobile); 102 } else if (messenger === 'whatsapp') { 103 this.openWhatsApp(url, isMobile); 104 } else if (messenger === 'phone') { 105 window.location.href = url; 106 } else if (messenger === 'email') { 107 window.location.href = url; 108 } else { 109 window.open(url, '_blank', 'noopener'); 110 } 111 112 this.trackClick(messenger, url); 113 }, 114 115 openTelegram: function(url, isMobile) { 116 var username = url.replace('https://t.me/', '').split('?')[0]; 117 118 if (isMobile) { 119 var appUrl = 'tg://resolve?domain=' + username; 120 var $iframe = $('<iframe>', { 121 src: appUrl, 122 style: 'display:none;' 123 }).appendTo('body'); 124 125 setTimeout(function() { 126 $iframe.remove(); 127 }, 900); 128 129 setTimeout(function() { 130 window.open(url, '_blank', 'noopener'); 131 }, 500); 132 } else { 133 window.open(url, '_blank', 'noopener'); 134 } 135 }, 136 137 openWhatsApp: function(url, isMobile) { 138 if (!isMobile) { 139 window.open(url, '_blank', 'noopener'); 140 return; 141 } 142 143 var isAndroid = /Android/i.test(navigator.userAgent); 144 var isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent); 145 146 if (!isAndroid && !isIOS) { 147 window.open(url, '_blank', 'noopener'); 148 return; 149 } 150 151 var parts = url.split('?'); 152 var number = parts[0].replace('https://wa.me/', ''); 153 var message = ''; 154 155 if (parts.length > 1) { 156 var params = new URLSearchParams(parts[1]); 157 message = params.get('text') || ''; 158 } 159 160 var appUrl = 'whatsapp://send?phone=' + number; 161 if (message) { 162 appUrl += '&text=' + encodeURIComponent(message); 163 } 164 165 window.location.href = appUrl; 166 167 setTimeout(function() { 168 window.open(url, '_blank', 'noopener'); 169 }, 1300); 170 }, 171 172 trackClick: function(messenger, url) { 173 if (typeof gtag !== 'undefined') { 174 gtag('event', 'messenger_click', { 175 messenger_type: messenger, 176 messenger_url: url 177 }); 178 } 179 180 if (typeof ym !== 'undefined' && typeof window.yaCounterId !== 'undefined') { 181 ym(window.yaCounterId, 'reachGoal', 'messenger_' + messenger); 182 } 183 184 if (window.console && console.log) { 185 console.log('MAX WIDGET:', messenger, url); 186 } 187 } 188 }; 189 190 $(document).ready(function() { 191 MaxMessenger.init(); 192 }); 193 194 window.MaxMessenger = MaxMessenger; 195})(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.