/* globals NodeList, HTMLCollection */ (function () { var postId = null; //#region Helpers function objectToUrl(obj) { var string = ''; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { string += prop + '=' + obj[prop].replace(/ /g, '+') + '&'; } } return string.substring(0, string.length - 1); } var AsynObject = AsynObject ? AsynObject : {}; AsynObject.ajax = function (url, callback) { var ajaxRequest = AsynObject.getAjaxRequest(callback); ajaxRequest.open("GET", url, true); ajaxRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); ajaxRequest.send(null); }; AsynObject.postAjax = function (url, callback, data) { var ajaxRequest = AsynObject.getAjaxRequest(callback); ajaxRequest.open("POST", url, true); ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); ajaxRequest.send(objectToUrl(data)); }; AsynObject.getAjaxRequest = function (callback) { var ajaxRequest = new XMLHttpRequest(); ajaxRequest.onreadystatechange = function () { if (ajaxRequest.readyState > 1 && ajaxRequest.status > 0) { callback(ajaxRequest.readyState, ajaxRequest.status, ajaxRequest.responseText); } }; return ajaxRequest; }; function hasClass(elem, className) { return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' '); } function addClass(elem, className) { if (!hasClass(elem, className)) { elem.className += ' ' + className; } } function removeClass(elem, className) { var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, ' ') + ' '; if (hasClass(elem, className)) { while (newClass.indexOf(' ' + className + ' ') >= 0) { newClass = newClass.replace(' ' + className + ' ', ' '); } elem.className = newClass.replace(/^\s+|\s+$/g, ''); } } function toDOM(htmlString) { var wrapper = document.createElement('div'); wrapper.innerHTML = htmlString; return wrapper.children; } function getParentsByAttribute(element, attr, value) { var arr = []; while (element) { element = element.parentNode; if (element.hasAttribute(attr) && element.getAttribute(attr) === value) { arr.push(element); } if (!element.parentNode.parentNode) { break; } } return arr; } Element.prototype.remove = function () { this.parentElement.removeChild(this); }; NodeList.prototype.remove = HTMLCollection.prototype.remove = function () { for (var i = 0, len = this.length; i < len; i++) { if (this[i] && this[i].parentElement) { this[i].parentElement.removeChild(this[i]); } } }; function slide(thisObj, direction, callback) { if (direction === "Up") { thisObj.style.height = '0px'; } else { var clone = thisObj.cloneNode(true); clone.style.position = 'absolute'; clone.style.visibility = 'hidden'; clone.style.height = 'auto'; addClass(clone, 'slideClone col-md-6 col-md-offset-3'); document.body.appendChild(clone); var slideClone = document.getElementsByClassName("slideClone")[0]; var newHeight = slideClone.clientHeight; slideClone.remove(); thisObj.style.height = newHeight + 'px'; if (callback) { setTimeout(function () { callback(); }, 500); } } } //#endregion var endpoint = "/comment.ashx"; function deleteComment(commentId, element) { if (confirm("Do you want to delete this comment?")) { AsynObject.postAjax(endpoint, function (state, status) { if (state === 4 && status === 200) { slide(element, "Up", function () { element.remove(); }); return; } else if (status !== 200) { alert("Something went wrong. Please try again"); } }, { mode: "delete", postId: postId, commentId: commentId, token: document.querySelector("[data-token]").getAttribute("data-token") }); } } function approveComment(commentId, element) { AsynObject.postAjax(endpoint, function (state, status) { if (state === 4 && status === 200) { element.remove(); return; } else if (status !== 200) { alert("Something went wrong. Please try again"); } }, { mode: "approve", postId: postId, commentId: commentId, token: document.querySelector("[data-token]").getAttribute("data-token") }); } function saveComment(name, email, website, content, callback) { if (localStorage) { localStorage.setItem("name", name); localStorage.setItem("email", email); localStorage.setItem("website", website); } AsynObject.postAjax(endpoint, function (state, status, data) { var elemStatus = document.getElementById("status"); if (state === 4 && status === 200) { elemStatus.innerHTML = "Your comment has been added"; removeClass(elemStatus, "alert-danger"); addClass(elemStatus, "alert-success"); document.getElementById("commentcontent").value = ""; var comment = toDOM(data)[0]; comment.style.height = "0px"; var elemComments = document.getElementById("comments"); elemComments.appendChild(comment); slide(comment, "Down"); callback(true); return; } else if (status !== 200) { addClass(elemStatus, "alert-danger"); elemStatus.innerText = "Unable to add comment"; callback(false); } }, { mode: "save", postId: postId, name: name, email: email, website: website, content: content, token: document.querySelector("[data-token]").getAttribute("data-token"), }); } function initialize() { postId = document.querySelector("[itemprop=blogPost]").getAttribute("data-id"); var email = document.getElementById("commentemail"); var name = document.getElementById("commentname"); var website = document.getElementById("commenturl"); var content = document.getElementById("commentcontent"); var commentForm = document.getElementById("commentform"); var allComments = document.querySelectorAll("[itemprop=comment]"); for (var i = 0; i < allComments.length; ++i) { allComments[i].style.height = allComments[i].clientHeight + 'px'; } commentForm.onsubmit = function (e) { e.preventDefault(); var button = e.target; button.setAttribute("disabled", true); saveComment(name.value, email.value, website.value, content.value, function () { button.removeAttribute("disabled"); }); }; website.addEventListener("keyup", function (e) { var w = e.target; if (w.value.trim().length >= 4 && w.value.indexOf("http") === -1) { w.value = "http://" + w.value; } }); window.addEventListener("click", function (e) { var tag = e.target; if (hasClass(tag, "deletecomment")) { var comment = getParentsByAttribute(tag, "itemprop", "comment")[0]; deleteComment(comment.getAttribute("data-id"), comment); } if (hasClass(tag, "approvecomment")) { var comment = getParentsByAttribute(tag, "itemprop", "comment")[0]; approveComment(comment.getAttribute("data-id"), tag); } }); if (localStorage) { email.value = localStorage.getItem("email"); website.value = localStorage.getItem("website"); if (name.value.length === 0) { name.value = localStorage.getItem("name"); } } } if (document.getElementById("commentform")) { initialize(); } })();