PXRMEXLD ;SLC/PJH - Reminder Dialog Exchange Main Routine. ;7/01/2004
 ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21
 ;
 ;=====================================================================
START N PXRMBG,PXRMMODE,VALMBCK,VALMBG,VALMCNT,VALMSG,X,XMZ
 S X="IORESET"
 D EN^VALM("PXRM EX LIST DIALOG")
 ;
 ;Rebuild Display
 D CDISP^PXRMEXLC(PXRMRIEN)
 Q
 ;
ENTRY D FIND Q
 ;
DETAIL S PXRMMODE=0 D DISP(PXRMMODE) Q
 ;
 ;Display Findings
 ;--------------------------
FIND S PXRMMODE=2 D DISP(PXRMMODE) Q
 ;
 ;Display Dialog Summary
 ;----------------------
SUM S PXRMMODE=3 D DISP(PXRMMODE) Q
 ;
 ;Display Dialog Usage
 ;--------------------
USE S PXRMMODE=4 D DISP(PXRMMODE) Q
 ;
 ;Display Dialog Text
 ;-------------------
TEXT S PXRMMODE=1 D DISP(PXRMMODE) Q
 ;
EXIT K ^TMP("PXRMEXLD",$J) Q
 ;
PEXIT ;PXRM EXCH DIALOG MENU protocol exit code
 S VALMSG="+ Next Screen   - Prev Screen   ?? More Actions"
 ;Reset after page up/down etc
 D XQORM
 Q
 ;
HELP N ORU,ORUPRMT,XQORM,PXRMTAG S PXRMTAG="DLG"
 D EN^VALM("PXRM EX DIALOG HELP")
 Q
 ;
HDR S VALMHDR(1)="Packed reminder dialog: "
 S VALMHDR(1)=VALMHDR(1)_$G(^TMP("PXRMEXTMP",$J,"PXRMDNAM"))
 I $D(^TMP("PXRMEXTMP",$J,"PXRMDNAT")) D
 .S VALMHDR(1)=VALMHDR(1)_" [NATIONAL DIALOG]"
 S VALMHDR("TITLE")=VALMHDR(1)
 S VALMSG="+ Next Screen   - Prev Screen   ?? More Actions"
 Q
 ;
 ;Build list manager workfile from ^TMP("PXRMEXTMP" (see ^PXRMEXLB)
DISP(VIEW) ;
 N OLEV,ODSEQ
 K ^TMP("PXRMEXLD",$J)
 K PXRMEXRP
 K ^TMP($J,"PXRMEXREP")
 N DDATA,DDLG,DEND,DREP,DSTRT,IND,JND,NLINE,NSEL
 S NLINE=0,NSEL=0,VALMBCK="R",VALMCNT=NLINE
 S DDLG=$G(^TMP("PXRMEXTMP",$J,"PXRMDNAM")) Q:DDLG=""
 ;
 ;Save reminder dialog
 S DDATA=^TMP("PXRMEXTMP",$J,"DLOC",DDLG)
 S DSTRT=$P(DDATA,U,1),DEND=$P(DDATA,U,2)
 S IND=$P(DDATA,U,3),JND=$P(DDATA,U,4),DREP=""
 D DLINE(DDLG,"","")
 S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=$J("",79)
 S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ;Process componentS
 D DCMP(DDLG,"")
 ;Process replacement elements
 ;I $D(^TMP("PXRMEXTMP",$J,"DREPL"))>0 D DREPL^PXRMEXLC
 I $D(PXRMEXRP)>0 D DREPL^PXRMEXLC
 ;Change header
 I VIEW=0 D CHGCAP^VALM("HEADER2","Dialog Details")
 I VIEW=1 D CHGCAP^VALM("HEADER2","Dialog Text")
 I VIEW=2 D CHGCAP^VALM("HEADER2","Dialog Findings")
 I VIEW=3 D CHGCAP^VALM("HEADER2","Dialog Summary")
 I VIEW=4 D CHGCAP^VALM("HEADER2","Dialog Usage")
 ;
 S VALMCNT=NLINE,^TMP("PXRMEXLD",$J,"VALMCNT")=VALMCNT,VALMBG=1
 ;
 K ^TMP($J,"PXRMEXREP"),PXRMEXRP
 ;Reset protocol
 D XQORM
 Q
 ;
 ;Update workfile
DLINE(DNAM,LEV,DSEQ) ;
 ;Check if standard PXRM prompt
 N LEVSEQ,TLEV
 N DPXRM S DPXRM=$$PXRM^PXRMEXID(DNAM)
 ;
 ;Ignore PXRM prompts if doing a finding view (DF)
 I VIEW>1,DPXRM Q
 ;
 N DEXIST,DPTX,DTXT,DTYP,EXIST,ITEM,TEMP,SEP
 S ITEM=""
 I DPXRM=0 S NSEL=NSEL+1,ITEM=NSEL
 S NLINE=NLINE+1,SEP=$E(LEV,$L(LEV)),DEXIST=0
 S LEVSEQ=LEV_DSEQ
 S TEMP=$J(ITEM,3)_$J("",4)_LEV_DSEQ
 ;Determine type
 S DTYP=$G(^TMP("PXRMEXTMP",$J,"DTYP",DNAM))
 ;Dialog component display
 I (VIEW'=1) D
 .I $L(TEMP)<13 S TEMP=TEMP_$J("",12+$L(SEP)-$L(TEMP))_$E(DNAM,1,50)
 .E  S TEMP=TEMP_" "_$E(DNAM,1,50)
 I VIEW=1 D
 .I DTYP]"" S DTXT=$G(^TMP("PXRMEXTMP",$J,"DTXT",DNAM))
 .I DTYP="" S DTXT=DNAM
 .I DREP'="" S DTXT=DNAM
 .I $L(TEMP)<13 S TEMP=TEMP_$J("",12+$L(SEP)-$L(TEMP))_$E(DTXT,1,50)
 .E  S TEMP=TEMP_" "_$E(DTXT,1,50)
 ;Check for replacements
 I $D(^TMP("PXRMEXTMP",$J,"DREPL",DNAM))>0 D
 .S TEMP=TEMP_"*"
 .S TLEV=$S($E(LEVSEQ,$L(LEVSEQ))=".":$E(LEVSEQ,1,$L(LEVSEQ)-1),1:LEVSEQ)
 .S PXRMEXRP(DNAM)=""
 .;S ^TMP($J,"PXRMEXREP",TLEV,DNAM)=""
 ;Add Type
 S TEMP=TEMP_$J("",65-$L(TEMP))_DTYP
 ;Exists flag
 I DPXRM=0,$$EXISTS^PXRMEXIU(801.41,DNAM) D
 .S TEMP=TEMP_$J("",75-$L(TEMP))_"X",DEXIST=1
 S ^TMP("PXRMEXLD",$J,NLINE,0)=TEMP
 ;
 ;Set up selection index
 S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)="" Q:DPXRM=1
 ;Store the file number, start and stop line in the exchange file.
 S ^TMP("PXRMEXLD",$J,"SEL",NSEL)=FILENUM_U_DSTRT_U_DEND_U_DEXIST_U_IND_U_JND
 ;Insert additional text lines
 I VIEW=1,DREP="" D
 .N DSUB,DTXT,FILENUM
 .S DSUB=0,FILENUM=8927.1
 .F  S DSUB=$O(^TMP("PXRMEXTMP",$J,"DTXT",DNAM,DSUB)) Q:'DSUB  D
 ..S DTXT=$G(^TMP("PXRMEXTMP",$J,"DTXT",DNAM,DSUB)),NLINE=NLINE+1
 ..S ^TMP("PXRMEXLD",$J,NLINE,0)=$J("",12+$L(SEP))_$E(DTXT,1,50)
 ..S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 .;TIU template changes
 .I $D(PXRMNMCH(FILENUM)),$D(^TMP("PXRMEXTMP",$J,"DTIU",DNAM)) D
 ..N TEMP,TNAM,TNNAM
 ..S TNAM=""
 ..F  S TNAM=$O(^TMP("PXRMEXTMP",$J,"DTIU",DNAM,TNAM)) Q:TNAM=""  D
 ...S TNNAM=$G(PXRMNMCH(FILENUM,TNAM)) Q:TNNAM=""
 ...S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=$J("",79)
 ...S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ...S TEMP=$J("",12+$L(SEP))_"(TIU template "_TNAM_" copied to "_TNNAM_")"
 ...S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=TEMP
 ...S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ...S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=$J("",79)
 ...S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ;Insert finding items
 I VIEW=2,("element;group"[DTYP),DREP="" D
 .N DSUB,FDATA,FILENUM,FLIT,FLONG,FNAME,FOUND,FREP,FTAB,FTYP,TEMP
 .;Findings and additional findings
 .S DSUB=0,FOUND=0
 .F  S DSUB=$O(^TMP("PXRMEXTMP",$J,"DFND",DNAM,DSUB)) Q:'DSUB  D
 ..S FNAME=$G(^TMP("PXRMEXTMP",$J,"DFND",DNAM,DSUB)) Q:FNAME=""
 ..S FDATA=$G(^TMP("PXRMEXFND",$J,FNAME))
 ..S FILENUM=$P(FDATA,U),FTYP=$P(FDATA,U,2) Q:'FILENUM
 ..S FREP=$G(PXRMNMCH(FILENUM,FNAME)) I FREP=FNAME S FREP=""
 ..S NLINE=NLINE+1,EXIST=$$EXISTS^PXRMEXIU(FILENUM,FNAME),FOUND=1
 ..I DSUB=1 S FLIT="Finding: "
 ..I DSUB>1 S FLIT="Add. Finding: "
 ..S FLONG=0 I $L(FLIT_FNAME_" ("_FTYP_")")>60 S FLONG=1
 ..I 'FLONG S FNAME=FLIT_FNAME_" ("_FTYP_")"
 ..I FLONG S FNAME=FLIT_FNAME
 ..S TEMP=$J("",12+$L(SEP))_$E(FNAME,1,60)_$J("",60-$L(FNAME))
 ..I EXIST S TEMP=TEMP_$J("",75-$L(TEMP))_"X"
 ..S ^TMP("PXRMEXLD",$J,NLINE,0)=TEMP
 ..S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ..I FLONG D
 ...S NLINE=NLINE+1
 ...S FTAB=$S(DSUB=1:21,1:26)
 ...S ^TMP("PXRMEXLD",$J,NLINE,0)=$J("",FTAB)_"("_FTYP_")"
 ...S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ..I FREP'="" D
 ...S NLINE=NLINE+1
 ...S FTAB=$S(DSUB=1:21,1:26)
 ...S ^TMP("PXRMEXLD",$J,NLINE,0)=$J("",FTAB)_"(Replaced by "_FREP_")"
 ...S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 .;If no findings
 .I 'FOUND D
 ..S NLINE=NLINE+1
 ..S ^TMP("PXRMEXLD",$J,NLINE,0)=$J("",12+$L(SEP))_"Finding: *NONE*"
 ..S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 ;
 ;Usage screen
 I VIEW=4,DREP="" D
 .N DOTHER,DTXT,DTYPE,OTHER,TYPE
 .D OTHER(DNAM,.DOTHER) Q:'$D(DOTHER)
 .S OTHER=""
 .F  S OTHER=$O(DOTHER(OTHER)) Q:OTHER=""  D
 ..S TYPE=DOTHER(OTHER),NLINE=NLINE+1,DTYPE="REMINDER DIALOG"
 ..I TYPE="G" S DTYPE="DIALOG GROUP"
 ..I TYPE="E" S DTYPE="DIALOG ELEMENT"
 ..S DTXT="USED BY: "_OTHER_" ("_DTYPE_")"
 ..S ^TMP("PXRMEXLD",$J,NLINE,0)=$J("",12+$L(SEP))_DTXT
 ..S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 Q
 ;
 ;Save details of dialog components for display
DCMP(DLG,LEV) ;
 N DDATA,DDLG,DEND,DNAM,DSEQ,DSTRT,IND,JND,LAST,LEVSEQ,NUM
 S DSEQ=0,LAST=0
 F  S DSEQ=$O(^TMP("PXRMEXTMP",$J,"DMAP",DLG,DSEQ)) Q:'DSEQ  D
 .S DDATA=^TMP("PXRMEXTMP",$J,"DMAP",DLG,DSEQ)
 .S DNAM=$P(DDATA,U),DSTRT=$P(DDATA,U,2),DEND=$P(DDATA,U,3) Q:DNAM=""
 .S IND=$P(DDATA,U,4),JND=$P(DDATA,U,5)
 .;Check if this component has been replaced
 .S DREP=$G(PXRMNMCH(FILENUM,DNAM)) I DREP=DNAM S DREP=""
 .;Save line in workfile
 .S NUM=DSEQ
 .;S NUM=$S($G(REPL)["R":"."_DSEQ,1:DSEQ)
 .I +LEV>0,NUM>0,$E(LEV,$L(LEV))'="." S LEV=LEV_"."
 .D DLINE(DNAM,LEV,NUM) Q:DREP'=""
 .I $D(^TMP("PXRMEXTMP",$J,"DMAP",DNAM)) D DCMP(DNAM,LEV_DSEQ_".")
 .;Extra line feed
 .I LEV="" D
 ..S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=$J("",79)
 ..S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 I $G(REPL)["R" D
 .S NLINE=NLINE+1,^TMP("PXRMEXLD",$J,NLINE,0)=$J("",79)
 .S ^TMP("PXRMEXLD",$J,"IDX",NLINE,NSEL)=""
 Q
 ;
 ;Rebuild string in ascending or descending order
ORDER(STRING,ORDER) ;
 N ARRAY,ITEM,CNT
 F CNT=1:1 S ITEM=$P(STRING,",",CNT) Q:'ITEM  S ARRAY(ITEM)=""
 K STRING
 F CNT=1:1 S ITEM=$O(ARRAY(ITEM),ORDER) Q:'ITEM  D
 .S $P(STRING,",",CNT)=ITEM
 Q
 ;
 ;Check if used by other dialogs
OTHER(NAME,LIST) ;
 N DDATA,DIEN,DNAME,DTYP,IEN
 S IEN=$O(^PXRMD(801.41,"B",NAME,0)) Q:'IEN
 ;Check if used by other dialogs
 I '$D(^PXRMD(801.41,"AD",IEN)) Q
 ;Build list of dialogs using this component
 S DIEN=0
 F  S DIEN=$O(^PXRMD(801.41,"AD",IEN,DIEN)) Q:'DIEN  D
 .S DDATA=$G(^PXRMD(801.41,DIEN,0)) Q:DDATA=""
 .S DNAME=$P(DDATA,U),DTYP=$P(DDATA,U,4) Q:DNAME=""
 .;Include only dialogs that are not part of this reminder dialog
 .I $D(^TMP("PXRMEXTMP",$J,"DMAP",DNAME)) Q
 .S LIST(DNAME)=DTYP
 Q
 ;
 ;Validate sequence numbers
VALID(STRING) ;
 N CNT,FOUND,OK
 S FOUND=0,OK=1
 F CNT=1:1 S SEL=$P(STRING,",",CNT) Q:'SEL  D
 .;Invalid selection
 .I ('SEL)!(SEL>VALMCNT)!('$D(@VALMAR@("SEL",SEL))) D  Q
 ..S OK=0 W $C(7),!,SEL_" is not a valid item number." H 2
 .S FOUND=1
 Q:OK&FOUND 1
 Q 0
 ;
XQORM S XQORM("#")=$O(^ORD(101,"B","PXRM EXCH SELECT DIALOG",0))_U_"1:"_VALMCNT
 S XQORM("A")="Select Action: "
 Q
 ;
XSEL ;PXRM EXCH SELECT DIALOG validation
 N ALL,CNT,ERR,IEN,IND,PXRMDONE,SELECT,SEL
 S ALL="",PXRMDONE=0,PXRMBG=$G(VALMBG)
 ;Invalid selection
 S SELECT=$P(XQORNOD(0),"=",2) I '$$VALID(SELECT) S VALMBCK="R" Q
 ;
 ;Sort the SELECTION into reverse order
 D ORDER(.SELECT,-1)
 ;
 ;Lock the file
 I '$$LOCK^PXRMEXID S VALMBCK="R" Q
 ;
 ;Install dialog component(s)
 S CNT=0
 F CNT=1:1 S SEL=$P(SELECT,",",CNT) Q:'SEL  D  Q:PXRMDONE
 .D INSCOM^PXRMEXID(SEL,0)
 ;
 ;Unlock file
 D UNLOCK^PXRMEXID
 ;
 ;
 ;Rebuild Workfile
 D DISP^PXRMEXLD(PXRMMODE)
 ;
 ;Refresh
 S VALMBCK="R" I $D(PXRMBG) S VALMBG=PXRMBG
 Q
