/*\
title: $:/plugins/tiddlywiki/twitter/widget.js
type: application/javascript
module-type: widget

Twitter widget

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

var Widget = require("$:/core/modules/widgets/widget.js").widget;

var TwitterWidget = function(parseTreeNode,options) {
	this.initialise(parseTreeNode,options);
};

/*
Inherit from the base widget class
*/
TwitterWidget.prototype = new Widget();

var optionAttributes = "align ariaPolite borderColor cards chrome conversation count dnt hashtags height height lang linkColor related size text theme tweetLimit via width".split(" "),
	otherAttributes = "hashtag id ownerScreenName screenName slug tweetID type url userId widgetId".split(" "),
	allAttributes = Array.prototype.slice.call(optionAttributes,0).concat(otherAttributes);

/*
Render this widget into the DOM
*/
TwitterWidget.prototype.render = function(parent,nextSibling) {
	var self = this;
	// Housekeeping
	this.parentDomNode = parent;
	this.computeAttributes();
	// Compose the arguments for the tweet call
	var method,
		arg,
		options = {};
		$tw.utils.each(optionAttributes,function(attr) {
			options[attr] = self.getAttribute(attr);
		});
	switch(this.getAttribute("type")) {
		case "shareButton":
			method = "createShareButton";
			arg = this.getAttribute("url");
			break;
		case "followButton":
			method = "createFollowButton";
			arg = this.getAttribute("screenName");
			break;
		case "hashtagButton":
			method = "createHashtagButton";
			arg = this.getAttribute("hashtag");
			break;
		case "mentionButton":
			method = "createMentionButton";
			arg = this.getAttribute("screenName");
			break;
		case "tweet":
			method = "createTweet";
			arg = this.getAttribute("tweetID");
			break;
		case "timelineProfile":
			method = "createTimeline";
			arg = {
				sourceType: "profile",
				screenName: this.getAttribute("screenName"),
				userId: this.getAttribute("userId")
			};
			break;
		case "timelineLikes":
			method = "createTimeline";
			arg = {
				sourceType: "likes",
				screenName: this.getAttribute("screenName"),
				userId: this.getAttribute("userId")
			};
			break;
		case "timelineList":
			method = "createTimeline";
			arg = {
				sourceType: "list",
				ownerScreenName: this.getAttribute("ownerScreenName"),
				slug: this.getAttribute("slug"),
				id: this.getAttribute("id")
			};
			break;
		case "timelineCollection":
			method = "createTimeline";
			arg = {
				sourceType: "collection",
				id: this.getAttribute("id")
			};
			break;
		case "timelineUrl":
			method = "createTimeline";
			arg = {
				sourceType: "url",
				url: this.getAttribute("url")
			};
			break;
		case "timelineWidget":
			method = "createTimeline";
			arg = {
				sourceType: "widget",
				widgetId: this.getAttribute("widgetId")
			};
			break;
	}
	// Render the tweet into a div
	var div = this.document.createElement("div");
	if(!this.document.isTiddlyWikiFakeDom && window.twttr && method) {
		twttr.ready(function(twttr) {
			window.twttr.widgets[method](arg,div,options);
		});
	} else {
		div.appendChild(this.document.createTextNode("Can't render tweet"));
	}
	// Insert it into the DOM
	parent.insertBefore(div,nextSibling);
	this.domNodes.push(div);
};

/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
TwitterWidget.prototype.refresh = function(changedTiddlers) {
	var changedAttributes = this.computeAttributes();
	if(allAttributes.find(function(attr) {
		return $tw.utils.hop(changedAttributes,attr);
	})) {
		this.refreshSelf();
		return true;
	} else {
		return false;	
	}
};

exports.twitter = TwitterWidget;

})();
