smartxml: handle insertAtIndex when index out of range
[fnpeditor.git] / src / smartxml / smartxml.js
index 01a0a2a..e3c831d 100644 (file)
@@ -6,7 +6,7 @@ define([
 ], function($, _, Backbone, events) {
     
 'use strict';
-
+/* globals Node */
 
 var TEXT_NODE = Node.TEXT_NODE;
 
@@ -82,7 +82,7 @@ $.extend(DocumentNode.prototype, {
     },
 
     sameNode: function(otherNode) {
-        return otherNode && this.nativeNode === otherNode.nativeNode;
+        return !!(otherNode) && this.nativeNode === otherNode.nativeNode;
     },
 
     parent: function() {
@@ -184,7 +184,7 @@ $.extend(ElementNode.prototype, {
 
     detach: function() {
         var next;
-        if(parent && this.isSurroundedByTextElements()) {
+        if(this.parent() && this.isSurroundedByTextElements()) {
             next = this.next();
             this.prev().appendText(next.getText());
             next.detach();
@@ -272,6 +272,15 @@ $.extend(ElementNode.prototype, {
         this._$.prepend(nativeNode);
     }),
 
+    insertAtIndex: function(nativeNode, index) {
+        var contents = this.contents();
+        if(index < contents.length) {
+            return contents[index].before(nativeNode);
+        } else if(index === contents.length) {
+            return this.append(nativeNode);
+        }
+    },
+
     unwrapContent: function() {
         var parent = this.parent();
         if(!parent) {
@@ -437,6 +446,7 @@ $.extend(Document.prototype, Backbone.Events, {
     createDocumentNode: function(from) {
         if(!(from instanceof Node)) {
             if(from.text !== undefined) {
+                /* globals document */
                 from = document.createTextNode(from.text);
             } else {
                 var node = $('<' + from.tagName + '>');
@@ -474,17 +484,17 @@ $.extend(Document.prototype, Backbone.Events, {
     },
 
     wrapNodes: function(params) {
-        if(!(params.element1.parent().sameNode(params.element2.parent()))) {
+        if(!(params.node1.parent().sameNode(params.node2.parent()))) {
             throw new Error('Wrapping non-sibling nodes not supported.');
         }
 
-        var parent = params.element1.parent(),
+        var parent = params.node1.parent(),
             parentContents = parent.contents(),
             wrapper = this.createDocumentNode({
                 tagName: params._with.tagName,
                 attrs: params._with.attrs}),
-            idx1 = parent.indexOf(params.element1),
-            idx2 = parent.indexOf(params.element2);
+            idx1 = parent.indexOf(params.node1),
+            idx2 = parent.indexOf(params.node2);
 
         if(idx1 > idx2) {
             var tmp = idx1;