website.anarchy = {
  "init_view" : function(widget, view) {
    if (!view) {
      view = $("> .content", widget)
    };
    view.bind("out:loading", function(event) {
      event.preventDefault();
      console.log("loading ...");
      return false
    });
    view.bind("out:loaded", function(event) {
      event.preventDefault();
      console.log("loaded ...");
      return false
    });
    view.bind("out:control", function(event) {
      event.preventDefault();
      widget.trigger("in:" + "control", [arguments[1]]);
      return false
    });
    view.bind("out:link", function(event) {
      event.preventDefault();
      widget.parent().trigger("in:" + "link", [arguments[1]]);
      return false
    });
    return view.bind("out:widget", function(event) {
      event.preventDefault();
      widget.parent().trigger("in:" + "widget", [arguments[1]]);
      return false
    })
  }, 
  "init_widget" : function(widget) {
    website.anarchy.update_timeline({
      "widget" : widget
    });
    widget.bind("in:loading", function(event) {
      event.preventDefault();
      widget.data("control", false);
      return false
    });
    widget.bind("in:loaded", function(event) {
      event.preventDefault();
      website.anarchy.update_timeline(arguments[1].data("uri"));
      if (!widget.data("control")) {
        $("> .control", widget).empty()
      };
      return false
    });
    widget.bind("in:control", function(event) {
      event.preventDefault();
      widget.data("control", true);
      var control = $("> .control", widget).empty();
      fold(function(a, b) {
        return $(("<button class=\"" + ("action " + string(b)) + "\" title=\"" + b + "\"></button>")).appendTo(control).click(function(event) {
          event.preventDefault();
          $("> .content", widget).trigger("in:" + string(b), [null]);
          return false
        })
      }, null, arguments[1]);
      return false
    });
    return widget
  }, 
  "load_widget" : function(widget, uri, method, headers, data) {
    var content = $("> .content", widget);
    var c = $("<div class=\"load view test\"></div>");
    content.after(c);
    website.anarchy.init_view(widget, c);
    return website.show(c, uri, method, headers, data).done(function(u) {
      var hn = c.innerHeight();
      var ho = content.innerHeight();
      var wn = c.innerWidth();
      var wo = content.innerWidth();
      var finish = function(u) {
        content.remove();
        c.height(hn);
        return c.attr("class", c.attr("class").replace(/load(\s+.*)$/, "content$1"))
      };
      var margin_top = "-=" + (string((hn / 2) - (ho / 2)));
      content.empty();
      if (widget.hasClass("active")) {
        return widget.animate({
          "height" : hn, 
          "marginLeft" : "-=" + (string((wn / 2) - (wo / 2))), 
          "marginTop" : margin_top, 
          "width" : wn
        }, "slow", finish)
      } else {
        widget.width(wn);
        widget.height(hn);
        widget.css("marginTop", margin_top);
        return finish(null)
      }
    })
  }, 
  "new_widget" : function(content, uri, method, headers, data) {
    var widget = website.anarchy.init_widget($("<div class=\"widget\"><div class=\"control\"></div><div class=\"content\"></div></div>"));
    return website.anarchy.load_widget(widget.addClass("loading").appendTo(content).css("marginLeft", (($("> .active", content).innerWidth() / 2) + 50)), uri, method, headers, data).done(function(u) {
      $("> .active", content).removeClass("active");
      return widget.addClass("active").removeClass("loading")
    })
  }, 
  "update_timeline" : function(a) {
    if (!a) {
      a = {
        
      }
    } else {
      if ((typeof a) == "string") {
        a = {
          "uri" : a
        }
      }
    };
    console.log("--- update-timeline: ", a);
    if (a.uri) {
      var current = website.anarchy.timeline.item[website.anarchy.timeline.current];
      if (!a.history) {
        var view = $("> .view", current.widget);
        window.location.hash = "#!" + string(a).uri;
        current.history.unshift({
          "height" : view.height(), 
          "uri" : a.uri, 
          "width" : view.width()
        });
        if (website.anarchy.timeline.item.length > 1) {
          if (current.history.length == 1) {
            return console.log("shift 1")
          } else {
            return console.log("shift 2")
          }
        }
      } else {
        if (a.uri != current.history[0].uri) {
          return console.log("history: " + string(a))
        }
      }
    } else {
      if (!website.anarchy.timeline) {
        website.anarchy.timeline = {
          "current" : 0, 
          "item" : [{
            "history" : [], 
            "widget" : a.widget[0]
          }]
        };
        return website
      } else {
        website.anarchy.timeline.current = website.anarchy.timeline.current + 1;
        return website.anarchy.timeline.item.splice(website.anarchy.timeline.current, 0, {
          "history" : [], 
          "widget" : a.widget[0]
        })
      }
    }
  }
}

$(function(){
  var content = $("#main");
  var navigation = $("body > .control .navigation");
  var session = $("body > .control .session");
  website.scarce($("body > .control"), "right");
  session.bind("out:user", function(event) {
    event.preventDefault();
    navigation.trigger("in:" + "update", [null]);
    return false
  });
  navigation.bind("out:link", function(event) {
    event.preventDefault();
    content.trigger("in:" + "link", [arguments[1]]);
    return false
  });
  content.bind("in:link", function(event) {
    event.preventDefault();
    website.anarchy.load_widget($("> .active", content), arguments[1]);
    return false
  });
  content.bind("in:widget", function(event) {
    event.preventDefault();
    website.anarchy.new_widget(content, arguments[1]);
    return false
  });
  $(window).bind("hashchange", function(event) {
    event.preventDefault();
    website.anarchy.update_timeline({
      "history" : true, 
      "uri" : regexp.extract(/^[^#]*#!(.*)$/, event.originalEvent.newURL)[0] || "/"
    });
    return false
  });
  website.anarchy.init_widget($("> .widget.active", content));
  website.ready.done(function(u) {
    var m = regexp.extract(/^#!(\/.+)$/, window.location.hash);
    if (m[0]) {
      return content.trigger("in:" + "link", [m[0]])
    } else {
      return website.anarchy.update_timeline("/")
    }
  })
})
