Custom Look and Feel Configuration

This appendix covers the following topics:

Overview of Custom Look and Feel Configuration

This appendix provides the technical design of a sample implementation of an Oracle iSupport custom menu (custom navigation) utilizing the custom navigation framework. Its sole purpose is to demonstrate the custom navigation features in Oracle iSupport. Customers of Oracle iSupport should not adapt any sample source code from this document to production environments without further testing of functionality and performance.

Implementation Steps

This section lists the implementation steps needed to implement the custom menu in Oracle iSupport at a responsibility level and provides the sample source code and the resultant screenshots for this implementation. Oracle assumes that the reader of this document is familiar with the Oracle JTT Framework used by Oracle iSupport and the HTML, JSP, and Java technologies.

The custom navigation framework provides access to all menu objects that are currently available under the Oracle look and feel implementation. The purpose of this framework is to delegate the HTML rendering portion in a page to a customer-defined rendering java class. The menu definition attached to a responsibility continues to be retrieved in the same manner as is currently done.

The custom menu framework gives a developer control of the menu-rendering area on a page by inserting custom HTML and menu-rendering code in the highlighted regions of the page. The support organizations should refer to the JTT custom navigation developer guide for the details regarding this framework.

The following pictures show the before and after look and feel of a page for which a custom menu renderer is implemented:

The following figure shows a home page before implementation of a custom menu class. The figure descriptions refer to color, which may be available in some media.

The periphery of the page will be changed and appears in yellow as follows:

  1. The page title, Oracle iSupport, appears in the upper left of the yellow header region.

  2. In the yellow header region, the following links appear horizontally in the upper right corner:

    1. iSupport

    2. Contact Us

    3. Feedback

    4. Profile

    5. Sign Out

    6. Help

  3. Immediately below these links, the following tabs appear horizontally:

    1. Home

    2. Account

    3. Support

  4. The Quick Find LOV and the Go button appear centered below the darkened tab bar.

  5. The narrow left and right yellow borders are blank.

  6. In the yellow footer region, the following links appear centered horizontally:

    1. Home

    2. Account

    3. Support

    4. iSupport

    5. Contact Us

    6. Feedback

    7. Profile

    8. Sign Out

    9. Help

      Home Page before Implementation of a Custom Menu Class

      the picture is described in the document text

The following figure shows the home page after implementation of a custom menu class.

The periphery of the page has changed and appears in yellow as follows:

  1. The page title, Vision Enterprises, appears in the upper left of the yellow header region.

  2. The tabs are gone from their former location.

  3. In the yellow header region about where the tab bar appeared, the following links appear horizontally in a darkened bar in the following order:

    1. iSupport

    2. Contact Us

    3. Feedback

    4. Profile

    5. Sign Out

    6. Help

  4. The left and right yellow borders are wider than before and squeeze the central region to make it narrower horizontally. The right border remains blank.

  5. The left border is titled iSupport and has the following links arranged vertically:

    1. Name

    2. Account

    3. Support

  6. In the yellow footer region, the following links appear horizontally in a darkened bar in the following order:

    1. iSupport

    2. Contact Us

    3. Feedback

    4. Profile

    5. Sign Out

    6. Help

      Home Page after Implementation of a Custom Menu Class

      the picture is described in the document text

Steps Performed

  1. Identified all the HTML codes that were required to serve as the page header and page footer in the prototype. In this example, we stripped out HTML codes that were used to render the yellow regions from the source web site. In an actual implementation, the support organization may write this code.

  2. Retrieved all style sheet classes for the sample site and saved them in the $OA_HTML directory. Additionally, we overrode some JTT style sheet classes in this custom style sheet for the prototype. For example, we overrode style sheet classes for the following elements in this style sheet:

    • Table background

    • Table cell color

    • Page title (and so on)

  3. A support organization must create a new java class to implement the menu feature. For the purpose of this document, a new java class, oracle.apps.ibu.menu.VisionRenderer, was created to implement the JTT CustomRenderer class. The following two methods were used to render the above yellow regions for the prototype:

    • public void renderBegin(CustomRenderingContext crc) - Yellow header region

    • public void renderEnd(CustomRenderingContext crc) - Yellow footer region

      The HTML codes collected from step 1 were embedded in the following rendering methods for page header and footer. In both these methods, the developer has access to the following menu data, including the menu-highlighting indicator:

    • Global icons

    • Tab navigation bar

    • Second level tab navigation

    • Side navigation menu

  4. To use this custom menu class, register the following profile option, and set the custom menu class for the Oracle iSupport responsibility used for the prototype:

    JTF_NAV_CUSTOM_RENDERER - oracle.apps.ibu.menu.VisionRenderer

    This profile option should be created under the CRM Foundation, not Oracle iSupport. After it is created, you can set the value of the profile option at the Oracle iSupport responsibility level.

  5. After you bounce the middle tier, the new menu renderer will be used when a user logs in using the responsibility for which the custom menu class has been set in the profile option.

Sample Code

The following sample code, VisionRenderer.java, demonstrates the custom menu class. A support organization should not adapt any sample source codes from this document to production environments without further testing of functionality and performance.

The custom class for the prototype does not render the following elements that a support organization could add when it defines a custom class:

VisionRenderer.java

/*==========================================================================+

 |     Copyright (c) 2003 Oracle, Redwood Shores, CA, USA       |

 |                        All rights reserved.                              |

 +==========================================================================+

 |  FILENAME                                                                |

 |    VisionRenderer.java                                                   |

 |                                                                          |

 |  DESCRIPTION                                                             |

 |    Custom Menu Renderer - Sample                                         |

 |                                                                          |

 |  NOTES                                                                   |

 |                                                                          |

 |  DEPENDENCIES                                                            |

 |                                                                          |

 |  HISTORY                                                                 |

 |    4/25/2002  ktma  created.                                             |

 +==========================================================================*/

package oracle.apps.ibu.menu;

import java.io.PrintWriter;

import oracle.apps.fnd.common.VersionInfo;

import oracle.apps.jtf.ui.menu.CustomRenderer;

import oracle.apps.jtf.ui.menu.CustomRenderingContext;

import oracle.apps.jtf.ui.menu.MenuItem;

import oracle.apps.jtf.ui.menu.MenuItemList;

import oracle.apps.jtf.ui.menu.QuickSearch;

import oracle.apps.jtf.ui.menu.MenuURI;

import oracle.apps.jtf.ui.menu.blaf.PageNavigation;

/**

 * custom renderer for Vision Company

 */

public class VisionRenderer extends CustomRenderer {

  /** The version control ID. */

  public final static String RCS_ID =

    "$Header: $";

  public static final boolean RCS_ID_RECORDED =

    VersionInfo.recordClassVersion(RCS_ID, "oracle.apps.ibu.menu");

  /**

   * Constructs a demo custom renderer.

   */

  protected VisionRenderer() {}

  /**

   * Gets an instance of this custom renderer.

   *

   * @return an instance of this custom renderer

   */

  public static CustomRenderer getInstance() {

      // we maintain only one instance in this demo

      if (singleInstance == null) singleInstance = new VisionRenderer();

      return singleInstance;

  }

  // if a menu item has a MenuURI object,

  // we can add extra parameters to the URI

  // some menu item URI cannot be modified,

  // getURI() returns null in that case

  private static String getURI(MenuItem mi) {

      MenuURI muri = mi.getURI();

      if (muri != null) {

          muri.addParameter("custom", "y");

          return muri.getURI();

      } else {

          return mi.getDestination();

      }

  }

  /**

   * Renders the top part of the navigation.

   * In Oracle browser look and feel, this is the part from the top of the

   * page to the end of the side navigation.

   * The caller of this method

   * should ensure that the given rendering context is not null; otherwise

   * a <code>NullPointerException</code> may be thrown.

   *

   * @param crc the rendering context used for rendering

   */

  public void renderBegin(CustomRenderingContext crc) {

    PrintWriter out = crc.getOutput();

    PageNavigation pn = crc.getNavigationData();

    StringBuffer sb = new StringBuffer();

    // override oracle stylesheet for this custom menu

    out.println("<link rel='stylesheet' href='index_files/Vision.css'>");

    // get all sub-components

    String branding = pn.getBranding();

    MenuItemList appSwitcher = pn.getApplicationSwitcher();

    // top icons iSupport, Register, logout

    MenuItemList globalButtons = pn.getGlobalButtons();

      StringBuffer gBhtml = new StringBuffer();

    // Home/Forum...

    MenuItemList tabBar = pn.getTabBar();

      StringBuffer tBhtml = new StringBuffer();

    // Sub tabs under Home/Forum...      

    MenuItemList hNav = pn.getHorizontalNavigation();

      StringBuffer hNhtml = new StringBuffer();

    MenuItemList sideNav = pn.getSideNavigation();

      StringBuffer sNhtml = new StringBuffer();

    QuickSearch qkSearch = pn.getQuickSearch();

    StringBuffer sideSub = new StringBuffer();

    // render application switcher if there's more than one item

/*

    if (appSwitcher != null && appSwitcher.getSize() > 1) {

      out.print("<form name=appsw>");

      out.print("<select name=appswslct>");

      // output an empty option in case nothing is selected

      out.print("<option value='#'>&nbsp;</option>");

      for (int i = 0; i < appSwitcher.getSize(); i++) {

        MenuItem mi = appSwitcher.getMenuItemAt(i);

        if (!mi.isVisible()) out.print("<!-- ");

        out.print("<option value=\"");

        out.print(mi.getDestination());

        out.print("\"");

        if (i == appSwitcher.getSelectedIndex())

          out.print(" selected ");

        out.print(" >");

        out.print(mi.getText());

        out.print("</option>");

        if (!mi.isVisible()) out.print(" -->");

      }

      out.println("</select>");

      out.print("<input type=button value=Switch onClick=\"document.location");

      out.print("=document.appsw.appswslct.options[document.appsw.appswslct.");

      out.print("selectedIndex].value;\">");

      out.print("</form>");

    }

*/    

    // render global buttons only when it's not null or empty

    if (globalButtons != null && globalButtons.getSize() > 0) {

      MenuItem[] mis = globalButtons.getAllMenuItems();

      String gBStyle = new String();

      for (int i = 0; i < mis.length; i++) {

        // a global button may wish to be hidden

        if (mis[i].isVisible()) {

          // selected?

          if (i == globalButtons.getSelectedIndex())

            gBStyle = LEVEL_1S;

          else 

            gBStyle = LEVEL_1;

          // normally global buttons always have text and destination

          gBhtml.append("<li><a class=\""+gBStyle+"\" href=\"");

          gBhtml.append(getURI(mis[i]));

          gBhtml.append("\">");

          if (mis[i].getText().equals("iSupport"))

            gBhtml.append("Home");

          else

            gBhtml.append(mis[i].getText());

          gBhtml.append("</a>");

        } // visible 

      } // for

    } // if

    // render tab bar only when it's not null or empty

    if (tabBar != null && tabBar.getSize() > 0) {

      MenuItem[] mis = tabBar.getAllMenuItems();

      String tBStyle = new String();

      for (int i = 0; i < mis.length; i++) {

        // selected

        if (i == tabBar.getSelectedIndex())

          tBStyle = LEVEL_2S;

        else 

          tBStyle = LEVEL_2;

        // normally tab bar items always have text and destination

        tBhtml.append("<li><a class=\""+tBStyle+"\" href=\"");

        tBhtml.append(getURI(mis[i]));

        tBhtml.append("\">");

        tBhtml.append(mis[i].getText());

        tBhtml.append("</a>");

        tBhtml.append(MENU_SPACE);

        if (mis[i].getText().equals("Home"))

          break;

      } // for

    } // if

    // render horizontal navigation only when it's not null or empty

    if (hNav != null && hNav.getSize() > 0) {

      MenuItem[] mis = hNav.getAllMenuItems();

      String hNStyle = new String();

      for (int i = 0; i < mis.length; i++) {

        // selected

        if (i == hNav.getSelectedIndex())

          hNStyle = LEVEL_3S;

        else 

          hNStyle = LEVEL_3;

        // normally horizontal navigation items always have

        // text and destination

        hNhtml.append("<li><a class=\""+hNStyle+"\" href=\"");

        hNhtml.append(getURI(mis[i]));

        hNhtml.append("\">");

        hNhtml.append(mis[i].getText());

        hNhtml.append("</a>");

        hNhtml.append(MENU_SPACE);

      } // for

    } // if

    // render side navigation only when it's not null or empty

    if (sideNav != null && sideNav.getSize() > 0 && sideNav.isVisible()) {

      MenuItem[] mis = sideNav.getAllMenuItems();

      String sNStyle = new String();

      for (int i = 0; i < mis.length; i++) {

        // selected

        if (i == sideNav.getSelectedIndex())

          sNStyle = LEVEL_3S;

        else

          sNStyle = LEVEL_3;

        // the destination may be null if there are sub menu items

        String destination = getURI(mis[i]);

       if (destination != null) {

          sNhtml.append("<li><a class=\""+sNStyle+"\" href=\"");

          sNhtml.append(destination);

          sNhtml.append("\">");

          sNhtml.append(mis[i].getText());

          sNhtml.append("</a>");

        } else {

          // you can use the destination of the first sub menu item

          // if you want

          sNhtml.append("<li><font class=\""+sNStyle+"\">");

          sNhtml.append(mis[i].getText());

          sNhtml.append("</font>");

        }

        sNhtml.append(MENU_SPACE);

    // get child menu for the selected side nav

      MenuItemList submil = mis[i].getSubMenuItems();

    // render sub menu items only when they exist

      if (submil != null && submil.getSize() > 0) {

         sNhtml.append("<br>");          

        for (int j = 0; j < submil.getSize(); j++) {

          MenuItem mii = submil.getMenuItemAt(j);

        // selected

     if (j == submil.getSelectedIndex())

         sNStyle = LEVEL_3S;

     else

       sNStyle = LEVEL_3;

         sNhtml.append("&nbsp;&nbsp;");          

      sNhtml.append("- <a class=\""+sNStyle+"\" href=\"");

         sNhtml.append(getURI(mii));

     sNhtml.append("\">");

     sNhtml.append(mii.getText());

     sNhtml.append("</a><br>");

       sNhtml.append(MENU_SPACE); out.println("<!-- "+mii.getText()+" -->"); 

     } // for sub_menu

   } // if sub_menu

   } // for side nav main

  } // if side nave main

    // render quick search when it exists

/*

    if (qkSearch != null) {

      out.println("<br>");

      // quick search is selected when search result is being displayed

      if (qkSearch.isSelected()) {

        out.println("<font color=blue>Quick Search<br></font>");

      } else {

          out.println("Quick Search<br>");

      }

      // print out advanced search link if any

      if (qkSearch.getAdvancedSearchURI() != null) {

        out.print("<sub><a href=\"");

        out.print(qkSearch.getAdvancedSearchURI());

        out.print("\">");

        out.print(qkSearch.getAdvancedSearchPrompt());

        out.print("</a></sub>");

      }

      out.println(qkSearch.getFormBegin());

      out.println("Enter keywords and press a category: ");

      out.print("<input type=text name=\"");

      out.print(qkSearch.getQueryElementName());

      out.print("\"");

      if (qkSearch.isSelected()) {

        out.print(" value=\"");

        out.print(qkSearch.getQueryString());

        out.print("\"");

      }

      out.print(" size=30>");

      out.println("<br>");

      // getCategoryNames never returns null, but it can be empty

      String[] catNames = qkSearch.getCategoryNames();

      String[] catValues = qkSearch.getCategoryValues();

      for (int i = 0; i < catNames.length; i++) {

        // if the category is currently selected

        if (qkSearch.getSelectedCategoryValue().equals(catValues[i])) {

          out.print("<font color=blue>*</font>");

        }

        out.print("<a href=\"");

        out.print("javascript:document.forms['");

        out.print(qkSearch.getFormName());

        out.print("'].");

        out.print(qkSearch.getCategoryElementName());

        out.print(".value='");

        out.print(catValues[i]);

        out.print("';");

        out.print(qkSearch.getSubmitJavaScript());

        out.print("\">");

        out.print(catNames[i]);

        out.println("</a>");

        out.println("&nbsp;&nbsp;&nbsp;");

      }

      out.print("<input type=hidden name=\"");

      out.print(qkSearch.getCategoryElementName());

      out.println("\">");

      out.println(qkSearch.getFormEnd());

    }

*/    

    // Build HTML code here

    sb.append("<link rel='stylesheet' href='index_files/Vision.css'>");

    sb.append("<SCRIPT language=JavaScript src=\"index_files/Vision_1.js\"></SCRIPT>");

    sb.append("<TABLE cellSpacing=0 cellPadding=0 border=0>");

    sb.append("  <TBODY>");

    sb.append("  <TR vAlign=top>");

    sb.append("    <TD colSpan=3>");

    sb.append("      <TABLE cellSpacing=0 cellPadding=0 border=0 width=\"100%\">");

    sb.append("        <TBODY>");

    sb.append("        <TR vAlign=top>");

    sb.append("          <TD bgColor=#ffffff colSpan=2><A ");

    sb.append("            href=\"http://www.Vision.com/e/index.cfm\"><IMG height=53 alt=Vision ");

    sb.append("            src=\"index_files/logo_sub.gif\" width=172 border=0 name=Image9></A></TD>");

    sb.append("          <TD align=right bgColor=#ffffff valign=top class=\"linkSmall\">");

    sb.append("<!-- Global icons -->    ");

    sb.append("          <img src=\"images/topnav_sep.gif\" border=0 align=middle><A href=\"http://www.Vision.com/e/resource_center/index.cfm\" class=\"linkSmall\">Resource Center</A>");

    sb.append("          <img src=\"images/topnav_sep.gif\" border=0 align=middle><A href=\"http://www.Vision.com/e/search/index.cfm\" class=\"linkSmall\">Search</A>");

    sb.append("          <img src=\"images/topnav_sep.gif\" border=0 align=middle><A href=\"http://www.Vision.com/e/search/index.cfm\" class=\"linkSmall\">Site Map</A>");

    sb.append("          <img src=\"images/topnav_sep.gif\" border=0 align=middle><A href=\"http://www.Vision.com/e/contactus/index.cfm\" class=\"linkSmall\">Contact Us</A>");

    sb.append("          </TD>          ");

    sb.append("        </TR>            ");

    sb.append("        <TR vAlign=top bgcolor=\"#003366\">");

    sb.append("          <TD colSpan=3 nowrap><A ");

    sb.append("            onmouseover=\"MM_swapImage('Image1','','../images/nav_home_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/index.cfm\"><IMG height=26 alt=Home ");

    sb.append("            src=\"index_files/nav_home.gif\" width=45 border=0 name=Image1></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImageSOLUTIONS','','../images/nav_solutions_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/solutions/index.cfm\"><IMG ");

    sb.append("            alt=solutions src=\"index_files/nav_solutions.gif\" border=0 ");

    sb.append("            name=ImageSOLUTIONS></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImagePARTNERS','','../images/nav_partners_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/partners/index.cfm\"><IMG alt=partners ");

    sb.append("            src=\"index_files/nav_partners.gif\" border=0 ");

    sb.append("            name=ImagePARTNERS></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImageINDUSTRIES','','../images/nav_industries_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/industries/index.cfm\"><IMG ");

    sb.append("            alt=industries src=\"index_files/nav_industries.gif\" border=0 ");

    sb.append("            name=ImageINDUSTRIES></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImageCUSTOMERS','','../images/nav_customers_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/customers/index.cfm\"><IMG ");

    sb.append("            alt=customers src=\"index_files/nav_customers.gif\" border=0 ");

    sb.append("            name=ImageCUSTOMERS></A><A ");

    sb.append("            href=\"ibuhpage.jsp\"><IMG ");

    sb.append("            alt=servicessupport src=\"index_files/nav_servicessupport_on.gif\" ");

    sb.append("            border=0 name=ImageSERVICESSUPPORT></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImageCOMPANY','','../images/nav_company_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/company/index.cfm\"><IMG alt=company ");

    sb.append("            src=\"index_files/nav_company.gif\" border=0 name=ImageCOMPANY></A><A ");

    sb.append("            onmouseover=\"MM_swapImage('ImageNEWS','','../images/nav_news_hl.gif',1)\" ");

    sb.append("            onmouseout=MM_swapImgRestore() ");

    sb.append("            href=\"http://www.Vision.com/e/news/index.cfm\"><IMG alt=news ");

    sb.append("            src=\"index_files/nav_news.gif\" border=0 name=ImageNEWS></A></TD></TR>");

    sb.append("        <TR vAlign=top>");

    sb.append("          <TD><IMG height=10 src=\"index_files/space.gif\" width=190></TD>");

    sb.append("          <TD><IMG height=10 src=\"index_files/space.gif\" width=10></TD>");

    sb.append("          <TD><IMG height=10 src=\"index_files/space.gif\" ");

    sb.append("        width=580></TD></TR></TBODY></TABLE></TD></TR>");

    sb.append("  <TR vAlign=top>");

    sb.append("    <TD>                 ");

    sb.append("      <TABLE cellSpacing=0 cellPadding=0 width=190 border=0>");

    sb.append("        <TBODY>          ");

    sb.append("        <TR>             ");

    sb.append("          <TD>&nbsp;</TD>");

    sb.append("          <TD vAlign=top><SPAN class=subNavHeader><BR>Services &amp; Support</SPAN><BR><BR>");

    sb.append("<!-- side nav begin -->  ");

    sb.append("<!-- Global icons -->");

    sb.append(gBhtml.toString()); // top navigation --- global button

    sb.append("<Br>");

    if (!hNhtml.toString().equals("")) {

      sb.append(hNhtml.toString());

    }

    sb.append("<Br>");

    if (!sNhtml.toString().equals("")) {

      sb.append(sNhtml.toString());

    }

    sb.append("<Br>");

    if (!sideSub.toString().equals("")) {

      sb.append(sideSub.toString());

    }

    sb.append("<!-- side nav end -->");

    sb.append("          </TD>");

    sb.append("        </TR>");

    sb.append("        <TR>");

    sb.append("          <TD><IMG height=5 src=\"index_files/space.gif\" width=10></TD>");

    sb.append("          <TD><IMG height=5 src=\"index_files/space.gif\" ");

    sb.append("        width=180></TD></TR></TBODY></TABLE>");

    sb.append("      <P class=paragraphPad>&nbsp;</P></TD>");

    sb.append("    <TD>&nbsp;&nbsp;</TD>");

    sb.append("    <TD>");

    sb.append("<!-- Content begin -->");

    out.println(sb.toString());    

  } // renderBegin

  /**

   * Renders the bottom part of the navigation.

   * In Oracle browser look and feel, this is the part that contains

   * a footer, copyright text and privacy statement link.

   * The caller of this

   * method should ensure that the given rendering context is not null; otherwise

   * a <code>NullPointerException</code> may be thrown.

   *

   * @param crc the rendering context used for rendering

   */

  public void renderEnd(CustomRenderingContext crc) {

    PrintWriter out = crc.getOutput();

    PageNavigation pn = crc.getNavigationData();

        // override stylesheet...

    out.println("<link rel='stylesheet' href='index_files/Vision.css'>");

    // get copyright and privacy information

    //String copyrightText = pn.getCopyrightText();

    //String privacyText = pn.getPrivacyText();

    //String privacyURI = pn.getPrivacyURI();

    // footer HTML from Vision.com

    out.print("<!-- Content End -->                                                                         ");

    out.print("    </TD>                                                                                    ");

    out.print("  </TR>                                                                                      ");

    out.print("  <TR vAlign=top>                                                                 ");

    out.print("    <TD>&nbsp;</TD>                                                                          ");

    out.print("    <TD>&nbsp;</TD>                                                                          ");

    out.print("    <TD>&nbsp;</TD></TR>                                                                     ");

    out.print("  <TR vAlign=top>                                                                 ");

    out.print("    <TD colSpan=3>                                                                           ");

    out.print("      <TABLE cellSpacing=0 cellPadding=0 width=100% border=0>                                 ");

    out.print("        <TBODY>                                                                              ");

    out.print("        <TR>                                                                                 ");

    out.print("          <TD vAlign=top align=right bgcolor=\"#003366\"><IMG height=23                                          ");

    out.print("            alt=\"Unlocking the Motion of Industry\" src=\"index_files/footer.gif\"          ");

    out.print("            width=780><BR><SPAN class=linkCopyright></td</tr>");

    out.print("          <tr><TD vAlign=top align=right><A                                   ");

    out.print("            href=\"http://www.Vision.com/e/company/privacy.cfm\"><SPAN                       ");

    out.print("            class=linkCopyright>Privacy Policy</SPAN></A> | <A                               ");

    out.print("            href=\"http://www.Vision.com/e/resource_center/index.cfm\"><SPAN                 ");

    out.print("            class=linkCopyright>Resource Center</SPAN></A> | <A                              ");

    out.print("            href=\"http://www.Vision.com/e/search/index.cfm\"><SPAN                          ");

    out.print("            class=linkCopyright>Search</SPAN></A> | <A                                       ");

    out.print("            href=\"http://www.Vision.com/e/search/index.cfm\"><SPAN                          ");

    out.print("            class=linkCopyright>Site Map</SPAN></A> | <A                                     ");

    out.print("            href=\"http://www.Vision.com/e/contactus/index.cfm\"><SPAN                       ");

    out.print("            class=linkCopyright>Contact Us</SPAN></A><BR><A                                  ");

    out.print("            href=\"http://www.Vision.com/e/index.cfm\"><SPAN                                 ");

    out.print("            class=linkCopyright>Home</SPAN></A> | <A                                         ");

    out.print("            href=\"http://www.Vision.com/e/solutions/index.cfm\"><SPAN                       ");

    out.print("            class=linkCopyright>Solutions</SPAN></A> | <A                                    ");

    out.print("            href=\"http://www.Vision.com/e/partners/index.cfm\"><SPAN                        ");

    out.print("            class=linkCopyright>Partners</SPAN></A> | <A                                     ");

    out.print("            href=\"http://www.Vision.com/e/industries/index.cfm\"><SPAN                      ");

    out.print("            class=linkCopyright>Industries</SPAN></A> | <A                                   ");

    out.print("            href=\"http://www.Vision.com/e/customers/index.cfm\"><SPAN                       ");

    out.print("            class=linkCopyright>Customers</SPAN></A> | <A                                    ");

    out.print("            href=\"ibuhpage.jsp\"><SPAN                                                      ");

    out.print("            class=linkCopyright>Services &amp; Support</SPAN></A> | <A                       ");

    out.print("            href=\"http://www.Vision.com/e/company/index.cfm\"><SPAN                         ");

    out.print("            class=linkCopyright>Company</SPAN></A> | <A                                      ");

    out.print("            href=\"http://www.Vision.com/e/news/index.cfm\"><SPAN                            ");

    out.print("            class=linkCopyright>News &amp; Events</SPAN></A><BR><BR>Vision,                  ");

    out.print("            Inc.<BR>Copyright 2003, All Rights Reserved.</SPAN>                              ");

    out.print("      </TD></TR></TBODY></TABLE></TD></TR>                                                   ");

    out.print("  <TR vAlign=top>                                                                 ");

    out.print("    <TD><IMG height=5 src=\"index_files/space.gif\" width=190></TD>                          ");

    out.print("    <TD><IMG height=5 src=\"index_files/space.gif\" width=10></TD>                           ");

    out.print("    <TD><IMG height=5 src=\"index_files/space.gif\" width=580></TD></TR></TBODY></TABLE>     ");

    // footer HTML from Vision.com

  }

  private static VisionRenderer singleInstance;

  /**

   * Stylesheet constant for menu highlight

   */

  private static final String LEVEL_1 = "linkBold";

  private static final String LEVEL_1S = "linkBold";

  private static final String LEVEL_2 = "linkBold";

  private static final String LEVEL_2S = "linkBold";

  private static final String LEVEL_3 = "linkBold";

  private static final String LEVEL_3S = "linkBold";

  private static final String LEVEL_3A = "linkBold";

  private static final String LEVEL_3AS = "linkBold";

  private static final String MENU_SPACE = "";

  private static final String TOP_NAV_SPACE = "<img src=\"images/topnav_sep.gif\" border=0 align=middle>";

}