labStartProjectFilter

Отмечает в выпадающем списке запуска исследований технологии, которые уже исследуются вами

  1. // ==UserScript==
  2. // @name labStartProjectFilter
  3. // @namespace virtonomica
  4. // @description Отмечает в выпадающем списке запуска исследований технологии, которые уже исследуются вами
  5. // @author cobra3125
  6. // @license MIT
  7. // @version 1.4
  8. // @include http://virtonomica.*/*/main/company/view/*/unit_list
  9. // @include http://virtonomica.*/*/window/unit/view/*/project_create
  10. // @include http://virtonomica.*/*/main/management_action/*/investigations/technologies
  11. // @include http://virtonomica.*/*/main/unit/view/*/investigation
  12. // ==/UserScript==
  13.  
  14. // [1] Оборачиваем скрипт в замыкание, для кроссбраузерности (opera, ie)
  15. (function (window, undefined) {
  16.  
  17. // [2] нормализуем window
  18. var w;
  19.  
  20. if (typeof unsafeWindow != undefined) {
  21. w = unsafeWindow
  22. } else {
  23. w = window;
  24. }
  25.  
  26. // [3] не запускаем скрипт во фреймах
  27. // без этого условия скрипт будет запускаться несколько раз на странице с фреймами
  28. if (w.self != w.top) {
  29. return;
  30. }
  31.  
  32. // a function that loads jQuery and calls a callback function when jQuery has finished loading
  33. function addJQuery(callback) {
  34. var script = document.createElement("script");
  35. script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js");
  36. script.addEventListener('load', function () {
  37. var script = document.createElement("script");
  38. script.textContent = "(" + callback.toString() + ")();";
  39. document.body.appendChild(script);
  40. }, false);
  41. document.body.appendChild(script);
  42. }
  43.  
  44.  
  45. // the guts of this userscript
  46. function main() {
  47. // [4] дополнительная проверка наряду с @include
  48. //begin[0] нужно для локального хранилища
  49. (function($) {
  50. // Private data
  51. var isLS=typeof window.localStorage!=='undefined';
  52. // Private functions
  53. function wls(n,v){var c;if(typeof n==="string"&&typeof v==="string"){localStorage[n]=v;return true;}else if(typeof n==="object"&&typeof v==="undefined"){for(c in n){if(n.hasOwnProperty(c)){localStorage[c]=n[c];}}return true;}return false;}
  54. function wc(n,v){var dt,e,c;dt=new Date();dt.setTime(dt.getTime()+31536000000);e="; expires="+dt.toGMTString();if(typeof n==="string"&&typeof v==="string"){document.cookie=n+"="+v+e+"; path=/";return true;}else if(typeof n==="object"&&typeof v==="undefined"){for(c in n) {if(n.hasOwnProperty(c)){document.cookie=c+"="+n[c]+e+"; path=/";}}return true;}return false;}
  55. function rls(n){return localStorage[n];}
  56. function rc(n){var nn, ca, i, c;nn=n+"=";ca=document.cookie.split(';');for(i=0;i<ca.length;i++){c=ca[i];while(c.charAt(0)===' '){c=c.substring(1,c.length);}if(c.indexOf(nn)===0){return c.substring(nn.length,c.length);}}return null;}
  57. function dls(n){return delete localStorage[n];}
  58. function dc(n){return wc(n,"",-1);}
  59.  
  60. /**
  61. * Public API
  62. * $.Storage - Represents the user's data store, whether it's cookies or local storage.
  63. * $.Storage.set("name", "value") - Stores a named value in the data store.
  64. * $.Storage.set({"name1":"value1", "name2":"value2", etc}) - Stores multiple name/value pairs in the data store.
  65. * $.Storage.get("name") - Retrieves the value of the given name from the data store.
  66. * $.Storage.remove("name") - Permanently deletes the name/value pair from the data store.
  67. */
  68. $.extend({
  69. Storage: {
  70. set: isLS ? wls : wc,
  71. get: isLS ? rls : rc,
  72. remove: isLS ? dls :dc
  73. }
  74. });
  75. })(jQuery);
  76. //end[0]
  77. function MultDimArrToStr(anArray){
  78. var str = '';
  79. var len = anArray.length;
  80. for (var i = 0; i < len; ++i) {
  81. if(str != ''){
  82. str += '|';
  83. }
  84. str += anArray[i]['id'] + ';' + anArray[i]['name'] + ';' + anArray[i]['tech'];
  85. }
  86. //str == "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  87. return str;
  88. }
  89.  
  90. function StrToMultDimArr(str){
  91. //alert(str);
  92. //var str = "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  93. var tempArray = str.split('|');
  94. var finalArray = new Array();
  95. var len = tempArray.length;
  96. for (var i = 0; i < len; ++i) {
  97. var tmp = tempArray[i].split(';');
  98. finalArray.push({
  99. id: tmp[0],
  100. name: tmp[1],
  101. tech: tmp[2]
  102. });
  103. }
  104. return finalArray;
  105. }
  106. function inMultDimArray(value, anArray, attr){
  107. var theIndex = -1;
  108. var len = anArray.length;
  109. for (var i = 0; i < len; ++i) {
  110. if (anArray[i][attr].toUpperCase() == value.toUpperCase()) {
  111. theIndex = i;
  112. break;
  113. }
  114. }
  115. return theIndex;
  116. }
  117. function delByVal(anArray, attr, value){
  118. var result = new Array();
  119. var len = anArray.length;
  120. for (var i = 0; i < len; ++i) {
  121. if (anArray[i][attr] != value) result.push(anArray[i]);
  122. }
  123. return result;
  124. }
  125. function countInDimArray(value, anArray){
  126. var cnt = 0;
  127. var len = anArray.length;
  128. for (var i = 0; i < len; ++i) {
  129. if (anArray[i]['name'] == value) {
  130. ++cnt;
  131. }
  132. }
  133. return cnt;
  134. }
  135. function distinct(anArray) {
  136. var result = new Array();
  137. var len = anArray.length;
  138. for (var i = 0; i < len; ++i) {
  139. if (inMultDimArray(anArray[i]['id'], result, 'id') == -1) result.push(anArray[i]);
  140. }
  141. return result;
  142. }
  143. function sort(anArray){
  144. return anArray.sort(function(a, b) {
  145. var compA = a['name'].toUpperCase();
  146. var compB = b['name'].toUpperCase();
  147. var compTA = parseFloat(a['tech'].trim());
  148. var compTB = parseFloat(b['tech'].trim());
  149. return (compA < compB) ? -1 : (compA > compB) ? 1 : (compTA > compTB) ? -1 : (compTA < compTB) ? 1 : 0;
  150. });
  151. }
  152. // @include http://virtonomica.*/*/main/unit/view/*/investigation
  153. //для определения изучаемой в открытой лабе технологии
  154. if (/http:\/\/virtonomica\.\w+\/\w+\/main\/unit\/view\/\w+\/investigation/.test(window.location)) {
  155. var arr = StrToMultDimArr( $.Storage.get('labStartFilterArray') );
  156. if (!$.isArray(arr)){
  157. arr = new Array();
  158. }
  159. var id = (window.location + '').trim().split('/');
  160. id = id[id.length-2];
  161. $('td[class="title"]').each(function() {
  162. if (jQuery(this).text() == 'Текущее исследование'){
  163. var texhName = jQuery(this).parent().children('td').eq(1).children('a').eq(1).text();
  164. var texhLvl = jQuery(this).parent().parent().children('tr').eq(1).children('td').eq(1).children('span').text();
  165. arr = delByVal(arr, 'id', id);
  166. arr.push({
  167. id: id,
  168. name: texhName,
  169. tech: texhLvl
  170. });
  171. arr = sort(arr);
  172. arr = distinct(arr);
  173. $.Storage.set('labStartFilterArray', MultDimArrToStr(arr));
  174. }
  175. });
  176. }
  177. //для сбора списка уже изученных технологий
  178. if (/http:\/\/virtonomica\.\w+\/\w+\/main\/management_action\/\d+\/investigations\/technologies[#]{0,1}/.test(window.location)) {
  179. var arr = new Array();
  180. $('div[class="tech_d"], div[class="tech_s"]').children('a').each(function() {
  181. var id = jQuery(this).attr('href').trim().split('/');
  182. id = id[id.length-1];
  183. arr.push({
  184. id: id,
  185. name: jQuery(this).parent().parent().parent().children('div[class="tech_title_cell"]').children('b').text().trim(),
  186. tech: jQuery(this).text().trim()
  187. });
  188. });
  189. arr = sort(arr);
  190. //alert(MultDimArrToStr(arr));
  191. arr = distinct(arr);
  192. //alert(MultDimArrToStr(arr));
  193. $.Storage.set('labSFTechDoneArray', MultDimArrToStr(arr));
  194. }
  195. //для добавления в выпадающий список отметок о текущих исследованиях
  196. if (/http:\/\/virtonomica\.\w+\/\w+\/window\/unit\/view\/\d+\/project_create$/.test(window.location)) {
  197. var arr = StrToMultDimArr( $.Storage.get('labStartFilterArray') );
  198. var techArr = StrToMultDimArr( $.Storage.get('labSFTechDoneArray') );
  199. var str;
  200. var cnt;
  201. if (arr){
  202. //select name = unit_type
  203. $('select[name="unit_type"]').children().each(function() {
  204. str = jQuery(this).text().trim();
  205. cnt = countInDimArray(str, arr);
  206. idx = inMultDimArray(str, techArr, 'name');
  207. if(idx != -1){
  208. str = str + ' (' + techArr[idx]['tech'] + ')';
  209. }
  210. if(cnt > 0){
  211. str = str + ' +' + cnt;
  212. jQuery(this).remove();
  213. return;
  214. }
  215. if(cnt > 0 || idx != -1){
  216. jQuery(this).text(str);
  217. }
  218. });
  219. }
  220. }
  221. //для сбора списка текущих исследований из списка подразделений
  222. if (/http:\/\/virtonomica\.\w+\/\w+\/main\/company\/view\/\d+\/unit_list$/.test(window.location)) {
  223. //Ниже идёт непосредственно код скрипта
  224. //$.Storage.set('test','val');
  225. //alert($.Storage.get('test'));
  226. //alert($.Storage.get('labStartFilterArray'));
  227. var arr;
  228. //alert(arr);
  229. var currDate = (new Date()).getDate() + '';
  230. var lastSaveDate = $.Storage.get('labStartFilterDate');
  231. if (currDate == lastSaveDate){
  232. // arr = StrToMultDimArr( $.Storage.get('labStartFilterArray') );
  233. }else{
  234. $.Storage.set('labStartFilterDate', currDate);
  235. //alert('set date = ' + currDate);
  236. }
  237. if (!$.isArray(arr)){
  238. arr = new Array();
  239. //alert('reset');
  240. }
  241. //alert(arr.toString());
  242. var executed = 0;
  243. $('td[class="info i-lab"]').parent().find('td[class="spec"]').each(function () {
  244. var str = jQuery(this).text();
  245. var tech = jQuery(this).children().children('b').eq(1).text();
  246. var url = jQuery(this).parent().children('td[class="info i-lab"]').children('a').attr('href');
  247. var id = url.split('/');
  248. id = id[id.length-1];
  249. //alert(id);
  250. var substr = str.split(' ');
  251. substr[0] = '';
  252. substr[1] = '';
  253. str = substr.join(' ');
  254. //alert(tech);
  255. arr.push({
  256. id: id,
  257. name: str.trim(),
  258. tech: tech.trim()
  259. });
  260. executed = 1;
  261. /*var object2 = {
  262. id: id,
  263. name: str.trim()
  264. };*/
  265. /* merge object2 into arr, recursively */
  266. //$.extend(true, arr, object2);
  267. });
  268. if(1 == executed){
  269. arr = sort(arr);
  270. arr = distinct(arr);
  271. $.Storage.set('labStartFilterArray', MultDimArrToStr(arr));
  272. //alert(MultDimArrToStr(arr));
  273. //alert('saved');
  274. }
  275. }
  276. }
  277.  
  278. // load jQuery and execute the main function
  279. addJQuery(main);
  280. })(window);