Element.prototype.getInnerXML = function()  {
    var markup = "";
    function getMarkupFor( currentNode ) {
        var kids = currentNode.childNodes;
        for ( var i = 0; i < kids.length; i++ ) {
            if ( kids[i].nodeType == 3 ) {
                markup += kids[i].nodeValue;
            } else if ( kids[i].nodeType == 4 ) {
                markup += unescape("%3C!%5BCDATA%5B");
                markup += kids[i].nodeValue;
                markup += unescape("%5D%5D%3E");
            } else if ( kids[i].nodeType == 8 ) {
                markup += unescape("%3C%21%2D%2D");
                markup += kids[i].nodeValue;
                markup += unescape("%2D%2D%3E");
            } else {
                markup += "<";
                if ( kids[i].nodeType == 7 ) {
                    markup += "?";
                    markup += kids[i].target;
                    markup += " ";
                    markup += kids[i].data;
                    markup += "?>";
                } else {
                    markup += kids[i].tagName.toLowerCase();
                    var attrs = kids[i].attributes;
                    for ( var a = 0; a < attrs.length; a++ ) {
                        markup += " ";
                        markup += attrs[a].nodeName.toLowerCase();
                        markup += "=\"";
                        markup += attrs[a].nodeValue.replace(/\"/g,"&quot;");
                        markup += "\"";
                    }
                    if ( !kids[i].hasChildNodes() ) {
                        markup += "/>";
                    } else {
                        markup += ">";
                        getMarkupFor( kids[i] );
                        markup += "<";
                        markup += "/";
                        markup += kids[i].tagName.toLowerCase();
                        markup += ">";
                    }
                }
            }
        }
    }
    getMarkupFor( this );
    return markup;
};

Element.prototype.setInnerXML = function( markup ) {
    var docfrag = new DOMParser().parseFromString( markup, "application/xml" ); 
    while ( this.hasChildNodes() ) {
        this.removeChild( this.lastChild );
    }
    this.appendChild( this.ownerDocument.importNode( docfrag.documentElement, true ) );
};

Element.prototype.getOuterXML = function()  {
    var markup = "<";
    markup += this.tagName.toLowerCase();
    var mainattrs = this.attributes;
    for (var z = 0; z < mainattrs.length; z++ ) {
        markup += " ";
        markup += mainattrs[z].nodeName.toLowerCase();
        markup += "=\"";
        markup += mainattrs[z].nodeValue.replace(/\"/g,"&quot;");
        markup += "\"";
    }
    var maintn = this.tagName.toLowerCase();
    if ( !this.hasChildNodes() ) {
        markup += " />";
        return markup;
    } else {
        markup += ">";
    }
    markup += this.getInnerXML();
    markup += "</";
    markup += this.tagName.toLowerCase();
    markup += ">";
    return markup;
};
