/**
 * EGroupware eTemplate2 - JS widget class containing styles
 *
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
 * @package etemplate
 * @subpackage api
 * @link https://www.egroupware.org
 * @author Andreas Stöckel
 * @copyright EGroupware GmbH 2011-2021
 */

/*egw:uses
	et2_core_widget;
*/

import {et2_register_widget, et2_widget, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";

/**
 * Function which appends the encapsulated style data to the head tag of the
 * page.
 *
 * TODO: The style data could be parsed for rules and appended using the JS
 * stylesheet interface, allowing the style only to modifiy nodes of the current
 * template.
 *
 * @augments et2_widget
 */
export class et2_styles extends et2_widget
{
	private styleNode: HTMLStyleElement;
	private head: HTMLHeadElement;
	private dom_id: string;
	/**
	 * Constructor
	 *
	 * @memberOf et2_styles
	 */
	constructor(_parent, _attrs? : WidgetConfig, _child? : object)
	{
		// Call the inherited constructor
		super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_styles._attributes, _child || {}));

		// Allow no child widgets
		this.supportedWidgetClasses = [];

		// Create the style node and append it to the head node
		this.styleNode = document.createElement("style");
		this.styleNode.setAttribute("type", "text/css");

		this.head = this.egw().window.document.getElementsByTagName("head")[0];
		this.head.appendChild(this.styleNode);
	}

	destroy( )
	{
		// Remove the style node again and delete any reference to it
		this.head.removeChild(this.styleNode);

		super.destroy();
	}

	loadContent( _content)
	{
		// @ts-ignore
		if (this.styleNode.styleSheet)
		{
			// IE
			// @ts-ignore
			this.styleNode.styleSheet.cssText += _content;
		}
		else
		{
			this.styleNode.appendChild(document.createTextNode(_content));
		}
	}

	/**
	 * Sets the id of the DOM-Node.
	 *
	 * DOM id's have dots "." replaced with dashes "-"
	 *
	 * @param {string} _value id to set
	 */
	set_id( _value)
	{

		this.id = _value;
		this.dom_id = _value ? this.getInstanceManager().uniqueId+'_'+_value.replace(/\./g, '-') : _value;

		if (this.styleNode)
		{
			if (_value != "")
			{
				this.styleNode.setAttribute("id", this.dom_id);
			}
			else
			{
				this.styleNode.removeAttribute("id");
			}
		}
	}
}
et2_register_widget(et2_styles, ["styles"]);