﻿function fixBits() {
    document.write = function (str) {
        var moz = !window.opera && !/Apple/.test(navigator.vendor);

        // Watch for writing out closing tags, we just
        // ignore these (as we auto-generate our own)
        if (str.match(/^<\//)) return;

        // Make sure & are formatted properly, but Opera
        // messes this up and just ignores it
        if (!window.opera)
            str = str.replace(/&(?![#a-z0-9]+;)/g, "&amp;");

        // Watch for when no closing tag is provided
        // (Only does one element, quite weak)
        str = str.replace(/<([a-z]+)(.*[^\/])>$/, "<$1$2></$1>");

        // Mozilla assumes that everything in XHTML innerHTML
        // is actually XHTML - Opera and Safari assume that it's XML
        if (!moz)
            str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'");

        // The HTML needs to be within a XHTML element
        var div = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
        div.innerHTML = str;

        // Find the last element in the document
        var pos;

        // Opera and Safari treat getElementsByTagName("*") accurately
        // always including the last element on the page
        if (!moz) {
            pos = document.getElementsByTagName("*");
            pos = pos[pos.length - 1];

            // Mozilla does not, we have to traverse manually
        } else {
            pos = document;
            while (pos.lastChild && pos.lastChild.nodeType == 1)
                pos = pos.lastChild;
        }

        // Add all the nodes in that position
        var nodes = div.childNodes;
        while (nodes.length)
            pos.parentNode.appendChild(nodes[0]);
    };
};
