var MathMLFragments = {
    "annotation": "\
<semantics>\
  <mrow></mrow>\
  <annotation class='element text-container'></annotation>\
</semantics>",
    "annotation-xml": "\
<semantics>\
  <mrow></mrow>\
  <annotation-xml class='element text-container foreign-container'></annotation-xml>\
</semantics>",
    "maction": "\
<maction class='element' actiontype='statusline'>\
  <mrow class='mathml-container'></mrow>\
  <mtext class='text-container'></mtext>\
</maction>",
    "menclose": "<menclose class='element mathml-container'></menclose>",
    "merror": "<merror class='element mathml-container'></merror>",
    "mfrac": "\
<mfrac class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</mfrac>",
    "mi": "<mi class='element text-container foreign-container'></mi>",
    "mmultiscripts": "\
<mmultiscripts class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</mmultiscripts>",
    "mn": "<mn class='element text-container foreign-container'></mn>",
    "mo": "<mo class='element text-container foreign-container'></mo>",
    "mover": "\
<mover class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</mover>",
    "mpadded": "<mpadded class='element mathml-container'></mpadded>",
    "mphantom": "<mphantom class='element mathml-container'></mphantom>",
    "mprescripts": "\
<mmultiscripts>\
  <mrow class='mathml-container'></mrow>\
  <mprescripts class='element'/>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</mmultiscripts>",
    "mroot": "\
<mroot class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</mroot>",
    "mrow": "<mrow class='element mathml-container'></mrow>",
    "ms": "<ms class='element text-container foreign-container'></ms>",
    "mspace": "<mspace class='element'></mspace>",
    "msqrt": "<msqrt class='element mathml-container'></msqrt>",
    "mstyle": "<mstyle class='element mathml-container'></mstyle>",
    "msub": "\
<msub class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</msub>",
    "msubsup": "\
<msubsup class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</msubsup>",
    "msup": "\
<msup class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</msup>",
    "mtable": "\
<mtable class='element'>\
  <mtr>\
    <mtd class='mathml-container'>\
    </mtd>\
  </mtr>\
</mtable>",
    "mtd": "\
<mtable>\
  <mtr>\
    <mtd class='element mathml-container'>\
    </mtd>\
  </mtr>\
</mtable>",
    "mtext": "<mtext class='element text-container foreign-container'></mtext>",
    "mtr": "\
<mtable>\
  <mtr class='element'>\
    <mtd class='mathml-container'>\
    </mtd>\
  </mtr>\
</mtable>",
    "munder": "\
<munder class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</munder>",
    "munderover": "\
<munderover class='element'>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
  <mrow class='mathml-container'></mrow>\
</munderover>",
    "none": "\
<mmultiscripts>\
  <mrow class='mathml-container'></mrow>\
  <none class='element'/>\
  <mrow class='mathml-container'></mrow>\
</mmultiscripts>",
    "semantics": "\
<semantics class='element'>\
  <mrow class='mathml-container'></mrow>\
  <annotation class='text-container'></annotation>\
</semantics>"
};

var FragmentHelper = {
    mathml_namespace: "http://www.w3.org/1998/Math/MathML",

    createElement: function(tag) {
        return document.createElementNS(this.mathml_namespace, tag);
    },

    isValidChildOfMrow: function(tag) {
        return !(tag == "annotation" ||
                 tag == "annotation-xml" ||
                 tag == "mprescripts" ||
                 tag == "none" ||
                 tag == "mtr" ||
                 tag == "mtd");
    },

    isEmpty: function(tag) {
        return tag === "mspace" || tag == "mprescripts" || tag == "none";
    },

    element: function(fragment) {
        return fragment.getElementsByClassName('element')[0];
    },

    appendChild: function(fragment, allowInvalid) {
        var element = this.element(fragment) || fragment;
        if (element.classList.contains("foreign-container")) {
            var el = document.createElement("span");
            el.textContent = "a";
            return element.appendChild(el);
        }
        if (element.classList.contains("mathml-container") || allowInvalid) {
            var el = this.createElement("mi");
            el.textContent = "a";
            return element.appendChild(el);
        }
        throw "Cannot append child to the element";
    },

    forceNonEmptyElement: function(fragment) {
        var element = this.element(fragment) || fragment;
        if (element.firstElementChild)
            return element.firstElementChild;
        return this.appendChild(fragment);
    },

    forceNonEmptyDescendants: function(fragment) {
        var element = this.element(fragment) || fragment;
        if (element.classList.contains("mathml-container") ||
            element.classList.contains("foreign-container")) {
            for (var i = 0; i < 10; i++)
                this.appendChild(element);
            return;
        }
        var child = element.firstElementChild;
        if (child) {
            for (; child; child = child.nextElementSibling) {
                this.forceNonEmptyDescendants(child);
            }
            return;
        }
    },
}
