(function(){
	let MenuTpl =
		'
' +
		''
	;
	window.ESX_MENU = {};
	ESX_MENU.ResourceName = 'menu_default';
	ESX_MENU.opened = {};
	ESX_MENU.focus = [];
	ESX_MENU.pos = {};
	ESX_MENU.open = function(namespace, name, data) {
		if (typeof ESX_MENU.opened[namespace] == 'undefined') {
			ESX_MENU.opened[namespace] = {};
		}
		if (typeof ESX_MENU.opened[namespace][name] != 'undefined') {
			ESX_MENU.close(namespace, name);
		}
		if (typeof ESX_MENU.pos[namespace] == 'undefined') {
			ESX_MENU.pos[namespace] = {};
		}
		for (let i=0; i {
		switch (data.action) {
			case 'openMenu': {
				ESX_MENU.open(data.namespace, data.name, data.data);
				break;
			}
			case 'closeMenu': {
				ESX_MENU.close(data.namespace, data.name);
				break;
			}
			case 'controlPressed': {
				switch (data.control) {
					case 'ENTER': {
						let focused = ESX_MENU.getFocused();
						if (typeof focused != 'undefined') {
							let menu = ESX_MENU.opened[focused.namespace][focused.name];
							let pos = ESX_MENU.pos[focused.namespace][focused.name];
							let elem = menu.elements[pos];
							if (menu.elements.length > 0) {
								ESX_MENU.submit(focused.namespace, focused.name, elem);
							}
						}
						break;
					}
					case 'BACKSPACE': {
						let focused = ESX_MENU.getFocused();
						if (typeof focused != 'undefined') {
							ESX_MENU.cancel(focused.namespace, focused.name);
						}
						break;
					}
					case 'TOP': {
						let focused = ESX_MENU.getFocused();
						if (typeof focused != 'undefined') {
							let menu = ESX_MENU.opened[focused.namespace][focused.name];
							let pos = ESX_MENU.pos[focused.namespace][focused.name];
							if (pos > 0) {
								ESX_MENU.pos[focused.namespace][focused.name]--;
							} else {
								ESX_MENU.pos[focused.namespace][focused.name] = menu.elements.length - 1;
							}
							let elem = menu.elements[ESX_MENU.pos[focused.namespace][focused.name]];
							for (let i=0; i min) {
										elem.value--;
										ESX_MENU.change(focused.namespace, focused.name, elem);
									}
									ESX_MENU.render();
									break;
								}
								default: break;
							}
							$('#menu_' + focused.namespace + '_' + focused.name).find('.menu-item.selected')[0].scrollIntoView();
						}
						break;
					}
					case 'RIGHT': {
						let focused = ESX_MENU.getFocused();
						if (typeof focused != 'undefined') {
							let menu = ESX_MENU.opened[focused.namespace][focused.name];
							let pos = ESX_MENU.pos[focused.namespace][focused.name];
							let elem = menu.elements[pos];
							switch(elem.type) {
								case 'default': break;
								case 'slider': {
									if (typeof elem.options != 'undefined' && elem.value < elem.options.length - 1) {
										elem.value++;
										ESX_MENU.change(focused.namespace, focused.name, elem);
									}
									if (typeof elem.max != 'undefined' && elem.value < elem.max) {
										elem.value++;
										ESX_MENU.change(focused.namespace, focused.name, elem);
									}
									ESX_MENU.render();
									break;
								}
								default: break;
							}
							$('#menu_' + focused.namespace + '_' + focused.name).find('.menu-item.selected')[0].scrollIntoView();
						}
						break;
					}
					default: break;
				}
				break;
			}
		}
	};
	window.onload = function(e){
		window.addEventListener('message', (event) => {
			onData(event.data);
		});
	};
})();