<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2019 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Registry\Registry;
use Joomla\CMS\HTML\HTMLHelper;
class RSFormProAssets
{
// This flag checks if we need to run after the onAfterRender() event.
public static $replace = false;
public static $scripts = array();
public static $inlineScripts = '';
public static $styles = array();
public static $inlineStyles = '';
public static $customTags = '';
// Holds the resources already loaded (CSS and JS) so they will not be loaded twice by the System Plugin
public static $added = array();
public static function addScript($path) {
if (self::$replace) {
self::$scripts[$path] = 1;
} else {
if (method_exists(Factory::getDocument(), 'addScript')) {
self::$added[$path] = 1;
Factory::getDocument()->addScript($path, array('version' => 'auto'));
}
}
}
public static function addScriptDeclaration($script) {
if (self::$replace) {
if ($script) {
self::$inlineScripts .= chr(13).$script;
}
} else {
if (method_exists(Factory::getDocument(), 'addScriptDeclaration')) {
Factory::getDocument()->addScriptDeclaration($script);
}
}
}
public static function addStyleSheet($path) {
if (self::$replace) {
self::$styles[$path] = 1;
} else {
if (method_exists(Factory::getDocument(), 'addStyleSheet')) {
self::$added[$path] = 1;
Factory::getDocument()->addStyleSheet($path, array('version' => 'auto'));
}
}
}
public static function addStyleDeclaration($style) {
if (self::$replace) {
if ($style) {
self::$inlineStyles .= chr(13).$style;
}
} else {
if (method_exists(Factory::getDocument(), 'addStyleDeclaration')) {
Factory::getDocument()->addStyleDeclaration($style);
}
}
}
public static function addCustomTag($custom) {
if (self::$replace) {
if ($custom) {
self::$customTags .= chr(13).$custom;
}
} else {
if (method_exists(Factory::getDocument(), 'addCustomTag')) {
Factory::getDocument()->addCustomTag($custom);
}
}
}
public static function render() {
if (self::$replace) {
$body = self::getBody();
$newHead = '';
$nonce = false;
if (PluginHelper::isEnabled('system', 'httpheaders'))
{
$app = Factory::getApplication();
$plugin = PluginHelper::getPlugin('system', 'httpheaders');
$params = new Registry();
$params->loadString($plugin->params);
$cspEnabled = (int) $params->get('contentsecuritypolicy', 0);
$cspClient = (string) $params->get('contentsecuritypolicy_client', 'site');
$nonceEnabled = (int) $params->get('nonce_enabled', 0);
if ($cspEnabled && ($app->isClient($cspClient) || $cspClient === 'both'))
{
if ($nonceEnabled)
{
$nonce = Factory::getApplication()->get('csp_nonce');
}
}
}
if (self::$scripts) {
foreach (self::$scripts as $src => $tmp) {
if (!isset(self::$added[$src])) {
$test = self::createScript($src, true);
if (strpos($body, $test) === false)
{
$script = self::createScript($src, false, $nonce);
$newHead .= $script;
}
}
}
// Reset
self::$scripts = array();
}
if (self::$styles) {
foreach (self::$styles as $src => $tmp) {
if (!isset(self::$added[$src])) {
$test = self::createStyleSheet($src, true);
if (strpos($body, $test) === false)
{
$style = self::createStyleSheet($src, false, $nonce);
$newHead .= $style;
}
}
}
// Reset
self::$styles = array();
}
if (self::$inlineStyles) {
$inlineStyle = self::createStyleDeclaration(self::$inlineStyles, $nonce);
if (strpos($body, $inlineStyle) === false)
{
$newHead .= $inlineStyle;
}
// Reset
self::$inlineStyles = '';
}
if (self::$inlineScripts) {
$inlineScript = self::createScriptDeclaration(self::$inlineScripts, $nonce);
if (strpos($body, $inlineScript) === false)
{
$newHead .= $inlineScript;
}
// Reset
self::$inlineScripts = '';
}
if (self::$customTags) {
$customTag = self::$customTags."\n";
if (strpos($body, $customTag) === false)
{
$newHead .= $customTag;
}
// Reset
self::$customTags = '';
}
if ($newHead) {
$body = str_replace('</head>', $newHead.'</head>', $body);
self::setBody($body);
}
}
}
protected static function getBody() {
return Factory::getApplication()->getBody();
}
protected static function setBody($body) {
return Factory::getApplication()->setBody($body);
}
protected static function isHTML5() {
static $result;
if ($result === null) {
if (is_callable(array(Factory::getDocument(), 'isHtml5'))) {
$result = Factory::getDocument()->isHtml5();
} else {
$result = false;
}
}
return $result;
}
protected static function createScript($src, $test = false, $nonce = false)
{
$srcLine = ' src="' . $src;
if (!$test)
{
$html = '<script';
if (!self::isHTML5())
{
$html .= ' type="text/javascript"';
}
$html .= $srcLine;
$html .= '"';
if ($nonce)
{
$html .= ' nonce="' . $nonce . '"';
}
$html .= '></script>' . "\n";
}
else
{
$html = $srcLine;
}
return $html;
}
protected static function createScriptDeclaration($inlineScripts, $nonce = false) {
$html = '<script';
if (!self::isHTML5()) {
$html .= ' type="text/javascript"';
}
if ($nonce)
{
$html .= ' nonce="' . $nonce . '"';
}
$html .= '>'. "\n". $inlineScripts. "\n". '</script>'. "\n";
return $html;
}
protected static function createStyleSheet($src, $test = false, $nonce = false)
{
$srcLine = ' href="' . $src;
if (!$test)
{
$html = '<link rel="stylesheet"';
if (!self::isHTML5())
{
$html .= ' type="text/css"';
}
$html .= $srcLine;
$html .= '"';
if ($nonce)
{
$html .= ' nonce="' . $nonce . '"';
}
$html .= ' />' . "\n";
}
else
{
$html = $srcLine;
}
return $html;
}
protected static function createStyleDeclaration($inlineStyles, $nonce = false) {
$html = '<style';
if (!self::isHTML5()) {
$html .= ' type="text/css"';
}
if ($nonce)
{
$html .= ' nonce="' . $nonce . '"';
}
$html .= '>'. "\n". $inlineStyles. "\n". '</style>'. "\n";
return $html;
}
public static function addJquery()
{
try
{
HTMLHelper::_('jquery.framework');
// This allows jQuery to be loaded after content has been rendered in Joomla! 3.x
if (version_compare(JVERSION, '4.0', '<') && static::$replace)
{
$debug = (boolean) Factory::getApplication()->get('debug');
static::addScript(HTMLHelper::_('script', 'jui/jquery.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug, 'pathOnly' => true)));
static::addScript(HTMLHelper::_('script', 'jui/jquery-noconflict.js', array('version' => 'auto', 'relative' => true, 'pathOnly' => true)));
static::addScript(HTMLHelper::_('script', 'jui/jquery-migrate.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug, 'pathOnly' => true)));
}
}
catch (Exception $e)
{
// Let's try to add the asset through our own function on Joomla! 4.x
if (version_compare(JVERSION, '4.0', '>=') && static::$replace)
{
try
{
static::addScript(Factory::getApplication()->getDocument()->getWebAssetManager()->getAsset('script', 'jquery')->getUri());
}
catch (Exception $assetException)
{
// This shouldn't happen
}
}
}
}
}