var mksystem = function() {
	return {
		dom: function() {
			return {
				createElement: function(tagname, variable, anotherelements) {
					var element = document.createElement(tagname);

					if (variable) {
						for (var key in variable) {
							element[key] = variable[key];
						}
					}

					if (anotherelements) {
						for (var key in anotherelements) {
							element.appendChild(anotherelements[key]);
						}
					}

					return element;
				},




				fade: function(node) {
				}
			};
		},




		effect: function() {
			return {
				expander: function(node, action) {
					var onclick = function() {
						if (this.className == "selected") {
							this.className = "noselected";
						}
						else {
							this.className = "selected";
						}


						var matches = (/expander\[(.*?)\]/).exec(this.rel);

						this.dependent = matches[1];


						if (action) {
							action(this);
						}


						return false;
					};


					var anchors = node.getElementsByTagName("a");

					for (var i = 0; i < anchors.length; i++) {
						if ((/expander\[(.*?)\]/).test(anchors[i].rel)) { anchors[i].onclick = onclick; }
					}
				},




				scroll: function(prev, next, node, size) {
					if (prev && next) {
					var page = 0;


					var change = function(selected) {
						for (var i = 0; i < node.childNodes.length; i++) {
							node.childNodes[i].style.display = "none";

							if (i >= selected && i < selected + size) {
								node.childNodes[i].style.display = "block";
							}
						}


						if (selected > 0 && selected < node.childNodes.length - size) {
							prev.style.display = "block";
							next.style.display = "block";
						}
						else {
							if (selected == 0) {
								prev.style.display = "none";
							}
							else {
								prev.style.display = "block";
							}

							if (selected >= node.childNodes.length - size) {
								next.style.display = "none";
							}
							else {
								next.style.display = "block";
							}
						}
					};




					prev.onclick = function() {
						try {
							change(--page);
						}
						catch (error) {
							alert(error);
						}

						return false;
					};


					next.onclick = function() {
						try {
							change(++page);
						}
						catch (error) {
							alert(error);
						}

						return false;
					};


					change(0);
					}
				}
			};
		},




		form: function() {
				var read = function(node, handler) {
						this.elementInput = function(node) {
							var elements = node.getElementsByTagName("input");

							for (var i = 0; i < elements.length; i++) {
								switch (elements[i].type) {
									case "text":
									case "password":
									case "hidden":
										this.onValueElement(elements[i]);
										break;

									case "radio":
									case "checkbox":
										this.onCheckedElement(elements[i]);
										break;
								}
							}
						};


						this.elementTextarea = function(node) {
							var elements = node.getElementsByTagName("textarea");

							for (var i = 0; i < elements.length; i++) {
								this.onValueElement(elements[i]);
							}
						};


						this.elementSelect = function(node) {
							var elements = node.getElementsByTagName("select");

							for (var i = 0; i < elements.length; i++) {
								this.onValueElement(elements[i]);
							}
						};


						this.onValueElement = function(element) {
							if (this.handler != null) {
								this.handler.onValueElement(element);
							}
						};


						this.onCheckedElement = function(element) {
							if (this.handler != null) {
								this.handler.onCheckedElement(element);
							}
						};


						this.handler = null;

						if (handler != undefined) {
							this.handler = handler;
						}


						this.elementInput(node);
						this.elementTextarea(node);
						this.elementSelect(node);
					};


				return {
					read: function(node, handler) {
							return new read(node, handler);
						},


					clear: function(node) {
							new read(node, new function() {
									this.onCheckedElement = function(element) {
										element.checked = "nochecked";
									};


									this.onValueElement = function(element) {
										element.value = "";
									};
								});
						}
				};
			},




		/*
		rel: function(string) {
			return {
				value: function(pattern) {
					if (pattern.test(string) == false) {
						return false;
					}
					else {
						return pattern.exec(string)[1];
					}
				}
			};
		},
		*/




		request: function(url, variable, handler) {
				var request = false;

				try {
					request = new XMLHttpRequest();
				}
				catch (error) {
					var versions = new Array(
						"MSXML2.XMLHTTP.6.0",
						"MSXML2.XMLHTTP.5.0",
						"MSXML2.XMLHTTP.4.0",
						"MSXML2.XMLHTTP.3.0",
						"MSXML2.XMLHTTP",
						"Microsoft.XMLHTTP"
					);

					for (var i = 0; i < versions.length && !request; i++) {
						try {
							request = new ActiveXObject(versions[i]);
						}
						catch (error) {
							alert(error);
						}
					}
				}


				if (request) {
					request.open("POST", url, true);

					if (handler != undefined) {
						request.onreadystatechange = function(args) {
								if (request.readyState == 4) {
									if (request.status == 200) {
										handler(request, args);
									}
								}
							};
					}

					var params = "";

					if (variable) {
						for (var key in variable) {
							var value = encodeURIComponent("" + variable[key]);

							if (params.length == 0) {
								params += key + "=" + value;
							}
							else {
								params += "&" + key + "=" + value;
							}
						}

						request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
						request.setRequestHeader("Content-length", params.length);
						request.setRequestHeader("Connection", "close");
					}

					request.send(params);
				}
			}
	};
}();

