<?php
/**
 * webtrees: online genealogy
 * Copyright (C) 2016 webtrees development team
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
namespace Fisharebest\Webtrees;

/**
 * Defined in session.php
 *
 * @global Tree $WT_TREE
 */
global $WT_TREE;

use Fisharebest\Webtrees\Controller\PageController;
use Fisharebest\Webtrees\Functions\FunctionsDb;

define('WT_SCRIPT_NAME', 'index_edit.php');
require './includes/session.php';

$controller = new PageController;

// Only one of $user_id and $gedcom_id should be set
$user_id   = Filter::get('user_id', WT_REGEX_INTEGER, Filter::post('user_id', WT_REGEX_INTEGER));
$gedcom_id = Filter::get('gedcom_id', WT_REGEX_INTEGER, Filter::post('gedcom_id', WT_REGEX_INTEGER));
if ($user_id) {
	$gedcom_id = null;
	if ($user_id < 0) {
		$controller->setPageTitle(I18N::translate('Set the default blocks for new users'));
		$can_reset = false;
	} else {
		$controller->setPageTitle(I18N::translate('Change the “My page” blocks'));
		$can_reset = true;
	}
} else {
	if ($gedcom_id < 0) {
		$controller->setPageTitle(I18N::translate('Set the default blocks for new family trees'));
		$can_reset = false;
	} else {
		$controller->setPageTitle(I18N::translate('Change the “Home page” blocks'));
		$can_reset = true;
	}
}

// Only an admin can edit the "default" page
// Only managers can edit the "home page"
// Only a user or an admin can edit a user’s "my page"
if (
	$gedcom_id < 0 && !Auth::isAdmin() ||
	$gedcom_id > 0 && !Auth::isManager(Tree::findById($gedcom_id)) ||
	$user_id && Auth::id() != $user_id && !Auth::isAdmin()
) {
	header('Location: ' . WT_BASE_URL);

	return;
}

$action = Filter::get('action');

if ($can_reset && Filter::post('default') === '1') {
	if ($user_id) {
		$defaults = FunctionsDb::getUserBlocks(-1);
	} else {
		$defaults = FunctionsDb::getTreeBlocks(-1);
	}
	$main  = $defaults['main'];
	$right = $defaults['side'];
} else {
	if (isset($_REQUEST['main'])) {
		$main = $_REQUEST['main'];
	} else {
		$main = array();
	}

	if (isset($_REQUEST['right'])) {
		$right = $_REQUEST['right'];
	} else {
		$right = array();
	}
}
// Define all the icons we're going to use
$IconUarrow = 'icon-uarrow';
$IconDarrow = 'icon-darrow';
if (I18N::direction() === 'ltr') {
	$IconRarrow  = 'icon-rarrow';
	$IconLarrow  = 'icon-larrow';
	$IconRDarrow = 'icon-rdarrow';
	$IconLDarrow = 'icon-ldarrow';
} else {
	$IconRarrow  = 'icon-larrow';
	$IconLarrow  = 'icon-rarrow';
	$IconRDarrow = 'icon-ldarrow';
	$IconLDarrow = 'icon-rdarrow';
}

$all_blocks = array();
foreach (Module::getActiveBlocks($WT_TREE) as $name => $block) {
	if ($user_id && $block->isUserBlock() || $gedcom_id && $block->isGedcomBlock()) {
		$all_blocks[$name] = $block;
	}
}

if ($user_id) {
	$blocks = FunctionsDb::getUserBlocks($user_id);
} else {
	$blocks = FunctionsDb::getTreeBlocks($gedcom_id);
}

if ($action === 'update') {
	foreach (array('main', 'side') as $location) {
		if ($location === 'main') {
			$new_blocks = $main;
		} else {
			$new_blocks = $right;
		}
		foreach ($new_blocks as $order => $block_name) {
			if (is_numeric($block_name)) {
				// existing block
				Database::prepare("UPDATE `##block` SET block_order=? WHERE block_id=?")->execute(array($order, $block_name));
				// existing block moved location
				Database::prepare("UPDATE `##block` SET location=? WHERE block_id=?")->execute(array($location, $block_name));
			} else {
				// new block
				if ($user_id) {
					Database::prepare("INSERT INTO `##block` (user_id, location, block_order, module_name) VALUES (?, ?, ?, ?)")->execute(array($user_id, $location, $order, $block_name));
				} else {
					Database::prepare("INSERT INTO `##block` (gedcom_id, location, block_order, module_name) VALUES (?, ?, ?, ?)")->execute(array($gedcom_id, $location, $order, $block_name));
				}
			}
		}
		// deleted blocks
		foreach ($blocks[$location] as $block_id => $block_name) {
			if (!in_array($block_id, $main) && !in_array($block_id, $right)) {
				Database::prepare("DELETE FROM `##block_setting` WHERE block_id=?")->execute(array($block_id));
				Database::prepare("DELETE FROM `##block`         WHERE block_id=?")->execute(array($block_id));
			}
		}
	}
	if ($user_id) {
		header('Location: ' . WT_BASE_URL . 'index.php?ctype=user&ged=' . $WT_TREE->getNameUrl());
	} else {
		header('Location: ' . WT_BASE_URL . 'index.php?ctype=gedcom&ged=' . $WT_TREE->getNameUrl());
	}

	return;
}

$controller
	->pageHeader()
	->addInlineJavascript('
	/**
	 * Move Up Block Javascript function
	 *
	 * This function moves the selected option up in the given select list
	 *
	 * @param String section_name the name of the select to move the options
	 */
	function move_up_block(section_name) {
		section_select = document.getElementById(section_name);
		if (section_select) {
			if (section_select.selectedIndex <= 0) return false;
			index = section_select.selectedIndex;
			temp = new Option(section_select.options[index-1].text, section_select.options[index-1].value);
			section_select.options[index-1] = new Option(section_select.options[index].text, section_select.options[index].value);
			section_select.options[index] = temp;
			section_select.selectedIndex = index-1;
		}
	}

	/**
	 * Move Down Block Javascript function
	 *
	 * This function moves the selected option down in the given select list
	 *
	 * @param String section_name the name of the select to move the options
	 */
	function move_down_block(section_name) {
		section_select = document.getElementById(section_name);
		if (section_select) {
			if (section_select.selectedIndex < 0) return false;
			if (section_select.selectedIndex >= section_select.length-1) return false;
			index = section_select.selectedIndex;
			temp = new Option(section_select.options[index+1].text, section_select.options[index+1].value);
			section_select.options[index+1] = new Option(section_select.options[index].text, section_select.options[index].value);
			section_select.options[index] = temp;
			section_select.selectedIndex = index+1;
		}
	}

	/**
	 * Move Block from one column to the other Javascript function
	 *
	 * This function moves the selected option down in the given select list
	 *
	 * @param String from_column the name of the select to move the option from
	 * @param String to_column the name of the select to remove the option to
	 */
	function move_left_right_block(from_column, to_column) {
		to_select = document.getElementById(to_column);
		from_select = document.getElementById(from_column);
		instruct = document.getElementById("instructions");
		if ((to_select) && (from_select)) {
			add_option = from_select.options[from_select.selectedIndex];
			if (to_column != "available_select") {
				to_select.options[to_select.length] = new Option(add_option.text, add_option.value);
			}
			if (from_column != "available_select") {
				from_select.options[from_select.selectedIndex] = null; //remove from list
			}
		}
	}
	/**
	 * Select Options Javascript function
	 *
	 * This function selects all the options in the multiple select lists
	 */
	function select_options() {
		section_select = document.getElementById("main_select");
		if (section_select) {
			for (i=0; i<section_select.length; i++) {
				section_select.options[i].selected=true;
			}
		}
		section_select = document.getElementById("right_select");
		if (section_select) {
			for (i=0; i<section_select.length; i++) {
				section_select.options[i].selected=true;
			}
		}
		return true;
	}

	/**
	 * Show Block Description Javascript function
	 *
	 * This function shows a description for the selected option
	 *
	 * @param String list_name the name of the select to get the option from
	 */
	function show_description(list_name) {
		list_select = document.getElementById(list_name);
		instruct = document.getElementById("instructions");
		if (block_descr[list_select.options[list_select.selectedIndex].value] && instruct) {
			instruct.innerHTML = block_descr[list_select.options[list_select.selectedIndex].value];
		} else {
			instruct.innerHTML = block_descr["advice1"];
		}
		list1 = document.getElementById("main_select");
		list2 = document.getElementById("available_select");
		list3 = document.getElementById("right_select");
		if (list_name=="main_select") {
			list2.selectedIndex = -1;
			list3.selectedIndex = -1;
		}
		if (list_name=="available_select") {
			list1.selectedIndex = -1;
			list3.selectedIndex = -1;
		}
		if (list_name=="right_select") {
			list1.selectedIndex = -1;
			list2.selectedIndex = -1;
		}
	}
	var block_descr = new Array();
	');

	// Load Block Description array for use by javascript
	foreach ($all_blocks as $block_name => $block) {
		$controller->addInlineJavascript(
			'block_descr["' . $block_name . '"] = "' . Filter::escapeJs($block->getDescription()) . '";'
		);
	}
	$controller->addInlineJavascript(
		'block_descr["advice1"] = "' . I18N::translate('Select a block and use the arrows to move it.') . '";'
	);
?>

<h2><?php echo $controller->getPageTitle(); ?></h2>

<form name="config_setup" method="post" action="index_edit.php?action=update" onsubmit="select_options();" >
	<input type="hidden" name="user_id"   value="<?php echo $user_id; ?>">
	<input type="hidden" name="gedcom_id" value="<?php echo $gedcom_id; ?>">
	<table border="1" id="change_blocks">
		<tr>
	<?php
	// NOTE: Row 1: Column legends
		echo '<td class="descriptionbox center vmiddle" colspan="2">';
			echo '<b>', I18N::translate('Main section blocks'), '</b>';
		echo '</td>';
		echo '<td class="descriptionbox center vmiddle" colspan="3">';
			echo '<b>', I18N::translate('Available blocks'), '</b>';
		echo '</td>';
		echo '<td class="descriptionbox center vmiddle" colspan="2">';
			echo '<b>', I18N::translate('Right section blocks'), '</b>';
		echo '</td>';
	echo '</tr>';
	echo '<tr>';
	// NOTE: Row 2 column 1: Up/Down buttons for left (main) block list
	echo '<td class="optionbox center vmiddle">';
		echo '<a onclick="move_up_block(\'main_select\');" title="', I18N::translate('Move up'), '"class="', $IconUarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_down_block(\'main_select\');" title="', I18N::translate('Move down'), '"class="', $IconDarrow, '"></a>';
		echo '<br><br>';
	echo '</td>';
	// NOTE: Row 2 column 2: Left (Main) block list
	echo '<td class="optionbox center">';
		echo '<select multiple="multiple" id="main_select" name="main[]" size="10" onchange="show_description(\'main_select\');">';
		foreach ($blocks['main'] as $block_id => $block_name) {
			echo '<option value="', $block_id, '">', $all_blocks[$block_name]->getTitle(), '</option>';
		}
		echo '</select>';
	echo '</td>';
	// NOTE: Row 2 column 3: Left/Right buttons for left (main) block list
	echo '<td class="optionbox center vmiddle">';
		echo '<a onclick="move_left_right_block(\'main_select\', \'right_select\');" title="', I18N::translate('Move right'), '"class="', $IconRDarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_left_right_block(\'main_select\', \'available_select\');" title="', I18N::translate('Remove'), '"class="', $IconRarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_left_right_block(\'available_select\', \'main_select\');" title="', I18N::translate('Add'), '"class="', $IconLarrow, '"></a>';
		echo '<br><br>';
	echo '</td>';
	// Row 2 column 4: Middle (Available) block list
	echo '<td class="optionbox center">';
		echo '<select id="available_select" name="available[]" size="10" onchange="show_description(\'available_select\');">';
		foreach ($all_blocks as $block_name => $block) {
			echo '<option value="', $block_name, '">', $block->getTitle(), '</option>';
		}
		echo '</select>';
	echo '</td>';
	// NOTE: Row 2 column 5: Left/Right buttons for right block list
	echo '<td class="optionbox center vmiddle">';
		echo '<a onclick="move_left_right_block(\'right_select\', \'main_select\');" title="', I18N::translate('Move left'), '"class="', $IconLDarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_left_right_block(\'right_select\', \'available_select\');" title="', I18N::translate('Remove'), '"class="', $IconLarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_left_right_block(\'available_select\', \'right_select\');" title="', I18N::translate('Add'), '"class="', $IconRarrow, '"></a>';
		echo '<br><br>';
	echo '</td>';
	// NOTE: Row 2 column 6: Right block list
	echo '<td class="optionbox center">';
		echo '<select multiple="multiple" id="right_select" name="right[]" size="10" onchange="show_description(\'right_select\');">';
		foreach ($blocks['side'] as $block_id => $block_name) {
			echo '<option value="', $block_id, '">', $all_blocks[$block_name]->getTitle(), '</option>';
		}
		echo '</select>';
	echo '</td>';
	// NOTE: Row 2 column 7: Up/Down buttons for right block list
	echo '<td class="optionbox center vmiddle">';
		echo '<a onclick="move_up_block(\'right_select\');" title="', I18N::translate('Move up'), '"class="', $IconUarrow, '"></a>';
		echo '<br>';
		echo '<a onclick="move_down_block(\'right_select\');" title="', I18N::translate('Move down'), '"class="', $IconDarrow, '"></a>';
		echo '<br><br>';
	echo '</td>';
	echo '</tr>';
	// NOTE: Row 3 columns 1-7: Summary description of currently selected block
	echo '<tr><td class="descriptionbox wrap" colspan="7"><div id="instructions">';
	echo I18N::translate('Select a block and use the arrows to move it.');
	echo '</div></td></tr>';
	if ($can_reset) {
		echo '<tr><td class="topbottombar" colspan="4">';
		echo '<input type="checkbox" name="default" value="1">', I18N::translate('Restore the default block layout'), '</td>';
		echo '<td class="topbottombar" colspan="3">';
	} else {
		echo '<td class="topbottombar" colspan="7">';
	}
	echo '<input type="submit" value="', I18N::translate('save'), '">';
	echo '</td></tr></table>';
	echo '</form>';
