<?php

function ip_exists($ip,$id,$SourceTable)
{
        $count = 0;
        $sql = "SELECT count(*) as DupCount FROM $SourceTable WHERE IPAddress='$ip' and ItemId=$id";
        $adodbConnection = &GetADODBConnection(); 
        $rs = $adodbConnection->Execute($sql);
        if($rs)
        {
            $count = $rs->fields["DupCount"];
        }
        return ($count>0);           
}

RegisterPrefix("clsItemReview","review","kernel/include/itemreview.php");
     
class clsItemReview extends clsParsedItem
{
    function clsItemReview($ReviewId=NULL,$table="ItemReview")
    {
        $this->clsParsedItem();
        $this->tablename = $table;
        $this->id_field = "ReviewId";
        $this->type=-20;
        $this->NoResourceId=1;
        $this->TagPrefix = "review";

        if($ReviewId!=NULL)
            $this->LoadFromDatabase($ReviewId);
    }

    function Validate()
    {
        global $Errors;

        $dataValid = true;
        if(!isset($this->m_CreatedOn))
        {
            $Errors->AddError("error.fieldIsRequired",'CreatedOn',"","",get_class($this),"Validate");
            $dataValid = false;
        }

        if(!isset($this->m_ReviewText))
        {
            $Errors->AddError("error.fieldIsRequired",'ReviewText',"","",get_class($this),"Validate");
            $dataValid = false;
        }
        
        if(!isset($this->m_Pending))
        {
            $Error->AddError("error.fieldIsRequired",'Pending',"","",get_class($this),"Validate");
            $dataValid = false;
        }
        
        if(!isset($this->m_IPAddress))
        {
            $Error->AddError("error.fieldIsRequired",'IPAddress',"","",get_class($this),"Validate");
            $dataValid = false;
        }
        
        if(!isset($this->m_ItemId))
        {
            $Error->AddError("error.fieldIsRequired",'ItemId',"","",get_class($this),"Validate");
            $dataValid = false;
        }
        
        if(!isset($this->m_CreatedById))
        {
            $Error->AddError("error.fieldIsRequired",'CreatedBy',"","",get_class($this),"Validate");
            $dataValid = false;
        }

        return $dataValid;
    }

    function LoadFromDatabase($Id)
    {
        global $objSession, $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 ReviewId = '%s'",$Id);
        if( $GLOBALS['debuglevel'] ) echo $sql."<br>";
        $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;
		if(is_array($data))
            $this->SetFromArray($data);
        $this->Clean();
        return TRUE;
    }    
  
    function MoveUp()
    {
        $this->Increment("Priority");
    }

    function MoveDown()
    {
        $this->Decrement("Priority");
    }

    function ParseObject($element)
    { 
        global $objConfig, $objCatList, $rootURL, $objUsers, $objModules;

        $extra_attribs = ExtraAttributes($element->attributes);
        
        if(strtolower($element->name)==$this->TagPrefix)
        {          
            $field = strtolower($element->attributes["_field"]); 
            switch($field)
            {
            case 'itemname':
            	$db=&GetADODBConnection();
            	$module_info=$objModules->ExecuteFunction('GetModuleInfo','rel_list');
            	$module_info=$module_info[$this->Get('Module')];
            	$ret=$db->GetOne('SELECT '.$module_info['ItemNameField'].' FROM '.GetTablePrefix().$module_info['MainTable'].' WHERE ResourceId='.$this->Get('ItemId'));
            	break;
            
            case 'itemlink':
            	$db=&GetADODBConnection();
            	$module_info=$objModules->ExecuteFunction('GetModuleInfo','rel_list');
            	$module_info=$module_info[$this->Get('Module')];
            	$prefix=$db->GetOne('SELECT Var FROM '.$objModules->SourceTable.' WHERE Name=\''.$this->Get('Module').'\'');
            	
            	$id=$db->GetOne('SELECT '.$module_info['MainTable'].'Id FROM '.GetTablePrefix().$module_info['MainTable'].' WHERE ResourceId='.$this->Get('ItemId'));
            	$GLOBALS[$prefix.'_var_list_update'][ $module_info['EnvIDField'] ]=$id;
    			
            	/*$env_unparsed=explode(':',$_REQUEST['env']);
            	m_ParseEnv($tmp[1]);*/
            	
            	$url=rtrim(GetIndexUrl(2),'index.php');
            	
                $ret = $url.strtolower($this->Get('Module')).'/admin/'.$module_info['EditFile'].'?env='.BuildEnv();
                unset($GLOBALS[$prefix.'_var_list_update'][ $module_info['EnvIDField'] ]);
            	break;
            	
            case "id":
            	/*
            	@field:review.id
            	@description: review id
            	*/
                $ret = $this->Get("ReviewId");
                break;
		    case "item_id":
		    	/*
		    	@field:review.item_id
		    	@description: ID of the item being reviewed
		    	*/
                $ret =  $this->Get("ItemId");
                break;
		    case "text":
		    	/*
		    	@field:review.text
		    	@description:Review text
		    	*/
		    	if($this->Get("TextFormat")==0 || $element->GetAttributeByName('_textonly') )
		    	{
		    	  $ret = inp_htmlize($this->Get("ReviewText"));
		    	}
		    	else 
		    	{
                	$ret = $this->Get("ReviewText");
		    	}
		    	
		    	$cut_first_chars=$element->GetAttributeByName('_CutFirst');
		    	if($cut_first_chars && strlen($ret)>$cut_first_chars)
		    	{
		    		$ret=substr($ret,0,$cut_first_chars).' ...';
		    	}
                break;		
		    case "ip":
		    	/*
		    	@field:review.ip
		    	@description:IP address of remote host submitting the review
		    	*/
			    $ret = $this->Get("IPAddress");
                break;
		    case "pending":
		    	/*
		    	@field:review.pending
		    	@description: Returns the review pening status
		    	*/
                $ret = $this->Get("Pending");
                break;		
            case "item_type":
            	/*
            	@field:review.item_type
            	@description:Returns the name of the reviewed item type
            	*/
                $type =& $objItemTypes->GetItem($this->Get("ItemType"));
                if(is_object($type))
                  $ret = $type->Get("ItemName");                
            break;
            case "date":
            	/*
  				@field:review.date
  				@description:Returns the date/time the review was created
  				@attrib:_tz:bool:Convert the date to the user's local time
  				@attrib:_part::Returns part of the date.  The following options are available: month,day,year,time_24hr,time_12hr
            	*/               
                $d = $this->Get("CreatedOn");
                if($element->GetAttributeByName('_tz'))
                {
                    $d = GetLocalTime($d,$objSession->Get("tz"));
                }

                $part = strtolower( $element->GetAttributeByName('_part') );
                if(strlen($part))
                {
                    $ret = ExtractDatePart($part,$d);
                }
                else
                {                
                  if($d<=0)
                  {                  
                    $ret = "";
                  }
                  else
                    $ret = LangDate($d);
                }
            break;
            case "reviewer":
            	/*
            	@field:revier.reviewer
            	@description:Parse a user tag for the user submitting the review
            	@attrib:_usertag::User tag to parse, defaults to the users login name
            	*/
                $userfield = $element->GetAttributeByName('_usertag');
                if(!strlen($userfield))
                {
                    $userfield = "login";
                }
                if($this->Get("CreatedById")>0)
                {
                  $u =& $objUsers->GetItem($this->Get("CreatedById"));                
                  $e = new clsHtmlTag(); 
                  $e->name = $u->TagPrefix;
                  $e->attributes = $element->attributes;
                  $e->attributes["_field"] = $userfield;
                  $ret = $u->ParseObject($e);
                }
                else 
                  if($userfield=="login")
                    $ret = "root";
            break;
            
             case "admin_icon":
                if( $element->GetAttributeByName('fulltag') )
                {
                    $ret = "<IMG $extra_attribs SRC=\"".$this->StatusIcon()."\">";
                }
                else
                {
                    $ret = $this->StatusIcon();
                }
            	break;
            	
            default:
                    $tag = $this->TagPrefix."_".$field;
                    $ret = "Undefined: ".$tag->name;
            break;
            }
        }
        else
        {
           $ret = $element->Execute();           
        }
        return $ret;
    }

     function StatusIcon()
    {
        global $imagesURL;
        $ret = $imagesURL.'/itemicons/';

        switch($this->Get('Status'))
        {
          case STATUS_DISABLED:
            $ret .= "icon16_review_disabled.gif";
            break;
          case STATUS_PENDING:
            $ret .= "icon16_review_pending.gif";  
            break;
          case STATUS_ACTIVE:
            $ret .= "icon16_review.gif";
            break;
        }
        return $ret;
    }
    
    function parsetag($tag)
    {	
        global $objConfig, $objUsers, $objItemTypes;
        if(is_object($tag))
        {        
            $tagname = $tag->name;
        }
        else
            $tagname = $tag;
        switch($tagname)
        {	
            case "review_id":
                return $this->Get("ReviewId");
                break;
		    case "review_item_id":
                return $this->Get("ItemId");
                break;
		    case "review_text":
                return $this->Get("ReviewText");
                break;		
		    case "review_ip_address":
			    return $this->Get("IPAddress");
                break;
		    case "review_pending":
                return $this->Get("Pending");
                break;		
            case "review_item_type":
                $type =& $objItemTypes->GetItem($this->Get("ItemType"));
                $res = $type->Get("ItemName");
                return $res;
                break;
            case "review_created_date":
                return LangDate($this->Get("CreatedOn"));
                break;		
            case "review_created_time":
                if($this->Get("CreatedOn")<=0)
                    return "";        
                return adodb_date($objConfig->TimeFormat(), $this->Get("CreatedOn"));
                break;

		    case "review_created_date_month":
                return adodb_date("m", $this->Get("CreatedOn"));
                break;		
		    case "review_created_date_day":
                return adodb_date("d", $this->Get("CreatedOn"));
                break;		
		    case "review_created_date_year":
                return adodb_date("Y", $this->Get("CreatedOn"));
                break;
            default:
                if (substr($tagname, 0, 16) == "review_createdby")
                {
                  /* parse the created by user */
                    $u = $objUsers->GetUser($this->Get("CreatedById"));
                    $usertag = substr($tag,17);
                    return $u->parsetag($usertag);
                }
                else
                    return "Undefined:$tagname";
                break;
        }
    }

    function SendUserEventMail($Suffix,$ToUserId,$LangId=NULL)
    {
        global $objItemTypes, $objMessageList;

        $type =& $objItemTypes->GetItem($this->Get("ItemType"));
        $res = $type->Get("ItemName");
        $EventName = $res.$Suffix;

        $Event =& $objMessageList->GetEmailEventObject($EventName,0,$LangId);
        if(is_object($Event))
        {
            if($Event->Get("Enabled")=="1")
            {
                $Event->Item = $this;
                return $Event->SendToUser($ToUserId);                
            }
        }
    }

    function SendAdminEventMail($EventName,$LangId=NULL)
    {
        global $objItemTypes, $objMessageList;

        $type =& $objItemTypes->GetItem($this->Get("ItemType"));
        $res = $type->Get("ItemName");
        $EventName = $res; //.$Suffix;

        $Event =& $objMessageList->GetEmailEventObject($EventName,1,$LangId);
        if(is_object($Event))
        {
            if($Event->Get("Enabled")=="1")
            {
                $Event->Item = $this;
                return $Event->SendAdmin($ToUserId);
            }
        }
    }
} /*clsIItemReview*/

class clsItemReviewList extends clsItemList //  clsItemCollection
{
    var $itemID;
    //var $Page;
    //var $PerPageVar;

    function clsItemReviewList($id=NULL)
    {
        $this->clsItemCollection();
        $this->classname = "clsItemReview";
        $this->SetTable('live',GetTablePrefix().'ItemReview');
        $this->Page = 1;
        $this->PerPageVar = "Perpage_Review";
        if(isset($id))
            $this->itemID=$id;
        $this->AdminSearchFields = array("ReviewText");
    }

    function SaveNewPage()
    {
    	$GLOBALS['m_var_list']['reviews_page']=$this->Page;
    }
    
    function ItemCount()
    {
      return $this->NumItems();
    }

    function GetReview($ID)
    {
	  return $this->GetItem($ID);
    }

    function GetReviewList($StatusWhere = "Status=1", $OrderBy=NULL)
    {
        $this->Clear();
        $where = "ItemId=".$this->itemID;
        $sql = "SELECT * FROM ".$this->SourceTable." WHERE ";
        if(strlen($StatusWhere))
            $where .= " AND ".$StatusWhere;
        $sql .= $where;
        if(strlen($OrderBy))
            $sql .= " ORDER BY ".$OrderBy;
        $Limit = $this->GetLimitSQL();
        if(strlen($Limit))
            $sql .= " ".$Limit;
        $this->QueryItemCount=TableCount($this->SourceTable,$where,0);
        return $this->Query_item($sql);
    }

    function GetItemReviewCount($TodayOnly = false)
    {
        $sql = 'SELECT COUNT(*) FROM '.$this->SourceTable.' WHERE ItemId = '.$this->itemID.' AND Status = 1';
        if($TodayOnly)
        {
            $today = mktime(0,0,0,date('m'),date('d'),date('Y'));
            $sql .= ' AND CreatedOn >= '.$today; 
        }
        return (int)$this->adodbConnection->GetOne($sql);
    }

    function ip_exists($ip,$id)
    {
      return ip_exists($ip,id,$this->SourceTable);
    }

    function GetLimitSQL()
    {
        global $objConfig;
        if($this->Page<1)
            $this->Page=1;
        $PerPage = $objConfig->Get($this->PerPageVar);
        if(is_numeric($PerPage))
        {
            $Start = ($this->Page-1)*$PerPage;
            $limit = "LIMIT ".$Start.",".$PerPage;
        }
        else
            $limit = NULL;
        return $limit;
    }


    function Query_Review($whereClause=NULL,$orderByClause=NULL)
    {
      global $Errors;

      $this->Clear();
      $sql = "SELECT *  FROM ".$this->SourceTable." ";

      if(isset($whereClause) && strlen(trim($whereClause))>0)
        $sql = sprintf("%s WHERE %s",$sql,$whereClause);

      if(isset($orderByClause) && strlen(trim($orderByClause))>0)
        $sql = sprintf("%s ORDER BY %s",$sql,$orderByClause);

      return $this->Query_Item($sql);
    }

    function &AddReview($CreatedOn,$ReviewText, $Status, $IPAddress,
                       $Priority, $ItemId,$ItemType,$CreatedById,$TextFormat=0,$Module)
    {
        global $objSession;
    	
    	$r = new clsItemReview(NULL,$this->SourceTable);     
        
        $ReviewText = str_replace("env=".$objSession->GetSessionKey(), "env=",$ReviewText);   
        //$r->debuglevel = 1;

        $r->Set(array("CreatedOn","ReviewText","Status", "IPAddress",
                      "Priority","ItemId","ItemType","CreatedById","TextFormat","Module"),
                array($CreatedOn,$ReviewText,$Status, $IPAddress,
                      $Priority, $ItemId,$ItemType,$CreatedById,$TextFormat,$Module));                      
        $r->Create();                
        array_push($this->Items,$r);
        if($Status==1)
        {
            $r->SendUserEventMail("REVIEW.ADD",$CreatedById);
            $r->SendAdminEventMail("REVIEW.ADD");      
        }
        else
        {
            $r->SendUserEventMail("REVIEW.ADD.PENDING",$CreatedById);
            $r->SendAdminEventMail("REVIEW.ADD.PENDING");      
        }

        return $r;
    }

    function EditReview($ReviewId,$CreatedOn,$ReviewText, $Status, 
                        $IPAddress, $Priority, $ItemId,$ItemType,$CreatedById,$TextFormat,$Module='')
    {
        global $objSession;
        
        $r = $this->GetItem($ReviewId);
        if($CreatedById==0)
          $CreatedById = $r->Get("CreatedById");
        $r->Set(array("ReviewId","CreatedOn","ReviewText","Status", 
                      "IPAddress", "Priority", "ItemId","ItemType","CreatedById","TextFormat"),
                array($ReviewId,$CreatedOn,$ReviewText,$Status,
                      $IPAddress, $Priority, $ItemId,$ItemType,$CreatedById,$TextFormat));
        if($Module) $r->Set('Module',$Module);
                      
        $r->Update();
        //$r->SendUserEventMail("REVIEW.MODIFY",$objSession->Get("PortalUserId"));
        $r->SendAdminEventMail("REVIEW.MODIFY");      
        return $r;
    }

    function DeleteReview($ReviewId)
    {
        $r = $this->GetItem($ReviewId);
        $r->Delete();
    }

    function CopyToItemId($OldId,$NewId)
    {
      $this->Clear();
      $this->Query_Review("ItemId=$OldId","");
      if($this->NumItems()>0)
      {
          foreach($this->Items as $i)
          {
              $i->Set("ItemId",$NewId);
              $i->UnsetIdField();
              $i->Create();
          }
      }
    }

    function CopyFromEditTable_Direct($idfield=null)
    {
    	global $objSession;
    	$GLOBALS['_CopyFromEditTable']=1;
    	//echo "ToLive [Reviews]<br>";
    	$edit_table = $objSession->GetEditTable($this->SourceTable);
    	$idlist = array();
    	$sql = 'SELECT * FROM '.$edit_table;
    	$this->Clear();
    	
    	// get all items in edit-table
    	$rs = $this->adodbConnection->Execute($sql);
    	while($rs && !$rs->EOF)
    	{
    		$data =& $rs->fields;
    		$c = $this->AddItemFromArray($data);
    		$c->Dirty();
    		$c->Update();
    		
    		$idlist[] = $c->Get("ReviewId");
    		$rs->MoveNext();
    	}
    	
    	//echo "DEL REVIEW SQL: $sql<br>";
    	
    	$this->PurgeEditTable();
    	
    	unset($GLOBALS['_CopyFromEditTable']);
    }
    
    function CopyFromEditTable($ResourceId, $saveEditTable = false)
    {
    	global $objSession;
    	$GLOBALS['_CopyFromEditTable']=1;
    	//echo "ToLive [Reviews]<br>";
    	$edit_table = $objSession->GetEditTable($this->SourceTable);
    	$idlist = array();
    	$sql = 'SELECT * FROM '.$edit_table.' WHERE ItemId = '.(int)$ResourceId;
    	$this->Clear();
    	// get all items in edit-table
    	$rs = $this->adodbConnection->Execute($sql);
    	while($rs && !$rs->EOF)
    	{
    		$data =& $rs->fields;

    		$c = $this->AddItemFromArray($data);

    		$c->Dirty();
    		if($data["ReviewId"]>0)
    		{
    			$c->Update();
    		}
    		else
    		{
    			$c->UnsetIdField();
    			$c->Create();
    		}
    		$idlist[] = $c->Get("ReviewId");
    		$rs->MoveNext();
    	}
    	//print_pre($idlist);
    	$sql = "DELETE FROM ".$this->SourceTable." WHERE ItemId=$ResourceId ".(count($idlist) > 0 ? "AND ReviewId NOT IN (".implode(",",$idlist).")" : "");
    	//echo "DEL REVIEW SQL: $sql<br>";
    	$this->adodbConnection->Execute($sql);
    	
    	if(!$saveEditTable) $this->PurgeEditTable();
    	
    	unset($GLOBALS['_CopyFromEditTable']);
    }

    function PurgeEditTable($idfield = null)
    {
    	$edit_table = $GLOBALS['objSession']->GetEditTable($this->SourceTable);
    	@$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$edit_table);
    }
    

    function GetPageLinkList(&$UpdateVar,$dest_template=NULL,$page = NULL,$PagesToList=10,$HideEmpty=TRUE)
    {
        global $objConfig, $var_list_update, $var_list;

        if(!strlen($page))
            $page = GetIndexURL(2);
        $PerPage = $objConfig->Get($this->PerPageVar);
        if($PerPage<1)
            $PerPage=20;
        $NumPages = ceil($this->GetNumPages($PerPage));

        if($NumPages==1 && $HideEmpty)
            return "";

        if(strlen($dest_template))
        {
            $var_list_update["t"] = $dest_template;
        }
        else
            $var_list_update["t"] = $var_list["t"];

        $o = "";
        if($this->Page>$NumPages)
            $this->Page=$NumPages;

        $StartPage = (int)$this->Page - ($PagesToList/2);
        if($StartPage<1)
            $StartPage=1;

        $EndPage = $StartPage+($PagesToList-1);
        if($EndPage>$NumPages)
        {
            $EndPage = $NumPages;
            $StartPage = $EndPage-($PagesToList-1);
            if($StartPage<1)
                $StartPage=1;
        }

        $o = "";
        if($StartPage>1)
        {
          $UpdateVar["rp"] = $this->Page-$PagesToList;
          $prev_url = $page."?env=".BuildEnv();
          $o .= "<A HREF=\"$prev_url\">&lt;&lt;</A>";
        }


        for($p=$StartPage;$p<=$EndPage;$p++)
        {
            if($p!=$this->Page)
            {
                $UpdateVar["rp"]=$p;
                $href = $page."?env=".BuildEnv();
                $o .= " <A HREF=\"$href\" >$p</A> ";
            }
            else
            {
                $o .= "$p";
            }
        }
        if($EndPage<$NumPages && $EndPage>0)
        {
          $UpdateVar["rp"]=$this->Page+$PagesToList;
          $next_url = $page."?env=".BuildEnv();
          $o .= "<A HREF=\"$next_url\"> &gt;&gt;</A>";
        }                               
        unset($UpdateVar,$var_list_update["t"] );
        return $o;       
    }
	
    function AdminPrintItems($template)
	{
	    // prints item listing for admin (browse/advanced view) tabs
	    $o = '<table border="0" cellspacing="2" width="100%"><tbody><tr>';
	
		$i = 1;
	    
	    $topleft		=	0;
	    $topright		=	0;
	    $rightcount		=	0;
	    $total_items	=	$this->NumItems();
	    $topleft		=	ceil($total_items / 2);
	    $topright		=	$total_items - $topleft;
	  
	    for($x = 0; $x < $topleft; $x++) 
	    {
	        //printingleft
	        $item = $this->Items[$x];
			if ($i > 2)
			{
				$o .= "</tr>\n<tr>";
				$i = 1;
			}
			$o .= $item->AdminParseTemplate($template);
			$i++;
	        
	        //printingright
	        if ($rightcount < $topright && ( ($x + $topleft) < $total_items) ) 
	        {
	            $item = $this->Items[ $x + $topleft ];
				if ($i > 2)
				{	
				    $o.="</tr>\n<tr>";
				    $i = 1;
				}
				$o .= $item->AdminParseTemplate($template);
				$i++;
	            $rightcount++;
	        }
	    }
		$o .= "\n</tr></tbody></table>\n";   

		return $o;
	}

} /*clsItemReviewList*/

?>