|
|
- /* 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();
- }
- })();
|