Exemplo n.º 1
0
function scorm_seq_flow($activity, $direction, $seq, $childrenflag, $userid)
{
    // TODO: $PREVDIRECTION NOT DEFINED YET.
    $prevdirection = null;
    $seq = scorm_seq_flow_tree_traversal($activity, $direction, $childrenflag, $prevdirection, $seq, $userid);
    if ($seq->nextactivity == null) {
        $seq->nextactivity = $activity;
        $seq->deliverable = false;
        return $seq;
    } else {
        $activity = $seq->nextactivity;
        $seq = scorm_seq_flow_activity_traversal($activity, $userid, $direction, $childrenflag, null, $seq, $userid);
        return $seq;
    }
}
Exemplo n.º 2
0
function scorm_seq_flow_tree_traversal($activity, $direction, $childrenflag, $prevdirection, $seq, $userid)
{
    $revdirection = false;
    $parent = scorm_get_parent($activity);
    $children = scorm_get_available_children($parent);
    $siz = sizeof($children);
    if ($prevdirection != null && $prevdirection == 'backward' && $children[$siz - 1]->id == $activity->id) {
        $direction = 'backward';
        $children[0] = $activity;
        $revdirection = true;
    }
    if ($direction = 'forward') {
        $ancestors = scorm_get_ancestors($activity);
        $ancestorsroot = array_reverse($ancestors);
        $preorder = scorm_get_preorder($ancestorsroot);
        $siz = sizeof($preorder);
        if ($activity->id == $preorder[$siz - 1]->id || $activity->parent == '/' && !$childrenflag) {
            scorm_seq_terminate_descent($ancestorsroot, $userid);
            $seq->endsession = true;
            $seq->nextactivity = null;
            return $seq;
        }
        if (scorm_is_leaf($activity) || !$childrenflag) {
            if ($children[$siz - 1]->id == $activity->id) {
                $seq = scorm_seq_flow_tree_traversal($parent, $direction, false, null, $seq, $userid);
                // I think it's not necessary to do a return in here
            } else {
                $parent = scorm_get_parent($activity);
                $children = scorm_get_available_children($parent);
                $seq->traversaldir = $direction;
                $sib = scorm_get_siblings($activity);
                $pos = array_search($sib, $activity);
                if ($pos !== false) {
                    if ($pos != sizeof($sib)) {
                        $seq->nextactivity = $sib[$pos + 1];
                        return $seq;
                    } else {
                        $ch = scorm_get_children($sib[0]);
                        $seq->nextactivity = $ch[0];
                        return $seq;
                    }
                }
            }
        } else {
            if (!empty($children)) {
                $seq->traversaldir = $direction;
                $seq->nextactivity = $children[0];
                return $seq;
            } else {
                $seq->traversaldir = null;
                $seq->nextactivity = $children[0];
                $seq->exception = 'SB.2.1-2';
                return $seq;
            }
        }
    }
    if ($direction = 'backward') {
        if ($activity->parent == '/') {
            $seq->traversaldir = null;
            $seq->nextactivity = null;
            $seq->exception = 'SB.2.1-3';
            return $seq;
        }
        if (scorm_is_leaf($activity) || !$childrenflag) {
            if (!$revdirection) {
                if (isset($parent->forwardonly) && $parent->forwardonly == true) {
                    $seq->traversaldir = null;
                    $seq->nextactivity = null;
                    $seq->exception = 'SB.2.1-4';
                    return $seq;
                }
            }
            if ($children[0]->id == $activity->id) {
                $seq = scorm_seq_flow_tree_traversal($parent, 'backward', false, null, $seq);
                return $seq;
            } else {
                $ancestors = scorm_get_ancestors($activity);
                $ancestorsroot = array_reverse($ancestors);
                $preorder = scorm_get_preorder($ancestorsroot);
                $pos = array_search($preorder, $children[$siz]);
                $preord = array_slice($preorder, 0, $pos - 1);
                $revpreorder = array_reverse($preord);
                $position = array_search($revpreorder, $activity);
                $seq->nextactivity = $revpreorder[$pos + 1];
                $seq->traversaldir = $direction;
                return $seq;
            }
        } else {
            if (!empty($children)) {
                $activity = scorm_get_sco($activity->id);
                if (isset($parent->flow) && $parent->flow == true) {
                    $children = scorm_get_children($activity);
                    $seq->traversaldir = 'forward';
                    $seq->nextactivity = $children[0];
                    return $seq;
                } else {
                    $children = scorm_get_children($activity);
                    $seq->traversaldir = 'backward';
                    $seq->nextactivity = $children[sizeof($children) - 1];
                    return $seq;
                }
            } else {
                $seq->traversaldir = null;
                $seq->nextactivity = null;
                $seq->exception = 'SB.2.1-2';
                return $seq;
            }
        }
    }
}