NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Favtimer // @namespace * // @version 1 // @license MIT // @grant none // ==/UserScript== (function(){ var Favtimer = {}; var currentFavicon = null; var originalFavicon = null; var faviconImage = null; var canvas = null; var options = {}; var r = window.devicePixelRatio || 1; var size = 16 * r; var defaults = { width: 8, height: 10, font: 11 * r + 'px arial', colour: '#ffffff', background: '#F03D25', fallback: true, crossOrigin: true, abbreviate: true }; var ua = (function () { var agent = navigator.userAgent.toLowerCase(); // Получаем доступ к useragent посредством замыкания return function (browser) { return agent.indexOf(browser) !== -1; }; }()); var browser = { ie: ua('msie'), chrome: ua('chrome'), webkit: ua('chrome') || ua('safari'), safari: ua('safari') && !ua('chrome'), mozilla: ua('mozilla') && !ua('chrome') && !ua('safari') }; // получить фавлинк var getFaviconTag = function(){ var links = document.getElementsByTagName('link'); for(var i=0, len=links.length; i < len; i++) { if ((links[i].getAttribute('rel') || '').match(/icon/)) { return links[i]; } } return false; }; // удалить фавлинк var removeFaviconTag = function(){ var links = document.getElementsByTagName('link'); var head = document.getElementsByTagName('head')[0]; for(var i=0, len=links.length; i < len; i++) { var exists = (typeof(links[i]) !== 'undefined'); if (exists && (links[i].getAttribute('rel') || '').match(/icon/)) { head.removeChild(links[i]); } } }; // получить фавиконку var getCurrentFavicon = function(){ if (!originalFavicon || !currentFavicon) { var tag = getFaviconTag(); originalFavicon = currentFavicon = tag ? tag.getAttribute('href') : '/favicon.ico'; } return currentFavicon; }; var getCanvas = function (){ if (!canvas) { canvas = document.createElement("canvas"); canvas.width = size; canvas.height = size; } return canvas; }; // инициализировать фавлинк var setFaviconTag = function(url){ if(url){ removeFaviconTag(); var link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'icon'; link.href = url; document.getElementsByTagName('head')[0].appendChild(link); } }; var log = function(message){ if (window.console) window.console.log(message); }; // рисуем фавиконку var drawFavicon = function(label, colour) { // откат если не поддерживается if (!getCanvas().getContext || browser.ie || browser.safari || options.fallback === 'force') { return updateTitle(label); } var context = getCanvas().getContext("2d"); var colour = colour || '#000000'; var src = getCurrentFavicon(); // "http://www.google.com/s2/favicons?domain=" + window.location.href; faviconImage = document.createElement('img'); faviconImage.onload = function() { // очистить canvs context.clearRect(0, 0, size, size); // рисовать иконку context.drawImage(faviconImage, 0, 0, faviconImage.width, faviconImage.height, 0, 0, size, size); // перерисовываем значок if ((label + '').length > 0) drawBubble(context, label, colour); // обновить фавлинк refreshFavicon(); }; if (!src.match(/^data/) && options.crossOrigin) { faviconImage.crossOrigin = 'anonymous'; } faviconImage.src = src; }; var updateTitle = function(label) { if (options.fallback) { // захватываем title var originalTitle = document.title; // убираем старый title if (originalTitle[0] === '(') { originalTitle = originalTitle.slice(originalTitle.indexOf(' ')); } if ((label + '').length > 0) { document.title = '(' + label + ') ' + originalTitle; } else { document.title = originalTitle; } } }; var drawBubble = function(context, label, colour) { // автоматическая абреввиация для (>2 знака) числа //if (typeof label == 'number' && label > 99 && options.abbreviate) { // label = abbreviateNumber(label); //} // значок больше при двузначном числе var len = (label == "∞") ? ((label + '').length) : ((label + '').length-1); var width = options.width * r + (8 * r * len), height = options.height * r; var top = size - height, left = size - width - r, bottom = 16 * r, right = 16 * r, radius = 2 * r; // задание параметров шрифта context.font = (label == "∞") ? "18px arial" : ((browser.webkit ? 'bold ' : '') + options.font); context.fillStyle = options.background; context.strokeStyle = options.background; context.lineWidth = r; // значок context.beginPath(); context.moveTo(left + radius, top); context.quadraticCurveTo(left, top, left, top + radius); context.lineTo(left, bottom - radius); context.quadraticCurveTo(left, bottom, left + radius, bottom); context.lineTo(right - radius, bottom); context.quadraticCurveTo(right, bottom, right, bottom - radius); context.lineTo(right, top + radius); context.quadraticCurveTo(right, top, right - radius, top); context.closePath(); context.fill(); // нижняя тень context.beginPath(); context.strokeStyle = "rgba(0,0,0,0.3)"; context.moveTo(left + radius / 2.0, bottom); context.lineTo(right - radius / 2.0, bottom); context.stroke(); // метка context.fillStyle = options.colour; context.textAlign = "end"; context.textBaseline = "top"; // выводим метку, учитывая возможное различие пикселей в mozilla context.fillText(label, ((label + '').substring(2,1) == "m") ? (r === 2 ? 29 : 16) : (r === 2 ? 29 : 15), (label == "∞") ? (browser.mozilla ? 3*r : 2*r) :(browser.mozilla ? 6*r : 5*r)); }; var refreshFavicon = function(){ // проверить поддержку if (!getCanvas().getContext) return; setFaviconTag(getCanvas().toDataURL()); }; //var abbreviateNumber = function(label) { // var metricPrefixes = [ // ['G', 1000000000], // ['M', 1000000], // ['k', 1000] // ]; // // return label; //}; var round = function (value, precision) { var number = new Number(value); return number.toFixed(precision); }; // методы счётчика Favtimer.setOptions = function(custom){ options = {}; for(var key in defaults){ options[key] = custom.hasOwnProperty(key) ? custom[key] : defaults[key]; } return this; }; Favtimer.setImage = function(url){ currentFavicon = url; refreshFavicon(); return this; }; Favtimer.setBubble = function(label, colour) { label = label || ''; drawFavicon(label, colour); return this; }; Favtimer.reset = function(){ setFaviconTag(originalFavicon); }; Favtimer.setOptions(defaults); window.Favtimer = Favtimer; })(); var url = window.location.href; var regex = new RegExp("wmmail\.ru\/.*"); if(regex.test(url)) { var regexz = new RegExp("wmmail\.ru\/index\.php.cf=uzd-readtask&zdid=[0-9]+"); if (regexz.test(url)) { var beginTaskButton = document.getElementsByTagName('input'); var links = document.getElementsByTagName('link'); links[2].parentNode.removeChild(links[2]); links[1].parentNode.removeChild(links[1]); beginTaskButton[4].addEventListener('click', function() { Favtimer.setOptions({ width: 8, height: 10, font: '11px arial', colour: '#ffffff', background: '#33B2FF', fallback: true }); var count = 0; setInterval(function() { ++count; if (count > 60) { var abbr = count > 600 ? "∞" : (Math.floor(count/60) + "m"); Favtimer.setBubble(abbr); } else { Favtimer.setBubble(count); }; }, 1000); }); } else return false;} else { function taskTimer() { Favtimer.setOptions({ width: 8, height: 10, font: '11px arial', colour: '#ffffff', background: '#F03D25', fallback: true }); var count = 0; setInterval(function() { ++count; if (count > 60) { //если секунд > 60, то заменяем минутами, > 600 - ∞(не влезает) var abbr = count > 600 ? "∞" : (Math.floor(count/60) + "m"); Favtimer.setBubble(abbr); } else { Favtimer.setBubble(count); }; }, 1000); }; taskTimer(); };