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; } }
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; } } } }