revos / Favtimer

// ==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();
};