/**
  * Gets the transitions that are available for a document by virtue
  * of its workflow state, and also by virtue of the user that wishes
  * to perform the transition.
  *
  * In other words, ensures that the guard permission, role, group,
  * and/or user are met for the given user.
  */
 function getTransitionsForDocumentUser($oDocument, $oUser)
 {
     $oState = KTWorkflowUtil::getWorkflowStateForDocument($oDocument);
     if (is_null($oState) || PEAR::isError($oState)) {
         return $oState;
     }
     $aTransitions = KTWorkflowUtil::getTransitionsFrom($oState);
     $aEnabledTransitions = array();
     foreach ($aTransitions as $oTransition) {
         // keeping this around to make coding the replacements easier.
         /*
         $iPermissionId = $oTransition->getGuardPermissionId();
         if ($iPermissionId) {
             $oPermission =& KTPermission::get($iPermissionId);
             if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPermission, $oDocument)) {
                 continue;
             }
         }
         $iGroupId = $oTransition->getGuardGroupId();
         if ($iGroupId) {
             $oGroup =& Group::get($iGroupId);
             $res = GroupUtil::getMembershipReason($oUser, $oGroup);
             if (!is_string($res)) {
                 continue;
             }
         }
         $iRoleId = $oTransition->getGuardRoleId();
         if ($iRoleId) {
             $oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getFolderID(), $iRoleId);
         
             if ($oRoleAllocation == null) {   // no role allocation, no fulfillment.
                 continue;
             }
         
             if (!$oRoleAllocation->hasMember($oUser)) {
                 continue;
             }
         }
         
         $iConditionId = $oTransition->getGuardConditionId();
         if ($iConditionId) {
             if (!KTSearchUtil::testConditionOnDocument($iConditionId, $oDocument)) {
                 continue;
             }
         }
         */
         $aGuardTriggers = KTWorkflowUtil::getGuardTriggersForTransition($oTransition);
         if (PEAR::isError($aGuardTriggers)) {
             return $aGuardTriggers;
             // error out?
         }
         $bBreak = false;
         foreach ($aGuardTriggers as $oTrigger) {
             if (!$oTrigger->allowTransition($oDocument, $oUser)) {
                 $bBreak = true;
                 break;
             }
         }
         if ($bBreak) {
             continue;
         }
         $aEnabledTransitions[] = $oTransition;
     }
     return $aEnabledTransitions;
 }
 function &getBySourceState($oState)
 {
     return KTWorkflowUtil::getTransitionsFrom($oState);
 }