var switchTicketType = function() {
	var tickettype, data, ticketdata, persons;
	tickettype = getTicketType();
	/*
	 * tickettype =0 means here: we want time selection. display=none does not
	 * prevent from setting a time for a intruder, so just handle in model if
	 * time can be selected and set time accordingly to timeframe.
	 */

	if (JSON.parse(tickettype).type == 0) {
		$('#id_dialog_selectTime').css("display", "");
	} else {
		$('#id_dialog_selectTime').css("display", "none");
	}
	persons = getPersons();
	adjustMaxPersons();
	ticketdata = {};
	ticketdata.type = tickettype;
	ticketdata.persons = persons;
	data = {};
	data.key = "ticket-data";
	data.value = getTicketType();
	sendRequest({
		url : '/booking/ajax/switch-ticket',
		data : data,
		referrer : 'booking',
		success : function(data) {
			if (data.type != 'error') {
				$('#calendar').fullCalendar('refetchEvents');
			} else {
				displayMessage(data.type, data.message);
			}
		}
	});
};

/*
 * we have miliseconds here
 */
var calculateDateTimeUnix = function(dateTime) {
	if (typeof (utcServerOffset) === "undefined") {
		var utcServerOffset = 3600;
	}
	var aDate = new Date();
	var gmtOffset = aDate.getTimezoneOffset() * 60; /* is minutes, need seconds */
	debug.log("time modified by [" + (gmtOffset + utcServerOffset) + "]");
	var offset = gmtOffset + utcServerOffset;
	/*
	 * convert to seconds and substract offset
	 */
	return ((dateTime / 1000) - (offset));
};

var adjustMaxPersons = function() {
	// debug.log("adjusting max persons");
	var tmp = parseInt($('#id_form_persons_persons :selected').val());
	$('#id_form_persons_persons').html("");
	for ( var i = 1; i <= getMaxPersonsFromOrder(); i++) {
		var selected = "";
		if (tmp == i) {
			selected = "selected";
		}
		$('#id_form_persons_persons').append(
				"<option " + selected + ">" + i + "</option>");
	}
};
var sendRequest = function(params) {
	debug.log(params.url);
	debug.log("[" + params.name + "] start");
	$
			.ajax({
				referrer : params.referrer,
				async : params.async,
				beforeSend : params.beforeSend || function() {
				},
				url : params.url,
				dataType : 'json',
				type : params.type,
				data : params.data,
				success : function(result) {
					debug.log("<" + params.name
							+ "> end -> calling success function");
					debug.log({
						"result" : result
					});
					return params.success(result);
				},
				complete : function(xhr) {
				},
				error : function(xhr) {
					debug.log("<" + params.name + "> end error");
					if (xhr.status !== 0) {
						displayError("#error_dialog",
								"There was an error in the application, administrators have been notified!");
					}
				}
			});
};

function displayMessage(type, message) {
	$("#message").attr('class', type);
	$("#message").html(message);
}

var calenderInternalisation = {
	"monthNames" : {
		"de" : [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli',
				'August', 'September', 'Oktober', 'November', 'Dezember' ],
		"en" : [ 'January', 'February', 'March', 'April', 'May', 'June',
				'July', 'August', 'September', 'October', 'November',
				'December' ],
		"es" : [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
				'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre',
				'Diciembre' ],
		"fr" : [ 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
				'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre',
				'Décembre' ]
	},
	"dayNamesShort" : {
		"de" : [ 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa' ],
		"en" : [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
		"es" : [ 'D', 'L', 'M', 'X', 'J', 'V', 'S' ],
		"fr" : [ 'Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam' ]
	},
	"today" : {
		"de" : "Heute",
		"en" : "today",
		"es" : "hoy",
		"fr" : "Aujourd'hui"

	}

};

var showCalendar = function(lang) {
	$('#calendar')
			.fullCalendar(
					{
						header : {
							left : '',
							center : 'title',
							right : 'today prev,next'
						},
						firstDay : 1,
						disableDragging : true,
						weekMode : 'liquid',
						editable : true,
						monthNames : calenderInternalisation.monthNames[lang],
						dayNamesShort : calenderInternalisation.dayNamesShort[lang],
						buttonText : {
							today : calenderInternalisation.today[lang]
						},
						loading : function(isLoading) {
							if (isLoading) {
								$(".fc-button").addClass("ui-state-disabled");
								$(".fc-header-left")
										.html(
												'<img src="/images/ajax-loader-circle.gif" title="" alt="">');
							} else {
								$(".fc-button")
										.removeClass("ui-state-disabled");
								$(".fc-header-left").html("");
							}
						},
						theme : true,
						buttonIcons : {
							prev : 'circle-triangle-w',
							next : 'circle-triangle-e'
						},
						events : getEvents,
						isTimeSet : false,
						eventRender : function(event, element, view) {
							myEvents.push(event);
							/* caution not tested yet */
							setRenderedTimeBasedOnEvent(event);
							element.html(eventRenderer.render(myEvents
									.getLastEvent()));
						}
					});
};

var buildLocalDateFromDateTime = function(datetime, what) {
	var res = {
		date : {
			year : "",
			month : "",
			day : ""
		},
		time : {
			hour : "",
			minute : "",
			second : ""
		}

	};
	var regexp = /([^T]+)T([^T]+)/;
	var splitted = regexp.exec(datetime);
	var date = splitted[1];
	var time = splitted[2];
	var splittedDate = /([^-][^-][^-][^-])-([^-][^-])-([^-][^-])/.exec(date);
	var splittedTime = /([^:][^:]):([^:][^:]):([^:][^:])/.exec(time);
	res.date.year=splittedDate[1];
	res.date.month=splittedDate[2];
	res.date.day=splittedDate[3];
	res.time.hour=splittedTime[1];
	res.time.minute=splittedTime[2];
	res.time.second=splittedTime[3];
	return res;
};
/**
 * adjust the rendered start time based on the eventdata from db.
 * 
 * This function is not yet tested properly. If times vary from day to day it is
 * questionable if the timeframe data handling of times is apropriate. Maybe
 * using the times directly would be better! The timeframes are not designed to
 * hold different time of a daily basis. It was assumed that one ticket type has
 * exactly a defined start and end time and thus the time does not change.
 * 
 */
var setRenderedTimeBasedOnEvent = function(event) {
	var id = 0;
	$(event.spacedata).each(function() {
		var myDate = buildLocalDateFromDateTime(this.time.from);
		var hour = parseInt(myDate.time.hour, 10);
		timeFrames.setStartHourByTimeFrameId(id, hour);
		id++;
	});

};
var getEvents = function(start, end, callback) {
	var request = {
		name : 'get-events',
		url : '/booking/ajax/get-events',
		dataType : 'json',
		data : {
			start : (Math.round(calculateDateTimeUnix(start.getTime()))),
			end : (Math.round(calculateDateTimeUnix(end.getTime()))),
			tickettype : getTicketType(),
			persons : getPersons()
		},
		success : function(doc) {
			events = [];
			$(doc).each(function() {
				events.push({
					title : this.title,
					start : this.start,
					spacedata : this.spacedata
				});
				// }

			});
			myEvents.reset();
			callback(events);
		}
	};
	sendRequest(request);
};

var getEventTimes = function(start, end, callback) {
	var request = {
		name : 'get-event-times-by-user-count',
		url : '/booking/ajax/get-event-times-by-user-count',
		dataType : 'json',
		data : {
			start : start,
			end : end,
			tickettype : getTicketType(),
			persons : getPersons()
		},
		success : function(result) {
			// debug.log(result);
			if (callback !== undefined) {
				callback(result);
			}

		}
	};
	// debug.log(request);
	sendRequest(request);
};

var displayError = function(id, error) {
	var error_field = $(id);
	var error_message = $(error)
	var openDialog = true;
	if (error_field.length === 0) {
		openDialog = false;
		alert(error);
	} else if ($(error).length == 0) {
		$(id).html(error);
	} else {
		$(id).html(error_message.html());
	}
	if (openDialog) {
		$(id).dialog("open");
	}
};

var handleTimeFrameClicked = function(clickedDiv, eventId, timeframeId) {
	if ($(clickedDiv).is('.red')) {
		displayError("#error_dialog", "#error_no_free_space");
		return;
	} else if ($(clickedDiv).is('.grey')) {
		displayError("#error_dialog", "#error_time_not_bookable");
		return;
	}
	/*
	 * on each new selection of a timeframe set following values the default
	 * time is always the first time in a timeframe.
	 * 
	 */
	var headerData = {
		"datetime" : function() {
			return calculateDateTimeUnix(myEvents.getEventStartTime(eventId)
					.getTime());
			// return (myEvents.getEventStartTime(eventId).getTime() / 1000) -
			// 18000;
		},
		"timeframe" : function() {
			return timeframeId;
		},
		"id_dialog_time" : getDefaultTimeframeTime(timeframeId)
	};
	/*
	 * create order in db
	 */
	createOrderInDb(headerData);
	timeFrameClicked(clickedDiv, eventId, timeframeId);
};

var createOrderInDb = function(headerData) {
	/*
	 * before creating the order, update the model!
	 */
	updateOrderHead("header-data", headerData, persistOrder);
};
var handlePersonChange = function(id) {
	// changeTicketType();
	updateOrderHead(id);
	$('#calendar').fullCalendar('refetchEvents');

};

var timeFrames = (function() {
	var times = [ {
		"id" : 0,
		"displayId" : 0,
		"start" : {
			"hour" : "08",
			"minute" : "00"
		},
		"end" : {
			"hour" : "11",
			"minute" : "59"
		}
	}, {
		"id" : 1,
		"displayId" : 1,
		"start" : {
			"hour" : "12",
			"minute" : "00"
		},
		"end" : {
			"hour" : "14",
			"minute" : "59"
		}
	}, {
		"id" : 2,
		"displayId" : 3,
		"start" : {
			"hour" : "15",
			"minute" : "00"
		},
		"end" : {
			"hour" : "17",
			"minute" : "59"
		}
	}, {
		"id" : 3,
		"displayId" : 2,
		"start" : {
			"hour" : "18",
			"minute" : "00"
		},
		"end" : {
			"hour" : "23",
			"minute" : "59"
		}
	} ];
	var formatTime = function(time) {
		var result = time;
		if (parseInt(time) < 10)
			result = "0" + time;
		return result;
	};
	var result = {
		"getTimeframe" : function(id) {
			var result;
			$(times).each(function() {

				if (this.id == id) {
					result = this;
				}
			});
			return result;
		},
		"getTimeByTimeFrameId" : function(id, what) {
			if (what == undefined) {
				what = "start";
			}
			var result = "";
			$(times).each(function() {
				if (this.id == id) {
					result = this[what].hour + ":" + this[what].minute;
				}
			});
			return result;
		},
		"getHourByTimeFrameId" : function(id, what) {
			if (what == undefined) {
				what = "start";
			}
			var result = "";
			$(times).each(function() {
				if (this.id == id) {
					result = this[what].hour;
				}
			});
			return result;
		},
		"setStartHourByTimeFrameId" : function(id, time) {
			times[id].start.hour = formatTime(time);
			return true;
		},
		"setEndHourByTimeFrameId" : function(id, time) {
			times[id].end.hour = formatTime(time);
			return true;
		}
	};
	return result;
})();

var getDefaultTimeframeTime = function(timeframeId, mode) {
	var res = "00:00";
	switch (timeframeId) {
	case 0:
		res = "08:00";
		break;
	case 1:
		res = "12:00";
		break;
	case 2:
		res = "15:00";
		break;
	case 3:
		res = "18:00";
		break;

	default:
		res = "00:00";
		break;
	}
	if (mode == "h") {
		res = res.substring(0, 2);
	}
	return res;
};

var persistOrder = function(headerData) {

	var request = {
		name : "persistOrder",
		url : undefined,
		data : {},
		async : true,
		success : function(result) {
			renderPositionTable();
		}
	};
	request.url = '/booking/ajax/persist-order';
	request.data.key = "ticket-type";
	request.data.value = getTicketType();
	sendRequest(request);
};

var timeFrameClicked = function(clickedDiv, eventId, timeframeId) {
	$("#selectionWindowDialog").dialog({
		width : 550,
		modal : true,
		draggable : false,
		resizable : false,
		position : 'top',
		autoOpen : false,
		open : function(event, ui) {
			$('#preloader').fadeIn('fast');
			$('#dialog_form').hide();
			renderTimeSelection(timeframeId, function() {
				return getSelectedDialogTime();
			}, eventId);
			/*
			 * not sure if needed, try when coupons working! updateOrderHead now
			 * triggers a formReset automatically
			 */
			resetForm(true);
			// renderPositionTable();

		},
		close : function() {
			$("#id_max_person_error").css("display", "none");
		}
	});
	$("#selectionWindowDialog").dialog("open");

};

var renderTimeSelection = function(timeframeId, selectedTime, eventId) {
	var aDate = myEvents.getEventStartTime(eventId);
	var start = calculateDateTimeUnix(aDate.setHours(timeFrames
			.getHourByTimeFrameId(timeframeId, "start"), 00, 00, 00));
	var end = calculateDateTimeUnix(aDate.setHours(timeFrames
			.getHourByTimeFrameId(timeframeId, "end"), 59, 00, 00));

	getEventTimes(
			start,
			end,
			function(result) {
				var timeIsSelected = false;
				var res = '';
				$(result)
						.each(
								function() {
									var tmpDate = new Date($.fullCalendar
											.parseDate(this["VON"]));
									var minutes = (tmpDate.getMinutes() === 0) ? "00"
											: tmpDate.getMinutes();
									var dateString = leadingZeroes(tmpDate
											.getHours())
											+ ":" + minutes;
									var selected = (!timeIsSelected && this["RESULT"] == 1) ? 'selected="selected"'
											: '';
									if (selected != "") {
										timeIsSelected = true;
									}
									if (this["RESULT"] == 1) {
										res += '<option value="'
												+ dateString
												+ '" '
												+ selected
												+ ' >'
												+ dateString
												+ " ("
												+ (this["ANZAHL_GESAMT"] - this["ANZAHL"])
												+ ")" + '</option>';
									} else {
										res += '<option value="'
												+ dateString
												+ '" disabled="disabled"'
												+ ' >'
												+ dateString
												+ " ("
												+ (this["ANZAHL_GESAMT"] - this["ANZAHL"])
												+ ")" + '</option>';
									}
								});
				$('#id_dialog_time').html(res);
				/*
				 * check if default time differs from selected time (default
				 * time may be disabled!)
				 */
				updatedSelectedTime(timeframeId);
			});
	$('#id_dialog_time').html('');

};
var updatedSelectedTime = function(timeframeId) {
	if (getDefaultTimeframeTime(timeframeId) != $("#id_dialog_time").val()) {
		updateOrderHead("id_dialog_time");
	}
};
var leadingZeroes = function(aNumber) {
	var res = "";
	if (aNumber < 10) {
		res += 0;
	}
	res += aNumber;
	return res;
};

var resetForm = function(resetPositionTable) {
	if (resetPositionTable) {
		$('#renderedPositionTable').html("");
	}
	$('#id_dialog_coupon_code').val("");
	$('#id_id_select_order_coupon_list').html("");
	showCommitButton();
	hideOrderCheckStatus();
};
var getTicketType = function() {
	return $('#form_ticket_type input:radio[name=ticketType]:checked').val();
};

var getPersons = function() {
	return $('#form_persons select option:selected').val();

};
var getMaxPersonsFromOrder = function() {
	var result = undefined;
	if ($('#form_ticket_type :checked').val()) {
		result = JSON.parse($('#form_ticket_type :checked').val())["max"];
		if (result === undefined) {
			result = 8;
		} else if (result === 0) {
			// 0 is bad, load a default value!
			result = 8;
		}
	}
	return result;
};

var getSelectedDialogTime = function() {
	return $('#id_dialog_time option:selected').val();
};
function changePaymentMethod() {
	var pm = getPaymentMethod();
	if (pm == 'paypal') {
		disableUserData();
	} else {
		if ($('#form_user_data').css('display') != 'inline') {
			enableUserData();
		}
	}

	$('#id_payment_button').css("display", "inline");
}

function enableUserData() {
	$('#form_userdata').css('opacity', 0);
	$('#form_user_data').css('display', 'inline');
	$('#form_userdata').fadeTo('slow', 1);
}

function disableUserData() {
	$('#form_userdata').fadeTo('slow', 0, function() {
		$('#form_user_data').css('display', 'none');
	});
}

var getPaymentMethod = function() {
	return $(
			'#form_select_payment_method input:radio[name=paymentMethod]:checked')
			.val();
};
var getPaymentUserData = function() {
	var userData = {};
	$("#form_userdata input").each(function(id, element) {
		userData[element.name] = element.value;
	});
	return $("#form_userdata input").serializeArray();
};
var getPaymentMethodData = function() {
	var providerData = {};
	providerData.method = getPaymentMethod();
	return providerData;
};

/*
 * return the data gathered from payment form as a json string
 */
var serializePaymentForm = function() {
	var payment = {};
	payment.providerData = [];
	payment.providerData.push(getPaymentMethodData());
	payment.userData = getPaymentUserData();
	return JSON.stringify(payment);
};

/*
 * handle payment here! e.g. ajaxCall or redirect to payment provider
 * 
 */
var handlePaymentSubmitButtonClick = function(uniqueId) {
	// debug.log(serializePaymentForm());
	if (!validatePaymentForm(uniqueId)) {
		return false;
	}

};

var createPaylink = function(uniqueId) {
	var request = {
		name : "handlePaymentSubmitButtonClick",
		url : '/booking/ajax/create-paylink',
		dataType : 'json',
		data : {
			'uniqueId' : uniqueId,
			'form' : serializePaymentForm()
		},
		success : function(data) {
			window.location.href = data;
		}
	};
	sendRequest(request);
};

var validatePaymentForm = function(uniqueId, callback) {

	var email = $('#user_data_email').val();
	var request = {
		name : "validatePaymentForm",
		url : '/booking/ajax/validate-payment-form',
		datatype : 'json',
		data : {
			'email' : email,
			'method' : getPaymentMethod()
		},
		success : function(data) {
			if (data.ok === true) {
				updateCustomerDataFromForm(createPaylink, uniqueId);
			} else {
				displayError("#error_dialog", data.message);
			}
		}
	};
	sendRequest(request);
};
/*
 * END OF PAYMENT PROVIDER HANDLING FUNCTIONS
 * 
 */

var eventRenderer = (function() {
	var borders, timeframes, renderTable, renderRow, renderCell, renderColor, isEarlierDateTime;
	borders = [];
	borders[0] = "topleft";
	borders[1] = "topright";

	borders[3] = "bottomleft";
	borders[2] = "bottomright";

	renderTable = function(event) {
		return "<table>" + renderRow(event) + "</table>";
	};
	renderRow = function(event) {
		var result;
		result = "<tr>";
		result += renderCell(event, 0);
		result += renderCell(event, 1);
		result += '</tr><tr>';
		result += renderCell(event, 3);
		result += renderCell(event, 2);
		result += '</tr>';
		return result;
	};
	renderCell = function(event, spaceid) {
		var result;
		var timeframeData = timeFrames.getTimeframe(spaceid);
		result = "";
		result += '<td ';
		// result += ' onmouseover="debug.log(' + dbg + ')"';
		result += 'onclick="handleTimeFrameClicked(this,';
		result += event.id + ',' + spaceid + ')" class="' + borders[spaceid]
				+ ' tvt-event ';
		result += renderColor(event.spacedata[spaceid]["space"], event, spaceid);

		result += '" title="' + timeframeData.start.hour + "-"
				+ (parseInt(timeframeData.end.hour) + 1) + ' Uhr">';
		result += timeframeData.start.hour + "-"
				+ (parseInt(timeframeData.end.hour) + 1);
		result += '</td>';

		return result;
	};

	renderColor = function(space, curEvent, id) {
		var result, personcount;
		/*
		 * get count of selected persons
		 */
		personcount = parseInt($('#id_form_persons_persons').val());

		/*
		 * coloring is based on person count selected.
		 * 
		 */
		if (isEarlierDateTime(curEvent, id, 2)) {
			result = 'grey';
		} else if (space < personcount) {
			result = 'red';
		} else if (space >= personcount && space <= personcount + 3) {
			result = 'yellow';
		} else {
			result = 'green';
		}
		return result;
	};
	isEarlierDateTime = function(curEvent, id, offset) {
		var result = false;
		/*
		 * set grey color if timeframe is earlier than now
		 */
		var now = new Date();
		var nowPartialDate = now.getFullYear() + "" + now.getMonth() + ""
				+ now.getDate();

		var curPratialDate = curEvent._start.getFullYear() + ""
				+ curEvent._start.getMonth() + "" + curEvent._start.getDate();

		if (nowPartialDate == curPratialDate) {
			if (now.getHours() >= parseInt(timeFrames.getTimeframe(id).start.hour)
					- offset) {
				result = true;
			}
		} else if (now > curEvent._start) {
			result = true;
		}
		return result;
	};
	var result = {
		"render" : function(event) {
			return renderTable(event);
		}

	};
	return result;
})();

var myEvents = (function() {
	var events = [];
	var result = {
		"push" : function(event) {
			event.id = (this.getCurrent());
			this.events.push(event);

		},
		"reset" : function() {
			this.events = [];
		},
		"getCurrent" : function() {
			return this.events.length;
		},
		"getEvents" : function() {
			return this.events;
		},
		"getEvent" : function(id) {
			return this.events[id];
		},
		"getEventStartTime" : function(id) {
			date = this.getEvent(id)._start;
			date.setHours(0);
			date.setMinutes(0);
			date.setSeconds(0);
			return date;
		},
		"getEventTimeframe" : function(id) {
			return this.getEvent(id).timeframeId;
		},
		"getLastId" : function() {
			return this.getCurrent() - 1;
		},
		"getLastEvent" : function() {
			var id = this.getLastId();
			return this.events[id];
		}
	};
	return result;
})();

var addCoupon = function(value) {
	var request = {
		name : "addCoupon",
		url : "/booking/ajax/add-coupon",
		key : "coupon",
		data : {
			"value" : value
		},
		async : true
	};
	request.success = couponRequestCallbackHandler;
	sendRequest(request);
};

var couponRequestCallbackHandler = function(result) {
	if (result.ok === false) {
		// if a wrong result is returned, there must be an message why adding
		// was not possible.
		if (result.message === undefined) {
			result.message = "No Message received from Ajaxcontroller!";
		}
		displayError("#error_dialog", result.message);
	} else {
		renderPositionTable();
		var code = $('#id_dialog_coupon_code').val();
		// $('#id_id_select_order_coupon_list').append(code + " <br/>");
		$('#id_dialog_coupon_code').val("");

	}
};
var showCheckButton = function() {
	$("#selectionWindowDialog").dialog({
		buttons : {
			"Check" : function() {
				commitOrder();
			}
		}
	});

};

var hideOrderCheckStatus = function() {
	$('#id_order_ok').css({
		display : "none"
	});

};

var showCommitButton = function() {
	// $("#selectionWindowDialog").dialog({
	// buttons : {
	// "" : function() {
	// commitOrder();
	// $(this).dialog("close");
	// }
	// }
	// });
};

var checkOrderRequestCallbackHandler = function(result) {
	if (result.ok === true) {
		$('#id_order_ok').css({
			display : "inline",
			opacity : 0
		}).fadeTo(1000, 1);
		showCommitButton();
	} else {
		displayError("#error_dialog", result.message);
	}
};

var commitOrderRequestCallbackHandler = function(result) {
	if (result.ok === true) {
		window.location.href = "/booking/payment";
	} else {
		displayError("#error_dialog", result.message);
	}
};
var checkOrder = function() {
	var request = {
		name : "checkOrder",
		url : "/booking/ajax/check-order",
		async : true
	};
	request.success = checkOrderRequestCallbackHandler;
	sendRequest(request);
};

var commitOrder = function() {
	// persistent the order and ...
	// saveOrder();
	// jump to payment modul
	var request = {
		name : "commitOrder",
		url : "/booking/ajax/commit-order",
		async : true
	};
	request.success = commitOrderRequestCallbackHandler;
	sendRequest(request);
};

var updateOrderHead = function(id, value, success) {
	if (success == undefined) {
		success = function() {
		};
	}
	var request = {
		name : "updateOrderHead",
		url : undefined,
		data : {
			"value" : {}
		},
		async : true,
		"success" : function() {
			success();
		}

	};
	request.url = '/booking/ajax/update-order-head';
	request.data.key = id;
	/*
	 * resetForm only if time selection change
	 */

	if (id === "id_dialog_time") {
		request.success = function() {
			resetForm();
		};
	}
	if (value === undefined) {
		request.data.key = "header-data";
		request.data.value[id] = $('#' + id).val();
	} else {
		request.data.value = value;
	}

	sendRequest(request);
};

var getMaxPersons = function() {
	var result = 0, max = 0;
	max = parseInt($('#id_maxPerson').val());
	if (max === undefined) {
		result = 0;
	} else {
		result = max;
	}
	return result;
};

var isGreaterMaxPersons = function(id) {
	var sum = 0, max = 0;
	$('#renderedPositionTable .isCounted:input').each(function() {
		sum += parseInt($(this).val());
	});
	max = getMaxPersons();
	if (max === 0) {
		// debug.log("max = " + max + " skipping check");
		return true;
	} else if (sum > max) {
		return true;
	} else {
		return false;
	}
};
/**
 * this function persists the data itself!
 * 
 */
var updateOrderPosition = function(id, value) {
	if (isGreaterMaxPersons(id)) {
		$('#id_max_person_value').html(getMaxPersons());
		$("#id_max_person_error").fadeIn(1000).delay(8000).fadeOut(1000);
		renderPositionTable();
		return;
	}
	$("#id_max_person_error").css("display", "none");
	var request = {
		name : "updateOrderPosition",
		url : undefined,
		data : {
			"value" : {}
		},
		async : true
	};
	request.url = '/booking/ajax/update-order-position';
	request.data.key = id;
	request.data.key = "position-data";
	request.data.value[id] = $('#' + id).val();
	request.success = function() {
		renderPositionTable();
	};
	sendRequest(request);
	resetForm();
};
var updateCustomerDataFromForm = function(callback, uniqueId) {
	var request = {
		name : "updateCustomerData",
		url : undefined,
		data : {
			"value" : {
				"name" : $('#user_data_lastname').val(),
				"firstName" : $('#user_data_surname').val(),
				"email" : $('#user_data_email').val()
			}
		},
		async : true
	};
	request.url = '/booking/ajax/update-customer-data';
	request.data.key = "customer-data";
	request.success = function(data) {
		if (data.ok === true) {
			callback(uniqueId);
		} else {
			displayError("#error_dialog", data.message);
		}
	};
	sendRequest(request);
};
var renderPositionTable = function() {
	request = {
		name : "renderPositionTable",
		url : '/booking/ajax/render-order',
		data : {
			key : "",
			value : ""
		},
		async : true,
		success : function(content) {
			$('#renderedPositionTable').html(Base64.decode(content.data));
			$('#preloader').fadeOut('fast', function() {
				$('#dialog_form').fadeIn('fast');
			});
		},
		complete : function() {

		}
	};
	sendRequest(request);
};
var checkPayment = function() {

	setTimeout("startBackgroundPaymentCheck()", 5000);

};
var startBackgroundPaymentCheck = function() {
	var request = {
		name : "startBackgroundPaymentCheck",
		url : undefined,
		data : {}
	};
	request.success = backgroundPaymentCheckCallback;
	request.url = '/booking/ajax/check-payment';
	request.data.key = "action";
	request.data.value = "check";
	sendRequest(request);
};

var backgroundPaymentCheckCallback = function(successResult) {
	if (successResult.status.name === "PENDING"
			|| successResult.status.name === "UNPAYED") {
		$('#payment-status').append("o");
		checkPayment();
	} else {
		$('#payment-status').html("PAID");
	}
};
var createNewOrder = function() {
	var request = {
		name : "create-new-order",
		url : "/booking/ajax/create-new-order",
		success : function() {
			window.location.href = "/booking/";
		},
	};
	sendRequest(request);
};

var handleOrderStates = function() {
	var state;
	// debug.log("handleOrderStates");

	state = getOrderState();
	// debug.log(state);
	if (state > 0 && state != 2) {
		$("#dialog").dialog({
			position : 'top',
			modal : true,
			resizable : false,
			draggable : false,
			width : 450,
			close : function() {
				/*
				 * caution, the other buttons must not close the dialog, else
				 * orders are created twice !
				 */
				createNewOrder();
			}
		});
	} else if (state == 2) {
		// alert("Creating new order");
		createNewOrder();
	}
	return state;
};
var getOrderState = function() {
	return $("#id_orderState").val();

};
var handleCouponKeyEvent = function(event) {
	if (event.keyCode === 13) {
		addCoupon($('#id_dialog_coupon_code').val());
	}
	return false;
};

var test = function(callback, time) {
	var foo = setInterval("debug.log('1')", 5000);

};

$(function() {
	$.fn.qtip.styles.tvturm = { // Last part is the name of the style
		width : 400,
		background : '#084471',
		color : 'white',
		textAlign : 'left',
		border : {
			width : 3,
			radius : 0,
			color : '#084471'
		},
		tip : 'bottomLeft',
		name : 'dark'
	};
	$(".ticket-tooltip").each(function() {
		var con = $(this).attr('title');
		$(this).attr('title', '');
		$(this).qtip({
			content : con,
			style : 'tvturm',
			position : {
				adjust : {
					screen : true
				},
				corner : {
					target : 'topMiddle',
					tooltip : 'bottomLeft'
				}
			}
		});
	});
});

var switchPaymentButton = function(obj) {
	if ($(obj).is(":checked")) {
		$("#id_payment_button_pay").removeClass("ui-state-disabled");
		$("#id_payment_button_pay").removeAttr("disabled");
	} else {
		$("#id_payment_button_pay").addClass("ui-state-disabled");
		$("#id_payment_button_pay").attr("disabled", "disabled");
	}
};
