if (parent && parent.isRoot() && !options.rootAllowed) return undefined;
return parent;
},
- getPreviousSibling: function() {
+ getSiblingOffset: function(offset) {
var parent = this.getParent();
if (!parent) return undefined;
var index = parent.findChild(this.id);
- if (index < 0 || index === 0) return undefined;
- return parent.getChild(index - 1);
+ if (index < 0) return undefined;
+ var numChildren = parent.getChildrenCount();
+ var siblingIndex = index + offset;
+ if (siblingIndex < 0 || siblingIndex >= numChildren) return undefined;
+ return parent.getChild(siblingIndex);
+ },
+ getPreviousSibling: function() {
+ return this.getSiblingOffset(-1);
},
getNextSibling: function() {
- var parent = this.getParent();
- if (!parent) return undefined;
- var index = parent.findChild(this.id);
- var numChildren = parent.getChildrenCount();
- if (index < 0 || index === numChildren - 1) return undefined;
- return parent.getChild(index + 1);
+ return this.getSiblingOffset(1);
},
nextNode: function(options) {
options = _.defaults({}, options, {childrenAllowed: true});
if (parent && parent.isRoot() && !options.rootAllowed) return undefined;
return parent;
},
- getPreviousSibling: function() {
+ getSiblingOffset: function(offset) {
var parent = this.getParent();
if (!parent) return undefined;
var index = parent.findChild(this.id);
- if (index < 0 || index === 0) return undefined;
- return parent.getChild(index - 1);
+ if (index < 0) return undefined;
+ var numChildren = parent.getChildrenCount();
+ var siblingIndex = index + offset;
+ if (siblingIndex < 0 || siblingIndex >= numChildren) return undefined;
+ return parent.getChild(siblingIndex);
+ },
+ getPreviousSibling: function() {
+ return this.getSiblingOffset(-1);
},
getNextSibling: function() {
- var parent = this.getParent();
- if (!parent) return undefined;
- var index = parent.findChild(this.id);
- var numChildren = parent.getChildrenCount();
- if (index < 0 || index === numChildren - 1) return undefined;
- return parent.getChild(index + 1);
+ return this.getSiblingOffset(1);
},
nextNode: function(options) {
options = _.defaults({}, options, {childrenAllowed: true});
if (parent && parent.isRoot() && !options.rootAllowed) return undefined;
return parent;
},
- getPreviousSibling: function() {
+ getSiblingOffset: function(offset) {
var parent = this.getParent();
if (!parent) return undefined;
var index = parent.findChild(this.id);
- if (index < 0 || index === 0) return undefined;
- return parent.getChild(index - 1);
+ if (index < 0) return undefined;
+ var numChildren = parent.getChildrenCount();
+ var siblingIndex = index + offset;
+ if (siblingIndex < 0 || siblingIndex >= numChildren) return undefined;
+ return parent.getChild(siblingIndex);
+ },
+ getPreviousSibling: function() {
+ return this.getSiblingOffset(-1);
},
getNextSibling: function() {
- var parent = this.getParent();
- if (!parent) return undefined;
- var index = parent.findChild(this.id);
- var numChildren = parent.getChildrenCount();
- if (index < 0 || index === numChildren - 1) return undefined;
- return parent.getChild(index + 1);
+ return this.getSiblingOffset(1);
},
nextNode: function(options) {
options = _.defaults({}, options, {childrenAllowed: true});