Virtonomica: фильтр по индикаторам

Дополнительный фильтр на страницах подразделений

// ==UserScript==
// @name           Virtonomica: фильтр по индикаторам
// @namespace      virtonomica
// @version        1.5
// @description    Дополнительный фильтр на страницах подразделений
// @include        http*://*virtonomic*.ru/*/main/company/view/*/unit_list
// @include        http*://igra.aup.ru/*/main/company/view/*/unit_list
// @include        http*://virtonomic*.*/*/main/company/view/*
// ==/UserScript==
var run = function() {

	var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
	$ = win.$;

	function showAll() {
		$('table > tbody > tr > td.alerts').each(function() {
			$(this).parent().show();
			var nextRow = $(this).parent().next('tr');
			if(nextRow.attr("class") == 'unit_comment'){
				nextRow.show();
			}
		});
	}
	function containsWord(haystack, needle) {
		return (" " + haystack + " ").indexOf(" " + needle + " ") !== -1;
	}
	function hideByCell(cell, imgSrc){
		var notFound = true;
		var row = cell.parent();
		var nextRow = row.next('tr');
		var childs = cell.children('img');
		if(childs.length > 0){
			childs.each(function() {
				if(notFound){
					if($(this).attr('src') !== imgSrc){
						row.hide();
						if(containsWord(nextRow.attr("class"), 'unit_comment')){
							nextRow.hide();
						}
					} else {
						notFound = false;
						row.show();
						if(containsWord(nextRow.attr("class"), 'unit_comment')){
							nextRow.show();
						}
					}
				}
			});
		} else {
			row.hide();
			if(containsWord(nextRow.attr("class"), 'unit_comment')){
				nextRow.hide();
			}
		}
		return notFound;
	}
	function showByImgSrc(imgSrc) {
		var notFound = true;
		$('table > tbody > tr > td.alerts').each(function() {
			var cell = $(this);
			notFound = hideByCell(cell, imgSrc);
			if(notFound){
				hideByCell(cell.parent().children('td.prod').eq(0), imgSrc);
			}
		});
	}
	//var container = $('#mainContent tr:first > td:first');
	var container = $("td.u-l").parent().parent();

	var panel = $("#indicator_filter");
	// добавить панель, если её еще нет
	var ext_panel = "<div style='padding: 2px; border: 1px solid #0184D0; border-radius: 4px 4px 4px 4px; float:left; white-space:nowrap; color:#0184D0; display:none;'  id=indicator_filter></div>";
	container.append( "<tr><td>" +ext_panel +"</td></tr>");

	var alerts = {};
	function addAlert(img) {
		var imgSrc = img.attr('src');
		var imgTitle = img.attr('title');
		if (typeof alerts[imgSrc] !== 'undefined'){
			alerts[imgSrc].cnt = alerts[imgSrc].cnt + 1;
		}else{
			alerts[imgSrc] = {
				cnt: 1,
				src: imgSrc,
				title: imgTitle
			}
		}
	}
	$('table > tbody > tr > td.alerts > img').each(function() {
		var img = $(this);
		addAlert(img);
	});
	$('table > tbody > tr > td.prod > img').each(function() {
		var img = $(this);
		addAlert(img);
	});
	var alertsExists = 0;
	$.each(alerts, function() {
		alertsExists = 1;
		var alertObj = this;
		var imgText = $('<i>',{
			title: alertObj.title,
			text: alertObj.cnt,
			click: function(){ showByImgSrc(alertObj.src);return false;},
		});
		var img = $('<img>',{
			title: alertObj.title,
			src: alertObj.src
		});
		var input = imgText.append(img);
		$("#indicator_filter").append(input);
		$("#indicator_filter").append('&nbsp;');
	});

	if(alertsExists == 1){
		var showAllLink = $('<i>',{
			text: 'Сбросить фильтр',
			click: function(){ showAll();return false;}
		});
		$("#indicator_filter").append(showAllLink);
		$("#indicator_filter").show();
	}

}

if(window.top == window) {
	var script = document.createElement("script");
	script.textContent = '(' + run.toString() + ')();';
	document.documentElement.appendChild(script);
}