]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Fix for bug 77699 and bug 71503: fix javascript errors in quicksearch and improve...
authorjustdave%syndicomm.com <>
Tue, 29 May 2001 10:05:46 +0000 (10:05 +0000)
committerjustdave%syndicomm.com <>
Tue, 29 May 2001 10:05:46 +0000 (10:05 +0000)
Patch by Stephan Lee <slee@uk.bnsmc.com> and Andreas Franke <afranke@ags.uni-sb.de>

quicksearch.js

index e4c21868b03271be21d4a7d3a6602993bc356af5..09515dff4a75ee2252f1df7ff958ccbcaf079b26 100644 (file)
 //
 // Created by
 //     Andreas Franke <afranke@mathweb.org>
+//
+// Contributors:
+//     Stephen Lee <slee@uk.bnsmc.com>
+
+// variable below should be initialised according to whether
+// browser is IE 5.0 or earlier, but should be false for IE 5.5
+
+var is_IE5=(navigator.appVersion.search(/MSIE 5.0/g)>0);
+
+// Bodge to get round IE5 not understanding "undefined", "shift" and "unshift"
+
+var no_result=is_IE5?"---":undefined;
+
+function do_unshift(l, s) {
+  if(is_IE5) {
+    l.length = l.length + 1;
+    for (var i=l.length-1; i>0; i--) {
+      l[i] = l[i-1];
+    }
+    l[0] = s;
+    return l.length;
+  }
+  else {
+    return l.unshift(s);
+  }
+}
+
+function do_shift(l) {
+  if(is_IE5) {
+    var l0=l[0];
+    for (var i=0; i<l.length-1; i++) {
+      l[i] = l[i+1];
+    }
+    l.length = l.length - 1;
+    return l0;
+  }
+  else {
+    return l.shift();
+  }
+}
 
 function go_to (url) {
   document.location.href = url;
@@ -19,7 +59,7 @@ function go_to (url) {
 }
 
 function map(l, f) {
-    l1 = new Array();
+    var l1 = new Array();
     for (var i=0; i<l.length; i++) {
         l1[i] = f(l[i]);
     }
@@ -38,7 +78,7 @@ function member(s, l) {
 
 function add(s, l) {
     if (! member(s, l)) {
-        l.unshift(s);
+        do_unshift(l,s);
     }
 }
 
@@ -141,7 +181,7 @@ function findIndex(array,value) {
 function mapField(fieldname) {
     var i = findIndex(f1,fieldname);
     if (i >= 0) return f2[i];
-    return undefined;
+    return no_result;
 } 
 
 // `keywords' is defined externally
@@ -165,14 +205,14 @@ function is_severity(str) {
 // `product_exceptions' is defined externally
 
 function match_product(str) {
-    s = str.toLowerCase();
+    var s = str.toLowerCase();
     return (s.length > 2) && (! member(s,product_exceptions));
 }
 
 // `component_exceptions are defined externally
 
 function match_component(str) {
-    s = str.toLowerCase();
+    var s = str.toLowerCase();
     return (s.length > 2) && (! member(s,component_exceptions));
 }
 
@@ -222,27 +262,62 @@ function make_query_URL(url, input, searchLong) {
     status_and_resolution = "";
     charts = "";
 
-    var searchURL = url; //bugzilla + "buglist.cgi";
-    var abort = false;
+    // declare all variables used in this function
+    
+    var searchURL = url;  // bugzilla + "buglist.cgi" (or "query.cgi")
+    var abort = false;    // global flag, checked upon return
+   
+    var i,j,k,l;          // index counters used in 'for' loops
+    var parts,input2;     // escape "quoted" parts of input
+
+    var word;                  // array of words 
+                               //  (space-separated parts of input2)
+    var alternative;           // array of parts of an element of 'word'
+                               //  (separated by '|', sometimes by comma)
+    var comma_separated_words; // array of parts of an element of 'alternative'
+    var w;                     // current element of one of these arrays:
+                               //  word, alternative, comma_separated_words
+    
+    var w0;               // first element of 'word'
+    var prefixes;         // comma-separated parts of w0 
+                          //  (prefixes of status/resolution values)
+
+    var expr;             // used for 'priority' support
+    var n,separator;      // used for 'votes' support
+    var colon_separated_parts, fields,values,field;
+                          // used for generic fields:values notation
+
+    var chart,and,or;     // counters used in add_chart
+    var negation;         // boolean flag used in add_chart
+
+    // `statuses_open' and `statuses_resolved' are defined externally
+    var statusOpen     = statuses_open;
+    var statusResolved = statuses_resolved;
+    var statusAll      = statusOpen.concat(statusResolved);
+
+    // `resolutions' is defined externally
+    var bug_status = statusOpen.slice().reverse(); //reverse is just cosmetic
+    var resolution = new Array();
     
     // escape everything between quotes: "foo bar" --> "foo%20bar"
-    var parts = input.split('"');
+    parts = input.split('"');
     if ((parts.length % 2) != 1) {
         alert('Unterminated quote');
         abort = true;
-        return undefined;      
+        return no_result;      
     }
-    for (var i=1; i<parts.length; i+=2) {
+    for (i=1; i<parts.length; i+=2) {
         parts[i] = escape(parts[i]);
     }
-    var input2 = parts.join('"');
+    input2 = parts.join('"');
 
     // abort if there are still brackets
     if (input2.match(/[(]|[\)]/)) {
         alert('Brackets (...) are not supported.\n' + 
               'Use quotes "..." for values that contain special characters.');
         abort = true;
-        return undefined;
+        return no_result;
     }
 
     // translate " AND "," OR "," NOT " to space,comma,dash
@@ -251,20 +326,11 @@ function make_query_URL(url, input, searchLong) {
     input2 = input2.replace(/[\s]+NOT[\s]+/g," -");
 
     // now split into words at space positions
-    var word = input2.split(/[\s]+/);
+    word = input2.split(/[\s]+/);
 
     // determine bug_status and resolution 
     // the first word may contain relevant info
 
-    // `statuses_open' and `statuses_resolved' are defined externally
-    var statusOpen     = statuses_open;
-    var statusResolved = statuses_resolved;
-    var statusAll      = statusOpen.concat(statusResolved);
-
-    // `resolutions' is defined externally
-    var bug_status = statusOpen.slice().reverse(); //reverse is just cosmetic
-    var resolution = new Array();
-
     // This function matches the given prefixes against the given statuses and
     // resolutions. Matched statuses are added to bug_status, matched 
     // resolutions are added to resolution. Returns true iff some matches 
@@ -292,24 +358,24 @@ function make_query_URL(url, input, searchLong) {
     if (word[0] == "ALL") {
         // special case: search for bugs regardless of status
         addAll(statusResolved,bug_status);
-        word.shift();
+        do_shift(word);
     } else if (word[0] == "OPEN") {
         // special case: search for open bugs only
-        word.shift();
+        do_shift(word);
     } else if (word[0].match("^[+][A-Z]+(,[A-Z]+)*$")) {
         // e.g. +DUP,FIX 
-        w0 = word.shift();
+        w0 = do_shift(word);
         prefixes = w0.substring(1).split(",");
         if (! matchPrefixes(prefixes,statusResolved,resolutions)) {
-            word.unshift(w0);
+            do_unshift(word,w0);
         }
     } else if (word[0].match("^[A-Z]+(,[A-Z]+)*$")) {
         // e.g. NEW,ASSI,REOP,FIX
         bug_status = new Array(); // reset
-        w0 = word.shift();        
+        w0 = do_shift(word);
         prefixes = w0.split(",");
         if (! matchPrefixes(prefixes,statusAll,resolutions)) {
-            word.unshift(w0);
+            do_unshift(word,w0);
             bug_status = statusOpen.reverse(); //reset to default bug_status
         }
     } else {
@@ -320,7 +386,7 @@ function make_query_URL(url, input, searchLong) {
     }
     if (resolution.length > 0) {
         resolution = resolution.reverse();
-        resolution.unshift("---");
+        do_unshift(resolution,"---");
         addAll(statusResolved,bug_status);
     }
     bug_status = bug_status.reverse();
@@ -336,11 +402,11 @@ function make_query_URL(url, input, searchLong) {
                               
     // end of bug_status & resolution stuff
 
-    var chart = 0;
-    var and   = 0;
-    var or    = 0;
+    chart = 0;
+    and   = 0;
+    or    = 0;
 
-    var negation = false;
+    negation = false;
 
     function negate_comparison_type(type) {
         switch(type) {
@@ -351,6 +417,7 @@ function make_query_URL(url, input, searchLong) {
                 // e.g. "greaterthan" 
                 alert("Can't negate comparison type: `" + type + "'");
                 abort = true;
+                return "dummy";
         }
     }
 
@@ -379,7 +446,7 @@ function make_query_URL(url, input, searchLong) {
         }
     }
 
-    for (var i=0; i<word.length; i++, chart++) {
+    for (i=0; i<word.length; i++, chart++) {
 
         w = word[i];
         
@@ -392,7 +459,7 @@ function make_query_URL(url, input, searchLong) {
         switch (w[0]) {
             case "+":
                 alternative = w.substring(1).split(/[|,]/);
-                for (var j=0; j<alternative.length; j++)
+                for (j=0; j<alternative.length; j++)
                     add_chart("short_desc","substring",alternative[j]);
                 break;
             case "#":
@@ -403,14 +470,14 @@ function make_query_URL(url, input, searchLong) {
                 break;
             case ":":
                 alternative = w.substring(1).split(",");
-                for ( var j=0; j<alternative.length; j++) {
+                for (j=0; j<alternative.length; j++) {
                     add_chart("product","substring",alternative[j]);
                     add_chart("component","substring",alternative[j]);
                 }
                 break;
             case "@":
                 alternative = w.substring(1).split(",");
-                for ( var j=0; j<alternative.length; j++)
+                for (j=0; j<alternative.length; j++)
                     add_chart("assigned_to","substring",alternative[j]);
                 break;
             case "[":
@@ -422,7 +489,7 @@ function make_query_URL(url, input, searchLong) {
                 break;
             default:
                 alternative=w.split("|");
-                for (var j=0; j<alternative.length; j++) {
+                for (j=0; j<alternative.length; j++) {
 
                     w=alternative[j];
 
@@ -434,18 +501,18 @@ function make_query_URL(url, input, searchLong) {
                     }
                     // generic field1,field2,field3:value1,value2 notation
                     if (w.match("^[^:]+[:][^:\/][^:]*$")) {
-                        parts = w.split(":");
-                        fields = parts[0].split(/[,]+/);
-                        values = parts[1].split(/[,]+/);
-                        for (var k=0; k<fields.length; k++) {
+                        colon_separated_parts = w.split(":");
+                        fields = colon_separated_parts[0].split(/[,]+/);
+                        values = colon_separated_parts[1].split(/[,]+/);
+                        for (k=0; k<fields.length; k++) {
                             field = mapField(fields[k]);
-                            if (field == undefined) {
+                            if (field == no_result) {
                                 alert("`"+fields[k]+"'"+
                                       " is not a valid field name.");
                                 abort = true;
-                                return undefined;
+                                return no_result;
                             } else {
-                                 for (var l=0; l<values.length; l++) {
+                                 for (l=0; l<values.length; l++) {
                                      add_chart(field,"substring",values[l]);
                                  }
                             }  
@@ -453,7 +520,7 @@ function make_query_URL(url, input, searchLong) {
                         continue;
                     }
                     comma_separated_words=w.split(/[,]+/);
-                    for (var k=0; k<comma_separated_words.length; k++) {
+                    for (k=0; k<comma_separated_words.length; k++) {
                         w=comma_separated_words[k];
 
                         // platform
@@ -531,7 +598,7 @@ function make_query_URL(url, input, searchLong) {
     if (abort == false) {
         return searchURL;
     } else {
-        return undefined;
+        return no_result;
     }
 }
 
@@ -542,7 +609,7 @@ function unique_id () {
 function ShowURL(mode) {
     var input = document.f.id.value;
     var searchURL = make_query_URL(bugzilla+"buglist.cgi", input, false);
-    if (searchURL != undefined) {
+    if (searchURL != no_result) {
         var pieces = searchURL.replace(/[\?]/g,"\n?").replace(/[\&]/g,"\n&");
         if (mode == "alert") {
             alert(pieces);
@@ -601,7 +668,7 @@ function Search(url, input, searchLong) {
         return;
     }
     var searchURL = make_query_URL(url, inputstring, searchLong);
-    if (searchURL != undefined) {
+    if (searchURL != no_result) {
         go_to(searchURL);
          //window.open(searchURL, "other" );
     } else {