<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/common.php,v 1.76.2.7 2006/04/29 06:31:27 wurley Exp $

/**
 * Contains code to be executed at the top of each phpLDAPadmin page.
 * include this file at the top of every PHP file.
 *
 * This file will "pre-initialise" a PLA environment so that any PHP file will have a consistent
 * environment with other PLA PHP files.
 *
 * This code WILL NOT check that all required functions are usable/readable, etc. This process has
 * been moved to index.php (which really is only called once when a browser hits PLA for the first time).
 *
 * The list of ADDITIONAL function files is now defined in functions.php.
 *
 * @package phpLDAPadmin
 */

$timer = stopwatch();

@define('LIBDIR','../lib/');

# For PHP5 backward/forward compatibility
if (! defined('E_STRICT'))
	define('E_STRICT',2048);

# General functions needed to proceed.
ob_start();
require_once realpath(LIBDIR.'functions.php');
ob_end_clean();

/* Our custom error handler receives all error notices that pass the error_reporting()
   level set above. */
set_error_handler('pla_error_handler');
# Disable error reporting until all our required functions are loaded.
error_reporting(0);

/*
 * functions.php should have defined our pla_function_files array, listing all our
 * required functions (order IS important).
 * index.php should have checked they exist and are usable - we'll assume that the user
 * has been via index.php, and fixed any problems already.
 */
ob_start();
foreach ($pla_function_files as $file_name) {
	require_once realpath ($file_name);
}

# Now read in config_default.php, which also reads in config.php
require_once realpath(LIBDIR.'config_default.php');
ob_end_clean();

# We are now ready for error reporting.
# Turn on all notices and warnings. This helps us write cleaner code (we hope at least)
if (phpversion() >= '5') {
	# E_DEBUG is PHP5 specific and prevents warnings about using 'var' to declare class members
	error_reporting(E_DEBUG);
} else
	# For PHP4
	error_reporting(E_ALL);

/**
 * At this point we have read all our additional function PHP files and our configuration.
 */

# Check our custom variables.
$config->CheckCustom();

if (pla_session_start())
	run_hook('post_session_init',array());

/*
 * Language configuration. Auto or specified?
 * Shall we attempt to auto-determine the language?
 */

$language = $config->GetValue('appearance','language');

if ($language == 'auto') {

	# Make sure their browser correctly reports language. If not, skip this.
	if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {

		# Get the languages which are spetcified in the HTTP header
		$HTTP_LANGS = preg_split ('/[;,]+/',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
		foreach ($HTTP_LANGS as $key => $value) {
			if (substr($value,0,2) == 'q=') {
				unset($HTTP_LANGS[$key]);
				continue;
			}

			$value = preg_split('/[-]+/',$value);
			if (sizeof($value) == 2)
				$HTTP_LANGS[$key] = strtolower($value[0]).'_'.strtoupper($value[1]);
			else
				$HTTP_LANGS[$key] = auto_lang(strtolower($value[0]));
		}

		$HTTP_LANGS = array_unique($HTTP_LANGS);

		foreach ($HTTP_LANGS as $HTTP_LANG) {
			# Try to grab one after the other the language file
			$language_file = LANGDIR.$HTTP_LANG;

			if ((substr($HTTP_LANG,0,2) == 'en') ||
				(file_exists($language_file) && is_readable($language_file))) {

				# Set language
				putenv('LANG='.$HTTP_LANG); # e.g. LANG=de_DE
				setlocale(LC_ALL,$HTTP_LANG); # set LC_ALL to de_DE
				bindtextdomain('messages',LANGDIR);
				bind_textdomain_codeset('messages','UTF-8');
				textdomain('messages');
				header('Content-type: text/html; charset=UTF-8',true);
				break;
			}
		}
	}

} else {
	# Grab the language file configured in config.php
	if ($language != null) {
		if (strcmp($language,'english') == 0)
			$language = 'en_GB';

		$language_file = LANGDIR.$language;

		# Set language
		putenv('LANG='.$language); # e.g. LANG=de_DE
		setlocale(LC_ALL,$language); # set LC_ALL to de_DE
		bindtextdomain('messages',LANGDIR);
		bind_textdomain_codeset('messages','UTF-8');
		textdomain('messages');
		header('Content-type: text/html; charset=UTF-8', true);
	}
}

# If config.php doesn't create the templates array, create it here.
if (! isset($templates) || ! is_array($templates))
	$templates = array();

# Always including the 'custom' template (the most generic and flexible)
$templates['custom'] =
	array('desc' => 'Custom',
		'icon' => 'images/object.png',
		'handler' => 'custom.php');

/*
 * Strip slashes from GET, POST, and COOKIE variables if this
 * PHP install is configured to automatically addslashes()
 */
if (get_magic_quotes_gpc() && (! isset($slashes_stripped) || ! $slashes_stripped)) {
	array_stripslashes($_REQUEST);
	array_stripslashes($_GET);
	array_stripslashes($_POST);
	array_stripslashes($_COOKIE);
	$slashes_stripped = true;
}

/*
 * Update $_SESSION['activity']
 * for timeout and automatic logout feature
 */
if (isset($_REQUEST['server_id'])) {
	$ldapserver = $ldapservers->Instance($_REQUEST['server_id']);
	if ($ldapserver->haveAuthInfo())
		set_lastactivity($ldapserver);
}

/**
 * Timer stopwatch, used to instrument PLA
 */
function stopwatch() {
	static $mt_previous = 0;

	list($usec, $sec) = explode(' ',microtime());
	$mt_current = (float)$usec + (float)$sec;

	if (! $mt_previous) {
		$mt_previous = $mt_current;
		return 0;

	} else {
		$mt_diff = ($mt_current - $mt_previous);
		$mt_previous = $mt_current;
		return sprintf('%.5f',$mt_diff);
	}
}

/**
 * This function will convert the browser two character language into the
 * default 5 character language, where the country portion should NOT be
 * assumed to be upper case characters of the first two characters.
 */
function auto_lang($lang) {
	switch ($lang) {
		case 'ja': return 'ja_JP';
		default: return sprintf('%s_%s',$lang,strtoupper($lang));
	}
}
?>