/**
 * @param string $string_
 * @param string $charset_
 *
 * @return string
 */
function escape($string_, $charset_ = null)
{
    if (null === $charset_) {
        $charset_ = libstd_get('charset', 'env');
    }
    return htmlentities($string_, ENT_XML1 | ENT_COMPAT | ENT_DISALLOWED, $charset_);
}
/**
 * Encode to (X)HTML entities or entities of given type.
 *
 * @param string $string_
 * @param string $charset_
 * @param integer $type_
 *
 * @return string
 */
function escape($string_, $charset_ = null, $type_ = ENT_XHTML, $flags_ = ENT_QUOTES)
{
    static $debug;
    static $charset;
    if (null === $debug) {
        $debug = \env\debug();
    }
    if (null === $charset_) {
        if (null === $charset) {
            $charset = libstd_get('charset', 'env');
        }
        $charset_ = $charset;
    }
    if ($debug) {
        $flags_ |= ENT_SUBSTITUTE;
    }
    return htmlentities($string_, $type_ | $flags_, $charset_, false);
}
/**
 * @return scalar[]
 */
function userAgent()
{
    static $engines = ['ie' => LIBSTD_ENV_USER_AGENT_ENGINE_MSIE, 'gecko' => LIBSTD_ENV_USER_AGENT_ENGINE_GECKO, 'webkit' => LIBSTD_ENV_USER_AGENT_ENGINE_WEBKIT];
    static $browsers = ['ie' => LIBSTD_ENV_USER_AGENT_BROWSER_MSIE, 'chrome' => LIBSTD_ENV_USER_AGENT_BROWSER_CHROME, 'firefox' => LIBSTD_ENV_USER_AGENT_BROWSER_FIREFOX, 'safari' => LIBSTD_ENV_USER_AGENT_BROWSER_SAFARI];
    if (false === libstd_isset('useragent', 'env')) {
        if (false === function_exists('get_browser')) {
            $info = false;
        } else {
            $info = get_browser(null, true);
        }
        $userAgent = [];
        if (false === $info) {
            $userAgent = ['engine' => LIBSTD_ENV_USER_AGENT_ENGINE_UNKNOWN, 'engine_version' => 0, 'browser' => LIBSTD_ENV_USER_AGENT_BROWSER_UNKNOWN, 'browser_version' => 0, 'mobile' => false];
        } else {
            if (isset($info['browser'])) {
                $browserName = strtolower($info['browser']);
                if (isset($browsers[$browserName])) {
                    $userAgent['browser'] = $browsers[$browserName];
                } else {
                    $userAgent['browser'] = LIBSTD_ENV_USER_AGENT_BROWSER_UNKNOWN;
                }
            } else {
                $userAgent['browser'] = LIBSTD_ENV_USER_AGENT_BROWSER_UNKNOWN;
            }
            if (isset($info['renderingengine_name'])) {
                $engineName = strtolower($info['renderingengine_name']);
                if (isset($engines[$engineName])) {
                    $userAgent['engine'] = $engines[$engineName];
                } else {
                    $userAgent['engine'] = LIBSTD_ENV_USER_AGENT_ENGINE_UNKNOWN;
                }
            } else {
                $userAgent['engine'] = LIBSTD_ENV_USER_AGENT_ENGINE_UNKNOWN;
            }
            if (isset($info['majorver'])) {
                $userAgent['browser_version'] = (int) $info['majorver'];
            } else {
                $userAgent['browser_version'] = 0;
            }
            if (isset($info['renderingengine_version'])) {
                $userAgent['engine_version'] = (int) $info['renderingengine_version'];
            } else {
                $userAgent['engine_version'] = 0;
            }
            $userAgent['mobile'] = isset($info['ismobiledevice']) && (bool) $info['ismobiledevice'];
        }
        libstd_set('useragent', $userAgent);
        return $userAgent;
    }
    return libstd_get('useragent', 'env');
}
/**
 * @return string
 */
function libstdJsLocation()
{
    return libstd_get('libstd', 'js');
}
/**
 * Converts to lowercase url friendly string.
 *
 * @param string $string_
 *
 * @return string
 */
function toLowercaseUrlIdentifier($string_, $preserveUnicode_ = false)
{
    if ($preserveUnicode_) {
        $string_ = mb_convert_encoding($string_, 'HTML-ENTITIES', libstd_get('charset', 'env'));
    } else {
        $string_ = toAscii($string_);
    }
    $string_ = preg_replace('/[^a-z0-9]/i', '-', $string_);
    $string_ = preg_replace('/-+/', '-', strtolower($string_));
    if ('-' === $string_) {
        return null;
    }
    return $string_;
}