<?php

class clsPhrase extends clsItemDB
{

    function clsPhrase($id=NULL)
    {
        $this->clsItemDB();
        $this->tablename = GetTablePrefix()."Phrase";
        $this->id_field = "PhraseId";
        $this->NoResourceId=1;
        if($id)
            $this->LoadFromDatabase($id);
    }
    
    function LoadFromDatabase($Id)
    {
        global $Errors;

        if(!isset($Id))
        {
            $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
            return false;
        }
        if($Id)
        {        
          $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id);
          $result = $this->adodbConnection->Execute($sql);
         if ($result === false)
          { 
            $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
            return false;
          }

          $data = $result->fields;

          $this->SetFromArray($data);
          $this->Clean();
          return true;
        }
        else
            return FALSE;
    }

    function AdminIcon()
    {
        global $imagesURL;

        return $imagesURL."/itemicons/icon16_language_var.gif";
    }

}

class clsPhraseList extends clsItemCollection
{
    var $Page;
    var $PerPageVar;

    function clsPhraseList()
    {
        $this->clsItemCollection();
        $this->SourceTable = GetTablePrefix()."Phrase";
        $this->classname = "clsPhrase";
        $this->PerPageVar = "Perpage_Phrase";
        $this->AdminSearchFields = array("p.Phrase","p.Translation");

    }

    function &AddPhrase($Phrase,$LangId,$Translation,$Type)
    {
    	$tmpphrase = $this->GetPhrase($Phrase, $LangId);
    	if (!$tmpphrase) {
    		$p = new clsPhrase();
        	$p->tablename = $this->SourceTable;
        	$p->Set(array("Phrase","LanguageId","Translation","PhraseType"),
                	array($Phrase,$LangId,$Translation,$Type));
        	$p->Dirty();
        	$p->Create();
        	return $p;
    	}
    	else {
    		$add_error = "Error";
    		return $add_error;
/*    		$tmpphrase->Set(array("Phrase","LanguageId","Translation","PhraseType"),
                array($Phrase,$LangId,$Translation,$Type));
            $tmpphrase->Dirty();
            $tmpphrase->Update();
            return $tmpphrase;*/
    	}
    }

    function &EditPhrase($id,$Phrase,$LangId,$Translation,$Type)
    {
        $p = $this->GetItem($id);
        $p->Set(array("Phrase","LanguageId","Translation","PhraseType"),
                array($Phrase,$LangId,$Translation,$Type));
        $p->Dirty();        
        $p->Update();
        return $p;
    }

    function DeletePhrase($id)
    {
        $p = $this->GetItem($id);
        $p->Delete();
    }

    function DeleteLanguage($LangId)
    {
        $sql = "DELETE FROM ".$this->SourceTable." WHERE LanguageId=$LangId";
        if((int)$_GLOBALS["debuglevel"])
            echo $sql."<br>\n";

        $this->adodbConnection->Execute($sql);
    }

    function CopyFromEditTable()
    {
        global $objSession;

        $edit_table = $objSession->GetEditTable($this->SourceTable);
        $idlist = array();
        $sql = "SELECT * FROM $edit_table";

        $this->Clear();
        $rs = $this->adodbConnection->Execute($sql);
        while($rs && !$rs->EOF)
        {
            $data = $rs->fields;
            $c = $this->AddItemFromArray($data);     
			$c->Dirty();                   
            if($data["PhraseId"]>0)
            {
                $c->Update();                
            }
            else
            {
            	$c->debuglevel=0;
                $c->UnsetIdField();
                $c->Create();
            }

            $rs->MoveNext();
        }
        if((int)$_GLOBALS["debuglevel"])
            echo $sql."<br>\n";
        $this->adodbConnection->Execute($sql);
    }
    
    function PurgeEditTable()
    {
      global $objSession;

      $edit_table = $objSession->GetEditTable($this->SourceTable);
      $this->adodbConnection->Execute("DROP TABLE $edit_table");
    }

    function GetPhrase($Phrase,$Lang, $no_db=FALSE)
    {
        $found = FALSE;                 
        
        foreach($this->Items as $i)
        {   
            if($i->Get("Phrase")==$Phrase && $i->Get("LanguageId")==$Lang)
            {
                $found = TRUE;
                break;
            }
        }
        if(!$found && !$no_db)
        {        
          $sql = "SELECT * FROM ".$this->SourceTable." WHERE Phrase='$Phrase' AND LanguageId='$Lang'";
          //echo $sql."<br>\n";
          $rs = $this->adodbConnection->Execute($sql);
          if($rs && !$rs->EOF)
          {
              $data = $rs->fields;
              $i = $this->AddItemFromArray($data);
          }
          else
              $i = FALSE;
        }
        return $i;
    }
}

RegisterPrefix("clsLanguage","lang","kernel/include/language.php");

class clsLanguage extends clsParsedItem
{
    function clsLanguage($id=NULL)
    {
        $this->clsParsedItem();
        $this->tablename = GetTablePrefix()."Language";
        $this->id_field = "LanguageId";
        $this->NoResourceId=1;
        $this->TagPrefix="lang";

        if($id)
            $this->LoadFromDatabase($id);

    }

    function LoadFromDatabase($Id)
    {
		global $Errors;
       
        if(!isset($Id))
        {
            $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
            return false;
        }        
        $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id);
        $result = $this->adodbConnection->Execute($sql);
        if ($result === false)
        {
            $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
            return false;
        }

        $data = $result->fields;

        $this->SetFromArray($data);
        $this->Clean();
        return true;
    }    

    function Delete()
    {
        $p = new clsPhraseList();
        //$id = $this->Get("LanguageId");
        //$p->DeleteLanguage($id);
        parent::Delete();
    }

    function ParseObject($element)
    {
        global $m_var_list,$m_var_list_update, $var_list,$var_list_update, $TemplateRoot;
        
        //echo "<PRE>"; print_r($element); echo "</PRE>";
        $extra_attribs = ExtraAttributes($element->attributes);
        if(strtolower($element->name)==$this->TagPrefix)
        {          
            $field = strtolower($element->attributes["_field"]); 
            switch($field)
            {     
            case "id":
                $ret = $this->Get("LanguageId");
            break;
            case "packname":
                $ret = $this->Get("PackName");
            break;
            case "localname":
                $ret = $this->Get("LocalName");
            break;
            case "link":
                $t = $element->attributes["_template"];
                if(strlen($t))
                {                
                  $var_list_update["t"] = $t;
                }
                else
                  $var_list_update["t"] = $var_list["t"];
                $m_var_list_update["lang"] = $this->Get("LanguageId");
                $ret = GetIndexURL()."?env=".BuildEnv();
                unset($var_list_update["t"],$m_var_list_update["lang"]);
            break;
            case "primary":
                $ret = "";
                if($this->Get("PrimaryLang")==1)
                    $ret = "1";
            break;
            case "icon":
                $ret = "";
                $icon = $this->Get("IconUrl");
                                
                if(strlen($icon)>0)
                {
                    $file =  $TemplateRoot."/".$icon;
                    //echo "File:$file <br>\n";
                    if(file_exists($file))
                        $ret = $icon;
                }
                if(!strlen($ret))
                    $ret = $element->attributes["_default"];
                //echo $ret;
            break;
            }//switch
        }//if
        return $ret;
    }

    function AdminIcon()
    {
            global $imagesURL;

            $file = $imagesURL."/itemicons/icon16_language";
            if($this->Get("PrimaryLang")==1)
            {
                $file .= "_primary.gif";
            }
            else
            {
                if($this->Get("Enabled")==0)
                {
                    $file .= "_disabled";
                }
                $file .= ".gif";
            }
            return $file;

    }
}

class clsLanguageList extends clsItemCollection
{
    var $m_Primary;

    function clsLanguageList()
    {
        $this->clsItemCollection();
        $this->SourceTable = GetTablePrefix()."Language";
        $this->classname = "clsLanguage";
        $this->AdminSearchFields = array("PackName","LocalName");
    }

    function SetPrimary($lang_id)
    {   
        $sql = "UPDATE ".$this->SourceTable." SET PrimaryLang=0 ";
        $this->adodbConnection->Execute($sql);
        $l = $this->GetItem($lang_id);
        $l->Set("PrimaryLang","1");        
        $l->Update();
        $this->m_Primary =$lang_id;
    }

    function GetPrimary($Field="LanguageId")
    {
        if(!$this->m_Primary)
        {        
          $sql = "SELECT * FROM ".$this->SourceTable." WHERE PrimaryLang=1";       
          $rs = $this->adodbConnection->Execute($sql);
          if($rs && !$rs->EOF)
          {
            $l = $rs->fields[$Field];
          }
          else
             $l = 0;
          $this->m_Primary=$l;
        }
        else
            $l = $this->m_Primary;        
        return $l;
    }
    
    function LoadAllLanguages()
    {
		$sql = "SELECT * FROM ".$this->SourceTable;       
        $this->Query_Item($sql);
    }

    function &AddLanguage($PackName,$LocalName,$Enabled,$Primary, $IconUrl="",$Datefmt,$TimeFmt,$Dec,$Thousand)
    {
        $l = new clsLanguage();
        $l->tablename = $this->SourceTable;
        $l->Set(array("PackName","LocalName","Enabled","PrimaryLang","IconUrl","DateFormat","TimeFormat",
        			  "DecimalPoint","ThousandSep"),
                array($PackName,$LocalName,$Enabled,$Primary,$IconUrl,$Datefmt,$TimeFmt,$Dec,$Thousand));
        $l->Dirty();
        $l->Create();
        return $l;
    }

    function EditLanguage($id,$PackName,$LocalName,$Enabled,$Primary, $IconUrl="",$Datefmt,$TimeFmt,$Dec,$Thousand)
    {
        $l = $this->GetItem($id);
        $l->Set(array("PackName","LocalName","Enabled","PrimaryLang","IconUrl","DateFormat","TimeFormat",
        			  "DecimalPoint","ThousandSep"),
                array($PackName,$LocalName,$Enabled,$Primary,$IconUrl,$Datefmt,$TimeFmt,$Dec,$Thousand));
        $l->Update();
        return $l;
    }

    function DeleteLanguage($id)
    {
        $l = $this->GetItem($id);
        $l->Delete();          
    }

    function CopyFromEditTable()
    {
        global $objSession;

        $edit_table = $objSession->GetEditTable($this->SourceTable);
        $idlist = array();
        $sql = "SELECT * FROM $edit_table";
        $this->Clear();
        $rs = $this->adodbConnection->Execute($sql);
        while($rs && !$rs->EOF)
        {
            $data = $rs->fields;
            $c = $this->AddItemFromArray($data);            
            $c->Dirty();

            if($data["LanguageId"]>0)
            {
                $c->Update();
            }
            else
            {
                $oldid = $c->Get("LanguageId");
                $c->UnsetIdField();
                $c->Create();
                $id = $c->Get("LanguageId");
                $phrase_table = $objSession->GetEditTable("Phrase");
                $sql = "UPDATE $phrase_table SET LanguageId=$id WHERE LanguageId=$oldid";                
                $this->adodbConnection->Execute($sql);
            }
            $rs->MoveNext();
        }
    }

    function ExportPhrases($file,$LangIds=NULL,$PhraseTypes=null)
    {        
        $output = array();
        $this->Clear();
        $where_parts = Array();
        if( isset($LangIds) ) $where_parts[] = 'LanguageId IN ('.$LangIds.')';
        $where =  count($where_parts) ? ' WHERE '.implode(' AND ', $where_parts) : '';
        $this->Query_Item($sql = 'SELECT * FROM '.$this->SourceTable.$where);

		$objXML = new xml_doc();

		$RootNode =& $objXML->getTagByID($objXML->createTag("LANGUAGES"));
		
        $ret = 0;
        if($this->NumItems()>0)
        {        
             $phrase_where = isset($PhraseTypes) ? ' AND PhraseType IN ('.$PhraseTypes.')' : '';
             $event_where = isset($PhraseTypes) ? ' AND Type+1 IN ('.$PhraseTypes.')' : '';
             foreach($this->Items as $l)
             {   
				$LangRoot =& $objXML->getTagByID($RootNode->addChild($objXML,"LANGUAGE",array("PackName"=>$l->Get("PackName")),""));
				$LangRoot->addChild($objXML,"DATEFORMAT",array(),$l->Get("DateFormat"));
				$LangRoot->addChild($objXML,"TIMEFORMAT",array(),$l->Get("TimeFormat"));
				$LangRoot->addChild($objXML,"DECIMAL",array(),$l->Get("DecimalPoint"));
				$LangRoot->addChild($objXML,"THOUSANDS",array(),$l->Get("ThousandSep"));
				$PhraseRoot =& $objXML->getTagByID($LangRoot->addChild($objXML,"PHRASES"));
			
                $sql = "SELECT * FROM ".GetTablePrefix()."Phrase WHERE LanguageId=".$l->Get("LanguageId").$phrase_where;
                $rs=$this->adodbConnection->Execute($sql);
                while($rs && ! $rs->EOF)
                {
                	  $PhraseRoot->addChild($objXML,"PHRASE",array("Label"=>$rs->fields["Phrase"],"Type"=>$rs->fields["PhraseType"]),base64_encode($rs->fields["Translation"]));
                      $rs->MoveNext();
                }
                
				$EventRoot =& $objXML->getTagByID($LangRoot->addChild($objXML,"EVENTS"));

				$ev = GetTablePrefix()."Events";
				$em = GetTablePrefix()."EmailMessage";
				$sql = "SELECT $em.*,$ev.Event,$ev.Type FROM $em INNER JOIN $ev ON ($em.EventId=$ev.EventId) WHERE LanguageId=".$l->Get("LanguageId").$event_where;
				$rs = $this->adodbConnection->Execute($sql);  
				while($rs && !$rs->EOF)
				{	
  					$EventRoot->AddChild($objXML,"EVENT",array("MessageType"=>$rs->fields["MessageType"],"Event"=>$rs->fields["Event"],"Type"=>$rs->fields["Type"]),base64_encode($rs->fields["Template"]));  	
  					$rs->MoveNext();
				}                
            }
            $objXML->generate();
			$objXML->xml = str_replace("&","&amp;",$objXML->xml);
			$fp = @fopen($file,"w");
			@fputs($fp,$objXML->xml);
			@fclose($fp);
        }
        return file_exists($file);
    }

    function ReadImportTable($TableName,$SetEnabled=0,$Types="0,1",$OverwitePhrases=FALSE, 
    						 $MaxInserts=100,$Offset=0)
    {    	    	    	
    	global $objPhraseList;
    	
    	if(!is_object($objPhraseList))
    	  $objPhraseList = new clsPhraseList();
    	
        $PhraseList = new clsPhraseList();
        $TypeArray = explode(",",$Types);
        $Inserts = 0;
        $sql = "SELECT * FROM $TableName WHERE PhraseType IN ($Types) LIMIT $Offset,$MaxInserts";
        //echo $sql;
        //$PhraseList->EnablePaging = false;
        $PhraseList->Query_Item($sql);
        if($PhraseList->NumItems()>0)
        {
        	foreach($PhraseList->Items as $i)
        	{
        		$p = $objPhraseList->GetPhrase($i->Get("Phrase"),$i->Get("LanguageId"));
        		//echo "<pre>"; print_r($p); echo "</pre>";
        		if(is_object($p))
        		{
        			if($OverwitePhrases)
        			{          			   
        			   //$p->debuglevel=1;
        			   $p->Set("Translation",$i->Get("Translation"));
        			   //echo $i->Get("Translation")."<br>";
        			   $p->Set("PhraseType",$i->Get("PhraseType"));
        			   $p->Dirty();
        			   $p->Update();
        			}
        		}
        		else {
        			//$i->debuglevel=1;
        		  $i->Create();        		  
        		}
        		$Inserts++;
        	}
        }
        $Offset = $Offset + $Inserts;
        return $Offset;
    }
    
    function PurgeEditTable()
    {
      global $objSession;

      $edit_table = $objSession->GetEditTable($this->SourceTable);
      $this->adodbConnection->Execute("DROP TABLE $edit_table");
    }

}

class clsLanguageCache 
{
    var $m_CachedLanguage;
    var $FullLoad = FALSE;
    var $cache;
    var $adodbConnection;
    var $TemplateName;
    var $TemplateCache;
    var $TemplateDate;
    var $ThemeId;

    function clsLanguageCache($LangId=NULL)
    {        
        global $objConfig;

        $this->m_CachedLanguage = $LangId;
        $this->adodbConnection =& GetADODBConnection();
        $this->Clear();
    }

    function Clear()
    {
        unset($this->cache);
        $this->cache = array();
        $this->TemplateCache = array();
    }

    function LoadLanguage($LangId,$Type)
    {
        $this->Clear();
        $this->m_CachedLanguage = $LangId;
        $this->FullLoad = TRUE;
        $sql = "SELECT Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE LanguageId=$LangId AND PhraseType=$Type";
        $rs = $this->adodbConnection->Execute($sql);
        while($rs && !$rs->EOF)
        {
            $this->cache[$rs->fields["Phrase"]] = $rs->fields["Translation"];
            if(ADODB_EXTENSION>0)
            {
                adodb_movenext($rs);
            }
            else
              $rs->MoveNext();
        }        

        return (count($this->cache)>0);
    }

    function GetPhrase($Phrase,$Lang)
    {
        $t = "";
        $sql = "SELECT PhraseId,Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE Phrase='$Phrase' AND LanguageId='$Lang'";
        
        $rs = $this->adodbConnection->Execute($sql);
        if($rs && !$rs->EOF)
        {
            $t = $rs->fields["Translation"];
            $this->TemplateCache[] = $rs->fields["PhraseId"];
        }

        return $t;
    }

    function LoadTemplateCache($t, $timeout, $ThemeId)
    {       
        
        $this->TemplateName = $t;
        $this->TemplateDate = 0;
        $this->ThemeId = $ThemeId;
        if($timeout > 0)
        {        
          $sql = "SELECT * FROM ".GetTablePrefix()."PhraseCache WHERE Template='$t' AND ThemeId=$ThemeId";
          $rs = $this->adodbConnection->Execute($sql);
          if($rs && !$rs->EOF)
          { 
            $this->TemplateCache = explode(',', $rs->fields['PhraseList']);
            $t_length = strlen($rs->fields['PhraseList']) ? 1 : 0;
            
            $this->TemplateDate = $rs->fields["CacheDate"];
            if(date("U") < $this->TemplateDate + $timeout || !$t_length)
            {            
                $this->TemplateCache = Array();
                $this->TemplateDate=0;
            }            
          }
          else
            $this->TemplateDate = -1;
        }
        else
            $this->TemplateDate=-2;
    }

    function LoadCachedVars($LangId)
    {
        if(count($this->TemplateCache))
        {
          $values = implode(",",$this->TemplateCache);          
          $this->FullLoad = FALSE;
          $this->m_CachedLanguage = $LangId;
          $sql = "SELECT Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE LanguageId=$LangId AND PhraseId IN ($values)";
          $rs = $this->adodbConnection->Execute($sql);
          while($rs && !$rs->EOF)
          {
            $this->cache[$rs->fields["Phrase"]] = $rs->fields["Translation"];
            if( defined('ADODB_EXTENSION') && constant('ADODB_EXTENSION') > 0 )
                adodb_movenext($rs);
            else
              $rs->MoveNext();
          }
        }
    }

    function SaveTemplateCache()
    {
        if($this->TemplateDate==0 || $this->TemplateDate==-1)
        {
            $value = implode(",",$this->TemplateCache);
            if($this->TemplateDate==0)
            {            
              $sql = "UPDATE ".GetTablePrefix()."PhraseCache SET PhraseList='$value',CacheDate=".date("U");
              $sql .=" WHERE Template='".$this->TemplateName."' AND ThemeId=".$this->ThemeId;
            }
            else
            {
                $sql = "INSERT INTO ".GetTablePrefix()."PhraseCache (Template,PhraseList,CacheDate,ThemeId) VALUES ('";
                $sql .= $this->TemplateName."','$value',".date("U").",".$this->ThemeId.")";
            }            
            $this->adodbConnection->Execute($sql);
        }
    }

    //This function returns a translation for a particular phrase
    //if translation is not found then !phrase! is returned.
    function GetTranslation($phrase,$language)
    {
        global $objSession, $LogPhraseLookups,$LangList, $MissingList;

        $missing = FALSE;
        if(!$this->FullLoad)
        {        
          $this->RefreshCacheStatus($language);
          if(!isset($this->cache[$phrase]))
          {          
            $this->cache[$phrase] = $this->GetPhrase($phrase,$language);
            $translation = $this->cache[$phrase];
            //$translation = "";
          }
          else
              $translation = $this->cache[$phrase];
        }
        else
        {        
           $translation = $this->cache[$phrase];
        }
        if(!strlen($translation))
        {
            $missing = TRUE; 
            
            if($language != 1)
            {
                $translation=$this->GetTranslation($phrase,1);
            }
            else
            {               
              $translation = "!".$phrase."!";
            }
        }
        
        if($LogPhraseLookups==TRUE)
        {
            //if(!is_array($LangList))
            //    $LangList = array();       
            //$LangList[$phrase] = $LangList;
            if($missing)
            {
                if(!is_array($MissingList))
                {
                    $MissingList = array();
                }
                if(!in_array($phrase,$MissingList))
                  $MissingList[] = $phrase;                
            }
        }
        
        return $translation;
    }

    //This function checks if cache is current for current language
    //if not clear it out
    function RefreshCacheStatus($language)
    {
        //First remember what language we are caching
//        if(!isset($this->m_CachedLanguage))
//          $this->m_CachedLanguage = $language;


        //If this is the different language, then clear the cache
//        if($this->m_CachedLanguage != $language)
//        {
//            $this->Clear();
//            $this->m_CachedLanguage = $language;
//        }
    }

}
?>