

/* JS to make comments work. */

window.$comments = {
  "_path": null,
  "cur_path": function () {
    if (!this._path) {
      var match = location.href.match(/^https?:\/\/[^/]+(\/.*)$/);
      if (match) {
        this._path = match[1];
      }
    }
    return this._path;
  },

  "_form_html": '<table class="form inline"><tr><td colspan="2"><strong>Reply to %(author)s</strong></td></tr><tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="128" /></td></tr><tr><th><label for="id_website">Site:</label></th><td><input id="id_website" type="text" name="website" maxlength="200" /></td></tr><tr><th><label for="id_email">E-mail address:</label></th><td><input id="id_email" type="text" name="email" maxlength="75" /></td></tr><tr><th><label for="id_comment">Comment:</label></th><td><textarea id="id_comment" rows="10" cols="40" name="comment"></textarea></td></tr><tr><th><label for="id_markup">Markup:</label></th><td><select name="markup" id="id_markup"><option value="">---------</option><option value="1">markdown</option><option value="2">textile</option><option value="3">restructuredtext</option><option value="5" selected="selected">plaintext</option></select></td></tr><tr><td colspan="2"><input type="submit" value="Submit Comment"></td></tr></table>',

  "generate_form_html": function (comment_id, url, author) {
    var html = this._form_html;
    var rel=comment_id+"::"+url+"::"+author;
    html = '<form action="'+url+'" method="POST" id="'+this.get_reply_form_id(comment_id)+'" rel="'+rel+'">' + html.replace("%(author)s", author);
    html += '</form>';
    return html;
  },

  "get_reply_form_id": function (comment_id) {
    return 'reply-form-'+comment_id;
  },

  "reply_to": function (comment_id, post_url, author) {
    var new_form = $(this.generate_form_html(comment_id, post_url, author));
    new_form.css("display", "none");
    var comment_reply = $("#" + comment_id + "-reply");
    comment_reply.after(new_form);
    this.apply_form_hijax(new_form);
    new_form.slideDown(function () {
      comment_reply.replaceWith('<a id="'+comment_id+'-reply" href="javascript:$comments.hide_reply(\''+comment_id+'\');">Cancel Reply</a>');
    });
  },

  "hide_reply": function (comment_id) {
    var reply = $("#" + comment_id + "-reply");
    var form_id = "#"+this.get_reply_form_id(comment_id);
    var form_info = $(form_id).attr("rel").split("::");
    reply.next().slideUp(function () {
      reply.next(form_id).remove();
      reply.replaceWith('<a id="'+comment_id+'-reply" href="javascript:$comments.reply_to(\''+comment_id+'\',\''+form_info[1]+'\',\''+form_info[2]+'\');">Reply To This Comment</a>');
    });
  },

  "apply_form_hijax": function (selector) {
    selector.append('<input type="hidden" name="view_path" value="'+this.cur_path()+'">');
    var success = function(data) {
      var form_id = selector.attr('id');
      selector.remove("ul.errorlist");
      if (data["errors"]) {
        for (var key in data["errors"]) {
          var current_errors = '<ul class="errorlist" id="errors-'+key+'"></ul>';
          if ($("#errors-"+key).length) {
            $("#errors-"+key).replaceWith(current_errors);
          }
          else {
            $("#"+form_id + " input[name='"+key+"']").before(current_errors);
          }
          for (var i=0; i < data["errors"][key].length; i++) {
            $("#errors-" + key).append('<li>'+data["errors"][key][i]+'</li>');
          }
        }
        return;
      }
      data = data[0];
      $.get('/blog/comment/' + data.pk + '/', function (to_append, textStatus) {
        if (data.fields.parent) {
          var parent = $('#c' + data.fields.parent);
          var depth_re = new RegExp('depth\-(\\d+)');
          var classes = parent.attr('class');
          var depth = parseInt(depth_re.exec(classes)[1])+1;
          var sibling = null;
          for (var i = parseInt(depth) - 1; i >= 0; --i) {
            var n = parent.nextAll('.depth-' + i);
            if(n.length > 0) {
              sibling = n.filter(':first');
              i = -1;
            }
          }
          if (sibling == null) {
            var last_next = parent.nextAll(':last');
            if (last_next.length > 0) {
              last_next.after(to_append);
            }
            else {
              $('#comments').append(to_append);
            }
          }
          else {
            sibling.before(to_append);
          }
          $comments.hide_reply("c"+parseInt(data.fields.parent));
        }
        else {
          $('#comments').append(to_append);
          $("#" + form_id + " textarea").attr("value", "");
        }
      });
    };
    var options = {
      success : success,
      dataType : 'json'
    };
    selector.ajaxForm(options);
  }
}

$(document).ready(function () {
    $comments.apply_form_hijax($('.response-form'));
  });
