<?php

/**
 * @return void
 * @param string $file
 * @desc Setzt die Browser-Location auf $file
*/
function set_location( $file )
{
	header( 'Location: '.combine_path( CORE_URL, $file ) );
}


function LogError($message = false, $logmessage = false, $stop = false) {
	global $user;
	
	if($message === false) $message = "Ein Fehler ist aufgetreten";
		if($logmessage===false) $logmessage = $message;
		
	$backtrace = debug_backtrace();
	
	if(isset($_SESSION['dirtychar']))
			$_SESSION['dirtychar'] = false;
	
	if(isset($user)) $logmessage  .= "____".$user->ID."____";
	
	$MySQL = new MySQL( MYSQL_HOST, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE );
  	$dump= sprintf("Ausnahme: %s. Trace: %s", $message, Print_R($backtrace, true));
  	$dump2 = $dump;
  	$dump.= sprintf(": %s", Print_R($GLOBALS, true));
  
  	$sql = sprintf("INSERT INTO logdb.me_errors SET typ = 69, accountID = %d, zeit = NOW(), meldung = '%s', service = 'homepage'", $user->ID, me_escape($dump));
  	
  	$MySQL->query($sql);
	error($dump2, true);
	die();
}

/**
 * @return String
 * @param String $value
 * @desc sichert mysql-querys ab, wenn auf Strings angewendet
*/
function me_escape($value)
{
   // Stripslashes
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);
   }
   // Quote if not integer
   if (!is_numeric($value)) {
       $value = mysql_real_escape_string($value);
   }
   return $value;
}

/**
 * @return Array
 * @param Array $value
 * @desc Wendet stripslashes rekursiv auf ein Array oder einen String $value an
*/
function stripslashes_deep($value)
{
   $value = is_array($value) ?
               array_map('stripslashes_deep', $value) :
               stripslashes($value);
   return($value);
}

/**
 * @return bool
 * @param object $variable
 * @desc Prüft, ob eine Variable keinen Inhalt hat oder nicht gesetzt ist.
*/
function is_empty( $variable )
{
	if( !$variable || $variable == null || $variable == "" || empty( $variable ) )
    	return true;
    else
    	return false;
}

/**
 * @return void
 * @param string $template
 * @desc Gibt eine Fehlermeldung aus dem Ordner '/templates/errors/' aus ($text=false) oder gibt einen String aus ($text=true) und beendet den PHP Aufruf.
*/
function error( $template, $text = false )
{
    global $Smarty;
    
    if($text === false) {
		$error_msg = $Smarty->fetch( 'errors/'.$template.'.tpl' );
    	$Smarty->assign( 'error_msg', $error_msg );
    } else {
    	$Smarty->assign( 'error_msg', $template);
    }

    $page['content'] = $Smarty->fetch( 'error.tpl' );
    $Smarty->assign( 'page', $page );
    $Smarty->display( 'main.tpl' );

    exit();
}

/**
 * @return string
 * @param string $template
 * @desc Liest ein Formular-Fehler Template aus und gibt dieses zurück.
*/
function form_error( $template )
{
    global $Smarty;

    return $Smarty->fetch( 'form_errors/'.$template.'.tpl' );
}

/**
 * @return bool
 * @desc Prüft, ob die als Argumente angebenen $_POST Variablen vorhanden sind.
*/
function check_fields()
{
    for( $i = 0; $i < func_num_args(); $i++ )
    {
    	$fieldname = func_get_arg( $i );

        if( !isset( $_POST[$fieldname] ) || $_POST[$fieldname] == "" )
        	return false;
    }

    return true;
}

/**
 * @return void
 * @param string $from
 * @param string $to
 * @param int $size_x
 * @param int $size_y
 * @desc Generiert ein Vorschaubild aus $from und speichert dieses in $to ab.
*/
function make_thumb( $from, $to, $size_x = -1, $size_y = -1 )
{
    global $settings;

    if( $size_x == -1 || $size_y == -1 )
    {
    	$size_x = intval( $settings['max_thumb_x'] );
        $size_y = intval( $settings['max_thumb_y'] );
    }

    /*$imgsize = getimagesize( $from );

    if( $imgsize[0] > $size_x || $imgsize[1] > $size_y )
    {
    	$diff_x = $imgsize[0] - $size_x;
        $diff_y = $imgsize[1] - $size_y;
        if( $diff_x > $diff_y )
        {
            $thumb_x = $size_x;
            $thumb_y = intval( $imgsize[1] * ( $size_x / $imgsize[0] ) );
        }
        else
        {
            $thumb_y = $size_y;
            $thumb_x = intval( $imgsize[0] * ( $size_y / $imgsize[1] ) );
        }
    }
    else
    {
    	$thumb_x = $size_x;
    	$thumb_y = $size_y;
    }

	$srcim = ImageCreateFromJPEG( $from );
	$dstim = ImageCreate( $thumb_x, $thumb_y );
	imagecopyresized( $dstim, $srcim, 0, 0, 0, 0, $thumb_x, $thumb_y, imagesx( $srcim ), imagesy( $srcim ) );
	imagejpeg( $dstim, $to );
	@chmod ( $to ,0777 );
	imagedestroy( $srcim );
	imagedestroy( $dstim );*/

    //$handle = imagick_readimage( $from ) ;
    //imagick_resize( $handle, $size_x, $size_y, IMAGICK_FILTER_UNKNOWN, 0 );
    //imagick_writeimage( $handle, $to );

    exec( 'E:\ImageMagick/convert -size '.$size_x.'x'.$size_y.' "'.$from.'" -resize '.$size_x.'x'.$size_y.' '.$to );
}

/**
 * @return void
 * @desc Weist die als Argumente angegebenen angegebenen $_REQUEST Werte in Smarty im Array $formvalues zu.
*/
function assign_formvalues()
{
    global $Smarty;

    $formvalues = array();

    for( $i = 0; $i < func_num_args(); $i++ )
    {
    	$fieldname = func_get_arg( $i );

        if( isset( $_REQUEST[$fieldname] ) )
        {
            if( is_array( $_REQUEST[$fieldname] ) )
            {
            	$formvalues[$fieldname] = $_REQUEST[$fieldname];
            }
            else
            	$formvalues[$fieldname] = stripslashes( $_REQUEST[$fieldname] );
        }
    }

    if( count( $formvalues ) > 0 )
    	$Smarty->assign( 'formvalues', $formvalues );
}

/**
 * @return int
 * @desc Generiert einen zufälligen Code des Types integer.
*/
function generate_code()
{
	$time = intval( substr( microtime(), 2, 8 ) );
	mt_srand( $time );

	return mt_rand( 1000000, 10000000 );
}

/**
 * @return array
 * @desc Generiert einen Assoziierten Array aus den angegebenen Argumenten.
*/
function make_assoc_array()
{
    $out_array = array();

    for( $i = 0; $i < func_num_args(); $i++ )
    {
    	$index_name = func_get_arg( $i );
        $out_array[$index_name] = $index_name;
    }

    return $out_array;
}

/**
 * @return void
 * @desc Gibt eine Berechtigungs-Fehlermeldung aus.
*/
function access_error()
{
    global $user;

    if( isset( $user ) && $user->ID > 0 )
    	error( 'access_error_user' );
    else
    	error( 'access_error_guest' );
}

/**
 * @return void
 * @param string $template
 * @param bool $table
 * @desc Gibt eine Nachricht aus dem Ordner '/templates/messages/' aus. Wenn $table = false, wird kein 'drumherum' angezeigt.
*/
function display_message( $template, $table = true )
{
	global $Smarty;

    $page['content'] = $Smarty->fetch( 'messages/'.$template.'.tpl' );
    $Smarty->assign( 'page', $page );
    if( !$table )
    	$Smarty->display( 'main_light.tpl' );
    else
    	$Smarty->display( 'main.tpl' );

    die();
}

/**
 * @return bool
 * @param string $adress
 * @param string $template
 * @param string $sender
 * @desc Generiert eine eMail aus dem '/mail/$template' und versucht diese zu versenden.
*/
function send_mail( $adress, $template, $sender = null )
{
	global $Smarty, $settings, $mailenv;

    if( $sender == null )
    	$sender = "UO-Mittelerde Mailer <".$settings['sendmail_from'].">";

    $Smarty->assign( 'mailenv', $mailenv );

    $mail_msg = $Smarty->fetch( 'mail/'.$template.'.tpl' );
    $subject = $Smarty->fetch( 'mail/'.$template.'_subject.tpl' );

    if( @mail( $adress, $subject, $mail_msg, "From: ".$sender ) )
    	return true;
    else
    	return false;
}

/**
 * @return void
 * @param string $action
 * @desc Gibt eine Fehlermeldung aus, falls der Client die $action noch nicht wieder ausführen kann.
*/
function flood_protect( $action )
{
    global $MySQL;
	
    // delete old flood_protect
	$MySQL->query( "DELETE FROM flood_protect WHERE expire <= ".time() );
    
    $res = $MySQL->query( "SELECT * FROM flood_protect WHERE ip_address = '".$_SERVER['REMOTE_ADDR']."' && performed_action = '".$action."'" );

    if( $MySQL->num_rows( $res ) > 0 )
    	error( 'flood_protect' );
}

/**
 * @return string
 * @desc Kombiniert die als Argumente angegebenen Pfade zu einem.
*/
function combine_path()
{
    $path = "";

    for( $i = 0; $i < func_num_args(); $i++ )
    {
    	$path_info = func_get_arg( $i );

        if( empty( $path_info ) )
        	continue;

        if( $path_info{0} == "/" || $path_info{0} == "\\" )
	        $path_info = substr( $path_info, 1 );

	    if( $path_info{strlen( $path_info )-1} == "/" || $path_info{strlen( $path_info )-1} == "\\" )
	        $path_info = substr( $path_info, 0, strlen( $path_info )-1 );

        $path_info = trim( $path_info );
        $path_info = str_replace( "\\", "/", $path_info );

        if( !is_empty( $path_info ) )
        {
        	if( !is_empty( $path ) )
            	$path .= "/";

            $path .= $path_info;
        }
    }

    return $path;
}

/**
 * @return string
 * @param int $numbers
 * @param int $length
 * @desc Generiert ein Passwort mit den angegebenen Daten.
*/
function gen_password( $numbers = 3, $length = 8 ) {
	$time = intval( substr( microtime(), 2, 8 ) );
	mt_srand( $time );

	$numberchain = "1234567890";

	for( $i = 0; $i < $numbers; $i++ ) {
		$random = mt_rand( 0, strlen( $numberchain )-1 );
		$number[intval( $numberchain[$random] )] = mt_rand( 1, 9 );
		$numberchain = str_replace( $random, "", $numberchain );
	}

	$chain = "abcdefghijklmnopqrstuvwxyz";
    $password = "";

    for( $i = 0; $i < $length ; $i++ ) {
		if( isset( $number[$i] ) )
        	$password .= $number[$i];
		else
        	$password .= $chain[mt_rand( 0, strlen( $chain )-1 )];
	}

    return $password;
}

/**
 * @return string
 * @param string $link
 * @param int $page
 * @param int $pages
 * @param int $number
 * @desc Generiert eine Seitennavigation aus den Argumenten.
*/
function make_page_navigation( $link, $page, $pages, $number )
{
    global $Smarty;

    $_pn = array();

    $_pn['page'] = $page;
    $_pn['pages'] = $pages;
    $_pn['link'] = $link;

   	$_pn['first_page_link'] = ( ( $page - $number ) > 1 );
    $_pn['back_link'] = ( $page > 1 );

    $count = ( ( $page + $number >= $pages ) ? ( $pages ) : ( $page + $number ) );
    $_pl = array();

    for( $i = $page - $number; $i <= $count; $i++ )
    {
    	if( $i < 1 )
        	$i = 1;

       	$_pl[] = $i;
	}

    $_pn['pl'] = $_pl;

    $_pn['forward_link'] = ( $page < $pages );
    $_pn['last_page_link'] = ( $page + $number < $pages );

    $Smarty->assign( '_pn', $_pn );
    $page_nav = $Smarty->fetch( 'page_navigation.tpl' );

    return $page_nav;
}

/**
 * @return void
 * @param int $userid
 * @desc Setzt den wBB Benutzer auf die Standardrechte zurück.
*/
function resetWBBAccount( $userid )
{
    global $settings, $MySQL, $n;
    
    $wbb_db = $settings['wbb_db'];
    
    $MySQL->query( "DELETE FROM ".$wbb_db.".bb".$n."_access WHERE userid = ".$userid );
    
    include_once( '../wbb2/acp/lib/functions_me.php' );
    change_groupcomb( $userid, array() );
}

// wbb 2.1 functions
function makeimgtag($path,$alt="",$usehtmlconverter=1) {
	if($alt!="" && $usehtmlconverter==1) $alt=htmlconverter($alt);

	$path = replaceImagefolder($path);

	return "<img src=\"$path\" border=\"0\" alt=\"".$alt."\" title=\"".$alt."\" />";
}

function wbb_trim($text) {
	if($text!="") {
		$text=str_replace(chr(160), " ", $text); // remove alt + 0160
		$text=str_replace(chr(173), " ", $text); // remove alt + 0173
		$text=str_replace("\0", " ", $text); // remove whitespace
		$text=trim($text);
	}

	return $text;
}

function amount_str_replace($needle, $str, $haystack, $amount) {
	$start = strpos($haystack, $needle);
	if($start===false) return $haystack;

	$end = $start + strlen($needle);
	$new_haystack = substr($haystack, 0, $start).$str.substr($haystack, $end);

	if($amount>1) amount_str_replace($needle, $str, $new_haystack, --$amount);
	else return $new_haystack;
}

function replaceImagefolder($text) {
	if($text!="" && strstr($text, "{imagefolder}")) {
	global $style;

	$text = str_replace("{imagefolder}", "/wbb2/images", $text);
	}

	return $text;
}

function get_chargump_url($charid, $accountid) {
	return 'images/chargumps/'.md5('hihihi'.$charid.$accountid).'.jpg';
}

?>