Completed
Pull Request — patch_1-1-4 (#3191)
by Emanuele
11:20
created

index.template.php ➔ template_uc_generic_infobox()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 0
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @name      ElkArte Forum
5
 * @copyright ElkArte Forum contributors
6
 * @license   BSD http://opensource.org/licenses/BSD-3-Clause
7
 *
8
 * This file contains code covered by:
9
 * copyright:	2011 Simple Machines (http://www.simplemachines.org)
10
 * license:  	BSD, See included LICENSE.TXT for terms and conditions.
11
 *
12
 * @version 1.1
13
 *
14
 */
15
16
/**
17
 * This template is, perhaps, the most important template in the theme. It
18
 * contains the main template layer that displays the header and footer of
19
 * the forum, namely with body_above and body_below. It also contains the
20
 * menu sub template, which appropriately displays the menu; the init sub
21
 * template, which is there to set the theme up; (init can be missing.) and
22
 * the linktree sub template, which sorts out the link tree.
23
 *
24
 * The init sub template should load any data and set any hardcoded options.
25
 *
26
 * The body_above sub template is what is shown above the main content, and
27
 * should contain anything that should be shown up there.
28
 *
29
 * The body_below sub template, conversely, is shown after the main content.
30
 * It should probably contain the copyright statement and some other things.
31
 *
32
 * The linktree sub template should display the link tree, using the data
33
 * in the $context['linktree'] variable.
34
 *
35
 * The menu sub template should display all the relevant buttons the user
36
 * wants and or needs.
37
 */
38
39
/**
40
 * Initialize the template... mainly little settings.
41
 * load any data and set any hardcoded options.
42
 */
43
function template_init()
44
{
45
	return array(
46
		/* Use images from default theme when using templates from the default theme?
47
		  if this is 'always', images from the default theme will be used.
48
		  if this is 'defaults', images from the default theme will only be used with default templates.
49
		  if this is 'never' or isn't set at all, images from the default theme will not be used. */
50
		'use_default_images' => 'never',
51
52
		// Set to true if you want to include font awesome's css file
53
		'require_font-awesome' => false,
54
55
		// The version this template/theme is for. This should probably be the version of the forum it was created for.
56
		'theme_version' => '1.0',
57
58
		// Set the following variable to true if this theme requires the optional theme strings file to be loaded.
59
		'require_theme_strings' => false,
60
61
		// This is used for the color variants.
62
		'theme_variants' => array('light', 'besocial'),
63
64
		// Provides avatars for use on various indexes.
65
		// Possible values:
66
		//   * 0 or not set, no avatars are available
67
		//   * 1 avatar of the poster of the last message
68
		//   * 2 avatar of the poster of the first message
69
		//   * 3 both avatars
70
		// Since grabbing the avatar requires some work, it is better to
71
		// set the variable to a sensible value depending on the needs of the theme
72
		'avatars_on_indexes' => 1,
73
74
		// This is used in the main menus to create a number next to the title of the menu to indicate the number of unread messages,
75
		// moderation reports, etc. You can style each menu level indicator as desired.
76
		'menu_numeric_notice' => array(
77
			// Top level menu entries
78
			0 => ' <span class="pm_indicator">%1$s</span>',
79
			// First dropdown
80
			1 => ' <span>[<strong>%1$s</strong>]</span>',
81
			// Second level dropdown
82
			2 => ' <span>[<strong>%1$s</strong>]</span>',
83
		),
84
85
		// This slightly more complex array, instead, will deal with page indexes as frequently requested by Ant :P
86
		// Oh no you don't. :D This slightly less complex array now has cleaner markup. :P
87
		// @todo - God it's still ugly though. Can't we just have links where we need them, without all those spans?
88
		// How do we get anchors only, where they will work? Spans and strong only where necessary?
89
		'page_index_template' => array(
90
			'base_link' => '<li class="linavPages"><a class="navPages" href="{base_link}" role="menuitem">%2$s</a></li>',
91
			'previous_page' => '<span class="previous_page" role="menuitem">{prev_txt}</span>',
92
			'current_page' => '<li class="linavPages"><strong class="current_page" role="menuitem">%1$s</strong></li>',
93
			'next_page' => '<span class="next_page" role="menuitem">{next_txt}</span>',
94
			'expand_pages' => '<li class="linavPages expand_pages" role="menuitem" {custom}> <a href="#">...</a> </li>',
95
			'all' => '<span class="linavPages all_pages" role="menuitem">{all_txt}</span>',
96
		),
97
98
		// @todo find a better place if we are going to create a notifications template
99
		'mentions' => array('mentioner_template' => '<a href="{mem_url}" class="mentionavatar">{avatar_img}{mem_name}</a>')
100
	);
101
}
102
103
/**
104
 * Simplify the use of callbacks in the templates.
105
 *
106
 * @param string $id - A prefix for the template functions the final name
107
 *                     should look like: template_{$id}_{$array[n]}
108
 * @param string[] $array - The array of function suffixes
109
 */
110
function call_template_callbacks($id, $array)
111
{
112
	if (empty($array))
113
		return;
114
115
	foreach ($array as $callback)
116
	{
117
		$func = 'template_' . $id . '_' . $callback;
118
		if (function_exists($func))
119
			$func();
120
	}
121
}
122
123
/**
124
 * The main sub template above the content.
125
 */
126
function template_html_above()
127
{
128
	global $context, $scripturl, $txt, $modSettings;
129
130
	// Show right to left and the character set for ease of translating.
131
	echo '<!DOCTYPE html>
132
<html', $context['right_to_left'] ? ' dir="rtl"' : '', '>
133
<head>
134
	<title>', $context['page_title_html_safe'], '</title>
135
	<meta charset="UTF-8" />';
136
137
	// Tell IE to render the page in standards not compatibility mode. really for ie >= 8
138
	// Note if this is not in the first 4k, its ignored, that's why its here
139
	if (isBrowser('ie'))
140
		echo '
141
	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />';
142
143
	echo '
144
	<meta name="viewport" content="width=device-width" />
145
	<meta name="mobile-web-app-capable" content="yes" />
146
	<meta name="description" content="', $context['page_title_html_safe'], '" />';
147
148
	// OpenID enabled? Advertise the location of our endpoint using YADIS protocol.
149
	if (!empty($modSettings['enableOpenID']))
150
		echo '
151
	<meta http-equiv="x-xrds-location" content="' . $scripturl . '?action=xrds" />';
152
153
	// Please don't index these Mr Robot.
154
	if (!empty($context['robot_no_index']))
155
		echo '
156
	<meta name="robots" content="noindex" />';
157
158
	// load in any css from addons or themes so they can overwrite if wanted
159
	template_css();
160
161
	// Present a canonical url for search engines to prevent duplicate content in their indices.
162
	if (!empty($context['canonical_url']))
163
		echo '
164
	<link rel="canonical" href="', $context['canonical_url'], '" />';
165
166
	// Show all the relative links, such as help, search, contents, and the like.
167
	echo '
168
	<link rel="shortcut icon" sizes="196x196" href="' . $context['favicon'] . '" />
169
	<link rel="help" href="', $scripturl, '?action=help" />
170
	<link rel="contents" href="', $scripturl, '" />', ($context['allow_search'] ? '
171
	<link rel="search" href="' . $scripturl . '?action=search" />' : '');
172
173
	// If RSS feeds are enabled, advertise the presence of one.
174 View Code Duplication
	if (!empty($context['newsfeed_urls']))
175
	{
176
		echo '
177
	<link rel="alternate" type="application/rss+xml" title="', $context['forum_name_html_safe'], ' - ', $txt['rss'], '" href="', $context['newsfeed_urls']['rss'], '" />
178
	<link rel="alternate" type="application/rss+xml" title="', $context['forum_name_html_safe'], ' - ', $txt['atom'], '" href="', $context['newsfeed_urls']['atom'], '" />';
179
	}
180
181
	// If we're viewing a topic, these should be the previous and next topics, respectively.
182 View Code Duplication
	if (!empty($context['links']['next']))
183
	{
184
		echo '
185
	<link rel="next" href="', $context['links']['next'], '" />';
186
	}
187
	elseif (!empty($context['current_topic']))
188
	{
189
		echo '
190
	<link rel="next" href="', $scripturl, '?topic=', $context['current_topic'], '.0;prev_next=next" />';
191
	}
192
193 View Code Duplication
	if (!empty($context['links']['prev']))
194
	{
195
		echo '
196
	<link rel="prev" href="', $context['links']['prev'], '" />';
197
	}
198
	elseif (!empty($context['current_topic']))
199
	{
200
		echo '
201
	<link rel="prev" href="', $scripturl, '?topic=', $context['current_topic'], '.0;prev_next=prev" />';
202
	}
203
204
	// If we're in a board, or a topic for that matter, the index will be the board's index.
205
	if (!empty($context['current_board']))
206
	{
207
		echo '
208
	<link rel="index" href="', $scripturl, '?board=', $context['current_board'], '.0" />';
209
	}
210
211
	// load in any javascript files from addons and themes
212
	theme()->template_javascript();
213
214
	// load in any javascript files from addons and themes
215
	theme()->template_inlinecss();
216
217
	// Output any remaining HTML headers. (from addons, maybe?)
218
	echo $context['html_headers'];
219
220
	echo '
221
</head>
222
<body id="', $context['browser_body_id'], '" class="action_', !empty($context['current_action']) ? htmlspecialchars($context['current_action'], ENT_COMPAT, 'UTF-8') : (!empty($context['current_board']) ?
223
	'messageindex' : (!empty($context['current_topic']) ? 'display' : 'home')),
224
	!empty($context['current_board']) ? ' board_' . htmlspecialchars($context['current_board'], ENT_COMPAT, 'UTF-8') : '', '">';
225
}
226
227
/**
228
 * Section above the main contents of the page, after opening the body tag
229
 */
230
function template_body_above()
231
{
232
	global $context, $settings, $scripturl, $txt;
233
234
	// Go to top/bottom of page links and skipnav link for a11y.
235
	echo '
236
	<a id="top" href="#skipnav" tabindex="0">', $txt['skip_nav'], '</a>
237
	<a href="#top" id="gotop" title="', $txt['go_up'], '">&#8593;</a>
238
	<a href="#bot" id="gobottom" title="', $txt['go_down'], '">&#8595;</a>';
239
240
	// Skip nav link.
241
	echo '
242
	<header id="top_section">
243
		<aside class="wrapper">';
244
245
	call_template_callbacks('th', $context['theme_header_callbacks']);
246
247
	echo '
248
		</aside>
249
		<section id="header" class="wrapper', !empty($settings['header_layout']) ? ($settings['header_layout'] == 1 ? ' centerheader' : ' rightheader') : '', empty($context['minmax_preferences']['upshrink']) ? '"' : ' hide" aria-hidden="true"', '>
250
			<h1 id="forumtitle">
251
				<a class="forumlink" href="', $scripturl, '">', $context['forum_name'], '</a>';
252
253
	echo '
254
				<span id="logobox">
255
					<img id="logo" src="', $context['header_logo_url_html_safe'], '" alt="', $context['forum_name_html_safe'], '" title="', $context['forum_name_html_safe'], '" />', empty($settings['site_slogan']) ? '' : '
256
					<span id="siteslogan">' . $settings['site_slogan'] . '</span>', '
257
				</span>
258
			</h1>';
259
260
	// Show the menu here, according to the menu sub template.
261
	echo '
262
		</section>';
263
264
	template_menu();
265
266
	echo '
267
	</header>
268
	<div id="wrapper" class="wrapper">
269
		<aside id="upper_section"', empty($context['minmax_preferences']['upshrink']) ? '' : ' class="hide" aria-hidden="true"', '>';
270
271
	call_template_callbacks('uc', $context['upper_content_callbacks']);
272
273
	echo '
274
		</aside>';
275
276
	// Show the navigation tree.
277
	theme_linktree();
278
279
	// The main content should go here.
280
	echo '
281
		<div id="main_content_section"><a id="skipnav"></a>';
282
}
283
284
/**
285
 * If the user is logged in, display the time, or a maintenance warning for admins.
286
 * @todo - TBH I always intended the time/date to be more or less a place holder for more important things.
287
 * The maintenance mode warning for admins is an obvious one, but this could also be used for moderation notifications.
288
 * I also assumed this would be an obvious place for sites to put a string of icons to link to their FB, Twitter, etc.
289
 * This could still be done via conditional, so that administration and moderation notices were still active when
290
 * applicable.
291
 */
292
function template_th_login_bar()
293
{
294
	global $context, $modSettings, $txt, $scripturl;
295
296
	echo '
297
			<div id="top_section_notice" class="user">
298
				<form action="', $scripturl, '?action=login2;quicklogin" method="post" accept-charset="UTF-8" ', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>
299
					<div id="password_login">
300
						<input type="text" name="user" size="10" class="input_text" placeholder="', $txt['username'], '" />
301
						<input type="password" name="passwrd" size="10" class="input_password" placeholder="', $txt['password'], '" />
302
						<select name="cookielength">
303
							<option value="60">', $txt['one_hour'], '</option>
304
							<option value="1440">', $txt['one_day'], '</option>
305
							<option value="10080">', $txt['one_week'], '</option>
306
							<option value="43200">', $txt['one_month'], '</option>
307
							<option value="-1" selected="selected">', $txt['forever'], '</option>
308
						</select>
309
						<input type="submit" value="', $txt['login'], '" />
310
						<input type="hidden" name="hash_passwrd" value="" />
311
						<input type="hidden" name="old_hash_passwrd" value="" />
312
						<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
313
						<input type="hidden" name="', $context['login_token_var'], '" value="', $context['login_token'], '" />';
314
315
	if (!empty($modSettings['enableOpenID']))
316
		echo '
317
						<a class="icon icon-margin i-openid" href="', $scripturl, '?action=login;openid" title="' . $txt['openid'] . '"><s>' . $txt['openid'] . '"</s></a>';
318
	echo '
319
					</div>
320
				</form>
321
			</div>';
322
}
323
324
/**
325
 * A simple search bar (used in the header)
326
 */
327
function template_th_search_bar()
328
{
329
	global $context, $modSettings, $txt, $scripturl;
330
331
	echo '
332
			<form id="search_form" action="', $scripturl, '?action=search;sa=results" method="post" accept-charset="UTF-8">
333
				<label for="quicksearch">
334
					<input type="text" name="search" id="quicksearch" value="" class="input_text" placeholder="', $txt['search'], '" />
335
				</label>';
336
337
	// Using the quick search dropdown?
338
	if (!empty($modSettings['search_dropdown']))
339
	{
340
		$selected = !empty($context['current_topic']) ? 'current_topic' : (!empty($context['current_board']) ? 'current_board' : 'all');
341
342
		echo '
343
				<label for="search_selection">
344
				<select name="search_selection" id="search_selection">
345
					<option value="all"', ($selected == 'all' ? ' selected="selected"' : ''), '>', $txt['search_entireforum'], ' </option>';
346
347
		// Can't limit it to a specific topic if we are not in one
348
		if (!empty($context['current_topic']))
349
			echo '
350
					<option value="topic"', ($selected == 'current_topic' ? ' selected="selected"' : ''), '>', $txt['search_thistopic'], '</option>';
351
352
		// Can't limit it to a specific board if we are not in one
353
		if (!empty($context['current_board']))
354
			echo '
355
					<option value="board"', ($selected == 'current_board' ? ' selected="selected"' : ''), '>', $txt['search_thisbrd'], '</option>';
356
357
		if (!empty($context['additional_dropdown_search']))
358
			foreach ($context['additional_dropdown_search'] as $name => $engine)
359
				echo '
360
					<option value="', $name, '">', $engine['name'], '</option>';
361
362
		echo '
363
					<option value="members"', ($selected == 'members' ? ' selected="selected"' : ''), '>', $txt['search_members'], ' </option>
364
				</select>
365
				</label>';
366
	}
367
368
	// Search within current topic?
369
	if (!empty($context['current_topic']))
370
		echo '
371
				<input type="hidden" name="', (!empty($modSettings['search_dropdown']) ? 'sd_topic' : 'topic'), '" value="', $context['current_topic'], '" />';
372
	// If we're on a certain board, limit it to this board ;).
373
	if (!empty($context['current_board']))
374
		echo '
375
				<input type="hidden" name="', (!empty($modSettings['search_dropdown']) ? 'sd_brd[' : 'brd['), $context['current_board'], ']"', ' value="', $context['current_board'], '" />';
376
377
	echo '
378
				<button type="submit" name="search;sa=results" class="', (!empty($modSettings['search_dropdown'])) ? 'with_select' : '', '"><i class="icon i-search icon-shade"></i></button>
379
				<input type="hidden" name="advanced" value="0" />
380
			</form>';
381
}
382
383
/**
384
 * The news fader wrapped in a div and with "news" text
385
 */
386
function template_uc_news_fader()
387
{
388
	global $settings, $context, $txt;
389
390
	// Display either news fader and random news lines (not both). These now run most of the same mark up and CSS. Less complication = happier n00bz. :)
391
	if (!empty($settings['enable_news']) && !empty($context['random_news_line']))
392
	{
393
		echo '
394
			<div id="news">
395
				<h2>', $txt['news'], '</h2>';
396
397
		template_news_fader();
398
399
		echo '
400
			</div>';
401
	}
402
}
403
404
/**
405
 * All your data are belong to us (cit.)
406
 */
407
function template_uc_agreement_accepted()
408
{
409
	global $txt;
410
411
	echo '
412
			<div id="agreement">
413
				<h2>', $txt['agreement_accepted'], '</h2>
414
			</div>';
415
}
416
417
/**
418
 * Section down the page, before closing body
419
 */
420
function template_body_below()
421
{
422
	global $context, $txt;
423
424
	echo '
425
		</div>
426
	</div>';
427
428
	// Show RSS link, as well as the copyright.
429
	// Footer is full-width. Wrapper inside automatically matches admin width setting.
430
	echo '
431
	<footer id="footer_section"><a id="bot"></a>
432
		<div class="wrapper">
433
			<ul>
434
				<li class="copyright">',
435
					theme_copyright(), '
436
				</li>',
437
				!empty($context['newsfeed_urls']['rss']) ? '<li>
438
					<a id="button_rss" href="' . $context['newsfeed_urls']['rss'] . '" class="rssfeeds new_win"><i class="icon icon-margin i-rss icon-big"><s>' . $txt['rss'] . '</s></i></a>
439
				</li>' : '',
440
			'</ul>';
441
442
	// Show the load time?
443
	if ($context['show_load_time'])
444
		echo '
445
			<p>', sprintf($txt['page_created_full'], $context['load_time'], $context['load_queries']), '</p>';
446
}
447
448
/**
449
 * Section down the page, at closing html tag
450
 */
451
function template_html_below()
452
{
453
	global $context;
454
455
	echo '
456
		</div>
457
	</footer>';
458
459
	// load in any javascript that could be deferred to the end of the page
460
	theme()->template_javascript(true);
461
462
	// Anything special to put out?
463
	if (!empty($context['insert_after_template']))
464
		echo $context['insert_after_template'];
465
466
	echo '
467
</body>
468
</html>';
469
}
470
471
/**
472
 * Show a linktree. This is that thing that shows
473
 * "My Community | General Category | General Discussion"..
474
 *
475
 * @param string $default a string representing the index in $context where
476
 *               the linktree is stored (default value is 'linktree')
477
 */
478
function theme_linktree($default = 'linktree')
479
{
480
	global $context, $settings, $txt;
481
482
	// If linktree is empty, just return - also allow an override.
483
	if (empty($context[$default]))
484
		return;
485
486
	// @todo - Look at changing markup here slightly. Need to incorporate relevant aria roles.
487
	echo '
488
			<nav>
489
				<ul class="navigate_section">';
490
491
	// Each tree item has a URL and name. Some may have extra_before and extra_after.
492
	// Added a linktree class to make targeting dividers easy.
493
	foreach ($context[$default] as $pos => $tree)
494
	{
495
		echo '
496
					<li class="linktree">
497
						<span>';
498
499
		// Dividers moved to pseudo-elements in CSS.
500
		// Show something before the link?
501
		if (isset($tree['extra_before']))
502
			echo $tree['extra_before'];
503
504
		// Show the link, including a URL if it should have one.
505
		echo $settings['linktree_link'] && isset($tree['url']) ? '<a href="' . $tree['url'] . '">' . ($pos == 0 ? '<i class="icon i-home"><s>' . $txt['home'] . '</s></i>' : $tree['name']) . '</a>' : $tree['name'];
506
507
		// Show something after the link...?
508
		if (isset($tree['extra_after']))
509
			echo $tree['extra_after'];
510
511
		echo '
512
						</span>
513
					</li>';
514
	}
515
516
	echo '
517
				</ul>
518
			</nav>';
519
}
520
521
/**
522
 * Show the menu up top. Something like [home] [help] [profile] [logout]...
523
 */
524
function template_menu()
525
{
526
	global $context, $txt;
527
528
	// WAI-ARIA a11y tweaks have been applied here.
529
	echo '
530
				<nav id="menu_nav">
531
					<ul id="main_menu" class="wrapper" role="menubar">';
532
533
	// The upshrink image, right-floated.
534
	echo '
535
						<li id="collapse_button" class="listlevel1">
536
							<a class="linklevel1 panel_toggle">
537
								<i id="upshrink" class="hide chevricon i-chevron-up icon icon-lg" title="', $txt['upshrink_description'], '"></i>
538
							</a>
539
						</li>';
540
541
	foreach ($context['menu_buttons'] as $act => $button)
542
	{
543
		echo '
544
						<li id="button_', $act, '" class="listlevel1', !empty($button['sub_buttons']) ? ' subsections" aria-haspopup="true"' : '"', '>
545
							<a class="linklevel1', !empty($button['active_button']) ? ' active' : '', (!empty($button['indicator']) ? ' indicator' : ''), '" href="', $button['href'], '" ', isset($button['target']) ? 'target="' . $button['target'] . '"' : '', '>', (!empty($button['data-icon']) ? '<i class="icon icon-menu icon-lg ' . $button['data-icon'] . '" title="' . (!empty($button['alttitle']) ? $button['alttitle'] : $button['title']) . '"></i> ' : ''), '<span class="button_title" aria-hidden="true">', $button['title'], '</span></a>';
546
547
		// Any 2nd level menus?
548
		if (!empty($button['sub_buttons']))
549
		{
550
			echo '
551
							<ul class="menulevel2" role="menu">';
552
553
			foreach ($button['sub_buttons'] as $childact => $childbutton)
554
			{
555
				echo '
556
								<li id="button_', $childact, '" class="listlevel2', !empty($childbutton['sub_buttons']) ? ' subsections" aria-haspopup="true"' : '"', '>
557
									<a class="linklevel2" href="', $childbutton['href'], '" ', isset($childbutton['target']) ? 'target="' . $childbutton['target'] . '"' : '', '>', $childbutton['title'], '</a>';
558
559
				// 3rd level menus :)
560
				if (!empty($childbutton['sub_buttons']))
561
				{
562
					echo '
563
									<ul class="menulevel3" role="menu">';
564
565
					foreach ($childbutton['sub_buttons'] as $grandchildact => $grandchildbutton)
566
						echo '
567
										<li id="button_', $grandchildact, '" class="listlevel3">
568
											<a class="linklevel3" href="', $grandchildbutton['href'], '" ', isset($grandchildbutton['target']) ? 'target="' . $grandchildbutton['target'] . '"' : '', '>', $grandchildbutton['title'], '</a>
569
										</li>';
570
571
					echo '
572
									</ul>';
573
				}
574
575
				echo '
576
								</li>';
577
			}
578
579
			echo '
580
							</ul>';
581
		}
582
583
		echo '
584
						</li>';
585
	}
586
587
	echo '
588
					</ul>
589
				</nav>';
590
591
	// Define the upper_section toggle in javascript.
592
	addInlineJavascript('
593
					var oMainHeaderToggle = new elk_Toggle({
594
						bToggleEnabled: true,
595
						bCurrentlyCollapsed: ' . (empty($context['minmax_preferences']['upshrink']) ? 'false' : 'true') . ',
596
						aSwappableContainers: [
597
							\'upper_section\',\'header\'
598
						],
599
						aSwapClasses: [
600
							{
601
								sId: \'upshrink\',
602
								classExpanded: \'chevricon i-chevron-up icon-lg\',
603
								titleExpanded: ' . JavaScriptEscape($txt['upshrink_description']) . ',
604
								classCollapsed: \'chevricon i-chevron-down icon-lg\',
605
								titleCollapsed: ' . JavaScriptEscape($txt['upshrink_description']) . '
606
							}
607
						],
608
						oThemeOptions: {
609
							bUseThemeSettings: ' . ($context['user']['is_guest'] ? 'false' : 'true') . ',
610
							sOptionName: \'minmax_preferences\',
611
							sSessionId: elk_session_id,
612
							sSessionVar: elk_session_var,
613
							sAdditionalVars: \';minmax_key=upshrink\'
614
						},
615
						oCookieOptions: {
616
							bUseCookie: elk_member_id == 0 ? true : false,
617
							sCookieName: \'upshrink\'
618
						}
619
					});
620
				', true);
621
}
622
623
/**
624
 * Generate a strip of buttons.
625
 *
626
 * @param mixed[] $button_strip
627
 * @param string $direction = ''
628
 * @param string[] $strip_options = array()
629
 *
630
 * @return string as echoed content
631
 */
632
function template_button_strip($button_strip, $direction = '', $strip_options = array())
633
{
634
	global $context, $txt;
635
636
	// Not sure if this can happen, but people can misuse functions very efficiently
637
	if (empty($button_strip))
638
		return '';
639
640
	if (!is_array($strip_options))
641
		$strip_options = array();
642
643
	// List the buttons in reverse order for RTL languages.
644
	if ($context['right_to_left'])
645
		$button_strip = array_reverse($button_strip, true);
646
647
	// Create the buttons... now with cleaner markup (yay!).
648
	$buttons = array();
649
	foreach ($button_strip as $key => $value)
650
	{
651
		if (!isset($value['test']) || !empty($context[$value['test']]))
652
			$buttons[] = '
653
								<li role="menuitem"><a' . (isset($value['id']) ? ' id="button_strip_' . $value['id'] . '"' : '') . ' class="linklevel1 button_strip_' . $key . (!empty($value['active']) ? ' active' : '') . '" href="' . $value['url'] . '"' . (isset($value['custom']) ? ' ' . $value['custom'] : '') . '>' . $txt[$value['text']] . '</a></li>';
654
	}
655
656
	// No buttons? No button strip either.
657
	if (empty($buttons))
658
		return '';
659
660
	echo '
661
							<ul role="menubar" class="buttonlist', !empty($direction) ? ' float' . $direction : '', (empty($buttons) ? ' hide"' : '"'), (!empty($strip_options['id']) ? ' id="' . $strip_options['id'] . '"' : ''), '>
662
								', implode('', $buttons), '
663
							</ul>';
664
}
665
666
/**
667
 * Generate a strip of "quick" buttons (those present next to each message)
668
 *
669
 * What it does:
670
 *
671
 * - Create a quick button, pass an array of the button name with key values
672
 * - array('somename' => array(href => '' text => '' custom => '' test => ''))
673
 *      - href => link to call when button is pressed
674
 *      - text => text to display in the button
675
 *      - custom => custom action to perform, generally used to add 'onclick' events (optional)
676
 *      - test => key to check in the $tests array before showing the button (optional)
677
 * 		- override => full and complete <li></li> to use for the button
678
 * - checkboxes can be shown as well as buttons,
679
 *		- use array('check' => array(checkbox => (true | always), name => value =>)
680
 *      - if true follows show moderation as checkbox setting, always will always show
681
 *      - name => name of the checkbox array, like delete, will have [] added for the form
682
 *      - value => value for the checkbox to return in the post
683
 *
684
 * @param array $strip - the $context index where the strip is stored
685
 * @param bool[] $tests - an array of tests to determine if the button should be displayed or not
686
 * @return string of buttons
687
 */
688
function template_quickbutton_strip($strip, $tests = array())
689
{
690
	global $options;
691
692
	$buttons = array();
693
694
	foreach ($strip as $key => $value)
695
	{
696
		if (isset($value['checkbox']))
697
		{
698
			if (!empty($value['checkbox']) && ((!empty($options['display_quick_mod']) && $options['display_quick_mod'] == 1) || $value['checkbox'] === 'always'))
699
			{
700
				$buttons[] = '
701
						<li class="listlevel1 ' . $key . '">
702
							<input class="input_check ' . $key . '_check" type="checkbox" name="' . $value['name'] . '[]" value="' . $value['value'] . '" />
703
						</li>';
704
			}
705
		}
706
		elseif (!isset($value['test']) || !empty($tests[$value['test']]))
707
		{
708
			if (!empty($value['override']))
709
			{
710
				$buttons[] = $value['override'];
711
			}
712
			else
713
			{
714
				$buttons[] = '
715
						<li class="listlevel1">
716
							<a href="' . $value['href'] . '" class="linklevel1 ' . $key . '_button"' . (isset($value['custom']) ? ' ' . $value['custom'] : '') . '>' . $value['text'] . '</a>
717
						</li>';
718
			}
719
		}
720
	}
721
722
	// No buttons? No button strip either.
723
	if (empty($buttons))
724
	{
725
		return '';
726
	}
727
728
	echo '
729
					<ul class="quickbuttons">', implode('
730
						', $buttons), '
731
					</ul>';
732
}
733
734
/**
735
 * Very simple and basic template to display a legend explaining the meaning
736
 * of some icons used in the messages listing (locked, sticky, etc.)
737
 */
738
function template_basicicons_legend()
739
{
740
	global $context, $modSettings, $txt;
741
742
	echo '
743
		<p class="floatleft">', !empty($modSettings['enableParticipation']) && $context['user']['is_logged'] ? '
744
			<span class="topicicon i-profile"></span> ' . $txt['participation_caption'] : '<span class="topicicon img_normal"> </span>' . $txt['normal_topic'], '<br />
745
			' . (!empty($modSettings['pollMode']) ? '<span class="topicicon i-poll"> </span>' . $txt['poll'] : '') . '
746
		</p>
747
		<p>
748
			<span class="topicicon i-locked"> </span>' . $txt['locked_topic'] . '<br />
749
			<span class="topicicon i-sticky"> </span>' . $txt['sticky_topic'] . '<br />
750
		</p>';
751
}
752
753
/**
754
 * Show a box with a message, mostly used to show errors, but can be used to show
755
 * success as well
756
 *
757
 * Looks for the display information in the $context[$error_id] array
758
 * Keys of array are 'type'
759
 *  - empty or success for successbox
760
 *  - serious for error box
761
 *  - warning for warning box
762
 * 'title' - optional value to place above list
763
 * 'errors' - array of text strings to display in the box
764
 *
765
 * @param string $error_id
766
 */
767
function template_show_error($error_id)
768
{
769
	global $context;
770
771
	if (empty($error_id))
772
		return;
773
774
	$error = isset($context[$error_id]) ? $context[$error_id] : array();
775
776
	echo '
777
					<div id="', $error_id, '" class="', (isset($error['type']) ? ($error['type'] === 'serious' ? 'errorbox' : 'warningbox') : 'successbox'), empty($error['errors']) ? ' hide"' : '"', '>';
778
779
	// Optional title for our results
780
	if (!empty($error['title']))
781
		echo '
782
						<dl>
783
							<dt>
784
								<strong id="', $error_id, '_title">', $error['title'], '</strong>
785
							</dt>
786
							<dd>';
787
788
	// Everything that went wrong, or correctly :)
789
	if (!empty($error['errors']))
790
	{
791
		echo '
792
								<ul', (isset($error['type']) ? ' class="error"' : ''), ' id="', $error_id, '_list">';
793
794
		foreach ($error['errors'] as $key => $err)
795
			echo '
796
									<li id="', $error_id, '_', $key, '">', $err, '</li>';
797
		echo '
798
								</ul>';
799
	}
800
801
	// All done
802
	if (!empty($error['title']))
803
		echo '
804
							</dd>
805
						</dl>';
806
807
	echo '
808
					</div>';
809
}
810
811
function template_uc_generic_infobox()
812
{
813
	global $context;
814
815
	if (empty($context['generic_infobox']))
816
	{
817
		return;
818
	}
819
820
	foreach ($context['generic_infobox'] as $key)
821
	{
822
		template_show_error($key);
823
	}
824
}
825
826
/**
827
 * Another used and abused piece of template that can be found everywhere
828
 *
829
 * @param string|boolean $button_strip index of $context to create the button strip
830
 * @param string $strip_direction direction of the button strip (see template_button_strip for details)
831
 * @param array $options array of optional values, possible values:
832
 *     - 'page_index' (string) index of $context where is located the pages index generated by constructPageIndex
833
 *     - 'page_index_markup' (string) markup for the page index, overrides 'page_index' and can be used if
834
 *        the page index code is not in the first level of $context
835
 *     - 'extra' (string) used to add html markup at the end of the template
836
 *
837
 * @return string as echoed content
838
 */
839
function template_pagesection($button_strip = false, $strip_direction = '', $options = array())
840
{
841
	global $context;
842
843
	// Hmmm. I'm a tad wary of having floatleft here but anyway............
844
	// @todo - Try using table-cell display here. Should do auto rtl support. Less markup, less css. :)
845
	if (!empty($options['page_index_markup']))
846
		$pages = '<ul ' . (isset($options['page_index_id']) ? 'id="' . $options['page_index_id'] . '" ' : '') . 'class="pagelinks floatleft" role="menubar">' . $options['page_index_markup'] . '</ul>';
847
	else
848
	{
849
		if (!isset($options['page_index']))
850
			$options['page_index'] = 'page_index';
851
		$pages = empty($context[$options['page_index']]) ? '' : '<ul ' . (isset($options['page_index_id']) ? 'id="' . $options['page_index_id'] . '" ' : '') . 'class="pagelinks floatleft" role="menubar">' . $context[$options['page_index']] . '</ul>';
852
	}
853
854
	if (!isset($options['extra']))
855
		$options['extra'] = '';
856
857
	echo '
858
			<nav class="pagesection">
859
				', $pages, '
860
				', !empty($button_strip) && !empty($context[$button_strip]) ? template_button_strip($context[$button_strip], $strip_direction) : '',
861
	$options['extra'], '
862
			</nav>';
863
}
864
865
/**
866
 * This is the news fader
867
 */
868
function template_news_fader()
869
{
870
	global $settings, $context;
871
872
	echo '
873
		<ul id="elkFadeScroller">
874
			<li>
875
				', $settings['enable_news'] == 2 ? implode('</li><li>', $context['news_lines']) : $context['random_news_line'], '
876
			</li>
877
		</ul>';
878
879
	addInlineJavascript('
880
		$(\'#elkFadeScroller\').Elk_NewsFader(' . (empty($settings['newsfader_time']) ? '' : '{\'iFadeDelay\': ' . $settings['newsfader_time'] . '}') . ');', true);
881
}
882
883
/**
884
 *
885
 * @TODO: These need to be moved somewhere appropriate >_>
886
 *
887
 * @param array $member
888
 * @param bool $link
889
 *
890
 * @return string
891
 */
892
function template_member_online($member, $link = true)
893
{
894
	global $context;
895
896
	return ((!empty($context['can_send_pm']) && $link) ? '<a href="' . $member['online']['href'] . '" title="' . $member['online']['text'] . '">' : '') .
897
		   '<i class="' . ($member['online']['is_online'] ? 'iconline' : 'icoffline') . '" title="' . $member['online']['text'] . '"></i>' .
898
		   ((!empty($context['can_send_pm']) && $link) ? '</a>' : '');
899
}
900
901
/**
902
 * Similar to the above. Wanted to centralize this to make it easier to pull out the emailuser action and replace with
903
 * a mailto: href, which many sane board admins would prefer.
904
 *
905
 * @param array $member
906
 * @param bool  $text
907
 *
908
 * @return string
909
 */
910
function template_member_email($member, $text = false)
911
{
912
	global $context, $txt, $scripturl;
913
914
	if ($context['can_send_email'])
915
	{
916
		if ($text)
917
		{
918
			if ($member['show_email'] === 'no_through_forum')
919
			{
920
				return '<a class="linkbutton" href="' . $scripturl . '?action=emailuser;sa=email;uid=' . $member['id'] . '">' . $txt['email'] . '</a>';
921
			}
922
			elseif ($member['show_email'] === 'yes_permission_override' || $member['show_email'] === 'yes')
923
			{
924
				return '<a class="linkbutton" href="' . $scripturl . '?action=emailuser;sa=email;uid=' . $member['id'] . '">' . $member['email'] . '</a>';
925
			}
926
			else
927
			{
928
				return $txt['hidden'];
929
			}
930
		}
931
		else
932
		{
933
			if ($member['show_email'] !== 'no')
934
			{
935
				return '<a href="' . $scripturl . '?action=emailuser;sa=email;uid=' . $member['id'] . '" class="icon i-envelope-o' . ($member['online']['is_online'] ? '' : '-blank') . '" title="' . $txt['email'] . ' ' . $member['name'] . '"><s>' . $txt['email'] . ' ' . $member['name'] . '</s></a>';
936
			}
937 View Code Duplication
			else
938
			{
939
				return '<i class="icon i-envelope-o" title="' . $txt['email'] . ' ' . $txt['hidden'] . '"><s>' . $txt['email'] . ' ' . $txt['hidden'] . '</s></i>';
940
			}
941
		}
942
	}
943
944
	return '';
945
}
946
947
/**
948
 * Sometimes we only get a message id.
949
 *
950
 * @param      $id
951
 * @param bool|mixed[] $member
952
 *
953
 * @return string
954
 */
955
function template_msg_email($id, $member = false)
956
{
957
	global $context, $txt, $scripturl;
958
959
	if ($context['can_send_email'])
960
	{
961
		if ($member === false || $member['show_email'] != 'no')
962
		{
963
			if (empty($member['id']))
964
			{
965
				return '<a href="' . $scripturl . '?action=emailuser;sa=email;msg=' . $id . '" class="icon i-envelope-o' . (($member !== false && $member['online']['is_online']) ? '' : '-blank') . '" title="' . $txt['email'] . '"><s>' . $txt['email'] . '</s></a>';
966
			}
967
			else
968
			{
969
				return '<a href="' . $scripturl . '?action=emailuser;sa=email;uid=' . $member['id'] . '" class="icon i-envelope-o' . (($member !== false && $member['online']['is_online']) ? '' : '-blank') . '" title="' . $txt['email'] . '"><s>' . $txt['email'] . '</s></a>';
970
			}
971
		}
972 View Code Duplication
		else
973
		{
974
			return '<i class="icon i-envelope-o" title="' . $txt['email'] . ' ' . $txt['hidden'] . '"><s>' . $txt['email'] . ' ' . $txt['hidden'] . '</s></i>';
975
		}
976
	}
977
978
	return '';
979
}
980