function searchSubmitCallback(form) {
	jQuery.each(['termin', 'ruecktermin'], function(index, value) {
		var datePicObj = jQuery('#' + value);
		var dateArr = datePicObj.val().split(".");
			datePicObj.after('<input type="hidden" name="' + value + '" value="' + (Date.UTC(dateArr[2],(dateArr[1])-1,dateArr[0])/1000) + '" />');
			datePicObj.attr('name', value + '_hr');
	});
	
	// reset submit button value
	jQuery('.formSubmit input').remove();
}


var dpSelectedArea = '';
var selectionBaseModifyRunning = false;
var searchDefaultValues = {};
jQuery(document).ready(searchInit);

/**
 * Initialization function that will be called on dom-ready,
 * calls brand-function.
 * 
 * @return mixed
 */
function searchInit() {
	var ret = true;
	var mainContainer = jQuery('.tx-neustasearch-pi1');
	delete selectionCompBkp;
	delete selectionBaseBkp;
	selectBuild(mainContainer);
	helpBuild(mainContainer);
	sliderBuild(mainContainer);
	sliderDoubleBuild(mainContainer);
	raterBuild(mainContainer);
	dpBuild(mainContainer);
	mainContainer.find('select').change();
	setBookingCode();
	if(typeof(searchInitCallback) == 'function') {
		ret = searchInitCallback();
	}
	jQuery('input, select, textarea', mainContainer).each(function() {
		if(jQuery.inArray(jQuery(this).attr('type'), new Array('radio', 'checkbox')) == -1 || jQuery(this).is(':checked')) {
			searchDefaultValues[jQuery(this).attr('name')] = jQuery(this).val();
		} 
	});
	jQuery('input[type=reset]', mainContainer).click(function() {
		mainContainer = jQuery(this).parents('.tx-neustasearch-pi1');
		jQuery('input[type!=submit][type!=button], select, textarea', mainContainer).each(function() {
			if(jQuery(this).attr('type') == 'checkbox') {
				jQuery(this).removeAttr('checked');
			}
			if(jQuery.inArray(jQuery(this).attr('type'), new Array('radio', 'checkbox')) != -1) {
				var elm = jQuery('[name=' + jQuery(this).attr('name') + '][value=' + searchDefaultValues[jQuery(this).attr('name')] + ']', mainContainer);
				if(!elm.is(':checked')) {
					elm.attr('checked', 'checked').trigger('click');	
				};
			} else {
				jQuery(this).val(searchDefaultValues[jQuery(this).attr('name')]);
			}
		});
		jQuery('.sliderSlide', mainContainer).each(function() {
			for(var i=0; i<jQuery(this).data('elmArr').length; i++) {
				if(jQuery(this).data('elmArr')[i].value == jQuery(this).nextAll('input:first').val()) {
					jQuery(this).slider('value', i);
					break;
				}
			}
		});
		jQuery('.raterRate', mainContainer).each(function() {
			for(var i=0; i<jQuery(this).data('elmArr').length; i++) {
				if(jQuery(this).data('elmArr')[i].value == jQuery(this).nextAll('input:first').val()) {
					jQuery(this).next('.raterLabel').text(jQuery(this).data('elmArr')[i].name);
					jQuery(this).children('ul').css({backgroundPosition:'0 0'})
					break;
				}
			}
		});
		jQuery('.childrenselect').nextAll().hide();
		return false;
	});
	return ret;
}

/**
 * Load search by "id" and reinitialize it.
 * 
 * @param int id of the new search
 * @param object elm source-element
 * 
 * @return void
 */
function searchLoad(id, elm) {
	var container = elm ? jQuery(elm).parents('.tx-neustasearch-pi1') : jQuery('.tx-neustasearch-pi1');
	var loader = buildLoader(container);
	jQuery.get('/specials/ajaxifier/ajax.xml', {'tx_neustatabs_pi2[ce]':id}, function(data) {
		loader.remove();
		container.prev('h2').remove();
		container.replaceWith(data);
		if(typeof(searchLoadCallback) == 'function') {
			searchLoadCallback(container);
		}
		searchInit();
	});
}

/**
 * Submit "form" and call brand-function.
 * 
 * @param object form source-form
 * 
 * @return boolean
 */
function searchSubmit(form) {
	if(jQuery('#shotel').length){
		jQuery(form).attr('accept-charset', 'ISO-8859-15');
	}
	fixDate();
	fixFormAction(form);
	if(typeof(searchSubmitCallback) == 'function') {
		return searchSubmitCallback(form);
	}
	return true;
}

/**
 * Change action-url-get-params to hidden-fields.
 * 
 * @param object form source-form
 * 
 * @return void
 */
function fixFormAction(form) {
	var mainParts = jQuery(form).attr('action').split('?');
	if(mainParts.length > 1) {
		var subParts = mainParts[1].split('&');
		for(i=0; i<subParts.length; i++) {
			var subSubParts = subParts[i].split('=');
			if(jQuery(form).find('input[type=hidden][name=' + subSubParts[0] + ']').length) {
				jQuery(form).find('input[type=hidden][name=' + subSubParts[0] + ']').val(subSubParts[1]);
			} else {
				jQuery(form).append('<input type="hidden" name="' + subSubParts[0] + '" value="' + subSubParts[1] + '" />');
			}
		}
		jQuery(form).attr('action', mainParts[0]);
	}
}

/**
 * Fix dates that was typed in manually
 * 
 * @return void
 */
function fixDate() {
	jQuery('.datepicker').each(function() {
		var dpDate = new Array();
		var dateObj = new Date();
		var newDate = new Date();
		if(!jQuery('#conQSStartdateInput').val()){
			newDate = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 2));
			jQuery('#conQSStartdateInput').val(jQuery.datepicker.formatDate('dd.mm.yy', newDate));
		}
		if(!jQuery('#conQSEnddateInput').val()){
			newDate = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 35));
			jQuery('#conQSEnddateInput').val(jQuery.datepicker.formatDate('dd.mm.yy', newDate));
		}
		
		if(jQuery(this).val().match(/\D+/g)) {
			dpDate = jQuery(this).val().replace(/\D+/g, ".").split('.');
		} else {
			if(jQuery(this).val().length == 8) {
				dpDate = new Array(jQuery(this).val().substr(0, 2), jQuery(this).val().substr(2, 2), jQuery(this).val().substr(4, 4));
			} else if(jQuery(this).val().length == 7) {
				if(jQuery(this).val().substr(0, 2) <= 31) {
					dpDate = new Array(jQuery(this).val().substr(0, 2), jQuery(this).val().substr(2, 1), jQuery(this).val().substr(3, 4));
				} else if(jQuery(this).val().substr(1, 2) <= 12) {
					dpDate = new Array(jQuery(this).val().substr(0, 1), jQuery(this).val().substr(1, 2), jQuery(this).val().substr(3, 4));
				}
			} else if(jQuery(this).val().length == 6) {
				if(jQuery(this).val().substr(2, 2) <=  12) {
					dpDate = new Array(jQuery(this).val().substr(0, 2), jQuery(this).val().substr(2, 2), jQuery(this).val().substr(4, 2));
				} else {
					dpDate = new Array(jQuery(this).val().substr(0, 1), jQuery(this).val().substr(1, 1), jQuery(this).val().substr(2, 4));
				}
			} else if(jQuery(this).val().length == 4) {
				dpDate = new Array(jQuery(this).val().substr(0, 2), jQuery(this).val().substr(2, 2), dateObj.getFullYear());
			}
		}
		if(dpDate.length == 3) {
			if(dpDate[2].length < 4) {
				if(dpDate[2].length == 0) {
					dpDate[2] = dateObj.getFullYear();
				} else {
					dpDate[2] = dpDate[2]*1+2000;
				}
			}
			newDate = new Date(dpDate[2], dpDate[1]-1, dpDate[0]);
		} else if(dpDate.length == 2) {
			newDate = new Date(dateObj.getFullYear(), dpDate[1]-1, dpDate[0]);
		}
		if(newDate.getTime() < dateObj.getTime()) {
			if (newDate.getMonth() < dateObj.getMonth() || (newDate.getMonth() == dateObj.getMonth() && newDate.getDate() < dateObj.getDate())) {
					newDate.setYear(dateObj.getFullYear() + 1);
				}
				else {
					newDate.setYear(dateObj.getFullYear());
				}
		}
		jQuery(this).val(jQuery.datepicker.formatDate('dd.mm.yy', newDate));
	});
}

/**
 * Bind "eval"-functions in selectboxes.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function selectBuild(mainContainer) {
	mainContainer.find('select').each(function() {
		jQuery(this).find('option').each(function() {
			var jsCodeArr = jQuery(this).val().match(/javascript\:(.*?)$/);
			jsCodeArr && jsCodeArr[1] ? jQuery(this).data('js', jsCodeArr[1]) : '';
			jQuery(this).val(jQuery(this).val().replace(/javascript\:(.*?)$/, ''));
		});
		jQuery(this).change(function() {
			eval(jQuery(this).find('option:selected').data('js'));
		});
	});
}

/**
 * Bind help-hints.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function helpBuild(mainContainer) {
	mainContainer.find('.helpopen').click(function() {
		jQuery(this).next('.help').toggle(100)
		jQuery(this).next('.help').css({'top': jQuery(this).position().top, 'left': jQuery(this).position().left+jQuery(this).width()+5})
		if(typeof(searchHelpToggleCallback) == 'function') {
			searchHelpToggleCallback(jQuery(this).next('.help'));
		}
	});
	mainContainer.find('input[type=checkbox]').next('label[title]').each(function() {
		jQuery(this).data('title', jQuery(this).attr('title')).removeAttr('title').mousemove(function(e) {
			jQuery(this).next('.help').css({
				left:e.pageX-jQuery(this).offset().left + jQuery(this).position().left + 10,
				top:e.pageY-jQuery(this).offset().top + jQuery(this).position().top + 10
			}).show();
		}).mouseout(function() {
			jQuery(this).next('.help').hide();
		}).after('<div>').next().addClass('help').hide().append('<div>').children().addClass('helpcontent').html(jQuery(this).data('title'));
	});
}

/**
 * Create slider from selectboxes.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function sliderBuild(mainContainer) {
	mainContainer.find('.slider').each(function() {
		var selIndex = 0;
		var elmArr = new Array();
		jQuery(this).find('option').each(function(i) {
			elmArr.push({'name': jQuery(this).text(), 'value': jQuery(this).val()});
			if(jQuery(this).attr('selected')) selIndex = i;
		});
		jQuery(this).after('<div class="sliderSlide"></div><div class="sliderLabel">' + elmArr[selIndex].name + '</div><input type="hidden" name="' + jQuery(this).attr('name') + '" />');
		jQuery(this).next('.sliderSlide').data('elmArr', elmArr).slider({
			max: elmArr.length-1,
			steps: elmArr.length-1,
			value: selIndex,
			orientation: 'horizontal',
			animate: true,
			change: function(e, ui) {
				jQuery(this).next('.sliderLabel').text(jQuery(this).data('elmArr')[ui.value].name);
				jQuery(this).next('.sliderLabel').next('input[type=hidden]').val(jQuery(this).data('elmArr')[ui.value].value);
			}
		});
		jQuery(this).remove();
	});
}

/**
 * Create double-slider from selectboxes.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function sliderDoubleBuild(mainContainer) {
	mainContainer.find('.sliderdouble').each(function() {
		var elmArr = new Array();
		var selArr = new Array();
		var min = 10000;
		jQuery(this).find('option').each(function(i) {
			elmArr.push({'name': jQuery(this).text(), 'value': jQuery(this).val()});
			if(jQuery(this).attr('selected') && selArr.length < 2) selArr.push(i);
			min = jQuery(this).val() < min && jQuery(this).val() >= 0 ? jQuery(this).val() : min;
		});
		selArr = selArr.length < 2 ? [0, elmArr.length-1] : selArr;
		var html = '<div class="sliderSlideDouble"></div>';
		html += '<div class="sliderLabel">' + elmArr[selArr[0]].name + ' - ' + elmArr[selArr[1]].name + '</div>';
		html += '<input type="hidden" value="' + elmArr[selArr[0]].value + '" name="' +  jQuery(this).attr('name').split('[]')[0] + 'Min" />';
		html += '<input type="hidden" value="' + elmArr[selArr[1]].value + '" name="' +  jQuery(this).attr('name').split('[]')[0] + 'Max" />';
		jQuery(this).after('<div class="sliderCell">' + html + '</div>');
		jQuery(this).next('.sliderCell').find('.sliderSlideDouble').slider({
			min: min == 10000 ? 0 : min-1,
			max: elmArr.length-1,
			values: selArr,
			animate: true,
			range: 'min',
			slide: function (e, ui) {
				sliderDoubleBGPos(jQuery(this));
				jQuery(this).nextAll('.sliderLabel').text(elmArr[selArr[0]].name + ' - ' + elmArr[selArr[1]].name)
				jQuery(this).nextAll('input[type=hidden]:first').val(elmArr[ui.values[0]].value)
				jQuery(this).nextAll('input[type=hidden]:last').val(elmArr[ui.values[1]].value)
			}
		});
		sliderDoubleBGPos(jQuery(this).next('.sliderCell').find('.sliderSlideDouble'))
		jQuery(this).next('.sliderCell').find('.sliderSlideDouble .ui-slider-handle:first').addClass('first-handle');
		jQuery(this).next('.sliderCell').find('.sliderSlideDouble .ui-slider-handle:last').addClass('last-handle');
		jQuery(this).remove();
	});
}

/**
 * Position of double-slider.
 * 
 * @param object self destination-double-slider
 * 
 * @return void
 */
function sliderDoubleBGPos(self) {
	setTimeout(function() {
		var firstSlider = self.find('.ui-slider-handle:first');
		var lastSlider = self.find('.ui-slider-handle:last');
		var bgWidth = lastSlider.position().left - firstSlider.position().left - (parseInt(firstSlider.css('width'))/2) + (parseInt(lastSlider.css('width'))/2);
		var bgLeft = firstSlider.position().left + (firstSlider.width()/2)
		self.find('.ui-widget-header').css({width: bgWidth, left: bgLeft})
	}, 10);
}

/**
 * Create rater from selectboxes.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function raterBuild(mainContainer) {
	mainContainer.find('.rater').each(function() {
		var elmArr = new Array();
		var lis = ''
		jQuery(this).find('option').each(function(i) {
			elmArr.push({'name': jQuery(this).text(), 'value': jQuery(this).val()});
			if(jQuery(this).attr('selected')) selIndex = i;
			if(jQuery(this).val() && jQuery(this).val()!=-1) lis += '<li></li>';
		});
		jQuery(this).after('<div class="raterRate"><ul>' + lis + '</ul></div><div class="raterLabel">' + (elmArr[selIndex] ? elmArr[selIndex].name : '') + '</div><input type="hidden" name="' + jQuery(this).attr('name') + '" value="' + (elmArr[selIndex] ? elmArr[selIndex].value : '') + '" />');
		jQuery(this).next('.raterRate').data('elmArr', elmArr);
		jQuery(this).next('.raterRate').data('selIndex', selIndex);
		jQuery(this).next('.raterRate').find('li').each(function(i) {
			jQuery(this).click(function() {
				jQuery(this).parent().parent().next('.raterLabel').text(elmArr[i+1].name);
				jQuery(this).parent().parent().next('.raterLabel').next('input[type=hidden]').val(elmArr[i+1].value);
				jQuery(this).parent().parent().data('selIndex', i+1);
			}).mouseover(function() {
				jQuery(this).parent().parent().next('.raterLabel').text(elmArr[i+1].name);
				jQuery(this).parent().css('backgroundPosition', '0 ' + (-(parseInt(jQuery(this).css('height')) * (i+1))) + 'px');
			}).mouseout(function() {
				jQuery(this).parent().parent().next('.raterLabel').text(jQuery(this).parent().parent().data('elmArr')[jQuery(this).parent().parent().data('selIndex')].name);
				jQuery(this).parent().css('backgroundPosition', '0 ' + (-(parseInt(jQuery(this).css('height')) * jQuery(this).parent().parent().data('selIndex'))) + 'px');
			});
			jQuery(this).mouseout();
		});
		jQuery(this).remove();
	});
}

/**
 * Create dependent selectboxes.
 * 
 * @param object localSelect first selectbox
 * @param object foreignSelect second selectbox
 * @param object noCallback prevent callback after this function
 * 
 * @return void
 */
function dependentSelectChange(localSelect, foreignSelect, noCallback) {
	if(typeof(altDependentSelectChangeCallback) == 'function') {
		altDependentSelectChangeCallback(localSelect, foreignSelect);
	} else {
		var selectionBase = foreignSelect;
		var selectionComp = localSelect;
		localSelect.find('option').each(function() {
			if(jQuery(this).val().indexOf('|')!=-1) {
				selectionBase = localSelect;
				selectionComp = foreignSelect;
				selectionBase.find('option:selected').val() != -1 ? selectionComp.find('option[value=' + (selectionBase.find('option:selected').val().split('|')[1] ? selectionBase.find('option:selected').val().split('|')[1] : -1) + ']').attr('selected', 'selected') : '';
				return false;
			}
		});
		selectionCompBkp = typeof(selectionCompBkp) == 'undefined' ? selectionComp.clone() : selectionCompBkp;
		selectionBaseBkp = typeof(selectionBaseBkp) == 'undefined' ? selectionBase.clone() : selectionBaseBkp;
		if(!selectionBaseModifyRunning) {
			setTimeout(function() {
				selectionBaseModifyRunning = true;
				selectionBaseModify = selectionBaseBkp.clone();
				selectionBaseModify.find('option[value=' + selectionBase.find('option:selected').val() + ']').attr('selected', 'selected');
				selectionBaseModify.find('option').each(function() {
					if(jQuery(this).val().indexOf('|'+selectionComp.find('option:selected').val())==-1 && selectionComp.find('option:selected').val()!=-1 && jQuery(this).val()!=-1) {
						jQuery(this).remove();
					};
				});
				selectionBase.replaceWith(selectionBaseModify);
				selectionBaseModifyRunning = false;
				if(typeof(afterDependentSelectChangeCallback) == 'function' && !noCallback) {
					afterDependentSelectChangeCallback();
				}
			}, jQuery.browser.msie ? 200 : 0)
		}
	}
}

/**
 * Build children-selector.
 * 
 * @param object elm destination-element
 * @param boolean date extended-flag
 * 
 * @return void
 */
function childrenCountChange(elm, date) {
	childSel = parseInt(elm.find(':selected').val());
	jQuery('.childsel').hide(); 
	jQuery('.childsel:lt(' + childSel + ')').show(); 
	childSel != -1 ? elm.nextAll('.posttext').show() : elm.nextAll('.posttext').hide();
	if(date) {
		jQuery('.childsel select').find('option:first').attr('selected','selected');
		jQuery('.childsel select').trigger('change');
		jQuery('.childsel select').change(function() {
			var birth = new Date(jQuery(this).parent().find('.childselyear').val(), jQuery(this).parent().find('.childselmonth').val()-1, jQuery(this).parent().find('.childselday').val())
			var age = new Date(new Date().getTime() - birth.getTime()).getFullYear() - 1970;
			jQuery('.childselage:lt(' + childSel + ')').val(age)
			jQuery('.childselbirth:lt(' + childSel + ')').val(jQuery(this).parent().find('.childselyear').val() + '-' + jQuery(this).parent().find('.childselmonth').val() + '-' + jQuery(this).parent().find('.childselday').val());
			jQuery('.childselage:gt(' + (childSel-1) + '), .childselbirth:gt(' + (childSel-1) + ')').val('')
		})
	} else {
		jQuery('.childsel').find('option:first').attr('selected','selected'); 
	}
}

/**
 * Toggle container-display-state.
 * 
 * @param object elm destination-element
 * @param string triggerPath path for state-check
 * @param string hideLabel label for hide-state
 * @param string showLabel label for show-state
 * @param boolean stay toggle-prevention
 * 
 * @return void
 */
function changeDisplayState(elm, triggerPath, hideLabel, showLabel, stay, effect) {
	toggleElm = eval('elm.parents(\'.tx-neustasearch-pi1\').find(\'form\').contents().filter(\'.elm:eq(' + triggerPath.split('-').join(')\').contents().filter(\'.elm:eq(') + ')\')');
	if(typeof(searchContToggleCallback) == 'function') {
		searchContToggleCallback(toggleElm);
	}
	if(!parseInt(stay) || toggleElm.is(':hidden')) {
		toggleElm[effect ? effect : 'toggle'](function(){
			jQuery('.trigger').each(function(){
				var elements = RegExp(/changeDisplayState\((.*),(.*),(.*),(.*),(.*),(.*)\)/).exec(jQuery(this).attr('onclick').toString());
				if (eval(elements[2]) == triggerPath) {
					jQuery(this).val(toggleElm.is(':hidden') ? eval(elements[4]) : eval(elements[3]));
				}
			});
		});
		if(typeof(afterSearchContToggleCallback) == 'function') {
			afterSearchContToggleCallback(toggleElm);
		}
	}
}

/**
 * Build datepicker.
 * 
 * @param object mainContainer destination-search
 * 
 * @return void
 */
function dpBuild(mainContainer) {
	if(mainContainer.find('.datepicker').length && !mainContainer.find('.dplayer').length) {
		mainContainer.find('.datepicker').parents('.tx-neustasearch-pi1').prepend('<div class="dplayer" style="display:none;"><div class="dpbackground"></div><div class="dpclose">Fenster schliessen</div><div class="dpfrom" id="dpfrom"></div><div class="dpto" id="dpto"></div><input type="button" class="dpsubmit" value="&Uuml;bernehmen" /></div>');
	}
	mainContainer.find('.datepicker').each(function(i) {
		if(i%2) {
			var dpTo = jQuery(this);
			var dpToBtn = dpTo.next('.datepickeropen');
			
			dpTo.val(formatToHr(dpTo.val()));
			dpTo.addClass('dpToInput');
			jQuery([dpFrom, dpTo]).each(function(i) {
				var dpParts = jQuery(this).val().split('|');
				var dpMax = dpParts[1] ? dpParts[1].split('.') : [31, 12, new Date().getFullYear()+1];
				var dpMin = dpParts[2] ? dpParts[2].split('.') : [new Date().getDate(), new Date().getMonth()+1, new Date().getFullYear()];
				jQuery(this).data('maxDate', new Date(dpMax[2], dpMax[1]-1, dpMax[0]));
				jQuery(this).data('minDate', new Date(dpMin[2], dpMin[1]-1, dpMin[0]));
				jQuery(this).val(dpParts[0]);
				jQuery(this).bind("blur", function() {
					fixDate();
					jQuery(this).removeClass('datepicker');
					jQuery('.' + jQuery(this).attr('class'), '.tx-neustasearch-pi1').val(jQuery(this).val());
					jQuery(this).addClass('datepicker');
				});
			});
			dpFromBtn.data('dp', {from:dpFrom, to:dpTo});
			dpToBtn.data('dp', {from:dpFrom, to:dpTo});
			dpFromBtn.click(function() {
				dpShow(jQuery(this).data('dp').from, jQuery(this).data('dp').to)
			})
			dpToBtn.click(function() {
				dpShow(jQuery(this).data('dp').from, jQuery(this).data('dp').to)
			})
		} else {
			dpFrom = jQuery(this);
			dpFrom.val(formatToHr(dpFrom.val()));
			
			dpFrom.addClass('dpFromInput');
			dpFromBtn = dpFrom.next('.datepickeropen');
		}
	});
}

function formatToHr(dateStr){
	if(dateStr.length == 10 && dateStr.split('.').length == 1) {
		var hrDate = new Date(dateStr * 1000);
		
		dateStr = jQuery.datepicker.formatDate('dd.mm.yy', hrDate);
	}
	
	return dateStr;
}

/**
 * Show datepicker.
 * 
 * @param object dpFrom from-datepicker
 * @param object dpTo to-datepicker
 * 
 * @return void
 */
function dpShow(dpFrom, dpTo) {
	dpLayer = jQuery('.tx-neustasearch-pi1 .dplayer');
	dpLayer.find('.dpfrom').data('maxDate', dpFrom.data('maxDate'));
	dpLayer.find('.dpfrom').data('minDate', dpFrom.data('minDate'));
	dpLayer.find('.dpto').data('maxDate', dpTo.data('maxDate'));
	dpLayer.find('.dpto').data('minDate', dpTo.data('minDate'));
	jQuery('.dpvac option[value=' + dpSelectedArea + ']').attr('selected', 'selected');
	dpLayer.find('.dpfrom').datepicker('destroy');
	dpLayer.find('.dpto').datepicker('destroy');
	dpLayer.find('.dpfrom').datepicker(dpGetConf(0));
	dpLayer.find('.dpto').datepicker(dpGetConf(1));
	if(dpFrom.val()) {
		var dpDate = dpFrom.val().split('.');
		if(dpDate.length == 3) {
			dpLayer.find('.dpfrom').datepicker('setDate', new Date(dpDate[2], dpDate[1]-1, dpDate[0]));
		}
	}
	if(dpTo.val()) {
		var dpDate = dpTo.val().split('.');
		if(dpDate.length == 3) {
			dpLayer.find('.dpto').datepicker('setDate', new Date(dpDate[2], dpDate[1]-1, dpDate[0]));
		}
	}
	dpLayer.find('.dpvac').change(function(){
		dpSelectedArea = jQuery('.dpvac').find('[selected]').attr('value').replace('ü', '&uuml;');
		var dpOldFromMonthYear = jQuery('#dpfrom .monthyearcombo select option:selected').val();
		var dpOldToMonthYear = jQuery('#dpto .monthyearcombo select option:selected').val();
		dpInit();
		jQuery('#dpfrom .monthyearcombo select option[value=' + dpOldFromMonthYear + ']').attr('selected', 'selected');
		jQuery('#dpto .monthyearcombo select option[value=' + dpOldToMonthYear + ']').attr('selected', 'selected');
		dpChangeMonthYear('#dpfrom');
		dpChangeMonthYear('#dpto');
	});
	dpLayer.find('.dpclose, .dpsubmit').click(function(){dpLayer.hide()});
	dpLayer.find('.dpsubmit').click(function(){
		jQuery('.dpFromInput').val(jQuery.datepicker.formatDate('dd.mm.yy', dpLayer.find('.dpfrom').datepicker('getDate')))
		jQuery('.dpToInput').val(jQuery.datepicker.formatDate('dd.mm.yy', dpLayer.find('.dpto').datepicker('getDate')))
	});
	dpInit();
	dpLayer.css({left:dpFrom.offset().left, top:dpFrom.position().top});
	dpLayer.show();
	if(typeof(dpShowCallback) == 'function') {
		dpShowCallback(dpLayer);
	}
	if(dpTo.parent(':hidden').length) {
		dpLayer.find('.dpto').prepend('<div id="dptoOverlay"></div>');
		if(jQuery.browser.msie) {
			dpLayer.find('.dpto select').css('visibility', 'hidden');
		}
	}
}

/**
 * Init single datepicker.
 * 
 * @return void
 */
function dpInit() {
	var dpFrom = jQuery('.dpfrom').datepicker('getDate');
	jQuery('.dpfrom').datepicker('change', dpGetConf(0));
	if(dpFrom) {
		jQuery('.dpfrom').datepicker('setDate', dpFrom);
	}
	dpBuildMonthYear(0, '#dpfrom', 'Fr\xFCheste Hinreise');
	
	var dpTo = jQuery('.dpto').datepicker('getDate');
	jQuery('.dpto').datepicker('change', dpGetConf(1));
	if(dpTo) {
		jQuery('.dpto').datepicker('setDate', dpTo);
	}
	dpBuildMonthYear(1, '#dpto', 'Sp\xE4teste R\xFCckreise');
}

/**
 * Get configuration for given section ("section").
 * 
 * @param int section datepicker-section
 * 
 * @return object
 */
function dpGetConf(section) {
	if(!section) {
		return {
			onSelect: dpInit,
			minDate: jQuery('.dpfrom').data('minDate'),
			maxDate: jQuery('.dpfrom').data('maxDate')
		}
	} else {
		return {
			minDate: jQuery('.dpfrom').datepicker('getDate').addDays(+1),
			maxDate: jQuery('.dpto').data('maxDate')
		}
	}
}

/**
 * Build combined month-year selectbox.
 * 
 * @param int section datepicker-section
 * @param string preSel selection-id
 * @param string label destination-label
 * 
 * @return void
 */
function dpBuildMonthYear(section, preSel, label) {
	var maxDate = jQuery(section ? '.dpto' : '.dpfrom').data('maxDate')
	var minDate = section ? jQuery('.dpfrom').datepicker('getDate').addDays(+1) : new Date();
	var selYear = jQuery(preSel).find('.ui-datepicker-new-year option:selected').val();
	var selMonth = jQuery(preSel).find('.ui-datepicker-new-month option:selected').val();
	var monthYearCombo = '<div class="monthyearcombo"><div class="monthYearComboLabel">' + label + '</div><div class="prevmonth">&laquo;</div><select onchange="dpChangeMonthYear(\'' + preSel + '\')">';
	for(var year=minDate.getFullYear(); year<=maxDate.getFullYear(); year++) {
		var monthsArr = new Array('Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
		var monthOffset = 0;
		if(year == minDate.getFullYear()) {
			monthOffset = minDate.getMonth();
			monthsArr = monthsArr.slice(monthOffset, 12);
		}
		monthsArr = year == maxDate.getFullYear() ? monthsArr.slice(0, monthsArr.length-(11-maxDate.getMonth())) : monthsArr;
		for (var i=0; i<monthsArr.length; i++) {
			monthYearCombo += '<option value="' + year + '_' + (i+monthOffset) + '"' + (selYear == year && selMonth == (i+monthOffset) ? ' selected="selected"' : '') + '>' + monthsArr[i] + ' ' + year + '</option>';
		}
	}
	monthYearCombo += '</select><div class="nextmonth">&raquo;</div></div>';
	jQuery(preSel + ' .monthyearcombo').remove();
	jQuery(preSel).prepend(monthYearCombo);
	dpCheckArrows(jQuery(preSel + ' .monthyearcombo select'));
	jQuery(preSel + ' .monthyearcombo .prevmonth').click(function() {
		jQuery(this).next('select').find('option:eq(' + (jQuery(this).next('select').get(0).selectedIndex-1) + ')').attr('selected', 'selected');
		jQuery(this).next('select').change();
		dpCheckArrows(jQuery(this).next('select'));
	});
	jQuery(preSel + ' .monthyearcombo .nextmonth').click(function() {
		jQuery(this).prev('select').find('option:eq(' + (jQuery(this).prev('select').get(0).selectedIndex+1) + ')').attr('selected', 'selected');	
		jQuery(this).prev('select').change();
		dpCheckArrows(jQuery(this).prev('select'));
	});
}

/**
 * Pre-adjust month-year selectbox.
 * 
 * @param string preSel selection-id
 * 
 * @return void
 */
function dpChangeMonthYear(preSel) {
	var monthYear = jQuery(preSel + ' .monthyearcombo option:selected').val().split('_');
	jQuery(preSel + ' .ui-datepicker-new-year option[value=' + monthYear[0] + ']').attr('selected', 'selected');
	jQuery.datepicker._selectMonthYear(preSel, document.getElementById(preSel.split('#')[1]).getElementsByTagName('select')[2], 'Y');
	jQuery(preSel + ' .ui-datepicker-new-month option[value=' + monthYear[1] + ']').attr('selected', 'selected');
	jQuery.datepicker._selectMonthYear(preSel, document.getElementById(preSel.split('#')[1]).getElementsByTagName('select')[1], 'M');
	dpCheckArrows(jQuery(preSel + ' .monthyearcombo select'));
}

/**
 * Hide or show month-year-navigation-arrows.
 * 
 * @param object elm destination-element
 * 
 * @return void
 */
function dpCheckArrows(elm) {
	elm.prev('.prevmonth').css('visibility', 'visible');
	elm.next('.nextmonth').css('visibility', 'visible');
	if(!elm.get(0).selectedIndex) {
		elm.prev('.prevmonth').css('visibility', 'hidden');
	}
	if(elm.get(0).selectedIndex == elm.find('option').length-1) {
		elm.next('.nextmonth').css('visibility', 'hidden');
	}
}

/**
 * Mark vacation helper.
 * 
 * @param array markedDays source-array
 * @param object dateElm to change
 * @param string dateClass destination-class-name
 * 
 * @return object
 */
function showDays(markedDays, dateElm, dateClass) {
	for(i=0; i<markedDays.length; i++) {
		var dpFromParts = markedDays[i][0].split('.');
		var dpFrom = new Date(dpFromParts[2], dpFromParts[1]-1, dpFromParts[0]).getTime();
		if(markedDays[i].length == 2) {
			var dpToParts = markedDays[i][1].split('.');
			var dpTo = new Date(dpToParts[2], dpToParts[1]-1, dpToParts[0]).getTime();
			if(dateElm.getTime() >= dpFrom && dateElm.getTime() <= dpTo) {
				return [true, dateClass];
			}
		}
		if(dateElm.getTime() == dpFrom) {
			return [true, dateClass];
		}
	}
	return [true, ''];
}

/**
 * Set bookingcode as hidden-elements.
 * 
 * @return void
 */
function setBookingCode() {
	var bookingsequence = get('bookingsequence');
	if(bookingsequence) {
		tmp = jQuery('#input_crs').parent();
		jQuery('#input_crs').val(bookingsequence);
		jQuery('#input_crs').removeAttr('onclick');
		jQuery('#input_crs').attr({'id':'input_crs_set', 'readonly':'readonly', 'name':'input_crs_full'});
		tmp.append('<input name="input_crs" id="input_crs" type="hidden" value="' + bookingsequence.substr(0, 8) + '" />');
		tmp.append('<input name="sleistung" id="sleistung" type="hidden" value=";' + bookingsequence.substr(8, 2) + ';' + bookingsequence.substr(10, 3) + '" />');
	}
}
