function searchToggle(id) {
	if (document.getElementById(id).style.display == 'none') {
		document.getElementById(id).style.display = '';
	}
	else {
		document.getElementById(id).style.display = 'none';
	}
}
function reset_form(formid) {
	form = document.getElementById(formid);
	for (var i=0; i<form.elements.length; i++) {
		element = form.elements[i];
		if (element.type == 'select-one') {
			element.className = element.className.replace(/highlighted/, '');
			element.options[0].selected = true;
		} else if (element.type == 'text') {
			element.className = element.className.replace(/highlighted/, '');
			element.value = '';
		} else if (element.type == 'radio') {
			element.className = element.className.replace(/highlighted/, '');
			if (element.value == '0') {
				element.checked = true;
			} else {
				element.checked = false;
			}
		}
	}
}
/**
* This is the common event-handler that calls the event-stack
* @var event Event-object when called as event-handler
*/
function handleEvent(event) {
	/**
	 * IE-fix
	 */
	if (!event) {
		event = window.event;
	}
	if (this.eventStack && this.eventStack[event.type] && (this.eventStack[event.type].length > 0)) {
		var i;
		var r = true;
		for (i=0; i<this.eventStack[event.type].length; i++) {
			this.callEvent = this.eventStack[event.type][i];
			if (!this.callEvent(event)) { r = false; }
			this.callEvent = null;
		}
		return r;
	} else {
		return true;
	}
}
/**
* Create event-stack for object obj
* @var obj Object to create event-stack for
*/
function initEventStack(obj) {
	if (!obj.eventStack) {
		/**
		* Create event-stack
		*/
		obj.eventStack = new Array();
		/**
		*	Create Stacks for common events
		*/
		obj.eventStack['click'] = new Array();
		obj.eventStack['dblclick'] = new Array();
		obj.eventStack['keydown'] = new Array();
		obj.eventStack['keypress'] = new Array();
		obj.eventStack['keyup'] = new Array();
		obj.eventStack['mousedown'] = new Array();
		obj.eventStack['mousemove'] = new Array();
		obj.eventStack['mouseup'] = new Array();
		obj.eventStack['mouseover'] = new Array();
		obj.eventStack['mouseout'] = new Array();
		/**
		* Create stacks for special events
		*/
		if (obj.tagName.match(/^(a|area|button|input|label|select|textarea)$/i)) {
			obj.eventStack['focus'] = new Array();
			obj.eventStack['blur'] = new Array();
		}
		if (obj.tagName.match(/^(input|select|textarea)$/i)) {
			obj.eventStack['change'] = new Array();
		}
		if (obj.tagName.match(/^(frameset|body)$/i)) {
			obj.eventStack['load'] = new Array();
			obj.eventStack['unload'] = new Array();
		}
		if (obj.tagName.match(/^(form)$/i)) {
			obj.eventStack['reset'] = new Array();
			obj.eventStack['submit'] = new Array();
		}
		if (obj.tagName.match(/^(input|textarea)$/i)) {
			obj.eventStack['select'] = new Array();
		}
	}
	return true;
}
/**
 * This is the common event-handler modifier.
 * Use only this function (or it's aliases) to modify the event-stack
 */
function addEvent(event, obj, func) {
	// Allow obj be id of object
	if (!obj.tagName) {
		if (document.getElementById(obj)) {
			obj = document.getElementById(obj);
		} else {
			return false;
		}
	}
	// Enable event-stack
	initEventStack(obj);
	if (obj.eventStack[event]) {
		// Enable eventhandling for event
		eval('obj.on'+event+' = handleEvent;');
		// Blur after onclick to speedup onchange-event
		if (obj.tagName.match(/^(input)$/i) && obj.type.match(/^(radio|checkbox)$/i) && (event == 'change')) {
			var blurOnClick = false;
			var i;
			for (i=0; i<obj.eventStack[event].length; i++) {
				if (obj.eventStack[event][i] == obj.blur) {
					blurOnClick = true;
					break;
				}
			}
			addEvent('click', obj, obj.blur);
		}
		// Store handler-function
		obj.eventStack[event][obj.eventStack[event].length] = func;
		return true;
	} else {
		return false;
	}
}
/**
 * This adds a new mouseover-event-handler to obj
 * Is an alias to addEvent
 */
function addMouseOver(obj, func) {
	return addEvent('mouseover', obj, func);
}
/**
 * This adds a new mouseout-event-handler to obj
 * Is an alias to addEvent
 */
function addMouseOut(obj, func) {
	return addEvent('mouseout', obj, func);
}
/**
 * Use this function to fill javascript style-object
 *  with computed values
 * Can only be called once
 * Call function with obj.initStyle();
 * Function is available to all objects in fixElements-list
 *  of function makeBrowserCompatible();
 */
function initStyle() {
	var i, value;
	var translateStyles = new Array(
		/* Dimensions */
		Array('width', 'width'),
		Array('minWidth', 'min-width'),
		Array('maxWidth', 'max-width'),
		Array('height', 'height'),
		Array('minHeight', 'min-height'),
		Array('maxHeight', 'max-height'),
		/* Position */
		Array('position', 'position'),
		Array('visibility', 'visibility'),
		Array('zIndex', 'z-index'),
		Array('cssFloat', 'float'),
		Array('diplay', 'diplay'),
		Array('clear', 'clear'),
		Array('clip', 'clip'),
		Array('overflow', 'overflow'),
		Array('left', 'left'),
	 	Array('right', 'right'),
		Array('top', 'top'),
		Array('bottom', 'bottom'),
		/* Padding */
		Array('paddingLeft', 'padding-left'),
	 	Array('paddingRight', 'padding-right'),
		Array('paddingTop', 'padding-top'),
		Array('paddingBottom', 'padding-bottom'),
		/* Margin */
		Array('marginLeft', 'margin-left'),
	 	Array('marginRight', 'margin-right'),
		Array('marginTop', 'margin-top'),
		Array('marginBottom', 'margin-bottom'),
		/* Border */
		Array('borderLeftStyle', 'border-left-style'),
		Array('borderLeftColor', 'border-left-color'),
		Array('borderLeftWidth', 'border-left-width'),
		Array('borderRightStyle', 'border-right-style'),
		Array('borderRightColor', 'border-right-color'),
		Array('borderRightWidth', 'border-right-width'),
		Array('borderTopStyle', 'border-top-style'),
		Array('borderTopColor', 'border-top-color'),
		Array('borderTopWidth', 'border-top-width'),
		Array('borderBottomStyle', 'border-bottom-style'),
		Array('borderBottomColor', 'border-bottom-color'),
		Array('borderBottomWidth', 'border-bottom-width'),
		Array('borderLeftStyle', 'border-left-style'),
		Array('borderLeftColor', 'border-left-color'),
		Array('borderLeftWidth', 'border-left-width'),
		/* Font */
		Array('fontFamily', 'font-family'),
		Array('fontStyle', 'border-style'),
		Array('fontVariant', 'border-variant'),
		Array('fontSize', 'font-size'),
		Array('fontWeight', 'border-weight'),
		Array('fontStretch', 'border-stretch'),
		/* Text */
		Array('color', 'color'),
		Array('textAlign', 'text-align'),
		Array('textDecoration', 'text-decoration'),
		Array('textIndent', 'text-indent'),
		Array('textTransform', 'text-transform'),
		Array('verticalAlign', 'vertical-align'),
		Array('letterSpacing', 'letter-spacing'),
		Array('wordSpacing', 'word-spacing'),
		Array('lineHeight', 'line-height'),
		Array('direction', 'direction'),
		/* Background */
		Array('backgroundAttachment', 'background-attachment'),
		Array('backgroundColor', 'background-color'),
		Array('backgroundImage', 'background-image'),
		Array('backgroundPosition', 'background-position'),
		Array('backgroundRepeat', 'background-repeat'),
		/* Tables */
		Array('captionSide', 'caption-side'),
		Array('tableLayout', 'table-layout'),
		Array('borderCollapse', 'border-collapse'),
		Array('borderSpacing', 'border-spacing'),
		Array('emptyCells', 'empty-cells'),
		/* Lists */
		Array('listStyleImage', 'list-style-image'),
		Array('listStylePosition', 'list-style-position'),
		Array('listStyleType', 'list-style-type'),
		/* Other */
		Array('cursor', 'cursor'),
		Array('pageBreakAfter', 'page-break-after'),
		Array('pageBreakBefore', 'page-break-before')
	);
	if (this.currentStyle) {
		for (i=0; i<translateStyles.length; ++i) {
			if ( (value = eval('this.currentStyle.' + translateStyles[i][0])) && (value != "") ) {
				eval('this.style.'+translateStyles[i][0]+' = '+'\''+value+'\'');
			}
		}
	} else if (document.defaultView.getComputedStyle) {
		var computedStyle = document.defaultView.getComputedStyle(this,null);
		for (i=0; i<translateStyles.length; ++i) {
			if ( (value = computedStyle.getPropertyValue(translateStyles[i][1])) && (value != "") ) {
				eval('this.style.'+translateStyles[i][0]+' = '+'\''+value+'\'');
			}
		}
	}
	this.initStyle = null;
}
/**
 * Adds hover-possibility to all elements
 * use element.hover instead of element:hover as stylesheet
 */
function FixMouseOverStyle() {
	this.oldClassName = this.className;
	this.className = this.className+' hover';
}
function FixMouseOutStyle() {
	this.className = this.oldClassName;
}
/**
 * Enables the compatibility-workaround
 * Call it with <body onload="fixStyleSheet();">
 * Pass "new Array('a', 'ul', 'li', 'span', 'div', ...)" as first param
 *  to enable stylesheet-workaround for all listed element-types
 */
function fixStyleSheet(fixElements) {
	if (!fixElements) {
		var fixElements = new Array('a', 'ul', 'li', 'span', 'div');
	}
	var i,j, currentElements;
	for (i=0; i<fixElements.length; i++) {
		currentElements = document.getElementsByTagName(fixElements[i]);
		for (j=0; j<currentElements.length; j++) {
			// Add StyleSheet-Stuff
			currentElements[j].initStyle = initStyle;
			// Make elements hover-enabled
			addMouseOver(currentElements[j],FixMouseOverStyle);
			addMouseOut(currentElements[j],FixMouseOutStyle);
		}
	}
}
/**
* The html_form-base-class
*/
function html_form(formID) {
	function html_form__addEvent() {
	}
	this.addEvent = html_form__addEvent;
	/**
	* Show a page
	* @var s Page-ID to show
	*/
	function html_form__showPage(s)	{
		if (!s) s = 1;
		var i = 1;
		var p, n;
		while((p = document.getElementById(this.form.id+':page'+i)) && (n = document.getElementById(this.form.id+':navi'+i))) {
			n.className = n.className.replace(/(^| )active( |$)/, '$1');
			n.style.display = 'block';
			if (i == s) {
				n.className += ' active';
				p.style.display = 'block';
			} else {
				p.style.display = 'none';
			}
			++i;
		}
		return true;
	}
	this.showPage = html_form__showPage;
	/**
	* Store validators
	*/
	this.v = new Array();

	function html_form__addValidator(type, error, obj, target) {
		var f = this.form.html_form;
		if (obj.length) {
			obj = document.getElementById(f.form.id+':'+obj);
		}
		f.v[f.v.length] = new Array(type, error, obj, target);
	}
	this.addValidator = html_form__addValidator;

	function html_form__validate() {
		var f = this.form.html_form;
		var i, j, e;
		var v = true;
		// Reset error-messages for each element
	    for (i=0; i<f.form.elements.length; i++) {
			if (f.form.elements[i].type && (e = document.getElementById(f.form.elements[i].id+':error'))) {
				document.getElementById(f.form.elements[i].id+':container').className = f.form.elements[i].className.replace(/(^|\s)error($|\s)/, ' ');
				for (j=e.childNodes.length; j>0; --j) {
    				e.removeChild(e.childNodes[j-1]);
	    		}
			}
	    }
	    // Reset error-messages for global form
	    if (e = document.getElementById(f.form.id+':error')) {
			for (j=e.childNodes.length; j>0; --j) {
				e.removeChild(e.childNodes[j-1]);
    		}
		}
		// Validate
		for (i=0; i<f.v.length; i++) {
			if (f.v[i][0] == 'regex') {
				if (!f.v[i][2].value.match(f.v[i][3])) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			} else if (f.v[i][0] == 'equal') {
				if (f.v[i][3].length) {
					f.v[i][3] = document.getElementById(f.form.id+':'+f.v[i][3]);
				}
				if (f.v[i][2].value != f.v[i][3].value) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			} else if (f.v[i][0] == 'differ') {
				if (f.v[i][3].length) {
					f.v[i][3] = document.getElementById(f.form.id+':'+f.v[i][3]);
				}
				if (f.v[i][2].value == f.v[i][3].value) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			} else if (f.v[i][0] == 'int') {
				var ts = f.thousands_sep.replace(/(\.|\[|\]|\(|\)|-)/g, '\\$1');
				if (!f.v[i][2].value.match(new RegExp('^-?[0-9]{0,3}(('+ts+'[0-9]{3})*|[0-9]*)$'))) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			} else if ((f.v[i][0] == 'float') || (f.v[i][0] == 'number')) {
				var ts = f.thousands_sep.replace(/(\.|\[|\]|\(|\)|-)/g, '\\$1');
				var dp = f.decimal_point.replace(/(\.|\[|\]|\(|\)|-)/g, '\\$1');
				if (!f.v[i][2].value.match(new RegExp('^-?[0-9]{0,3}(('+ts+'[0-9]{3})*|[0-9]*)('+dp+'([0-9]+|-+))?$'))) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			} else if (f.v[i][0] == 'currency') {
				var ts = f.thousands_sep.replace(/(\.|\[|\]|\(|\)|-)/g, '\\$1');
				var dp = f.decimal_point.replace(/(\.|\[|\]|\(|\)|-)/g, '\\$1');
				if (!f.v[i][2].value.match(new RegExp('^-?[0-9]{0,3}(('+ts+'[0-9]{3})*|[0-9]*)('+dp+'[0-9]{1,2})?$'))) {
					f.error(f.v[i][1], f.v[i][2]);
					v = false;
				}
			}
		}
		return v;
	}
	this.validate = html_form__validate;

	function html_form__error(msg, obj) {
		var f = this.form.html_form;
		var e = document.getElementById(obj.id+':error');
		if (!e) { e = document.getElementById(f.form.id+':error'); }
		e.innerHTML += msg+'<br />';
		if (!document.getElementById(obj.id+':container').className.match(/(^|\s)error($|\s)/)) {
			document.getElementById(obj.id+':container').className += ' error';
		}
	}
	this.error = html_form__error;
	// Recurse
	this.html_form = this;
	this.form = document.getElementById('html_form:'+formID);
	this.form.html_form = this;
	this.form.form = this.form;
	// Some settings
	this.decimal_point = ',';
	this.thousands_sep = '\.';
}
