var JSON = JSON || {};

JSON.stringify = JSON.stringify || function (obj) {

        var t = typeof (obj);
        if (t != "object" || obj === null) {

                // simple data type
                if (t == "string") obj = '"'+obj+'"';
                return String(obj);

        }
        else {

                // recurse array or object
                var n, v, json = [], arr = (obj && obj.constructor == Array);

                for (n in obj) {
                        v = obj[n]; t = typeof(v);

                        if (t == "string") v = '"'+v+'"';
                        else if (t == "object" && v !== null) v = JSON.stringify(v);

                        json.push((arr ? "" : '"' + n + '":') + String(v));
                }

                return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
};

$(document).ready(function(){
 var commentBlock = $('.articleComments');

 if (commentBlock.length == 0) return;

 var urlParts = window.location.pathname.split('-');

 var docID = urlParts[urlParts.length - 1];

 commentBlock.html('<div id="dbk_comments"><h2>Readers\' Comments</h2><div id="dbk_comment_target"><div id="dbk_comments_loading">Loading ...</div><ul id="dbk_comment_0_children"></ul><div id="dbk_comments_reply"><h2>Post a comment</h2><p>To reply to an earlier comment, click "reply to this comment."</p>' + dbk_replybox(0) + '</div></div></div>');

 display_replybox(0);

 commentBlock.show();

 $("#dbk_comments").data("last_seen_id", 0).data("doc_id", docID);
 
 dbk_fetch_comments();
});

function dbk_replybox(parent_id) {
  return '<div class="dbk_comments_replybox" style="display: none" id="dbk_comments_replybox_' + parent_id + '"><form action="#" method="POST" onsubmit="dbk_post_comment(' +
      parent_id + ', this); return false;">' +
      '<table><tr><th>Your name:</th><td colspan="2"><input type="text" name="name"/></td></tr>' +
      '<tr><th>Message:</th><td colspan="2"><textarea name="body"></textarea></td></tr>' +
      '<tr><th></th><td>Please type the two words to confirm you\'re human:</td><td class="dbk_captcha"></td></tr>' +
      '<tr><td colspan="3"><input type="submit" value="Submit Comment"/></td></tr>' +
      '</table></form></div>';
}

function display_replybox(parent_id) {
  var replyBox = $("#dbk_comments_replybox_" + parent_id);
  var captchaBox = $("td.dbk_captcha", replyBox);

  /* Make sure any other replybox is hidden, because its reCAPTCHA will disappear */
  $('.dbk_comments_replybox').slideUp("normal");

  $("input[type='text']", replyBox).val('');
  $("textarea", replyBox).val('');

  if (parent_id == 0) {
    $("#dbk_comments_replybox_link_0").remove();
  } else {
    if ($("#dbk_comments_replybox_link_0").length == 0) {
      $("#dbk_comments_reply").append('<p id="dbk_comments_replybox_link_0">Please <a href="#" onclick="display_replybox(0); return false;">click here to comment</a>.</p>');
    }
  }

  Recaptcha.create('6LcjLQgAAAAAAPRSwsoAs5nr-5C4R_uB7FjWpzEt',
    captchaBox.get(0), {
      theme: "white",
      callback: function () {
        replyBox.slideDown("normal");
      }
    }
  );
}

function dbk_post_comment(parent, replybox) {
  var name = $("[name='name']", replybox).val();
  var body = $("[name='body']", replybox).val();

  var comment = {'name': name, 'body': body, 'in_re': parent,
    'challenge': Recaptcha.get_challenge(), 'response': Recaptcha.get_response()};
  var docID = $("#dbk_comments").data("doc_id");

  jQuery.post("http://tools.umdbk.com/comments/new-comment.php?did=" + docID, comment,
    function(jsondata) {
      var data;
      eval("data = " + jsondata);
      if (data.status == 'success') {
        display_comment(data.comment);

        display_replybox(0); 
      } else {
        alert("Error: " + data.reason);
        Recaptcha.reload();
      }
    }, "text"
  );
}

function dbk_fetch_comments() {
 var last_seen_id = $("#dbk_comments").data("last_seen_id");
 var docID = $("#dbk_comments").data("doc_id");

 $.getJSON("http://tools.umdbk.com/comments/comments.js.php?did=" + docID +
           "&last_seen_id=" + last_seen_id + 
           "&format=json&jsoncallback=?", function(data) {
   $("#dbk_comments_loading").remove();

   if (data.comments.length == 0 && last_seen_id == 0) {
     if ($("#dbk_comments_none").length == 0) {
       $("#dbk_comment_target").prepend('<div id="dbk_comments_none">No comments.</div>');
     }
   } else {
     $("#dbk_comments_none").remove();
   }

   $.each(data.comments, function (i, comment) {
     display_comment(comment);

     $("#dbk_comments").data("last_seen_id", comment.id);
   });
 });

 setTimeout(dbk_fetch_comments, 15000);
}

function display_comment(comment) {
     if ($("#dbk_comment_" + comment.id).length) {
       // This comment was already loaded (probably the user posted it), so skip
       return true;
     }

     var parentUL = $("#dbk_comment_" + comment.parent + "_children");
     if (!parentUL.length) {
       var parentLI = $("#dbk_comment_" + comment.parent);
       if (parentLI.length) {
         parentUL = $('<ul id="dbk_comment_' + comment.parent + '_children"></ul>');
         parentUL.appendTo(parentLI);
       } else {
         // If the parent is missing (deleted?), then stick this one on the root
         parentUL = $("#dbk_comment_0_children");
       }
     }

     var nameSpan;

     if (comment.name) {
       nameSpan = '<span>' + comment.name + '</span>';
     } else {
       nameSpan = '<span class="anon">anonymous</span>';
     }

     var commentLI = $('<li id="dbk_comment_' + comment.id + '"><div><div class="meta"><div><a href="#dbk_comments_replybox_' + comment.id + '" onclick="display_replybox(' + comment.id + ')" style="font-weight: bold">reply to this comment</a></div>' +
         nameSpan + ' at ' + comment.time + '</div></div>' + dbk_replybox(comment.id) + '</li>');

     var grafWrapper = $(commentLI.children("div").get(0));

     $.each(comment.body, function (i, graf) {
       $('<p>' + graf + '</p>').appendTo(grafWrapper);
     });

     parentUL.append(commentLI);
}


