function is_empty(node) {
  if (node.nodeType != 8) {
    if (node.nodeType == 3) {
      var str = node.data.replace(/[\t|\n|\r|\r\n| ]/g, '');

      var i = 0;
      while (str.charAt(i) == ' ') {
        str = str.substring(1, str.length);
        i++;
      }

      i = str.length - 1;
      while (str.charAt(i) == ' ') {
        str = str.substring(0, i);
        i--;
      }

      if (str != '') {
        return false
      } else {
        return true;
      }
    }
    return false;
  }

  return true;
}

function first_child(node) {
  var child = node.firstChild;

  while (child) {
    if (!is_empty(child)) return child;
    child = child.nextSibling;
  }
  return null;
}

function previous_sibling(node) {
  var sibling = node.previousSibling;

  while (sibling) {
    if (!is_empty(sibling)) return sibling;
    sibling = sibling.previousSibling;
  }
  return null;
}

function next_sibling(node) {
  var sibling = node.nextSibling;

  while (sibling) {
    if (!is_empty(sibling)) return sibling;
    sibling = sibling.nextSibling;
  }
  return null;
}