var ChyrpLikes = { failed: false, busy: false, init: function() { $("div.likes a.likes").click( function(e) { if (!ChyrpLikes.failed) { e.preventDefault(); ChyrpLikes.toggle($(this).attr("data-post_id")); } } ); ChyrpLikes.watch(); }, watch: function() { // Watch for DOM additions on blog pages. if (!!window.MutationObserver && $(".post").length) { var target = $(".post").last().parent()[0]; var observer = new MutationObserver( function(mutations) { mutations.forEach( function(mutation) { for (var i = 0; i < mutation.addedNodes.length; ++i) { var item = mutation.addedNodes[i]; $(item).find("div.likes a.likes").click( function(e) { e.preventDefault(); ChyrpLikes.toggle($(this).attr("data-post_id")); } ); } } ); } ); var config = { childList: true, subtree: true }; observer.observe(target, config); } }, send: function(post_id, callback, isUnlike) { if (!ChyrpLikes.busy && !ChyrpLikes.failed) { $.ajax( { type: "POST", url: Site.ajax_url, data: { "action": (isUnlike) ? "unlike" : "like", "post_id": post_id }, beforeSend: function() { ChyrpLikes.busy = true; }, success: function(response) { // Action was ignored if data value is false. if (response.data === true) callback(response); }, complete: function() { ChyrpLikes.busy = false; }, dataType: "json", error: ChyrpLikes.panic } ); } }, toggle: function(post_id) { if ($("#likes_" + post_id + " a.liked").length) { ChyrpLikes.send( post_id, function(response) { var div = $("#likes_" + post_id); div.children("span.like_text").html(response.text); div.children("a.liked").removeClass("liked").addClass("like"); }, true ); } else { ChyrpLikes.send( post_id, function(response) { var div = $("#likes_" + post_id); div.children("span.like_text").html(response.text); div.children("a.like").removeClass("like").addClass("liked"); }, false ); } }, panic: function() { ChyrpLikes.failed = true; Oops.count++; alert(Oops.message); } }; $(document).ready(ChyrpLikes.init);