parses a microdata item out of an itemscope DOM node
function parseItem (node, currentItem) {
    // REMARK: note the raw dom node instead of $node to guarantee uniqueness
    if (currentItem && currentItem.hasMemoryOf(node)) {
      return Item.ERROR;
    }

    var $node = $(node);
    var type = splitUnique($node.attr('itemtype'));
    type = type && type.filter(isAbsoluteUrl);

    var item = new Item({
      type: type,
      id: $node.attr('itemid'),
      node: node,
      parent: currentItem
    });

    walkNodes($node.children(), item);

    // visit all nodes referenced by the current one
    var refs = splitUnique($node.attr('itemref'));
    if (refs) {
      var refsSelector = refs
        .map(function makeIdSelector (id) {
          return '#' + id;
        })
        .join(',');

      walkNodes($(refsSelector), item);
    }

    return item;
  }