popup.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. var P=$('#main'),C=$('#commands'),
  2. pT=P.querySelector('.top'),pB=P.querySelector('.bot'),
  3. cT=C.querySelector('.top'),cB=C.querySelector('.bot'),
  4. tab=null,ia=null,scripts={},hr=null;
  5. function loadItem(d,c) {
  6. d.data=c;
  7. if(d.symbols) {
  8. d.firstChild.className='fa '+d.symbols[c?1:0];
  9. if(d.symbols.length>1) {
  10. if(c) d.classList.remove('disabled');
  11. else d.classList.add('disabled');
  12. }
  13. }
  14. }
  15. function addItem(h,c,b) {
  16. var d=document.createElement('div');
  17. d.innerHTML='<i></i> '+h;
  18. if('title' in c) {
  19. d.title=typeof c.title=='string'?c.title:h;
  20. delete c.title;
  21. }
  22. c.holder.insertBefore(d,b);
  23. for(h in c) d[h]=c[h];
  24. if(d.symbols) loadItem(d,d.data);
  25. return d;
  26. }
  27. function menuCommand(e) {
  28. chrome.tabs.sendMessage(tab.id,{cmd:'Command',data:e.target.cmd});
  29. }
  30. function menuScript(s) {
  31. if(s&&!scripts[s.id]) {
  32. scripts[s.id]=s;
  33. var n=s.custom.name||getLocaleString(s.meta,'name');
  34. n=n?n.replace(/&/g,'&amp;').replace(/</g,'&lt;'):'<em>'+_('labelNoName')+'</em>';
  35. addItem(n,{
  36. holder: pB,
  37. symbols: ['fa-times','fa-check'],
  38. className: 'ellipsis',
  39. title: s.meta.name,
  40. onclick: function(e){
  41. var d=!this.data;
  42. chrome.runtime.sendMessage({cmd:'UpdateMeta',data:{id:s.id,enabled:d}});
  43. loadItem(this,d);
  44. },
  45. data:s.enabled,
  46. });
  47. }
  48. }
  49. function initMenu(){
  50. addItem(_('menuManageScripts'),{
  51. holder: pT,
  52. symbols: ['fa-hand-o-right'],
  53. //title: true,
  54. onclick: function(){
  55. var u=chrome.extension.getURL('/options.html');
  56. chrome.tabs.query({currentWindow:true,url:u},function(t) {
  57. if(t[0]) chrome.tabs.update(t[0].id,{active:true});
  58. else chrome.tabs.create({url:u});
  59. });
  60. }
  61. });
  62. if(/^https?:\/\//i.test(tab.url))
  63. addItem(_('menuFindScripts'), {
  64. holder: pT,
  65. symbols: ['fa-hand-o-right'],
  66. //title: true,
  67. onclick: function(){
  68. var h=tab.url.match(/:\/\/(?:www\.)?([^\/]*)/);
  69. chrome.tabs.create({url:'https://greasyfork.org/scripts/search?q='+h[1]});
  70. },
  71. });
  72. ia=addItem(_('menuScriptEnabled'), {
  73. holder: pT,
  74. symbols: ['fa-times','fa-check'],
  75. //title: true,
  76. onclick: function(e) {
  77. var d=!this.data;
  78. chrome.runtime.sendMessage({
  79. cmd:'SetOption',
  80. data:{key:'isApplied',value:d},
  81. });
  82. loadItem(this,d);
  83. chrome.browserAction.setIcon({
  84. path:'images/icon19'+(this.data?'':'w')+'.png',
  85. });
  86. }
  87. });
  88. chrome.runtime.sendMessage({
  89. cmd:'GetOption',data:'isApplied',
  90. },function(o){loadItem(ia,o);});
  91. }
  92. function load(data) {
  93. if(data&&data[0]&&data[0].length) {
  94. addItem(_('menuBack'), {
  95. holder: cT,
  96. symbols: ['fa-arrow-left'],
  97. //title: true,
  98. onclick: function() {
  99. C.classList.add('hide');
  100. P.classList.remove('hide');
  101. }
  102. });
  103. cT.appendChild(document.createElement('hr'));
  104. data[0].forEach(function(i) {
  105. addItem(i[0], {
  106. holder: cB,
  107. className: 'ellipsis',
  108. symbols: ['fa-hand-o-right'],
  109. //title: true,
  110. onclick: menuCommand,
  111. cmd: i[0]
  112. });
  113. });
  114. addItem(_('menuCommands'),{
  115. holder: pT,
  116. symbols: ['fa-arrow-right'],
  117. //title: true,
  118. onclick: function() {
  119. P.classList.add('hide');
  120. C.classList.remove('hide');
  121. }
  122. },ia);
  123. }
  124. if(data&&data[1]&&data[1].length) {
  125. var ids=[];
  126. data[1].forEach(function(i){
  127. if(!scripts[i]) ids.push(i);
  128. });
  129. if(ids.length) chrome.runtime.sendMessage({cmd:'GetMetas',data:ids},function(o){
  130. if(!hr) pT.appendChild(hr=document.createElement('hr'));
  131. o.forEach(menuScript);
  132. });
  133. }
  134. }
  135. chrome.runtime.onMessage.addListener(function(req,src,callback) {
  136. var maps={
  137. SetPopup: load,
  138. },f=maps[req.cmd];
  139. if(f) f(req.data,src,callback);
  140. return true;
  141. });
  142. chrome.tabs.query({currentWindow:true,active:true},function(t) {
  143. tab=t[0];initMenu();chrome.tabs.sendMessage(tab.id,{cmd:'GetPopup'});
  144. });