jQuery(function($) {
		var menuid = $('#menuid').text();
		var gastroID = $('#gastroID').text();
		var SID = $('#SID').text();

		var saveURL = 'gastro_menu_editor.php?return=json&menu=' + menuid + '&gastroID=' + gastroID + '&SID=' + SID;

		var elemAddImgProto = $('<p>')
			.attr({'class':'sked-upload'})
			.append($('<label>')
					.attr({'for':'sked-upload-img'})
					.text('Speisebild hochladen:'))
			.append($('<input type="file" name="image">')
					.attr({'id':'sked-upload-img'}))
			.append($('<input type="hidden" name="removeimage">')
					.val('0'));

		var elemOptionsProto = $('<p>')
			.attr({'class':'sked-options'})
			.append($('<label>')
					.attr({'for':'sked-new-after-save'})
					.text('Nach dem Speichern neuen Eintrag anlegen'))
			.append($('<input type="checkbox" name="sked-new-after-save">')
					.attr({'id':'sked-new-after-save'}));

		var elemSubmitProto = $('<p>')
			.addClass('sked-submit')
			.append($('<a>')
					.attr({'class':'abort', 'href':'#'})
					.text('Abbrechen'))
			.append($('<input type="submit">')
					.attr({'class':'submit'})
					.val('Speichern'));

		var elemCoursesProto = $('<fieldset>')
			.addClass('courses')
			.append($('<legend>Menü-Gänge</legend>'))
			.append($('<ol>'))
			.append($('<a>')
					.attr({'href':'#'})
					.addClass('add-course')
					.text('Gang hinzufügen'));

		var formEditGroupProto = $('<form>')
			.attr({'class':'sked-form', 'method':'post', 'accept-charset':'utf-8', 'action':saveURL})
			.append($('<textarea name="title">')
					.attr({'rows':'1', 'cols':'70'}))
			.append($('<textarea name="description">')
					.attr({'rows':'2', 'cols':'70'}))
			.append(elemSubmitProto.clone());

		var formEditFoodProto = $('<form>')
			.attr({'class':'sked-form', 'method':'post', 'accept-charset':'utf-8', 'action':saveURL, 'enctype':'multipart/form-data'})
			.append($('<span>')
					.attr({'class':'price'})
					.append($('<input type="text" name="price">')
							.attr({'class':'price', 'size':'8', 'id':'sked-price'}))
					.append($('<label>')
							.attr({'for':'sked-price'})
							.html('&euro;')))
			.append($('<textarea name="title">')
					.attr({'rows':'1', 'cols':'50'}))
			.append($('<textarea name="description">')
					.attr({'rows':'2', 'cols':'50'}))
			.append(elemAddImgProto.clone());
		if(gastroID) {
			formEditFoodProto.append($('<span>Speise-Tags: </span>'))
					.append($('<input type="text" name="foodtags">')
					.attr({'id':'foodtags'})
					.attr({'class':'foodtags'})
					.attr({'autocomplete':'off'}))
		}
		formEditFoodProto.append(elemSubmitProto.clone())
			.append(elemOptionsProto.clone());

		var formEditGroupFactory = function() {
			this.get = function() {
				return formEditGroupProto.clone().extend({
						'setId': function(id) {
							this.append(
									$('<input type="hidden" name="editGroup">')
										.val(id));
							$('label[for]', this).each(function() {
									$(this).attr('for', $(this).attr('for') + '-' + id);
								});
							$('[id]', this).each(function() {
									$(this).attr('id', $(this).attr('id') + '-' + id);
								});
						}
					});
			};
		}

		var formEditFoodFactory = function() {
			this.get = function() {
				return formEditFoodProto.clone().extend({
						'setId': function(id) {
							this.append(
									$('<input type="hidden" name="editEntry">')
										.val(id));
							$('label[for]', this).each(function() {
									$(this).attr('for', $(this).attr('for') + '-' + id);
								});
							$('[id]', this).each(function() {
									$(this).attr('id', $(this).attr('id') + '-' + id);
								});
						},
						'setGroup': function(id) {
							this.append(
									$('<input type="hidden" name="groupid">')
										.val(id));
						},
						'setUploadStr': function(str) {
							$('.sked-upload label', this).text(str);
						}
					});
			};
		}

		var yesNoDialog = $(''+
'<div id="confirm-del-msg">'+
'	<div class="modal-Box">'+
'		<div class="subHead"><h3>Eintrag löschen</h3></div>'+
'			<div class="container clearfix">'+
'				<form action="test.html" method="post">'+
'					<div class="message">Wollen Sie den Eintrag wirklich löschen?</div>'+
'					<div class="buttonRow clearfix">'+
'						<div class="btn-floor left nyroModalClose">'+
'							<a class="btn" href="#"><span>Abbrechen</span></a>'+
'						</div>'+
'						<div class="btn-floor right">'+
'							<a class="btn link-submit" href="#"><span>Löschen</span></a>'+
'						</div>'+
'					</div>'+
'				</form>'+
'			</div>'+
'	</div>'+
'</div>');

		$('a.link-submit', yesNoDialog).click(function() {
				$(this).parents('form').submit();
				$.nyroModalRemove();
				return false;
			});

		$('ul.action-links a.cp-mv, .sked-new-items ul.action-links a').live('click', function(e) {
				e.preventDefault();
				$.nyroModalManual({
						'url': $(this).attr('href'),
						'endShowContent': function() {
							$('a.link-submit').click(function() {
									$(this).parents('form').submit();
									return false;
								});
						}
					});
				return false;
			});

		$('div.foodgr ul.action-links a.delete').live('click', function(e) {
				var $this = $(this),
					targetUrl = $this.attr('href'),
					parent = $this.parents('div.foodgr'),
					type = 'deleteGroup';
				addDeleteDialog(targetUrl, parent, type);

				return false;
			});

		$('ul.list-sked ul.action-links a.delete').live('click', function(e) {
				var $this = $(this),
					targetUrl = $this.attr('href'),
					parent = $this.parents('ul.list-sked > li'),
					type = 'deleteEntry';
				addDeleteDialog(targetUrl, parent, type);
				return false;
			});

		$('div.foodgr ul.action-links a.edit').live('click', function() {
				var parent = $(this).parents('div.foodgr'),
					factory = new formEditGroupFactory();
				unfoldForm(parent, factory);
				return false;
			});

		$('ul.list-sked ul.action-links a.edit').live('click', function() {
				var parent = $(this).parents('ul.list-sked > li'),
					factory = new formEditFoodFactory();
				unfoldForm(parent, factory);
				return false;
			});

		$('div.foodgr.sked-expand:has(form)').each(function() {
				var parent = $(this);
					factory = new formEditGroupFactory();
				unfoldForm(parent, factory);
			});

		$('ul.list-sked li.sked-expand:has(form)').each(function() {
				var parent = $(this);
					factory = new formEditFoodFactory();
				unfoldForm(parent, factory);
			});

		$('div.foodgr').each(function(e) {
				var $this = $(this);

				if ($this.next('ul.list-sked').children().size()) {
					$('a.delete', $this).hide();
				}
			});

		$('div.imageSpeise').each(function() {
				addZoomHandlers($(this));
			});

		fixTabindex();

		function unfoldForm(parent, factory, checkNew) {
			var form,
				entryid = $('span.entryid', parent).text(),
				groupid = $('span.entryid', parent.parent().prev('div.foodgr')).text() || 0;

			if ($('form', parent).size()) {
				form = $('form', parent);
			} else {
				form = factory.get();
				form.setId(entryid);
				if (form.setGroup) {
					form.setGroup(groupid);
				}
				form.hide();
				parent.append(form);
				$("#foodtags-"+entryid).autocomplete(
						'applications/vocabulary/include/php5/vitoki/vocabulary/services/list_terms.php?l=50&lang=de&vocabulary=49c1f9a958d58bc9b9222ef17e1a2a17&alias=0',
						{"minChars":1,"delay":400,"cacheLength":10,"matchSubset":true,"matchCase":false,"matchContains":false,"mustMatch":false,"selectFirst":false,"multiple":true,"multipleSeparator":", ","autoFill":false,"max":50,"scroll":true,"scrollHeight":180}
					);
			}

			var taTitle = $('textarea[name=title]', form),
				taDesc = $('textarea[name=description]', form),
				inpFoodtags = $('input[name=foodtags]', form),
				inpPrice = $('input[name=price]', form),
				image = $('div.imageSpeiseThumb', parent),
				title = $('.title', parent),
				desc = $('.description', parent),
				foodtags = $('.foodtags', parent),
				autofoodtags = $('.autofoodtags', parent),
				price = $('.price .amount', parent),
				currency = $('.price .currency', parent),
				origTitle = trim(title.text()),
				origDesc = trim(desc.text()),
				origFoodtags = trim(foodtags.text()),
				origDescHtml = trim(desc.html()),
				origPrice = trim(price.text());

			// Populate form
			taTitle.val(origTitle);
			taDesc.val(origDesc);
			inpFoodtags.val(origFoodtags);
			inpPrice.val(origPrice);

			if (checkNew) {
				$('input[name=sked-new-after-save]').attr('checked', 'checked');
			}

			// Is this a menu?
			if ($('ol.courses', parent).length > 0) {
				elemCoursesProto.clone().insertAfter($('.sked-upload', form));
				if (form.setUploadStr) {
					form.setUploadStr('Menübild hochladen:');
				}

				var coursesList = $('ol.courses', parent),
					courses = $('li', coursesList),
					cFieldList = $('fieldset.courses ol', form),
					cOrig = new Array();

				courses.each(function() {
						var $this = $(this),
							cDesc = $this.contents().filter(function() { return this.nodeType===3; }).get(0).nodeValue;
						cOrig.push(cDesc);
						addCourseField($this, cFieldList, cDesc);
					});
				enumCourses(cFieldList);

				// Add new course
				$('a.add-course', form).click(function() {
						var newItem = $('<li>')
							.append('<span class="enum"> </span>')
							.appendTo(coursesList);
						addCourseField(newItem, cFieldList);
						enumCourses(coursesList, '. Gang: ');
						enumCourses(cFieldList);
						return false;
					});
			}

			// Add event handlers
			taTitle.keyup(function() {
					title.text(taTitle.val());
					title.html(title.html()+'&nbsp;');
				});

			taDesc.keyup(function() {
					desc.html(specialchars(taDesc.val()).replace(/\n/g, '<br>')+'&nbsp;');
				});

			inpPrice.keyup(function() {
					var val = trim(inpPrice.val());
					price.text(val);
					if (val) {
						currency.html('&euro;');
					} else {
						currency.text('');
					}
				});

			// Check if this item has an image and add remove button
			if (image.children().size()) {
				$('p.sked-upload', form)
					.append($('<br/>'))
					.append($('<a href="#"></a>')
							.text($('.sked-upload label', form).text().replace('hochladen:', 'löschen'))
							.click(function() {
									image.hide();
									$(this).remove();
									$('input[name=removeimage]', form).val('1');
									return false;
								}));
			}

			$('a.abort', form).click(function() {
					// Hide form / Show buttons
					form.slideUp(500, function() {
							parent.removeClass('sked-expand');
							form.remove();

							// remove item if it was new
							if (!entryid) {
								removeEntry(parent);
							}
						});

					// Restore original data
					title.text(origTitle);
					desc.html(origDescHtml);
					price.text(origPrice);
					// $('div.imageSpeise', parent).append(image);
					image.show();

					if (cOrig !== undefined) {
						var cList = $('ol.courses', parent).empty();
						while (cOrig.length > 0) {
							$('<li>')
								.text(cOrig.pop())
								.prepend('<span class="enum"> </span>')
								.prependTo(cList);
						}
						enumCourses(cList, '. Gang: ');
					}

					return false;
				});


			// Show form / Hide buttons
			if (!parent.hasClass('sked-expand')) {
				parent.addClass('sked-expand');
				form.slideDown(500);
			}

			// Make textareas 'elastic'
			if ($.fn.elastic) {
				$('textarea', form).elastic();
			}

			// 'Ajaxify' form
			var options = {
				beforeSubmit: function(d, f, o) {
					$('p.messagebox', form).remove();
					$('p.sked-submit', form).css('backgroundPosition', 'left top');

					// Add predecessor's id to form data if this is a new entry
					if ($('input[name=editEntry]', form).size() && !$('input[name=editEntry]', form).val()) {
						var prevId = $('.entryid', parent.prev()).text() || '0';

						// Add id to form data
						d.push({
								'name': 'after',
								'value': $('.entryid', parent.prev()).text() || '0'
								});

						// Add additional hidden field to form (this
						// is necessary if an iframe is used)
						$('<input type="hidden" name="after" value="' + prevId + '" />')
							.appendTo(form);
					}
					return true;
				},
				success: function(r, s) {
					$('p.messagebox', form).remove();
					$('p.sked-submit', form).css('backgroundPosition', 'left -15px');

					// Display error if any and return
					if (r.error) {
						$('<p class="messagebox negativ">')
							.text(r.error)
							.prependTo(form);
						return;
					}

					// Display confirmed data
					title.html(r.title);
					desc.html(r.description);
					foodtags.html(r.foodtags);
					autofoodtags.html(r.autofoodtags);

					if (r.price) {
						price.text(r.price);
						currency.html('&euro;');
					} else {
						price.text('');
						currency.text('');
					}
					$('.entryid', parent).text(r.id);

					// Is this a menu?
					if (r.courses && $('ol.courses', parent).length > 0) {
						var cList = $('ol.courses', parent).empty();
						while (r.courses.length > 0) {
							$('<li>')
								.html(r.courses.pop())
								.prepend('<span class="enum"> </span>')
								.prependTo(cList);
						}
						enumCourses(cList, '. Gang: ');
					}

					// Update image
					if (r.image) {
						image.empty().show();
						$('.imageSpeiseZoom', image.parent()).remove();

						var img = $('<img>').attr({
								'width': r.width,
								'height': r.height,
								'src': r.image,
								'alt': r.title
							});

						if (r.imageBig) {
							$('<a>').attr('href', r.imageBig).append(img).appendTo(image);
						} else {
							img.appendTo(image);
						}

						addZoomHandlers(image.parent());
					} else {
						image.empty().show();
						$('.imageSpeiseZoom', image.parent()).remove();
					}

					// Add links to copy, move, delete
					if (r.copyUrl) {
						$('.action-links a.copy', parent).attr('href', r.copyUrl);
					}
					if (r.moveUrl) {
						$('.action-links a.move', parent).attr('href', r.moveUrl);
					}
					if (r.deleteUrl) {
						$('.action-links a.delete', parent).attr('href', r.deleteUrl);
					}

					// Unfold a new form if checkbox is checked
					if ($('input[name=sked-new-after-save]', form).is(':checked')) {
						var pClone = parent.clone();

						pClone.removeClass('sked-expand');
						$('ol.courses', pClone).empty();
						$('form', pClone).remove();
						$('.imageSpeiseThumb', pClone).empty().show();
						$('.imageSpeiseZoom', pClone).remove();
						$('.entryid', pClone).text('');
						$('.foodtags', pClone).text('');
						$('.autofoodtags', pClone).text('');
						$('.price .currency', pClone).text('');
						$('.title, .description, .amount', pClone).html('&nbsp;');
						pClone.insertAfter(parent);
						unfoldForm(pClone, factory, true);
					}

					// Hide this form
					form.slideUp(500, function() {
							parent.removeClass('sked-expand');
							form.remove();
						});
				},
				error: function(r, s) {
					$('p.messagebox', form).remove();
					$('p.sked-submit', form).css('backgroundPosition', 'left -15px');
					$('<p class="messagebox negativ">')
						.text(r.statusText)
						.prependTo(form);
				},
				dataType:  'json',
				timeout:   10000 // 10s
			};

			// Fix tabindex attributes
			fixTabindex();

			// bind form using 'ajaxForm'
			form.ajaxForm(options);

			// Set focus
			taTitle.focus();
		}

		function addZoomHandlers(el) {
			var link = $('a', el);

			if (!link.size()) { return; }

			var thumb = $('.imageSpeiseThumb', el),
				zoom = $('.imageSpeiseZoom', el),
				offset = link.offsetParent().offset(),
				posX = offset.left - 10,
				posY = offset.top - 10;

			if (!zoom.size()) {
				zoom = $('<div>')
					.addClass('imageSpeiseZoom')
					.append($('<img>')
							.attr('src', link.attr('href')))
					.insertAfter(thumb);
			}

			link.mouseenter(function(e) {
					zoom.css({'left': e.pageX - posX, 'top': e.pageY - posY}).show();
					//zoom.css({'left': e.pageX - posX, 'top': e.pageY - posY}).fadeIn(200);
				});

			link.mouseleave(function(e) {
					zoom.hide();
					//zoom.fadeOut(200);
				});

			link.mousemove(function(e) {
					zoom.css({'left': e.pageX - posX, 'top': e.pageY - posY});
				});

			link.click(function() {
					return false;
				});

		}

		function addDeleteDialog(targetUrl, parent, type) {
				var ajaxOptions = {
						'success': function(r, s) {
							if (r.error) {
								alert(r.error);
							} else {
								parent.slideUp(500, function() {
										if (type == 'deleteEntry') {
											removeEntry(parent);
										} else {
											parent.remove();
										}
									});
							}
						},
						'error': function(r, s) {
							alert(r.statusText);
						},
						'dataType': 'json',
						'timeout': 10000 // 10s
					},
					modalOptions = {
						//'url': '/dialog.php?type=entry_delete',
						'type': 'content',
						'content': yesNoDialog.clone(true),
						'endShowContent': function() {
							var form = $('.modal-Box form');

							form.attr({'action':targetUrl})
								.append($('<input type="hidden" name="'+type+'" />')
										.val($('span.entryid', parent).text()))
								.ajaxForm(ajaxOptions);
						}
					};

				$.nyroModalManual(modalOptions);
		}

		function addCourseField(textLi, formUl, desc) {
			desc = desc || '';

			var newField = $('<input type="text" name="courses[]">')
				.attr({
						'class':'course',
						'size':'50'
					})
				.val(desc)
				.keyup(function() {
						var enumField = $('span', textLi);
						textLi.text($(this).val()).prepend(enumField);
					})
				.blur(function() {
						if (/^\s*$/.test($(this).val())) {
							var coursesList = textLi.parent(),
								cFieldList = $(this).parent();
							textLi.remove();
							$(this).parent().remove();
							enumCourses(coursesList, '. Gang: ');
							enumCourses(cFieldList);
						}
					});

			$('<li>')
				.append('<span class="enum"> </span>')
				.append(newField)
				.appendTo(formUl);

			// Fix tabindex attributes
			fixTabindex();
		}

		function enumCourses(ol, text) {
			var text = text || '. ',
				i=1;

			$('span.enum', ol).each(function() {
					$(this).text(i.toString() + text);
					i++;
				});
		}

		function removeEntry(e) {
			var list = e.parent(),
				group = list.prev('.foodgr');

			e.remove();
			if (!list.children('li').size()) {
				$('ul.action-links a.delete', group).show();
				list.remove();
			}
		}

		function fixTabindex() {
			var tabindex = 1;

			// remove all tabindex attributes
			// $('[tabindex]').removeAttr('tabindex');

			function setTabindex(e) {
				$(e).attr('tabindex', tabindex++);
			}

			$('form').each(function() {
					var form = $(this);

					$('textarea[name=title]', form).attr('tabindex', tabindex++);
					$('input[name=price]', form).attr('tabindex', tabindex++);
					$('textarea[name=description]', form).attr('tabindex', tabindex++);
					$('input[name=image]', form).attr('tabindex', tabindex++);

					$('input.course', form).each(function() { setTabindex(this); });


					$('input[type=submit]', form).attr('tabindex', tabindex++);
					$('input[name=sked-new-after-save]', form).attr('tabindex', tabindex++);
				});
		}

		function trim(s) {
			return s.replace(/^\s+/, '').replace(/\s+$/, '');
		}

		function specialchars(s) {
			return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
		}
	});
