/*
PLUGIN SDAL MENU 4.3
ADMIN MOD MENU
(c) Sir Drink a lot 
 
Beschreibung: 
--------------- 
 
Das Menü hat sechs feste Hauptkategorien. Die ersten fünf Kategorien haben ihre eigene 
*.cfg Datei,in der die Befehle:Accesslevel eingetragen werden. 
Mit "am_menu" im Chat oder Konsole wird dann das Menu aufgerufen. 
(Accesslevel ACCESS_MAP wird benötigt!) 
 
Die 6. Kategorie "Saved Commands" hat ihre eigene individuelle *.cfg Datei, die 
automatisch angelegt wird.(STEAM_ID-des-Admins.cfg) 
 
Es besteht nun die Möglichkeit, Befehle mit Parametern auch individuell 
für sich abzuspeichern.Sie erscheinen dann in der Hauptkategorie "Saved Commands", 
wo man sie wieder aufrufen bzw. wieder löschen kann. 
So kann jeder Admin für sich seine eigenen Menüpunkte erstellen. 
 
NEU in 4.2:
Der zuletzt ausgeführte Befehl wird sich gemerkt und kann erneut ausgeführt werden.
 
NEU in 4.0:
ADMINS mit dem Accesslevel ADMIN_RCON (65536) können nun global in den jeweiligen
5 Hauptkategorien Befehle:Rechtelevel anlegen oder bestehende löschen bzw. im Menüpunkt
[MAP SELECT] neue Maps anlegen oder löschen.
 
 
Installation: 
--------------- 
Speicherort der *.cfg Dateien: addond/adminmod/config/ammenu/ 
 
- Player : playercommands.cfg 
- Map : mapcommands.cfg 
- Server : servercommands.cfg 
- Vote : votecommands.cfg 
- Other Cmds/Cvars : othercommands.cfg 
- Map Select : maps.cfg (sind für die MapCommands wichtig!) 
 
Die spielereigenen STEAM_ID.cfg Dateien werden automatisch in
diesem Verzeichnis angelegt.
 
* adminmod.cfg: 
- amv_enable_beta "menu1" muss in der adminmod.cfg stehen. 
- file_access_read und file_access_write müssen auf 1 gesetzt werden.
- allow_client_exec 1, damit vorher geöffnete Menüs geschlossen werden.
 
* Plugins ersetzen:
- folgende Standard Plugins müssen ersetzt werden: *strstripqoutes(Data) eingesetzt*
	- plugin_CS mit plugin_sdal_CS 
	- plugin_cheat mit plugin_sdal_cheat
	- plugin_base mit plugin_sdal_base
	- plugin_retribution mit plugin_sdal_retribution
 
	Sollten Euch weiterhin Befehle auffallen, die man nicht auf Spieler anwenden kann,
	da diese nicht erkannt werden, so lasst es mich wissen.
 
Sonstiges: 
--------------- 
 
Funktionsweise des Menü-Plugins:
--------------------------------
Die Config Dateien, die von dem Menü geladen werden, enthalten also alle admin_Befehle, die von anderen Plugins
geliefert werden. Wählt man also im Menü diesen Befehl aus und ergänzt ihn mit den entsprechenden Daten, werden
die Daten vom Menü an das entsprechende Plugin weitergeleitet, von dem es dann letztendlich auch ausgeführt wird.
 
Kann der Befehl in den anderen Plugins nicht gefunden werden, dann wird direkt im Menü-Plugin versucht, 
den Befehl + Parameter mit exec auszuführen.
 
Leider kann man keine Rückmeldung von den anderen Plugins erhalten, ob der Befehl auch wirklich ausgeführt wurde.
Wenn also nichts passiert, obwohl das Menü meldet, dass der Befehl ausgeführt wurde, sollte man mal in die 
Konsole schauen, welche Meldung das anvisierte Plugin ausgibt.
 
Wie man an den Beispiel.cfg Dateien sieht, habe ich abundzu eine Beschreibung:999999 eingebaut, 
um eine etwas bessere Struktur reinzubekommen. Auch habe ich in den Beispiel.cfg Dateien die Befehle so sortiert, 
wie sie am häufigsten benutzt werden. 
In der Player Sektion gibt es Probleme, da einige Plugins kein strstripquotes verwendet haben. 
Ich habe nun die betroffenen original AM-Scripts angepasst (plugin_CS, plugin_retribution, plugin_cheat). 
 
Ganz oben in der *.sma kann man den Speicher MAX_COMMANDS erhöhen!! 
Zur Zeit können 100 Befehle/Maps pro Datei eingetragen werden.
 
Dann mal viel Spass damit! 
 
changelog:
v.4.3:
- execclient menuselect 10, damit vorher geöffnete Menüs geschlossen werden.
v.4.2:
- Umstellung auf Spielernamen und veränderte Standard-Plugins (strstripquotes eingefügt).
- [other menu]: setstrvar durch exec ersetzt, damit mehr Flexibilität erreicht wird.
- Erkennung, ob plugin_exec oder nur exec ausgeführt werden muss. (plugin_checkcommand)
- Der zuletzt ausgeführter Befehl wird gespeichert.
 
v.4.1:
- beta release: 
  Versuch, SessionID der Spieler zu verwenden. Einige Funktionen benötigen aber den Spielernamen und
  können die SessionID nicht benutzen. Verworfen...
 
v.4.0:
- Neues Speichersystem mit setproperty und getproperty führt zu Serverabsturz. Daher Daten wieder im 
Array speichern.
- Es wird nur ein Array benutzt, der beim Öffnen des Menüpunktes mit readfile gefüllt wird. 
- Es können neue Befehle mit entsprechendem Rechtelevel in der jeweiligen Kategorie oder Maps hinzugefügt oder gelöscht werden.
 
v.3.1: 
- Fehlermeldungen bei fehlenden Einstellungen in der adminmod.cfg eingefügt 
- Fehlermeldung eingefügt, wenn Client "am_menu" im Chat ohne die nötigen Rechte aufruft. 
- bugfix: neues playercount system für die Spielerauswahl eingefügt. 
- plugin_connect und plugin_disconnect eingefügt
- 
 
v.3.0: 
- Code Überarbeitung 
- neues Speichersystem der Befehle 
 
v.2.0: 
- Code Überarbeitung und mehr Untermenüpunkte 
 
v.1.0: 
- erste Menü Version 
*/
 
#include <core>
#include <string>
#include <admin>
#include <plugin>
#include <adminlib>
 
new AM_VERSION_STRING[] = "2.50.60_v4.3";
#pragma dynamic 16384
 
/*SPEICHER BELEGUNG*/
#define MAX_COMMANDS 100
new g_COMMANDS[MAX_COMMANDS][MAX_DATA_LENGTH];
new g_lcommands;
 
new g_PlayerCommandFile[]="addons/adminmod/config/ammenu/playercommands.cfg";
new g_MapCommandFile[]="addons/adminmod/config/ammenu/mapcommands.cfg";
new g_MapFile[]="addons/adminmod/config/ammenu/maps.cfg";
new g_ServerCommandFile[]="addons/adminmod/config/ammenu/servercommands.cfg";
new g_VoteCommandFile[]="addons/adminmod/config/ammenu/votecommands.cfg";
new g_OtherCommandFile[]="addons/adminmod/config/ammenu/othercommands.cfg";
new g_StoredCommandFile[]="addons/adminmod/config/ammenu/";
new g_tempStoredCommandFile[]="addons/adminmod/config/ammenu/tempstoredcmds.cfg";
 
/*MENUES*/
/*EBENE 1*/
#define MAINMENU	1
/*EBENE 2*/
#define PLAYERMENU	2
#define MAPMENU		3
#define SERVERMENU	4
#define VOTEMENU	5
#define OTHERMENU	6
#define STOREMENU	7
/*EBENE 3*/
#define PLAYERSELECT	100
#define MAPSELECT	101
/*EBENE 4*/
#define EXECUTEMENU	1000
 
#define ITEMS_PER_PAGE	6
 
#define EDIT	7
#define NEXT	8
#define BACK	9
#define CANCEL	10
 
 
/*USER SELECTS*/
//new g_UserAvailable;
new g_UserMenu[MAX_PLAYERS];
new g_UserLastMenu[MAX_PLAYERS];
new g_UserLLastMenu[MAX_PLAYERS];
 
new g_UserSelect[MAX_PLAYERS];
new g_UserLastSelect[MAX_PLAYERS];
new g_UserLLastSelect[MAX_PLAYERS];
 
new g_UserCommand[MAX_PLAYERS][MAX_COMMAND_LENGTH];
new g_UserData[MAX_PLAYERS][MAX_DATA_LENGTH];
 
new g_UserMessageMode[MAX_PLAYERS];
 
new g_UserStoredCommand[MAX_PLAYERS][MAX_COMMAND_LENGTH];
new g_UserStoredData[MAX_PLAYERS][MAX_DATA_LENGTH];
 
public plugin_init(){
	new Menu[MAX_NAME_LENGTH];
	new iFileAccessRead;
	new iFileAccessWrite;
	new error;
	getstrvar("amv_enable_beta",Menu,MAX_NAME_LENGTH);
	iFileAccessRead=getvar("file_access_read");
	iFileAccessWrite=getvar("file_access_write");
 
	if(!iFileAccessRead){
		selfmessage("[ADMIN MENU] file_access_read is not set to ^"1^" in adminmod.cfg! FATAL ERROR");
		error=1;
	}
	if(strstrx(Menu,"menu1")==-1){
		selfmessage("[ADMIN MENU] amv_enable_beta is not set to ^"menu1^" in adminmod.cfg! FATAL ERROR");
		error=1;
	}
	if(!iFileAccessWrite){
		selfmessage("[ADMIN MENU] file_access_write is not set to ^"1^" in adminmod.cfg! CRITICAL ERROR");
		selfmessage("[ADMIN MENU] indiviual menu can not be created or commands deleted!");
	}
	if(error){
		selfmessage("[ADMIN MENU] FATAL ERROR OCCURED! PLUGIN DISABLED!");
		plugin_registerinfo("Admin Mod Menu","Script is disabled, because 'amv_enable_beta menu1' is not set in adminmod.cfg!",AM_VERSION_STRING);
	}else{
		plugin_registerinfo("Admin Mod Menu","Administrate your server with menu",AM_VERSION_STRING);
		plugin_registercmd("am_menu","am_menu",ACCESS_MAP,"am_menu: opens the admin mod menu");
		plugin_registercmd("say","HandleSay",ACCESS_ALL,"am_menu: opens the admin mod menu");
		plugin_registercmd("menuselect","menuselect",ACCESS_ALL);
		plugin_registercmd("radio1","SetMenuData",ACCESS_ALL);
		plugin_registercmd("radio2","SetMenuData",ACCESS_ALL);
		plugin_registercmd("radio3","SetMenuData",ACCESS_ALL);
		plugin_registercmd("buyequip","SetMenuData",ACCESS_ALL);
		plugin_registercmd("buy","SetMenuData",ACCESS_ALL);
		plugin_registercmd("chooseteam","SetMenuData",ACCESS_ALL);
		plugin_registercmd("showbriefing","SetMenuData",ACCESS_ALL);
		//plugin_registercmd("specmode","specmode",ACCESS_ALL);		
	}
	return PLUGIN_CONTINUE;
}
 
reset_cmdarray(){
	new i;
	for(i=0;i<=g_lcommands;i++){
		strinit(g_COMMANDS[i]);
	}
	g_lcommands=0;
}
 
read_file(File[]){
	new Data[MAX_DATA_LENGTH];
	new iFileSize;
	new i;
 
	reset_cmdarray();
 
	if(fileexists(File)){
		iFileSize=filesize(File);
		if(iFileSize>99){
			iFileSize=99;
		}
		for(i=1;i<=iFileSize;i++){
			readfile(File,Data,i,MAX_DATA_LENGTH);
			if(strncmp(Data,"//",2)!=0 && strncmp(Data,"#",1)!=0 && strncmp(Data,";",1)!=0 && strlen(Data)!=0){
				g_lcommands++;
				strcpy(g_COMMANDS[g_lcommands],Data,MAX_DATA_LENGTH);
			}
		}
	}else{
		snprintf(Data,MAX_DATA_LENGTH,"[ADMIN MENU] File ^"%s^" not found!",File);
		selfmessage(Data);
	}
}
 
public SetMenuData(HLCommand,HLData,HLUserName,UserIndex){
	new UserName[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	if(g_UserMenu[UserIndex]!=0){
		reset_array(UserIndex);
		snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN MENU] Menu is closed by another menu!");
		messageex(UserName,Text,print_chat);
	}
	return PLUGIN_CONTINUE;
}
 
/*
public specmode(HLCommand,HLData,HLUserName,UserIndex){
	g_UserAvailable++;
	return PLUGIN_CONTINUE;
}
*/
public plugin_disconnect(HLUserName,UserIndex) {
	if(1 <= UserIndex <= MAX_PLAYERS){
		reset_array(UserIndex);
		//g_UserAvailable--;
	}
	return PLUGIN_CONTINUE;
}
 
public plugin_connect(HLUserName,HLIP, UserIndex) {
	if(1 <= UserIndex <= MAX_PLAYERS){
		reset_array(UserIndex);
	}
	return PLUGIN_CONTINUE;
}
 
public am_menu(HLCommand,HLData,HLUserName,UserIndex){
	new UserName[MAX_NAME_LENGTH];
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	main_menu(UserName,UserIndex);
	return PLUGIN_HANDLED;
}
 
 
/*MENUES*/
main_menu(UserName[],UserIndex){
	new Param[MAX_DATA_LENGTH];
	reset_array(UserIndex);
	if(getvar("allow_client_exec")) {
		execclient(UserName,"menuselect 10");
	}
	snprintf(Param,MAX_DATA_LENGTH,"%i %s",UserIndex,UserName);
 
	set_timer("main_menu1",1,0,Param);
	menu(UserName,"\w[ADMIN MENU]^n^n\yLOADING...",1024);
}
 
public main_menu1(Timer,Repeat,HLName,HLParam) {
	new Data[MAX_DATA_LENGTH];
	new sID[4];
	new UserName[MAX_NAME_LENGTH];
	new iID;
	new Text[512];
	new keys=639;
 
	convert_string(HLParam,Data,MAX_DATA_LENGTH);
	strsep(Data," ",sID,4,UserName,MAX_NAME_LENGTH);
	iID=strtonum(sID);
	snprintf(Text,MAX_TEXT_LENGTH,"\w[ADMIN MENU]^n^n\y1. PLAYER^n2. MAP^n3. SERVER^n4. VOTE^n5. OTHER^n6. OWN COMMANDS^n7. LAST COMMAND^n^n\r0. CANCEL");
	g_UserMenu[iID]=MAINMENU;
	menu(UserName,Text,keys);
}
 
 
second_menu(UserName[],UserIndex){
	new Data[MAX_DATA_LENGTH];
	new Alvl[MAX_DATA_LENGTH];
	new Text[512];
	new keys=0;
	new key=1;
	new i;
	new x;
 
	/*WHICH DATA SHALL BE DISPLAYED*/
	switch(g_UserMenu[UserIndex]){
		case PLAYERMENU: {
			snprintf(Text,512,"\w[PLAYER COMMANDS]^n");
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				read_file(g_PlayerCommandFile);
			}
		}
		case MAPMENU:{
			snprintf(Text,512,"\w[MAP COMMANDS]^n");
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				read_file(g_MapCommandFile);
			}
		}
		case SERVERMENU:{
			snprintf(Text,512,"\w[SERVER COMMANDS]^n");
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				read_file(g_ServerCommandFile);
			}
		}
		case VOTEMENU:{
			snprintf(Text,512,"\w[VOTE COMMANDS]^n");
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				read_file(g_VoteCommandFile);
			}
		}
		case OTHERMENU:{
			snprintf(Text,512,"\w[EXEC OTHER CMDs/CVARs]^n");
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				read_file(g_OtherCommandFile);
			}
		}
 
		case PLAYERSELECT:{
			snprintf(Text,512,"\w[PLAYER SELECT]^n\r%s:^n",g_UserCommand[UserIndex]);
			new maxplayers=maxplayercount();
			reset_cmdarray();
			for(i=1;i<=maxplayers;i++){
				if(playerinfo(i,Data,MAX_NAME_LENGTH)){
					g_lcommands++;
					strcpy(g_COMMANDS[g_lcommands],Data,MAX_NAME_LENGTH);
				}
			}
		}
		case MAPSELECT:{
			snprintf(Text,512,"\w[MAP SELECT]^n\r%s:^n",g_UserCommand[UserIndex]);
			read_file(g_MapFile);
		}
		case STOREMENU:{
			if(g_UserSelect[UserIndex]==0 || g_UserSelect[UserIndex]==g_UserLastSelect[UserIndex]){
				g_UserLastSelect[UserIndex]=0;
				new File[MAX_DATA_LENGTH];
				new AuthID[MAX_AUTHID_LENGTH];
				get_userAuthID(UserName,AuthID,MAX_AUTHID_LENGTH);
				snprintf(Text,512,"\w[SAVED CMDs]^n");
				snprintf(File,MAX_DATA_LENGTH,"%s%s.cfg",g_StoredCommandFile,AuthID);
				strsubst(File, ":", "-",MAX_TEXT_LENGTH);
				read_file(File);
			}
		}
	}
	/*CREATE MENU*/
	for(i=g_UserSelect[UserIndex];i<g_lcommands;i++){
		x++;
		if(x>ITEMS_PER_PAGE){
			break;
		}else{
			if(g_UserMenu[UserIndex]!=PLAYERSELECT){
				if(PLAYERMENU <= g_UserMenu[UserIndex] < PLAYERSELECT){
					if(g_UserMenu[UserIndex]==STOREMENU){
						keys |= key;
						snprintf(Text,512,"%s^n\y%i. \y%s",Text,x,g_COMMANDS[i+1]);
					}else{
						strsep(g_COMMANDS[i+1],":",Data,MAX_DATA_LENGTH,Alvl,MAX_DATA_LENGTH);
						if(access(strtonum(Alvl),UserName)==1){
							keys |= key;
							snprintf(Text,512,"%s^n\y%i. \y%s (%s)",Text,x,Data,Alvl);
						}else{
							snprintf(Text,512,"%s^n\r%s",Text,Data);
						}
					}
				}else if(g_UserMenu[UserIndex]==MAPSELECT){
					keys |= key;
					snprintf(Text,512,"%s^n\y%i. \y%s",Text,x,g_COMMANDS[i+1]);
				} 				
			}else if(g_UserMenu[UserIndex]==PLAYERSELECT){
				snprintf(Text,512,"%s^n\y%i. %s",Text,x,g_COMMANDS[i+1]);
				keys |= key;
			}
			key <<= 1;
		}
	}
 
	if((g_UserMenu[UserIndex]<STOREMENU || g_UserMenu[UserIndex] ==MAPSELECT) && access(ACCESS_RCON,UserName)==1){
		strcat(Text,"\w^n^n7. Edit menu",512);
		keys+=64;
	}else{
		strcat(Text,"^n",512);
	}
 
	if(g_UserSelect[UserIndex] + ITEMS_PER_PAGE < g_lcommands){
		if(g_UserSelect[UserIndex]==0){
			strcat(Text,"\w^n8. Next",512);
			keys+=128;
		}else{
			strcat(Text,"\w^n8. Next - 9. Back",512);
			keys+=384;
		}
	}else if(g_UserSelect[UserIndex] + ITEMS_PER_PAGE >= g_lcommands && g_UserSelect[UserIndex]!=0){
		strcat(Text,"\w^n9. Back",512);
		keys+=256;
	}
	strcat(Text,"\r^n0. Cancel",512);
	keys+=512;
	menu(UserName,Text,keys);
}
 
public HandleSay(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new UserName[MAX_NAME_LENGTH];
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,UserName,MAX_DATA_LENGTH);
	strstripquotes(Data);
	if(g_UserMessageMode[UserIndex]==1){
		handle_data(Data,UserName,UserIndex);
		return PLUGIN_HANDLED;
	}
	if(strcmp(Data,"am_menu")==0){
		if(access(ACCESS_MAP)){
			main_menu(UserName,UserIndex);
		}else{
			messageex(UserName,"[ADMIN-MENU] You do not have access to this command!",print_chat);
		}
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
 
/*BULDING USERCOMMAND-DATA WITH MESSAGEMODE-DATA*/
handle_data(Data[],UserName[],UserIndex){
	if(strlen(g_UserData[UserIndex])==0){
		snprintf(g_UserData[UserIndex],MAX_DATA_LENGTH,"%s",Data);
	}else{
		snprintf(g_UserData[UserIndex],MAX_DATA_LENGTH,"%s %s",g_UserData[UserIndex],Data);
	}
	messagemode_menu(UserName,UserIndex);	
}
 
messagemode_menu(UserName[],UserIndex){
	new Text[512];
	new keys;
	if(g_UserSelect[UserIndex]==EDIT){
		new Kategorie[MAX_NAME_LENGTH];
		keys=526;
		switch(g_UserLastMenu[UserIndex]){
			case PLAYERMENU: strcpy(Kategorie,"[PLAYER MENU]",MAX_NAME_LENGTH);
			case MAPMENU: strcpy(Kategorie,"[MAP MENU]",MAX_NAME_LENGTH);
			case SERVERMENU: strcpy(Kategorie,"[SERVER MENU]",MAX_NAME_LENGTH);
			case VOTEMENU: strcpy(Kategorie,"[VOTE MENU]",MAX_NAME_LENGTH);
			case OTHERMENU: strcpy(Kategorie,"[OTHER MENU]",MAX_NAME_LENGTH);
			case MAPSELECT: strcpy(Kategorie,"[MAPS]",MAX_NAME_LENGTH);
		}
		snprintf(Text,MAX_TEXT_LENGTH,"\w[EDIT ADMIN MENU]^n\yCommand: \w%s^n\yParameter:^n\w%s^n^n\yEnter parameter in chat!^n\w2. Truncate last token^n3. Save Cmd in %s^n4. Delete Cmd in %s^n^n\r0. Cancel",g_UserCommand[UserIndex],g_UserData[UserIndex],Kategorie,Kategorie);
	}else if(g_UserLastMenu[UserIndex]==STOREMENU){
		keys=527;
		snprintf(Text,MAX_TEXT_LENGTH,"\w[ADMIN MENU]^n\yCommand: \w%s^n\yParameter:^n\w%s^n^n\yEnter parameter in chat!^n\w1. Execute\n2. Truncate last token^n3. Save Cmd in [OWN CMDS]^n4. Delete Cmd in [OWN CMDS]^n^n\r0. Cancel",g_UserCommand[UserIndex],g_UserData[UserIndex]);
	}else{
		keys=519;
		snprintf(Text,MAX_TEXT_LENGTH,"\w[ADMIN MENU]^n\yCommand: \w%s^n\yParameter:^n\w%s^n^n\yEnter parameter in chat!^n\w1. Execute\n2. Truncate last token^n3. Save Cmd in [OWN CMDS]^n^n\r0. Cancel",g_UserCommand[UserIndex],g_UserData[UserIndex]);
	}
	g_UserMessageMode[UserIndex]=1;
	g_UserMenu[UserIndex]=EXECUTEMENU;
	menu(UserName,Text,keys);
}
 
public menuselect(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new UserName[MAX_NAME_LENGTH];
	new dummy[10];
	new iSelect;
  	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	if(g_UserMenu[UserIndex]!=0){
		iSelect=strtonum(Data);
		if(iSelect==EDIT && g_UserMenu[UserIndex]!=MAINMENU){
			g_UserLastMenu[UserIndex]=g_UserMenu[UserIndex];
			g_UserLastSelect[UserIndex]=g_UserSelect[UserIndex];
			g_UserSelect[UserIndex]=iSelect;
			if(g_UserLastMenu[UserIndex]!=MAPSELECT){
				g_UserCommand[UserIndex]="enter COMMAND:ACCESSLEVEL";
			}else{
				g_UserLLastMenu[UserIndex]=MAPMENU;
				g_UserLLastSelect[UserIndex]=0;
				g_UserCommand[UserIndex]="enter MAP-NAME";
			}
			messagemode_menu(UserName,UserIndex);
		}else if(iSelect==NEXT){ 	
			g_UserSelect[UserIndex]=g_UserSelect[UserIndex]+ITEMS_PER_PAGE;
			second_menu(UserName,UserIndex);
		}else if(iSelect==BACK){
			g_UserSelect[UserIndex]=g_UserSelect[UserIndex]-ITEMS_PER_PAGE;
			second_menu(UserName,UserIndex);
		}else if(iSelect==CANCEL){ 
			if(g_UserMenu[UserIndex]==MAINMENU){
				reset_array(UserIndex);
			}else if(MAINMENU < g_UserMenu[UserIndex] < PLAYERSELECT){
				reset_array(UserIndex);
				main_menu(UserName,UserIndex);
			}else if(PLAYERSELECT <= g_UserMenu[UserIndex] < EXECUTEMENU){
				g_UserMenu[UserIndex]=g_UserLastMenu[UserIndex];
				g_UserSelect[UserIndex]=g_UserLastSelect[UserIndex];
				strinit(g_UserCommand[UserIndex]);
				second_menu(UserName,UserIndex);
			}else if(g_UserMenu[UserIndex]==EXECUTEMENU){
				g_UserMessageMode[UserIndex]=0;
				strinit(g_UserData[UserIndex]);
				if(g_UserLLastMenu[UserIndex]!=0){
					g_UserMenu[UserIndex]=g_UserLLastMenu[UserIndex];
					g_UserSelect[UserIndex]=g_UserLLastSelect[UserIndex];
				}else{
					g_UserMenu[UserIndex]=g_UserLastMenu[UserIndex];
					g_UserSelect[UserIndex]=g_UserLastSelect[UserIndex];
				}
				if(g_UserMenu[UserIndex]!=MAINMENU){
					second_menu(UserName,UserIndex);
				}else{
					reset_array(UserIndex);
					main_menu(UserName,UserIndex);
				}
			}
		/*SELECT*/		
		}else{	
			if(g_UserMenu[UserIndex]==MAINMENU){
				iSelect++;
				switch(iSelect){
					case PLAYERMENU:{
						g_UserMenu[UserIndex]=PLAYERMENU;
					}
					case MAPMENU: {
						g_UserMenu[UserIndex]=MAPMENU;
					}
					case SERVERMENU:{
						g_UserMenu[UserIndex]=SERVERMENU;
					}
					case VOTEMENU: {
						g_UserMenu[UserIndex]=VOTEMENU;
					}
					case OTHERMENU: {
						g_UserMenu[UserIndex]=OTHERMENU;
					}
					case STOREMENU:{
						g_UserMenu[UserIndex]=STOREMENU;
					}
					case EDIT+1:{
						if(strlen(g_UserStoredCommand[UserIndex])!=0){
							g_UserLastMenu[UserIndex]=MAINMENU;
							strcpy(g_UserCommand[UserIndex],g_UserStoredCommand[UserIndex],MAX_COMMAND_LENGTH);
							strcpy(g_UserData[UserIndex],g_UserStoredData[UserIndex],MAX_DATA_LENGTH);
							messagemode_menu(UserName,UserIndex);
							return PLUGIN_CONTINUE;
						}else{
							main_menu(UserName,UserIndex);
							return PLUGIN_HANDLED;
						}
					}
				}
				second_menu(UserName,UserIndex);
			}else if(PLAYERMENU <= g_UserMenu[UserIndex] < STOREMENU){
				g_UserLastMenu[UserIndex]=g_UserMenu[UserIndex];
				g_UserLastSelect[UserIndex]=g_UserSelect[UserIndex];
				strcpy(g_UserCommand[UserIndex],g_COMMANDS[g_UserSelect[UserIndex]+iSelect],MAX_COMMAND_LENGTH);
				strsplit(g_UserCommand[UserIndex],":",g_UserCommand[UserIndex],MAX_COMMAND_LENGTH,dummy,10);
 
				if(PLAYERMENU <= g_UserMenu[UserIndex] <=MAPMENU){
					if(g_UserMenu[UserIndex] == PLAYERMENU){
						g_UserMenu[UserIndex]=PLAYERSELECT;
					}else if(g_UserMenu[UserIndex] == MAPMENU){
						g_UserMenu[UserIndex]=MAPSELECT;
					}
					g_UserSelect[UserIndex]=0;
					second_menu(UserName,UserIndex);
				}else if(SERVERMENU <= g_UserMenu[UserIndex] <= OTHERMENU){					
					messagemode_menu(UserName,UserIndex);
				}
			}else if(g_UserMenu[UserIndex] == STOREMENU){
				g_UserLastMenu[UserIndex]=g_UserMenu[UserIndex];
				g_UserLastSelect[UserIndex]=g_UserSelect[UserIndex];
				strsep(g_COMMANDS[g_UserSelect[UserIndex]+iSelect],":",g_UserCommand[UserIndex],MAX_COMMAND_LENGTH,g_UserData[UserIndex],MAX_DATA_LENGTH);
				messagemode_menu(UserName,UserIndex);
			}else if(PLAYERSELECT <= g_UserMenu[UserIndex] < EXECUTEMENU){
				g_UserLLastMenu[UserIndex]=g_UserMenu[UserIndex];
				g_UserLLastSelect[UserIndex]=g_UserSelect[UserIndex];
				if(g_UserMenu[UserIndex]==PLAYERSELECT){
					snprintf(g_UserData[UserIndex],MAX_DATA_LENGTH,"^"%s^"",g_COMMANDS[g_UserSelect[UserIndex]+iSelect]);
				}else if(g_UserMenu[UserIndex]==MAPSELECT){
					strcpy(g_UserData[UserIndex],g_COMMANDS[g_UserSelect[UserIndex]+iSelect],MAX_DATA_LENGTH);
				}
				messagemode_menu(UserName,UserIndex);
			}else if(g_UserMenu[UserIndex] == EXECUTEMENU){
				if(iSelect==1){
					exec_command(UserName,UserIndex);
				}else if(iSelect==2){
					remove_last_param(UserName,UserIndex);
				}else if(iSelect==3){
					store_cmd(UserName,UserIndex);
				}else if(iSelect==4){
					del_cmd(UserName,UserIndex);
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}
 
 
exec_command(UserName[],UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new iAccess;
	if(g_UserLLastMenu[UserIndex]==PLAYERSELECT){
		new Dummy[MAX_DATA_LENGTH];
		strcpy(Text,g_UserData[UserIndex],MAX_NAME_LENGTH);
		strgsep(Text," ","^"",Text,MAX_TEXT_LENGTH,Dummy,MAX_DATA_LENGTH);
		if(!check_user(Text)){
			snprintf(g_UserData[UserIndex],MAX_DATA_LENGTH,"%s is not valid!",Text);
			messagemode_menu(UserName,UserIndex);
			return;
		}
	}
	if(plugin_checkcommand(g_UserCommand[UserIndex], iAccess)>0){
		plugin_exec(g_UserCommand[UserIndex],g_UserData[UserIndex]);
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"%s %s",g_UserCommand[UserIndex],g_UserData[UserIndex]);
		exec(Text);
	}
	strcpy(g_UserStoredCommand[UserIndex],g_UserCommand[UserIndex],MAX_COMMAND_LENGTH);
	strcpy(g_UserStoredData[UserIndex],g_UserData[UserIndex],MAX_DATA_LENGTH);
	snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN MENU] %s %s executed!",g_UserCommand[UserIndex],g_UserData[UserIndex]);
	messageex(UserName,Text,print_chat);
	log(Text);
	reset_array(UserIndex);
}
 
remove_last_param(UserName[],UserIndex){
	new currentChar = -1; 
	new lastSpace = 0; 
	new bInQuotes = 0; 
 
	while(g_UserData[UserIndex][++currentChar]) { 
		if(g_UserData[UserIndex][currentChar] == '"') { 
			bInQuotes = !bInQuotes; 
		} else if(!bInQuotes && g_UserData[UserIndex][currentChar] == ' ') { 
			lastSpace = currentChar; 
		} 
	}
	g_UserData[UserIndex][lastSpace] = '^0';
	messagemode_menu(UserName,UserIndex);	
}
 
store_cmd(UserName[],UserIndex){
	new File[MAX_DATA_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new AuthID[MAX_DATA_LENGTH];
	if(g_UserSelect[UserIndex]!=EDIT){
		get_userAuthID(UserName,AuthID,MAX_AUTHID_LENGTH);
		snprintf(File,MAX_DATA_LENGTH,"%s%s.cfg",g_StoredCommandFile,AuthID);
		strsubst(File, ":", "-",MAX_TEXT_LENGTH);
		snprintf(Data,MAX_DATA_LENGTH,"%s:%s",g_UserCommand[UserIndex],g_UserData[UserIndex]);
	}else{
		switch(g_UserLastMenu[UserIndex]){
			case PLAYERMENU: strcpy(File,g_PlayerCommandFile,MAX_DATA_LENGTH);
			case MAPMENU: strcpy(File,g_MapCommandFile,MAX_DATA_LENGTH);
			case SERVERMENU: strcpy(File,g_ServerCommandFile,MAX_DATA_LENGTH);
			case VOTEMENU: strcpy(File,g_VoteCommandFile,MAX_DATA_LENGTH);
			case OTHERMENU: strcpy(File,g_OtherCommandFile,MAX_DATA_LENGTH);
			case MAPSELECT: strcpy(File,g_MapFile,MAX_DATA_LENGTH);
		}
		strcpy(Data,g_UserData[UserIndex],MAX_DATA_LENGTH);
	}
	if(strlen(Data)!=0){
		writefile(File,Data,-1);
		snprintf(Data,MAX_DATA_LENGTH,"[ADMIN MENU] %s saved in %s!",Data,File);
		messageex(UserName,Data,print_chat);
	}
	if(g_UserLastMenu[UserIndex]!=MAPSELECT){
		messagemode_menu(UserName,UserIndex);
	}else{
		reset_array(UserIndex);
		g_UserMenu[UserIndex]=MAPMENU;
		second_menu(UserName,UserIndex);
	}
}
 
del_cmd(UserName[],UserIndex){
	new File[MAX_DATA_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new sSearch[MAX_DATA_LENGTH];
	new iFileSize;
	new i;
 
	if(g_UserSelect[UserIndex]!=EDIT){
		new AuthID[MAX_DATA_LENGTH];
		get_userAuthID(UserName,AuthID,MAX_AUTHID_LENGTH);
		snprintf(File,MAX_DATA_LENGTH,"%s%s.cfg",g_StoredCommandFile,AuthID);
		strsubst(File, ":", "-",MAX_TEXT_LENGTH);
		snprintf(sSearch,MAX_DATA_LENGTH,"%s:%s",g_UserCommand[UserIndex],g_UserData[UserIndex]);
	}else{
		switch(g_UserLastMenu[UserIndex]){
			case PLAYERMENU: strcpy(File,g_PlayerCommandFile,MAX_DATA_LENGTH);
			case MAPMENU: strcpy(File,g_MapCommandFile,MAX_DATA_LENGTH);
			case SERVERMENU: strcpy(File,g_ServerCommandFile,MAX_DATA_LENGTH);
			case VOTEMENU: strcpy(File,g_VoteCommandFile,MAX_DATA_LENGTH);
			case OTHERMENU: strcpy(File,g_OtherCommandFile,MAX_DATA_LENGTH);
			case MAPSELECT: strcpy(File,g_MapFile,MAX_DATA_LENGTH);
		}
		strcpy(sSearch,g_UserData[UserIndex],MAX_DATA_LENGTH);
	}
	if(strlen(sSearch)!=0){
		iFileSize=filesize(File);
		for(i=1;i<=iFileSize;i++){
			readfile(File,Data,i,MAX_DATA_LENGTH);
			if(strcmp(Data,sSearch)!=0){
				writefile(g_tempStoredCommandFile,Data,-1);
			}
		}
		resetfile(File);
		iFileSize=filesize(g_tempStoredCommandFile);
		for(i=1;i<=iFileSize;i++){
			readfile(g_tempStoredCommandFile,Data,i,MAX_DATA_LENGTH);
			writefile(File,Data,-1);
		}
		deletefile(g_tempStoredCommandFile);
 
		snprintf(Data,MAX_DATA_LENGTH,"[ADMIN MENU] %s deleted in %s!",sSearch,File);
		messageex(UserName,Data,print_chat);
	}
	if(g_UserLastMenu[UserIndex]!=MAPSELECT){
		messagemode_menu(UserName,UserIndex);
	}else{
		reset_array(UserIndex);
		g_UserMenu[UserIndex]=MAPMENU;
		second_menu(UserName,UserIndex);
	}
}
 
reset_array(UserIndex){
	g_UserMenu[UserIndex]=0;
	g_UserLastMenu[UserIndex]=0;
	g_UserLLastMenu[UserIndex]=0;
	g_UserLastSelect[UserIndex]=0;
	g_UserLLastSelect[UserIndex]=0;
	g_UserMessageMode[UserIndex]=0;
	g_UserSelect[UserIndex]=0;
	strinit(g_UserCommand[UserIndex]);
	strinit(g_UserData[UserIndex]);
}
 
 
public plugin_info(HLOldName,HLNewName,UserIndex) {
	new OldName[MAX_NAME_LENGTH];
	new NewName[MAX_NAME_LENGTH];
	new CurName[MAX_NAME_LENGTH];
	new maxplayers=maxplayercount();
	new i;
	new iDead;
 
	convert_string(HLOldName,OldName,MAX_NAME_LENGTH);
	convert_string(HLNewName,NewName,MAX_NAME_LENGTH);
 
	for(i=0;i<=maxplayers;i++){
		if(g_UserLLastMenu[i]==PLAYERSELECT){
			if(strstrx(g_UserData[i],OldName)!=-1){
				if(playerinfo(UserIndex,CurName,MAX_NAME_LENGTH,_,_,_,iDead)){
					if(!iDead){
						strcpy(g_UserData[i],NewName,MAX_NAME_LENGTH);
					}
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}