var KimiHistory = new Class({
  initialize: function(element) {
    this.element                      = element;
    this.selected_revision_container  = $$(".selected_kimi_revision")[0];
    this.main_revision                = this.selected_revision_container.getElement(".main");
    this.image                        = this.main_revision.getElement("img");
    this.page                         = this.main_revision.getElement(".page #viewKimiPageContainer");
    this.version                      = this.main_revision.getElement(".version");
    this.created                      = this.main_revision.getElement(".created");
    this.author                       = this.main_revision.getElement(".author");
    this.revert_link                  = this.main_revision.getElement(".actions .revert");
    this.revert_link_revision         = this.revert_link.getElement(".revision");
    this.jump_link                    = this.main_revision.getElement(".actions .jump");
    this.jump_link_revision           = this.jump_link.getElement(".revision");
    this.compare_revision             = this.selected_revision_container.getElement(".compare");
    this.compare_image                = this.compare_revision.getElement("img");
    this.compare_page                 = this.compare_revision.getElement(".page #viewKimiPageContainer");
    this.compare_version              = this.compare_revision.getElement(".version");
    this.compare_created              = this.compare_revision.getElement(".created");
    this.compare_author               = this.compare_revision.getElement(".author");
    this.compare_revert_link          = this.compare_revision.getElement(".actions .revert");
    this.compare_revert_link_revision = this.compare_revert_link.getElement(".revision");
    this.compare_jump_link            = this.compare_revision.getElement(".actions .jump");
    this.compare_jump_link_revision   = this.compare_jump_link.getElement(".revision");

    var compare_method_control = $$(".compare_method input[checked]")[0];
    this.compare_method               = compare_method_control ? compare_method_control.getProperty("value") : null;
    this.selected_revision_container.addClass(this.compare_method);

    this.compare_effects = [];
    $$(".compare_method input").each(function(input) {
      input.addEvent("change", function() {
        this.selected_revision_container.removeClass(this.compare_method);
        this.compare_method = input.getProperty("value");
        this.selected_revision_container.addClass(this.compare_method);
        if(this.selected_revision_container.hasClass("compare")) {
          if(this.compare_method == "fade_in_out") {
            this.fadeToCompareRevision();
          } else {
            this.stopFadeInAndOutCompareMethod();
            this.compare_revision.setStyle("opacity", 1);
          }
        }
      }.bind(this));
    }.bind(this));
    
    this.revisions = this.element.getElements(".kimi_revision");
    this.revisions.each(function(revision) {
      revision.addEvent("click", this.setCurrentRevision.bind(this, revision));
      var compare_control = revision.getElement(".compare");
      if(compare_control) {
        compare_control.addEvent("click", function(event) {
          new Event(event).stopPropagation();
          this.setCompareRevision(revision);
        }.bind(this));
      }
    }.bind(this));
    
    [this.jump_link, this.compare_jump_link].each(function(jump_link) {
      jump_link.addEvent("click", function() {
        var selected_revision = this.revisions.filter(function(revision) { return revision.hasClass("selected"); })[0];
        var original_revision = this.revisions.filter(function(revision) { return revision.getProperty("data-revision") == selected_revision.getProperty("data-revert-revision"); })[0];
        this.setCurrentRevision(original_revision);
      }.bind(this));
    }.bind(this));

    this.setCurrentRevision(this.revisions[0], true);
  },
  
  setCurrentRevision: function(revision, skip_kimi_page_setup) {
    this.revisions.removeClass("selected");
    revision.addClass("selected");
    if(revision.getProperty("data-image")) {
      this.image.setProperty("src", revision.getProperty("data-image"));
    } else {
      this.page.setHTML(revision.getProperty("data-page"));
      if(!skip_kimi_page_setup) { setupKimiPage(); }
    }
    this.version.setHTML(revision.getElement(".version").innerHTML);
    this.created.setHTML(revision.getProperty("data-created"));
    this.author.setHTML(revision.getProperty("data-author"));
    this.revert_link.setProperty("href", revision.getProperty("data-revert-url"));
    this.revert_link_revision.setHTML(revision.getProperty("data-revision"));
    this.jump_link_revision.setHTML(revision.getProperty("data-revert-revision"));

    this.main_revision.removeClass("current");
    this.main_revision.removeClass("revert");
    if(revision.getProperty("data-current") == "true") {
      this.main_revision.addClass("current");
    } else if(revision.getProperty("data-revert-revision")) {
      this.main_revision.addClass("revert");
    }
    
    this.setCompareRevision(null);
  },
  
  setCompareRevision: function(revision) {
    if(!revision) {
      this.stopFadeInAndOutCompareMethod();
      this.selected_revision_container.removeClass("compare");
      this.revisions.each(function(r) {
        r.removeClass("compare");
        r.getElements("input[type=checkbox]").setProperty("checked", "");
      });
    } else if(revision.hasClass("compare")) {
      this.stopFadeInAndOutCompareMethod();
      this.selected_revision_container.removeClass("compare");
      revision.removeClass("compare");
      revision.getElements("input[type=checkbox]").setProperty("checked", "");
    } else {
      this.revisions.each(function(r) {
        r.removeClass("compare");
        r.getElements("input[type=checkbox]").setProperty("checked", "");
      });
      revision.addClass("compare");
      revision.getElements("input[type=checkbox]").setProperty("checked", "checked");
      if(revision.getProperty("data-image")) {
        this.compare_image.setProperty("src", revision.getProperty("data-image"));
      } else {
        this.compare_page.setHTML(revision.getProperty("data-page"));
        setupKimiPage();
      }
      this.compare_version.setHTML(revision.getElement(".version").innerHTML);
      this.compare_created.setHTML(revision.getProperty("data-created"));
      this.compare_author.setHTML(revision.getProperty("data-author"));
      this.compare_revert_link.setProperty("href", revision.getProperty("data-revert-url"));
      this.compare_revert_link_revision.setHTML(revision.getProperty("data-revision"));
      this.compare_jump_link_revision.setHTML(revision.getProperty("data-revert-revision"));
  
      this.compare_revision.removeClass("current");
      this.compare_revision.removeClass("revert");
      if(revision.getProperty("data-current") == "true") {
        this.compare_revision.addClass("current");
      } else if(revision.getProperty("data-revert-revision")) {
        this.compare_revision.addClass("revert");
      }

      this.selected_revision_container.addClass("compare");
      if(this.compare_method == "fade_in_out" && !this.compare_timeout) {
        this.compare_revision.setOpacity(0);
        this.fadeToCompareRevision();
      }
    }
  },

  fadeToCompareRevision: function() {
    this.compare_timeout = setTimeout(this.fadeToSelectedRevision.bind(this), 4000);
    this.compare_effects = [
      new Fx.Style(this.compare_revision, 'opacity', { duration: 2000 }).start(0, 1),
      new Fx.Style(this.main_revision, 'opacity', { duration: 2000 }).start(1, 0)
    ];
  },

  fadeToSelectedRevision: function() {
    this.compare_timeout = setTimeout(this.fadeToCompareRevision.bind(this), 4000);
    this.compare_effects = [
      new Fx.Style(this.compare_revision, 'opacity', { duration: 2000 }).start(1, 0),
      new Fx.Style(this.main_revision, 'opacity', { duration: 2000 }).start(0, 1)
    ];
  },

  stopFadeInAndOutCompareMethod: function() {
    clearTimeout(this.compare_timeout);
    this.compare_timeout = null;

    this.compare_effects.each(function(compare_effect) {
      compare_effect.stop();
    });
    this.compare_effects = [];

    this.main_revision.setOpacity(1);
    this.compare_revision.setOpacity(1);
  }
});

window.addEvent("domready", function() {
  $$(".kimi_revisions").each(function(element) {
    new KimiHistory(element);
  }); 
});