+var manipulate = function(e, params, action) {
+ var dom;
+ if(params instanceof DocumentElement) {
+ dom = params.dom()
+ } else {
+ dom = DocumentNodeElement.createDOM(params);
+ }
+ e.$element[action](dom);
+ return documentElementFromHTMLElement(dom);
+};
+
+$.extend(DocumentNodeElement.prototype, {
+ append: function(params) {
+ manipulate(this, params, 'append');
+ },
+ before: function(params) {
+ manipulate(this, params, 'before');
+
+ },
+ after: function(params) {
+ manipulate(this, params, 'after');
+ }
+});
+
+DocumentNodeElement.createDOM = function(params) {
+ var dom;
+ if(params.text) {
+ dom = $(document.createTextNode(params.text));
+ } else {
+ dom = $('<' + params.tag + '>');
+ if(params.klass)
+ dom.attr('class', params.klass);
+ }
+ return dom;
+};
+
+
+DocumentNodeElement.create = function(params) {
+ return documentElementFromHTMLElement(DocumentNodeElement.createDOM(params)[0]);
+};
+
+
+$.extend(DocumentTextElement.prototype, {
+ setText: function(text) {
+ this.$element[0].data = text;
+ },
+ getText: function() {
+ return this.$element.text();
+ },
+ after: function(params) {
+ if(params instanceof DocumentTextElement || params.text)
+ return false;
+ var dom;
+ if(params instanceof DocumentNodeElement) {
+ dom = params.dom();
+ } else {
+ dom = DocumentNodeElement.createDOM(params);
+ }
+ this.$element.wrap('<div>');
+ this.$element.parent().after(dom[0]);
+ this.$element.unwrap();
+ return documentElementFromHTMLElement(dom[0]);
+ },
+ wrapWithNodeElement: function(wlxmlNode) {
+ if(wlxmlNode.start && wlxmlNode.end) {
+ return this.canvas.wrapText({
+ inside: this.parent(),
+ textNodeIdx: this.parent().childIndex(this),
+ offsetStart: wlxmlNode.start,
+ offsetEnd: wlxmlNode.end,
+ _with: {tag: wlxmlNode.tag, klass: wlxmlNode.klass}
+ });
+ } else {
+ return DocumentElement.prototype.wrapWithNodeElement.call(this, wlxmlNode);
+ }
+ }
+});
+
+var documentElementFromHTMLElement = function(htmlElement, canvas) {
+ // if(!canvas)
+ // throw 'no canvas specified';