<?php
/**
 * Helper class for more site specific functions.
 *
 * @author Daan Janssens, mentored by Matthew Lagoe
 */
class Helpers {

    /**
     * workhorse of the website, it loads the template and shows it or returns th html.
     * it uses smarty to load the $template, but before displaying the template it will pass the $vars to smarty. Also based on your language settings a matching
     * array of words & sentences for that page will be loaded. In case the $returnHTML parameter is set to true, it will return the html instead of displaying the template.
     *
     * @param  $template the name of the template(page) that we want to load.
     * @param  $vars an array of variables that should be loaded by smarty before displaying or returning the html.
     * @param  $returnHTML (default=false) if set to true, the html that should have been displayed, will be returned.
     * @return in case $returnHTML=true, it returns the html of the template being loaded.
     */
    public static function loadTemplate( $template, $vars = array (), $returnHTML = false )
     {
     //error_log(print_r($_GET,true));
     //error_log(print_r($_POST,true));
        global $AMS_LIB;
         global $SITEBASE;
         global $AMS_TRANS;
         global $INGAME_LAYOUT;
         global $AMS_CACHEDIR;
        global $AMS_PLUGINS;

         // define('SMARTY_SPL_AUTOLOAD',1);
        require_once $AMS_LIB . '/smarty/libs/Smarty.class.php';
         spl_autoload_register( '__autoload' );

         $smarty = new Smarty;
         $smarty -> setCompileDir( $SITEBASE . '/templates_c/' );
         $smarty -> setCacheDir( $AMS_CACHEDIR );
         $smarty -> setConfigDir( $SITEBASE . '/configs/' );
         // turn smarty debugging on/off
        $smarty -> debugging = false;
         // caching must be disabled for multi-language support
        $smarty -> caching = false;
         $smarty -> cache_lifetime = 300;

		$smarty->addPluginsDir($AMS_PLUGINS);

		if (function_exists('apc_cache_info')) {
			// production
			//$smarty->caching = true;
			//$smarty->setCachingType("apc"); 
			//$smarty->compile_check = false;
		}

         // needed by smarty.
        helpers :: create_folders ();
         global $FORCE_INGAME;

         // if ingame, then use the ingame templates
        if ( helpers :: check_if_game_client() or $FORCE_INGAME ) {
            $smarty -> template_dir = $AMS_LIB . '/ingame_templates/';
             $smarty -> setConfigDir( $AMS_LIB . '/configs' );
             $variables = parse_ini_file( $AMS_LIB . '/configs/ingame_layout.ini', true );
             foreach ( $variables[$INGAME_LAYOUT] as $key => $value ) {
                $smarty -> assign( $key, $value );
                 }
            } else {
            $smarty -> template_dir = $SITEBASE . '/templates/';
             $smarty -> setConfigDir( $SITEBASE . '/configs' );
             }

        foreach ( $vars as $key => $value ) {
            $smarty -> assign( $key, $value );
             }

        // load page specific variables that are language dependent
        $variables = Helpers :: handle_language();
         if ( $template != 'layout_plugin' )
         {
            foreach ( $variables[$template] as $key => $value ) {
                $smarty -> assign( $key, $value );
                 }
            }
        // load ams content variables that are language dependent
        foreach ( $variables['ams_content'] as $key => $value ) {
            $smarty -> assign( $key, $value );
             }

		 //load ams content variables that are language dependent
		 foreach ( $variables['ams_content'] as $key => $value){
			 $smarty -> assign( $key, $value);
			 }
             
        $id = session_id();    
        $smarty -> assign( "sessionid", $id );
        
        $dbl = new DBLayer("lib");
        $statement = $dbl->executeWithoutParams("SELECT * FROM settings");
        $rows = $statement->fetchAll();
            
        foreach ($rows as &$value) {
            $smarty -> assign( $value['Setting'], $value['Value'] );
        }

        // smarty inheritance for loading the matching wrapper layout (with the matching menu bar)
        if ( isset( $vars['permission'] ) && $vars['permission'] == 3 ) {
            $inherited = "extends:layout_admin.tpl|";
             } else if ( isset( $vars['permission'] ) && $vars['permission'] == 2 ) {
            $inherited = "extends:layout_mod.tpl|";
             } else if ( isset( $vars['permission'] ) && $vars['permission'] == 1 ) {
            $inherited = "extends:layout_user.tpl|";
             } else {
            $inherited = "";
             }

        // if $returnHTML is set to true, return the html by fetching the template else display the template.
        if ( $returnHTML == true ) {
            return $smarty -> fetch( $inherited . $template . '.tpl' );
             } else {
            $smarty -> display( $inherited . $template . '.tpl' );
             }
        }


    /**
     * creates the folders that are needed for smarty.
     *
     * @todo for the drupal module it might be possible that drupal_mkdir needs to be used instead of mkdir, also this should be in the install.php instead.
     */
    static public function create_folders() {
        global $AMS_LIB;
         global $SITEBASE;
         $arr = array( $AMS_LIB . '/ingame_templates/',
             $AMS_LIB . '/configs',
             // $AMS_LIB . '/cache',
            $SITEBASE . '/cache/',
             $SITEBASE . '/templates/',
             $SITEBASE . '/templates_c/',
             $SITEBASE . '/configs'
             );
         foreach ( $arr as &$value ) {

            if ( !file_exists( $value ) ) {
                print( $value );
                 mkdir( $value );
                 }
            }

        }


    /**
     * check if the http request is sent ingame or not.
     *
     * @return returns true in case it's sent ingame, else false is returned.
     */
    static public function check_if_game_client()
     {
        // if HTTP_USER_AGENT is not set then its ryzom core
        global $FORCE_INGAME;
         if ( ( isset( $_SERVER['HTTP_USER_AGENT'] ) && ( strpos( $_SERVER['HTTP_USER_AGENT'], "Ryzom" ) === 0 ) ) || $FORCE_INGAME || ! isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
            return true;
             } else {
            return false;
             }
        }


    /**
     * Handles the language specific aspect.
     * The language can be changed by setting the $_GET['Language'] & $_GET['setLang'] together. This will also change the language entry of the user in the db.
     * Cookies are also being used in case the user isn't logged in.
     *
     * @return returns the parsed content of the language .ini file related to the users language setting.
     */
    static public function handle_language() {
        global $DEFAULT_LANGUAGE;
         global $AMS_TRANS;

         // if user wants to change the language
        if ( isset( $_GET['Language'] ) && isset( $_GET['setLang'] ) ) {
            // The ingame client sometimes sends full words, derive those!
            switch ( $_GET['Language'] ) {

            case "English":
                 $lang = "en";
                 break;

             case "French":
                 $lang = "fr";
                 break;

             default:
                 $lang = $_GET['Language'];
                 }
            // if the file exists en the setLang = true
            if ( file_exists( $AMS_TRANS . '/' . $lang . '.ini' ) && $_GET['setLang'] == "true" ) {
            // set a cookie & session var and incase logged in write it to the db!
            setcookie( 'Language', $lang , time() + 60 * 60 * 24 * 30 );
             $_SESSION['Language'] = $lang;
             if ( WebUsers :: isLoggedIn() ) {
            WebUsers :: setLanguage( $_SESSION['id'], $lang );
             }
        } else {
        $_SESSION['Language'] = $DEFAULT_LANGUAGE;
         }
    } else {
    // if the session var is not set yet
    if ( !isset( $_SESSION['Language'] ) ) {
        // check if a cookie already exists for it
        if ( isset( $_COOKIE['Language'] ) ) {
            $_SESSION['Language'] = $_COOKIE['Language'];
             // else use the default language
        } else {
            $_SESSION['Language'] = $DEFAULT_LANGUAGE;
             }
        }
    }

if ( $_SESSION['Language'] == "" ) {
    $_SESSION['Language'] = $DEFAULT_LANGUAGE;
     }
return parse_ini_file( $AMS_TRANS . '/' . $_SESSION['Language'] . '.ini', true );

 }


	/**
	 * Time output function for handling the time display.
	 *
	 * @return returns the time in the format specified in the $TIME_FORMAT global variable.
	 */
	static public function outputTime($time, $str = 1) {
		global $TIME_FORMAT;
		if ($str) {
			return date($TIME_FORMAT, strtotime($time));
		} else {
			return date($TIME_FORMAT, $time);
		}
	}

	/**
	 * Auto login function for ingame use.
	 * This function will allow users who access the website ingame, to log in without entering the username and password. It uses the COOKIE entry in the open_ring db.
	 * it checks if the cookie sent by the http request matches the one in the db. This cookie in the db is changed everytime the user relogs.
	 *
	 * @return returns "FALSE" if the cookies didn't match, else it returns an array with the user's id and name.
	 */
	static public function check_login_ingame() {
		return NULL;

		// FIXME
		/*
		if ( helpers :: check_if_game_client () or $forcelibrender = false ) {
			$dbr = new DBLayer( "ring" );
			 if ( isset( $_GET['UserId'] ) && isset( $_COOKIE['ryzomId'] ) ) {
				$id = $_GET['UserId'];

				 $statement = $dbr -> select( "ring_users", array( 'id' => $id, 'cookie' => $_COOKIE['ryzomId'] ), "user_id=:id AND cookie =:cookie" );

				 // $statement = $dbr->execute("SELECT * FROM ring_users WHERE user_id=:id AND cookie =:cookie", array('id' => $id, 'cookie' => $_COOKIE['ryzomId']));

				if ( $statement -> rowCount() ) {
					$entry = $statement -> fetch();
					 // print_r($entry);
					return array( 'id' => $entry['user_id'], 'name' => $entry['user_name'] );
					 } else {
					return "FALSE";
					 }
				} else {
				return "FALSE";
				 }
			} else {
			return "FALSE";
			 }
		}
		*/
	}

}