
function popup(name, url){
	this.name = 'edit_'+name;
	//var $width = window.with - 300;
	tmp = window.open(url, 'form_'+name, 'width=1250,height=900,status=yes,scrollbars=yes,toolbar=yes,location=yes,menubar=yes,resizable=no');
	tmp.focus();
}

function multi_check(){
	
	$(".btn.multiselect").click(function(event){
		event.preventDefault();
		if ($(this).hasClass('active')){
			$('.multicheck:checked').each(function(){
				$(this).click();
			});
			$(this).removeClass('active');
		} else {
			$(this).addClass('active');
		}
	});
	
	$('.c_multicheck').change(function(event){
		$('.multicheck').not(this).prop('checked', this.checked);
		if ($('.multicheck:checked').length) {
			$('.multicheck_control').css('display', 'inline-block');
			$('.btn.select').css('display', 'inline-block');
		} else {
			$('.multicheck_control').hide();
			$('.btn.select').hide();
		}
	});
	
	$('.multicheck').change(function(event){
		if ($('.multicheck:checked').length) {
			$('.multicheck_control').css('display', 'inline-block');
			$('.btn.select').css('display', 'inline-block');
		} else {
			$('.multicheck_control').hide();
			$('.btn.select').hide();
		}
	});
}

function defaults(){
		
	$('body').off('click.popup_filter', '.popup_filter').on('click.popup_filter', '.popup_filter', function(event){
		event.preventDefault();
	
		var $button = $(this);
	
		var data = [
			{name: 'module', value: $button.attr('data-module')},
			{name: 'backend_module', value: $button.attr('data-backend-module')}
		];
	
		data = data.concat(getPopupParams($button));
	
		popup(
			'filter_'+$button.attr('data-module'),
			'popup_filter.php?' + $.param(data)
		);
	});
	
	if ($(".popup").length){
		$(window).keydown(function(event) {
			if (!(event.which == 83 && event.ctrlKey)) return true;
			$("button[type='submit']").click();
			event.preventDefault();
			return false;
		});
		$('form').submit(function(event) {
			$('.show_default-editor').each(function() {
		    var id = $(this).data('id');
		    var panel = $('.textarea-panel[data-id="'+id+'"]');
		    var def = panel.data('default');
		
		    if (!def || def === 'default') {
		      $(this).click();
		    }
		  });
		  return true;
		});
	}
	
}


function getPopupParams($button) {
	var $form = $button.closest('form');
	if (!$form.length) $form = $('form').first();

	var blocked = {
		module: true,
		backend_module: true,
		action: true,
		csrf_token: true,
		filter: true,
		export: true,
		order: true,
		lastorder: true,
		orderdir: true
	};

	return $form
		.find(':input.popup-param[name]:enabled')
		.serializeArray()
		.filter(function(item){
			return item.value !== '' && !blocked[item.name];
		});
}
		

function filter(){
	
	$(".reload").change(function(event){
		
		if (typeof clearMultiuploadInput === 'function') clearMultiuploadInput();
		
  	$("button[type='submit']").val('reload');
  	$("button[type='submit']").click();
	});
		
	$(".order").click(function(event){
		event.preventDefault();
		var $order = $("input[name='order']").val();
		var $lastorder = $("input[name='lastorder']").val();
		var $orderdir = $("input[name='orderdir']").val();
		if (($(this).attr('data-order') == $lastorder) || ($order != $lastorder)){
			if ($orderdir == 'ASC') $orderdir = 'DESC';
			else $orderdir = 'ASC';
		}
		
		if (typeof clearMultiuploadInput === 'function') clearMultiuploadInput();
		
		$("input[name='orderdir']").val($orderdir);
		$("input[name='lastorder']").val($order);
		$("input[name='order']").val($(this).attr('data-order'));
  	$("button[type='submit']").click();
	});
	
	$(".grid").click(function(event){
		event.preventDefault();
		
		if (typeof clearMultiuploadInput === 'function') clearMultiuploadInput();
		
		$("input[name='c_grid']").val('1');
  	$("button[type='submit']").click();
	});
	
	$(".list").click(function(event){
		event.preventDefault();
		
		if (typeof clearMultiuploadInput === 'function') clearMultiuploadInput();
		
		$("input[name='c_grid']").val('0');
  	$("button[type='submit']").click();
	});
	
	$('body').off('click.add', '.add').on('click.add', '.add', function(event){
		event.preventDefault();
	
		var $button = $(this);
	
		var data = [
			{name: 'module', value: $button.attr('data-module')},
			{name: 'backend_module', value: $button.attr('data-backend-module')},
			{name: 'action', value: 'add'}
		];
	
		data = data.concat(getPopupParams($button));
	
		popup(
			'add_'+$button.attr('data-module'),
			'popup_form.php?' + $.param(data)
		);
	});
	
	$("body").on('click', ".edit", function(event){
		if (!$(event.target).hasClass('multicheck')){
			event.preventDefault();
	    var $id = $(this).attr('data-id');
			if (!$(this).hasClass('multiselect') && !$(event.target).hasClass('grid-title')){
				var $module = $(this).attr('data-module');
		    var $backend_module = $(this).attr('data-backend-module');
		    var $tab = '';
		    if ($(this).attr('data-tab')) $tab = '&tab='+$(this).attr('data-tab');
				popup('edit_'+$module+'_'+$id, 'popup_form.php?module='+$module+'&backend_module='+$backend_module+'&id='+$id+'&action=edit'+$tab);
			} else {
				$(this).toggleClass('selected');
				$('.multicheck.c_check_'+$id).click();
			}
		}
	});
	
	
	$("body").on('click', ".copy", function(event){
		event.preventDefault();
		
		if ($(this).hasClass('ask')) {
	    if (!confirm('Soll wirklich eine Kopie erstellt werden?')) return;
	  }
	  
		var $module = $(this).attr('data-module');
    var $id = $(this).attr('data-id');	
    var $backend_module = $(this).attr('data-backend-module');
		popup('edit_'+$module+'_'+$id, 'popup_form.php?module='+$module+'&backend_module='+$backend_module+'&id='+$id+'&action=copy');
	});
	
	$("body").on('click', ".activate", function(event){
		event.preventDefault();
		$("input[name='id_active']").val($(this).attr('id'));
  	$("button[type='submit']").click();
	});
	
	$("body").on('click', ".delete", function(event){
		event.preventDefault();
    var $id = $(this).attr('data-id');	
		var $module = $(this).attr('data-module');
		var $backend_module = $(this).attr('data-backend-module');
		var $file = $(this).attr('data-file');
		var check = confirm('Wollen Sie den Eintrag wirklich l\u00f6schen?');
		if (check == true) {
			if ($module && $backend_module){
				var $url = 'ajax.php?module='+$module+'&backend_module='+$backend_module+'&id='+$id;
				if ($file) $url += '&file='+$file;
				$.ajax({
					url: $url,
					type: 'GET',
					success: function(data) {
						var $result = $.parseJSON(data);
						if (!$result.data || $result.data.length === 0){
							$("input[name='id_delete']").val($id);
			  			$("button[type='submit']").click();
						} else {
							const $parts = [];
							if ($result.label_before) $parts.push($result.label_before);
							
							if (Array.isArray($result.data) && $result.data.length) {
							  $parts.push($result.data.map(String).join("\n"));
							}
							
							if ($result.label_after) $parts.push($result.label_after);
							const $msg = $parts.join("\n\n"); 
							
							if (confirm($msg)) {
								$("input[name='id_delete']").val($id);
				  			$("button[type='submit']").click();
							}
						}
					}
				});
			} else {
				$("input[name='id_delete']").val($id);
  			$("button[type='submit']").click();
			}
  	}
	});
	
	$("body").on('click', ".open-action", function(event){
		event.preventDefault();
		
		if ($(this).attr('data-ask')) {
	    if (!confirm($(this).attr('data-ask'))) return;
	  }
	  
		var $module = $(this).attr('data-module');
    var $id = $(this).attr('data-id');	
    var $backend_module = $(this).attr('data-backend-module');
		popup('open-action_'+$module+'_'+$id, 'popup_action.php?module='+$module+'&backend_module='+$backend_module+'&id='+$id);
	});
	
	
	$("body").on('click', ".open-form", function(event){
		event.preventDefault();
		
		if ($(this).attr('data-ask')) {
	    if (!confirm($(this).attr('data-ask'))) return;
	  }
	  
		var $module = $(this).attr('data-module');
    var $id = $(this).attr('data-id');	
    var $backend_module = $(this).attr('data-backend-module');
    var $action = $(this).attr('data-action');
    var $tab = '';
    if ($(this).attr('data-tab')) $tab = '&tab='+$(this).attr('data-tab');
		popup('open-form_'+$module+'_'+$id, 'popup_form.php?module='+$module+'&backend_module='+$backend_module+'&id='+$id+'&action='+$action+$tab);
	});
	
	$("body").on('click', ".install_module", function(event){
		event.preventDefault();
    var $module = $(this).attr('data-module');	
		var check = confirm('Wollen Sie das Modul installieren?');
		if (check == true) {
			updateProcessOpen('Installation', [{module: $module, current: 'nicht installiert', target: 'aktuell', action: 'install'}]);
  	}
	});
	
	$("body").on('click', ".download_export", function(event){
		event.preventDefault();
		var $module = $(this).attr('data-module');
    var $id = $(this).attr('data-id');	
    var $file = $(this).attr('data-file');	
    var $backend_module = $(this).attr('data-backend-module');
		popup('export-action_'+$module+'_'+$id, 'ajax.php?module='+$module+'&backend_module='+$backend_module+'&file='+$file+'_export&id='+$id);
	});
	
	$("body").on('click', ".update_module", function(event){
		event.preventDefault();
    var $module = $(this).attr('data-module');	
		var $current = $(this).attr('data-current') || '';
		var $target = $(this).attr('data-target') || '';
		var check = confirm('Wollen Sie das Modul aktualisieren?');
		if (check == true) {
			updateProcessOpen('Update', [{module: $module, current: $current, target: $target, action: 'update'}]);
  	}
	});	
	
	function updateEscape(text){
		return $('<div>').text(text).html();
	}

	function updateBoxHtml(title, status){
		return '<div class="container popup update-manager-box">'
			+'<div class="form">'
				+'<div class="form-head"><i class="material-icons md-24">update</i>'+updateEscape(title)+'</div>'
				+'<div class="form-content">'
					+'<div class="update-manager-progress"><div class="update-manager-progress-bar"></div></div>'
					+'<div class="update-manager-progress-text">'+updateEscape(status)+'</div>'
					+'<div class="update-manager-log"></div>'
					+'<div class="update-manager-actions" style="display:none;">'
						+'<button type="button" class="btn update-manager-close" data-reload="0">'
							+'<i class="material-icons md-24">close</i><span>Schließen</span>'
						+'</button>'
					+'</div>'
				+'</div>'
			+'</div>'
		+'</div>';
	}

	function updateShowClose(reload){
		var icon = reload ? 'refresh' : 'close';
		var label = reload ? 'Schließen & neu laden' : 'Schließen';
		$('.update-manager-actions').show();
		$('.update-manager-close')
			.attr('data-reload', reload ? '1' : '0')
			.html('<i class="material-icons md-24">'+icon+'</i><span>'+label+'</span>');
	}

	function updateLog(text, type){
		var cls = type ? ' class="'+type+'"' : '';
		$('.update-manager-log').append('<div'+cls+'>'+updateEscape(text)+'</div>');
		var log = $('.update-manager-log').get(0);
		if (log) log.scrollTop = log.scrollHeight;
	}
	
	var updateOutputQueue = [];
	var updateOutputTimer = null;
	var updateOutputDelay = 140; // 80-220 testen. 140 wirkt angenehm.
	
	function updateQueue(fn, delay){
		updateOutputQueue.push({
			fn: fn,
			delay: typeof delay === 'number' ? delay : updateOutputDelay
		});
	
		updateQueueDrain();
	}
	
	function updateQueueDrain(){
		if (updateOutputTimer !== null) return;
		if (!updateOutputQueue.length) return;
	
		var item = updateOutputQueue.shift();
	
		updateOutputTimer = setTimeout(function(){
			updateOutputTimer = null;
	
			if (typeof item.fn === 'function'){
				item.fn();
			}
	
			updateQueueDrain();
		}, item.delay);
	}
	
	function updateQueueClear(){
		updateOutputQueue = [];
	
		if (updateOutputTimer !== null){
			clearTimeout(updateOutputTimer);
			updateOutputTimer = null;
		}
	}
	
	function updateQueueLog(text, type){
		updateQueue(function(){
			updateLog(text, type);
		});
	}
	
	function updateQueueAction(fn){
		updateQueue(fn);
	}

	function updateProgress(done, total){
		var percent = total > 0 ? Math.round((done / total) * 100) : 0;
		$('.update-manager-progress-bar').css('width', percent+'%');
		$('.update-manager-progress-text').text(done+' / '+total+' abgeschlossen');
	}
	
	function updateProgressPercent(percent, text){
		percent = parseInt(percent, 10);
		if (isNaN(percent)) percent = 0;
		if (percent < 0) percent = 0;
		if (percent > 100) percent = 100;
	
		$('.update-manager-progress-bar').css('width', percent+'%');
	
		if (text){
			$('.update-manager-progress-text').text(text);
		}
	}
	
	function updateProcessOpen(title, list, remote){
		updateQueueClear();
	
		$.fancybox.open({
			src: updateBoxHtml(title, 'Starte ...'),
			type: 'html',
			opts: {
				modal: true,
				touch: false,
				afterShow: function(){
					updateProgress(0, list.length);
					updateRunList(list, 0, remote);
				}
			}
		});
	}

	function updateCsrfToken(){
		return $("input[name='csrf_token']").val() || (document.querySelector('[data-csrf]') ? document.querySelector('[data-csrf]').dataset.csrf : '');
	}

	function updateRequestData(item, remote){
		return {
			csrf_token: updateCsrfToken(),
			action: (item.action ? item.action : 'update'),
			module_update: item.module,
			install_id: item.install_id || (remote ? remote.install_id : '')
		};
	}

	function updateRunList(list, index, remote){
		if (index >= list.length){
			updateQueueAction(function(){
				updateProgress(list.length, list.length);
			});
	
			updateQueueLog('Vorgang abgeschlossen. Bitte Debug-Ausgabe prüfen und manuell schließen.', 'success');
	
			updateQueueAction(function(){
				updateShowClose(true);
			});
	
			return;
		}
	
		var item = list[index];
	
		updateQueueLog(
			'Starte '+(item.action == 'install' ? 'Installation' : 'Update')+' '+item.module+
			(item.current || item.target ? ' ('+(item.current || '?')+' -> '+(item.target || '?')+')' : '')+
			' ...'
		);
	
		if (window.fetch && window.ReadableStream && window.TextDecoder) {
			updateRunListStream(list, index, remote, item);
			return;
		}
	
		updateRunListAjax(list, index, remote, item);
	}

	function updateRunListAjax(list, index, remote, item){
		$.ajax({
			url: remote && remote.url ? remote.url : 'ajax_update_manager.php',
			type: 'POST',
			dataType: 'json',
			data: updateRequestData(item, remote),
			success: function(response){
				updateHandleLegacyJson(response, list, index, remote, item);
			},
			error: function(xhr){
				updateQueueLog(item.module+' fehlgeschlagen. HTTP '+xhr.status, 'error');
				updateQueueLog('Vorgang gestoppt. Bitte Log prüfen.', 'error');
				updateQueueAction(function(){
					updateShowClose(false);
				});
			}
		});
	}

	function updateHandleLegacyJson(response, list, index, remote, item){
		if (response.log){
			$.each(response.log, function(i, line){
				updateQueueLog('['+item.module+'] '+line);
			});
		}
	
		if (response.success){
			updateQueueAction(function(){
				updateProgress(index + 1, list.length);
			});
	
			updateQueueLog(item.module+' erfolgreich abgeschlossen.', 'success');
	
			updateQueueAction(function(){
				updateRunList(list, index + 1, remote);
			});
		} else {
			updateQueueLog(item.module+' fehlgeschlagen. Vorgang gestoppt.', 'error');
	
			if (response.message){
				updateQueueLog(response.message, 'error');
			}
	
			updateQueueAction(function(){
				updateShowClose(false);
			});
		}
	}

	function updateRunListStream(list, index, remote, item){
		var formData = new FormData();
		var data = updateRequestData(item, remote);
		data.stream = 1;
		$.each(data, function(key, value){ formData.append(key, value); });

		var url = remote && remote.url ? remote.url : 'ajax_update_manager.php';
		var streamFinished = false;
		var invalidLogged = false;

		fetch(url, {
			method: 'POST',
			body: formData,
			credentials: 'same-origin',
			cache: 'no-store',
			headers: {'Accept': 'application/x-ndjson'}
		}).then(function(response){
			if (!response.ok) throw new Error('HTTP '+response.status);
			if (!response.body) throw new Error('Kein Stream verfügbar');

			var reader = response.body.getReader();
			var decoder = new TextDecoder('utf-8');
			var buffer = '';

			function handleLine(line){
				line = $.trim(line);
				if (!line) return;
			
				var message;
			
				try {
					message = JSON.parse(line);
				} catch(e) {
					if (!invalidLogged) {
						updateQueueLog('Ungültige Stream-Antwort vom Server. Wahrscheinlich PHP-Notice, Login/CSRF-Problem oder Proxy-Buffering.', 'error');
						invalidLogged = true;
					}
					return;
				}
			
				if (!message.type && typeof message.success !== 'undefined') {
					streamFinished = true;
					updateHandleLegacyJson(message, list, index, remote, item);
					return;
				}
			
				if (message.type == 'log') {
					updateQueueLog('['+(message.module || item.module)+'] '+(message.message || ''));
					return;
				}
			
				if (message.type == 'error') {
					streamFinished = true;
			
					updateQueueLog((message.module || item.module)+' fehlgeschlagen. Vorgang gestoppt.', 'error');
			
					if (message.message){
						updateQueueLog(message.message, 'error');
					}
			
					updateQueueAction(function(){
						updateShowClose(false);
					});
			
					return;
				}
			
				if (message.type == 'proxy_done') {
					if (message.message){
						updateQueueLog(message.message);
					}
					return;
				}
				
				if (message.type == 'progress') {
					var phasePercent = parseInt(message.percent, 10);
				
					if (isNaN(phasePercent)) phasePercent = 0;
					if (phasePercent < 0) phasePercent = 0;
					if (phasePercent > 100) phasePercent = 100;
				
					var moduleProgress = 0;
					var phase = 'Update';
				
					if (message.phase == 'download') {
						phase = 'Download';
						moduleProgress = phasePercent * 0.45; // 0 - 45%
					} else if (message.phase == 'extract') {
						phase = 'Entpacken';
						moduleProgress = 45 + (phasePercent * 0.45); // 45 - 90%
					} else {
						moduleProgress = phasePercent;
					}
				
					if (moduleProgress > 99) moduleProgress = 99;
				
					var overallPercent = ((index + (moduleProgress / 100)) / list.length) * 100;
				
					updateQueueAction(function(){
						updateProgressPercent(
							overallPercent,
							'['+(message.module || item.module)+'] '+phase+' '+phasePercent+'%'
						);
					});
				
					return;
				}
				
				if (message.type == 'done') {
					if (streamFinished) return;
				
					streamFinished = true;
				
					if (message.success) {
						updateQueueAction(function(){
							updateProgress(index + 1, list.length);
						});
				
						updateQueueLog(item.module+' erfolgreich abgeschlossen.', 'success');
				
						updateQueueAction(function(){
							updateRunList(list, index + 1, remote);
						});
					} else {
						updateQueueLog(item.module+' fehlgeschlagen. Vorgang gestoppt.', 'error');
				
						if (message.message){
							updateQueueLog(message.message, 'error');
						}
				
						updateQueueAction(function(){
							updateShowClose(false);
						});
					}
				
					return;
				}
			}

			function readChunk(){
				return reader.read().then(function(result){
					if (result.value) {
						buffer += decoder.decode(result.value, {stream: !result.done});
						var lines = buffer.split(/\r?\n/);
						buffer = lines.pop();
						$.each(lines, function(i, line){ handleLine(line); });
					}

					if (result.done) {
						buffer += decoder.decode();
						if (buffer) handleLine(buffer);
						if (!streamFinished) {
							updateQueueLog(item.module+' fehlgeschlagen. Stream wurde ohne Abschlussmeldung beendet.', 'error');
							updateQueueAction(function(){
								updateShowClose(false);
							});
						}
						return;
					}

					return readChunk();
				});
			}

			return readChunk();
		}).catch(function(error){
			updateQueueLog(item.module+' fehlgeschlagen. '+error.message, 'error');
			updateQueueLog('Vorgang gestoppt. Bitte Log prüfen.', 'error');
			updateQueueAction(function(){
				updateShowClose(false);
			});
		});
	}

	$("body").on('click', ".update-manager-close", function(event){
		event.preventDefault();
	
		var reload = $(this).attr('data-reload') == '1';
	
		updateQueueClear();
		$.fancybox.close();
	
		if (reload) window.location.reload();
	});

	$("body").on('click', ".update_all", function(event){
		event.preventDefault();
		var check = confirm('Wollen Sie wirklich alle verfügbaren Updates nacheinander installieren? Core wird zuerst aktualisiert.');
		if (check != true) return;
		
		updateQueueClear();

		$.fancybox.open({
			src: updateBoxHtml('Update All', 'Prüfe Updates ...'),
			type: 'html',
			opts: {
				modal: true,
				touch: false,
				afterShow: function(){
					$.ajax({
						url: 'ajax_update_manager.php',
						type: 'POST',
						dataType: 'json',
						data: {
							csrf_token: updateCsrfToken(),
							action: 'list'
						},
						success: function(response){
							if (!response.success){
								updateQueueLog(response.message ? response.message : 'Update-Liste konnte nicht geladen werden.', 'error');
								updateQueueAction(function(){
									updateShowClose(false);
								});
								return;
							}
							if (!response.updates || response.updates.length == 0){
								updateQueueLog('Keine Updates verfügbar.', 'success');
								updateQueueAction(function(){
									updateProgress(0, 0);
									updateShowClose(false);
								});
								return;
							}
							updateQueueLog(response.updates.length+' Update(s) gefunden. Reihenfolge: '+$.map(response.updates, function(item){ return item.module; }).join(', '));

							updateQueueAction(function(){
								updateProgress(0, response.updates.length);
								updateRunList(response.updates, 0);
							});
						},
						error: function(xhr){
							updateQueueLog('Update-Liste konnte nicht geladen werden. HTTP '+xhr.status, 'error');
							updateQueueAction(function(){
								updateShowClose(false);
							});
						}
					});
				}
			}
		});
	});
	

	$("body").on('click', ".remote_update_all", function(event){
		event.preventDefault();
		var install_id = $(this).attr('data-id');
		var domain = $(this).attr('data-domain');
		if (!confirm('Remote-Update für '+domain+' starten? Core wird zuerst aktualisiert.')) return;
		
		updateQueueClear();
		
		$.fancybox.open({
			src: updateBoxHtml('Remote Update: '+domain, 'Prüfe Updates ...'),
			type: 'html',
			opts: {
				modal: true, touch: false,
				afterShow: function(){
					$.ajax({
						url: 'ajax_remote_update.php', type: 'POST', dataType: 'json',
						data: { csrf_token: updateCsrfToken(), action: 'list', install_id: install_id },
						success: function(response){
							if (!response.success){
								updateQueueLog(response.message ? response.message : 'Remote-Liste konnte nicht geladen werden.', 'error');
								updateQueueAction(function(){
									updateShowClose(false);
								});
								return;
							}
	
							if (!response.updates || response.updates.length == 0){
								updateQueueLog('Keine Updates verfügbar.', 'success');
								updateQueueAction(function(){
									updateProgress(0, 0);
									updateShowClose(false);
								});
								return;
							}
							
							$.each(response.updates, function(i, item){ item.install_id = install_id; });
							
							updateQueueLog(response.updates.length+' Remote-Update(s) gefunden. Reihenfolge: '+$.map(response.updates, function(item){
								return item.module;
							}).join(', '));
	
							updateQueueAction(function(){
								updateProgress(0, response.updates.length);
								updateRunList(response.updates, 0, {
									url: 'ajax_remote_update.php',
									install_id: install_id
								});
							});
						},
						error: function(xhr){
							updateQueueLog('Remote-Liste konnte nicht geladen werden. HTTP '+xhr.status, 'error');
							updateQueueAction(function(){
								updateShowClose(false);
							});
						}
					});
				}
			}
		});
	});
	
	$(".delete_level").click(function(event){
		event.preventDefault();
    var $id = $(this).attr('data-id');	
		var check = confirm('Wollen Sie den Eintrag wirklich l\u00f6schen?');
		if (check == true) {
			$("input[name='id_delete_level']").val($id);
  		$("button[type='submit']").click();
  	}
	});
	
	$(".btn.export").click(function(event){
		event.preventDefault();
		var check = confirm('Wollen Sie wirklich exportieren?');
		if (check == true) {
			$("input[name='export']").val($(this).attr('data-module'));
	  	$("button[type='submit']").click();
			$("input[name='export']").val('0');
  	}
	});
	
	$(".btn.export-manager").click(function(event){
		event.preventDefault();
		var form = $("form");
		var $module = $(this).attr('data-module');
	  var $backend_module = $(this).attr('data-backend-module');
		var $file = $(this).attr('data-file');
		var $id = $(this).attr('data-id');
		$.fancybox.open({
			type: 'ajax',
			src: 'ajax.php?module='+$module+'&backend_module='+$backend_module+'&file='+$module+'_export',
			opts: {
				touch: false,
				afterLoad: function(instance, current){
				},
				afterShow: function(instance, current){
					$('.start-export').click(function(event){
						event.preventDefault();
						instance.close();
						$("input[name='export_type']").val($('.fancybox-content .form-row').find('[name="export_type"]').val());
						$("input[name='file']").val($('.fancybox-content .form-row').find('[name="file"]').val());
						$("input[name='c_labels']").val($('.fancybox-content .form-row').find('[name="c_labels"]').attr('checked'));
						$("input[name='export']").val($module);
				  	$("button[type='submit']").click();
						$("input[name='export']").val('0');
					});
				}
			}
		});
	});
	
	$(".btn.import").click(function(event){
		event.preventDefault();
		var $module = $(this).attr('data-module');
    var $backend_module = $(this).attr('data-backend-module');
		popup('import_'+$module, 'popup_form.php?module=import_'+$module+'&backend_module='+$backend_module);
	});
}

function filter_multi(){
	
	$(".multi_activate").click(function(event){
		event.preventDefault();
		var check = confirm('Wollen Sie die Eintr\u00e4ge wirklich aktivieren?');
		if (check == true) {
			$("input[name='multi_activate']").val(1);
	  	$("button[type='submit']").click();
	  }
	});
	
	$(".multi_deactivate").click(function(event){
		event.preventDefault();
		var check = confirm('Wollen Sie die Eintr\u00e4ge wirklich deaktivieren?');
		if (check == true) {
			$("input[name='multi_deactivate']").val(1);
	  	$("button[type='submit']").click();
	  }
	});
	
	$(".multi_edit").click(function(event){
		event.preventDefault();
		var $module = $(this).attr('data-module');
    var $backend_module = $(this).attr('data-backend-module');
		var $id_list = null;
		$('.multicheck:checked').each(function(){
			if ($id_list == null) $id_list = $(this).attr('id').replace('c_check_', '');
			else $id_list = $id_list+','+$(this).attr('id').replace('c_check_', '');
		});
		popup('multi_'+$module+'_'+$id_list, 'popup_form.php?module='+$module+'_multi&backend_module='+$backend_module+'&multi_module='+$module+'&ids='+$id_list);
	});
	
	$(".multi_delete").click(function(event){
		event.preventDefault();
		var form = $("form")
		var $module = $(this).attr('data-module');
		var $backend_module = $(this).attr('data-backend-module');
		var $file = $(this).attr('data-file');
		var check = confirm('Wollen Sie die Eintr\u00e4ge wirklich l\u00f6schen?');
		if (check == true) {
			if ($module && $backend_module){
				var $url = 'ajax.php?module='+$module+'&backend_module='+$backend_module;
				if ($file) $url += '&file='+$file;
				$.ajax({
					url: $url,
					type: 'POST',
					data: form.serialize(),
					success: function(data) {
						var $result = $.parseJSON(data);
						if (!$result.data || $result.data.length === 0){
							$("input[name='multi_delete']").val(1);
					  	$("button[type='submit']").click();
						} else {
							const $parts = [];
							if ($result.label_before) $parts.push($result.label_before);
							
							if (Array.isArray($result.data) && $result.data.length) {
							  $parts.push($result.data.map(String).join("\n"));
							}
							
							if ($result.label_after) $parts.push($result.label_after);
							const $msg = $parts.join("\n\n"); 
							
							if (confirm($msg)) {
								$("input[name='multi_delete']").val(1);
						  	$("button[type='submit']").click();
							}
						}
					}
				});
			} else {
				$("input[name='multi_delete']").val(1);
		  	$("button[type='submit']").click();
		  }
	  }
	});
	
	
	$(".multi_open-action").click(function(event){
		event.preventDefault();
		var $module = $(this).attr('data-module');
    var $backend_module = $(this).attr('data-backend-module');
		var $id_list = null;
		$('.multicheck:checked').each(function(){
			if ($id_list == null) $id_list = $(this).attr('id').replace('c_check_', '');
			else $id_list = $id_list+','+$(this).attr('id').replace('c_check_', '');
		});
		popup('multi_open-action_'+$module+'_'+$id, 'popup_action.php?module='+$module+'&backend_module='+$backend_module+'&ids='+$id);
	});
}

function context_menu(){
	$('.table-body:not(.no-context) .table-cell:not(.c_active):not(.toolbar):not(.multiselect):not(.folder), .table-grid:not(.no-context) .table-cell:not(.c_active):not(.toolbar):not(.multiselect):not(.folder)').unbind('contextmenu');
	$('.holder.edit').unbind('contextmenu');
	$('.context-menu').unbind('contextmenu');
		
	$('.table-body:not(.no-context) .table-cell:not(.c_active):not(.toolbar):not(.multiselect):not(.folder), .table-grid:not(.no-context) .table-cell:not(.c_active):not(.toolbar):not(.multiselect):not(.folder)').bind('contextmenu', function (e) {
		var $module = $(this).parents('.table-row').attr('data-module');
    var $backend_module = $(this).parents('.table-row').attr('data-backend-module');
    var $id = $(this).parents('.table-row').attr('data-id');
    var $file = $(this).parents('.table-row').attr('data-file');
		if ($(this).parents('.table-grid').length > 0){
			$module = $(this).attr('data-module');
	    $backend_module = $(this).attr('data-backend-module');
    	$id = $(this).attr('data-id');	
    	$file = $(this).attr('data-file');	
    }	
    
    var top = e.pageY+5;
    var left = e.pageX;
    
    $('.context-menu li').each(function(e){
    	$(this).children('a').attr('data-module', $module).attr('data-backend-module', $backend_module).attr('data-id', $id).attr('data-file', $file);
    });

		$('.context-menu').toggle(100).css({
		   top: top + "px",
		   left: left + "px"
		});
		
		return false;
  });
  
	$('.holder.edit').bind('contextmenu', function (e) {
		var $module = $(this).attr('data-module');
    var $backend_module = $(this).attr('data-backend-module');
    var $id = $(this).attr('data-id');
    
    var top = e.pageY+5;
    var left = e.pageX;
    
    $('.context-menu li').each(function(e){
    	$(this).children('a').attr('data-module', $module).attr('data-backend-module', $backend_module).attr('data-id', $id);
    });

		$('.context-menu').toggle(100).css({
		   top: top + "px",
		   left: left + "px"
		});
		
		return false;
  });

  $(document).bind('contextmenu click',function(){
    $('.context-menu').hide();
  });

	$('.context-menu').bind('contextmenu',function(){
	   return false;
	});
}

function quick_edit(){
	
	$('body').on('dblclick', '.quick', function() {
		if ($(this).hasClass('active')){
			$(this).removeClass('active');
			$(this).find('span').first().show();
			$(this).find('.inline-form').hide();
		} else {
			$(this).addClass('active');
			$(this).find('span').first().hide();
			$(this).find('.inline-form').show();
			$(this).find('.inline-form:not(.tree-select) input').focus();
		}
	});
	
	$(".all_quick").click(function(event){
		event.preventDefault();
		if ($(this).hasClass('active')){
			$(this).removeClass('active');
			$('.quick').removeClass('active');
			$('.quick > span').show();
			$('.quick .inline-form').hide();
		} else {
			$(this).addClass('active');
			$('.quick').addClass('active');
			$('.quick > span').hide();
			$('.quick .inline-form').show();
		}
	});
	
	
	$('.quick .inline-form:not(.tree-select) input').focus(function(){
	  var that = this;
	  setTimeout(function(){ that.selectionStart = that.selectionEnd = that.value.length; }, 0);
	});
	
	if ($('body .quick').length){
		$(document).keyup(function(event) {
			if (event.key === "Escape"){
				$('.all_quick').removeClass('active');
				$('.quick').removeClass('active');
				$('.quick span').show();
				$('.quick .inline-form').hide();
			}
		});
	}
	
	$('body').on('keypress', '.inline-form .textarea', function (event){
		if (event.which === 13 && event.ctrlKey){
			event.preventDefault();
			var $this = $(this);
			var $module = $(this).parents('.table-row').attr('data-module');
	    var $backend_module = $(this).parents('.table-row').attr('data-backend-module');
	    var $id = $(this).parents('.table-row').attr('data-id');
	    var $before = '';
	    var $after = '';
	    if ($this.attr('data-before')) $before = $this.attr('data-before');
	    if ($this.attr('data-after')) $after = $this.attr('data-after');
	    
			var $data = $(this).serializeArray();
			var $key = $(this).attr('name');
			$data.push({name: 'csrf_token', value: document.querySelector('[data-csrf]')?.dataset.csrf });
			$data.push({name: 'key', value: $key });
			$data.push({name: 'update', value: 1 });
	    
			$.post("ajax_form.php?module="+$module+"&backend_module="+$backend_module+"&id="+$id+"&action=quick", $data, function(data){
				$this.parents('.table-cell').find('span').html($before+data+$after).show();
				$this.parents('.inline-form').hide();
				$this.parents('.table-cell').removeClass('active');
				$this.parents('.table-row').nextAll().each(function(index) {
					if ($(this).children('.active').find('input[name="'+$key+'"]').length){
						$(this).children('.active').find('input[name="'+$key+'"]').focus();
						return false;
					}
				});
			});
		}
	});
	
	$('body').on('keypress', '.inline-form .field', function (event){
		if (event.which === 13){
			event.preventDefault();
			var $this = $(this);
			var $module = $(this).parents('.table-row').attr('data-module');
	    var $backend_module = $(this).parents('.table-row').attr('data-backend-module');
	    var $id = $(this).parents('.table-row').attr('data-id');
	    var $before = '';
	    var $after = '';
	    if ($this.attr('data-before')) $before = $this.attr('data-before');
	    if ($this.attr('data-after')) $after = $this.attr('data-after');
	    
			var $data = $(this).serializeArray();
			var $key = $(this).attr('name');
			$data.push({name: 'csrf_token', value: document.querySelector('[data-csrf]')?.dataset.csrf });
			$data.push({name: 'key', value: $key });
			$data.push({name: 'update', value: 1 });
	    
			$.post("ajax_form.php?module="+$module+"&backend_module="+$backend_module+"&id="+$id+"&action=quick", $data, function(data){
				$this.parents('.table-cell').find('span').html($before+data+$after).show();
				$this.parents('.inline-form').hide();
				$this.parents('.table-cell').removeClass('active');
				$this.parents('.table-row').nextAll().each(function(index) {
					if ($(this).children('.active').find('input[name="'+$key+'"]').length){
						$(this).children('.active').find('input[name="'+$key+'"]').focus();
						return false;
					}
				});
			});
		}
	});
	
	$('body').on('change', '.inline-form .select', function (event){
		event.preventDefault();
		var $this = $(this);
		var $module = $(this).parents('.table-row').attr('data-module');
	  var $backend_module = $(this).parents('.table-row').attr('data-backend-module');
    var $id = $(this).parents('.table-row').attr('data-id');
  
		var $data = $(this).serializeArray();
		var $key = $(this).attr('name');
		$data.push({name: 'csrf_token', value: document.querySelector('[data-csrf]')?.dataset.csrf });
		$data.push({name: 'key', value: $key });
		$data.push({name: 'update', value: 1 });
    
		$.post("ajax_form.php?module="+$module+"&backend_module="+$backend_module+"&id="+$id+"&action=quick", $data, function(data){
			$this.parents('.table-cell').find('span').html($this.find("option:selected").text()).show();
			$this.parents('.inline-form').hide();
			$this.parents('.table-cell').removeClass('active');
			$this.parents('.table-row').nextAll().each(function(index) {
				if ($(this).children('.active').find('input[name="'+$key+'"]').length){
					$(this).children('.active').find('input[name="'+$key+'"]').focus();
					return false;
				}
			});
		});
	});
	
	$('body').on('click', '.quick-checkbox-toggle', function(event){
		event.preventDefault();
		event.stopPropagation();
		
		var $this = $(this);
		
		var $row = $this.parents('.table-row');
		var $field = $this.find('.field');
		var $icon = $this.find('i');
	
		var $module = $row.attr('data-module');
	  var $backend_module = $row.attr('data-backend-module');
    var $id = $row.attr('data-id');
		
		var $key = $field.attr('name');
		
		var $data = $field.serializeArray();
		
		$data.push({name: 'csrf_token', value: document.querySelector('[data-csrf]')?.dataset.csrf });
		$data.push({name: 'key', value: $key });
		$data.push({name: 'update', value: 1 });
		
    
		$.post("ajax_form.php?module="+$module+"&backend_module="+$backend_module+"&id="+$id+"&action=quick", $data, function(data){
			data = $.trim(data);
			if (data != '0' && data != '1') return;
		
			$field.val(data);
		
			if (data == '1'){
				$icon.text('toggle_on').removeClass('md-grey');
			} else {
				$icon.text('toggle_off').addClass('md-grey');
			}
		
			if ($key == 'quick[c_active]'){
				var active = data == '1';
		
				$row.toggleClass('inactive', !active);
		
				$row.parent().find('.table-row[data-id-module="'+$id+'"]').each(function(){
					var $variant_row = $(this);
					var $variant_toggle = $variant_row.find('.quick-checkbox.c_active .quick-checkbox-toggle').first();
					var $variant_field = $variant_toggle.find('.field');
					var $variant_icon = $variant_toggle.find('i');
		
					$variant_row.toggleClass('inactive', !active);
					$variant_field.val(data);
		
					if (active){
						$variant_icon.text('toggle_on').removeClass('md-grey');
					} else {
						$variant_icon.text('toggle_off').addClass('md-grey');
					}
				});
			}
		});
		
	});
	
}
