	if(!window.Events) {
		// In respect to http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
		var Events = {
			_events: new Array(),
			add: function(obj, type, fn) {
				if((typeof type).toLowerCase() == "string") {
					if (obj.addEventListener) {
						obj.addEventListener(type, fn, false);
					} else if(obj.attachEvent) {
						obj["e" + type + fn] = fn;
						obj[type + fn] = function() {
							if(obj["e" + type + fn]) {//this is needed for errors caused through double-inclusion of buttons.js
								obj["e" + type + fn](window.event);
							}
						}
						obj.attachEvent("on" + type, obj[type + fn]);
					}
					this._events[this._events.length] = {
						obj: obj,
						type: type,
						fn: fn
					}
				} else {
					var types = type;
					for(var i = 0; i < types.lengths; i++) {
						var type = types[i];

						if (obj.addEventListener) {
							obj.addEventListener(type, fn, false);
						} else if(obj.attachEvent) {
							obj["e" + type + fn] = fn;
							obj[type + fn] = function() {
								obj["e" + type + fn](window.event);
							}
							obj.attachEvent("on" + type, obj[type + fn]);
						}
						this._events[this._events.length] = {
							obj: obj,
							type: type,
							fn: fn
						}
					}
				}
			},
			remove: function(obj, type, fn) {
				if (obj.removeEventListener) {
					obj.removeEventListener(type, fn, false);
				} else if(obj.detachEvent) {
					obj.detachEvent("on" + type, obj[type + fn]);
					obj[type + fn] = null;
					obj["e" + type + fn] = null;
				}
				for(var i = this._events.length; i >= 0 ; i--) {
					if(this._events[i]) {
						var ev = this._events[i];
						if(ev.obj == obj && ev.type == type && ev.fn == fn) {
							this._events.splice(i,1);
						}
					}
				}
			},
			cleanup: function() {
				for(var i = 0; i < this._events.length; i++) {
					var evt = this._events[i];
					if(evt) {
						this.remove(evt.obj, evt.type, evt.fn);
					}
				}
			},			
			target: function(e) {
				var target = e.target || e.srcElement;				
				if (target.nodeType == 3) {
					target = target.parentNode;
				}				
				return target;
			},
			stop: function(e) {
				e.cancelBubble = true;
				if(e.stopPropagation) e.stopPropagation();
			},
			debug: function() {
				for(var elemid in this._events) {
					var ev = this._events[elemid];
					debug(ev.obj + " - " + ev.type + " - " + ev.fn);
				}			
			}
		}
		Events.add(window, "unload", function() {
			Events.cleanup();
		});
	}

		// These functions are responsible to change classNames of buttons, on special events
		var activeButton = false;

		function activateButton(item) {
			if(item.disabled == true) {
				disableButton(item);
			} else {
				activeButton = item;
				if((navigator.appName + navigator.userAgent).toLowerCase().indexOf('opera') == -1) {
					item.className = item.className.replace(/Disabled|Inactive|Hover/, 'Active');
				}
			}
		}
		
		function deactivateButton(item) {
			if(item.disabled == true) {
				disableButton(item);
			} else {
				activeButton = false;
				item.className = item.className.replace(/Disabled|Active|Hover/, 'Inactive');
				item.setAttribute("lastButtonState", "");
			}
		}
		
		function hoverButton(item) {
			if(item.disabled == false && (activeButton == false || item == activeButton)) {
				var lastButtonState = item.getAttribute("lastButtonState");
				if(!lastButtonState) {
					if(window.addMouseOverEvent && addMouseOverEvent == true) {
						item.className = item.className.replace(/Disabled|Active|Inactive/, 'Hover');
					}
				} else {
					item.className = lastButtonState;
				}
			}
		}
		
		function leaveButton(item) {
			if(item.disabled == false) {
				if(item.className.indexOf("Inactive") == -1) {
					item.setAttribute("lastButtonState", item.className);
				}
				item.className = item.className.replace(/Disabled|Active|Hover/, 'Inactive');
			}
		}
		
		function disableButton(item) {
			item.className = item.className.replace(/Active|Inactive/, 'Disabled');
		}

		function changeButtonState(button, state) {
			if(button) {
				if(state) {
					if(button.disabled == true) {
						button.disabled = false;
						deactivateButton(button);
					}
				} else {
					button.disabled = true;
					disableButton(button);
				}
			}
		}

		function renderButtons() {
			//jf: commented out, because the safari variant works with all browser and sometimes there is no form around buttons
			//if(window.safari) {				
				var inputs = document.getElementsByTagName("input");
				for(var i = 0; i < inputs.length; i++) {
					processPossibleButton(inputs[i]);
				}

				var buttons = document.getElementsByTagName("button");
				for(var i = 0; i < buttons.length; i++) {
					processPossibleButton(buttons[i]);
				}
			/*} else {
				var formList = document.forms;
				for(var i = 0; i < formList.length; i++) {
					var elementList = formList[i].elements;
					
					for(var j = 0; j < elementList.length; j++) {
						processPossibleButton(elementList[j]);
					}
				}
			}*/
		}
			
		function makeHiddenButtonsUnuseable() {
			if(window.safari) {
				var inputs = document.getElementsByTagName("input");
				for(var i = 0; i < inputs.length; i++) {
					makeUnuseable(inputs[i]);
				}
				var buttons = document.getElementsByTagName("button");
				for(var i = 0; i < buttons.length; i++) {
					makeUnuseable(buttons[i]);
				}
			}
		}
		
		function makeUnuseable(elem) {
			if(elem.style.visibility == 'hidden') {
				elem.disabled = true;
			}
		}
		


		function processPossibleButton(elem) {
			if(elem.getAttribute("rendered") && elem.getAttribute("rendered") == "true") {
				return;
			}

			if(elem.type != "button" && elem.type != "submit" && elem.tagName != "BUTTON") {
				return;
			}
			
			Events.add(elem, "mousedown", function(e) {
				activateButton(this);
			});
			
			Events.add(elem, "mouseup", function(e) {
				deactivateButton(this);
			});
			
			Events.add(elem, "mouseout", function(e) {
				leaveButton(this);
			});
			
			Events.add(elem, "mouseover", function(e) {
				hoverButton(this);
			});
			
			if(elem.className == '') {
				elem.className = 'buttonInactive';
			}
			
			if(elem.disabled == true) {
				disableButton(elem);
			} else {
				deactivateButton(elem);
			}
			
			var ua = navigator.userAgent.toLowerCase();
			if(ua.indexOf('mac') >= 0 && ua.indexOf('msie') >= 0 && ua.indexOf('5.') >= 0) {
				elem.style.padding = '5px';
			}
			
			elem.setAttribute("rendered", "true");
		}
		
		function deactivateEveryButton() {
			if(window.safari) {				
				var inputs = document.getElementsByTagName("input");
				for(var i = 0; i < inputs.length; i++) {
					deactivateButton(inputs[i]);
				}

				var buttons = document.getElementsByTagName("button");
				for(var i = 0; i < buttons.length; i++) {
					deactivateButton(buttons[i]);
				}
			} else {
				var formList = document.forms;
				for(var i = 0; i < formList.length; i++) {
					var elementList = formList[i].elements;
					
					for(var j = 0; j < elementList.length; j++) {
						var elem = elementList[j];
						
						if(elem.type != "button" && elem.type != "submit") {
							continue;
						}
	
						deactivateButton(elem);
					}
				}
			}
		}

		Events.add(document, "mouseup", function(e) {
			deactivateEveryButton();
		});

		if(window.doBeforeButtons) {
			doBeforeButtons();
		}

		if(window.printButtons && typeof printButtons == "function" && window.moveButtons && window.moveButtons == true) {
			printButtons();
		}

		renderButtons();
		makeHiddenButtonsUnuseable();

		if(window.doAfterButtons) {
			doAfterButtons();
		}
