Click here to Skip to main content
15,867,453 members
Articles / Web Development / HTML

Master Pages using HTML, CSS, and JavaScript - Errata

Rate me:
Please Sign up or sign in to vote.
3.75/5 (3 votes)
3 Oct 2019CPOL5 min read 12.8K   104   4   12
Master Pages using HTML, CSS, and JavaScript - Errata

Introduction Table of Contents

In 2018, I wrote an article called MasterPages using HTML, CSS, and JavaScript [^] . The intent of that article was to extend an earlier paragidm. This article is an errata to that most recent version, published on June 28, 2018, that should be read in the context of that article.

I only provide discussions of new code that was added or modified. I do provide a complete master_page.js file that contains the new support.

2. Modifications and Additions Table of Contents

The two improvements are:

  • The code that set the "user-agent" header was removed from the master_page.js script because neither Chrome nor Safari would accept it.
  • A JSON menu source file was incorporated (implemented from code provided by a reader).

2.1. Using JSON to pass Parameters Table of Contents

In order to accomodate the use of JSON to define the contents of a menu, it was necessary to add a component to the build_page JSON parameter.

Therefore the revised recognized master page JSON name/value pairs are:

Name Value Type
header_desired Is a header desired? Boolean
header_contents_url URL of the header text URL
logo_url URL of the site logo URL
home_url Target URL if logo is clicked URL
background_image_desired Is a background image desired? Boolean
background_image_url URL of the background image URL
heading Heading text String
heading_color Color of Heading text (i.e., one of the HTML Color Names [^]) String
subheading Subheading text String
subheading_color Color of Subheading text (i.e., one of the HTML Color Names [^]) String
dot_desired Is a colored dot desired? Boolean
dot_target_url Target URL if the dot is clicked URL
dot_title Title displayed when mouse hovers over the dot String
dot_image_url Image URL to be displayed as the dot URL
printing_desired Is printing the page permitted? Boolean
text_sizing_desired Is text sizing to be provided? Boolean
text_sizing_tags HTML tags that will participate in text sizing (e.g., p, span, td, th, etc.) String
constant_contents_url URL of the JavaScript constants URL
menu_desired Is a menu to be created? Boolean
menu_contents_url URL of the menu text URL
menu_data_is_json if true, contents of the file specified by menu_contents_url is in JSON format; if omitted or set to false the contents of the file specified by menu_contents_url is not in JSON format Boolean
footer_desired Is a footer desired? Boolean
footer_contents_url URL of the footer text URL
left_footer_desired Is a left footer desired? Boolean
left_footer_contents Contents of the left footer String
center_footer_desired Is a center footer desired? Boolean
privacy_policy_url URL of the privacy policy URL
contact_webmaster_url URL of the contact webmaster web page URL
right_footer_desired Is a right footer desired? Boolean
right_footer_contents Contents of the right footer String
debug_json Is debug alert displaying JSON contents desired? Boolean

The menu_data_is_json component has been added to allow the menu_contents_url file to contain a JSON structure. This concept is more fully discussed below.

3. Creating a Master Page Table of Contents

3.1. MasterPages Template Table of Contents

As I have repeatedly suggested, creating new webpages can be more easily accomplished if a template is used. The following code is a template based upon the example website.

<!DOCTYPE html >
<html lang="en">

  <head>

    <title></title>

    <meta http-equiv="Content-type" 
          content="text/html; charset=UTF-8" />
    <meta name="viewport" 
          content="width=device-width, initial-scale=1.0" />

    <link rel="stylesheet" 
          href="https://www.w3schools.com/w3css/4/w3.css" /> 
    <link rel="stylesheet" 
          href="./CSS/master_page.css" /> 

<!-- place additional scripts here (e.g., Google Analytics, etc.) -->

    <script>
      var PAGE_COMPONENTS =
        { 
        "header_desired":true, 
        "header_contents_url":"URL_FOR_HEADER_CONTENTS", 
        "logo_url":"WEBSITE_LOGO_IMAGE", 
        "home_url":"WEBSITE_HOME_URL", 
        "background_image_desired":TRUE_OR_FALSE, 
        "background_image_url":"BACKGROUND_IMAGE", 
        "heading":"WEBSITE_NAME", 
        "heading_color":"HTML_COLOR_NAME", 
        "subheading":"WEBSITE_PAGE_NAME", 
        "subheading_color":"HTML_COLOR_NAME", 

        "dot_desired":TRUE_OR_FALSE, 
        "dot_image_url":"DOT_IMAGE_URL", 
        "dot_title":"DOT_TITLE", 
        "dot_target_url":"DOT_REDIRECT_URL", 

        "printing_desired":TRUE_OR_FALSE, 

        "text_sizing_desired":TRUE_OR_FALSE, 
        "text_sizing_tags":"HTML_TAGS_FOR_TEXT_RESIZING", 

        "constant_contents_url":"URL_FOR_JSON_CONSTANTS", 

        "menu_desired":TRUE_OR_FALSE,  
        "menu_contents_url":"URL_FOR_MENU_CONTENTS", 
        "menu_data_is_json":TRUE_OR_FALSE,  

        "footer_desired":TRUE_OR_FALSE, 
        "footer_contents_url":"URL_FOR_FOOTER_CONTENTS", 

        "left_footer_desired":TRUE_OR_FALSE, 
        "left_footer_contents":"",  

        "center_footer_desired":TRUE_OR_FALSE, , 
        "privacy_policy_url":"URL_FOR_PRIVACY_CONTENTS", 
        "contact_webmaster_url":"URL_FOR_CONTACT_ME_CONTENTS", 

        "right_footer_desired":TRUE_OR_FALSE, 
        "right_footer_contents":"",  

        "debug_json":TRUE_OR_FALSE, 

        };
    </script>

  </head>

  <body onload="MasterPage.build_page ( PAGE_COMPONENTS );">

    <div id="header">

    </div>

    <div id="contents">

    </div>

    <div id="footer">

    </div>

    <script src="./Scripts/master_page.js"></script>

  </body>

</html>

The capitalized text should be replaced by desired values.

Note that if, say, dot_desired is set false, none of the other PAGE_COMPONENTS dot-associated components (i.e., dot_image_url, dot_title, or dot_target_url) need be suplied. If dot_desired is set false, all of those components are ignored (whether present or not).

3.2. Header Menu Table of Contents

The header menu source file may be supplied in either text or JSON format.The text file format was discussed in the earlier version of this article. This errata will only address the JSON format.

3.2.1. JSON Menu Source File Table of Contents

The menu source file can be composed of a JSON object. For example:

{
"menus": 
  [
    {
    "label": "Home",
    "href": "index.html",
    "submenus": []
    },
    {
    "label": "Link1",
    "href": "link_1.html",
    "submenus": []
    },
    {
    "label": "Other Links",
    "href": "",
    "submenus": 
      [
        {
        "label": "Link2",
        "href": "link_2.html"
        },
        {
        "label": "Link3",
        "href": "link_3.html"
        },
        {
        "label": "Link4",
        "href": "link_4.html"
        }
      ]
    }
  ]
}

To allow a JSON or a text file to be the source of the menu, the build_menu method required modification.

C#
// **************************************************** build_menu

// local entry point

function build_menu ( components )
  {
  var file_name = components.menu_contents_url;
  var menu_item_separator = ',';
  var menu_line_height = 0.9;
  var menu_metadata = null;
  var start_menu_line_comment = '/';

  if ( !file_name )
    {
    return ( null );                // no menu definition
    }
                                    // if no constant_contents_url
                                    // use default values
  if ( components.constant_contents_url )
    {
    retrieve_menu_constants ( components,
                              menu_line_height,
                              start_menu_line_comment,
                              menu_item_separator );
    }

  menu_metadata = read_contents ( components.menu_contents_url );
  if ( !menu_metadata )
    {
    return ( null );                // cant read menu definition
    }

  if ( components.menu_data_is_json )
    {
    return ( build_menu_from_json ( menu_metadata,
                                    menu_line_height,
                                    start_menu_line_comment,
                                    menu_item_separator ) );
    }
  else
    {
    return ( build_menu_from_text ( menu_metadata,
                                    menu_line_height,
                                    start_menu_line_comment,
                                    menu_item_separator ) );
    }

  } // build_menu

Converting this structure into a menu is the responsibility of the build_menu_from_json function.

    // ****************************************** build_menu_from_json

    // local entry point

    function build_menu_from_json ( menu_metadata,
                                    menu_line_height,
                                    start_menu_line_comment,
                                    menu_item_separator )
      {
      var i = 0;
      var json_menu = null;
      var menu_contents = null;
      var menu_item = '';
      var menus_list = null;

      try
        {
        json_menu = JSON.parse ( menu_metadata );
        }
      catch ( error )
        {
        alert ( "In build_menu_from_json: " + error );
        return ( null );
        }
        
      menus_list = json_menu.menus;
      
      menu_contents =
"  <div class='w3-bar'\n" +
"         style='vertical-align:top; \n" +
"                   line-height:" + menu_line_height.toString ( ) + 
                                    ";'>\n";
      while ( i < menus_list.length )
        {
        var menu = menus_list [ i ];
        
        if ( menu.submenus.length === 0 )
          {
          menu_item =
"    <a href='" + menu.href + "' \n" +
"         class='w3-bar-item w3-button'>" + menu.label + "</a>\n";
          menu_contents += menu_item;
          i++;
          }
        else
          {
          menu_item =
"    <div class='w3-dropdown-hover'>\n" +
"      <button class='w3-button'>" + menu.label + 
                                     "▼</button>\n" +
"      <div class='w3-dropdown-content w3-bar-block w3-card-4'>\n";
          menu_contents += menu_item;
          
          for ( var j = 0; ( j < menu.submenus.length ); j++ )
            {
            var submenu = menu.submenus [ j ];
            
            i++;
            menu_item =
"        <a href='" + submenu.href + "'\n" +
"             class='w3-bar-item w3-button'>" + submenu.label + 
                                                "</a>\n";
            menu_contents += menu_item;
            }
          menu_contents += "      </div>\n";
          i++;
          }
        }
      menu_contents += "  </div>";

      return ( menu_contents );
      }

I wish to acknowledge Walter Mariano Dávalos who provided the concept and this code.

4. Browser Compatibility Table of Contents

browser compatibility

Safari does not appear to properly support the w3-display-right class. Output appears below the centerline of the w3-display-container.

The testing procedure is:

  • Open the browser for which testing is to occur.
  • Place the address of the Step 2 index.html file into the browser's address bar.

Using this procedure, each of the browsers, whose image is depicted above, was tested.

5. Acknowledgements Table of Contents

I would like to thank the following Code Project members for their corrections and suggestions:

Member Corrections/Suggestions Resolution
Terry D. Woody Reported that neither Chrome nor Safari would allow allow setting the "user-agent" header. Removed the unnecessary setting of the "user-agent" header.
Walter Mariano Dávalos Suggested that the menu source file contents be JSON; provided the menu construction software that has been incorporated into master_page.js. Incorporated the JSON menu source into the project.

6. References Table of Contents

7. Conclusion Table of Contents

I hope that this errata has improved the method of developing master pages. Some significant improvements were made that I hope will make the process more useful.

8. Development Environment Table of Contents

MasterPages was developed in the following environment:

Microsoft Windows 7 Professional SP 1
Microsoft Visual Studio 2008 Professional SP1
Microsoft Visual C# 2008
Microsoft .Net Framework Version 3.5 SP1
Microsoft Office PowerPoint 2003

9. Download Table of Contents

The download contains:

  • browser_compatibility.png
  • master_page.js
  • MasterPages.html
  • MasterPages.TOC.html
  • return_to_toc.png

Of these, only master_page.js is of particular interest.

10. History Table of Contents

06/28/2018 Original article
07/04/2018 Revised formatting and typos
07/04/2018 Repaired error that caused Chrome and Safari to fail
10/02/2019 Added a JSON menu source file; removed jss to js file conversion

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
In 1964, I was in the US Coast Guard when I wrote my first program. It was written in RPG (note no suffixing numbers). Programs and data were entered using punched cards. Turnaround was about 3 hours. So much for the "good old days!"

In 1970, when assigned to Washington DC, I started my MS in Mechanical Engineering. I specialized in Transportation. Untold hours in statistical theory and practice were required, forcing me to use the university computer and learn the FORTRAN language, still using punched cards!

In 1973, I was employed by the Norfolk VA Police Department as a crime analyst for the High Intensity Target program. There, I was still using punched cards!

In 1973, I joined Computer Sciences Corporation (CSC). There, for the first time, I was introduced to a terminal with the ability to edit, compile, link, and test my programs on-line. CSC also gave me the opportunity to discuss technical issues with some of the brightest minds I've encountered during my career.

In 1975, I moved to San Diego to head up an IR&D project, BIODAB. I returned to school (UCSD) and took up Software Engineering at the graduate level. After BIODAB, I headed up a team that fixed a stalled project. I then headed up one of the two most satisfying projects of my career, the Automated Flight Operations Center at Ft. Irwin, CA.

I left Anteon Corporation (the successor to CSC on a major contract) and moved to Pensacola, FL. For a small company I built their firewall, given free to the company's customers. An opportunity to build an air traffic controller trainer arose. This was the other most satisfying project of my career.

Today, I consider myself capable.

Comments and Discussions

 
QuestionResponsiveness Pin
Member 817711730-Sep-19 10:43
Member 817711730-Sep-19 10:43 
AnswerRe: Responsiveness Pin
gggustafson12-Oct-19 8:53
mvagggustafson12-Oct-19 8:53 
QuestionDownloading code works by using R-Click, Save Link As in Firefox Pin
Member 873926930-Sep-19 6:11
professionalMember 873926930-Sep-19 6:11 
AnswerRe: Downloading code works by using R-Click, Save Link As in Firefox Pin
Member 1460259330-Sep-19 17:46
Member 1460259330-Sep-19 17:46 
GeneralRe: Downloading code works by using R-Click, Save Link As in Firefox Pin
Member 873926930-Sep-19 23:21
professionalMember 873926930-Sep-19 23:21 
GeneralRe: Downloading code works by using R-Click, Save Link As in Firefox Pin
gggustafson12-Oct-19 8:56
mvagggustafson12-Oct-19 8:56 
QuestionIt would be good if author could check the non-working download link Pin
novice10128-Sep-19 21:03
novice10128-Sep-19 21:03 
AnswerRe: It would be good if author could check the non-working download link Pin
gggustafson12-Oct-19 8:55
mvagggustafson12-Oct-19 8:55 
AnswerRe: It would be good if author could check the non-working download link Pin
gggustafson16-Oct-19 7:56
mvagggustafson16-Oct-19 7:56 
QuestionLink to code doesn't work... Pin
Dewey28-Sep-19 0:01
Dewey28-Sep-19 0:01 
AnswerRe: Link to code doesn't work... Pin
gggustafson12-Oct-19 8:56
mvagggustafson12-Oct-19 8:56 
AnswerRe: Link to code doesn't work... Pin
gggustafson16-Oct-19 7:57
mvagggustafson16-Oct-19 7:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.