<?php


/**
 * Parent Class
 */
abstract class UberMenuItem
{

	protected $type = 'unknown';	//Item Type 		getType()			default, dynamic_term, dynamic_post,
	protected $ID = 0;				//Menu Item ID 		getID()
	protected $source_id = 0;

	protected $output;
	protected $item;
	protected $depth;
	protected $args;
	// protected $id;
	protected $walker;

	protected $settings;
	protected $submenu_advanced;
	protected $submenu_tag = 'ul';
	protected $submenu_classes = array();

	protected $item_classes = array(0 => '');	//Put in an empty entry to mimic the custom class used by real items, for when we have a dummy item
	protected $item_atts = array();

	protected $auto_child = '';
	protected $prev_auto_child = '';

	protected $alter_structure = false;


	protected $has_children = false;
	protected $submenu_type = false;
	protected $drop_sub = false;
	protected $closable_sub = false;

	protected $is_dummy = false;
	protected $is_tab = false;

	protected $predetermined_submenu_type = false;

	//protected $branch_prefix = '';

	/*
																		 protected $detached = false;
																		 protected $detached_submenu = false;
																		 protected $parent_detached_context = 0;
																		 protected $passed_content = '';
																		 */

	function __construct(&$output, &$item, $depth = 0, &$args = array(), $id = 0, &$walker = null, $has_children = false)
	{
		$this->output = &$output;
		$this->item = &$item;
		$this->depth = $depth;
		$this->args = &$args;
		// $this->id 		= $id;
		$this->walker = &$walker;
		$this->has_children = $has_children;

		$this->ID = $this->item->ID;
		//up( $this->ID );

		//Setup dummy
		if (isset($this->item->is_dummy) && $this->item->is_dummy) {
			$this->is_dummy = true;
		}

		// Setup Source ID
		$this->source_id = $this->item->db_id;

		if (isset($this->item->object) && ($this->item->object == 'ubermenu-custom')) {
			//echo 'set source_id ' . $this->item->object_id;
			$this->source_id = $this->item->object_id;
		}

		//Setup settings
		$this->settings = $this->get_settings();



		//New filter in 4.4 - 'nav_menu_item_args'
		//Since this filter is most likely going to just break the menu, it is disabled by default, but can be enabled by adding
		//define( 'UBERMENU_ALLOW_NAV_MENU_ITEM_ARGS_FILTER' , true );
		//in the wp-config.php
		if (UBERMENU_ALLOW_NAV_MENU_ITEM_ARGS_FILTER)
			$this->args = apply_filters('nav_menu_item_args', $this->args, $this->item);

		$this->init();
		//$this->initialize_submenu();


		//Only check if necessary (Advanced submenu set to auto)
		if ($this->getSetting('submenu_advanced') == 'auto') {
			if ($this->item->classes == null) {
				//echo '<h3>[['.$this->item->title.']]</h3>';
				//up( $this->item );
			}
			if (is_array($this->item->classes)) {
				if (in_array('advanced-sub', $this->item->classes)) {
					$this->submenu_advanced = true;
					$this->submenu_tag = 'div';
				}
			}
		} else if ($this->getSetting('submenu_advanced') == 'enabled') {
			$this->submenu_advanced = true;
			$this->submenu_tag = 'div';
		}

	}

	/* Allows subclasses to hook in */
	function init()
	{
	}

	function get_item()
	{
		return $this->item;
	}

	function get_branch_prefix()
	{
		return $this->branch_prefix;
	}

	// function get_id(){
	// 	return $this->ID;
	// }
	function getID()
	{
		return $this->ID;
	}
	function setID($id)
	{
		$this->ID = $id;
	}
	function set_source_id($id)
	{
		$this->source_id = $id;
	}

	function get_transient_key($prefix)
	{
		return 'ubertk_' . $prefix . $this->walker->unique_path_key($this->getID());
	}

	function get_depth()
	{
		return $this->depth;
	}

	function is_tab()
	{
		return $this->is_tab;
	}

	function display_on()
	{

		if ($this->getSetting('disable_on_mobile') == 'on') {
			if (ubermenu_is_mobile('disable_on_mobile')) {
				return false;
			}
		}

		if ($this->getSetting('disable_on_desktop') == 'on') {
			if (!ubermenu_is_mobile('disable_on_desktop')) {
				return false;
			}
		}

		return true;
	}

	function disable_children()
	{
		$this->has_children = false;

		$_item = $this->item;
		if (($key = array_search('menu-item-has-children', $_item->classes)) !== false) {
			unset($_item->classes[$key]);
		}
		//Possibly remove menu item parent/menu item ancestor classes as well
	}


	function create_reference($source_id, &$children, $reference_index = '')
	{

		if ($reference_index == '') {
			$reference_index = '_ref_' . $source_id;
		}

		if (!$this->walker->feed_trash_collector($reference_index)) {

			if (isset($children[$source_id]) && !empty($children[$source_id])) {
				$children[$reference_index] = $children[$source_id];
			}
		}

		return $reference_index;

	}

	function replicate_children($new_parent_id, $source_parent_id, &$children, $id_prefix = '', $replicated_source_ids = [])
	{

		// uberp( "Replicate Children [new_parent_id: $new_parent_id] [source_parent_id: {$source_parent_id}] [id_prefix: {$id_prefix}]");

		// Get the children to replicate
		$sourcekids = $children[$source_parent_id];

		$newkids = [];
		foreach ($sourcekids as $sourcekid) {
			// uberp( "replicated: $sourcekid->ID" );
			$replicated_source_ids[] = $sourcekid->ID;
			// uberp( "Replicate: $sourcekid->title");
			$newkid = clone $sourcekid;
			// $newkid->set_source_id($sourcekid->ID);
			// uberp_details('Clone ' . $sourcekid->ID, $newkid);

			// TODO check item type and don't override prefix for certain item types, like dynamics

			// uberp( "Set ID {$id_prefix}__{$sourcekid->ID}");
			// uberp( $sourcekid );
			if ($id_prefix && !in_array($sourcekid->type_label, ['[UberMenu Dynamic Terms]', '[UberMenu Dynamic Posts]'])) {
				$newkid->ID = "{$id_prefix}__{$sourcekid->ID}";
				// $newkid->db_id = "{$id_prefix}__{$sourcekid->db_id}";
				$newkid->duplicate = true;
			}
			// if( in_array( $sourcekid->type_label , ['[UberMenu Dynamic Terms]','[UberMenu Dynamic Posts]'] ) ){
			// 	uberp($newkid->ID);
			// 	$newkid->duplicate = true;
			// }
			// uberp( "Created $newkid->ID as child of $new_parent_id" );
			$newkids[] = $newkid;

			// If this child also had children, repeat
			if (isset($children[$sourcekid->ID])) {
				// uberp( "Recursive $sourcekid->ID" );
				$ref_id = $this->create_reference($sourcekid->ID, $children);
				// $children[$newkid->ID] = 
				$replicated_source_ids = $this->replicate_children($newkid->ID, $ref_id, $children, $newkid->ID, $replicated_source_ids);
			}
			// else{
			// 	uberp( "No kids for $sourcekid->ID");
			// }
		}

		$children[$new_parent_id] = $newkids;

		return $replicated_source_ids;

	}

	// function prefix_child_ids( $prefix, $children ){
	// 	uberp($children,2);
	// 	$new = [];	
	// 	foreach( $children as $orginal_id => $child ){
	// 		$new_id = "{$prefix}__{$original_id}";
	// 		uberp('hi');
	// 		$new[$new_id] = $child;
	// 	}
	// 	uberp($new);
	// 	return $new;
	// }


	/* If this item models a term, return its ID */
	function get_term_id()
	{
		return false;
	}
	/* If this item models a post, return its ID */
	function get_post_id()
	{
		return false;
	}

	function dynamic_alter($tab_id, $source_id, $umitem, &$children)
	{
		return false;
	}

	function get_settings()
	{
		if (isset($this->settings))
			return $this->settings;

		$item_id = $this->source_id ? $this->source_id : $this->item->ID;

		$settings = get_post_meta($item_id, UBERMENU_MENU_ITEM_META_KEY, true);
		// if ($this->type === 'tabs') {
		// 	uberp_details('get_settings ' . $this->source_id . '[Type: ' . $this->type . '][Item ID: ' . $item_id . ']', $settings);
		// }
		if (!$settings)
			$settings = array();

		//Allow dummy settings to override source item settings
		if ($this->is_dummy && isset($this->item->settings)) {
			if (!is_array($settings))
				$settings = array();
			foreach ($this->item->settings as $key => $val) {
				$settings[$key] = $val;
			}
		}

		$settings = apply_filters('ubermenu_item_settings', $settings, $this->ID);

		return $settings;
	}

	function get_menu_op($op)
	{
		//Determine menu instance
		//$instance = 'main';		//TODO
		//$instance = $this->args[0]->uber_instance;

		$instance = $this->get_config_id();
		return ubermenu_op($op, $instance);
	}

	function get_config_id()
	{
		return $this->args->uber_instance;
	}

	function alter_structure()
	{
		return $this->alter_structure;
	}
	function alter(&$children)
	{
	}

	function get_submenu_tag()
	{
		return $this->submenu_tag;
	}

	function pass_content($content)
	{
		$this->passed_content .= $content;
	}

	function getAutoChild()
	{
		return $this->auto_child;
	}

	function getType()
	{
		return $this->type;
	}

	function getSetting($key)
	{
		if (isset($this->settings[$key])) {
			$val = $this->settings[$key];
		} else { //} if( isset( $this->walker->setting_defaults[$key] ) ){
			$val = $this->walker->setting_defaults[$key];
		}
		return $val;
	}

	//1
	function start_el()
	{
		$this->output .= apply_filters('walker_nav_menu_start_el', $this->get_start_el(), $this->item, $this->depth, $this->args);
	}

	//4
	function end_el()
	{
		$this->output .= $this->get_end_el();
	}

	//2
	function start_lvl()
	{
		$this->output .= $this->get_submenu_wrap_start();
	}

	//3
	function end_lvl()
	{
		$this->output .= $this->get_submenu_wrap_end();
	}

	//Detached content

	function detach()
	{
		$this->detached_submenu = true;
		$this->walker->detach($this->ID);
		//echo 'detached ' . $this->ID . '<br/>';
	}
	function undetach()
	{
		$this->detached_submenu = false;
		$this->walker->undetach();
	}
	function complete_detachment()
	{
	}	//do nothing by default



	abstract function get_start_el();

	function get_end_el()
	{
		$item_output = "</li>"; //<!-- end ".$this->item->ID."-->\n";
		return $item_output;
	}

	function get_submenu_type($submenu_type = false)
	{

		if (!$this->has_children)
			return false;

		//If already cached, don't reprocess
		if ($this->submenu_type)
			return $this->submenu_type;

		//If not passed, grab setting
		if (!$submenu_type)
			$submenu_type = $this->getSetting('submenu_type');

		//echo $this->item->title . ' : '. $submenu_type ." : $this->depth <br/>";
		if ($submenu_type == 'auto') {

			//$classes[] = 'ubermenu-submenu-type-auto';

			//figure it out
			if ($this->depth == 0) {
				$submenu_type = 'mega';
			} else if ($this->depth >= 1) {
				$parent = $this->walker->parent_item();
				if ($parent && $parent->type == 'row') {
					$parent = $this->walker->grandparent_item();
				}
				//up( $parent );
				//echo 'Parent of '.$this->item->title . ' is ' . $parent->getSetting( 'submenu_type_calc' ) .'<br/>';
				$parent_submenu = $parent->getSetting('submenu_type_calc');
				//echo ' -- ' .$this->item->title . ' : ' . $parent_submenu . '<br/>';
				switch ($parent_submenu) {
					case 'mega':
					case 'block':
					case 'tab-content-panel':
					case 'toggles-content-panel':
						$submenu_type = 'stack';
						break;
					case 'flyout':
						$submenu_type = 'flyout';
						break;
					default:
						//inherit parent
						$submenu_type = $parent_submenu;
						break;
				}

			}
		}

		$this->submenu_type = $submenu_type;

		return $submenu_type;
	}

	function get_submenu_id()
	{
		return 'ubermenu-submenu-' . $this->getID();
	}

	function initialize_submenu()
	{

		//Standard WordPress Classes
		$this->submenu_classes[] = 'ubermenu-submenu';
		$this->submenu_classes[] = 'ubermenu-submenu-id-' . $this->item->ID;


		//Submenu Type
		$submenu_type = $this->getSetting('submenu_type');
		if ($submenu_type == 'auto') {
			$this->submenu_classes[] = 'ubermenu-submenu-type-auto';
			$submenu_type = $this->get_submenu_type($submenu_type);
		}

		$submenu_type = apply_filters('ubermenu_submenu_type', $submenu_type, $this->item, $this->depth, $this->args);

		$this->settings['submenu_type_calc'] = $submenu_type;

		$this->submenu_classes[] = 'ubermenu-submenu-type-' . $submenu_type;

		if (in_array($submenu_type, array('mega', 'flyout'))) {
			$this->drop_sub = true;
			$this->submenu_classes[] = 'ubermenu-submenu-drop';
		}
		if ($this->drop_sub || $submenu_type == 'tab-content-panel') {
			$this->closable_sub = true;
		}

		$this->submenu_type = $submenu_type;
	}

	function predetermine_submenu_type()
	{
		if ($this->predetermined_submenu_type) {
			return $this->predetermined_submenu_type;
		}

		$submenu_type = $this->getSetting('submenu_type');
		if ($submenu_type == 'auto') {
			$submenu_type = $this->get_submenu_type($submenu_type);
		}
		if (in_array($submenu_type, array('mega', 'flyout'))) {
			$this->drop_sub = true;
		}
		if ($this->drop_sub || $submenu_type == 'tab-content-panel') {
			$this->closable_sub = true;
		}

		$this->predetermined_submenu_type = $submenu_type;
	}


	function get_submenu_wrap_start()
	{

		$this->initialize_submenu();

		$classes = $this->submenu_classes;
		$submenu_type = $this->submenu_type;

		//Mega menu submenu alignment
		if ($submenu_type == 'mega') {
			$classes[] = 'ubermenu-submenu-align-' . $this->getSetting('submenu_position');
		} else if ($submenu_type == 'flyout') {
			$classes[] = 'ubermenu-submenu-align-' . $this->getSetting('flyout_submenu_position');
		}

		//Menu menu submenu content alignment
		$submenu_content_align = $this->getSetting('submenu_content_align');
		if ($submenu_content_align && $submenu_content_align != 'default') {
			$classes[] = 'ubermenu-submenu-content-align-' . $submenu_content_align;
		}

		//Autoclear
		$submenu_col_default = $this->getSetting('submenu_column_default');
		if ($this->getSetting('submenu_column_autoclear') == 'on' && $submenu_col_default != 'auto' && $submenu_col_default != 'natural') {
			$classes[] = 'ubermenu-autoclear';
		}

		//Padding
		if ($this->getSetting('submenu_padded') == 'on') {
			$classes[] = 'ubermenu-submenu-padded';
		}

		//Background Image
		if ($this->getSetting('submenu_background_image')) {	//Not 'on', image URL
			$classes[] = 'ubermenu-submenu-bkg-img';
		}

		//Submenu Grid
		if ($this->getSetting('submenu_grid') == 'on') {
			$classes[] = 'ubermenu-submenu-grid';
		}


		//Indent
		if ($this->getSetting('submenu_indent') == 'on') {
			$classes[] = 'ubermenu-submenu-indent';
		}

		//Retractors
		$retractor_top = $this->closable_sub && ubermenu_display_retractors() && (ubermenu_op('display_retractor_top', $this->args->uber_instance) == 'on');
		if ($retractor_top)
			$classes[] = 'ubermenu-submenu-retractor-top';

		//Close Button
		$close_button = $this->closable_sub && (ubermenu_op('display_submenu_close_button', $this->args->uber_instance) == 'on');
		if ($close_button) {
			if ($retractor_top)
				$classes[] = 'ubermenu-submenu-retractor-top-2';
			else
				$classes[] = 'ubermenu-submenu-retractor-top';
		}


		$class = 'class="' . implode(' ', $classes) . '"';


		//Inline styles
		$_styles = array();

		//Explicit width (should be moved)

		/*$submenu_width = $this->getSetting( 'submenu_width' );
																																				  if( $submenu_width != '' ){
																																					  if( is_numeric( $submenu_width ) ) $submenu_width.= 'px';
																																					  $_styles['width'] = $submenu_width;
																																				  }
																																				  */

		//Create inline styles string if necessary
		$styles = '';
		if (count($_styles) > 0) {
			$styles .= 'style="';
			foreach ($_styles as $property => $val) {
				$styles .= "$property:$val;";
			}
			$styles .= '"';
		}


		$aria = '';
		if (ubermenu_op('aria_hidden', 'general') == 'on') {
			$this->predetermine_submenu_type();
			if ($this->drop_sub) {
				$aria = 'aria-hidden="true"';
			}
		}

		//Add an ID we want to use aria-controls
		$id = '';
		if (ubermenu_op('aria_controls', 'general') == 'on') {
			$id = 'id="' . $this->get_submenu_id() . '"';
		}


		$item_output = "<$this->submenu_tag $id $class $styles $aria>";


		// $retractor_icon_tag = $this->get_menu_op( 'icon_tag' );
		// if( !$retractor_icon_tag ) $retractor_icon_tag = 'i';

		//Retractor Top
		if ($retractor_top) {
			$retractor_tag = $this->submenu_tag == 'ul' ? 'li' : 'div';
			$retractor_label = ubermenu_op('retractor_label', $this->args->uber_instance);
			if (!$retractor_label)
				$retractor_label = __('Close', 'ubermenu');

			$item_output .= '<' . $retractor_tag . ' class="ubermenu-retractor ubermenu-retractor-mobile">' . $this->get_close_icon_tag() . ' ' . $retractor_label . '</' . $retractor_tag . '>';
		}

		//Close button
		if ($close_button) {
			$retractor_tag = $this->submenu_tag == 'ul' ? 'li' : 'div';
			$item_output .= '<' . $retractor_tag . ' class="ubermenu-retractor ubermenu-retractor-desktop">' . $this->get_close_icon_tag() . '</' . $retractor_tag . '>';
		}


		return $item_output;

	}
	function get_submenu_wrap_end()
	{

		$html = '';

		//Footer Content
		$footer_content = $this->getSetting('submenu_footer_content');
		if ($footer_content) {
			$fc_tag = 'li';
			if ($this->submenu_tag != 'ul')
				$fc_tag = 'div';
			$html .= '<' . $fc_tag . ' class="ubermenu-submenu-footer ubermenu-submenu-footer-id-' . $this->ID . '">' . $footer_content . '</' . $fc_tag . '>';
		}

		//'tab-content-panel'

		//Retractor Bottom
		if ($this->closable_sub && ubermenu_display_retractors() && (ubermenu_op('display_retractor_bottom', $this->args->uber_instance) == 'on')) {
			$retractor_tag = $this->submenu_tag == 'ul' ? 'li' : 'div';

			$retractor_label = ubermenu_op('retractor_label', $this->args->uber_instance);
			if (!$retractor_label)
				$retractor_label = __('Close', 'ubermenu');

			$html .= '<' . $retractor_tag . ' class="ubermenu-retractor ubermenu-retractor-mobile">' . $this->get_close_icon_tag() . ' ' . $retractor_label . '</' . $retractor_tag . '>';
		}

		$html .= "</$this->submenu_tag>";

		return $html;
	}

	function get_close_icon_tag()
	{
		if (ubermenu_op('use_core_svgs', 'general') === 'on') {
			return ubermenu_get_essential_icon('times');
		} else {
			$retractor_icon_tag = $this->get_menu_op('icon_tag');
			if (!$retractor_icon_tag)
				$retractor_icon_tag = 'i';

			return '<' . $retractor_icon_tag . ' class="fas fa-times"></' . $retractor_icon_tag . '>';
		}
	}


	function getVirtualDepth()
	{
		return $this->depth;
	}




	function add_class_item_defaults()
	{
		//$this->item_classes = empty( $this->item->classes ) ? array() : (array) $this->item->classes;
		if (is_array($this->item->classes)) {
			$this->item_classes = array_merge($this->item_classes, $this->item->classes);

			//Disable Current Menu Item Classes (do this first for efficiency)
			if (
				($this->getSetting('disable_current') == 'on') ||
				(ubermenu_op('scrollto_disable_current', 'general') !== 'off' && $this->getSetting('scrollto'))
			) {
				$remove_current = array('current-menu-item', 'current-menu-parent', 'current-menu-ancestor');
				foreach ($this->item_classes as $k => $c) {
					if (in_array($c, $remove_current)) {
						unset($this->item_classes[$k]);
					}
				}
				$this->item_classes[] = 'nocurrent';
			}
		}
	}
	function add_class_id()
	{
		$this->item_classes[] = 'menu-item-' . $this->item->ID;
	}
	function prefix_classes()
	{
		//uberp( $this->item_classes );
		//if( $this->type == 'tabs' ) uberp( $this->item_classes );
		$k = 0;
		$found = false;
		foreach ($this->item_classes as $i => $class) {
			//if( $class == 'menu-item' ) $classes[$i] = 'ubermenu-item';

			//The first class is custom, so ignore it
			//if( $k == 0 ){ $k++; continue; }

			//menu-item marks the first class we want to preix, so ignore everything before that
			if (!$found && $class == 'menu-item')
				$found = true;
			if (!$found)
				continue;

			if ($class) {
				if (substr($class, 0, 4) == 'menu') {
					$this->item_classes[$i] = 'uber' . $class;
				} else
					$this->item_classes[$i] = 'ubermenu-' . $class;
				//add to end if using both
			}
		}
	}
	function add_class_item_display()
	{

		$this->settings['item_display_calc'] = '';

		//Item Display
		if ($this->depth > 0) {
			$item_display = $this->getSetting('item_display');
			$this->item_classes[] = 'ubermenu-item-' . $item_display;

			//Determine auto
			if ($item_display == 'auto') {

				$parent_type = $this->walker->parent_item()->getType();

				switch ($parent_type) {

					//For items inside a content panel, act like a mega sub
					case 'toggle_content_panel':
						$item_display = 'header';
						break;

					//For terms inside a content panel, look to the grandparent
					case 'dynamic_posts':
					case 'dynamic_terms':
						if ($this->walker->grandparent_item()) {
							if ($this->walker->grandparent_item()->getType() == 'toggle_content_panel') {
								$item_display = 'header';
							}
							//echo '//'.$this->walker->grandparent_item()->getType().'//<br/>';
						}
						break;

					//case 'column':
					//	$item_display = 'normal';
					//	break;

				}

				//Still auto?
				if ($item_display == 'auto') {

					$in_sub = $this->walker->parent_item()->getSetting('submenu_type_calc');

					switch ($in_sub) {

						case 'mega':

							if ($this->depth == 1) {
								$item_display = 'header';
							} else if ($this->depth > 1 && $this->walker->parent_item()->getVirtualDepth() == 1) {
								$item_display = 'header';
							} else if ($this->walker->parent_item()->getType() == 'row') {
								$item_display = 'header';
							} else if (
								$this->walker->parent_item()->getType() == 'menu_segment' &&
								$this->walker->grandparent_item()->getType() == 'row'
							) {
								$item_display = 'header';
							} else if ($this->depth > 1 && $this->walker->grandparent_item()->getSetting('submenu_type_calc') == 'flyout') {
								$item_display = 'header';
							} else {
								//For items that are in the submenu but yet undetermined
								if ($this->depth > 1) {
									//If it's parent wasn't a header, but the sub of the parent was a mega, this should probably be a header
									if ($this->walker->parent_item()->getSetting('item_display_calc') != 'header') {
										$item_display = 'header';
									}
								} else
									$item_display = 'normal';
							}
							break;

						case 'flyout':
							$item_display = 'normal';
							break;

						case 'stack':
							$item_display = 'normal';
							break;
						case 'block':
							$item_display = 'header';
							break;
						case 'tabs-group':
						case 'toggles-group':
							//Ignore, use 'ubermenu-toggle' instead
							$item_display = '';
							break;
						case 'tab-content-panel':
						case 'toggles-content-panel':
							$item_display = 'header';
							break;
						/*
																																																																																																													  case 'dynamic-terms':
																																																																																																														  $item_display = 'header';
																																																																																																														  break;*/

						default:
							$item_display = 'unknown-[' . $in_sub . ']';
							break;

					}
				}

				if ($item_display) {
					$this->item_classes[] = 'ubermenu-item-' . $item_display;
					// $this->settings['item_display_calc'] = $item_display;
				}
			}

			$this->settings['item_display_calc'] = $item_display;

		}
	}

	function add_class_level()
	{
		$this->item_classes[] = 'ubermenu-item-level-' . $this->getVirtualDepth(); //$this->depth;
	}

	function get_inherited_submenu_column_default()
	{
		return $this->walker->parent_item()->getSetting('submenu_column_default');
	}

	function add_class_layout_columns()
	{

		if ($this->depth > 0) {
			$parent_submenu_type = $this->walker->parent_item()->getSetting('submenu_type_calc');
			if ($parent_submenu_type == 'flyout')
				return;	//no columns in flyouts
		}

		//if( $this->depth > 1 ){

		$cols = $this->getSetting('columns');
		if ($this->depth > 0) {
			//Widgets are full width if Columns set to Auto
			if (
				($this->getSetting('widget_area') || $this->getSetting('auto_widget_area'))
				&& $cols == 'auto'
			) {
				$cols = 'full';
			}
			//If set to auto, apply submenu column default from parent item
			else if ($cols == 'auto') {
				$cols = $this->get_inherited_submenu_column_default();
				//if( $parent )
				// if( $this->ID === '1025-term-23' ) uberp( $this->walker->parent_item() ); //uberp( "cols: $cols" );

			}
		}
		$this->item_classes[] = 'ubermenu-column ubermenu-column-' . $cols;


		//New Row
		if ($this->getSetting('clear_row') == 'on') {
			$this->item_classes[] = 'ubermenu-clear-row';
		}

		//if( $this->walker->parent_item()->getSetting)
	}

	function add_class_alignment()
	{
		$align = $this->getSetting('item_align');
		if ($align && $align != 'auto') {
			$this->item_classes[] = 'ubermenu-align-' . $align;
		}
	}

	function add_class_mini_item()
	{
		if ($this->getSetting('mini_item') == 'on') {
			$this->item_classes[] = 'ubermenu-item-mini';
		}
	}

	function add_class_rtl_sub()
	{
		if (($this->get_submenu_type() == 'mega') && ($this->getSetting('submenu_position') == 'right_edge_item')) {
			$this->item_classes[] = 'ubermenu-submenu-rtl';
		} else if ($this->depth >= 1 && ($this->get_submenu_type() == 'mega') && ($this->getSetting('submenu_position') == 'left_edge_item')) {
			$this->item_classes[] = 'ubermenu-submenu-flyout-mega-left'; //special flag in case flyout > mega goes left
		} else if (($this->get_submenu_type() == 'flyout') && ($this->getSetting('flyout_submenu_position') == 'right_edge_item')) {
			$this->item_classes[] = 'ubermenu-submenu-rtl';
			$this->item_classes[] = 'ubermenu-submenu-reverse';
		}
	}
	function add_class_responsive()
	{
		if ($this->getSetting('hide_on_mobile') == 'on') {
			$this->item_classes[] = 'ubermenu-hide-mobile';
		}
		if ($this->getSetting('hide_on_desktop') == 'on') {
			$this->item_classes[] = 'ubermenu-hide-desktop';
		}
	}
	function add_class_submenu()
	{
		$submenu_type = $this->get_submenu_type();
		if ($submenu_type) {
			if (in_array($submenu_type, array('mega', 'flyout'))) {
				$this->item_classes[] = 'ubermenu-has-submenu-drop';

				//Show current
				if (
					($this->getSetting('show_current') == 'on') &&
					(in_array('ubermenu-current-menu-ancestor', $this->item_classes) ||
						in_array('ubermenu-current-menu-item', $this->item_classes)
					)
				) {
					$this->item_classes[] = 'ubermenu-active';
				}

				//Show Default
				if ($this->getSetting('show_default') == 'on') {
					$this->item_classes[] = 'ubermenu-active';
				}
			}
			$this->item_classes[] = 'ubermenu-has-submenu-' . $submenu_type;
		}

		if (
			($this->getSetting('submenu_position') == 'vertical_parent_item') ||
			($this->getSetting('flyout_submenu_position') == 'vertical_parent_item')
		) {
			$this->item_classes[] = 'ubermenu-relative';
		}

		if ($submenu_type == 'flyout' && $this->getSetting('flyout_submenu_position') == 'vertical_full_height') {
			$this->item_classes[] = 'ubermenu-flyout-full-height';
		}
	}

	function add_class_disable_padding()
	{
		$disable_padding = $this->getSetting('disable_padding');
		if ($disable_padding == 'on') {
			$this->item_classes[] = 'ubermenu-disable-padding';
		}
	}

	function filter_item_classes()
	{
		/**
		 * Filter the CSS class(es) applied to a menu item's <li>.
		 *
		 * @since 3.0.0
		 *
		 * @param array  $classes The CSS classes that are applied to the menu item's <li>.
		 * @param object $item    The current menu item.
		 * @param array  $args    An array of arguments. @see wp_nav_menu()
		 */
		$class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($this->item_classes), $this->item, $this->args, $this->depth));
		$class_names = $class_names ? ' class="' . esc_attr($class_names) . '"' : '';
		return $class_names;
	}

	function filter_item_id()
	{
		/**
		 * Filter the ID applied to a menu item's <li>.
		 *
		 * @since 3.0.1
		 *
		 * @param string The ID that is applied to the menu item's <li>.
		 * @param object $item The current menu item.
		 * @param array $args An array of arguments. @see wp_nav_menu()
		 */
		$id = apply_filters('nav_menu_item_id', 'menu-item-' . $this->item->ID, $this->item, $this->args, $this->depth);
		$id = $id ? ' id="' . esc_attr($id) . '"' : '';

		return $id;
	}

	function filter_item_atts()
	{
		return apply_filters('ubermenu_item_atts', $this->item_atts, $this->item->ID, $this->item, $this->args, $this->depth);
	}


	function setup_trigger()
	{
		$trigger = $this->getSetting('item_trigger');
		if ($trigger && $trigger != 'auto') {
			$this->item_atts['data-ubermenu-trigger'] = $trigger;
		}
	}

	function get_url()
	{
		return $this->item->url;
	}
	function set_url($url)
	{
		$this->item->url = $url;
	}

	/**
	 * Get the attributes for the anchor, including class, title, target, rel, href
	 * Filterable with 'nav_menu_link_attributes'
	 * @return array 	An array of attributes with attribute names as keys and attribute values as values i.e. $key="$val"
	 */
	function anchor_atts()
	{
		$atts = array();
		$atts['class'] = 'ubermenu-target';	//add UberMenu specific meta
		$atts['title'] = !empty($this->item->attr_title) ? $this->item->attr_title : '';
		$atts['target'] = !empty($this->item->target) ? $this->item->target : '';
		$atts['rel'] = !empty($this->item->xfn) ? $this->item->xfn : '';
		$atts['href'] = !empty($this->item->url) ? $this->item->url : '';

		if ($this->depth == 0) {
			$atts['tabindex'] = 0;
		}

		/**
		 * Filter the HTML attributes applied to a menu item's <a>.
		 *
		 * @since 3.6.0
		 *
		 * @param array $atts {
		 *     The HTML attributes applied to the menu item's <a>, empty strings are ignored.
		 *
		 *     @type string $title  The title attribute.
		 *     @type string $target The target attribute.
		 *     @type string $rel    The rel attribute.
		 *     @type string $href   The href attribute.
		 * }
		 * @param object $item The current menu item.
		 * @param array  $args An array of arguments. @see wp_nav_menu()
		 */
		$atts = apply_filters('nav_menu_link_attributes', $atts, $this->item, $this->args, $this->depth);

		return $atts;
	}


	/**
	 * Get the Anchor and its contents
	 * @param  array $atts An array of attributes to add to the anchor
	 * @return string       The HTML for the anchor
	 */
	function get_anchor($atts)
	{

		if ($this->item->title == '--divide--') {
			return '<div class="ubermenu-divider"><hr/></div>';
		}


		$a = '';
		$tag = 'a';

		$parent_item = false;
		if ($this->depth >= 1)
			$parent_item = $this->walker->parent_item();

		//Highlight
		if ($this->getSetting('highlight') == 'on') {
			$atts['class'] .= ' ubermenu-highlight';
		}


		//Image
		$image = $this->get_image();
		if ($image)
			$atts['class'] .= ' ubermenu-target-with-image';


		//Icon
		$icon = '';
		$icon_val = $this->getSetting('icon'); // may be the classes for FA, or a group_id::icon_id identifier

		// New system {group_id}::{icon_id}
		if (strpos($icon_val, '::')) {
			$atts['class'] .= ' ubermenu-target-with-icon';
			$icon_classes = apply_filters('ubermenu_icon_custom_class', '', $this->ID, isset($this->settings['icon_custom_class']) ? $this->settings['icon_custom_class'] : ''); // icon_custom_class Setting is from icons extension
			$icon_atts = ['class' => $icon_classes];

			//Accessibility
			$icon_title = $this->getSetting('icon_title');
			if ($icon_title) {
				$icon_atts['title'] = $icon_title;
			}

			$icon = ubermenu_generate_icon_markup($icon_val, $icon_atts);
		}
		// Old FA5
		else {
			if ($icon_val)
				$icon_val = ubermenu_fa5_convert($icon_val, true);  // Convert FA4 to FA5 if needed
			// uberp( $this->ID .'::'. $icon_val );

			$icon_classes = apply_filters('ubermenu_icon_custom_class', $icon_val, $this->ID, isset($this->settings['icon_custom_class']) ? $this->settings['icon_custom_class'] : ''); // icon_custom_class Setting is from icons extension

			if ($icon_classes) {
				$atts['class'] .= ' ubermenu-target-with-icon';
				$icon_tag = $this->get_menu_op('icon_tag');
				if (!$icon_tag)
					$icon_tag = 'i';

				//Accessibility
				$aria = '';
				$icon_title = $this->getSetting('icon_title');

				if ($icon_title) {
					$icon_title = ' title="' . $icon_title . '"';
					//Font Awesome JS takes care of aria hidden if there's a title
				} else if (ubermenu_op('aria_hidden_icons', 'general') == 'on') {	//TODO deprecate
					$aria = 'aria-hidden="true"';
				}

				$icon = '<' . $icon_tag . ' class="ubermenu-icon ' . $icon_classes . '" ' . $aria . $icon_title . '></' . $icon_tag . '>';
			}
		}

		//Layout
		$layout = $this->getSetting('item_layout');
		//If there is no image, don't allow image layout
		if (!$image && (0 === strpos($layout, 'image')))
			$layout = 'default';
		$atts['class'] .= ' ubermenu-item-layout-' . $layout;



		//Content Align
		$content_align = $this->getSetting('content_alignment');
		//Check inherit from parent
		if ($content_align == 'default') {
			//if( $this->id == 604 ) echo $this->item->title;
			//if( $parent_item && $parent_item->getType() == 'menu_segment' ) echo '<br/>['.$parent_item->getType();
			if ($this->depth >= 1 && $submenu_item_content_alignment = $parent_item->getSetting('submenu_item_content_alignment')) {
				if ($submenu_item_content_alignment !== 'default') {
					$content_align = $submenu_item_content_alignment;
				}
			}
			//if( $parent_item && $parent_item->getType() == 'menu_segment' ) echo ']';
		}
		//If a content alignment has been set on this item or the parent, set the class
		if ($content_align != 'default') {
			$atts['class'] .= ' ubermenu-content-align-' . $content_align;
		}

		if ($layout == 'default') {

			//If the layout for the individual item is set to default, and this is a child item, check the parent item's setting
			if ($this->depth >= 1 && $submenu_item_layout = $parent_item->getSetting('submenu_item_layout')) {
				if ($submenu_item_layout !== 'default') {
					$layout = $submenu_item_layout;
				}
			}

			//If the layout hasn't been determined yet, and we're using an image, check to see if there's a default image layout
			if ($layout == 'default' && $image) {
				$layout = $this->get_menu_op('image_layout_default');
				if (!$layout)
					$layout = 'image_left';
			}
			//If there's an icon, use the default icon layout
			else if ($icon) {
				if (function_exists('ubermenu_icon_layout_default')) {
					$layout = ubermenu_icon_layout_default($this);
				} else
					$layout = 'icon_left';
			}
			//If nothing else has claimed it, we default to text_only
			else if ($layout == 'default') {
				$layout = 'text_only';
			}

			$atts['class'] .= ' ubermenu-item-layout-' . $layout;
		}

		$layout_order = ubermenu_get_item_layouts($layout);
		if (!$layout_order) {
			ubermenu_admin_notice(__('Unknown layout order:', 'ubermenu') . ' ' . $layout . ' [' . $this->item->title . '] (' . $this->ID . ')');
		}


		//No wrap
		if ($this->getSetting('no_wrap') == 'on') {
			$atts['class'] .= ' ubermenu-target-nowrap';
		}



		//Disabled Link (change tag)
		$disable_link = false;
		if ($this->getSetting('disable_link') == 'on') {
			$tag = 'span';
			$disable_link = true;
			unset($atts['href']);
		}


		//Disable Submenu Indicator
		$disable_submenu_indicator = false;
		if ($this->getSetting('disable_submenu_indicator') == 'on') {
			$disable_submenu_indicator = true;
			$atts['class'] .= ' ubermenu-noindicator';
		}

		//Global Submenu Indicators
		// $display_submenu_indicators = $this->get_menu_op('display_submenu_indicators') === 'on' ? true : false; /// moved to own function


		//ScrollTo
		$scrollTo = $this->getSetting('scrollto');
		if ($scrollTo) {
			$atts['data-ubermenu-scrolltarget'] = $scrollTo;
		}

		//Target ID
		$target_id = $this->getSetting('target_id');
		if ($target_id) {
			$atts['id'] = $target_id;
		}

		//Target Class
		$target_class = $this->getSetting('target_class');
		if ($target_class) {
			$atts['class'] .= ' ' . $target_class;
		}

		//Note: anchor atts used to be here

		//Title
		$title = '';
		if ($this->getSetting('disable_text') == 'off') {

			$_title = $this->item->title;
			if ($this->get_menu_op('allow_shortcodes_in_labels') == 'on') {
				$_title = do_shortcode($_title);
			}

			$title .= '<span class="ubermenu-target-title ubermenu-target-text">';
			$title .= apply_filters('the_title', $_title, $this->item->ID);
			//$title .= $_title;
			$title .= '</span>';

		} else {
			//Flag items with disabled text
			$atts['class'] .= ' ubermenu-item-notext';
		}


		//Description
		$description = '';
		//if( $this->getSetting( 'disable_text' ) == 'off' ){
		if ($this->item->description) {

			if (
				(($this->depth == 0) && ($this->get_menu_op('descriptions_top_level') == 'on')) ||
				(($this->depth > 0) && ($this->getSetting('item_display_calc') == 'header') && ($this->get_menu_op('descriptions_headers') == 'on')) ||
				(($this->depth > 0) && ($this->getSetting('item_display_calc') == 'normal') && ($this->get_menu_op('descriptions_normal') == 'on')) ||
				(($this->depth > 0) && ($this->type == 'tab') && $this->get_menu_op('descriptions_tab') == 'on')
			) {

				$_desc = $this->item->description;
				if ($this->get_menu_op('allow_shortcodes_in_labels') == 'on') {
					$_desc = do_shortcode($_desc);
				}

				//Divider
				$divider = $this->get_menu_op('target_divider');
				if ($title && $divider)
					$description .= '<span class="ubermenu-target-divider">' . $divider . '</span>';

				$description .= '<span class="ubermenu-target-description ubermenu-target-text">';
				$description .= $_desc;
				$description .= '</span>';
			}
		}


		//ARIA controls
		//$title = $title . ( $this->drop_sub ? 'drop' : 'nodrop' );
		if ($this->has_children && ubermenu_op('aria_controls', 'general') == 'on') {
			$atts['aria-controls'] = $this->get_submenu_id();
		}


		//ShiftNav Toggle
		if ($this->getSetting('shiftnav_target')) {
			$atts['data-shiftnav-target'] = $this->getSetting('shiftnav_target');
			$atts['class'] .= ' shiftnav-toggle';
		}


		//Filter attributes
		$atts = apply_filters('ubermenu_anchor_attributes', $atts, $this->item->type, $this->ID /* Menu Item ID */ , $this->item->object /* object type */ , $this->item->object_id /* Post ID */);


		//Anchor Attributes
		$attributes = '';
		foreach ($atts as $attr => $value) {
			if (!empty($value) || $value === 0) {
				$value = ('href' === $attr) ? esc_url($value) : esc_attr($value);

				if ($attr === 'href' && ($custom_url = $this->getSetting('custom_url'))) {
					$value = do_shortcode($custom_url);
				}

				$attributes .= ' ' . $attr . '="' . $value . '"';
			}
		}

		//Check if we still have something to print
		if (!$title && !$description && !$image && !$icon) {
			return '';
		}


		//Build the Layout

		//Get custom pieces
		$custom_pieces = array();
		extract(apply_filters('ubermenu_custom_item_layout_data', $custom_pieces, $layout, $this->ID, $this->item->object_id));

		//Gather all the pieces in the layout order into an array
		$layout_pieces = compact($layout_order);

		//Output the anchor
		if (isset($this->args->before))
			$a .= $this->args->before;
		$a .= '<' . $tag . $attributes . '>';
		if (isset($this->args->link_before))
			$a .= $this->args->link_before;

		//Add pieces based on layout order
		foreach ($layout_pieces as $piece) {
			$a .= $piece;
		}


		// Badge
		$badge = $this->get_badge();
		if ($badge) {
			$a .= $badge;
		}

		//Submenu indicator
		$a .= $this->get_submenu_indicator($disable_submenu_indicator);

		//Display mobile close toggle - do in JS?
		// if( in_array( $submenu_type , array( 'mega' , 'flyout' , 'tab-content-panel' ) ) ){
		// 	$a.= '<span class="ubermenu-sub-indicator-close"><i class="fas fa-times"></i></span>';
		// }

		if (isset($this->args->link_after))
			$a .= $this->args->link_after;
		$a .= '</' . $tag . '>';
		if (isset($this->args->after))
			$a .= $this->args->after;

		return $a;
	}

	function get_submenu_indicator($disable_submenu_indicator)
	{
		$html = '';

		$submenu_type = $this->get_submenu_type();
		$display_submenu_indicators = $this->get_menu_op('display_submenu_indicators') === 'on' ? true : false;

		if ($display_submenu_indicators && !$disable_submenu_indicator && $submenu_type && in_array($submenu_type, array('mega', 'flyout', 'tab-content-panel'))) {

			if (ubermenu_op('use_core_svgs', 'general') === 'on') {
				$html .= '<span class="ubermenu-sub-indicator">' . ubermenu_get_essential_icon('angle') . '</span>';
			} else {
				$indicator_tag = $this->get_menu_op('icon_tag');
				if (!$indicator_tag)
					$indicator_tag = 'i';
				$html .= "<$indicator_tag class='ubermenu-sub-indicator fas fa-angle-down'></$indicator_tag>";
			}

		}
		return $html;
	}

	/**
	 * Get the HTML for the image attached to this menu item
	 *
	 * Any set img ID will override image src filtering
	 *
	 * @return string img HTML
	 */
	function get_image()
	{

		//Ignore mobile?
		if (($this->get_menu_op('disable_images_mobile') == 'on') && ubermenu_is_mobile('disable_images_mobile')) {
			return '';
		}

		//Image
		$img = apply_filters('ubermenu_item_image', '', $this);
		if ($img)
			return $img;

		//Allow ID filtering
		$img_id = apply_filters('ubermenu_item_image_id', $this->getSetting('item_image'), $this);

		//Allow src filtering
		$img_src = apply_filters('ubermenu_item_image_src', '', $this);
		$thumb_id = false;

		//Inherit featured image dynamically
		if ($this->getSetting('inherit_featured_image') == 'on') {
			// Posts
			if ($this->item->type == 'post_type') {
				$thumb_id = get_post_thumbnail_id($this->item->object_id);
			}
			// WooCommerce Product Category Images
			else if ($this->item->type === 'taxonomy' && $this->item->object === 'product_cat') { //'$this->ID == 854 ){
				$thumb_id = ubermenu_get_woocommerce_product_category_image_id($this->item->object_id);
			}
			// Dynamic Terms - WooCommerce Product Category Images
			else if ($this->item->type === 'custom' && $this->item->custom_type === 'dynamic_term_item') {
				if ($this->term)
					$thumb_id = ubermenu_get_woocommerce_product_category_image_id($this->term->term_id);
			}
			if ($thumb_id)
				$img_id = $thumb_id;
		}

		if ($img_id || $img_src) {
			$atts = array();
			$img_srcset = $img_sizes = '';

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

			//Determine size of image to get
			$img_size = $this->getSetting('image_size');
			if ($img_size == 'inherit') {
				$img_size = $this->get_menu_op('image_size');
			}
			//echo '['.$img_size.']';
			$atts['class'] .= ' ubermenu-image-size-' . $img_size;

			//If the img_id is set, get the right image src file
			if ($img_id) {

				$img_src = wp_get_attachment_image_src($img_id, $img_size);

				// If this image ID isn't valid, the above function returns false.
				// In that case, bail and just return a string saying this image is invalid
				if ($img_src === false) {
					return "<!-- Image ID [$img_id] invalid -->";
				}

				if (function_exists('wp_get_attachment_image_srcset')) {
					$img_srcset = wp_get_attachment_image_srcset($img_id, $img_size);
					$img_sizes = wp_get_attachment_image_sizes($img_id, $img_size);
				}
			}

			//Lazy Load
			if ($this->depth > 0 && $this->get_menu_op('lazy_load_images') == 'on') {
				$atts['class'] .= ' ubermenu-image-lazyload';
				$atts['data-src'] = $img_src[0];
				if ($img_srcset) {
					$atts['data-srcset'] = $img_srcset;
					if ($img_sizes)
						$atts['data-sizes'] = $img_sizes;
				}
			}
			//Normal Load
			else {
				$atts['src'] = $img_src[0];
				if ($img_srcset) {
					$atts['srcset'] = $img_srcset;
					if ($img_sizes)
						$atts['sizes'] = $img_sizes;
				}
			}


			//Determine dimensions
			$img_w = '';
			$img_h = '';
			$dimensions = $this->getSetting('image_dimensions');

			switch ($dimensions) {

				//Custom Dimensions use Menu Item Settings
				case 'custom':
					$img_w = $this->getSetting('image_width_custom');
					$img_h = $this->getSetting('image_height_custom');
					break;

				//Inherit settings from main Menu Settings
				case 'inherit':
					$img_w = $this->get_menu_op('image_width');
					$img_h = $this->get_menu_op('image_height');
					break;

				//Add width and height atts for natural width
				case 'natural':
					//Done below
					break;

				default:
					break;
			}

			//Apply natural dimensions if not already set
			if ($this->get_menu_op('image_set_dimensions')) {
				if ($img_w == '' && $img_h == '') {
					$img_w = $img_src[1];
					$img_h = $img_src[2];
				}
			}

			//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'
			if ($img_id) {
				$meta = get_post_custom($img_id);
				$alt = isset($meta['_wp_attachment_image_alt']) ? $meta['_wp_attachment_image_alt'][0] : '';	//Alt field
				$title = '';

				if ($alt == '' && $this->get_menu_op('image_alt_autofill') == 'on') {
					$title = get_the_title($img_id);
					$alt = $title;
				}
				$atts['alt'] = $alt;

				if ($this->get_menu_op('image_title_attribute') == 'on') {
					if ($title == '')
						$title = get_the_title($img_id);
					$atts['title'] = $title;
				}
			}



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

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

	function get_custom_content()
	{

		$html = '';

		$custom_content = $this->getSetting('custom_content');
		if ($custom_content) {

			if (ubermenu_op('disable_custom_content', 'general') === 'on') {
				return "<!-- Custom Content Areas currently disabled $this->ID -->";
			}

			//Pad the custom content wrapper?
			$pad_custom_content = $this->getSetting('pad_custom_content') == 'on' ? ' ubermenu-custom-content-padded' : '';

			//Add a custom class to the custom content wrapper?
			$custom_class = $this->getSetting('custom_content_class');
			if ($custom_class)
				$custom_class = ' ' . sanitize_html_class($custom_class);

			$html .= '<div class="ubermenu-content-block ubermenu-custom-content' . $pad_custom_content . $custom_class . '">';
			$html .= do_shortcode($custom_content);
			$html .= '</div>';
		}

		return $html;

	}

	function get_badge()
	{
		$html = '';

		$badge_content = apply_filters('ubermenu_badge_content', $this->getSetting('badge_content'), $this->ID, $this->item);

		if ($badge_content) {

			$atts = array(
				'class' => ubermenu_classNames(
					array(
						'ubermenu-badge' => true,
						'ubermenu-badge-' . $this->getSetting('badge_position') => true,
					)
				)
			);

			$html .= '<span ' . ubermenu_html_atts($atts) . '>' . do_shortcode($badge_content) . '</span>';
		}

		return $html;
	}

	function get_widget_area()
	{

		$html = '';

		$widget_area_id = $this->getSetting('widget_area');

		if ($this->getSetting('auto_widget_area')) {

			if (ubermenu_op('disable_widget_areas', 'general') === 'on') {
				return "<!-- Widget Areas currently disabled $this->ID -->";
			}

			$custom_area_id = 'umitem_' . $this->ID;
			if (is_active_sidebar($custom_area_id)) {
				$widget_area_id = $custom_area_id;
			} else {
				$notice = __('The widget area is empty.', 'ubermenu');
				$notice .= ' <a target="_blank" href="' . admin_url('widgets.php') . '">' . __('Assign a widget', 'ubermenu') . '</a>';
				global $wp_registered_sidebars;
				if (isset($wp_registered_sidebars[$custom_area_id])) {
					$sidebar = $wp_registered_sidebars[$custom_area_id];
					$notice .= ' to <strong>' . $sidebar['name'] . '</strong>';
				}

				$html .= ubermenu_admin_notice($notice, false);
				return $html;
			}
		}

		//If this is a top level widget and that setting is not enabled, show an admin message
		if ($this->depth == 0 && $widget_area_id && ubermenu_op('allow_top_level_widgets', 'general') != 'on') {

			$msg = '<strong>[Menu Item: ' . $this->item->title . ']</strong> ' . __('You have assigned a widget area to a top level menu item.  If you want the widget to appear in a submenu, please attach it to a child menu item.  If you want the widget to appear in the menu bar (always visible), please enable the setting in the UberMenu Control Panel > General Settings > Widgets > Allow Top Level Widgets', 'ubermenu');
			ubermenu_admin_notice($msg, true);	//Deliberately printed BEFORE the menu rather than within it because the message is so long.
			//$html.= ubermenu_admin_notice( $msg , true );
			return $html;
		}

		if ($widget_area_id && is_active_sidebar($widget_area_id)) {

			global $wp_registered_sidebars;
			global $wp_registered_widgets;

			//global $_wp_sidebars_widgets;
			$sidebars_widgets = wp_get_sidebars_widgets();

			$num_widgets = count($sidebars_widgets[$widget_area_id]);

			//Evenly divided
			$cols = 'ubermenu-column-1-' . $num_widgets;
			if ($num_widgets == 1) {
				$cols = 'ubermenu-column-full';
			}


			//If col number is set
			$widget_area_columns = $this->getSetting('widget_area_columns');
			if (is_numeric($widget_area_columns)) {
				if ($widget_area_columns == 1) {
					$cols = 'ubermenu-column-full';
				} else
					$cols = 'ubermenu-column-1-' . $widget_area_columns;
			}

			foreach ($sidebars_widgets[$widget_area_id] as $widget_id) {
				if (isset($wp_registered_widgets[$widget_id])) {
					$wp_registered_widgets[$widget_id]['classname'] .= ' ' . $cols;
				}
			}


			//ob_flush();
			ob_start();
			dynamic_sidebar($widget_area_id);
			$widget_area = ob_get_contents();
			//$widget_area = ob_get_clean(); //ob_get_contents();
			ob_end_clean();

			$html .= '<ul class="ubermenu-content-block ubermenu-widget-area ubermenu-autoclear">'; //ubermenu-row
			$html .= $widget_area;
			$html .= '</ul>';
		}
		//No widgets
		else if ($widget_area_id) {

			global $wp_registered_sidebars;
			$notice = __('The widget area is empty.  ', 'ubermenu');
			$notice .= '<a target="_blank" href="' . admin_url('widgets.php') . '">' . __('Assign a widget', 'ubermenu') . '</a>';
			if (isset($wp_registered_sidebars[$widget_area_id])) {
				$sidebar = $wp_registered_sidebars[$widget_area_id];
				$notice .= ' to <strong>' . $sidebar['name'] . '</strong>';
			}
			$html .= ubermenu_admin_notice($notice, false);

			return $html;
		} else {
			//Nothing assigned - fine if a normal menu item, but if this is a Widget Area menu item, stop the presses.
			if ($this->type == 'widget_area') {
				$notice = __('Please enter a name for your Custom Widget Area, or assign a Reusable Widget Area to this menu item.', 'ubermenu');
				$notice .= ' <strong>Item ID: ' . $this->ID . ' ' . $this->item->title . '</strong>';
				$html .= ubermenu_admin_notice($notice, false);
			}
		}

		return $html;

	}



}



/* A Horizontal Rule */
class UberMenuItemDivider extends UberMenuItem
{
	function get_start_el()
	{
		return '<li class="ubermenu-divider"><hr/>';
	}
}
