debug = FALSE;
                $this->dragDrop = $dragdrop;
				if($this->dragDrop)
				{
                	$this->debug = TRUE;
				}
                if ($NEWSHEADER)
				{
					$HEADER .= $NEWSHEADER;
				}
                if(isset($_POST['custom_select']))
				{
					$this->curLayout =  $_POST['custom_select'];
				}
				elseif(isset($_GET['lay']))
				{
                	$this->curLayout =  $_GET['lay'];
				}
				else
				{
					$this->curLayout = vartrue($_GET['configure'], $pref['sitetheme_deflayout']);
				}
				$this->curLayout =  $tp->filter($this->curLayout);
				$this->dbLayout = ($this->curLayout != $pref['sitetheme_deflayout']) ? $this->curLayout : "";  //menu_layout is left blank when it's default.
				if(isset($_POST['menu_id']) || vartrue($_GET['id']))
				{
                	$this->menuId = (isset($_POST['menu_id'])) ? intval($_POST['menu_id']) : intval($_GET['id']);
				}
				if (/*$menu_act == "sv" || */isset($_POST['class_submit']))
				{
					$this->menuSaveVisibility();
				}
				elseif(isset($_POST['parms_submit']))
				{
					$this->menuSaveParameters();
				}
                if (vartrue($_GET['mode']) == "deac")
				{
				 	$this->menuDeactivate();
				}
				if ($_GET['mode'] == "conf")
				{
				 	$this->menuGoConfig();
				}
				$this->menuGrabLayout();
	        	$menu_array = $this->parseheader($HEADER.$FOOTER, 'check');
				if($menu_array)
				{
					sort($menu_array, SORT_NUMERIC);
					$menu_check = 'set';
					foreach ($menu_array as $menu_value)
					{
						if ($menu_value != $menu_check)
						{
					   		$this->menu_areas[] = $menu_value;
						}
						$menu_check = $menu_value;
					}
                }
				$this->menuModify();
            	if(!empty($_POST['menuActivate']))
				{
					$menuActivate = $tp->filter($_POST['menuActivate']);
                    $this->menuActivateLoc = key($menuActivate);
					$this->menuActivateIds = $tp->filter($_POST['menuselect']);
					$this->menuActivate();
				}
				$this->loadMenuData();
				if(vartrue($_POST['menuSetCustomPages']))
				{
					$custompages = $tp->filter($_POST['custompages']);
					$this->menuSetCustomPages($custompages);
				}
				if(isset($_POST['menuUsePreset']) && $_POST['curLayout'])
				{
					$this->menuSetPreset();
				}
				$this->menuSetConfigList(); // Update Active MenuConfig List.
		}
	/**
	 * Load the Menu Table data for the current layout.
	 */
	private function loadMenuData()
	{
		$menu_qry = 'SELECT * FROM #menus WHERE menu_location > 0 AND  menu_layout = "'.$this->dbLayout.'" ORDER BY menu_location,menu_order';
		$sql = e107::getDb();
		$eMenuArea = array();
		if($rows = $sql->retrieve($menu_qry, true))
		{
			$lastLoc = -1;
			$c = 0;
			foreach($rows as $row)
			{
				$loc = intval($row['menu_location']);
				if($lastLoc != $loc)
				{
					$c = 1;
				}
				if($c !== intval($row['menu_order'])) // fix the order if it is off..
				{
					if($sql->update('menus', "menu_order= ".$c." WHERE menu_id = ".$row['menu_id']." LIMIT 1"))
					{
						$row['menu_order'] = $c;
					}
				}
				$eMenuArea[$loc][] = $row;
				$lastLoc = $loc;
				$c++;
			}
		}
		$this->menuData = $eMenuArea;
	}
// -------------------------------------------------------------------------
	/**
	 * @param $url
	 * @return string
	 */
	function menuRenderIframe($url='')
	{ 
		$ns = e107::getRender();
		$sql = e107::getDb();
        if(!$url)
		{
        	$url = e_SELF."?configure=".$this->curLayout;
		}
	//	$cnt = $sql->select("menus", "*", "menu_location > 0 AND menu_layout = '$curLayout' ORDER BY menu_name "); // calculate height to remove vertical scroll-bar.
	//	$text = "";
		$text = "";
	
		return $text;
	}
	/**
	 * @return array|string
	 */
	function menuRenderMessage()
	{
	  //	return $this->menuMessage;
		//	$text .= "ID = ".$this->menuId;
		return e107::getMessage()->render('menuUi');
		
	}
	/**
	 * @param $message
	 * @param $type
	 * @param $session
	 * @return void
	 */
	function menuAddMessage($message, $type = E_MESSAGE_INFO, $session = false)
	{
 		e107::getMessage()->add(array($message, 'menuUi'), $type, $session);
	}
    // -------------------------------------------------------------------------
	/**
	 * @return void
	 */
	function menuGrabLayout()
	{
		global $HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$LAYOUT;
		// new v2.3
		if($tmp = e_theme::loadLayout($this->curLayout))
		{
			$LAYOUT = $tmp;
		}
		if(isset($LAYOUT) && is_array($LAYOUT)) // $LAYOUT is a combined $HEADER,$FOOTER. 
		{
			$HEADER = array();
			$FOOTER = array();
			foreach($LAYOUT as $key=>$template)
			{
				$tmp = explode("{---}",$template);
				$hd = varset($tmp[0]);
				$ft = varset($tmp[1]);
				$HEADER[$key] = isset($LAYOUT['_header_']) ? $LAYOUT['_header_'] . $hd : $hd;
				$FOOTER[$key] = isset($LAYOUT['_footer_']) ? $ft . $LAYOUT['_footer_'] : $ft ;		
			}	
			unset($hd,$ft);
		}
			
      	if(($this->curLayout == 'legacyCustom' || $this->curLayout=='legacyDefault') && (isset($CUSTOMHEADER) || isset($CUSTOMFOOTER)) )  // 0.6 themes.
		{
		 	if($this->curLayout == 'legacyCustom')
			{
				$HEADER = ($CUSTOMHEADER) ? $CUSTOMHEADER : $HEADER;
				$FOOTER = ($CUSTOMFOOTER) ? $CUSTOMFOOTER : $FOOTER;
			}
		}
		elseif($this->curLayout && $this->curLayout !== "legacyCustom" && (isset($CUSTOMHEADER[$this->curLayout]) || (is_array($CUSTOMFOOTER) && isset($CUSTOMFOOTER[$this->curLayout])))) // 0.7 themes
		{
		 // 	echo " MODE 0.7 ".$this->curLayout;
			$HEADER = isset($CUSTOMHEADER[$this->curLayout]) ? $CUSTOMHEADER[$this->curLayout] : $HEADER;
			$FOOTER = is_array($CUSTOMFOOTER) && isset($CUSTOMFOOTER[$this->curLayout]) ? $CUSTOMFOOTER[$this->curLayout] : $FOOTER;
		}
	    elseif($this->curLayout && is_array($HEADER) && isset($HEADER[$this->curLayout]) && isset($FOOTER[$this->curLayout])) // 0.8 themes - we use only $HEADER and $FOOTER arrays.
		{
		//  echo " MODE 0.8 ".$this->curLayout;
			$HEADER = $HEADER[$this->curLayout];
			$FOOTER = $FOOTER[$this->curLayout];
		}
		elseif($this->curLayout && ($this->curLayout !== 'legacyDefault') && (deftrue('e_MENUMANAGER_ACTIVE')))
		{
			if(!empty($HEADER) && is_string($HEADER) && 'legacyDefault')
			{
				$msg = '$HEADER is a string. It should be an array with a key: '.$this->curLayout.''; // NO LAN
			}
			if(is_array($HEADER) && !isset($HEADER[$this->curLayout]))
			{
				$msg = '$HEADER is missing a key for this layout. ('.$this->curLayout.')';
			}
			if(!empty($msg))
			{
				echo '
THEME ISSUE: '.$msg.'
';
			}
		}
       // Almost the same code as found in templates/header_default.php  ---------
	}
	/**
	 * @return void
	 */
	function menuGoConfig()
	{
		if(!$_GET['path'] || ($_GET['mode'] != "conf"))
		{
			return;
		}
		$file = urldecode($_GET['path']).".php";
		$file = e107::getParser()->filter($file);
		$newurl = e_PLUGIN_ABS.$file."?id=".intval($_GET['id']).'&iframe=1';
     /*
	  return "";
*/
		header("Location: ".$newurl);
		exit;
	}
	// -----------------------------------------------------------------------------
	/**
	 * @return void
	 */
	function menuModify()
		{
			$sql = e107::getDb();
			$tp = e107::getParser();
			$menu_act = "";
			if(isset($_POST['menuAct']))
			{
				foreach($_POST['menuAct'] as $k => $v)
				{
					if(trim($v))
					{
						$value = $tp->filter($_POST['menuAct'][$k]);
						$this->menuId = intval($k);
						list($menu_act, $location, $position, $this->menuNewLoc) = explode(".", $value);
					}
				}
			}
			if ($menu_act == "move")
			{
			 	$this->menuMove();
			}
			if (isset($location) && isset($position) && $menu_act == "bot")
			{
				$menu_count = $sql->count("menus", "(*)", " WHERE menu_location='{$location}' AND menu_layout = '".$this->dbLayout."'  ");
				$sql->update("menus", "menu_order=".($menu_count+1)." WHERE menu_order='{$position}' AND menu_location='{$location}' AND menu_layout = '$this->dbLayout'  ");
				$sql->update("menus", "menu_order=menu_order-1 WHERE menu_location='{$location}' AND menu_order > {$position} AND menu_layout = '".$this->dbLayout."' ");
				e107::getLog()->add('MENU_06',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
			}
			if (isset($location) && isset($position) && $menu_act == "top")
			{
				$sql->update("menus", "menu_order=menu_order+1 WHERE menu_location='{$location}' AND menu_order < {$position} AND menu_layout = '".$this->dbLayout."' ",$this->debug);
				$sql->update("menus", "menu_order=1 WHERE menu_id='{$this->menuId}' ");
				e107::getLog()->add('MENU_05',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
			}
			if (isset($location) && isset($position) && $menu_act == "dec")
			{
				$sql->update("menus", "menu_order=menu_order-1 WHERE menu_order='".($position+1)."' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ",$this->debug);
				$sql->update("menus", "menu_order=menu_order+1 WHERE menu_id='{$this->menuId}' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ");
				e107::getLog()->add('MENU_08',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
			}
			if (isset($location) && isset($position) && $menu_act == "inc")
			{
				$sql->update("menus", "menu_order=menu_order+1 WHERE menu_order='".($position-1)."' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ",$this->debug);
				$sql->update("menus", "menu_order=menu_order-1 WHERE menu_id='{$this->menuId}' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ");
				e107::getLog()->add('MENU_07',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
			}
			if (!isset($_GET['configure']))
			{  // Scan plugin directories to see if menus to add
			    $this->menuScanMenus();
			}
		}
	// ----------------------------------------------------------------------------
	/**
	 * @return false|mixed
	 */
	function menuSetPreset()
	{
		global $location;
		$sql = e107::getDb();
		$tp = e107::getParser();
		if(!$menuAreas = $this->getMenuPreset())
		{
			e107::getMessage()->addDebug("No Menu Preset Found");
			return false;
		}
		$sql->update("menus", "menu_location='0' WHERE menu_layout = '" . $this->dbLayout . "' "); // Clear All existing.
		foreach($menuAreas as $val)
		{
			if($sql->select("menus", 'menu_name, menu_path', "menu_name = '" . $tp->filter($val['menu_name']) . "' LIMIT 1"))
			{
				$row = $sql->fetch();
				if(!$sql->update('menus', "menu_order='" . (int) $val['menu_order'] . "', menu_location = " . (int) $val['menu_location'] . ", menu_class= " . $val['menu_class'] . " WHERE menu_name='" . $tp->filter($val['menu_name']) . "' AND menu_layout = '" . $this->dbLayout . "' LIMIT 1 "))
				{
					$insert = array(
						'menu_id'       => 0,
						'menu_name'     => $tp->filter($val['menu_name']),
						'menu_location' => (int) $val['menu_location'],
						'menu_order'    => (int) $val['menu_order'],
						'menu_class'    => $tp->filter($val['menu_class']),
						'menu_pages'    => '',
						'menu_path'     => $tp->filter($row['menu_path']),
						'menu_layout'   => $this->dbLayout,
						'menu_parms'    => '',
					);
					$sql->insert("menus", $insert);
					e107::getLog()->add('MENU_01', $tp->filter($row['menu_name']) . '[!br!]' . $location . '[!br!]' . varset($menu_count, 0) . '[!br!]' . $tp->filter($row['menu_path']), E_LOG_INFORMATIVE, '');
				}
			}
		}
		return $menuAreas;
	}
	// ----------------------------------------------------------------------------
	/**
	 * @return void
	 */
	public function menuScanMenus()
	{
		global $sql2;
		$sql = e107::getDb();
		$efile = new e_file;
		$efile->dirFilter = array('/', 'CVS', '.svn', 'languages');
		$efile->fileFilter[] = '^e_menu\.php$';
		$fileList = $efile->get_files(e_PLUGIN, "_menu\.php$", 'standard', 1);
		//	$this->menuAddMessage('Scanning for new menus', E_MESSAGE_DEBUG);
		e107::getDebug()->log("Scanning for new menus", E107_DBG_BASIC);
		$menuList = array(); // existing menus in table.
		if($result = $sql->retrieve('menus', 'menu_name', null, true))
		{
			foreach($result as $mn)
			{
				if($mn['menu_name'])
				{
					$menuList[] = $mn['menu_name'];
				}
			}
		}
		//v2.x Scan Custom Page Menus.
		$pageMenus = $sql->retrieve('page', 'page_id, menu_name, menu_title', "menu_name !='' ", true);
		foreach($pageMenus as $row)
		{
			if(!in_array($row['menu_name'], $menuList))
			{
				$insert = array(
					'menu_id'       => 0,
					'menu_name'     => $row['menu_name'],
					'menu_location' => 0,
					'menu_order'    => 0,
					'menu_class'    => 0,
					'menu_pages'    => '',
					'menu_path'     => $row['page_id'],
					'menu_layout'   => '',
					'menu_parms'    => ''
				);
				if($sql->insert("menus", $insert))
				{
					$this->menuAddMessage(MENLAN_10 . " - " . $row['menu_name'], E_MESSAGE_DEBUG);
				}
			}
		}
		$menustr = varset($menustr);
		$message = varset($message);
		foreach($fileList as $file)
		{
			list($parent_dir) = explode('/', str_replace(e_PLUGIN, "", $file['path']));
			$file['path'] = str_replace(e_PLUGIN, "", $file['path']);
			$file['fname'] = str_replace(".php", "", $file['fname']);
			$valid_menu = false;
			$existing_menu = in_array($file['fname'], $menuList); // $sql->count("menus", "(*)", "WHERE menu_name='{$file['fname']}'");
			if(file_exists(e_PLUGIN . $parent_dir . '/plugin.xml') || file_exists(e_PLUGIN . $parent_dir . '/plugin.php'))
			{
				if(e107::isInstalled($parent_dir))
				{  // Its a 'new style' plugin with a plugin.php file, or an even newer one with plugin.xml file - only include if plugin installed
					$valid_menu = true;        // Whether new or existing, include in list
//						echo "Include {$parent_dir}:{$file['fname']}
";
				}
			}
			else  // Just add the menu anyway
			{
				$valid_menu = true;
//					echo "Default Include {$parent_dir}:{$file['fname']}
";
			}
			if($valid_menu)
			{
				$menustr .= "&" . str_replace(".php", "", $file['fname']);
				if(!$existing_menu)  // New menu to add to list
				{
					$insert = array(
						'menu_id'       => 0,
						'menu_name'     => $file['fname'],
						'menu_location' => 0,
						'menu_order'    => 0,
						'menu_class'    => 0,
						'menu_pages'    => '',
						'menu_path'     => $file['path'],
						'menu_layout'   => '',
						'menu_parms'    => ''
					);
					if($sql->insert("menus", $insert))
					{
						// Could do admin logging here - but probably not needed
						$message .= MENLAN_10 . " - " . $file['fname'] . "
"; //FIXME
					}
					else
					{
						$this->menuAddMessage("Couldn't add menu: " . $file['fname'] . " to table ", E_MESSAGE_DEBUG);
					}
				}
			}
		}
		//Reorder all menus into 1...x order
		if(!is_object($sql2))
		{
			$sql2 = new db;
		}        // Shouldn't be needed
		if(!isset($sql3) || !is_object($sql3))
		{
			$sql3 = new db;
		}
		$location_count = $sql3->select("menus", "menu_location", "menu_location>0 GROUP BY menu_location");
		while($location_count)
		{
			if($sql->select("menus", "menu_id", "menu_location={$location_count} ORDER BY menu_order ASC"))
			{
				$c = 1;
				while($row = $sql->fetch())
				{
					$sql2->update("menus", "menu_order={$c} WHERE menu_id=" . $row['menu_id']);
					$c++;
				}
			}
			$location_count--;
		}
		$sql->select("menus", "*", "menu_path NOT REGEXP('[0-9]+') ");
		while(list($menu_id, $menu_name, $menu_location, $menu_order) = $sql->fetch('num'))
		{
			if(stripos($menustr, $menu_name) === false)
			{
				$sql2->delete("menus", "menu_name='$menu_name'");
				$message .= MENLAN_11 . " - " . $menu_name . "
";
			}
		}
		$this->menuAddMessage(vartrue($message), E_MESSAGE_DEBUG);
	}
	// ---------------------------------------------------------------------------
	/**
	 * @param $val
	 * @return int|mixed
	 */
	function menuPresetPerms($val)
	{
		$link_class = strtolower(trim((string) $val));
   		$menu_perm['everyone'] = e_UC_PUBLIC;
		$menu_perm['guest'] = e_UC_GUEST;
	  	$menu_perm['member'] = e_UC_MEMBER;
		$menu_perm['mainadmin'] = e_UC_MAINADMIN;
		$menu_perm['admin'] = e_UC_ADMIN;
		$menu_perm['nobody'] = e_UC_NOBODY;
		$link_class = isset($menu_perm[$link_class]) ? $menu_perm[$link_class] : e_UC_PUBLIC;
		return $link_class;
	}
	/**
	 * @param $id
	 * @param $fields
	 * @param $tabs
	 * @param e_form $ui
	 * @param $values
	 * @return string
	 */
	private function menuParamForm($id, $fields, $tabs, e_form $ui, $values=array())
	{
		$fields['menu_id'] = array('type'=>'hidden', 'writeParms'=>array('value'=>$id));
		$fields['mode']  = array('type'=>'hidden', 'writeParms'=>array('value'=>'parms'));
		$forms = $models = array();
		$forms[] = array(
				'id'  => 'e-save',
				'header' => '',
				'footer' => '',
				'url' => e_SELF,
				'query' => "lay=".$this->curLayout,
				'fieldsets' => array(
					'create' => array(
						'tabs'	=>  $tabs, //used within a single form.
						'legend' => '',
						'fields' => $fields, //see e_admin_ui::$fields
						'header' => '', //XXX Unused?
						'footer' => '',
						'after_submit_options' => '', // or true for default redirect options
						'after_submit_default' => '', // or true for default redirect options
						'triggers' => false, // standard create/update-cancel triggers
					)
				)
		);
	//	$models[] = $controller->getModel();
		$models[] = e107::getModel()->setData($values);
		return $ui->renderCreateForm($forms, $models, e_AJAX_REQUEST);
	}
	/**
	 * This one will be greatly extended, allowing menus to offer UI and us 
	 * settings per instance later ($parm variable available for menus - same as shortcode's $parm)
	 */
	function menuInstanceParameters()
	{
		if(!vartrue($_GET['parmsId'])) return;
		$id = intval($_GET['parmsId']);
		$frm = e107::getForm();
		$sql = e107::getDb();
		
		if(!$sql->select("menus", "*", "menu_id=".$id))
		{
        	$this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR);
            return null;
		};
		$row = $sql->fetch();
		$text = "
		
		
";
		
		return $text;
	
	}
	/**
	 * @return string|void
	 */
	function menuVisibilityOptions()
	{
		if(!vartrue($_GET['vis'])) return;
		$sql = e107::getDb();
		$frm = e107::getForm();
		$tp = e107::getParser();
		
		require_once(e_HANDLER."userclass_class.php");
		
		if(!$sql->select("menus", "*", "menu_id=".intval($_GET['vis'])))
		{
        	$this->menuAddMessage(MENLAN_48,E_MESSAGE_ERROR);
            return;
		}
		
		$row = $sql->fetch();
		
		$listtype 	= substr($row['menu_pages'], 0, 1);
		$menu_pages = substr($row['menu_pages'], 2);
		$menu_pages = str_replace("|", "\n", $menu_pages);
		$text = "";
	
		
		return $text;
		//$caption = MENLAN_7." ".$row['menu_name'];
		//$ns->tablerender($caption, $text);
		//echo $text;
	}
	// -----------------------------------------------------------------------------
	/**
	 * @return void
	 */
	function menuActivate()    // Activate Multiple Menus.
	{
		$sql = e107::getDb();
		$location = $this->menuActivateLoc;
		$menu_count = $sql->count("menus", "(*)", " WHERE menu_location=".$location." AND menu_layout = '".$this->dbLayout."' ");
		$menu_count++; // Need to add 1 to create NEW order number.
		
		foreach($this->menuActivateIds as $sel_mens)
		{
			//Get info from menu being activated
			if($sql->select("menus", 'menu_name, menu_path' , "menu_id = ".intval($sel_mens)." "))
			{
				$row=$sql->fetch();
				//If menu is not already activated in that area, add the record.
				//$query = "SELECT menu_name,menu_path FROM #menus WHERE menu_name='".$row['menu_name']."' AND menu_layout = '".$this->dbLayout."' AND menu_location = ".$location." LIMIT 1 ";
				//if(!$sql->gen($query, $this->debug))
				{
                   $insert = array(
                        	'menu_id'	=> 0,
							'menu_name' 	=> $row['menu_name'],
							'menu_location'	=> $location,
							'menu_order'	=> $menu_count,
							'menu_class'	=> intval($row['menu_class']),
							'menu_pages'	=> '',
                            'menu_path'		=> $row['menu_path'],
							'menu_layout'  	=> $this->dbLayout,
							'menu_parms'	=> ''
				   );
					$sql->insert("menus",$insert, $this->debug);
					e107::getLog()->add('MENU_01',$row['menu_name'].'[!br!]'.$location.'[!br!]'.$menu_count.'[!br!]'.$row['menu_path'],E_LOG_INFORMATIVE,'');
					$menu_count++;
				}
			}
		}
	}
	// -----------------------------------------------------------------------------
	/**
	 * @param $array
	 * @return void
	 */
	function menuSetCustomPages($array)
	{
		$pref = e107::getPref();
		$key = key($array);
		$pref['sitetheme_custompages'][$key] = array_filter(explode(" ",$array[$key]));
		save_prefs();
	}
	// ------------------------------------------------------------------------------
	/**
	 * @return false|mixed
	 */
	function getMenuPreset()
	{
		$pref = e107::getPref();
		$layout = $this->curLayout;
	    if(!isset($pref['sitetheme_layouts'][$layout]['menuPresets']))
		{
			e107::getMessage()->addDebug(print_a($pref['sitetheme_layouts'],true));
	    	return FALSE;
		}
		$areas = $pref['sitetheme_layouts'][$layout]['menuPresets']['area'];
		foreach($areas as $area => $menus)
		{
			$areaID = $menus['@attributes']['id'];	
			foreach($menus['menu'] as $k=>$v)
			{
				$perm = isset($v['@attributes']['perm']) ? $v['@attributes']['perm'] : null;
				$menuArea[] = array(
					'menu_location' => $areaID,
					'menu_order'	=> $k,
					'menu_name'		=> $v['@attributes']['name']."_menu",
					'menu_class'	=> $this->menuPresetPerms($perm)
				);	
			}
		}
						
	   return varset($menuArea, array());
	}
	// ------------------------------------------------------------------------------
	/**
	 * @param $array
	 * @param $name
	 * @return false|mixed|void
	 */
	function checkMenuPreset($array, $name)
	{
		if(!is_array($array))
		{
	    	return;
		}
		foreach($array as $key=>$val)
		{
	        if($val['menu_name']==$name)
			{
				return $val['menu_location'];
			}
		}
	    return FALSE;
	}
	
	// --------------------------------------------------------------------------
	/**
	 * @return array
	 */
	function menuSaveParameters()
	{
		$sql = e107::getDb();
		$tp = e107::getParser();
		$id = intval($_POST['menu_id']);
		if(isset($_POST['menu_parms'])) // generic params
		{
			$parms = $tp->filter($_POST['menu_parms']);
			$parms = $sql->escape(strip_tags($parms));
			$check = $sql->update("menus", "menu_parms=\"".$parms."\" WHERE menu_id=".$id."");
		}
		else // Save e_menu.php parameters.
		{
			unset($_POST['menu_id'], $_POST['mode'], $_POST['menuActivate'], $_POST['menuSetCustomPages'], $_POST['e-token']);
			$parms = $_POST;
			$check = e107::getMenu()->updateParms($id,$parms);
		}
		if($check)
		{
			return array('msg'=>'All Okay','error'=>false);
			// FIXME - menu log
			//e107::getLog()->add('MENU_02',$_POST['menu_parms'].'[!br!]'.$parms.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
		//	$this->menuAddMessage(LAN_SAVED,E_MESSAGE_SUCCESS);
		}
		elseif(false === $check)
		{
			return array('msg'=>LAN_UPDATED_FAILED,'error'=>true);
            
		}
		else
		{
			return array('msg'=>'No Changes Made','error'=>false); // $this->menuAddMessage(LAN_NOCHANGE_NOTSAVED,E_MESSAGE_INFO);
		}
	}
	// --------------------------------------------------------------------------
	/**
	 * @return array
	 */
	function menuSaveVisibility() // Used by Ajax
	{
		$tp = e107::getParser();
		$sql = e107::getDb();
		$pageList = $tp->filter($_POST['pagelist']);
		$listType = $tp->filter($_POST['listtype']);
		$pagelist = explode("\r\n", $pageList);
		for ($i = 0, $iMax = count($pagelist); $i < $iMax; $i++)
		{
			$pagelist[$i] = trim($pagelist[$i]);
		}
		$plist = implode("|", $pagelist);
		$pageparms = $listType.'-'.$plist;
		$pageparms = preg_replace("#\|$#", "", $pageparms);
		$pageparms = (trim($pageList) == '') ? '' : $pageparms;
		if($sql->update("menus", "menu_class='".intval($_POST['menu_class'])."', menu_pages='{$pageparms}' WHERE menu_id=".intval($_POST['menu_id'])))
		{
			e107::getLog()->add('MENU_02',$_POST['menu_class'].'[!br!]'.$pageparms.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
						
			return array('msg'=>LAN_UPDATED, 'error'=> false);
			//$this->menuAddMessage($message,E_MESSAGE_SUCCESS);
		}
		else
		{
	     	return array('msg'=>LAN_UPDATED_FAILED, 'error'=> true, 'posted'=>$_POST);
          //  $this->menuAddMessage($message,E_MESSAGE_ERROR);
		}
	}
	/**
	 * @param $id
	 * @return void
	 */
	function setMenuId($id)
	{
		$this->menuId = intval($id);	
	}
	// -----------------------------------------------------------------------
	/**
	 * @return array
	 */
	function menuDeactivate()
	{
		$sql = e107::getDb();
		$sql2 = e107::getDb();
		
		//echo "FOUND= ".$this->menuId;
		$error = false;
		$message = '';
		if($sql->gen('SELECT menu_name, menu_location, menu_order FROM #menus WHERE menu_id = '.$this->menuId.' LIMIT 1'))
		{
			$row = $sql->fetch();
			//Check to see if there is already a menu with location = 0 (to maintain BC)
			if($sql2->select('menus', 'menu_id', "menu_name='{$row['menu_name']}' AND menu_location = 0 AND menu_layout ='".$this->dbLayout."' LIMIT 1"))
			{
				//menu_location=0 already exists, we can just delete this record
				if(!$sql2->delete('menus', 'menu_id='.$this->menuId))
				{
					$message = "Deletion Failed";
					$error = true;
				}
			}
			else
			{
				//menu_location=0 does NOT exist, let's just convert this to it
				if(!$sql2->update("menus", "menu_location=0, menu_order=0, menu_class=0, menu_pages='' WHERE menu_id=".$this->menuId))
				{
	            	$message = "FAILED";
					$error = true;
				}
			}
			//Move all menus up (reduces order number) that have a higher menu order number than one deactivated, in the selected location. 
			$sql->update("menus", "menu_order=menu_order-1 WHERE menu_location={$row['menu_location']} AND menu_order > {$row['menu_order']} AND menu_layout = '".$this->dbLayout."' ");
			e107::getLog()->add('MENU_04',$row['menu_name'].'[!br!]'.$row['menu_location'].'[!br!]'.$row['menu_order'].'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
		}
		else
		{
			$message = "NO CHANGES MADE : ".$this->menuId;	
			$error = true;
			
		}
		return array('msg'=>$message,'error'=>$error);
	}
	// ----------------------------------------------------------------------
	/**
	 * Move a Menu
	 */
	function menuMove()
	{// Get current menu name
			$sql = e107::getDb();
			if($sql->select('menus', 'menu_name', 'menu_id='.$this->menuId, 'default'))
			{
				$row = $sql->fetch();
				//Check to see if menu is already active in the new area, if not then move it
				if(!$sql->select('menus', 'menu_id', "menu_name='{$row['menu_name']}' AND menu_location = ".$this->menuNewLoc." AND menu_layout='".$this->dbLayout ."' LIMIT 1"))
				{
					$menu_count = $sql->count("menus", "(*)", " WHERE menu_location=".$this->menuNewLoc);
					$sql->update("menus", "menu_location='{$this->menuNewLoc}', menu_order=".($menu_count+1)." WHERE menu_id=".$this->menuId);
					if(isset($location) && isset($position))
					{
						$sql->update("menus", "menu_order=menu_order-1 WHERE menu_location='{$location}' AND menu_order > {$position} AND menu_layout='".$this->dbLayout ."' ");
					}
				}
				e107::getLog()->add('MENU_03',$row['menu_name'].'[!br!]'.$this->menuNewLoc.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,'');
			}
	}
	// =-----------------------------------------------------------------------------
	/**
	 * @param $row
	 * @return string
	 */
	function renderOptionRow($row)
	{
		$frm 	= e107::getForm();
		
		
		$text = "";
		
		$pdeta = "";
	        $color = (varset($color) == "white") ? "#DDDDDD" : "white";
			if($row['menu_pages'] == "dbcustom")
			{
				$pdeta = LAN_CUSTOM;
			}
			else
			{
				$menuPreset = varset($menuPreset);
				$row['menu_name'] = preg_replace("#_menu$#i", "", $row['menu_name']);
	            if($pnum = $this->checkMenuPreset($menuPreset,$row['menu_name'].'_menu'))
				{
		        	$pdeta = MENLAN_39."  {$pnum}";
				}
			}
	        if(!$this->dragDrop)
			{
				$menuInf = (!is_numeric($row['menu_path'])) ? ' ('.substr($row['menu_path'],0,-1).')' : " ( #".$row['menu_path']." )";
	    	//	$menuInf = $row['menu_path'];
	    		
	    		$text .= "
				| ";
				$text .= $frm->checkbox('menuselect[]',$row['menu_id'],'',array('label'=>$row['menu_name'].$menuInf));
		
				$text .= " | ".$pdeta." | 
\n";
			}
			else
			{
				$menu_count = varset($menu_count);
				// Menu Choices box. 
	            $text .= "";
			 	$text .= $this->menuRenderMenu($row, $menu_count,true);
	  			$text .= "
\n";
			}	
		
		return $text;
	}
	/**
	 * @return void
	 */
	function menuRenderPage()
	{
		global $HEADER, $FOOTER, $rs;
		$pref   = e107::getPref();  
		$sql    = e107::getDb();     
		$tp     = e107::getParser();
	//	echo "";
		$this->parseheader($HEADER);  // $layouts_str;
		
		$layout = ($this->curLayout);
		$menuPreset = $this->getMenuPreset();
		echo "
";
		echo $rs->form_open("post", e_SELF."?configure=".$this->curLayout, "menuActivation");
		$text = "
";
		$text .= "| ".MENLAN_36."... | ...".MENLAN_37." | 
";
		$text .= "| ";
	 
		
		if(!$this->dragDrop)
		{
			$text .= " ";
		$text .= "";
		$text .= "";
			$text .= " 
			\n";
		}
		//else
		//{
       // 	$text .= "\n";
	//	}
		$pageMenu = array();
		$pluginMenu = array();
		$done = array();
		
		$sql->select("menus", "menu_name, menu_id, menu_pages, menu_path", "1 ORDER BY menu_name ASC");
		while ($row = $sql->fetch())
		{
			if(in_array($row['menu_name'],$done))
			{
				continue;
			}
			$done[] = $row['menu_name'];
			if(is_numeric($row['menu_path']))
			{
				$pageMenu[] = $row;	
			}
			else 
			{
				$pluginMenu[] = $row;	
			}
						
		}
		$text .= " ";
		foreach($pageMenu as $row)
		{	
			$text .= $this->renderOptionRow($row);	
		}
		
		$text .= "| ".MENLAN_49." | 
|---|
 ";
		foreach($pluginMenu as $row)
		{	
			$text .= $this->renderOptionRow($row);	
		}
		$text .= (!$this->dragDrop) ? "| ".MENLAN_50." | 
|---|
 " : "";
		$text .= " | 
";
		if(!count($this->menu_areas))
		{
			$text = "
";
			$text .= MENLAN_51."
";
			
			if(isset($this->customMenu) && count($this->customMenu))
			{
				$text .= "
".MENLAN_52."
- ".implode("
- ",$this->customMenu)."
";	
				$text .= "
".MENLAN_53."
";
			}
			
			$text .= "
";
		}
	//	$ns -> tablerender(MENLAN_22.'blabla', $text);
		if(!deftrue("e_DEBUG_MENUMANAGER"))
		{
			echo "";
		}
		else
		{
			echo $this->renderPanel(MENLAN_22, $text);
		}
	//
        echo $rs->form_close();
		echo "
";
		$FOOTER = str_replace('
[SiteTag]
";
		}*/
	//	elseif(strstr($str, "SITELINKS"))
	//	{
	//		echo "[SiteLinks]";
	//	}
	//	elseif(strstr($str, "NAVIGATION"))
	//	{
	//		$cust = preg_replace("/\W*\{NAVIGATION(.*?)(\+.*)?\}\W*/si", "\\1", $str);
	//		$tp->parseTemplate("{NAVIGATION".$cust."}",true);
		//	echo "Navigation Area";
	//	}
		elseif(strpos($str, '{---MODAL---}') !== false)
		{
			//echo "\n \n";
			echo '';
			//TODO Store in a central area - currently used in header.php, header_default.php and here.
			echo '
       
	         ';
			//echo getModal();
		}
		elseif(strpos($str, '{---CAPTION---}') !== false)
		{
			echo LAN_CAPTION;
		}
		elseif(strpos($str, '{LAYOUT_ID}') !== false)
		{
			echo 'layout-'.e107::getForm()->name2id($this->curLayout);
		}
		elseif(strpos($str, "ALERT") !== false)
		{
			echo '';
			//echo "[Navigation Area]";
		}
		elseif(strpos($str, "LANGUAGELINKS") !== false)
		{
			echo "[".defset('ADLAN_132', "Language")."]
";
		}
		elseif(strpos($str, "CUSTOM") !== false)
		{
			$cust = preg_replace("/\W*\{CUSTOM=(.*?)(\+.*)?\}\W*/si", "\\1", $str);
			echo "[" . $cust . "]
";
		}
		elseif(strpos($str, "CMENU") !== false)
		{
			$cust = preg_replace("/\W*\{CMENU=(.*?)(\+.*)?\}\W*/si", "\\1", $str);
			if(isset($this->customMenu))
			{
				$this->customMenu[] = $cust;
			}
			echo $tp->parseTemplate("{CMENU=".$cust."}",true);
		//	echo $this->renderPanel('Embedded Custom Menu',$cust);
		}
		elseif(strpos($str, "SETIMAGE") !== false)
		{
			$cust = preg_replace("/\W*\{SETIMAGE(.*?)(\+.*)?\}\W*/si", "\\1", $str);
			echo $tp->parseTemplate("{SETIMAGE".$cust."}",true);
		//	echo $this->renderPanel('Embedded Custom Menu',$cust);
		}
		/*elseif(strstr($str, "{WMESSAGE"))
		{
			echo "[Welcome Message Area]
";
		//	echo $this->renderPanel('Embedded Custom Menu',$cust);
		}*/
		elseif(strpos($str, "{FEATUREBOX") !== false)
		{
			echo "[".LAN_PLUGIN_FEATUREBOX_NAME."]
";
		//	echo $this->renderPanel('Embedded Custom Menu',$cust);
		}
		// Display embedded Plugin information.
		else if(strpos($str, "PLUGIN") !== false)
		{
			$plug = preg_replace("/\{PLUGIN=(.*?)\}/si", "\\1", $str);
			$plug = trim($plug);
			if(file_exists((e_PLUGIN . "{$plug}/{$plug}_config.php")))
			{
				$link = e_PLUGIN . "{$plug}/{$plug}_config.php";
			}
			
			if(file_exists((e_PLUGIN . $plug . "/config.php")))
			{
				$link = e_PLUGIN . $plug . "/config.php";
			}
			
		//	$plugtext = "";
			echo "
";
			echo $this->renderPanel($plug, $plugtext);
			// $ns->tablerender($plug, $plugtext);
		}
		else if(strpos($str, "MENU") !== false)
		{
			$matches = array();
			if(preg_match_all("/\{(?:MENU|MENUAREA)=([\d]{1,3})(:[\w\d]*)?\}/", $str, $matches)) //
			{
				$menuText = "";
				foreach($matches[1] as $menu)
				{
					$menu = preg_replace("/\{(?:MENU|MENUAREA)=(.*?)(:.*?)?\}/si", "\\1", $str);
					if(isset($sc_style['MENU']['pre']) && strpos($str, 'ret') !== false)
					{
						$menuText .= $sc_style['MENU']['pre'];
					}
					// ---------------
					$menuText .= "\n\n";
					$menuText .= "\n\n";
					
					// ---------------
					
					
					if(isset($sc_style['MENU']['post']) && strpos($str, 'ret') !== false)
					{
						$menuText .= $sc_style['MENU']['post'];
					}
					
					
				}
				echo $menuText;
			//	$ns->tablerender('', varset($menuText)); // Could fail with a badly built theme.
			}
			else
			{
				echo $tp->parseTemplate($str,true);
			}
		}
		else
		{
			echo $tp->parseTemplate($str,true);
		}
	}
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
	/**
	 * @param $row
	 * @param $menu_count
	 * @param $rep
	 * @return string|void
	 */
	function menuRenderMenu($row, $menu_count, $rep = FALSE)
	{
	
		global $rs,$menu,$menu_info,$menu_act, $style;
		$style = $this->style;
		//      $menu_count is empty in here
		//FIXME extract
		$menu_location = '';
		$menu_order = '';
		extract($row);
		if(empty($menu_id)){ return; }
		$menu_name = varset($menu_name);
		$menu_name = preg_replace("#_menu#i", "", $menu_name);
		//TODO we need a CSS class for this
		$vis = (varset($menu_class) || strlen(varset($menu_pages)) > 1) ? "  " : "";
		//DEBUG div not allowed in final tags 	$caption = "{$menu_name}{$vis}
";
		// use theme render style instead
		
		// Undocumented special parameter 'admin_title'
		$menuParms = array();
		if(!empty($row['menu_parms'])) parse_str($row['menu_parms'], $menuParms);
		if(isset($menuParms['admin_title']) && $menuParms['admin_title'])
		{
			$caption = deftrue($menuParms['admin_title'], $menuParms['admin_title']).$vis;
		}
		elseif(isset($menuParms['title']) && $menuParms['title'])
		{
			$caption = deftrue($menuParms['title'], $menuParms['title']).$vis;
		}
		else $caption = $menu_name.$vis;
		
		$menu_info = "{$menu_location}.{$menu_order}";
		$text = "";
		$conf = '';
		if (file_exists(e_PLUGIN.varset($menu_path).$menu_name.'_menu_config.php'))
		{
			$conf = $menu_path.$menu_name.'_menu_config';
		}
		if($conf == '' && file_exists(e_PLUGIN."{$menu_path}config.php"))
		{
		  $conf = "{$menu_path}config";
		}
//
	//	$text = "";
		$text .= '" : "";
	//	$text .= "
";
		
		if(!$this->dragDrop)
		{
				
			return "".$caption."
". $text;
		//	return;
	
		//	return $ns->tablerender($caption, $text,'', true); Theme style too unpredictable. 
			
			
		}
		else
		{
			
			return "
			
			".$text."
";		
		}
		
		
	}
	/**
	 * @param $mode
	 * @return false|string|void|null
	 */
	function menuSaveAjax($mode = null)
	{
		
		
		if($mode == 'visibility')
		{
		
			$ret = $this->menuSaveVisibility();	
		//	echo json_encode($ret);
			return null;
		}		
		
		if($mode == 'delete')
		{
			list($tmp,$area) = explode("-",$_POST['area']);
		
			if($_POST['area'] == 'remove')
			{
				list($tmp,$deleteID) = explode("-",$_POST['removeid']);	
				$this->menuId = $deleteID;
				$ret = $this->menuDeactivate();	
			//	echo json_encode($ret);
				
				return null;
			}	
			
		}
		
		
		if($mode == 'parms') 
		{
			$ret = $this->menuSaveParameters();
			if(!empty($ret['error']))
			{
				return json_encode($ret);
			}
			return null;
		}
		
		
		
    // 	print_r($_POST);
		return;
	 
	 
		$this->debug = TRUE;
		
		$sql = e107::getDb();
		
		// Allow deletion by ajax, but not the rest when drag/drop disabled.  
		if(!$this->dragDrop){ return; }
		$this -> dbLayout = $_POST['layout'];
		list($tmp,$insertID) = explode("-",$_POST['insert']);	
		$insert[] = $insertID;
		
		if($_POST['mode'] == 'insert'  && count($insert) && $area) // clear out everything before rewriting everything to db. 
		{
		 	$this->menuActivateLoc = $area;  // location
			$this->menuActivateIds = $insert;  // array of ids, in order.
			$this->menuActivate(); 
			
		}
		elseif($_POST['mode'] == 'update')
		{
			$sql->update("menus","menu_location = ".intval($area)." WHERE menu_id = ".intval($insertID)."",$this->debug);
		}
		
		$c = 0;
		
		if(count($_POST['list'])<2)
		{
			return;
		}
		
		// resort the menus in this 'Area"
		foreach($_POST['list'] as $val)
		{
			list($b,$id) = explode("-",$val);
			$order[] = $id;
			$sql->update("menus","menu_order = ".$c." WHERE menu_id = ".intval($id)."",$this->debug);
       		$c++;
		}
		// same for delete etc.
	//	echo "
";
	}
	/**
	 * @return void
	 */
	function menuSetConfigList()
	{
		e107::getDebug()->log("Scanning for Menu config files");
        	$sql = e107::getDb();
        	$pref = e107::getPref();
			$prev_name = '';
			$search = array('_menu','_');
			$sql -> select("menus", "*", "menu_location != 0 ORDER BY menu_path,menu_name");
			while($row = $sql-> fetch())
			{
				$link = "";
				$id = substr($row['menu_path'],0,-1);
				if (file_exists(e_PLUGIN."{$row['menu_path']}{$row['menu_name']}_menu_config.php"))
				{
				    $link = $row['menu_path'].$row['menu_name']."_menu_config.php";
				}
				if($row['menu_path'] == 'news/')
				{
					$row['menu_path'] = "blogcalendar_menu/";
				}
				if(file_exists(e_PLUGIN.$row['menu_path']."config.php"))
				{
					 $link = $row['menu_path']."config.php";
				}
				if($link)
				{
         			$tmp[$id]['name'] = ucwords(str_replace($search,"",$row['menu_name'])); // remove _
					if(vartrue($prev) == $id && ($tmp[$id]['name'] != $prev_name))
					{
	                	$tmp[$id]['name'] .= ":".$prev_name;
					}
					$tmp[$id]['link'] = $link;
					$prev = $id;
					$prev_name = $tmp[$id]['name'];
				}
			}
           $pref['menuconfig_list'] = vartrue($tmp);
		   
		   e107::getConfig()->setPref($pref)->save(false,true,false);
	}
}  // end of Class.
// XXX Menu Manager Re-Write with drag and drop and multi-dimensional array as storage. ($pref)
// TODO Get Drag & Drop Working with the iFrame
// TODO Sorting, visibility, parameters and delete.
// TODO Get THIS http://jsbin.com/odiqi3  working with iFrames!! XXX XXX
/**
 * Used only for the menu-selector at the moment.
 * Class e_layout
 */
class e_mm_layout
{
	private $menuData = array();
	private	$iframe = false;
	private $cnt = 0;
	function __construct()
	{
		$pref = e107::getPref();
		$ns = e107::getRender();
	//	$this->convertMenuTable();
		$this->menuData = e107::getPref('menu_layouts');
		if(e_AJAX_REQUEST)
		{
			if(varset($_POST['data']))
			{
				$this->processPost();
			}
			if(vartrue($_GET['enc']))
			{
				$string = base64_decode($_GET['enc']);
				parse_str($string,$_GET);
			}
			if(vartrue($_GET['vis']))
			{
				$text = $this->renderVisibilityOptions();
			}
			// print_a($_GET);
			if(vartrue($_GET['parmsId']))
			{
			//	$text = $this->renderInstanceParameters();
			}
			if(vartrue($_POST['mode']))
			{
			//	print_r($_POST);
			//	$men->setMenuId($this->menuId);
			//	$text = $this->menuSaveAjax($_POST['mode']);
			}
			echo $text;
			exit;
		}
		if(vartrue($_GET['configure'])) //ie Inside the IFRAME.
		{
			global $HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$style;
			$this->HEADER 		= $HEADER;
			$this->FOOTER 		= $FOOTER;
			$this->CUSTOMHEADER = $CUSTOMHEADER;
			$this->CUSTOMFOOTER = $CUSTOMFOOTER;
			$this->style		= $style;
			unset($HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$style);
			e107::loadAdminIcons();
		//	require_once(e_CORE."templates/admin_icons_template.php");
		 /*
			e107::js('inline', "
			win = document.getElementById('menu_iframe').contentWindow;
			win.jQuery(dragelement,parent.document).draggable({
				connectToSortable : $('#sortable')
			});
			",'jquery');
		*/
			$this->curLayout = vartrue($_GET['configure'], $pref['sitetheme_deflayout']);
			$this->renderLayout($this->curLayout);
		}
		else // Parent - ie. main admin page.
		{
			e107::css('inline',"
				.menuOption { display: none }
			
			");
			$theme = e107::getPref('sitetheme');
			require_once(e_THEME.$theme."/theme.php");
			$this->HEADER 		= varset($HEADER);
			$this->FOOTER 		= varset($FOOTER);
			$this->CUSTOMHEADER = varset($CUSTOMHEADER);
			$this->CUSTOMFOOTER = varset($CUSTOMFOOTER);
			$this->style		= varset($style);
				// XXX HELP _ i don't work with iFrames.
		//	$("#sortable")
		//$("iframe").contents().find(".sortable")
		/*
		e107::js('inline','
		 $(function()
		 {
			$( ".sortable" ).sortable({
				revert: true
			});
			$("iframe").load(function(){
				var frameid = $("#iframe-default").contents().find(".sortable").attr("id")
				$( ".draggable" ).draggable({
					connectToSortable: "#" + frameid,
					helper: "clone",
					revert: "invalid",
					cursor: "move",
					iframeFix: true
				});
			});
		 	//	$( "ul, li" ).disableSelection();
		});
		','jquery');
		*/
			$this->scanForNew();
			$this->renderInterface();
		}
	}
	/**
	 * Save Menu Pref
	 */
	protected function processPost()
	{
		$cnf 		= e107::getConfig('core');
		$existing 	= $cnf->get('menu_layouts');
		$data 	= $_POST['data'];
		$layout = $_POST['layout'];
		$area	= $_POST['area'];
		$save = array();
		foreach($_POST['data']['layout']['area'] as $v) // reset key values.
		{
			$save[] = $v;
		}
	//	$save[$layout][$area] = $_POST['data']['layout']['area'];
		echo "\nLAYOUT=".$layout."\n";
		echo "AREA=".$area."\n";
		//print_r($save);
		e107::getConfig('core')->setPref('menu_layouts/'.$layout."/".$area, $save)->save();
	}
	/**
	 * Substitute all {MENU=X} and Render output.
	 */
	private function renderLayout($layout='')
	{
		$ALL = $this->getHeadFoot();
		$HEADER = $ALL['HEADER'];
		$FOOTER = $ALL['FOOTER'];
		$tp = e107::getParser();
		$head = preg_replace_callback("/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/", array($this, 'renderMenuArea'), $HEADER[THEME_LAYOUT]);
		$foot = preg_replace_callback("/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/", array($this, 'renderMenuArea'), $FOOTER[THEME_LAYOUT]);
		global $style;
		$style = $this->style;
		echo $tp->parseTemplate($head);
	//	echo "MAIN CONTENT
";
		echo $tp->parseTemplate($foot);
	}
	/**
	 * @return array
	 */
	public static function menuSelector()
	{
		//	$p = e107::getPref('e_menu_list');	// new storage for xxxxx_menu.php list.
		$sql = e107::getDb();
		$frm = e107::getForm();
		$done = array();
		$pageMenu = array();
		$pluginMenu = array();
		$sql->select("menus", "menu_name, menu_id, menu_pages, menu_path", "1 ORDER BY menu_name ASC");
		while($row = $sql->fetch())
		{
			if(in_array($row['menu_name'], $done))
			{
				continue;
			}
			$done[] = $row['menu_name'];
			if(is_numeric($row['menu_path']))
			{
				$pageMenu[] = $row;
			}
			else
			{
				$pluginMenu[] = $row;
			}
		}
		$tab1 = '';
		$tab2 = '';
		$tabs = array(
			'custom' => array('caption' => '', 'text' => $tab1),
			'plugin' => array('caption' => '', 'text' => $tab2)
		);
		$defLayout = e107::getRegistry('core/e107/menu-manager/curLayout');;
		$text = '';
		$tp = e107::getParser();
		$caption = MENLAN_22;;
		return array('caption' => $caption, 'text' => $text);
	}
	/**
	 * @param $theme
	 * @return array|false
	 */
	public static function getLayouts($theme = null)
	{
		if(empty($theme))
		{
			$theme = e107::pref('core', 'sitetheme');
		}
		$sql = e107::getDb(); // required
		$tp = e107::getParser();
		$HEADER = null;
		$FOOTER = null;
		$LAYOUT = null;
		$CUSTOMHEADER = null;
		$CUSTOMFOOTER = null;
		$path = e_THEME . $theme . '/';
		$file = $path . "theme.php";
		if(!is_readable($file))
		{
			return false;
		}
		e107::set('css_enabled', false);
		e107::set('js_enabled', false);
		// new v2.2.2 HTML layout support.
		if(is_dir($path . "layouts") && is_readable($path . "theme.html"))
		{
			$lyt = scandir($path . "layouts");
			$LAYOUT = array();
			foreach($lyt as $lays)
			{
				if($lays === '.' || $lays === '..')
				{
					continue;
				}
				$key = str_replace("_layout.html", '', $lays);
				if($lm = e_theme::loadLayout($key, $theme))
				{
					$LAYOUT = $LAYOUT + $lm;
				}
			}
		}
		else // prior to v2.2.2
		{
			$themeFileContent = file_get_contents($file);
			$srch = array('');
			// replace LAN file load.
			$themeFileContent = preg_replace("/e107::lan\(['|\"]theme.*\);/","e107::themeLan(null, '".$theme."');", $themeFileContent);
		//	$themeFileContent = preg_replace("/define\(['|\"]BOOTSTRAP['|\"].*;/", '', $themeFileContent);
		//	$themeFileContent = preg_replace("/define\(['|\"]FONTAWESOME['|\"].*;/", '', $themeFileContent);
			$themeFileContent = preg_replace("/LAN_[\w]*/", '""', $themeFileContent);
			$themeFileContent = preg_replace("/include_lan\(.*;/", '', $themeFileContent);
			$themeFileContent = preg_replace("/define\(.*;/", '', $themeFileContent);
			$themeFileContent = preg_replace('/\(\s?THEME\s?\./', '( e_THEME. "' . $theme . '/" .', str_replace($srch, '', $themeFileContent));
			$themeFileContent = str_replace('USER_WIDTH', "''", $themeFileContent);
			$themeFileContent = str_replace('tablestyle', $tp->filter($theme, 'wd') . "_tablestyle", $themeFileContent); // rename function to avoid conflicts while parsing.
			$themeFileContent = str_replace("class " . $theme . "_theme", "class " . $theme . "__theme", $themeFileContent); // rename class to avoid conflicts while parsing.
			$themeFileContent = str_replace('__DIR__', var_export(dirname($file), true), $themeFileContent);
			$themeFileContent = str_replace('__FILE__', var_export($file, true), $themeFileContent);
			if(PHP_MAJOR_VERSION > 6)
			{
				try
				{
					eval($themeFileContent);
				}
				catch(Error $e)
				{
					trigger_error("Couldn't parse theme.php file. ". $e->getMessage()."\n\n".$themeFileContent);
					echo "Couldn't parse theme.php: " . $e->getMessage() . " 
";
					file_put_contents(e_LOG."menuManagerParseDebug.log", $themeFileContent);
				}
			}
			else
			{
				try
				{
					eval($themeFileContent);
				}
				catch(ParseError $e)
				{
					trigger_error("Couldn't parse theme.php file.". $e->getMessage());
					echo "Couldn't parse theme.php: " . $e->getMessage() . " 
";
				}
			}
		}
		e107::set('css_enabled', true);
		e107::set('js_enabled', true);
		$head = array();
		$foot = array();
		if(isset($LAYOUT) && (isset($HEADER) || isset($FOOTER)))
		{
			$fallbackLan = "This theme is using deprecated elements. All [x]HEADER and [x]FOOTER variables should be removed from theme.php."; // DO NOT TRANSLATE!
			$warningLan = $tp->lanVars(deftrue('MENLAN_60', $fallbackLan), '$');
			echo "" . $warningLan . "
";
		}
		if(isset($LAYOUT) && is_array($LAYOUT)) // $LAYOUT is a combined $HEADER,$FOOTER.
		{
			foreach($LAYOUT as $key => $template)
			{
				if($key == '_header_' || $key == '_footer_' || $key == '_modal_')
				{
					continue;
				}
				if(strpos($template, '{---}') !== false)
				{
					list($hd, $ft) = explode("{---}", $template);
					$head[$key] = isset($LAYOUT['_header_']) ? $LAYOUT['_header_'] . $hd : $hd;
					$foot[$key] = isset($LAYOUT['_footer_']) ? $ft . $LAYOUT['_footer_'] : $ft;
				}
				else
				{
					e107::getMessage()->addDebug('Missing "{---}" in $LAYOUT["' . $key . '"] ');
				}
			}
			unset($hd, $ft);
		}
		if(is_string($CUSTOMHEADER))
		{
			$head['legacyCustom'] = $CUSTOMHEADER;
		}
		elseif(is_array($CUSTOMHEADER))
		{
			foreach($CUSTOMHEADER as $k => $v)
			{
				$head[$k] = $v;
			}
		}
		if(is_string($HEADER))
		{
			$head['legacyDefault'] = $HEADER;
		}
		elseif(is_array($HEADER))
		{
			foreach($HEADER as $k => $v)
			{
				$head[$k] = $v;
			}
		}
		if(is_string($CUSTOMFOOTER))
		{
			$foot['legacyCustom'] = $CUSTOMFOOTER;
		}
		elseif(is_array($CUSTOMFOOTER))
		{
			foreach($CUSTOMFOOTER as $k => $v)
			{
				$foot[$k] = $v;
			}
		}
		if(is_string($FOOTER))
		{
			$foot['legacyDefault'] = $FOOTER;
		}
		elseif(is_array($FOOTER))
		{
			foreach($FOOTER as $k => $v)
			{
				$foot[$k] = $v;
			}
		}
		$layout = array();
		foreach($head as $k => $v)
		{
			$template = $v . "\n{---}" . $foot[$k];
			$layout['templates'][$k] = $template;
			$layout['menus'][$k] = self::countMenus($template, $k);
		}
		return $layout;
	}
	/**
	 * @param $template
	 * @param $name
	 * @return array|mixed
	 */
	private static function countMenus($template, $name)
	{
		if(preg_match_all("/\{(?:MENU|MENUAREA)=([\d]{1,3})(:[\w\d]*)?\}/", $template, $matches))
		{
			sort($matches[1]);
			return $matches[1];
		}
		e107::getDebug()->log("No Menus Found in Template:" . $name . " with strlen: " . strlen($template));
		return array();
	}
	/**
	 * Render {MENU=X}
	 */
	private function renderMenuArea($matches)
	{
		$frm = e107::getForm();
		$area = $matches[1];
		// return print_a($this->menuData,true);
		$text = "";
	//	$text .= $frm->button('submit','submit','submit','submit');
		$text .= $frm->hidden('layout',THEME_LAYOUT);
		$text .= $frm->hidden('area',$area);
		$text .= $frm->close();
		return $text;
	}
	/**
	 * @param $row
	 * @param $layout
	 * @param $area
	 * @return string
	 */
	private function renderMenu($row, $layout, $area)
	{
	//	return print_a($row,true);
		$frm = e107::getForm();
		$uniqueId = "menu_".$frm->name2id($row['path']).'_'.$this->cnt;
		return '\n";
	}
	/**
	 * @param $row (array of data from $pref['menu_layouts']
	 * @param $layout . eg. 'default' or 'home'
	 * @param number $area as in {MENU=x}
	 * @param incrementor number.
	 */
	public function renderMenuOptions($row, $layout, $area, $c , $uniqueId='xxx')
	{
		$frm = e107::getForm();
	//	$text = " ";
		$text = str_replace("_menu","",$row['name']);
	//	$layout = 'layout';
	//	$area = 'area';
		//TODO Delete, Config etc.
		//$data[$layout][$location][] = array('name'=>$row['menu_name'],'class'=>$row['menu_class'],'path'=>$row['menu_path'],'pages'=>$row['menu_pages'],'parms'=>$row['menu_parms']);
	//	$area = 'area_'.$area;
		// 'layout' and 'area' will later be substituted.
		$text .= $frm->hidden('data[layout][area]['.$c.'][name]',$row['name'],array('id'=>'name-'.$area.'-'.$c) );
		$text .= $frm->hidden('data[layout][area]['.$c.'][class]',$row['class'], array('id'=>'class-'.$area.'-'.$c)  );
		$text .= $frm->hidden('data[layout][area]['.$c.'][path]',$row['path'], array('id'=>'path-'.$area.'-'.$c)  );
		$text .= $frm->hidden('data[layout][area]['.$c.'][pages]',$row['pages'], array('id'=>'pages-'.$area.'-'.$c)  );
		$text .= $frm->hidden('data[layout][area]['.$c.'][parms]',$row['parms'], array('id'=>'parms-'.$area.'-'.$c)  );
		$visibilityLink = e_SELF."?enc=".base64_encode('lay='.$layout.'&vis='.$area.'-'.$c.'&iframe=1&class='.$row['class'].'&pages='.$row['pages']);
		$text .= ""; // $('.hello').remove();
		$text .= '';
		/*
		$text .= '';
		*/
		return $text;
	}
/*
	function menuSaveAjax($mode = null)
	{
		if($mode == 'visibility')
		{
			$ret = $this->menuSaveVisibility();
		//	echo json_encode($ret);
			return;
		}
		if($mode == 'parms')
		{
		//	echo "hi there";
			$ret =  array('msg'=>'hi there','error'=>true);
		//	$ret = $this->menuSaveParameters();
			echo json_encode($ret);
			return;
		}
     //	print_r($_POST);
		return;
	}
*/
	/**
	 * Scan Plugin folders for new _menu files.
	 */
	private function scanForNew()
	{
		$fl 			= e107::getFile();
		$fl->dirFilter 	= array('/', 'CVS', '.svn', 'languages');
		$files 			= $fl->get_files(e_PLUGIN,"_menu\.php$",'standard',1);
		$data = array();
		foreach($files as $file)
		{
			if($file == 'e_menu.php')
			{
				continue;
			}
			$valid_menu = false;
			if (file_exists($file['path'].'/plugin.xml') || file_exists($file['path'].'/plugin.php'))
			{
			//	if (e107::isInstalled($file['path'])) //FIXME need a check that doesn't exlude page, news and others that don't require installation.
				{
					$valid_menu = TRUE;		// Whether new or existing, include in list
				}
			}
			else  // Just add the menu anyway
			{
				$valid_menu = TRUE;
			}
			$path = trim(str_replace(e_PLUGIN,"",$file['path']),"/");
			if($valid_menu)
			{
				$fname = str_replace(".php","",$file['fname']);
				$data[$fname] = $path;
			}
		}
		$config = e107::getConfig('core');
		$config->set('e_menu_list',$data);
		$config->save();
	}
	/**
	 * @return string|void
	 */
	private function renderVisibilityOptions()
	{
		if(!vartrue($_GET['vis'])) return;
	//	print_a($_GET);
		$tp = e107::getParser();
		$sql = e107::getDb();
		$ns = e107::getRender();
		$frm = e107::getForm();
		require_once(e_HANDLER."userclass_class.php");
	/*
		if(!$sql->select("menus", "*", "menu_id=".intval($_GET['vis'])))
		{
        	$this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR);
            return;
		}
		$row = $sql->fetch();
	*/
		$listtype 	= substr($_GET['pages'], 0, 1);
		$menu_pages = substr($_GET['pages'], 2);
		$menu_pages = str_replace("|", "\n", $menu_pages);
		$text = "
			
		 ";
		return $text;
		//$caption = MENLAN_7." ".$row['menu_name'];
		//$ns->tablerender($caption, $text);
		//echo $text;
	}
	/**
	 * This one will be greatly extended, allowing menus to offer UI and us
	 * settings per instance later ($parm variable available for menus - same as shortcode's $parm)
	 * @see menuInstanceParameters() in menumanager_class.php
	 */
/*
	private function renderInstanceParameters()
	{
		if(!vartrue($_GET['parmsId'])) return;
		$id = intval($_GET['parmsId']);
		$frm = e107::getForm();
		$sql = e107::getDb();
		if(!$sql->select("menus", "*", "menu_id=".$id))
		{
        	$this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR);
            return;
		};
		$row = $sql->fetch();
		$text = "
		
		";
		return $text;
	}
*/
	/**
	 * Render the main area with TABS and iframes.
	 */
	private function renderInterface()
	{
		$ns = e107::getRender();
		$tp = e107::getParser();
		$frm = e107::getForm();
		$TEMPL = $this->getHeadFoot();
		$layouts = array_keys($TEMPL['HEADER']);
		e107::js('inline','
		 $(function() 
		 {
			$(".draggable").draggable({
					connectToSortable: $(".sortable"),
					helper: "clone",
					revert: "invalid",
					cursor: "move",
					iframeFix: true,
			        refreshPositions: true
			       
				});
		 })'
		 );
		$text = '';
		$active = ' class="active" ';
		foreach($layouts as $title)
		{
			$text .= '- '.$title.'';
			$active = '';
		}
		$text .= '
';
		$active = 'active';
		$text .= '';
			foreach($layouts as $title)
			{
				$text .= '
					
					
					
';
				$active = '';
			}
		$text .= '