<?php
debug_backtrace() || die("Direct access not permitted");
/**
 * Class of the fields displayed in the form of a module
 */
class Field
{
    private $name;
    private $label;
    private $type;
    private $required;
    private $values;
    private $options;
    private $validation;
    private $multilingual;
    private $unique;
    private $comment;
    private $active;
    private $editor;
    private $notices;
    private $optionTable;
    private $roles;
    private $filterName;
    private $optFilters;

    public function __construct($name, $label, $type, $required, $validation, $options, $multilingual, $unique, $comment, $active, $editor, $optionTable, $roles, $filterName, $optFilters)
    {
        $this->name = $name;
        $this->label = $label;
        $this->type = $type;
        if (is_numeric($required) && ($required == 1 || $required == 0))
            $this->required = $required;
        if (is_array($options))
            $this->options = $options;
        $this->validation = $validation;
        $this->values = array();
        if (is_numeric($multilingual) && ($multilingual == 1 || $multilingual == 0))
            $this->multilingual = $multilingual;
        if (is_numeric($unique) && ($unique == 1 || $unique == 0))
            $this->unique = $unique;
        else
            $this->active = 0;
        $this->comment = $comment;
        if (is_numeric($active) && ($active == 1 || $active == 0))
            $this->active = $active;
        else
            $this->active = 1;
        if (is_numeric($editor) && ($editor == 1 || $editor == 0))
            $this->editor = $editor;
        else
            $this->editor = 0;
        $this->notices = array();
        $this->optionTable = $optionTable;
        $this->roles = $roles;
        $this->filterName = $filterName;
        $this->optFilters = $optFilters;
    }
    function getName()
    {
        return $this->name;
    }
    function getLabel()
    {
        return $this->label;
    }
    function getType()
    {
        return $this->type;
    }
    function isEditor()
    {
        return $this->editor;
    }
    function isRequired()
    {
        return $this->required;
    }


    function safeHtmlDecode($value)
    { # BINARIQUE EDITED
        // Handle null or non-string values
        if ($value === null || !is_scalar($value)) {
            return '';
        }

        $value = (string) $value;

        // Modern PHP versions (5.4+)
        if (defined('ENT_SUBSTITUTE')) {
            error_reporting(0);
            return html_entity_decode(
                $value,
                ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5,
                'UTF-8'
            );
        }

        // Legacy PHP versions
        return html_entity_decode(
            $value,
            ENT_QUOTES,
            'UTF-8'
        );
    }


    function getOptions()
    {
        return $this->options;
    }


    function getSingleValue($row)
    { // BINARIQUE EDITED
        $value = $this->value[$row] ?? '';

        // For PHP 5.4+ (ENT_SUBSTITUTE available)
        if (defined('ENT_SUBSTITUTE')) {
            error_reporting(0);
            return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
        }

        // For older PHP versions
        return htmlentities($value, ENT_QUOTES, 'UTF-8');
    }

    function getValue($encode = false, $index = 0, $id_lang = PMS_DEFAULT_LANG)
    {
        if (!MULTILINGUAL) $id_lang = 0;
        if (isset($this->values[$index][$id_lang])) {
            if (!is_array($this->values[$index][$id_lang]))
                return ($encode) ? htmlentities($this->values[$index][$id_lang], ENT_QUOTES, "UTF-8") : stripslashes($this->values[$index][$id_lang]);
            else
                return $this->values[$index][$id_lang];
        } else
            return "";
    }
    function removeValue($index)
    {
        if (isset($this->values[$index]))
            unset($this->values[$index]);
    }
    function getAllValues($id_lang = null)
    {
        if (!is_null($id_lang)) {
            $all_values = array();
            if (!MULTILINGUAL) $id_lang = 0;
            foreach ($this->values as $i => $values) {
                if (isset($values[$id_lang])) {
                    if (!is_array($values[$id_lang]))
                        $all_values[$i][$id_lang] = stripslashes($values[$id_lang]);
                    else
                        $all_values[$i][$id_lang] = $values[$id_lang];
                }
            }
            return $all_values;
        } else
            return $this->values;
    }
    function getValidation()
    {
        return $this->validation;
    }
    function isMultilingual()
    {
        return $this->multilingual;
    }
    function isUnique()
    {
        return $this->unique;
    }
    function isActive()
    {
        return $this->active;
    }
    function getComment()
    {
        return $this->comment;
    }
    function getNotice($index = 0)
    {
        if (isset($this->notices[$index]))
            return $this->notices[$index];
        else
            return "";
    }
    function getOptionTable()
    {
        return $this->optionTable;
    }
    function getOptFilters()
    {
        return $this->optFilters;
    }
    function getFilterName()
    {
        return $this->filterName;
    }
    function isAllowed($type)
    {
        $roles = $this->roles;
        return (in_array($type, $roles) || in_array("all", $roles));
    }
    function setValue($value, $index = 0, $id_lang = null)
    {
        if (!is_null($id_lang))
            $this->values[$index][$id_lang] = (is_array($value)) ? $value : $this->safeHtmlDecode($value);
        else {
            for ($i = 0; $i < count($this->values); $i++)
                $this->values[$index][$i] = (is_array($value)) ? $value : $this->safeHtmlDecode($value);
        }
    }
    function setNotice($notice, $index = 0)
    {
        $this->notices[$index] = $notice;
    }
}
