HEX
Server: Apache
System: Linux webd003.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: slyfwmm (169339)
PHP: 8.1.34
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/slyfwmm/dallavitae/OLD_WP/wp-content/themes/skrollex/widgets/skrollex-widget.php
<?php
/**
 * Base class for widgets
 */
if (!class_exists('Skrollex_Widget')) {
	class Skrollex_Widget extends Layers_Widget {
		/**
		 * Constructor
		 */
		public function __construct($opt) {
			$this->widget_title = $opt['widget_title'];
			$this->widget_id = $opt['widget_id'];
			$this->post_type = '';
			$this->taxonomy = '';
			$this->checkboxes = array();
			$widget_ops = array('classname' => 'layers-' . $this->widget_id . '-widget', 'description' => $opt['description']);
			$control_ops = array('width' => LAYERS_WIDGET_WIDTH_LARGE, 'height' => NULL, 'id_base' => LAYERS_THEME_SLUG . '-widget-' . $this->widget_id);
			parent::__construct(LAYERS_THEME_SLUG . '-widget-' . $this->widget_id , $this->widget_title, $widget_ops, $control_ops);
		}
		/**
		 * Update widget
		 */
		public function update($new_instance, $old_instance) {
			if (isset($this->checkboxes)) {
				foreach ($this->checkboxes as $cb) {
					if (isset($old_instance[$cb])) {
						$old_instance[$cb] = strip_tags($new_instance[$cb]);
					}
				}
			}
			return $new_instance;
		}
		/**
		 * Recursive function for display form elements in Customizer.
		 * It passes the widget structure (tree).
		 */
		function form_layer($point, $model_path, $vals, $id_prefix, $name_prefix){
			// Find elements from design bar
			foreach ($point as $design_name => $design_elem) {
				if(self::elemOpt($design_elem, 'type') == 'design-bar'){
					$design_params = self::elemOpt($design_elem, 'params');
					$design_params['name'] = self::make_field_name($name_prefix, $design_name);
					$design_params['id'] = self::make_field_id($id_prefix, $design_name);
					$design_params['number'] = $this->number;
					$custom_components = array();
					foreach ($design_elem as $menu_name => $menu_elem) {
						if(self::elemOpt($menu_elem, 'type') == 'menu'){
							$custom_components[$menu_name] = self::elemOpt($menu_elem, 'params');
							$custom_components[$menu_name]['elements'] = array();
							$item_id_prefix = self::make_field_id($design_params['id'], $menu_name);
							$item_name_prefix = self::make_field_name($design_params['name'], $menu_name);
							foreach ($menu_elem as $item_name => $item_elem) {
								if(self::elemOpt($item_elem, 'type') == 'menu-item'){
									$item_params = self::elemOpt($item_elem, 'params');
									$item_params['id'] = self::make_field_id($item_id_prefix, $item_name);
									$item_params['name'] = self::make_field_name($item_name_prefix, $item_name);
									$item_params['value'] = (isset($vals[$design_name]) && isset($vals[$design_name][$menu_name]) && isset($vals[$design_name][$menu_name][$item_name])) ? $vals[$design_name][$menu_name][$item_name] : NULL;
									$custom_components[$menu_name]['elements'][$item_name] = $item_params;
								}
							}
						}
					}
					$this->design_bar(
						self::elemOpt($design_elem, 'layout'),
						$design_params,
						$vals,
						self::elemOpt($design_elem, 'components'),
						$custom_components
					);
				}
			}
			$pointType = self::elemOpt($point, 'type');
			if($pointType == 'root'){
				?>
				<div class="layers-container-large skrollex-widget" id="<?php echo esc_attr($id_prefix); ?>">
				<?php
				$this->form_elements()->header(array(
					'title' => $this->widget_title,
					'icon_class' => 'text'
				));
				?>
					<section class="layers-accordion-section layers-content layers-row">
				<?php
			}
			// Find other elements
			foreach ($point as $element_name => $element) {
				$type = self::elemOpt($element, 'type');
				if(isset($type)){
					if(substr($type, 0, 6) == 'field-'){
						$span = self::elemOpt($element, 'span');
						if(!isset($span)){
							$span = '12';
						}
						$params = self::elemOpt($element, 'params');
						$is_hidden_field = isset($params) && isset($params['type']) && $params['type'] == 'hidden';
						$label = self::elemOpt($element, 'label');
						$field_id = self::make_field_id($id_prefix, $element_name);
						$field_name = self::make_field_name($name_prefix, $element_name);
						if(!$is_hidden_field){
							echo '<div class="widget-form-item layers-column layers-span-' . esc_attr($span) . '">';
						}
						if(isset($label)){
							echo '<label for="' . esc_attr($field_id) . '">' . wp_kses($label, Skrollex_Ext::trusted_tags()) . '</label>';
						}
						$this->field($element, isset($vals[$element_name]) ? $vals[$element_name] : NULL, $field_id, $field_name);
						if(!$is_hidden_field){
							echo '</div>';
						}
					}else if($type == 'form-content'){
						$params = self::elemOpt($element, 'params');
						Skrollex_Ext::trusted($params['content']);
					}else if($type == 'list'){
						$ids_name = $element_name . '_ids';
						$list_id = self::make_field_id($id_prefix, $element_name);
						$list_ids_id = self::make_field_id($id_prefix, $ids_name);
						$list_name = self::make_field_name($name_prefix, $element_name);
						$list_ids_name = self::make_field_name($name_prefix, $ids_name);
						$list_vals = isset($vals[$element_name]) ? $vals[$element_name] : array();
						$this->form_elements()->input(array(
							'type' => 'hidden',
							'name' => $list_ids_name,
							'id' => $list_ids_id,
							'value' => ( isset( $vals[$ids_name] ) ) ? $vals[$ids_name] : NULL
						));
						?>
						<ul id="<?php echo esc_attr($list_id); ?>" class="widget-list layers-accordions layers-column layers-span-12" data-list-ids-id="<?php echo esc_attr($list_ids_id); ?>">
						<?php
							$list_item_guids = (isset($vals[$ids_name]) && $vals[$ids_name] != '') ? explode(',', $vals[$ids_name]) : array();
							$list_model_path = $model_path . '[' . $element_name . ']';
							foreach($list_item_guids as $list_item_guid){
								$list_item_vals = $list_vals[$list_item_guid];
								$this->list_item($element, $list_model_path, $list_id, $list_name, $list_item_guid, $list_item_vals);
							}
						?>
						</ul>
						<div class="layers-push-bottom layers-column layers-span-12">
							<button class="layers-button btn-full add-new-widget add-widget-list-item" data-list-model-path="<?php echo esc_attr($list_model_path); ?>" data-list-id="<?php echo esc_attr($list_id); ?>" data-list-name="<?php echo esc_attr($list_name); ?>" data-list-ids-id="<?php echo esc_attr($list_ids_id); ?>" data-php-class="<?php echo esc_attr(get_class($this)); ?>"><?php echo esc_html(self::elemOpt($element, 'add_label')); ?></button>
						</div>
						<?php
					}else if($type == 'group'){
						$this->form_layer($element, $model_path . '[' . $element_name . ']', $vals[$element_name], self::make_field_id($id_prefix, $element_name), self::make_field_name($name_prefix, $element_name));
					}
				}
			}
			if($pointType == 'root'){
				?>
					</section>
				</div>
				<?php
			}
		}
		/**
		 * Display item in accordion list in Customizer
		 */
		function list_item($list_element, $list_model_path, $list_id, $list_name, $list_item_guid, $list_item_vals){
			$list_item_id = self::make_field_id($list_id, $list_item_guid);
			$list_item_name = self::make_field_name($list_name, $list_item_guid);
			?>
			<li class="layers-accordion-item" id="<?php echo esc_attr($list_item_id); ?>" data-guid="<?php echo esc_attr($list_item_guid) ?>">
				<a class="layers-accordion-title <?php echo esc_attr($list_id) ?>-handle">
					<span>
						<?php
						echo esc_html(self::elemOpt($list_element, 'control_title'));
						echo '<span class="layers-detail">';
						$list_item_title = isset($list_item_vals['title']) ? $list_item_vals['title'] : '';
						if($list_item_title){
							$list_item_title_text = stripslashes(strip_tags(preg_replace( '~\[[^\]]+\]~', '', $list_item_title)));
							echo ( $list_item_title != '' ? ': ' . esc_html(substr($list_item_title_text, 0, 50)) : NULL );
							echo ( strlen($list_item_title_text) > 50 ? '...' : NULL ); 
						}
						echo '</span>';
						?>
					</span>
				</a>
				<section class="layers-accordion-section layers-content layers-row">
					<?php $this->form_layer($list_element, $list_model_path, $list_item_vals, $list_item_id, $list_item_name) ?>
				</section>
			</li>
			<?php
		}
		/**
		 * Display widget form in Customizer
		 */
		public function form($instance) {
			$this->form_layer(
					$this->model,
					'',
					self::vals($this->model, $instance, TRUE),
					'widget-' . $this->id_base . '-' . $this->number,
					'widget-' . $this->id_base . '[' . $this->number . ']'
			);
		}
		/**
		 * Extract value from structure
		 */
		static function varByPath($base, $name){
			$keys = explode('[', str_replace(']', '', $name));
			$cur = $base;
			foreach ($keys as $key){
				if($key !== ''){
					$cur = $cur[$key];
				}
			}
			return $cur;
		}
		/**
		 * Create field id
		 */
		static function make_field_id($prefix, $name){
			return $prefix . '-' . $name;
		}
		/**
		 * Create field name
		 */
		static function make_field_name($prefix, $name){
			return $prefix . '[' . $name . ']';
		}
		/**
		 * Fill widget instance. Set default values if not defined.
		 */
		static function vals($point, $instance, $is_editor = FALSE){
			$vals = array();
			if(!isset($instance) || !is_array($instance)){
				$instance = array();
			}
			foreach ($instance as $name => $val) {
				$vals[$name] = $val;
			}
			foreach ($point as $name => $val) {
				$type = self::elemOpt($val, 'type');
				if($type === 'design-bar' || $type === 'menu' || $type === 'group'){
					if(!isset($instance[$name])){
						$instance[$name] = array();
					}
					$vals[$name] = self::vals($point[$name], $instance[$name], $is_editor);
				}else if($type === 'list'){
					if(!isset($instance[$name]) && !isset($instance[$name . '_ids'])){
						$def_count = self::elemOpt($val, 'default_count');
						$instance[$name] = array();
						for($i=0; $i<$def_count; $i++){
							$instance[$name][self::guid()] = array();
						}
					}
					$ids_names = '';
					$vals[$name] = array();
					if(isset($instance[$name])){
						foreach ($instance[$name] as $item_guid => $item_val) {
							$ids_names .= ($ids_names !== '' ? ',' : '') . $item_guid;
							$vals[$name][$item_guid] = self::vals($point[$name], $item_val, $is_editor);
						}
					}
					$vals[$name . '_ids'] = $ids_names;
				}else{
					$params = self::elemOpt($val, 'params');
					if(!isset($params['type']) || $params['type'] !== 'checkbox'){
						if($is_editor){
							if(!isset($vals[$name])){
								$def = self::elemOpt($val, 'default');
								if(isset($def)){
									$vals[$name] = $def;
								}
							}else if($vals[$name] === ''){
								$def = self::elemOpt($val, 'default');
								if(isset($def)){
									$strip = preg_replace('#(<.*?>).*(</.*?>)#', '$1$2', $def);
									$vals[$name] = $strip;
								}
							}
						}else{
							if(!isset($vals[$name])){
								$def = self::elemOpt($val, 'default');
								$striped_def = isset($def) ? strip_tags($def) : '';
								if(isset($def) && $striped_def !==''){
									$vals[$name] = $def;
								}else if(isset($def) && $striped_def ===''){
									$vals[$name] = '';
								}else{
									$vals[$name] = NULL;
								}
							}else if(strip_tags($vals[$name]) === ''){
								$vals[$name] = '';
							}else if($type === 'field-rte'){
								$vals[$name] = preg_replace('/<iframe([^>]*) allowfullscreen="true"/i', '<iframe$1 allowfullscreen', $vals[$name]);
								$vals[$name] = preg_replace('/<iframe([^>]*) mozallowfullscreen="true"/i', '<iframe$1', $vals[$name]);
								$vals[$name] = preg_replace('/<iframe([^>]*) webkitallowfullscreen="true"/i', '<iframe$1', $vals[$name]);
								$vals[$name] = preg_replace('/<iframe([^>]*) frameborder="0"/i', '<iframe$1', $vals[$name]);
							}
						}
					}else{
						if(!isset($vals[$name]) && count($instance) === 0){
							$def = self::elemOpt($val, 'default');
							if(isset($def)){
								$vals[$name] = $def;
							}
						}
					}
				}
			}
			return $vals;
		}
		/**
		 * Extract option from element of widget structure
		 */
		static function elemOpt($elem, $name){
			return isset($elem[0]) ? (isset($elem[0][$name]) ? $elem[0][$name] : NULL) : NULL;
		}
		/**
		 * Display widget field Customizer form
		 */
		function field($elem, $value, $field_id, $field_name){
			$type = self::elemOpt($elem, 'type');
			$params = self::elemOpt($elem, 'params');
			$params['name'] = $field_name;
			$params['id'] = $field_id;
			$params['value'] = $value;
			if($type == 'field-rte'){
				Skrollex_Ext::rte_input($params);
			}else if($type == 'field-layers-input'){
				echo $this->form_elements()->input($params);
			}
		}
		/**
		 * Decode index from ajax
		 */
		static function ajax_decode_instance($data){
			$res = array();
			foreach ($data as $key => $value){
				if(is_array($value)){
					$res[$key] = self::ajax_decode_instance($value);
				}else{
					$res[$key] = urldecode($value);
				}
			}
			return $res;
		}
		/**
		 * Handler for ajax action
		 */
		public function ajax(){
			if( !check_ajax_referer( 'layers-widget-actions', 'nonce', false ) ) die( 'You threw a Nonce exception' ); // Nonce
			if( 'add' == $_POST['widget_action'] ) {
				parse_str(
					urldecode( stripslashes( $_POST[ 'instance' ] ) ),
					$wdata
				);
				$data = self::ajax_decode_instance($wdata);
				$list_model_path =  $_POST[ 'list_model_path' ];
				$list_id =  $_POST[ 'list_id' ];
				$list_name =  $_POST[ 'list_name' ];
				$last_list_item_guid =  $_POST['$last_list_item_guid'];
				$list_item_guid = self::guid();
				$base = 'widget-' . $this->id_base;
				$list_element = self::varByPath($this->model, $list_model_path);
				if( isset( $last_list_item_guid ) && $last_list_item_guid !== '' ) {
					$list_instance = self::varByPath($data, $list_name);
					$list_item_instance = $list_instance[$last_list_item_guid];
					$list_item_vals = self::vals($list_element, $list_item_instance, TRUE);
				} else {
					$list_item_vals = array();
				}
				$this->list_item($list_element, $list_model_path, $list_id, $list_name, $list_item_guid, $list_item_vals);
			}
			die();
		}
		/**
		 * Generate id
		 */
		static function guid(){
			return str_replace('.', '', uniqid('', true));
		}
		/**
		 * Convert filters from string to array
		 * @param string $str
		 * @return array
		 */
		static function getFilters($str){
			$filt = explode(',',
				str_replace(' ,', ',', 
					str_replace(', ', ',', 
						preg_replace('/\s+/', ' ', trim($str))
					)
				)
			);
			$res = array();
			foreach ($filt as $value){
				$res[str_replace(' ', '_', strtolower($value))] = $value;
			}
			return $res;
		}
		/**
		 * Apply WordPress filters for content
		 */
		static function ck_editor_content($content){
			//Used only in widgets with CKEditor (rich text editor). Otherwise, the content of CKEditor is not displayed correctly.
			remove_filter( 'the_content', 'wpautop' ); /* Necessary for CKEditor */
			$res = apply_filters( 'the_content', $content );
			add_filter( 'the_content', 'wpautop' ); /* Restor */
			return $res;
		}
		/**
		 * Display content of Rich Text Editor
		 */
		static function rte_content($content){
			echo self::ck_editor_content($content);
		}
	}
}