<?
function GENERAL(){if (!isset($GLOBALS['GENERAL'])) $GLOBALS['GENERAL']=new i_general ; return($GLOBALS['GENERAL']);}

class i_general
{
    var $arr_moduls=array() ;
    var $arr_plugins=array() ;
    var $arr_event_lister=array() ;
    var $arr_func_install=array() ;
    var $arr_func_init=array() ;
    var $enabled=array() ;
    var $debugs=array('debug_modul'=>0,
										  'debug_boot'=>0,

											) ;

    function __construct()
		{
			 if ($GLOBALS['debug_modul']) $this->debugs['debug_modul']=1 ;
			 if ($GLOBALS['debug_boot']) $this->debugs['debug_boot']=1 ;
		}

		function boot_event_listers_from_DB()
    {
      $event_listers=execSQL('select pkey as id,obj_name,system_name,method_name from event_lister') ;
      if (sizeof($event_listers)) foreach($event_listers as $rec) $this->arr_event_lister[$rec['obj_name']][$rec['system_name']]=$rec['method_name'] ;
      //damp_array($this->arr_event_lister);
    }

	 // загрузка переменных из базы в текущее окружение
	 function reboot_setting_from_DB()
		{
	      $vars=execSQL('SELECT * from '.TM_SETTING.' where clss=99 order by pkey ',array('no_fs_info'=>1,'debug'=>0)) ;

		  if (_sizeof($vars)) foreach ($vars as $rec) if ($rec['comment'])
	      { $var_name=(mb_substr($rec['comment'],0,3)!='LS_')? 'LS_'.$rec["comment"]:$rec["comment"] ;
	        if ($rec["enabled"]) { $source_value=(isset($GLOBALS['_SETTING']['LocalSettings'][$var_name]))? $GLOBALS['_SETTING']['LocalSettings'][$var_name]:$rec['value'] ;
	                               $value=($rec['crypt'] or $var_name=='LS_AD_password')? decrypt_string($source_value):$source_value ;
	                               //if ($rec['crypt']) LOGS()->reg_log('decrypt_string',$var_name.'<br>'.$source_value.'<br>'.$value.'<br>(_APP_KEY='._APP_KEY.')<br>') ;

	                               $GLOBALS[$var_name]=$value ;
	                               if ($GLOBALS['debug_site_setting']) echo  $var_name.'='.$rec["value"].'<br>' ;
	                             }
	        //else                 unset($_SESSION[$var_name])	 ;
	        // 22.05.12 - в session_declare уже есть внесение в $GLOBALS значения из SESSION
	        //global ${$rec["comment"]} ; ${$rec["comment"]}=$_SESSION[$rec["comment"]] ;
	      }

	      if ($this->debugs['debug_boot']) echo 'загружены переменные из базы данных<br>' ;
		  set_time_point('Загрузка <strong>DB</strong> переменных ' .TM_SETTING) ;
		}

		function exec_init_functions()
		{
			if (sizeof($this->arr_func_init)) foreach($this->arr_func_init as $init_func_name)
			{ $init_func_name() ;
			  if ($this->debugs['debug_modul']) echo 'Выполнена функция инициализации переменных <strong>'.$init_func_name.'()</strong><br>' ;
			}
		}


		function include_modules_plugins($options=[])
	  {
	     if (_sizeof($GLOBALS['_SETTING']['modules'])) foreach($GLOBALS['_SETTING']['modules'] as $modul_name=>$enabled) if ($enabled)
	     { $modul_exists=$this->include_modul(_DIR_TO_MODULES,$modul_name,'',$options);
				 if ($modul_exists and $options['include_install_script']) $this->include_modul(_DIR_TO_MODULES,$modul_name,'_admin',$options);
	     }
	     if (_sizeof($GLOBALS['_SETTING']['modules_local'])) foreach($GLOBALS['_SETTING']['modules_local'] as $modul_name=>$enabled)  if ($enabled)
	     { $modul_exists=$this->include_modul(_DIR_TO_MODULES_LOCAL,$modul_name,'',$options);
				 if ($modul_exists and $options['include_install_script']) $this->include_modul(_DIR_TO_MODULES_LOCAL,$modul_name,'_admin',$options);
	     }
	     if (_sizeof($GLOBALS['_SETTING']['plugins'])) foreach($GLOBALS['_SETTING']['plugins'] as $plugin=>$enabled) if ($enabled)
			 { $this->include_plugin(_DIR_TO_MODULES.'/plugins/',$plugin,$options) ;

			 }
	     if (_sizeof($GLOBALS['_SETTING']['plugins_local'])) foreach($GLOBALS['_SETTING']['plugins_local'] as $plugin=>$enabled)  if ($enabled)
			 { $this->include_plugin(_DIR_TO_MODULES_LOCAL.'/plugins/',$plugin,$options) ;
			 }

	  }


   function include_modul($dir,$modul_name,$suff='',$options=[])
	  {  $__functions=[] ;  // !!! не удалять, так как это объявление позволяет формировать массив $__functions при подклбчении модулей
			 $modul_exists=0 ;
	     if ($this->debugs['debug_modul'] or $options['debug']) echo 'Подключаем модуль <strong>"'.$modul_name.$suff.'"</strong><br>' ;
	     $modul_fdir=$dir.'/'.$modul_name.'/m_'.$modul_name.$suff.'.php' ;
	     if (file_exists($modul_fdir))
	     { include_once($modul_fdir);
	       if ($this->debugs['debug_modul'] or $options['debug']) echo (file_exists($dir.'/'.$modul_name.'/m_'.$modul_name.$suff.'.php'))? '<div class=green>Скрипт /m_'.$modul_name.$suff.'.php  найден в '.hide_server_dir($dir).'</div>':'<div class=red>Скрипт /m_'.$modul_name.$suff.'.php  не найден в '.hide_server_dir($dir).'</div>' ;
				 $this->arr_moduls[$modul_name]=array('fname'=>$modul_fdir,'class_name'=>'c_'.$modul_name.'_system') ;
				 $this->enabled[$modul_name]=1 ;
				 $modul_exists=1 ;
	     }
	     if (sizeof($__functions)) foreach($__functions as $func_mode=>$arr_func) foreach($arr_func as $func_name)
			 { switch($func_mode)
					{ case 'init': $this->arr_func_init[]=$func_name ; break ;
						case 'install': $this->arr_func_install[]=$func_name ; break ;
					}
			 }

	     return($modul_exists) ;
	  }

	  function include_plugin($dir,$plugin_name,$options=[])
	  {   $__functions=[] ;  // !!! не удалять, так как это объявление позволяет формировать массив $__functions при подклбчении модулей
			  $modul_exists=0 ;
			  $modul_fdir=$dir.'i_'.$plugin_name.'.php' ;
	      if (file_exists($modul_fdir))
	      {   include_once($modul_fdir) ;
	          if ($this->debugs['debug_modul'] or $options['debug']) echo '<div class=green>Скрипт plugins/i_'.$plugin_name.'.php  найден</div>' ;
	          $this->arr_plugins[$plugin_name]=array('fname'=>$modul_fdir,'class_name'=>'i_'.$plugin_name) ;
					  $this->enabled[$plugin_name]=1 ;
					  $modul_exists=1 ;
	      }
	      elseif ($this->debugs['debug_modul'] or $options['debug']) echo '<div class=red>Скрипт ext/i_'.$plugin_name.'.php  не найден</div>'  ;
			  if (sizeof($__functions)) foreach($__functions as $func_mode=>$arr_func) foreach($arr_func as $func_name)
				 { switch($func_mode)
						{ case 'init': $this->arr_func_init[]=$func_name ; break ;
							case 'install': $this->arr_func_install[]=$func_name ; break ;
						}
				 }
			  return($modul_exists) ;
	  }
}

