File "unitecreator_output.class.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/unlimited-elements-for-elementor/inc_php/unitecreator_output.class.php
File size: 48.4 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

defined('UNLIMITED_ELEMENTS_INC') or die('Restricted access');
class UniteCreatorOutputWork extends HtmlOutputBaseUC
{
    private static $serial = 0;
    const TEMPLATE_HTML = "html";
    const TEMPLATE_CSS = "css";
    const TEMPLATE_CSS_ITEM = "css_item";
    const TEMPLATE_JS = "js";
    const TEMPLATE_HTML_ITEM = "item";
    const TEMPLATE_HTML_ITEM2 = "item2";
    private $addon;
    private $isInited = false;
    private $objTemplate;
    private $isItemsExists = false;
    private $itemsType = null;
    private $paramsCache = null;
    private $cacheConstants = null;
    private $processType = null;
    private $generatedID = null;
    private $isModePreview = false;
    private $arrOptions;
    private $isShowDebugData = false;
    private $debugDataType = "";
    private static $arrUrlCacheCss = array();
    private static $arrHandleCacheCss = array();
    private static $arrUrlCacheJs = array();
    private static $arrHandleCacheJs = array();
    public static $isBufferingCssActive = false;
    public static $bufferBodyCss;
    public static $bufferCssIncludes;
    public function __construct()
    {
        $this->addon = new UniteCreatorAddon();
        if (GlobalsUC::$isProVersion) {
            $this->objTemplate = new UniteCreatorTemplateEnginePro();
        } else {
            $this->objTemplate = new UniteCreatorTemplateEngine();
        }
        $this->processType = UniteCreatorParamsProcessor::PROCESS_TYPE_OUTPUT;
    }
    public function setProcessType($type)
    {
        UniteCreatorParamsProcessor::validateProcessType($type);
        $this->processType = $type;
    }
    private function validateInited()
    {
        if ($this->isInited == false) {
            UniteFunctionsUC::throwError("Output error: addon not inited");
        }
    }
    private function a_________INCLUDES_______()
    {
    }
    public static function clearIncludesCache()
    {
        self::$arrHandleCacheCss = array();
        self::$arrHandleCacheJs = array();
        self::$arrUrlCacheCss = array();
        self::$arrUrlCacheJs = array();
    }
    private function cacheInclude($url, $handle, $type)
    {
        if ($type == "css") {
            self::$arrUrlCacheCss[$url] = true;
            self::$arrHandleCacheCss[$handle] = true;
        } else {
            self::$arrUrlCacheJs[$url] = true;
            self::$arrHandleCacheJs[$handle] = true;
        }
    }
    private function isIncludeInCache($url, $handle, $type)
    {
        if (empty($url) || empty($handle)) {
            return false;
        }
        if ($type == "css") {
            if (isset(self::$arrUrlCacheCss[$url])) {
                return true;
            }
            if (isset(self::$arrHandleCacheCss[$handle])) {
                return true;
            }
        } else {
            if (isset(self::$arrUrlCacheJs[$url])) {
                return true;
            }
            if (isset(self::$arrHandleCacheJs[$handle])) {
                return true;
            }
        }
        return false;
    }
    private function checkIncludeCondition($condition)
    {
        if (empty($condition)) {
            return true;
        }
        if (!is_array($condition)) {
            return true;
        }
        $name = UniteFunctionsUC::getVal($condition, "name");
        $value = UniteFunctionsUC::getVal($condition, "value");
        if (empty($name)) {
            return true;
        }
        if ($name == "never_include") {
            return false;
        }
        $params = $this->getAddonParams();
        if (array_key_exists($name, $params) == false) {
            return true;
        }
        $paramValue = $params[$name];
        if ($paramValue === $value) {
            return true;
        } else {
            return false;
        }
    }
    private function processIncludesList($arrIncludes, $type)
    {
        $arrIncludesProcessed = array();
        foreach ($arrIncludes as $handle => $include) {
            $urlInclude = $include;
            if (is_array($include)) {
                $urlInclude = UniteFunctionsUC::getVal($include, "url");
                $condition = UniteFunctionsUC::getVal($include, "condition");
                $isIncludeByCondition = $this->checkIncludeCondition($condition);
                if ($isIncludeByCondition == false) {
                    continue;
                }
            }
            if (is_numeric($handle) || empty($handle)) {
                $addonName = $this->addon->getName();
                $handle = HelperUC::getUrlHandle($urlInclude, $addonName);
            }
            $urlInclude = HelperUC::urlToSSLCheck($urlInclude);
            $deps = array();
            $params = UniteFunctionsUC::getVal($include, "params");
            if (!empty($params)) {
                $includeAfterFrontend = UniteFunctionsUC::getVal($params, "include_after_elementor_frontend");
                $includeAfterFrontend = UniteFunctionsUC::strToBool($includeAfterFrontend);
                if ($includeAfterFrontend == true) {
                    $deps[] = "elementor-frontend";
                }
            }
            $arrIncludeNew = array();
            $arrIncludeNew["url"] = $urlInclude;
            $arrIncludeNew["type"] = $type;
            if (!empty($handle)) {
                $arrIncludeNew["handle"] = $handle;
            }
            if (!empty($deps)) {
                $arrIncludeNew["deps"] = $deps;
            }
            $arrIncludesProcessed[] = $arrIncludeNew;
        }
        return $arrIncludesProcessed;
    }
    protected function excludeExistingInlcudes($arrIncludes)
    {
        return $arrIncludes;
    }
    public function getProcessedIncludes($includeLibraries = false, $processProviderLibrary = false, $includesType = "all")
    {
        $this->validateInited();
        $arrLibJs = array();
        $arrLibCss = array();
        if ($includeLibraries == true) {
            $arrLibraries = $this->addon->getArrLibraryIncludesUrls($processProviderLibrary);
        }
        $arrIncludesJS = array();
        $arrIncludesCss = array();
        if ($includesType != "css") {
            if ($includeLibraries) {
                $arrLibJs = $arrLibraries["js"];
            }
            $arrIncludesJS = $this->addon->getJSIncludes();
            $arrIncludesJS = array_merge($arrLibJs, $arrIncludesJS);
            $arrIncludesJS = $this->processIncludesList($arrIncludesJS, "js");
        }
        if ($includesType != "js") {
            if ($includeLibraries) {
                $arrLibCss = $arrLibraries["css"];
            }
            $arrIncludesCss = $this->addon->getCSSIncludes();
            $arrIncludesCss = array_merge($arrLibCss, $arrIncludesCss);
            $arrIncludesCss = $this->processIncludesList($arrIncludesCss, "css");
        }
        $arrProcessedIncludes = array_merge($arrIncludesJS, $arrIncludesCss);
        $arrProcessedIncludes = $this->excludeExistingInlcudes($arrProcessedIncludes);
        return $arrProcessedIncludes;
    }
    private function getHtmlIncludes($arrIncludes = null, $filterType = null)
    {
        $this->validateInited();
        if (empty($arrIncludes)) {
            return "";
        }
        $addonName = $this->addon->getName();
        $html = "";
        foreach ($arrIncludes as $include) {
            $type = $include["type"];
            if ($filterType == "js" && $type != "js") {
                continue;
            }
            if ($filterType == "css" && $type != "css") {
                continue;
            }
            $url = $include["url"];
            $handle = UniteFunctionsUC::getVal($include, "handle");
            if (empty($handle)) {
                $handle = HelperUC::getUrlHandle($url, $addonName);
            }
            $isInCache = $this->isIncludeInCache($url, $handle, $type);
            if ($isInCache == true) {
                continue;
            }
            $this->cacheInclude($url, $handle, $type);
            switch ($type) {
                case "js":
                    $html .= self::TAB2 . "<script type='text/javascript' src='{$url}'></script>" . self::BR;
                    break;
                case "css":
                    $cssID = "{$handle}-css";
                    $html .= self::TAB2 . "<link id='{$cssID}' href='{$url}' type='text/css' rel='stylesheet' >" . self::BR;
                    break;
                default:
                    UniteFunctionsUC::throwError("Wrong include type: {$type} ");
                    break;
            }
        }
        return $html;
    }
    public function processIncludes($includesType = "all")
    {
        $arrIncludes = $this->getProcessedIncludes(true, true, $includesType);
        $addonName = $this->addon->getName();
        $arrDep = $this->addon->getIncludesJsDependancies();
        foreach ($arrIncludes as $include) {
            $type = $include["type"];
            $url = $include["url"];
            $handle = UniteFunctionsUC::getVal($include, "handle");
            $deps = UniteFunctionsUC::getVal($include, "deps");
            if (empty($handle)) {
                $handle = HelperUC::getUrlHandle($url, $addonName);
            }
            $isInCache = $this->isIncludeInCache($url, $handle, $type);
            if ($isInCache == true) {
                continue;
            }
            $this->cacheInclude($url, $handle, $type);
            $arrIncludeDep = $arrDep;
            if (!empty($deps)) {
                $arrIncludeDep = array_merge($arrIncludeDep, $deps);
            }
            switch ($type) {
                case "js":
                    UniteProviderFunctionsUC::addScript($handle, $url, false, $arrIncludeDep);
                    break;
                case "css":
                    UniteProviderFunctionsUC::addStyle($handle, $url);
                    break;
                default:
                    UniteFunctionsUC::throwError("Wrong include type: {$type} ");
                    break;
            }
        }
    }
    private function a________PREVIEW_HTML________()
    {
    }
    protected function putPreviewHtml_headerAdd()
    {
    }
    protected function putPreviewHtml_footerAdd()
    {
    }
    protected function onPreviewHtml_scriptsAdd()
    {
    }
    protected function modifyPreviewIncludes($arrIncludes)
    {
        return $arrIncludes;
    }
    private function ______CSS_SELECTORS_______()
    {
    }
    private function processParamCSSSelector_value($param, $selector)
    {
        $value = UniteFunctionsUC::getVal($param, "value");
        $selectorValue = UniteFunctionsUC::getVal($param, "selector_value");
        $selectorValueDesktop = str_replace("{{VALUE}}", $value, $selectorValue);
        $style = $selector . "{{$selectorValueDesktop}}";
        $isResponsive = UniteFunctionsUC::getVal($param, "is_responsive");
        $isResponsive = UniteFunctionsUC::strToBool($isResponsive);
        if ($isResponsive == false) {
            return $style;
        }
        $valueTablet = UniteFunctionsUC::getVal($param, "default_value_tablet");
        $valueTablet = trim($valueTablet);
        $valueMobile = UniteFunctionsUC::getVal($param, "default_value_mobile");
        $valueMobile = trim($valueMobile);
        $isExistsTablet = true;
        $isExistsMobile = true;
        $options = UniteFunctionsUC::getVal($param, "options");
        if (!empty($options)) {
            $isExistsTablet = false;
            $isExistsMobile = false;
            foreach ($options as $optionValue) {
                if ($optionValue == $valueMobile) {
                    $isExistsMobile = true;
                }
                if ($optionValue == $valueTablet) {
                    $isExistsTablet = true;
                }
            }
        }
        if ($isExistsTablet) {
            $selectorValueTablet = str_replace("{{VALUE}}", $valueTablet, $selectorValue);
            $styleTablet = $selector . "{{$selectorValueTablet}}";
            $styleTablet = HelperHtmlUC::wrapCssMobile($styleTablet, true);
            $style .= "\n" . $styleTablet;
        }
        if ($isExistsMobile) {
            $selectorValueMobile = str_replace("{{VALUE}}", $valueMobile, $selectorValue);
            $styleMobile = $selector . "{{$selectorValueMobile}}";
            $styleMobile = HelperHtmlUC::wrapCssMobile($styleMobile, true);
            $style .= "\n" . $styleMobile;
        }
        return $style;
    }
    private function processParamCSSSelector_border_getRadiusStyle($param, $device = "desktop")
    {
        $widthTop = UniteFunctionsUC::getVal($param, "width_{$device}_top");
        $widthRight = UniteFunctionsUC::getVal($param, "width_{$device}_right");
        $widthBottom = UniteFunctionsUC::getVal($param, "width_{$device}_bottom");
        $widthLeft = UniteFunctionsUC::getVal($param, "width_{$device}_left");
        $style = "";
        if (trim($widthTop) !== "") {
            $style .= "border-top-left-radius:{$widthTop}px;";
        }
        if (trim($widthBottom) !== "") {
            $style .= "border-bottom-left-radius:{$widthBottom}px;";
        }
        if (trim($widthRight) !== "") {
            $style .= "border-top-right-radius:{$widthRight}px;";
        }
        if (trim($widthLeft) !== "") {
            $style .= "border-bottom-left-radius:{$widthLeft}px;";
        }
        return $style;
    }
    private function processParamCSSSelector_border($param, $selector)
    {
        $borderType = UniteFunctionsUC::getVal($param, "border_type");
        if (empty($borderType)) {
            return false;
        }
        if ($borderType == "none") {
            return false;
        }
        $style = "border-style: {$borderType};";
        $color = UniteFunctionsUC::getVal($param, "border_color");
        if (empty($color)) {
            $color = "#000000";
        }
        $style .= "border-color:{$color};";
        $styleWidth = $this->processParamCSSSelector_border_getRadiusStyle($param);
        $style .= $styleWidth;
        $css = "{$selector}{{$style}}";
        $styleTablet = $this->processParamCSSSelector_border_getRadiusStyle($param, "tablet");
        if (!empty($styleTablet)) {
            $styleTablet = "{$selector}{{$styleTablet}}";
            $styleTablet = HelperHtmlUC::wrapCssMobile($styleTablet, true);
            $css .= "\n" . $styleTablet;
        }
        $styleMobile = $this->processParamCSSSelector_border_getRadiusStyle($param, "mobile");
        if (!empty($styleMobile)) {
            $styleMobile = "{$selector}{{$styleMobile}}";
            $styleMobile = HelperHtmlUC::wrapCssMobile($styleMobile);
            $css .= "\n" . $styleMobile;
        }
        return $css;
    }
    private function processParamCSSSelector_textShadow($param, $selector)
    {
        $isEnable = UniteFunctionsUC::getVal($param, "enable_default_values");
        $isEnable = UniteFunctionsUC::strToBool($isEnable);
        if ($isEnable == false) {
            return false;
        }
        $color = UniteFunctionsUC::getVal($param, "color");
        $blur = UniteFunctionsUC::getVal($param, "blur");
        $horizontal = UniteFunctionsUC::getVal($param, "horizontal");
        $vertical = UniteFunctionsUC::getVal($param, "vertical");
        $shadow = "{$horizontal}px {$vertical}px {$blur}px {$color}";
        $css = "text-shadow:{$shadow}";
        $style = "{$selector}{{$css}}";
        return $style;
    }
    private function processParamCSSSelector_background($param, $selector)
    {
        $name = UniteFunctionsUC::getVal($param, "name");
        $value = UniteFunctionsUC::getVal($param, "value");
        $type = UniteFunctionsUC::getVal($value, $name . "_type");
        $css = "";
        switch ($type) {
            case "solid":
                $color = UniteFunctionsUC::getVal($value, $name . "_color_solid");
                $css = "background-color:{$color} !important;";
                $bgImage = UniteFunctionsUC::getVal($param, "solid_bg_image");
                $bgPosition = UniteFunctionsUC::getVal($param, "solid_bg_image_position");
                $bgSize = UniteFunctionsUC::getVal($param, "solid_bg_image_size");
                $bgRepeat = UniteFunctionsUC::getVal($param, "solid_bg_image_repeat");
                if (!empty($bgImage)) {
                    $bgImage = $this->addon->convertFromUrlAssets($bgImage);
                    $css .= "background-image:url('{$bgImage}');";
                    if (!empty($bgPosition)) {
                        $css .= "background-position:{$bgPosition};";
                    }
                    if (!empty($bgSize)) {
                        $css .= "background-size:{$bgSize};";
                    }
                    if (!empty($bgRepeat)) {
                        $css .= "background-repeat:{$bgRepeat};";
                    }
                }
                break;
            case "gradient":
                $color1 = UniteFunctionsUC::getVal($value, $name . "_color_gradient1");
                $color2 = UniteFunctionsUC::getVal($value, $name . "_color_gradient2");
                if (!empty($color1) && !empty($color2)) {
                    $css = "background:linear-gradient({$color1}, {$color2}) !important;";
                }
                break;
        }
        if (empty($css)) {
            return false;
        }
        $style = "{$selector}{{$css}}";
        return $style;
    }
    private function processParamCSSSelector_slider($param, $selector)
    {
        $name = UniteFunctionsUC::getVal($param, "name");
        $value = UniteFunctionsUC::getVal($param, "value");
        $selectorValue = UniteFunctionsUC::getVal($param, "selector_value");
        $units = UniteFunctionsUC::getVal($param, "units");
        if (empty($units)) {
            $units = UniteFunctionsUC::getVal($param, "unit");
        }
        $isResponsive = UniteFunctionsUC::getVal($param, "is_responsive");
        $isResponsive = UniteFunctionsUC::strToBool($isResponsive);
        $css = "";
        if (empty($selectorValue)) {
            return false;
        }
        if (empty($value)) {
            $value = "0";
        }
        if ($units == "__hide__") {
            $units = "";
        }
        if ($units == "other") {
            $units = UniteFunctionsUC::getVal($param, "unit_custom");
        }
        $units = trim($units);
        $selectorValueBase = $selectorValue;
        $selectorValue = str_replace("{{SIZE}}", $value, $selectorValue);
        $selectorValue = str_replace("{{UNIT}}", $units, $selectorValue);
        $style = $selector . "{{$selectorValue}}";
        if (empty($style)) {
            return null;
        }
        if ($isResponsive == false) {
            return $style;
        }
        $valueTablet = UniteFunctionsUC::getVal($param, "value_tablet");
        $valueTablet = trim($valueTablet);
        if ($valueTablet !== "") {
            $selectorTabletValue = $selectorValueBase;
            $selectorTabletValue = str_replace("{{SIZE}}", $valueTablet, $selectorTabletValue);
            $selectorTabletValue = str_replace("{{UNIT}}", $units, $selectorTabletValue);
            $styleTablet = $selector . "{{$selectorTabletValue}}";
            $styleTablet = HelperHtmlUC::wrapCssMobile($styleTablet, true);
            $style .= "\n" . $styleTablet;
        }
        $valueMobile = UniteFunctionsUC::getVal($param, "value_mobile");
        $valueMobile = trim($valueMobile);
        if ($valueMobile !== "") {
            $selectorMobileValue = $selectorValueBase;
            $selectorMobileValue = str_replace("{{SIZE}}", $valueMobile, $selectorMobileValue);
            $selectorMobileValue = str_replace("{{UNIT}}", $units, $selectorMobileValue);
            $styleMobile = $selector . "{{$selectorMobileValue}}";
            $styleMobile = HelperHtmlUC::wrapCssMobile($styleMobile);
            $style .= "\n" . $styleMobile;
        }
        return $style;
    }
    private function processParamCSSSelector_number($param, $selector)
    {
        $name = UniteFunctionsUC::getVal($param, "name");
        $value = UniteFunctionsUC::getVal($param, "value");
        $selectorValue = UniteFunctionsUC::getVal($param, "selector_value");
        $isResponsive = UniteFunctionsUC::getVal($param, "is_responsive");
        $isResponsive = UniteFunctionsUC::strToBool($isResponsive);
        $css = "";
        if (empty($selectorValue)) {
            return false;
        }
        if (empty($value)) {
            $value = "0";
        }
        $selectorValueBase = $selectorValue;
        $selectorValue = str_replace("{{VALUE}}", $value, $selectorValue);
        $style = $selector . "{{$selectorValue}}";
        if (empty($style)) {
            return null;
        }
        if ($isResponsive == false) {
            return $style;
        }
        $valueTablet = UniteFunctionsUC::getVal($param, "value_tablet");
        $valueTablet = trim($valueTablet);
        if ($valueTablet !== "") {
            $selectorTabletValue = $selectorValueBase;
            $selectorTabletValue = str_replace("{{VALUE}}", $valueTablet, $selectorTabletValue);
            $styleTablet = $selector . "{{$selectorTabletValue}}";
            $styleTablet = HelperHtmlUC::wrapCssMobile($styleTablet, true);
            $style .= "\n" . $styleTablet;
        }
        $valueMobile = UniteFunctionsUC::getVal($param, "value_mobile");
        $valueMobile = trim($valueMobile);
        if ($valueMobile !== "") {
            $selectorMobileValue = $selectorValueBase;
            $selectorMobileValue = str_replace("{{VALUE}}", $valueMobile, $selectorMobileValue);
            $styleMobile = $selector . "{{$selectorMobileValue}}";
            $styleMobile = HelperHtmlUC::wrapCssMobile($styleMobile);
            $style .= "\n" . $styleMobile;
        }
        return $style;
    }
    private function processParamCSSSelector_dimentions($param, $selector, $type)
    {
        $arrValues = UniteFunctionsUC::getVal($param, "value");
        if (empty($arrValues)) {
            return false;
        }
        $unit = UniteFunctionsUC::getVal($arrValues, "unit");
        if (empty($unit)) {
            return false;
        }
        $css = "";
        $arrValuesTablet = array();
        $arrValuesMobile = array();
        foreach ($arrValues as $name => $value) {
            if ($name == "unit") {
                continue;
            }
            $value = trim($value);
            if (is_numeric($value) == false) {
                continue;
            }
            if (strpos($name, "tablet_") !== false) {
                $name = str_replace("tablet_", "", $name);
                $arrValuesTablet[$name] = $value;
                continue;
            }
            if (strpos($name, "mobile_") !== false) {
                $name = str_replace("mobile_", "", $name);
                $arrValuesMobile[$name] = $value;
                continue;
            }
            $css .= "{$type}-{$name}:{$value}{$unit};";
        }
        if (!empty($arrValuesTablet)) {
            foreach ($arrValuesTablet as $name => $value) {
                $cssTablet .= "{$type}-{$name}:{$value}{$unit};";
            }
        }
        $cssMobile = "";
        if (!empty($arrValuesMobile)) {
            foreach ($arrValuesMobile as $name => $value) {
                $cssMobile .= "{$type}-{$name}:{$value}{$unit};";
            }
        }
        if (empty($css)) {
            return false;
        }
        $style = "{$selector}{{$css}}";
        if (!empty($cssTablet)) {
            $styleTablet = "{$selector}{{$cssTablet}}";
            $styleTablet = HelperHtmlUC::wrapCssMobile($styleTablet, true);
            $style .= "\n" . $styleTablet;
        }
        if (!empty($cssMobile)) {
            $styleMobile = "{$selector}{{$cssMobile}}";
            $styleMobile = HelperHtmlUC::wrapCssMobile($styleMobile);
            $style .= "\n" . $styleMobile;
        }
        return $style;
    }
    private function processParamCSSSelector($param)
    {
        $selector = UniteFunctionsUC::getVal($param, "selector");
        $type = UniteFunctionsUC::getVal($param, "type");
        $selector = trim($selector);
        if (empty($selector)) {
            return false;
        }
        switch ($type) {
            case UniteCreatorDialogParam::PARAM_NUMBER:
                $style = $this->processParamCSSSelector_number($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_PADDING:
                $style = $this->processParamCSSSelector_dimentions($param, $selector, "padding");
                break;
            case UniteCreatorDialogParam::PARAM_MARGINS:
                $style = $this->processParamCSSSelector_dimentions($param, $selector, "margin");
                break;
            case UniteCreatorDialogParam::PARAM_BORDER_DIMENTIONS:
                $style = $this->processParamCSSSelector_dimentions($param, $selector, "border-radius");
                break;
            case UniteCreatorDialogParam::PARAM_BACKGROUND:
                $style = $this->processParamCSSSelector_background($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_SLIDER:
                $style = $this->processParamCSSSelector_slider($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_COLORPICKER:
                $style = $this->processParamCSSSelector_value($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_BORDER:
                $style = $this->processParamCSSSelector_border($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_DROPDOWN:
                $style = $this->processParamCSSSelector_value($param, $selector);
                break;
            case UniteCreatorDialogParam::PARAM_TEXTSHADOW:
                $style = $this->processParamCSSSelector_textShadow($param, $selector);
                break;
        }
        if (empty($style)) {
            return false;
        }
        UniteProviderFunctionsUC::printCustomStyle($style);
    }
    private function processPreviewParamsSelectors()
    {
        $mainParams = $this->addon->getParams();
        if (empty($mainParams)) {
            return false;
        }
        foreach ($mainParams as $param) {
            $this->processParamCSSSelector($param);
        }
    }
    public function getPreviewHtml()
    {
        $this->validateInited();
        $outputs = "";
        $title = $this->addon->getTitle();
        $title .= " " . esc_html__("Preview", "unlimited-elements-for-elementor");
        $title = htmlspecialchars($title);
        $htmlBody = $this->getHtmlBody(false);
        $arrIncludes = $this->getProcessedIncludes(true, false);
        $arrIncludes = $this->modifyPreviewIncludes($arrIncludes);
        $htmlInlcudesCss = $this->getHtmlIncludes($arrIncludes, "css");
        $htmlInlcudesJS = $this->getHtmlIncludes($arrIncludes, "js");
        $this->processPreviewParamsSelectors();
        $arrCssCustomStyles = UniteProviderFunctionsUC::getCustomStyles();
        $htmlCustomCssStyles = HelperHtmlUC::getHtmlCustomStyles($arrCssCustomStyles);
        $arrJsCustomScripts = UniteProviderFunctionsUC::getCustomScripts();
        $htmlJSScripts = HelperHtmlUC::getHtmlCustomScripts($arrJsCustomScripts);
        $options = $this->addon->getOptions();
        $bgCol = $this->addon->getOption("preview_bgcol");
        $previewSize = $this->addon->getOption("preview_size");
        $previewWidth = "100%";
        switch ($previewSize) {
            case "column":
                $previewWidth = "300px";
                break;
            case "custom":
                $previewWidth = $this->addon->getOption("preview_custom_width");
                if (!empty($previewWidth)) {
                    $previewWidth = (int) $previewWidth;
                    $previewWidth .= "px";
                }
                break;
        }
        $style = "";
        $style .= "max-width:{$previewWidth};";
        $style .= "background-color:{$bgCol};";
        $urlPreviewCss = GlobalsUC::$urlPlugin . "css/unitecreator_preview.css";
        $html = "";
        $htmlHead = "";
        $htmlHead = "<!DOCTYPE html>" . self::BR;
        $htmlHead .= "<html>" . self::BR;
        $htmlHead .= self::TAB . "<head>" . self::BR;
        $html .= $htmlHead;
        $htmlHead .= self::TAB2 . "<title>{$title}</title>" . self::BR;
        $htmlHead .= self::TAB2 . "<link rel='stylesheet' href='{$urlPreviewCss}' type='text/css'>" . self::BR;
        $htmlHead .= $htmlInlcudesCss;
        if (!empty($htmlCustomCssStyles)) {
            $htmlHead .= self::BR . $htmlCustomCssStyles;
        }
        $html .= $htmlHead;
        $output["head"] = $htmlHead;
        $htmlAfterHead = "";
        $htmlAfterHead .= self::TAB . "</head>" . self::BR;
        $htmlAfterHead .= self::TAB . "<body>" . self::BR;
        $htmlAfterHead .= self::BR . self::TAB2 . "<div class='uc-preview-wrapper' style='{$style}'>";
        $htmlAfterHead .= self::BR . $htmlBody;
        $htmlAfterHead .= self::BR . self::TAB2 . "</div>";
        $html .= $htmlAfterHead;
        $output["after_head"] = $htmlAfterHead;
        $htmlEnd = "";
        $htmlEnd .= $htmlInlcudesJS . self::BR;
        $htmlEnd .= $htmlJSScripts . self::BR;
        $htmlEnd .= self::BR . self::TAB . "</body>" . self::BR;
        $htmlEnd .= "</html>";
        $html .= $htmlEnd;
        $output["end"] = $htmlEnd;
        $output["full_html"] = $html;
        return $output;
    }
    public function putPreviewHtml()
    {
        $output = $this->getPreviewHtml();
        echo UniteProviderFunctionsUC::escCombinedHtml($output["head"]);
        echo UniteProviderFunctionsUC::escCombinedHtml($output["after_head"]);
        $this->putPreviewHtml_footerAdd();
        echo UniteProviderFunctionsUC::escCombinedHtml($output["end"]);
    }
    private function a________DYNAMIC___________()
    {
    }
    protected function initDynamicParams()
    {
        $isDynamicAddon = UniteFunctionsUC::getVal($this->arrOptions, "dynamic_addon");
        $isDynamicAddon = UniteFunctionsUC::strToBool($isDynamicAddon);
        if ($isDynamicAddon == false) {
            return false;
        }
        $postID = $this->getDynamicPostID();
        if (!empty($postID)) {
            $arrPostAdditions = HelperProviderUC::getPostAdditionsArray_fromAddonOptions($this->arrOptions);
            $this->addPostParamToAddon($postID, $arrPostAdditions);
        }
    }
    protected function getDynamicPostID()
    {
        $postID = "";
        if ($this->isModePreview) {
            $postID = UniteFunctionsUC::getVal($this->arrOptions, "dynamic_post");
            return $postID;
        }
        $post = get_post();
        if (!empty($post)) {
            $postID = $post->ID;
        }
        return $postID;
    }
    private function addPostParamToAddon($postID, $arrPostAdditions)
    {
        $arrParam = array();
        $arrParam["type"] = UniteCreatorDialogParam::PARAM_POST;
        $arrParam["name"] = "current_post";
        $arrParam["default_value"] = $postID;
        $arrParam["post_additions"] = $arrPostAdditions;
        $this->addon->addParam($arrParam);
    }
    private function a________GENERAL___________()
    {
    }
    private function modifyItemsDataForShow($arrItemData)
    {
        if (is_array($arrItemData) == false) {
            return null;
        }
        $arrItemsForShow = array();
        foreach ($arrItemData as $item) {
            if (is_array($item) == false) {
                $arrItemsForShow[] = $item;
                continue;
            }
            $item = UniteFunctionsUC::getVal($item, "item");
            $itemFirstValue = UniteFunctionsUC::getArrFirstValue($item);
            if (is_array($itemFirstValue)) {
                $item = UniteFunctionsUC::modifyDataArrayForShow($itemFirstValue);
            } else {
                $item = UniteFunctionsUC::modifyDataArrayForShow($item);
            }
            $arrItemsForShow[] = $item;
        }
        return $arrItemsForShow;
    }
    private function ___________DEBUG_DATA___________()
    {
    }
    private function putDebugDataHtml_default($arrData, $arrItemData)
    {
        $isShowData = $this->debugDataType != "items_only";
        if ($isShowData == true) {
            $arrData = UniteFunctionsUC::modifyDataArrayForShow($arrData);
            dmp($arrData);
        }
        dmp("<b>Widget Items Data</b>");
        if (empty($arrItemData)) {
            dmp("no items found");
            return false;
        }
        $arrItemData = $this->modifyItemsDataForShow($arrItemData);
        dmp($arrItemData);
    }
    private function putDebugDataHtml_posts($arrItemData)
    {
        $numPosts = count($arrItemData);
        dmp("Found {$numPosts} posts.");
        if (empty($arrItemData)) {
            return false;
        }
        $isShowMeta = $this->debugDataType == "post_meta";
        foreach ($arrItemData as $index => $item) {
            $isPost = false;
            if ($item instanceof WP_Post) {
                $isPost = true;
            }
            if ($isPost == false) {
                $item = UniteFunctionsUC::getVal($item, "item");
                $postData = UniteFunctionsUC::getArrFirstValue($item);
                $title = UniteFunctionsUC::getVal($postData, "title");
                $alias = UniteFunctionsUC::getVal($postData, "alias");
                $id = UniteFunctionsUC::getVal($postData, "id");
                $post = get_post($id);
            } else {
                $post = $item;
                $title = $post->post_title;
                $id = $post->ID;
                $alias = $post->post_name;
            }
            $num = $index + 1;
            $status = $post->post_status;
            $arrTermsNames = UniteFunctionsWPUC::getPostTermsTitles($post);
            $strTerms = implode(",", $arrTermsNames);
            $htmlAfterAlias = "";
            if ($status != "publish") {
                $htmlAfterAlias = ", [{$status} post]";
            }
            $text = "{$num}. <b>{$title}</b> (<i style='font-size:13px;'>{$alias}{$htmlAfterAlias}, {$id} | {$strTerms} </i>)";
            dmp($text);
            if ($isShowMeta == false) {
                continue;
            }
            $postMeta = get_post_meta($id, "", false);
            $postMeta = UniteFunctionsUC::modifyDataArrayForShow($postMeta, true);
            dmp($postMeta);
        }
    }
    private function putDebugDataHtml_getItemsFromListing($paramListing, $arrData)
    {
        $name = UniteFunctionsUC::getVal($paramListing, "name");
        $source = UniteFunctionsUC::getVal($arrData, $name . "_source");
        $arrItemsRaw = UniteFunctionsUC::getVal($arrData, $name . "_items");
        if (empty($arrItemsRaw)) {
            $arrItemsRaw = array();
        }
        $useFor = UniteFunctionsUC::getVal($paramListing, "use_for");
        $useForGallery = $useFor == "gallery";
        $arrItems = array();
        foreach ($arrItemsRaw as $item) {
            if ($useForGallery == true && isset($item["postid"])) {
                $post = get_post($item["postid"]);
                $arrItems[] = $post;
                continue;
            }
            $object = UniteFunctionsUC::getVal($item, "object");
            $arrItems[] = $object;
        }
        return $arrItems;
    }
    private function putDebugDataHtml($arrData, $arrItemData)
    {
        echo "<div style='font-size:16px;color:black;text-decoration:none;background-color:white;'>";
        dmp("<b>Widget Debug Data</b> (turned on by setting in widget advanced section)<br>");
        $paramListing = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_LISTING);
        if (!empty($paramListing)) {
            $arrItemData = $this->putDebugDataHtml_getItemsFromListing($paramListing, $arrData);
        }
        switch ($this->debugDataType) {
            case "post_titles":
            case "post_meta":
                $this->putDebugDataHtml_posts($arrItemData);
                break;
            default:
                $this->putDebugDataHtml_default($arrData, $arrItemData);
                break;
        }
        echo "</div>";
    }
    protected function processHtml($html)
    {
        return $html;
    }
    public function showDebugData($isShow = true, $dataType = null)
    {
        $this->isShowDebugData = $isShow;
        $this->debugDataType = $dataType;
    }
    public function getProcessedHtmlTemplate()
    {
        $html = $this->objTemplate->getRenderedHtml(self::TEMPLATE_HTML);
        $html = $this->processHtml($html);
        return $html;
    }
    public function getHtmlBody($scriptHardCoded = true, $putCssIncludes = false, $putCssInline = true, $params = null)
    {
        $this->validateInited();
        $title = $this->addon->getTitle(true);
        $isOutputComments = HelperProviderCoreUC_EL::getGeneralSetting("output_wrapping_comments");
        $settings = HelperProviderCoreUC_EL::getGeneralSettingsValues();
        $isOutputComments = UniteFunctionsUC::strToBool($isOutputComments);
        try {
            $html = $this->objTemplate->getRenderedHtml(self::TEMPLATE_HTML);
            $html = $this->processHtml($html);
            $css = $this->objTemplate->getRenderedHtml(self::TEMPLATE_CSS);
            $js = $this->objTemplate->getRenderedHtml(self::TEMPLATE_JS);
            $arrCssIncludes = array();
            if ($putCssIncludes == true) {
                $arrCssIncludes = $this->getProcessedIncludes(true, true, "css");
            }
            if ($isOutputComments == true) {
                $output = "<!-- start {$title} -->";
            } else {
                $output = "";
            }
            if (!empty($arrCssIncludes)) {
                $htmlIncludes = $this->getHtmlIncludes($arrCssIncludes);
                if (self::$isBufferingCssActive == true) {
                    self::$bufferCssIncludes .= self::BR . $htmlIncludes;
                } else {
                    $output .= "\n" . $htmlIncludes;
                }
            }
            if (!empty($css)) {
                $css = "/* widget: {$title} */" . self::BR2 . $css . self::BR2;
                if (self::$isBufferingCssActive == true) {
                    if (!empty(self::$bufferBodyCss)) {
                        self::$bufferBodyCss .= self::BR2;
                    }
                    self::$bufferBodyCss .= $css;
                } else {
                    if ($putCssInline == true) {
                        $output .= "\n\t\t\t<style type=\"text/css\">{$css}</style>";
                    } else {
                        HelperUC::putInlineStyle($css);
                    }
                }
            }
            $output .= "\n\n\t\t\t" . $html;
            $isOutputJs = false;
            if (!empty($js)) {
                $isOutputJs = true;
            }
            if (isset($params["wrap_js_start"]) || isset($params["wrap_js_timeout"])) {
                $isOutputJs = true;
            }
            if ($isOutputJs == true) {
                $title = $this->addon->getTitle();
                if ($scriptHardCoded == false) {
                    $js = "// {$title} scripts: \n" . $js;
                }
                if ($scriptHardCoded == false) {
                    UniteProviderFunctionsUC::printCustomScript($js);
                } else {
                    $wrapInTimeout = UniteFunctionsUC::getVal($params, "wrap_js_timeout");
                    $wrapInTimeout = UniteFunctionsUC::strToBool($wrapInTimeout);
                    $wrapStart = UniteFunctionsUC::getVal($params, "wrap_js_start");
                    $wrapEnd = UniteFunctionsUC::getVal($params, "wrap_js_end");
                    $output .= "\n\n\t\t\t<script type=\"text/javascript\">";
                    if (!empty($wrapStart)) {
                        $output .= "\n\t\t" . $wrapStart;
                    }
                    if ($wrapInTimeout == true) {
                        $output .= "\n\t\t\tsetTimeout(function(){";
                    }
                    $output .= "\n\t\t\t" . $js;
                    if ($wrapInTimeout == true) {
                        $output .= "\n\t\t\t},300);";
                    }
                    if (!empty($wrapEnd)) {
                        $output .= "\n\t\t" . $wrapEnd;
                    }
                    $output .= "\n\t\t\t</script>";
                }
            }
            if ($isOutputComments == true) {
                $output .= "\n\t\t\t<!-- end {$title} -->";
            }
        } catch (Exception $e) {
            $message = $e->getMessage();
            $message = "Error in widget {$title}, " . $message;
            UniteFunctionsUC::throwError($message);
        }
        return $output;
    }
    public function getConstantData()
    {
        $this->validateInited();
        if (!empty($this->cacheConstants)) {
            return $this->cacheConstants;
        }
        $data = array();
        $prefix = "ucid";
        if ($this->isInited) {
            $prefix = "uc_" . $this->addon->getName();
        }
        self::$serial++;
        $generatedSerial = self::$serial . UniteFunctionsUC::getRandomString(4, true);
        $this->generatedID = $prefix . $generatedSerial;
        $data["uc_serial"] = $generatedSerial;
        $data["uc_id"] = $this->generatedID;
        $urlAssets = $this->addon->getUrlAssets();
        if (!empty($urlAssets)) {
            $data["uc_assets_url"] = $urlAssets;
        }
        $isInsideEditor = false;
        if ($this->processType == UniteCreatorParamsProcessor::PROCESS_TYPE_OUTPUT_BACK) {
            $isInsideEditor = true;
        }
        $data = UniteProviderFunctionsUC::addSystemConstantData($data);
        $data = UniteProviderFunctionsUC::applyFilters(UniteCreatorFilters::FILTER_ADD_ADDON_OUTPUT_CONSTANT_DATA, $data);
        $this->cacheConstants = $data;
        return $data;
    }
    public function getItemConstantDataKeys()
    {
        $arrKeys = array("item_id", "item_index", "item_repeater_class");
        return $arrKeys;
    }
    public function getConstantDataKeys($filterPlatformKeys = false)
    {
        $constantData = $this->getConstantData();
        if ($filterPlatformKeys == true) {
            unset($constantData["uc_platform"]);
            unset($constantData["uc_platform_title"]);
        }
        $arrKeys = array_keys($constantData);
        return $arrKeys;
    }
    private function getAddonParams()
    {
        if (!empty($this->paramsCache)) {
            return $this->paramsCache;
        }
        $this->paramsCache = $this->addon->getProcessedMainParamsValues($this->processType);
        return $this->paramsCache;
    }
    protected function normalizeItemsData($arrItems, $extraKey = null)
    {
        if (empty($arrItems)) {
            return array();
        }
        foreach ($arrItems as $key => $item) {
            if (!empty($extraKey)) {
                $arrItems[$key] = array("item" => array($extraKey => $item));
            } else {
                $arrItems[$key] = array("item" => $item);
            }
        }
        return $arrItems;
    }
    private function getItemsSpecial_Instagram($arrData)
    {
        $paramInstagram = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_INSTAGRAM);
        $instaName = UniteFunctionsUC::getVal($paramInstagram, "name");
        $dataInsta = $arrData[$instaName];
        $instaMain = UniteFunctionsUC::getVal($dataInsta, "main");
        $instaItems = UniteFunctionsUC::getVal($dataInsta, "items");
        $error = UniteFunctionsUC::getVal($dataInsta, "error");
        if (empty($instaMain)) {
            $instaMain = array();
        }
        $instaMain["hasitems"] = !empty($instaItems);
        if (!empty($error)) {
            $instaMain["error"] = $error;
        }
        $arrItemData = $this->normalizeItemsData($instaItems, $instaName);
        $arrData[$instaName] = $instaMain;
        $output = array();
        $output["main"] = $arrData;
        $output["items"] = $arrItemData;
        return $output;
    }
    private function initTemplate()
    {
        $this->validateInited();
        $arrData = $this->getConstantData();
        $arrParams = $this->getAddonParams();
        $arrData = array_merge($arrData, $arrParams);
        $html = $this->addon->getHtml();
        $css = $this->addon->getCss();
        $cssItem = $this->addon->getCssItem();
        $cssItem = trim($cssItem);
        if (!empty($cssItem)) {
            $css .= "\n{{put_css_items()}}";
        }
        $js = $this->addon->getJs();
        $this->objTemplate->setAddon($this->addon);
        $this->objTemplate->addTemplate(self::TEMPLATE_HTML, $html);
        $this->objTemplate->addTemplate(self::TEMPLATE_CSS, $css);
        $this->objTemplate->addTemplate(self::TEMPLATE_JS, $js);
        $arrItemData = null;
        $paramPostsList = null;
        if ($this->isItemsExists == false) {
            $this->objTemplate->setParams($arrData);
        } else {
            if ($this->processType == UniteCreatorParamsProcessor::PROCESS_TYPE_CONFIG) {
                $arrItemData = array();
            } else {
                switch ($this->itemsType) {
                    case "instagram":
                        $response = $this->getItemsSpecial_Instagram($arrData);
                        $arrData = $response["main"];
                        $arrItemData = $response["items"];
                        break;
                    case "post":
                        $paramPostsList = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_POSTS_LIST);
                        if (empty($paramPostsList)) {
                            UniteFunctionsUC::throwError("Some posts list param should be found");
                        }
                        $postsListName = UniteFunctionsUC::getVal($paramPostsList, "name");
                        $arrItemData = $this->normalizeItemsData($arrData[$postsListName], $postsListName);
                        $arrData[$postsListName] = !empty($arrItemData);
                        break;
                    case UniteCreatorAddon::ITEMS_TYPE_DATASET:
                        $paramDataset = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_DATASET);
                        if (empty($paramDataset)) {
                            UniteFunctionsUC::throwError("Dataset param not found");
                        }
                        $datasetType = UniteFunctionsUC::getVal($paramDataset, "dataset_type");
                        $datasetQuery = UniteFunctionsUC::getVal($paramDataset, "dataset_{$datasetType}_query");
                        $arrRecords = array();
                        $arrItemData = UniteProviderFunctionsUC::applyFilters(UniteCreatorFilters::FILTER_GET_DATASET_RECORDS, $arrRecords, $datasetType, $datasetQuery);
                        if (!empty($arrItemData)) {
                            $paramName = $paramDataset["name"];
                            $arrItemData = $this->normalizeItemsData($arrItemData, $paramName);
                        }
                        break;
                    default:
                        $arrItemData = $this->addon->getProcessedItemsData($this->processType);
                        break;
                }
            }
            $itemIndex = 0;
            foreach ($arrItemData as $key => $item) {
                $arrItem = $item["item"];
                $itemIndex++;
                $arrItem["item_index"] = $itemIndex;
                $arrItem["item_id"] = $this->generatedID . "_item" . $itemIndex;
                $arrItemData[$key]["item"] = $arrItem;
            }
            $this->objTemplate->setParams($arrData);
            $this->objTemplate->setArrItems($arrItemData);
            $htmlItem = $this->addon->getHtmlItem();
            $this->objTemplate->addTemplate(self::TEMPLATE_HTML_ITEM, $htmlItem);
            $htmlItem2 = $this->addon->getHtmlItem2();
            $this->objTemplate->addTemplate(self::TEMPLATE_HTML_ITEM2, $htmlItem2);
            $this->objTemplate->addTemplate(self::TEMPLATE_CSS_ITEM, $cssItem);
        }
        if (!empty($paramPostsList)) {
            $postListValue = UniteFunctionsUC::getVal($paramPostsList, "value");
            if (!empty($paramPostsList) && is_array($paramPostsList)) {
                $arrData = array_merge($arrData, $postListValue);
            }
        }
        if ($this->isShowDebugData == true) {
            $this->putDebugDataHtml($arrData, $arrItemData);
        }
    }
    public function setPreviewAddonMode()
    {
        $this->isModePreview = true;
    }
    public function initByAddon(UniteCreatorAddon $addon)
    {
        if (empty($addon)) {
            UniteFunctionsUC::throwError("Wrong addon given");
        }
        HelperUC::clearDebug();
        $this->isInited = true;
        $this->addon = $addon;
        $this->isItemsExists = $this->addon->isHasItems();
        $this->itemsType = $this->addon->getItemsType();
        $this->arrOptions = $this->addon->getOptions();
        switch ($this->itemsType) {
            case "instagram":
            case "post":
                $this->isItemsExists = true;
                break;
        }
        $this->initDynamicParams();
        $this->initTemplate();
    }
}