enum PUPPET_CONTROL {
	mode,
	cx,
	cy,
	fx,
	fy,
	width,
	height
}

enum PUPPET_FORCE_MODE {
	move,
	wind,
}

function controlPointBox(_onModify) : widget() constructor {
	onModify = _onModify;
	onSurfaceSize = -1;
	
	tbCx = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.cx,     toNumber(val)); });
	tbCy = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.cy,     toNumber(val)); });
	tbFx = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.fx,     toNumber(val)); });
	tbFy = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.fy,     toNumber(val)); });
	tbW  = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.width,  max(0, toNumber(val))); });
	tbH  = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(PUPPET_CONTROL.height, max(0, toNumber(val))); });
	rot  = new rotator(function(val) { return onModify(PUPPET_CONTROL.fy, toNumber(val)); });
	tbFx.slidable = true;
	tbFy.slidable = true;
	tbW.slidable = true;
	tbH.slidable = true;
	
	sW   = new slider(0, 32, 0.1, function(val) { onModify(PUPPET_CONTROL.width,  toNumber(val)); });
	
	sMode = [
		__txtx("widget_control_point_move", "Move"), 
		__txtx("widget_control_point_wind", "Wind"), 
	];
	
	scMode = new scrollBox(
		sMode, 
		function(val) { onModify(PUPPET_CONTROL.mode, toNumber(val)); }
	);
	
	widgets = [ scMode, tbCx, tbCy, tbFx, tbFy, tbW, tbH, rot ];
	
	static setInteract = function(interactable = noone) { 
		self.interactable = interactable;
		
		for( var i = 0, n = array_length(widgets); i < n; i++ ) 
			widgets[i].setInteract(interactable);
	}
	
	static register = function(parent = noone) {
		for( var i = 0, n = array_length(widgets); i < n; i++ ) 
			widgets[i].register(parent); 
	}
	
	static drawParam = function(params) {
		return draw(params.x, params.y, params.w, params.data, params.m, params.rx, params.ry);
	}
	
	static draw = function(_x, _y, _w, _data, _m, _rx, _ry) {
		x = _x;
		y = _y;
		
		var _mode = array_safe_get(_data, PUPPET_CONTROL.mode);
		var _cx   = array_safe_get(_data, PUPPET_CONTROL.cx);
		var _cy   = array_safe_get(_data, PUPPET_CONTROL.cy);
		var _fx   = array_safe_get(_data, PUPPET_CONTROL.fx);
		var _fy   = array_safe_get(_data, PUPPET_CONTROL.fy);
		var _wid  = array_safe_get(_data, PUPPET_CONTROL.width);
		
		if(is_array(_mode) || is_array(_cx) || is_array(_cy) || is_array(_fx) || is_array(_fy) || is_array(_wid))
			return 0;
		
		for( var i = 0, n = array_length(widgets); i < n; i++ )
			widgets[i].setFocusHover(active, hover);
		
		var yy = _y;
		
		scMode.draw(_x, yy, _w, TEXTBOX_HEIGHT, sMode[_mode], _m, _rx, _ry);
		yy += TEXTBOX_HEIGHT + ui(8);
		
		var lw = ui(80);
		var w  = _w / 2 - lw;
		
		draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
		draw_text(_x,					yy + ui(17), "cx");
		draw_text(_x + _w / 2 + ui(10), yy + ui(17), "cy");
		tbCx.draw(_x + lw,				yy, w, TEXTBOX_HEIGHT, _cx, _m);
		tbCy.draw(_x + _w / 2 + lw,		yy, w, TEXTBOX_HEIGHT, _cy, _m);
		yy += TEXTBOX_HEIGHT + ui(8);
		
		switch(_mode) {
			case PUPPET_FORCE_MODE.move: 
				draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
				draw_text(_x,					yy + ui(17), "fx");
				draw_text(_x + _w / 2 + ui(10), yy + ui(17), "fy");
				tbFx.draw(_x + lw,				yy, w, TEXTBOX_HEIGHT, _fx, _m);
				tbFy.draw(_x + _w / 2 + lw,		yy, w, TEXTBOX_HEIGHT, _fy, _m);
				yy += TEXTBOX_HEIGHT + ui(8);
		
				draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
				draw_text(_x, yy + ui(17), __txt("radius"));
				sW.draw(_x + lw, yy, _w - lw, TEXTBOX_HEIGHT, _wid, _m);
				yy += TEXTBOX_HEIGHT + ui(8);
				break;
			case PUPPET_FORCE_MODE.wind: 
				draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
				draw_text(_x, yy + ui(17), __txt("strength"));
				tbFx.draw(_x + lw, yy, _w - lw, TEXTBOX_HEIGHT, _fx, _m);
				yy += TEXTBOX_HEIGHT + ui(8);
				
				draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
				draw_text(_x, yy + ui(17), __txt("width"));
				tbW.draw(_x + lw, yy, _w - lw, TEXTBOX_HEIGHT, _wid, _m);
				yy += TEXTBOX_HEIGHT + ui(8);
				
				var _rh = rot.draw(_x, yy, _w, _fy, _m);
				yy += _rh + ui(8);
				break;
		}
		
		resetFocus();
		return yy - _y;
	}
}