document.observe("dom:loaded", function() {
  var undoManager = Runway.UndoManager.currentUndoManager();
  var inputManager = Runway.InputManager.currentInputManager();
  var newAction = new Runway.NewActionForm($("new_action"));
  var folders = new Runway.Folders($("folders"));
  var focus = new Runway.Focus($("focus"));
  var actions = new Runway.Actions($("actions_list"));
  var clearPlan = new Runway.Form($("clear_plan"));
  var resetFocus = new Runway.Button($("reset_focus"));
  var resetFocusLink = new Runway.Button($("reset_focus_link"));

  actions.set("nextResponder", folders);

  actions.addObserver("all", function(key, all) {
    var main = $("main");
    main.down(".banner .all").innerHTML = all.size();
    main.className = "for_actions " + folders.get("current").get("name");
    $("empty_review").setVisible(all.empty());
  });

  actions.addObserver("matching", function(key, matching) {
    var all = actions.get("all");
    var hours = matching.inject(0, function(acc, action) { return acc + action.get("time"); });

    var banner = $("main").down(".banner");
    banner.down(".matching").innerHTML = matching.size();
    banner.down(".hours").innerHTML = hours.asFriendlyDuration();

    $("empty_actions").setVisible(matching.empty() && !all.empty());
  });

  actions.addObserver("focusOptions", function(key, value) {
    focus.set("options", value);
  });

  focus.addObserver("selection", function(key, value) {
    actions.set("focusSelection", value);
  });

  folders.addObserver("current", function(key, folder) {
    window.location.hash = folder.get("name");
    Runway.setTitle(folder.get("title"));
    actions.set("location", folder.get("location"));
    actions.makeFirstResponder();
  });

  actions.addObserver("current", function(key, value) {
    if (value) {
      var project = value.get("project");
      newAction.setDefaultProject(project);
      focus.updateCurrentProject(project);
    }
  });

  newAction.formDidCompleteWithSuccess = function(form, response) {
    var element = new Element("li", { "class": "action" });
    element.innerHTML = response.responseText;
    var action = new Runway.Action(element);
    actions.add(action);
    newAction.setDefaultProject(action.project());
    form.clear();
  };

  undoManager.didUndo = function() {
    actions.refresh();
  };

  clearPlan.set("activity", "Clearing plan");
  clearPlan.formCanComplete = function(form) {
    return confirm("This will revert all actions you had planned for today or later to be done as soon as possible.");
  };
  clearPlan.formDidCompleteWithSuccess = function(form, response) {
    var folder = folders.getFolder("actions");
    if (folder.makeFirstResponder()) {
      folder.set("selected", true);
    }
    focus.reset();
  };
  clearPlan.performKeyEquivalent = function(event) {
    this.complete();
  };

  resetFocus.action = resetFocusLink.action = function() {
    focus.reset();
  };

  var tipsElement = $("tips");
  if (tipsElement) {
    var stopped = false;
    var tips = tipsElement.select(".tip");
    var currentTip = tips.last();
    var nextIndex = 0;
    var timeout = 0;
    var showNextTip = function() {
      clearTimeout(timeout);
      currentTip.fade();
      currentTip = tips[nextIndex];
      currentTip.appear();
      if (++nextIndex >= tips.size()) {
        nextIndex = 0;
      }

      if (!stopped) {
        timeout = setTimeout(showNextTip, 60000);
      }
    };

    tipsElement.observe("click", showNextTip);

    var hideTips = new Runway.Form(tipsElement.down("form"));
    hideTips.set("activity", "");
    hideTips.formDidCompleteWithSuccess = function(form, response) {
      stopped = true;
      tipsElement.down("a.complete").hide();
      nextIndex = tips.size() - 1;
      showNextTip();
      Element.fade.delay(5, tipsElement);
    };

    showNextTip();
  }

  inputManager.addKeyEquivalents({
    "ctrl+u": undoManager,
    "ctrl+n": newAction,
    "ctrl+shift+a": folders.getFolder("actions"),
    "ctrl+shift+v": folders.getFolder("review"),
    "ctrl+shift+d": folders.getFolder("done"),
    "ctrl+shift+x": folders.getFolder("deleted"),
    "ctrl+l": actions,
    "ctrl+shift+c": clearPlan,
    "ctrl+shift+r": focus,
    "ctrl+shift+t": focus,
    "ctrl+shift+s": focus,
    "ctrl+shift+l": focus
  });

  var folderName = window.location.hash.replace(/^#/, "");
  var folder = folders.getFolder(folderName) || folders.getFolder("actions");
  folder.set("selected", true);
});
