<?php

/****************** functions for class it_debug **********************/

/**
 * Return string containing names and values of all arguments or stack trace if no args
 */
function D(...$args)
{
	return it_debug::dump($args);
}

/**
 * Echo string containing names and values of all arguments or stack trace if no args
 */
function ED(...$args)
{
	it_debug::setup();
	it_debug::echo($args);
	return $args[0];
}

/**
 * Same as ED(), but if first argument is foo then $GLOBALS['debug_foo'] must be set for output
 * @return boolean indicating whether $GLOBALS['debug_foo'] was set
 */
function EDC($var, ...$args)
{
	$GLOBALS['ULTRADEBUGVARS'][$var] = 1;

	if (($result = $GLOBALS["debug_$var"]))
	{
		if ($args)
		{
			it_debug::setup();
			it_debug::echo($args);
		}

		if (!$result || $result === true)       # Compatibility with old map relying on 0|1
			$result = intval($result);
	}

	return $result;
}

/**
 * Echo string containing names and values of all arguments, then exit
 */
function EDX(...$args)
{
	if ($_SERVER['REMOTE_ADDR'] && !headers_sent())
		header("Content-Type: text/html"); # Not going to be e.g. a valid gif anyway

	it_debug::echo($args);
	exit();
}



/****************** functions for class it_text **********************/

/**
 * Return a text in the selected language
 * Replaces variables of the form {var} with quoted values from argument $values
 * @param $label Label of text to return
 * @param $language Optional value array (will be sent through Q()) or language string
 * @param $values Optional value array (will be sent through Q()) or language string
 * @return Localized text string
 */
function T($label, $language = null, $values = null)
{
	it_text::init();

	if (is_array($language))        # Need to swap params?
		list($language, $values) = array($values, $language);

	return $GLOBALS['it_text']->etext($label, array_map(array("it_html", "Q"), (array)$values), $language);
}

/**
 * Return a text in the selected language
 * Replaces variables of the form {var} with value from argument $values
 * @param $label Label of text to return
 * @param $values Associative array containing values to fill in (no quoting)
 * @param $language Optional language to return text in.
 * @return Localized text string with variables replaced by their values
 */
function ET($label, $values = null, $language = null)
{
	it_text::init();
	return $GLOBALS['it_text']->etext($label, $values, $language);
}

/**
 * Change language
 * @param $language New language to set
 */
function T_set_language($language)
{
	it_text::init();
	return $GLOBALS['it_text']->set_language($language);
}

/**
 * Get active language
 * @return currently active language
 */
function T_lang()
{
	it_text::init();
	return $GLOBALS['it_text']->get_language();
}

/**
 * Get active language
 * @return default language of browser
 */
function T_defaultlang()
{
	it_text::init();
	return $GLOBALS['it_text']->get_defaultlanguage();
}

/**
 * Get available languages
 * @return available languages as langcode => langname
 */
function T_languages()
{
	it_text::init();
	return $GLOBALS['it_text']->languages;
}

/**
 * Check if a text entry for a specific label exists
 * @param $label Label to check
 * @return label name if text exists in current (or supplied) language, false otherwise.
 */
function T_exists($label, $language = null)
{
	it_text::init();
	return $GLOBALS['it_text']->text_exists($label, $language);
}

/****************** functions for class it_text **********************/

/**
 * Build an url
 */
function U(...$args)
{
	return is_a($obj = $GLOBALS['it_html'], 'it_html') ? $obj->U(...$args) : it_html::U(...$args);
}




/************************** other functions ***************************/

/**
 * Print an error message and end page
 */
function fail($text)
{
	trigger_error($text, E_USER_ERROR);
	it::fatal($text);
}

/**
 * Global shortcut for $it_debug::debug()
 * @see it_debug::debug()
 */
function debug($text, $level=0)
{
	if (isset($GLOBALS['it_debug']))
		$GLOBALS['it_debug']->debug($text, $level);
}

/**
 * Clone an object and return copy, works for all PHP versions
 */
function &it_clone(&$object)
{
	$result = (is_object($object) && version_compare(zend_version(), 2, '>=')) ? clone($object) : $object;
	return $result;	# PHP internals need a tmp var to return by ref
}

/**
 * Experimental PHP taint support, see ftp://ftp.porcupine.org/pub/php/
 */
if (function_exists("taint"))
{
	function it_untaint($value, $marks = TC_HTML) { untaint($value, $marks); return $value; }
	function it_taintcheck($value, $marks = TC_HTML) { if (istainted($value) & $marks) { untaint($value, $marks); it::error(it_untaint("it_taintcheck($value, $marks) failed")); } return $value; }
}
else
{
	define('TC_HTML', 0);
	define('TC_SHELL', 0);
	define('TC_MYSQL', 0);
	define('TC_MYSQLI', 0);
	define('TC_SELF', 0);
	define('TC_ALL', 0);
	define('TC_NONE', 0);
	function it_untaint($value, $dummy_marks = 0) {  return $value; }
	function it_taintcheck($value, $dummy_marks = 0) { return $value; }
}

# ULTRAHOME is generated in a safe way
$GLOBALS['ULTRAHOME'] = it_untaint($GLOBALS['ULTRAHOME'], TC_ALL);

?>