$(document).ready(function() {
	
	var containerMapping = {
		binoliads: '#vacancy_binoliads',
		dateoverviewtoggle: '#vacancy_dateoverviewtoggle',
		dateoverview: '#vacancy_dateoverview',
		form: '#vacancy_form',
		infos: '#vacancy_infos',
		main: '#vacancy_main',
		submit: '#vacancy_submit',
		outboundflights: '#flighttables .outbound',
		returnflights: '#flighttables .return',
		priceoverview: '#vacancy_priceoverview',
		currency: '#vacancy_currency',
		error: '#vacancy_error'
	};
	var paramsMapping = {
		departure: '#departure',
		destination: '#destination',
		departurecode: '#departurecode',
		destinationcode: '#destinationcode',
		outbounddate: '#outbounddate',
		returndate: '#returndate',
		adultcount: '#adultcount',
		childcount: '#childcount',
		infantcount: '#infantcount',
		oneway: '#oneway',
		languagecode: '#vacancy_form input[name="languageCode"]',
		market: '#vacancy_form input[name="market"]',
		maxdate: '#vacancy_form input[name="maxDate"]',
		dateoverviewselection: '#vacancy_dateoverview input[name="dateoverviewSelection"]',
		outboundfaregroup: '#flighttables input:hidden[name="outboundFare"]',
		returnfaregroup: '#flighttables input:radio[name="returnFareId"]',
		outboundfareid: '#flighttables input:radio[name="outboundFareId"]',
		returnfareid: '#flighttables input:radio[name="returnFareId"]',
		partnerosc: '#partnerosc',
		loadpartnerroutes: 'input:hidden[name="loadPartnerRoutes"]',
		notcombinableflightmessage: 'input:hidden[name="notCombinableFlightMessage"]',
		notbookableflightmessage: 'input:hidden[name="notBookableFlightMessage"]'
	};
	var flagMapping = {
		loadvacancy: '#loadvacancy',
		loaddateoverview: '#loaddateoverview'
	};
	
	var loadingMessage = $('input[name="loadingMessage"]').length > 0 ? $('input[name="loadingMessage"]').val() : null;

	// tooltip-message for not bookable flights
	var notBookableMessage = $(paramsMapping.notbookableflightmessage).val();

	// tooltip-message for not combinable flights
	var notCombinableMessage = $(paramsMapping.notcombinableflightmessage).val();
	
	var scrollSpeed = 500;
	
	// include scripts via static loader
	$.include('/static/site/loader/nl,js:nzf,iso8601.min,wz_tooltip_conf,wz_tooltip_main,jquery|jquery.blockUI,jquery|jquery.routing,jquery|jquery.datepicker,jquery|jquery.scrollTo,jquery|jquery.trackings,jquery|jquery.tablesorter,bookingprocess|vacancy.helper-jquery.js', function() {

		// ajax request error callback 
		function errorUpdate(errorMessage) {
			// empty error message or request returns complete site, use standard message
			if (!errorMessage || errorMessage == '' || errorMessage.search('<html') != -1) errorMessage = 'communication error';
			errorMessage = '<div class="wrapper"><div class="entry">' + errorMessage + '</div></div>';
			$.vacancy.updateContainerHtml({error: errorMessage}, containerMapping, true);
			formUpdated();
		}

		// form updated
		function formUpdated() {
			updateRoutingElements();
			
			// form submit event binding
			$(containerMapping.form + ' input:submit').unbind('click').click(function() {
				formSubmit();
				return false;
			});
			
			// remove error notice on change
			$(containerMapping.form + ' input, ' + containerMapping.form + ' select').change(function() {
				$(this).removeClass('formerror');
			}); 
			
			// codes from select to input
			$(paramsMapping.departurecode).val($(paramsMapping.departure).val());
			$(paramsMapping.destinationcode).val($(paramsMapping.destination).val());
			 
			// update routing and code inputs on change
			$(paramsMapping.departure).change(function() {
				$(paramsMapping.departurecode).val($(this).val()).removeClass('formerror');
				updateRoutingElements();
			});
			$(paramsMapping.destination).change(function() {
				$(paramsMapping.destinationcode).val($(this).val()).removeClass('formerror');
			});

			// swap departure & destination selections
	 		$(containerMapping.form + ' #swaprouting').unbind('click').click(function() {
	 			$.vacancy.swapSelections(paramsMapping.departure, paramsMapping.destination);
	 		});
	 		
	 		// search for values in select fields after user input
	 		$(paramsMapping.departurecode).change(function() {
	 			$(paramsMapping.departurecode).val($(paramsMapping.departurecode).val().toUpperCase());
	 			$.vacancy.selectOptionFromSelect(paramsMapping.departure, $(this).val());
	 			$(paramsMapping.departure).removeClass('formerror');
	 			updateRoutingElements();
	 		});
	 		$(paramsMapping.destinationcode).change(function() {
	 			$(paramsMapping.destinationcode).val($(paramsMapping.destinationcode).val().toUpperCase());
	 			$.vacancy.selectOptionFromSelect(paramsMapping.destination, $(this).val());
	 			$(paramsMapping.destination).removeClass('formerror');
	 		});

	 		// use date from input for datepicker - only if it's iso date format
			var updateDatepickerForOutboundDate = true;
	 		var updateDatepickerForReturnDate = true;
 			var isDateIsoFormatRegEx = /^(\d{4})-(\d{2})-(\d{2})/;
 			if ($(paramsMapping.outbounddate).val() != '' && !isDateIsoFormatRegEx.exec($(paramsMapping.outbounddate).val())) updateDatepickerForOutboundDate = false;
 			if ($(paramsMapping.returndate).val() != '' && !isDateIsoFormatRegEx.exec($(paramsMapping.returndate).val())) updateDatepickerForReturnDate = false;

 			// outbound datepicker
			if ($(paramsMapping.outbounddate).length > 0 && updateDatepickerForOutboundDate) {
	 			var date = null;
	 			if ($(paramsMapping.outbounddate).val() != '') {
	 				date = new Date();
	 				date.setTime(Date.parse($(paramsMapping.outbounddate).val()));
	 			}
	 			$(paramsMapping.outbounddate).datepicker({
		 			minDate: new Date(),
		 			onSelect: function() {
		 				if ($(paramsMapping.returndate).length > 0) {
		 					var outboundDate = $(paramsMapping.outbounddate).datepicker('getDate');
		 					var returnDate = $(paramsMapping.returndate).datepicker('getDate');
			 				// update min-date
			 				$(paramsMapping.returndate).datepicker('change', 'minDate', outboundDate);
			 				// if outbound date > return date & return date allready chosen - update return date
			 				if (outboundDate > returnDate && $(paramsMapping.returndate).val() != '') $(paramsMapping.returndate).datepicker('setDate', outboundDate);
			 				$(paramsMapping.outbounddate).change();
		 				}
		 			}
		 		});
	 			if (date) $(paramsMapping.outbounddate).datepicker('setDate', date);
	 		}
			
			// return datepicker
	 		if ($(paramsMapping.returndate).length > 0 && updateDatepickerForReturnDate) {
	 			var date = null;
	 			if ($(paramsMapping.returndate).val() != '') {
	 				date = new Date();
	 				date.setTime(Date.parse($(paramsMapping.returndate).val()));
	 			}
	 			var minDate = new Date();
	 			if ($(paramsMapping.outbounddate).length > 0 && $(paramsMapping.outbounddate).datepicker('getDate')) {
	 				minDate = $(paramsMapping.outbounddate).datepicker('getDate');
	 			};
		 		$(paramsMapping.returndate).datepicker({
		 			minDate: minDate
		 		});
		 		if (date) $(paramsMapping.returndate).datepicker('setDate', date);
	 		}

	 		// one way checkbox
	 		$(paramsMapping.oneway).unbind('click').click(function() {
	 			if ($(this).is(':checked')) $(paramsMapping.returndate).addClass('disabled').attr('disabled', true);
	 			else $(paramsMapping.returndate).removeClass('disabled').attr('disabled', false);
	 		});
	 		
	 		// create tooltips
	 		if ($.tooltip) $(containerMapping.form + ' .tooltip').tooltip();
	 		
		}
		
		// main updated
		function mainUpdated() {

			// select information tab event binding
	 		$(containerMapping.infos + ' li').unbind('click').click(function() {
	 			var contentIndex = $(containerMapping.infos + ' li').index($(this));
 				$(containerMapping.infos + ' li').removeClass('active');
 				$(this).addClass('active');
 				$(containerMapping.infos + ' .content').hide();
	 			$(containerMapping.infos + ' .content:eq(' + contentIndex + ')').show();
	 		});
			
			// dateoverview toggle event binding
			$(containerMapping.dateoverviewtoggle + ' button').unbind('click').click(function() {
				// do automatic request after toggle-slide
				$(containerMapping.dateoverview).slideToggle(100, function() {
					// ajax request for main content
					$.vacancy.loadSiteComponent(
						['dateoverview'],
						[],
						{},
						function() {
							$.vacancy.blockContainer(containerMapping.dateoverview, loadingMessage);
						},
						function(result) {
							$.vacancy.updateContainerHtml(result, containerMapping, true);
							if ($(containerMapping.dateoverview).length > 0) $.scrollTo(containerMapping.dateoverview, scrollSpeed, {offset: -10});
						},
						function(result) {
							$.vacancy.unBlockContainer(containerMapping.dateoverview);
							dateoverviewUpdated();
						},
						errorUpdate
					);
				});
				// switch buttons for toggling view
				$(containerMapping.dateoverviewtoggle + ' button').toggle();
			});
			
			// automatic toggle of dateoverview, if no errors are reported
			if ($(flagMapping.loaddateoverview).length > 0 && $(containerMapping.error + ' .entry').length == 0) $(containerMapping.dateoverviewtoggle + ' button:first:not(.close)').click();
			
			// select fare type event binding
	 		$(containerMapping.main + ' .flightclass').unbind('click').click(function() {
	 			selectFareGroup($(this).find('input:hidden:first').val(), $.vacancy.getDirection(this));
	 		});
	 		
	 		// select pagination event binding
	 		$(containerMapping.main + ' .pagination .left, ' + containerMapping.main + ' .pagination .right').unbind('click').click(function() {
				var date = $(this).find('input:hidden:first').val();
				var params = {};
				$.vacancy.getDirection(this) == 'outbound' ? params.outboundDate = date : params.returnDate = date;
				$.vacancy.loadSiteComponent(
					['form', 'main', 'priceoverview', 'infos'],
					[],
					params,
					function() {
						$.vacancy.blockContainer(containerMapping.main, loadingMessage);
						$.vacancy.blockContainer(containerMapping.form, loadingMessage);
					},
					function(result) {
						$.vacancy.updateContainerHtml(result, containerMapping, true);
						formUpdated();
						mainUpdated();
						priceOverviewUpdated();
					},
					function(result) {
						$.vacancy.unBlockContainer($(containerMapping.main));
						$.vacancy.unBlockContainer($(containerMapping.form));
					},
					errorUpdate
				);
	 		});

	 		// trigger event for fare group selection
	 		var outboundFareGroup = $(paramsMapping.outboundfareid + ':checked').parents('td:first').find('input[name=faretype]').val();
	 		if (!outboundFareGroup) $(paramsMapping.outboundfaregroup + '[value=' + outboundFareGroup + ']').parents('.flightclass:first').click();
	 		else $(containerMapping.outboundflights + ' .flightclass:first').click();

	 		var returnFareGroup = $(paramsMapping.returnfareid + ':checked').parents('td:first').find('input[name=faretype]').val();
	 		if (!returnFareGroup) $(paramsMapping.returnfaregroup + '[value=' + returnFareGroup + ']').parents('.flightclass:first').click();
	 		else $(containerMapping.returnflights + ' .flightclass:first').click();
	 		
			// select fare event binding
			$(containerMapping.main + ' table tbody input:radio').unbind('click').click(function() {
				selectFare($(this).val(), $.vacancy.getDirection(this));
		 	});
			
			// select td in flight row event binding
			$(containerMapping.main + ' table tbody tr.flightrow td').click(function() {
				var $cell = $(this);
				var $row = $(this).parents('tr:first');
				var $table = $row.parents('table:first');
				
				if ($row.hasClass('active') || $row.hasClass('selected')) {
					if ($cell.find('input:radio:visible:checked').length > 0) return;
					if ($cell.find('input:radio:visible').length == 0) return;
				} else {
					// hide open flight details
					$table.find('.flightdetails').hide();
					$table.find('.flightdetailstoggle div').hide();
					equalizeVacancyTableHeight();
					$table.find('.active').removeClass('active');
				}
				
				// select radio from td or tr
				var radio = $cell.find('input:radio:visible:first');
				if (radio.length <= 0) radio = $row.find('td:visible input:radio:visible:not(disabled):first');
				if (radio.length > 0) {
					radio.click();
					// toggle promotion icons
					$table.find('.selected .padding').each(function() {
						$(this).css('background-image', $.vacancy.toggleBackgroundImageUrl($(this).css('background-image'),  '-selected', true));
					});
					$table.find('.selected').removeClass('selected');
					$row.addClass('selected');
					// toggle promotion icons
					$row.find('.padding').each(function() {
						$(this).css('background-image', $.vacancy.toggleBackgroundImageUrl($(this).css('background-image'),  '-selected', false));
					});
				// no radio to select - only highlight row
				} else {
					$row.addClass('active');
				}
			});

			// toggle flight details view
			$(containerMapping.main + ' table tbody .flightdetailstoggle').click(function() {
				$(this).find('div').toggle();
				$(this).parents('tr:first').next('.flightdetails').toggle();
				equalizeVacancyTableHeight();
			});

			// toggle promotion icons for selected row
			$(containerMapping.main + ' table tbody tr.selected .padding').each(function() {
				$(this).css('background-image', $.vacancy.toggleBackgroundImageUrl($(this).css('background-image'), '-selected', false));
			});
			
	 		// currency select event binding
	 		$(containerMapping.currency + ' span').unbind('click').click(function() {
	 			selectCurrency($(this).text());
	 		});
	 		
	 		// scroll to site heading
	 		$(containerMapping.submit + ' button').click(function() {
	 			$.scrollTo('h1:first', scrollSpeed, {offset: -10});
	 			return false;
	 		});
	 		
	 		// print icon event binding
	 		$('#print').unbind('click').click(function() {
	 			window.print();
	 		});
	 		
	 		// block site on submit
	 		$(containerMapping.submit + ' input:submit').click(function() {
	 			$.vacancy.blockContainer(containerMapping.main, loadingMessage);
	 		});
	 		
			addToolTips();			
	 		equalizeVacancyTableHeight();
	 		
	 		// create oldschool tooltips
	 		if (typeof Tip != 'undefined') {
		 		if ($.tooltip) $(containerMapping.main + ' .wztooltip').mouseover(function() {
		 			$this = $(this);
		 			var toolTipText = $this.find('.wztooltiptext').html();
		 			Tip(toolTipText, DURATION, 0, WIDTH, 320, CLOSEBTN, true);
		 		});
	 		}

	 		// table sorter extension to move the flightdetails with the sorted rows in the flight table
	 		$.tablesorter.addWidget({
	 			id: 'sortFlightDetails',
	 			format: function(table) {
	 				$('tr', table).each(function() {
	 					var flightdetailsId = $(this).find('td:first input[name="flightdetailsreference"]').val();
	 					if (flightdetailsId) {
	 						var flightDetailsRow = $('tr.flightdetails input[name="flightdetailsid"][value="' + flightdetailsId + '"]', table).parents('tr:first');
	 						$(this).after(flightDetailsRow);
	 					}
	 				});
	 			}
	 		});

	 		// special function for text extraction, because of ie problems
	 		var textExtraction = function(node) {  
	 			return $(node).text();
	 		} 
	 		
	 		// table sorter for flight tables
	 		$(containerMapping.main + ' .flighttable').tablesorter({
	 			widgets: ['sortFlightDetails'],
	 			textExtraction: textExtraction,
	 			cssAsc: 'sortup',
	 			cssDesc: 'sortdown',
	 			cssHeader: 'sort',
	 			sortList: [[3,0]],
	 			headers: {0: {sorter: false}}
	 		});
	 		
			// load binoli offers
			if (containerMapping.binoliads.length > 0) {
				// do automatic request after toggle-slide
				$(containerMapping.binoliads).slideToggle(100, function() {
					$(containerMapping.binoliads).css('min-height',0);
					$.vacancy.loadSiteComponent(
						['binoliads'],
						[],
						{},
						function() {
							$.vacancy.blockContainer(containerMapping.binoliads, loadingMessage);
						},
						function(result) {
							$.vacancy.updateContainerHtml(result, containerMapping, false);
							binoliUpdated();
						},
						function(result) {
							$.vacancy.unBlockContainer(containerMapping.binoliads);
						},
						null
					);
				});
			}
	 		
		}
		
		// dateoverview updated
		function dateoverviewUpdated() {
			// disable submit if no element is selected
			if (!$(paramsMapping.dateoverviewselection + ':checked').val()) $(containerMapping.dateoverview + ' input:submit').addClass('disabled');
			
			// remove min-height for smooth slidetoggle
			$(containerMapping.dateoverview).css('min-height', '0');

			// no content loaded - disable dateoverview and abort
			if ($(containerMapping.dateoverview).html() == '') {
				$(containerMapping.dateoverview).css('padding', '0');
				$(containerMapping.dateoverview).toggle();
				// unbind toggling
				$(containerMapping.dateoverviewtoggle + ' button').unbind('click').toggle().addClass('disabled');
				return false;
			}
			
			// if dateoverview was allready loaded toggle only view
			$(containerMapping.dateoverviewtoggle + ' button, ' + containerMapping.dateoverview + ' button:not(.confirm)').unbind('click').click(function() {
				$(containerMapping.dateoverview).slideToggle(500);
				$(containerMapping.dateoverviewtoggle + ' button').toggle();
			});
			
			// hover effects on day cells
			$(containerMapping.dateoverview + ' td:not(.nooffer):not(.empty)').bind('mouseenter', function() {
				var $element = $(this);
				// highlight table headers
				$element.parents('tr:first').find('th:first').addClass('highlight');
				var elementIndex = $element.parents('tr:first').find('td').index($element);
				$(containerMapping.dateoverview + ' table thead th:eq(' + (elementIndex) + ')').addClass('highlight');
			});
			$(containerMapping.dateoverview + ' td:not(.nooffer):not(.empty)').bind('mouseleave', function() {
				$(containerMapping.dateoverview + ' th.highlight').removeClass('highlight');
			});			
			
			// day select event binding
			$(containerMapping.dateoverview + ' td:not(.nooffer):not(.empty)').click(function() {
				var $element = $(this);
				$element.find('input:radio').click();
				$(containerMapping.dateoverview + ' td.selected, ' + containerMapping.dateoverview + ' th.selected').removeClass('selected');
				// highlight element + table headers
				$element.addClass('selected');
				$element.parents('tr:first').find('th:first').addClass('selected');
				var elementIndex = $element.parents('tr:first').find('td').index($element);
				$(containerMapping.dateoverview + ' table thead th:eq(' + (elementIndex) + ')').addClass('selected');
				// enable submit button
				$(containerMapping.dateoverview + ' input:submit').removeClass('disabled');
			});
			
			// submit dateoverview event
			$(containerMapping.dateoverview + ' input:submit').unbind('click').click(function() {
				var dateOverviewSelection = $(paramsMapping.dateoverviewselection + ':checked').val();
				if (!dateOverviewSelection) return false;
				$.vacancy.loadSiteComponent(
					['form', 'main', 'priceoverview', 'infos'],
					[],
					{
						dateOverviewSelection: dateOverviewSelection
					},
					function() {
						$.vacancy.blockContainer(containerMapping.form, loadingMessage);
						$.vacancy.blockContainer(containerMapping.main, loadingMessage);
					},
					function(result) {
						$.vacancy.updateContainerHtml(result, containerMapping, true);
						formUpdated();
						mainUpdated();
						priceOverviewUpdated();
						if ($(containerMapping.error).length > 0) $.scrollTo(containerMapping.error, scrollSpeed, {offset: -10});
					},
					function(result) {
						$.vacancy.unBlockContainer(containerMapping.form);
						$.vacancy.unBlockContainer(containerMapping.main);
					},
					errorUpdate
				);
				return false;
			});
			
			// paginate dateoverview event
			$(containerMapping.dateoverview + ' .pagination div.left, ' + containerMapping.dateoverview + ' .pagination div.right').unbind('click').click(function() {
				var container = $(this);
				$.vacancy.loadSiteComponent(
					['dateoverview'],
					[],
					{
						outboundDate: container.find('input[name="outboundDate"]').val() ? container.find('input[name="outboundDate"]').val() : '',
						returnDate: container.find('input[name="returnDate"]').val() ? container.find('input[name="returnDate"]').val() : ''
					},
					function() {
						$.vacancy.blockContainer(containerMapping.dateoverview, loadingMessage);
					},
					function(result) {
						$.vacancy.updateContainerHtml(result, containerMapping, true);
					},
					function(result) {
						dateoverviewUpdated();
						$.vacancy.unBlockContainer(containerMapping.dateoverview);
					},
					errorUpdate
				);
				return false;
			});
		}
		
		// priceoverview updated
		function priceOverviewUpdated() {
			$(paramsMapping.partnerosc).unbind('change').change(function() {
				$.vacancy.loadSiteComponent(
					['priceoverview'],
					['setTicketServiceCharge'],
					{
						value: $(this).val() ? $(this).val() : 0
					},
					function() {
						$.vacancy.blockContainer(containerMapping.priceoverview, loadingMessage);
					},
					function(result) {
						$.vacancy.updateContainerHtml(result, containerMapping, true);
						priceOverviewUpdated();
					},
					function(result) {
						$.vacancy.unBlockContainer($(containerMapping.priceoverview));
					},
					errorUpdate
				);
			});
		}
		
		// binoli updated
		function binoliUpdated() {
			$(containerMapping.binoliads + ' .toggle button').click(function() {
				$(containerMapping.binoliads + ' .toggle button').toggle();
				$(containerMapping.binoliads + ' .offers, ' + containerMapping.binoliads + ' .offersstandard').slideToggle('500');
			});
		}
		
		// submit form
		function formSubmit() {
			var outboundDate = $(paramsMapping.outbounddate).datepicker('getDate');
			var outboundDateIso = '';
			if (outboundDate) outboundDateIso = outboundDate.getFullYear() + '-' + $.vacancy.addLeadingZero(outboundDate.getMonth() + 1) + '-' + $.vacancy.addLeadingZero(outboundDate.getDate());
			var returnDate = $(paramsMapping.returndate).datepicker('getDate');
			var returnDateIso = '';
			if (returnDate) returnDateIso = returnDate.getFullYear() + '-' + $.vacancy.addLeadingZero(returnDate.getMonth() + 1) + '-' + $.vacancy.addLeadingZero(returnDate.getDate());
			
			var params = {};
			if ($(paramsMapping.departure)) $.extend(params, {departure: $(paramsMapping.departure).val()});
			if ($(paramsMapping.destination)) $.extend(params, {destination: $(paramsMapping.destination).val()});
			$.extend(params, {outboundDate: outboundDateIso});
			$.extend(params, {returnDate: returnDateIso});
			if ($(paramsMapping.adultcount)) $.extend(params, {adultCount: $(paramsMapping.adultcount).val()});
			if ($(paramsMapping.childcount)) $.extend(params, {childCount: $(paramsMapping.childcount).val()});
			if ($(paramsMapping.infantcount)) $.extend(params, {infantCount: $(paramsMapping.infantcount).val()});
			if ($(paramsMapping.oneway).attr('checked')) $.extend(params, {oneway: $(paramsMapping.oneway).val()});
			else $.extend(params, {oneway: ''});
			
			$.vacancy.loadSiteComponent(
				['form', 'main', 'priceoverview', 'infos'],
				[],
				params,
				function() {
					$.vacancy.blockContainer(containerMapping.main, loadingMessage);
					// if automatic submit - remove flag and keep error messages
					if ($(flagMapping.loadvacancy).length > 0) $(flagMapping.loadvacancy).remove();
					else $(containerMapping.error).empty();
				},
				function(result) {
					$(containerMapping.main).empty();
					$.vacancy.updateContainerHtml(result, containerMapping, true);
					formUpdated();
					mainUpdated();
					priceOverviewUpdated();
				},
				function(result) {
					$.vacancy.unBlockContainer(containerMapping.main);
					$.scrollTo(containerMapping.error, scrollSpeed, {offset: -10});
				},
				function(result) {
					// temporary error log
					// $.post('/booking/flight/vacancy_log.php', $.extend(params, {requestResult: result}));
					$(containerMapping.main).empty();
					$(containerMapping.binoliads).empty();
					errorUpdate(result);
				}
			);
			
			// criteo tracking extension for async route loading
			var itemId = $(paramsMapping.departurecode).val() + $(paramsMapping.destinationcode).val();
			var criteoTrackingParam = $('.tracking .trackingparams [name="p1"]');
			if (criteoTrackingParam.length > 0) {
				var oldValue = criteoTrackingParam.val();
				if (oldValue) criteoTrackingParam.val(oldValue.substr(0, oldValue.length - 6) + itemId);
			}

			// load trackings
			$.loadTrackings();			
		}
		
		// select fare group for direction
		function selectFareGroup(fareGroup, direction) {
			var container = direction == 'outbound' ? $(containerMapping.outboundflights) : $(containerMapping.returnflights);
			// set selected fare active and show prices
			container.find('.flightclass.selected').removeClass('selected');
			container.find('.flightclass.' + fareGroup).addClass('selected');
			container.find('.faretoggle').hide();
			container.find('.' + fareGroup).show();
		}

		// select fare for direction
		function selectFare(fareId, direction) {
			// check if clicked element was allready selected
			var dataKey = 'selectedFare_' + direction;
			if ($('body').data(dataKey) == fareId) return false;
			$('body').data(dataKey , fareId);

			// ajax request for getting price updates
			$.vacancy.loadSiteComponent(
				['priceoverview'],
				['getFareList'],
				{
					fareindex: fareId,
					direction: direction
				},
				function() {
					$.vacancy.blockContainer(containerMapping.priceoverview, loadingMessage);
				},
				function(result) {
					$.vacancy.updateContainerHtml(result, containerMapping, true);
					if (result.error) $.scrollTo(containerMapping.error, scrollSpeed, {offset: -10});
					if (result.data && result.data.getFareList['outbound']) {
						$.vacancy.updateFares($(containerMapping.outboundflights), result.data.getFareList['outbound']);
						// toggle promotion icons
						$(containerMapping.outboundflights).find('.selected .padding').each(function() {
							$(this).css('background-image', $.vacancy.toggleBackgroundImageUrl($(this).css('background-image'),  '-selected', false));
						});
					}
					if (result.data && result.data.getFareList['return']) {
						$.vacancy.updateFares($(containerMapping.returnflights), result.data.getFareList['return']);
						// toggle promotion icons
						$(containerMapping.returnflights).find('.selected .padding').each(function() {
							$(this).css('background-image', $.vacancy.toggleBackgroundImageUrl($(this).css('background-image'),  '-selected', false));
						});
					}
					addToolTips();
					priceOverviewUpdated();
				},
				function(result) {
					$.vacancy.unBlockContainer($(containerMapping.priceoverview));
				},
				errorUpdate
			);
		}

		// select currency
		function selectCurrency(currency) {
			$.vacancy.loadSiteComponent(
				['main', 'priceoverview', 'infos'],
				[],
				{
					currency: currency
				},
				function() {
					$.vacancy.blockContainer(containerMapping.main, loadingMessage);
				},
				function(result) {
					$(containerMapping.main).empty();
					$.vacancy.updateContainerHtml(result, containerMapping, true);
					mainUpdated();
					priceOverviewUpdated();
				},
				function(result) {
					$.vacancy.unBlockContainer(containerMapping.main);
				},
				function(result) {
					$(containerMapping.main).empty();
					$(containerMapping.binoliads).empty();
					errorUpdate(result);
				}
			);
		}
		
		// equalize heights of the vacancy container
		function equalizeVacancyTableHeight() {
			$.vacancy.equalizeContainerHeights([$(containerMapping.outboundflights + ' .tablebackground'), $(containerMapping.returnflights + ' .tablebackground')]);
		}
		
		// update routing elements
		function updateRoutingElements() {
			var loadPartnerRoutes = $(paramsMapping.loadpartnerroutes).val() == '1' ? true : false;
			$(paramsMapping.destination).routing($(paramsMapping.departure).val(), loadPartnerRoutes);
		}

		// add tooltip to flight tables
		function addToolTips() {
			// reset tooltips
			$.vacancy.addToolTips($(containerMapping.outboundflights + ', ' + containerMapping.returnflights), 'td', '');
			//add tooltips
			$.vacancy.addToolTips($(containerMapping.outboundflights + ', ' + containerMapping.returnflights), 'td:has(span.notbookable:visible)', notBookableMessage);
			$.vacancy.addToolTips($(containerMapping.outboundflights + ', ' + containerMapping.returnflights), 'td:has(span.lowest:visible)', notCombinableMessage);
		}
		
		// inital load
		function init() {
			// customize datepicker
	 		var datepickerDefaults = {
	 			prevText: '&nbsp;',
	 			nextText: '&nbsp;',
	 			updateAfterChanges: false,
	 			hideIfNoPrevNext: true,
	 			changeFirstDay: false
	 		};
			// set custom date format for gb
			if ($(paramsMapping.market).val() == 'gb' && $(paramsMapping.languagecode).val() == 'en') $.extend(datepickerDefaults, {dateFormat: 'dd/mm/yy'});
	 		// use custom maximal date
	 		if ($(paramsMapping.maxdate).val()) {
	 			var maxDate = new Date();
	 			maxDate.setTime(Date.parse($(paramsMapping.maxdate).val()));
	 			$.extend(datepickerDefaults, {maxDate: maxDate});
	 		}
			$.datepicker.setDefaults(datepickerDefaults);
	 		
	 		// form was initially loaded - apply bindings etc.
			formUpdated();

			// load vacancy automatically
			if ($(flagMapping.loadvacancy).length > 0) $(containerMapping.form + ' input:submit').click();

		}
		
		// load datepicker localization
		var datepickerLanguage = $(paramsMapping.languagecode).val() ? $(paramsMapping.languagecode).val() : 'en';
		if (datepickerLanguage != 'en')	{
			$.datepicker.regional = {};
			$.ajax({
				url: '/site/javascript/jquery/ui/i18n/ui.datepicker-' + datepickerLanguage + '.js',
				dataType: 'script',
				complete: init 
			});
		// default language
		} else {
			init();
		}

	});
});
