/** * A script to count the comments for each webpage with a given unique id * Adding this script into a website will turn all the spans with data-talk-id="unique-id" inner HTML to comment count */ var hyvorTalkCommentCount = (function() { if (typeof HYVOR_TALK_WEBSITE === 'undefined' || ! HYVOR_TALK_WEBSITE ) throw Error("HYVOR_TALK_WEBSITE is not defined"); var DOMAIN_TALK = "https://talk.hyvor.com", JSONP_URL = DOMAIN_TALK + "/web-api/count/get", WEBSITE_ID = HYVOR_TALK_WEBSITE; var datasetTalkId = "data-talk-id", datasetTalkMode = "data-talk-mode"; var Script, SpansArray; /** * The element should always be a * with data-talk-id */ function trigger() { var spanData = findSpans(); if (!spanData) return; var webpageIdentifiers = spanData.webpageIdentifiers; if (!webpageIdentifiers) return; if (Script) kill(Script); SpansArray = spanData.spansArray; // all spans Script = document.createElement("script"); Script.src = getURL(); document.body.appendChild(Script); function getURL() { var getParams = queryString({ website: WEBSITE_ID, webpageIdentifiers: JSON.stringify(webpageIdentifiers), time: new Date().getTime() }); var url = JSONP_URL + "?" + getParams; return url; } } function findSpans() { var spans = document.getElementsByTagName("span"), webpageIdentifiers = [], // collected webpage ids spansArray = []; // all selected spans for (var i = 0, len = spans.length; i < len; i++) { var span = spans[i], attr = span.getAttribute(datasetTalkId); if (attr) { webpageIdentifiers.push(attr); spansArray.push(span); } } return webpageIdentifiers.length > 0 ? { webpageIdentifiers: webpageIdentifiers, spansArray: spansArray } : null; } trigger(); /* * When the server sends the data to the client via JSONOP * Called from the JSONP script */ function receiveData(data) { for (var i = 0, len = SpansArray.length; i < len; i++) { var span = SpansArray[i], id = span.getAttribute(datasetTalkId), mode = span.getAttribute(datasetTalkMode) === 'number' ? 'raw' : 'string'; span.innerHTML = data[id][mode]; } } /* Helper functions */ function kill(el) { el.parentElement.removeChild(el); } function event(el, event, func) { el = el || window; if (window.addEventListener) { el.addEventListener(event, func); return function() {el.removeEventListener(event, func)} } else { el.attachEvent("on" + event, func); return function() {el.detachEvent("on" + event, func)} } } function queryString(obj) { var x, first = true, ret = ""; for (x in obj) { ret += (!first ? "&" : "") + x + "=" + obj[x]; first = false; } return ret; } return { update: trigger, receiveData: receiveData } })();