Includes : WinConfig

WinConfig Function

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/5168/18209/Includes%20%3A%20WinConfig.js

  1. // ==UserScript==
  2. // @name Includes : WinConfig
  3. // @namespace http://gm.wesley.eti.br/includes
  4. // @description WinConfig Function
  5. // @author w35l3y
  6. // @email w35l3y@brasnet.org
  7. // @copyright 2009, w35l3y (http://gm.wesley.eti.br/includes)
  8. // @license GNU GPL
  9. // @homepage http://gm.wesley.eti.br/includes
  10. // @version 2.0.0.0
  11. // @language en
  12. // @include nowhere
  13. // @resource winConfigCss http://pastebin.com/download.php?i=rHDg6Nyt
  14. // @require https://gf.qytechs.cn/scripts/5167-includes-php/code/Includes%20:%20Php.js?version=18207
  15. // @history 2.0.0.0 Removed multiline strings due to recent firefox update
  16. // ==/UserScript==
  17.  
  18. const WinConfig = function () {};
  19. WinConfig.loadDefaultCss = function() {
  20. GM_addStyle(GM_getResourceText("winConfigCss"));
  21. };
  22. WinConfig.init = function (opts) {
  23. return new (function (opts) {
  24. this.Name = opts.name || "";
  25. this.Type = opts.type || "";
  26. this.Class = opts.class || "";
  27. this.LoadValues = ( typeof opts.load_values == "undefined" ? true : opts.load_values );
  28. this.Title = opts.title || (function (type) {
  29. switch (type) {
  30. case "prompt":
  31. return "Prompt Dialog";
  32. case "question":
  33. return "Question Dialog";
  34. case "warning":
  35. return "Warning Dialog";
  36. case "error":
  37. return "Error Dialog";
  38. case "explanation":
  39. return "Explanation Dialog";
  40. default:
  41. return "Settings";
  42. }
  43. })(this.Type);
  44. this.Description = opts.description||"";
  45. this.Position = opts.position||[-1,-1];
  46. this.Size = opts.size||["300px",0];
  47. this.Rendered = null;
  48. this.Parent = document.getElementsByTagName("body")[0];
  49. var buttons = (function(type) {
  50. switch (type) {
  51. case "prompt":
  52. return {"ok":{"value":"OK","events":{"click":opts.positiveCallback||function(win,obj){win.FadeOut();}}},"cancel":{"value":"Cancel","events":{"click":opts.negativeCallback||function(win,obj){win.FadeOut(0);}}}};
  53. case "warning":
  54. case "error":
  55. case "explanation":
  56. return {"ok":{"value":"OK","events":{"click":opts.positiveCallback||function(win,obj){win.FadeOut(0);}}}};
  57. case "question":
  58. return {"ok":{"value":"Yes","events":{"click":opts.positiveCallback||function(win,obj){win.FadeOut(0);}}},"cancel":{"value":"No","events":{"click":opts.negativeCallback||function(win,obj){win.FadeOut(0);}}}};
  59. default:
  60. return {"ok":{"value":"Save","events":{"click":opts.positiveCallback||function(win,obj){win.Save();win.FadeOut();}}},"cancel":{"value":"Cancel","events":{"click":opts.negativeCallback||function(win,obj){win.FadeOut(0);}}}};
  61. }
  62. })(this.Type);
  63. for ( var button_name in opts.buttons) {
  64. var button_obj = opts.buttons[button_name];
  65. if (button_name in buttons) {
  66. if (typeof button_obj.value != "undefined")
  67. buttons[button_name].value = button_obj.value;
  68. for ( var event_name in button_obj.events ) {
  69. var event_obj = button_obj.events[event_name];
  70. buttons[button_name].events[event_name] = event_obj;
  71. }
  72. } else {
  73. buttons[button_name] = button_obj;
  74. }
  75. }
  76. this.Button = new (function Buttons(opts) {
  77. this.List = {};
  78.  
  79. this.Add = function(name, opts) {
  80. this.List[name] = new (function Button (opts) {
  81. this.Value = opts.value || "";
  82. this.Event = new (function Events(opts) {
  83. this.List = {};
  84.  
  85. this.Add = function (name, opts) {
  86. if (!(name in this.List))
  87. this.List[name] = [];
  88.  
  89. this.List[name].push(opts);
  90. }
  91. this.Remove = function (name, opts) {
  92. if (name in this.List)
  93. for ( var at = this.List[name].length - 1 ; ~at ; --at )
  94. if (this.List[name][at] == opts) {
  95. this.List[name] = this.List[name].splice(at,1);
  96. break;
  97. }
  98. }
  99.  
  100. for ( var name in opts )
  101. this.Add(name, opts[name]);
  102. })(opts.events);
  103. })(opts);
  104. };
  105. this.Remove = function (name) {
  106. if (name in this.List)
  107. delete this.List[name];
  108. }
  109.  
  110. for ( var name in opts)
  111. this.Add(name, opts[name]);
  112. })(buttons);
  113.  
  114. var sessions = (function (type, prefix, load) {
  115. switch (type) {
  116. case "prompt":
  117. return {"default":{"fields":{"text":{"value":load && GM_getValue(prefix+"-text","")||""}}}};
  118. default:
  119. return {};
  120. }
  121. })(this.Type,this.Name,this.LoadValues);
  122. for ( var session_name in opts.sessions ) {
  123. var session_obj = opts.sessions[session_name];
  124. if (session_name in sessions) {
  125. for ( var field_name in session_obj.fields ) {
  126. var field_obj = session_obj.fields[field_name];
  127. if (field_name in sessions[session_name]) {
  128. if (typeof field_obj.value != "undefined")
  129. sessions[session_name].fields[field_name].value = field_obj.value;
  130. } else {
  131. sessions[session_name].fields[field_name] = field_obj;
  132. }
  133. }
  134. } else {
  135. sessions[session_name] = session_obj;
  136. }
  137. }
  138.  
  139. this.Session = new (function Sessions (opts, prefix, load) {
  140. /* propriedades/metodos de funcionalidade comum a todas as sessoes, por exemplo: o estilo padrão, o tipo de organização em tabs ou não */
  141. this.List = {};
  142.  
  143. this.Add = function(name, opts) {
  144. this.List[name] = new (function Session(opts) {
  145. this.AlternatingClasses = opts.classes || [];
  146. this.Title = opts.title || "";
  147. this.Description = opts.description || "";
  148.  
  149. this.Field = new (function Fields(opts, prefix, load) {
  150. /* propriedades/metodos de funcionalidade comum a todos os campos, por exemplo: o estilo padrão */
  151. this.List = {};
  152.  
  153. this.Add = function(name, opts) {
  154. this.List[name] = new (function Field(opts,prefix,load) {
  155. /* label,value,type, ... */
  156. this.Type = opts.type||( "list" in opts ? "array" : "string" );
  157. this.Label = opts.label||"";
  158. this.Help = opts.help||"";
  159. this.isHidden = (typeof opts.is_hidden == "undefined" ? false : opts.is_hidden);
  160.  
  161. switch (this.Type) {
  162. case "boolean":
  163. // this.isChecked = opts.is_checked||false;
  164. break;
  165. case "int":
  166. break;
  167. case "string":
  168. this.isMulti = (typeof opts.is_multi == "undefined" ? false : opts.is_multi);
  169. break;
  170. case "array":
  171. this.isSelect = (typeof opts.is_select == "undefined" ? true : opts.is_select);
  172. this.isMulti = (typeof opts.is_multi == "undefined" ? false : opts.is_multi);
  173. this.List = opts.list||{};
  174. break;
  175. }
  176. if (this.Type == "array" && this.isMulti)
  177. this.Value = opts.value||load && eval(GM_getValue(prefix+"-"+name,"[]"))||opts.default||[];
  178. else
  179. this.Value = opts.value||load && GM_getValue(prefix+"-"+name,"")||opts.default||"";
  180. })(opts,prefix,load);
  181. };
  182.  
  183. this.Remove = function(name) {
  184. if (name in this.List)
  185. delete this.List[name];
  186. };
  187.  
  188. for (var name in opts)
  189. this.Add(name, opts[name]);
  190. })(opts.fields||{},prefix,load);
  191. })(opts);
  192. };
  193.  
  194. this.Remove = function (name) {
  195. if (name in this.List)
  196. delete this.List[name];
  197. };
  198.  
  199. for (var name in opts)
  200. this.Add(name, opts[name]);
  201. })(sessions,this.Name,this.LoadValues);
  202.  
  203. this.Open = function (parent) {
  204. var main = document.createElement("form");
  205. main.style.display = "block";
  206. main.setAttribute("onsubmit","return false");
  207. main.className = "winconfig "+this.Class+" "+this.Type;
  208. main.style.width = this.Size[0];
  209. main.style.maxWidth = this.Size[0];
  210. if (this.Size[1]) {
  211. main.style.height = this.Size[1];
  212. main.style.maxHeight = this.Size[1];
  213. }
  214. var head = document.createElement("div");
  215. main.appendChild(head);
  216. head.className = "head";
  217. if (this.Title) {
  218. var title = document.createElement("div");
  219. title.className = "title";
  220. title.textContent = this.Title;
  221. head.appendChild(title);
  222. }
  223. if (this.Description) {
  224. var description = document.createElement("div");
  225. description.className = "description";
  226. description.innerHTML = this.Description;
  227. head.appendChild(description);
  228. }
  229.  
  230. var body = document.createElement("div");
  231. body.className = "body";
  232. var sessions = document.createElement("div");
  233. sessions.className = "sessions";
  234. body.appendChild(sessions);
  235. for ( var session_name in this.Session.List ) {
  236. var session_obj = this.Session.List[session_name];
  237. var session = document.createElement("div");
  238. session.className = "session "+session_name;
  239. if (session_obj.Title) {
  240. var title = document.createElement("div");
  241. title.className = "title";
  242. title.textContent = session_obj.Title;
  243. session.appendChild(title);
  244. }
  245. if (session_obj.Description) {
  246. var description = document.createElement("div");
  247. description.className = "description";
  248. description.textContent = session_obj.Description;
  249. session.appendChild(description);
  250. }
  251. var alt_classes = 0;
  252. for ( var field_name in session_obj.Field.List ) {
  253. var field_obj = session_obj.Field.List[field_name];
  254.  
  255. var field = document.createElement("div");
  256. var label = document.createElement("label");
  257. label.innerHTML = field_obj.Label;
  258. field.appendChild(label);
  259. var help = document.createElement("div");
  260. if (field_obj.Help) {
  261. var img = document.createElement("img");
  262. img.src= "data:image/gif;base64,R0lGODlhDgAOAOYAAAAckqu93jCC1QBmzN7n82iBwmCCwc3V6jFhtSVXrwBDtgCC6VzI/3aq4R5ty+/y+aLM8F2T1DOR5AA+qG+b0wBSvM3m+kh5w4mp2wBz297u/EqEzXmf11uc3COO5RdbuLLI5h+Y9f///zJ90AApnQBt1BdLp83s/0huuGCn5uf2/83c8Wid3SlyyGaLyD6C0AB156XD6ABbzXWLxS9UqeHs+EqQ13Oy62i69wCM+vn4+ZW44kCZ5gBKtypds87g9WuUxQBq5Cl70AJHrAAyp+Px+wFZv05zutnj8nWY04en1nmp4096wHWo4tn0/wZhxeTq9LvN6GSt62GKy0CM2QB77gBIvwB74ipYrOXu+K295s7Z7iN0zQBCqtfg72SEwun+/2CW1mCf3qvJ6gAzmQAgkwCB7HOv56rO8Gul3il1ynmPxkqU1vz4+Zu54ABbxnaf1P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAHEALAAAAAAOAA4AAAe9gHGCP2JCXFxqYSuCjEs2EBYaGj8xGxyMTU1OODw3N1RpRXBJcT82YCEpIm1tIhEOGhdbYmgMQQQiAlwiSAodAVNCKjlmHhJvMSJuCgpZPiNOVQswMjsiID09RFkJLycwVxlPIg8K2STcLSrhJRVRSl09E2RQWGFjUjIDRlMuQ11lvgQwsGJDEQFWPogQYQIADSgoDsTBQKEIiyFMjpApAAXIDEZKLmipscULlAAo1jAStGWKDwQJsBiQKCgQADs=";
  263. img.addEventListener("click",(function (field) {
  264. return function() {
  265. WinConfig.init({"type":"explanation","size":["450px",0],"title":field.Label,"description":"<pre>"+field.Help+"</pre>"}).Open().FadeIn(0);
  266. };
  267. })(field_obj), false);
  268. help.appendChild(img);
  269. }
  270. else help.innerHTML = "&nbsp;";
  271. help.className = "help";
  272. field.appendChild(help);
  273. var ac = session_obj.AlternatingClasses;
  274. field.className = field_name+" field "+(ac && ac.length && ac[alt_classes++ % ac.length]||"");
  275. var input;
  276. switch (field_obj.Type) {
  277. case "boolean":
  278. input = document.createElement("input");
  279. input.type = "checkbox";
  280. input.checked = !!field_obj.Value;
  281. field.appendChild(input);
  282. break;
  283. case "int":
  284. input = document.createElement("input");
  285. input.type = "text";
  286. input.value = field_obj.Value;
  287. field.appendChild(input);
  288. break;
  289. case "string":
  290. if (field_obj.isMulti)
  291. {
  292. input = document.createElement("textarea");
  293. input.innerHTML = field_obj.Value;
  294. }
  295. else
  296. {
  297. input = document.createElement("input");
  298. input.type = "text";
  299. input.value = field_obj.Value;
  300. }
  301. field.appendChild(input);
  302. break;
  303. case "password":
  304. input = document.createElement("input");
  305. input.type = "password";
  306. input.value = field_obj.Value;
  307. field.appendChild(input);
  308. break;
  309. case "array":
  310. if (field_obj.isSelect) {
  311. input = document.createElement("select");
  312. input.multiple = field_obj.isMulti;
  313. for ( var name in field_obj.List ) {
  314. var option = document.createElement("option");
  315. option.value = name;
  316. option.textContent = field_obj.List[name];
  317. option.selected = in_array(option.value, field_obj.Value);
  318. input.appendChild(option);
  319. }
  320. field.appendChild(input);
  321. } else {
  322. input = document.createElement("input");
  323. input.type = ( field_obj.isMulti ? "checkbox" : "radio" );
  324. input.name = field_name + ( field_obj.isMulti && !field_obj.isSelect ? "[]" : "" );
  325. for ( var name in field_obj.List ) {
  326. var option = input.cloneNode(true);
  327. option.title = field_obj.List[name];
  328. option.value = name;
  329. option.checked = in_array(name, field_obj.Value);
  330. field.appendChild(option);
  331. }
  332. }
  333. break;
  334. }
  335. input.name = field_name;
  336. session.appendChild(field);
  337. }
  338. sessions.appendChild(session);
  339. }
  340. main.appendChild(body);
  341.  
  342. var foot = document.createElement("div");
  343. foot.className = "foot";
  344. foot.innerHTML = "<br />";
  345. var buttons = document.createElement("div");
  346. buttons.className = "buttons";
  347. for ( var button_name in this.Button.List ) {
  348. var button_obj = this.Button.List[button_name];
  349.  
  350. var button = document.createElement("input");
  351. // button.type = ( /^ok$/i.test(button_name) ? "submit" : "button" );
  352. button.type = "button";
  353. button.name = button_name;
  354. if (button_obj.Value) {
  355. button.value = button_obj.Value;
  356. }
  357. for ( var event_name in button_obj.Event.List ) {
  358. var event_obj = button_obj.Event.List[event_name];
  359. for ( var ai = 0 , at = event_obj.length ; ai < at ; ++ai )
  360. button.addEventListener(event_name, (function(method, params) {
  361. return function(e) {
  362. params.push(e.target);
  363. method.apply(this, params);
  364. };
  365. })(event_obj[ai],[this]), false);
  366. }
  367. buttons.appendChild(button);
  368. }
  369. foot.appendChild(buttons);
  370. main.appendChild(foot);
  371.  
  372. if (parent)
  373. this.Parent = parent;
  374.  
  375. var o = document.createElement("div");
  376. o.className = "opaque";
  377. this.Parent.appendChild(o);
  378. this.Opaque = o;
  379.  
  380. main.style.opacity = 0;
  381. this.Parent.appendChild(main);
  382. main.style.left = ( this.Position[0] == -1 ? Math.floor((window.innerWidth/2)-(main.offsetWidth/2)) : this.Position[0] ) + "px";
  383. main.style.top = ( this.Position[1] == -1 ? Math.floor((window.innerHeight/2)-(main.offsetHeight/2)): this.Position[1] ) + "px";
  384. main.addEventListener("keypress", (function(w) {
  385. return function(e) {
  386. if (e.keyCode == 27) {
  387. w.FadeOut(0);
  388. }
  389. }
  390. })(this),false);
  391. this.Rendered = main;
  392.  
  393. return this;
  394. };
  395. this.Save = function () {
  396. for ( var session_name in this.Session.List ) {
  397. var session_obj = this.Session.List[session_name];
  398. for ( var field_name in session_obj.Field.List ) {
  399. var field_obj = session_obj.Field.List[field_name];
  400. var obj = this.Rendered.elements.namedItem(field_name + ( field_obj.Type=="array" && field_obj.isMulti && !field_obj.isSelect ? "[]" : "" ) );
  401. var sv;
  402. switch (field_obj.Type) {
  403. case "int":
  404. sv = parseInt(obj.value, 10);
  405. if (isNaN(sv)) {
  406. var msg = "Field '"+field_obj.Label+"' must be integer";
  407. WinConfig.init({"type":"error","description":"<br />"+msg}).Open().FadeIn(0);
  408. throw msg;
  409. }
  410. break;
  411. case "boolean":
  412. sv = obj.checked;
  413. break;
  414. case "array":
  415. sv = [];
  416. if (field_obj.isMulti) {
  417. if (field_obj.isSelect)
  418. for ( var ai = 0 , at = obj.options.length ;ai < at ; ++ai ) {
  419. if (obj.options[ai].selected)
  420. sv.push(obj.options[ai].value);
  421. } else {
  422. for ( ; obj ; obj = obj.nextSibling ) {
  423. if (obj.checked)
  424. sv.push(obj.value);
  425. }
  426. }
  427. }
  428. else if (field_obj.isSelect)
  429. sv.push(obj.options[obj.selectedIndex].value);
  430. else
  431. for ( ; obj ; obj = obj.nextSibling ) {
  432. if (obj.checked) {
  433. sv.push(obj.value);
  434. break;
  435. }
  436. }
  437. sv = uneval(sv);
  438. break;
  439. default:
  440. sv = obj.value;
  441. break;
  442. }
  443. GM_setValue(this.Name +"-"+ field_name,sv);
  444. }
  445. }
  446.  
  447. return this;
  448. };
  449. this.Close = function () {
  450. this.Parent.removeChild(this.Rendered);
  451. this.Rendered = null;
  452. this.Parent.removeChild(this.Opaque);
  453. this.Opaque = null;
  454.  
  455. return this;
  456. };
  457. this.FadeIn = function (time, interval) {
  458. if (typeof time == "undefined")
  459. time = 900;
  460. else if (!time)
  461. time = 1;
  462. if (typeof interval == "undefined")
  463. interval = 60;
  464. else if (!interval)
  465. interval = 1;
  466. this.Rendered.style.opacity = 0;
  467. this.Opaque.style.display = "block";
  468. (function recursive (node, time,interval) {
  469. node.style.opacity = 1 * node.style.opacity + 1/(time/interval);
  470. if (node.style.opacity < 1)
  471. setTimeout(recursive,interval,node,time,interval);
  472. else
  473. node.style.display = "block";
  474. })(this.Rendered, time, interval);
  475.  
  476. return this;
  477. };
  478. this.FadeOut = function (time, interval) {
  479. if (typeof time == "undefined")
  480. time = 900;
  481. else if (!time)
  482. time = 1;
  483. if (typeof interval == "undefined")
  484. interval = 60;
  485. else if (!interval)
  486. interval = 1;
  487. this.Rendered.style.opacity = 1;
  488. (function recursive(obj, time, interval) {
  489. obj.Rendered.style.opacity -= 1/(time/interval);
  490. if (obj.Rendered.style.opacity > 0)
  491. setTimeout(recursive,interval,obj,time,interval);
  492. else {
  493. obj.Close(obj.Rendered.parentNode);
  494. // obj.Rendered.parentNode.removeChild(obj.Rendered);
  495. // obj.Opaque.parentNode.removeChild(obj.Opaque);
  496. }
  497. })(this, time, interval);
  498.  
  499. return this;
  500. }
  501. })(opts);
  502. };
  503. /*
  504. WinConfig.loadDefaultCss();
  505. WinConfig.init({
  506. "type":"explanation",
  507. "description":"<br />Some king of explanation."
  508. }).Open().FadeIn(0);
  509. WinConfig.init({
  510. "type":"warning",
  511. "description":"<br />Something has happened!"
  512. }).Open().FadeIn(0);
  513. WinConfig.init({
  514. "type":"question",
  515. "description":"<br />Are you sure you want to proceed?"
  516. }).Open().FadeIn(0);
  517. WinConfig.init({
  518. "type":"error",
  519. "description":"<br />An error has occurred!"
  520. }).Open().FadeIn(0);
  521. WinConfig.init({
  522. "type":"prompt",
  523. "description":"<br />Type something",
  524. "positiveCallback":function(w,e)
  525. {
  526. alert(w.Name+"-text = "+e.form.elements.namedItem("text").value);
  527. w.FadeOut();
  528. }
  529. }).Open().FadeIn(0);
  530. WinConfig.init({
  531. // "name":"TrainingSchool-"+NeopetsDocument.Username,
  532. "title":"Training Shool : Configuration",
  533. "size":["510px",0],
  534. "description":"<br />",
  535. "sessions":{
  536. "default":{
  537. "fields":{
  538. "TempTrainingList":{"label":"Training List","help":"Training.All\t\tTrains everything\nTraining.Strength|Training.Defence\tTrains both Strength or Defence\nTraining.All&~(Training.Level)\tTrains everything except Level","default":"pet_name1:Training.All\r\npet_name2:Training.Strength|Training.Defence\r\npet_name3:Training.All&~(Training.Level)","is_multi":true},
  539. "PinNumber":{"label":"Pin Number","type":"password"},
  540. "SearchForCodestone":{"label":"Search for codestones?","type":"boolean","default":true},
  541. "WithdrawNp":{"label":"Withdraw Neopoints?","type":"boolean","default":true}
  542. }
  543. }
  544. },
  545. "positiveCallback":function(w,e)
  546. {
  547. var pets = e.form.elements.namedItem("TempTrainingList").textContent.split(/[\r\n]+/);
  548. var obj = {};
  549. for ( var ai = 0 , at =pets.length ; ai < at ; ++ai )
  550. {
  551. var pet = pets[ai].split(":",2);
  552. obj[pet[0]] = pet[1].replace(/:/g,"|");
  553. }
  554. GM_setValue(w.Name+"-TrainingList",uneval(obj));
  555. var pin = e.form.elements.namedItem("PinNumber").value;
  556. if (pin && !/^\d{4}$/.test(pin))
  557. {
  558. var msg = "Field 'Pin Number' must be a 4-digit number";
  559. WinConfig.init({"type":"error","description":"<br />"+msg}).Open().FadeIn(0);
  560. throw msg;
  561. }
  562. w.Save();
  563. w.FadeOut();
  564. }
  565. }).Open().FadeIn();
  566. */

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址