/home/sylamedg/sylantechelectricals.com/wp-content/themes/thrive-theme/tests/js/js/util/element.js
class Element {

	/**
	 * Set an element as selected and in edit mode
	 * @param selector
	 * @param asynchronous
	 * @returns {*}
	 */
	static select( selector, asynchronous = false ) {
		const $element = Element.getBySelector( selector );

		if ( asynchronous ) {
			const promise = TVE.Editor_Page.selection_manager.select_element( $element );

			if ( $element.hasClass( 'theme-section' ) ) {
				$element.find( '.section-content' ).trigger( 'click', {emulate: true} );
			}
			/* csf, ncsf :( ... important e ca merge. */
			if ( $element.is( '#content' ) ) {
				$element.find( '.main-content-background' ).trigger( 'click', {emulate: true} );
			}

			return promise;
		}

		TVE.Editor_Page.focus_element( $element );

		return $element;
	}

	/**
	 * Get an element by selector.
	 * @param selector
	 * @returns {{jquery}}
	 */
	static getBySelector( selector ) {

		let $element;

		if ( selector.jquery ) {
			$element = selector;
		} else {
			const map = {};

			_.each( TVE.Elements, function ( element, key ) {
				map[ key ] = element.identifier;
			} );

			if ( map[ selector ] ) {
				$element = TVE.inner_$( map[ selector ] ).first();
			} else {
				$element = TVE.inner_$( selector ).first();
			}
		}

		return $element;
	}

	/**
	 * Insert a type of element from sidebar on a specific target
	 * @param type
	 * @param $target
	 * @param attr
	 * @returns {*}
	 */
	static insert( type = '', $target = null, attr = {} ) {

		if ( ! type || typeof TVE.Elements[ type ] === 'undefined' ) {
			throw new Error( `Unknown element type: ${type}` )
		}

		if ( ! $target || ! $target.length ) {
			$target = TVE.Theme.$sections.top.find( '.section-content' );
		}

		let $element;

		if ( typeof TVE.renderers[ type ] === 'undefined' ) {
			$element = TVE.main.static_element( type ).children().first();
			$target.append( $element );
		} else {
			$element = TVE.inner_$( TVE.renderers[ type ].render_default( $target ) )
		}

		for ( const key in attr ) {
			$element.attr( key, attr[ key ] );
		}

		TVE.Theme.content.init_selectors( $target );

		return $element
	}

	/**
	 * Check if an element is visible
	 * @param selector
	 * @returns {null|boolean}
	 */
	static isVisible( selector ) {

		if ( selector.jQuery ) {
			selector = $( selector );
		}

		if ( selector.length !== 1 ) {
			return null;
		}

		let isVisible = true;

		if ( selector.is( '.control-hide' ) ) {
			isVisible = false;
		}

		isVisible = isVisible && [ 'block', 'inline', 'inline-block', 'flex', 'inline-flex' ].indexOf( selector.css( 'display' ) ) !== - 1;

		return isVisible;
	}

	/**
	 *
	 * @param {HTMLElement|jquery} element
	 * @param {String} direction
	 */
	static offset( element, direction = '' ) {
		if ( element.jquery ) {
			element = element[ 0 ]
		}

		let offset;

		switch ( direction ) {
			case 'left':
				offset = element.offsetLeft;
				break;
			case 'top':
				offset = element.offsetTop;
				break;
			case 'right':
				offset = element.offsetLeft + element.offsetWidth;
				break;
			case 'bottom':
				offset = element.offsetTop + element.offsetHeight;
				break;
			default:
				offset = false;
		}

		return offset;
	}
}

module.exports = Element;