String.prototype.line = function () {
    return this.replace(/\s+$/g,'').replace(/^\s+/g,'').replace(/\s+/g,' ');
}

if (!document.onLoadFunctions) {
	document.onLoadFunctions = new Array();
	window.onload = function () { for (var i=0; document.onLoadFunctions.length>i;i++) document.onLoadFunctions[i](); }
}

document.onLoadFunctions.push ( function () {

	for (var fi=0; document.forms.length>fi; fi++) {
		var form = document.forms[fi];
		if (form.className.search(/preset/)==-1)
			continue;
		if (form.id.search(/^\w+$/)==-1)
			continue;

		form.preset = new Object();

		form.preset.Update = function (element) {
			var thisvalue = this.ReadForm();
			if (thisvalue == this.cookie) {
				this.form.className="preset_clean";
			} else {
				this.form.className="preset_dirty";
			}
		};

		form.preset.Erase = function () {
			document.cookie = this.cookieName+"=;path=/;";
			this.cookie = this.ReadCookie();
			if (this.cookie != "") {
				this.form.className="preset_error";
				return;
			}
			this.Update();
		};

		form.preset.Store = function () {
			var data = this.ReadForm();
			document.cookie = this.cookieName+"="+data+";path=/;expires=Tue, 22 Feb 2022 21:22:22 GMT;";
			this.cookie = this.ReadCookie();
			if (data == this.cookie) {
				this.form.className="preset_clean";
			} else {
				this.form.className="preset_error";
				alert ("Cookie konnte nicht gesetzt werden");
			}
		};

		form.preset.Recall = function (protect) {
			this.cookie = this.ReadCookie();
			var values = new Object();
			if (this.cookie != "") {
				var tagvals= this.cookie.split("&");
				for (i=0; tagvals.length>i; i++) {
					var tagval = tagvals[i].split("=",2);
					var tag = decodeURIComponent(tagval[0]);
					var val = decodeURIComponent(tagval[1]);
					values[tag]=val;
				}
			}
			var used = new Object();
			for (var i=0; this.selected.length>i; i++) {
				var obj = this.selected[i];
				if(!protect) obj.selected = values[obj.formpreset_tag]?true:false;
				used[obj.formpreset_tag] = true;
			}
			for (var i=0; this.checked.length>i; i++) {
				var obj = this.checked[i];
				if (!protect) obj.checked = values[obj.formpreset_tag]?true:false;
				used[obj.formpreset_tag] = true;
			}
			for (var i=0; this.value.length>i; i++) {
				var obj = this.value[i];
				var value = values[obj.formpreset_tag];
				if (!protect) obj.value = value==null ? "" : value;
				used[obj.formpreset_tag] = true;
			}
			this.unused = new Object();
			for (tag in values) {
				if (!used[tag]) this.unused[tag]=values[tag];
			}
			//for (tag in this.unused) { alert ("UNUSED: "+tag+"="+this.unused[tag]); }
			this.Update();
		};

		form.preset.ReadCookie = function () {
			if (!document.cookie) return "";
			var cookies = document.cookie.split(";");
			for (i=0; cookies.length>i; i++) {
				var fields = cookies[i].line().split("=");
				if (fields[0]!=this.cookieName) continue;
				fields.shift();
				return fields.join("=");
			}
			return "";
		};

		form.preset.ReadForm = function () {
			data = new Array();
			for (var i=0; this.selected.length>i; i++) {
				var obj = this.selected[i];
				if (obj.selected) data.push (obj.formpreset_tag+"=1");
			}
			for (var i=0; this.checked.length>i; i++) {
				var obj = this.checked[i];
				if (obj.checked) data.push (obj.formpreset_tag+"=1");
			}
			for (var i=0; this.value.length>i; i++) {
				var obj = this.value[i];
				if (obj.value!="") data.push (obj.formpreset_tag+"="+encodeURIComponent(obj.value));
			}
			for (tag in this.unused) {
				//alert ("DAZU: "+tag+"="+this.unused[tag]);
				data.push (encodeURIComponent(tag)+"="+encodeURIComponent(this.unused[tag]));
			}

			return data.sort().join('&');
		};

		form.preset.cookieName	= "PRESET."+form.id+".default";
		form.preset.cookie	= form.preset.ReadCookie();
		form.preset.form	= form;
		form.preset.checked	= new Array();
		form.preset.selected	= new Array();
		form.preset.value	= new Array();
		form.preset.autosubmit	= form.className.search(/autosubmit/)>=0;
		form.preset.ishidden	= new Object();

		for (var ei=0; form.elements.length>ei; ei++) {
			var element = form.elements[ei];

			if (element.nodeName.toLowerCase()=='button' ||
				element.nodeName.toLowerCase()=='input' && element.type=="button") {

				if (element.className.search(/store/)>=0) {
					element.onclick = function () { this.form.preset.Store();};
					continue;
				}
				if (element.className.search(/recall/)>=0) {
					element.onclick = function () { this.form.preset.Recall();};
					continue;
				}
				if (element.className.search(/erase/)>=0) {
					element.onclick = function () { this.form.preset.Erase();};
					continue;
				}
			}

			if (element.nodeName.toLowerCase()=='input' && element.type=="hidden") {
				form.preset.ishidden[element.name]=true;
				continue;
			}

			if (element.className.search(/save/)==-1)
				continue;
			if (element.name.search(/^\w+$/)==-1)
				continue;

			if (element.nodeName.toLowerCase()=='select') {
				for (var oi=0; element.options.length>oi; oi++) {
					var option = element.options[oi];
					option.formpreset_tag =	encodeURIComponent(element.name)
							+ "." +	encodeURIComponent(option.value);
					form.preset.selected.push (option);
				}
				element.onchange = function () { this.form.preset.Update(); };
				continue;
			}
			if (element.nodeName.toLowerCase()=='input') {
				switch (element.type) {
				case "checkbox":
				case "radio":
					element.formpreset_tag = encodeURIComponent(element.name)
						+ "." +	encodeURIComponent(element.value);
					form.preset.checked.push (element);
					element.onchange = function () { this.form.preset.Update(); };
					continue;
				case "text":
					element.formpreset_tag = encodeURIComponent(element.name);
					form.preset.value.push (element);
					element.onchange = function () {
						this.value=this.value.line();
						this.form.preset.Update();
					};
					continue;
				}
			}
		}

		var hasQuery=false;
		if (location.search) {
			var tagvals = location.search.substr(1).split("&");
			for (var i=0; i<tagvals.length; i++) {
				if (!form.preset.ishidden[tagvals[i].split("=",2)[0]]) hasQuery=true;
			}
		}

		form.preset.Recall(hasQuery);
		if (!hasQuery && form.preset.cookie && form.preset.autosubmit) form.submit();
		form.preset.Update();
	}
});
