'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'        SECTION "OOOO" IS A PLACE WHERE
'        ASP RESERVED NAMES OF FUNCTIONS, OBJECTS, PROPERTIES, METHODS CAN BE ADDED FOR CONVERTION.
'
'        Currently, not all of them added.
.
'        There are three methods to add:
'        REPLACEMENT(easy), WRAPPING(less easy), and EXPLICIT(more complex):

'        REPLACEMENT. Exact match exist between ASP and PHP constructs.         Usually, section 'rrr...'
'        WRAPPING     Writing new wrap-function replacing ASP-function.         Usually, section 'www...'
'        EXPLICIT     means that convertion part is written in schema.          Usually, section 'eee...'
'        SAME NAME    this is a fourth case when no name replacement
'                     between ASP and PHP required at all.
         
'        Programmer can declare incoming name as a keyword (.k) or as a separator (.s),
'        and this should not make difference. Identificator (.id) cannot be used because it is caught above.
'        More details are provided in sections.

'        Useful Built-in ASP Objects Reference: http://localhost/iishelp/iis/htm/asp/iiapwelc.htm
'                        PHP                  : http://www.php.net/manual/en/reserved.variables.php
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

'     EXPLICIT.

'     Functions (which return value) or other terms should be declared in state "we",
'     handled in states "above we in schema for .id", and transform initial state "we" into "e".
'     Examples: "mid" and "left" functions.
'     Or, handler should produce a queue which applies to a state "we" according generic syntax.
'     (day --> date conversion)
'     Methods and subroutines can happen only in ws state, so this does not matter how programmer
'     writes explicit handler "as it results with" completed statement.

'     If schema-variables are used, programmer should be sure that they will not be recursively
'     used in child-constructs.

'     Note:   It is important that section 'OOO...' is placed before event ".".s in schema.
'             For example, "Response.ContentType" will be caught before event "."

'     Examples:
'===============================================================================================================

'----------------------------------------------------------------------------------------------------------------------------
'           FUNCTION LEFT
we          left.k      substr           >left              
left        (           (                >we
left,e      ,           ,0,              <left2,we
left2,e     )           )                <2,e
'----------------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------------
'           MID FUNCTION:
we          mid.k          substr   >mid                 '! see notes in replacers.inc;
mid         (              (        >we                  'make top of nest = mid,we and print (;
mid,e       ,              ,        <mid2,we             'wait for the second mid-parameter;
mid2,e      ,              -1,      <mid3,we             'SUBSCRIBE FROM THE SECOND MID PARAMETER 1 BECAUSE 
                                                         'POINTER IN PHP STARTS FROM 0, BUT IN VB FROM 1;
            )              -1)      <2,e                 'expression mid(string,start_position) has been 
                                                         'handled and resulted into state "e";
mid3,e      )              )        <2,e                 '-------"-------
'----------------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------------
'       Conversion day(date)-->date("d") or day(arg) --> date("d",arg);  month, hour, second, ...
        '!Edit six lines below for your preferred format:
we      day.k        "d".=t                   >d,d1   
        month.k      "m".=t                   >d,d1
        year.k       "Y".=t                   >d,d1
        hour.k       "H".=t                   >t,d1 
        minute.k     "i".=t                   >t,d1  
        second.k     "s".=t                   >t,d1 
d1      (                                     =d2
d,d2    date.k                                =d3
t,d2    time.k                                =d3
d2      now.k                                 =d3
d2      .            <2                       +date.idf +( +"""$t """.str +, +   'result=date("d",second_argument ...
                                              '! the second_argument must be time stamp of integer type in PHP.
d3      )            <2                       +"date(""$t "")".idv               
'----------------------------------------------------------------------------------------------------------------------------


'============================================================================================================================
'            RESPONSE OBJECT            
'----------------------------------------------------------------------------------------------------------------------------
'            TO MATCH .id-events, token-pattern must be in low case because Tokenizer submits them in low case.
'            When converting RESPONSE OBJECT, all three methods are used. For example:
'            response.write  --> echo            (REPLACEMENT)
'            response.buffer --> set_buffer_c_   (WRAPPING)
'            ContentType     --> ...             (EXPLICIT)
'----------------------------------------------------------------------------------------------------------------------------
-            response.id                >response
response     "."                        =response.                            
ws,response  " "..l                     <  +response!!_c_.idf            'unknown use of object "response";
             "\009"..l                  +" "                            
             .                          +" "                      +
response     .                          <  +response!!_c_c.idf    +      'unknown use of object "response";
                                                                         'assume that it will be used as a function;

'----------------------------------------------------------------------------------------------------------------------------
'            C o l l e c t i o n s
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
response.    cookies.id                 < +"err_$ !!_c_".idv             'attribute property is ignored
                                        'in ASP: Cookies(cookie)[(key)|.attribute] = value     
                                        'setcookie() should be used                

'----------------------------------------------------------------------------------------------------------------------------
'            P r o p e r t i e s
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
'            Properties can be wrapped when they are to be read or returned.
'            Properties can behave as variables which must be set. This may need parsing event "=".
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
             'to be set:
ws,response. buffer.id                  >Buffer 
             cachecontrol.id            >CacheControl                           
             contenttype.id             >ContentType                             'Response.ContentType [=ContentType]
             expires.id                 >Expires
             expiresabsolute.id         >ExpiresAbsolute
             status.id                  >Status                                  'Response.Status = StatusDescription

             'to be read:
response.    buffer.id                  <    +ret_buffer!!_c_.idf                'Response.Buffer [=flag] False is default.

             cachecontrol.id            <    +ret_cache_control!!_c_.idf         'CacheControl [=Cache Control Header ]
             contenttype.id             <    +ret_content_type!!_c_.idf 
             expires.id                 <    +ret_expires!!_c_.idf               'Response.Expires [=number] 
             expiresabsolute.id         <    +ret_expires_absolute!!_c_.idf
             status.id                  <    +ret_response_status!!_c_.idf
             isclientconnected.id       <    +ret_is_client_connected!!_c_.idf   'Response.IsClientConnected ()

             'to be read or set:
response.    charset.id                 <    +set_ret_charset!!_c_.idf           'Response.Charset(CharsetName)   
             pics.id                    <    +set_ret_pics!!_c_.idf              'Response.PICS(PICSLabel)   
            
'----------------------------------------------------------------------------------------------------------------------------
'            M e t h o d s
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
'            Methods are assumed to happen only in ws-state and can be wrapped or replaced with functions.
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
response.    addheader.id     .*a       >AddHeader,we                                'Response.AddHeader name, value
             appendtolong.id            <    +set_response_append_to_long!!_c_.idf   'Response.AppendToLong string
             binarywrite.id             <    +set_response_binarywrite!!_c_.idf      'Response.BinaryWrite data
             clear.id                   <    +set_response_clear!!_c_.idf            'Response.Clear
             'token must be .k  because declared as end.k in other parts of schema:
             end.k                      <    +exit.idf                               'Response.End
             flush.id                   <    +"!After processing ob_end_flush, buffering will be off.".r :
                                             +ob_end_flush.idf                       'Response.Flush
             write.id                   <    +echo.idf                               'Response.Write variant
             redirect.id      .*a       >Redirect,we                                 'Response.Redirect URL

'----------------------------------------------------------------------------------------------------------------------------


'----------------------------------------------------------------------------------------------------------------------------
'            A u x i l a i r y    H a n d l e r s   f o r   R e s p o n s e   O b j e c t
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
AppendToLong               =           <f,we    set_append_to_long!!_c_(           
                           .           +=                                          +
Status                     =           <f,we    set_status!!_c_(
                           .           <2       +"Syntax: missed ""=""".r          +
Expires                    =           <f,we    set_expires!!_c_(                  
                           .           +=                                          +     
Buffer                     =           <f,we    set_buffer_c_(            
                           .           <e       ob_end_flush();                    +                         
CacheControl               =           <f,we    cache_control!!_c_(       
                           .           +=                                          +     

                                       'hot fix: put \l here temporarily
                                       'until the cause of sticking to comment will be
                                       'clear:
Redirect,e                 .t          .-a      "\lheader(""Location: "" . $a );"    <4    +.tfull

AddHeader,e                ,           .-a      <AddHeader2,we   .*b  
AddHeader2,e               .t          .-b      "header($a  . "": "" . $b );"      <4    +.tfull    


ContentType                =           >we      .*a
                          .t           +=       +"""text/HTML""".str               +     'default
ContentType,e             .t          .-a       "header(""Content-type: "". $a );" <4    +.tfull 


'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'                          this is a little bit odd because of #-use
ExpiresAbsolute            =            >wait#                              'Response.ExpiresAbsolute [= #[date] [time]#] 
                           .            >e      "".=a   +
ExpiresAbsolute,wait#      #..l        .*a      =#              
                           .           .*a      =we     +
#                          #..l        .-a      =e      """$a """.=a
                           " "..l      .&
                           "\009"..l   .&
                           .           .&                                   'collect
ExpiresAbsolute,e          .t .-a <4   "set_expires_absolute!!_c_($a );"    +.tfull    
'----------------------------------------------------------------------------------------------------------------------------


'============================================================================================================================
'       ERROR OBJECT 
'----------------------------------------------------------------------------------------------------------------------------
-       err.id                     >err
err     "."                        >ob                             'err. is met: "ob" denotes this fact.
        " "..l                     <1 +"err_number_c_".idf         'err as default is err.number:
        "\009"..l                  +" "                            'x = err is assumed as x =err.number;
        .                          +" "
err,ob  clear.id                   <2 +"err_$ _c_".idf
        raise.id                   <2 +"err_$ _c_".idf
        .id                        <2 +"\$err_$ _c_".idv
'----------------------------------------------------------------------------------------------------------------------------
'       on error resume next 
ws      on.k                        >on
on      error.k                     =on2
on2     resume.k                    =on3
on3     next.k                      =e     on_error_resume_next_c_()
'----------------------------------------------------------------------------------------------------------------------------

'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee



'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
'     REPLACEMENT

'     For function which maps to PHP-function exactly, programmer needs only replace 
'     ASP-function-name-event with corresponding PHP-function-name-event,
'     and change event-type from .s or .k to .idf
'     (.s can be omitted)
'     Examples:
'============================================================================================================================

-     ucase.k           +strtoupper.idf        
      lcase.k           +strtolower.idf        
      len.k             +strlen.idf                   
      asc.k             +ord.idf
      int.k             +(int)floor.idf         '!M good may only for non-negative; may need wrapper;

-     CStr.k            +(string).idf           '! converts string casting to PHP style
      CInt.k            +(int).idf              '! cast to int
      CLng.k            +(int).idf              '! cast to int
      CDbl.k            +(double).idf           '! cast to float
      CSng.k            +(double).idf           '!

-     vbtab.k           +"""\\t""".str           
      vbcrlf.k          +"""\\r\\n""".str        
      vbcr.k            +"""\\r""".str        
      vblf.k            +"""\\n""".str

'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr


'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
'     WRAPPING.   

'     If ASP-PHP match is not exact, programmer needs write own wrap function, 
'     add it to php/wrap/replacers.inc file, and put
'     wrap function name here as shown below:
'     Be sure that new function name does not conflict with existng functions.
'     For example, "request_form_c_" is a wrap function to be written in replacers.inc:
   
-     "request.form"               +request_form_c_.idf                
      "Request.QueryString"        +request_query_string_c_.idf                
      "Request.ServerVariables"    +request_server_var_c_.idf          
'----------------------------------------------------------------------------------------------------------------------------
'     this section for request is EXPLICIT: it must be below "request.form".
-     "request"                    >request
we,request    (        ${           ={,we                                   'links to "(,we" chain. 
request      "."                   <1   +request!!.idf        +             'unknown use
we,{,e        )         }          <2,e                                     'chain completed                     
'----------------------------------------------------------------------------------------------------------------------------

-     rnd.k             +rand_c_.idf                   '!M
      randomize.k       +srand_c_.idf                  '!M
      instr.k           +instr_c_.idf                  '!
      instrrev.k        +instrrev_c_.idf               '!
      space.k           +space_c_.idf                  '!
      replace.k         +replace_c_.idf                '!
      right.k           +right_c_.idf                  '!
      ubound.k          +ubound_c_.idf                 '! notes in replacers.inc
      split.k           +split_c_.idf                  '! notes in replacers.inc

                                                       
'-----------------------------------------------------------------------------------------------------------------------------
'     Conversion functions now, date, time.
'     -------------------------------------
      now.k             +time.idf                      '  This should be exact conversion.  

'     This is conversion to strings. String may be not a type that expression which
'     accepts "date" or "time" expects. If PHP cast works correctly, string type will be converted to
'     appropriate format at run-time
-     date.k            +"date(""m-d-Y"")".idv         '! edit this line for you preferred format;
      time.k            +"date(""H:i:s"")".idv         '! edit this line for you preferred format;

'     However, conversion to correct PHP variable: time() ADDS date information to VB time variable and
'     time information to date VB variable. If programmer still wish to do this, following two instructions
'     can be used:
'     date.k            +time.idf          '! ASP date is a subtype Date, in PHP, time is an integer.
'     time.k            +time.idf          '! ASP time is a subtype Date, in PHP, time is an integer.

'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
'     SAME NAME
'============================================================================================================================
      'chr
      'trim                                                 
      'ltrim                                                
      'rtrim                                                
      'abs                                                  
               
'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

'============================================================================================================================
'            TEMPLATE FOR SERVER OBJECT
'----------------------------------------------------------------------------------------------------------------------------
-            server.id                  >server
server       "."                        =server.    

             'spell-check some cases:
ws,server    " "..l                     <  +server!!_c_.idf           
             "\009"..l                  +" "                            
             .                          +" "                       +
server       .                          <  +server!!_c_.idf        +    'unknown use of name "server";
                                                                        'release this state as event "function";

             'case to be set by syntax: "ws object.memeber [=x]"
ws,server.   scripttimeout.id           >scripttimeout
scripttimeout       =                   <f,we   set_time_limit(            
                    .                   <2 +server!!_c_.idf        +

             'other memebers are not implemented yet: release them as functions:
server.      .id    <                   +"ret_server_$ !!_c_".idf                
             .      <                   +"ret_server_!!_c_".idf    +  
'============================================================================================================================


NOTE: there may be some other wrappers, replacements, explicits in the schema: for example: const.k.
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO