'use strict';



var Parser = require('../tree_construction/parser'),

    ParsingUnit = require('./parsing_unit');



//API

exports.parseDocument = function (html, treeAdapter) {

    //NOTE: this should be reentrant, so we create new parser here

    var parser = new Parser(treeAdapter),

        parsingUnit = new ParsingUnit(parser);



    //NOTE: override parser loop method

    parser._runParsingLoop = function () {

        parsingUnit.parsingLoopLock = true;



        while (!parsingUnit.suspended && !this.stopped)

            this._iterateParsingLoop();



        parsingUnit.parsingLoopLock = false;



        if (this.stopped)

            parsingUnit.callback(this.document);

    };



    //NOTE: wait while parserController will be adopted by calling code, then

    //start parsing

    process.nextTick(function () {

        parser.parse(html);

    });



    return parsingUnit;

};



exports.parseInnerHtml = function (innerHtml, contextElement, treeAdapter) {

    //NOTE: this should be reentrant, so we create new parser here

    var parser = new Parser(treeAdapter);



    return parser.parseFragment(innerHtml, contextElement);

};