(function ($) {
  $.fn.comments = function(thread, options) {
    var thread    = thread;

    var options   = $.extend({
      url:       '/comments',
      recaptcha: null,
      use_recaptch: function() { return true; },
      recaptcha_options: { theme: 'clean',  lang:'ru'}}, options);

    var container = this;

    var form;

    function refresh(comments) { 

      function commentsList(comments,children, level) {
        var ul = $('<div class="discussion_thread"/>');
  
        $.each(comments, function(i, c) {
          ul.append(
            $('<div class="discussion_item discussion_level' + level + '" />').
              append($('<div class="discussion_author">').
                append('<img src="' + (c.thumbnail ? c.thumbnail : 'http://www.google.com/friendconnect/scs/images/NoPictureDark32.jpg') + '" class="discussion_userpic">').
                append(' <b>' + (c.author ? c.author : 'Неизвестный') + '</b> <small>' + c.time_created + '</small></div>')).
              append('<div class="discussion_comment">' + ('' + c.comment).replace("\n", '<br><br>') + '</div>').
              append($('<div class="discussion_actions" />').
                append(replyLink(c.id))));
          if (children[c.id] != null)
            ul.append(commentsList(children[c.id], children, level + 1));
        });

        return ul;
      } 
   
      var children = {'0': []};
      $.each(comments, function(i,c) {
        (c.parent == null ? 
          children['0'] :
          (children[c.parent] ? children[c.parent] : (children[c.parent] = []))).push(c);
      });


      container.
        empty().
        append('<h3>Комментарии (' + (comments.length > 0 ? comments.length : 'пока ни одного') + ')</h3>').
        append(commentButton());


      if (comments.length > 0)
        container.append($('<div/>').append(commentsList(children[0], children, 0)));
    }


    function load() {
      $.ajax({
        url:      options.url + '/' + thread + '/', 
        dataType: 'json',
        success:  function(data) { refresh(data.comments); },
        type:     'GET' })
    }

    function reply() {
      var data = form.serializeArray();
      if (data[0].value > '') {
        $.ajax({
          url:      (form.replyId == '0') ? 
                      options.url + '/' + thread + '/' : 
                      options.url + '/' + thread + '/' + form.replyId + '.json',
          dataType: 'json',
          data:     form.serialize(),
          success:  function(data) { data.success ? refresh(data.comments) : error(data.error); },
          type:     'POST'});
      } else 
      error('Введите текст комментария');
    }

    function commentButton() {
      return $('<input type="button" class="discussion_button" value="Комментировать" />').click(function() { showForm(this, '0'); })
    }

    function replyLink(id) {
      return $('<a class="discussion_action">Ответить</a>').click(function() { showForm(this, id); })
    }

    function error(message) { 
      if (form) form.find('.discussion_error').text(message); 
    }

    function cancel() {
      if (form) {
        var node = form.get(0);
        if (node && node.parentNode) {
          if (form.replyId == '0')
            $(node.parentNode).prepend(commentButton());
          else
            $(node.parentNode).append(replyLink(form.replyId));
          node.parentNode.removeChild(node);
        }
        form = null;
      }
    }

    function showRecaptcha() {
      Recaptcha.create(options.recaptcha, 'recaptcha', options.recaptcha_options); 
    }

    function showForm(link, id) {
      cancel();
      form = 
        $('<form />').
          append(
            $('<div class="discussion_form" />').
            append(
              $('<textarea name="comment" rows="6">Ваш комментарий...</textarea>').
                click(function() {this.value = ''; $(this).unbind('click'); })).
            append('<div id="recaptcha"></div>').
            append('<div class="discussion_error" />').
            append(
              $('<input type="button" class="discussion_button" value="Ответить" />').click(reply)).
            append(' ').
            append(
              $('<input type="button" class="discussion_button" value="Отменить" />').click(cancel)));
      form.replyId = id;

      $(link).before(form);
      $(link).remove();
       
      if (options.recaptcha && options.use_recaptcha()) showRecaptcha();
    }

    load();
    return this; 
  }})(jQuery);

