XB	; IHS/ADC/GTH - UTILITY MENU ; [ 04/28/2003  9:38 AM ]
	;;4.0;XB;;Jul 20, 2009;Build 2
	;
	; SEE ROUTINE XB1 FOR FURTHER DOCUMENTATION AND THE MENU
	; OPTIONS.
	;
	; This routine lists available utilities in the form of a
	; menu with a brief description of what the utility does.
	; New utilities may be added to this routine by adding the
	; appropriate ";;" entries to the bottom of routine XB1.
	;
START	;
	I '$D(^%ZOSF("TEST"))!('$D(^%ZOSF("TRAP"))) W !!,"Missing ^%ZOSF nodes!",! Q
	S X="%ZIS"
	D RCHK
	I XBFAIL D EOJ Q
	D ^XBKSET
	S X="XBRPTL"
	D RCHK
	S:XBFAIL XBNH=""
	S XBLBL="M",XBQ=0
	F  D MENU Q:XBQ
	D EOJ
	Q
	;
MENU	;
	D LIST
	W !!,"Choose: "
	R XBY:$G(DTIME,999)
	S:XBY="^" XBY=""
	I XBY["?" D HELP Q
	I XBY="" S XBQ=1 Q
	I XBY'=+XBY D LETTERS
	I XBY'<1,XBY'>(XBI-1) D OPTION D:XBP="P" PAUSE S XBP="" Q
	W *7
	Q
	;
HELP	;
	I XBY="?" D  Q
	. S XBH=""
	. D LIST
	. KILL XBH
	. W !!,"To get help on a non-menu option enter '?n' where n is the option number.",!
	. D PAUSE
	.Q
	I XBY?1"?"1N.N S XBY=$P(XBY,"?",2) I XBY,XBY'>(XBI-1) D  D PAUSE Q
	. I $D(XBNH) W !!,"No help available.  Routine ^XBRPTL not in UCI.",! Q
	. KILL ^UTILITY($J)
	. S XBX=$P($T(@XBLBL+XBY^XB1),";;",3)
	. I XBX W !!,"No help available for menus." Q
	. I XBX?1"!".E W !!,"No help available for executable code :",!,"[",$E(XBX,2,99),"]." Q
	. S XBX=$P(XBX,"^",2),X=XBX
	. D RCHK
	. I XBFAIL W !!,"No help available.  Routine ^",XBX," not in ",$S($E(XBX)="%":"MGR",1:"UCI"),".",! Q
	. S %=$$RSEL^ZIBRSEL(XBX,"^UTILITY($J,")
	. D EN^XBRPTL
	. KILL ^UTILITY($J)
	.Q
	W *7
	Q
	;
LIST	; List menu options.
	KILL XBTBL
	;W !!?5,$P($T(XB+1),";",4)," v ",$$CV^XBFUNC("XB");IHS/SET/GTH XB*3*9 10/29/2002
	W !!?5,$P($T(XB+1),";",4)," v ",$$VERSION^XPDUTL("XB") ;IHS/SET/GTH XB*3*9 10/29/2002
	W !!?5,$P($T(@XBLBL^XB1),";;",2),!
	F XBI=1:1 S XBX=$T(@XBLBL+XBI^XB1) Q:$E(XBX)'=" "  S XBY=$P(XBX,";;",3),XBX=$P(XBX,";;",2) D
	. S X=$$UP^XLFSTR(XBX)
	. S XBTBL(X)=XBI_"^"_XBX
	. W !,XBI,?5,XBX,"    ",$S($D(XBH):$S(XBY:"[menu]",1:XBY),1:$S(XBY:"[menu]",1:""))
	.Q
	Q
	;
LETTERS	;
	KILL XBC
	S XBY=$$UP^XLFSTR(XBY)
	I $D(XBTBL(XBY)) S XBY=XBTBL(XBY) Q
	S XBC=0,X=XBY
	F  S X=$O(XBTBL(X)) Q:X=""!($E(X,1,$L(XBY))'=XBY)  S XBC=XBC+1,XBC(XBC)=+XBTBL(X)_"^"_$P(XBTBL(X),"^",2)
	W !
	I XBC=0 S XBY=0 Q
	I XBC=1 S XBY=$P(XBC(1),"^",1) Q
	F I=1:1:XBC W !,I,"  ",$P(XBC(I),"^",2)
	W !!,"Which one? "
	R XBY:$G(DTIME,999)
	I XBY]"",$D(XBC(XBY)) W " ",$P(XBC(XBY),"^",2) S XBY=$P(XBC(XBY),"^",1) Q
	W *7
	S XBY=0
	Q
	;
OPTION	;
	S XBX=$T(@XBLBL+XBY^XB1),XBP=$P(XBX,";;",4),XBX=$P(XBX,";;",3)
	I XBX D RECURSE Q
	W !
	I XBX?1"!".E S XBX=$E(XBX,2,250)
	E  S X=$P(XBX,"^",2),XBX="D "_XBX D RCHK I XBFAIL W "Routine ",X," not in ",$S($E(X)="%":"MGR!",1:"UCI!") Q
	S X="TRAP^XB",@^%ZOSF("TRAP")
	; D ^XBNEW("CALL^XB:XBX;DT;DTIME;U;DUZ") ;IHS/SET/GTH XB*3*9 10/29/2002
	D EN^XBNEW("CALL^XB","XBX;DT;DTIME;U;DUZ") ;IHS/SET/GTH XB*3*9 10/29/2002
	Q
	;
CALL	;
	S IOP=$I
	D ^%ZIS
	X XBX
	U 0
	Q
	;
RECURSE	;
	I $L(XBLBL)>6 W !,"Maximum menu depth exceeded." S XBQ=1 Q
	S XBLBL=XBLBL_XBX
	W !
	F  D MENU Q:XBQ
	S XBQ=0,XBLBL=$E(XBLBL,1,$L(XBLBL)-1)
	W !
	Q
	;
TRAP	; ERROR TRAP
	W !!,"The following error has occurred: ",$$Z^ZIBNSSV("ERROR"),!
	D:XBP="" PAUSE
	Q
	;
PAUSE	;EP
	Q:'(IO=IO(0))
	Q:'($E(IOST,1,2)="C-")
	S Y=$$DIR^XBDIR("EO")
	S:$D(DUOUT) XBQ=1
	Q
	;
CHECK	; CHECK XB OPTION ROUTINES (EXECUTED FROM ^XB MENU OPTION)
	W !,"Patch ",$$PATS," is the highest XB/ZIB patch installed." ;IHS/SET/GTH XB*3*9 10/29/2002
	F XBII=1:1 S X=$T(M+XBII^XB1) Q:X=""  I $P(X,";;",1)=" " S X=$P(X,";;",3) I X'=+X,X'?1"!".E D
	. I X'?.8UN1"^"1.8UN,X'?.8UN1"^"1"%"1.7UN S XBII(4,XBII)=$P($T(M+XBII^XB1),";;",2,9) Q
	. S X=$P(X,"^",2)
	. D RCHK
	. I XBFAIL S XBII($S($E(X)'="%":1,$E(X,2,4)="ZIB":2,1:3),X)=""
	.Q
	I '$O(XBII(0)) W !,"All options seem to be ok.",! KILL XBII Q
	I $D(XBII(1)) W !,"The following routines are not in this UCI:" S X="" F  S X=$O(XBII(1,X)) Q:X=""  W !?3,X
	I $D(XBII(2)) W !,"The following ZIB* routines must be moved to MGR as % routines:" S X="" F  S X=$O(XBII(2,X)) Q:X=""  W !?3,X
	I $D(XBII(3)) W !,"The following % routines are not in ",$S($$VERSION^%ZOSF(1)["Cache":"this Namespace",1:"MGR"),":" S X="" F  S X=$O(XBII(3,X)) Q:X=""  W !?3,X ;IHS/SET/GTH XB*3*9 10/29/2002
	I $D(XBII(4)) W !,"The following options have invalid routine names:" S X="" F  S X=$O(XBII(4,X)) Q:X=""  W !?3,XBII(4,X)
	W !
	KILL XBII
	Q
	;
RCHK	;EP - Check Existence of Routine in X
	S XBRTN=X,XUSLNT=1
	; I $E(XBRTN)="%" X ^%ZOSF("UCI") S XBUCI=Y,%UCI="MGR" D 2^%XUCI ; IHS/SET/GTH XB*3*9 10/29/2002
	I ^%ZOSF("OS")["MSM",$E(XBRTN)="%" X ^%ZOSF("UCI") S XBUCI=Y,%UCI="MGR" D 2^%XUCI ; IHS/SET/GTH XB*3*9 10/29/2002
	S X=XBRTN
	X ^%ZOSF("TEST")
	S XBFAIL='$T
	; I $E(XBRTN)="%" S %UCI=XBUCI D 2^%XUCI ; IHS/SET/GTH XB*3*9 10/29/2002
	I ^%ZOSF("OS")["MSM",$E(XBRTN)="%" S %UCI=XBUCI D 2^%XUCI ; IHS/SET/GTH XB*3*9 10/29/2002
	W:XBFAIL !!,"Routine ",XBRTN," missing!"
	S X=XBRTN
	KILL XUSLNT
	Q
	;
EOJ	;
	D ^XBKTMP,EN^XBVK("XB")
	KILL ^UTILITY($J)
	KILL DIRUT,DTOUT,DUOUT
	KILL X,Y
	Q
	;
OSNO	;EP
	W $C(7),!,"Sorry...",!,"Operating System '",$P(^%ZOSF("OS"),"^",1),"' is not supported."
	I $$DIR^XBDIR("EO","Press RETURN") ;IHS/SET/GTH XB*3*9 10/29/2002
	Q
	;
	;Begin New Code;IHS/SET/GTH XB*3*9 10/29/2002
PATS()	;Display patches installed for XB.    
	NEW I,P,V
	S I=$O(^DIC(9.4,"C","XB",0))
	Q:'I "??"
	S V=$O(^DIC(9.4,I,22,"B",$P($T(+2),";",3),0))
	Q:'V "??"
	S P=0
	F %=0:0 S %=$O(^DIC(9.4,I,22,V,"PAH",%)) Q:'%  I $P(^(%,0),"^",1)>P S P=$P(^(0),"^",1)
	Q P
	;End New Code;IHS/SET/GTH XB*3*9 10/29/2002
