home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 March / PCWK0397.iso / novell / webserv3 / nws30.exe / DISK1 / NETBASIC / WEB / ABSEARCH.BAS < prev    next >
BASIC Source File  |  1996-09-23  |  18KB  |  1,418 lines

  1. ' Add all include files and define statements here
  2. #include "BASIC.H"
  3. #include "BTRIEVE.H"
  4. #include "KEY.H"
  5. #include "HTML.H"
  6. #include "ERRORS.H"
  7. #include "ABOOK.H"
  8.  
  9. Sub BTX:Index:Make
  10.  
  11.    Local( "KeyPos", "KeyLen","KeyFlag" )
  12.    Local( "NotUsed", "Reserved3", "XKeyType", "MKey", "ACS" )
  13.  
  14.    KeyPos    = LowHigh( Param(1) )
  15.    KeyLen    = LowHigh( Param(2) )
  16.    KeyFlags  = LowHigh( Param(3) )
  17.    NotUsed   = STR:Repeat( DATA:Char(0), 4 )
  18.    XKeyType  = Param( 4, DATA:Char(0) )
  19.    Reserved3 = STR:Repeat( DATA:Char(0), 3 )
  20.    MKey = Param( 5, DATA:Char(0) )
  21.    ACS  = Param( 6, DATA:Char(0) )
  22.  
  23.    KeySpec = KeyPos + KeyLen + KeyFlags + NotUsed + XKeyType
  24.    KeySpec = KeySpec + Reserved3 + MKey + ACS
  25.  
  26.    Return( KeySpec )
  27. End Sub
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151. Sub BTX:Record:Make
  152.  
  153.    Local( "FileSpec", "RecLen", "PageSize", "Indexes" )
  154.    Local( "Reserved4", "FileFlags", "Reserced2", "PreAlloc" )
  155.  
  156.    RecLen    = LowHigh( Param(1) )
  157.    PageSize  = LowHigh( Param(2,1024) )
  158.    Indexes   = LowHigh( Param(3,0) )
  159.    Reserved4 = STR:Repeat( DATA:Char(0), 4 )
  160.    FileFlags = LowHigh( Param(4,0))
  161.    Reserved2 = STR:Repeat( DATA:Char(0), 2 )
  162.    PreAlloc  = LowHigh( Param(5,0) )
  163.  
  164.    FileSpec = RecLen + PageSize + Indexes + Reserved4 + FileFlags
  165.    FileSpec = FileSpec + Reserved2 + PreAlloc
  166.  
  167.    Return( FileSpec )
  168. End Sub
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293. Sub CreateHyperLink
  294.  
  295.      Local( "BtvRec")
  296.  
  297.      BtvRec = Param(1)
  298.  
  299.      DOC:Print( "<IMAGE SRC=/images/sball.gif HEIGHT=10 WIDTH=10>", "<A HREF=http://", DOC:Env:Get( "SERVER_NAME" ), "/netbasic/abget.bas", "?Name=" , STR:Trim:All( BtvRec.DISTINGUISHED_NAME), "&theType=DN>", "<FONT size=+1>", STR:Trim:All( BtvRec.SURNAME ), " ", STR:Trim:All( BtvRec.GEN_QUALIFIER ), ", ", STR:Trim:All( BtvRec.GIVEN_NAME ), "</FONT></A> " , STR:Trim:All(BtvRec.TITLE), ", ",  STR:Trim:All(BtvRec.DEPARTMENT) ); NewLine
  300.      Return
  301. End Sub
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403. Sub GetKeyNumber
  404.  
  405.   If ( Param(1) = "DN" )
  406.        Return( 0 )
  407.    EndIF
  408.  
  409.    If ( Param(1) = "SN" )
  410.        Return( 1 )
  411.    EndIF
  412.  
  413.    If ( Param(1) = "GN" )
  414.        Return( 2 )
  415.    EndIF
  416.  
  417.    If ( Param(1) = "TL" )
  418.        Return( 3 )
  419.    EndIF
  420.  
  421.    If ( Param(1) = "OU" )
  422.        Return( 4 )
  423.    EndIf
  424.  
  425.    If ( Param(1) = "EM" )
  426.        Return( 5 )
  427.    EndIF
  428.  
  429.    If ( Param(1) = "LC" )
  430.        Return( 6 )
  431.    EndIF
  432.  
  433.    Return( -1 )
  434. End Sub
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468. Sub GetOrgUnit
  469.  
  470.    Local( "BtvRec", "OrgUnit", "OrgUnits", "DotPosition" )
  471.  
  472.    BtvRec = Param(1)
  473.  
  474.    ' Skip the user object
  475.    DotPosition = STR:Search( ".", BtvRec.DISTINGUISHED_NAME )
  476.    If ( DotPosition )
  477.       OrgUnit = STR:Sub( BtvRec.DISTINGUISHED_NAME, DotPosition+1 )
  478.  
  479.       OrgUnits = ""
  480.       Do While ( TRUE )
  481.          DotPosition = STR:Search( ".", OrgUnit )
  482.          If ( DotPosition != 0 )
  483.             OrgUnits = STR:Sub( OrgUnit, 1, DotPosition-1 )+ "/" + OrgUnits
  484.             OrgUnit  = STR:Sub( OrgUnit, DotPosition+1 )
  485.          Else
  486.             Exit
  487.          EndIF
  488.       EndDO
  489.    EndIF
  490.  
  491.    Return (OrgUnits)
  492. End Sub
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585. Sub GetRootObj
  586.  
  587.    Local( "BtvRec", "RootObj", "TmpObj", "DotPosition" )
  588.  
  589.    BtvRec = Param(1)
  590.  
  591.    TmpObj = STR:Trim:All( BtvRec.DISTINGUISHED_NAME )
  592.    Do While ( TRUE )
  593.       DotPosition = STR:Search( ".", TmpObj )
  594.       If ( DotPosition )
  595.          TmpObj = STR:Sub( TmpObj, DotPosition+1 )
  596.       Else
  597.          Exit
  598.       EndIF
  599.    EndDO
  600.  
  601.    RootObj = STR:Sub( TmpObj, 1, STR:Search( "@", TmpObj ) - 1 ) + "/"
  602.    Return (RootObj)
  603.  
  604. End Sub
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700. Sub GetTypeLessName
  701.  
  702. 'Convert the type distinguished name (DN) to the  typeless distinguished name, e.g,
  703. '      CN=BOB.OU=Marketing.O=WimpleMakers.C=US is converted into
  704. '      BOB.Marketing.WimpleMakers.US
  705. '
  706.    Local( "Name", "TypeLessName", "TypeName", "EqualPos" )
  707.  
  708.    TypeName = Param(1)
  709.    TypeLessName = ""
  710.  
  711.    EqualPos = STR:Search( "=", TypeName )
  712.    If ( EqualPos != 0 )
  713.       Name = STR:Sub( TypeName, EqualPos+1 )
  714.  
  715.       Do While ( TRUE )
  716.  
  717.          If ( STR:Search(".", Name) )
  718.             TypeLessName = TypeLessName + STR:Sub( Name, 1, STR:Search(".", Name) )
  719.             EqualPos = STR:Search( "=", Name )
  720.             If ( EqualPos != 0 )
  721.                Name = STR:Sub( Name, STR:Search( "=", Name )+1 )
  722.             Else
  723.                   Name =STR:Upper(STR:Sub( Name, STR:Search( ".", Name  ) ))
  724.  
  725.                  If (  (Name != ".OU") & (Name != ".O") & (Name != ".C" ) )
  726.                    TypeLessName = TypeLessName + STR:Sub( Name,  STR:Search(".", Name) + 1 )
  727.                 EndIF
  728.                 Exit
  729.             EndIF
  730.          Else
  731.             TypeLessName = TypeLessName + Name
  732.             Exit
  733.          EndIF
  734.  
  735.       EndDO
  736.    EndIF
  737.  
  738.    Return (TypeLessName)
  739. End Sub
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748. Sub IsMatch
  749.  
  750.    Local( "ReqType","ReqName", "BtvRec" )
  751.  
  752.    ReqType = Param(1)
  753.    ReqName = STR:Upper(Param(2))
  754.    BtvRec  = Param(3)
  755.  
  756.    If ( ReqType = "DN" )
  757.       If ( STR:Search( ReqName, STR:Upper(BtvRec.DISTINGUISHED_NAME) ) = 1  )
  758.          Return (TRUE)
  759.       EndIF
  760.    EndIF
  761.  
  762.    If ( ReqType = "SN" )
  763.       If ( STR:Search( ReqName, STR:Upper(BtvRec.SURNAME) ) = 1  )
  764.          Return (TRUE)
  765.       EndIF
  766.    EndIF
  767.  
  768.    If ( ReqType = "GN" )
  769.       If ( STR:Search( ReqName, STR:Upper(BtvRec.GIVEN_NAME) ) = 1  )
  770.          Return (TRUE)
  771.       EndIF
  772.    EndIF
  773.  
  774.    If ( ReqType = "TL" )
  775.       If ( STR:Search( ReqName, STR:Upper(BtvRec.TITLE) ) = 1  )
  776.          Return (TRUE)
  777.       EndIF
  778.    EndIF
  779.  
  780.    If ( ReqType = "EM" )
  781.       If ( STR:Search( ReqName, STR:Upper(BtvRec.EMAIL_ADDRESS) ) = 1  )
  782.          Return (TRUE)
  783.       EndIF
  784.    EndIF
  785.  
  786.    If ( ReqType = "OU" )
  787.       If ( STR:Search( ReqName, STR:Upper(BtvRec.DEPARTMENT) ) = 1  )
  788.          Return (TRUE)
  789.       EndIF
  790.    EndIF
  791.  
  792.    If ( ReqType = "LC" )
  793.       If ( STR:Search( ReqName, STR:Upper(BtvRec.LOCALITY_NAME) ) = 1  )
  794.          Return (TRUE)
  795.       EndIF
  796.    EndIF
  797.  
  798.    Return (FALSE)
  799. End Sub
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835. Sub LowHigh
  836.  
  837.    Local( "HI", "LO" )
  838.  
  839.    ' Change the integer byte order and return result as a binary string.
  840.    LO = DATA:Char( MATH:Mod( Param(1), 256 ) )
  841.    HI = DATA:Char( Param(1) / 256 )
  842.  
  843.    Return( LO + HI )
  844. End Sub
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968. Sub Main
  969.  
  970.    'Declare local variables.
  971.    Local( "FileSpec", "Buf", "PadBuf" )
  972.    Local( "Handle", "KeyBuf" , "DataBase" )
  973.    Local( "FirstRec",  "BtvRec" )
  974.    Local( "VarList", "sHREF" )
  975.    Local( "KeyNumber", "RecCount" )
  976.  
  977.    DOC:Heading( "Address Book" )
  978.    DOC:Print( "<BODY BACKGROUND=""/images/image1.gif"">")
  979.  
  980.    DOC:Tag:Begin(DOC_TAG_CENTER)
  981.    DOC:Image( "/images/novhead1.gif", "" )
  982.    DOC:Tag:End(DOC_TAG_CENTER)
  983.  
  984.    ' Check if BTX.NLM is loaded.  If not loaded, return an error message.
  985.    If ( !NMX:Lib:Load( "BTX" ) )
  986.       DOC:Print( "BTX.NLM was not loaded or missing." ); NewLine
  987.       DOC:Print( "Please contact your administrator for assistance." );NewLine
  988.       DOC:Form:End
  989.       Return
  990.    EndIf
  991.  
  992.    ' Initialize sHREF variable
  993.    sHREF =  "http://" + DOC:Env:Get( "SERVER_NAME" ) + "/netbasic/abform.bas"
  994.  
  995.    ' Get and extract the form variables
  996.    VarList = DOC:Var()
  997.  
  998.    ReqName = STR:Trim:All(VarList.Name)
  999.    ReqType = VarList.theType
  1000.  
  1001.    If ( STR:Length(ReqName) = 0 )
  1002.      DOC:Paragraph;NewLine
  1003.      DOC:Print( "Record not found.  Please re-enter a new search." );NewLine
  1004.  
  1005.      DOC:Paragraph
  1006.      DOC:Link:Button(sHREF, "Back to the search page" )
  1007.      Return
  1008.    EndIF
  1009.  
  1010.    ' If the request type is distinguished name(DN), then convert the request name  to upper case.
  1011.    ' Also, if the type distinguished name is specified, convert it to the typeless distinguished name.
  1012.    If ( ReqType = "DN" )
  1013.       ReqName = STR:Upper(ReqName)
  1014.       If ( STR:Search( "CN", ReqName ) )
  1015.          ReqName = GetTypeLessName( ReqName )
  1016.       EndIF
  1017.    EndIF
  1018.  
  1019.    ' Get a key number according to the request type
  1020.    KeyNumber = GetKeyNumber( ReqType )
  1021.  
  1022.    ' If key number is not valid, return an error message
  1023.    If (KeyNumber < 0)
  1024.      DOC:Paragraph;NewLine
  1025.      DOC:Print( "Invalid search type or not supported." );NewLine
  1026.  
  1027.      DOC:Paragraph
  1028.      DOC:Link:Button(sHREF, "Back to the search page" )
  1029.      Return
  1030.    EndIF
  1031.  
  1032.    ' If using btrieve data manager for DOS without btrieve.nlm loaded the
  1033.    ' file paths must include drive letters (A:...Z:) not volumes (SYS:)
  1034.  
  1035.    FileSpec = BTX:Record:Make( 1536, 2560, 8 )
  1036.    FileSpec = FileSpec + BTX:Index:Make( KEY1POSITION, MAX_DGNAME,        BTX_EXTTYPE_KEY )
  1037.    FileSpec = FileSpec + BTX:Index:Make( KEY2POSITION, MAX_SURNAME,       BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1038.    FileSpec = FileSpec + BTX:Index:Make( KEY3POSITION, MAX_GIVEN_NAME,    BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1039.    FileSpec = FileSpec + BTX:Index:Make( KEY4POSITION, MAX_TITLE,         BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1040.    FileSpec = FileSpec + BTX:Index:Make( KEY5POSITION, MAX_DEPARTMENT,    BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1041.    FileSpec = FileSpec + BTX:Index:Make( KEY6POSITION, MAX_EMAIL_ADDRESS, BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1042.    FileSpec = FileSpec + BTX:Index:Make( KEY7POSITION, MAX_LOCALITY_NAME, BTX_DUP+BTX_MOD+BTX_NUL+BTX_EXTTYPE_KEY+BTX_ALT )
  1043.  
  1044.    ' Get and open a btrieve database file from the configuration file.
  1045.    DataBase = INI:Read( "SYS:\SYSTEM\ABOOK.CFG", "Common", "ExtractFile", "SYS:\SYSTEM\ABOOK.DBF" )
  1046.    Handle = BTX:Call( "", BTX_OPEN, FileSpec, STR:Length(FileSpec), DataBase, 0 )
  1047.    If ( SYS:Error:Number != 0 )
  1048.       DOC:Paragraph;NewLine
  1049.       DOC:Print( "Can't open database: ", DataBase );NewLine
  1050.  
  1051.       DOC:Paragraph
  1052.       DOC:Link:Button(sHREF, "Back to the search page" )
  1053.       Return
  1054.    EndIF
  1055.  
  1056.    ' Initialize KeyBuf and padding it with NULLs
  1057.    PadBuf = STR:Repeat( chr(0),256 )
  1058.    KeyBuf = ReqName+PadBuf
  1059.  
  1060.    ' Initialize FileSpec with blanks
  1061.    FileSpec = STR:Repeat( " ", 2560 )
  1062.  
  1063.    ' Get the first record which greater than or equal the key specified in KeyBuf variable
  1064.    Handle = BTX:Call( Handle, BTX_GET_GE, FileSpec, STR:Length(FileSpec), KeyBuf, KeyNumber )
  1065.  
  1066.    If ( SYS:Error:Number != 0 )
  1067.        Handle = BTX:Call( Handle, BTX_CLOSE, FileSpec, STR:Length(FileSpec), DataBase, 0 )
  1068.  
  1069.        DOC:Paragraph;NewLine
  1070.        DOC:Print( "<B>", ReqName, "</B> not found." ); NewLine
  1071.        DOC:Paragraph
  1072.        DOC:Link:Button(sHREF, "Back to the search page" )
  1073.        Return
  1074.    EndIF
  1075.  
  1076.    ' Retrieve and return a btrieve or personal record.  If more than one record are found,
  1077.    ' create a HyperText link for each record.
  1078.    DOC:Tag:Begin( DOC_TAG_PREFMT )
  1079.    BtvRec = OBJECT:Make( "ERROR", 0 )
  1080.    RecCount = 0
  1081.  
  1082.    Do While ( TRUE  )
  1083.  
  1084.       Buf = BTX:Data:Buffer(Handle)
  1085.  
  1086.       BtvRec =  BtvRec + OBJECT:Make( "DISTINGUISHED_NAME", STR:Sub( Buf, KEY1POSITION, MAX_DGNAME ) )
  1087.       BtvRec =  BtvRec + OBJECT:Make( "SURNAME",            STR:Sub( Buf, KEY2POSITION, MAX_SURNAME ) )
  1088.       BtvRec =  BtvRec + OBJECT:Make( "GIVEN_NAME",         STR:Sub( Buf, KEY3POSITION, MAX_GIVEN_NAME ) )
  1089.       BtvRec =  BtvRec + OBJECT:Make( "TITLE",              STR:Sub( Buf, KEY4POSITION, MAX_TITLE ) )
  1090.       BtvRec =  BtvRec + OBJECT:Make( "DEPARTMENT",         STR:Sub( Buf, KEY5POSITION, MAX_DEPARTMENT ) )
  1091.       BtvRec =  BtvRec + OBJECT:Make( "EMAIL_ADDRESS",      STR:Sub( Buf, KEY6POSITION, MAX_EMAIL_ADDRESS ) )
  1092.       BtvRec =  BtvRec + OBJECT:Make( "LOCALITY_NAME",      STR:Sub( Buf, KEY7POSITION, MAX_LOCALITY_NAME ) )
  1093.       BtvRec =  BtvRec + OBJECT:Make( "PHONE_NUMBER",       STR:Sub( Buf, FIELD1POSITION, MAX_PHONE_NUMBER ) )
  1094.       BtvRec =  BtvRec + OBJECT:Make( "FAX_NUMBER",         STR:Sub( Buf, FIELD2POSITION, MAX_FAX_NUMBER ) )
  1095.       BtvRec =  BtvRec + OBJECT:Make( "DESCRIPTION",        STR:Sub( Buf, FIELD3POSITION, MAX_DESCRIPTION ) )
  1096.       BtvRec =  BtvRec + OBJECT:Make( "GEN_QUALIFIER",      STR:Sub( Buf, FIELD4POSITION, MAX_GQ ) )
  1097.       BtvRec =  BtvRec + OBJECT:Make( "DELIVERY_OFFICE",    STR:Sub( Buf, FIELD5POSITION, MAX_PD_OFFICE ) )
  1098.       BtvRec =  BtvRec + OBJECT:Make( "POSTAL_CODE",        STR:Sub( Buf, FIELD6POSITION, MAX_POSTAL_CODE ) )
  1099.       BtvRec =  BtvRec + OBJECT:Make( "PO_BOX",             STR:Sub( Buf, FIELD7POSITION, MAX_POBOX ) )
  1100.       BtvRec =  BtvRec + OBJECT:Make( "STATE",              STR:Sub( Buf, FIELD8POSITION, MAX_STATE ) )
  1101.       BtvRec =  BtvRec + OBJECT:Make( "ADDRESS",            STR:Sub( Buf, FIELD9POSITION, MAX_ADDRESS) )
  1102.  
  1103.       If ( IsMatch(ReqType, ReqName, BtvRec) )
  1104.          If ( RecCount = 0 )
  1105.             FirstRec = BtvRec;  RecCount = RecCount+1
  1106.          Else
  1107.             If ( RecCount = 1 )
  1108.                DOC:Print( "<FONT size=+2><B>Last Name, First Name  Title, Department:</B></FONT>")
  1109.                DOC:Print("<HR>")
  1110.                CreateHyperLink( FirstRec )
  1111.             EndIF
  1112.  
  1113.             CreateHyperLink(BtvRec)
  1114.             RecCount = RecCount + 1
  1115.          EndIF
  1116.       Else
  1117.  
  1118.           Exit
  1119.       EndIF
  1120.  
  1121.       'Get the next record
  1122.       BtvRec = OBJECT:Make( "ERROR", 0 )
  1123.       Handle = BTX:Call( Handle, BTX_GET_NEXT, FileSpec, STR:Length(FileSpec), Keybuf, KeyNumber )
  1124.  
  1125.       If ( SYS:Error:Number != 0 )
  1126.          Exit
  1127.       EndIF
  1128.    EndDo
  1129.  
  1130.    'Close btrieve database file
  1131.    Handle = BTX:Call( Handle, BTX_CLOSE, FileSpec, STR:Length(FileSpec), DataBase, 0 )
  1132.  
  1133.    If ( RecCount = 0 )
  1134.       DOC:Print( "<B>", ReqName, "</B> not found." ); NewLine
  1135.    EndIf
  1136.  
  1137.    If ( RecCount = 1 )
  1138.       DOC:Print( "<FONT size=+2><B>Personal Information:</B></FONT>" );NewLine
  1139.       'DOC:Link:Button(sHREF, "Back to the search page" )
  1140.       ReturnRec( FirstRec )
  1141.    EndIF
  1142.  
  1143.    If ( RecCount > 1 )
  1144.       DOC:Paragraph
  1145.       DOC:Print( "<B><FONT size=+1>Found ", RecCount, " records</FONT></B>" );NewLine
  1146.    EndIF
  1147.  
  1148.    DOC:Print( "<HR>" );NewLine
  1149.    DOC:Paragraph
  1150.    DOC:Link:Button(sHREF, "Back to the search page" )
  1151.  
  1152.    DOC:Tag:End( DOC_TAG_PREFMT )
  1153.    DOC:Form:End
  1154.  
  1155.    Return
  1156. End Sub
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273. Sub ReturnRec
  1274.  
  1275.      Local( "BtvRec", "NDS_URL" )
  1276.      Local( "UserObj", "OrgUnit", "RootObj" )
  1277.      Local( "sHREF", "NDS_Tree", "DGName" )
  1278.  
  1279.      BtvRec = Param(1)
  1280.  
  1281.      DOC:Print("<HR>"); NewLine
  1282.      UserObj  = STR:Sub( BtvRec.DISTINGUISHED_NAME, 1, STR:Search( ".", STR:Trim:All(BtvRec.DISTINGUISHED_NAME ))-1 )
  1283.      NDS_Tree = STR:Sub( BtvRec.DISTINGUISHED_NAME, STR:Search( "@", STR:Trim:All(BtvRec.DISTINGUISHED_NAME ))+1 )
  1284.      OrgUnit  = GetOrgUnit(BtvRec)
  1285.      RootObj  = GetRootObj(BtvRec)
  1286.      NDS_URL  = "/nds/"+STR:Trim:All(NDS_Tree)+"/"+RootObj+OrgUnit+UserObj
  1287.  
  1288.      DOC:Print("<B>Name:</B>        ", "<A HREF=http://", DOC:Env:Get( "SERVER_NAME" ), NDS_URL, ">", "<FONT size=+1>", STR:Trim:All(BtvRec.GIVEN_NAME), " ", STR:Trim:All(BtvRec.SURNAME), ", ", STR:Trim:All(BtvRec.GEN_QUALIFIER), "</FONT></A>" ); NewLine
  1289.      DOC:Print("<B>Title:</B>       ", STR:Trim:All(BtvRec.TITLE) ); NewLine
  1290.      DOC:Print("<B>Dept:</B>        ", STR:Trim:All(BtvRec.DEPARTMENT) ); NewLine
  1291.      DOC:Print("<B>Description:</B> ", STR:Trim:All(BtvRec.DESCRIPTION) ); NewLine
  1292.      DOC:Print("<B>E-Mail ID:</B>   ", "<A HREF=mailto:", STR:Trim:All(BtvRec.EMAIL_ADDRESS), ">", "<FONT size=+1>", STR:Trim:All(BtvRec.EMAIL_ADDRESS), "</FONT></A>" ); NewLine
  1293.      DOC:Print("<B>Phone:</B>       ", STR:Trim:All(BtvRec.PHONE_NUMBER) ); NewLine
  1294.      DOC:Print("<B>Fax:</B>         ", STR:Trim:All(BtvRec.FAX_NUMBER) ); NewLine
  1295.      DOC:Print("<B>MailStop:</B>    ", STR:Trim:All(BtvRec.DELIVERY_OFFICE)); NewLine; NewLine
  1296.  
  1297.      DOC:Paragraph
  1298.      DOC:Print("<FONT size=+1>", "<B>Postal Address</B>", "</FONT>" );NewLine;
  1299.      DOC:Print("<B>Street:</B>      ", STR:Trim:All(BtvRec.ADDRESS) ); NewLine
  1300.      DOC:Print("<B>P.O. Box:</B>    ", STR:Trim:All(BtvRec.PO_BOX) ); NewLine
  1301.      DOC:Print("<B>City:</B>        ", STR:Trim:All(BtvRec.DELIVERY_OFFICE) ); NewLine
  1302.      DOC:Print("<B>State:</B>       ", STR:Trim:All(BtvRec.STATE) );NewLine
  1303.      DOC:Print("<B>Postal Code:</B> ", STR:Trim:All(BtvRec.POSTAL_CODE) );NewLine
  1304.      DOC:Print("<B>Locality:</B>    ", STR:Trim:All(BtvRec.LOCALITY_NAME) ); NewLine
  1305.  
  1306.      DOC:Paragraph
  1307.      DOC:Print("<FONT size=+1>", "<B>Novell Directory Services</B>", "</FONT>" );NewLine;
  1308.      DOC:Print("<B>       Tree Name:</B>   ", STR:Trim:All(NDS_Tree) ); NewLine
  1309.  
  1310.      DGName = STR:Sub( BtvRec.DISTINGUISHED_NAME, 1, STR:Search("@", STR:Trim:All(BtvRec.DISTINGUISHED_NAME))-1 )
  1311.      DOC:Print("<B>Common Name (CN):</B>   ", UserObj ); NewLine
  1312.      DOC:Print("<B>Distinguished Name:</B> ", DGName );NewLine
  1313.  
  1314.      Return
  1315. End Sub
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.