Thoth.Admin = Thoth.Admin || {};

Thoth.Admin.Comments = function () {

// Shorthand.
var Y   = YAHOO,
    yut = Y.util,
    yuc = yut.Connect,
    yud = yut.Dom,
    yue = yut.Event;

// -- Private Methods --------------------------------------------------------

/**
 * Deletes the comment with the specified <i>id</i>.
 *
 * @method deleteComment
 * @param {Number} id comment id
 * @param {Boolean} silent if <i>true</i>, no confirmation dialog will be
 *   displayed
 * @private
 */
function deleteComment(id, silent) {
  var postData = 'id=' + encodeURIComponent(id) + '&token=' +
        encodeURIComponent(Thoth.getToken());

  if (!silent && !confirm(
      'Are you sure you want to permanently delete this comment?')) {
    return;
  }

  yuc.asyncRequest('POST', '/api/comment/delete', {
    scope: this,
    timeout: 8000,
    failure: function (r) {
      try {
        alert(Y.lang.JSON.parse(r.responseText).error);
      } catch (e) {
        alert('Unable to delete comment.');
      }
    },
    success: function () { hideComment(id); }
  }, postData);
}

/**
 * Hides the comment with the specified <i>id</i> if it's currently visible,
 * using a fade-out animation. Will lazy-load the YUI Animation library if
 * it hasn't already been loaded.
 *
 * @method hideComment
 * @param {Number} id comment id
 * @private
 */
function hideComment(id) {
  var el = yud.get('comment-' + id);

  if (!el) {
    return;
  }

  function animate() {
    var anim = new yut.Anim(el, {opacity: {to: 0.0}, height: {to: 0}}, 0.2,
          yut.Easing.easeBoth);

    anim.onComplete.subscribe(function () {
      yud.addClass(el, 'hidden');
    });

    anim.animate();
  }

  if (yut.Anim) {
    animate();
  } else {
    LazyLoad.js(Thoth.js.yui.anim, animate);
  }
}

// -- Private Event Handlers -------------------------------------------------

/**
 * Handles clicks within the comments div. Uses delegation to determine what
 * action to take, if any.
 *
 * @method handleCommentClick
 * @param {Event} e event object
 * @private
 */
function handleCommentClick(e) {
  var el = yue.getTarget(e),
      commentEl;

  if (yud.hasClass(el, 'comment-delete') &&
      (commentEl = yud.getAncestorByClassName(el, 'comment'))) {

    yue.preventDefault(e);
    deleteComment(commentEl.id.split('-')[1], e.shiftKey || e.metaKey);
  }
}

return {
  // -- Public Methods -------------------------------------------------------

  /**
   * Initializes the Comments module.
   *
   * @method init
   */
  init: function () {
    yue.on('comments', 'click', handleCommentClick, this, true);
  }
};

}();

YAHOO.util.Event.onContentReady('comments', Thoth.Admin.Comments.init,

Thoth.Admin.Comments, true);