Includes : WinConfig

WinConfig Function

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           Includes : WinConfig
// @namespace      http://gm.wesley.eti.br/includes
// @description    WinConfig Function
// @author         w35l3y
// @email          [email protected]
// @copyright      2009, w35l3y (http://gm.wesley.eti.br/includes)
// @license        GNU GPL
// @homepage       http://gm.wesley.eti.br/includes
// @version        2.0.0.0
// @language       en
// @include        nowhere
// @resource       winConfigCss http://pastebin.com/download.php?i=rHDg6Nyt
// @require        https://greasyfork.org/scripts/9631-includes-php/code/Includes%20:%20Php.user.js
// @history        2.0.0.0 Removed multiline strings due to recent firefox update
// ==/UserScript==

const WinConfig = function () {};
WinConfig.loadDefaultCss = function() {
	GM_addStyle(GM_getResourceText("winConfigCss"));
};
WinConfig.init = function (opts) {
	return new (function (opts) {
		this.Name = opts.name || "";
		this.Type = opts.type || "";
		this.Class = opts.class || "";
		this.LoadValues = ( typeof opts.load_values == "undefined" ? true : opts.load_values );
		this.Title = opts.title || (function (type) {
			switch (type) {
			case "prompt":
				return "Prompt Dialog";
			case "question":
				return "Question Dialog";
			case "warning":
				return "Warning Dialog";
			case "error":
				return "Error Dialog";
			case "explanation":
				return "Explanation Dialog";
			default:
				return "Settings";
			}
		})(this.Type);
		this.Description = opts.description||"";
		this.Position = opts.position||[-1,-1];
		this.Size = opts.size||["300px",0];
		this.Rendered = null;
		this.Parent = document.getElementsByTagName("body")[0];
		var buttons = (function(type) {
			switch (type) {
			case "prompt":
				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);}}}};
			case "warning":
			case "error":
			case "explanation":
				return {"ok":{"value":"OK","events":{"click":opts.positiveCallback||function(win,obj){win.FadeOut(0);}}}};
			case "question":
				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);}}}};
			default:
				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);}}}};
			}
		})(this.Type);
		for ( var button_name in opts.buttons) {
			var button_obj = opts.buttons[button_name];
			if (button_name in buttons) {
				if (typeof button_obj.value != "undefined")
					buttons[button_name].value = button_obj.value;
				for ( var event_name in button_obj.events ) {
					var event_obj = button_obj.events[event_name];
					buttons[button_name].events[event_name] = event_obj;
				}
			} else {
				buttons[button_name] = button_obj;
			}
		}
		this.Button = new (function Buttons(opts) {
			this.List = {};

			this.Add = function(name, opts) {
				this.List[name] = new (function Button (opts) {
					this.Value = opts.value || "";
					this.Event = new (function Events(opts) {
						this.List = {};

						this.Add = function (name, opts) {
							if (!(name in this.List))
								this.List[name] = [];

							this.List[name].push(opts);
						}
						this.Remove = function (name, opts) {
							if (name in this.List)
								for ( var at = this.List[name].length - 1 ; ~at ; --at )
									if (this.List[name][at] == opts) {
										this.List[name] = this.List[name].splice(at,1);
										break;
									}
						}

						for ( var name in opts )
							this.Add(name, opts[name]);
					})(opts.events);
				})(opts);
			};
			this.Remove = function (name) {
				if (name in this.List)
					delete this.List[name];
			}

			for ( var name in opts)
				this.Add(name, opts[name]);
		})(buttons);

		var sessions = (function (type, prefix, load) {
			switch (type) {
				case "prompt":
					return {"default":{"fields":{"text":{"value":load && GM_getValue(prefix+"-text","")||""}}}};
				default:
					return {};
			}
		})(this.Type,this.Name,this.LoadValues);
		for ( var session_name in opts.sessions ) {
			var session_obj = opts.sessions[session_name];
			if (session_name in sessions) {
				for ( var field_name in session_obj.fields ) {
					var field_obj = session_obj.fields[field_name];
					if (field_name in sessions[session_name]) {
						if (typeof field_obj.value != "undefined")
							sessions[session_name].fields[field_name].value = field_obj.value;
					} else {
						sessions[session_name].fields[field_name] = field_obj;
					}
				}
			} else {
				sessions[session_name] = session_obj;
			}
		}

		this.Session = new (function Sessions (opts, prefix, load) {
			/* 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 */
			this.List = {};

			this.Add = function(name, opts) {
				this.List[name] = new (function Session(opts) {
					this.AlternatingClasses = opts.classes || [];
					this.Title = opts.title || "";
					this.Description = opts.description || "";

					this.Field = new (function Fields(opts, prefix, load) {
						/* propriedades/metodos de funcionalidade comum a todos os campos, por exemplo: o estilo padrão */
						this.List = {};

						this.Add = function(name, opts) {
							this.List[name] = new (function Field(opts,prefix,load) {
								/* label,value,type, ... */
								this.Type = opts.type||( "list" in opts ? "array" : "string" );
								this.Label = opts.label||"";
								this.Help = opts.help||"";
								this.isHidden = (typeof opts.is_hidden == "undefined" ? false : opts.is_hidden);

								switch (this.Type) {
									case "boolean":
//										this.isChecked = opts.is_checked||false;
										break;
									case "int":
										break;
									case "string":
										this.isMulti = (typeof opts.is_multi == "undefined" ? false : opts.is_multi);
										break;
									case "array":
										this.isSelect = (typeof opts.is_select == "undefined" ? true : opts.is_select);
										this.isMulti = (typeof opts.is_multi == "undefined" ? false : opts.is_multi);
										this.List = opts.list||{};
										break;
								}
								if (this.Type == "array" && this.isMulti)
									this.Value = opts.value||load && eval(GM_getValue(prefix+"-"+name,"[]"))||opts.default||[];
								else
									this.Value = opts.value||load && GM_getValue(prefix+"-"+name,"")||opts.default||"";
							})(opts,prefix,load);
						};

						this.Remove = function(name) {
							if (name in this.List)
								delete this.List[name];
						};

						for (var name in opts)
							this.Add(name, opts[name]);
					})(opts.fields||{},prefix,load);
				})(opts);
			};

			this.Remove = function (name) {
				if (name in this.List)
					delete this.List[name];
			};

			for (var name in opts)
				this.Add(name, opts[name]);
		})(sessions,this.Name,this.LoadValues);

		this.Open = function (parent) {
			var main = document.createElement("form");
			main.style.display = "block";
			main.setAttribute("onsubmit","return false");
			main.className = "winconfig "+this.Class+" "+this.Type;
			main.style.width = this.Size[0];
			main.style.maxWidth = this.Size[0];
			if (this.Size[1]) {
				main.style.height = this.Size[1];
				main.style.maxHeight = this.Size[1];
			}
			var head = document.createElement("div");
			main.appendChild(head);
			head.className = "head";
			if (this.Title) {
				var title = document.createElement("div");
				title.className = "title";
				title.textContent = this.Title;
				head.appendChild(title);
			}
			if (this.Description) {
				var description = document.createElement("div");
				description.className = "description";
				description.innerHTML = this.Description;
				head.appendChild(description);
			}

			var body = document.createElement("div");
			body.className = "body";
			var sessions = document.createElement("div");
			sessions.className = "sessions";
			body.appendChild(sessions);
			for ( var session_name in this.Session.List ) {
				var session_obj = this.Session.List[session_name];
				var session = document.createElement("div");
				session.className = "session "+session_name;
				if (session_obj.Title) {
					var title = document.createElement("div");
					title.className = "title";
					title.textContent = session_obj.Title;
					session.appendChild(title);
				}
				if (session_obj.Description) {
					var description = document.createElement("div");
					description.className = "description";
					description.textContent = session_obj.Description;
					session.appendChild(description);
				}
				var alt_classes = 0;
				for ( var field_name in session_obj.Field.List ) {
					var field_obj = session_obj.Field.List[field_name];

					var field = document.createElement("div");
					var label = document.createElement("label");
					label.innerHTML = field_obj.Label;
					field.appendChild(label);
					var help = document.createElement("div");
					if (field_obj.Help) {
						var img = document.createElement("img");
						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=";
						img.addEventListener("click",(function (field) {
							return function() {
								WinConfig.init({"type":"explanation","size":["450px",0],"title":field.Label,"description":"<pre>"+field.Help+"</pre>"}).Open().FadeIn(0);
							};
						})(field_obj), false);
						help.appendChild(img);
					}
					else help.innerHTML = "&nbsp;";
					help.className = "help";
					field.appendChild(help);
					var ac = session_obj.AlternatingClasses;
					field.className = field_name+" field "+(ac && ac.length && ac[alt_classes++ % ac.length]||"");
					var input;
					switch (field_obj.Type) {
						case "boolean":
							input = document.createElement("input");
							input.type = "checkbox";
							input.checked = !!field_obj.Value;
							field.appendChild(input);
							break;
						case "int":
							input = document.createElement("input");
							input.type = "text";
							input.value = field_obj.Value;
							field.appendChild(input);
							break;
						case "string":
							if (field_obj.isMulti)
							{
								input = document.createElement("textarea");
								input.innerHTML = field_obj.Value;
							}
							else
							{
								input = document.createElement("input");
								input.type = "text";
								input.value = field_obj.Value;
							}
							field.appendChild(input);
							break;
						case "password":
							input = document.createElement("input");
							input.type = "password";
							input.value = field_obj.Value;
							field.appendChild(input);
							break;
						case "array":
							if (field_obj.isSelect) {
								input = document.createElement("select");
								input.multiple = field_obj.isMulti;
								for ( var name in field_obj.List ) {
									var option = document.createElement("option");
									option.value = name;
									option.textContent = field_obj.List[name];
									option.selected = in_array(option.value, field_obj.Value);
									input.appendChild(option);
								}
								field.appendChild(input);
							} else {
								input = document.createElement("input");
								input.type = ( field_obj.isMulti ? "checkbox" : "radio" );
								input.name = field_name + ( field_obj.isMulti && !field_obj.isSelect ? "[]" : "" );
								for ( var name in field_obj.List ) {
									var option = input.cloneNode(true);
									option.title = field_obj.List[name];
									option.value = name;
									option.checked = in_array(name, field_obj.Value);
									field.appendChild(option);
								}
							}
							break;
					}
					input.name = field_name;
					session.appendChild(field);
				}
				sessions.appendChild(session);
			}
			main.appendChild(body);

			var foot = document.createElement("div");
			foot.className = "foot";
			foot.innerHTML = "<br />";
			var buttons = document.createElement("div");
			buttons.className = "buttons";
			for ( var button_name in this.Button.List ) {
				var button_obj = this.Button.List[button_name];

				var button = document.createElement("input");
//				button.type = ( /^ok$/i.test(button_name) ? "submit" : "button" );
				button.type = "button";
				button.name = button_name;
				if (button_obj.Value) {
					button.value = button_obj.Value;
				}
				for ( var event_name in button_obj.Event.List ) {
					var event_obj = button_obj.Event.List[event_name];
					for ( var ai = 0 , at = event_obj.length ; ai < at ; ++ai )
						button.addEventListener(event_name, (function(method, params) {
							return function(e) {
								params.push(e.target);
								method.apply(this, params);
							};
						})(event_obj[ai],[this]), false);
				}
				buttons.appendChild(button);
			}
			foot.appendChild(buttons);
			main.appendChild(foot);

			if (parent)
				this.Parent = parent;

			var o = document.createElement("div");
			o.className = "opaque";
			this.Parent.appendChild(o);
			this.Opaque = o;

			main.style.opacity = 0;
			this.Parent.appendChild(main);
			main.style.left = ( this.Position[0] == -1 ? Math.floor((window.innerWidth/2)-(main.offsetWidth/2)) : this.Position[0] ) + "px";
			main.style.top = ( this.Position[1] == -1 ? Math.floor((window.innerHeight/2)-(main.offsetHeight/2)): this.Position[1] ) + "px";
			main.addEventListener("keypress", (function(w) {
				return function(e) {
					if (e.keyCode == 27) {
						w.FadeOut(0);
					}
				}
			})(this),false);
			
			this.Rendered = main;

			return this;
		};
		this.Save = function () {
			for ( var session_name in this.Session.List ) {
				var session_obj = this.Session.List[session_name];
				for ( var field_name in session_obj.Field.List ) {
					var field_obj = session_obj.Field.List[field_name];
					var obj = this.Rendered.elements.namedItem(field_name + ( field_obj.Type=="array" && field_obj.isMulti && !field_obj.isSelect ? "[]" : "" ) );
					var sv;
					switch (field_obj.Type) {
					case "int":
						sv = parseInt(obj.value, 10);
						if (isNaN(sv)) {
							var msg = "Field '"+field_obj.Label+"' must be integer";
							WinConfig.init({"type":"error","description":"<br />"+msg}).Open().FadeIn(0);
							throw msg;
						}
						break;
					case "boolean":
						sv = obj.checked;
						break;
					case "array":
						sv = [];
						if (field_obj.isMulti) {
							if (field_obj.isSelect)
							for ( var ai = 0 , at = obj.options.length ;ai < at ; ++ai ) {
								if (obj.options[ai].selected)
									sv.push(obj.options[ai].value);
							} else {
								for ( ; obj ; obj = obj.nextSibling ) {
									if (obj.checked)
										sv.push(obj.value);
								}
							}
						}
						else if (field_obj.isSelect)
							sv.push(obj.options[obj.selectedIndex].value);
						else
							for ( ; obj ; obj = obj.nextSibling ) {
								if (obj.checked) {
									sv.push(obj.value);
									break;
								}
							}
						sv = uneval(sv);
						break;
					default:
						sv = obj.value;
						break;
					}
					GM_setValue(this.Name +"-"+ field_name,sv);
				}
			}

			return this;
		};
		this.Close = function () {
			this.Parent.removeChild(this.Rendered);
			this.Rendered = null;
			this.Parent.removeChild(this.Opaque);
			this.Opaque = null;

			return this;
		};
		this.FadeIn = function (time, interval) {
			if (typeof time == "undefined")
				time = 900;
			else if (!time)
				time = 1;
			if (typeof interval == "undefined")
				interval = 60;
			else if (!interval)
				interval = 1;
			this.Rendered.style.opacity = 0;
			this.Opaque.style.display = "block";
			(function recursive (node, time,interval) {
				node.style.opacity = 1 * node.style.opacity + 1/(time/interval);
				if (node.style.opacity < 1)
				setTimeout(recursive,interval,node,time,interval);
				else
				node.style.display = "block";
			})(this.Rendered, time, interval);

			return this;
		};
		this.FadeOut = function (time, interval) {
			if (typeof time == "undefined")
				time = 900;
			else if (!time)
				time = 1;
			if (typeof interval == "undefined")
				interval = 60;
			else if (!interval)
				interval = 1;
			this.Rendered.style.opacity = 1;
			(function recursive(obj, time, interval) {
				obj.Rendered.style.opacity -= 1/(time/interval);
				if (obj.Rendered.style.opacity > 0)
				setTimeout(recursive,interval,obj,time,interval);
				else {
					obj.Close(obj.Rendered.parentNode);
//					obj.Rendered.parentNode.removeChild(obj.Rendered);
//					obj.Opaque.parentNode.removeChild(obj.Opaque);
				}
			})(this, time, interval);

			return this;
		}
	})(opts);
};
/*
WinConfig.loadDefaultCss();
WinConfig.init({
	"type":"explanation",
	"description":"<br />Some king of explanation."
}).Open().FadeIn(0);
WinConfig.init({
	"type":"warning",
	"description":"<br />Something has happened!"
}).Open().FadeIn(0);
WinConfig.init({
	"type":"question",
	"description":"<br />Are you sure you want to proceed?"
}).Open().FadeIn(0);
WinConfig.init({
	"type":"error",
	"description":"<br />An error has occurred!"
}).Open().FadeIn(0);
WinConfig.init({
	"type":"prompt",
	"description":"<br />Type something",
	"positiveCallback":function(w,e)
	{
		alert(w.Name+"-text = "+e.form.elements.namedItem("text").value);
		w.FadeOut();
	}
}).Open().FadeIn(0);
WinConfig.init({
//	"name":"TrainingSchool-"+NeopetsDocument.Username,
	"title":"Training Shool : Configuration",
	"size":["510px",0],
	"description":"<br />",
	"sessions":{
		"default":{
			"fields":{
				"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},
				"PinNumber":{"label":"Pin Number","type":"password"},
				"SearchForCodestone":{"label":"Search for codestones?","type":"boolean","default":true},
				"WithdrawNp":{"label":"Withdraw Neopoints?","type":"boolean","default":true}
			}
		}
	},
	"positiveCallback":function(w,e)
	{
		var pets = e.form.elements.namedItem("TempTrainingList").textContent.split(/[\r\n]+/);
		var obj = {};
		for ( var ai = 0 , at =pets.length ; ai < at ; ++ai )
		{
			var pet = pets[ai].split(":",2);
			obj[pet[0]] = pet[1].replace(/:/g,"|");
		}
		GM_setValue(w.Name+"-TrainingList",uneval(obj));
		var pin = e.form.elements.namedItem("PinNumber").value;
		if (pin && !/^\d{4}$/.test(pin))
		{
			var msg = "Field 'Pin Number' must be a 4-digit number";
			WinConfig.init({"type":"error","description":"<br />"+msg}).Open().FadeIn(0);
			throw msg;
		}
		w.Save();
		w.FadeOut();
	}
}).Open().FadeIn();
*/