Newer
Older
WebInquirer / inquirer.js
var inquirer = inquirer || new function () {

	var icon = "R0lGODlhIAAgAKECADIyMjMzM////////yH5BAEKAAIALAAAAAAgACAAAAJulI8Zke2PFoC0LlZzW7qf633XGGHeiJqcaKWgsQov5JLvTNeYq+kM36vBUJNgaujDiVDIpLK58ylIiiU0NjWVZscHgAuUUXPOpfbhjD1bwmFIrHsvv+3Qrd4Byzda7N7h9zclmEOIFmgolgj4VgAAOw==";

	// Toolkit
	var muTK = new function () {
		var ui = {
			w: {}
		};

		function desktop() {
			if (!ui.dsk) {
				ui.dsk = document.createElement("div");
				ui.dsk.style.position = "absolute";
				ui.dsk.style.zIndex = 510;
				ui.dsk.style.top = 0;
				ui.dsk.style.left = 0;
				ui.dsk.style.width = "100%";
				ui.dsk.style.height = "100%";
				ui.bg = document.createElement("div");
				ui.bg.style.backgroundColor = "gray";
				ui.bg.style.opacity = 0.3;
				ui.bg.style.position = "absolute";
				ui.bg.style.top = 0;
				ui.bg.style.left = 0;
				ui.bg.style.width = "100%";
				ui.bg.style.height = "100%";
				ui.dsk.appendChild(ui.bg);
				ui.menu = document.createElement("div");
				ui.menu.style.position = "absolute";
				ui.menu.style.zIndex = 512;
				ui.menu.style.top = 0;
				ui.menu.style.left = 0;
				ui.menu.style.width = "100%";
				ui.menu.style.height = "16px";
				ui.menu.style.padding = "1px 5px 1px 5px";
				ui.menu.style.backgroundColor = "white";
				ui.menu.style.borderBottom = "1px solid black";
				ui.menu.sysMenu = document.createElement("img");
				ui.menu.sysMenu.style.width = "16px";
				ui.menu.sysMenu.style.height = "16px";
				ui.menu.sysMenu.src = "data:image/gif;base64," + icon;
				ui.menu.appendChild(ui.menu.sysMenu);
				ui.dsk.appendChild(ui.menu);
			}
			if (!document.body.contains(ui.dsk))
				document.body.appendChild(ui.dsk);
		}

		function close() {
			if (document.body.contains(ui.dsk))
				document.body.removeChild(ui.dsk);
		}

		function control(id, def) {
			var c = document.createElement("div");
			c._id = id;
			c.style.position = "absolute";
			c.setTop = function (val) {
				def.top = val;
				this.style.top = val + "px";
			}
			c.setLeft = function (val) {
				def.left = val;
				this.style.left = val + "px";
			}
			c.setWidth = function (val) {
				def.width = val;
				this.style.width = val + "px";
			}
			c.setHeight = function (val) {
				def.height = val;
				this.style.height = val + "px";
			}
			if (def.top)
				c.setTop(def.top);
			if (def.left)
				c.setLeft(def.left);
			if (def.width)
				c.setWidth(def.width);
			if (def.height)
				c.setHeight(def.height);
			if (def.content)
				for (var i = 0; i < def.content.length; i++)
					c.appendChild(def.content[i]);
			return c;
		}

		function window(id, def) {
			if (def.top == undefined)
				def.top = (ui.dsk.clientHeight - def.height) / 2;
			if (def.left == undefined)
				def.left = (ui.dsk.clientWidth - def.width) / 2;
			var wt = document.createElement("div");
			wt.style.borderBottom = "1px solid black";
			wt.style.textAlign = "center";
			wt.style.lineHeight = "20px";
			wt.innerText = def.title;
			if (!def.content)
				def.content = [];
			def.content.splice(0, 0, wt);
			var w = control(id, def);
			w.style.backgroundColor = def.bg == undefined ? "white" : def.bg;
			w.style.border = "1px solid black";
			w.style.boxShadow = "0 0 5px gray";
			ui.dsk.appendChild(w);
			ui.w[id] = w;
			return w;
		}

		function label(id, def) {
			var c = control(id, def);
			c.setText = function (text) {
				this.innerText = text;
			}
			c.setText(def.text);
			return c;
		}

		function list(id, def) {
			var c = control(id, def);
			c.style.border = "1px solid red";
			return c;
		}

		function get(id) {
			return ui.w[id];
		}

		this.desktop = desktop;
		this.close = close;
		this.window = window;
		this.get = get;
		this.list = list;
		this.label = list;
		this.button = list;
	}

	// Locals

	var formerOnError;
	var inq = this;

	// Methods

	function show() {
		muTK.desktop();
		var w = muTK.get("Werror");
		if (!w) {
			w = muTK.window("Werror", {
				title: "Error",
				width: 400,
				height: 200,
				content: [muTK.label("Lerror", {
					top: 30,
					left: 10,
					text: "---"
				}), muTK.list("Lerrors", {
					top: 80,
					left: 10,
					width: 320,
					height: 100,
				}), muTK.button("Bok", {
					top: 80,
					left: 10,
					width: 320,
					height: 100,
					text: "Ok",
					onClick: function () {
					}
				})]
			});
		}
	}

	function hide() {
		muTK.close();
	}

	function error(message, data) {
		if (this.autoShow)
			show();
	}

	// Konami code controller
	var ckc = (function (callback) {
		var kc = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; // Konami code
		var kcindex = 0;
		return function (e) {
			if (e.keyCode == kc[kcindex])
				kcindex++;
			else
				kcindex = 0;
			if (kcindex == kc.length)
				callback();
		}
	})(function () {
		this.show();
	}.bind(this));

	function hook() {
		formerOnError = window.onerror;
		window.onerror = function (message, source, lineno, colno, err) {
			error.bind(inq)(message, {
				"source": source,
				"at": lineno + ":" + colno,
				"error": err,
				"raw": arguments
			});
			formerOnError;
		}
		document.addEventListener("keydown", ckc, false);
	}

	// Publish
	/** Open Inquirer environment when a new unhandled error happen */
	this.autoShow = true;

	/** Hook the webpage to control errors (Automatically hooked) */
	this.hook = hook;

	/** Collect an error and if autoShow is true enters environment */
	this.error = error;

	/** Enters environment */
	this.show = show;

	/** Exit environent */
	this.hide = hide;

	/** Enters environment and open variable inspector */
	this.inspect = inspect; !!

	/** Enters environment and open inquirer console */
	this.console = console; !!

	/** Log an object into the console */
	this.log = log; !!

	// Hook to system

	hook();

} ();