/**
 * Reservation clientside javascript
 * 
 * @type
 */
Reservation = {
	btnreserve: '#reserv',
	btnback: '#back',
	moduleId: '',
	nextDayText: " (" + E.Lang.translate('locals.reservationatfollowingday') + ")",
	url: 'reservations/',
	apiUrl: '',

	/**
	 * initialize
	 */
	initialize: function() {
		jQuery(document).ready(Reservation.domReady);
	},

	/**
	 * get selectboxes and make change-events. For Selectbox persons on first
	 * page
	 */
	domReady: function() {

		Reservation.apiUrl = '&api_id=' + Reservation.Config.get('api_id') + '&api_class=' + Reservation.Config.get('api_class') + '&L=' + Reservation.Config.get('L');
		Reservation.PageParse.selectBoxPersons();

		var persons = jQuery('#persons');
		persons.bind('change', Reservation.updateDates);
		Reservation.Formvalidation.init();

		var reservationDates = Reservation.Config.get('reservationDates');
		var selectedData = {
			checkpersons: jQuery('#persons').attr('value')
		};

		Reservation.Config.set('selectedData', selectedData);

		Reservation.Calendar.fixAvailableData(reservationDates, selectedData, false, true);
		Reservation.Calendar.initialize('#pageCalendar #datepicker');
	},

	/**
	 * when selectboxes changing on first page, update calendar (json/Ajax).
	 * 
	 * @param {}
	 *            event
	 * @return {Boolean}
	 */
	updateDates: function(event) {
		// get selected values
		var usedPersons = jQuery('#persons').attr('value');
		// check values
		if (!Reservation.Utils.isNumeric(usedPersons) || usedPersons <= 0) return false;

		// prepare json call
		var data = {
			checkpersons: usedPersons
		};

		Reservation.Config.set('selectedData', data);

		data = null;
		
		// send data
		Reservation.Visibility.showLoadingHideDatepicker();

		var urlAction = Reservation.url + 'available?format=json' + Reservation.apiUrl;

		jQuery.post(urlAction, data, Reservation.onUpdateDatesReady, 'json');
	},

	/**
	 * wait for server response for updateDates (json response) and then set
	 * calendar days visibility
	 * 
	 * @param {}
	 *            data response data from server
	 */
	onUpdateDatesReady: function(data) {
		// set calendar days visibility from new data
		if (!data) {
			Reservation.Utils.buttonsEnableDisable(true);
			Reservation.Visibility.showDatepickerHideLoading();
			return;
		}

		var selectedData = Reservation.Config.get('selectedData');

		data = Reservation.Calendar.fixAvailableData(data, selectedData, false, true);

		jQuery.datepicker._refreshDatepicker(Reservation.Calendar.instance.get(0));
		Reservation.Visibility.showDatepickerHideLoading();
	},

	/**
	 * time clicked
	 */
	onTimeClick: function() {

		var clickElement = jQuery(this);
		var choosenTime = clickElement.attr('rel');
		var reservationSubmitData = Reservation.Config.get('reservationData');

		reservationSubmitData.time = choosenTime;

		Reservation.Config.set('reservationData', reservationSubmitData); // update
		// choosen time in main userSettings
		Reservation.PageParse.information('pageReservationFormular');
		Reservation.PageParse.information('pagedatafound');
		Reservation.PageParse.information('pageReservationEnd');

		Reservation.Utils.resetForm();
		Reservation.Visibility.showFormDefault();
	},

	/**
	 * validate user-form-inputs on client first, before posting to server
	 * (json/Ajax)
	 * 
	 * @return {Boolean}
	 */
	send: function() {
		if (!Reservation.Formvalidation.valid()) return false;

		// greyout buttons
		Reservation.Utils.buttonsEnableDisable(true);
		
		var reservationData = Reservation.Config.get('reservationData');

		// set user form inputs array for server
		var forminput = {
			'date': reservationData.reservationdate,
			'persons': reservationData.reservationpersons,
			'time': reservationData.time,
			'gender': Reservation.Utils.setGender(jQuery('#salutation').val(), false),
			'lastname': jQuery('#lastname').attr('value'),
			'firstname': jQuery('#firstname').attr('value'),
			'email': jQuery('#email').attr('value'),
			'telephone': jQuery('#phonenumber').attr('value'),
			'fax': jQuery('#faxnumber').attr('value'),
			'mobil': jQuery('#mobilenumber').attr('value'),
			'description': jQuery('#comment').attr('value')
		};
		
		// add settings to post
		var settings = Reservation.Config.get('reservationSettings');
		for(var i in settings) {
			var value = jQuery('#Setting__Setting'+settings[i].id).attr('value');
			forminput['Setting__Setting'+settings[i].id] = value;
		}
		
		// sets the form inputs to an object
		// prepare json post
		// gets the form inputs
		// var postData = Reservation.Submit.get(null);
		Reservation.Config.set('formularInputs', forminput);

		Reservation.Visibility.hideFormularAndShowLoading();
		// post data to server
		jQuery.post(Reservation.url + 'insert?format=json' + Reservation.apiUrl, forminput, Reservation.onSendReady, 'json');
	},

	/**
	 * wait for server response for send (json response) if form inputs are all
	 * ok, then notify user and go to first page (calendar), make buttons
	 * enable, reset form. if any form input fails, notify user with a message
	 * 
	 * @param {}
	 *            responseData
	 */
	onSendReady: function(responseData) {
		if ((responseData['success'] && responseData['result']['added'])) {
			var reservationData = Reservation.Config.get('reservationData');
			var readableDate = Reservation.DateTime.readableDate(reservationData['reservationdate']);
			var readableTime = reservationData['time'];
			var personNumber = reservationData['reservationpersons'];

			var message = E.Lang.translate('locals.reservationsuccesstext', personNumber, readableDate, readableTime);
			jQuery('#pageReservationEnd .reservation_content').html(message);
			Reservation.Visibility.showFormFinish();
			Reservation.Utils.reservationResetForm(document.getElementById('reservationFormular'));
		} else {
			var message = responseData['messages'][0].text;
			Reservation.Utils.buttonsEnableDisable(false);
		}
		Reservation.Visibility.showFormHideLoading();
	}
};


/**
 * jQuery Validation settings for input fields
 * 
 * @type
 */
Reservation.Formvalidation = {
	// initiate validator on load
	formId: '#reservationFormular',

	/**
	 * extra validation for jQuery validator
	 * 
	 * @return {boolean}
	 */
	valid: function() {
		jQuery.validator.addMethod("lettersonly", function(value, element) {
			return this.optional(element) || /^[a-zß-üA-ZÀ-Ü\s\-]+$/i.test(value);
		}, E.Lang.translate('locals.reservationlettersonly'));

		jQuery.validator.addMethod("phone", function(phone_number, element) {
			phone_number = phone_number.replace(/\s+/g, "");
			return this.optional(element) || phone_number.match(/^(\+?[0-9]{1,3}).+[\d \s]{5,30}$/);
		}, E.Lang.translate('locals.reservationpleaseenter', E.Lang.translate('locals.telephone')));
		
		return jQuery(this.formId).valid();
	},

	/**
	 * initialize JQuery validation
	 */
	init: function() {

		var rules = {
			lastname: {
				title: E.Lang.translate('locals.lastname'),
				required: true,
				lettersonly: true,
				minlength: 3,
				maxlength: 40
			},
			firstname: {
				title: E.Lang.translate('locals.firstname'),
				required: false,
				lettersonly: true,
				minlength: 3,
				maxlength: 40
			},
			email: {
				title: E.Lang.translate('locals.email'),
				required: true,
				email: true,
				maxlength: 50
			},
			phonenumber: {
				title: E.Lang.translate('locals.telephone'),
				required: true,
				//number: true,
				phone: true,
				minlength: 4,
				maxlength: 40
			},
			faxnumber: {
				title: E.Lang.translate('locals.fax'),
				required: false,
				//number: true,
				phone: true,
				minlength: 4,
				maxlength: 40
			},
			mobilenumber: {
				title: E.Lang.translate('locals.mobile'),
				required: false,
				//number: true,
				phone: true,
				minlength: 4,
				maxlength: 40
			},
			comment: {
				title: E.Lang.translate('locals.comment'),
				required: false
			}
		};

		// add settings to validation rules
		var settings = Reservation.Config.get('reservationSettings');
		for(var i in settings) {
			rules['Setting__Setting'+settings[i].id] = {
				title: settings[i].title,
				required: settings[i].required
			}
		}

		var messages = {}
		for(var field in rules) {
			messages[field] = E.Lang.translate('locals.reservationpleaseenter', rules[field].title);
		}

		// validate contact form on keyup and submit
		jQuery(this.formId).validate({
			// set the rules for the field names
			rules: rules,
			// set messages to appear inline
			messages: messages,
			// error message redirect to the next element after
			// input-field
			errorPlacement: function(error, element) {
				error.appendTo(element.next());
			}
		});
	}
};

/**
 * get and set all choosen data from user eg. person, date, time, form inputs
 * can return all data or direct one data if key is given
 * 
 * @type
 */
Reservation.Submit = {
	resData: {},

	/**
	 * gets the key from data
	 * 
	 * @param {}
	 *            key
	 * @return {}
	 */
	get: function(key) {
		if (key && key in this.resData) {
			return this.resData[key];
		} else {
			return this.resData;
		}
	},

	/**
	 * sets the key and value to data
	 * 
	 * @param {}
	 *            key
	 * @param {}
	 *            value
	 * @return {Boolean}
	 */
	set: function(key, value) {
		if (!key) return false;
		this.resData[key] = value;
	}
};

/**
 * some utils eg. checks, converts
 * 
 * @type
 */
Reservation.Utils = {

	setGender: function(salutation, back) {
		if (back) {
			if (salutation == 1) return 'MR';
			return 'MRS';
		}
		if (salutation == 'MRS') return 0;
		return 1;
	},

	resetForm: function() {
		jQuery('#salutation').val('MR');
		jQuery('#firstname').val('');
		jQuery('#lastname').val('');
		jQuery('#email').val('');
		jQuery('#phonenumber').val('');
		jQuery('#faxnumber').val('');
		jQuery('#mobilenumber').val('');
		jQuery('#comment').val('');
	},

	/**
	 * only numbers
	 * 
	 * @param {}
	 *            value
	 * @return {Boolean}
	 */
	isNumeric: function isNumeric(value) {
		if (value != null && !value.toString().match(/^[-]?\d*\.?\d*$/)) return false;
		return true;
	},

	/**
	 * adds a Zero bevore digit
	 * 
	 * @param {}
	 *            number
	 * @return {Boolean}
	 */
	addZero: function(number) {
		if ((number.length > 1 || number.length < 1)) return number;
		if (!this.isNumeric(number)) return false;
		return '0' + number;
	},

	/**
	 * clears the form inputs
	 * 
	 * @param {}
	 *            form
	 */
	reservationResetForm: function(formID) {
		for ( var i = 0; i < formID.elements.length; i++) {
			if (!(formID.elements[i].type && formID.elements[i].type == "submit" || formID.elements[i].type == "button" || formID.elements[i].type == "reset")) {
				formID.elements[i].value = "";
			}
		}
	},

	/**
	 * enable or disables the back and reservation-button on form page
	 * 
	 * @param {}
	 *            status
	 */
	buttonsEnableDisable: function(status) {
		if (status) {
			status = true;
			jQuery(Reservation.btnreserve).attr("disabled", status);
			jQuery(Reservation.btnback).attr("disabled", status);
		} else {
			status = false;
			jQuery(Reservation.btnreserve).attr("disabled", status);
			jQuery(Reservation.btnback).attr("disabled", status);
		}
	},

	/**
	 * convert data to string (for json send to server)
	 * 
	 * @param {}
	 *            data
	 * @return {}
	 */
	prefixData: function(data) {
		var dataString = JSON.stringify(data);
		var data = {};
		data[Reservation.moduleId] = dataString;
		return data;
	},

	nextDay: function(time) {
		var splitTime = time.split(":");
		var hour = splitTime[0];

		if (hour > 23) {
			return true;
		}
		return false;
	}

};

/**
 * gets or sets the whole config
 * 
 * @type
 */
Reservation.Config = {
	data: {},

	/**
	 * gets the config for key else whole config data returned
	 * 
	 * @param {}
	 *            key
	 * @return {}
	 */
	get: function(key) {
		if (key && key in Reservation.Config.data) {
			return Reservation.Config.data[key];
		} else {
			return Reservation.Config.data;
		}
	},

	/**
	 * set key and value to config data
	 * 
	 * @param {}
	 *            key
	 * @param {}
	 *            value
	 */
	set: function(key, value) {
		Reservation.Config.data[key] = value;
	},

	/**
	 * set json to Config.data
	 * 
	 * @param {}
	 *            str
	 */
	setJson: function(str) {
		try {
			eval('var j = ' + str);
			if (j) {
				Reservation.Config.data = j;
			}
		} catch (e) {
			// console.log('Exception', e);
		}
	}
};

/**
 * calendar itself and options
 * 
 * @type
 */
Reservation.Calendar = {
	days: {},
	instance: null,

	/**
	 * 
	 */
	fixAvailableData: function(availableData, selectedData, jsonDecode, setDayDefinition) {
		// if json string -> decode

		if (jsonDecode == true) {
			availableData = eval("(" + availableData + ")");
		}
		var retArr = new Array();
		var selectedPersons = parseInt(selectedData.checkpersons);

		for (var date in availableData.Days) {
			var available = false;

			if (availableData.Days[date] > 0 && availableData.Days[date] >= selectedPersons) {
				available = true;
			}

			retArr[date] = new Object();
			retArr[date] = available;
			// set Calendardays
			if (setDayDefinition == true) {
				Reservation.Calendar.setDayDefinition(date, available);
			}
		}
		return retArr;
	},

	/**
	 * enables or disables dates in calendar
	 * 
	 * @param {}
	 *            data
	 */
	setDayDefinitions: function(data) {
		for (i in data) {
			Reservation.Calendar.setDayDefinition(i, data[i]);
		}
	},

	/**
	 * build a structured date array
	 * 
	 * @param {}
	 *            dayString
	 * @param {}
	 *            definition
	 */
	setDayDefinition: function(dayString, definition) {
		var dateParts = dayString.split('-');
		if (dateParts.length == 3) {
			var year = dateParts[0];
			var month = parseFloat(dateParts[1]);
			var day = parseFloat(dateParts[2]);
			if (!(year in Reservation.Calendar.days)) {
				Reservation.Calendar.days[year] = {};
			}
			if (!(month in Reservation.Calendar.days[year])) {
				Reservation.Calendar.days[year][month] = {};
			}
			Reservation.Calendar.days[year][month][day] = definition;
		}
	},

	/**
	 * initialize the calendar and sets the options for calendar
	 * 
	 * @param {}
	 *            selector
	 * @param {}
	 *            additionalOptions
	 * @return {Boolean}
	 */
	initialize: function(selector, additionalOptions) {
		if (!selector)
			return false;

		var langDef = jQuery.datepicker.regional[E.Lang.getKey()];
		jQuery.datepicker.setDefaults(langDef);

		var maxDate = '';
		try{maxDate = '+' + (reservationDates.total_single.Days-1) + 'd';} catch(e) {}

		// calendar options
		var options = {
			inline: true,
			dateFormat: 'yy-mm-dd',
			minDate: '0',
			maxDate: maxDate,
			onSelect: Reservation.Calendar.onSelect, // get selected date and send with json to server
			beforeShowDay: Reservation.Calendar.beforeShowDay // enable or disable dates in calendar
		};

		// overwrite base options with the incoming additional options
		for (i in additionalOptions) {
			options[i] = additionalOptions[i];
		}

		Reservation.Calendar.instance = jQuery(selector).datepicker(options);

		// show the page 1 with the calendar
		Reservation.Visibility.showCalendar();
	},

	/**
	 * grey out calender dates
	 * 
	 * @param {}
	 *            date
	 * @return {}
	 */
	beforeShowDay: function(date) {
		var day = date.getDate();
		var month = date.getMonth() + 1; // Note: The value returned by getMonth() is a number between 0 and 11. January is 0, February is 1 and so on.
		var year = date.getFullYear();
		
		if (!Reservation.Calendar.days[year]
				|| !Reservation.Calendar.days[year][month]
				|| !Reservation.Calendar.days[year][month][day]) {
			return [ false, 'disabled' ];
		}
		return [ true, 'enabled' ];
	},

	/**
	 * on calendar date selection, checks data first on client-maschine then
	 * post data to server (Ajax)
	 * 
	 * @param {}
	 *            dateText
	 * @param {}
	 *            inst
	 * @return {Boolean}
	 */
	onSelect: function(dateText, inst) {
		var usedPersons = jQuery('#persons').attr('value');

		if (!Reservation.Utils.isNumeric(usedPersons) || usedPersons <= 0) return false;
		
		var currentDateTime = Reservation.Calendar.getCurrentDateTime();
		
		var data = {
			reservationdate: dateText,
			reservationpersons: usedPersons,
			dateTimeNow: currentDateTime
		};

		Reservation.Config.set('reservationData', data);

		data = null;

		Reservation.Visibility.showLoadingHideDatepicker();

		var urlParams = Reservation.url + 'available?format=json' + Reservation.apiUrl + '&date=' + dateText + '&persons=' + usedPersons;

		jQuery.post(urlParams, data, Reservation.Calendar.onSelectReady, 'json');

	},

	/**
	 * wait for server response for onSelect date selected (json response) then
	 * show next page available times and present selected persons and date of
	 * reservation
	 * 
	 * @param {}
	 *            data
	 */
	onSelectReady: function(data) {
		if (!data) {
			Reservation.Visibility.showDatepickerHideLoading();
			return;
		}

		// set user reservation
		var reservation = Reservation.Config.get('reservationData');

		for (date in data['Date']) {
			Reservation.DateTime.parsedDates[date] = data['Date'][date];
		}
		Reservation.PageParse.information('pageReservationTimes');
		Reservation.PageParse.times(data);

		// show next page (available reservation times)
		Reservation.Visibility.showDatepickerHideLoading();
		Reservation.Visibility.showReservationTimes();

		// make a click event for a reservation time
		jQuery('#pageReservationTimes .reservation_content .time_enabled')
				.bind('click', Reservation.onTimeClick);
	},

	/**
	 * gets the current Date and Time
	 * 
	 * @return {}
	 */
	getCurrentDateTime: function() {
		var dateTimeNow = new Date();
		var formatedDate = dateTimeNow.getFullYear() + '-'
				+ (dateTimeNow.getMonth() + 1) + '-' + dateTimeNow.getDate();
		var hours = dateTimeNow.getHours();
		var minutes = dateTimeNow.getMinutes();
		var seconds = dateTimeNow.getSeconds();

		var retData = new Array();
		retData['timenow'] = new Object();
		retData['timenow']['hours'] = new Object();
		retData['timenow']['minutes'] = new Object();
		retData['timenow']['seconds'] = new Object();

		retData['datenow'] = formatedDate;
		retData['timenow']['hours'] = hours;
		retData['timenow']['minutes'] = minutes;
		retData['timenow']['seconds'] = seconds;

		return retData;
	}
};

/**
 * Page parse utilities
 * 
 * @type
 */
Reservation.PageParse = {
	/**
	 * parse the reservation information overview
	 * 
	 * @param {string}
	 *            divPageReservation main page div id without #
	 */
	information: function(divPageReservation) {
		var reservationData = Reservation.Config.get('reservationData');
		var readableDate = Reservation.DateTime
				.readableDate(reservationData['reservationdate']);

		jQuery('#' + divPageReservation + ' .reservationInfoPersons').html(
				reservationData['reservationpersons']);
		jQuery('#' + divPageReservation + ' .reservationInfoDate').html(
				readableDate);

		if (divPageReservation != 'pageReservationTimes') {
			var readableTime = reservationData['time'];

			if (Reservation.Utils.nextDay(reservationData['time'])) {
				jQuery('#' + divPageReservation + ' .reservationInfoTime')
						.html(readableTime + Reservation.nextDayText);
			} else {
				jQuery('#' + divPageReservation + ' .reservationInfoTime')
						.html(readableTime);
			}
		}
	},

	/**
	 * parse the available times
	 * 
	 * @param {}
	 *            data
	 */
	times: function(data) {
		var rendered = '';
		for (time in data['Times']) {
			// format time (if hour 25 then make 1 ...)
			var viewTime = Reservation.DateTime.readableTime(time);

			if (data['Times'][time] && data['Times'][time]['available'] == true) {
				var availableClass = 'time_enabled';
				// if time greater 23 set text next day and put a new css class
				if (Reservation.Utils.nextDay(viewTime)) {
					var oviewTime = viewTime;
					viewTime = viewTime + Reservation.nextDayText;
					rendered += '<div class="time ' + availableClass
							+ ' timenextday" rel="' + oviewTime + '" title="'
							+ viewTime + '">' + viewTime + '</div>';
				} else {
					rendered += '<div class="time ' + availableClass
							+ '" rel="' + viewTime + '" title="' + viewTime
							+ '">' + viewTime + '</div>';
				}
			} else {
				var availableClass = 'time_disabled';
				// if time greater 23 set text next day and put a new css class
				if (Reservation.Utils.nextDay(viewTime)) {
					var oviewTime = viewTime;
					viewTime = viewTime + Reservation.nextDayText;
					rendered += '<div class="time ' + availableClass
							+ ' timenextday" rel="' + oviewTime + '" title="'
							+ viewTime + '">' + viewTime + '</div>';
				} else {
					rendered += '<div class="time ' + availableClass
							+ '" rel="' + viewTime + '" title="' + viewTime
							+ '">' + viewTime + '</div>';
				}
			}
		}
		// parse code
		jQuery('#pageReservationTimes .availableTimes').html(rendered);
	},


	/**
	 * set numbers from gastronovi config for selectbox persons
	 */
	selectBoxPersons: function() {
		var renderOut = '';

		var listPersons = Reservation.Config.get('listPersons');
		for ( var i = 1; i <= listPersons; i++) {
			renderOut += '<option value="' + i + '">' + i + '</option>';
		}
		jQuery('#persons').html(renderOut);
	},

	/**
	 * 
	 */
	error: function(message) {
		jQuery('#pageError').html(message);
	}
};

/**
 * some date and time functions
 * 
 * @type
 */
Reservation.DateTime = {
	parsedDates: {},
	/**
	 * get date text eg. 01 January 2009
	 * 
	 * @param {}
	 *            date
	 * @return {Boolean}
	 */
	readableDate: function(date) {
		if (!date)
			return false;

		// try to get date from parsed dates
		if (Reservation.DateTime.parsedDates[date])
			return Reservation.DateTime.parsedDates[date];

		return date;
	},

	/**
	 * checks a time format if time hour greater then 23 then make readable hour
	 * eg. 24 = 0, 25 = 1, 26 = 2
	 * 
	 * @param {}
	 *            time
	 * @return {Boolean}
	 */
	readableTime: function(time) {
		if (!time)
			return false;

		// create a new javascript Date object based on the timestamp
		// multiplied by 1000 so that the argument is in milliseconds, not
		// seconds
		var date = new Date(time * 1000);
		
		/*var localTime = date.getTime();
		var localOffset = date.getTimezoneOffset();	// method returns by default minutes
		
		var utc = localTime + (localOffset*60000);
		
		console.log('TIME', localTime, localOffset, localOffset*60000, utc)
		*/
		
		// hours part from the timestamp
		var hours = date.getHours();
		
		//var hours = date.getUTCHours();
		
		// minutes part from the timestamp
		var minutes = date.getMinutes();

		if (hours < 10) {
			hours = "0" + hours;
		}
		if (minutes < 10) {
			minutes = "0" + minutes;
		}

		// TODO: localize!
		// will display time in 10:30 format
		var formattedTime = hours + ':' + minutes;

		return formattedTime;
	}
};

/**
 * Show pages without reloading the complete content
 * 
 * @type
 */
Reservation.Visibility = {
	/**
	 * hides all pages
	 */
	hideAllPages: function() {
		jQuery('#pageCalendar').css( {
			'display': 'none'
		});
		jQuery('#pageReservationTimes').css( {
			'display': 'none'
		});
		jQuery('#pageReservationFormular').css( {
			'display': 'none'
		});
		jQuery('#pageReservationEnd').css( {
			'display': 'none'
		});
		jQuery('#pageError').css( {
			'display': 'none'
		});
		jQuery('#pagedatafound').css( {
			'display': 'none'
		});
	},

	/**
	 * shows the calendar page (first page)
	 */
	showCalendar: function() {
		Reservation.Visibility.hideAllPages();
		jQuery('#pageCalendar').css( {
			'display': 'block'
		});
		jQuery('#datepicker').css( {
			'display': 'block'
		});
		Reservation.Utils.buttonsEnableDisable(false);
	},

	/**
	 * shows the reservation times page (second page)
	 */
	showReservationTimes: function() {
		Reservation.Visibility.hideAllPages();
		jQuery('#pageReservationTimes').css( {
			'display': 'block'
		});
	},

	/**
	 * shows the form input
	 */
	showFormDefault: function() {
		Reservation.Visibility.hideAllPages();
		jQuery('#pageReservationFormular').css( {
			'display': 'block'
		});
	},

	/**
	 * shows the succes info page
	 */
	showFormFinish: function() {
		Reservation.Visibility.hideAllPages();
		jQuery('#pageReservationEnd').css( {
			'display': 'block'
		});
	},

	/**
	 * shows the Calendar and hide the loading image
	 */
	showDatepickerHideLoading: function() {
		this.hideLoadingOnly();
		jQuery('.reservation_content').css( {
			'display': 'block'
		});
	},

	/**
	 * shows the loading image and hide the Calendar
	 */
	showLoadingHideDatepicker: function() {
		jQuery('#datepickerloading').css( {
			'display': 'block'
		});
		jQuery('.reservation_content').css( {
			'display': 'none'
		});
	},

	/**
	 * hide only the loading image
	 */
	hideLoadingOnly: function() {
		jQuery('#datepickerloading').css( {
			'display': 'none'
		});
	},

	/**
	 * hide the loading image (form)
	 */
	hideFormLoadingOnly: function() {
		jQuery('#formtransmitting').css( {
			'display': 'none'
		});
	},

	/**
	 * hide the form
	 */
	hideFormular: function() {
		jQuery('#reservationFormular').css( {
			'display': 'none'
		});
		jQuery('.backlink').css( {
			'display': 'none'
		});
	},

	/**
	 * hide the form and show the loading image
	 */
	hideFormularAndShowLoading: function() {
		this.hideFormular();
		jQuery('#formtransmitting').css( {
			'display': 'block'
		});
	},

	/**
	 * shows the form and hide the loading image
	 */
	showFormHideLoading: function() {
		this.hideFormLoadingOnly();
		jQuery('.backlink').css( {
			'display': 'block'
		});
		jQuery('#reservationFormular').css( {
			'display': 'block'
		});
	},

	/**
	 * show Errors
	 */
	showError: function() {
		Reservation.Visibility.hideAllPages();
		jQuery('#pageError').css( {
			'display': 'block'
		});
	}

};


/**
 * start reservation
 */
Reservation.initialize();

