<?php

class clsModule extends clsItemDB 
{
    function clsModule($name="")
    {
        $this->clsItemDB();
        $this->tablename = GetTablePrefix()."Modules";
        $this->type=11;
        $this->BasePermission="";
        $this->id_field = "Name";
        $this->debuglevel=0;
        if(strlen($name))
            $this->LoadFromDatabase($name);
    }

    function ExecuteFunction($function_name, $params)
    {
    	$function_name = $this->Get('Var').'_'.$function_name;
    	if( function_exists($function_name) )
    		return $function_name($params);
    	else
    		return false;
    }
}

class clsModList extends clsItemCollection 
{
    function clsModList()
    {
        $this->clsItemCollection();
        $this->SourceTable=GetTablePrefix()."Modules";
        $this->classname = "clsModule";
        $this->LoadModules();
    }

    function LoadModules()
    {
        $this->Clear();
        return $this->Query_Item("SELECT * FROM ".$this->SourceTable);
    }

	function &FindModule($fieldname, $value)
	{
		// finds module by field specified
		foreach($this->Items as $module)
            if(strcasecmp($module->Get($fieldname), $value) == 0)
            	return $module;
		return false;
	}

	function GetModuleList()
	{
		// returns installed modules list
		$ret = Array();
		foreach($this->Items as $module) $ret[] = $module->Get('Name');
		return $ret;
	}
	
    function &GetModule($name)
    {
    	//$this->LoadModules();
    	return $this->FindModule('Name', $name);
    }
    
    function ExecuteFunction($function, $params = Array() )
	{
		// call specified function for each module
		// and returns result as array (key = module name)
		$result = Array();
		foreach($this->Items as $module)
			$result[ $module->Get('Name') ] = $module->ExecuteFunction($function, $params);
		return $result;			
	}
    
    function GetModuleByPath($path)
    {
      $ret = false;
      if(strlen($path))
      {
        $parts = explode("/",$path);
        $modpath = $parts[0]."/";	
    	
    	//$this->LoadModules();
    	return $this->FindModule('TemplatePath',$modpath);
      }
      return $ret;        
    }
    
    function GetModuleRoot($name)
    {
    	//$this->LoadModules();
    	$mod = $this->FindModule('Name', $name);
        return is_object($mod) ? $mod->Get("RootCat") : 0;
    }
    
    function SetModuleRoot($name, $CatId)
    {
		$mod =& $this->FindModule('Name', $name);
		if( is_object($mod) )
		{
			$mod->Set('RootCat',$CatId);    		    			
			$mod->Update();
		}
    }
    
    function Refresh()
    {
    	// reloads table content
    	$this->LoadModules();
    }
    
    function ModuleInstalled($name)
    {
        //$this->LoadModules();
        return $this->FindModule('Name',$name);
    }
    
    function MergeReturn($array)
    { 
    	// merge results ganed with ExecuteFunction
    	// method in a specific way
    	$tmp = Array();
    	foreach($array as $mod_name => $mod_results)
    		if (is_array($mod_results)) {
    			foreach($mod_results as $mod_var => $mod_var_value) {
    				$tmp[$mod_var][$mod_name] = $mod_var_value;	
    			}
    		}
    	return $tmp;
    }

}