summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extensions/BMO/template/en/default/global/common-links.html.tmpl123
-rw-r--r--extensions/BMO/template/en/default/global/header.html.tmpl454
-rw-r--r--extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl6
-rw-r--r--extensions/BMO/web/images/mozilla-tab.pngbin0 -> 7535 bytes
-rw-r--r--skins/contrib/Mozilla/dropdown.pngbin0 -> 130 bytes
-rw-r--r--skins/contrib/Mozilla/footer-mozilla.pngbin0 -> 528 bytes
-rw-r--r--skins/contrib/Mozilla/global.css676
-rw-r--r--skins/contrib/Mozilla/grain.pngbin0 -> 47497 bytes
-rw-r--r--skins/contrib/Mozilla/noise.pngbin0 -> 3077 bytes
-rw-r--r--skins/contrib/Mozilla/search.pngbin0 -> 199 bytes
-rw-r--r--skins/custom/global.css9
11 files changed, 1253 insertions, 15 deletions
diff --git a/extensions/BMO/template/en/default/global/common-links.html.tmpl b/extensions/BMO/template/en/default/global/common-links.html.tmpl
new file mode 100644
index 000000000..f743a8b91
--- /dev/null
+++ b/extensions/BMO/template/en/default/global/common-links.html.tmpl
@@ -0,0 +1,123 @@
+[%# 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>
+ # Svetlana Harisova <light@rathedg.com>
+ #%]
+
+[% DEFAULT qs_suffix = "" %]
+[% USE Bugzilla %]
+
+<ul class="links">
+ <li><a href="./">Home</a></li>
+ <li><span class="separator">| </span><a href="enter_bug.cgi">New</a></li>
+ <li><span class="separator">| </span><a href="describecomponents.cgi">Browse</a></li>
+ <li><span class="separator">| </span><a href="query.cgi">Search</a></li>
+
+ [% IF user.settings.skin.value != 'Mozilla' %]
+ <li class="form">
+ <span class="separator">| </span>
+ <form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch"
+ title="Quick Search" value="[% quicksearch FILTER html %]">
+ <input class="btn" type="submit" value="Search"
+ id="find[% qs_suffix FILTER html %]">
+ [%-# Work around FF bug: keep this on one line %]</form>
+ <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li>
+
+ <li><span class="separator">| </span><a href="report.cgi">Reports</a></li>
+
+ <li>
+ [% IF Param('shutdownhtml') || Bugzilla.has_flags %]
+ <span class="separator">| </span>
+ [% IF user.id %]
+ <a href="request.cgi?requester=[% user.login FILTER uri %]&amp;requestee=
+ [% user.login FILTER uri %]&amp;do_union=1&amp;group=type&amp;action=queue">My Requests</a>
+ [% ELSE %]
+ <a href="request.cgi">Requests</a>
+ [% END %]
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+ [% END %]
+
+ [% Hook.process('action-links') %]
+
+ [% IF user.settings.skin.value != 'Mozilla' %]
+ [% IF user.login %]
+ <li><span class="separator">| </span><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><span class="separator">| </span><a href="admin.cgi">Administration</a></li>
+ [% END %]
+
+ [% PROCESS link_to_documentation %]
+
+ <li>
+ <span class="separator">| </span>
+ [% IF user.authorizer.can_logout %]
+ <a href="index.cgi?logout=1">Log&nbsp;out</a>
+ [% ELSE %]
+ Logged&nbsp;in&nbsp;as
+ [% END %]
+ [% IF sudoer %]
+ [%+ sudoer.login FILTER html %] (<b>impersonating
+ [%+ user.login FILTER html %]</b>
+ <a href="relogin.cgi?action=end-sudo">end session</a>)
+ [% ELSE %]
+ [%+ user.login FILTER html %]
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+ [% ELSE %]
+
+ [% PROCESS link_to_documentation %]
+
+ [% IF Param('createemailregexp')
+ && user.authorizer.user_can_create_account %]
+ <li id="new_account_container[% qs_suffix FILTER html %]">
+ <span class="separator">| </span>
+ <a href="createaccount.cgi">New&nbsp;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" %]
+ [% END %]
+ [% END %]
+ [% END %]
+</ul>
+
+[% Hook.process("link-row") %]
+[% BLOCK link_to_documentation %]
+ [% IF doc_section && Param('docs_urlbase') %]
+ <li>
+ <span class="separator">| </span>
+ <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a>
+ </li>
+ [% END %]
+[% END %]
diff --git a/extensions/BMO/template/en/default/global/header.html.tmpl b/extensions/BMO/template/en/default/global/header.html.tmpl
new file mode 100644
index 000000000..e3d9c9158
--- /dev/null
+++ b/extensions/BMO/template/en/default/global/header.html.tmpl
@@ -0,0 +1,454 @@
+[%# 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
+ #%]
+
+[% 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 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 %]
+
+[%# Migration note: contents of the old Param 'headerhtml' would go here %]
+
+ [% PROCESS "global/site-navigation.html.tmpl" %]
+
+ [% PROCESS 'global/setting-descs.none.tmpl' %]
+
+ [% SET yui = yui_resolve_deps(yui, yui_deps) %]
+ [% SET css_sets = css_files(style_urls, yui, yui_css) %]
+
+ [%# CSS cascade, part 1: Standard Bugzilla stylesheet set (persistent).
+ # Always present.
+ #%]
+ [%# This allows people to switch back to the "Classic" skin if they
+ # are in another skin.
+ #%]
+ <link href="[% 'skins/standard/global.css' FILTER mtime FILTER html %]"
+ rel="alternate stylesheet"
+ title="[% setting_descs.standard FILTER html %]">
+ [% FOREACH style_url = css_sets.standard %]
+ [% PROCESS format_css_link css_set_name = 'standard' %]
+ [% END %]
+
+ [%# CSS cascade, part 2 & 3: Third-party stylesheet set (selected and
+ # selectable). All third-party skins are present as alternate
+ # stylesheets, even if they are not currently in use.
+ #%]
+ [% FOREACH style_url = css_sets.skin %]
+ [% PROCESS format_css_link css_set_name = user.settings.skin.value %]
+ [% END %]
+
+ [% FOREACH alternate_skin = css_sets.alternate.keys %]
+ [% FOREACH style_url = css_sets.alternate.$alternate_skin %]
+ [% PROCESS format_css_link css_set_name = alternate_skin %]
+ [% END %]
+ [% END %]
+
+ [%# CSS cascade, part 4: page-specific styles.
+ #%]
+ [% IF style %]
+ <style type="text/css">
+ [% style %]
+ </style>
+ [% END %]
+
+ [%# CSS cascade, part 5: Custom Bugzilla stylesheet set (persistent).
+ # Always present. Site administrators may override all other style
+ # definitions, including skins, using custom stylesheets.
+ #%]
+ [% FOREACH style_url = css_sets.custom %]
+ [% PROCESS format_css_link css_set_name = 'standard' %]
+ [% 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 javascript_url = 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 %].'
+ }
+ };
+
+ [% FOREACH yui_name = yui %]
+ [% FOREACH yui_template = yui_templates.$yui_name %]
+ [% INCLUDE $yui_template %]
+ [% END %]
+ [% END %]
+ [% IF javascript %]
+ [% javascript %]
+ [% END %]
+ // -->
+ </script>
+
+ [% FOREACH javascript_url = 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('[-~@:/.]+','-') %]
+ [% 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' %]
+
+ <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 id="information"></td>
+ <td id="languages">
+ [% 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>
+ <td id="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="userprefs.cgi">Preferences</a></li>
+ <li><a href="request.cgi?requester=[% user.login FILTER uri %]&amp;requestee=[% user.login FILTER uri %]&amp;do_union=1&amp;group=type&amp;action=queue">My Requests</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&nbsp;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="new_account_container_top"><a href="createaccount.cgi">New&nbsp;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" %]
+ [% END %]
+ </ul>
+ [% END %]
+ </td>
+ <td id="tab">
+ <a href="http://mozilla.org/"><img src="https://addons.cdn.mozilla.net/media/img/zamboni/mozilla-tab.png?b=4953ddb"></a>
+ </td>
+ </tr>
+ </table>
+
+ <ul class="links">
+ <li><a href="enter_bug.cgi">New</a></li>
+ <li><a href="describecomponents.cgi">Browse</a></li>
+ <li><a href="query.cgi">Search</a></li>
+ <li><a href="report.cgi">Reports</a></li>
+ <li><a href="http://www.bugzilla.org/docs/4.0/en/html/bug_page.html" target="_blank">Help</a></li>
+ <li id="quicksearch">
+ <form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '') { alert('Please enter one or more search terms first.'); return false;">
+ <input class="txt" type="text" id="quicksearch_top" name="quicksearch" value="" placeholder="Search bugs">
+ </form>
+ </li>
+ <li><a href="https://bugzilla-stage-tip.mozilla.org/page.cgi?id=frontpage.html">Front Page</a></li>
+ <li><a href="page.cgi?id=browse.html">Product Browser</a></li>
+ </ul>
+ </div>
+
+[% ELSE %]
+
+[% INCLUDE global/banner.html.tmpl %]
+
+<table border="0" cellspacing="0" cellpadding="0" id="titles">
+<tr>
+ <td id="title">
+ <p>[% terms.BugzillaTitle %]
+ [% " &ndash; $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">
+
+[% IF Param('announcehtml') %]
+[% Param('announcehtml') FILTER none %]
+[% END %]
+
+[% IF message %]
+<div id="message">[% message %]</div>
+[% END %]
+
+[% BLOCK format_css_link %]
+ [% IF style_url.match('/IE-fixes\.css') %]
+ <!--[if lte IE 7]>
+ [%# Internet Explorer treats [if IE] HTML comments as uncommented.
+ # We use it to import CSS fixes so that Bugzilla looks decent on IE 7
+ # and below.
+ #%]
+ [% END %]
+
+ [% IF css_set_name == 'standard'
+ OR css_set_name == user.settings.skin.value
+ %]
+ [% SET css_rel = 'stylesheet' %]
+ [% SET css_set_display_name = setting_descs.${user.settings.skin.value}
+ || user.settings.skin.value %]
+ [% ELSE %]
+ [% SET css_rel = 'alternate stylesheet' %]
+ [% SET css_set_display_name = setting_descs.$css_set_name || css_set_name %]
+ [% END %]
+
+ [% IF css_set_name == 'standard' %]
+ [% SET css_title_link = '' %]
+ [% ELSE %]
+ [% css_title_link = BLOCK ~%]
+ title="[% css_set_display_name FILTER html %]"
+ [% END %]
+ [% END %]
+
+ <link href="[% style_url FILTER html %]" rel="[% css_rel FILTER none %]"
+ type="text/css" [% css_title_link FILTER none %]>
+
+ [% '<![endif]-->' IF style_url.match('/IE-fixes\.css') %]
+[% END %]
+
+[% BLOCK format_js_link %]
+ <script type="text/javascript" src="[% javascript_url FILTER mtime FILTER html %]"></script>
+[% END %]
diff --git a/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl b/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
index e94b60bb4..5f8965d5d 100644
--- a/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
+++ b/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
@@ -24,12 +24,6 @@
<link id="shorturl" rev="canonical" href="https://bugzil.la/[% bug.bug_id FILTER uri %]">
[% END %]
-<style type="text/css">
-body {
- background: url("extensions/BMO/web/images/background.png") repeat-x;
-}
-</style>
-
[%# *** Bug List Navigation *** %]
[% IF bug %]
[% SET my_search = user.recent_search_for(bug) %]
diff --git a/extensions/BMO/web/images/mozilla-tab.png b/extensions/BMO/web/images/mozilla-tab.png
new file mode 100644
index 000000000..417f6a5c6
--- /dev/null
+++ b/extensions/BMO/web/images/mozilla-tab.png
Binary files differ
diff --git a/skins/contrib/Mozilla/dropdown.png b/skins/contrib/Mozilla/dropdown.png
new file mode 100644
index 000000000..e01e5e51d
--- /dev/null
+++ b/skins/contrib/Mozilla/dropdown.png
Binary files differ
diff --git a/skins/contrib/Mozilla/footer-mozilla.png b/skins/contrib/Mozilla/footer-mozilla.png
new file mode 100644
index 000000000..593c10308
--- /dev/null
+++ b/skins/contrib/Mozilla/footer-mozilla.png
Binary files differ
diff --git a/skins/contrib/Mozilla/global.css b/skins/contrib/Mozilla/global.css
new file mode 100644
index 000000000..405ee424e
--- /dev/null
+++ b/skins/contrib/Mozilla/global.css
@@ -0,0 +1,676 @@
+@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,600,700|Droid+Sans+Mono);
+
+body {
+ background: #f6f4ec;
+ background-image: url(noise.png), -moz-linear-gradient(#d7d3c8, #f6f4ec 400px);
+ background-image: url(noise.png), -webkit-linear-gradient(#d7d3c8, #f6f4ec 400px);
+ background-image: url(noise.png), linear-gradient(#d7d3c8, #f6f4ec 400px);
+ color: #404040;
+ min-width: 990px;
+}
+
+body, td, th, input {
+ font-family: "Open Sans", "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+a, a:visited, #header a, #header a:visited, #footer a, #footer a:visited {
+ color: #0095dd;
+}
+
+a:hover, #header a:hover, #footer a:hover {
+ color: #00539f;
+}
+
+textarea, input[type=text], .text_input {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
+ background: -moz-linear-gradient(#fafafa, #fff);
+ background: -webkit-linear-gradient(#fafafa, #fff);
+ background: linear-gradient(#fafafa, #fff);
+ padding: 5px;
+}
+
+hr {
+ display: none;
+}
+
+#header {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: -moz-linear-gradient(#e5e3dc, #ecebe5);
+ background: -webkit-linear-gradient(#e5e3dc, #ecebe5);
+ background: linear-gradient(#e5e3dc, #ecebe5);
+ border-radius: 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ border-top: 3px solid rgb(104, 104, 104);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ margin: -15px;
+ position: fixed;
+ width: 100%;
+ z-index: 2;
+ color: transparent;
+}
+
+#header .subheader {
+ text-align: left;
+ padding-left: 10px;
+}
+
+#header .wrapper {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ margin: 0px auto;
+ width: 99%;
+}
+
+#header .wrapper:after {
+ clear: both;
+ content: ".";
+ display: block;
+ height: 0;
+ visibility: hidden;
+}
+
+#titles {
+ width: 100%;
+ background-color: transparent;
+ padding: 0 1em 0 1em;
+}
+
+#titles #information {
+ text-align: left;
+ padding-left: 2em;
+}
+
+#titles #title {
+ width: 150px;
+}
+
+#titles #tab {
+ width: 100px;
+}
+
+#titles #login {
+ text-align: right;
+ padding-right: 2em;
+}
+
+#header .links {
+ background: transparent;
+ border: none;
+ border-radius: 0;
+ color: #404040;
+ position: relative;
+ margin-top: -15px;
+ width: 50%;
+}
+
+#header .links {
+ width: auto;
+}
+
+.login-links ul {
+}
+
+.login-links li {
+ display: inline;
+}
+
+.links a {
+ margin: 0 10px 0 10px;
+}
+
+.links .home {
+ font-weight: bold;
+}
+
+#quicksearch_top, #quicksearch_main {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: url(search.png) 5px center no-repeat, -moz-linear-gradient(#fafafa, #fff);
+ background: url(search.png) 5px center no-repeat, -webkit-linear-gradient(#fafafa, #fff);
+ background: url(search.png) 5px center no-repeat, linear-gradient(#fafafa, #fff);
+ padding-left: 26px;
+ width: 200px;
+}
+
+#find_top {
+ display: none !important;
+}
+
+#header .form a, #header .form a:visited {
+ background: rgba(0, 0, 0, 0.3);
+ border-radius: 10px;
+ color: #e5e3dc;
+ display: inline-block;
+ font-weight: bold;
+ margin-left: 5px;
+ text-align: center;
+ width: 20px;
+ height: 20px;
+}
+
+#header .form a:hover {
+ background: #0095dd;
+ text-decoration: none;
+}
+
+.links .dropdown {
+ background: rgba(0, 0, 0, 0.05);
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 3px;
+ display: inline-block;
+ padding: 4px 8px;
+ position: relative;
+}
+
+.links .dropdown .anchor {
+ background-image: url(dropdown.png);
+ background-position: right center;
+ background-repeat: no-repeat;
+ display: inline-block;
+ min-width: 110px;
+ padding-right: 15px;
+}
+
+.links .dropdown ul {
+ background: #fafafa;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0 0 5px 5px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ display: none;
+ padding: 4px 8px;
+ position: absolute;
+ right: -1px;
+ top: 26px;
+ z-index: 2;
+}
+
+.links .dropdown:hover ul {
+ display: block;
+}
+
+.links .dropdown li {
+ display: block;
+}
+
+.links .dropdown:hover {
+ border-bottom-right-radius: 0;
+}
+
+.links .dropdown li {
+ display: block;
+}
+
+#bugzilla-body {
+ background: none;
+ border: none;
+ color: #404040;
+ margin: 80px auto 15px;
+ padding: 0;
+ width: 99%;
+}
+
+/* Home */
+
+#page-index {
+ max-width: none;
+}
+
+#page-index td:first-child {
+ text-align: center;
+}
+
+#page-index a {
+ background: none;
+ display: inline;
+ float: none;
+ height: auto;
+ width: auto;
+}
+
+#quicksearch_main {
+ padding-left: 5px;
+}
+
+#quicksearch_links {
+ margin-top: 10px;
+}
+
+/* Bugs */
+
+.navigation {
+ background: rgba(255, 255, 255, 0.3);
+ padding: 5px 10px;
+}
+
+u {
+ border-bottom: 1px solid #aaa;
+ text-decoration: none;
+}
+
+#field_container_see_also br {
+ margin-bottom: 10px;
+}
+
+.bz_alias_short_desc_container {
+ background: none;
+ font-size: 24px;
+ font-weight: normal;
+ line-height: 32px;
+ padding: 5px 0;
+ text-shadow: 0 1px rgba(255, 255, 255, 0.2);
+}
+
+.bz_alias_short_desc_container b {
+ font-weight: normal;
+}
+
+.bz_alias_short_desc_container .editme {
+ font-weight: normal;
+}
+
+.last_comment_link {
+ font-size: 12px;
+}
+
+.last_comment_link b {
+ border-bottom: 1px solid #aaa;
+ font-weight: normal;
+}
+
+table.edit_form {
+ background: #fff;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ margin-bottom: 20px;
+ padding: 10px 10px 80px;
+ position: relative;
+}
+
+table.edit_form tbody {
+ width: 100%;
+}
+
+table.edit_form hr {
+ display: none;
+}
+
+.field_label {
+ font-weight: normal !important;
+ padding-right: 20px;
+}
+
+.field_label a, .field_label b {
+ color: #000;
+ font-weight: normal;
+}
+
+.field_value .text_input {
+ min-width: 0;
+}
+
+#product, #component {
+ width: 235px;
+}
+
+#bz_show_bug_column_1 tr:last-child span {
+ position: absolute;
+ left: 20px;
+ bottom: 20px;
+}
+
+#commit_top {
+ position: absolute;
+ bottom: 20px;
+ right: 20px;
+}
+
+.cc_list_display {
+ background: #fff;
+ float: none;
+ font-size: 11px;
+ margin-top: 3px;
+ max-width: none;
+ padding: 5px;
+}
+
+#project-flags, #custom-flags {
+ border-collapse: collapse;
+}
+
+#project-flags label, #custom-flags label {
+ margin-right: 10px;
+}
+
+#cf_crash_signature {
+ width: 100%;
+}
+
+#bz_big_form_parts br {
+ display: none;
+}
+
+#attachment_table {
+ background: #fff;
+ border: none;
+ border-collapse: collapse;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ margin-bottom: 40px;
+}
+
+#attachment_table td {
+ border: none;
+}
+
+#attachment_table th, .bz_attach_footer, .bz_time_tracking_table th {
+ background: #eee;
+ color: #404040;
+}
+
+.bz_comment {
+ background: transparent;
+ border: none;
+ margin: 0 0 30px;
+ padding: 0;
+ width: 674px;
+}
+
+.bz_comment_table {
+ width: 75%;
+}
+
+.bz_comment pre {
+ font: 13px/1.2 "Droid Sans Mono", Menlo, Monaco, "Courier New", Courier, monospace;
+}
+
+.bz_first_comment_head, .bz_comment_head {
+ font-weight: normal;
+ line-height: 2;
+ padding-bottom: 5px;
+ background-color: transparent;
+}
+
+.bz_comment_user a {
+ -moz-transition: all 0.25s linear 0s;
+ -webkit-transition: all 0.25s linear 0s;
+ transition: all 0.25s linear 0s;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ transition: all 0.25s linear 0s;
+ background: #0095dd;
+ color: #fff;
+ font-weight: bold;
+ padding: 5px;
+}
+
+.bz_comment_user a:hover {
+ -moz-transition: all 0.25s linear 0s;
+ -webkit-transition: all 0.25s linear 0s;
+ transition: all 0.25s linear 0s;
+ background: #00539f;
+ border: none;
+ text-decoration: none;
+}
+
+.new_user {
+ margin-left: 10px;
+}
+
+.ih_history {
+ padding: 0 !important;
+}
+
+.ih_history .bz_comment_head {
+ padding-bottom: 10px;
+}
+
+.ih_history_item:not(.ih_hidden) ~ .ih_history_item:not(.ih_hidden) {
+ margin-top: 10px;
+}
+
+.ih_history .bz_comment_user a {
+ background: #888;
+}
+
+.ih_history .bz_comment_user a:hover {
+ background: #555;
+}
+
+.bz_comment_text {
+ background: #fff;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ margin: 10px 0 0;
+ overflow: auto;
+ padding: 10px;
+ position: relative;
+}
+
+.bz_comment_text:after, .bz_comment_text:before {
+ bottom: 100%;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+}
+
+.bz_comment_text:after {
+ border-bottom-color: #fff;
+ border-width: 8px;
+ left: 16px;
+}
+
+.bz_comment_text span.quote {
+ background: #eee !important;
+ color: #444 !important;
+ display: block !important;
+ margin-top: 5px !important;
+ margin-bottom: -10px !important;
+ overflow: auto;
+ padding: 5px !important;
+ white-space: pre-wrap;
+}
+
+.ih_inlinehistory {
+ background: #eee;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ padding: 10px;
+ position: relative;
+ top: -1px;
+ z-index: 1;
+}
+
+#add_comment {
+ border: 1px solid #ccc;
+ border-width: 1px 0;
+ margin-bottom: 20px;
+ padding: 10px 0;
+}
+
+#add_comment > table {
+ border-collapse: collapse;
+ width: 661px;
+}
+
+#comment {
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ margin: 5px 0 20px;
+ width: 661px !important;
+}
+
+#footer {
+ background: #fff;
+ border: none;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 0;
+ color: #bbb;
+ margin: 15px -15px 0;
+ padding: 48px 15px;
+}
+
+#footer #useful-links {
+ background: url(footer-mozilla.png) no-repeat;
+ min-height: 24px;
+}
+
+#footer > * {
+ margin-right: auto;
+ margin-left: auto;
+ padding: 0 0 0 320px !important;
+ width: 670px;
+}
+
+#commit, #commit_top {
+ -moz-transition: all 0.25s linear 0s;
+ -webkit-transition: all 0.25s linear 0s;
+ transition: all 0.25s linear 0s;
+ background-color: rgb(101, 147, 36);
+ background-image: -moz-linear-gradient(rgb(129, 188, 46), rgb(101, 147, 36));
+ background-repeat: repeat-x;
+ border-radius: 0.25em 0.25em 0.25em 0.25em;
+ border: 0px none;
+ box-shadow: 0px 2px 0px 0px rgba(0, 0, 0, 0.1), 0px -2px 0px 0px rgba(0, 0, 0, 0.2) inset;
+ color: rgb(255, 255, 255);
+ cursor: pointer;
+ display: inline-block;
+ font-size: 14px;
+ height: 48px;
+ line-height: 48px;
+ padding: 0px 24px;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.25);
+}
+
+#commit:hover, #commit_top:hover {
+ -moz-transition: all 0.25s linear 0s;
+ -webkit-transition: all 0.25s linear 0s;
+ transition: all 0.25s linear 0s;
+ box-shadow: 0px 2px 0px 0px rgba(0, 0, 0, 0.1), 0px -2px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px 12px 24px 2px rgb(131, 200, 34) inset;
+ color: rgb(255, 255, 255);
+ text-decoration: none;
+}
+
+.related_actions {
+ line-height: 19px;
+ padding: 5px 10px;
+}
+
+/* Attachments */
+
+#viewFrame {
+ background: #444;
+ border: 2px solid #222;
+ margin-bottom: 10px;
+}
+
+#editFrame, #viewDiffFrame, #viewFrame {
+ margin-left: 0;
+}
+
+#flags label {
+ font-weight: normal;
+}
+
+/* Smaller than standard 990 (devices and browsers) */
+@media only screen and (max-width: 989px) {
+ #header .links {
+ float: none;
+ }
+}
+
+/* Tablet Portrait size to standard 990 */
+@media only screen and (min-width: 768px) and (max-width: 989px) {
+ body {
+ min-width: 768px;
+ }
+
+ #header .wrapper, #bugzilla-body {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 768px;
+ }
+
+ #footer > * {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 448px;
+ }
+}
+
+/* All Mobile Sizes */
+@media only screen and (max-width: 767px) {
+ table.edit_form, table.edit_form > tbody > tr > td {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: block;
+ width: 100% !important;
+ }
+
+ .bz_column_spacer {
+ width: auto;
+ height: 20px;
+ }
+}
+
+
+
+/* Mobile Landscape Size to Tablet Portrait */
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+ body {
+ min-width: 480px;
+ }
+
+ #header .wrapper, #bugzilla-body, #attachment_table,
+ .bz_comment, #add_comment > table, #comment {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 480px !important;
+ }
+
+ #footer > * {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 480px;
+ }
+}
+
+/* Mobile Portrait Size to Mobile Landscape Size */
+@media only screen and (max-width: 479px) {
+ body {
+ min-width: 100%;
+ }
+
+ #header .wrapper, #bugzilla-body, #attachment_table,
+ .bz_comment, #add_comment > table, #comment {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100% !important;
+ }
+
+ #footer > * {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ }
+}
diff --git a/skins/contrib/Mozilla/grain.png b/skins/contrib/Mozilla/grain.png
new file mode 100644
index 000000000..2980ee90e
--- /dev/null
+++ b/skins/contrib/Mozilla/grain.png
Binary files differ
diff --git a/skins/contrib/Mozilla/noise.png b/skins/contrib/Mozilla/noise.png
new file mode 100644
index 000000000..97407ffd2
--- /dev/null
+++ b/skins/contrib/Mozilla/noise.png
Binary files differ
diff --git a/skins/contrib/Mozilla/search.png b/skins/contrib/Mozilla/search.png
new file mode 100644
index 000000000..a56b5e2cd
--- /dev/null
+++ b/skins/contrib/Mozilla/search.png
Binary files differ
diff --git a/skins/custom/global.css b/skins/custom/global.css
index 41494cc2e..e80f656fb 100644
--- a/skins/custom/global.css
+++ b/skins/custom/global.css
@@ -6,15 +6,6 @@
body {
margin: 0;
padding: 15px 15px 2px 15px;
- background: none;
-}
-
-#header {
- margin-bottom: 0.5em;
-}
-
-#header .links {
- font-size: 90%;
}
#header .btn, #header .txt {