[%# The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bugzilla Bug Tracking System. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): Gervase Markham <gerv@gerv.net> # Vaskin Kissoyan <vkissoyan@yahoo.com> # Vitaly Harisov <vitaly@rathedg.com> # Svetlana Harisova <light@rathedg.com> #%] [%# 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 # generate_api_token: generate a token which can be used to make authenticated webservice calls #%] [% IF message %] [% PROCESS global/messages.html.tmpl %] [% END %] [% DEFAULT subheader = "" header_addl_info = "" onload = "" style_urls = [] yui = [] yui_css = {} yui_deps = {} no_yui = 0 jquery = [] jquery_css = [] generate_api_token = 0 %] [% IF NOT no_yui %] [% SET yui_css = { 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 = { 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'], } %] [% END %] [%# These are JS URLs that are *always* on the page and come before # every other JS URL. #%] [% SET starting_js_urls = [ "js/jquery/jquery-min.js", "js/jquery/ui/jquery-ui-min.js" ] %] [% IF NOT no_yui %] [% starting_js_urls.push("js/yui/yahoo-dom-event/yahoo-dom-event.js", "js/yui/cookie/cookie-min.js") %] [% END %] [% SET jq_css_urls = [ "js/jquery/ui/jquery-ui-min.css", "js/jquery/ui/jquery-ui-structure-min.css", "js/jquery/ui/jquery-ui-theme-min.css", ] %] [% style_urls.import(jquery_css, jq_css_urls) FILTER null %] [%# Add our required jQuery plugins %] [% jquery.push("cookie", "devbridgeAutocomplete") %] [%# 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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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 %] [% PROCESS "global/site-navigation.html.tmpl" %] [% PROCESS 'global/setting-descs.none.tmpl' %] [% IF NOT no_yui %] [% SET yui = yui_resolve_deps(yui, yui_deps) %] [% END %] [% SET css_sets = css_files(style_urls.unique, 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 %] [% IF NOT no_yui %] [%# YUI Scripts %] [% FOREACH yui_name = yui %] [% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %] [% END %] [% END %] [%# jQuery Plugins %] [% FOREACH jq_name = jquery.unique %] [% starting_js_urls.push("js/jquery/plugins/$jq_name/${jq_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"> <!-- [% IF NOT no_yui %] 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); } [% END %] [%# 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() { $('#lang_links_container').removeClass('bz_default_hidden'); } $(document).ready(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 generate_api_token %] , api_token: '[% get_api_token FILTER js FILTER html %]' [% END %] }; [% IF NOT no_yui %] [% FOREACH yui_name = yui %] [% FOREACH yui_template = yui_templates.$yui_name %] [% INCLUDE $yui_template %] [% END %] [% 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.BugzillaTitle %]" href="./search_plugin.cgi"> [% Hook.process("additional_header") %] </head> [%# Migration note: contents of the old Param 'bodyhtml' go in the body tag, # but set the onload attribute in the DEFAULT directive above. #%] <body onload="[% onload %]" class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %] skin-[% user.settings.skin.value FILTER css_class_quote %] [% FOREACH class = bodyclasses %] [% ' ' %][% class FILTER css_class_quote %] [% END %] yui-skin-sam"> [%# Migration note: the following file corresponds to the old Param # 'bannerhtml' #%] <div id="header"> [% IF user.settings.skin.value == 'Mozilla' || user.settings.skin.value == 'Mozilla-OpenSans' %] <div class="wrapper"> <table border="0" cellspacing="0" cellpadding="0" id="titles"> <tr> <td id="title"> <a href="./" title="Home">[% terms.BugzillaTitle %]</a> </td> <td> [% Hook.process("message") %] </td> <td id="moz_login"> [% IF user.id %] <ul class="links"> <li class="dropdown"> <span class="anchor">[% user.login FILTER html %]</span> <ul> [% IF user.showmybugslink %] [% filtered_username = user.login FILTER uri %] <li><a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a></li> [% END %] <li><a href="page.cgi?id=mydashboard.html">My Dashboard</a></li> <li><a href="user_profile">My Profile</a></li> <li><a href="page.cgi?id=user_activity.html&action=run&who=[% user.login FILTER uri %]">My Activity</a></li> <li><a href="request.cgi?requester=[% user.login FILTER uri %]&requestee=[% user.login FILTER uri %]&do_union=1&group=type&action=queue">My Requests</a></li> <li><a href="userprefs.cgi">Preferences</a></li> [% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless || (Param('useclassification') && user.in_group('editclassifications')) || user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups') || user.in_group('editkeywords') || user.in_group('bz_canusewhines') || user.get_products_by_permission("editcomponents").size %] <li><a href="admin.cgi">Administration</a></li> [% END %] [% IF user.authorizer.can_logout %] <li><a href="index.cgi?logout=1">Log out</a></li> [% END %] [% IF sudoer %] <li> <a href="relogin.cgi?action=end-sudo">End sudo session impersonating [% user.login FILTER html %]</a> </li> [% END %] </ul> </li> </ul> [% ELSE %] <ul class="login-links"> [% IF Param('createemailregexp') && user.authorizer.user_can_create_account %] <li id="moz_new_account_container_top"><a href="createaccount.cgi">New Account</a></li> [% END %] [%# Only display one login form when we're on a LOGIN_REQUIRED page. That # way, we're guaranteed that the user will use the form that has # hidden_fields in it (the center form) instead of this one. Also, it's # less confusing to have one form (as opposed to three) when you're # required to log in. #%] [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %] [% PROCESS "account/auth/login-small.html.tmpl" qs_suffix = "_top" %] [% END %] </ul> [% END %] </td> <td id="moz_tab"> <a href="https://www.mozilla.org/" title="Mozilla - Home of the Mozilla Project"> <img src="skins/contrib/Mozilla/tabzilla.png" border="0" height="42" width="154"></a> </td> </tr> </table> [%# display the version number on the index page %] [% IF title == "$terms.Bugzilla Main Page" %] <div id="bugzilla_version"> [% header_addl_info FILTER html %] </div> [% END %] [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] </div> [% ELSE %] [% INCLUDE global/banner.html.tmpl %] <table border="0" cellspacing="0" cellpadding="0" id="titles"> <tr> <td id="title"> <p>[% terms.BugzillaTitle %] [% Hook.process("message") %] [% " – $header" IF header %]</p> </td> [% IF subheader %] <td id="subtitle"> <p class="subheader">[% subheader %]</p> </td> [% END %] [% IF header_addl_info %] <td id="information"> <p class="header_addl_info">[% header_addl_info %]</p> </td> [% END %] </tr> </table> <table id="lang_links_container" cellpadding="0" cellspacing="0" class="bz_default_hidden"><tr><td> [% IF Bugzilla.languages.size > 1 %] <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> [% END %] </td></tr></table> [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] [% END %] </div> [%# header %] <div id="bugzilla-body"> [%# in most cases the "header" variable provides redundant information, however # there are exceptions where not displaying this text is problematic. %] [% IF (user.settings.skin.value == 'Mozilla' || user.settings.skin.value == 'Mozilla-OpenSans') && template.name.match('^attachment/') && !header.match('^Bug \d+$') %] <h2>[% header FILTER none %]</h2> [% END %] [% 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 %]