function removeChilds($elements, $id, $head = true){
	
		foreach($elements as $key => $element){
		
			if($element['id'] == $id && $head) {
				unset($elements[$key]);
				$head = false;
			}
		
			if($element['parent_id'] == $id){
			
				$newId = $element['id'];
				unset($elements[$key]);
				$elements = removeChilds($elements, $newId, $head);
				
			}

		}
		
		return $elements;
	}
	protected function menu() {
	
		switch($this->method){
		
			case 'GET':
			
				if(empty($this->verb) && empty($this->args)){
				
					$result = $this->db->query("select id, name, main_title, expand_level from menus");												// all menus
					
					return array("success" => 1, "items" => $result->rows);
					
				} else if (empty($this->verb) && count($this->args) == 1) {
					
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$result = $this->db->query("select id, name, main_title, expand_level, from menus where id = '".$id."'");							// menu by id
					
					return array("success" => 1, "items" => $result->rows);
					
				} else if($this->verb == 'item' && count($this->args) == 1){
				
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where id = '".$id."'");							// menu item by id
					
					$newResult = $result->rows;
					
					foreach($newResult as $key => $value){
					
						$add_data = unserialize($value['add_data']);
																		
						$url = isset($add_data['url']) ? str_ireplace("\\/", "/", $add_data['url']) : '';
						
						unset($newResult[$key]['add_data']);
						
						$newResult[$key]['url'] = $url;
						
					}
					
					$newResult = array_values($newResult);
					
					return array("success" => 1, "items" => $newResult);
					
				} else if($this->verb == 'branch' && count($this->args) == 1){
				
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where menu_id = '".$id."'");							// menu items by branch id
					
					$newResult = $result->rows;
					
					foreach($newResult as $key => $value){
					
						$add_data = unserialize($value['add_data']);
												
						$url = isset($add_data['url']) ? $add_data['url'] : '';
						
						unset($newResult[$key]['add_data']);
						
						$newResult[$key]['url'] = $url;
						
					}
					
					$newResult = array_values($newResult);
					
					return array("success" => 1, "items" => $newResult);
					
				} else if($this->verb == 'filter' && count($this->args) == 2){
				
					$menuId = htmlspecialchars(strip_tags($this->args[0]));
					
					$itemId = htmlspecialchars(strip_tags($this->args[1]));
				
					$result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where menu_id = '".$menuId."'");							// menu items by branch id
					
					$newResult = $result->rows;
					
					foreach($newResult as $key => $value){
					
						$add_data = unserialize($value['add_data']);
												
						$url = isset($add_data['url']) ? $add_data['url'] : '';
						
						unset($newResult[$key]['add_data']);
						
						$newResult[$key]['url'] = $url;
						
					}
					
					$newResult = removeChilds($newResult, $itemId);
															
					$newResult = array_values($newResult);

					return array("success" => 1, "items" => $newResult);
						
				} else {
					return array("success" => 0, "error_message" => "BAD REQUEST");
				}
				
				break;
			
			case 'POST':			
				
				if(empty($this->args) && empty($this->verb)){
			
					$data = $this->request;

					$result = $this->db->query("insert into menus (name, main_title, expand_level, created) VALUES ( '".$data['name']."', '".$data['main_title']."', '".$data['expand_level']."', NOW() )");
					
					if($result->errno)
						return array("success" => 0, "error_message" => "INCORRECT DATA");
					else {
						$lastId = $this->db->getLastId();
						$this->log("Создано меню. Id: ".$lastId, $data['username'], $data['device']);
						return array("success" => 1, "insert_id" => $lastId);
					}
					
				} else if ($this->verb == 'item' && empty($this->args)) {
				
					$data = $this->request;
					
					$add_data_serialized = null;
					
					if($data['item_type'] === 'url'){
						
						$add_data = array();
						
						$add_data['url'] = $data['url'];
						
						$add_data['newpage'] = '';
						
						$add_data_serialized = serialize($add_data);
						
					}
										
					$query = "insert into menus_data (menu_id, item_id, item_type, title, parent_id, position, add_data, hidden) VALUES ( '".$data['menu_id']."', '".$data['item_id']."', '".$data['item_type']."', '".$data['title']."', '".$data['parent_id']."', '".$data['position']."', '".$add_data_serialized."', '".$data['hidden']."' )";
							
					$result = $this->db->query($query);
					
					if($result->errno)
						return array("success" => 0, "error_message" => "INCORRECT DATA");
					else {
						$lastId = $this->db->getLastId();
						$this->log("Создан пункт меню. Id: ".$lastId, $data['username'], $data['device']);
						return array("success" => 1, "insert_id" => $lastId);
					}
						
				} else {
					return array("success" => 0, "error_message" => "BAD REQUEST");
				}
				
				break;
				
			case 'PUT':
			
				if(count($this->args) == 1 && empty($this->verb)){
				
					$id = htmlspecialchars(strip_tags($this->args[0]));
			
					$data = $this->request;
	
					$result = $this->db->query("update menus set name='".$data['name']."', main_title='".$data['main_title']."', expand_level='".$data['expand_level']."' where id = '".$id."'");
					
					if($result->errno)
						return array("success" => 0, "error_message" => "INCORRECT DATA");
					else{
						$this->log("Изменено меню. Id: ".$id, $data['username'], $data['device']);
						return array("success" => 1);
					}
					
				} else if ($this->verb == 'item' && count($this->args) == 1) {
				
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$data = $this->request;
					
					$add_data_serialized = null;
					
					if($data['item_type'] === 'url'){
						
						$add_data = array();
						
						$add_data['url'] = $data['url'];
						
						$add_data['newpage'] = '';
						
						$add_data_serialized = serialize($add_data);
						
					}
										
					$query = "update menus_data set menu_id='".$data['menu_id']."', item_id='".$data['item_id']."', item_type='".$data['item_type']."', title='".$data['title']."', parent_id='".$data['parent_id']."', position='".$data['position']."', add_data='".$add_data_serialized."', hidden='".$data['hidden']."' where id='".$id."'";
							
					$result = $this->db->query($query);
					
					if($result->errno)
						return array("success" => 0, "error_message" => "INCORRECT DATA");
					else {
						$this->log("Изменен пункт меню. Id: ".$id, $data['username'], $data['device']);
						return array("success" => 1);
					}
						
				} else {
					return array("success" => 0, "error_message" => "BAD REQUEST");
				}			
				break;
			
			case 'DELETE':
			
				if (empty($this->verb) && count($this->args) == 1) {
					
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$result = $this->db->query("delete from menus where id = '".$id."'");								// menu by id
					
					$data = $this->request;
					
					if($this->db->countAffected() > 0){
						$this->log("Удалено меню. Id: ".$id, $data['username'], $data['device']);
						$result = $this->db->query("delete from menus_data where menu_id = '".$id."'");						
						return array("success" => 1);
					} else {
						return array("success" => 0, "error_message" => "MENU NOT FOUND");
					}
					
				} else if($this->verb == 'item' && count($this->args) == 1) {
				
					$id = htmlspecialchars(strip_tags($this->args[0]));
				
					$result = $this->db->query("delete from menus_data where id = '".$id."'");							// menu item by id
										
					if(!$result->errno){
						$data = $this->request;
						$this->log("Удален пункт меню. Id: ".$id, $data['username'], $data['device']);
						return array("success" => 1);
					} else {
						return array("success" => 0, "error_message" => "MENU ITEM NOT FOUND");
					}
					
				} else {
					return array("success" => 0, "error_message" => "BAD REQUEST");
				}	
				
				break;
				
			default:
			
				break;
		}
	}