/*

Module Dependencies

*/ var htmlparser = require('htmlparser2');

/*

Parser

*/ exports = module.exports = function(content, options) {

var dom = exports.evaluate(content, options),
    // Generic root element
    root = exports.evaluate('<root></root>', options)[0];

root.type = 'root';

// Update the dom using the root
exports.update(dom, root);

return root;

};

exports.evaluate = function(content, options) {

// options = options || $.fn.options;

var dom;

if (typeof content === 'string' || Buffer.isBuffer(content)) {
  dom = htmlparser.parseDOM(content, options);
} else {
  dom = content;
}

return dom;

};

/*

Update the dom structure, for one changed layer

*/ exports.update = function(arr, parent) {

// normalize
if (!Array.isArray(arr)) arr = [arr];

// Update parent
if (parent) {
  parent.children = arr;
} else {
  parent = null;
}

// Update neighbors
for (var i = 0; i < arr.length; i++) {
  var node = arr[i];

  // Cleanly remove existing nodes from their previous structures.
  var oldParent = node.parent || node.root,
      oldSiblings = oldParent && oldParent.children;
  if (oldSiblings && oldSiblings !== arr) {
    oldSiblings.splice(oldSiblings.indexOf(node), 1);
    if (node.prev) {
      node.prev.next = node.next;
    }
    if (node.next) {
      node.next.prev = node.prev;
    }
  }

  if (parent) {
    node.prev = arr[i - 1] || null;
    node.next = arr[i + 1] || null;
  } else {
    node.prev = node.next = null;
  }

  if (parent && parent.type === 'root') {
    node.root = parent;
    node.parent = null;
  } else {
    node.root = null;
    node.parent = parent;
  }
}

return parent;

};

// module.exports = $.extend(exports);