/*
 *  Copyright 2013 Anyware Services
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * This class controls a ribbon button that opens/closes a tool or a window.
 * Unique instance tool state will be reflected the open/close status by beeing toggled or not.
 * @private
 */
Ext.define(
	"Ametys.plugins.cms.iframe.OpenUrlButtonController",
	{
		extend: "Ametys.ribbon.element.ui.ButtonController",

		/**
		 * @cfg {String} action Will be autogenerated.
		 * @inheritdoc
		 * @private
		 */
		/**
		 * @cfg {Boolean} toggle-enabled Will be autogenerated
		 * @inheritdoc
		 * @private
		 */
		/**
		 * @cfg {Boolean} toggle-state Will be autogenerated
		 * @inheritdoc
		 * @private
		 */

		/**
		 * @cfg {String} url (required) This configuration is required to set url of the iframe.
		 */
		
		/**
		 * @cfg {Boolean} [external=false] True to open the url in a new window. If false the url will be open inside a CMS tool.
		 */
		
		/**
		 * @property {Boolean} _external See #cfg-external.
		 * @private
		 */
		
		constructor: function(config)
		{
			config.action = this.self.getName() + "._act";
			
			this._external = config['external'] == 'true';
			if (!this._external)
			{
				config['toggle-enabled'] = true;
				Ametys.message.MessageBus.on(Ametys.message.Message.TOOL_OPENED, this._onToolOpenedOrClosed, this);
				Ametys.message.MessageBus.on(Ametys.message.Message.TOOL_CLOSED, this._onToolOpenedOrClosed, this);
			}
			
			this.callParent(arguments);
		},
	
		statics: {
			/**
			 * @protected
			 * This action do open the tool using the given Ametys.tool.ToolFactory role. The following additional configuration are required: #cfg-opentool-id, #cfg-opentool-config.
			 * @param {Ametys.ribbon.element.ui.button.OpenToolButtonController} controller This controller calling this function.
			 */
			_act: function (controller)
			{
				if (controller._external)
				{
					window.open(controller.getInitialConfig("url"));
				}
				else
				{
					var role = controller.getInitialConfig("opentool-id") || 'uitool-iframe';
					var parameters = {
							'id': controller.getInitialConfig("url"),
							'url': controller.getInitialConfig("url"),
							'label': controller.getInitialConfig("label"),
							'description': controller.getInitialConfig("description"),
							'icon-small': controller.getInitialConfig("icon-small"),
							'icon-medium': controller.getInitialConfig("icon-medium"),
							'icon-large': controller.getInitialConfig("icon-large")
					}

					var tool = Ametys.tool.ToolsManager.getTool(role + '$' + controller.getInitialConfig("url"))
					if (tool != null)
					{
						if (tool.getWrapper().isVisible())
						{
							tool.close();
							controller.toggle(false);
						}
						else
						{
							tool.focus();
							controller.toggle(true);
						}
					}
					else
					{
						Ametys.tool.ToolsManager.openTool(role, parameters);
						controller.toggle(true);
					}
				}
			}
		},
		
		/**
		 * Listener on tool opened/closed
		 * @param {Ametys.message.Message} message Tool message
		 * @private
		 */
		_onToolOpenedOrClosed: function(message)
		{
			var url = this.getInitialConfig("url");

			var thisToolTarget = message.getTarget(function (target) { return target.getParameters()['id'] == "uitool-iframe$" + url} );
			if (thisToolTarget)
			{
				this.toggle(message.getType() == Ametys.message.Message.TOOL_OPENED);
			}
		}
	}
);