]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 182082: Help system should support more browsers - Patch by Teemu Mannermaa ...
authorlpsolit%gmail.com <>
Sun, 15 Apr 2007 23:43:26 +0000 (23:43 +0000)
committerlpsolit%gmail.com <>
Sun, 15 Apr 2007 23:43:26 +0000 (23:43 +0000)
js/help.js [new file with mode: 0644]
js/util.js [new file with mode: 0644]
skins/standard/help.css [new file with mode: 0644]
template/en/default/filterexceptions.pl
template/en/default/global/header.html.tmpl
template/en/default/global/help.html.tmpl
template/en/default/search/search-advanced.html.tmpl

diff --git a/js/help.js b/js/help.js
new file mode 100644 (file)
index 0000000..938a73a
--- /dev/null
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1
+ *
+ * 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 the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Gervase Markham <gerv@gerv.net>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+var g_helpTexts = new Object();
+var g_helpIframe;
+var g_helpDiv;
+
+/**
+ * Generate help controls during page construction.
+ *
+ * @return Boolean; true if controls were created and false if not.
+ */
+function generateHelp()
+{
+    // Only enable help if controls can be hidden
+    if (!document.body.style)
+        return false;
+
+    // Create help controls (a div to hold help text and an iframe
+    // to mask any and all controls under the popup)
+    document.write('<div id="helpDiv" style="display: none;"><\/div>');
+    document.write('<iframe id="helpIframe" src="about:blank"');
+    document.write('        frameborder="0" scrolling="no"><\/iframe>');
+
+    return true;
+}
+
+/**
+ * Enable help popups for all form elements after the page has finished loading.
+ *
+ * @return Boolean; true if help was enabled and false if not.
+ */
+function enableHelp()
+{
+    g_helpIframe = document.getElementById('helpIframe');
+    g_helpDiv = document.getElementById('helpDiv');
+    if (!g_helpIframe || !g_helpDiv) // Disabled if no controls found
+        return false;
+
+    // MS decided to add fieldsets to the elements array; and
+    // Mozilla decided to copy this brokenness. Grr.
+    for (var i = 0; i < document.forms.length; i++) {
+        for (var j = 0; j < document.forms[i].elements.length; j++) {
+            if (document.forms[i].elements[j].tagName != 'FIELDSET') {
+                document.forms[i].elements[j].onmouseover = showHelp;
+            }
+        }
+    }
+
+    document.body.onclick = hideHelp;
+    return true;
+}
+
+/**
+ * Show the help popup for a form element.
+ */
+function showHelp() {
+    if (!g_helpIframe || !g_helpDiv || !g_helpTexts[this.name])
+        return;
+
+    // Get the position and size of the form element in the document
+    var elemY = bz_findPosY(this);
+    var elemX = bz_findPosX(this);
+    var elemH = this.offsetHeight;
+
+    // Update help text displayed in the div
+    g_helpDiv.innerHTML = ''; // Helps IE 5 Mac
+    g_helpDiv.innerHTML = g_helpTexts[this.name];
+
+    // Position and display the help popup
+    g_helpIframe.style.top = g_helpDiv.style.top = elemY + elemH + 5 + "px";
+    g_helpIframe.style.left = g_helpDiv.style.left = elemX + "px";
+    g_helpIframe.style.display = g_helpDiv.style.display = '';
+    g_helpIframe.style.width = g_helpDiv.offsetWidth + "px";
+    g_helpIframe.style.height = g_helpDiv.offsetHeight + "px";
+}
+
+/**
+ * Hide the help popup.
+ */
+function hideHelp() {
+    if (!g_helpIframe || !g_helpDiv)
+        return;
+
+    g_helpIframe.style.display = g_helpDiv.style.display = 'none';
+}
diff --git a/js/util.js b/js/util.js
new file mode 100644 (file)
index 0000000..9d22090
--- /dev/null
@@ -0,0 +1,116 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1
+ *
+ * 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 Cross Platform JavaScript Utility Library.
+ *
+ * The Initial Developer of the Original Code is
+ * Everything Solved.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Max Kanat-Alexander <mkanat@bugzilla.org>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/**
+ * Locate where an element is on the page, x-wise.
+ *
+ * @param  obj Element of which location to return.
+ * @return     Current position of the element relative to the left of the
+ *             page window. Measured in pixels.
+ */
+function bz_findPosX(obj)
+{
+    var curleft = 0;
+
+    if (obj.offsetParent) {
+        while (obj) {
+            curleft += obj.offsetLeft;
+            obj = obj.offsetParent;
+        }
+    }
+    else if (obj.x) {
+        curleft += obj.x;
+    }
+
+    return curleft;
+}
+
+/**
+ * Locate where an element is on the page, y-wise.
+ *
+ * @param  obj Element of which location to return.
+ * @return     Current position of the element relative to the top of the
+ *             page window. Measured in pixels.
+ */
+function bz_findPosY(obj)
+{
+    var curtop = 0;
+
+    if (obj.offsetParent) {
+        while (obj) {
+            curtop += obj.offsetTop;
+            obj = obj.offsetParent;
+        }
+    }
+    else if (obj.y) {
+        curtop += obj.y;
+    }
+
+    return curtop;
+}
+
+/**
+ * Get the full height of an element, even if it's larger than the browser
+ * window.
+ *
+ * @param  fromObj Element of which height to return.
+ * @return         Current height of the element. Measured in pixels.
+ */
+function bz_getFullHeight(fromObj)
+{
+    var scrollY;
+
+    // All but Mac IE
+    if (fromObj.scrollHeight > fromObj.offsetHeight) {
+        scrollY = fromObj.scrollHeight;
+    // Mac IE
+    }  else {
+        scrollY = fromObj.offsetHeight;
+    }
+
+    return scrollY;
+}
+
+/**
+ * Get the full width of an element, even if it's larger than the browser
+ * window.
+ *
+ * @param  fromObj Element of which width to return.
+ * @return         Current width of the element. Measured in pixels.
+ */
+function bz_getFullWidth(fromObj)
+{
+    var scrollX;
+
+    // All but Mac IE
+    if (fromObj.scrollWidth > fromObj.offsetWidth) {
+        scrollX = fromObj.scrollWidth;
+    // Mac IE
+    }  else {
+        scrollX = fromObj.offsetWidth;
+    }
+
+    return scrollX;
+}
diff --git a/skins/standard/help.css b/skins/standard/help.css
new file mode 100644 (file)
index 0000000..bc888ca
--- /dev/null
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1
+ *
+ * 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 the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Gervase Markham <gerv@gerv.net>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/* Help system */
+#helpDiv {
+    border-style: solid;
+    border-color: #F0A000;
+    background-color: white;
+    padding: 5px;
+    position: absolute;
+    z-index: 2;
+}
+
+#helpIframe {
+    overflow: hidden;
+    position: absolute;
+    z-index: 1;
+    display: none;
+}
index 72ab1550ab36cca0dd430cf631e2b805dd2a63c0..f605ca82e638b4ed0a44821c527d43227258dd09 100644 (file)
   'bug.bug_id', 
 ],
 
-'global/help.html.tmpl' => [
-  'h.id', 
-  'h.html', 
-],
-
 'global/choose-product.html.tmpl' => [
   'target',
 ],
index ec906f3e65a730ad1917265c44332ab6bc3ca84e..ad1df396d18235bf2be154d7d58352243c02080f 100644 (file)
@@ -82,8 +82,6 @@
       [% END %]
     [% END %]
 
-    [%+ INCLUDE "global/help-header.html.tmpl" %]
-
     [%# Set up the skin CSS cascade:
       #  1. Standard Bugzilla stylesheet set (persistent)
       #  2. Standard Bugzilla stylesheet set (selectable)
index cc69534da81e22e1efbb6f1913e49fbdf7e09a03..4ac309f90459ab2c8be6440bfa96a47074dc5243 100644 (file)
 [% cgi = Bugzilla.cgi %]
 
 [% IF cgi.param("help") %]
-  [% IF cgi.user_agent("Mozilla/5") %]
-      [% FOREACH h = help_html %]
-      <div id="[% h.id %]_help" class="help" style="display: none;">
-        [%- h.html -%]  
-      </div>
-      [% END %]
-  [% END %]
+  <script type="text/javascript"> <!--
+    [% FOREACH h = help_html %]
+      g_helpTexts["[% h.id FILTER js %]"] = "[%- h.html FILTER js -%]";
+    [% END %]
+    // -->
+  </script>
 [% END %]
 
index 5d9849caf0ced4066e7f2f552afebe3ecb1b431b..22dc1dd7daa36122b1e3565d35b6095504ab8be2 100644 (file)
@@ -37,9 +37,10 @@ var queryform = "queryform"
 
 [% PROCESS global/header.html.tmpl
   title = "Search for $terms.bugs"
-  onload = "doOnSelectProduct(0); initHelp();"
+  onload = "doOnSelectProduct(0); enableHelp();"
   javascript = js_data
-  javascript_urls = [ "js/productform.js" ]
+  javascript_urls = [ "js/productform.js" "js/util.js" "js/help.js" ]
+  style_urls = [ "skins/standard/help.css" ]
   style = "dl.bug_changes dt {
              margin-top: 15px;
            }"
@@ -50,25 +51,19 @@ var queryform = "queryform"
 [% button_name = "Search" %]
 
 [%# The decent help requires Javascript %]
+<script type="text/javascript"> <!--
 [% IF NOT cgi.param("help") %]
-  [% IF cgi.user_agent("Mozilla/5") %]
-    <script type="text/javascript"> <!--
-      document.write("<p><a href='query.cgi?help=1&amp;format=advanced'>Give me some help<\/a> (reloads page).<\/p>");
-      // -->
-    </script>
-  [% END %]
+  document.write("<p><a href='query.cgi?help=1&amp;format=advanced'>Give me some help<\/a> (reloads page).<\/p>");
 [% ELSE %]
-  <p>
-      For help, mouse over the page elements.
-      <font color="red">
-      [% IF cgi.user_agent("Mozilla/5") %]
-        Note that if the help popups are hidden by form element scroll bars,
-        this is a b<!-- word broken up to pass test 009 -->ug in your browser,
-        not in [% terms.Bugzilla %].
-      [% END %]
-    </font>
-  </p>
+  [% PROCESS "search/search-help.html.tmpl" %]
+  if (generateHelp())
+    document.write("<p>For help, mouse over the page elements.<\/p>");
+  else
+    document.write("<p>Help initialization failed, no help available.<\/p>");
 [% END %]
+// -->
+</script>
+
 <form method="get" action="buglist.cgi" name="queryform">
 
 [% PROCESS search/form.html.tmpl %]
@@ -81,7 +76,6 @@ var queryform = "queryform"
 
 </form>
 
-[% PROCESS "search/search-help.html.tmpl" IF cgi.param("help") %]
 
 [% END %]