var ATND = {
  zeroPadding: function(v, length) {
    if (v.length > length) {
      return v;
    }

    return (new Array(length).join("0") + v).slice(-length);
  },

  createRangeMonths: function(n) {
    var result = [];
    var now = new Date();
    var year = now.getFullYear();
    var month = now.getMonth() + 1;
    for (var i = 0; i < n; i++) {
      result.push(year + ATND.zeroPadding(month, 2));
      if (++month > 12) {
        year++;
        month = 1;
      }
    }

    return result;
  },

  regexDate: /(\d{4})\-(\d{2})\-(\d{2})T(\d{2}):(\d{2}):(\d{2})/,
  parseDate: function(s) {
    if (!s) {
      return null;
    }

    var matches = s.match(ATND.regexDate);
    return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
  },

  formatDate: function(d) {
    var result = [];

    result.push(d.getFullYear());
    result.push("/");
    result.push(ATND.zeroPadding(d.getMonth() + 1, 2));
    result.push("/");
    result.push(ATND.zeroPadding(d.getDate(), 2));
    result.push(" ");
    result.push(ATND.zeroPadding(d.getHours(), 2));
    result.push(":");
    result.push(ATND.zeroPadding(d.getMinutes(), 2));
    result.push(":");
    result.push(ATND.zeroPadding(d.getSeconds(), 2));

    return result.join("");
  },

  createEventNode: function(event) {
    var endedAt = event.ended_at;
    // 終了しているイベントは作成しない
    if (new Date() > endedAt) {
      return null;
    }

    var title = event.title;
    var url = event.event_url;
    var address = event.address;
    var place = event.place;
    var startedAt = event.started_at;
    var limit = event.limit;
    var accepted = event.accepted;
    var waiting = event.waiting;

    var eventElem = document.createElement("dl");
    Element.addClassName(eventElem, "event");

    var eventNameElem = document.createElement("dt");

    var titleElem = document.createElement("h2");
    var titleAnchorElem = document.createElement("a");
    titleAnchorElem.setAttribute("href", url);
    titleAnchorElem.appendChild(document.createTextNode(title));
    titleElem.appendChild(titleAnchorElem);
    eventNameElem.appendChild(titleElem);

    var eventSummaryElem = document.createElement("dd");
    var eventDateElem = document.createElement("h3");
    eventDateElem.appendChild(document.createTextNode(ATND.formatDate(startedAt) + " - " + ATND.formatDate(endedAt)));

    var subscribersElem = document.createElement("span");
    Element.addClassName(subscribersElem, "subscribers");
    subscribersElem.appendChild(document.createTextNode("["));
    if (limit <= accepted) {
      var acceptedElem = document.createElement("strong");
      acceptedElem.appendChild(document.createTextNode(accepted + waiting));
      subscribersElem.appendChild(acceptedElem);
    } else {
      subscribersElem.appendChild(document.createTextNode(accepted));
    }
    subscribersElem.appendChild(document.createTextNode(" / " + (limit || accepted) + "]"));
    var personElem = document.createElement("span");
    Element.addClassName(personElem, "person");
    personElem.appendChild(document.createTextNode("人"));
    subscribersElem.appendChild(personElem);

    eventDateElem.appendChild(subscribersElem);
    eventSummaryElem.appendChild(eventDateElem);

    var addressElem = document.createElement("div");
    Element.addClassName(addressElem, "address");

    if (address != "") {
      var mapElem = document.createElement("span");
      mapElem.innerHTML = "[<a href='http://www.google.co.jp/maps?q=" + encodeURIComponent(event.address) + "&z=17'>Map</a>] ";
      addressElem.appendChild(mapElem);
    }

    var addressLocationElem = document.createElement("span");
    addressLocationElem.appendChild(document.createTextNode(address + " " + place));

    addressElem.appendChild(addressLocationElem);
    eventSummaryElem.appendChild(addressElem);

    eventElem.appendChild(eventNameElem);
    eventElem.appendChild(eventSummaryElem);

    return eventElem;
  },

  request: function(params) {
    var target = document.createElement("script");
    target.charset = "utf-8";
    target.src = "http://api.atnd.org/events/?" + $H(params).toQueryString();

    document.body.appendChild(target);
  },

  clearResult: function() {
    var result = $("result");
    while (result.firstChild) {
      result.removeChild(result.firstChild);
    }
  },

  searchEvent: function() {
    if ($("search").disabled) {
      return;
    }

    $("search").disabled = true;
    ATND.clearResult();
    ATND.request({
      count: 100,
      keyword: $F("keyword").split(/\s/),
      ym: ATND.createRangeMonths(3),
      format: "jsonp",
      callback: "callback"
      });
  }
}

Event.observe(window, "load", function() {
  var search = $("search");
  search.disabled = false;

  Form.getInputs("searchForm", "text").each(function(element) {
    element.onkeypress = (function(event) {
      if (event.keyCode == Event.KEY_RETURN) {
        ATND.searchEvent();
        Event.stop(event);
      }
    }).bindAsEventListener(this);
  });

  Event.observe(search, "click", function() {
    ATND.searchEvent();
  }, false);
  Field.focus("keyword");

  var query = location.search.parseQuery();
  var keyword = query["keyword"];
  if (keyword) {
    $("keyword").value = keyword;
    ATND.searchEvent();
  }
});

function callback(transport) {
  var result = $("result");
  var events = transport["events"];
  var count = 0;

  events.each(function(event) {
    event.started_at = ATND.parseDate(event.started_at);
    event.ended_at = ATND.parseDate(event.ended_at);
  });

  events.sort(function(n, m) {
    return n.started_at.getTime() - m.started_at.getTime();
    });

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var element = ATND.createEventNode(event);
    if (element) {
      result.appendChild(element);
      count++;
    }
  }

  // 独自にフィルタリングをするので、クライアントで件数を計算
  $("count").innerHTML = count;

  setTimeout(function() {
    $("search").disabled = false;
  }, 1000);
}

