/* // non-query dom functions used // .nextElementSibling - property has the next sibling // .children - property has all children // .parentNode - property contains parent element // // Algorithm: // to move to the next element in the tree // if there are children: move down to the first child // if there are siblings: move to the next one // if there are no siblings: move up until on a level with siblings, them move to the next sibling // Called repeateedly with the current node, this performs a pre-order traversal. */ function moveNext(elem) { // if there is a child, move down // children returns child elements, but not text nodes if (elem.children.length) return elem.children[0]; // if there is a sibling, move across if (elem.nextElementSibling) return elem.nextElementSibling; // move up to the first sibling of the next parent with a sibling next = elem.parentNode; while (next && !(next.nextElementSibling)) next = next.parentNode; // if we found a parent with a sibling, return the sibling if (next) return next.nextElementSibling; // else we have walked the whole tree, return null to indicate completion return null; // which is also what next is }