var TkFragmentSegments = Class.create();
TkFragmentSegments.prototype = {
  initialize: function(assetPath, instance, currentSegment, options) {
    this.instance = instance;
    this.openChildren = [];
    this.currentParent = null;
    this.currentChild = null;
    this.currentSingle = null;
    this.currentShownContent = $('tkFragmentSegments_' + instance + '_initial_content');
    this.options = {
      className: 'tkFragmentSegments',
      imageChild: (assetPath + 'image/childArrow.gif'),
      imageChildOver: (assetPath + 'image/childArrowOver.gif'),
      imageParent: (assetPath + 'image/parentArrow.gif'),
      imageParentOver: (assetPath + 'image/parentArrowOver.gif'),
      imageSingle: (assetPath + 'image/singleArrow.gif'),
      imageSingleOver: (assetPath + 'image/singleArrowOver.gif')
    }
    Object.extend(this.options, options || {});

    var x = $('tkFragmentSegments_' + instance);
    if (x == null) return;
    var y = document.getElementsByClassName('tkFragmentSegmentsNavigation', x)[0];
    var z = $A(y.childNodes).select(function(element) {
      var tagName = element.tagName;
      return (tagName != null && tagName.toUpperCase() == 'DIV');
    });
    z.each(function(element) {
      if (Element.hasClassName(element, 'parent')) {
        var firstChild = element.firstChild;
        firstChild.onmouseover = this.onMouseOverParent.bindAsEventListener(this);
        firstChild.onmouseout = this.onMouseOutParent.bindAsEventListener(this);
        firstChild.onclick = this.onClickParent.bindAsEventListener(this);
      } else if (Element.hasClassName(element, 'child')) {
        var firstChild = element.firstChild;
        firstChild.onmouseover = this.onMouseOverChild.bindAsEventListener(this);
        firstChild.onmouseout = this.onMouseOutChild.bindAsEventListener(this);
        firstChild.onclick = this.onClickChild.bindAsEventListener(this);
      } else if (Element.hasClassName(element, 'single')) {
        var firstChild = element.firstChild;
        firstChild.onmouseover = this.onMouseOverSingle.bindAsEventListener(this);
        firstChild.onmouseout = this.onMouseOutSingle.bindAsEventListener(this);
        firstChild.onclick = this.onClickSingle.bindAsEventListener(this);
      }
    }.bind(this));

    if (currentSegment && currentSegment != 'initial') {
      var name = 'tkFragmentSegments_' + instance + '_' + currentSegment;
      this.currentShownContent = name + '_content';
      var element = $(name);
      if (Element.hasClassName(element, 'child')) {
        this.initialChild(element.firstChild);
      } else if (Element.hasClassName(element, 'single')) {
        this.initialSingle(element.firstChild);
      }
    }
  },

  closeOpenChildren: function() {
    this.openChildren.each(function(e) {
      Element.hide(e)
    });
    this.openChildren = [];
  },

  onMouseOverParent: function (event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageParentOver;
      Element.addClassName(element, 'over');
    }
  },

  onMouseOutParent: function(event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageParent;
      Element.removeClassName(element, 'over');
    }
  },
  
  onClickParent: function(event) {
    var element = this.eventElement(event);
    var id = element.parentNode.id;
    if (this.currentParent == element) {
      if ($(id + '_content') == null) return;
    }
    this.closeOpenChildren();
    this.releaseCurrentSingle(element);
    this.releaseCurrentChild(element);
    this.releaseCurrentParent(element);
    this.initialParent(element);
    var hasContent = this.showContent(element.parentNode.id);
    if (this.openChildren.length == 1 && !hasContent) {
      this.selectChild(this.openChildren[0].firstChild);
    }
  },

  initialParent: function(element) {
    element = $(element);
    var img = element.getElementsByTagName('img')[0];
    img.src = this.options.imageParentOver;
    Element.addClassName(element, 'on');
    this.currentParent = element;
    element = element.parentNode;
    element = element.nextSibling;
    while (element) {
      if (element.tagName) {
        if (Element.hasClassName(element, 'child')) {
          Element.show(element);
          this.openChildren.push(element);
        } else {
          break;
        }
      }
      element = element.nextSibling;
    }
  },

  releaseCurrentParent: function(element) {
    if (this.currentParent && this.currentParent != (element || null)) {
      var img = this.currentParent.getElementsByTagName('img')[0];
      img.src = this.options.imageParent;
      Element.removeClassName(this.currentParent, 'on');
      Element.removeClassName(this.currentParent, 'over');
      this.currentParent = null;
    }
  },

  onMouseOverChild: function(event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageChildOver;
      Element.addClassName(element, 'over');
    }
  },

  onMouseOutChild: function(event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageChild;
      Element.removeClassName(element, 'over');
    }
  },

  onClickChild: function(event) {
    this.selectChild(this.eventElement(event));
  },

  selectChild: function(element) {
    element = $(element);
    this.releaseCurrentChild(element);
    Element.addClassName(element, 'on');
    this.currentChild = element;
    this.showContent(element.parentNode.id);
    var img = element.getElementsByTagName('img')[0];
    img.src = this.options.imageChildOver;
  },

  initialChild: function(element) {
    var child = $(element);
    var img = child.getElementsByTagName('img')[0];
    img.src = this.options.imageChildOver;
    Element.addClassName(child, 'on');
    this.currentChild = child;

    var parent = child.parentNode.previousSibling;
    while (parent) {
      if (parent.tagName) {
        if (Element.hasClassName(parent, 'parent')) {
          break;
        }
      }
      parent = parent.previousSibling;
    }

    this.initialParent(parent.firstChild);
  },

  releaseCurrentChild: function(element) {
    if (this.currentChild && this.currentChild != (element || null)) {
      var img = this.currentChild.getElementsByTagName('img')[0];
      img.src = this.options.imageChild;
      Element.removeClassName(this.currentChild, 'on');
      Element.removeClassName(this.currentChild, 'over');
      this.currentChild = null;
    }
  },

  onMouseOverSingle: function (event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageSingleOver;
      Element.addClassName(element, 'over');
    }
  },

  onMouseOutSingle: function(event) {
    var element = this.eventElement(event);
    if (!Element.hasClassName(element, 'on')) {
      var img = element.getElementsByTagName('img')[0];
      img.src = this.options.imageSingle;
      Element.removeClassName(element, 'over');
    }
  },

  onClickSingle: function(event) {
    var element = this.eventElement(event);
    this.closeOpenChildren();
    this.releaseCurrentSingle(element);
    this.releaseCurrentChild(element);
    this.releaseCurrentParent(element);
    Element.addClassName(element, 'on');
    this.currentSingle = element;
    this.showContent(element.parentNode.id);
  },

  initialSingle: function(element) {
    element = $(element);
    var img = element.getElementsByTagName('img')[0];
    img.src = this.options.imageSingleOver;
    Element.addClassName(element, 'on');
    this.currentSingle = element;
  },

  releaseCurrentSingle: function(element) {
    if (this.currentSingle && this.currentSingle != (element || null)) {
      var img = this.currentSingle.getElementsByTagName('img')[0];
      img.src = this.options.imageSingle;
      Element.removeClassName(this.currentSingle, 'on');
      Element.removeClassName(this.currentSingle, 'over');
      this.currentSingle = null;
    }
  },

  showContent: function(name, allowMissing) {
    var content = $(name + '_content');
    allowMissing = allowMissing || false;
    if (content || allowMissing) {
      if (this.currentShownContent) {
        Element.hide(this.currentShownContent);
      }
      if (content) {
        Element.show(content);
        this.currentShownContent = content.id;
        return true;
      }
    }
    return false;
  },

  eventElement: function(event) {
    var element = Event.element(event);
    var tagName = element.tagName.toUpperCase();
    if (tagName == 'IMG' || tagName == 'A') {
      element = element.parentNode;
    }
    return element;
  }
}
