GM_option

support tool for UserConfig.(library)

当前为 2015-04-26 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/9507/48626/GM_option.js

  1. // ==UserScript==
  2. // @name GM_option
  3. // @namespace https://greasyfork.org/ja/scripts/9507
  4. // @homepageURL https://greasyfork.org/ja/scripts/9507
  5. // @license http://creativecommons.org/licenses/by-nc-sa/4.0/
  6. // @include http://*
  7. // @include https://*
  8. // @include file:*
  9. // @copyright Noi & Noisys & NoiSystem & NoiProject
  10. // @author noi
  11. // @description support tool for UserConfig.(library)
  12. // @version 1.00
  13. // @grant GM_registerMenuCommand
  14. // @grant GM_setValue
  15. // @grant GM_getValue
  16. // @grant GM_deleteValue
  17. // @grant GM_log
  18. // ==/UserScript==
  19.  
  20. /*************************************************************************
  21. [about]
  22.  
  23. This script is the library to make a setting screen.
  24. I made this support tool in order to make more easily.
  25.  
  26. *************************************************************************
  27. [How to use]
  28.  
  29. Sample code is end of this Script.
  30. Plz test it.
  31.  
  32.  
  33. If savedata is none....?
  34. <first start-up or delete savedata>
  35. This script make GM_option window and save default.
  36. <next time>
  37. This script never make GM_option window without running open-function.
  38.  
  39. <@grant>----------------------------------------------
  40. you need to add @grant.
  41. // @grant GM_setValue
  42. // @grant GM_getValue
  43. // @grant GM_deleteValue
  44. // @grant GM_registerMenuCommand
  45.  
  46. GM_setValue and GM_getValue and GM_deleteValue is required.
  47. GM_registerMenuCommand is optional.
  48.  
  49.  
  50. <start function>----------------------------------------------
  51. GM_option.open(String,String,Array);
  52.  
  53. first String is HTML Tag(style or script or etc...)
  54. second String is HTML Tag(in document.body).
  55. third Array is optional,it's messages for dialog.
  56.  
  57. Message List
  58. 'save' - when click save button.
  59. 'reset' - when click reset button.(discard changes)
  60. 'clear' - when click clear button.(delete savedata)
  61. 'delete' - when click del button.(delete multiple)
  62.  
  63.  
  64. <user function>--------------------------------------
  65. At first,get user's settings.
  66. GM_option.get();
  67.  
  68. return hashArray(Associative array).
  69.  
  70.  
  71. <HTML tag>-------------------------------------------
  72. use form inputs.
  73. 'name' is save-key.
  74. 'value' is save-data.
  75.  
  76. ex)
  77. HTML tag is...
  78. <input type="text" name="this_is_Key" value="this_is_Data" />
  79.  
  80. Save Data is...
  81. {"this_is_Key":"this_is_Data"}
  82.  
  83.  
  84. <multiple text>--------------------------------------
  85. 'name' is ****_multiple9999.(required)
  86. 9999 is number of array.(required)
  87. 'value' is default.(optional)
  88. <button id="this_is_required"> is addButton.(required)
  89.  
  90. ex)
  91. HTML tag is...
  92. <input type="text" name="freeName_multiple2" value="data1" /> <input type="text" name="freeName_multiple2" value="data2" /> <button id="addButton">add</button>
  93.  
  94. Save Data is...
  95. {"freeName_multiple2":[["data1","data2"],["data3","data4"], and more ]}
  96.  
  97.  
  98. <select-multiple(HTML5)>----------------------------
  99. selected is checked.(optional)
  100.  
  101. ex)
  102. HTML tag is...
  103. <select name="selectName" multiple size=5>
  104. <option name="optionName1" value="data1" >item1</option>
  105. <option name="optionName2" value="data2" selected>item2</option>
  106. <option name="optionName3" value="data3" >item3</option>
  107. <option name="optionName4" value="data4" selected>item4</option>
  108. <option name="optionName5" value="data5" >item5</option>
  109.  
  110. Save Data is...
  111. {"selectName":"{\"data2\":true,\"data4\":true}"}
  112.  
  113. To use...
  114. var userSettings = GM_option.get();
  115. var selectArray = JSON.parse(userSettings['selectName']);
  116.  
  117.  
  118. <addEventListener>----------------------------------
  119. 'GM_option_loaded'
  120.  
  121. this event is dispatched...
  122. when made GM_option frame (@first start-up)
  123. when loaded User's Settings from GM_getValue (@next time)
  124.  
  125. ex)
  126. window.addEventListener('GM_option_loaded',userFunction,false);
  127.  
  128.  
  129. <access GM_option document>----------------------------------
  130. GM_option.frame
  131. GM_option.doc
  132.  
  133. ex)
  134. var frame = GM_option.frame;
  135. var doc = GM_option.doc.head;
  136. var head = GM_option.doc.body;
  137. var form = GM_option.doc.opForm;
  138.  
  139.  
  140. <other function>----------------------------------
  141. after GM_option opened
  142. GM_option.show(); - show GM_option
  143. GM_option.close(); - hide GM_option
  144. GM_option.save(); - save settings & reload
  145. GM_option.reset(); - discard changes
  146. GM_option.clear(); - delete SaveData & reload
  147.  
  148.  
  149. *************************************************************************
  150. [history]
  151.  
  152. 04/26/2015 - v1.0 release
  153. *************************************************************************/
  154.  
  155. var GM_option = {
  156. init: function(){
  157. GM_option.defScroll = window.onscroll; //save default scroll
  158. var css = GM_option.css;
  159. var htmlText = GM_option.htmlText;
  160.  
  161. //iframe
  162. var obj = GM_option.frame = window.document.createElement('iframe');
  163. obj.id = 'GM_option';
  164. obj.src = 'about:blank';
  165. obj.setAttribute('style','position:fixed;top:0;left:0;right:0;bottom:0; margin:auto; z-index:999999;width:calc(100% - 40px);height:calc(100% - 60px); max-height:90%; max-width:90%; overflow:auto; visibility:hidden; border:none;');
  166. document.body.appendChild(obj);
  167.  
  168. obj.addEventListener('load', GM_option.make(css,htmlText) ,false);
  169. },
  170. open: function(css,htmlText,msgArray){
  171. GM_option.get();
  172. var oType = Object.prototype.toString.call(htmlText).slice(8, -1);
  173. if(!htmlText && htmlText != 'String' && !htmlText.match(/\<.*?\>/)){
  174. alert('second parameter(htmltext) is not correct.');
  175. return;
  176. }
  177. if(!GM_option.event){
  178. GM_option.event = document.createEvent('HTMLEvents');
  179. GM_option.event.initEvent('GM_option_loaded', true, false);
  180.  
  181. GM_option.msgArray = msgArray;
  182. }
  183.  
  184. if(!GM_option.makeFlg && GM_option.saveData){
  185. GM_option.makeFlg = true;
  186. window.dispatchEvent(GM_option.event);
  187. return;
  188. }
  189.  
  190. GM_option.css = css || '';
  191. GM_option.htmlText = htmlText = [
  192. '<form name="opForm" action="javascript:void(0);" onSubmit="return false;">',
  193. '<table id="opTable" style="padding:20px;height:98%;width:98%;"><tr><td align="center" valign="middle">',
  194. htmlText,
  195. '<span id="consol">',
  196. '<input type="button" id="saveConfig" value="save" title="save option" /> ',
  197. '<input type="reset" id="resetConfig" value="reset" title="Revert To Last Save" /> ',
  198. '<input type="button" id="clearConfig" value="clear" title="clear userSettings" /> ',
  199. '<button id="closeConfig" title="close option window">close</button>',
  200. '</span>',
  201. '</td></tr></table></form>'
  202. ].join('');
  203.  
  204. if(htmlText && (!GM_option.frame || !GM_option.layer)) GM_option.init();
  205. GM_option.show();
  206. },
  207. make: function() { return function(){
  208. var css = GM_option.css;
  209. var htmlText = GM_option.htmlText;
  210.  
  211. this.removeEventListener("load", GM_option.make(css,htmlText) ,false);
  212.  
  213. var opDoc = GM_option.doc = this.contentDocument;
  214. var opBody = opDoc.body;
  215. if(css) opDoc.head.innerHTML = css;
  216.  
  217. opBody.innerHTML = htmlText;
  218. opBody.id = 'opBody';
  219. opBody.setAttribute('style','background:white;');
  220.  
  221. //close
  222. var closeButton = opDoc.getElementById('closeConfig');
  223. closeButton.addEventListener('click',GM_option.close,false);
  224.  
  225. //save
  226. var saveButton = opDoc.getElementById('saveConfig');
  227. saveButton.addEventListener('click',GM_option.save,false);
  228.  
  229. //clear
  230. var defaultButton = opDoc.getElementById('clearConfig');
  231. defaultButton.addEventListener('click',GM_option.clear,false);
  232.  
  233. //reset
  234. var resetButton = opDoc.getElementById('resetConfig');
  235. resetButton.addEventListener('click',GM_option.reset,false);
  236.  
  237. GM_option.load(); //保存データの上書き
  238. if(!GM_option.saveData) GM_option.save();
  239.  
  240. //layer
  241. var layer = GM_option.layer = window.document.createElement('div');
  242. layer.id = 'opLayer';
  243. layer.setAttribute('style','position:fixed; top:0px; left:0px; width:100%; height:100%; background-color:black; z-index:5000; opacity:0.7;');
  244. document.body.appendChild(layer);
  245. layer.addEventListener('click', GM_option.close,false);
  246.  
  247. window.addEventListener('beforeunload', function() {
  248. window.removeEventListener("beforeunload", arguments.callee,false);
  249. layer.removeEventListener('click', GM_option.close,false);
  250. closeButton.removeEventListener('click',GM_option.close,false);
  251. saveButton.removeEventListener('click',GM_option.save,false);
  252. defaultButton.removeEventListener('click',GM_option.clear,false);
  253. resetButton.removeEventListener('click',GM_option.reset,false);
  254.  
  255. GM_option.remove();
  256. },false);
  257.  
  258. if(GM_option.makeFlg) GM_option.show();
  259. else{
  260. GM_option.load();
  261. GM_option.close();
  262. window.dispatchEvent(GM_option.event);
  263. }
  264. GM_option.makeFlg = true;
  265.  
  266. opBody = style = css = htmlText = null;
  267. }},
  268. show: function(){
  269. if(!GM_option.frame || !GM_option.layer) return;
  270. GM_option.scrollStop(true);
  271. GM_option.frame.style.visibility = 'visible';
  272. GM_option.layer.style.visibility = 'visible';
  273. },
  274. save: function(clickFlg){
  275. if(clickFlg){
  276. var txt = 'Do you want to save?(ok:reload)';
  277. if(GM_option.msgArray) txt = GM_option.msgArray['save'] || txt;
  278. if(confirm(txt) == false) return
  279. }
  280.  
  281. var form = GM_option.doc.opForm;
  282. var array={};
  283. for(var i=0,j=form.length;i<j;i++){
  284. var obj = form[i];
  285. var name =obj.name;
  286. if(!name) continue;
  287. switch(obj.type){
  288. case 'checkbox':
  289. if(obj.checked)array[name] = true;
  290. else array[name] = false;
  291. continue;
  292. case 'radio':
  293. if(obj.checked)array[name] = obj.value;
  294. continue;
  295. case 'text':
  296. if(!name.match(/_multiple(\d+)$/)){
  297. array[name] = obj.value;
  298. continue;
  299. }else{
  300. var num = RegExp.$1;
  301. if(!array[name])array[name] = [];
  302. var arrayNum = array[name].length - 1;
  303. if(arrayNum < 0) arrayNum = 0;
  304.  
  305. if(!array[name][arrayNum]) array[name][arrayNum] = [];
  306. if(array[name][arrayNum].length < num) array[name][arrayNum].push(obj.value);
  307. else{
  308. if(!array[name][arrayNum + 1]) array[name].push([]);
  309. array[name][arrayNum + 1].push(obj.value);
  310. }
  311. continue;
  312. }
  313. continue;
  314. case 'select-one':
  315. var opt = obj.getElementsByTagName('option');
  316. for(var op=0,opLength=opt.length;op<opLength;op++){
  317. var optObj = opt[op];
  318. if(optObj.selected){ array[name] = optObj.value; break;}
  319. }
  320. continue;
  321. case 'select-multiple':
  322. var opt = obj.getElementsByTagName('option');
  323. var tmpArray = {};
  324. for(var op=0,opLength=opt.length;op<opLength;op++){
  325. var optObj = opt[op];
  326. if(optObj.selected) tmpArray[optObj.value] = true;
  327. }
  328. array[name] = JSON.stringify(tmpArray);
  329. continue;
  330. default:
  331.  
  332. array[name] = obj.value;
  333. continue;
  334. }
  335. }
  336. GM_option.saveData = JSON.stringify(array);
  337. GM_setValue('opData',GM_option.saveData);
  338. if(clickFlg) location.reload();
  339. },
  340. //discard changes
  341. reset: function(){
  342. var txt = 'discard changes?';
  343. if(GM_option.msgArray) txt = GM_option.msgArray['reset'] || txt;
  344. if(confirm(txt) == false) return;
  345.  
  346. var dels = GM_option.doc.getElementsByClassName('delSpans');
  347. for (var i = dels.length-1; i >= 0; i--) {
  348. dels[i].parentNode.removeChild(dels[i]);
  349. }
  350. GM_option.load();
  351. },
  352. //delete SaveData
  353. clear: function(){
  354. var txt = 'delete settings?(ok:reload)';
  355. if(GM_option.msgArray) txt = GM_option.msgArray['clear'] || txt;
  356. if(confirm(txt) == false) return;
  357.  
  358. GM_deleteValue('opData');
  359. GM_option.close();
  360. location.reload();;
  361. },
  362. //delete line for Multiple
  363. deleteLine: function(e){
  364. var txt = 'delete this line?';
  365. if(GM_option.msgArray) txt = GM_option.msgArray['delete'] || txt;
  366. if(confirm(txt) == false) return;
  367.  
  368. e.target.removeEventListener("click", arguments.callee,false);
  369. e.target.parentNode.parentNode.removeChild(e.target.parentNode);
  370. },
  371. //GM_option.saveData is String,return object Array
  372. get: function(){
  373. if(GM_option.saveData) return JSON.parse(GM_option.saveData);
  374. if(!GM_getValue('opData')) return undefined;
  375.  
  376. GM_option.saveData = GM_getValue('opData');
  377. return JSON.parse(GM_option.saveData);
  378. },
  379. //set data
  380. load: function(){
  381. var userSet = GM_option.get();
  382. if(userSet == undefined) return;
  383. var form = GM_option.doc.opForm;
  384. var lastNum = 0;
  385. var cntMulti = 0;
  386. var multipleArray = {};
  387.  
  388.  
  389. for(var i=0,j=form.length;i<j;i++){
  390. var obj = form[i];
  391. var name = obj.name;
  392. var userData = userSet[name];
  393. if(userData == undefined) continue;
  394. switch(obj.type){
  395. case 'checkbox':
  396. if(userData)obj.setAttribute('checked',true);
  397. else obj.removeAttribute('checked');
  398. continue;
  399. case 'radio':
  400. if(obj.value == userData)obj.setAttribute('checked',true);
  401. else obj.removeAttribute('checked');
  402. continue;
  403. case 'textarea':
  404. obj.innerHTML = obj.value = userData;
  405. continue;
  406. case 'text':
  407. if(!name.match(/_multiple(\d+)$/)){
  408. obj.setAttribute('value',userData);
  409. continue;
  410. }else{
  411. var num = RegExp.$1;
  412. if(lastNum != num){
  413. lastNum = num;
  414. cntMulti = 0;
  415. }
  416.  
  417. obj.setAttribute('value',userData[Math.floor(cntMulti / num)][cntMulti % num]);
  418.  
  419. cntMulti++;
  420.  
  421. if(num == cntMulti){
  422. var addObj = obj.parentNode.getElementsByTagName('button');
  423. if(!addObj[0]){ alert('addButton is nothing for multiple select.'); GM_option.remove(); return;}
  424. var id = addObj[0].id;
  425. GM_option.addMultiple(name,num,id);
  426. j = form.length;
  427. }
  428. continue;
  429. }
  430. continue;
  431. case 'select-one':
  432. var opt = obj.getElementsByTagName('option');
  433. for(var op=0,opLength=opt.length;op<opLength;op++){
  434. var optObj = opt[op];
  435. if(optObj.value == userData) optObj.setAttribute('selected',true);
  436. else optObj.removeAttribute('selected');
  437. }
  438. continue;
  439. case 'select-multiple':
  440. var tmpArray = JSON.parse(userData);
  441. var opt = obj.getElementsByTagName('option');
  442. for(var op=0,opLength=opt.length;op<opLength;op++){
  443. var optObj = opt[op];
  444. if(tmpArray[optObj.value]) optObj.setAttribute('selected',true);
  445. else optObj.removeAttribute('selected');
  446. }
  447. continue;
  448. default:
  449. obj.setAttribute('value',userData);
  450. continue;
  451. }
  452. }
  453. },
  454. close: function(){
  455. GM_option.scrollStop(false);
  456. if(!GM_option.frame) return;
  457.  
  458. GM_option.frame.style.visibility = 'hidden';
  459. if(!GM_option.layer) return;
  460. GM_option.layer.style.visibility = 'hidden';
  461. },
  462. remove: function(){
  463. if(GM_option.frame) document.body.removeChild(GM_option.frame);
  464. if(GM_option.layer) document.body.removeChild(GM_option.layer);
  465. GM_option = null;
  466. },
  467. scrollStop: function(stopFlg){
  468. GM_option.scrollY = document.documentElement.scrollTop || document.body.scrollTop;
  469.  
  470. if(stopFlg) window.onscroll = function () { window.scrollTo(0, GM_option.scrollY); };
  471. else window.onscroll = GM_option.defScroll;
  472. },
  473. //make line for Multiple
  474. addLine: function(obj,txt,addID){
  475. var num = parseInt(obj.getAttribute('num')) || 0;
  476. var strID = addID + '_delItem' + num;
  477. obj.parentNode.insertAdjacentHTML('beforeend',txt + '<button id="' + strID + '">del</button></span>');
  478.  
  479. //del button
  480. var delButton = GM_option.doc.getElementById(strID);
  481. delButton.addEventListener('click',GM_option.deleteLine,false);
  482. window.addEventListener('beforeunload', function() {
  483. window.removeEventListener("beforeunload", arguments.callee,false);
  484. delButton.removeEventListener('click',GM_option.deleteLine,false);
  485. },false);
  486.  
  487.  
  488. obj.setAttribute('num',num + 1);
  489. },
  490. //Multiple main
  491. addMultiple: function(name,num,addID){
  492. var addButton = GM_option.doc.getElementById(addID);
  493. var strTxt = '<span class="delSpans"><br>';
  494. for(var x=0;x<num;x++){
  495. strTxt += '<input type="text" name="' + name + '" /> ';
  496. }
  497.  
  498. //addEvent
  499. if(!addButton.hasAttribute('num')){
  500. var addEvent = function(e){
  501. GM_option.addLine(e.target,strTxt,addID);
  502. };
  503. addButton.addEventListener('click',addEvent,false);
  504. window.addEventListener('beforeunload', function() {
  505. window.removeEventListener("beforeunload", arguments.callee,false);
  506. addButton.removeEventListener('click',addEvent,false);
  507. },false);
  508. }
  509.  
  510. //addInput
  511. var testArray = GM_option.get()[name];
  512. addButton.setAttribute('num',1);
  513. for(var i=1,j=testArray.length;i<j;i++){
  514. GM_option.addLine(addButton,strTxt,addID);
  515. }
  516. }
  517. };
  518.  
  519.  
  520.  
  521. //sample code
  522. /*********************************************************************************************************************
  523.  
  524.  
  525. //sample header(ex:style, script etc...)
  526. const strHeader = [
  527. '<style id ="cfgCSS" type="text/css">',
  528. '#cfgTable{ border: solid #ccc 1px; border-spacing:0; border-radius:6px 6px 0 0; -webkit-border-radius:6px 6px 0 0; box-shadow: 0 1px 1px #ccc; -webkit-box-shadow: 0 1px 1px #ccc; }',
  529. '#cfgTable tr:hover{ transition: all 0.1s ease-in-out; background:#fbf8e9; -webkit-transition: all 0.1s ease-in-out; }',
  530. '#cfgTable th, #cfgTable td{ border-left: 1px solid #ccc; border-top: 1px solid #ccc; vertical-align: top; white-space: nowrap; padding: 3px; }',
  531. '#cfgTable th{ color: #151; background: #E3F6E7;}',
  532. '#cfgTitle, #cfgTable th:first-child, #cfgTable td:first-child { border-left: none;}',
  533. '#cfgTable tr:first-child th:first-child{ border-top: none; color: #151; border-bottom: 3px solid #036; background: #A0D0A0; padding: 6px; }',
  534. '#cfgTable label{ padding:1px 5px 2px 5px; }',
  535. '#cfgTable label:hover{ background:#ada; }',
  536. '</style>'
  537. ].join('');
  538.  
  539.  
  540. //sample HTML
  541. var strHTML = [
  542. '<table id="cfgTable" align="center">',
  543. '<thead>',
  544. '<tr>',
  545. '<th id="cfgTitle" colspan=2>Config Title</th>',
  546. '</tr>',
  547. '<tr>',
  548. '<th>Settings</th>',
  549. '<th>Select</th>',
  550. '</tr>',
  551. '</thead>',
  552. '<tbody>',
  553. '<tr>',
  554. '<td>',
  555. 'checkbox test',
  556. '</td>',
  557. '<td>',
  558. '<input type="checkbox" id="flg1" name="check1" checked />',
  559. '<label for="flg1">check1</label>',
  560. '<input type="checkbox" id="flg2" name="check2" />',
  561. '<label for="flg2">check2</label>',
  562. '<input type="checkbox" id="flg3" name="check3" />',
  563. '<label for="flg3">check3</label>',
  564. '</td>',
  565. '</tr>',
  566. '<tr>',
  567. '<td>',
  568. 'radiobutton test1',
  569. '</td>',
  570. '<td>',
  571. '<input type="radio" id="firstOn" name="radio1" value=true checked />',
  572. '<label for="firstOn">on</label>',
  573. '<input type="radio" id="firstOff" name="radio1" value=false />',
  574. '<label for="firstOff">off</label>',
  575. '</td>',
  576. '</tr>',
  577. '<tr>',
  578. '<td>',
  579. 'radiobutton test2',
  580. '</td>',
  581. '<td>',
  582. '<input type="radio" id="secondOn" name="radio2" value="1" />',
  583. '<label for="secondOn">type1</label>',
  584. '<input type="radio" id="secondOff" name="radio2" value="2" checked />',
  585. '<label for="secondOff">type2</label>',
  586. '</td>',
  587. '</tr>',
  588. '<tr>',
  589. '<td>text(inline) test</td>',
  590. '<td>',
  591. '<input type="text" name="textTest1" value="input text" />',
  592. '</td>',
  593. '</tr>',
  594. '<tr>',
  595. '<td>textarea test</td>',
  596. '<td>',
  597. '<textarea name="textarea">textarea test\rthis\ris\rsample\rdata</textarea>',
  598. '</td>',
  599. '</tr>',
  600. '<tr>',
  601. '<td>text(inline) for Multiple test</td>',
  602. '<td>',
  603. '<input type="text" name="textTest3_multiple1" value="test" /> <button id="addItem1">add</button>',
  604. '</td>',
  605. '</tr>',
  606. '<tr>',
  607. '<td>text(inline) for Multiple test2</td>',
  608. '<td>',
  609. '<input type="text" name="textTest4_multiple2" value="data1" /> <input type="text" name="textTest4_multiple2" value="Multi test" /> <button id="addItem2">add</button>',
  610. '</td>',
  611. '</tr>',
  612. '<tr>',
  613. '<td>text(inline) for Multiple test3</td>',
  614. '<td>',
  615. '<input type="text" name="textTest5_multiple3" value="dataA" /> <input type="text" name="textTest5_multiple3" value="Multi test2" /> <input type="text" name="textTest5_multiple3" value="Multi testA" /> <button id="addItem3">add</button>',
  616. '</td>',
  617. '</tr>',
  618. '</tr>',
  619. '<tr>',
  620. '<td>select option test</td>',
  621. '<td>',
  622. '<select name="select">',
  623. '<option name="nameop1" value="op1">item1</option>',
  624. '<option name="nameop2" value="op2" selected>item2</option>',
  625. '<option name="nameop3" value="op3">item3</option>',
  626. '</select>',
  627. '</td>',
  628. '</tr>',
  629. '<tr>',
  630. '<td>select option test2</td>',
  631. '<td>',
  632. '<select name="select2" size=5>',
  633. '<option name="nameopA" value="opA">itemA</option>',
  634. '<option name="nameopB" value="opB" selected>itemB</option>',
  635. '<option name="nameopC" value="opC">itemC</option>',
  636. '<option name="nameopD" value="opE">itemE</option>',
  637. '<option name="nameopE" value="opF">itemF</option>',
  638. '</select>',
  639. '</td>',
  640. '</tr>',
  641. '<tr>',
  642. '<td>select option test3 multiple</td>',
  643. '<td>',
  644. '<select name="select3" multiple size=5>',
  645. '<option name="nameopAA" value="opAA">itemAA</option>',
  646. '<option name="nameopBB" value="opBB" selected>itemBB</option>',
  647. '<option name="nameopCC" value="opCC">itemCC</option>',
  648. '<option name="nameopDD" value="opEE" selected>itemEE</option>',
  649. '<option name="nameopEE" value="opFF">itemFF</option>',
  650. '</select>',
  651. '</td>',
  652. '</tr>',
  653. '</tbody>',
  654. '</table>',
  655. ].join('');
  656.  
  657.  
  658.  
  659.  
  660. //userFunction(sample)
  661. var userConfig = function(){
  662. var options = GM_option.get(); //load userConfig Data(hashArray)
  663.  
  664. //example
  665. var strTxt = "";
  666. var check1 = options['check1'];
  667. strTxt += 'check1:' + check1 + '\n';
  668.  
  669. var check2 = options['check2'];
  670. strTxt += 'check2:' + check2 + '\n';
  671.  
  672. var check3 = options['check3'];
  673. strTxt += 'check3:' + check3 + '\n';
  674.  
  675. var radio1 = options['radio1'];
  676. if(radio1 == 'true') strTxt += 'radio1:on\n';
  677. else strTxt += 'radio1:off\n';
  678.  
  679. var radio2 = options['radio2'];
  680. strTxt += 'radio2:' + radio2 + '\n';
  681.  
  682. var textTest1 = options['textTest1'];
  683. strTxt += 'textTest1:' + textTest1 + '\n';
  684.  
  685. var textarea = options['textarea'];
  686. textarea = textarea.split('\n');
  687. for(var i=0,j=textarea.length;i<j;i++){
  688. strTxt += 'textarea[' + i + ']:' + textarea[i] + '\n';
  689. }
  690.  
  691. var expand = function(text){
  692. var obj = eval(text);
  693. for(var i=0,j=obj.length;i<j;i++){
  694. var objTemp = obj[i];
  695. for(var x=0,y=objTemp.length;x<y;x++){
  696. strTxt += text + '[' + i + '][' + x + ']:' + objTemp[x] + '\n';
  697. }
  698. }
  699. };
  700.  
  701. var textTest3_multiple1 = options['textTest3_multiple1'];
  702. expand('textTest3_multiple1');
  703.  
  704. var textTest4_multiple2 = options['textTest4_multiple2'];
  705. expand('textTest4_multiple2');
  706.  
  707.  
  708. var textTest5_multiple3 = options['textTest5_multiple3'];
  709. expand('textTest5_multiple3');
  710.  
  711. var select = options['select'];
  712. strTxt += 'select:' + select + '\n';
  713.  
  714. var select2 = options['select2'];
  715. strTxt += 'select2:' + select2 + '\n';
  716.  
  717. var select3 = JSON.parse(options['select3']);
  718. for(var key in select3){
  719. strTxt += 'select3:' + key + '\n';
  720. }
  721.  
  722. alert(strTxt);
  723.  
  724.  
  725. //make OpenButton(sample)
  726. var openButton = document.createElement('button');
  727. openButton.id = 'openButton';
  728. openButton.innerHTML = 'click here!(open GM_option)';
  729. openButton.style = 'position:fixed;top:0;left:0;right:0;bottom:0;margin:auto; height:100px;';
  730. document.body.appendChild(openButton);
  731. var openConfig = function(){
  732. GM_option.open(strHeader,strHTML);
  733. }
  734. openButton.addEventListener('click', openConfig,false);
  735.  
  736. window.addEventListener('beforeunload', function() {
  737. window.removeEventListener("beforeunload", arguments.callee,false);
  738. openButton.removeEventListener('click',openConfig,false);
  739. userConfig = null;
  740. },false);
  741. }
  742.  
  743. //optional messages
  744. var msgArray = {
  745. 'save':'save?(ok:reload)',
  746. 'reset':'discard changes?(load savedata)',
  747. 'clear':'delete your settings?(ok:reload)',
  748. 'delete':'delete this line?(Don\'t forget to save.)',
  749. };
  750. window.addEventListener('GM_option_loaded',userConfig,false); //userFunction
  751. GM_option.open(strHeader,strHTML,msgArray); //load
  752.  
  753. //script menu
  754. GM_registerMenuCommand('Open GM_option',function(){
  755. GM_option.open(strHeader,strHTML,msgArray);
  756. });
  757.  
  758.  
  759.  
  760. window.addEventListener('beforeunload', function() {
  761. window.removeEventListener("beforeunload", arguments.callee,false);
  762. window.removeEventListener('GM_option_loaded',userConfig,false);
  763. },false);
  764.  
  765.  
  766.  
  767. *********************************************************************************************************************/