1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16namespace Fisharebest\Webtrees;
17
18/**
19 * Defined in session.php
20 *
21 * @global Tree $WT_TREE
22 */
23global $WT_TREE;
24
25use Fisharebest\Webtrees\Controller\SourceController;
26use Fisharebest\Webtrees\Functions\FunctionsPrint;
27use Fisharebest\Webtrees\Functions\FunctionsPrintFacts;
28use Fisharebest\Webtrees\Functions\FunctionsPrintLists;
29
30define('WT_SCRIPT_NAME', 'source.php');
31require './includes/session.php';
32
33$record     = Source::getInstance(Filter::get('sid', WT_REGEX_XREF), $WT_TREE);
34$controller = new SourceController($record);
35
36if ($controller->record && $controller->record->canShow()) {
37    if ($controller->record->isPendingDeletion()) {
38        if (Auth::isModerator($controller->record->getTree())) {
39            FlashMessages::addMessage(/* I18N: %1$s is “accept”, %2$s is “reject”. These are links. */ I18N::translate(
40                'This source has been deleted. You should review the deletion and then %1$s or %2$s it.',
41                '<a href="#" onclick="accept_changes(\'' . $controller->record->getXref() . '\');">' . I18N::translateContext('You should review the deletion and then accept or reject it.', 'accept') . '</a>',
42                '<a href="#" onclick="reject_changes(\'' . $controller->record->getXref() . '\');">' . I18N::translateContext('You should review the deletion and then accept or reject it.', 'reject') . '</a>'
43            ) . ' ' . FunctionsPrint::helpLink('pending_changes'), 'warning');
44        } elseif (Auth::isEditor($controller->record->getTree())) {
45            FlashMessages::addMessage(I18N::translate('This source has been deleted. The deletion will need to be reviewed by a moderator.') . ' ' . FunctionsPrint::helpLink('pending_changes'), 'warning');
46        }
47    } elseif ($controller->record->isPendingAddtion()) {
48        if (Auth::isModerator($controller->record->getTree())) {
49            FlashMessages::addMessage(/* I18N: %1$s is “accept”, %2$s is “reject”. These are links. */ I18N::translate(
50                'This source has been edited. You should review the changes and then %1$s or %2$s them.',
51                '<a href="#" onclick="accept_changes(\'' . $controller->record->getXref() . '\');">' . I18N::translateContext('You should review the changes and then accept or reject them.', 'accept') . '</a>',
52                '<a href="#" onclick="reject_changes(\'' . $controller->record->getXref() . '\');">' . I18N::translateContext('You should review the changes and then accept or reject them.', 'reject') . '</a>'
53            ) . ' ' . FunctionsPrint::helpLink('pending_changes'), 'warning');
54        } elseif (Auth::isEditor($controller->record->getTree())) {
55            FlashMessages::addMessage(I18N::translate('This source has been edited. The changes need to be reviewed by a moderator.') . ' ' . FunctionsPrint::helpLink('pending_changes'), 'warning');
56        }
57    }
58    $controller->pageHeader();
59} else {
60    FlashMessages::addMessage(I18N::translate('This source does not exist or you do not have permission to view it.'), 'danger');
61    http_response_code(404);
62    $controller->pageHeader();
63
64    return;
65}
66
67$controller->addInlineJavascript('
68	jQuery("#source-tabs")
69		.tabs({
70			create: function(e, ui){
71				jQuery(e.target).css("visibility", "visible");  // prevent FOUC
72			}
73		});
74');
75
76$linked_fam  = $controller->record->linkedFamilies('SOUR');
77$linked_indi = $controller->record->linkedIndividuals('SOUR');
78$linked_note = $controller->record->linkedNotes('SOUR');
79$linked_obje = $controller->record->linkedMedia('SOUR');
80$linked_sour = array();
81
82$facts = $controller->record->getFacts();
83
84usort(
85    $facts,
86    function (Fact $x, Fact $y) {
87        static $order = array(
88            'TITL' => 0,
89            'ABBR' => 1,
90            'AUTH' => 2,
91            'DATA' => 3,
92            'PUBL' => 4,
93            'TEXT' => 5,
94            'NOTE' => 6,
95            'OBJE' => 7,
96            'REFN' => 8,
97            'RIN'  => 9,
98            '_UID' => 10,
99            'CHAN' => 11,
100        );
101
102        return
103            (array_key_exists($x->getTag(), $order) ? $order[$x->getTag()] : PHP_INT_MAX)
104            -
105            (array_key_exists($y->getTag(), $order) ? $order[$y->getTag()] : PHP_INT_MAX);
106    }
107);
108
109?>
110<div id="source-details">
111    <h2>
112        <?php echo $controller->record->getFullName() ?>
113    </h2>
114    <div id="source-tabs">
115        <ul>
116            <li>
117                <a href="#source-edit">
118                    <?php echo I18N::translate('Details') ?>
119                </a>
120            </li>
121            <?php if ($linked_indi): ?>
122            <li>
123                <a href="#linked-individuals">
124                    <?php echo I18N::translate('Individuals') ?>
125                </a>
126            </li>
127            <?php endif; ?>
128            <?php if ($linked_fam): ?>
129            <li>
130                <a href="#linked-families">
131                    <?php echo I18N::translate('Families') ?>
132                </a>
133            </li>
134            <?php endif; ?>
135            <?php if ($linked_obje): ?>
136            <li>
137                <a href="#linked-media">
138                    <?php echo I18N::translate('Media objects') ?>
139                </a>
140            </li>
141            <?php endif; ?>
142            <?php if ($linked_sour): ?>
143            <li>
144                <a href="#linked-sources"><?php echo I18N::translate('Sources') ?></a>
145            </li>
146            <?php endif; ?>
147            <?php if ($linked_note): ?>
148            <li>
149                <a href="#linked-notes"><?php echo I18N::translate('Notes') ?></a>
150            </li>
151            <?php endif; ?>
152        </ul>
153
154        <div id="source-edit">
155            <table class="facts_table">
156                <?php
157                foreach ($facts as $fact) {
158                    FunctionsPrintFacts::printFact($fact, $controller->record);
159                }
160
161                if ($controller->record->canEdit()) {
162                    FunctionsPrint::printAddNewFact($controller->record->getXref(), $facts, 'SOUR');
163                    // new media
164                    if ($controller->record->getTree()->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($WT_TREE)) {
165                        echo '<tr><td class="descriptionbox">';
166                        echo GedcomTag::getLabel('OBJE');
167                        echo '</td><td class="optionbox">';
168                        echo '<a href="#" onclick="window.open(\'addmedia.php?action=showmediaform&amp;linktoid=', $controller->record->getXref(), '\', \'_blank\', edit_window_specs); return false;">', I18N::translate('Add a media object'), '</a>';
169                        echo FunctionsPrint::helpLink('OBJE');
170                        echo '<br>';
171                        echo '<a href="#" onclick="window.open(\'inverselink.php?linktoid=', $controller->record->getXref(), '&amp;linkto=source\', \'_blank\', find_window_specs); return false;">', I18N::translate('Link to an existing media object'), '</a>';
172                        echo '</td></tr>';
173                    }
174                }
175                ?>
176            </table>
177        </div>
178
179        <?php if ($linked_indi): ?>
180            <div id="linked-individuals">
181                <?php echo FunctionsPrintLists::individualTable($linked_indi) ?>
182            </div>
183        <?php endif; ?>
184
185        <?php if ($linked_fam): ?>
186            <div id="linked-families">
187                <?php echo FunctionsPrintLists::familyTable($linked_fam) ?>
188            </div>
189        <?php endif; ?>
190
191        <?php if ($linked_obje): ?>
192            <div id="linked-media">
193                <?php echo FunctionsPrintLists::mediaTable($linked_obje) ?>
194            </div>
195        <?php endif; ?>
196
197        <?php if ($linked_sour): ?>
198            <div id="linked-sources">
199                <?php echo FunctionsPrintLists::sourceTable($linked_sour) ?>
200            </div>
201        <?php endif; ?>
202
203        <?php if ($linked_note): ?>
204            <div id="linked-notes">
205                <?php echo FunctionsPrintLists::noteTable($linked_note) ?>
206            </div>
207        <?php endif; ?>
208    </div>
209</div>
210