<!-- A DTD for Voice Extensible Markup Language -->
<!-- Copyright (c) 2000 VoiceXML Forum (AT&T, IBM, Lucent Technologies, Motorola) -->

<!-- Modified to reflect the VoiceGenie VoiceXML Gateway implementation, v4.5 -->
<!-- Changes Copyright (c) 2001 VoiceGenie Technologies Inc.                  -->

<!-- $Id: voicexml_vg.dtd,v 1.2 2001/05/24 01:45:06 rob Exp $ -->
<!-- $Name:  $ -->

<!ENTITY % audio 
        "#PCDATA | audio | enumerate | value" >

<!ENTITY % boolean      "(true|false)" >

<!ENTITY % connect.when "(analysis | answered | immediate)" >

<!ENTITY % content.type "CDATA">

<!ENTITY % duration "CDATA" >

<!ENTITY % event.handler "catch | help | noinput | nomatch | error" >

<!ENTITY % event.name "NMTOKEN" >

<!ENTITY % event.names "NMTOKENS" >

<!ENTITY % executable.content 
        "%audio; | assign | clear | disconnect | exit | goto | if | log | prompt |
        reprompt | return | script | submit | throw | var " >

<!ENTITY % expression "CDATA" >

<!ENTITY % field.name "NMTOKEN" >

<!ENTITY % field.names "NMTOKENS" >

<!ENTITY % integer "CDATA" >

<!ENTITY % item.attrs
        "name           %field.name;    #IMPLIED 
        cond            %expression;    #IMPLIED
        expr            %expression;    #IMPLIED " >

<!ENTITY % uri "CDATA" >

<!ENTITY % cache.attrs
        "caching        (safe|fast)     #IMPLIED
        fetchhint       (prefetch|safe|stream)  #IMPLIED
        fetchtimeout    %duration;      #IMPLIED " >

<!ENTITY % next.attrs
        "next           %uri;           #IMPLIED
        expr            %expression;    #IMPLIED " >

<!ENTITY % submit.attrs
        "method         (get|post)      'get'
        enctype         %content.type;  'application/x-www-form-urlencoded'
        namelist        %field.names;   #IMPLIED" >

<!ENTITY % fetch.attrs
        "fetchaudio     %uri;           #IMPLIED
        fetchaudiodelay %duration;      #IMPLIED
        fetchaudiotime  %duration;      #IMPLIED" >

<!ENTITY % tts          "break | div | emp | pros | sayas" >

<!ENTITY % variable     "block | field | var" >

<!--================================= Root ================================-->

<!ELEMENT vxml          
        (%event.handler; | form | link | menu | meta | 
        property | script | var)+ >
<!ATTLIST vxml 
        application     %uri;           #IMPLIED
        base            %uri;           #IMPLIED
        lang            CDATA           #IMPLIED
        logpage         %boolean;       'false'
        version         CDATA           #REQUIRED >

<!ELEMENT meta          EMPTY >
<!ATTLIST meta
        name            NMTOKEN         #IMPLIED
        content         CDATA           #REQUIRED 
        http-equiv      NMTOKEN         #IMPLIED >

<!--================================= Dialogs =============================-->

<!ENTITY % input        "dtmf | grammar" >

<!ENTITY % scope        "(document | dialog)" >

<!ELEMENT form
        (%input; | %event.handler; | filled | initial | object | link | property |
        record | subdialog | transfer | %variable;)* >
<!ATTLIST form
        id              ID              #IMPLIED 
        cleardtmf       %boolean;       'false'
        scope           %scope;         'dialog' >

<!ELEMENT menu          
        (%audio; | choice | %event.handler; | prompt | property)* >
<!ATTLIST menu 
        id              ID              #IMPLIED 
        scope           %scope;         'dialog'
        dtmf            %boolean;       'false' >

<!ELEMENT choice        (%audio; | grammar | %tts;)* >
<!ATTLIST choice
        %cache.attrs;
        dtmf            CDATA           #IMPLIED
        event           %event.name;    #IMPLIED
        %fetch.attrs;
        %next.attrs; >

<!--================================ Prompts ==============================-->

<!ELEMENT prompt        (%audio; | %tts;)* >
<!ATTLIST prompt
        bargein         %boolean;       #IMPLIED
        cond            %expression;    #IMPLIED
        count           %integer;       #IMPLIED
        timeout         %duration;      #IMPLIED >

<!ELEMENT enumerate     (%audio; | %tts;)*>

<!ELEMENT reprompt      EMPTY >

<!--================================ Fields ===============================-->

<!ELEMENT field         
        (%audio; | %event.handler; | filled | %input; | link | option | prompt | property)* >
<!ATTLIST field
        %item.attrs; 
        type            CDATA           #IMPLIED
        slot            NMTOKEN         #IMPLIED 
        bargeinlevel    CDATA           #IMPLIED
        asrengine       CDATA           #IMPLIED
        endbeep         %boolean;       'false'
        modal           %boolean;       'false' >

<!ELEMENT option        (#PCDATA)* >
<!ATTLIST option
        dtmf            CDATA           #IMPLIED
        value           CDATA           #IMPLIED >

<!ELEMENT var           EMPTY >
<!ATTLIST var
        name            %field.name;    #REQUIRED
        expr            %expression;    #IMPLIED >

<!ELEMENT initial       (%audio; | %event.handler; | link | prompt | property)* >
<!ATTLIST initial
        endbeep         %boolean;       'false'
        %item.attrs; >

<!ELEMENT block (%executable.content;)* >
<!ATTLIST block
        %item.attrs; >

<!ELEMENT assign        EMPTY >
<!ATTLIST assign
        name            %field.name;    #REQUIRED
        expr            %expression;    #REQUIRED >

<!ELEMENT clear EMPTY >
<!ATTLIST clear
        namelist        %field.names;   #IMPLIED >

<!ELEMENT value EMPTY >
<!ATTLIST value
        class           CDATA           #IMPLIED
        expr            %expression;    #REQUIRED
        mode            (tts|recorded)  "tts"
        recsrc          %uri;           #IMPLIED >

<!--================================== Events =============================-->

<!ENTITY % event.handler.attrs 
        "count          %integer;       #IMPLIED
        cond            %expression;    #IMPLIED" >

<!ELEMENT catch (%executable.content;)* >
<!ATTLIST catch
        event           %event.names;   #REQUIRED       
        %event.handler.attrs; >

<!ELEMENT error (%executable.content;)* >
<!ATTLIST error
        %event.handler.attrs; >

<!ELEMENT help          (%executable.content;)* >
<!ATTLIST help
        %event.handler.attrs; >

<!ELEMENT link          (dtmf | grammar)* >
<!ATTLIST link
        %cache.attrs;
        %next.attrs; 
        fetchaudio      %uri;           #IMPLIED
        event           %event.name;    #IMPLIED >

<!ELEMENT noinput       (%executable.content;)* >
<!ATTLIST noinput
        %event.handler.attrs; >

<!ELEMENT nomatch       (%executable.content;)* >
<!ATTLIST nomatch
        %event.handler.attrs; >

<!ELEMENT throw EMPTY >
<!ATTLIST throw
        event           %event.name;    #REQUIRED >


<!--============================== Audio Output ===========================-->

<!ELEMENT audio (%audio; | %tts;)* >
<!ATTLIST audio
        src             %uri;           #IMPLIED 
        expr            %expression;    #IMPLIED
        volume          %integer;       #IMPLIED
        %cache.attrs; >

<!ELEMENT break EMPTY >
<!ATTLIST break
        msecs           %integer;       #IMPLIED 
        size            (none|small|medium|large) #IMPLIED >
        
<!ELEMENT div           (%audio; | %tts;)* >
<!ATTLIST div
        type            CDATA   #IMPLIED>

<!ELEMENT emp           (%audio; | %tts;)* >
<!ATTLIST emp
        level           (strong | moderate | none | reduced) "moderate" >

<!ELEMENT pros          (%audio; | %tts;)* >
<!ATTLIST pros 
        rate            CDATA           #IMPLIED 
        vol             CDATA           #IMPLIED
        pitch           CDATA           #IMPLIED 
        range           CDATA           #IMPLIED >

<!ELEMENT sayas (#PCDATA)* >
<!ATTLIST sayas
        sub             CDATA           #IMPLIED
        class           CDATA           #IMPLIED
        phon            CDATA           #IMPLIED >


<!--============================= Audio Input =============================-->

<!ENTITY % key  "CDATA" >

<!ENTITY % grammar.attrs
        "%cache.attrs;
        scope           %scope;         #IMPLIED
        src             %uri;           #IMPLIED 
        expr            %expression;    #IMPLIED 
        type            CDATA           #IMPLIED " >

<!ELEMENT dtmf          (#PCDATA)* >
<!ATTLIST dtmf
        %fetch.attrs;
        %grammar.attrs; >

<!ELEMENT grammar       (#PCDATA)* >
<!ATTLIST grammar
        %grammar.attrs; >

<!ELEMENT record        
        (%audio; | %event.handler; | filled | grammar | prompt | property)* >   
<!ATTLIST record
        %item.attrs;
        type            CDATA           #IMPLIED
        beep            %boolean;       'false'
        maxtime         %duration;      #IMPLIED 
        mintime         %duration;      #IMPLIED
        modal           %boolean;       'true'
        beginsilence    %duration;      #IMPLIED
        finalsilence    %duration;      #IMPLIED
        dtmfterm        %boolean;       'true'  >

<!--============================ Call Control ============================-->

<!ELEMENT disconnect    EMPTY >

<!ELEMENT transfer      
        (%audio; | %event.handler; | dtmf | filled | grammar | prompt | property)* >
<!ATTLIST transfer
        %item.attrs;
        dest            %uri;           #IMPLIED
        destexpr        %expression;    #IMPLIED
        bridge          %boolean;       'false' 
        connecttimeout  %duration;      #IMPLIED
        analysis        %boolean;       'false'
        connectwhen     %connect.when;  'immediate'
        maxtime         %duration;      #IMPLIED >

<!--============================ Control Flow ============================-->

<!ENTITY % if.attrs 
        "cond           %expression;    #REQUIRED" >

<!ELEMENT if            (%executable.content; | elseif | else)* >
<!ATTLIST if
        %if.attrs; >

<!ELEMENT elseif        EMPTY >
<!ATTLIST elseif 
        %if.attrs; >

<!ELEMENT else  EMPTY >

<!ELEMENT exit          EMPTY >
<!ATTLIST exit
        expr            %expression;    #IMPLIED 
        namelist        %field.names;   #IMPLIED >

<!ELEMENT filled        (%executable.content;)* >
<!ATTLIST filled
        mode            (any|all)       "all"
        namelist        %field.names;   #IMPLIED >

<!ELEMENT goto          EMPTY >
<!ATTLIST goto
        %cache.attrs;
        %next.attrs;
        %fetch.attrs;
        expritem        %expression;    #IMPLIED 
        nextitem        %field.name;    #IMPLIED >

<!ELEMENT param EMPTY >
<!ATTLIST param
        name            NMTOKEN         #REQUIRED
        expr            %expression;    #IMPLIED
        value           CDATA           #IMPLIED
        valuetype       (data|ref)      'data'
        type            CDATA           #IMPLIED >

<!ELEMENT return        EMPTY >
<!ATTLIST return
        namelist        %field.names;   #IMPLIED
        event           %event.name;    #IMPLIED >

<!ELEMENT subdialog     
        (%audio; | %event.handler; | filled | param | prompt | property)* >
<!ATTLIST subdialog
        %item.attrs;
        src             %uri;           #IMPLIED
        srcexpr         %expression;    #IMPLIED
        %cache.attrs;
        fetchaudio      %uri;           #IMPLIED
        %submit.attrs; >

<!ELEMENT submit        EMPTY >
<!ATTLIST submit
        %cache.attrs;
        %next.attrs;
        %fetch.attrs;
        %submit.attrs; >

<!--========================== Miscellaneous ==============================-->

<!ENTITY % log 
        "#PCDATA | value" >

<!ELEMENT log           (%log;)* >
<!ATTLIST log
        expr            %expression;    #IMPLIED
        cond            %expression;    #IMPLIED
        level           %integer;       #IMPLIED >

<!ELEMENT object        
        (%audio; | %event.handler; | filled | param | prompt | property)* >
<!ATTLIST object
        %item.attrs;
        %cache.attrs;
        classid         %uri;           #IMPLIED
        codebase        %uri;           #IMPLIED
        data            %uri;           #IMPLIED
        type            CDATA           #IMPLIED
        codetype        CDATA           #IMPLIED
        archive         %uri;           #IMPLIED >

<!ELEMENT property      EMPTY >
<!ATTLIST property
        name            NMTOKEN         #REQUIRED
        value           CDATA           #REQUIRED >

<!ELEMENT script        (#PCDATA)* >
<!ATTLIST script
        src             %uri;           #IMPLIED
        charset         CDATA           #IMPLIED
        %cache.attrs; >