Re: Embedding Doxygen Into A CMS

SmokingRope <[email protected]>
Newsgroups gmane.text.doxygen.devel
Message-ID <[email protected]>
Attached to this email is a patch which simplifies embedding doxygen
generated documentation into a dynamic / template based website (CMS). I
have attempted to update the manual where appropriate and there is a php
example for doxygen's own documentation. Once you have applied the patch and
compiled you can run Doxyfile_Embedded and access the complete doxygen
documentation from a web browser using the provided embedded_docs.php file.

You can apply the patch using: patch -p3 -i
doxygen_1_5_5_cms_embedding.patch

Please let me know if there is anything missing.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

_______________________________________________
Doxygen-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/doxygen-develop
doxygen_1_5_5_cms_embedding.patch (application/octet-stream, 64.6 KB)
Index: P:/workspace/Doxygen2/embedded_docs.php
===================================================================
--- P:/workspace/Doxygen2/embedded_docs.php	(revision 0)
+++ P:/workspace/Doxygen2/embedded_docs.php	(revision 0)
@@ -0,0 +1,49 @@
+<?php
+  if( isset($_GET['type']) and $_GET['type'] == 'image')
+  {
+	  try {
+	  	$l_filename = 'doxygen_docs/embedded_html/' . $_GET['file'];
+	  	$l_filedata = file_get_contents($l_filename);
+	  	$l_fileimage = getimagesize($l_filename);
+	  	$l_filetype = $l_fileimage['mime'];
+	  	header('Content-type: ' . $l_filetype);
+	  	echo $l_filedata;
+	  	exit(0);
+	  }
+	  catch( Exception $eError )
+	  {
+	    exit(1);
+	  }
+  }
+  if( isset($_GET['type']) and $_GET['type'] == 'css' )
+  {
+	  header("Content-type: text/css");
+	  echo file_get_contents('doxygen_docs/embedded_html/'.$_GET['file']);
+  	  exit(0);
+  }
+?>
+<HTML>
+ <HEAD>
+  <LINK rel="stylesheet" content-type="text/css" href="embedded_docs.php?type=css&file=doxygen.css" />
+  <LINK rel="stylesheet" content-type="text/css" href="embedded_docs.php?type=css&file=tabs.css" />
+  <TITLE>Doxygen Documentation</TITLE>
+ </HEAD>
+ <BODY>
+  <DIV style="height: 250px; width: 250px; overflow: scroll; position: fixed; float: left; right: 1em; bottom: 1em; border: thin solid #000000; margin: 1em 1em 1em 1em; padding: 1em 1em 1em 1em; background-color: #FFFFFF;">
+  <?php
+	  include("doxygen_docs/embedded_html/tree.html");
+  ?>
+  </DIV>
+  <DIV>
+  <?php
+    if( isset($_GET['type']) and isset($_GET['file']) )
+	{
+		$l_type = $_GET['type'];
+		$l_file = $_GET['file'];
+		$l_filename = 'doxygen_docs/embedded_html/' . $l_file;
+		include($l_filename);
+	}
+  ?>
+  </DIV>
+ </BODY>
+</HTML>
Index: P:/workspace/Doxygen2/src/dot.cpp
===================================================================
--- P:/workspace/Doxygen2/src/dot.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/dot.cpp	(working copy)
@@ -149,6 +149,10 @@
             if ((dest=Doxygen::tagDestinationDict[df->ref()])) 
               result += *dest + "/";
           }
+          else if( Config_getBool("HTML_CMS_EMBEDDING") )
+          {
+        	  result += Config_getString("HTML_CMS_PAGEPREFIX");
+          }
           else if (!relPath.isEmpty())
           {
             result += relPath;
@@ -183,6 +187,10 @@
           {
             if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/";
           }
+          else if( Config_getBool("HTML_CMS_EMBEDDING") )
+          {
+        	  result += Config_getString("HTML_CMS_PAGEPREFIX");
+          }
           else if (!relPath.isEmpty())
           {
             result += relPath;
@@ -1114,7 +1122,12 @@
     }
     // write image and map in a table row
     QCString mapLabel = convertNameToFile(n->m_label);
-    out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" 
+    out << "<tr><td><img src=\"";    
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }    
+    out << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" 
       << mapLabel << "_map\">" << endl;
     out << "<map name=\"" << mapLabel << "_map\">" << endl;
     convertMapFile(out,mapName,"");
@@ -1901,7 +1914,12 @@
   if (format==BITMAP && generateImageMap) // produce HTML to include the image
   {
     QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName);
-    out << "<p><center><img src=\"" << relPath << baseName << "." 
+    out << "<p><center><img src=\"";
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }
+    out << relPath << baseName << "." 
       << imgExt << "\" border=\"0\" usemap=\"#"
       << mapLabel << "\" alt=\"";
     switch (m_graphType)
@@ -2230,7 +2248,12 @@
 
   if (format==BITMAP && generateImageMap)
   {
-    out << "<p><center><img src=\"" << relPath << baseName << "." 
+    out << "<p><center><img src=\"";
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }
+    out << relPath << baseName << "." 
         << imgExt << "\" border=\"0\" usemap=\"#"
         << mapName << "_map\" alt=\"";
     out << "\">";
@@ -2523,7 +2546,12 @@
 
   if (format==BITMAP && generateImageMap)
   {
-    out << "<p><center><img src=\"" << relPath << baseName << "." 
+    out << "<p><center><img src=\"";
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }    
+    out << relPath << baseName << "." 
         << imgExt << "\" border=\"0\" usemap=\"#"
         << mapName << "_map\" alt=\"";
     out << "\">";
@@ -2664,7 +2692,12 @@
 
   if (format==BITMAP && generateImageMap)
   {
-    out << "<p><center><img src=\"" << relPath << baseName << "." 
+    out << "<p><center><img src=\"";
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }    
+    out << relPath << baseName << "." 
         << imgExt << "\" border=\"0\" usemap=\"#"
         << mapName << "_map\" alt=\"";
     out << m_dir->displayName();
@@ -3154,7 +3187,13 @@
     if (writeImageMap)
     {
       QCString mapLabel = convertNameToFile(baseName);
-      t << "<center><table><tr><td><img src=\"" << relPath << imgName
+      
+      t << "<center><table><tr><td><img src=\"";
+      if( Config_getBool("HTML_CMS_EMBEDDING") )
+      {
+    	  t << Config_getString("HTML_CMS_IMAGEPREFIX");
+      }      
+      t << relPath << imgName
         << "\" border=\"0\" alt=\"\" usemap=\"#" 
         << mapLabel << "_map\">" << endl;
       t << "<map name=\"" << mapLabel << "_map\">" << endl;
Index: P:/workspace/Doxygen2/src/diagram.cpp
===================================================================
--- P:/workspace/Doxygen2/src/diagram.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/diagram.cpp	(working copy)
@@ -173,6 +173,9 @@
     }
     else
     {
+      if( Config_getBool("HTML_CMS_EMBEDDING")) 
+    	  t << Config_getString("HTML_CMS_PAGEPREFIX");
+      
       t << relPath;
     }
     t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" ";
Index: P:/workspace/Doxygen2/src/util.cpp
===================================================================
--- P:/workspace/Doxygen2/src/util.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/util.cpp	(working copy)
@@ -2024,6 +2024,42 @@
   return "";
 }
 
+/*! generates a set of key value pairs representing the list of
+ *  search parameters used for HTML CMS EMBEDDING
+ */
+QMap<QCString,QCString> getSearchParameters()
+{
+  QMap<QCString,QCString> l_retval;
+  
+  // first look for filter pattern list
+  QStrList& l_searchParams = Config_getList("HTML_CMS_SEARCHPARAMS");
+
+  // If no parameters are specified return empty map
+  if (l_searchParams.isEmpty() || !Config_getBool("SEARCHENGINE")) 
+  {
+    return l_retval;
+  }
+
+  // compare the file name to the filter pattern list
+  QStrListIterator sli(l_searchParams);
+  char* filterStr;
+  for (sli.toFirst(); (filterStr = sli.current()); ++sli)
+  {
+    QCString fs = filterStr;
+    int i_equals=fs.find('=');
+
+    if (i_equals!=-1)
+    {
+      QCString l_key = fs.left(i_equals);
+      QCString l_value = fs.mid(i_equals+1);
+      l_retval.insert(l_key, l_value);
+    }
+  }
+
+  // no match
+  return l_retval;
+}
+
 QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding)
 {
   QCString inputEncoding  = fromEncoding;
@@ -4751,7 +4787,7 @@
 QCString relativePathToRoot(const char *name)
 {
   QCString result;
-  if (Config_getBool("CREATE_SUBDIRS"))
+  if (Config_getBool("CREATE_SUBDIRS") && !Config_getBool("HTML_CMS_EMBEDDING"))
   {
     if (name==0)
     {
Index: P:/workspace/Doxygen2/src/dirdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/dirdef.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/dirdef.cpp	(working copy)
@@ -755,7 +755,14 @@
       path+=dir->getOutputFileBase();
       path+="_dep.dot";
       out << "<h4>" << dir->displayName() << "</h4>" << endl;
-      out << "<img src=\"" << dir->getOutputFileBase() << "_dep.gif\">" << endl;
+      out << "<img src=\"";
+      
+      if( Config_getBool("HTML_CMS_EMBEDDING") )
+      {
+    	  out << Config_getString("HTML_CMS_IMAGEPREFIX");
+      }
+      
+      out << dir->getOutputFileBase() << "_dep.gif\">" << endl;
       QFile f(path);
       if (f.open(IO_WriteOnly))
       {
Index: P:/workspace/Doxygen2/src/ftvhelp.h
===================================================================
--- P:/workspace/Doxygen2/src/ftvhelp.h	(revision 629)
+++ P:/workspace/Doxygen2/src/ftvhelp.h	(working copy)
@@ -27,6 +27,7 @@
 #include "qtbc.h"
 #include <qtextstream.h>
 #include <qlist.h>
+#include <qcstring.h>
 #include "index.h"
 
 class QFile;
@@ -57,11 +58,13 @@
 #define FTVIMG_vertline    11
 
 #define FTV_S(name) #name
-#define FTV_ICON_FILE(name) "ftv2" FTV_S(name) ".png"
+#define FTV_ICON_FILE(name) QCString((Config_getBool("HTML_CMS_EMBEDDING")? \
+				Config_getString("HTML_CMS_IMAGEPREFIX"):QCString("")) + \
+				QCString("ftv2" FTV_S(name) ".png"))
 #define FTVIMG_INDEX(name) FTVIMG_ ## name
 #define FTV_INFO(name) ( image_info[FTVIMG_INDEX(name)] )
 #define FTV_IMGATTRIBS(name) \
-    "src=\"" FTV_ICON_FILE(name) "\" " \
+    "src=\"" << FTV_ICON_FILE(name) << "\" " \
     "alt=\"" << FTV_INFO(name).alt << "\" " \
     "width=" << FTV_INFO(name).width << " " \
     "height=" << FTV_INFO(name).height << " "
Index: P:/workspace/Doxygen2/src/filedef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/filedef.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/filedef.cpp	(working copy)
@@ -605,7 +605,7 @@
 void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
 {
   static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+  
   ol.writeString("      <div class=\"navtab\">\n");
   ol.writeString("        <table>\n");
 
Index: P:/workspace/Doxygen2/src/config.l
===================================================================
--- P:/workspace/Doxygen2/src/config.l	(revision 629)
+++ P:/workspace/Doxygen2/src/config.l	(working copy)
@@ -3165,6 +3165,88 @@
                     "used. If set to NO the values of all tags below this one will be ignored. \n",
                     FALSE
                  );
+                 
+  //-----------------------------------------------------------------------------------------------
+  addInfo(  "CMS_EMBEDDING","Configuration::additions related to the cms embedding features   ");
+  //-----------------------------------------------------------------------------------------------
+  cb = addBool(
+                    "HTML_CMS_EMBEDDING",
+                    "The HTML_CMS_EMBEDDING option performs some processing on \n"
+                    "the doxygen generated html documentation making it easier. \n"
+                    "to embed doxygen into a CMS. This processing includes adding. \n"
+                    "custom preficies to image and page references and removal of \n"
+                    "the header and footer of the generated output. \n",
+                    FALSE
+                 );
+                 
+  cs = addString(   "HTML_CMS_PAGEPREFIX",
+                    "The value of HTML_CMS_PAGEPREFIX is added to each link in \n"
+		    "the documentation which references other documented members. \n"
+		    "The resulting string will contain the text of this variable followed \n"
+		    "by the filename which the link refers to. This can be used to \n"
+		    "create nonstandard methods for accessing pages from the documentation \n"
+		    "through the HTTP GET request method. \n"
+		    "Consider a HTML_CMS_PAGEPREFIX of: index.php?page= \n"
+		    "This will cause the generated documentation to generate all links to \n"
+		    "the main page as: index.php?page=index.html"
+                 );
+  cs->setDefaultValue("");
+  cs->addDependency("HTML_CMS_EMBEDDING");
+  
+  cs = addString(   "HTML_CMS_IMAGEPREFIX",
+                    "The value of HTML_CMS_IMAGEPREFIX is added to each link in \n"
+		    "the documentation which references images local to the documentation. \n"
+		    "The resulting string will contain the text of this variable followed \n"
+		    "by the filename of the image being referenced. This can be used to \n"
+		    "create nonstandard methods for accessing pages from the documentation \n"
+		    "through the HTTP GET request method. \n"
+		    "Consider a HTML_CMS_PAGEPREFIX of: index.php?image= \n"
+		    "This will cause the generated documentation to generate all links to \n"
+		    "the doxygen logo as: index.php?image=doxygen.png"
+                 );
+  cs->setDefaultValue("");
+  cs->addDependency("HTML_CMS_EMBEDDING");
+  
+  cl = addList( "HTML_CMS_SEARCHPARAMS",
+  				"A list of key value pairs in the form 'key=value'. Each key\n"
+  				"will be included as a hidden field in the search engine form\n"
+  				"with the associated value. This configuration option will only\n"
+  				"be used if the SEARCHENGINE configuration is set to YES."
+  			  );
+  cl->addDependency("SEARCHENGINE");
+  cl->addDependency("HTML_CMS_EMBEDDING");
+  
+  cs = addString( "HTML_CMS_SEARCHPAGE",
+                  "The page to be used for processing search results. This will\n"
+                  "only be used if both the SEARCHENGINE and HTML_CMS_EMBEDDING\n"
+                  "configuration options are set to YES."
+                );
+  cs->addDependency("SEARCHENGINE");
+  cs->addDependency("HTML_CMS_EMBEDDING");
+  
+  ce = addEnum(
+        "HTML_CMS_SEARCHMETHOD",
+        "This option controls the html request method used when performing \n"
+		"a search query. This option will only be used if both the SEARCHENGINE\n"
+        "and HTML_CMS_EMBEDDING configuration options are set to YES. The \n"
+        "available options are post and get. 'get' is used by default.",
+        "get"
+       );
+  ce->addValue("get");
+  ce->addValue("post");
+  ce->addDependency("SEARCHENGINE");
+  ce->addDependency("HTML_CMS_EMBEDDING");
+                 
+  cs = addString( "HTML_CMS_SEARCHFIELD",
+                  "The form field name to use for the text of the search query.\n"
+                  "This option will only be used if both the SEARCHENGINE and \n"
+                  "HTML_CMS_EMBEDDING configuration options are set to YES.\n"
+                  "By default the field will be named 'query'."
+                );
+  cs->setDefaultValue("query");
+  cs->addDependency("SEARCHENGINE");
+  cs->addDependency("HTML_CMS_EMBEDDING");
+  
   addObsolete("CGI_NAME");
   addObsolete("CGI_URL");
   addObsolete("DOC_URL");
Index: P:/workspace/Doxygen2/src/util.h
===================================================================
--- P:/workspace/Doxygen2/src/util.h	(revision 629)
+++ P:/workspace/Doxygen2/src/util.h	(working copy)
@@ -25,6 +25,7 @@
 #include "qtbc.h"
 #include <qlist.h>
 #include <qtextstream.h>
+#include <qmap.h>
 #include <ctype.h>
 #include "sortdict.h"
 
@@ -130,6 +131,7 @@
                    );
 
 QCString getFileFilter(const char* name);
+QMap<QCString,QCString> getSearchParameters();
 
 bool resolveRef(/* in */  const char *scName,
                 /* in */  const char *name,
Index: P:/workspace/Doxygen2/src/ftvhelp.cpp
===================================================================
--- P:/workspace/Doxygen2/src/ftvhelp.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/ftvhelp.cpp	(working copy)
@@ -493,6 +493,10 @@
     {
       if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
     }
+    else if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+    	t << Config_getString("HTML_CMS_PAGEPREFIX");
+    }
     t << n->file << Doxygen::htmlFileExtension;
     if (!n->anchor.isEmpty()) t << "#" << n->anchor;
     if (m_topLevelIndex)
@@ -651,10 +655,10 @@
   t << "      var folder = document.getElementById(id);\n";
   t << "      var l = imageNode.src.length;\n";
   /* If the user clicks on the book icon, we move left one image so 
-   * the code (below) will also adjust the '+' icon. 
+   * the code (below) will also adjust the '+' icon.
    */
-  t << "      if (imageNode.src.substring(l-20,l)==\"" FTV_ICON_FILE(folderclosed) "\" || \n";
-  t << "          imageNode.src.substring(l-18,l)==\"" FTV_ICON_FILE(folderopen)  "\")\n";
+  t << "      if (imageNode.src.substring(l-20,l)==\"" << FTV_ICON_FILE(folderclosed) << "\" || \n";
+  t << "          imageNode.src.substring(l-18,l)==\"" << FTV_ICON_FILE(folderopen) << "\")\n";
   t << "      {\n";
   t << "        imageNode = imageNode.previousSibling;\n";
   t << "        l = imageNode.src.length;\n";
@@ -667,14 +671,14 @@
   t << "      {\n";
   t << "        if (imageNode != null) \n";
   t << "        {\n";
-  t << "          imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n";
-  t << "          if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(mnode) "\")\n";
+  t << "          imageNode.nextSibling.src = \"" << FTV_ICON_FILE(folderclosed) << "\";\n";
+  t << "          if (imageNode.src.substring(l-13,l) == \"" << FTV_ICON_FILE(mnode) << "\")\n";
   t << "          {\n";
-  t << "            imageNode.src = \"" FTV_ICON_FILE(pnode) "\";\n";
+  t << "            imageNode.src = \"" << FTV_ICON_FILE(pnode) << "\";\n";
   t << "          }\n";
-  t << "          else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(mlastnode) "\")\n";
+  t << "          else if (imageNode.src.substring(l-17,l) == \"" << FTV_ICON_FILE(mlastnode) << "\")\n";
   t << "          {\n";
-  t << "            imageNode.src = \"" FTV_ICON_FILE(plastnode) "\";\n";
+  t << "            imageNode.src = \"" << FTV_ICON_FILE(plastnode) << "\";\n";
   t << "          }\n";
   t << "        }\n";
   t << "        folder.style.display = \"none\";\n";
@@ -683,14 +687,14 @@
   t << "      {\n";
   t << "        if (imageNode != null) \n";
   t << "        {\n";
-  t << "          imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n";
-  t << "          if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(pnode) "\")\n";
+  t << "          imageNode.nextSibling.src = \"" << FTV_ICON_FILE(folderopen) << "\";\n";
+  t << "          if (imageNode.src.substring(l-13,l) == \"" << FTV_ICON_FILE(pnode) << "\")\n";
   t << "          {\n";
-  t << "            imageNode.src = \"" FTV_ICON_FILE(mnode) "\";\n";
+  t << "            imageNode.src = \"" << FTV_ICON_FILE(mnode) << "\";\n";
   t << "          }\n";
-  t << "          else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(plastnode) "\")\n";
+  t << "          else if (imageNode.src.substring(l-17,l) == \"" << FTV_ICON_FILE(plastnode) << "\")\n";
   t << "          {\n";
-  t << "            imageNode.src = \"" FTV_ICON_FILE(mlastnode) "\";\n";
+  t << "            imageNode.src = \"" << FTV_ICON_FILE(mlastnode) << "\";\n";
   t << "          }\n";
   t << "        }\n";
   t << "        folder.style.display = \"block\";\n";
Index: P:/workspace/Doxygen2/src/classdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/classdef.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/classdef.cpp	(working copy)
@@ -1588,7 +1588,7 @@
 void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
 {
   static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+  
   ol.writeString("      <div class=\"navtab\">\n");
   ol.writeString("        <table>\n");
 
Index: P:/workspace/Doxygen2/src/searchindex.cpp
===================================================================
--- P:/workspace/Doxygen2/src/searchindex.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/searchindex.cpp	(working copy)
@@ -72,7 +72,12 @@
 {
   if (name==0 || baseName==0) return;
   //printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
+
   QCString url=baseName+Config_getString("HTML_FILE_EXTENSION");
+  
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  url = Config_getString("HTML_CMS_PAGEPREFIX") + url;
+  
   if (anchor) url+=(QCString)"#"+anchor;  
   m_urlIndex++;
   m_urls.insert(m_urlIndex,new URL(name,url));
Index: P:/workspace/Doxygen2/src/htmlgen.cpp
===================================================================
--- P:/workspace/Doxygen2/src/htmlgen.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/htmlgen.cpp	(working copy)
@@ -347,110 +347,6 @@
 static unsigned int tab_r_gif_len = 2585;
 
 
-static const char tabs_css[] = 
-"/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */\n"
-"\n"
-"DIV.tabs\n"
-"{\n"
-"   float            : left;\n"
-"   width            : 100%;\n"
-"   background       : url(\"tab_b.gif\") repeat-x bottom;\n"
-"   margin-bottom    : 4px;\n"
-"}\n"
-"\n"
-"DIV.tabs UL\n"
-"{\n"
-"   margin           : 0px;\n"
-"   padding-left     : 10px;\n"
-"   list-style       : none;\n"
-"}\n"
-"\n"
-"DIV.tabs LI, DIV.tabs FORM\n"
-"{\n"
-"   display          : inline;\n"
-"   margin           : 0px;\n"
-"   padding          : 0px;\n"
-"}\n"
-"\n"
-"DIV.tabs FORM\n"
-"{\n"
-"   float            : right;\n"
-"}\n"
-"\n"
-"DIV.tabs A\n"
-"{\n"
-"   float            : left;\n"
-"   background       : url(\"tab_r.gif\") no-repeat right top;\n"
-"   border-bottom    : 1px solid #84B0C7;\n"
-"   font-size        : x-small;\n"
-"   font-weight      : bold;\n"
-"   text-decoration  : none;\n"
-"}\n"
-"\n"
-"DIV.tabs A:hover\n"
-"{\n"
-"   background-position: 100% -150px;\n"
-"}\n"
-"\n"
-"DIV.tabs A:link, DIV.tabs A:visited,\n"
-"DIV.tabs A:active, DIV.tabs A:hover\n"
-"{\n"
-"       color: #1A419D;\n"
-"}\n"
-"\n"
-"DIV.tabs SPAN\n"
-"{\n"
-"   float            : left;\n"
-"   display          : block;\n"
-"   background       : url(\"tab_l.gif\") no-repeat left top;\n"
-"   padding          : 5px 9px;\n"
-"   white-space      : nowrap;\n"
-"}\n"
-"\n"
-"DIV.tabs INPUT\n"
-"{\n"
-"   float            : right;\n"
-"   display          : inline;\n"
-"   font-size        : 1em;\n"
-"}\n"
-"\n"
-"DIV.tabs TD\n"
-"{\n"
-"   font-size        : x-small;\n"
-"   font-weight      : bold;\n"
-"   text-decoration  : none;\n"
-"}\n"
-"\n"
-"\n"
-"\n"
-"/* Commented Backslash Hack hides rule from IE5-Mac \\*/\n"
-"DIV.tabs SPAN {float : none;}\n"
-"/* End IE5-Mac hack */\n"
-"\n"
-"DIV.tabs A:hover SPAN\n"
-"{\n"
-"   background-position: 0% -150px;\n"
-"}\n"
-"\n"
-"DIV.tabs LI.current A\n"
-"{\n"
-"   background-position: 100% -150px;\n"
-"   border-width     : 0px;\n"
-"}\n"
-"\n"
-"DIV.tabs LI.current SPAN\n"
-"{\n"
-"   background-position: 0% -150px;\n"
-"   padding-bottom   : 6px;\n"
-"}\n"
-"\n"
-"DIV.navpath\n"
-"{\n"
-"   background       : none;\n"
-"   border           : none;\n"
-"   border-bottom    : 1px solid #84B0C7;\n"
-"}\n"
-;
 
 struct tab_data_item
 {
@@ -464,7 +360,6 @@
   { "tab_b.gif", tab_b_gif, tab_b_gif_len },
   { "tab_l.gif", tab_l_gif, tab_l_gif_len },
   { "tab_r.gif", tab_r_gif, tab_r_gif_len },
-  { "tabs.css",  (unsigned char *)tabs_css, 0 }, 
   { 0, 0, 0 }
 };
 
@@ -487,6 +382,144 @@
     }
     data++;
   }
+  
+  // write tabs.css file manually so we can replace some image names
+  // where applicable
+  QCString fileName;
+  fileName = (QCString)dir + "/tabs.css";
+  QFile f(fileName);
+  if( f.open(IO_WriteOnly))
+  {
+	  QTextStream s(&f);
+	  
+	  s << "/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */\n";
+	  s << "\n";
+	  s << "DIV.tabs\n";
+	  s << "{\n";
+	  s << "   float            : left;\n";
+	  s << "   width            : 100%;\n";
+	  s << "   background       : url(\"";
+	  
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+		  s << Config_getString("HTML_CMS_IMAGEPREFIX");
+	  }
+	  
+	  s << "tab_b.gif\") repeat-x bottom;\n";
+	  s << "   margin-bottom    : 4px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs UL\n";
+	  s << "{\n";
+	  s << "   margin           : 0px;\n";
+	  s << "   padding-left     : 10px;\n";
+	  s << "   list-style       : none;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs LI, DIV.tabs FORM\n";
+	  s << "{\n";
+	  s << "   display          : inline;\n";
+	  s << "   margin           : 0px;\n";
+	  s << "   padding          : 0px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs FORM\n";
+	  s << "{\n";
+	  s << "   float            : right;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs A\n";
+	  s << "{\n";
+	  s << "   float            : left;\n";
+	  s << "   background       : url(\"";
+
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+		  s << Config_getString("HTML_CMS_IMAGEPREFIX");
+	  }
+	  
+	  s << "tab_r.gif\") no-repeat right top;\n";
+	  s << "   border-bottom    : 1px solid #84B0C7;\n";
+	  s << "   font-size        : x-small;\n";
+	  s << "   font-weight      : bold;\n";
+	  s << "   text-decoration  : none;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs A:hover\n";
+	  s << "{\n";
+	  s << "   background-position: 100% -150px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs A:link, DIV.tabs A:visited,\n";
+	  s << "DIV.tabs A:active, DIV.tabs A:hover\n";
+	  s << "{\n";
+	  s << "       color: #1A419D;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs SPAN\n";
+	  s << "{\n";
+	  s << "   float            : left;\n";
+	  s << "   display          : block;\n";
+	  s << "   background       : url(\"";
+
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+		  s << Config_getString("HTML_CMS_IMAGEPREFIX");
+	  }
+	  
+	  s << "tab_l.gif\") no-repeat left top;\n";
+	  s << "   padding          : 5px 9px;\n";
+	  s << "   white-space      : nowrap;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs INPUT\n";
+	  s << "{\n";
+	  s << "   float            : right;\n";
+	  s << "   display          : inline;\n";
+	  s << "   font-size        : 1em;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs TD\n";
+	  s << "{\n";
+	  s << "   font-size        : x-small;\n";
+	  s << "   font-weight      : bold;\n";
+	  s << "   text-decoration  : none;\n";
+	  s <<  "}\n";
+	  s << "\n";
+	  s << "\n";
+	  s << "\n";
+	  s << "/* Commented Backslash Hack hides rule from IE5-Mac \\*/\n";
+	  s << "DIV.tabs SPAN {float : none;}\n";
+	  s << "/* End IE5-Mac hack */\n";
+	  s << "\n";
+	  s << "DIV.tabs A:hover SPAN\n";
+	  s << "{\n";
+	  s << "   background-position: 0% -150px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs LI.current A\n";
+	  s << "{\n";
+	  s << "   background-position: 100% -150px;\n";
+	  s << "   border-width     : 0px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.tabs LI.current SPAN\n";
+	  s << "{\n";
+	  s << "   background-position: 0% -150px;\n";
+	  s << "   padding-bottom   : 6px;\n";
+	  s << "}\n";
+	  s << "\n";
+	  s << "DIV.navpath\n";
+	  s << "{\n";
+	  s << "   background       : none;\n";
+	  s << "   border           : none;\n";
+	  s << "   border-bottom    : 1px solid #84B0C7;\n";
+	  s << "}\n";
+  }
+  else
+  {
+      fprintf(stderr,"Warning: Cannot open file tabs.css for writing\n");	  
+  }
 }
 
 //------------------------------------------------------------------------
@@ -539,11 +572,22 @@
     g_header=fileToString(Config_getString("HTML_HEADER"));
     //printf("g_header='%s'\n",g_header.data());
   }
+  else  
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  g_header = "<!-- BEGIN CMS EMBEDDED DOCUMENTATION, GENERATED BY DOXYGEN -->\n";
+  }
+  
   if (!Config_getString("HTML_FOOTER").isEmpty()) 
   {
     g_footer=fileToString(Config_getString("HTML_FOOTER"));
     //printf("g_footer='%s'\n",g_footer.data());
   }
+  else  
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  g_footer = "<!-- END CMS EMBEDDED DOCUMENTATION, GENERATED BY DOXYGEN -->\n";
+  }
   createSubDirs(d);
 
   //if (Config_getBool("HTML_FANCY_TABS"))
@@ -610,8 +654,15 @@
   QTextStream t(&file);
   t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>\n";
   t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
-  t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
-    << "<img src=\"doxygen.png\" alt=\"doxygen\" " 
+  t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">";
+  t << "<img src=\"";  
+  // Places a custom prefix in front of doxygen logo
+  // for using addressing methods of a CMS
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  t << Config_getString("HTML_CMS_IMAGEPREFIX");
+  }  
+  t << "doxygen.png\" alt=\"doxygen\" " 
     << "align=\"middle\" border=\"0\">"
     << "</a> $doxygenversion";
   t << "</small></address>\n"
@@ -632,10 +683,14 @@
       "  var sectionDiv=document.getElementById('dynsection'+num);\n"
       "  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
       "    sectionDiv.style.display='block';\n"
-      "    button.src='" << relPath << "open.gif';\n"
+      "    button.src='" <<
+      (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+      relPath << "open.gif';\n"
       "  }else{\n"
       "    sectionDiv.style.display='none';\n"
-      "    button.src='" << relPath << "closed.gif';\n"
+      "    button.src='" <<
+      (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+      relPath << "closed.gif';\n"
       "  }\n"
       "}\n"
       "function initDynSections(){\n"
@@ -654,7 +709,9 @@
       "      header.style.cursor='pointer';\n"
       "      header.onclick=changeDisplayState;\n"
       "      header.id='dynheader'+sectionCounter;\n"
-      "      button.src='" << relPath << "closed.gif';\n"
+      "      button.src='" <<
+      (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_IMAGEPREFIX"):"") <<
+      relPath << "closed.gif';\n"
       "      section.id='dynsection'+sectionCounter;\n"
       "      section.style.display='none';\n"
       "      section.style.marginLeft='14px';\n"
@@ -720,7 +777,14 @@
         Config_getString("PROJECT_NAME")
         );
     t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
-    t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" " 
+    t << endl << "<img src=\"";
+    // Places a custom prefix in front of doxygen logo
+    // for using addressing methods of a CMS
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  t << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }    
+    t << relPath << "doxygen.png\" alt=\"doxygen\" " 
       << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " ";
     t << "</small></address>";
     if (Debug::isFlagSet(Debug::Validate))
@@ -841,6 +905,7 @@
 {
   //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
   QCString *dest;
+  
   t << "<li>";
   if (ref || f)
   {
@@ -862,6 +927,14 @@
     }
     else
     {
+	  // Places a custom prefix in front of whatever we are
+	  // linking to so we adhere to get request convetions of
+      // a CMS
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+		  t << Config_getString("HTML_CMS_PAGEPREFIX");
+	  }
+	  
       t << relPath;
     }
     if (f) t << f << Doxygen::htmlFileExtension << "\">";
@@ -890,7 +963,18 @@
 {
   t << "<li>";
   if (path) docify(path);
-  t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
+  
+  t << "<a class=\"el\" href=\"";
+
+  // Places a custom prefix in front of whatever we
+  // are linking to to adhere to the get request
+  // conventions of a CMS
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  t << Config_getString("HTML_CMS_PAGEPREFIX");
+  }
+  
+  t << f << Doxygen::htmlFileExtension << "\">";
   docify(name);
   t << "</a> ";
 }
@@ -899,6 +983,7 @@
                                     const char *anchor, const char *name)
 {
   QCString *dest;
+ 
   if (ref) 
   {
     t << "<a class=\"elRef\" ";
@@ -917,6 +1002,13 @@
   }
   else
   {
+    // Places a custom prefix in front of whatever we
+    // are linking to to adhere to the html get request
+    // conventions of a CMS
+	if( Config_getBool("HTML_CMS_EMBEDDING") )
+	{
+	  t << Config_getString("HTML_CMS_PAGEPREFIX");
+	}
     t << relPath;
   }
   if (f) t << f << Doxygen::htmlFileExtension;
@@ -932,6 +1024,7 @@
 {
   QCString *dest;
   //printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
+  
   if (ref) 
   {
     t << "<a class=\"codeRef\" ";
@@ -950,6 +1043,13 @@
   }
   else
   {
+    // Places a custom prefix in front of whatever we
+    // are linking to to adhere to the html get request
+    // conventions of a CMS
+	if( Config_getBool("HTML_CMS_EMBEDDING") )
+	{
+	  t << Config_getString("HTML_CMS_PAGEPREFIX");
+	}
     t << relPath;
   }
   if (f) t << f << Doxygen::htmlFileExtension;
@@ -963,9 +1063,19 @@
 }
 
 void HtmlGenerator::startTextLink(const char *f,const char *anchor)
-{
+{  
   t << "<a href=\"";
-  if (f)   t << relPath << f << Doxygen::htmlFileExtension;
+  if (f)   
+  {
+      // Places a custom prefix in front of whatever we
+      // are linking to to adhere to the html get request
+      // conventions of a CMS
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+	    t << Config_getString("HTML_CMS_PAGEPREFIX");
+	  }
+	  t << relPath << f << Doxygen::htmlFileExtension;
+  }
   if (anchor) t << "#" << anchor;
   t << "\">"; 
 }
@@ -1124,8 +1234,12 @@
 {
   t << "</div>" << endl;
   t << "<div class=\"dynsection\">" << endl;
-  t << "\n<p><center><img src=\""
-    << relPath << fileName << ".png\" usemap=\"#" << name << "_map\""
+  t << "\n<p><center><img src=\"";
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  t << Config_getString("HTML_CMS_IMAGEPREFIX");
+  }
+  t << relPath << fileName << ".png\" usemap=\"#" << name << "_map\""
     << " border=\"0\" alt=\"\"></center>" << endl
     << "<map name=\"" << name << "_map\">" << endl;
 
@@ -1499,7 +1613,9 @@
   if (Config_getBool("GENERATE_LEGEND"))
   {
     t << "<center><font size=\"2\">[";
-    startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension);
+    startHtmlLink((Config_getBool("HTML_CMS_EMBEDDING")?
+    	Config_getString("HTML_CMS_PAGEPREFIX"):"")+
+    	relPath+"graph_legend"+Doxygen::htmlFileExtension);
     t << theTranslator->trLegend();
     endHtmlLink();
     t << "]</font></center>";
@@ -1712,10 +1828,20 @@
 static void startQuickIndexItem(QTextStream &t,const char *l,
                                 bool hl,bool /*compact*/,
                                 const QCString &relPath)
-{
+{	  
   t << "      <li"; if (hl) t << " class=\"current\"";
   t << "><a ";
-  t << "href=\"" << relPath << l << "\">";
+  t << "href=\"";
+
+  // Places a custom prefix in front of whatever we
+  // are linking to to adhere to the html get request
+  // conventions of a CMS
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+    t << Config_getString("HTML_CMS_PAGEPREFIX");
+  }
+  
+  t << relPath << l << "\">";
   t << "<span>";
 }
 
@@ -1997,21 +2123,61 @@
 
   if (Config_getBool("SEARCHENGINE"))
   {
-    QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
-    if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
-    t << "    <li>\n";
-    t << "      <form action=\"" << relPath << "search.php\" method=\"get\">\n";
-    t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
-    t << "          <tr>\n";
-    t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
-    if (hli!=HLI_Search)
-    {
-      t << "            <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
-      t << "          </tr>\n";
-      t << "        </table>\n";
-      t << "      </form>\n";
-      t << "    </li>\n";
-    }
+	  if( Config_getBool("HTML_CMS_EMBEDDING") )
+	  {
+	      QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
+	      if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
+	      t << "    <li>\n";
+	      t << "      <form action=\"";
+	      t << Config_getString("HTML_CMS_SEARCHPAGE") << "\" method=\"";
+	      t << Config_getEnum("HTML_CMS_SEARCHMETHOD");
+	      t << "\">\n";
+	      t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
+	      t << "          <tr>\n";
+	      t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
+
+		  QMap<QCString,QCString> l_params = getSearchParameters();
+		  QMap<QCString,QCString>::Iterator l_iterator;
+    	  for( l_iterator = l_params.begin() ; 
+    	    l_iterator != l_params.end() ;
+    	    l_iterator++ )
+    	  {
+    	    t << "            <input type=\"hidden\"";
+    	    t << "name=\"" << l_iterator.key() << "\" ";
+    	    t << "value=\"" << l_iterator.data() << "\" ";
+    	    t << "/>\n";
+    	  }
+	    	
+	      if (hli!=HLI_Search)
+	      {
+	        t << "            <td><input type=\"text\"";
+	        t << "name=\"" << Config_getString("HTML_CMS_SEARCHFIELD") << "\" ";
+	        t << "value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
+	        t << "          </tr>\n";
+	        t << "        </table>\n";
+	        t << "      </form>\n";
+	        t << "    </li>\n";
+	      }
+	  }
+	  else
+	  {
+	     QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
+	     if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
+	     t << "    <li>\n";
+	     t << "      <form action=\"";
+	     t << relPath << "search.php\" method=\"get\">\n";
+	     t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
+	     t << "          <tr>\n";
+	     t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
+	     if (hli!=HLI_Search)
+	     {
+	       t << "            <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
+	       t << "          </tr>\n";
+	       t << "        </table>\n";
+	       t << "      </form>\n";
+	       t << "    </li>\n";
+	     }
+	  }
   } 
   if (hli!=HLI_Search) // on the search page the page will be ended by the
                        // page itself
@@ -2106,8 +2272,30 @@
       else
       {
         t << "&nbsp;\n<div class=\"qindex\">\n";
-        t << "  <form class=\"search\" action=\"search.php\" "
-          << "method=\"get\">\n";
+        if( Config_getBool("HTML_CMS_EMBEDDING") )
+        {
+        	// TODO: This has not actually been tested
+        	t << " <form class=\"search\" action=\"" << Config_getString("HTML_CMS_SEARCHPAGE") 
+        	  << "\" method=\"" << Config_getEnum("HTML_CMS_SEARCHMETHOD") << "\">\n";
+        	
+        	// Write Hidden Parameters Of Search Query
+        	QMap<QCString,QCString> l_params = getSearchParameters();
+		    QMap<QCString,QCString>::Iterator l_iterator;
+		    for( l_iterator = l_params.begin() ; 
+		      l_iterator != l_params.end() ;
+		      l_iterator++ )
+		    {
+		      t << "            <input type=\"hidden\"";
+		      t << "name=\"" << l_iterator.key() << "\" ";
+		      t << "value=\"" << l_iterator.data() << "\" ";
+		      t << "/>\n";
+		    }	    	
+        }
+        else
+        {
+        	t << "  <form class=\"search\" action=\"search.php\" "
+        	  << "method=\"get\">\n";
+        }
       }
 
       t << "\n<?php\n\n";
@@ -2139,7 +2327,9 @@
       t << "function end_form($value)\n";
       t << "{\n";
       t << "  echo \"" 
-        << "            <td><input type=\\\"text\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/></td>\\n"
+        << "            <td><input type=\\\"text\\\" name=\\\""
+        << (Config_getBool("HTML_CMS_EMBEDDING")?Config_getString("HTML_CMS_SEARCHFIELD"):"query")
+        << "\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/></td>\\n"
         << "          </tr>\\n"
         << "        </table>\\n"
         << "      </form>\\n"
Index: P:/workspace/Doxygen2/src/htmldocvisitor.cpp
===================================================================
--- P:/workspace/Doxygen2/src/htmldocvisitor.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/htmldocvisitor.cpp	(working copy)
@@ -133,6 +133,10 @@
   if (m_hide) return;
   m_t << "<a href=\"";
   if (u->isEmail()) m_t << "mailto:";
+  
+  // TODO: Should the page prefix be added here, 
+  // these links are probably guaraunteed absolute
+  // addresses
   m_t << u->url() << "\">";
   filter(u->url());
   m_t << "</a>";
@@ -379,7 +383,12 @@
   m_t << "\"";
   /// @todo cache image dimensions on formula generation and give height/width
   /// for faster preloading and better rendering of the page
-  m_t << " src=\"" << f->relPath() << f->name() << ".png\">";
+  m_t << " src=\"";
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+  }
+  m_t << f->relPath() << f->name() << ".png\">";
   if (bDisplay)
     m_t << endl << "<p>" << endl;
 }
@@ -755,6 +764,9 @@
 void HtmlDocVisitor::visitPre(DocHRef *href)
 {
   if (m_hide) return;
+  
+  // NOTE: DocHRef refers only to <A> tags placed by the
+  // user in the html documentation.
   m_t << "<a href=\"" << href->url()  << "\""
       << htmlAttribsToString(href->attribs()) << ">";
 }
@@ -790,7 +802,12 @@
       baseName=baseName.right(baseName.length()-i-1);
     }
     m_t << "<div align=\"center\">" << endl;
-    m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\"" 
+    m_t << "<img src=\"";
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+  	  m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+    }
+    m_t << img->relPath() << img->name() << "\" alt=\"" 
       << baseName << "\"" << ">" << endl;
     if (img->hasCaption())
     {
@@ -880,8 +897,18 @@
   {
     refName+=Doxygen::htmlFileExtension;
   }
-  m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
+  
+  m_t << "<li><a href=\"";
 
+  // Places a custom prefix in front of whatever we
+  // are linking to to adhere to the html get request
+  // conventions of a CMS
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+    m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+  }
+  
+  m_t << refName << "#" << ref->anchor() << "\">";
 }
 
 void HtmlDocVisitor::visitPost(DocSecRefItem *) 
@@ -1008,9 +1035,17 @@
   if (m_hide) return;
   bool anonymousEnum = x->file()=="@";
   if (!anonymousEnum)
-  {
-    m_t << "<dl compact><dt><b><a class=\"el\" href=\"" 
-        << x->relPath() << x->file() << Doxygen::htmlFileExtension 
+  {	  
+    m_t << "<dl compact><dt><b><a class=\"el\" href=\"";
+
+    // Places a custom prefix in front of whatever we
+    // are linking to to adhere to the html get request
+    // conventions of a CMS
+    if( Config_getBool("HTML_CMS_EMBEDDING") )
+    {
+      m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+    }
+    m_t << x->relPath() << x->file() << Doxygen::htmlFileExtension 
         << "#" << x->anchor() << "\">";
   }
   else 
@@ -1126,7 +1161,7 @@
     m_t << "\" ";
   }
   else // local link
-  {
+  {	  
     m_t << "<a class=\"el\" ";
   }
   m_t << "href=\"";
@@ -1136,6 +1171,13 @@
   }
   else
   {
+	// Places a custom prefix in front of whatever we
+	// are linking to to adhere to the html get request
+	// conventions of a CMS
+	if( Config_getBool("HTML_CMS_EMBEDDING") )
+	{
+	  m_t << Config_getString("HTML_CMS_PAGEPREFIX");
+	}
     m_t << relPath;
   }
   if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
@@ -1176,7 +1218,12 @@
   writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
   QString mapName = baseName+".map";
   QString mapFile = fileName+".map";
-  m_t << "<img src=\"" << relPath << baseName << "." 
+  m_t << "<img src=\"";
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+  }
+  m_t << relPath << baseName << "." 
     << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
     << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
   QString imap = getDotImageMapFromFile(fileName,outDir,relPath.data(),context);
@@ -1196,7 +1243,12 @@
   writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
   QString mapName = baseName+".map";
   QString mapFile = fileName+".map";
-  m_t << "<img src=\"" << relPath << baseName << ".png\" alt=\""
+  m_t << "<img src=\"";
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  m_t << Config_getString("HTML_CMS_IMAGEPREFIX");
+  }
+  m_t << relPath << baseName << ".png\" alt=\""
     << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
   QString imap = getMscImageMapFromFile(fileName,outDir,relPath.data(),context);
   m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl;
Index: P:/workspace/Doxygen2/src/search.php
===================================================================
--- P:/workspace/Doxygen2/src/search.php	(revision 629)
+++ P:/workspace/Doxygen2/src/search.php	(working copy)
@@ -271,11 +271,12 @@
 
 function main()
 {
+  $l_dir = dirname(__FILE__);
   if(strcmp('4.1.0', phpversion()) > 0) 
   {
     die("Error: PHP version 4.1.0 or above required!");
   }
-  if (!($file=fopen("search.idx","rb"))) 
+  if (!($file=fopen("$l_dir/search.idx","rb"))) 
   {
     die("Error: Search index file could NOT be opened!");
   }
Index: P:/workspace/Doxygen2/src/msc.cpp
===================================================================
--- P:/workspace/Doxygen2/src/msc.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/msc.cpp	(working copy)
@@ -72,6 +72,12 @@
         {
           if ((dest=Doxygen::tagDestinationDict[df->ref()])) t << *dest << "/";
         }
+        else
+        if( Config_getBool("HTML_CMS_EMBEDDING") )
+        {
+        	t << Config_getString("HTML_CMS_PAGEPREFIX");
+        }
+        
         if (!df->file().isEmpty()) t << relPath << df->file() << Doxygen::htmlFileExtension;
         if (!df->anchor().isEmpty()) t << "#" << df->anchor();
       }
Index: P:/workspace/Doxygen2/src/index.cpp
===================================================================
--- P:/workspace/Doxygen2/src/index.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/index.cpp	(working copy)
@@ -231,7 +231,11 @@
       ol.writeString("<a class=\"qindex\" ");
     }
   }
-  ol.writeString("href=\""); 
+  ol.writeString("href=\"");     
+  if( Config_getBool("HTML_CMS_EMBEDDING") )
+  {
+	  ol.writeString(Config_getString("HTML_CMS_PAGEPREFIX"));
+  }
   ol.writeString(l);
   ol.writeString("\">");
   if (fancyTabs)
Index: P:/workspace/Doxygen2/src/groupdef.cpp
===================================================================
--- P:/workspace/Doxygen2/src/groupdef.cpp	(revision 629)
+++ P:/workspace/Doxygen2/src/groupdef.cpp	(working copy)
@@ -844,7 +844,7 @@
 void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
 {
   static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
+  
   ol.writeString("      <div class=\"navtab\">\n");
   ol.writeString("        <table>\n");
 
Index: P:/workspace/Doxygen2/src/search_php.h
===================================================================
--- P:/workspace/Doxygen2/src/search_php.h	(revision 629)
+++ P:/workspace/Doxygen2/src/search_php.h	(working copy)
@@ -271,11 +271,12 @@
 "\n"
 "function main()\n"
 "{\n"
+"  $l_dir = dirname(__FILE__);\n"
 "  if(strcmp('4.1.0', phpversion()) > 0) \n"
 "  {\n"
 "    die(\"Error: PHP version 4.1.0 or above required!\");\n"
 "  }\n"
-"  if (!($file=fopen(\"search.idx\",\"rb\"))) \n"
+"  if (!($file=fopen(\"$l_dir/search.idx\",\"rb\"))) \n"
 "  {\n"
 "    die(\"Error: Search index file could NOT be opened!\");\n"
 "  }\n"
Index: P:/workspace/Doxygen2/Doxyfile_Embedded
===================================================================
--- P:/workspace/Doxygen2/Doxyfile_Embedded	(revision 0)
+++ P:/workspace/Doxygen2/Doxyfile_Embedded	(revision 0)
@@ -0,0 +1,15 @@
+# Doxyfile 1.5.4
+#
+@INCLUDE = Doxyfile
+HTML_OUTPUT            = embedded_html
+GENERATE_LATEX         = NO
+#---------------------------------------------------------------------------
+# CMS EMBEDDING OPTIONS
+#---------------------------------------------------------------------------
+HTML_CMS_EMBEDDING=YES
+HTML_CMS_PAGEPREFIX=embedded_docs.php?type=page&file=
+HTML_CMS_IMAGEPREFIX=embedded_docs.php?type=image&file=
+HTML_CMS_SEARCHPARAMS = type=search \
+			file=search.php
+HTML_CMS_SEARCHPAGE = embedded_docs.php
+HTML_CMS_SEARCHMETHOD = get
Index: P:/workspace/Doxygen2/doc/Doxyfile
===================================================================
--- P:/workspace/Doxygen2/doc/Doxyfile	(revision 629)
+++ P:/workspace/Doxygen2/doc/Doxyfile	(working copy)
@@ -36,7 +36,7 @@
                     autolink.doc output.doc custcmd.doc external.doc faq.doc trouble.doc history.doc features.doc \
 		    doxygen_usage.doc doxytag_usage.doc \
                     doxywizard_usage.doc installdox_usage.doc \
-		    config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
+		    config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc embedded_html.doc\
                     perlmod.doc perlmod_tree.doc arch.doc 
 FILE_PATTERNS     = *.cpp *.h *.doc
 EXAMPLE_PATH      = ../examples
Index: P:/workspace/Doxygen2/doc/embedded_html.doc
===================================================================
--- P:/workspace/Doxygen2/doc/embedded_html.doc	(revision 0)
+++ P:/workspace/Doxygen2/doc/embedded_html.doc	(revision 0)
@@ -0,0 +1,257 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page embedding_html HTML Embedding 
+
+\ref embedded_html_config_one HTML_CMS_EMBEDDING
+
+\ref embedded_html_config_two HTML_CMS_PAGEPREFIX
+
+\ref embedded_html_config_three HTML_CMS_IMAGEPREFIX
+
+\ref embedded_html_config_four HTML_CMS_SEARCHPARAMS
+
+\ref embedded_html_config_five HTML_CMS_SEARCHPAGE
+
+\ref embedded_html_config_six HTML_CMS_SEARCHMETHOD
+
+\ref embedded_html_config_seven HTML_CMS_SEARCHFIELD
+
+\ref embedded_html_stylesheets Notes On Stylesheets
+
+Doxygen has the ability to adapt to many of the different linking
+formats which might be used by content management systems(CMS),
+dynamic, or template based web pages. With the 
+\c HTML_CMS_EMBEDDING configuration option it is possible to
+adapt the doxygen generated html output to a format which
+can be leveraged by a CMS.
+
+The process of integrating doxygen with an existing content
+management system is beyond the scope of this manual. 
+However given a working knowledge of php and html
+it should be possible to take the concepts presented here
+and apply them to integrating doxygen into a dynamic
+web page.
+
+Doxygen has a set of configuration options which have been
+designed specifically for generating html documentation
+suitable for use in a CMS. There is a sample doxygen 
+configuration file labeled \c Doxyfile_Embedded in the
+project's root folder. A copy of the relevant section
+has been included below to illustrate the concepts
+behind embedding doxygen into your webpage.
+
+\code
+#--------------------------------------------------
+# CMS Embedding Options
+#--------------------------------------------------
+HTML_CMS_EMBEDDING    = YES                                 # (1)
+HTML_CMS_PAGEPREFIX   = embedded_docs.php?type=page&file=   # (2)
+HTML_CMS_IMAGEPREFIX  = embedded_docs.php?type=image&file=  # (3)
+HTML_CMS_SEARCHPARAMS = type=search file=search.php         # (4)
+HTML_CMS_SEARCHPAGE   = embedded_docs.php                   # (5)
+HTML_CMS_SEARCHMETHOD = get                                 # (6)
+HTML_CMS_SEARCHFIELD  = query                               # (7)
+\endcode
+
+Let's now look at each relevant line in the configuration file
+and see exactly what these options specify.
+
+\section embedded_html_config_one Line (1) - HTML_CMS_EMBEDDING
+
+ This is the most important setting in embedding doxygen generated
+documentation into your CMS. It instructs doxygen to refer to all
+files with respect to a fixed root filesystem. When the feature
+is enabled all paths are considered to be relative to a root folder
+which does not change as the user navigates the documentation. 
+
+Enabling this option also instructs doxygen to remove the html header
+and footers that are typically generated. The html files which are
+generated will consist only of the html elements which would normally
+be found inside the \c body tag of the original html elements.
+
+The configuration options \c HTML_HEADER and \c HTML_FOOTER can still
+be used if you wish to apply a header or footer to the html documention.
+The default header and footer have been removed because a CMS
+will typically generate the \c html, \c head, and \c body tags of the
+pages it provides, thus making those generated by doxygen redundant.
+
+\section embedded_html_config_two Line (2) - HTML_CMS_PAGEPREFIX
+
+ The \c HTML_CMS_PAGEPREFIX configuration option specifies a string
+which should be prefixed to all links generated by doxygen to other
+doxygen generated pages. The string provided in our example
+<tt>embedded_docs.php?type=page&file=</tt> specifies a link to the file 
+\c embedded_docs.php with parameters \c type and \c file. 
+
+You will find in the project root a file called \c embedded_docs.php
+which is a simple example written in php of embedding doxygen documentation
+into a dynamic web page. 
+
+Each of the links in the documentation generated using the settings
+above will have the contents of \c HTML_CMS_PAGEPREFIX in front
+of it:
+
+\verbatim
+<a href="classes.html">Classes</a>
+\endverbatim 
+
+will be changed to
+
+\verbatim
+<a href="embedded_docs.php?type=page&file=classes.html">Classes</a>
+\endverbatim
+
+The affect is that the file \c embedded_docs.php has control of 
+how to retrieve \c classes.html and where to place it in a
+potentially more complex weblayout.
+
+\section embedded_html_config_three Line (3) - HTML_CMS_IMAGEPREFIX
+
+ The \c HTML_CMS_IMAGEPREFIX option works much like \c HTML_CMS_PAGEPREFIX,
+however it applies to the images referenced in the doxygen documentation
+as opposed to pages. Each image will be translated to be a path relative
+to some root location, and with the file and parameters specified
+in the \c HTML_CMS_IMAGEPREFIX option, thus:
+
+\verbatim
+<img src="doxygen.png" />
+\endverbatim
+
+will become
+
+\verbatim
+<img src="embedded_docs.php?type=image&file=doxygen.png" />
+\endverbatim
+
+\section embedded_html_config_four Line (4) - HTML_CMS_SEARCHPARAMS
+
+ The \c HTML_CMS_SEARCHPARAMS option applies only to webpages which
+want to employ search facilities using doxygen's \c SEARCHENGINE 
+option. The search engine feature of doxygen embeds a form on
+each generated page containing a text box with which a user can
+perform a query on the documentation. The \c HTML_CMS_SEARCHPARAMS
+option makes it possible to add hidden fields to the search form,
+and thus it can be used to simplify identifying the search request
+sent by a web browser when being passed to a CMS.
+
+ In the example you can see that two key value pairs have been specified
+\c type=search and <tt>file=search.php</tt>. These two key value pairs are
+included in the resulting form as hidden form fields.
+
+\verbatim
+<input type="hidden" name="type" value="search" />
+<input type="hidden" name="file" value="search.php" />
+\endverbatim
+
+ Any number of key/value pairs may be specified, and just like all other
+lists in the doxygen configuration file, they are separated by whitespace.
+If you need to include spaces you may surround any of the key value pairs
+with quotes.
+
+\section embedded_html_config_five Line (5) - HTML_CMS_SEARCHPAGE
+
+ The \c HTML_CMS_SEARCHPAGE option indicates to the search engine
+which page to submit the search query to. This option controls
+the value of the \c action attribute of the SEARCH_ENGINE form.
+
+\section embedded_html_config_six Line (6) - HTML_CMS_SEARCHMETHOD
+
+ The \c HTML_CMS_SEARCHMETHOD option controls how the search engine
+form is submitted to the web server. This option controls the value
+of the \c method attribute of the form tag generated for the search
+engine. Legal values includes \c get and \c post which directly
+correspond with the meanings described in the HTML specification.
+
+\section embedded_html_config_seven Line (7) - HTML_CMS_SEARCHFIELD
+ The \c HTML_CMS_SEARCHFIELD option controls the name of the
+form field which contains the search query submitted by the user.
+
+The output resulting from all of the search engine parameters 
+in our example configuration should generate a search form
+that looks similar to:
+
+\verbatim
+<form action="embedded_docs.php" method="get">
+  <input type="hidden" name="type" value="search" />
+  <input type="hidden" name="file" value="search.php" />
+  <input type="text" name="query" value ="what to search for" />
+</form>
+\endverbatim
+
+None of the search related configuration options have any affect 
+unless the \c SEARCHENGINE option is also turned on. In many cases
+it may be necesarry to reimplement the functionality which
+is contained in the \c search.php file generated by doxygen
+to achieve the best results within your own CMS.
+
+\section embedded_html_stylesheets Notes On Stylesheets
+
+When generating your documentation doxygen by default will also
+generate two stylesheets \c doxygen.css and \c tabs.css. Each of
+these style sheets is then typically linked to by the generated
+html pages to properly format the doxygen documentation. 
+A CMS designed for use with doxygen may or may-not want to reuse
+these pregenerated stylesheets, and by enabling \c HTML_CMS_EMBEDDING
+the generated documentation no longer directly refers to them. 
+Doxygen however will still generate the stylesheets and will
+generate links to any images referenced using the same format
+as is done elsewhere in the documentation. Using these stylesheets
+A CMS has two options when servicing a request.
+
+The first option is to directly link to the stylesheets, and this implies
+that some relative address is used when linking to them. This will
+typically generate a link similar to:
+
+\verbatim
+<link rel="stylesheet" type="text/css" href="documentation/html/doxygen.css" />
+\endverbatim
+
+Using this method of linking stylesheets has a subtle issue when the
+\c HTML_CMS_IMAGEPREFIX option does not contain a fully
+qualified path. When a web browser interprets the above link and 
+retrieves the \c css file the working directory from which relative 
+paths are evaluated is the path of the location of the stylesheet. This 
+will cause links, similar to those generated by the example configuration,
+to incorrectly attempt to retrieve the file
+\c documentation/html/embedded_docs.php when processing the
+images which referenced in the CSS file.  A simple solution to 
+this is to use a fully qualified address for the 
+\c HTML_CMS_IMAGEPREFIX option. 
+
+If this isn't the right solution, it is also possible to link to the stylesheets
+through an intermediate page which is responsible for evaluating 
+the relative path to the documentation. Using this intermediate
+page, the CMS could link to the stylesheet using a link:
+
+\verbatim
+<link rel="stylesheet" type="text/css" href="getcss.php?file=doxygen.css" />
+\endverbatim
+
+where the \c getcss.php file is responsible for looking up the
+desired css file and sending it to a web client. A simple example
+might look as follows:
+
+\verbatim
+<?php
+  echo file_get_contents('documentation/html/' . $_GET['file']);
+?>
+\endverbatim
+
+The \c embedded_docs.php file contains another \c php example of 
+retrieving the css file in this way. 
+
+*/
Index: P:/workspace/Doxygen2/doc/config.doc
===================================================================
--- P:/workspace/Doxygen2/doc/config.doc	(revision 629)
+++ P:/workspace/Doxygen2/doc/config.doc	(working copy)
@@ -143,6 +143,13 @@
 \refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
 \refitem cfg_hide_undoc_relations HIDE_UNDOC_RELATIONS
 \refitem cfg_html_align_members HTML_ALIGN_MEMBERS
+\refitem cfg_embedded_html HTML_CMS_EMBEDDING
+\refitem cfg_embedded_html_imageprefix HTML_CMS_IMAGEPREFIX
+\refitem cfg_embedded_html_pageprefix HTML_CMS_PAGEPREFIX
+\refitem cfg_embedded_html_searchfield HTML_CMS_SEARCHFIELD
+\refitem cfg_embedded_html_searchmethod HTML_CMS_SEARCHMETHOD
+\refitem cfg_embedded_html_searchpage HTML_CMS_SEARCHPAGE
+\refitem cfg_embedded_html_searchparams HTML_CMS_SEARCHPARAMS
 \refitem cfg_html_dynamic_sections HTML_DYNAMIC_SECTIONS
 \refitem cfg_html_footer HTML_FOOTER
 \refitem cfg_html_header HTML_HEADER
@@ -2053,6 +2060,81 @@
  instructions).
 
 </dl>
+
+\section config_embedded_html Embedded HTML 
+\anchor cfg_embedded_html
+<dl>
+
+<dt>\c HTML_CMS_EMBEDDING <dd>
+ \addindex HTML_CMS_EMBEDDING
+ The \c HTML_CMS_EMBEDDING option can be used to enable features which simplify
+ embedding the doxygen generated HTML documentation into a content management
+ system or other website that makes use of a template engine. Legal values are
+ \c YES and \c NO. If set to \c YES then the most immediate change is the removal
+ of the standard header and footer. All elements which would typically be found
+ outside of the body tag in the html output will be removed. It is still possible
+ to use the \c HTML_HEADER and \c HTML_FOOTER options to add a custom header
+ or footer however. The use of relative paths \c (CREATE_SUBDIRS) is also 
+ immediately affected, and all paths will be generated relative to the root
+ folder of the documentation. \c '../../index.html' becomes \c 'index.html'.
+
+\anchor cfg_embedded_html_pageprefix
+<dt>\c HTML_CMS_PAGEPREFIX <dd>
+ \addindex HTML_CMS_PAGEPREFIX
+ The \c HTML_CMS_PAGEPREFIX option specifies a string to be placed in front of
+ all inter-documentation links in the generated HTML output. For the most reliable
+ results it is reccomended to use a fully qualified address (starting with http://)
+ however as described in the embedded html section of the manual this is not
+ strictly necesarry. This option has no affect on the generated documentation if
+ \c HTML_CMS_EMBEDDING is given the value \c NO.
+
+\anchor cfg_embedded_html_imageprefix
+<dt>\c HTML_CMS_IMAGEPREFIX <dd>
+ \addindex HTML_CMS_IMAGEPREFIX
+ The \c HTML_CMS_IMAGEPREFIX option specifies a string to be placed in front of
+ all images referenced by the documentation including logos, buttons and
+ diagrams. As with the \c HTML_CMS_PAGEPREFIX option it is reccomended that
+ a fully qualified web address (starting with http://) is used, however you may
+ wish to see the embedded html section of the manual for an alternative. This
+ option has no affect on the generated documentation if \c HTML_CMS_EMBEDDING is
+ given the value \c NO.
+
+\anchor cfg_embedded_html_searchparams
+<dt>\c HTML_CMS_SEARCHPARAMS <dd>
+ \addindex HTML_CMS_SEARCHPARAMS
+ The \c HTML_CMS_SEARCHPARAMS option is a list of key value pairs specified in the
+ format \c 'key=value'. Each key / value pair represents a hidden field to be included
+ in the form that is generated via the \c SEARCHENGINE option. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no affect on
+ the resulting documentation. 
+
+\anchor cfg_embedded_html_searchpage
+<dt>\c HTML_CMS_SEARCHPAGE <dd>
+ \addindex HTML_CMS_SEARCHPAGE
+ The \c HTML_CMS_SEARCHPAGE option specifies the target of the form generated via
+ the \c SEARCHENGINE option. If either the \c SEARCHENGINE or \c HTML_CMS_EMBEDDING
+ options is set to \c NO then this option will have no affect on the resulting
+ documentation.
+
+\anchor cfg_embedded_html_searchmethod
+<dt>\c HTML_CMS_SEARCHMETHOD <dd>
+ \addindex HTML_CMS_SEARCHMETHOD
+ The \c HTML_CMS_SEARCHMETHOD option controls the method in which the form generated
+ via the \c SEARCHENGINE option is sent to the webserver. By default the \c get
+ method is used. Legal values are \c get and \c post. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no 
+ affect on the resulting documentation.
+
+\anchor cfg_embedded_html_searchfield
+<dt>\c HTML_CMS_SEARCHFIELD <dd>
+ \addindex HTML_CMS_SEARCHFIELD
+ The \c HTML_CMS_SEARCHFIELD option controls the name of the form field which will
+ contain a search query. By default this value is \c query however any string legal
+ in the context of an html name attribute may be specified. If either the \c SEARCHENGINE
+ or \c HTML_CMS_EMBEDDING options is set to \c NO then this option will have no 
+ affect on the resulting documentation.
+</dl>
+
 <h2>Examples</h2>
 
 Suppose you have a simple project consisting of two files: a source file 
Index: P:/workspace/Doxygen2/doc/index.doc
===================================================================
--- P:/workspace/Doxygen2/doc/index.doc	(revision 629)
+++ P:/workspace/Doxygen2/doc/index.doc	(working copy)
@@ -79,6 +79,7 @@
 <li>Section \ref external explains how to let doxygen create links to externally generated documentation.
 <li>Section \ref faq gives answers to frequently asked questions. 
 <li>Section \ref trouble tells you what to do when you have problems.
+<li>Section \ref embedding_html a description of using doxygen's CMS embedding capabilities
 </ul>
 
 The second part forms a reference manual:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.