Files
IPB/static/templates/core_global_global.php
2025-12-19 19:04:57 -08:00

6477 lines
151 KiB
PHP

<?php
namespace IPS\Theme;
class class_core_global_global extends \IPS\Theme\Template
{ function advertisementImage( $advertisement, $acpLink=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \count( $advertisement->_images ) ):
$return .= <<<IPSCONTENT
<div class='ips
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
i-text-align_center'>
<ul>
IPSCONTENT;
$hmacKey = hash_hmac( "sha256", $advertisement->link, \IPS\Settings::i()->site_secret_key . 'a' );
$return .= <<<IPSCONTENT
<li class='ips
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_large ipsResponsive_showDesktop'>
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $acpLink, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=redirect&do=advertisement&ad={$advertisement->id}&key={$hmacKey}", "front", "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $advertisement->new_window ):
$return .= <<<IPSCONTENT
target='_blank'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
rel='nofollow noopener'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['large'] )->url;
$return .= <<<IPSCONTENT
' alt="
IPSCONTENT;
if ( $advertisement->image_alt ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $advertisement->image_alt, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'advertisement_alt', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
style="max-width:100%;max-width:min(100%, 300px);"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
loading="lazy">
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
if ( !$acpLink ):
$return .= <<<IPSCONTENT
<li class='ips
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_medium ipsResponsive_showTablet'>
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $acpLink, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=redirect&do=advertisement&ad={$advertisement->id}&key={$hmacKey}", "front", "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $advertisement->new_window ):
$return .= <<<IPSCONTENT
target='_blank'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
rel='nofollow noopener'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
if ( !empty( $advertisement->_images['medium'] ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['medium'] )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['large'] )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' alt="
IPSCONTENT;
if ( $advertisement->image_alt ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $advertisement->image_alt, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'advertisement_alt', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
style="max-width:100%;max-width:min(100%, 300px);"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
loading="lazy">
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
<li class='ips
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_small ipsResponsive_showPhone'>
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $acpLink, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=redirect&do=advertisement&ad={$advertisement->id}&key={$hmacKey}", "front", "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $advertisement->new_window ):
$return .= <<<IPSCONTENT
target='_blank'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
rel='nofollow noopener'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
if ( !empty( $advertisement->_images['small'] ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['small'] )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
elseif ( !empty( $advertisement->_images['medium'] ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['medium'] )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( $advertisement->storageExtension(), $advertisement->_images['large'] )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' alt="
IPSCONTENT;
if ( $advertisement->image_alt ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $advertisement->image_alt, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'advertisement_alt', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
style="max-width:100%;max-width:min(100%, 300px);"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
loading="lazy">
IPSCONTENT;
if ( $advertisement->link ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
if ( $acpLink ):
$return .= <<<IPSCONTENT
<div class="i-font-size_-1 i-margin-top_3 i-font-weight_500"><a href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $acpLink, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" rel="noreferrer" class="i-color_soft">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $acpLink, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a></div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function applePieChart( $segments, $sorted=TRUE, $classes='' ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \count( $segments ) ):
$return .= <<<IPSCONTENT
<div class='ipsPieBar
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $classes, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
<div class='ipsPieBar__bar'>
IPSCONTENT;
foreach ( $segments as $segment ):
$return .= <<<IPSCONTENT
<div class='ipsPieBar__barSegment' style='width:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( number_format( $segment['percentage'], 2, '.', '' ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
%'
IPSCONTENT;
if ( !empty( $segment['title'] ) || !empty( $segment['tooltip'] ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !empty( $segment['title'] ) ):
$return .= <<<IPSCONTENT
title="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $segment['title'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !empty( $segment['tooltip'] ) ):
$return .= <<<IPSCONTENT
data-ipsTooltip data-ipsTooltip-label="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $segment['tooltip'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( !empty( $segment['tooltipSafe'] ) ):
$return .= <<<IPSCONTENT
data-ipsTooltip-safe
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
title="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $segment['value'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
(
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $segment['percentage'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
%)"
data-ipsTooltip
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
></div>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</div>
<ul class='ipsList ipsList--inline ipsPieBar__legend'>
IPSCONTENT;
foreach ( $segments as $segment ):
$return .= <<<IPSCONTENT
<li class='ipsPieBar__legendItem'>
<span class='ipsPieBar__legendItemKey'></span>
IPSCONTENT;
if ( isset( $segment['nameRaw'] ) ):
$return .= <<<IPSCONTENT
{$segment['nameRaw']}
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $segment['name'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
</div>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<p class='i-color_soft i-text-align_center'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'no_data', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function badge( $badge, $cssClass = NULL, $tooltip = TRUE, $showRare = FALSE ) {
$return = '';
$return .= <<<IPSCONTENT
<span class='i-position_relative'>
<img src='
IPSCONTENT;
if ( $badge->badge_use_image ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\File::get( "core_Badges", $badge->image )->url;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $badge->_icon, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' loading="lazy" alt="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $badge->_title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" class='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $cssClass, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $tooltip ):
$return .= <<<IPSCONTENT
data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $badge->_title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
if ( $showRare && $badge->isRare() ):
$return .= <<<IPSCONTENT
<span class='ipsBadge ipsBadge--rare'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'rare_badge', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
return $return;
}
function basicHover( $message ) {
$return = '';
$return .= <<<IPSCONTENT
<div class="i-padding_3">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $message, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
return $return;
}
function basicUrl( $url, $newWindow=TRUE, $title=NULL, $wordbreak=TRUE, $nofollow=FALSE, $noreferrer=FALSE, $titleRaw = FALSE ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $wordbreak ):
$return .= <<<IPSCONTENT
<div class=''>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $newWindow === TRUE ):
$return .= <<<IPSCONTENT
target='_blank'
IPSCONTENT;
if ( $nofollow === FALSE ):
$return .= <<<IPSCONTENT
rel="
IPSCONTENT;
if ( $noreferrer ):
$return .= <<<IPSCONTENT
noreferrer
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
noopener
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $nofollow === TRUE ):
$return .= <<<IPSCONTENT
rel="nofollow
IPSCONTENT;
if ( $newWindow === TRUE ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $noreferrer ):
$return .= <<<IPSCONTENT
noreferrer
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
noopener
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
if ( $title ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $titleRaw ):
$return .= <<<IPSCONTENT
{$title}
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
if ( $wordbreak ):
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function chart( $chart, $type, $options, $format=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( isset( $chart->errors ) AND \count( $chart->errors ) ):
$return .= <<<IPSCONTENT
<div class='ipsMessage ipsMessage--error'>
IPSCONTENT;
foreach ( $chart->errors as $error ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( isset($error['sprintf']) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$val = "{$error['string']}"; $sprintf = array($error['sprintf']); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$val = "{$error['string']}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<div class="ipsChart__table-wrapper ipsLoading ipsLoading--small" data-ipsChart data-ipsChart-type="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $type, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-ipsChart-extraOptions='{$options}'
IPSCONTENT;
if ( $format ):
$return .= <<<IPSCONTENT
data-ipsChart-format='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $format, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
<table class="ipsTable" >
<thead>
<tr>
IPSCONTENT;
foreach ( $chart->headers as $data ):
$return .= <<<IPSCONTENT
<th data-colType="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $data['type'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $data['label'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</th>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</tr>
</thead>
<tbody>
IPSCONTENT;
foreach ( $chart->rows as $row ):
$return .= <<<IPSCONTENT
<tr>
IPSCONTENT;
foreach ( $row as $value ):
$return .= <<<IPSCONTENT
<td
IPSCONTENT;
if ( \is_array( $value ) ):
$return .= <<<IPSCONTENT
data-key="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $value['key'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
if ( \is_array( $value ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $value['value'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $value, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</td>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</tr>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</tbody>
</table>
</div>
<div class="ipsChart"></div>
IPSCONTENT;
return $return;
}
function chartTimezoneInfo( $mysqlTimezone ) {
$return = '';
$return .= <<<IPSCONTENT
<div class="i-padding_3">
IPSCONTENT;
$sprintf = array($mysqlTimezone); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'dynamic_chart_timezone_explain', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
return $return;
}
function decision( $blurb, $options ) {
$return = '';
$return .= <<<IPSCONTENT
<div class='i-background_2 i-padding_3 i-text-align_center'>
<div class='i-font-size_2'><strong>
IPSCONTENT;
$val = "{$blurb}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</strong></div>
<br><br>
<ul class='ipsList ipsList--inline'>
IPSCONTENT;
foreach ( $options as $lang => $link ):
$return .= <<<IPSCONTENT
<li>
<a href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $link, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" title='
IPSCONTENT;
$val = "{$lang}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
' class='ipsButton ipsButton--primary'>
IPSCONTENT;
$val = "{$lang}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a>
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
</div>
IPSCONTENT;
return $return;
}
function dynamicChart( $chart, $html ) {
$return = '';
$return .= <<<IPSCONTENT
<div class='ipsChart ipsBox' data-controller='core.admin.core.dynamicChart' data-chart-url='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->baseURL, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-chart-identifier='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-chart-type="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->type, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-chart-timescale="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->timescale, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-chart-customfilter-submitted='
IPSCONTENT;
if ( isset( \IPS\Widget\Request::i()->filter_form_submitted ) ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'>
<div class='i-padding_2 i-background_2 i-border-bottom_3 ipsChart_filters i-flex i-flex-wrap_wrap i-gap_1 i-border-start-start-radius_box i-border-start-end-radius_box'>
<div class='i-flex_91
IPSCONTENT;
if ( $chart->description ):
$return .= <<<IPSCONTENT
i-basis_100p
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
if ( $chart->title ):
$return .= <<<IPSCONTENT
<h2 class='ipsTitle ipsTitle--h4'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</h2>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->description ):
$return .= <<<IPSCONTENT
<p class="i-color_soft ipsChart__desc">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->description, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
<ul class='ipsButtons ipsButtons--end ipsChart__primaryActions i-align-self_center'>
IPSCONTENT;
if ( \IPS\Widget\Request::i()->chartId AND is_numeric( \IPS\Widget\Request::i()->chartId ) ):
$return .= <<<IPSCONTENT
<li>
<a data-confirm href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->baseURL->setQueryString( array( 'deleteChart' => \IPS\Request::i()->chartId ) )->csrf() , ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' class='ipsButton--small ipsButton ipsButton--negative'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'mychart_remove', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterRename" popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterRename_menu" data-role="renameChart" class='ipsButton--small ipsButton ipsButton--inherit'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stream_rename', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
<i-dropdown popover id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterRename_menu">
<div class="iDropdown" data-role="filterRenameMenu">
{$chart->form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core', 'front' ), 'popupTemplate' ) )}
</div>
</i-dropdown>
</li>
IPSCONTENT;
elseif ( $chart->showIntervals OR $chart->showDateRange OR $chart->showFilterTabs ):
$return .= <<<IPSCONTENT
<li>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterSave"
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->chartId OR \IPS\Widget\Request::i()->chartId == '_default' ):
$return .= <<<IPSCONTENT
popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterSave_menu"
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
data-chartId='
IPSCONTENT;
$return .= isset( \IPS\Widget\Request::i()->chartId ) ? htmlspecialchars( \IPS\Widget\Request::i()->chartId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE ): NULL;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'save_chart_desc', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
' class='ipsButton ipsButton--inherit ipsButton--small' data-role='saveReport'><i class='fa-solid fa-plus'></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'save_chart', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
<ul class='ipsButtons ipsButtons--end i-flex_11 ipsChart__secondaryActions i-align-self_center'>
IPSCONTENT;
if ( $chart->showIntervals ):
$return .= <<<IPSCONTENT
<li data-role="groupingButtons">
<ul class="ipsButtonGroup ipsButton--small">
IPSCONTENT;
if ( $chart->enableHourly ):
$return .= <<<IPSCONTENT
<li><a class='ipsButton
IPSCONTENT;
if ( $chart->timescale == 'hourly' ):
$return .= <<<IPSCONTENT
ipsButton--active
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $chart->type == 'Table' ):
$return .= <<<IPSCONTENT
disabled
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url->setQueryString( array( 'timescale' => array( $chart->identifier => 'hourly' ), 'noheader' => 1 ) ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-timescale="hourly"
IPSCONTENT;
if ( $chart->timescale == 'hourly' ):
$return .= <<<IPSCONTENT
data-selected
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_date_group_hourly', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( array( 'daily', 'weekly', 'monthly' ) as $k ):
$return .= <<<IPSCONTENT
<li><a class='ipsButton
IPSCONTENT;
if ( $chart->timescale == $k ):
$return .= <<<IPSCONTENT
ipsButton--active
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $chart->type == 'Table' ):
$return .= <<<IPSCONTENT
disabled
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url->setQueryString( array( 'timescale' => array( $chart->identifier => $k ), 'noheader' => 1 ) ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-timescale="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $k, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( $chart->timescale == $k ):
$return .= <<<IPSCONTENT
data-selected
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
$val = "stats_date_group_$k"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->showDateRange ):
$return .= <<<IPSCONTENT
<li>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Date" popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Date_menu" class="ipsButton ipsButton--small ipsButton--soft" data-action='chartDate'><i class='fa-solid fa-calendar'></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_date_range', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
<span data-role='dateSummary' class='i-color_soft'>
IPSCONTENT;
if ( $chart->start AND $chart->end ):
$return .= <<<IPSCONTENT
(
IPSCONTENT;
$sprintf = array($chart->start->localeDate(), $chart->end->localeDate()); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'search_betweenXandX', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
)
IPSCONTENT;
elseif ( $chart->start ):
$return .= <<<IPSCONTENT
(
IPSCONTENT;
$sprintf = array($chart->start->localeDate()); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'search_afterX', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
)
IPSCONTENT;
elseif ( $chart->end ):
$return .= <<<IPSCONTENT
(
IPSCONTENT;
$sprintf = array($chart->end->localeDate()); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'search_beforeX', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
)
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</span> <i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Date_menu">
<div class="iDropdown">
<form accept-charset='utf-8' action="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" method="post" data-role="dateForm" data-ipsForm class="ipsForm">
<div class="ipsFieldRow">
<div class="ipsFieldRow__label">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_start_date', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "forms", "core", 'global' )->date( 'start', $chart->start ?: NULL, FALSE, NULL, NULL, FALSE, FALSE, NULL, NULL, NULL, array(), TRUE, 'ipsInput--fullWidth', \IPS\Member::loggedIn()->language()->addToStack('stats_start_date') );
$return .= <<<IPSCONTENT
</div>
<div class="ipsFieldRow">
<div class="ipsFieldRow__label">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_end_date', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "forms", "core", 'global' )->date( 'end', $chart->end ?: NULL, FALSE, NULL, NULL, FALSE, FALSE, NULL, NULL, NULL, array(), TRUE, 'ipsInput--fullWidth', \IPS\Member::loggedIn()->language()->addToStack('stats_end_date') );
$return .= <<<IPSCONTENT
</div>
<div class="ipsSubmitRow">
<button type="submit" class="ipsButton ipsButton--primary ipsButton--wide" data-role="updateDate">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'submit', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</div>
</form>
</div>
</i-dropdown>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->showSave and count( $chart->availableFilters ) ):
$return .= <<<IPSCONTENT
<li>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Filter" popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Filter_menu" data-action="chartFilter" class="ipsButton ipsButton--small ipsButton--soft"><i class='fa-solid fa-filter'></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_chart_filters', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
<i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Filter_menu" data-i-dropdown-selectable="checkbox" data-i-dropdown-persist>
<div class="iDropdown">
<ul class="iDropdown__items" data-role='filterMenu'>
<li>
<button type="button" data-role='selectAll' data-i-dropdown-noselect>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'all', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</li>
<li>
<button type="button" data-role='unselectAll' data-i-dropdown-noselect>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'none', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</li>
<li><hr></li>
IPSCONTENT;
foreach ( $chart->availableFilters as $f => $name ):
$return .= <<<IPSCONTENT
<li>
<a href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->flipUrlFilter( $f ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( \in_array( $f, $chart->currentFilters ) ):
$return .= <<<IPSCONTENT
aria-selected="true"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
data-ipsMenuValue='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $f, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'><i class="iDropdown__input"></i>
IPSCONTENT;
if ( \is_array( $name ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $name['value'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</a>
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
<div class="i-padding_1 i-border-top_3">
<button type="button" popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Filter_menu" class='ipsButton ipsButton--primary ipsButton--wide'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'apply_filters', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</div>
</div>
</i-dropdown>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->customFiltersForm ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$customFilterFormTitle = $chart->customFiltersForm['title'] ?? 'chart_customfilters_title';
$return .= <<<IPSCONTENT
<li>
<a href="#elCustomFiltersForm" class="ipsButton ipsButton--small ipsButton--soft" data-ipsDialog data-ipsDialog-size="narrow" data-ipsDialog-title="
IPSCONTENT;
$val = "{$customFilterFormTitle}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
" data-ipsDialog-content="#el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
CustomFiltersForm"><i class='fa-solid fa-chart-column'></i>
IPSCONTENT;
$val = "{$customFilterFormTitle}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a>
<div id='el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
CustomFiltersForm' class='i-background_2 i-padding_3 ipsJS_hide'>
{$chart->getCustomFiltersForm()->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core', 'front' ), 'popupTemplate' ) )}
</div>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( isset( $chart->options['limitSearch'] ) ):
$return .= <<<IPSCONTENT
<li>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Search" popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Search_menu" data-action='chartSearch' class="ipsButton ipsButton--small ipsButton--soft">
IPSCONTENT;
$val = "{$chart->options['limitSearch']}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
<span data-role='searchSummary' class='i-color_soft'></span> <i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
Search_menu">
<div class="iDropdown">
<form accept-charset='utf-8' action="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" method="post" data-role="searchForm" data-ipsForm class="ipsForm">
<div class="ipsFieldRow">
<div class="ipsFieldRow__label">
IPSCONTENT;
$val = "{$chart->options['limitSearch']}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "forms", "core", 'global' )->text( 'search', 'text', NULL, FALSE );
$return .= <<<IPSCONTENT
</div>
<div class="ipsSubmitRow ipsButtons ipsButtons--fill">
<button type="submit" class="ipsButton ipsButton--inherit" data-role="clearSearchTerm" hidden>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'stats_search_reset', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
<button type="submit" class="ipsButton ipsButton--primary" data-role="updateSearch">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'submit', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</div>
</form>
</div>
</i-dropdown>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->showSave ):
$return .= <<<IPSCONTENT
<li>
<button type="button" id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterSave"
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->chartId OR \IPS\Widget\Request::i()->chartId == '_default' ):
$return .= <<<IPSCONTENT
popovertarget="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterSave_menu"
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
data-chartId='
IPSCONTENT;
$return .= isset( \IPS\Widget\Request::i()->chartId ) ? htmlspecialchars( \IPS\Widget\Request::i()->chartId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE ): NULL;
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
class='ipsButton ipsButton--small ipsButton--primary ipsHide' data-role='saveReport'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'save', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->chartId OR \IPS\Widget\Request::i()->chartId == '_default' ):
$return .= <<<IPSCONTENT
<i-dropdown popover id="el
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->identifier, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
FilterSave_menu" data-role='filterSaveMenu'>
<div class="iDropdown">
{$chart->form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core', 'front' ), 'popupTemplate' ) )}
</div>
</i-dropdown>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart instanceof \IPS\Helpers\Chart\Dynamic ):
$return .= <<<IPSCONTENT
<li>
<a class='ipsButton ipsButton--soft ipsButton--small' href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url->setQueryString(array( "download" => 1 ))->csrf() , ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'download_as_csv', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
' data-role='downloadChart'><i class="fa-solid fa-download"></i> CSV</a>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \count( $chart->availableTypes ) > 1 ):
$return .= <<<IPSCONTENT
<li>
<div class="ipsButtonGroup ipsButton--small">
IPSCONTENT;
foreach ( $chart->availableTypes as $t ):
$return .= <<<IPSCONTENT
<a class='ipsButton
IPSCONTENT;
if ( $chart->type == $t ):
$return .= <<<IPSCONTENT
ipsButton--active
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $chart->url->setQueryString( array( 'type' => array( $chart->identifier => $t ), 'noheader' => 1 ) ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-ipsTooltip title='
IPSCONTENT;
$val = "chart_{$t}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
' data-type='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $t, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $chart->type == $t ):
$return .= <<<IPSCONTENT
data-selected
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
if ( $t === 'Table' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-table"></i>
IPSCONTENT;
elseif ( $t === 'LineChart' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-chart-line"></i>
IPSCONTENT;
elseif ( $t == 'AreaChart' ):
$return .= <<<IPSCONTENT
<i class='fa-solid fa-chart-area'></i>
IPSCONTENT;
elseif ( $t === 'ColumnChart' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-chart-column"></i>
IPSCONTENT;
elseif ( $t === 'BarChart' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-chart-column fa-rotate-90"></i>
IPSCONTENT;
elseif ( $t === 'PieChart' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-pie-chart"></i>
IPSCONTENT;
elseif ( $t === 'GeoChart' ):
$return .= <<<IPSCONTENT
<i class="fa-solid fa-earth-americas"></i>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</div>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
</div>
<div class='ipsChart__chart i-padding_3' data-role="chart">
{$html}
</div>
</div>
IPSCONTENT;
if ( $chart->timezoneError and \IPS\Member::loggedIn()->isAdmin() ):
$return .= <<<IPSCONTENT
<p class="i-font-size_-2 i-color_soft i-padding_2 ipsChart__timezone-disclaimer"><i class="fa-solid fa-circle-info"></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'dynamic_chart_timezone_info', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $chart->hideTimezoneLink === FALSE ):
$return .= <<<IPSCONTENT
<a href="
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=ajax&do=chartTimezones", null, "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
" data-ipsDialog data-ipsDialog-title="
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'dynamic_chart_timezone_title', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'learn_more', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function googleMap( $mapParameters ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
$width = $mapParameters['width'] ?? 500;
$return .= <<<IPSCONTENT
IPSCONTENT;
$height = $mapParameters['height'] ?? 500;
$return .= <<<IPSCONTENT
<div data-controller="ips.core.map.googlemap" data-map-data='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( json_encode( $mapParameters ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' style="width:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px; height:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $height, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px; max-width: 100%; max-height: 100%; overflow: hidden;" >
IPSCONTENT;
if ( isset($mapParameters['lat']) and isset($mapParameters['long']) ):
$return .= <<<IPSCONTENT
<span itemscope itemtype='http://schema.org/GeoCoordinates'>
<meta itemprop='latitude' content='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $mapParameters["lat"], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
<meta itemprop='longitude' content='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $mapParameters["long"], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<div data-role="mapContainer" style="width: 100%; height: 100%;"></div>
</div>
IPSCONTENT;
return $return;
}
function icon( $icon ) {
$return = '';
$return .= <<<IPSCONTENT
<span class="ipsIcon ipsIcon--
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $icon['type'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-label="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $icon['title'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" aria-hidden="true">{$icon['raw']}</span>
IPSCONTENT;
return $return;
}
function includeCSS( ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
<!--!Font Awesome Free 6 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<link rel='stylesheet' href='
IPSCONTENT;
$return .= str_replace( array( 'http://', 'https://' ), '//', htmlspecialchars( \IPS\Http\Url::internal( "applications/core/interface/static/fontawesome/css/all.min.css?v=6.7.2", "none", "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( array_unique( \IPS\Output::i()->cssFiles, SORT_STRING ) as $file ):
$return .= <<<IPSCONTENT
<link rel='stylesheet' href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Http\Url::external( $file )->setQueryString( 'v', \IPS\Theme::i()->cssCacheBustKey() ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
<!-- Content Config CSS Properties -->
<style id="contentOptionsCSS">
:root {
--i-embed-max-width:
IPSCONTENT;
if ( \IPS\Settings::i()->max_internalembed_width ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->max_internalembed_width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
100%
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
;
--i-embed-default-width:
IPSCONTENT;
if ( \IPS\Settings::i()->max_internalembed_width ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->max_internalembed_width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
500px
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
;
--i-embed-media-max-width:
IPSCONTENT;
if ( \IPS\Settings::i()->max_embeddedmedia_width and intval(\IPS\Settings::i()->max_embeddedmedia_width) > 0 ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->max_embeddedmedia_width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
100%
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
;
}
</style>
IPSCONTENT;
if ( \IPS\Dispatcher::i()->controllerLocation == 'front' and ! \IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Theme::i()->core_css and \IPS\Theme::i()->core_css_filename ):
$return .= <<<IPSCONTENT
<link rel='stylesheet' href='
IPSCONTENT;
$return .= \IPS\File::get( "core_Theme", \IPS\Theme::i()->core_css_filename )->url;
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Output::i()->headCss ):
$return .= <<<IPSCONTENT
<style id="headCSS">
IPSCONTENT;
$return .= \IPS\Output::i()->headCss;
$return .= <<<IPSCONTENT
</style>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<style id="themeVariables">
IPSCONTENT;
if ( \IPS\Theme::i()->getInlineCssVariables() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme::i()->getInlineCssVariables();
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</style>
IPSCONTENT;
if ( \IPS\Widget\Request::i()->controller != 'themeeditor' || !\IPS\Member::loggedIn()->isEditingTheme() ):
$return .= <<<IPSCONTENT
<style id="themeCustomCSS">
IPSCONTENT;
$return .= \IPS\Theme::i()->getCustomCssForOutput();
$return .= <<<IPSCONTENT
</style>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Member::loggedIn()->isEditingTheme() ):
$return .= <<<IPSCONTENT
<style id="themeEditorStyles"></style>
<style id="themeEditorTempStyles"></style>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function includeJS( ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\IN_DEV AND defined('PAGEBUILDER_DEV') AND \PAGEBUILDER_DEV ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$pagebuilderDevUrl = defined('PAGEBUILDER_DEV_URL') ? \PAGEBUILDER_DEV_URL : 'http://localhost:5173';
$return .= <<<IPSCONTENT
<script type="module">
import RefreshRuntime from '{$pagebuilderDevUrl}/@react-refresh'
RefreshRuntime.injectIntoGlobalHook(window)
window.\$RefreshReg\$ = () => {}
window.\$RefreshSig\$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
<script type="module" src="{$pagebuilderDevUrl}/@vite/client"></script>
<script type="module" src="{$pagebuilderDevUrl}/src/main.jsx"></script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\IN_DEV AND defined('EDITOR_DEV') AND \EDITOR_DEV ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$editorURL = defined('EDITOR_DEV_URL') ? \EDITOR_DEV_URL : 'http://localhost:5174';
$return .= <<<IPSCONTENT
<script type="module">
import RefreshRuntime from '{$editorURL}/@react-refresh'
RefreshRuntime.injectIntoGlobalHook(window)
window.\$RefreshReg$ = () => {}
window.\$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
<script type="module" src="{$editorURL}/@vite/client"></script>
<script type="module" src="{$editorURL}/src/main.jsx"></script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\IN_DEV AND defined('ICONPICKER_DEV') AND \ICONPICKER_DEV ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$editorURL = defined('ICONPICKER_DEV_URL') ? \ICONPICKER_DEV_URL : 'http://localhost:5175';
$return .= <<<IPSCONTENT
<script type="module">
import RefreshRuntime from '{$editorURL}/@react-refresh'
RefreshRuntime.injectIntoGlobalHook(window)
window.\$RefreshReg$ = () => {}
window.\$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
<script type="module" src="{$editorURL}/@vite/client"></script>
<script type="module" src="{$editorURL}/src/main.jsx"></script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$maxImageDims = \IPS\Settings::i()->attachment_image_size ? explode( 'x', \IPS\Settings::i()->attachment_image_size ) : array( 1000, 750 );
$return .= <<<IPSCONTENT
<script>
var ipsDebug =
IPSCONTENT;
if ( ( \IPS\IN_DEV and \IPS\DEV_DEBUG_JS ) or \IPS\DEBUG_JS ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
;
var ipsSettings = {
IPSCONTENT;
if ( \IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation == 'admin' ):
$return .= <<<IPSCONTENT
isAcp: true,
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\COOKIE_DOMAIN !== NULL ):
$return .= <<<IPSCONTENT
cookie_domain: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\COOKIE_DOMAIN, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
cookie_path: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Request::getCookiePath(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
IPSCONTENT;
if ( \IPS\COOKIE_PREFIX !== NULL ):
$return .= <<<IPSCONTENT
cookie_prefix: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\COOKIE_PREFIX, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( mb_substr( \IPS\Settings::i()->base_url, 0, 5 ) == 'https' AND \IPS\COOKIE_BYPASS_SSLONLY !== TRUE ):
$return .= <<<IPSCONTENT
cookie_ssl: true,
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
cookie_ssl: false,
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
essential_cookies:
IPSCONTENT;
$return .= json_encode( \IPS\Request::getEssentialCookies());
$return .= <<<IPSCONTENT
,
upload_imgURL: "
IPSCONTENT;
$return .= \IPS\Theme::i()->resource( "notifyIcons/upload.png", "core", 'front', false );
$return .= <<<IPSCONTENT
",
message_imgURL: "
IPSCONTENT;
$return .= \IPS\Theme::i()->resource( "notifyIcons/message.png", "core", 'front', false );
$return .= <<<IPSCONTENT
",
notification_imgURL: "
IPSCONTENT;
$return .= \IPS\Theme::i()->resource( "notifyIcons/notification.png", "core", 'front', false );
$return .= <<<IPSCONTENT
",
baseURL: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Http\Url::baseUrl( \IPS\Http\Url::PROTOCOL_RELATIVE ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
jsURL: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( rtrim( \IPS\Http\Url::baseUrl( \IPS\Http\Url::PROTOCOL_RELATIVE ), '/' ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
/applications/core/interface/js/js.php",
uploadBaseURLs:
IPSCONTENT;
$return .= json_encode( \IPS\File::baseUrls() );
$return .= <<<IPSCONTENT
,
csrfKey: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Session::i()->csrfKey, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
antiCache: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Theme::i()->cssCacheBustKey(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
jsAntiCache: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Output\Javascript::javascriptCacheBustKey(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
disableNotificationSounds: true,
useCompiledFiles:
IPSCONTENT;
if ( \IPS\IN_DEV ):
$return .= <<<IPSCONTENT
false
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
true
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
links_external:
IPSCONTENT;
if ( \IPS\Settings::i()->links_external ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
memberID:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( ( \IPS\Member::loggedIn()->member_id ) ? \IPS\Member::loggedIn()->member_id : 0, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
,
blankImg: "
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Text\Parser::blankImage(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
",
googleAnalyticsEnabled:
IPSCONTENT;
if ( \IPS\Settings::i()->ga_enabled ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
matomoEnabled:
IPSCONTENT;
if ( \IPS\Settings::i()->matomo_enabled ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
viewProfiles:
IPSCONTENT;
if ( \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'core', 'members' ) ) ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
mapProvider:
IPSCONTENT;
if ( \IPS\Settings::i()->googlemaps and \IPS\Settings::i()->google_maps_api_key ):
$return .= <<<IPSCONTENT
'google'
IPSCONTENT;
elseif ( \IPS\Settings::i()->mapbox and \IPS\Settings::i()->mapbox_api_key ):
$return .= <<<IPSCONTENT
'mapbox'
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
'none'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
mapApiKey:
IPSCONTENT;
if ( \IPS\Settings::i()->googlemaps and \IPS\Settings::i()->google_maps_api_key ):
$return .= <<<IPSCONTENT
"
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->google_maps_api_key, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
elseif ( \IPS\Settings::i()->mapbox and \IPS\Settings::i()->mapbox_api_key ):
$return .= <<<IPSCONTENT
"
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->mapbox_api_key, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
''
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
pushPublicKey:
IPSCONTENT;
if ( \IPS\Notification::webPushEnabled() ):
$return .= <<<IPSCONTENT
"
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->vapid_public_key, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
null
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
relativeDates:
IPSCONTENT;
if ( \IPS\Settings::i()->relative_dates_enable ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
,
pagebuilderKey: "
IPSCONTENT;
$return .= json_decode( file_get_contents( \IPS\ROOT_PATH . '/applications/core/data/pagebuilder.json' ), true )['build'];
$return .= <<<IPSCONTENT
",
ipsApps:
IPSCONTENT;
$return .= json_encode( \IPS\IPS::$ipsApps );
$return .= <<<IPSCONTENT
};
IPSCONTENT;
if ( \IPS\Settings::i()->custom_page_view_js && \IPS\Dispatcher::hasInstance() && \IPS\Dispatcher::i()->controllerLocation == 'front' ):
$return .= <<<IPSCONTENT
ipsSettings['paginateCode'] =
IPSCONTENT;
$return .= \IPS\Settings::i()->custom_page_view_js;
$return .= <<<IPSCONTENT
;
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !empty( $maxImageDims[0] ) AND !empty( $maxImageDims[1] ) AND ( \intval( $maxImageDims[0] ) !== 0 || \intval( $maxImageDims[1] ) !== 0 ) ):
$return .= <<<IPSCONTENT
ipsSettings['maxImageDimensions'] = {
width:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $maxImageDims[0], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
,
height:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $maxImageDims[1], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
};
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
const ipsJsFileMap =
IPSCONTENT;
$return .= json_encode(\IPS\Output\Javascript::getJavascriptFileMap());
$return .= <<<IPSCONTENT
;
</script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() and \IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation == 'front' and \IPS\Settings::i()->fb_pixel_enabled and \IPS\Settings::i()->fb_pixel_id ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$pixelId = \IPS\Settings::i()->fb_pixel_id;
$return .= <<<IPSCONTENT
<!-- Facebook Pixel Code -->
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
setTimeout( function() {
fbq('init', '
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pixelId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
');
IPSCONTENT;
if ( $pixels = \IPS\core\Facebook\Pixel::i()->output() ):
$return .= <<<IPSCONTENT
{$pixels}
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
},
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \intval( \IPS\Settings::i()->fb_pixel_delay * 1000 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
);
</script>
<!-- End Facebook Pixel Code -->
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( array_unique( array_filter( \IPS\Output::i()->jsFiles ), SORT_STRING ) as $js ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$js = \IPS\Http\Url::external( $js );
$return .= <<<IPSCONTENT
<script
src='
IPSCONTENT;
if ( $js->data['host'] == parse_url( \IPS\Settings::i()->base_url, PHP_URL_HOST ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $js->setQueryString( 'v', \IPS\Output\Javascript::javascriptCacheBustKey() ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $js, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'
data-ips
IPSCONTENT;
if ( str_contains( $js, "interface/static/iro" ) or str_contains( $js, 'interface/static/tiptap' ) or str_contains( $js, "interface/static/pagebuilder" ) or str_contains( $js, 'interface/static/codehighlighting' ) ):
$return .= <<<IPSCONTENT
type="module"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( str_contains( $js, "interface/static/iro" ) ):
$return .= <<<IPSCONTENT
data-iro-loader
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
></script>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( array_unique( \IPS\Output::i()->jsFilesAsync, SORT_STRING ) as $js ):
$return .= <<<IPSCONTENT
<script
src="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Http\Url::external( $js )->setQueryString( 'v', \IPS\Output\Javascript::javascriptCacheBustKey() ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( str_contains( $js, 'interface/static/tiptap' ) or str_contains( $js, "interface/static/pagebuilder" ) or str_contains( $js, 'interface/static/codehighlighting' ) ):
$return .= <<<IPSCONTENT
type="module"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
async
></script>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() and ( \count( \IPS\Output::i()->jsVars ) || \IPS\Output::i()->headJs) ):
$return .= <<<IPSCONTENT
<script>
IPSCONTENT;
foreach ( \IPS\Output::i()->jsVars as $k => $v ):
$return .= <<<IPSCONTENT
ips.setSetting( '
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $k, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
',
IPSCONTENT;
if ( ! \is_array( $v ) ):
$return .= <<<IPSCONTENT
jQuery.parseJSON('
IPSCONTENT;
$return .= json_encode( $v, JSON_HEX_APOS );
$return .= <<<IPSCONTENT
')
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= json_encode( $v, JSON_HEX_APOS );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
);
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
$hasPermission = \IPS\Helpers\Form\Editor::memberHasPermission( permission: "raw_embed" );
$return .= <<<IPSCONTENT
ips.setSetting('maxEmbedWidth',
IPSCONTENT;
$return .= json_encode( \IPS\Settings::i()->max_internalembed_width ?: null, JSON_HEX_APOS );
$return .= <<<IPSCONTENT
);
ips.setSetting('maxEmbeddedMediaWidth',
IPSCONTENT;
$return .= json_encode( \IPS\Settings::i()->max_embeddedmedia_width ?: null, JSON_HEX_APOS );
$return .= <<<IPSCONTENT
);
ips.setSetting('allowedIframeDomains',
IPSCONTENT;
$return .= ( $hasPermission and \IPS\Settings::i()->ipb_embed_url_filter_option ) ? json_encode(explode(',',\IPS\Settings::i()->ipb_embed_url_whitelist), JSON_HEX_APOS ) : '[]';
$return .= <<<IPSCONTENT
);
IPSCONTENT;
$return .= \IPS\Output::i()->headJs;
$return .= <<<IPSCONTENT
</script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \count( \IPS\Output::i()->jsonLd ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( \IPS\Output::i()->jsonLd as $object ):
$return .= <<<IPSCONTENT
<script type='application/ld+json'>
IPSCONTENT;
$return .= json_encode( $object, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS );
$return .= <<<IPSCONTENT
</script>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<script>
(() => {
let gqlKeys =
IPSCONTENT;
$return .= json_encode(\IPS\Output::i()->graphData);
$return .= <<<IPSCONTENT
;
for (let [k, v] of Object.entries(gqlKeys)) {
ips.setGraphQlData(k, v);
}
})();
</script>
IPSCONTENT;
if ( \IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation == 'front' and \IPS\Theme::i()->core_js ):
$return .= <<<IPSCONTENT
<!-- Theme javascript -->
<script>
IPSCONTENT;
$return .= \IPS\Theme::i()->getCustomJsForOutput();
$return .= <<<IPSCONTENT
</script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<!-- Need to add VLE tags regarless of ajax -->
IPSCONTENT;
if ( \IPS\Lang::vleActive() ):
$return .= <<<IPSCONTENT
<script>
// vle words defined here, on the next line <!--ipsVleWords-->
</script>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function includeMeta( ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
IPSCONTENT;
if ( !isset( \IPS\Output::i()->metaTags['og:image'] ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$shareLogos = \IPS\Settings::i()->icons_sharer_logo ? json_decode( \IPS\Settings::i()->icons_sharer_logo, true ) : array();
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $shareLogos as $logo ):
$return .= <<<IPSCONTENT
<meta property="og:image" content="
IPSCONTENT;
$return .= \IPS\File::get( "core_Icons", $logo )->url->setScheme("https");
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !isset( \IPS\Output::i()->metaTags['og:image'] ) and !\count( $shareLogos ) ):
$return .= <<<IPSCONTENT
<meta name="twitter:card" content="summary">
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<meta name="twitter:card" content="summary_large_image">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Settings::i()->site_twitter_id ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( mb_substr( \IPS\Settings::i()->site_twitter_id, 0, 1 ) === '@' ):
$return .= <<<IPSCONTENT
<meta name="twitter:site" content="
IPSCONTENT;
$return .= \IPS\Settings::i()->site_twitter_id;
$return .= <<<IPSCONTENT
">
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<meta name="twitter:site" content="@
IPSCONTENT;
$return .= \IPS\Settings::i()->site_twitter_id;
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( \IPS\Output::i()->metaTags as $name => $content ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $name == 'canonical' ):
$return .= <<<IPSCONTENT
<link rel="canonical" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $content, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $name != 'title' ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \is_array( $content ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $content as $_value ):
$return .= <<<IPSCONTENT
<meta
IPSCONTENT;
if ( mb_substr( $name, 0, 3 ) === 'og:' or mb_substr( $name, 0, 3 ) === 'fb:' ):
$return .= <<<IPSCONTENT
property
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
name
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" content="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $_value, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
elseif ( $content ):
$return .= <<<IPSCONTENT
<meta
IPSCONTENT;
if ( mb_substr( $name, 0, 3 ) === 'og:' or mb_substr( $name, 0, 3 ) === 'fb:' ):
$return .= <<<IPSCONTENT
property
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
name
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" content="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $content, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( \IPS\Output::i()->linkTags as $type => $value ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \is_array( $value ) ):
$return .= <<<IPSCONTENT
<link
IPSCONTENT;
foreach ( $value as $k => $v ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $k, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $v, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
/>
IPSCONTENT;
elseif ( $type != 'canonical' OR !isset( \IPS\Output::i()->metaTags['canonical'] ) ):
$return .= <<<IPSCONTENT
<link rel="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $type, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $value, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( \IPS\Output::i()->rssFeeds as $title => $url ):
$return .= <<<IPSCONTENT
<link rel="alternate" type="application/rss+xml" title="
IPSCONTENT;
$val = "{$title}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Output::i()->base ):
$return .= <<<IPSCONTENT
<base target="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Output::i()->base, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$manifest = json_decode( \IPS\Settings::i()->manifest_details, TRUE );
$return .= <<<IPSCONTENT
IPSCONTENT;
$manifest['cache_key'] = isset($manifest['cache_key']) ? $manifest['cache_key'] : time();
$return .= <<<IPSCONTENT
<link rel="manifest" href="
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=metatags&do=manifest", "front", "manifest", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
if ( isset( $manifest['theme_color'] ) ):
$return .= <<<IPSCONTENT
<meta name="theme-color" content="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $manifest['theme_color'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Settings::i()->icons_mask_icon AND \IPS\Settings::i()->icons_mask_color ):
$return .= <<<IPSCONTENT
<link rel="mask-icon" href="
IPSCONTENT;
$return .= \IPS\File::get( "core_Icons", \IPS\Settings::i()->icons_mask_icon )->url->setQueryString( 'v', $manifest['cache_key']);
$return .= <<<IPSCONTENT
" color="
IPSCONTENT;
$return .= \IPS\Settings::i()->icons_mask_color;
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$homeScreen = json_decode( \IPS\Settings::i()->icons_homescreen, TRUE ) ?? array();
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $homeScreen as $name => $image ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $name === 'apple-touch-icon-180x180' ):
$return .= <<<IPSCONTENT
<link rel="apple-touch-icon" href="
IPSCONTENT;
$return .= \IPS\File::get( "core_Icons", $image['url'] )->url->setQueryString( 'v', $manifest['cache_key']);
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
$apple = json_decode( \IPS\Settings::i()->icons_apple_startup, TRUE ) ?? array();
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \count( $apple ) ):
$return .= <<<IPSCONTENT
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
IPSCONTENT;
foreach ( $apple as $name => $image ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $name !== 'original' ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$deviceWidth = ($image['orientation'] === 'portrait') ? $image['width'] / $image['density'] : $image['height'] / $image['density'] ;
$return .= <<<IPSCONTENT
IPSCONTENT;
$deviceHeight = ($image['orientation'] === 'portrait') ? $image['height'] / $image['density'] : $image['width'] / $image['density'] ;
$return .= <<<IPSCONTENT
<link rel="apple-touch-startup-image" media="screen and (device-width:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $deviceWidth, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px) and (device-height:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $deviceHeight, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px) and (-webkit-device-pixel-ratio:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $image['density'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
) and (orientation:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $image['orientation'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
)" href="
IPSCONTENT;
$return .= \IPS\File::get( "core_Icons", $image['url'] )->url->setQueryString( 'v', $manifest['cache_key']);
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function message( $message, $type, $debug=NULL, $parse=TRUE ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $debug !== NULL ):
$return .= <<<IPSCONTENT
<div class="ipsMessage ipsMessage--
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $type, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
if ( $parse ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$val = "{$message}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
{$message}
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<br><br>
<pre>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $debug, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</pre>
</div>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<p class="ipsMessage ipsMessage--
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $type, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
if ( $parse ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$val = "{$message}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
{$message}
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function miniPagination( $baseUrl, $pages, $activePage=1, $perPage=25, $ajax=FALSE, $pageParam='page' ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $pages > 1 ):
$return .= <<<IPSCONTENT
<ul class="ipsMiniPagination" id='elPagination_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( md5($baseUrl), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
foreach ( range( 1, ( 4 > $pages ) ? $pages : 4 ) as $i ):
$return .= <<<IPSCONTENT
<li hidden><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $i ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$sprintf = array($i); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'go_to_page_x', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $pages > 4 ):
$return .= <<<IPSCONTENT
<li hidden><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $pages ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'last_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
<i class='fa-solid fa-caret-right'></i></a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<li><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $pages ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'last_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'><span><i class="fa-regular fa-file-lines"></i>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</span></a></li>
</ul>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function multipleRedirect( $url, $mr=NULL, $height=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
<div class="ipsRedirect_manualButton">
<a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'mr' => '0', '_mrReset' => 1 ) ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' class="ipsButton ipsButton--primary">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'start', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a>
</div>
<div data-controller="core.global.core.multipleRedirect" data-url="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
<div class="ipsRedirect ipsHide i-padding_3">
<div class="ipsLoading ipsRedirect--loading" data-role="loadingIcon" data-loading-text=""
IPSCONTENT;
if ( $height ):
$return .= <<<IPSCONTENT
style="height:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $height, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
px;"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
</div>
<div class="ipsHide" data-role="progressBarContainer">
<div class="ipsRedirect_progress" data-loading-text="">
<div class="ipsProgress ipsProgress--animated">
<div class="ipsProgress__progress" data-role="progressBar"></div>
</div>
</div>
</div>
</div>
</div>
IPSCONTENT;
return $return;
}
function offline( ) {
$return = '';
$return .= <<<IPSCONTENT
<!DOCTYPE html>
<html lang="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Member::loggedIn()->language()->bcp47(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" dir="
IPSCONTENT;
if ( \IPS\Member::loggedIn()->language()->isrtl ):
$return .= <<<IPSCONTENT
rtl
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
ltr
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
">
<head>
<title>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'you_are_offline', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
-
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->board_name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
<style>
:root{
--background: hsl(0 0% 94%);
--color: hsl(0 0% 40%);
--color-hard: hsl(0 0% 10%);
--button--ba-co: hsl(0 0% 10%);
--button--co: hsl(0 0% 100%);
}
@media (prefers-color-scheme: dark){
:root{
--background: hsl(0 0% 10%);
--color: hsl(0 0% 60%);
--color-hard: hsl(0 0% 100%);
--button--ba-co: hsl(0 0% 95%);
--button--co: hsl(0 0% 0%);
}
}
*, *::before, *::after{
box-sizing: border-box;
}
html {
background: var(--background);
}
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 16px;
line-height: 1.5;
color: var(--color);
min-height: 100vh;
min-height: 100svh;
display: grid;
place-content: center;
}
.cOfflineBox{
margin: auto;
max-width: min(90vw, 500px);
}
h1{
color: var(--color-hard);
font-weight: 600;
margin: 0;
margin-bottom: .4em;
font-size: min(1em + 3vw, 2.5em);
line-height: 1.2;
}
h2{
color: var(--color-hard);
font-weight: 500;
margin: 0;
margin-bottom: .4em;
font-size: min(1em + 1vw, 1.5em);
}
.ipsButton {
border: 0;
font-weight: 500;
text-align: center;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: .7em;
vertical-align: middle;
padding: .8em 1.5em;
border-radius: 5px;
cursor: pointer;
user-select: none;
background: var(--button--ba-co);
color: var(--button--co);
margin-top: 2em;
}
.ipsButton:hover{
background-image: linear-gradient(hsl(0 0% 100% / .15) 0% 100%);
}
svg{
height: 1em;
fill: currentColor;
}
</style>
<link rel='shortcut icon' href='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAzMCIgZmlsbD0iIzMzMzMzMyI+PHBhdGggZD0iTSAxNSAzIEMgMTQuMTY4NDMyIDMgMTMuNDU2MDYzIDMuNTA2NzIzOCAxMy4xNTQyOTcgNC4yMjg1MTU2IEwgMi4zMDA3ODEyIDIyLjk0NzI2NiBMIDIuMzAwNzgxMiAyMi45NDkyMTkgQSAyIDIgMCAwIDAgMiAyNCBBIDIgMiAwIDAgMCA0IDI2IEEgMiAyIDAgMCAwIDQuMTQwNjI1IDI1Ljk5NDE0MSBMIDQuMTQ0NTMxMiAyNiBMIDE1IDI2IEwgMjUuODU1NDY5IDI2IEwgMjUuODU5Mzc1IDI1Ljk5MjE4OCBBIDIgMiAwIDAgMCAyNiAyNiBBIDIgMiAwIDAgMCAyOCAyNCBBIDIgMiAwIDAgMCAyNy42OTkyMTkgMjIuOTQ3MjY2IEwgMjcuNjgzNTk0IDIyLjkxOTkyMiBBIDIgMiAwIDAgMCAyNy42ODE2NDEgMjIuOTE3OTY5IEwgMTYuODQ1NzAzIDQuMjI4NTE1NiBDIDE2LjU0MzkzNyAzLjUwNjcyMzggMTUuODMxNTY4IDMgMTUgMyB6IE0gMTMuNzg3MTA5IDExLjM1OTM3NSBMIDE2LjIxMjg5MSAxMS4zNTkzNzUgTCAxNi4wMTE3MTkgMTcuODMyMDMxIEwgMTMuOTg4MjgxIDE3LjgzMjAzMSBMIDEzLjc4NzEwOSAxMS4zNTkzNzUgeiBNIDE1LjAwMzkwNiAxOS44MTA1NDcgQyAxNS44MjU5MDYgMTkuODEwNTQ3IDE2LjMxODM1OSAyMC4yNTI4MTMgMTYuMzE4MzU5IDIxLjAwNzgxMiBDIDE2LjMxODM1OSAyMS43NDg4MTIgMTUuODI1OTA2IDIyLjE4OTQ1MyAxNS4wMDM5MDYgMjIuMTg5NDUzIEMgMTQuMTc1OTA2IDIyLjE4OTQ1MyAxMy42Nzk2ODggMjEuNzQ4ODEzIDEzLjY3OTY4OCAyMS4wMDc4MTIgQyAxMy42Nzk2ODggMjAuMjUyODEzIDE0LjE3NDkwNiAxOS44MTA1NDcgMTUuMDAzOTA2IDE5LjgxMDU0NyB6IiBmaWxsPSIjMzMzMzMzIi8+PC9zdmc+Cg==' type="image/svg+xml">
</head>
<body>
<div class='cOfflineBox'>
<h1>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Settings::i()->board_name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</h1>
<h2>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'user_offline_title', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</h2>
<p>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'user_offline_1', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
<p>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'user_offline_2', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
<button onclick="javascript: window.location.reload()" class='ipsButton'>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.4 229.3 87.4 316.7 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 1z"/></svg>
<span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'offline_try_again', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span>
</button>
</div>
</body>
</html>
IPSCONTENT;
return $return;
}
function pagination( $baseUrl, $pages, $activePage=1, $perPage=25, $ajax=TRUE, $pageParam='page', $simple=false ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
$firstPage = $baseUrl->setPage( $pageParam );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $activePage > 1 || $pages > 1 ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$uniqId = mt_rand();
$return .= <<<IPSCONTENT
<ul class='ipsPagination
IPSCONTENT;
if ( $pages > 5 ):
$return .= <<<IPSCONTENT
ipsPagination--numerous
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' id='elPagination_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( md5($baseUrl), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $uniqId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsPagination-seoPagination='
IPSCONTENT;
if ( $firstPage->seoPagination ):
$return .= <<<IPSCONTENT
true
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
false
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' data-pages='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( $ajax and ( \IPS\Settings::i()->ajax_pagination or \IPS\Widget\Request::i()->isAjax()) ):
$return .= <<<IPSCONTENT
data-ipsPagination
IPSCONTENT;
if ( $pageParam != 'page' ):
$return .= <<<IPSCONTENT
data-ipsPagination-pageParam='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pageParam, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
data-ipsPagination-pages="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-ipsPagination-perPage='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $perPage, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
if ( $simple ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $activePage > 1 ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__prev'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage - 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="prev" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage - 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $activePage < $pages ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__next'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage + 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="next" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage + 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $activePage != 1 ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__first'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $firstPage, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="first" data-page='1' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'first_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'><i class='fa-solid fa-angles-left'></i></a></li>
<li class='ipsPagination__prev'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage - 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="prev" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage - 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
foreach ( range( ( ( $activePage - 5 ) > 0 ) ? ( $activePage - 5 ) : 1, $activePage - 1 ) as $idx => $i ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__page'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $i ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<li class='ipsPagination__first ipsPagination__inactive'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $firstPage, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="first" data-page='1' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'first_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'><i class='fa-solid fa-angles-left'></i></a></li>
<li class='ipsPagination__prev ipsPagination__inactive'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage - 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="prev" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage - 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'prev', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<li class='ipsPagination__page ipsPagination__active'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
if ( $activePage != $pages ):
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( range( $activePage + 1, ( ( $activePage + 5 ) > $pages ) ? $pages : ( $activePage + 5 ) ) as $idx => $i ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__page'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $i ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
<li class='ipsPagination__next'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $activePage + 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="next" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $activePage + 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
<li class='ipsPagination__last'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $pages ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="last" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'last_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'><i class='fa-solid fa-angles-right'></i></a></li>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<li class='ipsPagination__next ipsPagination__inactive'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, ( $activePage + 1 > $pages ) ? $pages : $activePage + 1 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="next" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( ( $activePage + 1 > $pages ) ? $pages : $activePage + 1, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'next', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
<li class='ipsPagination__last ipsPagination__inactive'><a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( $pageParam, $pages ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' rel="last" data-page='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-ipsTooltip title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'last_page', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'><i class='fa-solid fa-angles-right'></i></a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $pages > 1 ):
$return .= <<<IPSCONTENT
<li class='ipsPagination__pageJump'>
<button type="button" id="elPagination_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( md5($baseUrl), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $uniqId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_jump" popovertarget="elPagination_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( md5($baseUrl), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $uniqId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_jump_menu">
IPSCONTENT;
$sprintf = array($activePage, $pages); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'pagination', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
<i class='fa-solid fa-caret-down i-margin-start_icon'></i></button>
<i-dropdown popover id="elPagination_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( md5($baseUrl), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $uniqId, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_jump_menu">
<div class="iDropdown">
<form accept-charset='utf-8' method='post' action='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setPage( 'page', NULL ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-role="pageJump" data-baseUrl='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-bypassValidation='true'>
<ul class='i-flex i-gap_1 i-padding_2'>
<input type='number' min='1' max='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' placeholder='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'page_number', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
: 1 -
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pages, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' class='ipsInput i-flex_11' name='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $pageParam, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' inputmode="numeric" autofocus>
<input type='submit' class='ipsButton ipsButton--primary' value='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'go', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'>
</ul>
</form>
</div>
</i-dropdown>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function poll( $poll, $url ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !isset( \IPS\Widget\Request::i()->fetchPoll ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "poll:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<section data-ips-hook="poll" data-controller="core.front.core.poll">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "poll:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canVote() and \IPS\Widget\Request::i()->_poll != 'results' and ( !$poll->getVote() or \IPS\Widget\Request::i()->_poll == 'form') and $pollForm = $poll->buildForm() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "question:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<h2 data-ips-hook="question" class="ipsBox__header">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "question:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $poll->poll_question, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->votes ):
$return .= <<<IPSCONTENT
<span class="ipsBox__header-secondary"><i class="fa-regular fa-check-square"></i>
IPSCONTENT;
$pluralize = array( $poll->votes ); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_num_votes', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'pluralize' => $pluralize ) );
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "question:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</h2>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "question:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "contents:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<div data-ips-hook="contents" class="" data-role="pollContents">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "contents:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
{$pollForm->customTemplate( array( \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' ), 'pollForm' ), $url, $poll )}
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "contents:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "contents:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
elseif ( ( $poll->canViewResults() and ( !$poll->canVote() or $poll->getVote() ) ) or ( \IPS\Widget\Request::i()->_poll == 'results' and $poll->canViewResults() ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "questionNoVote:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<h2 data-ips-hook="questionNoVote" class="ipsBox__header">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "questionNoVote:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $poll->poll_question, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->votes ):
$return .= <<<IPSCONTENT
<span class="ipsBox__header-secondary"><i class="fa-regular fa-check-square"></i>
IPSCONTENT;
$pluralize = array( $poll->votes ); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_num_votes', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'pluralize' => $pluralize ) );
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "questionNoVote:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</h2>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "questionNoVote:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<div class="" data-role="pollContents">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "list:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<ol data-ips-hook="list" class="ipsPollList ipsBox__padding i-grid i-gap_4">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "list:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
$i = 0;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $poll->choices as $questionId => $question ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$i++;
$return .= <<<IPSCONTENT
<li>
<h3 class="ipsTitle ipsTitle--h5 ipsTitle--margin">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
.
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $question['question'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</h3>
<ul class="ipsPollList_choices i-grid i-gap_2 i-margin-top_2">
IPSCONTENT;
foreach ( $question['choice'] as $k => $choice ):
$return .= <<<IPSCONTENT
<li class="i-flex i-flex-wrap_wrap i-align-items_center i-gap_1">
<div class="i-flex_11 i-basis_340">
{$choice}
</div>
<div class="i-flex_91 i-basis_400 i-flex i-align-items_center i-gap_2">
<div class="i-flex_11">
<progress class="ipsProgress" max="100" value="
IPSCONTENT;
if ( array_sum( $question['votes'] ) > 0 ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \intval( ( $question['votes'][ $k ] / array_sum( $question['votes'] ) ) * 100 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
0
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
" title="
IPSCONTENT;
if ( array_sum( $question['votes'] ) > 0 ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \intval( ( $question['votes'][ $k ] / array_sum( $question['votes'] ) ) * 100 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
0
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
%" data-ipstooltip></progress>
</div>
<div style="flex: 0 0 4em" class="i-font-size_-1 i-flex i-align-items_center">
IPSCONTENT;
if ( $poll->canSeeVoters() && $question['votes'][ $k ] > 0 ):
$return .= <<<IPSCONTENT
<a href="
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Http\Url::internal( "app=core&module=system&controller=poll&do=voters&id={$poll->pid}&question={$questionId}&option={$k}", null, "", array(), 0 ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', TRUE );
$return .= <<<IPSCONTENT
" title="
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'view_voters', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
" class="i-color_soft" data-ipstooltip data-ipsdialog data-ipsdialog-size="narrow" data-ipsdialog-title="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $choice, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
<i class="fa-solid fa-user i-margin-end_icon i-opacity_5"></i>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $question['votes'][ $k ], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<i class="fa-solid fa-user i-margin-end_icon i-opacity_5"></i>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $question['votes'][ $k ], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
</div>
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "list:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</ol>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "list:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canVote() || !\IPS\Member::loggedIn()->member_id || $poll->canClose() || ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and !$poll->poll_closed ) || ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and $poll->poll_closed ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->poll_closed or ( $poll->poll_close_date instanceof \IPS\DateTime ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "closed:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<div data-ips-hook="closed" class="i-border-top_2 i-padding_2 i-font-weight_600 i-color_soft">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "closed:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->poll_closed ):
$return .= <<<IPSCONTENT
<p><i class="fa-solid fa-lock"></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_closed_for_votes', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and !$poll->poll_closed ):
$return .= <<<IPSCONTENT
<p>
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closes_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
elseif ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and $poll->poll_closed ):
$return .= <<<IPSCONTENT
<p>
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closed_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "closed:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "closed:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Member::loggedIn()->member_id ):
$return .= <<<IPSCONTENT
<p class="i-border-top_2 i-padding_2 i-color_soft">
IPSCONTENT;
$sprintf = array(\IPS\Http\Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ), \IPS\Http\Url::internal( 'app=core&module=system&controller=register', 'front', 'register' )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_guest', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "vote:before", [ $poll,$url ] );
$return .= <<<IPSCONTENT
<ul data-ips-hook="vote" class="ipsSubmitRow ipsSubmitRow--poll ipsButtons">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "vote:inside-start", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canVote() ):
$return .= <<<IPSCONTENT
<li>
<a href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( '_poll', 'form' ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" title="
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'show_vote_options', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
" class="ipsButton ipsButton--inherit i-margin-end_auto" data-action="viewResults"><i class="fa-solid fa-caret-left"></i><span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'show_vote_options', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span></a>
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canClose() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ! $poll->poll_closed ):
$return .= <<<IPSCONTENT
<li><a class="ipsButton ipsButton--inherit" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 0 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"><i class="fa-solid fa-lock"></i><span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_close', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span></a></li>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<li><a class="ipsButton ipsButton--inherit" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 1 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"><i class="fa-solid fa-unlock"></i><span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_open', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span></a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "vote:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "vote:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<h2 class="ipsBox__header">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $poll->poll_question, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->votes ):
$return .= <<<IPSCONTENT
<span class="ipsBox__header-secondary"><i class="fa-regular fa-check-square"></i>
IPSCONTENT;
$pluralize = array( $poll->votes ); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_num_votes', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'pluralize' => $pluralize ) );
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</h2>
<div class="i-padding_3" data-role="pollContents">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'no_permission_poll', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Member::loggedIn()->member_id ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$sprintf = array(\IPS\Http\Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ), \IPS\Http\Url::internal( 'app=core&module=system&controller=register', 'front', 'register' )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_guest', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canClose() || ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and !$poll->poll_closed ) || ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and $poll->poll_closed ) ):
$return .= <<<IPSCONTENT
<hr class="ipsHr">
<ul class="ipsButtons cPollButtons">
IPSCONTENT;
if ( $poll->canClose() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !$poll->poll_closed ):
$return .= <<<IPSCONTENT
<li><a class="ipsButton ipsButton--inherit ipsButton--small" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 0 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"><i class="fa-solid fa-lock"></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_close', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<li><a class="ipsButton ipsButton--inherit ipsButton--small" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 1 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"><i class="fa-solid fa-unlock"></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_open', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and !$poll->poll_closed ):
$return .= <<<IPSCONTENT
<li class="cPollCloseDate">
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closes_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
elseif ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and $poll->poll_closed ):
$return .= <<<IPSCONTENT
<li class="cPollCloseDate">
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closed_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !isset( \IPS\Widget\Request::i()->fetchPoll ) ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "poll:inside-end", [ $poll,$url ] );
$return .= <<<IPSCONTENT
</section>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/poll", "poll:after", [ $poll,$url ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function pollForm( $url, $poll, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
<form accept-charset='utf-8' class="ipsForm
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $class, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
ipsForm--poll" action="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->stripQueryString( array( 'fetchPoll', 'viewResults' ) ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" method="post"
IPSCONTENT;
if ( $uploadField ):
$return .= <<<IPSCONTENT
enctype="multipart/form-data"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $attributes as $k => $v ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $k, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $v, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
data-ipsForm>
<input type="hidden" name="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $id, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
_submitted" value="1">
IPSCONTENT;
foreach ( $hiddenValues as $k => $v ):
$return .= <<<IPSCONTENT
<input type="hidden" name="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $k, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" value="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $v, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $elements as $collection ):
$return .= <<<IPSCONTENT
<ol class='ipsPollList ipsPollList--questions'>
IPSCONTENT;
$i = 0;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $collection as $idx => $input ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$i++;
$return .= <<<IPSCONTENT
<li class='ipsFieldRow ipsFieldRow--noLabel'>
<h3 class='ipsTitle ipsTitle--h5 ipsTitle--margin'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $i, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
.
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $input->label, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</h3>
<div>
IPSCONTENT;
if ( !$input->options['multiple'] ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "forms", "core", 'global' )->radio( $input->name, $input->value, $input->required, $input->options['options'], $input->options['disabled'], '', $input->options['disabled'] );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "forms", "core", 'global' )->checkboxset( $input->name, $input->value, $input->required, $input->options['options'], FALSE, NULL, $input->options['disabled'], $input->options['toggles'], NULL, NULL, 'all', array(), TRUE, isset( $input->options['descriptions'] ) ? $input->options['descriptions'] : NULL, FALSE, FALSE, $input->options['condense'] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
if ( $input->error ):
$return .= <<<IPSCONTENT
<div class="ipsFieldRow__warning">
IPSCONTENT;
$val = "{$input->error}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ol>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ($poll->poll_close_date instanceof \IPS\DateTime) or $poll->poll_view_voters ):
$return .= <<<IPSCONTENT
<div class='i-padding_2 i-border-top_2 i-font-weight_600 i-color_soft'>
IPSCONTENT;
if ( $poll->poll_view_voters ):
$return .= <<<IPSCONTENT
<p><i class="fa-regular fa-eye i-margin-end_icon"></i>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_is_public', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and !$poll->poll_closed ):
$return .= <<<IPSCONTENT
<p><i class="fa-regular fa-clock i-margin-end_icon"></i>
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closes_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
elseif ( ( $poll->poll_close_date instanceof \IPS\DateTime ) and $poll->poll_closed ):
$return .= <<<IPSCONTENT
<p><i class="fa-regular fa-clock i-margin-end_icon"></i>
IPSCONTENT;
$sprintf = array($poll->poll_close_date->localeDate(), $poll->poll_close_date->localeTime( FALSE )); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_auto_closed_on', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<div class="ipsSubmitRow ipsSubmitRow--votePoll">
<ul class="ipsButtons">
<li>
<button type="submit" class="ipsButton ipsButton--primary" accesskey="s" role="button">
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'save_vote', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</button>
</li>
IPSCONTENT;
if ( $poll->canViewResults() ):
$return .= <<<IPSCONTENT
<li><a class='ipsButton ipsButton--text i-margin-end_auto' title='
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'show_results_title', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( \IPS\Settings::i()->allow_result_view ):
$return .= <<<IPSCONTENT
href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( '_poll', 'results' ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( '_poll' => 'results', 'nullVote' => 1 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Settings::i()->allow_result_view ):
$return .= <<<IPSCONTENT
data-viewResults-confirm="
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'warn_allow_result_view', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
data-action='viewResults'>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'show_results', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $poll->canClose() ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( ! $poll->poll_closed ):
$return .= <<<IPSCONTENT
<li><a class='ipsButton ipsButton--inherit' href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 0 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'><i class="fa-solid fa-lock"></i><span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_close', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span></a></li>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<li><a class='ipsButton ipsButton--inherit' href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url->setQueryString( array( 'do' => 'pollStatus', 'value' => 1 ) )->csrf(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'><i class="fa-solid fa-unlock"></i><span>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'poll_open', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span></a></li>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</ul>
</div>
</form>
IPSCONTENT;
return $return;
}
function pollVoters( $votes ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
<div class='ipsBox ipsBox--pollVoters'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<ul class="ipsSpanGrid i-padding_3">
IPSCONTENT;
foreach ( $votes as $vote ):
$return .= <<<IPSCONTENT
<li class='ipsSpanGrid__6 ipsPhotoPanel ipsPhotoPanel--mini'>
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "global", "core" )->userPhoto( \IPS\Member::load( $vote->member_id ), 'mini' );
$return .= <<<IPSCONTENT
<div>
<h3 class='ipsTruncate_1'>
IPSCONTENT;
$return .= htmlspecialchars( \IPS\Member::load( $vote->member_id )->name, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</h3>
<span class="i-color_soft">
IPSCONTENT;
$val = ( $vote->vote_date instanceof \IPS\DateTime ) ? $vote->vote_date : \IPS\DateTime::ts( $vote->vote_date );$return .= $val->html(useTitle: true);
$return .= <<<IPSCONTENT
</span>
</div>
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
if ( !\IPS\Widget\Request::i()->isAjax() ):
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function prettyprint( $code ) {
$return = '';
$return .= <<<IPSCONTENT
<pre class='prettyprint'>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $code, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</pre>
IPSCONTENT;
return $return;
}
function rank( $rank, $cssClass=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
if ( $rank->icon AND $rank->rank_use_image ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->_icon->url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->_icon, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
' loading="lazy" alt="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->_title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" class="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $cssClass, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-ipsTooltip title="
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'profile_rank', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
:
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->_title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
(
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->rankPosition()['pos'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
/
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $rank->rankPosition()['max'], ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
)">
IPSCONTENT;
return $return;
}
function redirect( $url, $message ) {
$return = '';
$return .= <<<IPSCONTENT
<!DOCTYPE html>
<html lang="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( \IPS\Member::loggedIn()->language()->bcp47(), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" dir="
IPSCONTENT;
if ( \IPS\Member::loggedIn()->language()->isrtl ):
$return .= <<<IPSCONTENT
rtl
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
ltr
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
">
<head>
<title>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'redirecting', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</title>
<meta http-equiv="refresh" content="2; url=
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
<meta name="robots" content="noindex,nofollow">
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "global", "core", 'global' )->includeMeta( );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "global", "core", 'global' )->includeCSS( );
$return .= <<<IPSCONTENT
</head>
<body>
<p class="ipsMessage ipsMessage--info ipsRedirectMessage">
<strong>
IPSCONTENT;
$val = "{$message}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</strong><br>
<br>
IPSCONTENT;
$return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'redirecting_wait', ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</p>
IPSCONTENT;
$return .= \IPS\Theme::i()->getTemplate( "global", "core", 'global' )->includeJS( );
$return .= <<<IPSCONTENT
</body>
</html>
IPSCONTENT;
return $return;
}
function referralBanner( $url ) {
$return = '';
$return .= <<<IPSCONTENT
<img src="
IPSCONTENT;
$return .= \IPS\File::get( "core_ReferralBanners", $url )->url;
$return .= <<<IPSCONTENT
" class="ipsImage">
IPSCONTENT;
return $return;
}
function richText( $value, $extraClasses=array(), $extraControllers=array(), $extraAttributes=array() ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( \IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation == 'front' ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$controllers = array_merge( array('core.front.core.lightboxedImages'), $extraControllers );
$return .= <<<IPSCONTENT
<div class='ipsRichText
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( implode(' ', $extraClasses), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' data-controller='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( implode(',', $controllers), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
foreach ( $extraAttributes as $attribute ):
$return .= <<<IPSCONTENT
{$attribute}
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
>{$value}</div>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$controllers = $extraControllers;
$return .= <<<IPSCONTENT
<div class='ipsRichText
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( implode(' ', $extraClasses), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
if ( \is_array( $controllers ) AND \count( $controllers ) ):
$return .= <<<IPSCONTENT
data-controller='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( implode(',', $controllers), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $extraAttributes as $attribute ):
$return .= <<<IPSCONTENT
{$attribute}
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
>{$value}</div>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function staticMap( $linkUrl, $imageUrl, $lat=NULL, $long=NULL, $width=NULL, $height=NULL ) {
$return = '';
$return .= <<<IPSCONTENT
<div>
IPSCONTENT;
if ( $lat and $long ):
$return .= <<<IPSCONTENT
<span itemscope itemtype='http://schema.org/GeoCoordinates'>
<meta itemprop='latitude' content='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $lat, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
<meta itemprop='longitude' content='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $long, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
if ( $linkUrl ):
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $linkUrl, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' target='_blank' rel='noopener'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $imageUrl, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' alt='' class='ipsImage'
IPSCONTENT;
if ( $width AND $height ):
$return .= <<<IPSCONTENT
width='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' height='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $height, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
loading='lazy'>
IPSCONTENT;
if ( $linkUrl ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $linkUrl ):
$return .= <<<IPSCONTENT
<a href='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $linkUrl, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' target='_blank' rel='noopener'>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<img src='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $imageUrl, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' alt='' class='ipsImage'
IPSCONTENT;
if ( $width AND $height ):
$return .= <<<IPSCONTENT
width='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $width, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
' height='
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $height, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
'
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
loading='lazy'>
IPSCONTENT;
if ( $linkUrl ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
return $return;
}
function tabScrollers( ) {
$return = '';
$return .= <<<IPSCONTENT
<div class="ipsTabs__scrollers" data-role="tabScrollers">
<button data-direction="prev" type="button" aria-hidden="true" tabindex="-1" hidden><i class="fa-solid fa-angle-left"></i></button>
<button data-direction="next" type="button" aria-hidden="true" tabindex="-1" hidden><i class="fa-solid fa-angle-right"></i></button>
</div>
IPSCONTENT;
return $return;
}
function textBlock( $message ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/textBlock", "message:before", [ $message ] );
$return .= <<<IPSCONTENT
<div data-ips-hook="message">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/textBlock", "message:inside-start", [ $message ] );
$return .= <<<IPSCONTENT
{$message}
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/textBlock", "message:inside-end", [ $message ] );
$return .= <<<IPSCONTENT
</div>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/textBlock", "message:after", [ $message ] );
$return .= <<<IPSCONTENT
<br>
IPSCONTENT;
return $return;
}
function titleWithLink( $title, $link=NULL, $text='more_info', $hovertitle=NULL, $parsed=FALSE ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $link===NULL ):
$return .= <<<IPSCONTENT
<strong>
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</strong>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/titleWithLink", "url:before", [ $title,$link,$text,$hovertitle,$parsed ] );
$return .= <<<IPSCONTENT
<a data-ips-hook="url" data-ipstooltip
IPSCONTENT;
if ( $hovertitle !== NULL ):
$return .= <<<IPSCONTENT
_title="
IPSCONTENT;
if ( !$parsed ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$val = "{$hovertitle}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $hovertitle, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $link, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
">
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/titleWithLink", "url:inside-start", [ $title,$link,$text,$hovertitle,$parsed ] );
$return .= <<<IPSCONTENT
<span class="ipsType i-font-weight_bold">
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $title, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
</span> <i class="fa-solid fa-arrow-up-right-from-square ipsType i-color_soft i-font-size_-2"></i>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/titleWithLink", "url:inside-end", [ $title,$link,$text,$hovertitle,$parsed ] );
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/titleWithLink", "url:after", [ $title,$link,$text,$hovertitle,$parsed ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function truncatedUrl( $url, $newWindow=TRUE, $length=50 ) {
$return = '';
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/truncatedUrl", "url:before", [ $url,$newWindow,$length ] );
$return .= <<<IPSCONTENT
<a data-ips-hook="url" href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
"
IPSCONTENT;
if ( $newWindow === TRUE ):
$return .= <<<IPSCONTENT
target="_blank" rel="noopener"
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/truncatedUrl", "url:inside-start", [ $url,$newWindow,$length ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= htmlspecialchars( mb_substr( html_entity_decode( $url ), '0', $length ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE ) . ( ( mb_strlen( html_entity_decode( $url ) ) > $length ) ? '&hellip;' : '' );
$return .= <<<IPSCONTENT
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/truncatedUrl", "url:inside-end", [ $url,$newWindow,$length ] );
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
$return .= \IPS\Theme\CustomTemplate::getCustomTemplatesForHookPoint( "core/global/global/truncatedUrl", "url:after", [ $url,$newWindow,$length ] );
$return .= <<<IPSCONTENT
IPSCONTENT;
return $return;
}
function vineEmbed( $url ) {
$return = '';
$return .= <<<IPSCONTENT
<div class="ipsEmbeddedVideo" contenteditable="false"><div><iframe class="vine-embed" src="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $url, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
/embed/simple" width="600" height="600"></iframe><script async src="//platform.vine.co/static/scripts/embed.js" charset="utf-8"></script></div></div>
IPSCONTENT;
return $return;
}
function wizard( $stepNames, $activeStep, $output, $baseUrl, $showSteps ) {
$return = '';
$return .= <<<IPSCONTENT
<div data-ipsWizard class='ipsWizard'>
IPSCONTENT;
if ( $showSteps ):
$return .= <<<IPSCONTENT
<ul class="ipsSteps" data-role="wizardStepbar">
IPSCONTENT;
$doneSteps = TRUE;
$return .= <<<IPSCONTENT
IPSCONTENT;
foreach ( $stepNames as $step => $name ):
$return .= <<<IPSCONTENT
IPSCONTENT;
if ( $activeStep == $name ):
$return .= <<<IPSCONTENT
IPSCONTENT;
$doneSteps = FALSE;
$return .= <<<IPSCONTENT
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<li class='ipsStep
IPSCONTENT;
if ( $activeStep == $name ):
$return .= <<<IPSCONTENT
ipsStep--active
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
'>
IPSCONTENT;
if ( $doneSteps ):
$return .= <<<IPSCONTENT
<a href="
IPSCONTENT;
$return .= \IPS\Theme\Template::htmlspecialchars( $baseUrl->setQueryString( '_step', $name ), ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE );
$return .= <<<IPSCONTENT
" data-action="wizardLink">
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
<span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<strong class='ipsStep_title'>
IPSCONTENT;
$sprintf = array($step + 1); $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( 'step_number', ENT_DISALLOWED, 'UTF-8', FALSE ), FALSE, array( 'sprintf' => $sprintf ) );
$return .= <<<IPSCONTENT
</strong>
<span class='ipsStep__desc'>
IPSCONTENT;
$val = "{$name}"; $return .= \IPS\Member::loggedIn()->language()->addToStack( htmlspecialchars( $val, ENT_DISALLOWED, 'UTF-8', FALSE ), TRUE, array( ) );
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
if ( $doneSteps ):
$return .= <<<IPSCONTENT
</a>
IPSCONTENT;
else:
$return .= <<<IPSCONTENT
</span>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
</li>
IPSCONTENT;
endforeach;
$return .= <<<IPSCONTENT
</ul>
IPSCONTENT;
endif;
$return .= <<<IPSCONTENT
<div data-role="wizardContent">
{$output}
</div>
</div>
IPSCONTENT;
return $return;
}}