Source: admin/javascript/engine/extensions/visibility_switcher.js

/* --------------------------------------------------------------
 visibility_switcher.js 2015-09-20
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2015 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## Visibility Switcher Extension
 * 
 * Use this extension in a parent element to easily define the visibility of child elements during the 
 * mouse hover of their containers. When the "mouseleave" event is triggered the children will be hidden.
 * 
 * ### Options 
 * 
 * **Rows | data-visibility_switcher-rows | String | Required**
 *
 * Provide a jQuery selector string which points to the elements that have the "hover" event. 
 * 
 * **Selections | data-visibility_switcher-selections | String | Required** 
 * 
 * Provide a jQuery selector string which points to the elements to be displayed upon the "hover" event.
 * 
 * ### Example 
 * 
 * In the following example the .row-action elements will be visible whenever the user hovers above of the 
 * `<tr>` element. The initial state of the elements must be hidden (thus the 'hidden' class).
 * 
 * ```html
 * <table data-gx-extension="visibility_switcher" 
 *       data-visibility_switcher-rows="tr.row" 
 *       data-visibility_switcher-selections="i.row-action"> 
 *   <tr class="row">
 *     <td>#1</td>
 *     <td>John Doe</td>
 *     <td>
 *       <i class="fa fa-pencil row-action edit hidden"></i>
 *       <i class="fa fa-trash row-action delete hidden"></i>
 *     </td>
 *   </tr>
 * </table>
 * ```
 * 
 * *Whenever the user hovers at the table rows the .row-action elements will be visible and whenever the 
 * mouse leaves the rows they will be hidden.*
 *
 * @module Admin/Extensions/visibility_switcher
 */
gx.extensions.module(
	'visibility_switcher',
	
	[],
	
	function(data) {
		
		'use strict';
		
		// ------------------------------------------------------------------------
		// VARIABLES DEFINITION
		// ------------------------------------------------------------------------
		
		var
			/**
			 * Module Selector
			 *
			 * @var {object}
			 */
			$this = $(this),
			
			/**
			 * Default Options
			 *
			 * @type {object}
			 * 
			 * @todo Rename 'rows' option to 'containerSelector' and 'selections' to 'childrenSelector'.
			 */
			defaults = {
				'rows': '.visibility_switcher', 
				'selections': '.tooltip-icon'
			},
			
			/**
			 * Final Options
			 *
			 * @var {object}
			 */
			options = $.extend(true, {}, defaults, data),
			
			/**
			 * Module Object
			 *
			 * @type {object}
			 */
			module = {};
		
		// ------------------------------------------------------------------------
		// PRIVATE FUNCTIONS
		// ------------------------------------------------------------------------
		
		var _visibility = function(e) {
			var $self = $(this);
			$self
				.filter(options.selections)
				.add($self.find(options.selections))
				.css('visibility', e.data.state);
		};
		
		// ------------------------------------------------------------------------
		// INITIALIZATION
		// ------------------------------------------------------------------------
		
		module.init = function(done) {
			
			$this
				.on('mouseenter', options.rows, {'state': 'visible'}, _visibility)
				.on('mouseleave', options.rows, {'state': 'hidden'}, _visibility);
			
			$this
				.find(options.rows + ' ' + options.selections)
				.css('visibility', 'hidden');
			
			done();
			
		};
		
		return module;
	});