(function(window) { (function(window){ window.__parseFunction = function(__func, __attrs) { __attrs = __attrs || []; __func = '(function(' + __attrs.join(',') + '){' + __func + '})'; return window.execScript ? window.execScript(__func) : eval(__func); } }(window)); (function(window){ function addEvent(el, event, handler) { var events = event.split(/\s+/); for (var i = 0; i < events.length; i++) { if (el.addEventListener) { el.addEventListener(events[i], handler); } else { el.attachEvent('on' + events[i], handler); } } } function removeEvent(el, event, handler) { var events = event.split(/\s+/); for (var i = 0; i < events.length; i++) { if (el.removeEventListener) { el.removeEventListener(events[i], handler); } else { el.detachEvent('on' + events[i], handler); } } } function getCssProperty(el, prop) { if (window.getComputedStyle) { return window.getComputedStyle(el, '').getPropertyValue(prop) || null; } else if (el.currentStyle) { return el.currentStyle[prop] || null; } return null; } function geById(el_or_id) { if (typeof el_or_id == 'string' || el_or_id instanceof String) { return document.getElementById(el_or_id); } else if (el_or_id instanceof HTMLElement) { return el_or_id; } return null; } var getWidgetsOrigin = function(default_origin, dev_origin) { var link = document.createElement('A'), origin; link.href = document.currentScript && document.currentScript.src || default_origin; origin = link.origin || link.protocol + '//' + link.hostname; if (origin == 'https://telegram.org') { origin = default_origin; } else if (origin == 'https://telegram-js.azureedge.net' || origin == 'https://tg.dev') { origin = dev_origin; } return origin; }; var getPageCanonical = function() { var a = document.createElement('A'), link, href; if (document.querySelector) { link = document.querySelector('link[rel="canonical"]'); if (link && (href = link.getAttribute('href'))) { a.href = href; return a.href; } } else { var links = document.getElementsByTagName('LINK'); for (var i = 0; i < links.length; i++) { if ((link = links[i]) && (link.getAttribute('rel') == 'canonical') && (href = link.getAttribute('href'))) { a.href = href; return a.href; } } } return false; }; function haveTgAuthResult() { var locationHash = '', re = /[#\?\&]tgAuthResult=([A-Za-z0-9\-_=]*)$/, match; try { locationHash = location.hash.toString(); if (match = locationHash.match(re)) { location.hash = locationHash.replace(re, ''); var data = match[1] || ''; data = data.replace(/-/g, '+').replace(/_/g, '/'); var pad = data.length % 4; if (pad > 1) { data += new Array(5 - pad).join('='); } return JSON.parse(window.atob(data)); } } catch (e) {} return false; } function getXHR() { if (navigator.appName == "Microsoft Internet Explorer"){ return new ActiveXObject("Microsoft.XMLHTTP"); } else { return new XMLHttpRequest(); } } if (!window.Telegram) { window.Telegram = {}; } if (!window.Telegram.__WidgetUuid) { window.Telegram.__WidgetUuid = 0; } if (!window.Telegram.__WidgetLastId) { window.Telegram.__WidgetLastId = 0; } if (!window.Telegram.__WidgetCallbacks) { window.Telegram.__WidgetCallbacks = {}; } function postMessageToIframe(iframe, event, data, callback) { if (!iframe._ready) { if (!iframe._readyQueue) iframe._readyQueue = []; iframe._readyQueue.push([event, data, callback]); return; } try { data = data || {}; data.event = event; if (callback) { data._cb = ++window.Telegram.__WidgetLastId; window.Telegram.__WidgetCallbacks[data._cb] = { iframe: iframe, callback: callback }; } iframe.contentWindow.postMessage(JSON.stringify(data), '*'); } catch(e) {} } function initWidget(widgetEl) { var widgetId, widgetElId, widgetsOrigin, existsEl, src, styles = {}, allowedAttrs = [], defWidth, defHeight, scrollable = false, onInitAuthUser, onAuthUser, onUnauth; if (!widgetEl.tagName || !(widgetEl.tagName.toUpperCase() == 'SCRIPT' || widgetEl.tagName.toUpperCase() == 'BLOCKQUOTE' && widgetEl.classList.contains('telegram-post'))) { return null; } if (widgetEl._iframe) { return widgetEl._iframe; } if (widgetId = widgetEl.getAttribute('data-telegram-post')) { var comment = widgetEl.getAttribute('data-comment') || ''; widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev'); widgetElId = 'telegram-post-' + widgetId.replace(/[^a-z0-9_]/ig, '-') + (comment ? '-comment' + comment : ''); src = widgetsOrigin + '/' + widgetId + '?embed=1'; allowedAttrs = ['comment', 'userpic', 'mode', 'single?', 'color', 'dark', 'dark_color']; defWidth = widgetEl.getAttribute('data-width') || '100%'; defHeight = ''; styles.minWidth = '320px'; } else if (widgetId = widgetEl.getAttribute('data-telegram-discussion')) { widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev'); widgetElId = 'telegram-discussion-' + widgetId.replace(/[^a-z0-9_]/ig, '-') + '-' + (++window.Telegram.__WidgetUuid); var websitePageUrl = widgetEl.getAttribute('data-page-url'); if (!websitePageUrl) { websitePageUrl = getPageCanonical(); } src = widgetsOrigin + '/' + widgetId + '?embed=1&discussion=1' + (websitePageUrl ? '&page_url=' + encodeURIComponent(websitePageUrl) : ''); allowedAttrs = ['comments_limit', 'color', 'colorful', 'dark', 'dark_color', 'width', 'height']; defWidth = widgetEl.getAttribute('data-width') || '100%'; defHeight = widgetEl.getAttribute('data-height') || 0; styles.minWidth = '320px'; if (defHeight > 0) { scrollable = true; } } else if (widgetEl.hasAttribute('data-telegram-login')) { widgetId = widgetEl.getAttribute('data-telegram-login'); widgetsOrigin = getWidgetsOrigin('https://oauth.telegram.org', 'https://oauth.tg.dev'); widgetElId = 'telegram-login-' + widgetId.replace(/[^a-z0-9_]/ig, '-'); src = widgetsOrigin + '/embed/' + widgetId + '?origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname) + '&return_to=' + encodeURIComponent(location.href); allowedAttrs = ['size', 'userpic', 'init_auth', 'request_access', 'radius', 'min_width', 'max_width', 'lang']; defWidth = 186; defHeight = 28; if (widgetEl.hasAttribute('data-size')) { var size = widgetEl.getAttribute('data-size'); if (size == 'small') defWidth = 148, defHeight = 20; else if (size == 'large') defWidth = 238, defHeight = 40; } if (widgetEl.hasAttribute('data-onauth')) { onInitAuthUser = onAuthUser = __parseFunction(widgetEl.getAttribute('data-onauth'), ['user']); } else if (widgetEl.hasAttribute('data-auth-url')) { var a = document.createElement('A'); a.href = widgetEl.getAttribute('data-auth-url'); onAuthUser = function(user) { var authUrl = a.href; authUrl += (authUrl.indexOf('?') >= 0) ? '&' : '?'; var params = []; for (var key in user) { params.push(key + '=' + encodeURIComponent(user[key])); } authUrl += params.join('&'); location.href = authUrl; }; } if (widgetEl.hasAttribute('data-onunauth')) { onUnauth = __parseFunction(widgetEl.getAttribute('data-onunauth')); } var auth_result = haveTgAuthResult(); if (auth_result && onAuthUser) { onAuthUser(auth_result); } } else if (widgetId = widgetEl.getAttribute('data-telegram-share-url')) { widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev'); widgetElId = 'telegram-share-' + window.btoa(widgetId); src = widgetsOrigin + '/share/embed?origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname); allowedAttrs = ['telegram-share-url', 'comment', 'size', 'text']; defWidth = 60; defHeight = 20; if (widgetEl.getAttribute('data-size') == 'large') { defWidth = 76; defHeight = 28; } } else { return null; } existsEl = document.getElementById(widgetElId); if (existsEl) { return existsEl; } for (var i = 0; i < allowedAttrs.length; i++) { var attr = allowedAttrs[i]; var novalue = attr.substr(-1) == '?'; if (novalue) { attr = attr.slice(0, -1); } var data_attr = 'data-' + attr.replace(/_/g, '-'); if (widgetEl.hasAttribute(data_attr)) { var attr_value = novalue ? '1' : encodeURIComponent(widgetEl.getAttribute(data_attr)); src += '&' + attr + '=' + attr_value; } } function getCurCoords(iframe) { var docEl = document.documentElement; var frect = iframe.getBoundingClientRect(); return { frameTop: frect.top, frameBottom: frect.bottom, frameLeft: frect.left, frameRight: frect.right, frameWidth: frect.width, frameHeight: frect.height, scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, clientWidth: docEl.clientWidth, clientHeight: docEl.clientHeight }; } function visibilityHandler() { if (isVisible(iframe, 50)) { postMessageToIframe(iframe, 'visible', {frame: widgetElId}); } } function focusHandler() { postMessageToIframe(iframe, 'focus', {has_focus: document.hasFocus()}); } function postMessageHandler(event) { if (event.source !== iframe.contentWindow || event.origin != widgetsOrigin) { return; } try { var data = JSON.parse(event.data); } catch(e) { var data = {}; } if (data.event == 'resize') { if (data.height) { iframe.style.height = data.height + 'px'; } if (data.width) { iframe.style.width = data.width + 'px'; } } else if (data.event == 'ready') { iframe._ready = true; focusHandler(); for (var i = 0; i < iframe._readyQueue.length; i++) { var queue_item = iframe._readyQueue[i]; postMessageToIframe(iframe, queue_item[0], queue_item[1], queue_item[2]); } iframe._readyQueue = []; } else if (data.event == 'visible_off') { removeEvent(window, 'scroll', visibilityHandler); removeEvent(window, 'resize', visibilityHandler); } else if (data.event == 'get_coords') { postMessageToIframe(iframe, 'callback', { _cb: data._cb, value: getCurCoords(iframe) }); } else if (data.event == 'scroll_to') { try { window.scrollTo(data.x || 0, data.y || 0); } catch(e) {} } else if (data.event == 'auth_user') { if (data.init) { onInitAuthUser && onInitAuthUser(data.auth_data); } else { onAuthUser && onAuthUser(data.auth_data); } } else if (data.event == 'unauthorized') { onUnauth && onUnauth(); } else if (data.event == 'callback') { var cb_data = null; if (cb_data = window.Telegram.__WidgetCallbacks[data._cb]) { if (cb_data.iframe === iframe) { cb_data.callback(data.value); delete window.Telegram.__WidgetCallbacks[data._cb]; } } else { console.warn('Callback #' + data._cb + ' not found'); } } } var iframe = document.createElement('iframe'); iframe.id = widgetElId; iframe.src = src; iframe.width = defWidth; iframe.height = defHeight; iframe.setAttribute('frameborder', '0'); if (!scrollable) { iframe.setAttribute('scrolling', 'no'); iframe.style.overflow = 'hidden'; } iframe.style.colorScheme = 'light dark'; iframe.style.border = 'none'; for (var prop in styles) { iframe.style[prop] = styles[prop]; } if (widgetEl.parentNode) { widgetEl.parentNode.insertBefore(iframe, widgetEl); if (widgetEl.tagName.toUpperCase() == 'BLOCKQUOTE') { widgetEl.parentNode.removeChild(widgetEl); } } iframe._ready = false; iframe._readyQueue = []; widgetEl._iframe = iframe; addEvent(iframe, 'load', function() { removeEvent(iframe, 'load', visibilityHandler); addEvent(window, 'scroll', visibilityHandler); addEvent(window, 'resize', visibilityHandler); visibilityHandler(); }); addEvent(window, 'focus blur', focusHandler); addEvent(window, 'message', postMessageHandler); return iframe; } function isVisible(el, padding) { var node = el, val; var visibility = getCssProperty(node, 'visibility'); if (visibility == 'hidden') return false; while (node) { if (node === document.documentElement) break; var display = getCssProperty(node, 'display'); if (display == 'none') return false; var opacity = getCssProperty(node, 'opacity'); if (opacity !== null && opacity < 0.1) return false; node = node.parentNode; } if (el.getBoundingClientRect) { padding = +padding || 0; var rect = el.getBoundingClientRect(); var html = document.documentElement; if (rect.bottom < padding || rect.right < padding || rect.top > (window.innerHeight || html.clientHeight) - padding || rect.left > (window.innerWidth || html.clientWidth) - padding) { return false; } } return true; } function getAllWidgets() { var widgets = []; if (document.querySelectorAll) { widgets = document.querySelectorAll('script[data-telegram-post],blockquote.telegram-post,script[data-telegram-discussion],script[data-telegram-login],script[data-telegram-share-url]'); } else { widgets = Array.prototype.slice.apply(document.getElementsByTagName('SCRIPT')); widgets = widgets.concat(Array.prototype.slice.apply(document.getElementsByTagName('BLOCKQUOTE'))); } return widgets; } function getWidgetInfo(el_or_id, callback) { var e = null, iframe = null; if (el = geById(el_or_id)) { if (el.tagName && el.tagName.toUpperCase() == 'IFRAME') { iframe = el; } else if (el._iframe) { iframe = el._iframe; } if (iframe && callback) { postMessageToIframe(iframe, 'get_info', {}, callback); } } } function setWidgetOptions(options, el_or_id) { var e = null, iframe = null; if (typeof el_or_id === 'undefined') { var widgets = getAllWidgets(); for (var i = 0; i < widgets.length; i++) { if (iframe = widgets[i]._iframe) { postMessageToIframe(iframe, 'set_options', {options: options}); } } } else { if (el = geById(el_or_id)) { if (el.tagName && el.tagName.toUpperCase() == 'IFRAME') { iframe = el; } else if (el._iframe) { iframe = el._iframe; } if (iframe) { postMessageToIframe(iframe, 'set_options', {options: options}); } } } } if (!document.currentScript || !initWidget(document.currentScript)) { var widgets = getAllWidgets(); for (var i = 0; i < widgets.length; i++) { initWidget(widgets[i]); } } var TelegramLogin = { popups: {}, options: null, auth_callback: null, _init: function(options, auth_callback) { TelegramLogin.options = options; TelegramLogin.auth_callback = auth_callback; var auth_result = haveTgAuthResult(); if (auth_result && auth_callback) { auth_callback(auth_result); } }, _open: function(callback) { TelegramLogin._auth(TelegramLogin.options, function(authData) { if (TelegramLogin.auth_callback) { TelegramLogin.auth_callback(authData); } if (callback) { callback(authData); } }); }, _auth: function(options, callback) { var bot_id = parseInt(options.bot_id); if (!bot_id) { throw new Error('Bot id required'); } var width = 550; var height = 470; var left = Math.max(0, (screen.width - width) / 2) + (screen.availLeft | 0), top = Math.max(0, (screen.height - height) / 2) + (screen.availTop | 0); var onMessage = function (event) { try { var data = JSON.parse(event.data); } catch(e) { var data = {}; } if (!TelegramLogin.popups[bot_id]) return; if (event.source !== TelegramLogin.popups[bot_id].window) return; if (data.event == 'auth_result') { onAuthDone(data.result); } }; var onAuthDone = function (authData) { if (!TelegramLogin.popups[bot_id]) return; if (TelegramLogin.popups[bot_id].authFinished) return; callback && callback(authData); TelegramLogin.popups[bot_id].authFinished = true; removeEvent(window, 'message', onMessage); }; var checkClose = function(bot_id) { if (!TelegramLogin.popups[bot_id]) return; if (!TelegramLogin.popups[bot_id].window || TelegramLogin.popups[bot_id].window.closed) { return TelegramLogin.getAuthData(options, function(origin, authData) { onAuthDone(authData); }); } setTimeout(checkClose, 100, bot_id); } var popup_url = Telegram.Login.widgetsOrigin + '/auth?bot_id=' + encodeURIComponent(options.bot_id) + '&origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname) + (options.request_access ? '&request_access=' + encodeURIComponent(options.request_access) : '') + (options.lang ? '&lang=' + encodeURIComponent(options.lang) : '') + '&return_to=' + encodeURIComponent(location.href); var popup = window.open(popup_url, 'telegram_oauth_bot' + bot_id, 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + ',status=0,location=0,menubar=0,toolbar=0'); TelegramLogin.popups[bot_id] = { window: popup, authFinished: false }; if (popup) { addEvent(window, 'message', onMessage); popup.focus(); checkClose(bot_id); } }, getAuthData: function(options, callback) { var bot_id = parseInt(options.bot_id); if (!bot_id) { throw new Error('Bot id required'); } var xhr = getXHR(); var url = Telegram.Login.widgetsOrigin + '/auth/get'; xhr.open('POST', url); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (typeof xhr.responseBody == 'undefined' && xhr.responseText) { try { var result = JSON.parse(xhr.responseText); } catch(e) { var result = {}; } if (result.user) { callback(result.origin, result.user); } else { callback(result.origin, false); } } else { callback('*', false); } } }; xhr.onerror = function() { callback('*', false); }; xhr.withCredentials = true; xhr.send('bot_id=' + encodeURIComponent(options.bot_id) + (options.lang ? '&lang=' + encodeURIComponent(options.lang) : '')); } }; window.Telegram.getWidgetInfo = getWidgetInfo; window.Telegram.setWidgetOptions = setWidgetOptions; window.Telegram.Login = { init: TelegramLogin._init, open: TelegramLogin._open, auth: TelegramLogin._auth, widgetsOrigin: getWidgetsOrigin('https://oauth.telegram.org', 'https://oauth.tg.dev') }; }(window)); })(window);