/*\
title: $:/core/modules/widgets/parameters.js
type: application/javascript
module-type: widget

Widget for definition of transclusion parameters

\*/
(function(){

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

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

var ParametersWidget = function(parseTreeNode,options) {
	// Initialise
	this.initialise(parseTreeNode,options);
};

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

/*
Render this widget into the DOM
*/
ParametersWidget.prototype.render = function(parent,nextSibling) {
	// Call the constructor
	Widget.call(this);
	this.parentDomNode = parent;
	this.computeAttributes();
	this.execute();
	this.renderChildren(parent,nextSibling);
};

/*
Compute the internal state of the widget
*/
ParametersWidget.prototype.execute = function() {
	var self = this;
	this.parametersDepth = Math.max(parseInt(this.getAttribute("$depth","1"),10) || 1,1);
	// Find the parent transclusions
	var pointer = this.parentWidget,
		depth = this.parametersDepth;
	while(pointer) {
		if(pointer instanceof TranscludeWidget) {
			depth--;
			if(depth <= 0) {
				break;
			}
		}
		pointer = pointer.parentWidget;
	}
	// Process each parameter
	if(pointer instanceof TranscludeWidget) {
		// Get the value for each defined parameter
		$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {
			var name = attr.name;
			// If the attribute name starts with $$ then reduce to a single dollar
			if(name.substr(0,2) === "$$") {
				name = name.substr(1);
			}
			var value = pointer.getTransclusionParameter(name,index,self.getAttribute(attr.name,""));
			self.setVariable(name,value);
		});
		// Assign any metaparameters
		$tw.utils.each(pointer.getTransclusionMetaParameters(),function(getValue,name) {
			var variableName = self.getAttribute("$" + name);
			if(variableName) {
				self.setVariable(variableName,getValue(name));
			}
		});
	}
	// Construct the child widgets
	this.makeChildWidgets();
};

/*
Refresh the widget by ensuring our attributes are up to date
*/
ParametersWidget.prototype.refresh = function(changedTiddlers) {
	var changedAttributes = this.computeAttributes();
	if(Object.keys(changedAttributes).length) {
		this.refreshSelf();
		return true;
	}
	return this.refreshChildren(changedTiddlers);
};

exports.parameters = ParametersWidget;

})();
