function Panaur(outside_settings) { var settings = outside_settings || []; var tags = []; this.getTags = function () { return tags.concat(_panaur._addTags); }; this.status = 0; this.getStatus = function () { // false - not supported // 1 - allow // -1 - deny // 0 - dont know return _panaur.status; }; this.init = function () { events.showPrompt = [_panaur.showPrompt]; events.onAllow = [function () { this.status = 1; }, function () { //_panaur.closePrompt() }]; events.onDeny = [function () { this.status = -1; }]; events.onNonSupport = [function () { this.status = false; }]; events.onInit = []; events.start = [this.start]; events.unSubscribe = [this.uns]; for (var i = 0; i < settings.length; i++) { var name = settings[i][0]; if (name == 'settings' || name=='setting') { var key = settings[i][1]; var value = settings[i][2]; if (key == 'autostart') { is_auto_start = value; continue; } if (key == 'setTag') { tags.push(value); continue; } } if (name in events) { events[name].push(settings[i][1]); } } this.start(); }; this.fire = function (event, values) { var values = values || {}; if (event in events) { for (var i = 0; i < events[event].length; i++) { if (!events[event][i](values)) { //return false; } } } }; var events = { }; this._sid = false; this.getSid = function () { return _panaur._sid; }; this._addTags = []; this.addTag = function (tag) { _panaur._addTags.push(tag); return _panaur._addTags; } this.resetTags = function () { _panaur._addTags = []; return _panaur._addTags; } this.commitTags = function (callback) { this.apiSend(_panaur.getSid(), callback); } var domain = "http://www.bio.msu.ru"; var n = "http://www.bio.msu.ru"; var remote_domain = "https://www_bio_msu_ru.panaur.com"; var is_auto_start = true; var api_key = "d420f6d79ff5fc414bfa006081a34b00"; var api_host = "https://api.panaur.com/api/"; var db = null; var inteval1 = null; var remote_window = null; var b = {}; var interval2 = false; var lang_wants = { ru: "запрашивает разрешение на:", en: "wants to:", ua: "просить дозволити на:" }; var lang_show = { ru: "Показывать оповещения", en: "Show notifications", ua: "Показувати повiдомлення" }; var lang_allow = { ru: "Разрешить", en: "Allow", ua: "Дозволити" }; var lang_deny = { ru: "Запретить", en: "Block", ua: "Заборонити" }; this.start = function () { if (!_panaur.getSite()) { _panaur.log("Application allowed only for " + domain); return false } if (_panaur.getOS() == "iOS") { _panaur.log("Application can not work on iOS"); _panaur.fire('onNonSupport'); return false } var browser = _panaur.detectBrowser(); var browser_name = browser.name.toLowerCase(); if ((browser_name == "chrome") && (parseFloat(browser.version) < 42)) { _panaur.fire('onNonSupport'); return false } if ((browser_name == "firefox") && (parseFloat(browser.version) < 44)) { _panaur.fire('onNonSupport'); return false } if ((browser_name == "safari") ) { _panaur.fire('onNonSupport'); return false } if ((browser_name == "chrome") || (browser_name == "safari") || (browser_name == "firefox")) { window.addEventListener("message", function (message) { if (message.origin == remote_domain) { if (message.data == "initend") { clearInterval(inteval1) } else if ( message.data.indexOf('ALLOW|') === 0) { var m = message.data.split('|'); _panaur.fire('onAllow', JSON.parse(m[1])); } else { if (message.data == "closeme") { remote_window.close() _panaur.closePrompt(); } else { _panaur.saveSid(message.data) if (message.data == 'DENY') { _panaur.fire('onDeny'); } } } } }, false); _panaur.getDBValue("sids", "sid", function (t) { if (t.target.result === undefined) { _panaur.fire('onInit'); if (is_auto_start) { _panaur.fire('showPrompt'); } return; } if (t.target.result.value === 'DENY') { _panaur.status = -1; } else { _panaur.status = 1; _panaur._sid = t.target.result.value; } _panaur.fire('onInit'); }) } }; this.saveSid = function (sid) { _panaur.log("StoreSubscription: " + sid); _panaur.saveDB("sids", { type: "sid", value: sid }) }; this.clearDomain = function (domain) { return domain.replace("://www.", "://").replace("://www2.", "://") }; this.getSite = function () { return (!(_panaur.clearDomain(window.location.href).indexOf(_panaur.clearDomain(domain)) === -1)) }; this.getBrowser = function () { var u, s = navigator.userAgent, r = s.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var v = s.match(/(edge(?=\/))\/?\s*(\d+)/i) || []; if ("Edge" === v[1]) { return { name: v[1], version: v[2] } } return /trident/i.test(r[1]) ? (u = /\brv[ :]+(\d+)/g.exec(s) || [], { name: "IE", version: u[1] || "" }) : "Chrome" === r[1] && (u = s.match(/\bOPR\/(\d+)/), null != u) ? { name: "Opera", version: u[1] } : (r = r[2] ? [r[1], r[2]] : [navigator.appName, navigator.appVersion, "-?"], null != (u = s.match(/version\/(\d+)/i)) && r.splice(1, 1, u[1]), { name: r[0], version: r[1] }) } this.getBrowserlanguage = function () { return navigator.language.substring(0, 2) }; this.getUserVariables = function () { var vars = {}; return vars; }; this.showPopUp = function () { var width = 660; var height = 480; var pos_left = window.screenLeft !== undefined ? window.screenLeft : screen.left; var pos_top = window.screenTop !== undefined ? window.screenTop : screen.top; var inner_width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; var inner_height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; var r = ((inner_width / 2) - (width / 2)) + pos_left; var v = ((inner_height / 3) - (inner_height / 3)) + pos_top; var language = _panaur.getBrowserlanguage(); if (language == "") { language = "en"; } remote_window = window.open(remote_domain + "/" + language + "/" + api_key, "_blank", "scrollbars=yes, width=" + width + ", height=" + height + ", top=" + v + ", left=" + r); if (window.focus) { remote_window.focus() } inteval1 = setInterval(function () { remote_window.postMessage("init", remote_domain); remote_window.postMessage("initpage|" + window.location.href, remote_domain); remote_window.postMessage("initvariables|" + JSON.stringify(_panaur.getTags()), remote_domain) }, 100); if (is_auto_start) { _panaur.closePrompt() } }; this.showPrompt = function () { if (_panaur.getStatus() !== 0) { return; } var head = document.getElementsByTagName("head")[0]; var css = document.createElement("link"); css.rel = "stylesheet"; css.type = "text/css"; css.href = "https://panaur.com/template/_front/css.css"; css.media = "all"; head.appendChild(css); var lang = _panaur.getMessageLang(_panaur.getBrowserlanguage()); if (!((document.charset.toLowerCase() == "utf8") || (document.charset.toLowerCase() == "utf-8"))) { lang = "en" } var over = document.createElement("div"); over.setAttribute("class", "_panaur-welcome _panaur-popover"); var s = document.createElement("div"); s.setAttribute("class", "_panaur-welcome-message"); var A = document.createElement("div"); A.setAttribute("class", "_panaur-welcome-message-text"); A.innerHTML = n + " " + lang_wants[lang]; var u = document.createElement("div"); u.setAttribute("class", "_panaur-welcome-info _panaur-prompt-message-text"); var x = document.createElement("img"); x.setAttribute("class", "_panaur-bell-icon"); x.setAttribute("width", "14"); x.setAttribute("height", "14"); x.setAttribute("src", "https://panaur.com/template/ring.svg"); u.appendChild(x); u.innerHTML += " " + lang_show[lang]; var z = document.createElement("div"); z.setAttribute("class", "_panaur-welcome-buttons"); var v = document.createElement("button"); v.setAttribute("class", "_panaur-welcome-btn _panaur-accept-btn"); v.setAttribute("type", "button"); v.setAttribute("onclick", "_panaur.showPopUp(); return false;"); v.innerHTML = lang_allow[lang]; var r = document.createElement("button"); r.setAttribute("class", "_panaur-welcome-btn _panaur-disallow-btn"); r.setAttribute("type", "button"); r.setAttribute("onclick", "_panaur.denyMessage(); return false;"); r.innerHTML = lang_deny[lang]; var p = document.createElement("button"); p.setAttribute("class", "_panaur-welcome-close"); p.setAttribute("onclick", "_panaur.closePrompt(); return false;"); p.innerHTML = "×"; z.appendChild(v); z.appendChild(r); s.appendChild(A); s.appendChild(u); s.appendChild(z); over.appendChild(s); over.appendChild(p); document.body.appendChild(over) }; this.denyMessage = function () { _panaur.saveSid("DENY"); _panaur.fire('onDeny'); _panaur.closePrompt() }; this.closePrompt = function () { document.body.removeChild(document.querySelector("._panaur-welcome")) }; this.openDB = function (callback) { if (db) { return void callback() } var storage = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; var _db = storage.open("_panaur_db", 2); _db.onsuccess = function (res) { db = res.target.result; callback() }; _db.onupgradeneeded = function (res) { var t = res.target.result; t.createObjectStore("sids", { keyPath: "type" }) } }; this.getDBValue = function (p, q, r) { _panaur.openDB(function () { db.transaction([p], "readonly").objectStore(p).get(q).onsuccess = r }) }; this.saveDB = function (p, sid) { _panaur.openDB(function () { db.transaction([p], "readwrite").objectStore(p).put(sid) }) }; this.deleteDbValue = function (p, q) { _panaur.openDB(function () { db.transaction([p], "readwrite").objectStore(p)["delete"](q) }) }; this.log = function (message) { if (console && console.log) { console.log(message); } }; this.detectBrowser = function () { var r, user_agent = navigator.userAgent, p = user_agent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var s = user_agent.match(/(edge(?=\/))\/?\s*(\d+)/i) || []; if ("Edge" === s[1]) { return { name: s[1], version: s[2] } } return /trident/i.test(p[1]) ? (r = /\brv[ :]+(\d+)/g.exec(user_agent) || [], { name: "IE", version: r[1] || "" }) : "Chrome" === p[1] && (r = user_agent.match(/\bOPR\/(\d+)/), null != r) ? { name: "Opera", version: r[1] } : (p = p[2] ? [p[1], p[2]] : [navigator.appName, navigator.appVersion, "-?"], null != (r = user_agent.match(/version\/(\d+)/i)) && p.splice(1, 1, r[1]), { name: p[0], version: p[1] }) }; this.getOS = function () { if (navigator.userAgent.indexOf("Windows") != -1) { return ("Windows"); } if (navigator.userAgent.indexOf("Linux") != -1) { return ("Linux"); } if (navigator.userAgent.indexOf("iPhone") != -1) { return ("iOS"); } if (navigator.userAgent.indexOf("Mac") != -1) { return ("Mac OS"); } if (navigator.userAgent.indexOf("FreeBSD") != -1) { return ("FreeBSD"); } return "" }; this.uns = function () { _panaur.apiSend(_panaur.getSid(), function () { _panaur.deleteDbValue("sids", "sid") }, 'out'); }; this.getMessageLang = function (ulang) { ulang = ulang.substring(0, 2).toLowerCase(); if (ulang == "ua" || ulang == "uk") { return "ua" } else { if (ulang == "ru") { return "ru" } else { return "en" } } }; this.push = function (p, q) { if (!_panaur.getSite()) { _panaur.log("Application allowed only for " + domain); return false } b[p] = q; _panaur.getDBValue("sids", "sid", function (r) { if (r.target.result === undefined) { if (!interval2) { interval2 = setInterval(function () { _panaur.getDBValue("sids", "sid", function (s) { if (s.target.result !== undefined) { _panaur.apiSend(s.target.result.value); _panaur._sid = s.target.result.value; this.fire('onAllow', { tags: _panaur.getTags(), sid: s.target.result.value, browser: _panaur.getBrowser(), lang: _panaur.getBrowserlanguage(), os: _panaur.getOS() }); clearInterval(interval2); interval2 = false } }) }, 1000) } } else { _panaur.apiSend(r.target.result.value) } }) }; this.apiSend = function (sid, callback, method) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { if (callback) { var res = {}; res = JSON.parse(xhr.responseText) callback.call(this, res); } } } xhr.open("POST", api_host, true); xhr.setRequestHeader("Content-Type", "application/json"); var req = { method: method || "update", sid: sid, appkey: api_key, tags: _panaur.getTags(), browser: _panaur.getBrowser(), os: _panaur.getOS(), lang: _panaur.getBrowserlanguage() }; xhr.send(JSON.stringify(req)); } } window.addEventListener("load", function () { _panaur.init(); }); var _panaur = new Panaur(_panaur || []);