<?php
/**
 * SyEngine3
 *
 * For more information see: http://www.sylinx.de/
 *
 * @copyright   Copyright (C) SyLinx GmbH
 * @author      Lothar Jenisch <info@sylinx.de>
 * @version     $Id: SyEngine3.php 5920 2012-08-10 12:09:04Z lothar $
 * @license     http://www.sylinx.de/license
 * @package     SyShop3
 */

// PHP Einstellungen
error_reporting(-1);
ini_set("session.auto_start", "0");

// Ausgaben ausschalten
ob_start();

// Definitionen
define("DEBUG_SCREEN", 1); // Meldungen auf Bildschirm
define("DEBUG_COMMENT", 2); // Meldungen als HTML Kommentar
define("DEBUG_FILE", 4); // Meldungen ins Logfile
define("INIT_SYSTEM", "SyIni.php"); // System Ini
define("INIT_PROJEKT", "SyConf.phtml"); // Projekt Ini
define("INIT_KLASSE", "SyClass.phtml"); // Klassendefinitionen
define("DB_MYSQL", 0); // Datenbanktyp: MySQL
define("DB_MSSQL", 1); // Datenbanktyp: MsSQL

// Set root path
if (!defined('ROOT_DIR')) define('ROOT_DIR', realpath(dirname(__FILE__)));
//if (!defined('DOCUMENT_ROOT')) define('DOCUMENT_ROOT', realpath(dirname($_SERVER['DOCUMENT_ROOT'])));

/**
 * Includes
 */
require_once 'SyOPS.class.php';

/**
 * ini Dateien einlesen
 */
$arrInit = parse_ini_file(INIT_SYSTEM, true);

/**
 * Get instance of SyLogger
 */
$syLogger = SyLogger::getInstance();

// Set the application path
if (!defined('APP_DIR')) define('APP_DIR', ROOT_DIR . '/' . $arrInit['SyCMS']['ZielRelativ']);
SyLogger::getInstance()->debug(APP_DIR, 'APP_DIR');

// Basis URL und Applikation URL festlegen
if (!defined('BASE_URL')) define('BASE_URL', $arrInit['SyCMS']['Hostpfad']);
if (!defined('APP_URL')) define('APP_URL', BASE_URL . '/' . $arrInit['SyCMS']['ZielRelativ']);
SyLogger::getInstance()->debug(APP_URL, 'APP_URL');

//
// Zeitzone zuweisen
//
date_default_timezone_set('Europe/Berlin');
if (!empty($arrInit['SyEngine3']['Timezone']))
{
	@date_default_timezone_set($arrInit['SyEngine3']['Timezone']);
}
SyLogger::getInstance()->debug(date_default_timezone_get(), 'Timezone');

// SSL aktiviert
if (!isset($arrInit['SyCMS']['SSL']))
{
	$arrInit['SyCMS']['SSL'] = '0';
}

// Name SSL Parameter
$strNameSSLParameter = $arrInit['SyCMS']['SSLParameter'];

// Verzeichnisse
$strRootpfad = getcwd();
$strQuellpfad = $strRootpfad . "/" . $arrInit['SyCMS']['QuelleRelativ'];
$strZielpfad = $strRootpfad . "/" . $arrInit['SyCMS']['ZielRelativ'];

//
// SyCMS Datenbank konnektieren
//
$SyCMS = new classSyDB($arrInit['SyCMS']['Server'], $arrInit['SyCMS']['User'], $arrInit['SyCMS']['Passwort'],
	$arrInit['SyCMS']['Port'], $arrInit['SyCMS']['Datenbanktyp']);
$SyCMS->select_db($arrInit['SyCMS']['Datenbank']);

// Where Bedingung z.B. für Freigabe von Objekten nicht definiert?
if (!isset($arrInit['SyCMS']['Where']))
{
	// Standard (wie bisher)
	$arrInit['SyCMS']['Where'] = "and Objekte.Freigabe='1' and " . $SyCMS->GetNowFunc() . " between Objekte.GueltigVon and Objekte.GueltigBis";
}

//
// restliche Datenbankeinträge konnektieren (beginnend mit "db*"
//
foreach ($arrInit as $strSektion => $arrSektion)
{
	// Datenbankeintrag ?
	if (substr($strSektion, 0, 2) == 'db')
	{
		$$strSektion = new classSyDB($arrInit[$strSektion]['Server'], $arrInit[$strSektion]['User'],
			$arrInit[$strSektion]['Passwort'], $arrInit[$strSektion]['Port'], $arrInit[$strSektion]['Datenbanktyp']);
		$$strSektion->select_db($arrInit[$strSektion]['Datenbank']);
	}
}

// Session als Cookie ?
ini_set("session.use_cookies", $arrInit['SyCMS']['Session_cookie']);
$boolCookie = ini_get("session.use_cookies");

//
// Klassendefinitionen laden
//
$strDatei = sprintf("%s/%s", $strZielpfad, INIT_KLASSE);
// SyDebug("Klassendefinitionen", $strDatei);
if (file_exists($strDatei))
{
	include $strDatei;
}

//
// Session starten
//
SessionStart();

/**
 * Instanz SyOPS erzeugen
 */
$SyOPS = SyOPS::getInstance($SyCMS);

//
// URL Query parsen (Ebene0 (einzelne GET Parameter)
//
$arrEbene0 = array();
$arrQuery = array();
$strQuery = $arrInit['SyEngine3']['StartQuery'];
parse_str($_SERVER['QUERY_STRING'], $aQ);
if (!empty($_SERVER['QUERY_STRING']) && !empty($aQ['q']))
{
	$strQuery = $_SERVER['QUERY_STRING'];
}
parse_str($strQuery, $arrEbene0);
foreach ($arrEbene0 as $strEbene0 => $strWert0)
{
	// Query Variable?
	if ($strEbene0 == $arrInit['SyEngine3']['UrlVariable'])
	{
		// Ebene 1 (/)
		$arrEbene1 = explode($arrInit['SyEngine3']['UrlTrenner'][0], $strWert0);
		if (count($arrEbene1) >= 1)
		{
			$arrQuery[$strEbene0] = array();
			$intEbene1 = 0;
			foreach ($arrEbene1 as $strEbene1 => $strWert1)
			{
				$arrQuery[$strEbene0][$intEbene1] = array();

				// Ebene 2 (,)
				$arrEbene2 = explode($arrInit['SyEngine3']['UrlTrenner'][1], $strWert1);
				$intEbene2 = 0;
				foreach ($arrEbene2 as $strEbene2 => $strWert2)
				{
					// Ebene 3 (-)
					$arrEbene3 = explode($arrInit['SyEngine3']['UrlTrenner'][2], $strWert2);
					// Parameterbezeichnung vorhanden?
					if (count($arrEbene3) == 2)
					{
						$arrQuery[$strEbene0][$intEbene1][$arrEbene3[0]] = $arrEbene3[1];
					}
					else
					{
						$arrQuery[$strEbene0][$intEbene1][] = $arrEbene3[0];

						// $arrQuery[$strEbene0][$intEbene1]['p'.$intEbene2] = $arrEbene3[0];
					}
					$intEbene2++;
				}
				$intEbene1++;
			}
		}
		else
		{
			$arrQuery[$strEbene0] = $strWert0;
		}
	}
	else
	{
		$arrQuery[$strEbene0] = $strWert0;
	}
}
SyLogger::getInstance()->debug($_SERVER['QUERY_STRING'], 'URL Query (org)');
SyLogger::getInstance()->debug($arrQuery, 'URL Query');

//
// SSL Einstellung nur überschreiben falls Parameter vorhanden und SSL aktiviert
// Standard: Einstellung unverändert lassen
//
if (isset($_REQUEST[$strNameSSLParameter]) && ($arrInit['SyCMS']['SSL'] == '1'))
{
	$_SESSION[$strNameSSLParameter] = $_REQUEST[$strNameSSLParameter];
}

// SSL aktiviert ?
if (isset($_SESSION[$strNameSSLParameter]) && ($_SESSION[$strNameSSLParameter] > 0))
{
	$strHttp = "https";
}
else
{
	$strHttp = "http";
}

// Konfiguration Projekt
$strDatei = sprintf("%s/%s", $strZielpfad, INIT_PROJEKT);
$boolReturn = include $strDatei;
if ($boolReturn === false)
{
	SyFehler(sprintf('%s (%s)', 'Datei nicht vorhanden', INIT_PROJEKT));
}

// Startdatei
$strDatei = sprintf("%s/%s", $strZielpfad, $arrInit['SyCMS']['Startdatei']);
$boolReturn = include $strDatei;
if ($boolReturn === false)
{
	SyFehler(sprintf('%s (%s)', 'Datei nicht vorhanden', $strDatei));
}

/**
 * SyOPS Klasse loggen
 *
 * @todo Zu einem späteren Zeitpunkt evtl. wieder aktivieren
 */
SyLogger::getInstance()->group('SyOPS');
SyLogger::getInstance()->debug($SyOPS, 'SyOPS');
SyLogger::getInstance()->groupEnd();

/**
 * PHP Superglobals loggen
 */
SyLogger::getInstance()->group('PHP');
SyLogger::getInstance()->debug($_POST, 'POST');
SyLogger::getInstance()->debug($_GET, 'GET');
SyLogger::getInstance()->debug($_COOKIE, 'COOKIE');
SyLogger::getInstance()->all($_REQUEST, 'REQUEST');
SyLogger::getInstance()->all($_SERVER, 'SERVER');
SyLogger::getInstance()->all($_SESSION, 'SESSION');
SyLogger::getInstance()->all(
	array_diff_key($GLOBALS,
		array_flip(array('GLOBALS', '_SERVER', '_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_REQUEST', '_ENV'))),
	'GLOBALS (only)');
SyLogger::getInstance()->groupEnd();

ob_end_flush();
session_write_close();
exit();

/**
 * Ende Main
 */

/**
 * URL codierten Query String aufbereiten
 *
 * @param array $arrDaten
 *        	Array mit Name und Wert
 * @param boolean $boolCodiere
 * @return string
 */
function ErstelleHttpQuery($arrDaten, $boolCodiere = true)
{
	$arr = array();
	foreach ($arrDaten as $strName => $strWert)
	{
		if ($boolCodiere)
		{
			$strWert = urlencode($strWert);
		}
		$arr[] = $strName . '=' . $strWert;
	}
	return implode($arr, '&');
}

/**
 * Mikrosekunden ermitteln
 *
 * @return string Mikrosekungen als Ganzahl, normiert auf 6 Stellen
 */
function microtime_float()
{
	if (function_exists("microtime"))
	{
		list ($usec, $sec) = explode(" ", microtime());
		return ':' . sprintf('%06d', $usec * 1000000);
	}
	else
	{
		return '';
	}
}

/**
 * Session starten
 */
function SessionStart()
{
	global $arrInit;
	global $oSession;
	global $boolCookie;

	if (!$boolCookie && !empty($_REQUEST['sid']))
	{
		session_id($_REQUEST['sid']);
	}

	// Session starten
	session_name('sidSyEngine');
	session_start();
}

/**
 * Meldung abhängig vom DEBUG_LEVEL ausgeben.
 *
 * @param string $Text
 *        	Meldung
 * @param string $Typ
 *        	freie Klassifizierung der Meldung
 * @param int $Level
 *        	Anzeigelevel der Meldung
 * @return void
 *
 * @deprecated Durch SyLogger ersetzt
 */
function SyLog($Text, $Typ = "", $Level = 0)
{
	global $arrInit;
	return;

	if ($arrInit['Log']['Level'] >= $Level)
	{
		// Meldung erstellen
		$out = sprintf("[%s%s] %s: %s\n", date("Y-m-d H:i:s"), microtime_float(), $Typ,
			preg_replace("/[\n\r\t ]+/", ' ', $Text));

		// Bildschirm
		if ($arrInit['Log']['Medium'] & DEBUG_SCREEN)
		{
			printf(
				'<DIV style="font-family:Courier; font-size:10pt; z-index:100; color:#FF0000; background-color:#FFFFFF;">%s</DIV>',
				$out);
		}

		// Kommentar
		if ($arrInit['Log']['Medium'] & DEBUG_COMMENT)
		{
			printf('<!-- %s -->', $out);
		}

		// Logdatei
		if ($arrInit['Log']['Medium'] & DEBUG_FILE)
		{
			$fp = fopen($arrInit['Log']['Datei'], "a");
			fwrite($fp, $out);
			fclose($fp);
		}
	}
}

/**
 * Meldung ausgeben
 *
 * @param string $msg
 *        	Meldung
 * @return void
 *
 * @deprecated Durch SyLogger ersetzt
 */
function SyMsg($msg)
{
	return;

	printf(
		'<DIV style="font-family:Courier; font-size:10pt; z-index:100; color:#FF0000; background-color:#FFFFFF;">%s</DIV>',
		$msg);
}

/**
 * Trace ausgeben und Fehler triggern.
 *
 * @param string $message
 */
function SyFehler($message)
{
	SyLogger::getInstance()->trace($message);
	trigger_error($message, E_USER_ERROR);
	exit();
}

/**
 * Debugmeldung auf Standardausgabe ausgeben.
 *
 * @param string $strText
 *        	Text
 * @param mixed $varDaten
 *        	Variable
 * @return void
 *
 * @deprecated Durch SyLogger ersetzt
 */
function SyDebug($strText = "", $varDaten = null)
{
	global $arrInit;
	return;

	echo '<span style="font-size:11px; color:#FF0000;">';
	echo '<code>';
	echo "<i>$strText: </i>";
	if (is_scalar($varDaten))
	{
		echo htmlspecialchars($varDaten);
		echo '<br />';
	}
	else
	{
		ob_start();
		print_r($varDaten);
		$strAusgabe = ob_get_contents();
		ob_end_clean();
		echo '<pre>';
		echo htmlspecialchars($strAusgabe);
		echo '</pre>';
	}
	echo '</code>';
	echo '</span>';
}

/**
 * String formatieren
 *
 * @param string $strS
 *        	String
 * @param string $strFormat
 *        	Formatanweisung, z.B. "-12.10,4"
 * @return string formatierter String
 */
function string_format($strS, $strFormat)
{
	$strRet = $strS;
	$strStr = "$strS";
	$intLen = 0;

	// Ermittle Terme im Formatstring
	if (preg_match_all("/([-]?[0-9]+)/", $strFormat, $arrTerm) == true)
	{
		$strRet = "";
		// ermittle gesamte Solllänge des Ausgabestrings
		while (list ($key, $val) = each($arrTerm[0]))
		{
			$intLen = $intLen + abs($val);
		}
		reset($arrTerm[0]);

		$intPS = 0;
		$intSPS = 0;
		while (list ($key, $val) = each($arrTerm[0]))
		{
			// Trennstrings in Formatanweisung
			$intPE = strpos($strFormat, $val, $intPS);
			$strFuell = substr($strFormat, $intPS, $intPE - $intPS);
			$intPS = $intPE + strlen($val);

			// schneide aus Orginalstring aus
			$strTerm = substr($strStr, $intSPS, abs($val));
			$intSPS = $intSPS + abs($val);

			// generiere Printf-Anweisung
			$strPF = "%s%s%" . $val . "s";
			$strRet = sprintf($strPF, $strRet, $strFuell, $strTerm);
		}
		$strFuell = substr($strFormat, $intPS, strlen($strFormat) - $intPS);
		$strRet = $strRet . $strFuell;
	}

	return $strRet;
}

/**
 * Datum- & ZeitString formatieren
 *
 * @param string $strDT
 *        	Datum- und Uhrzeitstring
 * @param string $strScanf
 *        	Code für sscanf-Anweisung
 * @param string $strSprintf
 *        	Code für sprintf-Anweisung
 * @return string formatierter String
 */
function datetime_format($strDT, $strScanf, $strSprintf)
{
	$_DFSprintf = "";
	if (($strDT != "") && ($strScanf != "") && ($strSprintf != ""))
	{
		// echo "datetime_format ('$strDT', '$strScanf', '$strSprintf')";
		$_DTWert = $strDT;
		eval($strScanf . $strSprintf);

		// eval($strSprintf);
	}
	return $_DFSprintf;
}

/**
 * Liest Datei
 *
 * @param int $Id
 *        	Id der Datei
 * @param string $Sprache
 *        	Spracheversion der Datei
 * @return string Text
 */
function GetDatei($Id, $Sprache = F_DEUTSCH)
{
	global $SyCMS;
	global $arrInit;

	$s = sprintf("select %s from Dateien where Id='%d'", $Sprache, $Id);
	$sql = $SyCMS->Query($s);

	if ($sql->num_rows() == 0) return "";

	$arr = $sql->fetch_array();
	$ret = sprintf("%s/%s/%s_%s", $arrInit['SyCMS']['Pfad'], $Sprache, $Id, $arr[$Sprache]);
	return $ret;
}

/**
 * Liest Text mit Nummer
 *
 * @param int $Id
 *        	Textnummer
 * @param string $Sprache
 *        	Sprachcode
 * @return string Text
 */
function SyGetText($Id, $Sprache = F_DEUTSCH)
{
	global $SyCMS;
	global $arrInit;

	$s = sprintf("select %s from Texte where Id='%d'", $Sprache, $Id);
	$sql = $SyCMS->Query($s);
	$arr = $sql->fetch_array();
	return htmlspecialchars(nl2br($arr[$Sprache]), ENT_QUOTES);
}

/**
 * Öffnet die übergebene URL.
 * Prüft ob im Frame und bricht ggf. aus dem Frame aus.
 *
 * @param string $Url
 *        	Url
 */
function JsStartseite($Url)
{
	echo <<<EOT
<SCRIPT language="JavaScript">
if (top != document)
{
	// aus Frame ausbrechen
	//alert("Top $Url");
	top.location.replace("$Url");
}
else
{
	// direkt öffnen
	//alert("Direkt $Url");
	location.replace("$Url");
}
</SCRIPT>
EOT;
	exit();
}

/**
 * Gibt ein Alert Fenster aus.
 *
 * @param string $Text
 *        	Text für Alert
 */
function JsText($Text)
{
	echo <<<EOT
<SCRIPT language="JavaScript">
alert("$Text");
</SCRIPT>
EOT;
}

/**
 * Umschaltung des Targets
 *
 * Enter description here ...
 *
 * @param string $Url
 *        	Zielurl
 * @param string $Target
 *        	Zielobjekt
 */
function JsReplace($Url, $Target)
{
	echo <<<EOT
<SCRIPT language="JavaScript">
alert("$Target.location.replace('$Url')");
$Target.location.replace("$Url");
</SCRIPT>
EOT;
}

/**
 * Prüfe Gültigkeit des Schlüssels (LaufZeitPrüfsummen) zulässige Domainnamen zeitliche Gültigkeit
 *
 * @param string $strWWWHost
 *        	Hostname (aus SyIni.php [SyCMS]/Host)
 * @return int <br/>
 *         0: OK <br/>
 *         -2: zeitliche Gültigkeit ist abgelaufen <br/>
 *         -3: Domainname unzulässig <br/>
 */
function Check_Lzp($strWWWHost)
{
	require 'SyOPS.php';

	// Lizenzprüfroutinen
	if (!CheckLizValid()) return -2;
	if (!CheckWWWHost($strWWWHost)) return -3;

	return 0;
}

/**
 * Enthält die Methoden (Resultfunktionen) für den Datenbankzugriff
 *
 * @author Lothar
 */
class classSyRes
{
	public $resResult;
	public $iDBTyp;

	/**
	 * Konstruktor
	 *
	 * @param resource $resResult
	 * @param int $iDBTyp
	 */
	function __construct(&$resResult, $iDBTyp)
	{
		$this->resResult = $resResult;
		$this->iDBTyp = $iDBTyp;
	}

	/**
	 * Anzahl der Zeilen liefern
	 *
	 * @return int -1: falls Fehler aufgetreten ist
	 */
	public function num_rows()
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				return mysql_num_rows($this->resResult);
				break;

			case DB_MSSQL:
				return mssql_num_rows($this->resResult);
				break;

			default:
				break;
		}

		return -1;
	}

	/**
	 * Auf Datensatz stellen.<br/>
	 * Bei SQLSRV nicht möglich.
	 *
	 * @param int $iSatznummer
	 * @return bool Returns true on success or false on failure.
	 */
	public function data_seek($iSatznummer)
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				return mysql_data_seek($this->resResult, $iSatznummer);
				break;

			case DB_MSSQL:
				return mssql_data_seek($this->resResult, $iSatznummer);
				break;

			default:
				break;
		}

		return false;
	}

	/**
	 * Ergebniszeile in Array einlesen.
	 *
	 * @param int $Ergebnistyp
	 * @return array Array mit Ergebnis oder false bei Fehler
	 */
	public function fetch_array($Ergebnistyp = MYSQL_ASSOC)
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				return mysql_fetch_array($this->resResult, $Ergebnistyp);
				break;

			case DB_MSSQL:
				$arrData = mssql_fetch_array($this->resResult);
				if ($arrData != false)
				{
					foreach ($arrData as $key => $val)
					{
						$arrData[$key] = rtrim($val);
					}
				}
				return $arrData;
				break;

			default:
				break;
		}

		return false;
	}

	/**
	 * Ein Feld auslesen.
	 *
	 * @param int $iDatensatz
	 * @param string[optional] $strFeld
	 * @return string Wert oder false bei Fehler
	 */
	public function result($iDatensatz, $strFeld = "")
	{
		$strResult = false;

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$strResult = mysql_result($this->resResult, $iDatensatz, $strFeld);
				break;

			case DB_MSSQL:
				return rtrim(mssql_result($this->resResult, $iDatensatz, $strFeld));
				break;

			default:
				break;
		}

		if ($strResult === false)
		{
			SyLogger::getInstance()->fatal($strFeld, 'SQL Result');
			SyLogger::getInstance()->trace('SQL Result');
		}

		return $strResult;
	}

	/**
	 * Gibt Speicher fuer Abfrageergbenis frei, zerstoert Resultobjektt
	 *
	 * @return bool true bei Erfolg und false bei Fehler
	 */
	public function free_result()
	{
		$bRet = false;

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$bRet = @mysql_free_result($this->resResult);
				break;

			case DB_MSSQL:
				$bRet = @mssql_free_result($this->resResult);
				break;

			default:
				break;
		}

		unset($this);

		return 1;
	}

	/**
	 * Anzahl der Felder ermitteln.
	 *
	 * @return int Anzahl der Felder oder false bei Fehler.
	 */
	public function NumFields()
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$iRet = mysql_num_fields($this->resResult);
				break;

			case DB_MSSQL:
				$iRet = mssql_num_fields($this->resResult);
				break;
		}

		return $iRet;
	}

	/**
	 * Feldname des Offset liefern.
	 *
	 * @param int $iOffset
	 * @return string Name des Felder oder false bei Fehler
	 */
	public function FieldName($iOffset)
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$strRet = mysql_field_name($this->resResult, $iOffset);
				break;

			case DB_MSSQL:
				$strRet = mssql_field_name($this->resResult, $iOffset);
				break;
		}

		return $strRet;
	}
}

/**
 * Enthält die Methoden für den Datenbankzugriff ohne Resultfunktionen.
 *
 * @author Lothar
 */
class classSyDB
{
	public $strServer;
	public $strPort;
	public $strDatabase;
	public $strUser;
	public $strPassword;
	public $resDB;
	public $resDBQuery;
	public $iDBTyp;

	/**
	 * Konstruktor
	 *
	 * @param string $strServer
	 * @param string $strUser
	 * @param string $strPassword
	 * @param string $strPort
	 * @param int $iDBTyp
	 * @return bool true bei Erfolg und false bei Fehler
	 */
	function __construct($strServer, $strUser, $strPassword, $strPort, $iDBTyp)
	{
		$this->strServer = $strServer;
		$this->strPort = $strPort;
		$this->strUser = $strUser;
		$this->strPassword = $strPassword;
		$this->iDBTyp = $iDBTyp;
		$this->resMySql = false;
		$this->resDB = false;
		$this->resDBQuery = false;
		$this->strDatabase = "";

		// Datenbank konnektieren
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$this->resDB = @mysql_connect($this->strServer . ":" . $this->strPort, $this->strUser,
					$this->strPassword);
				break;

			case DB_MSSQL:
				// . ":" . $this->strPort
				$this->resDB = mssql_connect($this->strServer, $this->strUser, $this->strPassword);
				// Datum und Zeit nicht konvertieren
				ini_set("mssql.datetimeconvert", "0");

				break;

			default:
				break;
		}

		if ($this->resDB == false)
		{
			return false;
		}
		else
		{
			return true;
		}
	}

	/**
	 * Führt eine SQL Abfrag aus und prueft den Erfolg.
	 *
	 * @param string $strQuery
	 *        	SQL Abfrage String
	 * @param int $iDebug
	 *        	Ausgabe des Querystring (Debug)
	 * @return resource Ergebnis der Abfrage oder false bei Fehler
	 */
	public function Query($strQuery, $iDebug = 1)
	{
		global $arrInit;

		$strFehler = "";

		// SyLog($strQuery, "SQL", 3);
		SyLogger::getInstance()->sql($strQuery, $this->strDatabase);

		// Datenbank immer selektieren
		if ($this->strDatabase == "")
		{
			SyFehler('Keine Datenbank selektiert!');
			return false;
		}
		else
		{
			// $this->select_db($this->strDatabase);
		}
		// SyDebug("Query", $this->strDatabase);

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$this->resDBQuery = mysql_query($strQuery, $this->resDB);
				$strFehler = sprintf("SQL: '%s' (%s: %s)", $strQuery, mysql_errno($this->resDB),
					mysql_error($this->resDB));
				break;

			case DB_MSSQL:
				$arrReplace = array("now()", "curtime()", "curdate()");
				$strQuery = str_replace($arrReplace, "getdate()", $strQuery);
				$this->resDBQuery = mssql_query($strQuery, $this->resDB);
				$strFehler = sprintf("SQL: '%s'", $strQuery);
				break;

			default:
				break;
		}

		if ($this->resDBQuery === false)
		{
			SyLogger::getInstance()->error($strFehler, 'SQL Query');
			SyLogger::getInstance()->trace('SQL Query');
			return false;
		}
		else
		{
			if ($this->resDBQuery === true)
			{
				return true;
			}
			else
			{
				$oResult = new classSyRes($this->resDBQuery, $this->iDBTyp);
				return $oResult;
			}
		}
	}

	/**
	 * Wählt die Datenbank aus.
	 *
	 * @param string $strDatenbank
	 *        	Datenbank
	 * @return bool true bei Erfolg und false bei Fehler
	 */
	public function select_db($strDatenbank)
	{
		$bRet = false;

		if ($this->strDatabase != $strDatenbank)
		{
			$this->strDatabase = $strDatenbank;
			$this->Query("set CHARACTER SET utf8", -1);

			// return true;
		}
		else
		{
			return true;
		}
		// SyDebug("Select", $this->strDatabase);

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				return mysql_select_db($this->strDatabase, $this->resDB);
				break;

			case DB_MSSQL:
				return mssql_select_db($this->strDatabase, $this->resDB);
				break;

			default:
				break;
		}

		return false;
	}

	/**
	 * Datum für Datenbank formatieren.
	 *
	 * @param string $strDatum
	 *        	Datum (Y-m-d H:i:s)
	 * @return string formatiertes Datum
	 */
	public function DateToDb($strDatum)
	{
		// Jahr, Monat, Tag, Stunde, Minute, Sekunde
		$arr = array(0, 0, 0, 0, 0, 0);
		$arrDatum = preg_split("/[- :\.]/", $strDatum);
		array_splice($arr, 0, count($arrDatum), $arrDatum);

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$strRet = $strDatum;
				break;

			case DB_MSSQL:
				// Monat und Tag tauschen
				$strRet = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $arr[0], $arr[2], $arr[1], $arr[3], $arr[4], $arr[5]);
				break;
		}

		return $strRet;
	}

	/**
	 * Datum aus Datenbank formatieren.
	 *
	 * @param string $strDatum
	 *        	Datum
	 * @return string formatiertes Datum
	 */
	public function DateFromDb($strDatum)
	{
		// Jahr, Monat, Tag, Stunde, Minute, Sekunde
		$arr = array(0, 0, 0, 0, 0, 0);
		if (!is_null($strDatum))
		{
			$arrDatum = preg_split("/[- :\.]/", $strDatum);
			array_splice($arr, 0, count($arrDatum), $arrDatum);
		}

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$arrRet = $arr;
				break;

			case DB_MSSQL:
				$arrRet = $arr;
				break;
		}

		return $arrRet;
	}

	/**
	 * Gibt aktuellen Fehler zurueck
	 *
	 * @return string Fehlerstring oder ""
	 */
	protected function error()
	{
		$strRet = "no database";

		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				return mysql_error($this->resDB);
				break;

			case DB_MSSQL:
				return "";
				break;

			default:
				break;
		}

		return $strRet;
	}

	/**
	 * String für SQL Aufruf maskieren.
	 *
	 * @param string $strWert
	 *        	String
	 * @return string maskierter String
	 */
	public function Addslashes($strWert)
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				if (get_magic_quotes_gpc() == 0)
				{
					$strRet = addslashes($strWert);
				}
				else
				{
					$strRet = $strWert;
				}
				break;

			case DB_MSSQL:
				if (get_magic_quotes_gpc() == 0)
				{
					// ' verdoppeln
					$strRet = str_replace("'", "''", $strWert);
				}
				else
				{
					if (ini_get("magic_quotes_sybase") == 1)
					{
						// ' wird automatisch verdoppelt
						$strRet = $strWert;
					}
					else
					{
						// demaskieren und ' verdoppeln
						$strRet = str_replace("'", "''", stripslashes($strWert));
					}
				}

				break;
		}

		return $strRet;
	}

	/**
	 * Insert Id ermitteln
	 *
	 * @return int Id
	 */
	public function InsertId()
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$iRet = mysql_insert_id($this->resDB);
				break;

			case DB_MSSQL:
				$sql = $this->Query("select @@IDENTITY as 'Identity'");
				$iRet = $sql->Result(0, "Identity");
				$sql->free_result();
				break;
		}

		return $iRet;
	}

	/**
	 * Anzahl Zeilen ermitteln.
	 *
	 * @return int Anzahl
	 */
	public function AffectedRows()
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$iRet = mysql_affected_rows($this->resDB);
				break;

			case DB_MSSQL:
				$iRet = mssql_rows_affected($this->resDB);
				break;
		}

		return $iRet;
	}

	/**
	 * Aktuelle Zeitfunktion für SQL-String ermitteln.
	 *
	 * @return int Anzahl
	 */
	public function GetNowFunc()
	{
		switch ($this->iDBTyp)
		{
			case DB_MYSQL:
				$sRet = 'now()';
				break;

			case DB_MSSQL:
				$sRet = 'getdate()';
				break;
		}

		return $sRet;
	}
}
