Virtonomica:Notes

Система добавления и показа оповещений

当前为 2016-10-06 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Virtonomica:Notes
// @namespace      Virtonomica
// @description    Система добавления и показа оповещений
// @version        0.23
// @include        https://*virtonomic*.*/*/main/unit/view/*
// @include        https://*virtonomic*.*/*/main/company/view/*/unit_list
// @include        https://*irtonomic*.*/*/main/politics/president/*
// @include        https://*virtonomic*.*/*/main/politics/governor/*
// @include        https://*virtonomic*.*/*/main/politics/mayor/*
// ==/UserScript==
var run = function() {
   var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
   $ = win.$;

   	var loc_storage = function(){
		return({
			'save': function (name,  val){
				try {
					window.localStorage.setItem( name,  JSON.stringify( val ) );
				} catch(e) {
					out = "Ошибка добавления в локальное хранилище";
					//console.log(out);
				}
			},
			'load': function(name){
				obj = JSON.parse( window.localStorage.getItem(name) );
				if ( obj == null ) obj = new Object();
				return obj;
			}
		});
	}
	var LS = new loc_storage();

    // определяем интерфейс
    // autodefined language interface
    var lang = 'undef';
    var bt_logout = $("li[class='icon menulogout']");
    var logout_string = bt_logout.attr('title');
    if (logout_string == 'Выход') {
	   lang = 'Ru';
    } else if(logout_string == 'Logout') {
	   lang = 'En';
    } 
    console.log(lang);
    if ( lang == 'undef') {
        alert('Unsupported language for userscript "Notes"');
		return;
    }  

    // Строки зависимые от языка
    // language definitions
    var LangMsg = new Object();
    LangMsg['Ru'] = new Object();
    LangMsg['En'] = new Object();

    LangMsg['Ru']['governor'] = "Губернатор";
    LangMsg['En']['governor'] = "Governor";
	
    LangMsg['Ru']['president'] = "Президент";
    LangMsg['En']['president'] = "President";
	
    LangMsg['Ru']['mayor'] = "Мэр";
    LangMsg['En']['mayor'] = "Mayor";

    LangMsg['Ru']['notes'] = "Напоминание";
    LangMsg['En']['notes'] = "Notes";

    LangMsg['Ru']['save'] = "Сохранить";
    LangMsg['En']['save'] = "Save";
	
    LangMsg['Ru']['del'] = "Удалить";
    LangMsg['En']['del'] = "Delete";

    LangMsg['Ru']['add_notes'] = "Добавить напоминание";
    LangMsg['En']['add_notes'] = "Add Notes";

    LangMsg['Ru']['export'] = "Окно экспорта/импорта";
    LangMsg['En']['export'] = "Windwow export/import";
	
    LangMsg['Ru']['import'] = "Импортировать данные из окна";
    LangMsg['En']['import'] = "Importing data from textarea";
	
    LangMsg['Ru']['data_export'] = "Данные экспорта";
    LangMsg['En']['data_export'] = "Data exporting";
	
    // --- virtonomica user interface
    LangMsg['Ru']['comp'] = "компании";
    LangMsg['En']['comp'] = "of a company";
	
	//console.log( LangMsg );
	
   /**
   * записать данные в локальнео хранилище, с проверкой ошибок
   */
   function ToStorage(name,  val)
   {
       try {
           window.localStorage.setItem( name,  JSON.stringify( val ) );
       } catch(e) {
           out = "Ошибка добавления в локальное хранилище";
           //console.log(out);
       }
   }

   function getFromStorage(obj, id_shop)
   {
       if (obj[id_shop] == null) return '';
       return JSON.stringify(obj[id_shop]);
   }

/**
* Добавить заметку к текущему предприятию
* следует вызывать на страницах где одно подраздление, ИД которого виден в url
*
* @param msg текст сообщения, можно использовать html теги
*/
function addNotes( msg ){
    // объект для хранения сообщений
    notes = JSON.parse( window.localStorage.getItem('notes') );
    if ( notes == null ) notes = new Object();

    // Идентификатор подразделения
    var id = /(\d+)/.exec(location.href)[0];
     
    var head = $("#headerInfo");
    var title = $("h1", head).text();

    head = $("div.officePlace");
    var type = head.text();
    var nn = type.indexOf("компании");
    if (nn > 0){
     type = type.substring(0, nn);
     var ptrn = /\s*((\S+\s*)*)/;
     type = type.replace(ptrn, "$1");
     ptrn = /((\s*\S+)*)\s*/;
     type = type.replace(ptrn, "$1");
    } else {
     type = '';
    }

    if ( notes[id] == null ) notes[id] = new Object();

    var d = new Date();

    if ( notes[id]['text'] != null) {
      // сообщение для этого подраздления уже есть
      msg = notes[id]['text'] + "<br>" + msg;
    }

    notes[id]['text'] = msg;
    // Количество миллисекунд
    notes[id]['time'] = d.getTime();
    notes[id]['name'] = title;
    notes[id]['type'] = type;

    ToStorage('notes', notes);
}

   var txt = "<table><tr><td><td><table width=100%><tr><td align=rigth id=notes_title><td align=center><h3>" + LangMsg[ lang ]['notes'] + "</h3><div id=notes_link style='color:grey'></div></table><td>&nbsp;";
   txt+= "";
   txt+= "<tr><td>&nbsp;<td align=center id=notes_form>&nbsp;<td>&nbsp;" + "<tr><td colspan=3></table>";
   
   var div_form = "<div id=notes style='background: none repeat scroll 0% 0% rgb(223, 223, 223); z-index: 1002; position: absolute; border: 1px solid rgb(0, 0, 0); display: none;'>" + txt + "</div>";

   var div_export = "<div id=notes_export style='background: none repeat scroll 0% 0% rgb(223, 223, 223); z-index: 1003; position: absolute; border: 1px solid rgb(0, 0, 0); display: none;'>"
   + "<h3 style='margin:4px'>" + LangMsg[ lang ]['data_export'] + "</h3>"
   + "<table><tr><td>&nbsp;<td>"
   + "<textarea name=export_text id=export_text rows=10 cols=64></textarea>"
   + "<br><center><span id=export_load></span></center>"
   + "</table>";
   + "</div>";

   var tu = $("table.unit-list-2014");
   if (tu.length == 1) {
       // Это у нас список подразделений - рисуем кнопку отображения отчета со сылками
       // Оповещения
       notes = JSON.parse( window.localStorage.getItem('notes') );
       if ( notes == null ) notes = new Object();
       var len = 0;

       // проверить, какие оповещения отразить как актуальные
       for (key in notes){
           len++;
       }

// http://cdn1.iconfinder.com/data/icons/Upojenie_by_SoundForge/Icons/Notes.png
// http://www.iconsearch.ru/uploads/icons/crystalclear/24x24/kedit.png

       var wc = $("<li><div id=main_notes style='float:left;cursor:pointer; color: white;'> <img alt='Список напоминаний' src=http://cdn1.iconfinder.com/data/icons/humano2/32x32/apps/gnome-sticky-notes-applet.png> <span id=all_notes> ("+ len+")</span></div>").click( function() {
           $("#notes").toggle();
           if( $('#notes').is(':visible') ) {
                   // код для visible
               // Оповещения
               notes = JSON.parse( window.localStorage.getItem('notes') );
               if ( notes == null ) notes = new Object();

               // Формируем ссылку на торговый зал
               var url = /^https:\/\/virtonomic[as]\.(\w+)\/\w+\//.exec(location.href)[0];
               console.log(url);

               var all_count = 0;
               $("#notes_form").html('');
               var out = $("<table>");
               for (key in notes){
                   if (notes[key] == null) continue;
                   if (notes[key]['time'] == null) continue;

                   // подсчитываем сколько у нас оповещениий
                   // TODO - учитывать только акутальные
                   all_count++;

                   var d = new Date();
                   d.setTime(notes[key]['time']);

                   link = "<a href=" + url + "main/unit/view/" + key + ">" + notes[key]['name'] + "</a>";
				   if ( notes[key]['link'] != null ) {
					   link = "<a href=" + notes[key]['link'] + ">" + notes[key]['name'] + "</a>";
				   }
				   
                   span = $("<span name=" + key + " style='cursor:pointer;' title='del'><font color=red><b>Х</b></font></span>").click(
                   function(){
                       idp = $(this).attr('name');
                       //alert('del = ' + idp);
                       delete notes[idp];
                       ToStorage('notes', notes);
					   $(this).parent().css("text-decoration","line-through").css("color","grey");
                       //$("#main_notes").click().click();
                   });

                   out_tr = $("<tr>");
                   out_tr.append("<td>" + d.toLocaleDateString())
                   .append("<td>" + link)
                   .append("<td>(" + notes[key]['type'] + ")")
                   .append("<td style='border: 1px solid gray; border-radius: 4px 4px 4px 4px; box-shadow: 0 1px 3px 0 #999999; display: block; float: left; margin-top: 4px; overflow: hidden; padding: 2px 4px;  text-align:left'>" + notes[key]['text'])
                   .append("<td>").append(span);
                   out.append(out_tr);
                   str = "(" + all_count +")";
                   if (all_count == 0)  str = '';
                   $("#all_notes").html("(" + all_count +")");
               }
               $("#notes_form").html( out );

           }
       });

// http://cdn1.iconfinder.com/data/icons/basicset/save_32.png
// http://www.iconsearch.ru/uploads/icons/ultimategnome/48x48/stock_export.png
       var wc_export = $("<span id=main_notes_export style='cursor:pointer; color: white;'><img src=http://cdn1.iconfinder.com/data/icons/basicset/save_32.png title='" + LangMsg[ lang]['export']+ "' alt='О" + LangMsg[ lang]['export']+ "'></span>").click( function() {
           $("#export_text").val( JSON.stringify( notes ) );
           $("#notes_export").toggle();
       });

// http://cdn1.iconfinder.com/data/icons/freeapplication/png/24x24/Load.png
// http://www.iconsearch.ru/uploads/icons/freeapplication/24x24/load.png
       var wc_load = $("<img src=http://cdn1.iconfinder.com/data/icons/freeapplication/png/24x24/Load.png title='" + LangMsg[ lang ]['import'] + "' alt='" + LangMsg[ lang ]['import'] + "'>").click( function() {
           //alert("Load");
           var text =  $("#export_text").val() ;
           try {
               notes = JSON.parse( text );
               ToStorage('notes', notes);
		$("#notes_export").hide();
               $("#main_notes").click().click();
           } catch(e) {
               alert("Неверные данным для импорта");
           }
       });

	       	var container = $('ul.tabu');
		container.append( wc );

		$("table.unit-top").before ( div_form);
	       	//container.append( div_form );
       //var container = $('#topblock');
       //container.append( $('<table><tr><td>').append(wc) );
       //container.append( div_form );
       $("#notes_title").append(wc_export).append( div_export );
       $("#export_load").append(wc_load);


       return;
   }

   // Идентификатор подразделения
   var id = /(\d+)/.exec(location.href)[0];
   console.log("id=" + id);
   
   // тип подразделения
   var type = '';
   // название подразделения
   var title = '';
      
   var pos = location.href.indexOf("politics");
   // проверяем на объект политики
   if (pos > 0) {
	   console.log("politics");
	   
	   // вычитываем название объекта политики
	   var polit_name = "";
	   var el = $("#headerInfoCenter h1");
	   var el2 = $("a", el);
	   if (el2.length > 0 ) {
		   polit_name = el2.text();
	   } else {
		   polit_name = el.text();
	   }
	   
	   if ( location.href.indexOf("president") > 0 ) {
		   type = LangMsg[ lang ]['president'];
	   }
	   if ( location.href.indexOf("governor") > 0 ) {
		   type =  LangMsg[ lang ]['governor'] ;
	   }
	   if ( location.href.indexOf("mayor") > 0 ) {
		   type =  LangMsg[ lang ]['mayor'] ;
		   polit_name = el.html();
		   pos = polit_name.indexOf("<img");
		   polit_name = $.trim( polit_name.substr(0, pos) );
		   
	   }
	   console.log( polit_name );
	   title = polit_name;
	   console.log( type );
	   
   } else {
	   // обработка обыных юнитов (units)
	   var head = $("#headerInfo");
       var title = $("h1", head).text();

       head = $("div.officePlace");
       var type = head.text();
       var nn = type.indexOf(  LangMsg[ lang ]['comp'] );
       if (nn > 0){
           type = type.substring(0, nn);
           var ptrn = /\s*((\S+\s*)*)/;
           type = type.replace(ptrn, "$1");
           ptrn = /((\s*\S+)*)\s*/;
           type = type.replace(ptrn, "$1");
        } else {
           type = '';
        }
	   
   }
   
   // Оповещения
   notes = JSON.parse( window.localStorage.getItem('notes') );
   if ( notes == null ) notes = new Object();
   if ( notes[id] == null) notes[id] = new Object();

   notes_html = "";
   if ( notes[id]['text'] != null) notes_html = notes[id]['text'];

   var form = "";
   form += "<span id=notes_error style='color:red;'></span><br>";
   form += "<div id=notes_preview style='border: 1px solid gray; border-radius: 4px 4px 4px 4px; box-shadow: 0 1px 3px 0 #999999; display: block; float: left; margin-top: 4px; margin-right: 4px; overflow: hidden; padding: 2px 4px; text-align:left'>" + notes_html +"</div>";
   form += " <textarea name=notes_txt id=notes_txt rows=5 cols=48>";
   form += notes_html;
   form+= "</textarea><br>";

   var form_button = $("<button id=notes_btn style='cursor:pointer'>" +LangMsg[ lang ]['save'] + "</button>").click( function() {
       $("#notes_error").text('');
       var text =  $("#notes_txt").val() ;
       $("#notes_preview").html( text );	
       if (text == '') {
           $("#notes_error").text('Ошибка - нет описания');
           return;
       }

       var d = new Date();
       // Оповещения
       notes = JSON.parse( window.localStorage.getItem('notes') );
       if ( notes == null ) notes = new Object();

       if ( notes[id] == null) notes[id] = new Object();

       notes[id]['text'] = text;
       notes[id]['time'] = d.getTime();
       notes[id]['name'] = title;
       notes[id]['type'] = type;
	   notes[id]['link'] = location.href;

       ToStorage('notes', notes);
       $("#notes").toggle();
   });

   var form_button_del = $(" <button style='cursor:pointer'>" +LangMsg[ lang ]['del'] + "</button>").click( function() {
       // Оповещения
       notes = JSON.parse( window.localStorage.getItem('notes') );
       if ( notes == null ) notes = new Object();

       if ( notes[id] == null) notes[id] = new Object();

       $("#notes_txt").val("");
       $("#notes_preview").html( "" );
       delete  notes[id];
       ToStorage('notes', notes);
   });

// http://cdn1.iconfinder.com/data/icons/oxygen/32x32/actions/document-new.png
// http://www.iconsearch.ru/uploads/icons/ull_icons/24x24/message_add.png
   var wc = $("<li style='cursor:pointer; color: white;'><img alt='"+ LangMsg[ lang ]['add_notes'] + "' src=http://cdn1.iconfinder.com/data/icons/oxygen/32x32/actions/document-new.png title='"+ LangMsg[ lang ]['add_notes'] + "'> </li>").click( function() {
       $("#notes").toggle();
       // Обновить зампетку
       notes = JSON.parse( window.localStorage.getItem('notes') );
       if ( notes == null ) notes = new Object();
       if ( notes[id] == null) notes[id] = new Object();

 		$("#notes_txt").change(function() {
			console.log('change ' + $("#notes_txt").val() );
			$("#notes_preview").html( $("#notes_txt").val() );
		
		});
		
       if ( notes[id]['text'] == null ) return;
       $("#notes_txt").val( notes[id]['text'] );
       $("#notes_preview").html( notes[id]['text'] );
	   if (notes[id]['link'] != null) {
			$("#notes_link").html( notes[id]['link'] );
	   }
   });
   
   //var container = $('#topblock');
   var container = $('#topblock').next();

   if (tu.length == 0) {
       container = $("li:last", container).prev().parent();
       container.append(wc) ;
       //container.append( $('<table><tr><td>').append(wc) );
       $("#childMenu").before ( div_form);

       $("#notes_form").append(form).append(form_button).append(form_button_del);
   }
}

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