(function($) {

var aCoursesData = {};
var aAccData = {};
var aInsuranceData = {};

var oTimer;

$(document).ready(function() {

	showLoader();

	// IE < 9
	if(!$.support.leadingWhitespace) {
		alert('Your browser is not supported anymore. Please update to a more recent one.');
		return;
	}

	$('.calendar').each(function(iIndex, oInput) {
		if(
			oInput.id != 'calendar_insuranceDateFrom' &&
			oInput.id != 'calendar_insuranceDateTill' &&
			oInput.id != 'calendar_transArrDate' &&
			oInput.id != 'calendar_transDepDate'
		) {
			ThebingCalendar.prepare({
				dateField: oInput,
				triggerElement: '#' + oInput.id.replace(/calendar_/, 'calendar_img_')
			});
		}
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Course observer

	$('#addNewCourse').change(function() {
		addCourseBlock(this.value);
		this.selectedIndex = 0;
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Accommodation observer

	$('#addNewAccommodation').change(function() {
		addAccommodationBlock(this.value);
		this.selectedIndex = 0;
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Insurance observer

	$('#addNewInsurance').change(function() {
		addInsuranceBlock(this.value);
		this.selectedIndex = 0;
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Transfer observer

	ThebingCalendar.prepare({
		dateField: '#calendar_transArrDate',
		triggerElement: '#calendar_img_transArrDate',
		closeHandler: updateTransferDates
	});

	ThebingCalendar.prepare({
		dateField: '#calendar_transDepDate',
		triggerElement: '#calendar_img_transDepDate',
		closeHandler: updateTransferDates
	});

	$('#transfer_type, #trans_arr_to, #trans_dep_to').change(function() {
		updateTransferData(this.id);
	});

	$('#trans_arr_from, #trans_dep_from').change(function() {
		var sId = 'trans_arr_to';
		if(this.id == 'trans_dep_from') {
			sId = 'trans_dep_to';
		}

		updateTransferLocations(sId);
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Prices block observer

	if($('#pricesBlock').length) {
		$('#currency').change(updateCurrency);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Buttons

	$('#btn_next_page').click(function() {
		$('#action').val('next_page');
		$('#form').submit();
	});

	$('#btn_prev_page').click(function() {
		$('#action').val('prev_page');
		$('#form').submit();
	});

	$('#btn_save').click(function() {
		$('#action').val('save');
		$('#form').submit();
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Print

	$('#print').click(printPrices);

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	loadData();

	initValidation();

});

function removeImage(iBlockID) {
	$('#action').val('remove_image');
	$('#parameter').val(iBlockID);
	$('#form').submit();
}

/* ==================================================================================================== */ // Data

function loadData() {
	var oPage = $('#thebing-page-number');
	if(oPage.length) {
		executeAjaxRequest('task=get_ajax&action=load_data&page=' + oPage.val());
	}
}

function loadDataCallback(mData) {

	$('#pricesBlockPrintCopy').remove();

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Courses

	var aUniques = {};
	var aCourses = {};
	var aAccommodations = {};
	var aInsurances = {};

	if(mData['courses']) {
		aUniques = {};

		mData['courses'].forEach(function(oCourse)
		{
			aUniques['c_' + oCourse['unique']] = true;
			addCourseBlockCallback(oCourse);
		});

		$('#coursesContainer').children().each(function(iIndex, oChild) {
			if(!aUniques[oChild.id]) {
				$(oChild).remove();
			}
		});

		aCourses = aUniques;
	}
	else
	{
		$('#coursesContainer').empty()
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Accommodations

	if(mData['accommodations']) {
		aUniques = {};

		mData['accommodations'].forEach(function(oAcc) {
			aUniques['a_' + oAcc['unique']] = true;

			addAccommodationBlockCallback(oAcc);
		});

		$('#accommodationsContainer').children().each(function(iIndex, oChild) {
			if(!aUniques[oChild.id]) {
				$(oChild).remove();
			}
		});

		aAccommodations = aUniques;
	}
	else {
		$('#accommodationsContainer').empty();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Transfer

	if(
		mData['transfer'] &&
		$('#transfer_type').length
	) {
		$('#transfer_type').prop('disabled', false);

		if(mData['transfer']['arr_from']) {
			updateTransferLocationsCallback(mData['transfer']['arr_from']);
		} else {
			$('#trans_arr_to').prop('selectedIndex', 0);
		}

		if(mData['transfer']['dep_from']) {
			updateTransferLocationsCallback(mData['transfer']['dep_from']);
		} else {
			$('#trans_dep_to').prop('selectedIndex', 0);
		}

		if(mData['transfer']['dates']) {
			if(typeof mData['transfer']['dates']['min'] != 'undefined') {
				$('#calendar_transArrDate').val(mData['transfer']['dates']['min']);
			}
		
			if(typeof mData['transfer']['dates']['max'] != 'undefined') {
				$('#calendar_transDepDate').val(mData['transfer']['dates']['max']);
			}

//			if(mData['transfer']['dates']['min'] == '' || mData['transfer']['dates']['max'] == '')
//			{
//				$('transfer_type').selectedIndex = 0;
//
//				//$('transfer_type').disabled = true;
//			}
		}

		if(
			typeof mData['transfer']['always_show_inputs'] != 'undefined' &&
			mData['transfer']['always_show_inputs'] != 1
		) {
			if($('#transfer_type').val() === 'arr_dep') {
				$('#transfer_block_arrival').show();
				$('#transfer_block_departure').show();
			} else if($('#transfer_type').val() === 'arrival') {
				$('#transfer_block_arrival').show();
				$('#transfer_block_departure').hide();
			} else if($('#transfer_type').val() === 'departure') {
				$('#transfer_block_arrival').hide();
				$('#transfer_block_departure').show();
			} else {
				$('#transfer_block_arrival').hide();
				$('#transfer_block_departure').hide();
			}
		}
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Insurance

	if(mData['insurances']) {
		aUniques = {};

		mData['insurances'].forEach(function(oInsurance) {
			aUniques['i_' + oInsurance['unique']] = true;
			addInsuranceBlockCallback(oInsurance);
		});

		$('#insurancesContainer').children().each(function(iIndex, oChild) {
			if(!aUniques[oChild.id]) {
				$(oChild).remove();
			}
		});

		aInsurances = aUniques;
	} else {
		$('#insurancesContainer').empty();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Prices

	if(mData['prices']) {
		updatePricesCallback(mData['prices']);

		['course', 'accommodation', 'insurance'].forEach(function(sType) {

			var sContainerId, sBlockContainerId, aItems;

			if(sType === 'course') {
				sContainerId = 'coursesContainer';
				sBlockContainerId = 'pricesBlockCourseContainer';
				aItems = aCourses;
			} else if(sType === 'accommodation') {
				sContainerId = 'accommodationsContainer';
				sBlockContainerId = 'pricesBlockAccommodationContainer';
				aItems = aAccommodations;
			} else if(sType === 'insurance') {
				sContainerId = 'insurancesContainer';
				sBlockContainerId = 'pricesBlockInsuranceContainer';
				aItems = aInsurances;
			}

			if($('#' + sContainerId).length) {
				$('#' + sBlockContainerId).children().each(function(iIndex, oChild)  {
					oChild = $(oChild);
					if(!aItems[oChild.attr('id').replace(/p_/, '')]) {
						oChild.remove();
					}

					var oDuration = $('#' + oChild.attr('id').replace(/p_/, '') + '_duration');

					if(oDuration.length && (oDuration.val() == '' || oDuration.prop('disabled'))) {
						oChild.remove();
					}
				});
			}

		});

	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	['course', 'accommodation', 'insurance'].forEach(function(sKey1) {

		var sKey2 = sKey1.charAt(0).toUpperCase() + sKey1.slice(1);
		var aToggler = $('.' + sKey1 + 'BlockToggler');

		if($('#addNew' + sKey2).length && $('#addNew' + sKey2).closest('.' + sKey1 + 'ID').length)
		{
			if(aToggler.length > 1)
			{
				try
				{
					$('#addNew' + sKey2).closest('.' + sKey1 + 'ID').hide();
				}
				catch(e)
				{
					console.debug(e);
				}
			}
			else
			{
				try
				{
					$('#addNew' + sKey2).closest('.' + sKey1 + 'ID').show();
				}
				catch(e)
				{
					console.debug(e);
				}
			}
		}

		for(var i = 0; i < aToggler.length; i++)
		{
			if(aToggler[i + 2] || aToggler.length == 1)
			{
				$(aToggler[i]).hide();
			}
			else
			{
				var oSpan = $(aToggler[i]);
				oSpan.show();

				oSpan.off('click');
				oSpan.click(function(sKey1) {
					try {
						// sKey2 mit bind funktioniert manchmal aus irgendeinem Grund nicht
						var sKey2 = sKey1.charAt(0).toUpperCase() + sKey1.slice(1);
						$('#addNew' + sKey2).closest('.' + sKey1 + 'ID').show()
					} catch(e) {
						console.debug(e);
					}
				}.bind(this, sKey1));
				
			}
		}
	});

	hideLoader();
}

/* ==================================================================================================== */ // Courses

function addCourseBlock(iCourseID, iKey) {
	showLoader();

	var sParams = 'task=get_ajax&action=add_course_block';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&course_id=' + iCourseID;

	if(iKey) {
		sParams += '&unique=' + iKey;
	}

	executeAjaxRequest(sParams);
}

$.fn.addCourseBlock = function(iCourseID, iKey) {
	addCourseBlock(iCourseID, iKey);
}

function addCourseBlockCallback(mData)
{
	var oTemp;

	aCoursesData[mData['unique']] = mData['options'];

	var oCopy = $('#courseTemplate').clone(true);
	oCopy.css('display', 'block');
	oCopy.attr('id', 'c_' + mData['unique']);

	if($('#' + oCopy.attr('id')).length) {
		$('#' + oCopy.attr('id')).replaceWith(oCopy);
	} else {
		$('#coursesContainer').append(oCopy);
	}

	oCopy = $('#c_' + mData['unique']);

	if(mData['block_error']) {
		oCopy.find('.courseBlock').addClass('block_error');
	}

	if(mData['error_message']) {
		oCopy.find('.row_error').html(mData['error_message']);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	oTemp = oCopy.find('#courseTemplateID');
	oTemp.val(mData['course_id']);
	oTemp.attr('id', oCopy.attr('id') + '_id');

	var oCourse = $('#' + oCopy.attr('id') + '_id');

	oCourse.off('change');
	oCourse.change(function() {
		try {
			changeCourseData(mData['unique']);
		} catch(e) {
			console.debug(e);
		}
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // End

	oTemp = oCopy.find('#courseTemplateEnd');
	oTemp.attr('id', oCopy.attr('id') + '_end');

	if(mData['end']) {
		oTemp.html(mData['end']);
	}

	oTemp = oCopy.find('#courseTemplateEndTime');
	oTemp.attr('id', oCopy.attr('id') + '_end_time');

	if(mData['end_time']) {
		oTemp.val(mData['end_time']);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Level

	oTemp = oCopy.find('#courseTemplateLevel');
	oTemp.attr('id', oCopy.attr('id') + '_level');

	var oLevel = $('#' + oCopy.attr('id') + '_level');

	mData['levels'].forEach(function(oLevelData) {
		oLevel.append('<option value="' + oLevelData['id'] + '">' + oLevelData['title'] + '</option>');
	});

	if(mData['level_id']) {
		oLevel.val(mData['level_id']);
	} else {
		oLevel.prepend('<option value=""></option>');
		oLevel.prop('selectedIndex', 0);
	}

	if(mData['disable_level']) {
		oLevel.prop('disabled', true);
	} else {
		oLevel.prop('disabled', false);

		oLevel.off('change');
		oLevel.change(function() {
			try {
				changeCourseData(mData['unique']);
			} catch(e) {
				console.debug(e);
			}
		});
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Units

	oTemp = oCopy.find('#courseTemplateUnit');
	oTemp.attr('id', oCopy.attr('id') + '_units');

	if(mData['units'] > 0) {
		oTemp.val(mData['units']);
	}

	if(mData['unit'] == 1) {
		var oUnits = $('#' + oCopy.attr('id') + '_units');

		oUnits.off('keyup');
		oUnits.keyup(function() {
			try {
				waitForChanging(mData['unique']);
			} catch(e) {
				console.debug(e);
			}
		});
	} else {
		oTemp.closest('.courseUnit').hide();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Start

	oTemp = oCopy.find('#courseTemplateStart');
	oTemp.attr('id', oCopy.attr('id') + '_start');

	$.each(mData['options'], function(sKey, oDate) {
		if(!sKey.match(/[0-9]{1,}_[0-9]{1,}_[0-9]{1,}/)) {
			return false;
		}

		var sDisabled = '';

		if(oDate.disabled) {
			sDisabled = 'disabled="disabled"';
		}

		oTemp.append('<option value="' + sKey + '" ' + sDisabled + '>' + oDate.title + '</option>');
	});

	if(mData['start']) {
		oTemp.val(mData['start']);
	} else {
		oTemp.prepend('<option value=""></option>');
		oTemp.prop('selectedIndex', 0);
	}

	var oStart = $('#' + oCopy.attr('id') + '_start');

	oStart.off('change');
	oStart.change(function() {
		try {
			changeCourseData(mData['unique']);
		} catch(e) {
			console.debug(e);
		}
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Weeks

	oTemp = oCopy.find('#courseTemplateWeeks');
	oTemp.attr('id', oCopy.attr('id') + '_duration');

	var oDuration = $('#' + oCopy.attr('id') + '_duration');

	if(mData['start'] === 0) {
		oDuration.prop('disabled', true);
	}

	oDuration.off('change');
	oDuration.change(function() {
		try {
			changeCourseData(mData['unique']);
		} catch(e) {
			console.debug(e);
		}
	});

	var aOptions = false;

	if(oStart.val() !== '') {
		if(
			aCoursesData[mData['unique']] &&
			aCoursesData[mData['unique']][oStart.val()]
		) {
			aOptions = aCoursesData[mData['unique']][oStart.val()];
		}
	}

	var bEmpty = true;

	for(var i = 53; i >= 1; i--)
	{
		if(
			aOptions &&
			(
				aOptions['fix'] && parseInt(aOptions['fix']) > 0 ||
				aOptions['min'] && parseInt(aOptions['min']) > 0 ||
				aOptions['max'] && parseInt(aOptions['max']) > 0
			)
		) {
			if(aOptions['fix'] && parseInt(aOptions['fix']) > 0) {
				if(i === parseInt(aOptions['fix'])) {
					bEmpty = false;
					oTemp.prepend('<option value="' + i + '">' + i + '</option>');
				}
			} else {
				if(parseInt(aOptions['min']) > 0 && parseInt(aOptions['max']) > 0) {
					if(i >= parseInt(aOptions['min']) && i <= parseInt(aOptions['max'])) {
						bEmpty = false;
						oTemp.prepend('<option value="' + i + '">' + i + '</option>');
					}
				} else if(parseInt(aOptions['min']) > 0) {
					if(i >= parseInt(aOptions['min'])) {
						bEmpty = false;
						oTemp.prepend('<option value="' + i + '">' + i + '</option>');
					}
				} else if(parseInt(aOptions['max']) > 0) {
					if(i <= parseInt(aOptions['max'])) {
						oTemp.prepend('<option value="' + i + '">' + i + '</option>');
					}
				}
			}
		} else {
			oTemp.prepend('<option value="' + i + '">' + i + '</option>');
		}
	}

	if(
		bEmpty &&
		mData['duration'] === 0
	) {
		oTemp.prepend('<option value=""></option>');
		oTemp.prop('selectedIndex', 0);
	}

	if(mData['duration']) {
		oTemp.val(mData['duration']);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Modules

	//var oTemp	= oCopy.down('#courseModulesTitle');
	//oTemp.id	= 'courseModulesTitle_' + oCopy.id;
	//
	//var oTemp	= oCopy.down('#courseModulesContainer');
	//oTemp.id	= 'courseModulesContainer_' + oCopy.id;
	//
	//var oContainer = $('courseModulesContainer_' + oCopy.id);
	//
	//if(mData['duration'] && mData['modules'] && mData['modules'].length > 0)
	//{
	//	var oModulesTitle = $('courseModulesTitle_' + oCopy.id);
	//
	//	oModulesTitle.show();
	//
	//	mData['modules'].each(function(oModule)
	//	{
	//		addModulesBlock(oModule, oContainer, mData['selected_modules']);
	//	}.bind(mData));
	//}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	$('.courseBlockRemover').each(function(iIndex, oSpan) {
		oSpan = $(oSpan);
		oSpan.off('click');
		oSpan.click(function() {
			try {
				removeBlock(oSpan.closest('.courseBlock').parent(), 'courses');
			} catch(e) {
				console.debug(e);
			}
		});
	});
}

function changeCourseData(iUnique) {
	showLoader();

	oTimer = null;

	var sParams = 'task=get_ajax&action=change_course_data';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&course_id=' + $('#c_' + iUnique + '_id').val();
	sParams += '&level_id=' + $('#c_' + iUnique + '_level').val();
	sParams += '&units=' + $('#c_' + iUnique + '_units').val();
	sParams += '&start=' + $('#c_' + iUnique + '_start').val();
	sParams += '&duration=' + $('#c_' + iUnique + '_duration').val();
	sParams += '&unique=' + iUnique;

	executeAjaxRequest(sParams);
}

function waitForChanging(iUnique)
{
	if(oTimer != null)
	{
		window.clearTimeout(oTimer);
	}

	oTimer = window.setTimeout('changeCourseData(' + iUnique + ')', 1000);
}

/* ==================================================================================================== */ // Modules

//function addModulesBlock(oModule, oContainer, oSelected)
//{
//	var oCopy = $('courseModuleTemplate').clone(true);
//
//	oCopy.style.display = 'block';
//
//	var iBlockKey = oContainer.id.replace(/courseModulesContainer_c_/, '');
//
//	oCopy.id = 'm_' + iBlockKey + '_' + oContainer.childNodes.length;
//
//	oContainer.insert({bottom: oCopy});
//
//	oCopy = $('m_' + iBlockKey + '_' + (oContainer.childNodes.length - 1));
//
//	var sKey = oModule.from_time + '_' + oModule.module_id;
//
//	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Week title
//
//	var oTemp	= oCopy.down('#moduleWeek');
//	oTemp.id	= oCopy.id + '_moduleWeek';
//
//	if(oModule.module_type == 1)
//	{
//		if(oModule.week)
//		{
//			oTemp.innerHTML = oTemp.innerHTML + ' ' + oModule.week + ': ' + oModule.from + ' - ' + oModule.till;
//		}
//		else
//		{
//			oTemp.hide();
//		}
//	}
//	else
//	{
//		if(oContainer.childNodes.length == 1)
//		{
//			oTemp.innerHTML = oModule.from + ' - ' + oModule.till;
//		}
//		else
//		{
//			oTemp.hide();
//		}
//	}
//
//	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Modul
//
//	var oTemp	= oCopy.down('#moduleModuleTitle');
//	oTemp.id	= oCopy.id + '_moduleModuleTitle';
//
//	oTemp.innerHTML = oTemp.innerHTML + ' ' + oModule.module;
//
//	var oTemp	= oCopy.down('#moduleModuleModule');
//	oTemp.id	= oCopy.id + '_moduleModuleModule';
//
//	oTemp.insert({bottom: '<option value="' + oModule.module_id + '">' + oModule.title + '</option>'});
//
//	oTemp.selectedIndex = 0;
//
//	var iSelectedID = 0;
//
//	if(oSelected && oSelected[sKey] && oSelected[sKey].module_id)
//	{
//		iSelectedID = oTemp.selectedIndex = 1;
//	}
//
//	Event.stopObserving(oTemp, 'change');
//	Event.observe(oTemp, 'change', function()
//	{
//		var oModul = $(oCopy.id + '_moduleModuleModule');
//		var oLevel = $(oCopy.id + '_moduleLevel');
//
//		if(oLevel.length > 1)
//		{
//			if(oModul.value != '')
//			{
//				oLevel.up('.moduleLevel').show();
//			}
//			else
//			{
//				oLevel.selectedIndex = 0;
//				oLevel.up('.moduleLevel').hide();
//			}
//		}
//		else
//		{
//			oLevel.selectedIndex = 0;
//			oLevel.up('.moduleLevel').hide();
//		}
//
//		changeModulState(oModul, oLevel, oModule.from_time, oModule.module_id, oModule.modulegroup_id);
//	}.bind(oCopy));
//
//	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Level
//
//	var oTemp	= oCopy.down('#moduleLevel');
//	oTemp.id	= oCopy.id + '_moduleLevel';
//
//	oTemp.up('.moduleLevel').hide();
//
//	if(oModule.levels)
//	{
//		var iSelected = 0;
//
//		for(var i = 0; i < oModule.levels.length; i++)
//		{
//			if(
//					oSelected &&
//					oSelected[sKey] &&
//					oSelected[sKey].module_level_id &&
//					oSelected[sKey].module_level_id == oModule.levels[i]['id']
//			)
//			{
//				iSelected = i+1;
//			}
//
//			oTemp.insert({bottom: '<option value="' + oModule.levels[i]['id'] + '">' + oModule.levels[i]['title'] + '</option>'});
//		}
//
//		oTemp.selectedIndex = iSelected;
//
//		if(iSelectedID)
//		{
//			oTemp.up('.moduleLevel').show();
//		}
//	}
//	else
//	{
//		oTemp.up('.moduleLevel').hide();
//	}
//
//	Event.stopObserving(oTemp, 'change');
//	Event.observe(oTemp, 'change', function()
//	{
//		var oModul = $(oCopy.id + '_moduleModuleModule');
//		var oLevel = $(oCopy.id + '_moduleLevel');
//
//		changeModulState(oModul, oLevel, oModule.from_time, oModule.module_id, oModule.modulegroup_id);
//	}.bind(oCopy));
//}
//
//function changeModulState(oModul, oLevel, iTimeFrom, iModuleID, iModuleGroupID)
//{
//	showLoader();
//
//	var sParams = 'task=get_ajax&action=change_modul_state';
//
//	var aTemp = oModul.id.split('_');
//
//	sParams += '&page='			+ $F('thebing-page-number');
//	sParams += '&course='		+ aTemp[1];
//	sParams += '&from='			+ iTimeFrom;
//	sParams += '&module_id='	+ iModuleID;
//	sParams += '&group_id='		+ iModuleGroupID;
//	sParams += '&level_id='		+ oLevel.value;
//	sParams += '&value='		+ oModul.value;
//
//	new Ajax.Request('?' + window.location.search.replace('?', ''),
//	{
//		method: 	'post',
//		parameters:	sParams,
//		onComplete:	loadDataCallback
//	});
//}

/* ==================================================================================================== */ // Accommodations

function addAccommodationBlock(iAccID, iKey) {
	showLoader();

	var sParams = 'task=get_ajax&action=add_accommodation_block';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&acc_id=' + iAccID;

	if(iKey) {
		sParams += '&unique=' + iKey;
	}

	executeAjaxRequest(sParams);
}

function addAccommodationBlockCallback(mData)
{
	aAccData[mData['unique']] = mData['options'];

	var oCopy = $('#accommodationTemplate').clone(true);
	var oTemp;

	oCopy.css('display', 'block');
	oCopy.attr('id', 'a_' + mData['unique']);

	if($('#' + oCopy.attr('id')).length) {
		$('#' + oCopy.attr('id')).replaceWith(oCopy);
	} else {
		$('#accommodationsContainer').append(oCopy);
	}

	oCopy = $('#a_' + mData['unique']);

	if(mData['block_error']) {
		oCopy.find('.accommodationBlock').addClass('block_error');
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	oTemp = oCopy.find('#accommodationTemplateID');
	oTemp.val(mData['acc_id']);
	oTemp.attr('id', oCopy.attr('id') + '_id');

	var oAcc = $('#' + oCopy.attr('id') + '_id');

	oAcc.off('change');
	oAcc.change(function() {
		try {
			changeAccommodationData(oAcc);
		} catch(e) {
			console.debug(e);
		}
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Roomtype

	oTemp = oCopy.find('#accommodationTemplateRoomtype');
	oTemp.attr('id', oCopy.attr('id') + '_roomtype');

	$.each(mData['roomtypes'], function(iRoomtypeId, oRoomData) {
		oTemp.append('<option value="' + iRoomtypeId + '">' + oRoomData.title + '</option>');
	});

	if(mData['roomtype']) {
		oTemp.val(mData['roomtype']);
	} else {
		oTemp.prepend('<option value=""></option>');
		oTemp.prop('selectedIndex', 0);
	}

	var oRoomtype = $('#' + oCopy.attr('id') + '_roomtype');

	oRoomtype.off('change');
	oRoomtype.change(function() {
		try {
			changeAccommodationData(oRoomtype);
		} catch(e) {
			console.debug(e);
		}
	});

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Meal

	oTemp = oCopy.find('#accommodationTemplateMeal');
	oTemp.attr('id', oCopy.attr('id') + '_meal');

	if(mData['roomtype']) {
		$.each(mData['roomtypes'][mData['roomtype']].meals, function(iMealId, sMeal) {
			oTemp.append('<option value="' + iMealId + '">' + sMeal + '</option>');
		});

		if(mData['meal']) {
			oTemp.val(mData['meal']);
		} else {
			oTemp.prepend('<option value=""></option>');
			oTemp.prop('selectedIndex', 0);
		}

		var oMeal = $('#' + oCopy.attr('id') + '_meal');

		oMeal.off('change');
		oMeal.change(function() {
			try {
				changeAccommodationData(oMeal);
			} catch(e) {
				console.debug(e);
			}
		});
	} else {
		oTemp.prop('disabled', true);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Start

	oTemp = oCopy.find('#accommodationTemplateStart');
	oTemp.attr('id', oCopy.attr('id') + '_start');

	var oStart = $('#' + oCopy.attr('id') + '_start');

	if(mData['meal'] == 0 || mData['meal'] == null || mData['options'].length == 0) {
		oStart.prop('disabled', true);
	} else {
		$.each(mData['options'], function(iKey1, oOption) {

			if(oOption['prev']) {
				$.each(oOption['prev'], function(iKey2, oOption2) {
					// TODO oOption2 == string?
					//var sDisabled = '';
					//if(oOption2.disabled) {
					//	sDisabled = 'disabled="disabled"';
					//}

					oStart.append('<option class="optionExtra" value="' + iKey2 + '" ' + sDisabled + '>' + oOption2 + '</option>');
				});
			}

			var sDisabled = '';
			if(oOption.disabled) {
				sDisabled = 'disabled="disabled"';
			}

			oStart.append('<option class="optionNonExtra" value="' + iKey1 + '" ' + sDisabled + '>' + oOption.title + '</option>');
		});

		// Wenn es keine Kurse gibt: Nach Datum sortieren, da es hier dann massig Datumsangaben zur Auswahl gibt
		if(!$('#coursesBlocks').length) {
			var aTmp = $(oStart).find('option');
			aTmp.sort(function(oOption1, oOption2) {
				return oOption1.value - oOption2.value;
			});
			$(oStart).html(aTmp)
		}

		if(mData['start']) {
			oStart.val(mData['start']);
		} else {
			oTemp.prepend('<option value=""></option>');
			oTemp.prop('selectedIndex', 0);
		}

		oStart.off('change');
		oStart.change(function() {
			try {
				changeAccommodationData(oStart);
			} catch(e) {
				console.debug(e);
			}
		});
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Durations

	oTemp = oCopy.find('#accommodationTemplateWeeks');
	oTemp.attr('id', oCopy.attr('id') + '_duration');

	var oDuration = $('#' + oCopy.attr('id') + '_duration');

	oDuration.off('change');
	oDuration.change(function() {
		try {
			changeAccommodationData(oDuration);
		} catch(e) {
			console.debug(e);
		}
	});

	if(oStart.prop('disabled') || !mData['start']) {
		oDuration.prop('disabled', true);
	} else {
		if(aAccData[mData['unique']][mData['start']]) {
			var aOptions = aAccData[mData['unique']][mData['start']];
		} else {
			var aOptions = new Object();

			$.each(aAccData[mData['unique']], function(iTimestamp, oDate) {

				if(oDate['prev']) {
					$.each(oDate['prev'], function(iTimestamp2, oSubDate) {
						if(iTimestamp2 == mData['start']) {
							aOptions = oDate;
							return false;
						}
					});
				}

				if(aOptions['max']) {
					return false;
				}

			});
		}

		for(var i = aOptions['max']; i >= 1; i--) {
			oDuration.append('<option value="' + i + '">' + i + '</option>');
		}

		// Wochen aufsteigend sortieren
		aTmp = $(oDuration).find('option');
		aTmp.sort(function(oOption1, oOption2) {
			return oOption1.value - oOption2.value;
		});
		$(oDuration).html(aTmp);

		if(mData['duration']) {
			oDuration.val(mData['duration']);
		} else {
			oDuration.prepend('<option value=""></option>');
			oDuration.prop('selectedIndex', 0);
		}
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // End line

	oTemp = oCopy.find('#accommodationTemplateEnd');
	oTemp.attr('id', oCopy.attr('id') + '_end');

	var oEnd = $('#' + oCopy.attr('id') + '_end');

	oEnd.off('change');
	oEnd.change(function() {
		try {
			changeAccommodationData(oEnd);
		} catch(e) {
			console.debug(e);
		}
	});

	if(mData['duration']) {

		var aOptions = aAccData[mData['unique']];
		var bAddNow = false;
		var iLoops = 0;

		$.each(aOptions, function(iTimestamp, oDate) {
			if(iTimestamp == oStart.val()) {
				bAddNow = true;
				iLoops = mData['duration'];
			} else if(oDate['prev']) {
				$.each(oDate['prev'], function(iTimestamp2, oDate2) {
					if(iTimestamp2 == oStart.val()) {
						bAddNow = true;
						iLoops = mData['duration'];
						return false;
					}
				})
			}

			if(bAddNow) {
				iLoops--;

				if(iLoops != 0) {
					return true;
				}

				oEnd.append('<option class="optionNonExtra" value="' + oDate['end']['key'] + '">' + oDate['end']['value'] + '</option>');

				if(oDate['next']) {
					$.each(oDate['next'], function(iTimestamp2, oDate2) {
						oEnd.append('<option class="optionExtra" value="' + iTimestamp2 + '">' + oDate2 + '</option>');
					});
				}
			}
		});

		if(mData['end']) {
			oEnd.val(mData['end']);
		}
	} else {
		oEnd.prop('disabled', true);
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

	$('.accommodationBlockRemover').each(function(iIndex, oSpan) {
		oSpan = $(oSpan);
		oSpan.off('click');
		oSpan.click(function() {
			try {
				removeBlock(oSpan.closest('.accommodationBlock').parent(), 'accommodations');
			} catch(e) {
				console.debug(e);
			}
		});
	});
}

function changeAccommodationData(oDD) {
	showLoader();

	var sParams = 'task=get_ajax&action=change_accommodation_data';
	var aItem = oDD.attr('id').split('_');
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&unique=' + aItem[1];
	sParams += '&value=' + oDD.val();
	sParams += '&element=' + aItem[2];

	executeAjaxRequest(sParams);
}

/* ==================================================================================================== */ // Insurance

function addInsuranceBlock(iInsuranceId, iKey) {
	
	showLoader();

	var sParams = 'task=get_ajax&action=add_insurance_block';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&insurance_id=' + iInsuranceId;

	if(iKey) {
		sParams += '&unique=' + iKey;
	}

	executeAjaxRequest(sParams);

}

function addInsuranceBlockCallback(mData) {

	var aElements = [];
	aInsuranceData[mData['unique']] = mData;

	var oCopy = $('#insuranceTemplate').clone(true);
	oCopy.css('display', 'block');
	oCopy.attr('id', 'i_' + mData['unique']);

	if($('#' + oCopy.attr('id')).length) {
		$('#' + oCopy.attr('id')).replaceWith(oCopy);
	} else {
		$('#insurancesContainer').append(oCopy);
	}

	if(mData['block_error']) {
		oCopy.find('.insuranceBlock').addClass('block_error');
	}

	// --- ID

	var oIdField = oCopy.find('#insuranceTemplateId');
	oIdField.val(mData['insurance_id']);
	oIdField.attr('id', oCopy.attr('id') + '_id');
	aElements.push(oIdField);

	// --- Startdatum

	var oStartField = oCopy.find('#insuranceTemplateFrom');
	oStartField.val(mData['from']);
	oStartField.attr('id', oCopy.attr('id') + '_from');
	aElements.push(oStartField);

	ThebingCalendar.prepare({
		dateField: oStartField,
		triggerElement: oStartField.next('img'),
		closeHandler: changeInsuranceData
	});

	// --- Enddatum

	var oEndField = oCopy.find('#insuranceTemplateTill');
	oEndField.val(mData['till']);
	oEndField.attr('id', oCopy.attr('id') + '_till');
	aElements.push(oEndField);

	ThebingCalendar.prepare({
		dateField: oEndField,
		triggerElement: oEndField.next('img'),
		closeHandler: changeInsuranceData
	});

	// --- Wochen

	var oWeeksField = oCopy.find('#insuranceTemplateWeeks');
	oWeeksField.val(mData['weeks']);
	oWeeksField.attr('id', oCopy.attr('id') + '_weeks');
	aElements.push(oWeeksField);

	// Events auf jedes relevante Feld setzen
	$(aElements).each(function(iIndex, oElement) {
		oElement = $(oElement);
		oElement.off('change');
		oElement.change(function() {
			try {
				changeInsuranceData(oElement);
			} catch(e) {
				console.debug(e);
			}
		});
	});

	// Wochenfeld je nach Versicherungstyp ein- oder ausblenden
	if(mData['payment_type']) {
		if(mData['payment_type'] == 3) {
			oWeeksField.closest('.row').show();
		} else {
			oWeeksField.closest('.row').hide();
		}
	}

	// --- Versicherung entfernen

	$('.insuranceBlockRemover').each(function(iIndex, oSpan) {
		oSpan = $(oSpan);
		oSpan.off('click');
		oSpan.click(function() {
			try {
				removeBlock(oSpan.closest('.insuranceBlock').parent(), 'insurances');
			} catch(e) {
				console.debug(e);
			}
		});
	});

}

function changeInsuranceData(oField) {

	showLoader();

	// Feld kann auch mal Kalender sein (Funktion ist closeHandler in dem Fall)
	if(oField.dateField) {
		oField.hide();
		oField.dateField.val(oField.date.print(oField.dateFormat));
		oField = oField.dateField;
	}

	var aItem = oField.attr('id').split('_');
	var sParams = 'task=get_ajax&action=change_insurance_data';

	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&unique=' + aItem[1];
	sParams += '&value=' + oField.val();
	sParams += '&element=' + aItem[2];

	executeAjaxRequest(sParams);

}

/* ==================================================================================================== */ // Transfer

function updateTransferLocations(sElement) {
	showLoader();

	$(sElement).prop('disabled', true);

	var sParams = 'task=get_ajax&action=update_transfer_locations';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&element=' + sElement;

	switch(sElement) {
		case 'trans_arr_to':
			sParams += '&value=' + $('#trans_arr_from').val();
			break;
		case 'trans_dep_to':
			sParams += '&value=' + $('#trans_dep_from').val();
			break;
	}

	executeAjaxRequest(sParams);
}

function updateTransferLocationsCallback(mData) {

	var mValue = $('#' + mData.element.replace(/_to/, '_from')).val();
	var oSelect = $('#' + mData.element).get(0);
	var iSelected = 0;

	for(var i = 1; i < oSelect.length; i++) {
		if(mValue == '') {
			oSelect.options[i].disabled = false;
			continue;
		}

		if(mData.values && mData.values[mValue]) {
			if(mData.values[mValue][oSelect.options[i].value]) {
				if(mData.selected == oSelect.options[i].value) {
					iSelected = i;
				}

				oSelect.options[i].disabled = false;
			} else {
				oSelect.options[i].disabled = true;
			}
		} else {
			oSelect.options[i].disabled = true;
		}
	}

	oSelect.selectedIndex = iSelected;
	oSelect.disabled = false;

}

function updateTransferData(sElement) {
	showLoader();

	var sParams = 'task=get_ajax&action=update_transfer_data';
	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&value=' + $('#' + sElement).val();

	switch(sElement) {
		case 'transfer_type':
			sParams += '&element=type';
			break;
		case 'trans_arr_to':
			sParams += '&element=arr_to';
			break;
		case 'trans_dep_to':
			sParams += '&element=dep_to';
			break;
	}

	executeAjaxRequest(sParams);
}

function updateTransferDates(oCalendar)
{
	showLoader();

	if(oCalendar) {
		oCalendar.dateField.val(oCalendar.date.print(oCalendar.dateFormat));
		oCalendar.hide();
	}

	var sParams = 'task=get_ajax&action=update_transfer_dates';
	var sFieldId = oCalendar.dateField.attr('id');

	var sTriggeredBy = 'arr';
	if(sFieldId === 'calendar_transDepDate') {
		sTriggeredBy = 'dep';
	}

	sParams += '&page='	+ $('#thebing-page-number').val();
	sParams += '&from='	+ $('#calendar_transArrDate').val();
	sParams += '&till='	+ $('#calendar_transDepDate').val();
	sParams += '&triggered_by=' + sTriggeredBy;

	executeAjaxRequest(sParams);

}

/* ==================================================================================================== */

function removeBlock(oBlock, sType) {
	showLoader();

	var sParams = 'task=get_ajax&action=remove_block';
	var iUnique = 0;

	if(sType == 'courses') {
		iUnique = oBlock.attr('id').replace(/c_/, '');
		aCoursesData[iUnique] = null;
	} else if(sType == 'accommodations') {
		iUnique = oBlock.attr('id').replace(/a_/, '');
		aAccData[iUnique] = null;
	} else if(sType === 'insurances') {
		iUnique = oBlock.attr('id').replace(/i_/, '');
		aInsuranceData[iUnique] = null;
	}

	sParams += '&page=' + $('#thebing-page-number').val();
	sParams += '&unique=' + iUnique;
	sParams += '&type=' + sType;

	executeAjaxRequest(sParams);
}

/* ==================================================================================================== */ // Prices

function updateCurrency() {
	showLoader();

	var sParams = 'task=get_ajax&action=change_currency';
	sParams += '&currency=' + $('#currency').val();
	sParams += '&page=' + $('#thebing-page-number').val();

	executeAjaxRequest(sParams);
}

function updatePricesCallback(mData)
{
	var sCurrency = $('#currency').val();

	if(mData['courses'] && mData['courses'].length > 0)
	{
		$('#pricesBlockCourse').show();

		mData['courses'].forEach(function(oData) {
			if(!oData.title)
			{
				return true;
			}

			var oBlock = $('#p_c_' + oData['unique']);
			
			if(!oBlock.length)
			{
				writePriceBlock('courses', oData);

				oBlock = $('#p_c_' + oData['unique']);
			}
			else
			{
				oBlock.find('.pricesWeek').html(oData['weeks']);
				oBlock.find('.pricesSubPositionDates').html(oData['dates']);
			}

			if(oData['prices'][sCurrency]['original'] > 0)
			{
				oBlock.find('.pricesSubPositionPrice').html(oData['prices'][sCurrency]['formated']);
			}
			else
			{
				oBlock.find('.pricesSubPositionPrice').html('***');
			}

			if(oBlock.find('.pricesSubPositionVats'))
			{
				if(oData['prices'][sCurrency]['tax_original'] > 0)
				{
					oBlock.find('.pricesSubPositionVats').html(
						oData['prices'][sCurrency]['tax_formated'] + ' (' + oData['prices'][sCurrency]['tax_rate_formated'] + '%)');
				}
				else
				{
					oBlock.find('.pricesSubPositionVats').html('***');
				}
			}

			if(oData['prices'] && oData['prices']['add'])
			{
				oData['prices']['add'].forEach(function(oAdd)
				{
					var oSub = $('#p_c_' + oData['unique'] + '_' + oAdd['cost_id']);

					if(oAdd['amount'][sCurrency])
					{
						oSub.find('.pricesSubPositionPrice').html(oAdd['amount'][sCurrency]['formated']);
					}
					else
					{
						oSub.find('.pricesSubPositionPrice').html('***');
					}

					if(oSub.find('.pricesSubPositionVats'))
					{
						if(oAdd['amount'][sCurrency])
						{
							oSub.find('.pricesSubPositionVats').html(
							oAdd['amount'][sCurrency]['tax_formated'] + ' (' + oAdd['amount'][sCurrency]['tax_rate_formated'] + '%)');
						}
						else
						{
							oSub.find('.pricesSubPositionVats').html('***');
						}
					}
				});
			}
		});
	}
	else
	{
		$('#pricesBlockCourse').hide();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Accommodations

	if(mData['accommodations'] && mData['accommodations'].length > 0) {

		$('#pricesBlockAccommodation').show();

		mData['accommodations'].forEach(function(oData) {
			if(!oData.title) {
				return true;
			}

			var oBlock = $('#p_a_' + oData['unique']);

			if(!oBlock.length) {
				writePriceBlock('accommodations', oData);
				oBlock = $('#p_a_' + oData['unique']);
			} else {
				oBlock.find('.pricesWeek').innerHTML = oData['weeks'];
				oBlock.find('.pricesSubPositionDates').innerHTML = oData['dates'];
			}

			if(oData['prices'][sCurrency]['extra'])
			{
				oBlock.find('.pricesSubPositionExtra').html(
					oData['prices'][sCurrency]['extra'] + ' ' +
					oData['prices'][sCurrency]['extra_title']);

				if(oData['prices'][sCurrency]['extra_original'] > 0)
				{
					oBlock.find('.pricesSubPositionExtraPrice').html(oData['prices'][sCurrency]['extra_formated']);
				}
				else
				{
					oBlock.find('.pricesSubPositionExtraPrice').html('***');
				}

				if(oBlock.find('.pricesSubPositionExtraVats').length)
				{
					if(oData['prices'][sCurrency]['extra_tax_original'] > 0)
					{
						oBlock.find('.pricesSubPositionExtraVats').html(
						oData['prices'][sCurrency]['extra_tax_formated'] + ' (' + oData['prices'][sCurrency]['tax_rate_formated'] + '%)');
					}
					else
					{
						oBlock.find('.pricesSubPositionExtraVats').html('***');
					}
				}
			}
			else
			{
				oBlock.find('.pricesSubPositionExtra').html('');
				oBlock.find('.pricesSubPositionExtraPrice').html('');

				if(oBlock.find('.pricesSubPositionExtraVats').length)
				{
					oBlock.find('.pricesSubPositionExtraVats').html('');
				}
			}

			if(oData['prices'][sCurrency]['original'] > 0)
			{
				oBlock.find('.pricesSubPositionPrice').html(oData['prices'][sCurrency]['formated']);
			}
			else
			{
				oBlock.find('.pricesSubPositionPrice').html('***');
			}

			if(oBlock.find('.pricesSubPositionVats').length)
			{
				if(oData['prices'][sCurrency]['tax_original'] > 0)
				{
					oBlock.find('.pricesSubPositionVats').html(
					oData['prices'][sCurrency]['tax_formated'] + ' (' + oData['prices'][sCurrency]['tax_rate_formated'] + '%)');
				}
				else
				{
					oBlock.find('.pricesSubPositionVats').html('***');
				}
			}

			if(oData['prices'] && oData['prices']['add'])
			{
				oData['prices']['add'].forEach(function(oAdd)
				{
					var oSub = $('#p_a_' + oData['unique'] + '_' + oAdd['cost_id']);

					if(oAdd['amount'][sCurrency])
					{
						oSub.find('.pricesSubPositionPrice').html(oAdd['amount'][sCurrency]['formated']);
					}
					else
					{
						oSub.find('.pricesSubPositionPrice').html('***');
					}

					if(oSub.find('.pricesSubPositionVats').length)
					{
						if(oAdd['amount'][sCurrency])
						{
							oSub.find('.pricesSubPositionVats').html(
							oAdd['amount'][sCurrency]['tax_formated'] + ' (' + oAdd['amount'][sCurrency]['tax_rate_formated'] + '%)');
						}
						else
						{
							oSub.find('.pricesSubPositionVats').html('***');
						}
					}
				});
			}
		});
	}
	else
	{
		$('#pricesBlockAccommodation').hide();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Insurances

	if(mData['insurances'] && mData['insurances'].length > 0) {
		$('#pricesBlockInsurance').show();

		mData['insurances'].forEach(function(oData) {
			if(!oData.title) {
				return true;
			}

			var oBlock = $('#p_i_' + oData['unique']);

			if(!oBlock.length) {
				writePriceBlock('insurances', oData);
				oBlock = $('#p_i_' + oData['unique']);
			} else {
				//oBlock.down('.pricesWeek').innerHTML = oData['weeks'];
				oBlock.find('.pricesSubPositionDates').html(oData['dates']);
			}

			if(oData['prices'][sCurrency]['original'] > 0) {
				oBlock.find('.pricesSubPositionPrice').html(oData['prices'][sCurrency]['formated']);
			} else {
				oBlock.find('.pricesSubPositionPrice').html('***');
			}

			if(oBlock.find('.pricesSubPositionVats')) {
				if(oData['prices'][sCurrency]['tax_original'] > 0) {
					oBlock.find('.pricesSubPositionVats').html(
					oData['prices'][sCurrency]['tax_formated'] + ' (' + oData['prices'][sCurrency]['tax_rate_formated'] + '%)');
				} else {
					oBlock.find('.pricesSubPositionVats').html('***');
				}
			}
		});
	} else {
		$('#pricesBlockInsurance').hide();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Prices

	if(mData['transfer'] && (mData['transfer']['prices'] || mData['transfer'][1] || mData['transfer'][2])) {

		if(mData['transfer']['type']) {
			$('#pricesBlockTransfer').show();

			$('#pricesSubTransfer').find('.pricesSubPositionTitle').html(mData['transfer']['title']);

			if(mData['transfer']['prices']) {
				if(mData['transfer']['prices'][sCurrency]['original'] > 0) {
					$('#pricesSubTransfer').find('.pricesSubPositionPrice').html(
						mData['transfer']['prices'][sCurrency]['formated']);
				}
				else
				{
					$('#pricesSubTransfer').find('.pricesSubPositionPrice').html('***');
				}

				if($('pricesSubTransfer').find('.pricesSubPositionVats'))
				{
					if(mData['transfer']['prices'][sCurrency]['tax_original'] > 0)
					{
						$('pricesSubTransfer').find('.pricesSubPositionVats').html(
							mData['transfer']['prices'][sCurrency]['tax_formated'] + ' (' +
							mData['transfer']['prices'][sCurrency]['tax_rate_formated'] + '%)');
					}
					else
					{
						$('pricesSubTransfer').find('.pricesSubPositionVats').html('***');
					}
				}

				for(var i = 1; i <= 2; i++)
				{
					$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionPrice').html('');

					if($('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionVats').length)
					{
						$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionVats').html('');
					}
				}
			}
			else
			{
				$('#pricesSubTransfer').find('.pricesSubPositionPrice').html('');

				if($('#pricesSubTransfer').find('.pricesSubPositionVats'))
				{
					$('#pricesSubTransfer').find('.pricesSubPositionVats').html('');
				}

				for(var i = 1; i <= 2; i++)
				{
					if(mData['transfer'][i])
					{
						if(
							mData['transfer'][i] &&
							mData['transfer'][i]['prices'][sCurrency]['original_single'] > 0
						) {
							$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionPrice').html(
								mData['transfer'][i]['prices'][sCurrency]['formated_single']);
						}
						else
						{
							$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionPrice').html('***');
						}
					}

					if($('pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionVats').length)
					{
						if(
							mData['transfer'][i] &&
							mData['transfer'][i]['prices'][sCurrency]['tax_original_single'] > 0
						) {
							$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionVats').html(
								mData['transfer'][i]['prices'][sCurrency]['tax_formated_single'] + ' (' +
								mData['transfer'][i]['prices'][sCurrency]['tax_rate_formated'] + '%)');
						}
						else
						{
							$('#pricesSubTransfer').find('.transPrice_' + i).find('.pricesSubPositionVats').html('***');
						}
					}
				}
			}

			switch(mData['transfer']['type'])
			{
				case 'arr_dep':
				{
					$('pricesSubTransfer').find('.pricesSubPositionArr').html(mData['transfer']['arr_title']);
					$('pricesSubTransfer').find('.pricesSubPositionDep').html(mData['transfer']['dep_title']);

					break;
				}
				case 'arr':
				{
					$('pricesSubTransfer').find('.pricesSubPositionArr').html(mData['transfer']['arr_title']);
					$('pricesSubTransfer').find('.pricesSubPositionDep').html('');

					break;
				}
				case 'dep':
				{
					$('pricesSubTransfer').find('.pricesSubPositionArr').html('');
					$('pricesSubTransfer').find('.pricesSubPositionDep').html(mData['transfer']['dep_title']);

					break;
				}
			}
		}
		else
		{
			$('#pricesBlockTransfer').hide();
		}
	}
	else
	{
		$('#pricesBlockTransfer').hide();
	}

	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Total block

	if($('#totalSum').length)
	{
		$('#totalSum').html(mData['sum']);

		if(mData['vats'] && mData['vats'].length > 0)
		{
			var aUniques = new Object();

			mData['vats'].forEach(function(oVat)
			{
				if(oVat['rate'] <= 0)
				{
					return true;
				}

				var oBlock = $('#pricesVat_' + oVat['rate']);

				aUniques['pricesVat_' + oVat['rate']] = true;

				if(!oBlock.length)
				{
					writePriceBlock('vat', oVat);

					oBlock = $('#pricesVat_' + oVat['rate']);
				}

				oBlock.find('.pricesVatTitle').html(oVat['rate_formated'] + '% (' + oVat['sum'] + ')');
				oBlock.find('.priceRight').html(oVat['vat']);
			});

			$('#pricesVatsContainer').children().each(function(iIndex, oChild)
			{
				oChild = $(oChild);
				if(!aUniques[oChild.id])
				{
					oChild.remove();
				}
			});
		}
		else
		{
			$('#pricesVatsContainer').html('');
		}
	}

	if(mData['ones_vats'] && mData['ones_vats']['courses'].length > 0)
	{
		var aUniques = new Object();

		mData['ones_vats']['courses'].forEach(function(oVat)
		{
			var oBlock = $('#pricesSubCourseOnes_' + oVat['cost_id']);

			aUniques['pricesSubCourseOnes_' + oVat['cost_id']] = true;

			if(!oBlock.length)
			{
				writePriceBlock('ones_vat_courses', oVat);

				oBlock = $('#pricesSubCourseOnes_' + oVat['cost_id']);
			}

			oBlock.find('.pricesSubPositionTitle').html(oVat['title']);

			if(oVat['amount'] && oVat['amount'][sCurrency])
			{
				oBlock.find('.pricesSubPositionPrice').html(oVat['amount'][sCurrency]['formated']);

				if(oBlock.find('.pricesSubPositionVats'))
				{
					oBlock.find('.pricesSubPositionVats').html(
						oVat['amount'][sCurrency]['tax_formated'] + ' (' + oVat['amount'][sCurrency]['tax_rate_formated'] + '%)');
				}
			}
			else
			{
				oBlock.find('.pricesSubPositionPrice').html('***');
				oBlock.find('.pricesSubPositionVats').html('***');
			}
		});

		$('#pricesBlockCourseContainerOnes').children().each(function(iIndex, oChild) {
			if(!aUniques[oChild.id]) {
				$(oChild).remove();
			}
		});
	}
	else if($('#pricesBlockCourseContainerOnes').length)
	{
		$('#pricesBlockCourseContainerOnes').html('');
	}

	if(mData['ones_vats'] && mData['ones_vats']['accommodations'].length > 0)
	{
		var aUniques = new Object();

		mData['ones_vats']['accommodations'].forEach(function(oVat)
		{
			var oBlock = $('#pricesSubAccommodationOnes_' + oVat['cost_id']);

			aUniques['pricesSubAccommodationOnes_' + oVat['cost_id']] = true;

			if(!oBlock.length)
			{
				writePriceBlock('ones_vat_accommodations', oVat);

				oBlock = $('#pricesSubAccommodationOnes_' + oVat['cost_id']);
			}

			oBlock.find('.pricesSubPositionTitle').html(oVat['title']);

			if(oVat['amount'] && oVat['amount'][sCurrency])
			{
				oBlock.find('.pricesSubPositionPrice').html(oVat['amount'][sCurrency]['formated']);

				if(oBlock.find('.pricesSubPositionVats'))
				{
					oBlock.find('.pricesSubPositionVats').html(
						oVat['amount'][sCurrency]['tax_formated'] + ' (' + oVat['amount'][sCurrency]['tax_rate_formated'] + '%)');
				}
			}
			else
			{
				oBlock.find('.pricesSubPositionPrice').html('***');
				oBlock.find('.pricesSubPositionVats').html('***');
			}
		});

		$('#pricesBlockAccommodationContainerOnes').children().each(function(iIndex, oChild) {
			if(!aUniques[oChild.id]) {
				$(oChild).remove();
			}
		});
	}
	else if($('pricesBlockAccommodationContainerOnes').length)
	{
		$('#pricesBlockAccommodationContainerOnes').html('');
	}

	$('#totalPrice').html(mData['total']);
}

function writePriceBlock(sType, mData) {
	var oCopy;

	switch(sType) {
		case 'courses':

			oCopy = $('#pricesSubCourse').clone(true);
			oCopy.css('display', 'block');
			oCopy.attr('id', 'p_c_' + mData['unique']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesBlockCourseContainer').append(oCopy);
			}

			oCopy = $('#p_c_' + mData['unique']);
			oCopy.find('.pricesSubPositionTitle').html(mData['title']);
			oCopy.find('.pricesSubPositionDates').html(mData['dates']);
			oCopy.find('.pricesWeek').html(mData['weeks']);

			if(mData['prices'] && mData['prices']['add']) {
				mData['prices']['add'].forEach(function(oAdd) {
					var oSub = $('#pricesSubAdd').clone(true);
					oSub.css('display', 'block');
					oSub.attr('id', 'p_c_' + mData['unique'] + '_' + oAdd['cost_id']);

					oSub.find('.pricesSubPositionTitle').html(oAdd['title']);

					if($(oSub.attr('id')).length) {
						$(oSub.attr('id')).replaceWith(oSub);
					} else {
						oCopy.find('.pricesSubCourseAdds').append(oSub);
					}
				});
			}

			break;
		case 'accommodations':

			oCopy = $('#pricesSubAccommodation').clone(true);
			oCopy.css('display', 'block');
			oCopy.attr('id', 'p_a_' + mData['unique']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesBlockAccommodationContainer').append(oCopy);
			}

			oCopy = $('#p_a_' + mData['unique']);
			oCopy.find('.pricesSubPositionTitle').html(mData['title']);
			oCopy.find('.pricesSubPositionDates').html(mData['dates']);
			oCopy.find('.pricesWeek').html(mData['weeks']);

			if(mData['prices'] && mData['prices']['add']) {
				mData['prices']['add'].forEach(function(oAdd) {
					var oSub = $('#pricesSubAdd').clone(true);
					oSub.css('display', 'block');
					oSub.attr('id', 'p_a_' + mData['unique'] + '_' + oAdd['cost_id']);

					oSub.find('.pricesSubPositionTitle').html(oAdd['title']);

					if($(oSub.attr('id')).length) {
						$(oSub.attr('id')).replaceWith(oSub);
					} else {
						oCopy.find('.pricesSubAccommodationAdds').append(oSub);
					}
				});
			}

			break;
		case 'insurances':

			oCopy = $('#pricesSubInsurance').clone(true);
			oCopy.css('display', 'block');
			oCopy.attr('id', 'p_i_' + mData['unique']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesBlockInsuranceContainer').append(oCopy);
			}

			oCopy = $('#p_i_' + mData['unique']);
			oCopy.find('.pricesSubPositionTitle').html(mData['title']);
			oCopy.find('.pricesSubPositionDates').html(mData['dates']);

			break;
		case 'vat':

			oCopy = $('#pricesVat').clone(true);

			oCopy.css('display', 'block');
			oCopy.attr('id', 'pricesVat_' + mData['rate']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesVatsContainer').append(oCopy);
			}

			break;
		case 'ones_vat_courses':

			oCopy = $('#pricesSubCourseOnes').clone(true);
			oCopy.css('display', 'block');
			oCopy.attr('id', 'pricesSubCourseOnes_' + mData['cost_id']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesBlockCourseContainerOnes').append(oCopy);
			}

			break;
		case 'ones_vat_accommodations':

			oCopy = $('#pricesSubAccommodationOnes').clone(true);
			oCopy.css('display', 'block');
			oCopy.attr('id', 'pricesSubAccommodationOnes_' + mData['cost_id']);

			if($(oCopy.attr('id')).length) {
				$(oCopy.attr('id')).replaceWith(oCopy);
			} else {
				$('#pricesBlockAccommodationContainerOnes').append(oCopy);
			}

			break;
	}
}

/* ==================================================================================================== */ // Loader

function showLoader()
{
	var oLayer = $('#ajaxLoaderLayer');
	var oPageDiv = $('#pageDIV');
	var oLoader = $('#ajaxLoader');

	if(!oLayer.length) {
		return;
	}

	oLayer.width(oPageDiv.outerWidth());
	oLayer.height(oPageDiv.outerHeight());

	// Werte von img fest reingeschrieben, da ohne actual-Plugin width() und height() nicht funktionieren
	oLoader.css('left', (oPageDiv.outerWidth() - 125) / 2);
	oLoader.css('top', (oPageDiv.outerHeight() - 15) / 2);

	oLayer.show();
}

function hideLoader() {
	$('#ajaxLoaderLayer').hide();
}

/* ==================================================================================================== */ // Print

function printPrices() {
	$('#pricesBlockPrintCopy').remove();

	var oClone = $('#pricesBlock').clone(true);
	oClone.attr('id', 'pricesBlockPrintCopy');
	oClone.find('#pricesBlockCurrencies').remove();

	$('#form').before(oClone);

	window.print();
}

/* ==================================================================================================== */ //check valid inputs

function initValidation() {

	// Validierung
	$('#form').find(':input').each(function(iIndex, oField) {
		oField = $(oField);

		var aEvents;
		var sClassList = oField.attr('class');

		if(
			sClassList &&
			sClassList.indexOf('validate_') !== -1
		) {

			if(oField.is('input:text')) {
				aEvents = ['keyup', 'input', 'change'];
			} else if(oField.is('select')) {
				aEvents = ['change', 'input'];
			} else {
				aEvents = ['change', 'input'];
			}

			aEvents.forEach(function(sEvent) {
				oField.on(sEvent, handleValidate.bind(oField));
			});

		}
	});

}

function handleValidate() {

	var sClass = this.attr('class');

	sClass = sClass.substring(sClass.indexOf('validate_'));
	if(sClass.indexOf(' ') !== -1) {
		sClass = sClass.substring(0, sClass.indexOf(' '));
	}

	var aValidate = sClass.split(/\_/);

	validateInput(this, aValidate[1], aValidate[2]);

}

function validateInput(oField, sValidate, sParameter) {

	var bSuccess = false;
	var mValue = oField.val();

	var oContainer = oField.closest('.row_input');
	var oIconValid = oContainer.find('.row_input_icon_valid');
	var oIconInvalid = oContainer.find('.row_input_icon_invalid');

	if(
		!oField.hasClass('required') &&
		!mValue
	) {
		oField.removeClass('invalid');
		oField.removeClass('valid');
		oIconValid.hide();
		oIconInvalid.hide();
	} else {

		if(
			oField.hasClass('required') &&
			mValue == ''
		) {

		} else {

			switch(sValidate) {
				case 'int':

					if(!isNaN(mValue)) {
						if(sParameter) {
							var aCompare = sParameter.split(/-/);
							var iValue = parseInt(mValue);
							if(aCompare[0] <= iValue && aCompare[1] >= iValue) {
								bSuccess = true;
							}
						} else {
							bSuccess = true;
						}
					}

					break;
				case 'phone':

					var oRegEx = new RegExp('^\\+([0-9] ?){9,15}$','ig');
					var bCheck = oRegEx.test(mValue);

					if(bCheck === true) {
						bSuccess = true;
					}

					break;
				case 'email':

					var oRegEx = new RegExp('^[A-Z0-9._%\-+]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$','ig');
					var bCheck = oRegEx.test(mValue);

					if(bCheck === true) {
						bSuccess = true;
					}

					break;
				case 'date':

					if(oField.hasClass('calendar')) {
						var sRegexp = oCalendarResponse.sFormat.replace(/%d/, '(0[1-9]|[12][0-9]|3[01])').replace(/%m/, '(0[1-9]|1[012])').replace(/%Y/, '(19|20)[0-9]{2}')

						var oRegEx = new RegExp('^'+sRegexp+'$');
						var bCheck = oRegEx.test(mValue);

						if(bCheck === true) {
							bSuccess = true;
						}

					}

					break;
				default:
					bSuccess = true;
					break;
			}

		}

		var aFields = [oField];

		if(bSuccess) {
			oIconValid.show();
			oIconInvalid.hide();
			aFields.forEach(function(oField) {
				oField.removeClass('invalid');
				oField.addClass('valid');
			});
		} else {
			oIconValid.hide();
			oIconInvalid.show();
			aFields.forEach(function(oField) {
				oField.removeClass('valid');
				oField.addClass('invalid');
			});
		}
	}

}

function executeAjaxRequest(mData) {

	$.ajax({
		url: '?' + window.location.search.replace('?', ''),
		type: 'post',
		data: mData,
		dataType: 'json',
		success: loadDataCallback,
		error: function() {
			hideLoader();
			alert('Error loading data');
		}
	});

}

})(jQueryThebing);
	