HEX
Server: LiteSpeed
System: Linux server315.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: globfdxw (6114)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/globfdxw/www/wp-content/plugins/ubermenu/includes/functions.php
<?php

// Ensure the Menus screen appears for themes that use FSE
add_action('after_setup_theme', 'ubermenu_menus_support');
function ubermenu_menus_support()
{
	add_theme_support('menus');
}

add_action('plugins_loaded', 'ubermenu_load_gutenberg_block');
function ubermenu_load_gutenberg_block()
{
	if (function_exists('register_block_type')) {
		include_once ('gutenberg/gutenberg.php');
	}
}

add_action('plugins_loaded', 'ubermenu_load_textdomain');
function ubermenu_load_textdomain()
{
	load_plugin_textdomain('ubermenu', false, UBERMENU_BASEDIR . '/languages');
}

add_action('in_plugin_update_message-ubermenu/ubermenu.php', 'ubermenu_plugin_update_message', 10, 2);
function ubermenu_plugin_update_message($data, $response)
{
	// uberp($data);
	// uberp($response);
	if (!empty($response->upgrade_notice)) {
		echo '<style>.ubermenu-inline-update-message + p:empty{ display:none; }</style>'; // hides extra p created by autop
		echo '<div class="ubermenu-inline-update-message" style="background:#ffd100; padding:1em;margin:1em 0;">' . $response->upgrade_notice . '</div>';
	}
}


add_filter('wp', 'ubermenu_wp_actions');
function ubermenu_wp_actions()
{

	//Exclude UberMenu Advanced Items from other menus
	if (ubermenu_op('exclude_advanced_ubermenu_items', 'general') === 'on') {
		add_filter('wp_nav_menu_objects', 'ubermenu_exclude_advanced_items', 20, 2);
	}

}

function ubermenu_register_style($handle, $src = '', $deps = array(), $ver = false, $media = 'all')
{
	_UBERMENU()->register_stylesheet($handle, $src, $deps, $ver, $media);
}
function ubermenu_enqueue_style($handle, $src = '', $deps = array(), $ver = false, $media = 'all')
{
	_UBERMENU()->load_stylesheet($handle, $src, $deps, $ver, $media);
}
function ubermenu_register_script($handle, $src = '', $deps = array(), $ver = false, $in_footer = false)
{
	_UBERMENU()->register_script($handle, $src, $deps, $ver, $in_footer);
}
function ubermenu_enqueue_script($handle, $src = '', $deps = array(), $ver = false, $in_footer = false)
{
	_UBERMENU()->load_script($handle, $src, $deps, $ver, $in_footer);
}

function ubermenu_load_assets()
{

	$assets = UBERMENU_URL . 'assets/';

	//Load Core UberMenu CSS unless disabled
	if (ubermenu_op('load_ubermenu_css', 'general') != 'off') {
		wp_register_style('ubermenu', $assets . 'css/ubermenu.min.css', false, UBERMENU_VERSION);

		//wp_enqueue_style( 'ubermenu' );
		ubermenu_enqueue_style('ubermenu');
	}

	//Load Required Skins
	$instances = ubermenu_get_menu_instances(true);
	foreach ($instances as $instance) {
		$skin = ubermenu_op('skin', $instance);
		ubermenu_enqueue_skin($skin);
	}

	//
	//Font Awesome
	//

	//Font Awesome CSSFonts
	$load_fa_solid = ubermenu_op('load_fontawesome_fontcss_solid', 'general') !== 'off';
	$load_fa_brands = ubermenu_op('load_fontawesome_fontcss_brands', 'general') !== 'off';
	$load_fa_regular = ubermenu_op('load_fontawesome_fontcss_regular', 'general') !== 'off';
	$load_fa_core = $load_fa_solid || $load_fa_brands || $load_fa_regular;
	$load_fa_all = $load_fa_solid && $load_fa_brands && $load_fa_regular;


	if ($load_fa_all)
		ubermenu_enqueue_style('ubermenu-font-awesome-all', UBERMENU_URL . 'assets/fontawesome/css/all.min.css', false, false);
	else {
		if ($load_fa_core)
			ubermenu_enqueue_style('ubermenu-font-awesome-core', UBERMENU_URL . 'assets/fontawesome/css/fontawesome.min.css', false, false);
		if ($load_fa_solid)
			ubermenu_enqueue_style('ubermenu-font-awesome-solid', UBERMENU_URL . 'assets/fontawesome/css/solid.min.css', false, false);
		if ($load_fa_brands)
			ubermenu_enqueue_style('ubermenu-font-awesome-brands', UBERMENU_URL . 'assets/fontawesome/css/brands.min.css', false, false);
		if ($load_fa_regular)
			ubermenu_enqueue_style('ubermenu-font-awesome-regular', UBERMENU_URL . 'assets/fontawesome/css/regular.min.css', false, false);
	}

	//Font Awesome SVG
	$load_fasvg_solid = ubermenu_op('load_fontawesome_svg_solid', 'general') !== 'off';
	$load_fasvg_brands = ubermenu_op('load_fontawesome_svg_brands', 'general') !== 'off';
	$load_fasvg_regular = ubermenu_op('load_fontawesome_svg_regular', 'general') !== 'off';
	$load_fasvg_core = $load_fasvg_solid || $load_fasvg_brands || $load_fasvg_regular;
	$load_fasvg_all = $load_fasvg_solid && $load_fasvg_brands && $load_fasvg_regular;

	if ($load_fasvg_all)
		ubermenu_enqueue_script('ubermenu-font-awesome-js-all', UBERMENU_URL . 'assets/fontawesome/js/all.min.js', false, false, false);
	else {
		if ($load_fasvg_solid)
			ubermenu_enqueue_script('ubermenu-font-awesome-js-solid', UBERMENU_URL . 'assets/fontawesome/js/solid.min.js', false, false, false);
		if ($load_fasvg_brands)
			ubermenu_enqueue_script('ubermenu-font-awesome-js-brands', UBERMENU_URL . 'assets/fontawesome/js/brands.min.js', false, false, false);
		if ($load_fasvg_regular)
			ubermenu_enqueue_script('ubermenu-font-awesome-js-regular', UBERMENU_URL . 'assets/fontawesome/js/regular.min.js', false, false, false);
		//Core needs to be loaded last
		if ($load_fasvg_core)
			ubermenu_enqueue_script('ubermenu-font-awesome-js-core', UBERMENU_URL . 'assets/fontawesome/js/fontawesome.min.js', false, false, false);
	}

	//Font Awesome 4 shim
	if (ubermenu_op('load_fontawesome4_shim', 'general') == 'on') {
		//wp_enqueue_script( 'ubermenu-font-awesome4-shim' , UBERMENU_URL.'assets/fontawesome/svg/js/fa-v4-shims.min.js' , false , false , false );
		ubermenu_enqueue_script('ubermenu-font-awesome4-shim', UBERMENU_URL . 'assets/fontawesome/js/v4-shims.min.js', false, false, false);
	}
	add_filter('script_loader_tag', 'ubermenu_fontawesome_defer', 10, 2);


	// if( ubermenu_op( 'load_fontawesome' , 'general' ) != 'off' ){
	// 	//font awesome 4
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , $assets.'css/fontawesome/css/font-awesome.min.css' , false , '4.3' );
	//
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , 'https://use.fontawesome.com/releases/v5.0.7/css/all.css' , false );
	//
	// 	//font awesome 5
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , 'https://use.fontawesome.com/releases/v5.0.7/css/all.css' , false );
	// 	wp_enqueue_script( 'ubermenu-font-awesome-js' , UBERMENU_URL.'assets/fontawesome/svg/js/fontawesome-all.min.js' , false , false , false );
	// 	add_filter( 'script_loader_tag', 'ubermenu_fontawesome_defer', 10, 2 );

	// }




	//Custom Stylesheet
	if (ubermenu_op('load_custom_css', 'general') == 'on') {
		ubermenu_enqueue_style('ubermenu-custom-stylesheet', UBERMENU_URL . 'custom/custom.css', false, UBERMENU_VERSION);
	}



	//jQuery
	ubermenu_enqueue_script('jquery');

	//Google Maps
	if (ubermenu_op('load_google_maps', 'general') == 'on') {
		//Google Maps API
		$gmaps_uri = '//maps.googleapis.com/maps/api/js';

		$query_params = array();

		//API Key
		$api_key = trim(ubermenu_op('google_maps_api_key', 'general'));
		if ($api_key) {
			$query_params['key'] = $api_key;
		}

		//Language
		$language = trim(ubermenu_op('google_maps_language', 'general'));
		if ($language) {
			$query_params['language'] = $language;
		}

		//Region
		$region = trim(ubermenu_op('google_maps_region', 'general'));
		if ($region) {
			$query_params['region'] = $region;
		}

		//Callback, Libraries, Async
		// $query_params['callback'] = 'Function.prototype';
		$query_params['callback'] = 'ubermenu_init_googlemaps';
		$query_params['libraries'] = 'marker';
		$query_params['loading'] = 'async';

		$query = http_build_query($query_params);

		$gmaps_uri .= '?' . $query;

		ubermenu_register_script('google-maps', $gmaps_uri, array('jquery'), null, true);
	}

	//UberMenu JS
	if (SCRIPT_DEBUG) {
		ubermenu_enqueue_script('ubermenu', $assets . 'js/ubermenu.js', array('jquery'), UBERMENU_VERSION, UBERMENU_JS_IN_FOOTER);
	} else {
		ubermenu_enqueue_script('ubermenu', $assets . 'js/ubermenu.min.js', array('jquery'), UBERMENU_VERSION, UBERMENU_JS_IN_FOOTER);
	}

	$responsive_breakpoint = intval(ubermenu_op('responsive_breakpoint', 'general'));
	if ($responsive_breakpoint == 0)
		$responsive_breakpoint = 959;

	// $config_data = array();
	// $configs = ubermenu_get_menu_instances(true);
	// foreach( $configs as $config_id ){
	// 	$config_data[$config_id] = array(
	// 		//add data here
	// 	);
	// }

	$localized_data = array(
		'remove_conflicts' => ubermenu_op('remove_conflicts', 'general'),
		'reposition_on_load' => ubermenu_op('reposition_on_load', 'general'),
		'intent_delay' => ubermenu_op('intent_delay', 'general'),
		'intent_interval' => ubermenu_op('intent_interval', 'general'),
		'intent_threshold' => ubermenu_op('intent_threshold', 'general'),
		'scrollto_offset' => ubermenu_op('scrollto_offset', 'general'),
		'scrollto_duration' => ubermenu_op('scrollto_duration', 'general'),
		'responsive_breakpoint' => $responsive_breakpoint,
		'accessible' => ubermenu_op('accessible', 'general'),
		'mobile_menu_collapse_on_navigate' => ubermenu_op('mobile_menu_collapse_on_navigate', 'general'),
		'retractor_display_strategy' => ubermenu_op('retractor_display_strategy', 'general'),
		'touch_off_close' => ubermenu_op('touch_off_close', 'general'),
		'submenu_indicator_close_mobile' => ubermenu_op('submenu_indicator_close_mobile', 'general'),
		'collapse_after_scroll' => ubermenu_op('collapse_after_scroll', 'general'),
		'v' => UBERMENU_VERSION,
		'configurations' => ubermenu_get_menu_instances(true),
		'ajax_url' => admin_url('admin-ajax.php'),
		'plugin_url' => UBERMENU_URL,
		'disable_mobile' => ubermenu_op('disable_mobile', 'main'),	//just for troubleshooting
		'prefix_boost' => ubermenu_op('custom_prefix', 'general'),
		'use_core_svgs' => ubermenu_op('use_core_svgs', 'general'),

		//accessibility
		'aria_role_navigation' => ubermenu_op('aria_role_navigation', 'general'),
		'aria_nav_label' => ubermenu_op('aria_nav_label', 'general'),
		'aria_expanded' => ubermenu_op('aria_expanded', 'general'),
		'aria_haspopup' => ubermenu_op('aria_haspopup', 'general'),
		'aria_hidden' => ubermenu_op('aria_hidden', 'general'),
		'aria_controls' => ubermenu_op('aria_controls', 'general'),
		'aria_responsive_toggle' => ubermenu_op('aria_responsive_toggle', 'general'),
		'icon_tag' => ubermenu_op('icon_tag', 'main'), // grab from main since no global
		'esc_close_mobile' => ubermenu_op('esc_close_mobile', 'general'),
		'keyboard_submenu_trigger' => ubermenu_op('keyboard_submenu_trigger', 'general'),

		//info
		'theme_locations' => get_registered_nav_menus(),

		//configs
		//'configs' => $config_data,
	);

	$localized_data = apply_filters('ubermenu_json_data', $localized_data);

	wp_localize_script('ubermenu', 'ubermenu_data', $localized_data);

	//Custom JS
	if (ubermenu_op('load_custom_js', 'general') == 'on') {
		ubermenu_enqueue_script('ubermenu-custom', UBERMENU_URL . 'custom/custom.js', array('jquery'), UBERMENU_VERSION, UBERMENU_JS_IN_FOOTER);
	}


	//wp_register_script( 'ubermenu-customizer' , $assets . 'admin/assets/customizer.js' , array( 'jquery' ) , UBERMENU_VERSION , true );
}
add_action('wp_enqueue_scripts', 'ubermenu_load_assets', 21);


function ubermenu_fontawesome_defer($tag, $handle)
{
	if ('ubermenu-font-awesome-js-all' === $handle || 'ubermenu-font-awesome-js-solid' === $handle || 'ubermenu-font-awesome-js-brands' === $handle || 'ubermenu-font-awesome4-shim' === $handle) {
		$tag = str_replace(' src', ' defer src', $tag);
	}
	return $tag;
}

function ubermenu_inject_custom_css()
{
	echo '<style id="ubermenu-custom-generated-css">';
	//echo ubermenu_generate_custom_styles();
	echo ubermenu_get_custom_styles();

	global $is_IE;
	if ($is_IE) {
		echo "\n@media \\0screen { .ubermenu .ubermenu-image { width: auto } } /* Prevent height distortion in IE8. */\n";
	}
	echo "\n</style>";
}
add_action('wp_head', 'ubermenu_inject_custom_css');


function ubermenu_get_skin_ops()
{

	$registered_skins = _UBERMENU()->get_skins();
	if (!is_array($registered_skins))
		return array();
	$ops = array();
	foreach ($registered_skins as $id => $skin) {
		$ops[$id] = $skin['title'];
	}
	return $ops;

}
function ubermenu_register_skin($id, $title, $path, $classes = '')
{
	_UBERMENU()->register_skin($id, $title, $path, $classes);
}

add_action('init', 'ubermenu_register_skins');
function ubermenu_register_skins()
{

	$main = UBERMENU_URL . 'assets/css/skins/';
	//Custom prefix booster
	if (ubermenu_op('custom_prefix', 'general')) {
		$uploads_url = wp_upload_dir();
		$uploads_url = trailingslashit($uploads_url['baseurl']);
		$main = $uploads_url . 'ubermenu/';
	}



	ubermenu_register_skin('minimal', 'Minimal base (for customizing)', $main . 'minimal.css');

	ubermenu_register_skin('grey-white', __('Black &amp; White', 'ubermenu'), $main . 'blackwhite.css');
	ubermenu_register_skin('black-white-2', __('Black &amp; White', 'ubermenu') . ' 2.0', $main . 'blackwhite2.css', 'ubermenu-has-border');
	ubermenu_register_skin('vanilla', __('Vanilla', 'ubermenu'), $main . 'vanilla.css');
	ubermenu_register_skin('vanilla-bar', __('Vanilla Bar', 'ubermenu'), $main . 'vanilla_bar.css', 'ubermenu-has-border');

}


function ubermenu_enqueue_skin($skin)
{
	ubermenu_enqueue_style('ubermenu-' . $skin);
}


function ubermenu_init_actions()
{
	add_action('ubermenu_register_icons', 'ubermenu_register_default_icons', 10);
	do_action('ubermenu_register_icons');
}
add_action('after_setup_theme', 'ubermenu_init_actions', 20);

function ubermenu_setup_easy_integration()
{
	if (ubermenu_op('ubermenu_theme_location', 'general') == 'on') {
		register_nav_menu('ubermenu', 'UberMenu [Easy Integration]');
	}
}
add_action('init', 'ubermenu_setup_easy_integration');


function ubermenu_get_menu_instances($main = false)
{
	$instances = get_option(UBERMENU_MENU_INSTANCES, array());

	if ($main) {
		$instances[] = 'main';
	}

	return $instances;
}


function ubermenu_get_nav_menu_ops()
{
	$menus = wp_get_nav_menus(array('orderby' => 'name'));
	$m = array('_none' => __('Select Menu', 'ubermenu'));
	foreach ($menus as $menu) {
		$m[$menu->term_id] = $menu->name;
	}
	return $m;
}

function ubermenu_get_theme_location_ops()
{
	$locs = get_registered_nav_menus();
	//$default = array( '_none' => 'Select Theme Location or use Menu Setting' );
	//$locs = array_unshift( $default, $locs );
	//$locs = $default + $locs;

	$menus = get_nav_menu_locations();
	foreach ($locs as $loc_id => $loc_name) {

		if (isset($menus[$loc_id]) && $menus[$loc_id]) {
			$locs[$loc_id] .= ' <span class="ubermenu-assigned"><strong>' . wp_get_nav_menu_object($menus[$loc_id])->name . '</strong></span>';
		} else {
			$locs[$loc_id] .= ' <span class="ubermenu-assigned ubermenu-assigned-none">' . __('No menu assigned', 'ubermenu') . '</span>';
		}
	}

	return $locs;
}




/*
 * By Instance
 *
 * $integration_type - 'api' or 'auto'
 */
function ubermenu_get_nav_menu_args($args, $integration_type, $config_id = 0)
{

	if (isset($args['uber_segment']))
		return $args; //Ignore segments

	$theme_location = '';
	$nav_menu_id = 0;
	$strict_mode = ubermenu_op('strict_mode', 'general') == 'off' ? false : true;

	//Determine theme_location
	//Determine config_id (if not passed)
	//Determine nav_menu_id
	switch ($integration_type) {


		case 'auto':

			//Is it UberMenu?

			//Check for assigned Theme Location

			//For automatic integration, if there is no theme_location, we can't do anything
			if ($strict_mode && (!isset($args['theme_location']) || !$args['theme_location'])) {
				return $args;
			}

			//Determine Menu Instance ID by theme_location
			if (isset($args['theme_location']) && $args['theme_location']) {
				$theme_location = $args['theme_location'];
				$config_id = ubermenu_get_menu_instance_by_theme_location($theme_location);
			}
			//[Non-strict mode] If there is no theme location at this point, we must have
			//strict mode disabled.  Therefore, default to Main instance
			else {
				$config_id = 'main';

				//However, in this case we require a 'menu' param to be passed
				if (isset($args['menu']) && $args['menu']) {
					$nav_menu_id = $args['menu'];
				}
				//If we don't have a theme location or menu parameter, the menu is indetermined
				else {
					$nav_menu_id = '_undetermined_';
				}
			}

			//If this theme location is not activated, ignore it
			if (!$config_id)
				return $args;

			//Find nav_menu_id
			//look up the ID based on the theme location, assuming it exists

			if ($theme_location && has_nav_menu($theme_location)) {
				$menus = get_nav_menu_locations();
				$nav_menu_id = $menus[$theme_location];
			}

			//Check that we're on the right theme location instance
			if ($theme_location) {
				//Count this theme location instance
				_UBERMENU()->count_theme_location($theme_location);

				//Determine what instance we're targeting
				$target_instance = ubermenu_op('theme_location_instance', $config_id);
				if (is_numeric($target_instance)) {
					$target_instance = (int) $target_instance;
				} else if ($target_instance == '') {
					$target_instance = 0;
				} else {
					ubermenu_admin_notice(__('Theme Location Instance should be an integer or leave blank.  Defaulting to 0.', 'ubermenu'));
					$target_instance = 0;
				}

				//If we're not targeting all instances
				if ($target_instance > 0) {

					//Check that the target theme location instance is the current theme location instance
					//If it isn't, then ignore
					if ($target_instance !== _UBERMENU()->get_theme_location_count($theme_location)) {
						return $args;
					}
				}

				//Ignore Mobile?
				if (ubermenu_op('disable_mobile', $config_id) == 'on' && ubermenu_is_mobile()) {
					return $args;
				}
			}

			break;


		case 'api':

			//instance_id
			if ($config_id != 'main') {
				$instances = ubermenu_get_menu_instances();
				if (array_search($config_id, $instances) === false) {
					$notice = '<strong>' . $config_id . '</strong> ' . __('is not a valid Configuration ID.  Please pass a valid Configuration ID to the ubermenu() function.', 'ubermenu');
					ubermenu_admin_notice($notice);
				}
			}

			//Always UberMenu
			$theme_location = (isset($args['theme_location']) && $args['theme_location'])
				? $args['theme_location'] : 0;


			//If a Menu ID was passed in the args, use that
			if (isset($args['menu']) && $args['menu']) {
				$nav_menu_id = $args['menu'];
			}
			//No Menu ID was passed, get the assigned menu based on the instance
			else {
				$_menu_id = ubermenu_op('nav_menu_id', $config_id);

				if ($_menu_id && $_menu_id != '_none') {
					$nav_menu_id = $_menu_id;
				} else {
					//No menu passed, no menu assigned, try the theme location
					if ($theme_location && has_nav_menu($theme_location)) {
						$menus = get_nav_menu_locations();
						$nav_menu_id = $menus[$theme_location];
					}
				}

				//Setup args
				if ($nav_menu_id) {
					$args['menu'] = $nav_menu_id;	//TODO ...
				}
			}

			//Don't know what the nav menu ID is still
			if (!$nav_menu_id) {
				if (!$theme_location)
					$args['theme_location'] = '__um_undetermined__';
			}

			//If a theme location was used, count it.  But we don't care if this is the target
			//or not, since the API was used
			if ($theme_location) {
				_UBERMENU()->count_theme_location($theme_location);
			}

			break;

	}




	//Allow filtering to a different Configuration at this point
	$config_id = apply_filters('ubermenu_configuration_id', $config_id, $args);


	//UL attributes - since we can't add anything to the nav tag
	$ul_atts = array();

	//Menu title is used for the aria-label on the nav tag, but this can be filtered
	$nav_menu_ob = wp_get_nav_menu_object($nav_menu_id);
	$menu_title = $nav_menu_ob ? $nav_menu_ob->name : '';
	$menu_title = apply_filters('ubermenu_menu_title', $menu_title, $nav_menu_id, $config_id, $args);
	if ($menu_title)
		$ul_atts['data-title'] = $menu_title;

	//Walk the array
	array_walk($ul_atts, function (&$val, $att) {
		//$ul_atts_str.= $att.'='.$val.' ';
		$val = "$att=\"$val\"";
	});
	//Combine the values
	$ul_atts_str = ' ' . implode(' ', $ul_atts);	//beginning space is important

	// Set up walker
	$walker = new UberMenuWalker;
	_UBERMENU()->set_walker($walker);

	//Basics
	$args['container_class'] = 'ubermenu ubermenu-nojs';
	$args['menu_class'] = 'ubermenu-nav';
	$args['walker'] = $walker;
	$args['uber_instance'] = $config_id;
	$args['fallback_cb'] = 'ubermenu_fallback_cb';
	$args['depth'] = 0;
	$args['items_wrap'] = '<ul id="%1$s" class="%2$s"' . $ul_atts_str . '>%3$s</ul>';
	$args['link_before'] = '';
	$args['link_after'] = '';
	$args['uber_integration_type'] = $integration_type;


	//Make sure nav menu ID is a string so that it can be used as part of the ID
	if (is_object($nav_menu_id)) {
		if (isset($nav_menu_id->term_id)) {
			$nav_menu_id = $nav_menu_id->term_id;
		} else {
			$nav_menu_id = '_bad_id_';
		}
	}

	//ID
	$args['container_id'] = 'ubermenu-' . $config_id . '-' . sanitize_key($nav_menu_id);
	if ($theme_location) {
		$args['container_id'] .= '-' . sanitize_key($theme_location);
		$theme_location_count = _UBERMENU()->get_theme_location_count($theme_location);
		if ($theme_location_count > 1) {
			$args['container_id'] .= '-' . $theme_location_count;
		}
	}


	//Inner ID
	if (!isset($args['menu_id']) || !$args['menu_id'] || $integration_type == 'auto') {
		$args['menu_id'] = 'ubermenu-nav-' . $config_id . '-' . $nav_menu_id;
		if ($theme_location)
			$args['menu_id'] .= '-' . sanitize_key($theme_location);
	}

	//Cache
	$args['menu_cache_key'] = "|uber|$config_id|$nav_menu_id|$theme_location";	//For WP Menu Cache Plugin

	//Container
	$args['container'] = ubermenu_op('container_tag', $config_id); // . ' role="navigation"';

	//Menu Instance ID
	$args['container_class'] .= ' ubermenu-' . $config_id;

	//Menu ID
	$args['container_class'] .= ' ubermenu-menu-' . $nav_menu_id;

	//Theme Location
	if ($theme_location) {
		$args['container_class'] .= ' ubermenu-loc-' . sanitize_title($theme_location);
	}

	//Responsive
	if (ubermenu_op('responsive', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-responsive';

		if (ubermenu_op('responsive_columns', $config_id) == 1) {
			$args['container_class'] .= ' ubermenu-responsive-single-column';
		}

		if (ubermenu_op('responsive_submenu_columns', $config_id) == 1) {
			$args['container_class'] .= ' ubermenu-responsive-single-column-subs';
		}

		$breakpoint = ubermenu_op('responsive_breakpoint', 'general');
		if (!$breakpoint) {
			$breakpoint = 'default';
		} else {
			$breakpoint = intval($breakpoint);
		}
		$args['container_class'] .= ' ubermenu-responsive-' . $breakpoint;

		if (ubermenu_op('mobile_menu_display', $config_id) === 'modal') {
			$args['container_class'] .= ' ubermenu-mobile-modal';
			//TODO add close button
			$args['items_wrap'] = ubermenu_get_mobile_header($config_id) . $args['items_wrap'] . ubermenu_get_mobile_footer($config_id);
		}
		if (ubermenu_op('mobile_submenu_type', $config_id) === 'accordion') {
			$args['container_class'] .= ' ubermenu-mobile-accordion';

			if (ubermenu_op('mobile_accordion_folding', $config_id) === 'single') {
				$args['container_class'] .= ' ubermenu-mobile-accordion-single';
			}
			if (ubermenu_op('mobile_accordion_indent', $config_id) != '') {
				$args['container_class'] .= ' ubermenu-mobile-accordion-indent';
			}
		}
	}

	//Responsive no collapse
	if (ubermenu_op('responsive_collapse', $config_id) == 'off') {
		$args['container_class'] .= ' ubermenu-responsive-nocollapse';
	} else {
		$args['container_class'] .= ' ubermenu-responsive-collapse';
	}

	//Orientation
	$orientation = ubermenu_op('orientation', $config_id) == 'vertical' ? 'vertical' : 'horizontal';
	$args['container_class'] .= ' ubermenu-' . $orientation;

	//Transition
	$transition = ubermenu_op('transition', $config_id);
	$args['container_class'] .= ' ubermenu-transition-' . $transition;

	//Trigger
	$trigger = ubermenu_op('trigger', $config_id);
	$args['container_class'] .= ' ubermenu-trigger-' . $trigger;

	//Skin
	$skin = ubermenu_op('skin', $config_id);
	$args['container_class'] .= ' ubermenu-skin-' . $skin;
	$args['container_class'] .= ' ' . _UBERMENU()->get_skin_classes($skin);	//echo '[[['._UBERMENU()->get_skin_classes( $skin ).']]]';

	//Menu Bar Alignment
	$bar_align = ubermenu_op('bar_align', $config_id);
	$args['container_class'] .= ' ubermenu-bar-align-' . $bar_align;

	//Menu Item Alignment
	$items_align = ubermenu_op('items_align', $config_id);
	$args['container_class'] .= ' ubermenu-items-align-' . $items_align;

	//Menu Item Vertical Stretch
	if (ubermenu_op('items_vertical_stretch', $config_id) === 'on') {
		$args['container_class'] .= ' ubermenu-items-vstretch';
	}

	//Menu Item Vertical Alignment
	// $items_align_vertical = ubermenu_op( 'items_align_vertical' , $config_id );
	// if( $items_align_vertical != 'bottom' ){
	// 	$args['container_class'].= ' ubermenu-items-align-'.$items_align_vertical;
	// }

	//Inner Menu Center
	if (ubermenu_op('bar_inner_center', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-bar-inner-center';
	}

	//Submenu Bound
	if (ubermenu_op('bound_submenus', $config_id) == 'on' || ubermenu_op('orientation', $config_id) == 'vertical') {
		$args['container_class'] .= ' ubermenu-bound';
	} else if (ubermenu_op('bound_submenus', $config_id) == 'inner') {
		$args['container_class'] .= ' ubermenu-bound-inner';
	}

	//Submenu Scrolling
	if ($transition != 'slide' && ubermenu_op('submenu_scrolling', $config_id) != 'on') {
		$args['container_class'] .= ' ubermenu-disable-submenu-scroll';
	}


	//Force Current Submenus
	if (ubermenu_op('force_current_submenus', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-force-current-submenu';
	}

	//Invert Submenus
	if (ubermenu_op('invert_submenus', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-invert';
	}



	//Submenu Background Image Hiding
	if (ubermenu_op('submenu_background_image_reponsive_hide', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-hide-bkgs';
	}

	//Responsive Collapse //responsive_collapse
	//$args['container_class'].= ' ubermenu-collapse';

	//Submenu Indicators
	if (ubermenu_op('display_submenu_indicators', $config_id) == 'on') {
		$args['container_class'] .= ' ubermenu-sub-indicators';
	}

	//Submenu indicator alignment/position
	if (ubermenu_op('style_align_submenu_indicator', $config_id) == 'text') {
		$args['container_class'] .= ' ubermenu-sub-indicators-align-text';
	}

	//Retractors
	if (ubermenu_op('retractor_display_strategy', 'general') == 'responsive') {
		$args['container_class'] .= ' ubermenu-retractors-responsive';
	}

	//Icon Display
	if (ubermenu_op('icon_display', $config_id) == 'inline') {
		$args['container_class'] .= ' ubermenu-icons-inline';
	}


	//Submenu indicator close button
	if (ubermenu_op('submenu_indicator_close_mobile', 'general') !== 'off') {
		$args['container_class'] .= ' ubermenu-submenu-indicator-closes';
	}


	//Accessibility - handled in JS only now
	// if( ubermenu_op( 'accessible' , 'general' ) == 'on' ){
	// 	$args['container_class'].= ' ubermenu-accessible';
	// }

	//Don't allow class filtering
	if (ubermenu_op('disable_class_filtering', 'general') == 'on')
		remove_all_filters('nav_menu_css_class');

	//$args['container_class'].= ' ubermenu-pad-submenus';

	//Set the Current Instance for Reference
	_UBERMENU()->set_current_config($config_id);

	return apply_filters('ubermenu_nav_menu_args', $args, $config_id);
}

//add_filter( 'wp_nav_menu_container_allowedtags', 'ubermenu_allowed_nav_tags' );
function ubermenu_allowed_nav_tags($tags)
{
	$tags[] = 'nav role="navigation"';
	$tags[] = 'div role="navigation"';
	return $tags;
}

function ubermenu_fallback_cb($args)
{
	//up( $args );

	$notice = __('No menu to display.', 'ubermenu');

	if (isset($args['theme_location'])) {
		$theme_location = $args['theme_location'];

		if ($theme_location == '__um_undetermined__') {
			$instance = $args['uber_instance'];
			$notice .= ' Please either <a target="_blank" href="' . admin_url('themes.php?page=ubermenu-settings#ubermenu_' . $instance) . '">assign a default menu to the <strong>' . $instance . '</strong> menu instance</a>, or pass it a Menu ID via the API';
		} else {
			$locs = get_registered_nav_menus();
			if (isset($locs[$theme_location])) {
				$theme_loc_name = $locs[$theme_location];
				$notice = 'Please <a target="_blank" href="' . admin_url('nav-menus.php?action=locations') . '">assign a menu</a> to the <strong>' . $theme_loc_name . '</strong> theme location.';
			}
		}
	}

	ubermenu_admin_notice($notice);
}


function ubermenu_get_menu_instance_by_theme_location($theme_location)
{

	//Check Main
	$auto_theme_locations = ubermenu_op('auto_theme_location', 'main');
	if (is_array($auto_theme_locations)) {
		foreach ($auto_theme_locations as $loc) {
			if ($theme_location == $loc) {
				return 'main';
			}
		}
	}


	//Check Instances
	$instances = ubermenu_get_menu_instances();

	foreach ($instances as $config_id) {
		$auto_theme_locations = ubermenu_op('auto_theme_location', $config_id);

		if (is_array($auto_theme_locations)) {
			foreach ($auto_theme_locations as $loc) {
				if ($theme_location == $loc) {
					return $config_id;
				}
			}
		}
	}

	return false;
}

function ubermenu_automatic_integration_filter($args)
{
	//Only do auto-integrate if this menu hasn't already been handled
	if (!isset($args['uber_integration_type'])) {
		$args = ubermenu_get_nav_menu_args($args, 'auto');
	}
	return $args;
}
add_filter('wp_nav_menu_args', 'ubermenu_automatic_integration_filter', 1000);


function ubermenu_force_filter($args)
{

	if (ubermenu_op('force_filter', 'general') == 'on') {
		//For main UberMenus
		if (isset($args['uber_integration_type'])) {
			$args = ubermenu_get_nav_menu_args($args, $args['uber_integration_type'], $args['uber_instance']);
		}
		//For menu segments, replace altered arguments with original array
		else if (isset($args['uber_segment'])) {
			if (isset($args['uber_segment_args']))
				$args = $args['uber_segment_args'];
		}
	}
	return $args;
}
add_filter('wp_nav_menu_args', 'ubermenu_force_filter', 100000);


function ubermenu_prevent_menu_item_class_filtering()
{
	if (ubermenu_op('disable_class_filters')) {
		remove_all_filters('nav_menu_css_class');
	}
}
//add_action( 'wp_head' , 'ubermenu_prevent_menu_item_class_filtering' );

function ubermenu_direct_injection_registration()
{
	if (ubermenu_op('direct_inject', 'main') == 'on') {
		register_nav_menu('ubermenu-direct-inject', __('UberMenu [Direct Injection]', 'ubermenu'));
	}
}
add_action('init', 'ubermenu_direct_injection_registration');

function ubermenu_direct_injection()
{
	if (ubermenu_op('direct_inject', 'main') == 'on') {
		if (has_nav_menu('ubermenu-direct-inject')) {
			ubermenu('main', array('theme_location' => 'ubermenu-direct-inject'));
		} else {
			echo '<div class="ubermenu ubermenu-loc-ubermenu-direct-inject">';
			ubermenu_admin_notice('Please <a target="_blank" href="' . admin_url('nav-menus.php?action=locations') . '">assign a menu</a> to the <strong>UberMenu [Direct Injection]</strong> theme location');
			echo '</div>';
		}
	}
}
add_action('wp_footer', 'ubermenu_direct_injection');

function ubermenu_skipnav_filter($nav_menu, $args)
{
	//Add to UberMenu, ignore segments
	if (isset($args->uber_instance) && !isset($args->uber_segment)) {
		//up( $args );

		if (ubermenu_op('skip_navigation', 'general') == 'on') {

			$skipnav_target_id = $args->container_id . '-skipnav';

			$skipnav = '<a href="#' . $skipnav_target_id . '" class="ubermenu-skipnav ubermenu-sr-only ubermenu-sr-only-focusable">' . __('Skip Navigation', 'ubermenu') . '</a>';

			$skipnav_target = '<span id="' . $skipnav_target_id . '"></span>';

			$nav_menu = $skipnav . $nav_menu . $skipnav_target;
		}
	}
	return $nav_menu;
}
add_filter('wp_nav_menu', 'ubermenu_skipnav_filter', 11, 2);

function ubermenu_responsive_toggle_filter($nav_menu, $args)
{
	//Add to UberMenu, ignore segments
	if (isset($args->uber_instance) && !isset($args->uber_segment)) {
		//up( $args );

		$ubermenu_responsive = ubermenu_op('responsive', $args->uber_instance) === 'on';
		$ubermenu_responsive_toggle = ubermenu_op('responsive_toggle', $args->uber_instance) === 'on';
		$placement = ubermenu_op('responsive_toggle_placement', $args->uber_instance); // inline|fixed

		if ($ubermenu_responsive && $ubermenu_responsive_toggle) {

			$toggle_args = ubermenu_get_responsive_toggle_args($args->uber_instance, $args);

			// Inline Toggle
			if ($placement !== 'fixed') {
				if (isset($args->theme_location))
					$toggle_args['theme_location'] = $args->theme_location;
				$ubermenu_toggle = ubermenu_toggle($args->container_id, $args->uber_instance, false, $toggle_args);
				$nav_menu = $ubermenu_toggle . $nav_menu;
			}
			// Footer Fixed toggle
			else {
				_UBERMENU()->add_footer_toggle($args->container_id, $args->uber_instance, $args);
			}

		} else {
			$responsive_status = '';
			if (!$ubermenu_responsive_toggle) {
				$responsive_status .= '[UberMenu Responsive Toggle Disabled] ';
			}
			if (!$ubermenu_responsive) {
				$responsive_status .= '[UberMenu Responsive Menu Disabled] ';
			}
			if ($responsive_status)
				$nav_menu = '<!-- ' . $responsive_status . '--> ' . $nav_menu;
		}
	}
	return $nav_menu;
}
add_filter('wp_nav_menu', 'ubermenu_responsive_toggle_filter', 10, 2);

function ubermenu_get_responsive_toggle_args($config, $nav_menu_args = null)
{
	$toggle_content = ubermenu_op('responsive_toggle_content', $config);
	$toggle_tag = ubermenu_op('responsive_toggle_tag', $config);
	$toggle_content_align = ubermenu_op('responsive_toggle_content_alignment', $config);
	$toggle_align = ubermenu_op('responsive_toggle_alignment', $config);
	$toggle_close_icon = ubermenu_op('responsive_toggle_close_icon', $config);
	$toggle_classes = ubermenu_op('responsive_collapse', $config) == 'off' ? 'ubermenu-responsive-toggle-open' : '';
	$toggle_args = array(
		'toggle_content' => $toggle_content,
		'tag' => $toggle_tag,
		'content_align' => $toggle_content_align,
		'align' => $toggle_align,
		'close_icon' => $toggle_close_icon,
		'classes' => $toggle_classes,
	);

	if ($nav_menu_args) {
		if (isset($nav_menu_args->menu)) {
			$toggle_args['target_menu'] = $nav_menu_args->menu;
		}
	}

	return $toggle_args;
}


// Fixed responsive toggle
function ubermenu_responsive_toggle_footer()
{
	$toggles = _UBERMENU()->get_footer_toggles();
	foreach ($toggles as $el_id => $toggle_data) {
		$config_id = $toggle_data['config_id'];
		$nav_menu_args = $toggle_data['nav_menu_args'];
		$toggle_args = ubermenu_get_responsive_toggle_args($config_id, $nav_menu_args);
		$toggle_args['classes'] .= ' ubermenu-responsive-toggle-fixed';
		$toggle_args['tabindex'] = 1;
		ubermenu_toggle($el_id, $config_id, true, $toggle_args);
	}
}
add_action('wp_footer', 'ubermenu_responsive_toggle_footer', 20, 0);


/*
 * Add HTML comments around menu, optionally add content before menu
 */
function ubermenu_before_wp_nav_menu($nav_menu, $args)
{

	if (isset($args->uber_segment))
		return $nav_menu; //Ignore segments

	if (isset($args->uber_instance)) {

		$theme_loc = isset($args->theme_location) ? $args->theme_location : '';

		$nav_menu = "\n<!-- UberMenu [Configuration:$args->uber_instance] [Theme Loc:$theme_loc] [Integration:$args->uber_integration_type] -->\n" . $nav_menu . "\n<!-- End UberMenu -->\n";

		//uberp( $args );
		$config_id = $args->uber_instance;

		$before = $after = '';

		$before_content = ubermenu_op('content_before_nav', $args->uber_instance);
		if ($before_content) {
			$before = '<!-- UberMenu Content Before -->';
			$before .= do_shortcode($before_content);
			$before .= '<!-- End UberMenu Content Before -->';
		}

		$nav_menu = $before . $nav_menu . $after;

	}

	return $nav_menu;
}
add_filter('wp_nav_menu', 'ubermenu_before_wp_nav_menu', 20, 2);






function ubermenu_get_post_parent_ops($ops = array())
{

	if (ubermenu_op('autocomplete_disable', 'general') == 'on') {
		$ops[999] = __('Autocomplete disabled in Control Panel.  Please enter ID manually', 'ubermenu');
		return $ops;
	}

	$post_types = get_post_types(
		array(
			'public' => true,
			'hierarchical' => true,
		)
	);

	$max_posts = ubermenu_op('autocomplete_max_post_results', 'general');
	if (!$max_posts)
		$max_posts = 100;


	$post_args = array(
		'post_type' => $post_types,
		'posts_per_page' => $max_posts,
	);

	//WPML
	if (defined('ICL_SITEPRESS_VERSION')) {
		$post_args['suppress_filters'] = false;
	}

	$posts = get_posts($post_args);

	foreach ($posts as $post) {
		$ops[$post->ID] = $post->post_title;
	}

	return $ops;

}


function ubermenu_get_author_ops()
{

	$ops = array();

	if (ubermenu_op('dynamic_authors_disable', 'general') == 'on') {
		$ops[999] = __('[Authors selection disabled via Control Panel]', 'ubermenu');
		return $ops;
	}

	$authors = get_users(
		array(
			// 'who'	=> 'authors'
			'capability' => 'edit_posts',
		)
	);
	;

	foreach ($authors as $author) {
		$ops[$author->ID] = $author->data->display_name;
		//up( $author->data->display_name , 2 );
	}

	return $ops;
}


function ubermenu_get_post_type_ops()
{
	$post_types = get_post_types(
		array(
			'public' => true,
		),
		'objects'
	);

	unset($post_types['attachment']);

	$ops = array();
	//up( $post_types );
	foreach ($post_types as $id => $type) {
		$ops[$id] = $type->label;
	}
	return $ops;
}

function ubermenu_get_term_ops_by_tax($tax, $ops = array())
{

	if (ubermenu_op('autocomplete_disable', 'general') == 'on') {
		$ops[999] = __('Autocomplete disabled in Control Panel.  Please enter ID manually', 'ubermenu');
		return $ops;
	}

	if (!is_array($tax))
		$tax = array($tax);

	$max_terms = ubermenu_op('autocomplete_max_term_results', 'general'); //for performance
	if (!$max_terms)
		$max_terms = 100;

	$terms = get_terms( //$tax ,
		array(
			'taxonomy' => $tax,
			'number' => $max_terms,
			'hide_empty' => false,
		)
	);

	foreach ($terms as $id => $term) {
		$ops[$term->term_id] = $term->name;
	}

	return $ops;
}



function ubermenu_get_taxonomy_ops()
{
	$taxonomies = get_taxonomies(
		array(
			'public' => true,
		),
		'objects'
	);

	$ops = array();

	foreach ($taxonomies as $id => $tax) {
		$ops[$id] = $tax->label;
	}

	return $ops;
}


function ubermenu_get_term_ops($ops = array())
{
	//trigger_error( "Simulating Autocomplete memory exception" , E_USER_ERROR );
	if (ubermenu_op('autocomplete_disable', 'general') == 'on') {
		$ops[999] = __('Autocomplete disabled in Control Panel.  Please enter ID manually', 'ubermenu');
		return $ops;
	}

	$taxonomies = ubermenu_get_taxonomies();

	$max_terms = ubermenu_op('autocomplete_max_term_results', 'general'); //for performance
	if (!$max_terms)
		$max_terms = 100;

	$terms = get_terms( //$taxonomies ,
		array(
			'taxonomy' => array_keys($taxonomies), // numerically enumerate for filtering in get_terms()
			'number' => $max_terms,
			'hide_empty' => false,
		)
	);

	//$ops = array();

	foreach ($terms as $id => $term) {
		$ops[$term->term_id] = $term->name;
	}

	/* Stress Test
																   for( $k = count( $terms )+1 ; $k < count( $terms ) + 1000 ; $k ++ ){
																	   if( $k % 6 == 0 ){
																		   $ops[$k] = 'Frogs';
																	   }
																	   else if( $k % 5 == 0 ){
																		   $ops[$k] = 'Lions';
																	   }
																	   else if( $k % 4 == 0 ){
																		   $ops[$k] = 'Aardvarks';
																	   }
																	   else if( $k % 3 == 0 ){
																		   $ops[$k] = 'Antelope';
																	   }
																	   else if( $k % 2 == 0 ){
																		   $ops[$k] = 'Puppies';
																	   }
																	   else $ops[$k] = 'Cat'.$k;
																   }
																   */

	return $ops;
}

function ubermenu_get_taxonomies()
{
	return get_taxonomies(
		array(
			'public' => true,
		)
	);
}


function ubermenu_get_image($img_id = false, $post_id = false, $data = false, $args = array())
{

	extract(
		wp_parse_args(
			$args,
			array(
				'img_size' => 'inherit',
				'img_w' => '',
				'img_h' => '',
				'default_img' => false,
			)
		)
	);

	$config_id = _UBERMENU()->get_current_config();


	//Image
	$img = '';

	//If post is set, but img is not, get featured image
	if (!$img_id && $post_id) {
		$thumb_id = get_post_thumbnail_id($post_id);
		if ($thumb_id)
			$img_id = $thumb_id;
	}

	if (!$img_id) {
		$img_id = $default_img;
	}

	if ($img_id) {
		$atts = array();

		$atts['class'] = 'ubermenu-image';

		//Determine size of image to get
		if ($img_size == 'inherit') {
			$img_size = ubermenu_op('image_size', $config_id);
		}

		//echo '['.$img_size.']';
		$atts['class'] .= ' ubermenu-image-size-' . $img_size;

		//Get the reight image file
		$img_src = wp_get_attachment_image_src($img_id, $img_size);
		$atts['src'] = $img_src[0];



		//Apply natural dimensions if not already set
		if (ubermenu_op('image_set_dimensions', $config_id)) {
			if ($img_w == '' && $img_h == '') {
				$img_w = $img_src[1];
				$img_h = $img_src[2];
			}
		}

		//Default dimensions if not natural
		if (!$img_w) {
			$img_w = ubermenu_op('image_width', $config_id);
			$img_h = ubermenu_op('image_height', $config_id);
		}



		//Add dimensions as attributes, with pixel units if missing
		if ($img_w) {
			//if( is_numeric( $img_w ) ) $img_w.='px';	//Should always be numeric only, no units
			$atts['width'] = $img_w;
		}
		if ($img_h) {
			//if( is_numeric( $img_h ) ) $img_h.='px';	//Should always be numeric only, no units
			$atts['height'] = $img_h;
		}

		//Add 'alt' & 'title'
		$meta = get_post_custom($img_id);
		$alt = isset($meta['_wp_attachment_image_alt']) ? $meta['_wp_attachment_image_alt'][0] : '';	//Alt field
		$title = '';

		if ($alt == '') {
			$title = get_the_title($img_id);
			$alt = $title;
		}
		$atts['alt'] = $alt;

		if (ubermenu_op('image_title_attribute', $config_id) == 'on') {
			if ($title == '')
				$title = get_the_title($img_id);
			$atts['title'] = $title;
		}

		//Build attributes string
		$attributes = '';
		foreach ($atts as $name => $val) {
			$attributes .= $name . '="' . esc_attr($val) . '" ';
		}

		$img = "<img $attributes />";
		//$img = "<span class='ubermenu-image'><img $attributes /></span>";

		if ($data) {
			$data = array();
			$data['img'] = $img;
			$data['w'] = $img_w;
			$data['h'] = $img_h;
			$data['atts'] = $atts;
			return $data;
		}
	}

	return $img;
}

function ubermenu_item_save_inherit_featured_image($item_id, $setting, $val, &$saved_settings)
{

	if ($val == 'cache') {

		$object_type = get_post_meta($item_id, '_menu_item_object', true);

		//Determine Featured Image
		$object_id = get_post_meta($item_id, '_menu_item_object_id', true);
		$thumb_id = '';
		switch ($object_type) {
			//WooCommerce Product Categories
			case 'product_cat':
				$thumb_id = ubermenu_get_woocommerce_product_category_image_id($object_id);
				break;
			default:
				$thumb_id = get_post_thumbnail_id($object_id);
		}


		//Assign Featured Image
		$saved_settings['item_image'] = $thumb_id;
		update_post_meta($item_id, UBERMENU_MENU_ITEM_META_KEY, $saved_settings);

	}
}


function ubermenu_display_retractors()
{
	//echo ubermenu_op( 'retractor_display_strategy' , 'general' );
	switch (ubermenu_op('retractor_display_strategy', 'general')) {
		case 'responsive':
			return true;
		case 'mobile':
			return ubermenu_is_mobile('display_retractors');
		case 'touch':
			return true;
		default:
			return true;
	}
	return true;
}


function ubermenu_is_mobile($scenario = false)
{
	return apply_filters('ubermenu_is_mobile', wp_is_mobile(), $scenario);
}


/** Term Splitting in WordPress 4.2 **/
add_action('split_shared_term', 'ubermenu_split_shared_term', 10, 4);
function ubermenu_split_shared_term($term_id, $new_term_id, $term_taxonomy_id, $taxonomy)
{
	global $wpdb;
	$uber_meta = $wpdb->get_results(
		$wpdb->prepare("SELECT post_id , meta_value FROM $wpdb->postmeta where meta_key = %s AND meta_value IN( %s , %s )", '_ubermenu_custom_item_type', 'dynamic_terms', 'dynamic_posts')
	);

	//echo count( $uber_meta );

	foreach ($uber_meta as $meta) {
		$meta->post_id;
		//$meta->meta_value; //dynamic_terms or dynamic_posts

		$m = get_post_meta($meta->post_id, UBERMENU_MENU_ITEM_META_KEY, true);

		if ($meta->meta_value == 'dynamic_terms') {

			$update = false;

			//Only if $taxonomy is checked
			if (isset($m['dt_taxonomy']) && in_array($taxonomy, $m['dt_taxonomy'])) {

				if (isset($m['dt_parent']) && $m['dt_parent']) {
					if ($m['dt_parent'] == $term_id) {
						$m['dt_parent'] = $new_term_id;
						$update = true;
					}
				}
				if (isset($m['dt_child_of']) && $m['dt_child_of']) {
					if ($m['dt_child_of'] == $term_id) {
						$m['dt_child_of'] = $new_term_id;
						$update = true;
					}
				}
				if (isset($m['dt_exclude']) && $m['dt_exclude']) {
					$exclude_list = explode(',', $m['dt_exclude']);
					if (in_array($term_id, $exclude_list)) {
						foreach ($exclude_list as $k => $val) {
							if ($val == $term_id) {
								$exclude_list[$k] = $new_term_id;
							}
						}
						$m['dt_exclude'] = implode(',', $exclude_list);
						$update = true;
					}
				}

				if ($update) {
					update_post_meta($meta->post_id, UBERMENU_MENU_ITEM_META_KEY, $m);
					//uberp( $m , 3 );
				}
			}
		} else if ($meta->meta_value == 'dynamic_posts') {

			//just check dp_{$taxonomy}
			$tax_setting = 'dp_' . $taxonomy;
			if (isset($m[$tax_setting]) && $m[$tax_setting]) {
				if ($m[$tax_setting] == $term_id) {
					$m[$tax_setting] = $new_term_id;
					update_post_meta($meta->post_id, UBERMENU_MENU_ITEM_META_KEY, $m);
					//uberp( $m , 3 );
				}
			}

		}

	}
}

//Term Split Tests
//do_action( 'split_shared_term', 100 , 200 , 300 , 'location' );
//do_action( 'split_shared_term', 50 , 150 , 250 , 'category' );





/* Allow HTML descriptions */
/* Off by default because it will fill all descriptions with the post content.
remove_filter( 'nav_menu_description', 'strip_tags' );
add_filter( 'wp_setup_nav_menu_item', 'ubermenu_allow_description_html' );
function ubermenu_allow_description_html( $menu_item ) {
	 $menu_item->description = apply_filters( 'nav_menu_description', $menu_item->post_content );
	 return $menu_item;
}
*/



/** Admin Notices **/
function ubermenu_user_is_admin()
{
	return current_user_can('manage_options');
}

function ubermenu_admin_notice($content, $echo = true)
{
	//$showtips = false;

	if (ubermenu_op('admin_notices', 'general') == 'on') {
		if (ubermenu_user_is_admin()) {
			$notice = '<div class="ubermenu-admin-notice"><i class="ubermenu-admin-notice-icon fas fa-lightbulb"></i>' . $content . '</div>';

			if ($echo)
				echo $notice;
			return $notice;
		}
	}

}
function ubermenu_is_pro()
{
	if (!defined('UBERMENU_PRO')) {
		return false;
	}
	if (!UBERMENU_PRO) {
		return false;
	}

	//We're in pro, now check for Lite Mode
	//We don't use ubermenu_op because that function needs to check this function
	//when getting defaults, so it would create an infinite loop and the universe would implode
	$general_settings = get_option(UBERMENU_PREFIX . 'general', false);

	//No settings, Pro Mode
	if ($general_settings === false) {
		return true;
	}
	if (isset($general_settings['lite_mode'])) {
		//If lite mode, pro is false
		if ($general_settings['lite_mode'] == 'on') {
			return false;
		}
	}
	return true;
}



function ubermenu_get_support_url()
{
	return _UBERMENU()->get_support_url();
}

// function ubermenu_get_support_url(){
// 	$url = UBERMENU_SUPPORT_URL;

// 	$data = array();

// 	$data['src']			= 'ubermenu_plugin';
// 	$data['product_id']		= 1;

// 	//Site Data
// 	$data['site_url'] 		= get_site_url();
// 	$data['version']		= UBERMENU_VERSION;
// 	$data['timezone']		= get_option('timezone_string');

// 	//Theme Data
// 	$theme = wp_get_theme();
// 	//uberp( $theme , 3 );
// 	$data['theme']			= $theme->get( 'Name' );
// 	$data['theme_link']		= '<a target="_blank" href="'.$theme->get( 'ThemeURI' ).'">'. $theme->get( 'Name' ). ' v'.$theme->get( 'Version' ).' by ' . $theme->get( 'Author' ).'</a>';
// 	$data['theme_slug']		= isset( $theme->stylesheet ) ? $theme->stylesheet : '';
// 	$data['theme_parent']	= $theme->get( 'Template' );

// 	//User Data
// 	$current_user = wp_get_current_user();
// 	if( $current_user ){
// 		if( $current_user->user_firstname ){
// 			$data['first_name']		= $current_user->user_firstname;
// 		}
// 		if( $current_user->user_firstname ){
// 			$data['last_name']		= $current_user->user_lastname;
// 		}
// 		if( $current_user ){
// 			$data['email']			= $current_user->user_email;
// 		}
// 	}
// 	//$data['email']			= get_bloginfo( 'admin_email' );


// 	//License Data
// 	if( $license_code = ubermenu_op( 'purchase_code' , 'updates' ) ){
// 		$data['license_code']	= $license_code;
// 	}
// 	if( $envato_username = ubermenu_op( 'envato_username' , 'updates' ) ){
// 		$data['envato_username'] = $envato_username;
// 	}

// 	$query = http_build_query( $data );

// 	return "$url?$query";
// }


/** DEBUGGING **/


function uberp($d, $depth = 1)
{
	echo '<pre style=font-size:13px; "background:black; color:#fff; margin:1em; padding:1em; border-radius:5px;">';
	//print_r( $d );
	echo UMVarDumper::dump($d, $depth);
	echo '</pre>';
}
function uberp_details($summary, $details, $depth = 3)
{
	echo '<details style="font-size:13px; background:black; color:white; border-radius:5px; padding:1em;margin:1em;">';
	echo '<summary>' . $summary . '</summary>';
	uberp($details, $depth);
	$db = debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, 2)[0];
	$filepath = $db['file'];
	$file = array_pop(explode('/', $filepath));
	$line = $db['line'];
	echo '<a href="vscode://file' . $filepath . ':' . $line . '">' . $file . ':' . $line . '</a>';
	echo '</details>';
}

class UMVarDumper
{
	private static $_objects;
	private static $_output;
	private static $_depth;

	/**
	 * Converts a variable into a string representation.
	 * This method achieves the similar functionality as var_dump and print_r
	 * but is more robust when handling complex objects such as PRADO controls.
	 * @param mixed variable to be dumped
	 * @param integer maximum depth that the dumper should go into the variable. Defaults to 10.
	 * @return string the string representation of the variable
	 */
	public static function dump($var, $depth = 10, $highlight = false)
	{
		self::$_output = '';
		self::$_objects = array();
		self::$_depth = $depth;
		self::dumpInternal($var, 0);
		if ($highlight) {
			$result = highlight_string("<?php\n" . self::$_output, true);
			return preg_replace('/&lt;\\?php<br \\/>/', '', $result, 1);
		} else
			return self::$_output;
	}

	private static function dumpInternal($var, $level)
	{
		switch (gettype($var)) {
			case 'boolean':
				self::$_output .= $var ? 'true' : 'false';
				break;
			case 'integer':
				self::$_output .= "$var";
				break;
			case 'double':
				self::$_output .= "$var";
				break;
			case 'string':
				self::$_output .= "'$var'";
				break;
			case 'resource':
				self::$_output .= '{resource}';
				break;
			case 'NULL':
				self::$_output .= "null";
				break;
			case 'unknown type':
				self::$_output .= '{unknown}';
				break;
			case 'array':
				if (self::$_depth <= $level)
					self::$_output .= 'array(...)';
				else if (empty($var))
					self::$_output .= 'array()';
				else {
					$keys = array_keys($var);
					$spaces = str_repeat(' ', $level * 4);
					self::$_output .= "array\n" . $spaces . '(';
					foreach ($keys as $key) {
						self::$_output .= "\n" . $spaces . "    [$key] => ";
						self::$_output .= self::dumpInternal($var[$key], $level + 1);
					}
					self::$_output .= "\n" . $spaces . ')';
				}
				break;
			case 'object':
				if (($id = array_search($var, self::$_objects, true)) !== false)
					self::$_output .= get_class($var) . '#' . ($id + 1) . '(...)';
				else if (self::$_depth <= $level)
					self::$_output .= get_class($var) . '(...)';
				else {
					$id = array_push(self::$_objects, $var);
					$className = get_class($var);
					$members = (array) $var;
					$keys = array_keys($members);
					$spaces = str_repeat(' ', $level * 4);
					self::$_output .= "$className#$id\n" . $spaces . '(';
					foreach ($keys as $key) {
						$keyDisplay = strtr(trim($key), array("\0" => ':'));
						self::$_output .= "\n" . $spaces . "    [$keyDisplay] => ";
						self::$_output .= self::dumpInternal($members[$key], $level + 1);
					}
					self::$_output .= "\n" . $spaces . ')';
				}
				break;
		}
	}
}

//Usage:
//$profiler = new UMProfiler();	//before
//$profiler->output( "Name of Object" );  //after

class UMProfiler
{

	var $mem_before;
	var $mem_peak_before;
	var $mem_after;
	var $mem_peak_after;
	var $mem_diff;
	var $mem_peak_diff;


	function __construct()
	{
		$this->mem_before = memory_get_usage();
		$this->mem_peak_before = memory_get_peak_usage();
	}

	function terminate()
	{
		$this->mem_after = memory_get_usage();
		$this->mem_peak_after = memory_get_peak_usage();

		$this->mem_diff = $this->mem_after - $this->mem_before;
		$this->mem_peak_diff = $this->mem_peak_after - $this->mem_peak_before;


	}

	function output($label, $threshold = 0)
	{

		$this->terminate();

		if (!current_user_can('manage_options'))
			return;

		if ($this->mem_peak_diff >= $threshold) {

			echo '<div class="profiler-item">' . $label . '</div>';
			echo '<div class="profiler-data">';

			if ($this->mem_peak_diff > 0) {
				echo '<div class="profiler-data-segment">';
				echo '[Peak: ' . umbytes($this->mem_peak_diff) . ']';
				echo '</div>';

				echo '<div class="profiler-data-segment">';
				echo '[Net: ' . umbytes($this->mem_diff) . ']';
				echo '</div>';
			} else {
				echo '[Peak: 0]';
			}


			global $_bytes; //, $_bytes_peak;
			//$_bytes_peak+= $this->mem_peak_diff;
			$_bytes += $this->mem_diff;
			echo '<div class="profiler-data-segment">Total: ' . umbytes($_bytes) . '</div>';
			echo '<div class="profiler-data-segment">Peak: ' . umbytes($this->mem_peak_after) . '</div>';

			echo '</div>';
		}

	}
}

function umbytes($size, $precision = 2)
{
	$base = log($size) / log(1024);
	$suffixes = array('', 'k', 'M', 'G', 'T');
	return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
}




/*
 * Add compatibility with Conditional Menus by Themify
 */
add_filter('conditional_menus_theme_location', 'ubermenu_restore_conditional_menus_theme_location', 10, 3);
function ubermenu_restore_conditional_menus_theme_location($theme_loc, $new_menu, $args)
{
	//uberp( $args );
	return $args['theme_location'];
}




/*
 * The strategy is to find all the UberMenu items, remove them, and move their children up a level
 *
 * 1. Make a map of parent > child relationships
 * 2. Determine which items are UberMenu advanced items.
 *    - Take the children of these items, and change their parent IDs to that of the UberMenu item
 *    - Mark the UberMenu item for deletion by recording their index
 * 3. Remove the UberMenu items by unsetting their indexes.
 *    - We can't do it simultaneuously in step 2, as that would alter the index and break the algorithm
 *
 * Note: if there is an UberMenu top level item with children, all those children will become top level items
 *    - One option would be to have a "disable child items that would become top level items" setting.
 */
function ubermenu_exclude_advanced_items($sorted_menu_items, $args)
{

	//uberp( $sorted_menu_items , 3 );

	if (is_admin())
		return $sorted_menu_items;

	//Ignore UberMenu and ShiftNav
	if (
		isset($args->uber_instance) ||
		isset($args->shiftnav)
	) {
		return $sorted_menu_items;
	}

	//uberp( $items ,3 );
	$items = $sorted_menu_items;
	//uberp( $args );

	$child_map = array(); //$parent => array of children

	//First we have to track parents
	foreach ($items as $index => $item) {
		$parent_id = $item->menu_item_parent;
		$item_id = $item->ID;

		if (!isset($child_map[$parent_id])) {
			$child_map[$parent_id] = array();
		}
		$child_map[$parent_id][] = array('id' => $item_id, 'index' => $index);
	}

	//uberp( $child_map , 3 );

	$index_trash = array();

	//Now search for UberMenu items, but keep all the indexes intact
	foreach ($items as $index => $item) {
		if ($item->object == 'ubermenu-custom') {

			//Does this item have children?
			if (isset($child_map[$item->ID])) {
				//Send the kiddos to grandma's house
				foreach ($child_map[$item->ID] as $k => $child_data) {
					//Update items
					$items[$child_data['index']]->menu_item_parent = $item->menu_item_parent;
					//Update child map - no, if we do that we break this loop
					//$child_map[$item->menu_item_parent]
				}
			}

			//Keep track of indexes to unset
			$index_trash[] = $index;
			//unset( $items[$key] );
		}
	}

	//Finally, remove all items that are from UberMenu
	foreach ($index_trash as $k => $index) {
		unset($items[$index]);
	}


	//uberp( $item );
	//if ( $item->object_id == 168 ) unset( $items[$key] );

	return $items;
}



/* Theme Template Backtrace */
add_action('wp', function () {
	if (current_user_can('manage_options') && ubermenu_op('theme_template_backtrace', 'general') === 'on') {
		add_filter('wp_nav_menu', 'ubermenu_theme_template_backtrace', 100, 2);
	}
});

function ubermenu_theme_template_backtrace($nav_menu, $args)
{
	if (!isset($args->uber_segment)) { //ignore menu segments
		//uberp( $args );
		$backtrace = debug_backtrace();
		//   uberp( $backtrace , 3 );


		$html = '<strong>Theme Template Backtrace: wp_nav_menu() call stack</strong><ul>';
		$comment = " Theme Template Backtrace: wp_nav_menu() call stack\n";
		foreach ($backtrace as $step) {
			// uberp( $step );
			if ($step['file'] && strpos($step['file'], 'wp-content/') !== false) {
				$file = $step['file'];
				$line = $step['line'];
				$html .= "<li>$file (line $line)</li>";
				$comment .= "\t\t∟ $file (line $line)\n";
			}
		}
		$html .= '</ul>';

		ubermenu_admin_notice($html);
		echo "\n\n<!-- $comment -->\n";
	}
	return $nav_menu;
}





/* Helpers */

/**
 * Takes a map of class name strings to a boolean test
 * Returns an array by default, or a space-separated string if $concat is true
 */
function ubermenu_classNames($classMap, $concat = false)
{

	$classes = [];

	foreach ($classMap as $class => $condition) {
		if ($condition) {
			$classes[] = $class;
		}
	}

	if ($concat) {
		return implode(' ', $classes);
	}

	return $classes;

}

/**
 * Generate a string of HTML attributes
 *
 * @param   array          $attr      Associative array of attribute names and values.
 * @param   callable|null  $callback  Callback function to escape values for HTML attributes.
 *                                    Defaults to `htmlspecialchars()`.
 * @return  string  Returns a string of HTML attributes.
 */
function ubermenu_html_atts(array $attr, callable $callback = null)
{
	if (!count($attr)) {
		return '';
	}

	$html = array_map(
		function ($val, $key) use ($callback) {
			if (is_bool($val)) {
				return ($val ? $key : '');
			} elseif (isset($val)) {
				if ($val instanceof Closure) {
					$val = $val();
				} elseif ($val instanceof JsonSerializable) {
					$val = json_encode(
						$val->jsonSerialize(),
						(JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
					);
				} elseif (is_callable([$val, 'toArray'])) {
					$val = $val->toArray();
				} elseif (is_callable([$val, '__toString'])) {
					$val = strval($val);
				}

				if (is_array($val)) {
					if (function_exists('is_blank')) {
						$filter = function ($var) {
							return !is_blank($var);
						};
					} else {
						$filter = function ($var) {
							return !empty($var) || is_numeric($var);
						};
					}
					$val = implode(' ', array_filter($val, $filter));
				}

				if (is_callable($callback)) {
					$val = call_user_func($callback, $val);
				} elseif (function_exists('esc_attr')) {
					$val = esc_attr($val);
				} else {
					$val = htmlspecialchars($val, ENT_QUOTES);
				}

				if (is_string($val)) {
					return sprintf('%1$s="%2$s"', $key, $val);
				}
			}
		},
		$attr,
		array_keys($attr)
	);

	return implode(' ', $html);
}


function uberp_childmap($childmap)
{
	$d = [];
	foreach ($childmap as $id => $children) {
		//$name = $childmap[$id]
		$childDisplay = [];
		foreach ($children as $child) {
			// uberp( $child );
			$childDisplay[$child->ID] = $child->title . ' :: ' . $child->type;
		}
		$d[$id] = $childDisplay;
	}
	echo '<div style="background:black; text:white; padding:1em; margin:1em;">';
	uberp($d, 2);
	echo '</div>';
}