/*
 * Copyright (C) 2013-2021 Combodo SARL
 *
 * This file is part of iTop.
 *
 * iTop is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * iTop is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 */

;
$(function()
{
	// the widget definition, where 'itop' is the namespace,
	// 'popover-menu' the widget name
	$.widget( 'itop.popover_menu',
		{
			// default options
			options:
			{
				toggler: '',
			},
			css_classes:
			{
				opened: 'ibo-is-opened',
			},
			js_selectors:
			{
				menu: '[data-role="ibo-popover-menu"]',
				section: '[data-role="ibo-popover-menu--section"]',
				item: '[data-role="ibo-popover-menu--item"]',
			},

			// the constructor
			_create: function()
			{
				this._bindEvents();
				this._closePopup();
			},
			// events bound via _bind are removed automatically
			// revert other modifications here
			_destroy: function()
			{
			},
			_bindEvents: function()
			{
				const me = this;
				const oBodyElem = $('body');

				this.element.find(this.js_selectors.item).on('click', function(oEvent){
					me._closePopup();
				});
				
				// Mostly for outside clicks that should close elements
				oBodyElem.on('click', function(oEvent){
					me._onBodyClick(oEvent);
				});
			},

			// Methods
			_onBodyClick: function(oEvent)
			{
				if($(oEvent.target.closest(this.js_selectors.menu)).length === 0 && $(oEvent.target.closest(this.options.toggler)).length === 0)
				{
					this._closePopup();
				}
			},
			_openPopup: function()
			{
				this.element.addClass(this.css_classes.opened);
			},
			_closePopup: function()
			{
				this.element.removeClass(this.css_classes.opened);
			},
			openPopup: function()
			{
				this._openPopup();
			},
			closePopup: function()
			{
				this._closePopup();
			},
			togglePopup: function()
			{
				if(this.element.hasClass(this.css_classes.opened))
				{
					this._closePopup();
				}
				else
				{
					this._openPopup();
				}
			},
		});
});
