header.html.tmpl 9.37 KB
[%# This Source Code Form is subject to the terms of the Mozilla Public
  # License, v. 2.0. If a copy of the MPL was not distributed with this
  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  #
  # This Source Code Form is "Incompatible With Secondary Licenses", as
  # defined by the Mozilla Public License, v. 2.0.
  #%]

[%# INTERFACE:
  # (All the below interface elements are optional.)
  # title: string. Page title.
  # header: string. Main page header.
  # subheader: string. Page subheader.
  # header_addl_info: string. Additional header information.
  # bodyclasses: array of extra CSS classes for the <body>
  # onload: string. JavaScript code to run when the page finishes loading.
  # javascript: string. Javascript to go in the header.
  # javascript_urls: list. List of URLs to Javascript.
  # style: string. CSS style.
  # style_urls: list. List of URLs to CSS style sheets.
  # message: string. A message to display to the user. May contain HTML.
  # atomlink: Atom link URL, May contain HTML
  #%]

[% IF message %]
  [% PROCESS global/messages.html.tmpl %]
[% END %]

[% DEFAULT
  subheader = ""
  header_addl_info = ""
  onload = ""
  style_urls = []
  yui = []
%]

[% SET yui_css = {
  autocomplete => 1,
  calendar     => 1,
  datatable    => 1,
  button       => 1,
} %]

[%# Note: This is simple dependency resolution--you can't have dependencies
  # that depend on each other. You have to specify all of a module's deps,
  # if that module is going to be specified in "yui".
  #%]
[% SET yui_deps = {
  autocomplete => ['json', 'connection', 'datasource'],
  datatable    => ['json', 'connection', 'datasource', 'element'],
} %]

[%# When using certain YUI modules, we need to process certain
  # extra JS templates.
  #%]
[% SET yui_templates = {
  datatable => ['global/value-descs.js.tmpl'],
} %]

[%# These are JS URLs that are *always* on the page and come before
  # every other JS URL.
  #%]
[% SET starting_js_urls = [
    "js/yui/yahoo-dom-event/yahoo-dom-event.js",
    "js/yui/cookie/cookie-min.js",
] %]


[%# We should be able to set the default value of the header variable
  # to the value of the title variable using the DEFAULT directive,
  # but that doesn't work if a caller sets header to the empty string
  # to avoid header inheriting the value of title, since DEFAULT
  # mistakenly treats empty strings as undefined and gives header the
  # value of title anyway.  To get around that problem we explicitly
  # set header's default value here only if it is undefined. %]
[% IF !header.defined %][% header = title %][% END %]

<!DOCTYPE html>
<html lang="en">
  <head>
    [% Hook.process("start") %]
    <title>[% title %]</title>

    [% IF Param('utf8') %]
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    [% END %]

    [% SET yui = yui_resolve_deps(yui, yui_deps) %]

    [% SET css_sets = css_files(style_urls, yui, yui_css) %]
    [% IF constants.CONCATENATE_ASSETS %]
      [% PROCESS format_css_link asset_url = css_sets.unified_standard_skin %]
    [% ELSE %]
      [% FOREACH asset_url = css_sets.standard %]
        [% PROCESS format_css_link %]
      [% END %]
      [% FOREACH asset_url = css_sets.skin %]
        [% PROCESS format_css_link %]
      [% END %]
    [% END %]

    [% IF style %]
      <style type="text/css">
        [% style %]
      </style>
    [% END %]

    [% IF css_sets.unified_custom %]
      [% IF constants.CONCATENATE_ASSETS %]
        [% PROCESS format_css_link asset_url = css_sets.unified_custom %]
      [% ELSE %]
        [% FOREACH asset_url = css_sets.custom %]
          [% PROCESS format_css_link %]
        [% END %]
      [% END %]
    [% END %]

    [%# YUI Scripts %]
    [% FOREACH yui_name = yui %]
      [% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %]
    [% END %]
    [% starting_js_urls.push('js/global.js') %]

    [% FOREACH asset_url = concatenate_js(starting_js_urls) %]
      [% PROCESS format_js_link %]
    [% END %]

    <script type="text/javascript">
    <!--
        YAHOO.namespace('bugzilla');
        YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) {
               if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; };
               var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false;
               return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
         };
        if ( "onpagehide" in window || YAHOO.env.ua.gecko) {
            YAHOO.util.Event._simpleRemove(window, "unload", 
                                           YAHOO.util.Event._unload);
        }
        [%# The language selector needs javascript to set its cookie,
          # so it is hidden in HTML/CSS by the "bz_default_hidden" class.
          # If the browser can run javascript, it will then "unhide"
          # the language selector using the following code.
          #%]
        function unhide_language_selector() { 
            YAHOO.util.Dom.removeClass(
                'lang_links_container', 'bz_default_hidden'
            ); 
        } 
        YAHOO.util.Event.onDOMReady(unhide_language_selector);

        [%# Make some Bugzilla information available to all scripts. 
          # We don't import every parameter and constant because we
          # don't want to add a lot of uncached JS to every page. 
          #%]
        var BUGZILLA = {
            param: {
                cookiepath: '[% Param('cookiepath') FILTER js %]',
                maxusermatches: [% Param('maxusermatches') FILTER js %]
            },
            constant: {
                COMMENT_COLS: [% constants.COMMENT_COLS FILTER js %]
            },
            string: {
                [%# Please keep these in alphabetical order. %]

                attach_desc_required:
                    "You must enter a Description for this attachment.",
                component_required:
                    "You must select a Component for this [% terms.bug %].",
                description_required:
                    "You must enter a Description for this [% terms.bug %].",
                short_desc_required:
                    "You must enter a Summary for this [% terms.bug %].",
                version_required:
                    "You must select a Version for this [% terms.bug %]."
            }
            [% IF javascript_urls.containsany(['js/bug.js', 'js/field.js', 'js/comment-tagging.js']) %]
              , api_token: '[% get_api_token FILTER js FILTER html %]'
            [% END %]
        };

        [% FOREACH yui_name = yui %]
          [% FOREACH yui_template = yui_templates.$yui_name %]
            [% INCLUDE $yui_template %]
          [% END %]
        [% END %]
        [% IF javascript %]
          [% javascript %]
        [% END %]
    // -->
    </script>

    [% FOREACH asset_url = concatenate_js(javascript_urls) %]
      [% PROCESS format_js_link %]
    [% END %]

    [%# this puts the live bookmark up on firefox for the Atom feed %]
    [% IF atomlink %]
       <link rel="alternate" 
             type="application/atom+xml" title="Atom feed" 
             href="[% atomlink FILTER html %]">
    [% END %]

    [%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %]
    <link rel="search" type="application/opensearchdescription+xml"
                       title="[% terms.Bugzilla %]" href="./search_plugin.cgi">
    <link rel="shortcut icon" href="images/favicon.ico" >
    [% Hook.process("additional_header") %]
  </head>

  <body [% IF onload %] onload="[% onload %]"[% END %]
        class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %]
               [% FOREACH class = bodyclasses %]
                 [%+ class FILTER css_class_quote %]
               [% END %] yui-skin-sam">

  <div id="header">
    [% INCLUDE global/banner.html.tmpl %]

    <div id="titles">
      <span id="title">[% terms.Bugzilla %][% " &ndash; $header" IF header %]</span>

      [% IF subheader %]
        <span id="subtitle" class="subheader">[% subheader %]</span>
      [% END %]

      [% IF header_addl_info %]
        <span id="information" class="header_addl_info">[% header_addl_info %]</span>
      [% END %]
    </div>

    <div id="common_links">
      [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %]
    </div>

    [% IF Bugzilla.languages.size > 1 %]
      <div id="lang_links_container" class="bz_default_hidden">
        <ul class="links">
          [% FOREACH lang = Bugzilla.languages.sort %]
            <li>
              [% IF NOT loop.first %]<span class="separator"> | </span>[% END %]
              [% IF lang == current_language %]
                <span class="lang_current">[% lang FILTER html FILTER upper %]</span>
              [% ELSE %]
                <a href="#" onclick="set_language('[% lang FILTER none %]');">
                  [%- lang FILTER html FILTER upper %]</a>
              [% END %]
            </li>
          [% END %]
        </ul>
      </div>
    [% END %]
  </div>

  <div id="bugzilla-body">
    [% IF Param('announcehtml') %]
      [% Param('announcehtml') FILTER none %]
    [% END %]

    [% IF message %]
      <div id="message">[% message %]</div>
    [% END %]

[% BLOCK format_css_link %]
  <link href="[% asset_url FILTER html %]" rel="stylesheet" type="text/css">
[% END %]

[% BLOCK format_js_link %]
  <script type="text/javascript" src="[% asset_url FILTER mtime FILTER html %]"></script>
[% END %]