<?php
   /**************************************************************************\
   * eGroupWare API - Wrapper for the savant2 template engine                 *
   * Written by Pim Snel <pim@lingewoud.nl>                                   *
   *                                                                          *
   * Wrapper for the savant2 template engine www.phpsavant.com                *
   * Copyright (C) 2005 Lingewoud BV and Pim Snel                             *
   * -------------------------------------------------------------------------*
   * This library is part of the eGroupWare API                               *
   * http://www.egroupware.org                                                * 
   * ------------------------------------------------------------------------ *
   * This library is free software; you can redistribute it and/or modify it  *
   * under the terms of the GNU Lesser General Public License as published by *
   * the Free Software Foundation; either version 2.1 of the License,         *
   * or any later version.                                                    *
   * This library is distributed in the hope that it will be useful, but      *
   * WITHOUT ANY WARRANTY; without even the implied warranty of               *
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
   * See the GNU Lesser General Public License for more details.              *
   * You should have received a copy of the GNU Lesser General Public License *
   * along with this library; if not, write to the Free Software Foundation,  *
   * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA            *
   \**************************************************************************/

   /* $Id$ */

   if(is_file(EGW_INCLUDE_ROOT.'/phpgwapi/inc/savant2/Savant2.php'))
   {
	  include_once(EGW_INCLUDE_ROOT.'/phpgwapi/inc/savant2/Savant2.php');
   }

   /*!
   @class tplsavant2
   @abstract wrapper class for the Savant2 template engine
   */
   class tplsavant2 extends Savant2
   {
	  /*!
	  @var $version
	  @abstract the version this wrapper is testet against
	  */
	  var $version = '2.3.3';

	  /*!
	  @var $do_version_check
	  @abstract set this to true to halt when versions of this wrapper and savant2 itself differ
	  */
	  var $do_version_check = false;

	  /*!
	  @function tplsavant2
	  @abstract constructor function which calls the constructor of Savant2 and sets necesary things for eGroupware
	  */
	  function tplsavant2()
	  {
		 // run constructor of the Savant2 class
		 $this->Savant2();

		 if($this->do_version_check)
		 {
			$this->version_check();
		 }

		 $this->set_tpl_path();
	  }

	  /**
	  @function version_check
	  @abstract check version of this wrapper with installed savant2 version and halts when version differs
	  @return void
	  */
	  function version_check()
	  {
		 $Sav2Version = @file_get_contents(EGW_INCLUDE_ROOT.'/phpgwapi/inc/savant2/VERSION',"rb");

		 if(trim($Sav2Version) != trim($this->version))
		 { 
			$this->halt(lang('Savant2 version differs from Savant2 wrapper. <br/>This version: %1 <br/>Savants version: %2',$this->version, $Sav2Version));					
		 }
	  }

	  /**
	   * set_tpl_path sets the preferred and fallback template search paths  
	   * 
	   * @param string $man_dir custom manual given template path in filesystem
	   * @access public
	   * @return void
	   */
	  function set_tpl_path($man_dir=null)
	  {
		 $preferred_dir=$this->get_tpl_dir(); 
		 $fallback_dir=$this->get_tpl_dir(true); 

		 if(!$preferred_dir && $man_dir && $fallback_dir)
		 {
			$this->halt(lang('No Savant2 template directories were found in:'.EGW_APP_ROOT)); 
		 }
		 else
		 {
			if($fallback_dir)
			{
			   $this->addPath('template',$fallback_dir);
			}
			// add preferred tpl dir last because savant set the last added first in the search array  
			if($preferred_dir)
			{
			   $this->addPath('template',$preferred_dir);
			}

			if($man_dir)
			{
			   $this->addPath('template',$man_dir);
			}
		 }
	  }

	  /**
	   * get_tpl_dir get template dir of an application
	   * 
	   * @param bool $fallback if true the default fallback template dir is returned
	   * @param string $appname appication name optional can be derived from $GLOBALS['egw_info']['flags']['currentapp'];
	   * @access public
	   * @return void
	   */
	  function get_tpl_dir($fallback=false,$appname = '')
	  {
		 if (! $appname)
		 {
			$appname = $GLOBALS['egw_info']['flags']['currentapp'];
		 }
		 if ($appname == 'home' || $appname == 'logout' || $appname == 'login')
		 {
			$appname = 'phpgwapi';
		 }

		 if (!isset($GLOBALS['egw_info']['server']['template_set']) && isset($GLOBALS['egw_info']['user']['preferences']['common']['template_set']))
		 {
			$GLOBALS['egw_info']['server']['template_set'] = $GLOBALS['egw_info']['user']['preferences']['common']['template_set'];
		 }

		 // Setting this for display of template choices in user preferences
		 if ($GLOBALS['egw_info']['server']['template_set'] == 'user_choice')
		 {
			$GLOBALS['egw_info']['server']['usrtplchoice'] = 'user_choice';
		 }

		 if (($GLOBALS['egw_info']['server']['template_set'] == 'user_choice' ||
		 !isset($GLOBALS['egw_info']['server']['template_set'])) &&
		 isset($GLOBALS['egw_info']['user']['preferences']['common']['template_set']))
		 {
			$GLOBALS['egw_info']['server']['template_set'] = $GLOBALS['egw_info']['user']['preferences']['common']['template_set'];
		 }
		 elseif ($GLOBALS['egw_info']['server']['template_set'] == 'user_choice' ||
		 !isset($GLOBALS['egw_info']['server']['template_set']))
		 {
			$GLOBALS['egw_info']['server']['template_set'] = 'default';
		 }

		 $tpldir         = EGW_SERVER_ROOT . '/' . $appname . '/templatesSavant2/' . $GLOBALS['egw_info']['server']['template_set'];
		 $tpldir_default = EGW_SERVER_ROOT . '/' . $appname . '/templatesSavant2/default';

		 if (!$fallback && @is_dir($tpldir))
		 {
			return $tpldir;
		 }
		 elseif (@is_dir($tpldir_default))
		 {
			return $tpldir_default;
		 }
		 else
		 {
			return False;
		 }
	  }

	  /***************************************************************************/
	  /* public: halt(string $msg)
	  * msg:    error message to show.
	  */
	  function halt($msg)
	  {
		 $this->last_error = $msg;

		 if ($this->halt_on_error != 'no')
		 {
			$this->haltmsg($msg);
		 }

		 if ($this->halt_on_error == 'yes')
		 {
			echo('<strong>Halted.</strong>');
		 }

		 $GLOBALS['phpgw']->common->phpgw_exit(True);
	  }

	  /* public, override: haltmsg($msg)
	  * msg: error message to show.
	  */
	  function haltmsg($msg)
	  {
		 printf("<strong>Savant Template Error:</strong> %s<br/>\n", $msg);
		 echo "<strong>Backtrace</strong>: ".function_backtrace(2)."<br/>\n";
	  }

	  function fetch_string($string)
	  {
		 $tmpfname = tempnam ("/tmp", "sav");
		 $fp = fopen($tmpfname, "w");
		 fwrite($fp, $string);
		 fclose($fp);
		 $this->addPath('template','/tmp');
		 $file_arr= explode('/',$tmpfname);
		 return $this->fetch($file_arr[2]);
		 unlink($tmpfname);
	  }

	  /**
	   * set_var the same as assign()
	   * 
	   * @param mixed $tplvar 
	   * @param string $val 
	   * @access public
	   * @return void
	   */
	  function set_var($tplvar,$val='')
	  {
		 $this->assign($tplvar,$val);
	  }

   }