// qotd.js
(function() {

  var $ = function(id) {
    return document.getElementById(id);
  };

  var setContent = function(node, html) {
    node.innerHTML = '';
    node.innerHTML = html;
  };

  var setStyle = function(node, style, value) {
    node.style[style] = value;
  };

  var xhr = (function() {
    var COMPLETE = 4;
    var HTTP_OK = 200;

    var getXHR = function() {
      if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
      } else if (window.ActiveXObject) {
        try {
          return new ActiveXObject(
            'MSXML2.XMLHTTP.6.0');
        } catch (e) {
          return new ActiveXObject(
            'MSXML2.XMLHTTP.3.0');
        }
      }
    };

    var get = function(url, callback) {
      var xhr = getXHR();
      if (xhr) {
        xhr.onreadystatechange = function() {
          if (xhr.readyState == COMPLETE &&
              xhr.status == HTTP_OK) {
            callback(xhr.responseText);
          }
        };
        xhr.open('GET', url, true);
        xhr.send(null);
      }
    };

    return {
      get: get
    };
  })();

  var mkQuoteLoader = function(qotd) {
    var COLOR = '#742';
    var LOADING_COLOR = '#964';
    var loading;

    var setLoading = function(loadingState) {
      loading = loadingState;
      setStyle(qotd, 'color',
        loading ? LOADING_COLOR : COLOR);
    };

    var load = function() {
      if (!loading) {
        setLoading(true);
        xhr.get('qotd.php', function(resp) {
          setContent(qotd, resp);
          setLoading(false);
        });
      }
    };
    return {load: load};
  };

  var timer = (function() {
    var fn, interval, id;

    var set = function(timer_fn,
        timer_interval) {
      if (id != null) {
        clearInterval(id);
      }
      fn = timer_fn;
      interval = timer_interval;
      id = setInterval(fn, interval);
    };

    var reset = function() {
      if (id != null) {
        clearInterval(id);
        id = setInterval(fn, interval);
      }
    };

    return {set: set, reset: reset};
  })();

  var QUOTE_REFRESH_INTERVAL = 15000;

  window.onload = function() {
    var qotd = $('qotd');
    var loader = mkQuoteLoader(qotd);

    qotd.onmousedown = function() {
      timer.reset();
      loader.load();
      return false;
    };

    timer.set(loader.load,
      QUOTE_REFRESH_INTERVAL);

    loader.load();

    var show = function(id) {
      setStyle($(id), 'display', 'block');
    };
    show('title');
    show('qotd_outer');
  };
})();

