isAdmin() || $user->getUserId() == $tag->id_user_owner))
			throw new NotAllowedException();
		// Adding an tag?
		if (isset($_GET['add']))
		{
			parent::__construct('Add a new tag');
			$form_title = 'Add a new tag';
			$this->page->addClass('edittag');
		}
		// Deleting one?
		elseif (isset($_GET['delete']))
		{
			// So far so good?
			if (Session::validateSession('get') && $tag->kind !== 'Album' && $tag->delete())
			{
				header('Location: ' . BASEURL . '/managetags/');
				exit;
			}
			else
				trigger_error('Cannot delete tag: an error occured while processing the request.', E_USER_ERROR);
		}
		// Editing one, then, surely.
		else
		{
			if ($tag->kind === 'Album')
				trigger_error('Cannot edit tag: is actually an album.', E_USER_ERROR);
			parent::__construct('Edit tag \'' . $tag->tag . '\'');
			$form_title = 'Edit tag \'' . $tag->tag . '\'';
			$this->page->addClass('edittag');
		}
		// Session checking!
		if (empty($_POST))
			Session::resetSessionToken();
		else
			Session::validateSession();
		if ($id_tag)
			$after_form = 'Delete tag';
		elseif (!$id_tag)
			$after_form = '';
		$fields = [
			'kind' => [
				'type' => 'select',
				'label' => 'Kind of tag',
				'options' => [
					'Location' => 'Location',
					'Person' => 'Person',
				],
			],
			'id_user_owner' => [
				'type' => 'select',
				'label' => 'Owner',
				'options' => [0 => '(nobody)'] + Member::getMemberMap(),
			],
			'tag' => [
				'type' => 'text',
				'label' => 'Tag title',
				'size' => 50,
				'maxlength' => 255,
			],
			'slug' => [
				'type' => 'text',
				'label' => 'URL slug',
				'size' => 50,
				'maxlength' => 255,
			],
			'description' => [
				'type' => 'textbox',
				'label' => 'Description',
				'size' => 50,
				'maxlength' => 255,
				'is_optional' => true,
			],
		];
		if (!$user->isAdmin())
		{
			unset($fields['kind']);
			unset($fields['id_user_owner']);
		}
		$form = new Form([
			'request_url' => BASEURL . '/edittag/?' . ($id_tag ? 'id=' . $id_tag : 'add'),
			'content_below' => $after_form,
			'fields' => $fields,
		]);
		// Create the form, add in default values.
		$form->setData($id_tag ? get_object_vars($tag) : $_POST);
		$formview = new FormView($form, $form_title ?? '');
		$this->page->adopt($formview);
		if (!empty($id_tag))
		{
			list($assets, $num_assets) = AssetIterator::getByOptions([
				'direction' => 'desc',
				'limit' => 500,
				'id_tag' => $id_tag,
			], true);
			$this->page->adopt(new FeaturedThumbnailManager($assets, $id_tag ? $tag->id_asset_thumb : 0));
		}
		if (isset($_POST['changeThumbnail']))
			$this->processThumbnail($tag);
		elseif (!empty($_POST))
			$this->processTagDetails($form, $id_tag, $tag);
	}
	private function processThumbnail($tag)
	{
		if (empty($_POST))
			return;
		$tag->id_asset_thumb = $_POST['featuredThumbnail'];
		$tag->save();
		header('Location: ' . BASEURL . '/edittag/?id=' . $tag->id_tag);
		exit;
	}
	private function processTagDetails($form, $id_tag, $tag)
	{
		if (!empty($_POST))
		{
			$form->verify($_POST);
			// Anything missing?
			if (!empty($form->getMissing()))
				return $formview->adopt(new Alert('Some data missing', 'Please fill out the following fields: ' . implode(', ', $form->getMissing()), 'danger'));
			$data = $form->getData();
			$data['id_parent'] = 0;
			// Quick stripping.
			$data['slug'] = strtr($data['slug'], [' ' => '-', '--' => '-', '&' => 'and', '=>' => '', "'" => "", ":"=> "", '/' => '-', '\\' => '-']);
			// Creating a new tag?
			if (!$id_tag)
			{
				$return = Tag::createNew($data);
				if ($return === false)
					return $formview->adopt(new Alert('Cannot create this tag', 'Something went wrong while creating the tag...', 'danger'));
				if (isset($_POST['submit_and_new']))
				{
					header('Location: ' . BASEURL . '/edittag/?add');
					exit;
				}
			}
			// Just updating?
			else
			{
				foreach ($data as $key => $value)
					$tag->$key = $value;
				$tag->save();
			}
			// Redirect to the tag management page.
			header('Location: ' . BASEURL . '/managetags/');
			exit;
		}
	}
}