// SMARTFOXSERVER 3 ADMIN TOOL'S ZONE CONFIGURATOR MODULE
// Zone configuration settings descriptor file
// 
// The "category" attribute indicates in which tab on the interface (if a TabNavigator is used) the parameter will be displayed. If missing a default category is used.

//-------------------------------------------
// GENERAL SETTINGS
//-------------------------------------------

// ZONE NAME
{
	"name":"name",
	"label":"Zone name",
	"tooltip":"The Zone name",
	"type":"TextInput",
	"value":"{$BasicValue=zoneSettings.name}",
	"validator":"notNull"
},

// USE ENCRYPTION
{
	"name":"isEncrypted",
	"label":"Use encryption",
	"tooltip":"When active the server will only allow encrypted sessions to login in this Zone. Otherwise only unencrypted sessions are allowed to login.",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isEncrypted}
},

// USE CUSTOM LOGIN
{
	"name":"isCustomLogin",
	"label":"Use custom login",
	"tooltip":"If turned on, the login logic will be handled by the developer's Zone Extension",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isCustomLogin}
},

// USE FORCE LOGOUT
{
	"name":"isForceLogout",
	"label":"Force logout",
	"tooltip":"If turned on, the previous session with the same name (if any) will be suddenly disconnected",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isForceLogout}
},

// TOGGLE GEOLOCATION
{
	"name":"geoLocationEnabled",
	"label":"Enable geolocation",
	"tooltip":"Toggles geolocation service, resolving the client IP address from a local database at minimal performance cost",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.geoLocationEnabled}
},

// TOGGLE KEEPALIVE
{
	"name":"lagMonitorKeepAlive",
	"label":"Enable Keepalive",
	"tooltip":"Allows client side LagMonitor requests to act as keepalive pings, resetting the idle timer. When active the client will essentially not be disconnected for being idle",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.lagMonitorKeepAlive}
},

// MAX FAILED LOGIN ATTEMPTS
{
	"name":"maxFailedLogins",
	"label":"Maximum # of failed logins",
	"tooltip":"The maximum number of login attempts (in the same session) allowed by the Zone",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxFailedLogins},
	"attributes":
	{
		"min":1,
		"max":30
	}
},

// MAX USERS
{
	"name":"maxUsers",
	"label":"Maximum # of users",
	"tooltip":"The maximum number of users allowed in the Zone",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxUsers},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// MAX ROOMS
{
	"name":"maxRooms",
	"label":"Maximum # of Rooms",
	"tooltip":"The maximum number of Rooms that can be created",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxRooms},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// MAX ROOMS CREATED PER USER
{
	"name":"maxRoomsCreatedPerUser",
	"label":"Maximum Rooms per user",
	"tooltip":"The maximum number of Rooms that one user can create/own (at the same time)",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxRoomsCreatedPerUser},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// MAX USER VARIABLES ALLOWED
{
	"name":"maxUserVariablesAllowed",
	"label":"Maximum # of User Variables",
	"tooltip":"The maximum number of User Variables that each user can set",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxUserVariablesAllowed},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// MAX ROOM VARIABLES ALLOWED
{
	"name":"maxRoomVariablesAllowed",
	"label":"Maximum # of Room Variables",
	"tooltip":"The maximum number of Room Variables allowed in a Room",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxRoomVariablesAllowed},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// MIN ROOM NAME CHARS
{
	"name":"minRoomNameChars",
	"label":"Minimum length of Room names",
	"tooltip":"The minimum number of characters for a Room name",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.minRoomNameChars},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// MAX ROOM NAME CHARS
{
	"name":"maxRoomNameChars",
	"label":"Maximum length of Room names",
	"tooltip":"The maximum number of characters for a Room name",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxRoomNameChars},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// APPLY WORDS FILTER TO USERNAMES
{
	"name":"isFilterUserNames",
	"label":"Apply words filter to usernames",
	"tooltip":"Words filter must be active; also, this setting is valid if 'Filter mode' is set to 'BLACKLIST' only",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isFilterUserNames}
},

// APPLY WORDS FILTER TO ROOM NAMES
{
	"name":"isFilterRoomNames",
	"label":"Apply words filter to Room names",
	"tooltip":"Words filter must be active; also, this setting is valid if 'Filter mode' is set to 'BLACKLIST' only",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isFilterRoomNames}
},

// APPLY WORDS FILTER TO PRIVATE MESSAGES
{
	"name":"isFilterPrivateMessages",
	"label":"Apply words filter to private messages",
	"tooltip":"Words filter must be active",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isFilterPrivateMessages}
},

// APPLY WORDS FILTER TO BUDDY MESSAGES
{
	"name":"isFilterBuddyMessages",
	"label":"Apply words filter to buddy messages",
	"tooltip":"Words filter must be active",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.isFilterBuddyMessages}
},

// USER RECONNECTION TIME
{
	"name":"userReconnectionSeconds",
	"label":"User reconnection timeframe",
	"tooltip":"Maximum waiting-timeframe (in seconds) for transparent client reconnection",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.userReconnectionSeconds},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// OVERRIDE USER MAX IDLE TIME
{
	"name":"overrideMaxUserIdleTime",
	"label":"Override user maximum idle time",
	"tooltip":"Maximum idle time for a logged user (in seconds), after which the user is disconnected; this setting overrides the 'User maximum idle time' setting in the Server Configurator, allowing a per-Zone approach",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.overrideMaxUserIdleTime},
	"attributes":
	{
		"min":5,
		"max":2147483647
	}
},

// MAX UDP IDLE SECONDS
{
	"name":"maxUdpIdleSeconds",
	"label":"Maximum UDP idle time",
	"tooltip":"Maximum idle time for a UDP connection, after which the UDP connection is closed",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxUdpIdleSeconds},
	"attributes":
	{
		"min":5,
		"max":2147483647
	}
},

// ALLOW GUEST USERS
{
	"name":"allowGuestUsers",
	"label":"Allow guest users access",
	"tooltip":"When active any empty user names will be turned into an auto-generated guest username, otherwise the login will be refused",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.allowGuestUsers}
},

// GUEST USERNAME PREFIX
{
	"name":"guestUserNamePrefix",
	"label":"Guest username prefix",
	"tooltip":"The prefix used in auto-generated guest user names",
	"type":"TextInput",
	"value":"{$BasicValue=zoneSettings.guestUserNamePrefix}"
},

// PUBLIC ROOM GROUPS
{
	"name":"publicRoomGroups",
	"label":"Public Room Groups",
	"tooltip":"Comma-separated list of Group names; this setting restricts the user access to Room groups: clients will only be able to listen for events and create or join Rooms in these Groups",
	"type":"TextInput",
	"value":"{$BasicValue=zoneSettings.publicRoomGroups}",
	"attributes":
	{
		"pattern":"[a-zA-Z0-9,_]+"
	}
},

// DEFAULT ROOM GROUPS
{
	"name":"defaultRoomGroups",
	"label":"Default Room Groups",
	"tooltip":"Comma-separated list of Group names; this setting indicates which Group/s should be registered for each client in this Zone",
	"type":"TextInput",
	"value":"{$BasicValue=zoneSettings.defaultRoomGroups}",
	"attributes":
	{
		"pattern":"[a-zA-Z0-9,_]+"
	}
},

//-------------------------------------------
// ADVANCED
//-------------------------------------------

// ALLOW FILE UPLOADING
{
	"name":"allowUploads",
	"label":"Allow file uploading",
	"tooltip":"If enabled, files can be uploaded by clients to the server via regular HTTP post requests; internal web server must be active and the HTTP protocol enabled (see Web server tab in Server Configurator module)",
	"category":"Advanced",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.allowUploads}
},

// ALLOW JOIN INVITATIONS FOR BUDDIES ONLY
{
	"name":"allowInvitationsOnlyForBuddies",
	"label":"Allow Join Invitations for Buddies only",
	"tooltip":"If enabled, clients will only be able to invite Buddies via the JoinRoomInvitationRequest; if disabled they will be able to invite any online User",
	"category":"Advanced",
	"type":"CheckBox",
	"value":{$BasicValue=zoneSettings.allowInvitationsOnlyForBuddies}
},

// MAX USERS PER JOIN INVITATION
{
	"name":"maxUsersPerJoinInvitationRequest",
	"label":"Max Users per Join Invitation",
	"tooltip":"The mamximum number of Users that can be invited at once via a client-side JoinRoomInvitationRequest",
	"category":"Advanced",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxUsersPerJoinInvitationRequest},
	"attributes":
	{
		"min":1,
		"max":8
	}
},

// FINDUSER CLIENT MAX RESULTS
{
	"name":"maxFindUserResults",
	"label":"Max FindUser results",
	"tooltip":"The mamximum number of results sent to a client-side FindUser request. Recommended range = 30...60",
	"category":"Advanced",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxFindUserResults},
	"attributes":
	{
		"min":1,
		"max":10000
	}
},

// FINDROOM CLIENT MAX RESULTS
{
	"name":"maxFindRoomResults",
	"label":"Max FindRoom results",
	"tooltip":"The mamximum number of results sent to a client-side FindRoom request. Recommended range = 30...60",
	"category":"Advanced",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.maxFindRoomResults},
	"attributes":
	{
		"min":1,
		"max":10000
	}
},

// DEFAULT PLAYER ID GENERATOR CLASS
{
	"name":"defaultPlayerIdGeneratorClass",
	"label":"Player's ID generator class",
	"tooltip":"The fully qualified name of a class that provides the PlayerId generation service",
	"category":"Advanced",
	"type":"TextInput",
	"value":"{$BasicValue=zoneSettings.defaultPlayerIdGeneratorClass}",
	"attributes":
	{
		"pattern":"[a-zA-Z0-9._]+"
	}
},

// USER COUNT CHANGE EVENT UPDATE INTERVAL
{
	"name":"userCountChangeUpdateInterval",
	"label":"'userCountChange' throttler interval",
	"tooltip":"The rate (in milliseconds) at which the 'userCountChange' event should be sent; 0 means realtime",
	"category":"Advanced",
	"type":"NumericStepper",
	"value":{$BasicValue=zoneSettings.userCountChangeUpdateInterval},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// RDP QUALITY OF SERVICE
{
	"name":"udpSettings.rdpQualitySetting",
	"label":"RDP Quality of Service",
	"tooltip":"Check the details in the RDP documentation on the SmatFoxServer website; change at your risk (do not change if you're unsure!)",
	"category":"Advanced",
	"type":"ComboBox",
	"value":"{$BasicValue=udpSettings.rdpQualitySetting}",
	"dataProvider":"{$BasicValue=udpSettings.rdpQualityValues}"
},

// RDP RELIABLE CHANNEL TYPE
{
	"name":"udpSettings.rdpReliableChannelTypeString",
	"label":"RDP retransmission type",
	"tooltip":"Check the details in the RDP documentation on the SmatFoxServer website; change at your risk (do not change if you're unsure!)",
	"category":"Advanced",
	"type":"ComboBox",
	"value":"{$BasicValue=udpSettings.rdpReliableChannelTypeString}",
	"dataProvider":"{$BasicValue=udpSettings.rdpReliableChannelTypeValues}"
},

// UDP KEEP ALIVE
{
	"name":"udpSettings.keepAlive",
	"label":"UDP keep alive",
	"tooltip":"Keep the connection alive when client and server communicate via UDP protocol",
	"category":"Advanced",
	"type":"CheckBox",
	"value":{$BasicValue=udpSettings.keepAlive}
},

//-------------------------------------------
// WORDS FILTER
//-------------------------------------------

// ACTIVE WORDS FILTER
{
	"name":"wordsFilter.isActive",
	"label":"Activate",
	"tooltip":"Enable/disable the words filter",
	"category":"Words Filter",
	"type":"CheckBox",
	"value":{$BasicValue=wordsFilter.isActive}
},

// MAX BAD WORDS PER MESSAGE
{
	"name":"wordsFilter.maxBadWordsPerMessage",
	"label":"Maximum bad words per message",
	"tooltip":"If a single message contains a number of bad words which exceeds this value, the user will be kicked immediately, without warnings; set this value to 0 to disable immediate kicking",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.maxBadWordsPerMessage},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// SEND WARNINGS
{
	"name":"wordsFilter.useWarnings",
	"label":"Send warnings",
	"tooltip":"Send a warning (as a Moderator message) whenever a message contains a bad word",
	"category":"Words Filter",
	"type":"CheckBox",
	"value":{$BasicValue=wordsFilter.useWarnings}
},

// WARNING BEFORE KICKS
{
	"name":"wordsFilter.warningsBeforeKick",
	"label":"Warnings before kicking",
	"tooltip":"Number of warnings after which the user sending messages containing bad words is kicked; this counter is in place even if warnings are not actually sent to the user (see 'Send warnings')",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.warningsBeforeKick},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// KICKS BEFORE BAN
{
	"name":"wordsFilter.kicksBeforeBan",
	"label":"Kicks before banning",
	"tooltip":"Number of times a user is kicked before he/she is banned automatically",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.kicksBeforeBan},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// KICKS BEFORE BAN MINUTES
{
	"name":"wordsFilter.kicksBeforeBanMinutes",
	"label":"Kick before banning timeframe",
	"tooltip":"User is banned if he/she is kicked the above number of times within the specified timeframe (expressed in minutes)",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.kicksBeforeBanMinutes},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// BAN DURATION
{
	"name":"wordsFilter.banDuration",
	"label":"Duration of banning",
	"tooltip":"Timeframe (expressed in minutes) during which the banned user won't be able to connect to the SmartFoxServer instance",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.banDuration},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// WARNING MESSAGE
{
	"name":"wordsFilter.warningMessage",
	"label":"Warning message",
	"tooltip":"The message sent to a user being warned",
	"category":"Words Filter",
	"type":"TextInput",
	"value":"{$BasicValue=wordsFilter.warningMessage}"
},

// KICK MESSAGE
{
	"name":"wordsFilter.kickMessage",
	"label":"Kicking message",
	"tooltip":"The message sent to a user being kicked",
	"category":"Words Filter",
	"type":"TextInput",
	"value":"{$BasicValue=wordsFilter.kickMessage}"
},

// BAN MESSAGE
{
	"name":"wordsFilter.banMessage",
	"label":"Banning message",
	"tooltip":"The message sent to a user being banned",
	"category":"Words Filter",
	"type":"TextInput",
	"value":"{$BasicValue=wordsFilter.banMessage}"
},

// SECONDS BEFORE BAN OR KICK
{
	"name":"wordsFilter.secondsBeforeBanOrKick",
	"label":"Time before banning or kicking",
	"tooltip":"Number of seconds before the kick or ban actions occur after the kick/ban message has been sent",
	"category":"Words Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=wordsFilter.secondsBeforeBanOrKick},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// BAN MODE

{
	"name":"wordsFilter.banMode",
	"label":"Ban mode",
	"tooltip":"The default banning modality; can be by IP address or by username",
	"category":"Words Filter",
	"type":"ComboBox",
	"value":"{$BasicValue=wordsFilter.banMode}",
	"dataProvider":"IP,NAME"
},

// WORDS FILE
{
	"name":"wordsFilter.wordsFile",
	"label":"Words file",
	"tooltip":"An external file in which each line contains a word or a valid regular expression. The 'Filter mode' setting indicates if matching words in user messages will be allowed or not; bad words are masked with the character set in the 'Hide bad words with character' parameter",
	"category":"Words Filter",
	"type":"TextInput",
	"value":"{$BasicValue=wordsFilter.wordsFile}"
},

// HIDE BAD WORDS WITH CHARACTER
{
	"name":"wordsFilter.hideBadWordWithCharacter",
	"label":"Hide bad words with character",
	"tooltip":"Character to be used to mask the bad words in user messages",
	"category":"Words Filter",
	"type":"TextInput",
	"value":"{$BasicValue=wordsFilter.hideBadWordWithCharacter}",
	"attributes":
	{
		"size":1,
		"maxlength":1
	}
},

// FILTER MODE

{
	"name":"wordsFilter.filterMode",
	"label":"Filter mode",
	"tooltip":"User messages words filtering mode: if 'WHITELIST', words matching the words file content are allowed only; if 'BLACKLIST', all words matching the words file content are considered as bad and filtered out",
	"category":"Words Filter",
	"type":"ComboBox",
	"value":"{$BasicValue=wordsFilter.filterMode}",
	"dataProvider":"BLACKLIST,WHITELIST"
},

//-------------------------------------------
// FLOOD FILTER
//-------------------------------------------

// ACTIVE FLOOD FILTER
{
	"name":"floodFilter.isActive",
	"label":"Activate",
	"tooltip":"Enable/disable the flood filter",
	"category":"Flood Filter",
	"type":"CheckBox",
	"value":{$BasicValue=floodFilter.isActive}
},

// BAN DURATION
{
	"name":"floodFilter.banDurationMinutes",
	"label":"Duration of banning",
	"tooltip":"Timeframe (expressed in minutes) during which the banned user won't be able to connect to the SmartFoxServer instance",
	"category":"Flood Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=floodFilter.banDurationMinutes},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// MAX FLOODING ATTEMPTS
{
	"name":"floodFilter.maxFloodingAttempts",
	"label":"Maximum # of flooding attempts",
	"tooltip":"Number of times a user can try flooding the server before he/she is banned automatically; a flooding attempt is registered whenever the maximum number of messages per second for any request type is exceeded",
	"category":"Flood Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=floodFilter.maxFloodingAttempts},
	"attributes":
	{
		"min":1,
		"max":2147483647
	}
},

// SECONDS BEFORE BAN
{
	"name":"floodFilter.secondsBeforeBan",
	"label":"Time before banning",
	"tooltip":"Number of seconds before the ban action occurs after the ban message has been sent",
	"category":"Flood Filter",
	"type":"NumericStepper",
	"value":{$BasicValue=floodFilter.secondsBeforeBan},
	"attributes":
	{
		"min":0,
		"max":2147483647
	}
},

// BAN MESSAGE
{
	"name":"floodFilter.banMessage",
	"label":"Ban message",
	"tooltip":"The message sent to a user being banned due to server flooding",
	"category":"Flood Filter",
	"type":"TextInput",
	"value":"{$BasicValue=floodFilter.banMessage}"
},

// BAN MODE

{
	"name":"floodFilter.banMode",
	"label":"Ban mode",
	"tooltip":"The default banning modality; can be by IP address or by username",
	"category":"Flood Filter",
	"type":"ComboBox",
	"value":"{$BasicValue=floodFilter.banMode}",
	"dataProvider":"IP,NAME"
},

// LOG FLOODING ATTEMPTS
{
	"name":"floodFilter.logFloodingAttempts",
	"label":"Log flooding attempts",
	"tooltip":"Toggle logging of the flooding attempts",
	"category":"Flood Filter",
	"type":"CheckBox",
	"value":{$BasicValue=floodFilter.logFloodingAttempts}
},

// REQUEST FILTERS
{
	"name":"floodFilter.requestFilters",
	"label":"Request filters",
	"tooltip":"Filters applied to client requests to identify flooding attempts",
	"category":"Flood Filter",
	"type":"DataGrid",
	"defaultListItem":
	[
		{
			"name":"reqName",
			"label":"Request name",
			"tooltip":"Name of the request to be filtered",
			"type":"ComboBox",
			"value":"",
			"dataProvider":"{$BasicValue=floodFilter.requestsList}",
			"validator":"notNull"
		},
		{
			"name":"maxRequestsPerSecond",
			"label":"Max requests per second",
			"tooltip":"Maximum number of requests per second after which a flooding attempt is registered",
			"type":"NumericStepper",
			"value":20,
			"attributes":
			{
				"min":1,
				"max":1000
			}
		}
	],
	"listValues":{$List=requestFilters, instance=floodFilter, fields=reqName;maxRequestsPerSecond},
	"clazz":"ZoneSettings$RequestFilterSettings"
},

//-------------------------------------------
// EXTENSION
//-------------------------------------------

// NAME
{
	"name":"extension.name",
	"label":"Name",
	"tooltip":"The name of the Extension to be plugged at Zone level; the '_shared' folder is also listed, in case one or more Java Extensions are deployed there for specific class-loading purposes\n\nIf a new Extension is deployed on the server while editing the Zone settings, cancel and re-edit the Zone to update this list",
	"category":"Zone Extension",
	"type":"ComboBox",
	"value":"{$BasicValue=extension.name}",
	"trigger":true,
	"triggerData":{$List=extClasses, instance=extensionsHelper, fields=name;type;classesString},
	"dataProvider":"{$ListToString=extNames, instance=extensionsHelper}"
},

// TYPE
{
	"name":"extension.type",
	"label":"Type",
	"tooltip":"If 'JAVA' is selected, all jar files contained in the Extension's folder are processed, provided their name ends with 'Extension.jar' (for example 'MyExtension.jar'); this is required to avoid receiving useless data on the Admin Tool (like the list of classes contained in library jar files)\n\n<b>NOTE</b>: 'PYTHON' Extension type can be useful for fast testing and prototyping, but it is NOT RECOMMENDED for production environments (due to performance limitations)",
	"category":"Zone Extension",
	"type":"ComboBox",
	"value":"{$BasicValue=extension.type}",
	"trigger":true,
	"dataProvider":"JAVA,JAVASCRIPT,GROOVY,PYTHON"
},

// MAIN CLASS
{
	"name":"extension.file",
	"label":"Main class",
	"tooltip":"The fully qualified name of main Extension class; Java Extensions must extend either SFSExtension or BaseSFSExtension classes",
	"category":"Zone Extension",
	"type":"ComboBox",
	"value":"{$BasicValue=extension.file}",
	"dataProvider":""
},

// USE NAMING CONVENTION
{
	"name":"extension.filterClass",
	"label":"Use naming convention",
	"tooltip":"Filter the 'Main class' box showing the classes with names ending with the word 'Extension' only (for example 'com.example.MyJavaExtension' or 'MyPythonExtension.py')\n\n<b>NOTE</b>: this setting is used to improve the Admin Tool usage only, so it doesn't affect the server configuration in any way",
	"category":"Zone Extension",
	"type":"CheckBox",
	"value":false,
	"trigger":true,
	"clientOnly":true
},

// PROPERTIES FILE
{
	"name":"extension.propertiesFile",
	"label":"Properties file",
	"tooltip":"The name of a properties file that will be loaded during the initialization of the Extension; by default a 'config.properties' file is loaded, if existing",
	"category":"Zone Extension",
	"type":"TextInput",
	"value":"{$BasicValue=extension.propertiesFile}"
},

// RELOAD MODE
{
	"name":"extension.reloadMode",
	"label":"Reload mode",
	"tooltip":"Determine which mode will be used for Extension reloading; 'AUTO' is recommended for development/testing environments, 'MANUAL' or 'NONE' for production environments",
	"category":"Zone Extension",
	"type":"ComboBox",
	"value":"{$BasicValue=extension.reloadMode}",
	"dataProvider":"AUTO,MANUAL,NONE"
},

//-------------------------------------------
// DATABASE MANAGER
//-------------------------------------------

// ACTIVE DB MANAGER
{
	"name":"databaseManager.active",
	"label":"Activate",
	"tooltip":"Enable/disable the database manager",
	"category":"Database Manager",
	"type":"CheckBox",
	"value":{$BasicValue=databaseManager.active}
},

// DRIVER NAME
{
	"name":"databaseManager.driverName",
	"label":"Database driver class",
	"tooltip":"The fully qualified name of the database driver class; the driver jar should be added to the 'extensions/_shared/' folder",
	"category":"Database Manager",
	"type":"TextInput",
	"value":"{$BasicValue=databaseManager.driverName}"
},

// CONNECTION STRING
{
	"name":"databaseManager.connectionString",
	"label":"Connection string",
	"tooltip":"A valid connection string including connection type, address, port and database name. Example using MySQL: jdbc:mysql://<ipAddress>:<port>/<databaseName>",
	"category":"Database Manager",
	"type":"TextInput",
	"value":"{$BasicValue=databaseManager.connectionString}"
},

// USERNAME
{
	"name":"databaseManager.userName",
	"label":"Username",
	"tooltip":"A valid username for the database connection",
	"category":"Database Manager",
	"type":"TextInput",
	"value":"{$BasicValue=databaseManager.userName}"
},

// PASSWORD
{
	"name":"databaseManager.password",
	"label":"Password",
	"tooltip":"The password corresponding to the above username for the database connection",
	"category":"Database Manager",
	"type":"TextInput",
	"value":"{$BasicValue=databaseManager.pwdPlaceholder}",
	"attributes":
	{
		"type":"password"
	}
},

// TEST SQL
{
	"name":"databaseManager.testSql",
	"label":"Test SQL",
	"tooltip":"A simple SQL statement used to test a new connection. JDBC 4+ compliant drivers should not use this. Leave empty in such case.",
	"category":"Database Manager",
	"type":"TextInput",
	"value":"{$BasicValue=databaseManager.testSql}"
},

// MAX ACTIVE CONNECTIONS
{
	"name":"databaseManager.maxActiveConnections",
	"label":"Maximum # of active connections",
	"tooltip":"The maximum amount of active connections in the connection pool",
	"category":"Database Manager",
	"type":"NumericStepper",
	"value":{$BasicValue=databaseManager.maxActiveConnections},
	"attributes":
	{
		"minimum":1,
		"maximum":100
	}
},

// KEEP ALIVE MINUTES
{
	"name":"databaseManager.keepAliveMinutes",
	"label":"Interval for keep-alive signal",
	"tooltip":"A keep-alive machanism to avoid pooled connections being kicked by the DB Server",
	"category":"Database Manager",
	"type":"NumericStepper",
	"value":{$BasicValue=databaseManager.keepAliveMinutes},
	"attributes":
	{
		"minimum":0,
		"maximum":30
	}
},


//-------------------------------------------
// BUDDY LIST
//-------------------------------------------

// ACTIVE BUDDY LIST
{
	"name":"buddyList.active",
	"label":"Activate",
	"tooltip":"Enable/disable the Buddy List features",
	"category":"Buddy List",
	"type":"CheckBox",
	"value":{$BasicValue=buddyList.active}
},

// MAX BUDDIES PER LIST
{
	"name":"buddyList.maxItemsPerList",
	"label":"Maximum # of buddies per user",
	"tooltip":"The maximum number of buddies that a Buddy List can contain",
	"category":"Buddy List",
	"type":"NumericStepper",
	"value":{$BasicValue=buddyList.maxItemsPerList},
	"attributes":
	{
		"minimum":1,
		"maximum":2147483647
	}
},

// MAX BUDDY VARIABLES
{
	"name":"buddyList.maxBuddyVariables",
	"label":"Maximum # of Buddy Variables",
	"tooltip":"The maximum number of Buddy Variables that each user can set; recommended value is in the 10 to 15 range",
	"category":"Buddy List",
	"type":"NumericStepper",
	"value":{$BasicValue=buddyList.maxBuddyVariables},
	"attributes":
	{
		"minimum":0,
		"maximum":2147483647
	}
},

// ALLOW OFFLINE BUDDY VARIABLES
{
	"name":"buddyList.allowOfflineBuddyVariables",
	"label":"Allow offline Buddy Variables",
	"tooltip":"Offline Buddy Variables are persistent and available to buddies at any time, even when the buddies are offline",
	"category":"Buddy List",
	"type":"CheckBox",
	"value":{$BasicValue=buddyList.allowOfflineBuddyVariables}
},

// OFFLINE BUDDY VARIABLES CACHE SIZE
{
	"name":"buddyList.offlineBuddyVariablesCacheSize",
	"label":"Offline Buddy Variables cache size",
	"tooltip":"The size of the cache used for Buddy Variables. Suggested range (200-2000)",
	"category":"Buddy List",
	"type":"NumericStepper",
	"value":{$BasicValue=buddyList.offlineBuddyVariablesCacheSize},
	"attributes":
	{
		"minimum":0,
		"maximum":2147483647
	}
},

// CUSTOM STORAGE CLASS
{
	"name":"buddyList.customStorageClass",
	"label":"Custom Buddy List storage class",
	"tooltip":"The fully qualified name of the class providing buddy storage services",
	"category":"Buddy List",
	"type":"TextInput",
	"value":"{$BasicValue=buddyList.customStorageClass}",
	"attributes":
	{
		"pattern":"[a-zA-Z0-9._]+"
	}
},

// BUDDY STATES
{
	"name":"buddyList.buddyStates",
	"label":"Custom states",
	"tooltip":"Specify a list of custom instant messenger-like states",
	"category":"Buddy List",
	"type":"DataGrid",
	"defaultListItem":
	[
		{
			"name":"state",
			"label":"State",
			"tooltip":"Buddy state name",
			"type":"TextInput",
			"value":"",
			"validator":"notNull"
		}
	],
	"listValues":{$List=buddyStates, instance=buddyList, createField=state}
},

// USE TEMPORARY BUDDIES
{
	"name":"buddyList.useTempBuddies",
	"label":"Allow temporary buddies",
	"tooltip":"Allow temporary buddies to be used",
	"category":"Buddy List",
	"type":"CheckBox",
	"value":{$BasicValue=buddyList.useTempBuddies}
},

// ENABLE BAD WORDS FILTER
{
	"name":"buddyList.badWordsFilter.isActive",
	"label":"Enable bad words filter",
	"tooltip":"Enable bad words filter on buddy messages",
	"category":"Buddy List",
	"type":"CheckBox",
	"value":{$BasicValue=buddyListBadWordsFilter.isActive}
},

//-------------------------------------------
// PRIVILEGE MANAGER
//-------------------------------------------

// ACTIVE PRIVILEGE MANAGER
{
	"name":"privilegeManager.active",
	"label":"Activate",
	"tooltip":"Enable/disable the Privilege Management features",
	"category":"Privilege Manager",
	"type":"CheckBox",
	"value":{$BasicValue=privilegeManager.active}
},

// PROFILES
{
	"name":"privilegeManager.profiles",
	"label":"Profiles",
	"tooltip":"A list of privilege profiles. Each profile can provide a list of denied requests",
	"category":"Privilege Manager",
	"type":"DataGrid",
	"defaultListItem":
	[
		{
			"name":"intId",
			"label":"ID",
			"tooltip":"Profile's ID",
			"type":"NumericStepper",
			"value":-1,
			"validator":"posNum",
			"attributes":
			{
				"minimum":-1,
				"maximum":65535
			}
		},
		{
			"name":"name",
			"label":"Name",
			"tooltip":"Profile's name",
			"type":"TextInput",
			"value":"",
			"validator":"notNull"
		},
		{
			"name":"deniedRequestsString",
			"label":"Denied requests",
			"tooltip":"A list of the requests that are denied for the current user profile",
			"type":"DualList",
			"value":"",
			"dataProvider":"{$BasicValue=zoneSettings.deniableRequests}"
		},
		{
			"name":"permissionFlagsString",
			"label":"Permission flags",
			"tooltip":"Specify special permissions for the current user profile",
			"type":"DualList",
			"value":"",
			"dataProvider":"{$EnumToString=com.smartfoxserver.security.SystemPermission}"
		}
	],
	"listValues":{$List=profiles, instance=privilegeManager, fields=intId;name;deniedRequestsString;permissionFlagsString},
	"clazz":"ZoneSettings$PermissionProfile"
}