/**
* 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 <span>
	* 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, $return = "";
		for (x in obj) {
			$return += (!first ? "&" : "") +  x + "=" + obj[x];
			first = false;
		}
		return $return;
	}


	return {
		update: trigger,
		receiveData: receiveData
	}

})();

