Эх сурвалжийг харах

Theme: Side Menu default state controls.

Nate 5 жил өмнө
parent
commit
ea768384be

+ 6 - 0
core/default_settings/default_setting_edit.php

@@ -609,6 +609,12 @@
 		echo "    	<option value='never' ".($default_setting_value == "never" ? "selected='selected'" : null).">".$text['option-button_icons_never']."</option>\n";
 		echo "    </select>\n";
 	}
+	elseif ($category == "theme" && $subcategory == "menu_side_state" && $name == "text" ) {
+		echo "    <select class='formfld' id='default_setting_value' name='default_setting_value'>\n";
+		echo "    	<option value='contracted'>".$text['option-contracted']."</option>\n";
+		echo "    	<option value='expanded' ".($default_setting_value == "expanded" ? "selected='selected'" : null).">".$text['option-expanded']."</option>\n";
+		echo "    </select>\n";
+	}
 	elseif ($category == "voicemail" && $subcategory == "voicemail_file" && $name == "text" ) {
 		echo "    <select class='formfld' id='default_setting_value' name='default_setting_value'>\n";
 		echo "    	<option value='listen' ".(($default_setting_value == "listen") ? "selected='selected'" : null).">".$text['option-voicemail_file_listen']."</option>\n";

+ 3 - 0
core/default_settings/default_settings.php

@@ -337,6 +337,9 @@
 			else if ($category == 'theme' && $subcategory == 'button_icons' && $name == 'text') {
 				echo "		".$text['option-button_icons_'.$row['default_setting_value']]."\n";
 			}
+			else if ($category == 'theme' && $subcategory == 'menu_side_state' && $name == 'text') {
+				echo "		".$text['option-'.$row['default_setting_value']]."\n";
+			}
 			else if ($category == "theme" && substr_count($subcategory, "_color") > 0 && ($name == "text" || $name == 'array')) {
 				echo "		".(img_spacer('15px', '15px', 'background: '.escape($row['default_setting_value']).'; margin-right: 4px; vertical-align: middle; border: 1px solid '.(color_adjust($row['default_setting_value'], -0.18)).'; padding: -1px;'));
 				echo "<span style=\"font-family: 'Courier New'; line-height: 6pt;\">".escape($row['default_setting_value'])."</span>\n";

+ 6 - 0
core/domain_settings/domain_setting_edit.php

@@ -666,6 +666,12 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
 		echo "    	<option value='never' ".($row['domain_setting_value'] == "never" ? "selected='selected'" : null).">".$text['option-button_icons_never']."</option>\n";
 		echo "    </select>\n";
 	}
+	elseif ($category == "theme" && $subcategory == "menu_side_state" && $name == "text" ) {
+		echo "    <select class='formfld' id='domain_setting_value' name='domain_setting_value'>\n";
+		echo "    	<option value='contracted'>".$text['option-contracted']."</option>\n";
+		echo "    	<option value='expanded' ".($row['domain_setting_value'] == "expanded" ? "selected='selected'" : null).">".$text['option-expanded']."</option>\n";
+		echo "    </select>\n";
+	}
 	elseif ($category == "voicemail" && $subcategory == "voicemail_file" && $name == "text" ) {
 		echo "    <select class='formfld' id='domain_setting_value' name='domain_setting_value'>\n";
 		echo "    	<option value='listen' ".(($row['domain_setting_value'] == "listen") ? "selected='selected'" : null).">".$text['option-voicemail_file_listen']."</option>\n";

+ 3 - 0
core/domain_settings/domain_settings.php

@@ -294,6 +294,9 @@
 			else if ($category == 'theme' && $subcategory == 'button_icons' && $name == 'text') {
 				echo "		".$text['option-button_icons_'.$row['domain_setting_value']]."\n";
 			}
+			else if ($category == 'theme' && $subcategory == 'menu_side_state' && $name == 'text') {
+				echo "		".$text['option-'.$row['domain_setting_value']]."\n";
+			}
 			else if ($category == "theme" && substr_count($subcategory, "_color") > 0 && ($name == "text" || $name == 'array')) {
 				echo "		".(img_spacer('15px', '15px', 'background: '.escape($row['domain_setting_value']).'; margin-right: 4px; vertical-align: middle; border: 1px solid '.(color_adjust($row['domain_setting_value'], -0.18)).'; padding: -1px;'));
 				echo "<span style=\"font-family: 'Courier New'; line-height: 6pt;\">".escape($row['domain_setting_value'])."</span>\n";

+ 6 - 0
core/user_settings/user_setting_edit.php

@@ -628,6 +628,12 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
 		echo "    	<option value='right' ".(($user_setting_value == "right") ? "selected='selected'" : null).">".$text['label-right']."</option>\n";
 		echo "    </select>\n";
 	}
+	elseif ($user_setting_category == "theme" && $user_setting_subcategory == "menu_side_state" && $user_setting_name == "text" ) {
+		echo "    <select class='formfld' id='user_setting_value' name='user_setting_value'>\n";
+		echo "    	<option value='contracted'>".$text['option-contracted']."</option>\n";
+		echo "    	<option value='expanded' ".($user_setting_value == "expanded" ? "selected='selected'" : null).">".$text['option-expanded']."</option>\n";
+		echo "    </select>\n";
+	}
 	else {
 		echo "	<input class='formfld' type='text' id='user_setting_value' name='user_setting_value' maxlength='255' value=\"".escape($user_setting_value)."\">\n";
 	}

+ 121 - 0
core/user_settings/user_setting_set.php

@@ -0,0 +1,121 @@
+<?php
+/*
+FusionPBX
+Version: MPL 1.1
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is FusionPBX
+
+The Initial Developer of the Original Code is
+Mark J Crane <[email protected]>
+Portions created by the Initial Developer are Copyright (C) 2020
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+Mark J Crane <[email protected]>
+*/
+
+//includes
+	require_once "root.php";
+	require_once "resources/require.php";
+  	require_once "resources/check_auth.php";
+
+//add multi-lingual support
+	$language = new text;
+	$text = $language->get();
+
+//get http post variables and set them to php variables
+	if (is_array($_GET) && @sizeof($_GET) != 0) {
+		$user_setting_category = strtolower($_GET['category']);
+		$user_setting_subcategory = strtolower($_GET['subcategory']);
+		$user_setting_name = strtolower($_GET['name']);
+		$submitted_value = $_GET['value'];
+		//$submitted_order = is_numeric($_GET['order']) ? $_GET['order'] : null;
+		$submitted_enabled = strtolower($_GET['enabled']);
+	}
+
+//validate allowed user setting
+	switch ($user_setting_category) {
+		case 'theme':
+			switch ($user_setting_subcategory) {
+				case 'menu_side_state':
+					if ($submitted_value == 'expanded' || $submitted_value == 'contracted') {
+						$user_setting_value = $submitted_value;
+						$user_setting_enabled = 'true';
+					}
+					break 2;
+				default:
+					//setting not allowed
+					echo 'false';
+					exit;
+			}
+			break;
+		default:
+			//setting not allowed
+			echo 'false';
+			exit;
+	}
+
+//add/update user setting
+	if (isset($user_setting_value) && isset($user_setting_enabled)) {
+
+		//get existing user setting uuid, if exists
+			$sql = "select user_setting_uuid from v_user_settings ";
+			$sql .= "where user_uuid = :user_uuid ";
+			$sql .= "and domain_uuid = :domain_uuid ";
+			$sql .= "and user_setting_category = :user_setting_category ";
+			$sql .= "and user_setting_subcategory = :user_setting_subcategory ";
+			$sql .= "and user_setting_name = :user_setting_name ";
+			$parameters['user_uuid'] = $_SESSION['user_uuid'];
+			$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+			$parameters['user_setting_category'] = $user_setting_category;
+			$parameters['user_setting_subcategory'] = $user_setting_subcategory;
+			$parameters['user_setting_name'] = $user_setting_name;
+			$database = new database;
+			$user_setting_uuid = $database->select($sql, $parameters, 'column');
+			unset($sql, $parameters);
+
+		//create data array
+			$array['user_settings'][0]['user_setting_uuid'] = is_uuid($user_setting_uuid) ? $user_setting_uuid : uuid();
+			$array['user_settings'][0]['user_uuid'] = $_SESSION['user_uuid'];
+			$array['user_settings'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
+			$array['user_settings'][0]['user_setting_category'] = $user_setting_category;
+			$array['user_settings'][0]['user_setting_subcategory'] = $user_setting_subcategory;
+			$array['user_settings'][0]['user_setting_name'] = $user_setting_name;
+			$array['user_settings'][0]['user_setting_value'] = $user_setting_value;
+			//$array['user_settings'][0]['user_setting_order'] = $user_setting_order;
+			$array['user_settings'][0]['user_setting_enabled'] = $user_setting_enabled;
+
+		//grant temporary permissions
+			$p = new permissions;
+			$p->add('user_setting_add', 'temp');
+			$p->add('user_setting_edit', 'temp');
+
+		//execute
+			$database = new database;
+			$database->app_name = 'user_settings';
+			$database->app_uuid = '3a3337f7-78d1-23e3-0cfd-f14499b8ed97';
+			$database->save($array);
+			unset($array);
+
+		//revoke temporary permissions
+			$p->delete('user_setting_add', 'temp');
+			$p->delete('user_setting_edit', 'temp');
+
+		//update session variable
+			$_SESSION[$user_setting_category][$user_setting_subcategory][$user_setting_name] = $user_setting_value;
+
+		//set response
+			echo 'true';
+	}
+
+?>

+ 5 - 2
core/user_settings/user_settings.php

@@ -280,14 +280,17 @@
 				echo "		".str_repeat('*', strlen(escape($row['user_setting_value'])));
 			}
 			else if ($category == 'theme' && $subcategory == 'button_icons' && $name == 'text') {
-				echo "		".$text['option-button_icons_'.$row['domain_setting_value']]."\n";
+				echo "		".$text['option-button_icons_'.$row['user_setting_value']]."\n";
+			}
+			else if ($category == 'theme' && $subcategory == 'menu_side_state' && $name == 'text') {
+				echo "		".$text['option-'.$row['user_setting_value']]."\n";
 			}
 			else if ($category == "theme" && substr_count($subcategory, "_color") > 0 && ($name == "text" || $name == 'array')) {
 				echo "		".(img_spacer('15px', '15px', 'background: '.escape($row['user_setting_value']).'; margin-right: 4px; vertical-align: middle; border: 1px solid '.(color_adjust($row['user_setting_value'], -0.18)).'; padding: -1px;'));
 				echo "<span style=\"font-family: 'Courier New'; line-height: 6pt;\">".escape($row['user_setting_value'])."</span>\n";
 			}
 			else if ($category == 'recordings' && $subcategory == 'storage_type' && $name == 'text') {
-				echo "		".$text['label-'.$row['domain_setting_value']]."\n";
+				echo "		".$text['label-'.$row['user_setting_value']]."\n";
 			}
 			else {
 				echo "		".escape($row['user_setting_value'])."\n";

+ 47 - 1
resources/app_languages.php

@@ -4403,4 +4403,50 @@ $text['title-login']['sv-se'] = "Logga In";
 $text['title-login']['uk-ua'] = "Логін";
 $text['title-login']['tr-tr'] = "Giriş Yap";
 
-?>
+$text['option-expanded']['en-us'] = "Expanded";
+$text['option-expanded']['en-gb'] = "Expanded";
+$text['option-expanded']['ar-eg'] = "Expanded";
+$text['option-expanded']['de-at'] = "Expanded";
+$text['option-expanded']['de-ch'] = "Expanded";
+$text['option-expanded']['de-de'] = "Expanded";
+$text['option-expanded']['el-gr'] = "Expanded";
+$text['option-expanded']['es-cl'] = "Expanded";
+$text['option-expanded']['es-mx'] = "Expanded";
+$text['option-expanded']['fr-ca'] = "Expanded";
+$text['option-expanded']['fr-fr'] = "Expanded";
+$text['option-expanded']['he-il'] = "Expanded";
+$text['option-expanded']['it-it'] = "Expanded";
+$text['option-expanded']['nl-nl'] = "Expanded";
+$text['option-expanded']['pl-pl'] = "Expanded";
+$text['option-expanded']['pt-br'] = "Expanded";
+$text['option-expanded']['pt-pt'] = "Expanded";
+$text['option-expanded']['ro-ro'] = "Expanded";
+$text['option-expanded']['ru-ru'] = "Expanded";
+$text['option-expanded']['sv-se'] = "Expanded";
+$text['option-expanded']['uk-ua'] = "Expanded";
+$text['option-expanded']['tr-tr'] = "Expanded";
+
+$text['option-contracted']['en-us'] = "Contracted";
+$text['option-contracted']['en-gb'] = "Contracted";
+$text['option-contracted']['ar-eg'] = "Contracted";
+$text['option-contracted']['de-at'] = "Contracted";
+$text['option-contracted']['de-ch'] = "Contracted";
+$text['option-contracted']['de-de'] = "Contracted";
+$text['option-contracted']['el-gr'] = "Contracted";
+$text['option-contracted']['es-cl'] = "Contracted";
+$text['option-contracted']['es-mx'] = "Contracted";
+$text['option-contracted']['fr-ca'] = "Contracted";
+$text['option-contracted']['fr-fr'] = "Contracted";
+$text['option-contracted']['he-il'] = "Contracted";
+$text['option-contracted']['it-it'] = "Contracted";
+$text['option-contracted']['nl-nl'] = "Contracted";
+$text['option-contracted']['pl-pl'] = "Contracted";
+$text['option-contracted']['pt-br'] = "Contracted";
+$text['option-contracted']['pt-pt'] = "Contracted";
+$text['option-contracted']['ro-ro'] = "Contracted";
+$text['option-contracted']['ru-ru'] = "Contracted";
+$text['option-contracted']['sv-se'] = "Contracted";
+$text['option-contracted']['uk-ua'] = "Contracted";
+$text['option-contracted']['tr-tr'] = "Contracted";
+
+?>

+ 29 - 14
resources/classes/menu.php

@@ -951,7 +951,7 @@ if (!class_exists('menu')) {
 						$menu_brand_text = ($_SESSION['theme']['menu_brand_text']['text'] != '') ? escape($_SESSION['theme']['menu_brand_text']['text']) : "FusionPBX";
 						switch ($_SESSION['theme']['menu_brand_type']['text']) {
 							case 'text':
-								$html .= "			<a class='navbar-brand-text'  href='".PROJECT_PATH."/'>".$menu_brand_text."</a>\n";
+								$html .= "			<a class='navbar-brand-text' href='".PROJECT_PATH."/'>".$menu_brand_text."</a>\n";
 								break;
 							case 'image_text':
 								$menu_brand_image = ($_SESSION['theme']['menu_brand_image']['text'] != '') ? escape($_SESSION['theme']['menu_brand_image']['text']) : PROJECT_PATH."/themes/default/images/logo.png";
@@ -1079,17 +1079,25 @@ if (!class_exists('menu')) {
 
 			//menu brand image and/or text
 				if ($_SESSION['theme']['menu_brand_type']['text'] == 'none') {
-					$html = "	<div style='height: 75px;'>\n";
-					$html .= 		"<a class='menu_side_item_main menu_side_contract' onclick='menu_side_contract();' style='display: none;'><i class='fas fa-chevron-left' style='z-index: 99800; padding-left: 3px;'></i></a>";
-					$html .= 		"<a class='menu_side_item_main menu_side_expand' onclick='menu_side_expand();'><i class='fas fa-bars' style='z-index: 99800; padding-left: 3px;'></i></a>";
-					$html .= 	"</div>\n";
+ 					$html = "	<div id='menu_side_control_container'>\n";
+					$html .= "		<div class='menu_side_contract' style='float: right; ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? 'display: none' : null)."'>\n";
+					$html .= "			<a class='menu_side_item_main' id='menu_side_state_set_expanded' onclick=\"menu_side_state_set('expanded');\" style='padding: 10px 15px !important; ".($_SESSION['theme']['menu_side_state']['text'] == 'expanded' ? 'display: none' : null)."' title=\"".$this->text['theme-label-pin_menu']."\"><i class='fas fa-toggle-off fa-fw'></i></a>\n";
+					$html .= "			<a class='menu_side_item_main' id='menu_side_state_set_contracted' onclick=\"menu_side_state_set('contracted'); menu_side_contract();\" style='padding: 10px 15px !important; ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? 'display: none' : null)."' title=\"".$this->text['theme-label-unpin_menu']."\"><i class='fas fa-toggle-on fa-fw'></i></a>\n";
+					$html .= "		</div>\n";
+					$html .= "		<a class='menu_side_item_main menu_side_contract' onclick='menu_side_contract();' style='max-width: calc(100% - 50px); ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "display: none;" : null)."' title=\"".$this->text['theme-label-contract_menu']."\"><i class='fas fa-chevron-left fa-fw' style='z-index: 99800; padding-left: 1px;'></i></a>";
+					$html .= "		<a class='menu_side_item_main menu_side_expand' ".($_SESSION['theme']['menu_side_state']['text'] == 'expanded' ? "style='display: none';" : null)." onclick='menu_side_expand();' title=\"".$this->text['theme-label-expand_menu']."\"><i class='fas fa-bars fa-fw' style='z-index: 99800; padding-left: 1px;'></i></a>";
+					$html .= "	</div>\n";
 				}
 				else {
 					$html = "	<div id='menu_side_brand_container'>\n";
 					//menu toggle buttons
 						if ($_SESSION['theme']['menu_brand_type']['text'] != 'none') {
 							$html .= "		<div style='float: right; margin-right: -20px; margin-top: -20px;'>\n";
-							$html .= "			<a class='menu_side_item_main menu_side_contract' onclick='menu_side_contract();' style='display: none;'><i class='fas fa-chevron-left'></i></a>\n";
+							$html .= "			<a class='menu_side_item_main menu_side_contract' onclick='menu_side_contract();' style='padding: 8px 15px !important; ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "display: none;" : null)."'><i class='fas fa-chevron-left fa-fw'></i></a>\n";
+							$html .= "			<div class='menu_side_contract' style='".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? 'display: none' : null)."'>\n";
+							$html .= "				<a class='menu_side_item_main' id='menu_side_state_set_expanded' onclick=\"menu_side_state_set('expanded');\" style='padding: 8px 15px !important; ".($_SESSION['theme']['menu_side_state']['text'] == 'expanded' ? 'display: none' : null)."' title=\"".$this->text['theme-label-pin_menu']."\"><i class='fas fa-toggle-off fa-fw'></i></a>\n";
+							$html .= "				<a class='menu_side_item_main' id='menu_side_state_set_contracted' onclick=\"menu_side_state_set('contracted'); menu_side_contract();\" style='padding: 8px 15px !important; ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? 'display: none' : null)."' title=\"".$this->text['theme-label-unpin_menu']."\"><i class='fas fa-toggle-on fa-fw'></i></a>\n";
+							$html .= "			</div>\n";
 							$html .= "		</div>\n";
 						}
 					//show the menu brand image and/or text
@@ -1098,21 +1106,22 @@ if (!class_exists('menu')) {
 						$menu_brand_text = ($_SESSION['theme']['menu_brand_text']['text'] != '') ? escape($_SESSION['theme']['menu_brand_text']['text']) : "FusionPBX";
 						if ($_SESSION['theme']['menu_brand_type']['text'] == 'image' || $_SESSION['theme']['menu_brand_type']['text'] == '') {
 							$html .= "		<a href='".PROJECT_PATH."/' style='text-decoration: none;'>";
-							$html .= 			"<img id='menu_brand_image_contracted' style='width: 20px; margin-left: -2px; margin-top: -5px;' src='".escape($menu_brand_image_contracted)."' title=\"".escape($menu_brand_text)."\">";
-							$html .= 			"<img id='menu_brand_image_expanded' style='display: none;' src='".escape($menu_brand_image_expanded)."' title=\"".escape($menu_brand_text)."\">";
+							$html .= 			"<img id='menu_brand_image_contracted' style='".($_SESSION['theme']['menu_side_state']['text'] == 'expanded' ? "display: none;" : null)." width: 20px; margin-left: -2px; margin-top: -5px;' src='".escape($menu_brand_image_contracted)."' title=\"".escape($menu_brand_text)."\">";
+							$html .= 			"<img id='menu_brand_image_expanded' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "style='display: none;'" : null)." src='".escape($menu_brand_image_expanded)."' title=\"".escape($menu_brand_text)."\">";
 							$html .= 		"</a>\n";
 						}
 						else if ($_SESSION['theme']['menu_brand_type']['text'] == 'image_text') {
 							$html .= "		<a href='".PROJECT_PATH."/' style='text-decoration: none;'>";
-							$html .= 			"<img id='menu_brand_image_contracted' style='width: 20px; margin-left: -2px; margin-top: -5px;' src='".escape($menu_brand_image_contracted)."' title=\"".escape($menu_brand_text)."\">";
-							$html .= 			"<span class='menu_brand_text' style='display: none;'>".$menu_brand_text."</span>";
+							$html .= 			"<img id='menu_brand_image_contracted' style='".($_SESSION['theme']['menu_side_state']['text'] == 'expanded' ? "display: none;" : null)." width: 20px; margin-left: -2px; margin-top: -5px;' src='".escape($menu_brand_image_contracted)."' title=\"".escape($menu_brand_text)."\">";
+							$html .= 			"<span class='menu_brand_text' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "style='display: none;'" : null).">".$menu_brand_text."</span>";
 							$html .= 		"</a>\n";
 						}
 						else if ($_SESSION['theme']['menu_brand_type']['text'] == 'text') {
-							$html .= "		<a class='menu_brand_text' style='display: none;' href='".PROJECT_PATH."/'>".$menu_brand_text."</a>\n";
+							$html .= "		<a class='menu_brand_text' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "style='display: none;'" : null)." href='".PROJECT_PATH."/'>".$menu_brand_text."</a>\n";
 						}
 					$html .= "	</div>\n";
 				}
+
 			//main menu items
 				if (is_array($menu_array) && sizeof($menu_array) != 0) {
 					foreach ($menu_array as $menu_index_main => $menu_item_main) {
@@ -1121,14 +1130,14 @@ if (!class_exists('menu')) {
 						if ($menu_item_main['menu_item_icon'] != '') {
 							$html .= "<i class='fas ".$menu_item_main['menu_item_icon']." fa-fw' style='z-index: 99800; margin-right: 8px;'></i>";
 						}
-						$html .= "<span class='menu_side_item_title' style='display: none;'>".$menu_item_main['menu_language_title']."</span>";
+						$html .= "<span class='menu_side_item_title' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "style='display: none;'" : null).">".$menu_item_main['menu_language_title']."</span>";
 						$html .= "</a>\n";
 						//sub menu items
 							if (is_array($menu_item_main['menu_items']) && sizeof($menu_item_main['menu_items']) != 0) {
 								$html .= "	<div id='sub_".$menu_item_main['menu_item_uuid']."' class='menu_side_sub' style='display: none;'>\n";
 								foreach ($menu_item_main['menu_items'] as $menu_index_sub => $menu_item_sub) {
 									$html .= "		<a class='menu_side_item_sub' ".($menu_item_sub['menu_item_category'] == 'external' ? "target='_blank'" : null)." href='".$menu_item_sub['menu_item_link']."'>";
-									$html .= 			"<span class='menu_side_item_title' style='display: none;'>".$menu_item_sub['menu_language_title']."</span>";
+									$html .= 			"<span class='menu_side_item_title' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "style='display: none;'" : null).">".$menu_item_sub['menu_language_title']."</span>";
 									$html .= 		"</a>\n";
 								}
 								$html .= "	</div>\n";
@@ -1137,7 +1146,13 @@ if (!class_exists('menu')) {
 					$html .= "	<div style='height: 100px;'></div>\n";
 				}
 			$html .= "</div>\n";
-			$html .= "<div id='content_container' style='padding: 0; width: calc(100% - ".(is_numeric($_SESSION['theme']['menu_side_width_contracted']['text']) ? $_SESSION['theme']['menu_side_width_contracted']['text'] : '55')."px); float: right; padding-top: 0px; text-align: center;'>\n";
+			if ($_SESSION['theme']['menu_side_state']['text'] == 'expanded') {
+				$content_container_width = is_numeric($_SESSION['theme']['menu_side_width_expanded']['text']) ? $_SESSION['theme']['menu_side_width_expanded']['text'] : '225';
+			}
+			else {
+				$content_container_width = is_numeric($_SESSION['theme']['menu_side_width_contracted']['text']) ? $_SESSION['theme']['menu_side_width_contracted']['text'] : '60';
+			}
+			$html .= "<div id='content_container' style='padding: 0; width: calc(100% - ".$content_container_width."px); float: right; padding-top: 0px; text-align: center;' ".($_SESSION['theme']['menu_side_state']['text'] != 'expanded' ? "onclick=\"if (document.getElementById('menu_side_state_current').value != 'expanded') { menu_side_contract(); }\"" : null).">\n";
 			$html .= "	<div id='content_header'>\n";
 			//header: left
 				$html .= "<div class='float-left'>\n";

+ 1 - 0
resources/footer.php

@@ -187,6 +187,7 @@
 					$menu->text = $text;
 					$menu_html = $menu->menu_vertical($_SESSION['menu']['array']);
 					unset($menu);
+					$view->assign('menu_side_state', (isset($_SESSION['theme']['menu_side_state']['text']) && $_SESSION['theme']['menu_side_state']['text'] != '' ? $_SESSION['theme']['menu_side_state']['text'] : 'contracted'));
 					break;
 				case 'inline':
 					$container_open = "<div class='container-fluid' style='padding: 0;' align='".($_SESSION['theme']['logo_align']['text'] != '' ? $_SESSION['theme']['logo_align']['text'] : 'left')."'>\n";

+ 8 - 0
themes/default/app_config.php

@@ -1703,6 +1703,14 @@
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the expanded brand image path for the Side menu.";
 		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "66d37950-15db-4dd0-888a-17ded7b5c0dc";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "menu_side_state";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "contracted";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the default state of the Side Menu: expanded (pinned) or contracted (unpinned).";
+		$y++;
 		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "97a620e1-d7b2-4550-8648-726c3029143d";
 		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
 		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "action_bar_border_top";

+ 139 - 1
themes/default/app_languages.php

@@ -231,4 +231,142 @@ $text['theme-label-domain']['sv-se'] = "Domän";
 $text['theme-label-domain']['uk-ua'] = "Домен";
 $text['theme-label-domain']['tr-tr'] = "Alan Adı";
 
-?>
+$text['theme-label-expand_menu']['en-us'] = "Expand Menu";
+$text['theme-label-expand_menu']['en-gb'] = "Expand Menu";
+$text['theme-label-expand_menu']['ar-eg'] = "Expand Menu";
+$text['theme-label-expand_menu']['de-at'] = "Expand Menu";
+$text['theme-label-expand_menu']['de-ch'] = "Expand Menu";
+$text['theme-label-expand_menu']['de-de'] = "Expand Menu";
+$text['theme-label-expand_menu']['el-gr'] = "Expand Menu";
+$text['theme-label-expand_menu']['es-cl'] = "Expand Menu";
+$text['theme-label-expand_menu']['es-mx'] = "Expand Menu";
+$text['theme-label-expand_menu']['fr-ca'] = "Expand Menu";
+$text['theme-label-expand_menu']['fr-fr'] = "Expand Menu";
+$text['theme-label-expand_menu']['he-il'] = "Expand Menu";
+$text['theme-label-expand_menu']['it-it'] = "Expand Menu";
+$text['theme-label-expand_menu']['nl-nl'] = "Expand Menu";
+$text['theme-label-expand_menu']['pl-pl'] = "Expand Menu";
+$text['theme-label-expand_menu']['pt-br'] = "Expand Menu";
+$text['theme-label-expand_menu']['pt-pt'] = "Expand Menu";
+$text['theme-label-expand_menu']['ro-ro'] = "Expand Menu";
+$text['theme-label-expand_menu']['ru-ru'] = "Expand Menu";
+$text['theme-label-expand_menu']['sv-se'] = "Expand Menu";
+$text['theme-label-expand_menu']['uk-ua'] = "Expand Menu";
+$text['theme-label-expand_menu']['tr-tr'] = "Expand Menu";
+
+$text['theme-label-contract_menu']['en-us'] = "Contract Menu";
+$text['theme-label-contract_menu']['en-gb'] = "Contract Menu";
+$text['theme-label-contract_menu']['ar-eg'] = "Contract Menu";
+$text['theme-label-contract_menu']['de-at'] = "Contract Menu";
+$text['theme-label-contract_menu']['de-ch'] = "Contract Menu";
+$text['theme-label-contract_menu']['de-de'] = "Contract Menu";
+$text['theme-label-contract_menu']['el-gr'] = "Contract Menu";
+$text['theme-label-contract_menu']['es-cl'] = "Contract Menu";
+$text['theme-label-contract_menu']['es-mx'] = "Contract Menu";
+$text['theme-label-contract_menu']['fr-ca'] = "Contract Menu";
+$text['theme-label-contract_menu']['fr-fr'] = "Contract Menu";
+$text['theme-label-contract_menu']['he-il'] = "Contract Menu";
+$text['theme-label-contract_menu']['it-it'] = "Contract Menu";
+$text['theme-label-contract_menu']['nl-nl'] = "Contract Menu";
+$text['theme-label-contract_menu']['pl-pl'] = "Contract Menu";
+$text['theme-label-contract_menu']['pt-br'] = "Contract Menu";
+$text['theme-label-contract_menu']['pt-pt'] = "Contract Menu";
+$text['theme-label-contract_menu']['ro-ro'] = "Contract Menu";
+$text['theme-label-contract_menu']['ru-ru'] = "Contract Menu";
+$text['theme-label-contract_menu']['sv-se'] = "Contract Menu";
+$text['theme-label-contract_menu']['uk-ua'] = "Contract Menu";
+$text['theme-label-contract_menu']['tr-tr'] = "Contract Menu";
+
+$text['theme-label-pin_menu']['en-us'] = "Pin Menu";
+$text['theme-label-pin_menu']['en-gb'] = "Pin Menu";
+$text['theme-label-pin_menu']['ar-eg'] = "Pin Menu";
+$text['theme-label-pin_menu']['de-at'] = "Pin Menu";
+$text['theme-label-pin_menu']['de-ch'] = "Pin Menu";
+$text['theme-label-pin_menu']['de-de'] = "Pin Menu";
+$text['theme-label-pin_menu']['el-gr'] = "Pin Menu";
+$text['theme-label-pin_menu']['es-cl'] = "Pin Menu";
+$text['theme-label-pin_menu']['es-mx'] = "Pin Menu";
+$text['theme-label-pin_menu']['fr-ca'] = "Pin Menu";
+$text['theme-label-pin_menu']['fr-fr'] = "Pin Menu";
+$text['theme-label-pin_menu']['he-il'] = "Pin Menu";
+$text['theme-label-pin_menu']['it-it'] = "Pin Menu";
+$text['theme-label-pin_menu']['nl-nl'] = "Pin Menu";
+$text['theme-label-pin_menu']['pl-pl'] = "Pin Menu";
+$text['theme-label-pin_menu']['pt-br'] = "Pin Menu";
+$text['theme-label-pin_menu']['pt-pt'] = "Pin Menu";
+$text['theme-label-pin_menu']['ro-ro'] = "Pin Menu";
+$text['theme-label-pin_menu']['ru-ru'] = "Pin Menu";
+$text['theme-label-pin_menu']['sv-se'] = "Pin Menu";
+$text['theme-label-pin_menu']['uk-ua'] = "Pin Menu";
+$text['theme-label-pin_menu']['tr-tr'] = "Pin Menu";
+
+$text['theme-label-unpin_menu']['en-us'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['en-gb'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['ar-eg'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['de-at'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['de-ch'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['de-de'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['el-gr'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['es-cl'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['es-mx'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['fr-ca'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['fr-fr'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['he-il'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['it-it'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['nl-nl'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['pl-pl'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['pt-br'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['pt-pt'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['ro-ro'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['ru-ru'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['sv-se'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['uk-ua'] = "Unpin Menu";
+$text['theme-label-unpin_menu']['tr-tr'] = "Unpin Menu";
+
+$text['theme-message-menu_expanded']['en-us'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['en-gb'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['ar-eg'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['de-at'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['de-ch'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['de-de'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['el-gr'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['es-cl'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['es-mx'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['fr-ca'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['fr-fr'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['he-il'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['it-it'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['nl-nl'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['pl-pl'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['pt-br'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['pt-pt'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['ro-ro'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['ru-ru'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['sv-se'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['uk-ua'] = "Menu Pinned";
+$text['theme-message-menu_expanded']['tr-tr'] = "Menu Pinned";
+
+$text['theme-message-menu_contracted']['en-us'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['en-gb'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['ar-eg'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['de-at'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['de-ch'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['de-de'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['el-gr'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['es-cl'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['es-mx'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['fr-ca'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['fr-fr'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['he-il'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['it-it'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['nl-nl'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['pl-pl'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['pt-br'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['pt-pt'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['ro-ro'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['ru-ru'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['sv-se'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['uk-ua'] = "Menu Unpinned";
+$text['theme-message-menu_contracted']['tr-tr'] = "Menu Unpinned";
+
+?>

+ 45 - 7
themes/default/css.php

@@ -457,7 +457,14 @@ header('Expires: '.gmdate('D, d M Y H:i:s',time()+3600).' GMT');
 		position: fixed;
 		top: 0;
 		left: 0;
-		width: <?php echo is_numeric($_SESSION['theme']['menu_side_width_contracted']['text']) ? $_SESSION['theme']['menu_side_width_contracted']['text'] : '60'; ?>px;
+		<?php
+		if ($_SESSION['theme']['menu_side_state']['text'] == 'expanded') {
+			echo "width: ".(is_numeric($_SESSION['theme']['menu_side_width_expanded']['text']) ? $_SESSION['theme']['menu_side_width_expanded']['text'] : '225')."px;\n";
+		}
+		else {
+			echo "width: ".(is_numeric($_SESSION['theme']['menu_side_width_contracted']['text']) ? $_SESSION['theme']['menu_side_width_contracted']['text'] : '60')."px;\n";
+		}
+		?>
 		height: 100%;
 		overflow: auto;
 		<?php if ($_SESSION['theme']['menu_main_background_image']['text'] != '') { ?>
@@ -538,9 +545,37 @@ header('Expires: '.gmdate('D, d M Y H:i:s',time()+3600).' GMT');
 		text-decoration: none;
 		}
 
+	/* menu side control container */
+	div#menu_side_control_container {
+		position: -webkit-sticky;
+		position: sticky;
+		z-index: 99901;
+		top: 0;
+		padding: 0;
+		min-height: 75px;
+		text-align: left;
+		<?php if ($_SESSION['theme']['menu_main_background_image']['text'] != '') { ?>
+			background-image: url("<?php echo $_SESSION['theme']['menu_main_background_image']['text']; ?>");
+			background-position: 0px 0px;
+			background-repeat: repeat-y;
+		<?php } else {?>
+			background: <?php echo ($_SESSION['theme']['menu_main_background_color']['text'] != '') ? $_SESSION['theme']['menu_main_background_color']['text'] : 'rgba(0,0,0,0.90)'; ?>;
+		<?php } ?>
+		<?php
+		echo ($_SESSION['theme']['menu_main_border_color']['text'] == '' && $_SESSION['theme']['menu_main_border_size']['text'] == '') ? "border: 0;\n" : null;
+		echo ($_SESSION['theme']['menu_main_border_color']['text'] != '') ? 'border-color: '.$_SESSION['theme']['menu_main_border_color']['text'].";\n" : null;
+		echo ($_SESSION['theme']['menu_main_border_size']['text'] != '') ? 'border-width: '.$_SESSION['theme']['menu_main_border_size']['text'].";\n" : null;
+		?>
+		-moz-border-radius: <?php echo ($_SESSION['theme']['menu_main_border_radius']['text'] != '') ? $_SESSION['theme']['menu_main_border_radius']['text'] : '0'; ?>;
+		-webkit-border-radius: <?php echo ($_SESSION['theme']['menu_main_border_radius']['text'] != '') ? $_SESSION['theme']['menu_main_border_radius']['text'] : '0'; ?>;
+		-khtml-border-radius: <?php echo ($_SESSION['theme']['menu_main_border_radius']['text'] != '') ? $_SESSION['theme']['menu_main_border_radius']['text'] : '0'; ?>;
+		border-radius: <?php echo ($_SESSION['theme']['menu_main_border_radius']['text'] != '') ? $_SESSION['theme']['menu_main_border_radius']['text'] : '0'; ?>;
+		}
+
 	div#menu_side_container > a.menu_side_item_main,
 	div#menu_side_container > div > a.menu_side_item_main,
-	div#menu_side_container > div#menu_side_brand_container > div > a.menu_side_item_main {
+	div#menu_side_container > div#menu_side_brand_container a.menu_side_item_main,
+	div#menu_side_container > div#menu_side_control_container a.menu_side_item_main {
 		display: block;
 		width: 100%;
 		padding: 10px 20px;
@@ -552,14 +587,17 @@ header('Expires: '.gmdate('D, d M Y H:i:s',time()+3600).' GMT');
 		}
 
 	div#menu_side_container > a.menu_side_item_main:hover,
-	div#menu_side_container a.menu_side_item_main:focus,
-	div#menu_side_container a.menu_side_item_main:active,
+	div#menu_side_container > a.menu_side_item_main:focus,
+	div#menu_side_container > a.menu_side_item_main:active,
 	div#menu_side_container > div > a.menu_side_item_main:hover,
 	div#menu_side_container > div > a.menu_side_item_main:focus,
 	div#menu_side_container > div > a.menu_side_item_main:active,
-	div#menu_side_container > div#menu_side_brand_container > div > a.menu_side_item_main:hover,
-	div#menu_side_container > div#menu_side_brand_container > div > a.menu_side_item_main:focus,
-	div#menu_side_container > div#menu_side_brand_container > div > a.menu_side_item_main:active {
+	div#menu_side_container > div#menu_side_control_container > div a.menu_side_item_main:hover,
+	div#menu_side_container > div#menu_side_control_container > div a.menu_side_item_main:focus,
+	div#menu_side_container > div#menu_side_control_container > div a.menu_side_item_main:active,
+	div#menu_side_container > div#menu_side_brand_container > div a.menu_side_item_main:hover,
+	div#menu_side_container > div#menu_side_brand_container > div a.menu_side_item_main:focus,
+	div#menu_side_container > div#menu_side_brand_container > div a.menu_side_item_main:active {
 		color: <?php echo ($_SESSION['theme']['menu_main_text_color_hover']['text'] != '') ? $_SESSION['theme']['menu_main_text_color_hover']['text'] : '#fd9c03'; ?>;
 		background: <?php echo ($_SESSION['theme']['menu_main_background_color_hover']['text'] != '') ? $_SESSION['theme']['menu_main_background_color_hover']['text'] : 'rgba(0,0,0,1.0)'; ?>;
 		text-decoration: none;

+ 77 - 55
themes/default/template.php

@@ -82,76 +82,97 @@
 
 		{if $settings.theme.menu_style == 'side'}
 			//side menu visibility toggle
+				var menu_side_state_current = '{$menu_side_state}';
 				{literal}
-				var menu_side_state = 'contracted';
 				function menu_side_contract() {
-					$('.menu_side_sub').slideUp(180);
-					$('.menu_side_item_title').hide();
-					{/literal}
-					{if $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
-						{literal}
-						$('#menu_brand_image_expanded').fadeOut(180, function() {
-							$('#menu_brand_image_contracted').fadeIn(180);
-						});
+					if (menu_side_state_current == 'expanded') {
+						$('.menu_side_sub').slideUp(180);
+						$('.menu_side_item_title').hide();
 						{/literal}
-					{elseif $settings.theme.menu_brand_type == 'image_text'}
-						{literal}
-						$('.menu_brand_text').hide();
-						$('#menu_brand_image_contracted').animate({ width: '20px', 'margin-left': '-2px' }, 250);
-						{/literal}
-					{else if $settings.theme.menu_brand_type == 'text'}
+						{if $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
+							{literal}
+							$('#menu_brand_image_expanded').fadeOut(180, function() {
+								$('#menu_brand_image_contracted').fadeIn(180);
+							});
+							{/literal}
+						{elseif $settings.theme.menu_brand_type == 'image_text'}
+							{literal}
+							$('.menu_brand_text').hide();
+							$('#menu_brand_image_contracted').animate({ width: '20px', 'margin-left': '-2px' }, 250);
+							{/literal}
+						{else if $settings.theme.menu_brand_type == 'text'}
+							{literal}
+							$('.menu_brand_text').fadeOut(180);
+							{/literal}
+						{/if}
 						{literal}
-						$('.menu_brand_text').fadeOut(180);
-						{/literal}
-					{/if}
-					{literal}
-					$('#menu_side_container').animate({ width: '{/literal}{$settings.theme.menu_side_width_contracted}{literal}px' }, 250);
-					$('#content_container').animate({ width: $(window).width() - {/literal}{$settings.theme.menu_side_width_contracted}{literal} }, 250, function() {
-						menu_side_state = 'contracted';
-					});
+						$('#menu_side_container').animate({ width: '{/literal}{$settings.theme.menu_side_width_contracted}{literal}px' }, 250);
+						$('#content_container').animate({ width: $(window).width() - {/literal}{$settings.theme.menu_side_width_contracted}{literal} }, 250, function() {
+							menu_side_state_current = 'contracted';
+						});
 
-					$('.menu_side_contract').hide();
-					$('.menu_side_expand').show();
+						$('.menu_side_contract').hide();
+						$('.menu_side_expand').show();
+					}
 				}
 
 				function menu_side_expand() {
-					{/literal}
-					{if $settings.theme.menu_brand_type == 'image_text'}
-						{literal}
-						$('#menu_brand_image_contracted').animate({ width: '30px', 'margin-left': '0' }, 250);
+					if (menu_side_state_current == 'contracted') {
 						{/literal}
-					{elseif $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
-						{literal}
-						$('#menu_brand_image_contracted').fadeOut(180);
-						{/literal}
-					{/if}
-					{literal}
-					$('#menu_side_container').animate({ width: '{/literal}{$settings.theme.menu_side_width_expanded}{literal}px' }, 250);
-					$('#content_container').animate({ width: $(window).width() - {/literal}{$settings.theme.menu_side_width_expanded}{literal} }, 250, function() {
-						$('.menu_brand_text').fadeIn(180);
-						$('.menu_side_item_title').fadeIn(180);
-						{/literal}
-						{if $settings.theme.menu_brand_type != 'none'}
+						{if $settings.theme.menu_brand_type == 'image_text'}
 							{literal}
-							$('.menu_side_contract').fadeIn(180);
+							$('#menu_brand_image_contracted').animate({ width: '30px', 'margin-left': '0' }, 250);
 							{/literal}
-						{/if}
-						{if $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
+						{elseif $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
 							{literal}
-							$('#menu_brand_image_expanded').fadeIn(180);
+							$('#menu_brand_image_contracted').fadeOut(180);
 							{/literal}
 						{/if}
 						{literal}
-						menu_side_state = 'expanded';
-					});
-					{/literal}
-					{if $settings.theme.menu_brand_type == 'none'}
-						{literal}
-						$('.menu_side_contract').show();
-						{/literal}
-					{/if}
-					{literal}
-					$('.menu_side_expand').hide();
+						$('#menu_side_container').animate({ width: '{/literal}{$settings.theme.menu_side_width_expanded}{literal}px' }, 250, function() {
+							$('.menu_side_contract').fadeIn(180);
+						});
+						$('#content_container').animate({ width: $(window).width() - {/literal}{$settings.theme.menu_side_width_expanded}{literal} }, 250, function() {
+							$('.menu_brand_text').fadeIn(180);
+							$('.menu_side_item_title').fadeIn(180);
+							{/literal}
+							{if $settings.theme.menu_brand_type == 'image' || $settings.theme.menu_brand_type == ''}
+								{literal}
+								$('#menu_brand_image_expanded').fadeIn(180);
+								{/literal}
+							{/if}
+							{literal}
+							menu_side_state_current = 'expanded';
+						});
+						$('.menu_side_expand').hide();
+					}
+				}
+
+				function menu_side_state_set(state) {
+					var user_setting_set_path = '{/literal}{$project_path}{literal}/core/user_settings/user_setting_set.php?category=theme&subcategory=menu_side_state&name=text&value='+state;
+					var xhr = new XMLHttpRequest();
+					xhr.open('GET', user_setting_set_path);
+					xhr.send(null);
+					xhr.onreadystatechange = function () {
+						var setting_modified;
+						if (xhr.readyState === 4) {
+							if (xhr.status === 200) {
+								setting_modified = xhr.responseText;
+								if (setting_modified == 'true') {
+									document.getElementById('menu_side_state_set_expanded').style.display = state == 'expanded' ? 'none' : 'block';
+									document.getElementById('menu_side_state_set_contracted').style.display = state == 'contracted' ? 'none' : 'block';
+									if (state == 'expanded') {
+										document.getElementById('menu_side_state_current').value = 'expanded';
+										display_message("{/literal}{$text.theme_message_menu_expanded}{literal}", 'positive', 1000);
+									}
+									else {
+										document.getElementById('menu_side_state_current').value = 'contracted';
+										display_message("{/literal}{$text.theme_message_menu_contracted}{literal}", 'positive', 1000);
+									}
+								}
+							}
+						}
+					}
 				}
 				{/literal}
 		{/if}
@@ -912,6 +933,7 @@
 				{if $settings.theme.menu_style == 'inline'}{$logo}{/if}
 				{$menu}
 				{if $settings.theme.menu_style == 'inline' || $settings.theme.menu_style == 'static'}<br />{/if}
+				{if $settings.theme.menu_style == 'side'}<input type='hidden' id='menu_side_state_current' value=''>{/if}
 			{else} {*//default: fixed *}
 				{$menu}
 				{$container_open}