<?php

class clsPortalGroup extends clsParsedItem
{
   var $UserCount;

    function clsPortalGroup($GroupId=NULL)
    {
        $this->clsParsedItem($GroupId);
        $this->tablename=GetTablePrefix()."PortalGroup"; 
        $this->type=7;
        $this->BasePermission="GROUP";
        $this->id_field = "GroupId";
        if($GroupId)
            $this->LoadFromDatabase($GroupId);
    }

    function Validate()
    {
		global $objSession, $Errors;

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


	function HasSystemPermission($PermissionName)
    { 
		$GroupId = (int)$this->Get("GroupId");
		$sql = "SELECT * FROM ".GetTablePrefix()."Permissions WHERE GroupId=$GroupId AND Permission='$PermissionName' AND type=1";
        $result = $this->adodbConnection->Execute($sql);
        if($result && !$result->EOF)
        {
            $this->SysPermCache[$PermissionName] = (int)$result->fields["PermissionValue"];
            return (int)$result->fields["PermissionValue"];
        }
        else
            return -1;
    }

	/* set $Value to -1 to delete the permission row from the DB */
	function SetSystemPermission($PermName,$Value)
	{
      //echo "Setting $PermName to $Value<br>\n";
	  $oldval = $this->HasSystemPermission($PermName);
	  if($Value != $oldval)
	  {
        if($Value>-1)
	    {
          if($oldval>-1)
		  {
		    $sql = "UPDATE ".GetTablePrefix()."Permissions SET PermissionValue=$Value ";
			$sql .="  WHERE Type=1 AND Permission='$PermName' AND GroupId=".$this->Get("GroupId");
			
			//echo "UPDATE SQL: $sql<br>";
		  }
		  else
		  {
		    $sql = "INSERT INTO ".GetTablePrefix()."Permissions (Permission, GroupId, PermissionValue, Type, CatId) ";
			$sql .="VALUES ('$PermName',".$this->Get("GroupId").",$Value,1,0)";
			//echo "INSERT SQL: $sql<br>";
          }
		  $this->adodbConnection->Execute($sql);
          //echo $sql."<br>\n";
	    }
		else
		{
		  $sql = "DELETE FROM ".GetTablePrefix()."Permissions ";
          $sql .="  WHERE Type=1 AND Permission='$PermName' AND GroupId=".$this->Get("GroupId");
          //echo "DELETE SQL: $sql<br>";
		  $this->adodbConnection->Execute($sql);
		}
	  }
	}

    function CheckPermission($permissionName)
    {
        //Check permission and if needs approval set approval
		global $objSession, $Errors;

        if(!$objSession->HasSystemPermission($permissionName))
        {
           //$Errors->AddError("error.AccessDenied","","","",get_class($this),"CheckPermission");
           return false;
        }
        return true;
    }

    function LoadFromDatabase($Id)
    {		        
        global $Errors;

        if(!isset($Id))
        {
            $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
            return false;
        }
                
        $sql = "SELECT * FROM ".$this->tablename." WHERE GroupId = $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 AddUser($UserId,$PrimaryGroup=0,$edit_table = true)
	{
		global $objSession;
		
 	  	// add user to group OR just updates it's status there
 	  	$db =& $this->adodbConnection;
 	  	$table=$edit_table?$objSession->GetEditTable('UserGroup'):GetTablePrefix().'UserGroup';
 	  	
 	  	$group_id = $this->Get('GroupId');
 	  
 	  	$sql_patterns['check'] = 'SELECT PortalUserId FROM %s WHERE GroupId = %s AND PortalUserId = %s';
 	  	$sql_patterns['reset_primary'] = 'UPDATE %s SET PrimaryGroup = 0 WHERE PortalUserId = %s';
 	  	$sql_patterns['set_primary'] = 'UPDATE %s SET PrimaryGroup = 1 WHERE GroupId = %s AND PortalUserId = %s';
 	  	$sql_patterns['add_to_group'] = 'INSERT INTO %s (PortalUserId,GroupId,PrimaryGroup) VALUES (%s, %s, %s)';
 	  	
 	  	$tmp_sql = sprintf($sql_patterns['check'], $table, $group_id, $UserId);
      	$check_result = $db->GetOne($tmp_sql);
      	if(!$check_result)
	  	{
            // user is not a memeber of this group
            $GroupCount = TableCount($table,"PortalUserId = $UserId", 0);
            if(!$PrimaryGroup) $PrimaryGroup = ($GroupCount == 0) ? 1 : 0; // reset primary status if not already
            $tmp_sql = sprintf($sql_patterns['add_to_group'], $table, $UserId, $group_id, $PrimaryGroup);
			$db->Execute($tmp_sql);
	  	}
	  	
	  	if($PrimaryGroup)
        {
        	$tmp_sql = sprintf($sql_patterns['reset_primary'], $table, $UserId);
        	$db->Execute($tmp_sql);
        	
        	$tmp_sql = sprintf($sql_patterns['set_primary'], $table, $group_id, $UserId);
            $db->Execute($tmp_sql);
        }
	}	

    function DeleteUser($UserId)
    {
    	global $objSession;
    	
        $sql = "DELETE FROM ".$objSession->GetEditTable("UserGroup")." WHERE PortalUserId=$UserId AND GroupId=".$this->Get("GroupId");        
        $this->adodbConnection->Execute($sql);
    }
    

    function GetCustomField( $fieldName)
    {
        global $Errors;

        if(!isset($this->m_UserId))
        {
           $Errors->AddError("error.AppError",NULL,"Get field is required in order to set custom field values","","clsPortalGroup","GetCustomField");
           return false;
        }

        return GetCustomFieldValue($this->m_UserId,"portaluser",$fieldName);
    }
     
    function SetCustomField( $fieldName, $value)
    {
		global $Errors;	
        if(!isset($this->m_UserId))
        {
           $Errors->AddError("error.AppError",NULL,"Set field is required in order to set custom field values","","clsPortalGroup","SetCustomField");
           return false;
        }
        return SetCustomFieldValue($this->m_UserId,"portaluser",$fieldName,$value);
    }

    function GetUserCount()
    {
        if(!is_numeric($this->UserCount))
        {
            $sql = "SELECT count(*) as UserCount FROM ".GetTablePrefix()."UserGroup WHERE GroupId=".$this->Get("GroupId");
            $rs = $this->adodbConnection->Execute($sql);
            if($rs && !$rs->EOF)
                $users = $rs->fields["UserCount"];
            $this->UserCount = (int)$users;
        }
        return $this->UserCount;
    }

    function GetUserList($edit_table = false)
    {
    	global $objSession;
    	
    	$table = $edit_table ? $objSession->GetEditTable('UserGroup') : GetTablePrefix().'UserGroup';
    	
        $sql = 'SELECT PortalUserId FROM '.$table.' WHERE GroupId = '.$this->UniqueId(); // Get('GroupId');
        return $this->adodbConnection->GetCol($sql);
    }

    function parsetag($tag)
    {
        global $var_list_update, $objConfig, $objSession;
        $tagname = is_object($tag) ? $tag->name : $tag;
        
        $is_temp = strpos($this->SourceTable, $objSession->Get('SessionKey') ) !== false;
        
        switch($tagname)
        {	
			case 'GroupName':
				$db =& GetADODBConnection();
				$table = $is_temp ? $objSession->GetEditTable('PortalGroup') : GetTablePrefix().'PortalGroup';
				$sql = 'SELECT Name FROM '.$table.' WHERE GroupId = '.$this->Get('GroupId');
				return $db->GetOne($sql);
            	break;
 			
            case 'membership_expires_date':
				return $this->Get('MembershipExpires') <= 0 ? '' : LangDate( $this->Get('MembershipExpires'), 0, true );
                break;
                
            case 'membership_expires_time':
				return $this->Get('MembershipExpires') <= 0 ? '' : LangTime( $this->Get('MembershipExpires'), 0, true );
                break; 
                            
		    case "group_id":
                return $this->Get("GroupId");
                break;
		    case "group_name":
                return $this->Get("Name");
                break;
		    case "group_desc":
                return $this->Get("Description");
                break;
		    case "group_date":
                return LangDate($this->Get("CreatedOn"));
                break;
		    case "group_name":
                return $this->Get("Name");
                break;
		    case "group_enabled":
                return $this->Get("Enabled");
                break;
		    case "group_date_month":
                return adodb_date("m", $this->Get("CreatedOn"));
                break;		
		    case "group_date_day":
                return adodb_date("d", $this->Get("CreatedOn"));
                break;		
		    case "group_date_year":
                return adodb_date("Y", $this->Get("CreatedOn"));
                break;	
		    case "group_system":
                if ($this->Get("System") == 1)
                    return "System";
                else
                    return "User Defined";
                break;
		    case "group_status":
                if ($this->Get("Enabled") == 1)
                    return "Enabled";
                else
                    return "Disabled";		
                break;	
                default:
                    if (substr($tag, 0, 6) == "custom")
                        return Users_Custom($this->Get("ResourceId"), $tag);
                    else
                        return "Undefined:$tagname";
                    break;
        }
    }
}

class clsGroupList extends clsItemCollection
{
    var $Page;

    function clsGroupList()
    {
        $this->clsItemCollection();
        $this->classname = "clsPortalGroup";
        $this->SetTable('live', GetTablePrefix()."PortalGroup");
        $this->AdminSearchFields = array("name");
        $this->id_field = "GroupId";
    }
    function NumGroups()
    {
        return $this->NumItems();
    }

    function GetGroup($GroupID)
    {
        return $this->GetItem($GroupID);
    }

    function GetPersonalGroup($UserLogin)
    {
	    $n = "_".$UserLogin;
        $g = $this->GetItemByField("Name",$n);
        return $g;
    }

    function LoadGroups($where = "",$orderBy = "")
    {
        global $objConfig;

        $this->Clear();
        if($this->Page<1)
            $this->Page=1;

		if(is_numeric($objConfig->Get("Perpage_Groups")))
		{
			$Start = ($this->Page-1)*$objConfig->Get("Perpage_Groups");
			$limit = "LIMIT ".$Start.",".$objConfig->Get("Perpage_Groups");
		}
		else
			$limit = NULL;
		
		if(strlen($where) == 0) $where = '1';
		$this->QueryItemCount=TableCount($this->SourceTable, $where, 0);
        //echo $this->QueryItemCount."<br>\n";

			if ($orderBy!="")
			{
				$this->Query_PortalGroup($where,$orderBy,$limit);
			}
			else
			{
				$this->Query_PortalGroup($where,"Name DESC",$limit);
			}

	}

    function Query_PortalGroup($whereClause=NULL,$orderByClause=NULL,$limit=null)
    {
        global $m_var_list,$objSession,$Errors;

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

        if(strlen($whereClause))
            $sql = sprintf('%s WHERE %s',$sql,$whereClause);

        if(strlen($orderByClause))
            if(strlen(trim($orderByClause)))
              $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause);
		
		if( isset($limit) ) $sql .= ' '.$limit;
        return $this->Query_Item($sql);    
    }    

    function Query_UserPortalGroup($whereClause,$orderByClause)
    { 
        global $m_var_list,$objSession,$Errors;
    
        if ($m_var_list["action"] == "m_group_search")
            $table = $userSession->Get("SessionKey") . "_search";
        else
            $table = $this->SourceTable;
	
        $sql = "SELECT * FROM $table LEFT JOIN UserGroup USING (GroupId) ";
    
        if(isset($whereClause))
            $sql = sprintf('%s WHERE %s',$sql,$whereClause);
    
        if(isset($orderByClause))
            if (strlen(trim($orderByClause))) 
            {           
              $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause);
            }
        $result = $this->adodbConnection->Execute($sql);
    
        return $this->Query_Item($sql);    
    }

    function GetAllGroupList()
    {
    	static $GroupListCache;
    	
    	if(!is_array($GroupListCache))
    	{
          $GroupListCache = array();
          $sql = "SELECT GroupId FROM ".$this->SourceTable." WHERE Enabled=1";

          $rs = $this->adodbConnection->Execute($sql);
          while($rs && !$rs->EOF)
          {
            $GroupListCache[] = $rs->fields["GroupId"];
            $rs->MoveNext();
          }
    	}
        return $GroupListCache;
    }

    function Group_Custom($ResourceId, $tag)    
    {        
        $fieldname= substr($tag, 7);

        $sql = "SELECT Value FROM ".GetTablePrefix()."CustomMetaData LEFT JOIN ".GetTablePrefix()."CustomField USING (CustomFieldId) where ".GetTablePrefix()."CustomMetaData.ResourceId=$ResourceId AND ".GetTablePrefix()."CustomField.FieldName='$fieldname'";
	
        $result = $this->adodbConnection->Execute($sql);
    
        if ($result->EOF)
            return "";
        else
            return $result->fields["Value"];
    }

    function Add_Users_To_Group($groupid)
    {	
        global $g_usergroup_status;
        $userids = explode("-", $g_usergroup_status);
        $g = $this->GetItem($groupid);
        foreach($userids as $userid)
            $g->AddUser($userid);
    }

    function Delete_Group($GroupId)
    {
        $g = $this->GetItem($GroupId);
        if(is_object($g))
        {
           $g->Delete();
        }
    }

    function Edit_Group($GroupId, $Name, $Description)
    {
        $g = $this->GetItem($GroupId);
        $g->Set(array("Name", "Description"), array($Name, $Description));
        $g->Update();
        return $g;
    }

    function &Add_Group($Name, $Description, $System=1)
    {
        $g = new clsPortalGroup(NULL);
        $g->tablename = $this->SourceTable;
        $g->Set(array("Name", "Description", "System"),array($Name, $Description,$System));
        $g->Set("CreatedOn",adodb_date("U"));
        $g->Create();
        return $g;
    }
    
    function CopyFromEditTable($idfield)
    {
        global $objSession;
		$GLOBALS['_CopyFromEditTable']=1;

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

        $item_ids = Array();
        $rs = $this->adodbConnection->Execute($sql);
        while ($rs && !$rs->EOF) {
            $data = $rs->fields;            
            $c = new $this->classname;
            $c->SetFromArray($data);
            $c->idfield = $idfield;
            $c->Dirty();
            if($c->Get($idfield)<1)
            {
               $old_id = $c->Get($idfield);
               $c->UnsetIdField();
               if(!is_numeric($c->Get("OrgId")))
                   $c->Clean(array("OrgId"));
               $c->Create();
               $sql = "UPDATE ".GetTablePrefix()."UserGroup SET GroupId=".$c->Get("GroupId")." WHERE GroupId=$old_id";
               $this->adodbConnection->Execute($sql);
               $sql = "UPDATE ".GetTablePrefix()."Permissions SET GroupId=".$c->Get("GroupId")." WHERE GroupId=$old_id";
               $this->adodbConnection->Execute($sql);
            }
            $c->Update();
            $item_ids[] = $c->UniqueId();
            unset($c);
            unset($r);
            $rs->MoveNext();
        }
        @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
		unset($GLOBALS['_CopyFromEditTable']);
		return $item_ids;
    }    

    function PurgeEditTable($idfield)
    {
      global $objSession;

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

      $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE GroupId<1";
      $this->adodbConnection->Execute($sql);
      $sql = "DELETE FROM ".GetTablePrefix()."Permissions WHERE GroupId<1";
      $this->adodbConnection->Execute($sql);      
      
    }
}

class clsUserGroupList extends clsItemCollection
{
    function clsUserGroupList()
    {
        $this->clsItemCollection();
        $this->classname = "clsPortalGroup";
        $this->SetTable('live', GetTablePrefix()."UserGroup");
        $this->id_field = "PortalUserId"; // don't try to insert by this ID :)
    }
    
    function CopyFromEditTable($idfield)
    {
    	global $objSession;
    	$GLOBALS['_CopyFromEditTable']=1;

    	$edit_table = $objSession->GetEditTable($this->SourceTable);
    	$sql = "SELECT * FROM $edit_table";
    	$rs = $this->adodbConnection->Execute($sql);

    	//echo $sql."<BR>";

    	$clear_old = true;
    	$insert_sql = 'INSERT INTO %s (PortalUserId,GroupId,MembershipExpires,PrimaryGroup) VALUES (%s,%s,%s,%s)';
    	while($rs && !$rs->EOF)
    	{
    		$data = $rs->fields;

    		if($clear_old)
    		{
    			$sql = "DELETE FROM ".$this->SourceTable." WHERE $idfield = ".$data[$idfield];
    			@$this->adodbConnection->Execute($sql);
    			$clear_old = false;
    		}

    		if(!$data['MembershipExpires']) $data['MembershipExpires'] = 'NULL';
    		$sql = sprintf($insert_sql, $this->SourceTable, $data['PortalUserId'], $data['GroupId'], $data['MembershipExpires'], $data['PrimaryGroup'] );

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

    		$rs->MoveNext();
    	}

    	@$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
    	unset($GLOBALS['_CopyFromEditTable']);
    }
    
    function &Edit_UserGroup($group_id, $user_id, $membership_expires)
    {
    	$ug =& $this->GetItemByField( Array('GroupId','PortalUserId'), Array($group_id,$user_id) );
        if($membership_expires == 0) $membership_expires = null;
    	
        $ug->Set('MembershipExpires', $membership_expires);
        $ug->Update();	
        return $ug;
    }
}

?>