Orb/Doxygen/src/htmlgen.cpp
changeset 3 d8fccb2cd802
parent 0 42188c7ea2d9
child 4 468f4c8d3d5b
equal deleted inserted replaced
2:932c358ece3e 3:d8fccb2cd802
       
     1 /******************************************************************************
       
     2  *
       
     3  * 
       
     4  *
       
     5  * Copyright (C) 1997-2008 by Dimitri van Heesch.
       
     6  *
       
     7  * Permission to use, copy, modify, and distribute this software and its
       
     8  * documentation under the terms of the GNU General Public License is hereby 
       
     9  * granted. No representations are made about the suitability of this software 
       
    10  * for any purpose. It is provided "as is" without express or implied warranty.
       
    11  * See the GNU General Public License for more details.
       
    12  *
       
    13  * Documents produced by Doxygen are derivative works derived from the
       
    14  * input used in their production; they are not affected by this license.
       
    15  *
       
    16  */
       
    17 
       
    18 #include <stdlib.h>
       
    19 
       
    20 #include "qtbc.h"
       
    21 #include <qdir.h>
       
    22 #include "message.h"
       
    23 #include "htmlgen.h"
       
    24 #include "config.h"
       
    25 #include "util.h"
       
    26 #include "doxygen.h"
       
    27 #include "logos.h"
       
    28 #include "diagram.h"
       
    29 #include "version.h"
       
    30 #include "dot.h"
       
    31 #include "language.h"
       
    32 #include "htmlhelp.h"
       
    33 #include "docparser.h"
       
    34 #include "htmldocvisitor.h"
       
    35 #include "index.h"
       
    36 #include "pagedef.h"
       
    37 #include "debug.h"
       
    38 #include "dirdef.h"
       
    39 #include "vhdldocgen.h"
       
    40 #include "layout.h"
       
    41 
       
    42 // #define GROUP_COLOR "#ff8080"
       
    43 
       
    44 //#define DBG_HTML(x) x;
       
    45 #define DBG_HTML(x) 
       
    46 
       
    47 static const char defaultStyleSheet[] = 
       
    48 #include "doxygen_css.h"
       
    49 ;
       
    50 
       
    51 static const char search_script[]=
       
    52 #include "search_php.h"
       
    53 ;
       
    54 
       
    55 static QCString g_header;
       
    56 static QCString g_footer;
       
    57 
       
    58 //------------------------- Pictures for the Tabs ------------------------
       
    59 
       
    60 static unsigned char tab_b_gif[] = {
       
    61   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0x00,
       
    62   0x00, 0x84, 0xb0, 0xc7, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
       
    63   0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b
       
    64 };
       
    65 static unsigned int tab_b_gif_len = 35;
       
    66 
       
    67 static unsigned char tab_l_gif[] = {
       
    68   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x09, 0x00, 0x2c, 0x01, 0xd5, 0x00,
       
    69   0x00, 0xf6, 0xf7, 0xf9, 0xf1, 0xf4, 0xf7, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd,
       
    70   0xfe, 0xfa, 0xfb, 0xfc, 0xf9, 0xfa, 0xfb, 0xf8, 0xf9, 0xfa, 0xea, 0xef,
       
    71   0xf3, 0xef, 0xf3, 0xf6, 0xc6, 0xd5, 0xdf, 0xd2, 0xde, 0xe6, 0xd8, 0xe2,
       
    72   0xe9, 0xde, 0xe7, 0xed, 0xdd, 0xe6, 0xec, 0xe5, 0xec, 0xf1, 0xe8, 0xee,
       
    73   0xf2, 0xf4, 0xf7, 0xf9, 0xf3, 0xf6, 0xf8, 0xb3, 0xc8, 0xd5, 0xc1, 0xd2,
       
    74   0xdd, 0xcb, 0xd9, 0xe2, 0xcf, 0xdc, 0xe4, 0xd6, 0xe1, 0xe8, 0x96, 0xb4,
       
    75   0xc5, 0x9d, 0xb9, 0xc9, 0xaf, 0xc2, 0xcd, 0xbb, 0xce, 0xd9, 0xc3, 0xd4,
       
    76   0xde, 0xc2, 0xd3, 0xdd, 0xc8, 0xd7, 0xe0, 0xcc, 0xda, 0xe2, 0xd5, 0xe1,
       
    77   0xe8, 0xd9, 0xe4, 0xea, 0xd7, 0xe2, 0xe8, 0xe5, 0xec, 0xf0, 0xeb, 0xf0,
       
    78   0xf3, 0x84, 0xb0, 0xc7, 0xd1, 0xde, 0xe5, 0xdc, 0xe6, 0xeb, 0xe3, 0xeb,
       
    79   0xef, 0xeb, 0xf1, 0xf4, 0xee, 0xf3, 0xf5, 0xf7, 0xfa, 0xfb, 0xfb, 0xfc,
       
    80   0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
       
    81   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
    82   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
    83   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
    84   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
    85   0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2c, 0x01, 0x00, 0x06,
       
    86   0xff, 0x40, 0x96, 0x50, 0xb1, 0xc9, 0x60, 0x48, 0x24, 0x21, 0x25, 0x43,
       
    87   0x71, 0x00, 0x56, 0x03, 0x16, 0x65, 0x32, 0x1a, 0x58, 0xad, 0x8a, 0xcc,
       
    88   0x08, 0x4a, 0x28, 0x08, 0x04, 0x93, 0xc4, 0xa0, 0x2b, 0x80, 0x98, 0x33,
       
    89   0x0d, 0x32, 0x24, 0xc0, 0xc6, 0x20, 0xbc, 0x6b, 0x76, 0x8a, 0xe4, 0x2d,
       
    90   0xcb, 0xe7, 0xf5, 0x75, 0x2a, 0x85, 0x22, 0x7d, 0xe3, 0x7c, 0x7d, 0x7f,
       
    91   0x01, 0x7c, 0x07, 0x07, 0x7e, 0x71, 0x28, 0x0f, 0x22, 0x0c, 0x24, 0x66,
       
    92   0x84, 0x07, 0x0c, 0x0c, 0x27, 0x8e, 0x6c, 0x28, 0x8c, 0x26, 0x26, 0x24,
       
    93   0x72, 0x91, 0x99, 0x0b, 0x9b, 0x90, 0x0c, 0x26, 0x0b, 0x21, 0xa0, 0x29,
       
    94   0x0f, 0xa2, 0xa4, 0x9b, 0x7b, 0xa8, 0xa3, 0xa5, 0x72, 0xad, 0xaa, 0xb0,
       
    95   0xa9, 0xaf, 0x84, 0xb1, 0xaf, 0xac, 0xb4, 0xa6, 0xb7, 0xbb, 0xba, 0xb3,
       
    96   0xae, 0xab, 0xa7, 0xbe, 0xb6, 0xc3, 0xc2, 0xc0, 0xbf, 0xb2, 0xb9, 0xc7,
       
    97   0xc4, 0xcb, 0xc6, 0xb2, 0xcc, 0xc9, 0xce, 0xb5, 0xd2, 0xbd, 0xcd, 0xbc,
       
    98   0x84, 0xd4, 0xc8, 0xd3, 0xd7, 0xd0, 0xb8, 0xd9, 0xdd, 0xd5, 0xcf, 0xd9,
       
    99   0xca, 0xe2, 0xdc, 0xdf, 0xe3, 0xe7, 0xe6, 0xea, 0xbe, 0xe4, 0xdb, 0xc5,
       
   100   0xeb, 0xc7, 0xed, 0xe1, 0xee, 0xd6, 0xec, 0xe9, 0xef, 0xf8, 0xf1, 0xf7,
       
   101   0xf5, 0xfc, 0xd1, 0xf0, 0xe5, 0xf9, 0xfc, 0x05, 0xa4, 0x07, 0x50, 0xdf,
       
   102   0x3f, 0x82, 0x08, 0x83, 0x1d, 0x9c, 0xc7, 0x10, 0xdb, 0x42, 0x6d, 0x0d,
       
   103   0xe5, 0x41, 0x9c, 0x08, 0xce, 0xe1, 0xc0, 0x86, 0x15, 0x25, 0x56, 0xdc,
       
   104   0x88, 0xee, 0x21, 0xc7, 0x6b, 0x1a, 0xf7, 0x15, 0x14, 0xd8, 0x2f, 0xe1,
       
   105   0xc4, 0x90, 0x1e, 0x3b, 0x5e, 0xa4, 0xa8, 0xb2, 0x24, 0xc6, 0x96, 0x23,
       
   106   0x4d, 0x66, 0x14, 0x29, 0x13, 0x66, 0xcd, 0x87, 0x28, 0x57, 0xce, 0x4c,
       
   107   0x89, 0x93, 0xe6, 0x4b, 0xe7, 0x90, 0xd2, 0x84, 0xb0, 0x20, 0x92, 0x01,
       
   108   0x49, 0x12, 0x29, 0x4c, 0x1c, 0x18, 0x10, 0x3a, 0x65, 0x44, 0x0b, 0xa1,
       
   109   0x43, 0xb5, 0xb4, 0x78, 0x2a, 0x34, 0x0c, 0x55, 0xa8, 0x68, 0xa0, 0x0a,
       
   110   0x25, 0x11, 0x41, 0xab, 0x90, 0xa3, 0x5e, 0xc1, 0x4e, 0x1d, 0x4b, 0x62,
       
   111   0xac, 0xd9, 0x16, 0x65, 0xa7, 0x0e, 0x58, 0xb1, 0x82, 0x00, 0x81, 0xb4,
       
   112   0x6b, 0xbb, 0x78, 0x21, 0xc1, 0xd6, 0xed, 0x97, 0x32, 0x74, 0xdd, 0xd6,
       
   113   0x09, 0x00, 0x21, 0xaf, 0x9a, 0x35, 0x74, 0xdb, 0xe6, 0xe9, 0x1b, 0x97,
       
   114   0xc0, 0x5d, 0x01, 0x24, 0xac, 0xb4, 0x25, 0x83, 0x58, 0xed, 0xe2, 0x2e,
       
   115   0x69, 0x5b, 0xac, 0x5d, 0x1c, 0x59, 0xad, 0x95, 0xca, 0x66, 0x8f, 0x9e,
       
   116   0x45, 0xeb, 0xf5, 0x6b, 0x67, 0x16, 0x60, 0xb5, 0x86, 0x86, 0x3a, 0x7a,
       
   117   0xeb, 0xe7, 0xd2, 0x9e, 0x3b, 0xa3, 0x06, 0x7d, 0xba, 0xb5, 0x6a, 0xd7,
       
   118   0x61, 0x61, 0x8b, 0x96, 0x4d, 0x9a, 0xb6, 0xe9, 0xd7, 0xb8, 0x63, 0xe7,
       
   119   0x9e, 0xbd, 0xbb, 0x76, 0xef, 0xdb, 0xba, 0x83, 0xf3, 0x16, 0xee, 0x9b,
       
   120   0x38, 0xf0, 0xe1, 0xc8, 0x8b, 0x27, 0x3f, 0xae, 0xbc, 0x39, 0xf3, 0xe7,
       
   121   0xa9, 0x8d, 0x47, 0x5f, 0x3e, 0xdd, 0x79, 0x75, 0xe8, 0xac, 0x7f, 0x5f,
       
   122   0xdf, 0x9e, 0x5d, 0x7a, 0x77, 0xea, 0xdf, 0xad, 0x87, 0xc7, 0xbe, 0xba,
       
   123   0xbc, 0x6d, 0xee, 0xe6, 0xb5, 0x8f, 0x47, 0x7f, 0x7e, 0xbd, 0xfb, 0xf4,
       
   124   0xde, 0xe1, 0x83, 0x97, 0x2f, 0x9e, 0x3e, 0xf9, 0xf6, 0xf6, 0xd9, 0xab,
       
   125   0xcf, 0xff, 0x1e, 0xbf, 0xff, 0xfd, 0xff, 0xc5, 0x17, 0xe0, 0x7c, 0x03,
       
   126   0xd6, 0x57, 0xe0, 0x7d, 0x00, 0x76, 0x16, 0x04, 0x00, 0x3b
       
   127 };
       
   128 static unsigned int tab_l_gif_len = 706;
       
   129 
       
   130 static unsigned char tab_r_gif[] = {
       
   131   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x90, 0x01, 0x2c, 0x01, 0xd5, 0x00,
       
   132   0x00, 0xf6, 0xf7, 0xf9, 0xf1, 0xf4, 0xf7, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd,
       
   133   0xfe, 0xfa, 0xfb, 0xfc, 0xf9, 0xfa, 0xfb, 0xf8, 0xf9, 0xfa, 0xea, 0xef,
       
   134   0xf3, 0xef, 0xf3, 0xf6, 0xc6, 0xd5, 0xdf, 0xd2, 0xde, 0xe6, 0xd8, 0xe2,
       
   135   0xe9, 0xde, 0xe7, 0xed, 0xdd, 0xe6, 0xec, 0xe5, 0xec, 0xf1, 0xe8, 0xee,
       
   136   0xf2, 0xf4, 0xf7, 0xf9, 0xf3, 0xf6, 0xf8, 0xb3, 0xc8, 0xd5, 0xc1, 0xd2,
       
   137   0xdd, 0xcb, 0xd9, 0xe2, 0xcf, 0xdc, 0xe4, 0xd6, 0xe1, 0xe8, 0x96, 0xb4,
       
   138   0xc5, 0x9d, 0xb9, 0xc9, 0xaf, 0xc2, 0xcd, 0xbb, 0xce, 0xd9, 0xc3, 0xd4,
       
   139   0xde, 0xc2, 0xd3, 0xdd, 0xc8, 0xd7, 0xe0, 0xcc, 0xda, 0xe2, 0xd5, 0xe1,
       
   140   0xe8, 0xd9, 0xe4, 0xea, 0xd7, 0xe2, 0xe8, 0xe5, 0xec, 0xf0, 0xeb, 0xf0,
       
   141   0xf3, 0x84, 0xb0, 0xc7, 0xd1, 0xde, 0xe5, 0xdc, 0xe6, 0xeb, 0xe3, 0xeb,
       
   142   0xef, 0xeb, 0xf1, 0xf4, 0xee, 0xf3, 0xf5, 0xf7, 0xfa, 0xfb, 0xfb, 0xfc,
       
   143   0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
       
   144   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
   145   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
   146   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
   147   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
   148   0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x2c, 0x01, 0x00, 0x06,
       
   149   0xff, 0x40, 0x92, 0x70, 0x48, 0x2c, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9,
       
   150   0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0xaf, 0xd8, 0xac,
       
   151   0x76, 0x0b, 0x95, 0x68, 0x3c, 0xac, 0x70, 0x6b, 0x4c, 0x2e, 0x9b, 0xcf,
       
   152   0xe8, 0xb4, 0x7a, 0xcd, 0x6e, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0xaf,
       
   153   0xdb, 0xef, 0xf8, 0xbc, 0x7e, 0xcf, 0x77, 0x0f, 0x56, 0x10, 0x16, 0x1a,
       
   154   0x17, 0x1c, 0x61, 0x2b, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
       
   155   0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a,
       
   156   0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0x93, 0x2a, 0x10, 0x01, 0x29, 0x15,
       
   157   0x5e, 0x2c, 0x2a, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
       
   158   0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
       
   159   0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xb6, 0x10, 0x10, 0x29, 0x0f, 0x27, 0x1d,
       
   160   0x17, 0x15, 0xc6, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
       
   161   0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2,
       
   162   0xe3, 0xe4, 0xe5, 0xe6, 0xda, 0xa5, 0x28, 0x22, 0x0c, 0x0c, 0x12, 0x12,
       
   163   0x01, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
       
   164   0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x03, 0x0a, 0x1c, 0x48, 0xb0, 0xa0,
       
   165   0xc1, 0x83, 0x08, 0x13, 0xf2, 0x4b, 0x81, 0x22, 0x19, 0x03, 0x13, 0x83,
       
   166   0x52, 0x48, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc,
       
   167   0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x49, 0xb2, 0xa4,
       
   168   0xc9, 0x93, 0x28, 0x53, 0xaa, 0x5c, 0xe9, 0x11, 0xc5, 0x81, 0x75, 0x26,
       
   169   0x40, 0x80, 0x20, 0xc1, 0xb2, 0xa6, 0xcd, 0x9b, 0x38, 0x73, 0xea, 0xdc,
       
   170   0xc9, 0xb3, 0xa7, 0x4f, 0xff, 0x96, 0x28, 0x1a, 0xc2, 0x04, 0xb1, 0x80,
       
   171   0x44, 0xd0, 0xa3, 0x48, 0x93, 0x2a, 0x5d, 0xca, 0xb4, 0xa9, 0xd3, 0xa7,
       
   172   0x50, 0xa3, 0x4a, 0x9d, 0x4a, 0xb5, 0xaa, 0xd5, 0xab, 0x58, 0xb3, 0x6a,
       
   173   0xdd, 0xca, 0xb5, 0xab, 0xd7, 0xaf, 0x53, 0x0f, 0x38, 0x34, 0xb1, 0x20,
       
   174   0x04, 0x89, 0x03, 0x68, 0xd3, 0xaa, 0x5d, 0xcb, 0xb6, 0xad, 0xdb, 0xb7,
       
   175   0x70, 0xe3, 0xca, 0x9d, 0x4b, 0xb7, 0xae, 0xdd, 0xbb, 0x78, 0xf3, 0xea,
       
   176   0xdd, 0xcb, 0xb7, 0xaf, 0xdf, 0xbf, 0x80, 0x03, 0xd3, 0x7d, 0x20, 0xe2,
       
   177   0x44, 0xcc, 0x10, 0x66, 0x1f, 0x28, 0x5e, 0xcc, 0xb8, 0xb1, 0xe3, 0xc7,
       
   178   0x90, 0x23, 0x4b, 0x9e, 0x4c, 0xb9, 0xb2, 0xe5, 0xcb, 0x98, 0x33, 0x6b,
       
   179   0xde, 0xcc, 0xb9, 0xb3, 0xe7, 0xcf, 0xa0, 0x43, 0x8b, 0x1e, 0x6d, 0xb9,
       
   180   0xf0, 0x43, 0xc4, 0x1f, 0x48, 0x9c, 0x58, 0xcd, 0xba, 0xb5, 0xeb, 0xd7,
       
   181   0xb0, 0x63, 0xcb, 0x9e, 0x4d, 0xbb, 0xb6, 0xed, 0xdb, 0xb8, 0x73, 0xeb,
       
   182   0xde, 0xcd, 0xbb, 0xb7, 0xef, 0xdf, 0xc0, 0x83, 0x0b, 0x1f, 0x4e, 0x1c,
       
   183   0xf7, 0xc3, 0x05, 0x1f, 0x4a, 0x94, 0x20, 0xc1, 0xae, 0xb9, 0xf3, 0xe7,
       
   184   0xd0, 0xa3, 0x4b, 0x9f, 0x4e, 0xbd, 0xba, 0xf5, 0xeb, 0xd8, 0xb3, 0x6b,
       
   185   0xdf, 0xce, 0xbd, 0xbb, 0xf7, 0xef, 0xe0, 0xc3, 0x8b, 0x1f, 0x4f, 0xbe,
       
   186   0x3c, 0x76, 0x13, 0x31, 0x91, 0x2b, 0x5f, 0x2e, 0xb3, 0xbd, 0xfb, 0xf7,
       
   187   0xf0, 0xe3, 0xcb, 0x9f, 0x4f, 0xbf, 0xbe, 0xfd, 0xfb, 0xf8, 0xf3, 0xeb,
       
   188   0xdf, 0xcf, 0xbf, 0xbf, 0xff, 0xff, 0x00, 0x06, 0x28, 0xe0, 0x80, 0x04,
       
   189   0x16, 0x98, 0x5f, 0x59, 0xc9, 0x95, 0x40, 0xc1, 0x72, 0x88, 0x35, 0xe8,
       
   190   0xe0, 0x83, 0x10, 0x46, 0x28, 0xe1, 0x84, 0x14, 0x56, 0x68, 0xe1, 0x85,
       
   191   0x18, 0x66, 0xa8, 0xe1, 0x86, 0x1c, 0x76, 0xe8, 0xff, 0xe1, 0x87, 0x20,
       
   192   0x86, 0x28, 0xe2, 0x88, 0x24, 0x96, 0xa8, 0x61, 0x82, 0x14, 0xa4, 0x48,
       
   193   0x82, 0x89, 0x2c, 0xb6, 0xe8, 0xe2, 0x8b, 0x30, 0xc6, 0x28, 0xe3, 0x8c,
       
   194   0x34, 0xd6, 0x68, 0xe2, 0x07, 0x09, 0x2a, 0xa8, 0x22, 0x8e, 0x3c, 0xf6,
       
   195   0xe8, 0xe3, 0x8f, 0x40, 0x06, 0x29, 0xe4, 0x90, 0x44, 0x16, 0x69, 0xe4,
       
   196   0x91, 0x48, 0x26, 0xa9, 0xe4, 0x92, 0x4c, 0x36, 0xe9, 0xe4, 0x93, 0x50,
       
   197   0x46, 0x29, 0xe5, 0x94, 0x54, 0x26, 0xa9, 0x5c, 0x8a, 0x3b, 0x56, 0xa9,
       
   198   0xe5, 0x96, 0x5c, 0x76, 0xe9, 0xe5, 0x97, 0x60, 0x86, 0x29, 0xe6, 0x98,
       
   199   0x5a, 0x5e, 0x89, 0x25, 0x09, 0x64, 0xa6, 0xa9, 0xe6, 0x9a, 0x6c, 0xb6,
       
   200   0xe9, 0xe6, 0x9b, 0x70, 0xfe, 0x68, 0x66, 0x96, 0x71, 0xd6, 0x69, 0xe7,
       
   201   0x9d, 0x78, 0xe6, 0xa9, 0xe7, 0x97, 0x73, 0x52, 0x80, 0xe6, 0x9e, 0x80,
       
   202   0x06, 0x2a, 0xe8, 0xa0, 0x84, 0xc2, 0xd9, 0xe7, 0x9f, 0x85, 0x26, 0xaa,
       
   203   0xe8, 0xa2, 0x8c, 0x36, 0x3a, 0xe4, 0xa1, 0x8e, 0x46, 0x2a, 0xe9, 0xa4,
       
   204   0x94, 0xc6, 0x09, 0x69, 0xa5, 0x98, 0x66, 0xaa, 0xe9, 0xa6, 0x4f, 0x5e,
       
   205   0xca, 0xe9, 0xa7, 0xa0, 0x86, 0xca, 0xa9, 0xa7, 0xa2, 0x96, 0x6a, 0xea,
       
   206   0xa9, 0x84, 0x92, 0x8a, 0xea, 0xaa, 0xac, 0xb6, 0xca, 0xa6, 0xaa, 0xae,
       
   207   0xc6, 0x2a, 0xeb, 0xac, 0x53, 0xc2, 0x4a, 0xeb, 0xad, 0xb8, 0xe6, 0x2a,
       
   208   0xa4, 0xad, 0xba, 0xf6, 0xea, 0xeb, 0xac, 0xbc, 0xfe, 0x2a, 0xec, 0xb0,
       
   209   0xa5, 0x06, 0x4b, 0xec, 0xb1, 0xc8, 0x56, 0x6a, 0x6c, 0xb2, 0xcc, 0x36,
       
   210   0x9b, 0xe8, 0xb2, 0xce, 0x46, 0x2b, 0x2d, 0x9e, 0xd0, 0x4e, 0x6b, 0xed,
       
   211   0xb5, 0x6b, 0x56, 0x8b, 0xed, 0xb6, 0xdc, 0x76, 0xa9, 0x6d, 0xb7, 0xe0,
       
   212   0x86, 0xdb, 0xa9, 0x8e, 0x74, 0x8a, 0x6b, 0xee, 0xb9, 0x51, 0x7e, 0x8b,
       
   213   0xff, 0xee, 0xba, 0xec, 0xf2, 0xa8, 0x6e, 0xbb, 0xf0, 0x9a, 0xfb, 0x6e,
       
   214   0xbc, 0xf4, 0x72, 0x3b, 0x6f, 0xbd, 0xf8, 0x4e, 0x7b, 0x6f, 0xbe, 0xfc,
       
   215   0x32, 0xbb, 0x6f, 0xbf, 0x00, 0x0f, 0xfb, 0x6f, 0xc0, 0x04, 0xeb, 0x3a,
       
   216   0x70, 0xc1, 0x08, 0x03, 0x4b, 0xae, 0x9f, 0x09, 0x37, 0x1c, 0xed, 0xc1,
       
   217   0x0e, 0x47, 0x6c, 0x2a, 0xc4, 0x12, 0x57, 0xfc, 0x29, 0xc5, 0x16, 0x67,
       
   218   0x8c, 0x29, 0xc6, 0x1a, 0x77, 0x1c, 0x29, 0xc7, 0x1e, 0x87, 0xac, 0x28,
       
   219   0xc8, 0x22, 0x97, 0x2c, 0x28, 0xc9, 0x26, 0xa7, 0x9c, 0x27, 0xca, 0x2a,
       
   220   0xb7, 0x6c, 0xe9, 0xc2, 0x88, 0xba, 0x2c, 0x33, 0xa5, 0x2c, 0xcf, 0x6c,
       
   221   0x33, 0x99, 0x35, 0xdf, 0xac, 0x33, 0x9f, 0x30, 0xef, 0xec, 0xf3, 0xb3,
       
   222   0x3d, 0xff, 0x2c, 0x74, 0xa0, 0x39, 0x0f, 0x6d, 0xb4, 0x93, 0x45, 0x1f,
       
   223   0xad, 0xb4, 0x95, 0x41, 0x2f, 0xed, 0x74, 0x9b, 0x49, 0x3f, 0x2d, 0x35,
       
   224   0x90, 0x51, 0x4f, 0x6d, 0x35, 0x8e, 0x55, 0x5f, 0x3d, 0x75, 0xd6, 0x5a,
       
   225   0x3f, 0xcd, 0x75, 0xd7, 0x4b, 0x7f, 0x0d, 0xf6, 0xd1, 0x62, 0x8f, 0x3d,
       
   226   0x74, 0xd9, 0x66, 0xff, 0x8c, 0x76, 0xda, 0x3b, 0xaf, 0xcd, 0xf6, 0xcd,
       
   227   0x6e, 0xbf, 0x3d, 0x73, 0xdc, 0x72, 0xbb, 0x4c, 0x77, 0xdd, 0x2a, 0xdf,
       
   228   0x8d, 0xb7, 0xc9, 0x7a, 0xef, 0x2d, 0x72, 0xdf, 0x7e, 0x7b, 0x0c, 0x78,
       
   229   0xe0, 0x1a, 0x0f, 0x4e, 0xb8, 0xc5, 0x86, 0x1f, 0x2e, 0x71, 0xe2, 0x8a,
       
   230   0x3b, 0xcc, 0x78, 0xe3, 0x09, 0x3f, 0x0e, 0x79, 0xc1, 0x92, 0x4f, 0x1e,
       
   231   0x70, 0xe5, 0x96, 0xf7, 0x8b, 0x79, 0xe6, 0xf9, 0x6e, 0xce, 0x79, 0xbd,
       
   232   0x9e, 0x7f, 0x1e, 0x6f, 0xe8, 0xa2, 0xb7, 0x4b, 0x7a, 0xe9, 0xeb, 0x9e,
       
   233   0x8e, 0xfa, 0xb9, 0xaa, 0xaf, 0x2e, 0x6e, 0xeb, 0xae, 0x83, 0x0b, 0x7b,
       
   234   0xec, 0xf6, 0x36, 0x4d, 0xff, 0xbb, 0xd6, 0xb3, 0xdf, 0x7e, 0x6d, 0xee,
       
   235   0xba, 0xeb, 0x6b, 0x7b, 0xef, 0x52, 0xf3, 0x0e, 0xbc, 0xb3, 0xc2, 0x0f,
       
   236   0xef, 0xef, 0xef, 0xc6, 0x2b, 0x5d, 0x7c, 0xf2, 0xc7, 0x2e, 0xcf, 0xbc,
       
   237   0xc0, 0xc8, 0x3f, 0x2f, 0xb4, 0xf3, 0xd2, 0xfb, 0x4a, 0x7d, 0xf5, 0x06,
       
   238   0x47, 0x8f, 0xbd, 0xce, 0xd7, 0x6f, 0x7f, 0x6b, 0xf7, 0xde, 0x2b, 0x8c,
       
   239   0x25, 0xc3, 0xe1, 0xab, 0xad, 0x7d, 0xf9, 0x76, 0x9f, 0x8f, 0x7e, 0xde,
       
   240   0xea, 0xaf, 0xcf, 0x77, 0xfb, 0xee, 0xff, 0x0d, 0x7f, 0xfc, 0x82, 0xcf,
       
   241   0x4f, 0x7f, 0xe1, 0xf6, 0xdf, 0x8f, 0x78, 0xfe, 0xfa, 0x2f, 0xce, 0x7f,
       
   242   0xff, 0x8e, 0xfb, 0x1f, 0x00, 0x23, 0x27, 0xc0, 0x01, 0x52, 0xae, 0x80,
       
   243   0x06, 0xbc, 0x1c, 0x02, 0x13, 0xa8, 0xb9, 0x05, 0x32, 0xb0, 0x73, 0x0e,
       
   244   0x7c, 0x20, 0xe8, 0x22, 0x28, 0xc1, 0xd1, 0x51, 0xb0, 0x82, 0xa6, 0xbb,
       
   245   0x20, 0x06, 0x53, 0xa7, 0xc1, 0x0d, 0xb2, 0xae, 0x83, 0x1e, 0x7c, 0x1d,
       
   246   0x08, 0x43, 0x28, 0xbb, 0x11, 0x92, 0xb0, 0x76, 0xe3, 0x8b, 0xd9, 0x09,
       
   247   0x09, 0x98, 0xc2, 0x15, 0x46, 0x0c, 0x7c, 0x2e, 0x64, 0x14, 0x0c, 0x63,
       
   248   0x38, 0x32, 0x13, 0xd2, 0x50, 0x5a, 0x33, 0xbc, 0x61, 0xaa, 0x6c, 0xa8,
       
   249   0xc3, 0x66, 0xe5, 0xb0, 0x87, 0x44, 0xe3, 0x21, 0x10, 0x91, 0xf5, 0xc3,
       
   250   0x21, 0xea, 0xa9, 0x88, 0x46, 0xa4, 0x96, 0x10, 0x93, 0x28, 0x2c, 0x24,
       
   251   0x32, 0xb1, 0x4e, 0x4e, 0x7c, 0xa2, 0xa1, 0x96, 0x28, 0xc5, 0xec, 0xb5,
       
   252   0xb0, 0x8a, 0x16, 0x4c, 0x21, 0x17, 0xb6, 0xc8, 0xc5, 0x2e, 0x7a, 0xf1,
       
   253   0x8b, 0x60, 0x0c, 0xa3, 0x18, 0xc7, 0x48, 0xc6, 0x2e, 0x7a, 0x01, 0x0c,
       
   254   0x61, 0x48, 0xa3, 0x1a, 0xd7, 0xc8, 0xc6, 0x36, 0xba, 0xf1, 0x8d, 0x70,
       
   255   0x8c, 0xa3, 0x1c, 0xe7, 0x48, 0xc7, 0x3a, 0xda, 0xff, 0xf1, 0x8e, 0x78,
       
   256   0xcc, 0xa3, 0x1e, 0xf7, 0xc8, 0xc7, 0x3e, 0xfa, 0xf1, 0x8f, 0x80, 0x0c,
       
   257   0x64, 0x1d, 0xc7, 0x40, 0x80, 0x00, 0x08, 0x82, 0x10, 0x82, 0x4c, 0xa4,
       
   258   0x22, 0x17, 0xc9, 0xc8, 0x46, 0x3a, 0xf2, 0x91, 0x90, 0x8c, 0xa4, 0x24,
       
   259   0x13, 0x39, 0x86, 0x02, 0x08, 0x20, 0x00, 0x28, 0x38, 0x85, 0x06, 0x26,
       
   260   0xc9, 0xc9, 0x4e, 0x7a, 0xf2, 0x93, 0xa0, 0x0c, 0xa5, 0x28, 0x47, 0xa9,
       
   261   0x46, 0x42, 0x5e, 0xb2, 0x21, 0xcb, 0xa8, 0x00, 0x29, 0x57, 0xc9, 0xca,
       
   262   0x56, 0xba, 0xf2, 0x95, 0xb0, 0x6c, 0xa4, 0x29, 0x31, 0x99, 0x0c, 0x77,
       
   263   0xc4, 0xf2, 0x96, 0xb8, 0xcc, 0xa5, 0x2e, 0x77, 0x19, 0xca, 0x59, 0xba,
       
   264   0xe4, 0x01, 0x83, 0xe0, 0xa5, 0x30, 0x87, 0x49, 0xcc, 0x62, 0x1a, 0xf3,
       
   265   0x8d, 0xbe, 0x7c, 0xc9, 0x03, 0x48, 0x70, 0xcc, 0x66, 0x3a, 0xf3, 0x99,
       
   266   0xd0, 0xec, 0x65, 0x0b, 0x08, 0x70, 0x4a, 0xb1, 0x88, 0x80, 0x04, 0x7d,
       
   267   0xc8, 0xa6, 0x36, 0xb7, 0xc9, 0xcd, 0x6e, 0x7a, 0xf3, 0x9b, 0xe0, 0x0c,
       
   268   0xa7, 0x38, 0xfb, 0x30, 0x00, 0x02, 0x90, 0xc2, 0x25, 0x22, 0xb8, 0xe6,
       
   269   0x38, 0xd7, 0xc9, 0xce, 0x76, 0xba, 0xf3, 0x9d, 0xf0, 0x8c, 0xa7, 0x3c,
       
   270   0xc9, 0x50, 0xce, 0x51, 0x60, 0xf2, 0x25, 0xd7, 0x24, 0x80, 0x3e, 0xf7,
       
   271   0xc9, 0xcf, 0x7e, 0xfa, 0xf3, 0x9f, 0x00, 0x0d, 0xa8, 0x40, 0x07, 0x4a,
       
   272   0xd0, 0x82, 0x1a, 0xf4, 0xa0, 0x08, 0x4d, 0xa8, 0x42, 0x17, 0xca, 0xd0,
       
   273   0x86, 0x3a, 0xf4, 0xa1, 0x10, 0x8d, 0xa8, 0x44, 0x27, 0x5a, 0x50, 0x4b,
       
   274   0x46, 0x20, 0x05, 0xd6, 0xbc, 0x26, 0x31, 0x36, 0xca, 0xd1, 0x8e, 0x7a,
       
   275   0xf4, 0xa3, 0x20, 0x0d, 0xa9, 0x48, 0x47, 0x4a, 0x52, 0x62, 0x08, 0x20,
       
   276   0x02, 0xf7, 0x4c, 0xe7, 0x35, 0xcf, 0xc1, 0xd2, 0x96, 0xba, 0xf4, 0xa5,
       
   277   0xff, 0x30, 0x8d, 0xa9, 0x4c, 0x67, 0x4a, 0xd3, 0x9a, 0x9a, 0x23, 0x02,
       
   278   0x28, 0x65, 0x08, 0x3e, 0xaf, 0x89, 0xd3, 0x9e, 0xfa, 0xf4, 0xa7, 0x40,
       
   279   0x0d, 0xaa, 0x50, 0x87, 0x4a, 0xd4, 0xa2, 0x1a, 0xf5, 0xa8, 0x48, 0x4d,
       
   280   0xaa, 0x52, 0x97, 0xca, 0xd4, 0xa6, 0x3a, 0xf5, 0xa9, 0x50, 0x8d, 0xaa,
       
   281   0x54, 0xa7, 0x4a, 0xd5, 0xaa, 0x26, 0x35, 0x1d, 0x3b, 0x25, 0x81, 0x55,
       
   282   0xb7, 0xca, 0xd5, 0xae, 0x7a, 0xf5, 0xab, 0x60, 0x0d, 0xab, 0x58, 0xc7,
       
   283   0x4a, 0x56, 0xab, 0xc2, 0x43, 0xa7, 0x8b, 0xd1, 0x6a, 0x59, 0xd7, 0xca,
       
   284   0xd6, 0xb6, 0xba, 0xf5, 0xad, 0x70, 0x8d, 0xab, 0x5c, 0x7f, 0x8a, 0x55,
       
   285   0xb4, 0x90, 0xc0, 0xa6, 0x78, 0xcd, 0xab, 0x5e, 0xf7, 0xca, 0xd7, 0xbe,
       
   286   0xfa, 0xf5, 0xaf, 0xd0, 0xc0, 0x69, 0x29, 0x24, 0x82, 0x02, 0x12, 0x94,
       
   287   0xf4, 0xb0, 0x88, 0x4d, 0xac, 0x62, 0x17, 0xcb, 0xd8, 0xc6, 0x3a, 0x76,
       
   288   0x15, 0x02, 0x88, 0x2c, 0x04, 0x04, 0x0b, 0x0f, 0x12, 0x14, 0xe0, 0xb2,
       
   289   0x98, 0xcd, 0xac, 0x66, 0x37, 0xcb, 0xd9, 0xce, 0x7a, 0xf6, 0xb3, 0xa0,
       
   290   0x0d, 0xad, 0x68, 0x47, 0x4b, 0xda, 0xd2, 0x9a, 0xf6, 0xb4, 0xa8, 0x4d,
       
   291   0xad, 0x6a, 0x57, 0xcb, 0xda, 0xd6, 0xba, 0xf6, 0xb5, 0xb0, 0x15, 0xad,
       
   292   0x2a, 0x24, 0xdb, 0x53, 0x12, 0x50, 0xf4, 0xb6, 0xb8, 0xcd, 0xad, 0x6e,
       
   293   0x77, 0xcb, 0xdb, 0xde, 0xfa, 0xf6, 0xb7, 0xc0, 0xc5, 0x6d, 0x01, 0x20,
       
   294   0x2b, 0x00, 0x12, 0x84, 0xe2, 0xb8, 0xc8, 0x4d, 0xae, 0x72, 0x97, 0xcb,
       
   295   0xdc, 0xe6, 0x3a, 0xf7, 0xb9, 0xd0, 0x45, 0xae, 0x3f, 0xb1, 0x39, 0xcf,
       
   296   0xea, 0x5a, 0xf7, 0xba, 0xd8, 0xcd, 0xae, 0x76, 0xbf, 0x39, 0x80, 0xee,
       
   297   0x22, 0x82, 0xba, 0xdb, 0x0d, 0xaf, 0x78, 0xc7, 0x4b, 0xde, 0xf2, 0x62,
       
   298   0x97, 0x99, 0xd1, 0x4c, 0xff, 0xaf, 0x7a, 0xd7, 0xcb, 0x5e, 0x41, 0xa2,
       
   299   0xb7, 0xbd, 0xf0, 0x8d, 0xaf, 0x7c, 0xe7, 0x1b, 0x86, 0xf7, 0xd2, 0xf7,
       
   300   0xbe, 0xf8, 0xcd, 0xaf, 0x30, 0xed, 0xab, 0xdf, 0xfe, 0xfa, 0xf7, 0xbf,
       
   301   0xa1, 0xe4, 0x2f, 0x80, 0x07, 0x4c, 0xe0, 0x02, 0xbb, 0xd7, 0xc0, 0x08,
       
   302   0x4e, 0xb0, 0x82, 0xef, 0x28, 0xe0, 0x05, 0x3b, 0xf8, 0xc1, 0x09, 0x6e,
       
   303   0x30, 0x84, 0x27, 0x4c, 0x61, 0xfd, 0x4a, 0xb8, 0xc2, 0x18, 0xce, 0x30,
       
   304   0x7b, 0x2f, 0xac, 0xe1, 0x0e, 0x7b, 0xd8, 0x98, 0x1c, 0xfe, 0xb0, 0x88,
       
   305   0x47, 0x7c, 0xcb, 0x10, 0x93, 0xf8, 0xc4, 0x28, 0x16, 0xa5, 0x89, 0x53,
       
   306   0xcc, 0xe2, 0x16, 0x43, 0x72, 0xc5, 0x2e, 0x8e, 0xb1, 0x8c, 0x01, 0x09,
       
   307   0xe3, 0x19, 0xdb, 0xf8, 0xc6, 0x76, 0xac, 0x31, 0x8e, 0x77, 0xcc, 0x63,
       
   308   0x36, 0xea, 0xb8, 0xc7, 0x40, 0xde, 0xf1, 0x8f, 0x83, 0x4c, 0x64, 0x19,
       
   309   0x0f, 0xb9, 0xc8, 0x48, 0x4e, 0xf1, 0x91, 0x93, 0xcc, 0x64, 0x11, 0x2f,
       
   310   0xb9, 0xc9, 0x50, 0xce, 0xf0, 0x93, 0xa3, 0x4c, 0x65, 0x08, 0x4f, 0xb9,
       
   311   0xca, 0x58, 0x8e, 0x70, 0x96, 0xb7, 0x7c, 0xe2, 0x2b, 0x73, 0xf9, 0xcb,
       
   312   0xfd, 0xf5, 0x32, 0x98, 0xc7, 0x4c, 0x5f, 0x31, 0x93, 0xf9, 0xcc, 0xed,
       
   313   0x35, 0x33, 0x9a, 0xd7, 0x1c, 0x4d, 0x35, 0xb3, 0xf9, 0xcd, 0xc7, 0x74,
       
   314   0x33, 0x9c, 0xe7, 0xbc, 0x5f, 0x3a, 0xdb, 0xd9, 0xc2, 0x77, 0xce, 0x73,
       
   315   0x99, 0xf5, 0xcc, 0x67, 0xf8, 0xca, 0xb9, 0xcf, 0x80, 0x0e, 0x70, 0xa0,
       
   316   0x07, 0xfd, 0xcc, 0x3f, 0x13, 0xfa, 0xd0, 0x2f, 0x46, 0xb4, 0xa2, 0xeb,
       
   317   0xbc, 0xe8, 0x46, 0xe3, 0xd2, 0xd0, 0x8e, 0x8e, 0x74, 0x1f, 0x21, 0x2d,
       
   318   0xe9, 0x4a, 0xe3, 0x91, 0xd2, 0x96, 0xce, 0xf4, 0x1c, 0x31, 0xad, 0xe9,
       
   319   0x4e, 0xbb, 0x91, 0xd3, 0x9e, 0x0e, 0x75, 0x1a, 0xff, 0x41, 0x2d, 0xea,
       
   320   0x50, 0x93, 0xba, 0xd4, 0x9d, 0x3e, 0x35, 0xaa, 0x33, 0xad, 0xea, 0x55,
       
   321   0x57, 0xba, 0xd5, 0xae, 0x8e, 0x34, 0xac, 0x63, 0xdd, 0xe8, 0x59, 0xd3,
       
   322   0x5a, 0xd1, 0xb6, 0xbe, 0xf5, 0xa1, 0x73, 0xad, 0xeb, 0x41, 0xf3, 0xba,
       
   323   0xd7, 0x80, 0xfe, 0x35, 0xb0, 0xf9, 0x2c, 0xec, 0x61, 0xe7, 0xb9, 0xd8,
       
   324   0xc6, 0xb6, 0x33, 0xb2, 0x93, 0x3d, 0xe7, 0x65, 0x33, 0xfb, 0xcd, 0xce,
       
   325   0x7e, 0xf6, 0x9a, 0xa3, 0x2d, 0xed, 0x33, 0x53, 0xbb, 0xda, 0x63, 0xbe,
       
   326   0x36, 0xb6, 0xbf, 0xac, 0xed, 0x6d, 0x6f, 0xb9, 0xdb, 0xde, 0xc6, 0x32,
       
   327   0xb8, 0xc3, 0x4d, 0xe5, 0x71, 0x93, 0x1b, 0xca, 0xe6, 0x3e, 0x37, 0x93,
       
   328   0xd3, 0xad, 0x6e, 0x24, 0xb3, 0xbb, 0xdd, 0x44, 0x7e, 0x37, 0xbc, 0x81,
       
   329   0x2c, 0xef, 0x79, 0xf3, 0xb8, 0xde, 0xf6, 0xc6, 0x31, 0xbe, 0xf3, 0x6d,
       
   330   0xe3, 0x7d, 0xf3, 0xdb, 0xc8, 0xff, 0x76, 0xb5, 0xbf, 0x03, 0xde, 0xe2,
       
   331   0x81, 0x13, 0x5c, 0xc9, 0x07, 0x2f, 0xb5, 0xc1, 0x13, 0x4e, 0xe2, 0x85,
       
   332   0x33, 0xdc, 0xc9, 0x0f, 0xf7, 0xb4, 0xc3, 0x23, 0xde, 0xe1, 0x89, 0x53,
       
   333   0x5c, 0xca, 0x17, 0x67, 0x75, 0xc6, 0x2d, 0x6d, 0xf1, 0x8d, 0x4f, 0xb8,
       
   334   0xe3, 0x1e, 0x7f, 0x30, 0xc8, 0x43, 0xbe, 0xe0, 0x91, 0x93, 0x5c, 0xcb,
       
   335   0x27, 0x5f, 0xb4, 0xc9, 0x53, 0x5e, 0xe0, 0x95, 0xb3, 0x7c, 0xc0, 0x2e,
       
   336   0x7f, 0xf9, 0x7f, 0x63, 0x2e, 0xf3, 0x30, 0xd7, 0x9c, 0xd0, 0x34, 0xbf,
       
   337   0x39, 0x7e, 0x73, 0xae, 0xf3, 0x3d, 0xf7, 0xbc, 0xcf, 0x3c, 0xff, 0x79,
       
   338   0x7c, 0x83, 0x2e, 0xf4, 0x34, 0x17, 0x5d, 0xcf, 0x44, 0x3f, 0xba, 0x7a,
       
   339   0x93, 0xae, 0xf4, 0x36, 0x37, 0x5d, 0xd9, 0x4f, 0xa7, 0x33, 0xd3, 0xa3,
       
   340   0xde, 0xcc, 0xa9, 0x53, 0x1d, 0xc4, 0x57, 0x87, 0x76, 0xd6, 0xd9, 0x6c,
       
   341   0x3e, 0xf5, 0xad, 0x33, 0xda, 0xeb, 0x64, 0xee, 0x3a, 0xd8, 0x75, 0x29,
       
   342   0xf6, 0xb1, 0x3f, 0xda, 0xec, 0xd9, 0x46, 0x3b, 0x98, 0xcb, 0xae, 0xf6,
       
   343   0x57, 0xb2, 0xbd, 0xed, 0xad, 0x7c, 0x3b, 0xdc, 0x57, 0x29, 0xf7, 0xb9,
       
   344   0x8f, 0xb2, 0xee, 0x76, 0x17, 0x74, 0xde, 0xcb, 0xbd, 0x77, 0xbe, 0xf7,
       
   345   0x1d, 0xdd, 0x7f, 0x07, 0x7c, 0xe0, 0xd7, 0x3d, 0x78, 0xc2, 0x17, 0xde,
       
   346   0xdd, 0x41, 0x00, 0x00, 0x3b
       
   347 };
       
   348 static unsigned int tab_r_gif_len = 2585;
       
   349 
       
   350 static unsigned char search_sel_png[] = {
       
   351   0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
       
   352   0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10,
       
   353   0x08, 0x02, 0x00, 0x00, 0x00, 0x99, 0x7a, 0xc8, 0x4c, 0x00, 0x00, 0x01,
       
   354   0xd6, 0x49, 0x44, 0x41, 0x54, 0x28, 0x15, 0x8d, 0x92, 0xbb, 0xae, 0x41,
       
   355   0x51, 0x10, 0x86, 0xcf, 0x66, 0x0b, 0x22, 0x44, 0x23, 0x4a, 0xb7, 0xd0,
       
   356   0x11, 0x09, 0x71, 0x49, 0xbc, 0x82, 0xc2, 0x2b, 0xa0, 0xd6, 0x29, 0x74,
       
   357   0x1e, 0x42, 0xeb, 0x11, 0x44, 0x41, 0x43, 0x45, 0x27, 0x48, 0x08, 0x91,
       
   358   0x10, 0x51, 0xba, 0x14, 0x42, 0x21, 0x91, 0x10, 0x97, 0xf3, 0xb1, 0x9c,
       
   359   0x9d, 0x13, 0x97, 0x93, 0x33, 0xc5, 0xda, 0xb3, 0x66, 0xfe, 0xff, 0x9f,
       
   360   0x59, 0x33, 0x5b, 0xba, 0x5e, 0xaf, 0x5f, 0x77, 0xbb, 0x5c, 0x2e, 0xd2,
       
   361   0xdd, 0xc4, 0xf5, 0x3f, 0xa7, 0xac, 0x30, 0x3b, 0x9d, 0x4e, 0xbf, 0xdf,
       
   362   0x9f, 0x4e, 0xa7, 0x44, 0xdc, 0x6e, 0xb7, 0xdf, 0xef, 0x0f, 0x87, 0xc3,
       
   363   0x7f, 0x4b, 0x48, 0xa7, 0xd3, 0x89, 0x7a, 0xd5, 0x6a, 0xb5, 0x5c, 0x2e,
       
   364   0x9f, 0xcf, 0x67, 0xea, 0x43, 0x50, 0xa9, 0x54, 0x6a, 0xb5, 0x3a, 0x91,
       
   365   0x48, 0xc4, 0xe3, 0x71, 0xb2, 0x9f, 0x24, 0x64, 0x70, 0xad, 0x56, 0xab,
       
   366   0x54, 0x2a, 0x19, 0x0c, 0x86, 0x50, 0x28, 0xe4, 0xf5, 0x7a, 0x81, 0x0e,
       
   367   0x87, 0xc3, 0x76, 0xbb, 0x4d, 0xd0, 0x62, 0xb1, 0x44, 0xa3, 0xd1, 0x8f,
       
   368   0x64, 0x12, 0xdd, 0x6e, 0x97, 0xfa, 0x91, 0x48, 0x84, 0x3a, 0x5a, 0xad,
       
   369   0x96, 0x52, 0x4e, 0xa7, 0x13, 0xd1, 0x5a, 0xad, 0x46, 0x8a, 0xe6, 0xf1,
       
   370   0xdf, 0xf2, 0x55, 0x0c, 0x6c, 0x32, 0x99, 0x70, 0x52, 0xd6, 0x68, 0x34,
       
   371   0xea, 0xf5, 0x7a, 0x9d, 0x4e, 0x87, 0xc3, 0x55, 0xa4, 0xde, 0xd2, 0x44,
       
   372   0x50, 0x06, 0x21, 0xde, 0x49, 0x4d, 0x59, 0x7e, 0xcc, 0x8f, 0x07, 0x23,
       
   373   0x01, 0x82, 0x14, 0x36, 0x1a, 0x8d, 0x8a, 0xc5, 0xe2, 0x6f, 0x95, 0x54,
       
   374   0x2a, 0xc5, 0x03, 0x6f, 0xfd, 0xd0, 0x24, 0x67, 0xaf, 0xd7, 0x43, 0x48,
       
   375   0x41, 0x70, 0xc5, 0x77, 0xb9, 0x5c, 0x9c, 0xe0, 0x40, 0x2b, 0xd9, 0x64,
       
   376   0x32, 0x29, 0x46, 0x73, 0x23, 0xfb, 0x7c, 0x3e, 0xce, 0x66, 0xb3, 0x59,
       
   377   0xa9, 0x54, 0x56, 0xab, 0xd5, 0x72, 0xb9, 0xc4, 0x69, 0x34, 0x1a, 0x04,
       
   378   0xd9, 0x99, 0x98, 0x36, 0xe8, 0x74, 0x3a, 0x4d, 0x04, 0xa6, 0xc0, 0xe3,
       
   379   0x4b, 0x74, 0xb5, 0xdb, 0xed, 0xd8, 0x53, 0xbd, 0x5e, 0xa7, 0x6d, 0x1a,
       
   380   0x26, 0xca, 0xce, 0x18, 0x21, 0xa5, 0x6c, 0x36, 0x5b, 0x2e, 0x97, 0x33,
       
   381   0x99, 0x4c, 0x04, 0xb1, 0xc1, 0x60, 0xa0, 0x30, 0xb9, 0xaa, 0xf3, 0xf9,
       
   382   0x3c, 0x1c, 0xbb, 0xdd, 0x6e, 0x36, 0x9b, 0x41, 0x23, 0x04, 0xdf, 0xe3,
       
   383   0xf1, 0xb0, 0xa1, 0xed, 0x76, 0x4b, 0x17, 0xe3, 0xf1, 0x38, 0x18, 0x0c,
       
   384   0x32, 0x11, 0xd0, 0x56, 0xab, 0xf5, 0xa6, 0xf1, 0x63, 0x92, 0x78, 0x09,
       
   385   0x75, 0xf6, 0xfb, 0xfd, 0xe1, 0x70, 0x10, 0x05, 0x35, 0x1a, 0x0d, 0x8a,
       
   386   0x9b, 0xcd, 0xa6, 0x50, 0x28, 0xac, 0xd7, 0x6b, 0x87, 0xc3, 0x91, 0xcd,
       
   387   0x66, 0x59, 0xc1, 0x0f, 0xeb, 0xf1, 0xbd, 0xb5, 0x2d, 0x5e, 0x85, 0x0a,
       
   388   0xa6, 0x5c, 0x09, 0xa2, 0xb5, 0x58, 0x2c, 0xe0, 0xa3, 0x92, 0xc9, 0x64,
       
   389   0x02, 0x81, 0xc0, 0x33, 0x59, 0x70, 0x04, 0xff, 0x29, 0x47, 0x0a, 0xfe,
       
   390   0x7c, 0x3e, 0x9f, 0xcd, 0x66, 0xb1, 0x58, 0x8c, 0x5f, 0xe0, 0x09, 0xf6,
       
   391   0x68, 0x1b, 0xdc, 0x53, 0x42, 0x08, 0x11, 0x3f, 0x1e, 0x8f, 0xcc, 0x8f,
       
   392   0xb5, 0xbf, 0xfe, 0x67, 0x0f, 0x32, 0xd0, 0xdf, 0x0d, 0xbf, 0xb6, 0xf0,
       
   393   0x56, 0xfa, 0x1b, 0x21, 0x36, 0x05, 0xd3, 0x4d, 0xe6, 0x17, 0x7f, 0x00,
       
   394   0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
       
   395 };
       
   396 static unsigned int search_sel_png_len = 527;
       
   397 
       
   398 unsigned char search_png[] = {
       
   399   0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
       
   400   0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
       
   401   0x08, 0x06, 0x00, 0x00, 0x00, 0xc9, 0x56, 0x25, 0x04, 0x00, 0x00, 0x01,
       
   402   0x9e, 0x49, 0x44, 0x41, 0x54, 0x28, 0x15, 0xa5, 0x52, 0xcd, 0xca, 0x41,
       
   403   0x51, 0x14, 0x5d, 0xdf, 0x75, 0xe5, 0x96, 0xa2, 0x64, 0x2e, 0x6e, 0x86,
       
   404   0x64, 0x24, 0x79, 0x07, 0xc9, 0x0b, 0x18, 0x1b, 0x9a, 0x18, 0x78, 0x08,
       
   405   0x33, 0x03, 0x6f, 0x21, 0x19, 0x31, 0x62, 0x22, 0x49, 0x28, 0x26, 0xa2,
       
   406   0x0c, 0x0c, 0x4c, 0xa4, 0x28, 0x7f, 0x85, 0xed, 0xee, 0x5d, 0xe7, 0x84,
       
   407   0x81, 0xfa, 0xbe, 0x6f, 0x0f, 0xee, 0x3d, 0xad, 0xbd, 0xd6, 0xda, 0xfb,
       
   408   0xec, 0x7d, 0x80, 0x7f, 0xc4, 0xcf, 0xab, 0xb6, 0xdf, 0xef, 0xd3, 0x64,
       
   409   0x32, 0xc1, 0x62, 0xb1, 0x10, 0x38, 0x1a, 0x8d, 0x22, 0x91, 0x48, 0x20,
       
   410   0x95, 0x4a, 0xbd, 0xf1, 0x94, 0x46, 0x83, 0x8d, 0x46, 0x83, 0xea, 0xf5,
       
   411   0x3a, 0xee, 0xf7, 0x3b, 0x1e, 0x8f, 0x87, 0xe4, 0x0d, 0xc3, 0x80, 0xcb,
       
   412   0xe5, 0x42, 0x2e, 0x97, 0x43, 0x36, 0x9b, 0xd5, 0xdc, 0x37, 0x71, 0xaf,
       
   413   0xd7, 0xa3, 0x5a, 0xad, 0x06, 0xaf, 0xd7, 0x8b, 0x64, 0x32, 0x89, 0x58,
       
   414   0x2c, 0x26, 0xf9, 0xe9, 0x74, 0x8a, 0xc1, 0x60, 0x80, 0xe3, 0xf1, 0x88,
       
   415   0x42, 0xa1, 0x80, 0x74, 0x3a, 0xfd, 0x66, 0x60, 0x32, 0x6b, 0x38, 0x1c,
       
   416   0xe2, 0x76, 0xbb, 0x71, 0x7b, 0xc8, 0x64, 0x32, 0x08, 0x04, 0x02, 0x42,
       
   417   0xda, 0xed, 0x76, 0xc4, 0xd5, 0x5b, 0xad, 0x96, 0x70, 0x54, 0x45, 0xf5,
       
   418   0x37, 0xf8, 0x30, 0x9f, 0xcf, 0x41, 0x44, 0x52, 0x55, 0x09, 0x19, 0xe7,
       
   419   0x33, 0x77, 0xc2, 0x39, 0xe6, 0x7c, 0x86, 0x88, 0xd5, 0x1d, 0x3d, 0x1e,
       
   420   0xcf, 0x67, 0x1e, 0x96, 0x65, 0x09, 0xa6, 0x38, 0xaf, 0x04, 0x11, 0x47,
       
   421   0x22, 0x11, 0xc1, 0xc6, 0xe3, 0x31, 0x0f, 0x8b, 0x14, 0x81, 0xcf, 0x8c,
       
   422   0x71, 0xd8, 0xb6, 0xad, 0x60, 0xfd, 0x97, 0x3b, 0xc7, 0xe3, 0x71, 0x8c,
       
   423   0x46, 0x23, 0x74, 0xbb, 0x5d, 0x98, 0xa6, 0x89, 0xcd, 0x66, 0xe3, 0x74,
       
   424   0x4a, 0x68, 0x36, 0x9b, 0xe8, 0x74, 0x3a, 0x42, 0xe6, 0xb5, 0x7d, 0x86,
       
   425   0x0c, 0x66, 0xbf, 0xdf, 0xcb, 0x9a, 0xda, 0xed, 0xb6, 0x88, 0x79, 0x3d,
       
   426   0x1c, 0xbc, 0x36, 0x1e, 0x24, 0x1b, 0x85, 0x42, 0x21, 0x94, 0xcb, 0x65,
       
   427   0xf8, 0xfd, 0x7e, 0x3d, 0x71, 0xa9, 0xcc, 0x00, 0x4f, 0x36, 0x18, 0x0c,
       
   428   0x62, 0x36, 0x9b, 0x61, 0xb5, 0x5a, 0x89, 0x38, 0x1c, 0x0e, 0x83, 0xaf,
       
   429   0xe4, 0xac, 0x12, 0xeb, 0xf5, 0x1a, 0x95, 0x4a, 0x05, 0x87, 0xc3, 0x81,
       
   430   0x7c, 0x3e, 0x9f, 0x18, 0x68, 0x17, 0x66, 0x73, 0x07, 0xd7, 0xeb, 0x55,
       
   431   0x57, 0x73, 0xbb, 0xdd, 0xd2, 0x89, 0x63, 0x8c, 0x6a, 0xb5, 0x8a, 0xed,
       
   432   0x76, 0x0b, 0x36, 0x2c, 0x95, 0x4a, 0x50, 0x06, 0x52, 0xe5, 0xdb, 0xe7,
       
   433   0x74, 0x3a, 0xd1, 0x72, 0xb9, 0xa4, 0x62, 0xb1, 0x48, 0xf9, 0x7c, 0x9e,
       
   434   0x9c, 0x77, 0xa1, 0x87, 0xfa, 0x4d, 0xa7, 0x73, 0xe7, 0xf3, 0x59, 0x0c,
       
   435   0x9c, 0x07, 0x43, 0xce, 0x8b, 0xfb, 0x9d, 0x98, 0x5d, 0x2e, 0x97, 0xcb,
       
   436   0xdf, 0x84, 0xba, 0x85, 0x97, 0xc3, 0x13, 0x25, 0xab, 0xcb, 0x08, 0x4d,
       
   437   0x39, 0xd0, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
       
   438   0x42, 0x60, 0x82
       
   439 };
       
   440 unsigned int search_png_len = 471;
       
   441 
       
   442 
       
   443 
       
   444 static unsigned char close_png[] = {
       
   445   0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
       
   446   0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b,
       
   447   0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0xac, 0x77, 0x26, 0x00, 0x00, 0x00,
       
   448   0xd8, 0x49, 0x44, 0x41, 0x54, 0x18, 0x19, 0x75, 0x51, 0xbd, 0x12, 0x46,
       
   449   0x40, 0x0c, 0xdc, 0x18, 0x15, 0x0a, 0x14, 0x14, 0x1a, 0x43, 0xeb, 0x35,
       
   450   0xbc, 0x7f, 0xa7, 0x43, 0x67, 0x06, 0x33, 0x28, 0xd0, 0xde, 0x77, 0x7b,
       
   451   0x23, 0x2a, 0xdf, 0x16, 0x97, 0x9f, 0xdb, 0xcb, 0x26, 0x39, 0xc1, 0x83,
       
   452   0x7d, 0xdf, 0xcd, 0xb2, 0x2c, 0xd8, 0xb6, 0x0d, 0xe7, 0x79, 0x22, 0x8a,
       
   453   0x22, 0xc4, 0x71, 0x8c, 0x3c, 0xcf, 0x91, 0xa6, 0xa9, 0x90, 0xe6, 0x8e,
       
   454   0x69, 0x9a, 0xcc, 0x38, 0x8e, 0xb8, 0xae, 0x4b, 0xdf, 0xbe, 0x36, 0x0c,
       
   455   0x43, 0x94, 0x65, 0x89, 0xa2, 0x28, 0xc4, 0x3b, 0x8e, 0xe3, 0x2f, 0x91,
       
   456   0x2f, 0xa8, 0xc2, 0x42, 0x56, 0xd1, 0x78, 0xf3, 0x3c, 0xbb, 0x04, 0x2f,
       
   457   0xda, 0xb6, 0x45, 0x55, 0x55, 0x74, 0x9d, 0x65, 0x2c, 0x22, 0xb8, 0xef,
       
   458   0x1b, 0xeb, 0xba, 0xc2, 0x67, 0x8f, 0x4c, 0x10, 0x7d, 0xdf, 0xa3, 0xae,
       
   459   0x6b, 0xe7, 0xd3, 0x32, 0x56, 0x90, 0xe7, 0x53, 0x46, 0x31, 0x0c, 0x83,
       
   460   0x73, 0x95, 0xa8, 0x31, 0x93, 0x9c, 0xc7, 0xe3, 0xd4, 0x0a, 0xb6, 0xa0,
       
   461   0x44, 0x5a, 0xc6, 0xc6, 0x18, 0x77, 0xcd, 0x41, 0xbd, 0x24, 0x49, 0x94,
       
   462   0xfb, 0x12, 0x59, 0x51, 0x5b, 0xd2, 0x16, 0xed, 0xfa, 0x20, 0xdc, 0x6f,
       
   463   0xd7, 0x75, 0x9f, 0x6b, 0xd3, 0x2a, 0x41, 0x10, 0xa0, 0x69, 0x1a, 0x57,
       
   464   0x59, 0x28, 0x47, 0x99, 0x2f, 0x30, 0xcf, 0x7b, 0xfb, 0x41, 0xcf, 0x1a,
       
   465   0x2c, 0xeb, 0xeb, 0x07, 0x29, 0x9d, 0x65, 0x19, 0x6c, 0xab, 0x6e, 0x5d,
       
   466   0x3f, 0x07, 0x0a, 0x79, 0x90, 0x0e, 0x11, 0x45, 0xc2, 0x00, 0x00, 0x00,
       
   467   0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
       
   468 };
       
   469 static unsigned int close_png_len = 273;
       
   470 
       
   471 
       
   472 static const char tabs_css[] = 
       
   473 "/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */\n"
       
   474 "\n"
       
   475 "DIV.tabs\n"
       
   476 "{\n"
       
   477 "   float            : left;\n"
       
   478 "   width            : 100%;\n"
       
   479 "   background       : url(\"tab_b.gif\") repeat-x bottom;\n"
       
   480 "   margin-bottom    : 4px;\n"
       
   481 "}\n"
       
   482 "\n"
       
   483 "DIV.tabs UL\n"
       
   484 "{\n"
       
   485 "   margin           : 0px;\n"
       
   486 "   padding-left     : 10px;\n"
       
   487 "   list-style       : none;\n"
       
   488 "}\n"
       
   489 "\n"
       
   490 "DIV.tabs LI, DIV.tabs FORM\n"
       
   491 "{\n"
       
   492 "   display          : inline;\n"
       
   493 "   margin           : 0px;\n"
       
   494 "   padding          : 0px;\n"
       
   495 "}\n"
       
   496 "\n"
       
   497 "DIV.tabs FORM\n"
       
   498 "{\n"
       
   499 "   float            : right;\n"
       
   500 "}\n"
       
   501 "\n"
       
   502 "DIV.tabs A\n"
       
   503 "{\n"
       
   504 "   float            : left;\n"
       
   505 "   background       : url(\"tab_r.gif\") no-repeat right top;\n"
       
   506 "   border-bottom    : 1px solid #84B0C7;\n"
       
   507 "   font-size        : 80%;\n"
       
   508 "   font-weight      : bold;\n"
       
   509 "   text-decoration  : none;\n"
       
   510 "}\n"
       
   511 "\n"
       
   512 "DIV.tabs A:hover\n"
       
   513 "{\n"
       
   514 "   background-position: 100% -150px;\n"
       
   515 "}\n"
       
   516 "\n"
       
   517 "DIV.tabs A:link, DIV.tabs A:visited,\n"
       
   518 "DIV.tabs A:active, DIV.tabs A:hover\n"
       
   519 "{\n"
       
   520 "       color: #1A419D;\n"
       
   521 "}\n"
       
   522 "\n"
       
   523 "DIV.tabs SPAN\n"
       
   524 "{\n"
       
   525 "   float            : left;\n"
       
   526 "   display          : block;\n"
       
   527 "   background       : url(\"tab_l.gif\") no-repeat left top;\n"
       
   528 "   padding          : 5px 9px;\n"
       
   529 "   white-space      : nowrap;\n"
       
   530 "}\n"
       
   531 "\n"
       
   532 "DIV.tabs #MSearchBox\n"
       
   533 "{\n"
       
   534 "   float            : right;\n"
       
   535 "   display          : inline;\n"
       
   536 "   font-size        : 1em;\n"
       
   537 "}\n"
       
   538 "\n"
       
   539 "DIV.tabs TD\n"
       
   540 "{\n"
       
   541 "   font-size        : 80%;\n"
       
   542 "   font-weight      : bold;\n"
       
   543 "   text-decoration  : none;\n"
       
   544 "}\n"
       
   545 "\n"
       
   546 "\n"
       
   547 "\n"
       
   548 "/* Commented Backslash Hack hides rule from IE5-Mac \\*/\n"
       
   549 "DIV.tabs SPAN {float : none;}\n"
       
   550 "/* End IE5-Mac hack */\n"
       
   551 "\n"
       
   552 "DIV.tabs A:hover SPAN\n"
       
   553 "{\n"
       
   554 "   background-position: 0% -150px;\n"
       
   555 "}\n"
       
   556 "\n"
       
   557 "DIV.tabs LI.current A\n"
       
   558 "{\n"
       
   559 "   background-position: 100% -150px;\n"
       
   560 "   border-width     : 0px;\n"
       
   561 "}\n"
       
   562 "\n"
       
   563 "DIV.tabs LI.current SPAN\n"
       
   564 "{\n"
       
   565 "   background-position: 0% -150px;\n"
       
   566 "   padding-bottom   : 6px;\n"
       
   567 "}\n"
       
   568 "\n"
       
   569 "DIV.navpath\n"
       
   570 "{\n"
       
   571 "   background       : none;\n"
       
   572 "   border           : none;\n"
       
   573 "   border-bottom    : 1px solid #84B0C7;\n"
       
   574 "   text-align       : center;\n"
       
   575 "   margin           : 2px;\n"
       
   576 "   padding          : 2px;\n"
       
   577 "}\n"
       
   578 ;
       
   579 
       
   580 struct img_data_item
       
   581 {
       
   582   const char *name;
       
   583   unsigned char *content;
       
   584   unsigned int len;
       
   585 };
       
   586 
       
   587 static void writeImgData(const char *dir,img_data_item *data)
       
   588 {
       
   589   while (data->name)
       
   590   {
       
   591     QCString fileName;
       
   592     fileName=(QCString)dir+"/"+data->name;
       
   593     QFile f(fileName);
       
   594     if (f.open(IO_WriteOnly))
       
   595     {
       
   596       f.writeBlock((char*)data->content,
       
   597                     data->len>0 ? data->len : strlen((char*)data->content));
       
   598     }
       
   599     else
       
   600     {
       
   601       fprintf(stderr,"Warning: Cannot open file %s for writing\n",data->name);
       
   602     }
       
   603     data++;
       
   604   }
       
   605 }
       
   606 
       
   607 static img_data_item tab_data[] =
       
   608 {
       
   609   { "tab_b.gif", tab_b_gif, tab_b_gif_len },
       
   610   { "tab_l.gif", tab_l_gif, tab_l_gif_len },
       
   611   { "tab_r.gif", tab_r_gif, tab_r_gif_len },
       
   612   { "tabs.css",  (unsigned char *)tabs_css, 0 }, 
       
   613   { 0, 0, 0 }
       
   614 };
       
   615 
       
   616 static void writeTabData(const char *dir)
       
   617 {
       
   618   writeImgData(dir,tab_data);
       
   619 }
       
   620 
       
   621 static img_data_item search_client_data[] =
       
   622 {
       
   623   { "search.png",       search_sel_png,   search_sel_png_len },
       
   624   { "close.png",        close_png,        close_png_len },
       
   625   { 0, 0, 0 }
       
   626 };
       
   627 
       
   628 static img_data_item search_server_data[] =
       
   629 {
       
   630   { "search.png",       search_png,       search_png_len },
       
   631   { 0, 0, 0 }
       
   632 };
       
   633 
       
   634 void HtmlGenerator::writeSearchData(const char *dir)
       
   635 {
       
   636   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
       
   637   writeImgData(dir,serverBasedSearch ? search_server_data : search_client_data);
       
   638   Doxygen::indexList.addImageFile("search/close.png");
       
   639   Doxygen::indexList.addImageFile("search/search.png");
       
   640 }
       
   641 
       
   642 
       
   643 //------------------------------------------------------------------------
       
   644 
       
   645 unsigned char open_gif[] = {
       
   646   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x09, 0x00, 0x09, 0x00, 0xf0, 0x00,
       
   647   0x00, 0x8e, 0xaf, 0xc4, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00,
       
   648   0x00, 0x01, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
       
   649   0x00, 0x02, 0x0d, 0x8c, 0x8f, 0xa9, 0xcb, 0xe0, 0xff, 0x02, 0x8c, 0x66,
       
   650   0x26, 0x7a, 0x51, 0x01, 0x00, 0x3b
       
   651 };
       
   652 unsigned int open_gif_len = 54;
       
   653 
       
   654 unsigned char closed_gif[] = {
       
   655   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x09, 0x00, 0x09, 0x00, 0xf0, 0x00,
       
   656   0x00, 0x8e, 0xaf, 0xc4, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00,
       
   657   0x00, 0x01, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
       
   658   0x00, 0x02, 0x10, 0x8c, 0x03, 0xa7, 0x98, 0xcb, 0xad, 0x80, 0x84, 0x66,
       
   659   0xca, 0x38, 0x57, 0xd6, 0xf4, 0xd0, 0x02, 0x00, 0x3b
       
   660 };
       
   661 unsigned int closed_gif_len = 57;
       
   662 
       
   663 
       
   664 
       
   665 //------------------------- Pictures for the Tabs ------------------------
       
   666 
       
   667 HtmlGenerator::HtmlGenerator() : OutputGenerator()
       
   668 {
       
   669   dir=Config_getString("HTML_OUTPUT");
       
   670   col=0;  
       
   671 }
       
   672 
       
   673 HtmlGenerator::~HtmlGenerator()
       
   674 {
       
   675   //printf("HtmlGenerator::~HtmlGenerator()\n");
       
   676 }
       
   677 
       
   678 void HtmlGenerator::init()
       
   679 {
       
   680   QCString dname=Config_getString("HTML_OUTPUT");
       
   681   QDir d(dname);
       
   682   if (!d.exists() && !d.mkdir(dname))
       
   683   {
       
   684     err("Could not create output directory %s\n",dname.data());
       
   685     exit(1);
       
   686   }
       
   687   writeLogo(dname);
       
   688   if (!Config_getString("HTML_HEADER").isEmpty()) 
       
   689   {
       
   690     g_header=fileToString(Config_getString("HTML_HEADER"));
       
   691     //printf("g_header='%s'\n",g_header.data());
       
   692   }
       
   693   if (!Config_getString("HTML_FOOTER").isEmpty()) 
       
   694   {
       
   695     g_footer=fileToString(Config_getString("HTML_FOOTER"));
       
   696     //printf("g_footer='%s'\n",g_footer.data());
       
   697   }
       
   698   createSubDirs(d);
       
   699 
       
   700   writeTabData(dname);
       
   701 }
       
   702 
       
   703 void HtmlGenerator::writeStyleSheetFile(QFile &file)
       
   704 {
       
   705   QTextStream t(&file);
       
   706   t << defaultStyleSheet;
       
   707 }
       
   708 
       
   709 static void writeDefaultHeaderFile(QTextStream &t, const char *title,
       
   710                                    const char *relPath,bool usePathCmd,
       
   711                                    bool searchPage=FALSE)
       
   712 {
       
   713   QString relPathStr;
       
   714   if (usePathCmd) 
       
   715     relPathStr="$relpath$";
       
   716   else
       
   717     relPathStr=relPath;
       
   718 
       
   719   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
       
   720   static bool searchEngine = Config_getBool("SEARCHENGINE");
       
   721   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
       
   722   if (searchEngine && !generateTreeView)
       
   723   {
       
   724     t << "<!-- This comment will put IE 6, 7 and 8 in quirks mode -->" << endl;
       
   725   }
       
   726 //  t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
       
   727 //  t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
       
   728   t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
       
   729   t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
       
   730        "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
       
   731        "<title>"; 
       
   732   t << convertToHtml(title);
       
   733   t << "</title>\n";
       
   734   t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
       
   735   if (searchEngine && !generateTreeView)
       
   736   {
       
   737     t << "<link href=\"" << relPathStr << "search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
       
   738     t << "<script type=\"text/javaScript\" src=\"" << relPathStr << "search/search.js\"></script>\n";
       
   739   }
       
   740   t << "<link ";
       
   741   t << "href=\"";
       
   742   if (Config_getString("HTML_STYLESHEET").isEmpty())
       
   743   {
       
   744     t << relPathStr << "doxygen.css";
       
   745   }
       
   746   else
       
   747   {
       
   748     QCString cssname=Config_getString("HTML_STYLESHEET");
       
   749     QFileInfo cssfi(cssname);
       
   750     if (!cssfi.exists())
       
   751     {
       
   752       err("Error: user specified HTML style sheet file does not exist!\n");
       
   753     }
       
   754     t << relPathStr << cssfi.fileName();
       
   755   }
       
   756   
       
   757   t << "\" rel=\"stylesheet\" type=\"text/css\"/>\n";
       
   758   t << "</head>\n";
       
   759   if (searchEngine && !generateTreeView && !serverBasedSearch)
       
   760   {
       
   761     // for the javascript based search select the default filter
       
   762     t << "<body onload='searchBox.OnSelectItem(0);'>\n";
       
   763   }
       
   764   else
       
   765   {
       
   766     if (searchPage) // keep focus on search result's box when loading 
       
   767                     // search results page
       
   768     {
       
   769       t << "<body onload='searchBox.DOMSearchField().focus()'>\n";
       
   770     }
       
   771     else
       
   772     {
       
   773       t << "<body>\n";
       
   774     }
       
   775   }
       
   776 }
       
   777 
       
   778 
       
   779 void HtmlGenerator::writeHeaderFile(QFile &file)
       
   780 {
       
   781   QTextStream t(&file);
       
   782   t.setEncoding(QTextStream::UnicodeUTF8);
       
   783   writeDefaultHeaderFile(t,"$title",relativePathToRoot(0),TRUE);
       
   784 }
       
   785 
       
   786 void HtmlGenerator::writeFooterFile(QFile &file)
       
   787 {
       
   788   QTextStream t(&file);
       
   789   t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>\n";
       
   790   t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
       
   791   t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
       
   792     << "<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>"
       
   793     << "</a> $doxygenversion";
       
   794   t << "</small></address>\n"
       
   795     << "</body>\n"
       
   796     << "</html>\n";
       
   797 }
       
   798 
       
   799 static void generateDynamicSections(QTextStream &t,const QCString &relPath)
       
   800 {
       
   801   if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
       
   802   { 
       
   803     t << 
       
   804       "<script type=\"text/javascript\">\n"
       
   805       "<!--\n"
       
   806       "function changeDisplayState (e){\n"
       
   807       "  var num=this.id.replace(/[^[0-9]/g,'');\n"
       
   808       "  var button=this.firstChild;\n"
       
   809       "  var sectionDiv=document.getElementById('dynsection'+num);\n"
       
   810       "  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
       
   811       "    sectionDiv.style.display='block';\n"
       
   812       "    button.src='" << relPath << "open.gif';\n"
       
   813       "  }else{\n"
       
   814       "    sectionDiv.style.display='none';\n"
       
   815       "    button.src='" << relPath << "closed.gif';\n"
       
   816       "  }\n"
       
   817       "}\n"
       
   818       "function initDynSections(){\n"
       
   819       "  var divs=document.getElementsByTagName('div');\n"
       
   820       "  var sectionCounter=1;\n"
       
   821       "  for(var i=0;i<divs.length-1;i++){\n"
       
   822       "    if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){\n"
       
   823       "      var header=divs[i];\n"
       
   824       "      var section=divs[i+1];\n"
       
   825       "      var button=header.firstChild;\n"
       
   826       "      if (button!='IMG'){\n"
       
   827       "        divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);\n"
       
   828       "        button=document.createElement('img');\n"
       
   829       "        divs[i].insertBefore(button,divs[i].firstChild);\n"
       
   830       "      }\n"
       
   831       "      header.style.cursor='pointer';\n"
       
   832       "      header.onclick=changeDisplayState;\n"
       
   833       "      header.id='dynheader'+sectionCounter;\n"
       
   834       "      button.src='" << relPath << "closed.gif';\n"
       
   835       "      section.id='dynsection'+sectionCounter;\n"
       
   836       "      section.style.display='none';\n"
       
   837       "      section.style.marginLeft='14px';\n"
       
   838       "      sectionCounter++;\n"
       
   839       "    }\n"
       
   840       "  }\n"
       
   841       "}\n"
       
   842       "window.onload = initDynSections;\n"
       
   843       "-->\n"
       
   844       "</script>\n";
       
   845   }
       
   846 }
       
   847 
       
   848 
       
   849 void HtmlGenerator::startFile(const char *name,const char *,
       
   850                               const char *title)
       
   851 {
       
   852   //printf("HtmlGenerator::startFile(%s)\n",name);
       
   853   QCString fileName=name;
       
   854   lastTitle=title;
       
   855   relPath = relativePathToRoot(fileName);
       
   856 
       
   857   if (fileName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension) 
       
   858   {
       
   859     fileName+=Doxygen::htmlFileExtension;
       
   860   }
       
   861   startPlainFile(fileName);
       
   862   Doxygen::indexList.addIndexFile(fileName);
       
   863   //if (Config_getBool("GENERATE_HTMLHELP"))
       
   864   //{
       
   865   //  HtmlHelp::getInstance()->addIndexFile(fileName);
       
   866   //}
       
   867   
       
   868   QCString dispTitle = title;
       
   869   QCString projName = Config_getString("PROJECT_NAME");
       
   870   if (!projName.isEmpty())
       
   871   {
       
   872     dispTitle.prepend(projName+": ");
       
   873   }
       
   874  
       
   875   lastFile = fileName;
       
   876   if (g_header.isEmpty()) 
       
   877   {
       
   878     writeDefaultHeaderFile(t,dispTitle,relPath,FALSE);
       
   879   }
       
   880   else
       
   881   {
       
   882     t << substituteKeywords(g_header,convertToHtml(dispTitle),relPath);
       
   883   }
       
   884   t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen " 
       
   885     << versionString << " -->" << endl;
       
   886   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
       
   887   static bool searchEngine = Config_getBool("SEARCHENGINE");
       
   888   if (searchEngine && !generateTreeView)
       
   889   {
       
   890     t << "<script type=\"text/javascript\"><!--\n";
       
   891     t << "var searchBox = new SearchBox(\"searchBox\", \""
       
   892       << relPath<< "search\",false,'" << theTranslator->trSearch() << "');\n";
       
   893     t << "--></script>\n";
       
   894   }
       
   895   generateDynamicSections(t,relPath);
       
   896 }
       
   897 
       
   898 void HtmlGenerator::writeSearchFooter(QTextStream &t,const QCString &relPath)
       
   899 {
       
   900   (void)relPath;
       
   901   t << "<!--- window showing the filter options -->\n";
       
   902   t << "<div id=\"MSearchSelectWindow\"\n";
       
   903   t << "     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
       
   904   t << "     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
       
   905   t << "     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n";
       
   906   writeSearchCategories(t);
       
   907   t << "</div>\n";
       
   908   t << "\n";
       
   909   t << "<!-- iframe showing the search results (closed by default) -->\n";
       
   910   t << "<div id=\"MSearchResultsWindow\">\n";
       
   911   t << "<iframe src=\"\" frameborder=\"0\" \n";
       
   912   t << "        name=\"MSearchResults\" id=\"MSearchResults\">\n";
       
   913   t << "</iframe>\n";
       
   914   t << "</div>\n";
       
   915   t << "\n";
       
   916 }
       
   917 
       
   918 static void writePageFooter(QTextStream &t,const QCString &lastTitle,
       
   919                             const QCString relPath)
       
   920 {
       
   921   static bool generateTreeView  = Config_getBool("GENERATE_TREEVIEW");
       
   922   static bool searchEngine      = Config_getBool("SEARCHENGINE");
       
   923   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
       
   924   static bool timeStamp         = Config_getBool("HTML_TIMESTAMP");
       
   925   if (searchEngine && !generateTreeView && !serverBasedSearch)
       
   926   {
       
   927     HtmlGenerator::writeSearchFooter(t,relPath);
       
   928   }
       
   929   if (g_footer.isEmpty())
       
   930   {
       
   931     t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>";
       
   932     if (timeStamp)
       
   933     {
       
   934       t << theTranslator->trGeneratedAt(
       
   935           dateToString(TRUE),
       
   936           Config_getString("PROJECT_NAME")
       
   937          );
       
   938     }
       
   939     else
       
   940     {
       
   941       t << theTranslator->trGeneratedBy();
       
   942     }
       
   943     t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
       
   944     t << endl << "<img class=\"footer\" src=\"" << relPath << "doxygen.png\" alt=\"doxygen\"/>"
       
   945       << "</a> " << versionString << " ";
       
   946     t << "</small></address>";
       
   947     if (Debug::isFlagSet(Debug::Validate))
       
   948     {
       
   949       t << "<p><a href=\"http://validator.w3.org/check/referer\">"
       
   950            "<img class=\"footer\" src=\"http://www.w3.org/Icons/valid-html401\""
       
   951            " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 "
       
   952            "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">"
       
   953            "<img class=\"footer\" style=\"border:0;width:88px;height:31px\" "
       
   954            "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" "
       
   955            "alt=\"This page uses valid CSS!\"/></a></p>";
       
   956     }
       
   957     t << "\n</body>\n</html>\n";
       
   958   }
       
   959   else
       
   960   {
       
   961     t << substituteKeywords(g_footer,convertToHtml(lastTitle),relPath);
       
   962   }
       
   963 }
       
   964 
       
   965 void HtmlGenerator::writeFooter()
       
   966 {
       
   967   writePageFooter(t,lastTitle,relPath);
       
   968 }
       
   969 
       
   970 void HtmlGenerator::endFile()
       
   971 {
       
   972   endPlainFile();
       
   973 }
       
   974 
       
   975 void HtmlGenerator::startProjectNumber()
       
   976 {
       
   977   t << "<h3 class=\"version\">";
       
   978 }
       
   979 
       
   980 void HtmlGenerator::endProjectNumber()
       
   981 {
       
   982   t << "</h3>";
       
   983 }
       
   984 
       
   985 void HtmlGenerator::writeStyleInfo(int part)
       
   986 {
       
   987   //printf("writeStyleInfo(%d)\n",part);
       
   988   if (part==0)
       
   989   {
       
   990     if (Config_getString("HTML_STYLESHEET").isEmpty()) // write default style sheet
       
   991     {
       
   992       //printf("write doxygen.css\n");
       
   993       startPlainFile("doxygen.css"); 
       
   994       
       
   995       // alternative, cooler looking titles
       
   996       //t << "H1 { text-align: center; border-width: thin none thin none;" << endl;
       
   997       //t << "     border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }" << endl;
       
   998 
       
   999       t << defaultStyleSheet;
       
  1000       endPlainFile();
       
  1001       Doxygen::indexList.addStyleSheetFile("doxygen.css");
       
  1002     }
       
  1003     else // write user defined style sheet
       
  1004     {
       
  1005       QCString cssname=Config_getString("HTML_STYLESHEET");
       
  1006       QFileInfo cssfi(cssname);
       
  1007       if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
       
  1008       {
       
  1009         err("Error: style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
       
  1010       }
       
  1011       else
       
  1012       {
       
  1013         // convert style sheet to string
       
  1014         QCString fileStr = fileToString(cssname);
       
  1015         // write the string into the output dir
       
  1016         startPlainFile(cssfi.fileName());
       
  1017         t << fileStr;
       
  1018         endPlainFile();
       
  1019       }
       
  1020       Doxygen::indexList.addStyleSheetFile(cssfi.fileName());
       
  1021     }
       
  1022   }
       
  1023 }
       
  1024 
       
  1025 void HtmlGenerator::startDoxyAnchor(const char *,const char *,
       
  1026                                     const char *anchor, const char *name,
       
  1027                                     const char *args)
       
  1028 {
       
  1029   t << "<a class=\"anchor\" id=\"" << anchor << "\"></a>";
       
  1030   t << "<!-- doxytag: member=\"";
       
  1031   docify(name,TRUE); 
       
  1032   t << "\" ref=\""; 
       
  1033   docify(anchor,TRUE); 
       
  1034   t << "\" args=\"";
       
  1035   docify(args,TRUE);
       
  1036   t << "\" -->";
       
  1037 }
       
  1038 
       
  1039 void HtmlGenerator::endDoxyAnchor(const char *,const char *)
       
  1040 {
       
  1041 }
       
  1042 
       
  1043 //void HtmlGenerator::newParagraph()
       
  1044 //{
       
  1045 //  t << endl << "<p>" << endl;
       
  1046 //}
       
  1047 
       
  1048 void HtmlGenerator::startParagraph()
       
  1049 {
       
  1050   t << endl << "<p>";
       
  1051 }
       
  1052 
       
  1053 void HtmlGenerator::endParagraph()
       
  1054 {
       
  1055   t << "</p>" << endl;
       
  1056 }
       
  1057 
       
  1058 void HtmlGenerator::writeString(const char *text)
       
  1059 {
       
  1060   t << text;
       
  1061 }
       
  1062 
       
  1063 void HtmlGenerator::startIndexListItem()
       
  1064 {
       
  1065   t << "<li>";
       
  1066 }
       
  1067 
       
  1068 void HtmlGenerator::endIndexListItem()
       
  1069 {
       
  1070   t << "</li>" << endl;
       
  1071 }
       
  1072 
       
  1073 void HtmlGenerator::startIndexItem(const char *ref,const char *f)
       
  1074 {
       
  1075   //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
       
  1076   QCString *dest;
       
  1077   if (ref || f)
       
  1078   {
       
  1079     if (ref) 
       
  1080     {
       
  1081       t << "<a class=\"elRef\" ";
       
  1082       t << "doxygen=\"" << ref << ":";
       
  1083       if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
       
  1084       t << "\" ";
       
  1085     }
       
  1086     else
       
  1087     {
       
  1088       t << "<a class=\"el\" ";
       
  1089     }
       
  1090     t << "href=\"";
       
  1091     if (ref)
       
  1092     {
       
  1093       if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
       
  1094     }
       
  1095     else
       
  1096     {
       
  1097       t << relPath;
       
  1098     }
       
  1099     if (f) t << f << Doxygen::htmlFileExtension << "\">";
       
  1100   }
       
  1101   else
       
  1102   {
       
  1103     t << "<b>";
       
  1104   }
       
  1105 }
       
  1106 
       
  1107 void HtmlGenerator::endIndexItem(const char *ref,const char *f)
       
  1108 {
       
  1109   //printf("HtmlGenerator::endIndexItem(%s,%s,%s)\n",ref,f,name);
       
  1110   if (ref || f)
       
  1111   {
       
  1112     t << "</a>";
       
  1113   }
       
  1114   else
       
  1115   {
       
  1116     t << "</b>";
       
  1117   }
       
  1118 }
       
  1119 
       
  1120 void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
       
  1121                                        const char *path,const char *name)
       
  1122 {
       
  1123   t << "<li>";
       
  1124   if (path) docify(path);
       
  1125   t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
       
  1126   docify(name);
       
  1127   t << "</a> ";
       
  1128 }
       
  1129 
       
  1130 void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
       
  1131                                     const char *anchor, const char *name)
       
  1132 {
       
  1133   QCString *dest;
       
  1134   if (ref) 
       
  1135   {
       
  1136     t << "<a class=\"elRef\" ";
       
  1137     t << "doxygen=\"" << ref << ":";
       
  1138     if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
       
  1139     t << "\" ";
       
  1140   }
       
  1141   else
       
  1142   {
       
  1143     t << "<a class=\"el\" ";
       
  1144   }
       
  1145   t << "href=\"";
       
  1146   if (ref)
       
  1147   {
       
  1148     if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
       
  1149   }
       
  1150   else
       
  1151   {
       
  1152     t << relPath;
       
  1153   }
       
  1154   if (f) t << f << Doxygen::htmlFileExtension;
       
  1155   if (anchor) t << "#" << anchor;
       
  1156   t << "\">";
       
  1157   docify(name);
       
  1158   t << "</a>";
       
  1159 }
       
  1160 
       
  1161 void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
       
  1162                                   const char *anchor, const char *name,
       
  1163                                   const char *tooltip)
       
  1164 {
       
  1165   QCString *dest;
       
  1166   //printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
       
  1167   if (ref) 
       
  1168   {
       
  1169     t << "<a class=\"codeRef\" ";
       
  1170     t << "doxygen=\"" << ref << ":";
       
  1171     if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
       
  1172     t << "\" ";
       
  1173   }
       
  1174   else
       
  1175   {
       
  1176     t << "<a class=\"code\" ";
       
  1177   }
       
  1178   t << "href=\"";
       
  1179   if (ref)
       
  1180   {
       
  1181     if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
       
  1182   }
       
  1183   else
       
  1184   {
       
  1185     t << relPath;
       
  1186   }
       
  1187   if (f) t << f << Doxygen::htmlFileExtension;
       
  1188   if (anchor) t << "#" << anchor;
       
  1189   t << "\"";
       
  1190   if (tooltip) t << " title=\"" << convertToXML(tooltip) << "\"";
       
  1191   t << ">";
       
  1192   docify(name);
       
  1193   t << "</a>";
       
  1194   col+=strlen(name);
       
  1195 }
       
  1196 
       
  1197 void HtmlGenerator::startTextLink(const char *f,const char *anchor)
       
  1198 {
       
  1199   t << "<a href=\"";
       
  1200   if (f)   t << relPath << f << Doxygen::htmlFileExtension;
       
  1201   if (anchor) t << "#" << anchor;
       
  1202   t << "\">"; 
       
  1203 }
       
  1204 
       
  1205 void HtmlGenerator::endTextLink()
       
  1206 {
       
  1207   t << "</a>";
       
  1208 }
       
  1209 
       
  1210 void HtmlGenerator::startHtmlLink(const char *url)
       
  1211 {
       
  1212   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
       
  1213   t << "<a ";
       
  1214   if (generateTreeView) t << "target=\"top\" ";
       
  1215   t << "href=\"";
       
  1216   if (url) t << url;
       
  1217   t << "\">"; 
       
  1218 }
       
  1219 
       
  1220 void HtmlGenerator::endHtmlLink()
       
  1221 {
       
  1222   t << "</a>";
       
  1223 }
       
  1224 
       
  1225 void HtmlGenerator::startGroupHeader()
       
  1226 {
       
  1227   t << "<h2>";
       
  1228 }
       
  1229 
       
  1230 void HtmlGenerator::endGroupHeader()
       
  1231 {
       
  1232   t << "</h2>" << endl;
       
  1233 }
       
  1234 
       
  1235 void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
       
  1236 {
       
  1237   switch(type)
       
  1238   {
       
  1239     case SectionInfo::Page:          t << "\n\n<h1>"; break;
       
  1240     case SectionInfo::Section:       t << "\n\n<h2>"; break;
       
  1241     case SectionInfo::Subsection:    t << "\n\n<h3>"; break;
       
  1242     case SectionInfo::Subsubsection: t << "\n\n<h4>"; break;
       
  1243     case SectionInfo::Paragraph:     t << "\n\n<h5>"; break;
       
  1244     default: ASSERT(0); break;
       
  1245   }
       
  1246   t << "<a class=\"anchor\" id=\"" << lab << "\">";
       
  1247 }
       
  1248 
       
  1249 void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
       
  1250 {
       
  1251   t << "</a>";
       
  1252   switch(type)
       
  1253   {
       
  1254     case SectionInfo::Page:          t << "</h1>"; break;
       
  1255     case SectionInfo::Section:       t << "</h2>"; break;
       
  1256     case SectionInfo::Subsection:    t << "</h3>"; break;
       
  1257     case SectionInfo::Subsubsection: t << "</h4>"; break;
       
  1258     case SectionInfo::Paragraph:     t << "</h5>"; break;
       
  1259     default: ASSERT(0); break;
       
  1260   }
       
  1261 }
       
  1262 
       
  1263 void HtmlGenerator::docify(const char *str)
       
  1264 {
       
  1265   docify(str,FALSE);
       
  1266 }
       
  1267 
       
  1268 void HtmlGenerator::docify(const char *str,bool inHtmlComment)
       
  1269 {
       
  1270   if (str)
       
  1271   {
       
  1272     const char *p=str;
       
  1273     char c;
       
  1274     while (*p)
       
  1275     {
       
  1276       c=*p++;
       
  1277       switch(c)
       
  1278       {
       
  1279         case '<':  t << "&lt;"; break;
       
  1280         case '>':  t << "&gt;"; break;
       
  1281         case '&':  t << "&amp;"; break;
       
  1282         case '"':  t << "&quot;"; break;
       
  1283         case '-':  if (inHtmlComment) t << "&#45;"; else t << "-"; break;
       
  1284         case '\\':
       
  1285                    if (*p=='<')
       
  1286                      { t << "&lt;"; p++; }
       
  1287                    else if (*p=='>')
       
  1288                      { t << "&gt;"; p++; }
       
  1289                    else
       
  1290                      t << "\\";
       
  1291                    break;
       
  1292         default:   t << c; 
       
  1293       }
       
  1294     }
       
  1295   }
       
  1296 }
       
  1297 
       
  1298 void HtmlGenerator::codify(const char *str)
       
  1299 {
       
  1300   //docify(str);
       
  1301   //static char spaces[]="        ";
       
  1302   if (str)
       
  1303   { 
       
  1304     const char *p=str;
       
  1305     char c;
       
  1306     int spacesToNextTabStop;
       
  1307     while (*p)
       
  1308     {
       
  1309       c=*p++;
       
  1310       switch(c)
       
  1311       {
       
  1312         case '\t': spacesToNextTabStop = 
       
  1313                          Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE")); 
       
  1314                    t << Doxygen::spaces.left(spacesToNextTabStop); 
       
  1315                    col+=spacesToNextTabStop; 
       
  1316                    break; 
       
  1317         case '\n': t << "\n"; col=0; 
       
  1318                    break;
       
  1319         //case '\n': t << "<br>"; col=0; 
       
  1320         //           break;
       
  1321         case '\r': break;
       
  1322         case '<':  t << "&lt;"; col++; 
       
  1323                    break;
       
  1324         case '>':  t << "&gt;"; col++; 
       
  1325                    break;
       
  1326         case '&':  t << "&amp;"; col++; 
       
  1327                    break;
       
  1328         case '\'': t << "&#39;"; col++; // &apos; is not valid HTML
       
  1329                    break;
       
  1330         case '"':  t << "&quot;"; col++;
       
  1331                    break;
       
  1332         //case ' ':  t << "&nbsp;"; col++;
       
  1333         //           break;
       
  1334         case '\\':
       
  1335                    if (*p=='<')
       
  1336                      { t << "&lt;"; p++; }
       
  1337                    else if (*p=='>')
       
  1338                      { t << "&gt;"; p++; }
       
  1339                    else
       
  1340                      t << "\\";
       
  1341                    col++;
       
  1342                    break;
       
  1343         default:   t << c;    
       
  1344                    col++;                    
       
  1345                    break;
       
  1346       }
       
  1347     }
       
  1348   }
       
  1349 }
       
  1350 
       
  1351 void HtmlGenerator::writeChar(char c)
       
  1352 {
       
  1353   char cs[2];
       
  1354   cs[0]=c;
       
  1355   cs[1]=0;
       
  1356   docify(cs);
       
  1357 }
       
  1358 
       
  1359 void HtmlGenerator::startClassDiagram()
       
  1360 {
       
  1361   //t << "<p>";
       
  1362   t << "<div class=\"dynheader\">" << endl;
       
  1363 }
       
  1364 
       
  1365 void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
       
  1366                                 const char *fileName,const char *name)
       
  1367 {
       
  1368   t << "</div>" << endl;
       
  1369   t << "<div class=\"dynsection\">" << endl;
       
  1370   t << " <div class=\"center\">" << endl;
       
  1371   t << "  <img src=\"";
       
  1372   t << relPath << fileName << ".png\" usemap=\"#";
       
  1373   docify(name);
       
  1374   t << "_map\" alt=\"\"/>" << endl;
       
  1375   t << "  <map id=\"";
       
  1376   docify(name);
       
  1377   t << "_map\" name=\"";
       
  1378   docify(name);
       
  1379   t << "_map\">" << endl;
       
  1380 
       
  1381   d.writeImage(t,dir,relPath,fileName);
       
  1382   t << " </div>" << endl;
       
  1383   t << "</div>" << endl;
       
  1384 }
       
  1385 
       
  1386 
       
  1387 void HtmlGenerator::startMemberList()  
       
  1388 { 
       
  1389   DBG_HTML(t << "<!-- startMemberList -->" << endl)
       
  1390   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1391   {
       
  1392   }
       
  1393   else
       
  1394   {
       
  1395     t << "<ul>" << endl; 
       
  1396   }
       
  1397 }
       
  1398 
       
  1399 void HtmlGenerator::endMemberList()    
       
  1400 { 
       
  1401   DBG_HTML(t << "<!-- endMemberList -->" << endl)
       
  1402   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1403   {
       
  1404   }
       
  1405   else
       
  1406   {
       
  1407     t << "</ul>" << endl; 
       
  1408   }
       
  1409 }
       
  1410 
       
  1411 // annonymous type:
       
  1412 //  0 = single column right aligned
       
  1413 //  1 = double column left aligned
       
  1414 //  2 = single column left aligned
       
  1415 void HtmlGenerator::startMemberItem(int annoType) 
       
  1416 { 
       
  1417   DBG_HTML(t << "<!-- startMemberItem() -->" << endl)
       
  1418   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1419   {
       
  1420     t << "<tr>";
       
  1421     switch(annoType)
       
  1422     {
       
  1423       case 0:  t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break;
       
  1424       case 1:  t << "<td class=\"memItemLeft\" >"; break;
       
  1425       case 2:  t << "<td class=\"memItemLeft\" valign=\"top\">"; break;
       
  1426       default: t << "<td class=\"memTemplParams\" colspan=\"2\">"; break;
       
  1427     }
       
  1428   }
       
  1429   else
       
  1430   {
       
  1431     t << "<li>"; 
       
  1432   }
       
  1433 }
       
  1434 
       
  1435 void HtmlGenerator::endMemberItem() 
       
  1436 { 
       
  1437   //DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
       
  1438   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1439   {
       
  1440     t << "</td></tr>"; 
       
  1441   }
       
  1442   t << endl; 
       
  1443 }
       
  1444 
       
  1445 void HtmlGenerator::startMemberTemplateParams()
       
  1446 {
       
  1447 }
       
  1448 
       
  1449 void HtmlGenerator::endMemberTemplateParams()
       
  1450 {
       
  1451   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1452   {
       
  1453     t << "</td></tr>" << endl;
       
  1454     t << "<tr><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">";
       
  1455   }
       
  1456 }
       
  1457 
       
  1458 
       
  1459 void HtmlGenerator::insertMemberAlign(bool templ) 
       
  1460 { 
       
  1461   DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
       
  1462   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1463   {
       
  1464     QCString className = templ ? "memTemplItemRight" : "memItemRight";
       
  1465     t << "&nbsp;</td><td class=\"" << className << "\" valign=\"bottom\">"; 
       
  1466   }
       
  1467 }
       
  1468 
       
  1469 void HtmlGenerator::startMemberDescription() 
       
  1470 { 
       
  1471   DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
       
  1472   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1473   {
       
  1474     t << "<tr><td class=\"mdescLeft\">&nbsp;</td><td class=\"mdescRight\">"; 
       
  1475   }
       
  1476   else
       
  1477   {
       
  1478     t << "<dl class=\"el\"><dd class=\"mdescRight\">";
       
  1479   }
       
  1480 }
       
  1481 
       
  1482 void HtmlGenerator::endMemberDescription()   
       
  1483 { 
       
  1484   DBG_HTML(t << "<!-- endMemberDescription -->" << endl)
       
  1485   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1486   {
       
  1487     t << "<br/></td></tr>" << endl; 
       
  1488   }
       
  1489   else
       
  1490   {
       
  1491     t << "<br/></dl>";
       
  1492   }
       
  1493 }
       
  1494 
       
  1495 void HtmlGenerator::startMemberSections()
       
  1496 {
       
  1497   DBG_HTML(t << "<!-- startMemberSections -->" << endl)
       
  1498   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1499   {
       
  1500     t << "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" << endl;
       
  1501     // HTML is not recursively decomposable, sorry
       
  1502     //t << "<tr><td></td></tr>" << endl;
       
  1503   }
       
  1504 }
       
  1505 
       
  1506 void HtmlGenerator::endMemberSections()
       
  1507 {
       
  1508   DBG_HTML(t << "<!-- endMemberSections -->" << endl)
       
  1509   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1510   {
       
  1511     t << "</table>" << endl;
       
  1512   }
       
  1513 }
       
  1514 
       
  1515 void HtmlGenerator::startMemberHeader()
       
  1516 {
       
  1517   DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
       
  1518   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1519   {
       
  1520     t << "<tr><td colspan=\"2\"><h2>";
       
  1521   }
       
  1522   else
       
  1523   {
       
  1524     startGroupHeader();
       
  1525   }
       
  1526 }
       
  1527 
       
  1528 void HtmlGenerator::endMemberHeader()
       
  1529 {
       
  1530   DBG_HTML(t << "<!-- endMemberHeader -->" << endl)
       
  1531   if (Config_getBool("HTML_ALIGN_MEMBERS"))
       
  1532   {
       
  1533     t << "</h2></td></tr>" << endl;
       
  1534   }
       
  1535   else
       
  1536   {
       
  1537     endGroupHeader();
       
  1538   }
       
  1539 }
       
  1540 
       
  1541 void HtmlGenerator::startMemberSubtitle()
       
  1542 {
       
  1543   DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
       
  1544   if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=\"2\">";
       
  1545 }
       
  1546 
       
  1547 void HtmlGenerator::endMemberSubtitle()
       
  1548 {
       
  1549   DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
       
  1550   if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/><br/></td></tr>" << endl;
       
  1551 }
       
  1552 
       
  1553 void HtmlGenerator::startIndexList() 
       
  1554 { 
       
  1555   t << "<table>"  << endl; 
       
  1556 }
       
  1557 
       
  1558 void HtmlGenerator::endIndexList()
       
  1559 {
       
  1560   t << "</table>" << endl;
       
  1561 }
       
  1562 
       
  1563 void HtmlGenerator::startIndexKey() 
       
  1564 { 
       
  1565   // inserted 'class = ...', 02 jan 2002, jh
       
  1566   t << "  <tr><td class=\"indexkey\">"; 
       
  1567 }
       
  1568 
       
  1569 void HtmlGenerator::endIndexKey()
       
  1570 {
       
  1571   t << "</td>";
       
  1572 }
       
  1573 
       
  1574 void HtmlGenerator::startIndexValue(bool) 
       
  1575 { 
       
  1576   // inserted 'class = ...', 02 jan 2002, jh
       
  1577   t << "<td class=\"indexvalue\">"; 
       
  1578 }
       
  1579 
       
  1580 void HtmlGenerator::endIndexValue(const char *,bool)
       
  1581 {
       
  1582   t << "</td></tr>" << endl;
       
  1583 }
       
  1584 
       
  1585 void HtmlGenerator::startMemberDocList()
       
  1586 {
       
  1587   DBG_HTML(t << "<!-- startMemberDocList -->" << endl;)
       
  1588   //t << "<table class=\"memlist\">" << endl;
       
  1589   //t << "  <tr>" << endl;
       
  1590   //t << "    <td>" << endl;
       
  1591 }
       
  1592 
       
  1593 void HtmlGenerator::endMemberDocList()
       
  1594 {
       
  1595   DBG_HTML(t << "<!-- endMemberDocList -->" << endl;)
       
  1596   //t << "    </td>" << endl;
       
  1597   //t << "  </tr>" << endl;
       
  1598   //t << "</table>" << endl;
       
  1599 }
       
  1600 
       
  1601 void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *) 
       
  1602 { 
       
  1603   DBG_HTML(t << "<!-- startMemberDoc -->" << endl;)
       
  1604   //t << "<p>" << endl;
       
  1605  
       
  1606   t << "\n<div class=\"memitem\">" << endl;
       
  1607   //t << "<table>" << endl;
       
  1608   //t << "  <tr>" << endl;
       
  1609   //t << "    <td>" << endl;
       
  1610   //t << "      <table class=\"memproto\">" << endl;
       
  1611   t << "<div class=\"memproto\">" << endl;
       
  1612   
       
  1613 }
       
  1614 
       
  1615 void HtmlGenerator::startMemberDocPrefixItem()
       
  1616 {
       
  1617   DBG_HTML(t << "<!-- startMemberDocPrefixItem -->" << endl;)
       
  1618   //t << "        <tr>" << endl;
       
  1619   //t << "          <td class=\"memtemplate\" colspan=\"5\">";
       
  1620   t << "<div class=\"memtemplate\">" << endl;
       
  1621 }
       
  1622 
       
  1623 void HtmlGenerator::endMemberDocPrefixItem()
       
  1624 {
       
  1625   DBG_HTML(t << "<!-- endMemberDocPrefixItem -->" << endl;)
       
  1626   //t << "</td>" << endl;
       
  1627   //t << "        </tr>" << endl;
       
  1628   t << "</div>" << endl;
       
  1629 }
       
  1630 
       
  1631 void HtmlGenerator::startMemberDocName(bool /*align*/)
       
  1632 {
       
  1633   DBG_HTML(t << "<!-- startMemberDocName -->" << endl;)
       
  1634 
       
  1635   t << "      <table class=\"memname\">" << endl;
       
  1636     
       
  1637   t << "        <tr>" << endl;
       
  1638   t << "          <td class=\"memname\">";
       
  1639 }
       
  1640 
       
  1641 void HtmlGenerator::endMemberDocName()
       
  1642 {
       
  1643   DBG_HTML(t << "<!-- endMemberDocName -->" << endl;)
       
  1644   t << "</td>" << endl;
       
  1645 }
       
  1646 
       
  1647 void HtmlGenerator::startParameterList(bool openBracket)
       
  1648 {
       
  1649   DBG_HTML(t << "<!-- startParameterList -->" << endl;)
       
  1650   t << "          <td>";
       
  1651   if (openBracket) t << "(";
       
  1652   t << "</td>" << endl;
       
  1653 }
       
  1654 
       
  1655 void HtmlGenerator::startParameterType(bool first,const char *key)
       
  1656 {
       
  1657   if (first)
       
  1658   {
       
  1659     DBG_HTML(t << "<!-- startFirstParameterType -->" << endl;)
       
  1660     t << "          <td class=\"paramtype\">";
       
  1661   }
       
  1662   else
       
  1663   {
       
  1664     DBG_HTML(t << "<!-- startParameterType -->" << endl;)
       
  1665     t << "        <tr>" << endl;
       
  1666     t << "          <td class=\"paramkey\">";
       
  1667     if (key) t << key;
       
  1668     t << "</td>" << endl;
       
  1669     t << "          <td></td>" << endl;
       
  1670     t << "          <td class=\"paramtype\">";
       
  1671   }
       
  1672 }
       
  1673 
       
  1674 void HtmlGenerator::endParameterType()
       
  1675 {
       
  1676   DBG_HTML(t << "<!-- endParameterType -->" << endl;)
       
  1677   t << "&nbsp;</td>" << endl;
       
  1678 }
       
  1679 
       
  1680 void HtmlGenerator::startParameterName(bool /*oneArgOnly*/)
       
  1681 {
       
  1682   DBG_HTML(t << "<!-- startParameterName -->" << endl;)
       
  1683   t << "          <td class=\"paramname\">";
       
  1684 }
       
  1685 
       
  1686 void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
       
  1687 {
       
  1688   DBG_HTML(t << "<!-- endParameterName -->" << endl;)
       
  1689   if (last)
       
  1690   {
       
  1691     if (emptyList)
       
  1692     {
       
  1693       t << "</td>" << endl;
       
  1694       t << "          <td>";
       
  1695       if (closeBracket) t << "&nbsp;)";
       
  1696       t << "&nbsp;</td>" << endl;
       
  1697       t << "          <td>";
       
  1698     }
       
  1699     else
       
  1700     {
       
  1701       t << "</td><td>&nbsp;</td>" << endl;
       
  1702       t << "        </tr>" << endl;
       
  1703       t << "        <tr>" << endl;
       
  1704       t << "          <td></td>" << endl;
       
  1705       t << "          <td>";
       
  1706       if (closeBracket) t << ")";
       
  1707       t << "</td>" << endl;
       
  1708       t << "          <td></td><td></td><td>";
       
  1709     }
       
  1710   }
       
  1711   else
       
  1712   {
       
  1713     t << "</td>" << endl;
       
  1714     t << "        </tr>" << endl;
       
  1715   }
       
  1716 }
       
  1717 
       
  1718 void HtmlGenerator::endParameterList()
       
  1719 {
       
  1720   DBG_HTML(t << "<!-- endParameterList -->" << endl;)
       
  1721   t << "</td>" << endl;
       
  1722   t << "        </tr>" << endl;
       
  1723 }
       
  1724 
       
  1725 void HtmlGenerator::endMemberDoc(bool hasArgs)     
       
  1726 { 
       
  1727   DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
       
  1728   if (!hasArgs)
       
  1729   {
       
  1730     t << "        </tr>" << endl;
       
  1731   }
       
  1732   t << "      </table>" << endl;
       
  1733   //t << "    </td>" << endl;
       
  1734   //t << "  </tr>" << endl;
       
  1735   //t << "</table>" << endl;
       
  1736   t << "</div>" << endl;
       
  1737 }
       
  1738 
       
  1739 void HtmlGenerator::startDotGraph()
       
  1740 {
       
  1741   t << "<div class=\"dynheader\">" << endl;
       
  1742 }
       
  1743 
       
  1744 void HtmlGenerator::endDotGraph(const DotClassGraph &g)
       
  1745 {
       
  1746   t << "</div>" << endl;
       
  1747   t << "<div class=\"dynsection\">" << endl;
       
  1748   g.writeGraph(t,BITMAP,dir,relPath);
       
  1749   if (Config_getBool("GENERATE_LEGEND"))
       
  1750   {
       
  1751     t << "<center><span class=\"legend\">[";
       
  1752     startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension);
       
  1753     t << theTranslator->trLegend();
       
  1754     endHtmlLink();
       
  1755     t << "]</span></center>";
       
  1756   }
       
  1757   t << "</div>" << endl;
       
  1758 }
       
  1759 
       
  1760 void HtmlGenerator::startInclDepGraph()
       
  1761 {
       
  1762   t << "<div class=\"dynheader\">" << endl;
       
  1763 }
       
  1764 
       
  1765 void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
       
  1766 {
       
  1767   t << "</div>" << endl;
       
  1768   t << "<div class=\"dynsection\">" << endl;
       
  1769   g.writeGraph(t,BITMAP,dir,relPath);
       
  1770   t << "</div>" << endl;
       
  1771 }
       
  1772 
       
  1773 void HtmlGenerator::startGroupCollaboration()
       
  1774 {
       
  1775   t << "<div class=\"dynheader\">" << endl;
       
  1776 }
       
  1777 
       
  1778 void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
       
  1779 {
       
  1780   t << "</div>" << endl;
       
  1781   t << "<div class=\"dynsection\">" << endl;
       
  1782   g.writeGraph(t,BITMAP,dir,relPath);
       
  1783   t << "</div>" << endl;
       
  1784 }
       
  1785 
       
  1786 void HtmlGenerator::startCallGraph()
       
  1787 {
       
  1788   t << "<div class=\"dynheader\">" << endl;
       
  1789 }
       
  1790 
       
  1791 void HtmlGenerator::endCallGraph(const DotCallGraph &g)
       
  1792 {
       
  1793   t << "</div>" << endl;
       
  1794   t << "<div class=\"dynsection\">" << endl;
       
  1795   g.writeGraph(t,BITMAP,dir,relPath);
       
  1796   t << "</div>" << endl;
       
  1797 }
       
  1798 
       
  1799 void HtmlGenerator::startDirDepGraph()
       
  1800 {
       
  1801   t << "<div class=\"dynheader\">" << endl;
       
  1802 }
       
  1803 
       
  1804 void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
       
  1805 {
       
  1806   t << "</div>" << endl;
       
  1807   t << "<div class=\"dynsection\">" << endl;
       
  1808   g.writeGraph(t,BITMAP,dir,relPath);
       
  1809   t << "</div>" << endl;
       
  1810 }
       
  1811 
       
  1812 void HtmlGenerator::writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
       
  1813 {
       
  1814   g.writeGraph(t,dir);
       
  1815 }
       
  1816 
       
  1817 void HtmlGenerator::startMemberGroupHeader(bool)
       
  1818 {
       
  1819   t << "<tr><td colspan=\"2\"><div class=\"groupHeader\">";
       
  1820 }
       
  1821 
       
  1822 void HtmlGenerator::endMemberGroupHeader()
       
  1823 {
       
  1824   t << "</div></td></tr>" << endl;
       
  1825 }
       
  1826 
       
  1827 void HtmlGenerator::startMemberGroupDocs()
       
  1828 {
       
  1829   t << "<tr><td colspan=\"2\"><div class=\"groupText\">";
       
  1830 }
       
  1831 
       
  1832 void HtmlGenerator::endMemberGroupDocs()
       
  1833 {
       
  1834   t << "</div></td></tr>" << endl;
       
  1835 }
       
  1836 
       
  1837 void HtmlGenerator::startMemberGroup()
       
  1838 {
       
  1839 }
       
  1840 
       
  1841 void HtmlGenerator::endMemberGroup(bool)
       
  1842 {
       
  1843 }
       
  1844 
       
  1845 void HtmlGenerator::startIndent()        
       
  1846 { 
       
  1847   DBG_HTML(t << "<!-- startIndent -->" << endl;)
       
  1848 
       
  1849   t << "<div class=\"memdoc\">\n";
       
  1850 }
       
  1851 
       
  1852 void HtmlGenerator::endIndent()          
       
  1853 { 
       
  1854   DBG_HTML(t << "<!-- endIndent -->" << endl;)
       
  1855   t << endl << "</div>" << endl << "</div>" << endl; 
       
  1856 }
       
  1857 
       
  1858 void HtmlGenerator::addIndexItem(const char *,const char *)
       
  1859 {
       
  1860 }
       
  1861 
       
  1862 void HtmlGenerator::writeNonBreakableSpace(int n)
       
  1863 {
       
  1864   int i;
       
  1865   for (i=0;i<n;i++)
       
  1866   {
       
  1867     t << "&nbsp;";
       
  1868   }
       
  1869 }
       
  1870 
       
  1871 void HtmlGenerator::writeLineNumber(const char *ref,const char *filename,
       
  1872                                     const char *anchor,int l)
       
  1873 {
       
  1874   QCString lineNumber,lineAnchor;
       
  1875   lineNumber.sprintf("%05d",l);
       
  1876   lineAnchor.sprintf("l%05d",l);
       
  1877 
       
  1878   if (filename)
       
  1879   {
       
  1880     startCodeAnchor(lineAnchor);
       
  1881     writeCodeLink(ref,filename,anchor,lineNumber,0);
       
  1882     endCodeAnchor();
       
  1883   }
       
  1884   else
       
  1885   {
       
  1886     startCodeAnchor(lineAnchor);
       
  1887     codify(lineNumber);
       
  1888     endCodeAnchor();
       
  1889   }
       
  1890   codify(" ");
       
  1891 }
       
  1892 
       
  1893 void HtmlGenerator::startSimpleSect(SectionTypes,
       
  1894                                 const char *filename,const char *anchor,
       
  1895                                 const char *title)
       
  1896 {
       
  1897   t << "<dl><dt><b>";
       
  1898   if (filename)
       
  1899   {
       
  1900     writeObjectLink(0,filename,anchor,title);
       
  1901   }
       
  1902   else
       
  1903   {
       
  1904     docify(title);
       
  1905   }
       
  1906   t << "</b></dt>";
       
  1907 }
       
  1908 
       
  1909 void HtmlGenerator::endSimpleSect()
       
  1910 {
       
  1911   t << "</dl>"; 
       
  1912 }
       
  1913 
       
  1914 void HtmlGenerator::startParamList(ParamListTypes,
       
  1915                                 const char *title)
       
  1916 {
       
  1917   t << "<dl><dt><b>";
       
  1918   docify(title);
       
  1919   t << "</b></dt>";
       
  1920 }
       
  1921 
       
  1922 void HtmlGenerator::endParamList()
       
  1923 {
       
  1924   t << "</dl>"; 
       
  1925 }
       
  1926 
       
  1927 void HtmlGenerator::printDoc(DocNode *n,const char *langExt)
       
  1928 {
       
  1929   HtmlDocVisitor *visitor = new HtmlDocVisitor(t,*this,langExt);
       
  1930   n->accept(visitor);
       
  1931   delete visitor; 
       
  1932 }
       
  1933 
       
  1934 //---------------- helpers for index generation -----------------------------
       
  1935 
       
  1936 static void startQuickIndexList(QTextStream &t,bool compact)
       
  1937 {
       
  1938   if (compact) 
       
  1939   {
       
  1940     t << "  <div class=\"tabs\">\n";
       
  1941     t << "    <ul>\n"; 
       
  1942   }
       
  1943   else 
       
  1944   {
       
  1945     t << "<ul>";
       
  1946   }
       
  1947 }
       
  1948 
       
  1949 static void endQuickIndexList(QTextStream &t,bool compact)
       
  1950 {
       
  1951   if (compact) 
       
  1952   {
       
  1953     t << "    </ul>\n";
       
  1954     t << "  </div>\n";
       
  1955   }
       
  1956   else 
       
  1957   {
       
  1958     t << "</ul>\n";
       
  1959   }
       
  1960 }
       
  1961 
       
  1962 static void startQuickIndexItem(QTextStream &t,const char *l,
       
  1963                                 bool hl,bool /*compact*/,
       
  1964                                 const QCString &relPath)
       
  1965 {
       
  1966   t << "      <li"; if (hl) t << " class=\"current\"";
       
  1967   t << "><a ";
       
  1968   t << "href=\"" << relPath << l << "\">";
       
  1969   t << "<span>";
       
  1970 }
       
  1971 
       
  1972 static void endQuickIndexItem(QTextStream &t)
       
  1973 {
       
  1974   t << "</span>";
       
  1975   t << "</a>";
       
  1976   t << "</li>\n";
       
  1977 }
       
  1978 
       
  1979 static QCString fixSpaces(const QCString &s)
       
  1980 {
       
  1981   return substitute(s," ","&nbsp;");
       
  1982 }
       
  1983 
       
  1984 static bool quickLinkVisible(LayoutNavEntry::Kind kind)
       
  1985 {
       
  1986   switch (kind)
       
  1987   {
       
  1988     case LayoutNavEntry::MainPage:         return TRUE; 
       
  1989     case LayoutNavEntry::Pages:            return indexedPages>0;
       
  1990     case LayoutNavEntry::Modules:          return documentedGroups>0;
       
  1991     case LayoutNavEntry::Namespaces:       return documentedNamespaces>0;
       
  1992     case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
       
  1993     case LayoutNavEntry::Classes:          return annotatedClasses>0;
       
  1994     case LayoutNavEntry::ClassAnnotated:   return annotatedClasses>0; 
       
  1995     case LayoutNavEntry::ClassHierarchy:   return hierarchyClasses>0;
       
  1996     case LayoutNavEntry::ClassMembers:     return documentedClassMembers[CMHL_All]>0;
       
  1997     case LayoutNavEntry::Files:            return documentedHtmlFiles>0;
       
  1998     case LayoutNavEntry::FileGlobals:      return documentedFileMembers[FMHL_All]>0;
       
  1999     case LayoutNavEntry::Dirs:             return documentedDirs>0;
       
  2000     case LayoutNavEntry::Examples:         return Doxygen::exampleSDict->count()>0;
       
  2001   }
       
  2002   return FALSE;
       
  2003 }
       
  2004 
       
  2005 static void renderQuickLinksAsTree(QTextStream &t,const QCString &relPath,LayoutNavEntry *root)
       
  2006 
       
  2007 {
       
  2008   QListIterator<LayoutNavEntry> li(root->children());
       
  2009   LayoutNavEntry *entry;
       
  2010   int count=0;
       
  2011   for (li.toFirst();(entry=li.current());++li)
       
  2012   {
       
  2013     if (entry->visible() && quickLinkVisible(entry->kind())) count++;
       
  2014   }
       
  2015   if (count>0) // at least one item is visible
       
  2016   {
       
  2017     startQuickIndexList(t,FALSE);
       
  2018     for (li.toFirst();(entry=li.current());++li)
       
  2019     {
       
  2020       if (entry->visible() && quickLinkVisible(entry->kind()))
       
  2021       {
       
  2022         startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
       
  2023                             FALSE,FALSE,relPath);
       
  2024         t << fixSpaces(entry->title());
       
  2025         endQuickIndexItem(t);
       
  2026         // recursive into child list
       
  2027         renderQuickLinksAsTree(t,relPath,entry);
       
  2028       }
       
  2029     }
       
  2030     endQuickIndexList(t,FALSE);
       
  2031   }
       
  2032 }
       
  2033 
       
  2034 
       
  2035 static void renderQuickLinksAsTabs(QTextStream &t,const QCString &relPath,
       
  2036                              LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind,
       
  2037                              bool highlightParent,bool highlightSearch)
       
  2038 {
       
  2039   if (hlEntry->parent()) // first draw the tabs for the parent of hlEntry
       
  2040   {
       
  2041     renderQuickLinksAsTabs(t,relPath,hlEntry->parent(),kind,highlightParent,highlightSearch);
       
  2042   }
       
  2043   if (hlEntry->parent() && hlEntry->parent()->children().count()>0) // draw tabs for row containing hlEntry
       
  2044   {
       
  2045     QListIterator<LayoutNavEntry> li(hlEntry->parent()->children());
       
  2046     LayoutNavEntry *entry;
       
  2047 
       
  2048     int count=0;
       
  2049     for (li.toFirst();(entry=li.current());++li)
       
  2050     {
       
  2051       if (entry->visible() && quickLinkVisible(entry->kind())) count++;
       
  2052     }
       
  2053     if (count>0) // at least one item is visible
       
  2054     {
       
  2055       startQuickIndexList(t,TRUE);
       
  2056       for (li.toFirst();(entry=li.current());++li)
       
  2057       {
       
  2058         if (entry->visible() && quickLinkVisible(entry->kind()))
       
  2059         {
       
  2060           startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
       
  2061               entry==hlEntry  && (entry->children().count()>0 || (entry->kind()==kind && !highlightParent)),
       
  2062               TRUE,relPath);
       
  2063           t << fixSpaces(entry->title());
       
  2064           endQuickIndexItem(t);
       
  2065         }
       
  2066       }
       
  2067       if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry())
       
  2068       {
       
  2069 #if 0 // old PHP based search engine
       
  2070         // last item of the top row -> special case for search engine
       
  2071         if (Config_getBool("SEARCHENGINE"))
       
  2072         {
       
  2073           QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
       
  2074           if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
       
  2075           t << "    <li>\n";
       
  2076           t << "      <form action=\"" << relPath << "search.php\" method=\"get\">\n";
       
  2077           t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
       
  2078           t << "          <tr>\n";
       
  2079           t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
       
  2080           if (!highlightSearch)
       
  2081           {
       
  2082             t << "            <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
       
  2083             t << "          </tr>\n";
       
  2084             t << "        </table>\n";
       
  2085             t << "      </form>\n";
       
  2086             t << "    </li>\n";
       
  2087           }
       
  2088         } 
       
  2089         if (!highlightSearch) // on the search page the page will be ended by the
       
  2090                               // page itself
       
  2091         {
       
  2092           endQuickIndexList(t,TRUE);
       
  2093         }
       
  2094 #endif
       
  2095         static bool generateTreeView  = Config_getBool("GENERATE_TREEVIEW");
       
  2096         static bool searchEngine      = Config_getBool("SEARCHENGINE");
       
  2097         static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
       
  2098         if (searchEngine && !generateTreeView)
       
  2099         {
       
  2100           if (!serverBasedSearch) // pure client side search
       
  2101           {
       
  2102             t << "      <li>\n";
       
  2103             t << "        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
       
  2104             t << "        <img id=\"MSearchSelect\" src=\"" << relPath << "search/search.png\"\n";
       
  2105             t << "             onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
       
  2106             t << "             onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
       
  2107             t << "             alt=\"\"/>\n";
       
  2108             t << "        <input type=\"text\" id=\"MSearchField\" value=\"" 
       
  2109               << theTranslator->trSearch() << "\" accesskey=\"S\"\n";
       
  2110             t << "             onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
       
  2111             t << "             onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
       
  2112             t << "             onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
       
  2113             t << "        <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
       
  2114               << "<img id=\"MSearchCloseImg\" border=\"0\" src=\"" << relPath << "search/close.png\" alt=\"\"/></a>\n";
       
  2115             t << "        </div>\n";
       
  2116             t << "      </li>\n";
       
  2117           }
       
  2118           else if (!generateTreeView) // server based search
       
  2119           {
       
  2120             t << "      <li>\n";
       
  2121             t << "        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
       
  2122             t << "          <form id=\"FSearchBox\" action=\"" << relPath << "search.php\" method=\"get\">\n";
       
  2123             t << "            <img id=\"MSearchSelect\" src=\"" << relPath << "search/search.png\" alt=\"\"/>\n";
       
  2124             if (!highlightSearch)
       
  2125             {
       
  2126               t << "            <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
       
  2127                 << theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
       
  2128               t << "                   onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
       
  2129               t << "                   onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
       
  2130               t << "          </form>\n";
       
  2131               t << "        </div>\n";
       
  2132               t << "      </li>\n";
       
  2133             }
       
  2134           }
       
  2135         }
       
  2136         if (!highlightSearch) // on the search page the page will be ended by the
       
  2137                               // page itself
       
  2138         {
       
  2139           endQuickIndexList(t,TRUE);
       
  2140         }
       
  2141       }
       
  2142       else // normal case
       
  2143       {
       
  2144         endQuickIndexList(t,TRUE);
       
  2145       }
       
  2146     }
       
  2147   }
       
  2148 }
       
  2149 
       
  2150 static void writeDefaultQuickLinks(QTextStream &t,bool compact,
       
  2151                                    HighlightedItem hli,const QCString &relPath)
       
  2152 {
       
  2153   LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry();
       
  2154   LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1;
       
  2155   bool highlightParent=FALSE;
       
  2156   switch (hli) // map HLI enums to LayoutNavEntry::Kind enums
       
  2157   {
       
  2158     case HLI_Main:             kind = LayoutNavEntry::MainPage;         break;
       
  2159     case HLI_Modules:          kind = LayoutNavEntry::Modules;          break;
       
  2160     case HLI_Directories:      kind = LayoutNavEntry::Dirs;             break;
       
  2161     case HLI_Namespaces:       kind = LayoutNavEntry::Namespaces;       break;
       
  2162     case HLI_Hierarchy:        kind = LayoutNavEntry::ClassHierarchy;   break;
       
  2163     case HLI_Classes:          kind = LayoutNavEntry::Classes;          break;
       
  2164     case HLI_Annotated:        kind = LayoutNavEntry::ClassAnnotated;   break;
       
  2165     case HLI_Files:            kind = LayoutNavEntry::Files;            break;
       
  2166     case HLI_NamespaceMembers: kind = LayoutNavEntry::NamespaceMembers; break;
       
  2167     case HLI_Functions:        kind = LayoutNavEntry::ClassMembers;     break;
       
  2168     case HLI_Globals:          kind = LayoutNavEntry::FileGlobals;      break;
       
  2169     case HLI_Pages:            kind = LayoutNavEntry::Pages;            break;
       
  2170     case HLI_Examples:         kind = LayoutNavEntry::Examples;         break;
       
  2171     case HLI_ClassVisible:     kind = LayoutNavEntry::Classes;    highlightParent = TRUE; break;
       
  2172     case HLI_NamespaceVisible: kind = LayoutNavEntry::Namespaces; highlightParent = TRUE; break;
       
  2173     case HLI_FileVisible:      kind = LayoutNavEntry::Files;      highlightParent = TRUE; break;
       
  2174     case HLI_None:   break;
       
  2175     case HLI_Search: break;
       
  2176   }
       
  2177   
       
  2178   if (compact)
       
  2179   {
       
  2180     // find highlighted index item
       
  2181     LayoutNavEntry *hlEntry = root->find(kind);
       
  2182     if (!hlEntry) // highlighted item not found in the index! -> just show the level 1 index...
       
  2183     {
       
  2184       highlightParent=TRUE;
       
  2185       hlEntry = root->children().getFirst();
       
  2186       if (hlEntry==0) 
       
  2187       {
       
  2188         return; // argl, empty index!
       
  2189       }
       
  2190     }
       
  2191     renderQuickLinksAsTabs(t,relPath,hlEntry,kind,highlightParent,hli==HLI_Search);
       
  2192   }
       
  2193   else
       
  2194   {
       
  2195     renderQuickLinksAsTree(t,relPath,root);
       
  2196   }
       
  2197 }
       
  2198 
       
  2199 void HtmlGenerator::startQuickIndices()
       
  2200 {
       
  2201   if (!Config_getBool("DISABLE_INDEX"))
       
  2202   {
       
  2203     t << "<div class=\"navigation\" id=\"top\">" << endl;
       
  2204   }
       
  2205 }
       
  2206 
       
  2207 void HtmlGenerator::endQuickIndices()
       
  2208 {
       
  2209   if (!Config_getBool("DISABLE_INDEX"))
       
  2210   {
       
  2211     t << "</div>" << endl;
       
  2212   }
       
  2213 }
       
  2214 
       
  2215 void HtmlGenerator::startContents()
       
  2216 {
       
  2217   t << "<div class=\"contents\">" << endl;
       
  2218 }
       
  2219 
       
  2220 void HtmlGenerator::endContents()
       
  2221 {
       
  2222   t << "</div>" << endl;
       
  2223 }
       
  2224 
       
  2225 void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli)
       
  2226 {
       
  2227   writeDefaultQuickLinks(t,compact,hli,relPath);
       
  2228 }
       
  2229 
       
  2230 // PHP based search script
       
  2231 void HtmlGenerator::writeSearchPage()
       
  2232 {
       
  2233   QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php";
       
  2234   QFile f(fileName);
       
  2235   if (f.open(IO_WriteOnly))
       
  2236   {
       
  2237     QTextStream t(&f);
       
  2238     t.setEncoding(QTextStream::UnicodeUTF8);
       
  2239     if (g_header.isEmpty()) 
       
  2240     {
       
  2241       writeDefaultHeaderFile(t,theTranslator->trSearch().data(),0,FALSE,TRUE);
       
  2242     }
       
  2243     else
       
  2244     {
       
  2245       t << substituteKeywords(g_header,"Search","");
       
  2246     }
       
  2247 
       
  2248     t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen " 
       
  2249       << versionString << " -->" << endl;
       
  2250     static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
       
  2251     static bool searchEngine = Config_getBool("SEARCHENGINE");
       
  2252     if (searchEngine && !generateTreeView)
       
  2253     {
       
  2254       t << "<script type=\"text/javascript\"><!--\n";
       
  2255       t << "var searchBox = new SearchBox(\"searchBox\", \""
       
  2256         << "search\",false,'" << theTranslator->trSearch() << "');\n";
       
  2257       t << "--></script>\n";
       
  2258     }
       
  2259     if (!Config_getBool("DISABLE_INDEX")) 
       
  2260     { 
       
  2261       writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
       
  2262     }
       
  2263     else
       
  2264     {
       
  2265       t << "&nbsp;\n<div class=\"qindex\">\n";
       
  2266       t << "  <form class=\"search\" action=\"search.php\" "
       
  2267         << "method=\"get\">\n";
       
  2268     }
       
  2269 
       
  2270     t << "\n<script language=\"php\">\n\n";
       
  2271     t << "function search_results()\n";
       
  2272     t << "{\n";
       
  2273     t << "  return \"" << theTranslator->trSearchResultsTitle() << "\";\n";
       
  2274     t << "}\n";
       
  2275     t << "\n";
       
  2276     t << "function matches_text($num)\n";
       
  2277     t << "{\n";
       
  2278     t << "  if ($num==0)\n";
       
  2279     t << "  {\n";
       
  2280     t << "    return \"" << theTranslator->trSearchResults(0) << "\";\n";
       
  2281     t << "  }\n";
       
  2282     t << "  else if ($num==1)\n";
       
  2283     t << "  {\n";
       
  2284     t << "    return \"" << theTranslator->trSearchResults(1) << "\";\n";
       
  2285     t << "  }\n";
       
  2286     t << "  else // $num>1\n";
       
  2287     t << "  {\n";
       
  2288     t << "    return \"" << theTranslator->trSearchResults(2) << "\";\n";
       
  2289     t << "  }\n";
       
  2290     t << "}\n";
       
  2291     t << "\n";
       
  2292     t << "function report_matches()\n";
       
  2293     t << "{\n";
       
  2294     t << "  return \"" << theTranslator->trSearchMatches() << " \";\n";
       
  2295     t << "}\n";
       
  2296     t << "function end_form($value)\n";
       
  2297     t << "{\n";
       
  2298     if (!generateTreeView)
       
  2299     {
       
  2300       t << "  echo \"" 
       
  2301         << "            <input type=\\\"text\\\" id=\\\"MSearchField\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"S\\\" "
       
  2302         << "onfocus=\\\"searchBox.OnSearchFieldFocus(true)\\\" "
       
  2303         << "onblur=\\\"searchBox.OnSearchFieldFocus(false)\\\"/>\\n"
       
  2304         << "          </form>\\n"
       
  2305         << "        </div>\\n"
       
  2306         << "      </li>\\n"
       
  2307         << "    </ul>\\n"
       
  2308         << "  </div>\\n"
       
  2309         << "\";\n";
       
  2310     }
       
  2311     else
       
  2312     {
       
  2313       t << "  echo \"" 
       
  2314         << "    </ul>\\n"
       
  2315         << "  </div>\\n"
       
  2316         << "\";\n";
       
  2317     }
       
  2318     t << "}\n";
       
  2319     t << "\n";
       
  2320     t << search_script;
       
  2321     t << "\n";
       
  2322     t << "</script>\n";
       
  2323     writePageFooter(t,"Search","");
       
  2324   }
       
  2325   QCString scriptName = Config_getString("HTML_OUTPUT")+"/search/search.js";
       
  2326   QFile sf(scriptName);
       
  2327   if (sf.open(IO_WriteOnly))
       
  2328   {
       
  2329     QTextStream t(&sf);
       
  2330     t << "function SearchBox(name, resultsPath, inFrame, label)\n";
       
  2331     t << "{\n";
       
  2332     t << "  this.searchLabel = label;\n";
       
  2333     t << "  this.DOMSearchField = function()\n";
       
  2334     t << "  {  return document.getElementById(\"MSearchField\");  }\n";
       
  2335     t << "  this.DOMSearchBox = function()\n";
       
  2336     t << "  {  return document.getElementById(\"MSearchBox\");  }\n";
       
  2337     t << "  this.OnSearchFieldFocus = function(isActive)\n";
       
  2338     t << "  {\n";
       
  2339     t << "    if (isActive)\n";
       
  2340     t << "    {\n";
       
  2341     t << "      this.DOMSearchBox().className = 'MSearchBoxActive';\n";
       
  2342     t << "      var searchField = this.DOMSearchField();\n";
       
  2343     t << "      if (searchField.value == this.searchLabel) \n";
       
  2344     t << "      {\n";
       
  2345     t << "        searchField.value = '';\n";
       
  2346     t << "      }\n";
       
  2347     t << "    }\n";
       
  2348     t << "    else\n";
       
  2349     t << "    {\n";
       
  2350     t << "      this.DOMSearchBox().className = 'MSearchBoxInactive';\n";
       
  2351     t << "      this.DOMSearchField().value   = this.searchLabel;\n";
       
  2352     t << "    }\n";
       
  2353     t << "  }\n";
       
  2354     t << "}\n";
       
  2355   }
       
  2356   else
       
  2357   {
       
  2358      err("Failed to open file '%s' for writing...\n",scriptName.data());
       
  2359   }
       
  2360 }
       
  2361 
       
  2362 void HtmlGenerator::generateSectionImages()
       
  2363 {
       
  2364   {
       
  2365     QCString fileName = Config_getString("HTML_OUTPUT")+"/open.gif";
       
  2366     QFile f(fileName);
       
  2367     if (f.open(IO_WriteOnly))
       
  2368     {
       
  2369       f.writeBlock((char*)open_gif,open_gif_len);
       
  2370     }
       
  2371     Doxygen::indexList.addImageFile("open.gif");
       
  2372   }
       
  2373   {
       
  2374     QCString fileName = Config_getString("HTML_OUTPUT")+"/closed.gif";
       
  2375     QFile f(fileName);
       
  2376     if (f.open(IO_WriteOnly))
       
  2377     {
       
  2378       f.writeBlock((char*)closed_gif,closed_gif_len);
       
  2379     }
       
  2380     Doxygen::indexList.addImageFile("closed.gif");
       
  2381   }
       
  2382 }
       
  2383 
       
  2384 void HtmlGenerator::startConstraintList(const char *header)
       
  2385 {
       
  2386   t << "<div class=\"typeconstraint\">" << endl;
       
  2387   t << "<dl><dt><b>" << header << "</b><dt><dd>" << endl;
       
  2388   t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl;
       
  2389 }
       
  2390 
       
  2391 void HtmlGenerator::startConstraintParam()
       
  2392 {
       
  2393   t << "<tr><td valign=\"top\"><em>";
       
  2394 }
       
  2395 
       
  2396 void HtmlGenerator::endConstraintParam()
       
  2397 {
       
  2398   t << "</em></td>";
       
  2399 }
       
  2400 
       
  2401 void HtmlGenerator::startConstraintType()
       
  2402 {
       
  2403   t << "<td>&nbsp;:</td><td valign=\"top\"><em>";
       
  2404 }
       
  2405 
       
  2406 void HtmlGenerator::endConstraintType()
       
  2407 {
       
  2408   t << "</em></td>";
       
  2409 }
       
  2410 
       
  2411 void HtmlGenerator::startConstraintDocs()
       
  2412 {
       
  2413   t << "<td>&nbsp;";
       
  2414 }
       
  2415 
       
  2416 void HtmlGenerator::endConstraintDocs()
       
  2417 {
       
  2418   t << "</td></tr>" << endl;
       
  2419 }
       
  2420 
       
  2421 void HtmlGenerator::endConstraintList()
       
  2422 {
       
  2423   t << "</table>" << endl;
       
  2424   t << "</dl>" << endl;
       
  2425   t << "</div>" << endl;
       
  2426 }
       
  2427 
       
  2428 void HtmlGenerator::lineBreak(const char *style)
       
  2429 {
       
  2430   if (style)
       
  2431   {
       
  2432     t << "<br class=\"" << style << "\"/>" << endl;
       
  2433   }
       
  2434   else
       
  2435   {
       
  2436     t << "<br/>" << endl;
       
  2437   }
       
  2438 }
       
  2439