if (typeof(Formhandler) == 'undefined'){

	var Formhandler={
		options: new Object(),

		
		// default options
		useOverlay: true,
		showFirstFormStepOnClose: true,
		unescape: false,

		// internal processing variables
		useAjax: true,
		hasOverlay: false,
		inProgress: false,
		oldForm: null,
		overlayInterval: null,
		
		getOption: function(formId, option){
			if (typeof(this.options[formId]) != 'undefined' && typeof(this.options[formId].unescape) != 'undefined'){
				return this.options[formId][option];
			}else if(typeof(this[option]) != 'undefined'){
				return this[option];
			}else{
				return null;
			}
		},

		handleForms: function(){
			var thisp=this;
			jQuery('.formhandler').each( function(){
				if (thisp.getOption(this.id, 'useAjax') != false){
					thisp.addEventHandler.call(thisp, this, this.id);
				}
			});
		},
		
		
		addEventHandler: function(form, formId){
			if (form.nodeType != '1' || form.nodeName.toLowerCase() != 'form'){
				form=this.findForm(form);
			}
			if (form === false){
				return;
			}

			jQuery(form).submit(function() { return false; });
			for (var i=0; i<form.elements.length; i++){

				var el=form.elements[i];
				if (el.nodeName.toLowerCase() != 'fieldset' && el.name.search(/^steps\[step-[0-9]+\]$/) > -1){
					jQuery(el).click(function(e){ Formhandler.handleForm(e.target, formId); });
				}
				
			}	

			var images=jQuery('#'+formId+' form input[type=image]');
			if (images.length > 0){
				for(var i=0; i<images.length;i++){
					el=images[i];
					if (el.nodeName.toLowerCase() != 'fieldset' && el.name.search(/^steps\[step-[0-9]+\]$/) > -1){
						jQuery(el).click(function(e){ Formhandler.handleForm(e.target, formId); });
					}
				}
			}
		},
		
		findForm: function(form){
			for(var i=0; i<form.childNodes.length; i++){
				var cn=form.childNodes.item(i);
				if (cn.nodeType == '1' && cn.nodeName.toLowerCase() == 'form'){
					return cn;
				}else if(cn.hasChildNodes()){
					ret=this.findForm(cn);
					if (ret != false){
						return ret;
					}
				}
			}
			return false;
		},
		
		handleForm: function(submit, formId){
		
			if (this.inProgress){
				return;
			}
			this.inProgress=true;
		
			if (!this.hasOverlay && this.useOverlay){
				this.addOverlay();
				this.hasOverlay=true;
			}
		
			var thisp=this;

			var params=encodeURIComponent(submit.name)+'=Submit';
			var form=submit.form;
			for(i=0; i<form.elements.length; i++){
				var el=form.elements[i];
				if (el.nodeName.toLowerCase() != 'fieldset' && el.name.search(/^steps\[step-[0-9]+\]$/) == -1){
					// special handling for other elements is surely needed
					if (el.nodeName.toLowerCase() == 'input' && (el.getAttribute('type') == 'checkbox' || el.getAttribute('type') == 'radio')){
						if (el.checked){
							params+='&'+encodeURIComponent(el.name)+'='+encodeURIComponent(el.value);
						}
					}else{
						params+='&'+encodeURIComponent(el.name)+'='+encodeURIComponent(el.value);
					}
				}
			}

			jQuery.post(form.action, params, function(data) {
				var newIdNode=thisp.extractAndRenderNewForm(data, formId);
				thisp.replaceForm(newIdNode, formId);
			});
		

		},

		extractAndRenderNewForm: function(text, formId){
			var startRe="<!-- BEGIN FORM "+formId+" -->";
			var start=text.search(new RegExp(startRe, 'g'));
			start+=startRe.length;
			var endRe="<!-- END FORM "+formId+" -->";
			var end=text.search(new RegExp(endRe, 'g'));
			var formText=text.substr(start, end-start);
			var formWrapper=document.createElement('div');
			

			if (this.getOption(formId, 'unescape') == 'javascript'){

				// the unescape reverses the smarty javascript escape function
				// located in libs/plugins/modifier.escape.php. This is useful
				// if the form is written in a document.write() like the easyContact.
				// WARNING: The form needs to be in a single string, or the innerHTML below will fail!!!
				
				formText=formText.replace(/\\\\/g, '\\')
				.replace(/\\"/g, '"')
				.replace(/\\'/g, '\'')
				.replace(/\\r/g, '\r')
				.replace(/\\n/g, '\n')
				.replace(/<\\\//g, '</');
			}
			
			formWrapper.innerHTML=formText; // ugly but works in every browser, and every html code :(
			return this.findNodeById(formWrapper, formId);		
		},

		replaceForm: function(newIdNode, formId){
			var thisp=this;
			var oldIdNode=document.getElementById(formId);
			
			if (!this.useOverlay || !this.hasOverlay){
				oldIdNode.parentNode.replaceChild(newIdNode, oldIdNode);
				return;
			}
			
			var oldPos=jQuery(oldIdNode).offset();
			var oldWidth=jQuery(oldIdNode).width();
			var oldHeight=jQuery(oldIdNode).height();
			jQuery(oldIdNode).css({'overflow':'hidden', 'width':oldWidth, 'height':oldHeight});

			jQuery(newIdNode).css({'display':'none', 'position':'relative', 'background':'#fff', 'width':oldWidth});
			
			var overlay=document.getElementById('formhandler-overlay-form-container');
			if (oldIdNode.parentNode != overlay){
			
				if (this.getOption(formId, 'showFirstFormStepOnClose') == true){
					this.oldForm=oldIdNode;
				}
				jQuery(oldIdNode).css(oldPos);
				jQuery(oldIdNode).css({'position':'relative', 'background':'#fff'});
				var placeholder=document.createElement('div');
				placeholder.setAttribute('id', 'formhandler-form-placeholder');
				jQuery(placeholder).css({'width':oldWidth, 'height':oldHeight});
				oldIdNode.parentNode.insertBefore(placeholder, oldIdNode);
				overlay.appendChild(oldIdNode);
				this.addCloseLink(formId, overlay, oldPos);
			
			}
			var closeLink=document.getElementById('formhandler-overlay-close-button');
			jQuery(newIdNode).css(oldPos);
			oldIdNode.parentNode.insertBefore(newIdNode, oldIdNode);
			
			jQuery.scrollTo(oldPos.top-jQuery(closeLink).height(), 300);
			jQuery(oldIdNode).animate({
				height:jQuery(newIdNode).height()
			}, 300, function(){
				oldIdNode.parentNode.removeChild(oldIdNode);
				thisp.addEventHandler(newIdNode, formId);
				jQuery(newIdNode).addClass('form-hasOverlay');
				jQuery(newIdNode).css('display', 'block');
				thisp.inProgress=false;
			});

		},

		addCloseLink: function(formId, overlay, oldPos){
			var thisp=this;
			var close=document.createElement('div');
			var closeLink=document.createElement('a');
			var closeText=document.createTextNode('X zurück zur Webseite');

			close.appendChild(closeLink);
			closeLink.appendChild(closeText);

			close.setAttribute('id', 'formhandler-overlay-close-button');
			closeLink.setAttribute('href', '#');
			
			jQuery(closeLink).css({'color':'#fff', 'white-space':'nowrap'});
			jQuery(close).css({'display':'none', 'position':'absolute'});
			overlay.appendChild(close);
			jQuery(close).css({'left':oldPos.left, 'top':(oldPos.top-jQuery(close).height()), 'display':'block', 'float':'left'});
			jQuery(closeLink).click(function(){
				thisp.removeOverlay();
				return false;
			});

		},
		
		findNodeById: function(form, formId){
			for(var i=0; i<form.childNodes.length; i++){
				var cn=form.childNodes.item(i);
				if (cn.nodeType == '1' && cn.id == formId){
					return cn;
				}else if(cn.hasChildNodes()){
					ret=this.findNodeById(cn);
					if (ret !== false){
						return ret;
					}
				}
			}
			return false;
		},

		removeOverlay: function(){
			if (!this.hasOverlay){
				return;
			}
			
			var thisp=this;
			var formContainer=document.getElementById('formhandler-overlay-form-container');
			var form=formContainer.firstChild;
			var placeholder=document.getElementById('formhandler-form-placeholder');
			var placeholderPos=jQuery(placeholder).offset();
			var overlay=document.getElementById('formhandler-overlay');
			var placeholderwidth=jQuery(placeholder).width();
			if (this.oldForm != null){
				form=this.oldForm;
			}

			jQuery(form).animate({
				'width':placeholderwidth
			}, 100, function(){
				jQuery(overlay).fadeTo(300, 0);
				jQuery.scrollTo(placeholderPos.top, 300);
				jQuery(placeholder).animate({
					'height':jQuery(form).height()
				}, 300, function(){
					placeholder.parentNode.replaceChild(form, placeholder);
					jQuery(form).attr('style',''); // does not work in ie8
					form.removeAttribute('style'); // does not work in safari 5
					jQuery(form).removeClass('form-hasOverlay');
					overlay.parentNode.removeChild(overlay);
					formContainer.parentNode.removeChild(formContainer);
					if (thisp.overlayInterval != null){
						clearInterval(thisp.overlayInterval);
					}
					
					thisp.hasOverlay=false;
				});
			});
		},

		addOverlay: function(){
			//document.createElement
			var height=jQuery(document).height();
			var width=jQuery(document).width();
			var overlay=document.createElement('div');
			overlay.setAttribute('id', 'formhandler-overlay');
			var container=document.createElement('div');
			container.setAttribute('id', 'formhandler-overlay-form-container');

			jQuery(container).css({
				'position':'absolute',
				'top':'0',
				'left':'0',
				'z-index':'99999'
			});

			jQuery(overlay).css({
				'width':width,
				'height':height,
				'position':'absolute',
				'top':'0',
				'background':'#000',
				'left':'0',
				'z-index':'99998'
			}).fadeTo(300, 0.8);
			
			this.overlayInterval=window.setInterval(function(){
				var height=jQuery(document).height();
				var width=jQuery(document).width();
				var overlay=document.getElementById('formhandler-overlay');
				jQuery(overlay).css({
					'width':width,
					'height':height
				});
				
			}, 250);

			var body=document.getElementsByTagName('body')[0];
			body.insertBefore(overlay, body.firstChild);
			body.insertBefore(container, body.firstChild);
		}
		
		
	};
	
	
	jQuery.noConflict();
	jQuery(document).ready(function(){
		Formhandler.handleForms();
	});
	
}




