﻿function xFormElementIterator(element, mode) {
  this.element = element;
  this.mode    = mode;

  this.subIterator;
  this.currentKey;
  this.currentElement;

  this.resetIterator();
}
xFormElementIterator.ITERATE_CHILDREN   = 0;
xFormElementIterator.ITERATE_DESCENDANT = 1;

xFormElementIterator.prototype.hasMore = function() {
  return typeof this.currentElement !== 'undefined';
}
xFormElementIterator.prototype.getCurrent = function() {
  return this.currentElement;
}
xFormElementIterator.prototype.resetIterator = function() {
  this.currentKey     = -1;
  this.subIterator    = null;
  this.currentElement = this.element;
}
xFormElementIterator.prototype.nextElement = function() {
  if (this.mode == xFormElementIterator.ITERATE_CHILDREN) {
    this.currentKey++;
    this.currentElement = this.element.subElements[this.currentKey];
  } else {
    if (this.subIterator &&
        this.subIterator.hasMore()) {
      this.currentElement = this.subIterator.getCurrent();
      this.subIterator.nextElement();
    } else {
      this.currentKey++;
      this.subIterator    = new xFormElementIterator(this.element.subElements[this.currentKey]);
      this.currentElement = this.subIterator.getCurrent();
      if (this.subIterator.hasMore()) {
        this.subIterator.nextElement();  
      }
    }
  }
}