feedback(_Concept) :-
	chat_usr(['', '']),
	( user_level(_User_level) ->
		feedback(_Concept, _User_level)
	;
		feedback(_Concept, novice)
	)
	; true.

focus_concept(_Concept, _Sub_concept):-
	focus(_Concept, _Sub_concept).	%% already focussed on this
focus_concept(_Concept, _Sub_concept):-
	defocus_concept(_Concept),	%% defocus any sibling meta_cpt
	focus_usr(_Sub_concept),	%% enable input, flag as currently
	assert(focus(_Concept, _Sub_concept)),  %%    available for input
	( called(_Sub_concept)		%% has been addressed before
	;
	  assert(called(_Sub_concept)),
	  load_concept(_Sub_concept)
	).

defocus_concept(_Concept):-
	( focus(_Concept, _Sub_concept) ->
		defocus_concept(_Sub_concept),
		unfocus_usr(_Sub_concept),
		retract(focus(_Concept, _Sub_concept))
	;
		true
	).

load_concept(_Concept):-
	name(_Concept, _C_str),   	 %% load handler for meta-concept
	get_env_var('IFE_HOME', _Ife_Home),
	name(_Ife_Home, _Str1),
	append(_Str1, "lib/uc/uc/kbs/", _Str2),
	append(_Str2, _C_str, _Str3),
	name(_MC_fname, _Str3),
	[-_MC_fname].

clear_buttons(_Concept) :-
	( retract(button_state(_Concept, _Old_Button))
	;
	  true
	).

clear_buttons(_Concept, _New_Button) :-
	( button_state(_Concept, _Old_Button) ->
		tell_usr(_Old_Button, off),
		retract(button_state(_Concept, _Old_Button))
	  ;
		true
	),
	assert(button_state(_Concept, _New_Button)).

button(_Concept, _State):-		%% turn on/off button; b_ prefix
	name(_Concept, _SC_str),
	append("b_", _SC_str, _SC_str2),
	name(_Concept_butn, _SC_str2),
	tell_usr(_Concept_butn, _State).



tell_usr(_Concept, _Keys, _Value) :-
	to_bb(user_dialog, tell_user,_Concept, _Keys, _Value).
tell_usr(_Concept, _Value) :-
	to_bb(user_dialog, tell_user,_Concept, _Value).
ask_usr(_Concept) :-
	to_bb(user_dialog, ask_user, _Concept).
ask_usr(_Concept, _Default) :-
	to_bb(user_dialog, ask_user, _Concept, _Default).
ask_usr(_Concept, _Keys, _Default) :-
	to_bb(user_dialog, ask_user, _Concept, _Keys, _Default).
unask_usr(_Concept) :-
	to_bb(user_dialog, unask_user, _Concept).
unask_usr(_Concept, _Keys) :-
	to_bb(user_dialog, unask_user, _Concept, _Keys).
focus_usr(_Concept) :-
	to_bb(user_dialog, focus_user,_Concept).
unfocus_usr(_Concept) :-
	to_bb(user_dialog, unfocus_user,_Concept).
defocus_usr(_Concept) :-
	to_bb(user_dialog, defocus_user,_Concept).
offer_usr(_Concept, _Values) :-
	to_bb(user_dialog, offer_user, _Concept, _Values).
offer_usr(_Concept, _Keys, _Values) :-
	to_bb(user_dialog, offer_user, _Concept, _Keys, _Values).
suggest_usr(_Concept, _Value) :-
	to_bb(user_dialog, suggest_user, _Concept, _Value).
suggest_usr(_Concept, _Keys, _Value) :-
	to_bb(user_dialog, suggest_user, _Concept, _Keys, _Value).
new_dialogue(_Type, _Cmd) :-
	to_bb(user_dialog, new_dialog, _Type, _Cmd).

to_bb(_A, _B, _C, _D, _E) :-	% eg u_cpt concept keys args who_set
	to_bb(_A), csep,
	to_bb(_B, _C, _D, _E).
to_bb(_A, _B, _C, _D) :-	% eg user_dialog tell_usr concept value
	to_bb(_A), csep,
	to_bb(_B, _C, _D).
to_bb(_A, _B, _C) :-		% eg user_dialog ask_usr cpt
	to_bb(_A), csep,	% or notify_me area id_string
	to_bb(_B, _C).
to_bb(_A, _B) :-		% eg mk_area area
	to_bb(_A), csep,
	to_bb(_B), nl, ttyflush.
to_bb([_Head]) :-
	!, writeline(_Head).
to_bb([_Head|_Tail]) :-
	!, to_bb(_Head), ksep,
	to_bb(_Tail).
to_bb([]) :-
	!.
to_bb(_Arg) :-
	!, write(_Arg).

chat_usr(['']):-				% text separator on its own
	chat_usr([]).
chat_usr(_Text):-
	write('user_dialog'), csep,
	write('chat_user'), csep,
	writetext(_Text).
writetext([_Head]) :-
	writeline(_Head), nl.
writetext([_Head|_Tail]) :-
	writeline(_Head), tsep,
	writetext(_Tail).
writetext([]) :-
	tsep, nl.
writetext(_Arg) :-
	write(_Arg), nl.
writeline([_Head|_Tail]) :-
	writeline(_Head),
	writeline(_Tail).
writeline([_Head]) :-
	writeline(_Head).
writeline([]).
writeline(_Arg) :-
	write(_Arg).

csep :-					% bb's concept separator
	write('	').			%% 	= \t
ksep :-					% bb's concept key separator
	write('	').			%% 	= \t
tsep :-					% bb's text separator
	write('\n').			%% 	= '\n'


uset(_Concept, _Value) :-		/* user set concept value */
	nonvar(_Concept),
	set(u_cpt, _Concept, user_set, nokey, _Value).
uset(_Concept, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys),
	set(u_cpt, _Concept, user_set, _Keys, _Value).
kset(_Concept, _Value) :-	    /*knowledge handler set concept value*/
	nonvar(_Concept),
	( known(_Concept, nokey, _Value, user_set)
	;	set(u_cpt, _Concept, kb_set, nokey, _Value)
	).
kset(_Concept, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys),
	( known(_Concept, _Keys, _Value, user_set)
	;	set(u_cpt, _Concept, kb_set, _Keys, _Value)
	).

set(_Area, _Concept, _Who_set, _Keys, _Value) :-
	_Old_Term =.. [_Area, _Concept, _, _Keys, _],  %%%% hold locally ??
	( retract(_Old_Term) ; true ),
	_Term =.. [_Area, _Concept, _Who_set, _Keys, _Value],
	assert(_Term),
	to_bb(_Area, _Concept, _Who_set, _Keys, _Value).



known(_Concept, _Value) :-
	nonvar(_Concept), var(_Value),
	query(u_cpt, _Concept, _, nokey, _Value).
known(_Concept, _Key, _Value) :-
	nonvar(_Concept), nonvar(_Key), var(_Value),
	query(u_cpt, _Concept, _, _Key, _Value).
knownw(_Concept, _Who_set, _Value) :-
	nonvar(_Concept), var(_Value),
	query(u_cpt, _Concept, _Who_set, nokey, _Value).
knownw(_Concept, _Who_set, _Key, _Value) :-
	nonvar(_Concept), nonvar(_Key), var(_Value),
	query(u_cpt, _Concept, _Who_set, _Key, _Value).
query(_Area, _Concept, _Who_set, _Key, _Value) :-
	_Term =.. [_Area, _Concept, _Who_set, _Key, _Value],  % check locally
	_Term.
/*known(_Area, _Concept, _Who_set, _Key, _Value) :- %%%% held locally for now
 *	write(query), write('	'),
 *	write(_Area), write('	'),
 *	to_bb(_Concept, '?', '?', '?'),
 *	read_ans(_Concept, _Who_set, _Key, _Value),
 *	_Value \== '?'.
 */


u_cpt_got(_Concept, _Value) :-		/* someone else setting values */
	%%%%% take appropriate action!!!!!
	true.


quitrqst :-					/* user said quit */
	to_bb(quitrqst, kb-uc),
	halt.
quitrqst(_) :-
	to_bb(quitrqst, kb-uc),
	halt.
quitrqst(_,_) :-
	to_bb(quitrqst, kb-uc),
	halt.

	
