Find any DOM element from a starting point

by Kevin Van Lierde

HTML

<ul>
  <li>
    <a>
      <img src="" />
    </a>
    <button>click me</button>
  </li>
  <li>
    <button>click me 2</button>
    <a>
      <img src="" />
    </a>
    <button>click me 2</button>
  </li>
  ...
</ul>

JavaScript

var domUtils = {
		findPrevElementNode: function(referenceNode, truthTest, limitNode) {
			var element = 1, 
                iterations = 0,
                limit = limitNode || document.body,
			    node = referenceNode;
			while (!truthTest(node) && node !== limit) {
				if (node.previousSibling) {
					node = node.previousSibling;
                    iterations++;
					if (node.lastChild) {
                        while (node.lastChild) {
							node = node.lastChild;
                            iterations++;
						}
					}
				} else {
                    if (node.parentNode) {
						node = node.parentNode;
                        iterations++;
                    } else {
                        return false;
                    }
				}
			}
            return {match: node === limit ? false : node, iterations: iterations};
		},
        findNextElementNode: function(referenceNode, truthTest, limitNode) {
			var element = 1, 
                iterations = 0,
                limit = limitNode || document.body,
				node = referenceNode;
			while (!truthTest(node) && node !== limit) {
				if (node.nextSibling) {
					node = node.nextSibling;
                    iterations++;
					if (node.firstChild) {
						while (node.firstChild) {
							node = node.firstChild;
                            iterations++;
						}
					}
				} else {
					if (node.parentNode) {
						node = node.parentNode;
                        iterations++;
                    } else {
                        return false;
                    }
				}
			}
            return {match: node === limit ? false : node, iterations: iterations};
		}
};
var a = domUtils.findNextElementNode(
    document.getElementsByTagName('a')[1], 
     function(node) { return (node.nodeName === 'BUTTON'); }
);
var b = domUtils.findPrevElementNode(
    document.getElementsByTagName('a')[1], 
     function(node) { return (node.nodeName === 'BUTTON'); }
);
console.log(a);
console.log(b);
if (a.match)
   ...