Index: trunk/core/kernel/application.php
===================================================================
--- trunk/core/kernel/application.php	(revision 2350)
+++ trunk/core/kernel/application.php	(revision 2351)
@@ -1,1340 +1,1344 @@
 <?php
 
 /**
 * Basic class for Kernel3-based Application
 *
 * This class is a Facade for any other class which needs to deal with Kernel3 framework.<br>
 * The class incapsulates the main run-cycle of the script, provide access to all other objects in the framework.<br>
 * <br>
 * The class is a singleton, which means that there could be only one instance of KernelApplication in the script.<br>
 * This could be guranteed by NOT calling the class constuctor directly, but rather calling KernelApplication::Instance() method, 
 * which returns an instance of the application. The method gurantees that it will return exactly the same instance for any call.<br>
 * See singleton pattern by GOF.
 * @package kernel4
 */
 
 class kApplication {
 	
 	/**
 	 * Is true, when Init method was called already, prevents double initialization
 	 *
 	 * @var bool
 	 */
 	var $InitDone = false;
 	
 	/**
 	* Holds internal TemplateParser object
 	* @access private
 	* @var TemplateParser
 	*/
 	var $Parser;
 	
 	/**
 	* Holds parser output buffer
 	* @access private
 	* @var string
 	*/
 	var $HTML;
 	
 	/**
 	 * Prevents request from beeing proceeded twice in case if application init is called mere then one time
 	 *
 	 * @var bool
 	 * @todo This is not good anyway (by Alex)
 	 */
 	var $RequestProcessed = false;
 	
 	/**
 	* The main Factory used to create
 	* almost any class of kernel and
 	* modules
 	*
 	* @access private
 	* @var kFactory
 	*/
 	var $Factory;
 	
 	/**
 	 * Holds all phrases used
 	 * in code and template
 	 *
 	 * @var PhrasesCache
 	 */
 	var $Phrases;
 	
 	/**
 	 * Holds DBConnection
 	 *
 	 * @var kDBConnection
 	 */
 	var $DB;
 	
 	/**
 	* Returns kApplication instance anywhere in the script.
  	*
  	* This method should be used to get single kApplication object instance anywhere in the 
  	* Kernel-based application. The method is guranteed to return the SAME instance of kApplication.
  	* Anywhere in the script you could write: 
  	* <code>
  	*		$application =& kApplication::Instance();
  	* </code>
  	* or in an object:
  	* <code>
  	*		$this->Application =& kApplication::Instance();
  	* </code>
  	* to get the instance of kApplication. Note that we call the Instance method as STATIC - directly from the class.
  	* To use descendand of standard kApplication class in your project you would need to define APPLICATION_CLASS constant 
  	* BEFORE calling kApplication::Instance() for the first time. If APPLICATION_CLASS is not defined the method would 
  	* create and return default KernelApplication instance.
  	* @static
  	* @access public
 	* @return kApplication
 	*/
 	function &Instance()
 	{
 		static $instance = false;
 		
 		if(!$instance)
 		{
 			if (!defined('APPLICATION_CLASS')) define('APPLICATION_CLASS', 'kApplication');
 			$class = APPLICATION_CLASS;
 			$instance = new $class();
 		}
 		return $instance;
 	}
 	
 	/**
 	* Initializes the Application
  	*
  	* @access public
 	* @see HTTPQuery
 	* @see Session
 	* @see TemplatesCache
 	* @return bool Was Init actually made now or before
 	*/
 	function Init()
 	{
 		if($this->InitDone) return false;
 		
 		if (defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) {
 			global $debugger;
 			$debugger->appendMemoryUsage('Application before Init:');
 		}
 		
 		if( !$this->isDebugMode() ) set_error_handler( Array(&$this,'handleError') );
 		
 		$this->DB = new kDBConnection(SQL_TYPE, Array(&$this,'handleSQLError') );
 		$this->DB->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB);
 		$this->DB->debugMode = $this->isDebugMode();
 			
 		$this->SetDefaultConstants();
 				
 		$this->Factory = new kFactory();
 			
 		$this->registerDefaultClasses();
 		
 		// 1. to read configs before doing any recallObject
 		$config_reader =& $this->recallObject('kUnitConfigReader');
 		
 		if( !$this->GetVar('m_lang') ) $this->SetVar('m_lang', $this->GetDefaultLanguageId() );
 		if( !$this->GetVar('m_theme') ) $this->SetVar('m_theme', $this->GetDefaultThemeId() );
 		if( $this->GetVar('m_cat_id') === false ) $this->SetVar('m_cat_id', 0);
 		
 		$this->Phrases = new PhrasesCache( $this->GetVar('m_lang') );
 		
 		$this->SetVar('lang.current_id', $this->GetVar('m_lang') );
 		$language =& $this->recallObject('lang.current', null, Array('live_table'=>true) );
 		
 		if( !$this->GetVar('m_theme') ) $this->SetVar('m_theme', $this->GetDefaultThemeId() );
 		$this->SetVar('theme.current_id', $this->GetVar('m_theme') );
 		
 		if( !$this->RecallVar('UserGroups') )
 		{
 			$ses =& $this->recallObject('Session');
 			$user_groups = trim($ses->GetField('GroupList'), ',');
 			if (!$user_groups) $user_groups = $this->ConfigValue('User_GuestGroup');
 			$this->StoreVar('UserGroups', $user_groups);
 		}
 				
 		if( !$this->RecallVar('curr_iso') ) $this->StoreVar('curr_iso', $this->GetPrimaryCurrency() );
 		
 		$this->ValidateLogin(); // TODO: write that method
 		
 		if( $this->isDebugMode() )
 		{
 			global $debugger;
 			$debugger->profileFinish('kernel4_startup');
 		}
 		
+		if(defined('CMS') && CMS==1 && !$this->GetVar('admin') && !$this->IsAdmin() ){
+			define('MOD_REWRITE', 1);
+		}
+		
 		$this->InitDone = true;
 		return true;
 	}
 	
 	function GetDefaultLanguageId()
 	{
 		$table = $this->getUnitOption('lang','TableName');
 		$id_field = $this->getUnitOption('lang','IDField');
 		return $this->DB->GetOne('SELECT '.$id_field.' FROM '.$table.' WHERE PrimaryLang = 1');
 	}
 	
 	function GetDefaultThemeId()
 	{
 		if (defined('DBG_FORCE_THEME') && DBG_FORCE_THEME){
 			return DBG_FORCE_THEME;
 		}
 		$table = $this->getUnitOption('theme','TableName');
 		$id_field = $this->getUnitOption('theme','IDField');
 		return $this->DB->GetOne('SELECT '.$id_field.' FROM '.$table.' WHERE PrimaryTheme = 1');
 	}
 	
 	function GetPrimaryCurrency()
 	{
 		$this->setUnitOption('mod','AutoLoad',false);
 		$module =& $this->recallObject('mod');
 		$this->setUnitOption('mod','AutoLoad',true);
 		
 		if( $module->Load('In-Commerce') )
 		{
 			$table = $this->getUnitOption('curr','TableName');
 			return $this->DB->GetOne('SELECT ISO FROM '.$table.' WHERE IsPrimary = 1');
 		}
 		else
 		{
 			return 'USD';
 		}
 	}
 	
 	/**
 	* Registers default classes such as ItemController, GridController and LoginController
 	*
 	* Called automatically while initializing Application
 	* @access private
 	* @return void
 	*/
 	function RegisterDefaultClasses()
 	{
 		//$this->registerClass('Utilites',KERNEL_PATH.'/utility/utilities.php');
 		$this->registerClass('HTTPQuery',KERNEL_PATH.'/utility/http_query.php');
 		$this->registerClass('Session',KERNEL_PATH.'/session/session.php');
 		$this->registerClass('SessionStorage',KERNEL_PATH.'/session/session.php');
 		$this->registerClass('LoginEventHandler',KERNEL_PATH.'/session/login_event_handler.php','login_EventHandler');
 		$this->registerClass('kEventManager',KERNEL_PATH.'/event_manager.php','EventManager');
 		
 		$this->registerClass('kUnitConfigReader',KERNEL_PATH.'/utility/unit_config_reader.php');
 		
 		
 		$this->registerClass('Params',KERNEL_PATH.'/utility/params.php','kActions');
 		$this->registerClass('kArray',KERNEL_PATH.'/utility/params.php','kArray');
 		$this->registerClass('kFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kOptionsFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kUploadFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kPictureFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kDateFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kLEFTFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kMultiLanguage', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kPasswordFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kCCDateFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kUnitFormatter', KERNEL_PATH.'/utility/formatters.php');
 		$this->registerClass('kFilesizeFormatter', KERNEL_PATH.'/utility/formatters.php');
 		
 		$this->registerClass('kTempTablesHandler', KERNEL_PATH.'/utility/temp_handler.php');
 		
 		$event_manager =& $this->recallObject('EventManager');
 		$event_manager->registerBuildEvent('kTempTablesHandler','OnTempHandlerBuild');
 		//$this->registerClass('Configuration',KERNEL_PATH.'/utility/configuration.php');
 		
 		$this->registerClass('TemplatesCache',KERNEL_PATH.'/parser/template.php');
 		$this->registerClass('Template',KERNEL_PATH.'/parser/template.php');
 		$this->registerClass('TemplateParser',KERNEL_PATH.'/parser/template_parser.php');
 		
 		$this->registerClass('MainProcessor', KERNEL_PATH.'/processors/main_processor.php','m_TagProcessor');
 		
 		$this->registerClass('kMultipleFilter', KERNEL_PATH.'/utility/filters.php');
 		$this->registerClass('kDBList', KERNEL_PATH.'/db/dblist.php');
 		$this->registerClass('kDBItem', KERNEL_PATH.'/db/dbitem.php');
 		$this->registerClass('kDBEventHandler', KERNEL_PATH.'/db/db_event_handler.php');
 		$this->registerClass('kDBTagProcessor', KERNEL_PATH.'/db/db_tag_processor.php');
 		
 		$this->registerClass('kTagProcessor', KERNEL_PATH.'/processors/tag_processor.php');
 		$this->registerClass('kEmailMessage',KERNEL_PATH.'/utility/email.php');
 		$this->registerClass('kSmtpClient',KERNEL_PATH.'/utility/smtp_client.php');
 		
 		if (file_exists(MODULES_PATH.'/in-commerce/units/currencies/currency_rates.php')) {
 			$this->registerClass('kCurrencyRates',MODULES_PATH.'/in-commerce/units/currencies/currency_rates.php');
 		}
 		
 		$this->registerClass('FCKeditor', DOC_ROOT.BASE_PATH.'/'.ADMIN_DIR.'/editor/cmseditor/fckeditor.php');
 		/*$this->RegisterClass('LoginController', KERNEL_PATH.'/users/login_controller.php');*/
 	}
 	
 	/**
 	* Defines default constants if it's not defined before - in config.php
 	*
 	* Called automatically while initializing Application and defines:
 	* LOGIN_CONTROLLER, XML_FACTORY etc.
 	* @access private
 	* @return void
 	*/
 	function SetDefaultConstants()
 	{
 		if (!defined('SERVER_NAME')) define('SERVER_NAME', $_SERVER['HTTP_HOST']);
 		
 		$admin_dir = $this->ConfigValue('AdminDirectory');
 		if(!$admin_dir) $admin_dir = 'admin';
 		safeDefine('ADMIN_DIR', $admin_dir);
 	}
 	
 	function ProcessRequest()
 	{
 		$event_manager =& $this->recallObject('EventManager');
 		
 		if( $this->isDebugMode() && dbg_ConstOn('DBG_SHOW_HTTPQUERY') )
 		{
 			global $debugger;
 			$http_query =& $this->recallObject('HTTPQuery');
 			$debugger->appendHTML('HTTPQuery:');
 			$debugger->dumpVars($http_query->_Params);
 		}
 		
 		$event_manager->ProcessRequest();
 		$this->RequestProcessed =  true;
 	}
 	
 	/**
 	* Actually runs the parser against current template and stores parsing result
 	*
 	* This method gets t variable passed to the script, loads the template given in t variable and
 	* parses it. The result is store in {@link $this->HTML} property.
 	* @access public
 	* @return void
 	*/
 	function Run()
 	{
 		if (defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) {
 			global $debugger;
 			$debugger->appendMemoryUsage('Application before Run:');
 		}
 		
 		if (!$this->RequestProcessed) $this->ProcessRequest();
 		
 		$this->InitParser();
 		$template_cache =& $this->recallObject('TemplatesCache');
 		$t = $this->GetVar('t');
 		
 		if(defined('CMS') && CMS)
 		{
 			$cms_handler =& $this->recallObject('cms_EventHandler');
 			if( !$template_cache->TemplateExists($t) )
 			{
 				$t = $cms_handler->GetDesignTemplate();			
 			}
 			else
 			{
 				$cms_handler->SetCatByTemplate();
 			}
 		}
 		
 		if (defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) {
 			global $debugger;
 			$debugger->appendMemoryUsage('Application before Parsing:');
 		}
 		
 		$this->HTML = $this->Parser->Parse( $template_cache->GetTemplateBody($t), $t );
 		
 		if (defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) {
 			global $debugger;
 			$debugger->appendMemoryUsage('Application after Parsing:');
 		}
 	}
 	
 	function InitParser()
 	{
 		if( !is_object($this->Parser) ) $this->Parser =& $this->recallObject('TemplateParser');
 	}
 	
 	/**
 	* Send the parser results to browser
 	*
 	* Actually send everything stored in {@link $this->HTML}, to the browser by echoing it.
 	* @access public
 	* @return void
 	*/
 	function Done()
 	{
 		if (defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) {
 			global $debugger;
 			$debugger->appendMemoryUsage('Application before Done:');
 		}
 		
 		if ($this->GetVar('admin')) {
 			$reg = '/('.preg_quote(BASE_PATH, '/').'.*\.html)(#.*){0,1}(")/sU';
 			$this->HTML = preg_replace($reg, "$1?admin=1$2$3", $this->HTML);
 		}
 		
 		//eval("?".">".$this->HTML);
 		
 		echo $this->HTML;
 		$this->Phrases->UpdateCache();
 		
 		flush();
 		$this->RunScheduledEvents();
 		
 		$session =& $this->recallObject('Session');
 		$session->SaveData();
 		//$this->SaveBlocksCache();
 	}
 	
 	function SaveBlocksCache()
 	{
 		/*if (defined('EXPERIMENTAL_PRE_PARSE')) {
 			$data = serialize($this->PreParsedCache);
 		
 			$this->DB->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("blocks_cache", '.$this->DB->qstr($data).', '.time().')');		
 		}*/
 	}
 	
 	//	Facade
 	
 	/**
 	* Returns current session id (SID)
 	* @access public
 	* @return longint
 	*/
 	function GetSID()
 	{
 		$session =& $this->recallObject('Session');
 		return $session->GetID();
 	}
 	
 	function DestroySession()
 	{
 		$session =& $this->recallObject('Session');
 		$session->Destroy();
 	}
 	
 	/**
 	* Returns variable passed to the script as GET/POST/COOKIE
 	*
 	* @access public
 	* @param string $var Variable name
 	* @return mixed
 	*/
 	function GetVar($var,$mode=FALSE_ON_NULL)
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		return $http_query->Get($var,$mode);
 	}
 	
 	/**
 	* Returns ALL variables passed to the script as GET/POST/COOKIE
 	*
 	* @access public
 	* @return array
 	*/
 	function GetVars()
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		return $http_query->GetParams();
 	}
 	
 	/**
 	* Set the variable 'as it was passed to the script through GET/POST/COOKIE'
 	*
 	* This could be useful to set the variable when you know that 
 	* other objects would relay on variable passed from GET/POST/COOKIE
 	* or you could use SetVar() / GetVar() pairs to pass the values between different objects.<br>
 	*
 	* This method is formerly known as $this->Session->SetProperty.
 	* @param string $var Variable name to set
 	* @param mixed $val Variable value
 	* @access public
 	* @return void
 	*/
 	function SetVar($var,$val)
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		$http_query->Set($var,$val);
 	}
 
 	/**
 	 * Deletes Session variable
 	 *
 	 * @param string $var
 	 */
 	function RemoveVar($var)
 	{
 		$session =& $this->recallObject('Session');
 		return $session->RemoveVar($var);
 	}
 
 	/**
 	 * Deletes HTTPQuery variable
 	 *
 	 * @param string $var
 	 * @todo think about method name
 	 */
 	function DeleteVar($var)
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		return $http_query->Remove($var);
 	}
 	
 	/**
 	* Returns session variable value
 	*
 	* Return value of $var variable stored in Session. An optional default value could be passed as second parameter.
 	*
 	* @see SimpleSession
 	* @access public
 	* @param string $var Variable name
 	* @param mixed $default Default value to return if no $var variable found in session
 	* @return mixed
 	*/
 	function RecallVar($var,$default=false)
 	{
 		$session =& $this->recallObject('Session');
 		return $session->RecallVar($var,$default);
 	}
 	
 	/**
 	* Stores variable $val in session under name $var
 	*
 	* Use this method to store variable in session. Later this variable could be recalled.
 	* @see RecallVar
 	* @access public
 	* @param string $var Variable name
 	* @param mixed $val Variable value
 	*/
 	function StoreVar($var, $val)
 	{
 		$session =& $this->recallObject('Session');
 		$session->StoreVar($var, $val);
 	}
 
 	function StoreVarDefault($var, $val)
 	{
 		$session =& $this->recallObject('Session');
 		$session->StoreVarDefault($var, $val);
 	}	
 	
 	/**
 	* Links HTTP Query variable with session variable 
 	*
 	* If variable $var is passed in HTTP Query it is stored in session for later use. If it's not passed it's recalled from session.
 	* This method could be used for making sure that GetVar will return query or session value for given
 	* variable, when query variable should overwrite session (and be stored there for later use).<br>
 	* This could be used for passing item's ID into popup with multiple tab - 
 	* in popup script you just need to call LinkVar('id', 'current_id') before first use of GetVar('id').
 	* After that you can be sure that GetVar('id') will return passed id or id passed earlier and stored in session
 	* @access public
 	* @param string $var HTTP Query (GPC) variable name
 	* @param mixed $ses_var Session variable name
 	* @param mixed $default Default variable value
 	*/
 	function LinkVar($var, $ses_var=null, $default='')
 	{
 		if (!isset($ses_var)) $ses_var = $var;
 		if ($this->GetVar($var) !== false)
 		{
 			$this->StoreVar($ses_var, $this->GetVar($var));
 		}
 		else
 		{
 			$this->SetVar($var, $this->RecallVar($ses_var, $default));
 		}
 	}
 	
 	/**
 	* Returns variable from HTTP Query, or from session if not passed in HTTP Query
 	*	
 	* The same as LinkVar, but also returns the variable value taken from HTTP Query if passed, or from session if not passed.
 	* Returns the default value if variable does not exist in session and was not passed in HTTP Query
 	*
 	* @see LinkVar
 	* @access public
 	* @param string $var HTTP Query (GPC) variable name
 	* @param mixed $ses_var Session variable name
 	* @param mixed $default Default variable value
 	* @return mixed
 	*/
 	function GetLinkedVar($var, $ses_var=null, $default='')
 	{
 		if (!isset($ses_var)) $ses_var = $var;
 		$this->LinkVar($var, $ses_var, $default);
 		return $this->GetVar($var);
 	}
 	
 	/*function ExtractByMask($array, $mask, $key_id=1, $ret_mode=1)
 	{
 		$utils =& $this->recallObject('Utilities');
 		return $utils->ExtractByMask($array, $mask, $key_id, $ret_mode);
 	}
 	
 	function GetSelectedIDs($mask, $format) 
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		return $http_query->GetSelectedIDs($mask, $format);
 	}
 	
 	function GetSelectedIDsArray($mask, $value_mask="%s,")
 	{
 		$http_query =& $this->recallObject('HTTPQuery');
 		return $http_query->GetSelectedIDsArray($mask, $value_mask);
 	}*/
 
 	/**
 	 * Returns configurtion option
 	 *
 	 * @param string $option
 	 * @return string
 	 * @access public
 	 */
 	/*function ConfigOption($option)
 	{
 		$config =& $this->recallObject('Configuration');
 		return $config->Get($option);
 	}*/
 
 	/**
 	 * Sets configuration option
 	 *
 	 * @param string $option
 	 * @param string $value
 	 * @return bool
 	 * @access public
 	 */
 	/*function SetConfigOption($option,$value)
 	{
 		$config =& $this->recallObject('Configuration');
 		return $config->Set($option, $value);
 	}*/
 
 	function AddBlock($name, $tpl)
 	{
 		$this->cache[$name] = $tpl;
 	}
 
 	function SetTemplateBody($title,$body)
 	{
 		$templates_cache =& $this->recallObject('TemplatesCache');
 		$templates_cache->SetTemplateBody($title,$body);
 	}
 	
 	function ProcessTag($tag_data)
 	{
 		$a_tag = new Tag($tag_data,$this->Parser);
 		return $a_tag->DoProcessTag();
 	}
 	
 	function ProcessParsedTag($prefix, $tag, $params)
 	{
 		$a_tag = new Tag('',$this->Parser);
 		$a_tag->Tag = $tag;
 		$a_tag->Processor = $prefix;
 		$a_tag->NamedParams = $params;
 		return $a_tag->DoProcessTag();
 	}
 
 	/* DEFINETLY NEEDS TO BE MOVED AWAY!!!!! */
 	/*var $email_body;
 	function Email($params)
  	{
  		$this->email_body = $this->ParseBlock($params);	
  		$from = $this->GetVar('email_from');
  		$to = $this->GetVar('email_to');
  		$replay = $this->GetVar('email_replay');
  		if ( $replay == "" ) $replay = $from;
  		$subject = $this->GetVar('email_subject');
  		$charset = $this->GetVar('email_charset');
  		// $display = $this->GetVar('email_display');
  		$display = 0;
  		if (!isset($charset) || $charset == '') $charset = 'US-ASCII';
  		$mime = $this->GetVar('email_mime');
  		
  		if ($mime == 'yes') {
  			$mime_mail = new MIMEMail($to, $from, $subject, $charset);
  			$mime_mail->mailbody($this->email_body);
  			
  			if ($f_name = $this->GetVar('email_attach')) {
 				$full_path = DOC_ROOT.BASE_PATH.'/'.$f_name;
 				$data = '';
 				if(file_exists($full_path)) {
 					$fd = fopen($full_path, "r");
 					$data = fread($fd, filesize($full_path));
 					fclose($fd);
 				} 				
 				else exit;
 				 				
  				$filename = $this->GetVar('email_attach_filename');
  				$type = $this->GetVar('email_attach_type');
  				
  				$mime_mail->attachfile_raw($data, $filename, $type); 	
 				$mime_mail->send();
  			}
  		}
  		else {
  			$headers.="From: $from\n";
 	 		$headers.="Reply-To: $replay\n";
 	 		$headers.="Content-Type: text/html; charset=\"$charset\"\n";
 	 		if ( $display == 1 ) {
 	 			echo "<pre>";
 	 			echo " from : $from <br>"; 	
 	 			echo " to : $to <br>"; 		
 	 			echo " replay : $replay <br>";
 	 			echo " subject : $subject <br>";
 	 			echo " this->email_body : $this->email_body <br>";
 	 			echo " headers : $headers <br>";
 	 			echo "</pre>";
 			}
 	 		mail($to, $subject, $this->email_body, $headers);
 	 	}
  	}*/
 
 	/**
 	* Return ADODB Connection object
 	*
 	* Returns ADODB Connection object already connected to the project database, configurable in config.php
 	* @access public
 	* @return ADODBConnection
 	*/
 	function &GetADODBConnection()
 	{
 		return $this->DB;
 	}
 
 	function ParseBlock($params,$pass_params=0,$as_template=false)
 	{
 		if (substr($params['name'], 0, 5) == 'html:') return substr($params['name'], 6);
 		return $this->Parser->ParseBlock($params, $pass_params, $as_template);
 	}
 
 	function &GetXMLFactory()
 	{
 		return $this->XMLFactory;
 	}
 	
 	/**
 	* Return href for template
 	*
 	* @access public
 	* @param string $t Template path
 	* @var string $prefix index.php prefix - could be blank, 'admin'
 	*/
 	function HREF($t, $prefix='', $params=null, $index_file=null)
 	{
 		global $HTTP_SERVER_VARS;
 		if (defined('ADMIN') && $prefix == '') $prefix='/admin';
 		if (defined('ADMIN') && $prefix == '_FRONT_END_') $prefix = '';
 		$index_file = isset($index_file) ? $index_file : (defined('INDEX_FILE') ? INDEX_FILE : basename($_SERVER['SCRIPT_NAME']));
 		
 		if( isset($params['index_file']) ) $index_file = $params['index_file'];
 		
 		if (getArrayValue($params, 'opener') == 'u') {
 			$opener_stack=$this->RecallVar('opener_stack');
 			if($opener_stack) {
 				$opener_stack=unserialize($opener_stack);
 				if (count($opener_stack) > 0) {
 					list($index_file, $env) = explode('|', $opener_stack[count($opener_stack)-1]);
 					$ret = $this->BaseURL($prefix).$index_file.'?'.ENV_VAR_NAME.'='.$env;
 					if( getArrayValue($params,'escape') ) $ret = addslashes($ret);
 					return $ret;
 				}
 				else {
 					//define('DBG_REDIRECT', 1);
 					$t = $this->GetVar('t');
 				}
 			}
 			else {
 				//define('DBG_REDIRECT', 1);
 				$t = $this->GetVar('t');
 			}
 		}
 		
 		$pass = isset($params['pass']) ? $params['pass'] : '';
 		$pass_events = isset($params['pass_events']) ? $params['pass_events'] : false; // pass events with url
 	
 		
 		
 		if (defined('MOD_REWRITE') && MOD_REWRITE) {
 			$env = $this->BuildEnv('', $params, $pass, $pass_events, false);
 			$env = ltrim($env, ':-');
 			
 			$session =& $this->recallObject('Session');
 			$sid = $session->NeedQueryString() ? '?sid='.$this->GetSID() : '';
 //			$env = str_replace(':', '/', $env);
 			$ret = rtrim($this->BaseURL($prefix).$t.'.html/'.$env.'/'.$sid, '/');
 			
 		}
 		else {
 			$env = $this->BuildEnv($t, $params, $pass, $pass_events);
 			$ret = $this->BaseURL($prefix).$index_file.'?'.$env;
 		}
 				
 		return $ret;
 	}
 	
 	function BuildEnv($t, $params, $pass='all', $pass_events=false, $env_var=true)
 	{
 		$session =& $this->recallObject('Session');
 		$sid = $session->NeedQueryString() && !(defined('MOD_REWRITE') && MOD_REWRITE) ? $this->GetSID() : '';
 		if( getArrayValue($params,'admin') == 1 ) $sid = $this->GetSID();
 		
 		$ret = '';
 		if ($env_var) {
 			$ret = ENV_VAR_NAME.'=';
 		}
 		$ret .=	defined('INPORTAL_ENV') ? $sid.'-'.$t : $sid.':'.$t;
 		
 		$pass = str_replace('all', trim($this->GetVar('passed'), ','), $pass);
 		
 		if(strlen($pass) > 0)
 		{
 			$pass_info = array_unique( explode(',',$pass) ); // array( prefix[.special], prefix[.special] ... 
 			foreach($pass_info as $pass_element)
 			{
 				$ret.=':';
 				list($prefix)=explode('.',$pass_element);
 				$query_vars = $this->getUnitOption($prefix,'QueryString');
 				
 				//if pass events is off and event is not implicity passed
 				if(!$pass_events && !isset($params[$pass_element.'_event'])) {
 					$params[$pass_element.'_event'] = ''; // remove event from url if requested
 					//otherwise it will use value from get_var
 				}
 				
 				if($query_vars)
 				{
 					$tmp_string=Array(0=>$pass_element);
 					foreach($query_vars as $index => $var_name)
 					{
 						//if value passed in params use it, otherwise use current from application
 						$tmp_string[$index] =  isset( $params[$pass_element.'_'.$var_name] ) ? $params[$pass_element.'_'.$var_name] : $this->GetVar($pass_element.'_'.$var_name);
 						if ( isset($params[$pass_element.'_'.$var_name]) ) {
 							unset( $params[$pass_element.'_'.$var_name] );
 						}
 					}
 					
 					$escaped = array();
 					foreach ($tmp_string as $tmp_val) {
 						$escaped[] = str_replace(Array('-',':'), Array('\-','\:'), $tmp_val);
 					}
 					
 					if ($this->getUnitOption($prefix, 'PortalStyleEnv') == true) {
 						$ret.= array_shift($escaped).array_shift($escaped).'-'.implode('-',$escaped);
 					}
 					else {
 						$ret.=implode('-',$escaped);
 					}
 				}
 			}
 		}
 		unset($params['pass']);
 		unset($params['opener']);
 		unset($params['m_event']);
 		
 		if ($this->GetVar('admin') && !isset($params['admin'])) {
 			$params['admin'] = 1;
 		}
 		
 		if( getArrayValue($params,'escape') )
 		{
 			$ret = addslashes($ret);
 			unset($params['escape']);
 		}
 		
 		foreach ($params as $param => $value)
 		{
 			$ret .= '&'.$param.'='.$value;
 		}
 		
 		return $ret;
 	}
 	
 	function BaseURL($prefix='')
 	{
 		return PROTOCOL.SERVER_NAME.(defined('PORT')?':'.PORT : '').BASE_PATH.$prefix.'/';
 	}
 	
 	function Redirect($t='', $params=null, $prefix='', $index_file=null)
 	{
 		if ($t == '' || $t === true) $t = $this->GetVar('t');
 		
 		// pass prefixes and special from previous url
 		if (!isset($params['pass'])) $params['pass'] = 'all';
 		
 		$location = $this->HREF($t, $prefix, $params, $index_file);
 		$a_location = $location;
 		$location = "Location: $location";
 		//echo " location : $location <br>";
 		
 		
 		if( $this->isDebugMode() && dbg_ConstOn('DBG_REDIRECT') )
 		{
 			$GLOBALS['debugger']->appendTrace();
 			echo "<b>Debug output above!!!</b> Proceed to redirect: <a href=\"$a_location\">$a_location</a><br>";
 		}
 		else
 		{
 			if(headers_sent() != '')
 			{
 				echo '<script language="javascript" type="text/javascript">window.location.href = \''.$a_location.'\';</script>';
 			}
 			else
 			{
 				header("$location");
 			}
 		}
 		
 		$session =& $this->recallObject('Session');
 		$session->SaveData();
 		$this->SaveBlocksCache();
 		exit;
 	}
 	
 	function Phrase($label)
 	{
 		return $this->Phrases->GetPhrase($label);
 	}
 	
 	/**
 	 * Replace language tags in exclamation marks found in text
 	 *
 	 * @param string $text
 	 * @param bool $force_escape force escaping, not escaping of resulting string
 	 * @return string
 	 * @access public
 	 */
 	function ReplaceLanguageTags($text, $force_escape=null)
 	{
 		return $this->Phrases->ReplaceLanguageTags($text,$force_escape);
 	}
 	
 	/**
 	 * Validtates user in session if required
 	 *
 	 */
 	function ValidateLogin()
 	{
 		if (defined('LOGIN_REQUIRED'))
 		{
 			// Original Kostja call
 			//$login_controller =& $this->Factory->MakeClass(LOGIN_CONTROLLER, Array('model' => USER_MODEL, 'prefix' => 'login'));
 			
 			// Call proposed by Alex
 			//$login_controller =& $this->RecallObject(LOGIN_CONTROLLER, Array('model' => USER_MODEL, 'prefix' => 'login'));
 			
 			//$login_controller->CheckLogin();
 		}
 	}
 	
 	/**
 	 * Returns configuration option value by name
 	 *
 	 * @param string $name
 	 * @return string
 	 */
 	function ConfigValue($name)
 	{
 		return $this->DB->GetOne('SELECT VariableValue FROM '.TABLE_PREFIX.'ConfigurationValues WHERE VariableName = '.$this->DB->qstr($name) );
 	}
 	
 	/**
 	 * Allows to process any type of event
 	 *
 	 * @param kEvent $event
 	 * @access public
 	 * @author Alex
 	 */
 	function HandleEvent(&$event, $params=null, $specificParams=null)
 	{
 		if ( isset($params) ) {
 			$event = new kEvent( $params, $specificParams );
 		}
 		$event_manager =& $this->recallObject('EventManager');
 		$event_manager->HandleEvent($event);
 	}
 	
 	/**
 	 * Registers new class in the factory
 	 *
 	 * @param string $real_class
 	 * @param string $file
 	 * @param string $pseudo_class
 	 * @access public
 	 * @author Alex
 	 */
 	function registerClass($real_class,$file,$pseudo_class=null)
 	{
 		$this->Factory->registerClass($real_class,$file,$pseudo_class);	
 	}
 	
 	/**
 	 * Registers Hook from subprefix event to master prefix event
 	 *
 	 * @param string $hookto_prefix
 	 * @param string $hookto_special
 	 * @param string $hookto_event
 	 * @param string $mode
 	 * @param string $do_prefix
 	 * @param string $do_special
 	 * @param string $do_event
 	 * @param string $conditional
 	 * @access public
 	 * @todo take care of a lot parameters passed
 	 * @author Kostja
 	 */
 	function registerHook($hookto_prefix, $hookto_special, $hookto_event, $mode, $do_prefix, $do_special, $do_event, $conditional)
 	{
 		$event_manager =& $this->recallObject('EventManager');
 		$event_manager->registerHook($hookto_prefix, $hookto_special, $hookto_event, $mode, $do_prefix, $do_special, $do_event, $conditional);
 	}
 	
 	/**
 	 * Allows one TagProcessor tag act as other TagProcessor tag
 	 *
 	 * @param Array $tag_info
 	 * @author Kostja
 	 */
 	function registerAggregateTag($tag_info)
 	{
 		$aggregator =& $this->recallObject('TagsAggregator', 'kArray');
 		$aggregator->SetArrayValue($tag_info['AggregateTo'], $tag_info['AggregatedTagName'], Array($tag_info['LocalPrefix'], $tag_info['LocalTagName'], getArrayValue($tag_info, 'LocalSpecial')));
 	}
 	
 	/**
 	 * Returns object using params specified,
 	 * creates it if is required
 	 *
 	 * @param string $name
 	 * @param string $pseudo_class
 	 * @param Array $event_params
 	 * @return Object
 	 * @author Alex
 	 */
 	function &recallObject($name,$pseudo_class=null,$event_params=Array())
 	{
 		$o1 =& $this->Factory->getObject($name,$pseudo_class,$event_params);
 		
 		//$o1->param1 = 'one';
 		
 		/*$func_args = func_get_args();
 		$factory =& $this->Factory;
 		$o2 =& call_user_func_array( Array(&$factory, 'getObject'), $func_args );*/
 		
 		//$o2->param1 = 'two';
 		return $o1;
 	}
 	
 	/**
 	 * Checks if object with prefix passes was already created in factory
 	 *
 	 * @param string $name object presudo_class, prefix
 	 * @return bool
 	 * @author Kostja
 	 */
 	function hasObject($name)
 	{
 		return isset($this->Factory->Storage[$name]);
 	}
 	
 	/**
 	 * Removes object from storage by given name
 	 *
 	 * @param string $name Object's name in the Storage
 	 * @author Kostja
 	 */
 	function removeObject($name)
 	{
 		$this->Factory->DestroyObject($name);
 	}
 	
 	/**
 	 * Get's real class name for pseudo class,
 	 * includes class file and creates class
 	 * instance
 	 *
 	 * @param string $pseudo_class
 	 * @return Object
 	 * @access public
 	 * @author Alex
 	 */
 	function &makeClass($pseudo_class)
 	{
 		$func_args = func_get_args();
 		return call_user_func_array( Array(&$this->Factory, 'makeClass'), $func_args);
 	}
 	
 	/**
 	 * Checks if application is in debug mode
 	 *
 	 * @return bool
 	 * @access public
 	 * @author Alex
 	 */
 	function isDebugMode()
 	{
 		return defined('DEBUG_MODE') && DEBUG_MODE;
 	}
 	
 	/**
 	 * Checks if it is admin
 	 *
 	 * @return bool
 	 * @author Alex
 	 */
 	function IsAdmin()
 	{
 		return defined('ADMIN') && ADMIN;
 	}
 	
 	/**
 	 * Reads unit (specified by $prefix)
 	 * option specified by $option
 	 *
 	 * @param string $prefix
 	 * @param string $option
 	 * @return string
 	 * @access public
 	 * @author Alex
 	 */
 	function getUnitOption($prefix,$option)
 	{
 		$unit_config_reader =& $this->recallObject('kUnitConfigReader');
 		return $unit_config_reader->getUnitOption($prefix,$option);
 	}
 	
 	/**
 	 * Set's new unit option value
 	 *
 	 * @param string $prefix
 	 * @param string $name
 	 * @param string $value
 	 * @author Alex
 	 * @access public
 	 */
 	function setUnitOption($prefix,$option,$value)
 	{
 		$unit_config_reader =& $this->recallObject('kUnitConfigReader');
 		return $unit_config_reader->setUnitOption($prefix,$option,$value);
 	}
 	
 	/**
 	 * Read all unit with $prefix options
 	 *
 	 * @param string $prefix
 	 * @return Array
 	 * @access public
 	 * @author Alex
 	 */
 	function getUnitOptions($prefix)
 	{
 		$unit_config_reader =& $this->recallObject('kUnitConfigReader');
 		return $unit_config_reader->getUnitOptions($prefix);
 	}
 	
 	/**
 	 * Returns true if config exists and is allowed for reading
 	 *
 	 * @param string $prefix
 	 * @return bool
 	 */
 	function prefixRegistred($prefix)
 	{
 		$unit_config_reader =& $this->recallObject('kUnitConfigReader');
 		return $unit_config_reader->prefixRegistred($prefix);
 	}
 	
 	/**
 	 * Splits any mixing of prefix and
 	 * special into correct ones
 	 *
 	 * @param string $prefix_special
 	 * @return Array
 	 * @access public
 	 * @author Alex
 	 */
 	function processPrefix($prefix_special)
 	{
 		return $this->Factory->processPrefix($prefix_special);
 	}
 	
 	/**
 	 * Set's new event for $prefix_special
 	 * passed
 	 *
 	 * @param string $prefix_special
 	 * @param string $event_name
 	 * @access public
 	 */
 	function setEvent($prefix_special,$event_name)
 	{
 		$event_manager =& $this->recallObject('EventManager');
 		$event_manager->setEvent($prefix_special,$event_name);
 	}
 	
 	
 	/**
 	 * SQL Error Handler
 	 *
 	 * @param int $code
 	 * @param string $msg
 	 * @param string $sql
 	 * @return bool
 	 * @access private
 	 * @author Alex
 	 */
 	function handleSQLError($code,$msg,$sql)
 	{
 		global $debugger;		
 		if($debugger)
 		{
 			$errorLevel=defined('DBG_SQL_FAILURE') && DBG_SQL_FAILURE ? E_USER_ERROR : E_USER_WARNING;
 			$debugger->dumpVars($_REQUEST);
 			$debugger->appendTrace();
 			
 			$error_msg = '<span class="debug_error">'.$msg.' ('.$code.')</span><br><a href="javascript:SetClipboard(\''.htmlspecialchars($sql).'\');"><b>SQL</b></a>: '.$debugger->formatSQL($sql);
 			$long_id=$debugger->mapLongError($error_msg);
 			trigger_error( substr($msg.' ('.$code.') ['.$sql.']',0,1000).' #'.$long_id, $errorLevel);
 			return true;
 		}
 		else 
 		{
 			//$errorLevel = defined('IS_INSTALL') && IS_INSTALL ? E_USER_WARNING : E_USER_ERROR;
 			$errorLevel = E_USER_WARNING;
 			trigger_error('<b>SQL Error</b> in sql: '.$sql.', code <b>'.$code.'</b> ('.$msg.')', $errorLevel);
 			/*echo '<b>xProcessing SQL</b>: '.$sql.'<br>';
 			echo '<b>Error ('.$code.'):</b> '.$msg.'<br>';*/
 			return $errorLevel == E_USER_ERROR ? false : true;
 		}
 	}
 	
 	/**
 	 * Default error handler
 	 *
 	 * @param int $errno
 	 * @param string $errstr
 	 * @param string $errfile
 	 * @param int $errline
 	 * @param Array $errcontext
 	 */
 	function handleError($errno, $errstr, $errfile = '', $errline = '', $errcontext = '')
 	{
 		if (defined('SILENT_LOG') && SILENT_LOG) {
 			$fp = fopen(DOC_ROOT.BASE_PATH.'/silent_log.txt','a');
 			$time = date('d/m/Y H:i:s');
 			fwrite($fp, '['.$time.'] #'.$errno.': '.strip_tags($errstr).' in ['.$errfile.'] on line '.$errline."\n");
 			fclose($fp);
 		}
 	}
 	
 	/**
 	 * Returns & blocks next ResourceId available in system
 	 *
 	 * @return int
 	 * @access public
 	 * @author Eduard
 	 */
 	function NextResourceId()
 	{
 		$this->DB->Query('LOCK TABLES '.TABLE_PREFIX.'IdGenerator WRITE');
 		$this->DB->Query('UPDATE '.TABLE_PREFIX.'IdGenerator SET lastid = lastid+1');
 		$id = $this->DB->GetOne("SELECT lastid FROM ".TABLE_PREFIX."IdGenerator");
 		$this->DB->Query('UNLOCK TABLES');
 		return $id;
 	}
 	
 	/**
 	 * Returns main prefix for subtable prefix passes
 	 *
 	 * @param string $current_prefix
 	 * @return string
 	 * @access public
 	 * @author Kostja
 	 */
 	function GetTopmostPrefix($current_prefix)
 	{
 		while ( $parent_prefix = $this->getUnitOption($current_prefix, 'ParentPrefix') )
 		{
 			$current_prefix = $parent_prefix;
 		}
 		return $current_prefix;
 	}	
 	
 	function EmailEventAdmin($email_event_name, $to_user_id = -1, $send_params = false)
 	{
 		return $this->EmailEvent($email_event_name, 1, $to_user_id, $send_params);
 	}
 
 	function EmailEventUser($email_event_name, $to_user_id = -1, $send_params = false)
 	{
 		return $this->EmailEvent($email_event_name, 0, $to_user_id, $send_params);
 	}
 	
 	function EmailEvent($email_event_name, $email_event_type, $to_user_id = -1, $send_params = false)
 	{
 		$event = new kEvent('emailevents:OnEmailEvent');
 		$event->setEventParam('EmailEventName', $email_event_name);
 		$event->setEventParam('EmailEventToUserId', $to_user_id);
 		$event->setEventParam('EmailEventType', $email_event_type);
 		if ($send_params){
 			$event->setEventParam('DirectSendParams', $send_params);
 		}
 		$this->HandleEvent($event);
 
 		return $event;
 	}
 
 	
 	function LoggedIn()
 	{
 		$user =& $this->recallObject('u');
 		return ($user->GetDBField('PortalUserId') > 0);
 	}
 
 	function CheckPermission($name, $cat_id = null)
 	{
 		if( !isset($cat_id) )
 		{
 			$cat_id = $this->GetVar('m_cat_id');
 		}
 		if( $cat_id == 0 )
 		{
 			$cat_hierarchy = Array(0);	
 		}
 		else
 		{
 			$sql = 'SELECT ParentPath FROM '.$this->getUnitOption('c', 'TableName').' WHERE CategoryId = '.$cat_id;
 			$cat_hierarchy = $this->DB->GetOne($sql);
 			$cat_hierarchy = explode('|', $cat_hierarchy);
 			array_shift($cat_hierarchy);
 			array_pop($cat_hierarchy);
 			$cat_hierarchy = array_reverse($cat_hierarchy);
 			array_push($cat_hierarchy, 0);
 		}
 		
 		$groups = $this->RecallVar('UserGroups');
 		
 		foreach($cat_hierarchy as $category_id)
 		{
 			$sql = 'SELECT PermissionValue FROM '.TABLE_PREFIX.'Permissions
 					WHERE Permission = "'.$name.'"
 					AND CatId = '.$category_id.'
 					AND GroupId IN ('.$groups.')';
 			$res = $this->DB->GetOne($sql);
 			if($res !== false)
 			{
 				return $res;
 			}
 		}
 		
 		return 0;
 	}
 	
 	function RunScheduledEvents()
 	{
 		
 	}
 	
 }
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/kernel/application.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.39
\ No newline at end of property
+1.40
\ No newline at end of property