xref: /webtrees/index.php (revision 5bc7b36708d272081ffd2df5658ddf12275447dd)
1<?php
2/**
3 * My Page page allows a logged in user the abilty
4 * to keep bookmarks, see a list of upcoming events, etc.
5 *
6 * webtrees: Web based Family History software
7 * Copyright (C) 2010 webtrees development team.
8 *
9 * Derived from PhpGedView
10 * Copyright (C) 2002 to 2009  PGV Development Team.  All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25 *
26 * @package webtrees
27 * @subpackage Display
28 * @version $Id$
29 */
30
31define('WT_SCRIPT_NAME', 'index.php');
32require './includes/session.php';
33require_once WT_ROOT.'includes/index_cache.php';
34require_once WT_ROOT.'includes/functions/functions_print_facts.php';  //--needed for the expand url function in some of the blocks
35
36if (isset($_REQUEST['action'])) $action = $_REQUEST['action'];
37if (isset($_REQUEST['ctype'])) $ctype = $_REQUEST['ctype'];
38$message_id = safe_GET('message_id');
39$gid = safe_POST("gid");
40$favnote = safe_POST("favnote");
41$favtype = safe_POST("favtype");
42$url = safe_POST("url", WT_REGEX_URL);
43$favtitle = safe_POST("favtitle");
44$fv_id = safe_GET("fv_id");
45$news_id = safe_GET("news_id");
46
47/**
48 * Block definition array
49 *
50 * The following block definition array defines the
51 * blocks that can be used to customize the portals
52 * their names and the function to call them
53 * "name" is the name of the block in the lists
54 * "descr" is a description of this block
55 * "type" the options are "user" or "gedcom" or undefined
56 * - The type determines which lists the block is available in.
57 * - Leaving the type undefined allows it to be on both the user and gedcom portal
58 * @global $WT_BLOCKS
59 */
60
61/**
62 * Load List of Blocks in blocks directory (unchanged)
63 */
64$WT_BLOCKS = array();
65$d = dir("blocks");
66while (false !== ($entry = $d->read())) {
67	if (($entry!=".") && ($entry!="..") && ($entry!="CVS") && (preg_match("/\.php$/", $entry)>0)) {
68		require_once WT_ROOT.'blocks/'.$entry;
69	}
70}
71$d->close();
72/**
73 * End loading list of Blocks in blocks directory
74 *
75 * Load List of Blocks in modules/XX/blocks directories
76 */
77if (file_exists(WT_ROOT.'modules')) {
78	$dir=dir(WT_ROOT.'modules');
79	while (false !== ($entry = $dir->read())) {
80		if (!strstr($entry,".") && ($entry!="..") && ($entry!="CVS")&& !strstr($entry, "svn")) {
81			$path = WT_ROOT.'modules/' . $entry.'/blocks';
82			if (is_readable($path)) {
83				$d=dir($path);
84				while (false !== ($entry = $d->read())) {
85					if (($entry!=".") && ($entry!="..") && ($entry!="CVS")&& !strstr($entry, "svn")&&(preg_match("/\.php$/", $entry)>0)) {
86						$p=$path.'/'.$entry;
87						require_once $p;
88					}
89				}
90			}
91		}
92	}
93}
94/**
95 * End loading list of Blocks in modules/XX/blocks directories
96*/
97
98$time = client_time();
99
100if (!isset($action)) $action="";
101
102// Visitors should see any links to a user page, but they may be
103// following a link after an inactivity logout.
104if (!WT_USER_ID) {
105	if (!empty($ctype) && $ctype=='user') {
106		header('Location: login.php&url=index.php?ctype=user');
107		exit;
108	} else {
109		$ctype = 'gedcom';
110	}
111}
112
113if (empty($ctype)) {
114	if ($PAGE_AFTER_LOGIN == 'welcome') $ctype = 'gedcom';
115	else $ctype = 'user';
116}
117
118if (WT_USER_ID) {
119	//-- add favorites action
120	if ($action=="addfav" && !empty($gid)) {
121		$gid = strtoupper($gid);
122		$indirec = find_gedcom_record($gid, WT_GED_ID);
123		$ct = preg_match("/0 @(.*)@ (.*)/", $indirec, $match);
124		if ($indirec && $ct>0) {
125			$favorite = array();
126			if (empty($favtype)) {
127				if ($ctype=="user") $favtype = "user";
128				else $favtype = "gedcom";
129			}
130			if ($favtype=="gedcom") {
131				$favtype = $GEDCOM;
132				$_SESSION['clearcache'] = true;
133			}
134			else $favtype=WT_USER_NAME;
135			$favorite["username"] = $favtype;
136			$favorite["gid"] = $gid;
137			$favorite["type"] = trim($match[2]);
138			$favorite["file"] = $GEDCOM;
139			$favorite["url"] = "";
140			$favorite["note"] = $favnote;
141			$favorite["title"] = "";
142			addFavorite($favorite);
143		}
144	}
145	if (($action=="addfav")&&(!empty($url))) {
146		if (empty($favtitle)) $favtitle = $url;
147		$favorite = array();
148		if (!isset($favtype)) {
149			if ($ctype=="user") $favtype = "user";
150			else $favtype = "gedcom";
151		}
152		if ($favtype=="gedcom") {
153			$favtype = $GEDCOM;
154			$_SESSION['clearcache'] = true;
155		}
156		else $favtype=WT_USER_NAME;
157		$favorite["username"] = $favtype;
158		$favorite["gid"] = "";
159		$favorite["type"] = "URL";
160		$favorite["file"] = $GEDCOM;
161		$favorite["url"] = $url;
162		$favorite["note"] = $favnote;
163		$favorite["title"] = $favtitle;
164		addFavorite($favorite);
165	}
166	if (($action=="deletefav")&&(!empty($fv_id))) {
167		deleteFavorite($fv_id);
168		if ($ctype=="gedcom") $_SESSION['clearcache'] = true;
169	}
170	else if ($action=="deletemessage") {
171		if (isset($message_id)) {
172			if (!is_array($message_id)) deleteMessage($message_id);
173			else {
174				foreach($message_id as $indexval => $mid) {
175					if (isset($mid)) deleteMessage($mid);
176				}
177			}
178			if ($ctype=="gedcom") $_SESSION['clearcache'] = true;
179		}
180	}
181	else if (($action=="deletenews")&&(isset($news_id))) {
182		deleteNews($news_id);
183		if ($ctype=="gedcom") $_SESSION['clearcache'] = true;
184	}
185}
186
187//-- get the blocks list
188if ($ctype=="user") {
189	$ublocks = getBlocks(WT_USER_NAME);
190	if ((count($ublocks["main"])==0) && (count($ublocks["right"])==0)) {
191		$ublocks["main"][] = array("print_todays_events", "");
192		$ublocks["main"][] = array("print_user_messages", "");
193		$ublocks["main"][] = array("print_user_favorites", "");
194
195		$ublocks["right"][] = array("print_welcome_block", "");
196		$ublocks["right"][] = array("print_random_media", "");
197		$ublocks["right"][] = array("print_upcoming_events", "");
198		$ublocks["right"][] = array("print_logged_in_users", "");
199	}
200}
201else {
202	$ublocks = getBlocks($GEDCOM);
203	if ((count($ublocks["main"])==0) && (count($ublocks["right"])==0)) {
204		$ublocks["main"][] = array("print_gedcom_stats", "");
205		$ublocks["main"][] = array("print_gedcom_news", "");
206		$ublocks["main"][] = array("print_gedcom_favorites", "");
207		$ublocks["main"][] = array("review_changes_block", "");
208
209		$ublocks["right"][] = array("print_gedcom_block", "");
210		$ublocks["right"][] = array("print_random_media", "");
211		$ublocks["right"][] = array("print_todays_events", "");
212		$ublocks["right"][] = array("print_logged_in_users", "");
213	}
214}
215
216//-- Set some behaviour controls that depend on which blocks are selected
217$welcome_block_present = false;
218$gedcom_block_present = false;
219$top10_block_present = false;
220$login_block_present = false;
221foreach($ublocks["right"] as $block) {
222	if ($block[0]=="print_welcome_block") $welcome_block_present = true;
223	if ($block[0]=="print_gedcom_block") $gedcom_block_present = true;
224	if ($block[0]=="print_block_name_top10") $top10_block_present = true;
225	if ($block[0]=="print_login_block") $login_block_present = true;
226}
227foreach($ublocks["main"] as $block) {
228	if ($block[0]=="print_welcome_block") $welcome_block_present = true;
229	if ($block[0]=="print_gedcom_block") $gedcom_block_present = true;
230	if ($block[0]=="print_block_name_top10") $top10_block_present = true;
231	if ($block[0]=="print_login_block") $login_block_present = true;
232}
233
234//-- clear the GEDCOM cache files
235if (!empty($_SESSION['clearcache'])) {
236	$_SESSION['clearcache'] = false;
237	clearCache();
238}
239
240// We have finished writing to $_SESSION, so release the lock
241session_write_close();
242
243//-- handle block AJAX calls
244/**
245 * In order for a block to make an AJAX call the following request parameters must be set
246 * block = the method name of the block to call (e.g. 'print_random_media')
247 * side = the side of the page the block is on (e.g. 'main' or 'right')
248 * bindex = the number of the block on that side, first block = 0
249 */
250if ($action=="ajax") {
251	header('Content-Type: text/html; charset=UTF-8');
252	//--  if a block wasn't sent then exit with nothing
253	if (!isset($_REQUEST['block'])) {
254		print "Block not sent";
255		exit;
256	}
257	$block = $_REQUEST['block'];
258	//-- set which side the block is on
259	$side = "main";
260	if (isset($_REQUEST['side'])) $side = $_REQUEST['side'];
261	//-- get the block number
262	if (isset($_REQUEST['bindex'])) {
263		if (isset($ublocks[$side][$_REQUEST['bindex']])) {
264			$blockval = $ublocks[$side][$_REQUEST['bindex']];
265			if ($blockval[0]==$block && array_key_exists($blockval[0], $WT_BLOCKS)) {
266				if ($side=="main") {
267					$param1 = "false";
268				} else {
269					$param1 = "true";
270				}
271				if (array_key_exists($blockval[0], $WT_BLOCKS) && !loadCachedBlock($blockval, $side.$_REQUEST['bindex'])) {
272					ob_start();
273					eval($blockval[0]."($param1, \$blockval[1], \"$side\", ".$_REQUEST['bindex'].");");
274					$content = ob_get_contents();
275					saveCachedBlock($blockval, $side.$_REQUEST['bindex'], $content);
276					ob_end_flush();
277				}
278				if (WT_DEBUG) {
279					echo execution_stats();
280				}
281				if (WT_DEBUG_SQL) {
282					echo WT_DB::getQueryLog();
283				}
284				exit;
285			}
286		}
287	}
288
289	//-- not sure which block to call so call the first one we find
290	foreach($ublocks["main"] as $bindex=>$blockval) {
291		if ($blockval[0]==$block && array_key_exists($blockval[0], $WT_BLOCKS)) {
292			eval($blockval[0]."(false, \$blockval[1], \"main\", $bindex);");
293		}
294	}
295	foreach($ublocks["right"] as $bindex=>$blockval) {
296		if ($blockval[0]==$block && array_key_exists($blockval[0], $WT_BLOCKS)) {
297			eval($blockval[0]."(true, \$blockval[1], \"right\", $bindex);");
298		}
299	}
300	exit;
301}
302//-- end of ajax call handler
303
304if ($ctype=="user") {
305	$helpindex = "index_myged_help";
306	print_header(i18n::translate('My Page'));
307} else {
308	print_header(get_gedcom_setting(WT_GED_ID, 'title'));
309}
310
311if (WT_USE_LIGHTBOX) {
312	require WT_ROOT.'modules/lightbox/lb_defaultconfig.php';
313	require WT_ROOT.'modules/lightbox/functions/lb_call_js.php';
314}
315
316echo WT_JS_START;
317?>
318	function refreshpage() {
319		window.location = 'index.php?ctype=<?php print $ctype; ?>';
320	}
321	function addnews(uname) {
322		window.open('editnews.php?username='+uname, '_blank', 'top=50,left=50,width=600,height=500,resizable=1,scrollbars=1');
323	}
324	function editnews(news_id) {
325		window.open('editnews.php?news_id='+news_id, '_blank', 'top=50,left=50,width=600,height=500,resizable=1,scrollbars=1');
326	}
327	var pastefield;
328	function paste_id(value) {
329		pastefield.value=value;
330	}
331/**
332 * blocks may use this JS function to update themselves using AJAX technology
333 * @param string targetId	the id of the block to target the results too
334 * @param string block 	the method name of the block to call (e.g. 'print_random_media')
335 * @param string side 	the side of the page the block is on (e.g. 'main' or 'right')
336 * @param int bindex 	the number of the block on that side, first block = 0
337 * @param string ctype 	shows whether block is on Welcome or My Page ('gedcom' or 'user')
338 * @param boolean loading  Whether or not to show the loading message
339 */
340	function ajaxBlock(targetId, block, side, bindex, ctype, loading) {
341		target = document.getElementById(targetId);
342		if (!target) return false;
343
344		target.style.height = (target.offsetHeight) + "px";
345		if (loading) target.innerHTML = "<br /><br /><?php print i18n::translate('Loading...'); ?><br /><br />";
346
347		var oXmlHttp = createXMLHttp();
348		link = "index.php?action=ajax&block="+block+"&side="+side+"&bindex="+bindex+"&ctype="+ctype;
349		oXmlHttp.open("get", link, true);
350		oXmlHttp.onreadystatechange=function()
351		{
352			if (oXmlHttp.readyState==4)
353 			{
354 				target.innerHTML = oXmlHttp.responseText;
355 				target.style.height = 'auto';
356 			}
357		};
358 		oXmlHttp.send(null);
359 		return false;
360	}
361<?php
362echo WT_JS_END;
363//-- start of main content section
364print "<table width=\"100%\"><tr><td>";		// This is needed so that page footers print in the right place
365if ($ctype=="user") {
366	print "<div align=\"center\" style=\"width: 99%;\">";
367	print "<h1>".i18n::translate('My Page')."</h1>";
368	print i18n::translate('My Page allows you to keep bookmarks of your favorite people, track upcoming events, and collaborate with other webtrees users.');
369	print "<br /><br /></div>";
370}
371if (count($ublocks["main"])!=0) {
372	if (count($ublocks["right"])!=0) {
373		print "<div id=\"index_main_blocks\">";
374	} else {
375		print "<div id=\"index_full_blocks\">";
376	}
377	echo '<script src="js/jquery/jquery.min.js" type="text/javascript"></script>';
378	echo '<script type="text/javascript">jQuery.noConflict();</script>';
379	foreach($ublocks["main"] as $bindex=>$block) {
380		if (WT_DEBUG) {
381			echo execution_stats();
382		}
383		if (array_key_exists($block[0], $WT_BLOCKS) && !loadCachedBlock($block, "main".$bindex)) {
384			$url="index.php?action=ajax&block={$block[0]}&side=main&bindex={$bindex}&ctype={$ctype}";
385			if ($SEARCH_SPIDER || WT_DEBUG) {
386				// Search spiders get the blocks directly
387				ob_start();
388				eval($block[0]."(false, \$block[1], \"main\", $bindex);");
389				$content = ob_get_contents();
390				$temp = $SEARCH_SPIDER;
391				$SEARCH_SPIDER = false;
392				saveCachedBlock($block, "main".$bindex, $content);
393				$SEARCH_SPIDER = $temp;
394				ob_end_flush();
395			} else {
396				// Interactive users get the blocks via ajax
397				echo '<div id="block_main_', $bindex, '"><img src="images/loading.gif" alt="', htmlspecialchars(i18n::translate('Loading...')),  '"/></div>';
398				echo WT_JS_START, "jQuery('#block_main_{$bindex}').load('{$url}');", WT_JS_END;
399			}
400		}
401	}
402	print "</div>";
403}
404//-- end of main content section
405
406//-- start of blocks section
407if (count($ublocks["right"])!=0) {
408	if (count($ublocks["main"])!=0) {
409		print "<div id=\"index_small_blocks\">";
410	} else {
411		print "<div id=\"index_full_blocks\">";
412	}
413	foreach($ublocks["right"] as $bindex=>$block) {
414		if (WT_DEBUG) {
415			echo execution_stats();
416		}
417		if (array_key_exists($block[0], $WT_BLOCKS) && !loadCachedBlock($block, "right".$bindex)) {
418			$url="index.php?action=ajax&block={$block[0]}&side=right&bindex={$bindex}&ctype={$ctype}";
419			if ($SEARCH_SPIDER || WT_DEBUG) {
420				// Search spiders get the blocks directly
421				ob_start();
422				eval($block[0]."(true, \$block[1], \"right\", $bindex);");
423				$content = ob_get_contents();
424				saveCachedBlock($block, "right".$bindex, $content);
425				ob_end_flush();
426			} else {
427				// Interactive users get the blocks via ajax
428				echo '<div id="block_right_', $bindex, '"><img src="images/loading.gif" alt="', htmlspecialchars(i18n::translate('Loading...')),  '"/></div>';
429				echo WT_JS_START, "jQuery('#block_right_{$bindex}').load('{$url}');", WT_JS_END;
430			}
431		}
432	}
433	print "</div>";
434}
435//-- end of blocks section
436
437print "</td></tr></table><br />";		// Close off that table
438
439if ($ctype=="user" && !$welcome_block_present) {
440	print "<div align=\"center\" style=\"width: 99%;\">";
441	print "<a href=\"javascript:;\" onclick=\"window.open('index_edit.php?name=".WT_USER_NAME."&ctype=user', '_blank', 'top=50,left=10,width=600,height=500,scrollbars=1,resizable=1');\">".i18n::translate('Customize My Page')."</a>";
442	echo help_link('mygedview_customize');
443	print "</div>";
444}
445if ($ctype=="gedcom" && !$gedcom_block_present) {
446	if (WT_USER_IS_ADMIN) {
447		print "<div align=\"center\" style=\"width: 99%;\">";
448		print "<a href=\"javascript:;\" onclick=\"window.open('".encode_url("index_edit.php?name={$GEDCOM}&ctype=gedcom", false)."', '_blank', 'top=50,left=10,width=600,height=500,scrollbars=1,resizable=1');\">".i18n::translate('Customize this GEDCOM Home Page')."</a>";
449		print "</div>";
450	}
451}
452
453print_footer();
454?>
455