Index: /ccr/trunk/p/C0CCCR.m
===================================================================
--- /ccr/trunk/p/C0CCCR.m	(revision 712)
+++ /ccr/trunk/p/C0CCCR.m	(revision 713)
@@ -84,4 +84,5 @@
  I '$D(C0CNRPC) S ^TMP("C0CRPC",$H,"CALL",DFN)=""
  D SET^C0CPARMS(CCRPARMS) ;SET PARAMETERS WITH CCRPARMS AS OVERRIDES
+ I '$D(TESTVIT) S TESTVIT=0 ; FLAG FOR TESTING VITALS
  I '$D(TESTLAB) S TESTLAB=0 ; FLAG FOR TESTING RESULTS SECTION
  I '$D(TESTALERT) S TESTALERT=1 ; FLAG FOR TESTING ALERTS SECTION
@@ -149,5 +150,6 @@
  D PUSH^C0CXPATH(TAB,"EXTRACT;C0CMED;//ContinuityOfCareRecord/Body/Medications;^TMP(""C0CCCR"",$J,DFN,""MEDICATIONS"")")
  D PUSH^C0CXPATH(TAB,"MAP;C0CIMMU;//ContinuityOfCareRecord/Body/Immunizations;^TMP(""C0CCCR"",$J,DFN,""IMMUNE"")")
- D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")")
+ I TESTVIT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVIT2;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")")
+ E  D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")")
  D PUSH^C0CXPATH(TAB,"MAP;C0CLABS;//ContinuityOfCareRecord/Body/Results;^TMP(""C0CCCR"",$J,DFN,""RESULTS"")")
  D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROC;//ContinuityOfCareRecord/Body/Procedures;^TMP(""C0CCCR"",$J,DFN,""PROCEDURES"")")
Index: /ccr/trunk/p/C0CMXP.m
===================================================================
--- /ccr/trunk/p/C0CMXP.m	(revision 712)
+++ /ccr/trunk/p/C0CMXP.m	(revision 713)
@@ -21,5 +21,6 @@
  ;
 INITXPF(ARY) ;INITIAL XML/XPATH FILE ARRAY
- ;
+ ; DON'T USE THIS ONE ... USE INITFARY^C0CSOAP("FARY") INSTEAD
+ D INITFARY^C0CSOAP(ARY) ;
  S @ARY@("XML FILE NUMBER")=178.101
  S @ARY@("XML SOURCE FIELD")=2.1
@@ -32,8 +33,8 @@
  ;
  S C0CXPF=@ARY@("XML FILE NUMBER")
- S C0CXFLD=@ARY@("XML SOURCE FIELD")
- S C0CXTFLD=@ARY@("XML TEMPLATE FIELD")
- S C0CXPBF=@ARY@("XPATH BINDING SUBFILE")
- S C0CRDUXF=@ARY@("REDUX FIELD")
+ S C0CXFLD=@ARY@("XML")
+ S C0CXTFLD=@ARY@("TEMPLATE XML")
+ S C0CXPBF=@ARY@("BINDING SUBFILE NUMBER")
+ S C0CRDUXF=@ARY@("XPATH REDUCTION STRING")
  Q
  ;
@@ -89,5 +90,5 @@
  Q
  ;
-COMPILE(INTID,UFARY) ; COMPILES AN XML TEMPLATE AND GENERATES XPATH BINDINGS
+COMPILE(TID,UFARY) ; COMPILES AN XML TEMPLATE AND GENERATES XPATH BINDINGS
  ; UFARY IF SPECIFIED WILL REDIRECT THE XML FILE TO USE
  ; INTID IS THE IEN OF THE RECORD TO USE IN THE XML FILE
@@ -96,8 +97,11 @@
  ; WILL BE POPULATED TO THE XPATH BINDINGS SUBFILE AS .01
  I '$D(UFARY) D  ;
- . S UFARY="UFARY" ; FILE ARRAY
- . D INITXPF("UFARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE
+ . S UFARY="DEFFARY" ; FILE ARRAY
+ . ;D INITXPF("UFARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE
+ . D INITFARY^C0CSOAP(UFARY)
  D SETXPF(UFARY) ;SET FILE VARIABLES
- B
+ I +TID=0 S INTID=$$RESTID^C0CSOAP(TID,UFARY)
+ E  S INTID=TID
+ ;B
  ;N C0CXML,C0CREDUX,C0CTEMP,C0CIDX
  D GETXML("C0CXML",INTID,UFARY)
Index: /ccr/trunk/p/C0CRIMA.m
===================================================================
--- /ccr/trunk/p/C0CRIMA.m	(revision 712)
+++ /ccr/trunk/p/C0CRIMA.m	(revision 713)
@@ -459,5 +459,5 @@
  N ZZGI
  I WHICH="ALL" D  ; VARIABLES FROM ALL SECTIONS
- . F ZZGI="HEADER","PROBLEMS","VITALS","MEDS","ALERTS","RESULTS","IMMUNE" D  ;
+ . F ZZGI="HEADER","PROBLEMS","VITALS","MEDS","ALERTS","RESULTS","IMMUNE","PROCEDURES" D  ;
  . . D ZGVWRK(ZZGI) ; DO EACH SECTION
  . . I $G(DEBUG)'="" W "DID ",ZZGI,!
Index: /ccr/trunk/p/C0CSOAP.m
===================================================================
--- /ccr/trunk/p/C0CSOAP.m	(revision 713)
+++ /ccr/trunk/p/C0CSOAP.m	(revision 713)
@@ -0,0 +1,266 @@
+C0CSOAP	 ; CCDCCR/GPL - SOAP WEB SERVICE utilities; 8/25/09
+ ;;1.0;C0C;;May 19, 2009;
+ ;Copyright 2008 George Lilly.  Licensed under the terms of the GNU
+ ;General Public License See attached copy of the License.
+ ;
+ ;This program is free software; you can redistribute it and/or modify
+ ;it under the terms of the GNU General Public License as published by
+ ;the Free Software Foundation; either version 2 of the License, or
+ ;(at your option) any later version.
+ ;
+ ;This program is distributed in the hope that it will be useful,
+ ;but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;GNU General Public License for more details.
+ ;
+ ;You should have received a copy of the GNU General Public License along
+ ;with this program; if not, write to the Free Software Foundation, Inc.,
+ ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ ;
+ W "This is an SOAP utility library",!
+ W !
+ Q
+ ;
+TEST1
+ S url="https://ec2-75-101-247-83.compute-1.amazonaws.com:8181/ccr/CCRService?wsdl"
+ D GET1URL^C0CEWD2(url)
+ Q
+ ;
+INITFARY(ARY) ;initialize the Fileman Field array for SOAP processing
+ ; ARY is passed by name
+ S @ARY@("XML FILE NUMBER")="178.301"
+ S @ARY@("BINDING SUBFILE NUMBER")="178.3014"
+ S @ARY@("MIME TYPE")="2.3"
+ S @ARY@("PROXY SERVER")="2.4"
+ S @ARY@("REPLY TEMPLATE")=".03"
+ S @ARY@("TEMPLATE NAME")=".01"
+ S @ARY@("TEMPLATE XML")="3"
+ S @ARY@("URL")="1"
+ S @ARY@("WSDL URL")="2"
+ S @ARY@("XML")="2.1"
+ S @ARY@("XML HEADER")="2.2"
+ S @ARY@("XPATH REDUCTION STRING")="2.5"
+ S @ARY@("CCR VARIABLE")="4"
+ S @ARY@("FILEMAN FIELD NAME")="1"
+ S @ARY@("FILEMAN FIELD NUMBER")="1.2"
+ S @ARY@("FILEMAN FILE POINTER")="1.1"
+ S @ARY@("INDEXED BY")=".05"
+ S @ARY@("SQLI FIELD NAME")="3"
+ S @ARY@("VARIABLE NAME")="2"
+ Q
+ ;
+RESTID(INNAM,INFARY) ;EXTRINSIC TO RESOLVE TEMPLATE PASSED BY NAME
+ ; FILE IS IDENTIFIED IN FARY, PASSED BY NAME
+ N ZN,ZREF,ZR
+ S ZN=@INFARY@("XML FILE NUMBER")
+ S ZREF=$$FILEREF^C0CRNF(ZN)
+ S ZR=$O(@ZREF@("B",INNAM,""))
+ Q ZR
+ ;
+TESTSOAP ;
+ ; USING ICD9 WEB SERVICE TO TEST SOAP
+ S G("CODE")="E*"
+ S G("CODELN")=3
+ D SOAP("GPL","ICD9","G")
+ Q
+ ;
+SOAP(C0CRTN,C0CTID,C0CVA,C0CVOR,ALTXML) ; MAKES A SOAP CALL FOR 
+ ; TEMPLATE ID C0CTID
+ ; RETURNS THE XML RESULT IN C0CRTN, PASSED BY NAME
+ ; C0CVA IS PASSED BY NAME AND IS THE VARIABLE ARRAY TO PASS TO BIND
+ ; C0CVOR IS THE NAME OF A VARIABLE OVERRIDE ARRAY, WHICH IS APPLIED 
+ ; BEFORE MAPPING
+ ; IF ALTXML IS PASSED, BIND AND MAP WILL BE SKIPPED AND 
+ ; ALTXML WILL BE USED INSTEAD
+ ;
+ ; ARTIFACTS SECTION
+ ; THE FOLLOWING WILL SET UP DEBUGGING ARTIFACTS FOR A POSSIBLE FUTURE
+ ; ONLINE DEBUGGER. IF DEBUG=1, VARIABLES CONTAINING INTERMEDIATE RESULTS
+ ; WILL NOT BE NEWED.
+ I $G(WSDEBUG)="" N C0CV ; CATALOG OF ARTIFACT VARIABLES AND ARRAYS
+ S C0CV(100,"C0CXF","XML TEMPLATE FILE NUMBER")=""
+ S C0CV(200,"C0CHEAD","SOAP HEADER VARIABLE NAME")=""
+ S C0CV(300,"HEADER","SOAP HEADER")=""
+ S C0CV(400,"C0CMIME","MIME TYPE")=""
+ S C0CV(500,"C0CURL","WS URL")=""
+ S C0CV(550,"C0CPURL","PROXY URL")=""
+ S C0CV(600,"C0CXML","XML VARIABLE NAME")=""
+ S C0CV(700,"XML","OUTBOUND XML")=""
+ S C0CV(800,"C0CRSLT","RAW XML RESULT RETURNED FROM WEB SERVICE")=""
+ S C0CV(900,"C0CRHDR","RETURNED HEADER")=""
+ S C0CV(1000,"C0CRXML","XML RESULT NORMALIZED")=""
+ S C0CV(1100,"C0CR","REPLY TEMPLATE")=""
+ S C0CV(1200,"C0CREDUX","REDUX STRING")=""
+ S C0CV(1300,"C0CIDX","RESULT XPATH INDEX")=""
+ S C0CV(1400,"C0CARY","RESULT XPATH ARRAY")=""
+ S C0CV(1500,"C0CNOM","RESULT DOM DOCUMENT NAME")=""
+ S C0CV(1600,"C0CID","RESULT DOM ID")=""
+ I $G(DEBUG)'="" G NOTNEW ; SKIP NEWING THE VARIABLES IF IN DEBUG
+ N ZI,ZJ S ZI=""
+NEW
+ S ZI=$O(C0CV(ZI))
+ S ZJ=$O(C0CV(ZI,"")) ; SET UP NEW COMMAND
+ ;W ZJ,!
+ N @ZJ ; NEW THE VARIABLE
+ I $O(C0CV(ZI))'="" G NEW ;LOOP TO GET NEW IN CONTEXT
+NOTNEW
+ ; END ARTIFACTS
+ ;
+ D INITFARY("C0CF") ; SET FILE NUMBER AND PARAMATERS 
+ S C0CXF=C0CF("XML FILE NUMBER") ; FILE NUMBER FOR THE XML TEMPLATE FILE
+ I +C0CTID=0 D  ; A STRING WAS PASSED FOR THE TEMPLATE NAME
+ . S C0CUTID=$$RESTID(C0CTID,"C0CF") ;RESOLVE TEMPLATE IEN FROM NAME
+ E  S C0CUTID=C0CTID ; AN IEN WAS PASSED
+ N XML,TEMPLATE,HEADER
+ N C0CFH S C0CFH=C0CF("XML HEADER")
+ S C0CHEAD=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFH,,"HEADER")
+ N C0CFM S C0CFM=C0CF("MIME TYPE")
+ S C0CMIME=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFM)
+ N C0CFP S C0CFP=C0CF("PROXY SERVER")
+ S C0CPURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFP)
+ N C0CFU S C0CFU=C0CF("URL")
+ S C0CURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFU)
+ N C0CFX S C0CFX=C0CF("XML")
+ S C0CXML=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFX,,"XML")
+ N C0CFT S C0CFT=C0CF("TEMPLATE XML")
+ S C0CTMPL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFT,,"TEMPLATE")
+ I C0CTMPL="TEMPLATE" D  ; there is a template to process
+ . K XML ; going to replace the xml array
+ . N VARS
+ . I $D(C0CVOR) M @C0CVA=@C0CVOR ; merge in varible overrides
+ . I '$D(ALTXML) D  ; if ALTXML is passed in, don't bind
+ . . D BIND("VARS",C0CVA,C0CUTID,"C0CF")
+ . . D MAP("XML","VARS",TPTR,"C0CF")
+ . . K XML(0)
+ . E  M XML=@ALTXML ; use ALTXML instead
+ I $G(C0CPROXY) S C0CURL=C0CPURL
+ K C0CRSLT,C0CRHDR
+ S ok=$$httpPOST^%zewdGTM(C0CURL,.XML,C0CMIME,.C0CRSLT,.HEADER,"",.gpl5,.C0CRHDR)
+ K C0CRXML
+ D NORMAL("C0CRXML","C0CRSLT(1)") ;RETURN XML IN AN ARRAY
+ N C0CFR S C0CFR=C0CF("REPLY TEMPLATE")
+ S C0CR=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFR,"I") ; REPLY TEMPLATE
+ ; reply templates are optional and are specified by populating a
+ ; template pointer in field 2.5 of the request template
+ ; if specified, the reply template is the source of the REDUX string
+ ; used for XPath on the reply, and for UNBIND processing
+ ; if no reply template is specified, REDUX is obtained from the request
+ ; template and no UNBIND processing is performed. The XPath array is
+ ; returned without variable bindings
+ I C0CR'="" D  ; REPLY TEMPLATE EXISTS
+ . I +$G(DEBUG)'=0 W "REPLY TEMPLATE:",C0CR,!
+ . S C0CTID=C0CR ;
+ N C0CFRDX S C0CFRDX=C0CF("XPATH REDUCTION STRING")
+ S C0CREDUX=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFRDX) ;XPATH REDUCTION STRING
+ K C0CIDX,C0CARY ; XPATH INDEX AND ARRAY VARS
+ S C0CNOM="C0CWS"_$J ; DOCUMENT NAME FOR THE DOM
+ S C0CID=$$PARSE^C0CXEWD("C0CRXML",C0CNOM) ;CALL THE PARSER
+ S C0CID=$$FIRST^C0CXEWD($$ID^C0CXEWD(C0CNOM)) ;ID OF FIRST NODE
+ D XPATH^C0CXEWD(C0CID,"/","C0CIDX","C0CARY","",C0CREDUX) ;XPATH GENERATOR
+ ; Next, call UNBIND to map the reply XPath array to variables
+ ; This is only done if a Reply Template is provided
+ D DEMUXARY(C0CRTN,"C0CARY")
+ ; M @C0CRTN=C0CARY
+ Q
+ ;
+DEMUXARY(OARY,IARY) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO
+ ; FORMAT @OARY@(x,xpath) where x is the first multiple
+ N ZI,ZJ,ZK,ZL S ZI=""
+ F  S ZI=$O(@IARY@(ZI)) Q:ZI=""  D  ;
+ . D DEMUX^C0CMXP("ZJ",ZI)
+ . S ZK=$P(ZJ,"^",3)
+ . S ZK=$RE($P($RE(ZK),"/",1))
+ . S ZL=$P(ZJ,"^",1)
+ . I ZL="" S ZL=1
+ . S @OARY@(ZL,ZK)=@IARY@(ZI)
+ Q
+ ;
+NORMAL(OUTXML,INXML) ;NORMALIZES AN XML STRING PASSED BY NAME IN INXML
+ ; INTO AN XML ARRAY RETURNED IN OUTXML, ALSO PASSED BY NAME
+ ;
+ N ZI,ZN,ZTMP
+ S ZN=1
+ S @OUTXML@(ZN)=$P(@INXML,"><",ZN)_">"
+ S ZN=ZN+1
+ F  S @OUTXML@(ZN)="<"_$P(@INXML,"><",ZN) Q:$P(@INXML,"><",ZN+1)=""  D  ;
+ . S @OUTXML@(ZN)=@OUTXML@(ZN)_">"
+ . S ZN=ZN+1
+ Q
+ ;
+MAP(RARY,IVARS,TPTR,INFARY) ;RETURNS MAPPED XML IN RARY PASSED BY NAME
+ ; IVARS IS AN XPATH ARRAY PASSED BY NAME
+ ; TPTR IS A POINT TO THE C0C XML TEMPLATE FILE USED TO RETRIEVE THE TEMPLATE
+ ;
+ N ZT ;THE TEMPLATE
+ K ZT,@RARY
+ I '$D(INFARY) D  ;
+ . S INFARY="FARY"
+ . D INITFARY(INFARY)
+ N ZF,ZFT
+ S ZF=@INFARY@("XML FILE NUMBER")
+ S ZFT=@INFARY@("TEMPLATE XML")
+ I $$GET1^DIQ(ZF,TPTR_",",ZFT,,"ZT")'="ZT" D  Q  ; ERROR GETTING TEMPLATE
+ . W "ERROR RETRIEVING TEMPLATE",!
+ D MAP^C0CXPATH("ZT",IVARS,RARY) ;DO THE MAPPING
+ Q
+ ;
+TESTBIND ;
+ S G1("TESTONE")=1
+ S G1("TESTTWO")=2
+ D BIND("G","G1","TEST")
+ W !
+ ZWR G
+ Q
+ ;
+BIND(RARY,IVARS,INTPTR,INFARY) ;RETURNS AN XPATH ARRAY IN RARY FOR USE WITH MAP
+ ; TO BUILD AN INSTANTIATED TEMPLATE
+ ; TPTR IS THE IEN OF THE XML TEMPATE IN THE C0C XML TEMPLATE FILE
+ ; LOOPS THROUGHT THE BINDING SUBFILE TO PULL OUT XPATHS AND 
+ ; EITHER ASSIGNS VARIABLES OR DOES A FILEMAN CALL TO GET VALUES
+ ; VARIABLES ARE IN IVARS WHICH IS PASSED BY NAME
+ I '$D(INFARY) D  ;
+ . S INFARY="FARY"
+ . D INITFARY(INFARY) ;INITIALIZE FILE ARRAY IF NOT PASSED
+ I +INTPTR>0 S TPTR=INTPTR
+ E  S TPTR=$$RESTID(INTPTR,INFARY)
+ N C0CFF,C0CBF,C0CXI,C0CFREF,C0CXREF
+ S C0CFF=@INFARY@("XML FILE NUMBER") ;fileman file number of XML file
+ S C0CFREF=$$FILEREF^C0CRNF(C0CFF) ; closed file reference to the file
+ S C0CBF=@INFARY@("BINDING SUBFILE NUMBER") ; BINDING SUBFILE NUMBER
+ S C0CXI=$G(@INFARY@("XPATH INDEX")) ; index to the XPath bindings
+ I C0CXI="" S C0CXI="XPATH" ; default is the XPATH index
+ ; this needs to be a whole file index on the XPath subfile with
+ ; the Template IEN perceding the XPath in the index
+ N ZI
+ S ZI=""
+ S C0CXREF=$NA(@C0CFREF@(C0CXI,TPTR)) ; where the xref is
+ ;F  S ZI=$O(^C0CX(TPTR,5,"B",ZI)) Q:ZI=""  D  ; FOR EACH XPATH
+ F  S ZI=$O(@C0CXREF@(ZI)) Q:ZI=""  D  ; for each XPath in this template
+ . ;W !,ZI," ",$O(@C0CXREF@(ZI,TPTR,""))
+ . N ZIEN,ZFILE,ZFIELD,ZVAR,ZIDX,ZINDEX ;
+ . S ZIEN=$O(@C0CXREF@(ZI,TPTR,"")) ; IEN OF THE BINDING RECORD
+ . N ZFF S ZFF=@INFARY@("FILEMAN FILE POINTER")
+ . S ZFILE=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFF,"I")
+ . N ZFFLD S ZFFLD=@INFARY@("FILEMAN FIELD NUMBER")
+ . S ZFIELD=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFFLD,"I")
+ . N ZFV S ZFV=@INFARY@("VARIABLE NAME")
+ . S ZVAR=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFV,"E")
+ . N ZFX S ZFX=("INDEXED BY")
+ . S ZIDX=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFX,"I")
+ . S ZINDEX=""
+ . I ZIDX="DUZ" S ZINDEX=$G(DUZ) ; FILE IS INDEXED BY DUZ
+ . I ZIDX="DFN" S ZINDEX=$G(DFN) ; BY DFN
+ . E  I ZIDX'="" S ZINDEX=$G(@ZIDX) ; index variable
+ . ;I ZIDX="ACCT" S ZINDEX=C0CACCT ; BY ACCOUNT RECORD POINT TO C0C WS ACCT
+ . ;I ZIDX="LOC" S ZINDEX=C0CLOC ; BY LOCATION
+ . I ZVAR'="" D  ; VARIABLES TAKE PRESCIDENCE OVER FILEMAN FIELDS
+ . . S @RARY@(ZI)=@IVARS@(ZVAR) ; 
+ . E  D  ; IF NO VARIABLE, TRY ACCESSING FROM FILEMAN
+ . . I (ZFILE="")!(ZFIELD="") Q  ;QUIT IF FILE OR FIELD NOT THERE
+ . . D CLEAN^DILF
+ . . S @RARY@(ZI)=$$GET1^DIQ(ZFILE,ZINDEX_",",ZFIELD) ;GET THE VALUE
+ . . I $D(^TMP("DIERR",$J,1)) D  B ;
+ . . . W "ERROR!",!
+ . . . ZWR ^TMP("DIERR",$J,*)
+ Q
+ ;
Index: /ccr/trunk/p/C0CXEWD.m
===================================================================
--- /ccr/trunk/p/C0CXEWD.m	(revision 713)
+++ /ccr/trunk/p/C0CXEWD.m	(revision 713)
@@ -0,0 +1,126 @@
+C0CXEWD   ; C0C/GPL - EWD based XPath utilities; 10/11/09
+ ;;0.1;C0C;nopatch;noreleasedate
+ ;Copyright 2009 George Lilly.  Licensed under the terms of the GNU
+ ;General Public License See attached copy of the License.
+ ;
+ ;This program is free software; you can redistribute it and/or modify
+ ;it under the terms of the GNU General Public License as published by
+ ;the Free Software Foundation; either version 2 of the License, or
+ ;(at your option) any later version.
+ ;
+ ;This program is distributed in the hope that it will be useful,
+ ;but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;GNU General Public License for more details.
+ ;
+ ;You should have received a copy of the GNU General Public License along
+ ;with this program; if not, write to the Free Software Foundation, Inc.,
+ ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ ;
+ Q
+ ;
+TEST ;
+ D XPATH($$FIRST($$ID("CCR1")),"/","GIDX","GARY")
+ Q
+ ;
+TEST2 ;
+ S REDUX="//soap:Envelope/soap:Body/GetPatientFullMedicationHistory5Response/GetPatientFullMedicationHistory5Result/patientDrugDetail"
+ D XPATH($$FIRST($$ID("gpl")),"/","GIDX","GARY","",REDUX)
+ Q
+ ;
+XPATH(ZOID,ZPATH,ZXIDX,ZXPARY,ZNUM,ZREDUX) ; RECURSIVE ROUTINE TO POPULATE
+ ; THE XPATH INDEX ZXIDX, PASSED BY NAME
+ ; THE XPATH ARRAY XPARY, PASSED BY NAME
+ ; ZOID IS THE STARTING OID
+ ; ZPATH IS THE STARTING XPATH, USUALLY "/"
+ ; ZNUM IS THE MULTIPLE NUMBER [x], USUALLY NULL WHEN ON THE TOP NODE
+ ; ZREDUX IS THE XPATH REDUCTION STRING, TAKEN OUT OF EACH XPATH IF PRESENT
+ I '$D(ZREDUX) S ZREDUX=""
+ N NEWPATH
+ N NEWNUM S NEWNUM=""
+ I $G(ZNUM)>0 S NEWNUM="["_ZNUM_"]"
+ S NEWPATH=ZPATH_"/"_$$TAG(ZOID)_NEWNUM ; CREATE THE XPATH FOR THIS NODE
+ I $G(ZREDUX)'="" D  ; REDUX PROVIDED?
+ . N GT S GT=$P(NEWPATH,ZREDUX,2)
+ . I GT'="" S NEWPATH=GT
+ S @ZXIDX@(NEWPATH)=ZOID ; ADD THE XPATH FOR THIS NODE TO THE XPATH INDEX
+ N GD D DATA("GD",ZOID) ; SEE IF THERE IS DATA FOR THIS NODE
+ I $D(GD(2)) M @ZXPARY@(NEWPATH)=GD ; IF MULITPLE DATA MERGE TO THE ARRAY
+ E  I $D(GD(1)) S @ZXPARY@(NEWPATH)=GD(1) ; IF SINGLE VALUE, ADD TO ARRAY
+ I GD'="" S @ZXPARY@(NEWPATH)=GD ; IF YES, ADD IT TO THE XPATH ARRAY
+ N ZFRST S ZFRST=$$FIRST(ZOID) ; SET FIRST CHILD
+ I ZFRST'="" D  ; THERE IS A CHILD
+ . N ZMULT S ZMULT=$$ISMULT(ZFRST) ; IS FIRST CHILD A MULTIPLE
+ . D XPATH(ZFRST,NEWPATH,ZXIDX,ZXPARY,$S(ZMULT:1,1:""),ZREDUX) ; DO THE CHILD
+ N GNXT S GNXT=$$NXTSIB(ZOID)
+ I GNXT'="" D  ; MOVE ON TO THE NEXT SIBLING
+ . D XPATH(GNXT,ZPATH,ZXIDX,ZXPARY,$S(ZNUM>0:ZNUM+1,1:""),ZREDUX) ; DO NEXT SIB
+ Q
+ ;
+PARSE(INXML,INDOC) ;CALL THE EWD PARSER ON INXML, PASSED BY NAME
+ ; INDOC IS PASSED AS THE DOCUMENT NAME TO EWD
+ ; EXTRINSIC WHICH RETURNS THE DOCID ASSIGNED BY EWD
+ N ZR
+ M ^CacheTempEWD($j)=@INXML ;
+ S ZR=$$parseDocument^%zewdHTMLParser(INDOC)
+ Q ZR
+ ;
+ISMULT(ZOID) ; RETURN TRUE IF ZOID IS ONE OF A MULTIPLE
+ N ZN
+ S ZN=$$NXTSIB(ZOID)
+ I ZN'="" Q $$TAG(ZOID)=$$TAG(ZN) ; IF TAG IS THE SAME AS NEXT SIB TAG
+ Q 0
+ ;
+DETAIL(ZRTN,ZOID) ; RETURNS DETAIL FOR NODE ZOID IN ZRTN, PASSED BY NAME
+ N DET
+ D getElementDetails^%zewdXPath(ZOID,.DET)
+ M @ZRTN=DET
+ Q
+ ;
+ID(ZNAME) ;RETURNS THE docOID OF THE DOCUMENT NAMED ZNAME
+ Q $$getDocumentNode^%zewdDOM(ZNAME)
+ ;
+NAME(ZOID) ;RETURNS THE NAME OF THE DOCUMENAT WITH docOID ZOID
+ Q $$getDocumentName^%zewdDOM(ZOID)
+ ;
+FIRST(ZOID) ;RETURNS THE OID OF THE FIRST CHILD OF ZOID
+ N GOID
+ S GOID=ZOID
+ S GOID=$$getFirstChild^%zewdDOM(GOID)
+ I GOID="" Q ""
+ I $$getNodeType^%zewdDOM(GOID)'=1 S GOID=$$NXTCHLD(GOID)
+ Q GOID
+ ;
+HASCHILD(ZOID) ; RETURNS TRUE IF ZOID HAS CHILD NODES
+ Q $$hasChildNodes^%zewdDOM(ZOID)
+ ;
+CHILDREN(ZRTN,ZOID) ;RETURNS CHILDREN OF ZOID IN ARRAY ZRTN, PASSED BY NAME
+ N childArray
+ d getChildrenInOrder^%zewdDOM(ZOID,.childArray)
+ m @ZRTN=childArray
+ q
+ ;
+TAG(ZOID) ; RETURNS THE XML TAG FOR THE NODE
+ Q $$getName^%zewdDOM(ZOID)
+ ;
+NXTSIB(ZOID) ; RETURNS THE NEXT SIBLING
+ Q $$getNextSibling^%zewdDOM(ZOID)
+ ;
+NXTCHLD(ZOID) ; RETURNS THE NEXT CHILD IN PARENT ZPAR
+ N GOID
+ S GOID=$$getNextChild^%zewdDOM($$PARENT(ZOID),ZOID)
+ I GOID="" Q ""
+ I $$getNodeType^%zewdDOM(GOID)'=1 S GOID=$$NXTCHLD(GOID)
+ Q GOID
+ ;
+PARENT(ZOID) ; RETURNS PARENT OF ZOID
+ Q $$getParentNode^%zewdDOM(ZOID)
+ ;
+DATA(ZT,ZOID) ; RETURNS DATA FOR THE NODE
+ N ZT2
+ S ZT2=$$getElementText^%zewdDOM(ZOID,.ZT2)
+ M @ZT=ZT2
+ Q
+ ;Q $$getTextValue^%zewdXPath(ZOID)
+ ;Q $$getData^%zewdDOM(ZOID,.ZT)
+ ;
