Skip to main content
summaryrefslogblamecommitdiffstats
blob: afbf58afc85e835ed09bce278245546610e17853 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                                                                
                                                       







                                                                                 

                                                                       
                                                           
                                                                              

                                                               
                                           
                                                
  
                                              
                                                     



                                                                       
                                        
                                               
                                                    

                                                                                                                                        
                                   
                                   
                         
                                                                                       

                                                                            
                           
 

                                                               
                                                               
                                                              
                                                             
                                                          
                                                            
                                                                  
                                                           
  
                                          
                                                     
  


                                               

                                                                                                

                  
                                                                        





                                                                      
 
                                      
                                                                  

                                                                        
                                       
 


                                                              
                                
                                
                                 

                                
                            



                                 
  




                                 


                                                                          
                                                                                  
                        
 


                                                                                                                          

                                                                                           
                                                                                               
                                                                                       
                                                                                           

                                                                                         

  

                                                                                                                          
                        




































                                                                                                           
 



                                                                    


                                                                      
                       


                        
                                                                                                         
                                   
 
                                                                                                                                                             
                           


                                                                


                                                                                                                         
                    


                                      

  
                                                                                                        




                        


                                                  



                    
            





                   
             







                    
             






                
                 






                        
  
                                                                                                      
 
                    
       
       
       
       
       
       

       
      
        
        
        









                            
                






                      












                         
             









                          
            




























                            
                                                                              
 

















                                                                                                          





                                                                                              











                                                                            
                                                                                                 





























                                                                                                                                        
                                                        
                                                          





                                                                                               


                                                                                                             

                                                                                         
                                                                                    

                                                                                                                 
        
                                         

                                        


                                                                        
                                         


                                                                                                                                                 
                                                      


                                                                                                                
 
         
 







                                                                                                                                               



                                                                                                                                   
                                                                       
 




                                                                                                                                          
 






















                                                                                    
                                                                                         

         
 
                                                              
                                                                      


                                              


                                







                                                                       

                                     
                    

 






















                                                                                                                         
                                                              
                                                                                         
                                               


                                                                                    

                                                                



                                    

                                                                           


                                                                                                              
                                                                                              



                                                                     




                                       
                                          
                         



                                                   
                                           

 




                                                                                                                                                     



                                           






                                                                                            
                                           


                                                                        
                                                                              
                                                                                                                       





                                                                                                                      
                                             


                                                                          






                                                                                                                      






                                                                                            
                                                             

                                                              


















                                                                                                                                                 
             






                                                                                                            
                                                                                                                         









                                                                                                            
                                                                                                                         







                                                                                       






                                                                                                        
                                           

 








                                                                                        

                                                                                                        

                                                                       


                                                                 
                         
                                                               

 
                                               











                                                                                                                                                          
                                              

                                                                  

 






                                                                                                     



                                                                                         

                                                                 





                                                               
                                                                                   

                                                                                             






                                                                                                                                
                                                         











                                                                                                               


                                                            
                                                                           




                                                                                             

                                               
                                                          



                                                                                                           
                                                  

                                                     

 
                                                               

                                                                                    

                                                 
                                                                     






                                                                                                                 
                                                           








                                                                                                            
    

                                                                                  
                                               



                                                                                                                                    
     

                                                                          

 




























                                                                                                                                                                                                                   
                                                 








                                                                                                           
    

                                                                          
                                           



                                                                                                                               
     

                                                                         

 






                                                 






                                                 
                                                         
                                                             
                                                                                                                 
                                                


                                                            
                                               
                                                                     
                                                                                                                 


                               













                                                                                                                                                               
          





                                                       
                                                                
                                                     






                                                                                             
                                   
                                                     
                                           
                                                                          


                                                                                            


                        
                                       

                                              


















                                                                                                              
  

 














                                                                                              



                                                                                                            



                                                                                                                                  

                                                                                                                        



                                                                        
         
                     

 





                                                                                                              






                                                         















                                                                      
                                              
                               



                                                        

                                                         
                                                           




                                                                          

                                                                                                                      
                                                                             
                                                                                   


                                                                               

                                                                       


          











                                                                                                                  

             

                                 

                                                                                                                                        
                                                                                                
 



                                  
 

                                                                                 
                      
              



                                                  
                                 




                                                                                                                                   
 
                                                             


                                                            
 
                      



                                                        
                                                



                                         
                     







                                                                                                                                     
 
 
                                                       
               
                             

                                                       
                                  
                                        







                                                                                                                                                
 
 


                                                                                                                     
                                                    







                                                                                                                           
                                                                                                                                                                 

                                                                                                                                                                                  
 
 


                                                              
                                                                                         


                                                                                         



                                                                               




                                                                                                    
 
 
                                                                                                                                      
 
                                                                            
                                                                  


                                                    
                                           
                                                        




                                                                                                                   




                                                                             













                                                                       





                                                              


                                                 
                                                                



                                                        





                                                                                       



























                                                                                               

 









                                                                    
                                                           

                                                                                                         
                                                                                        



                                                                                                                                 










                                                   














                                                                                                    


     








                                                                                                       
                                  
 
                                                         










                                                              
                                                                                                                                    


                                                                                              
         




                                                                                            
                                                                

                                                                                                                          
                                                   
















                                                                                                                      
                                                                                                 
                                                                                                                                                                                        
                                                                  
                                                           
                        


                                                                                                                                                             











                                                                                             

                                                                                               



                          


                                                                  
                                                             
                                                      
                                                      

                                                      


                                                                                              
                                        
            


                                                                                                                      
                                 

                                       

                                                                        





                                                                                                                                                            



                                                                                                               

                 
            
                                                           




                                                                                                                













                                                                                                                       
                







                                                             
                                                                 
     
    




                                                      
                                                                   
         

                                                                       

                                                                                                
         
 
 
 
                          
                   
 












                                                             






                                                                                                                               
        




                                                                                                                                             






                                                                  
                                                      





































                                                                       
        
                           



                                                                





                                                      
                                                           


                                                      



                                                                                                                                                     
                                                                        




                                                                                                                                                                                                              
                                                                          


                                                                                   



                                                                  

                                                                                                
         
 
                                      
                                                                                
                                             
                                                                                         
                                                                                                              



                                                                                
                



                                                                                       
         
        

                                                                                      
                                                     
                                                                                                                            

                                                                                                                                                   


         
                                   
                                                                        
                                              
                                                                                                       


                                                                                                                

         

                                                                            
                                                
                                                                                                             




                                                                                                    


                                                                              
                                                                                                            
                                                                                                                           
                                                                             


                                                                                                                










                                                                                                                
                                                                             




                                                                        



                                                                                                       















                                                                                                    

                                                                                                                  
                                                                              

        
        
                                                                                                













                                             
        
                                


                                                      
 




                                                                                         


                                            
                                                              
                                                                   
 
                          

                                                                                                 
                                         
                                        
        








                                                                      
 
        

                            









                                                                             
                
         
 

                                                                          
                                             








                                                                                

                                     





                                                                               
     

                                                                                

                                                       
























                                                                                                  

                                                                   














                                                                                




















                                                                                                                          
     
 
 
                                 
                  
                   
 


                                                                                    




                                                                                                              
                                                 
                                                                     
                                                                                                  
                                                                                         
                            
                                                                     
                                                         
                                                                                                                            
 




                                                                                                     








                                                                                                                                          

                                                                                                           

                                                                                                                                          
                                                                             
                                                                                                                           

                                                                          
                                                                                   

                                                                                     


                                                                                  





                                                                                              
                                                                                      
                                                                                   


                                                                                           
                                 



                                                                                                                   

                                                                                



                                                                                                                  
                                          




                                                                                                                                                                 
                         

                                                       








                                                                                                                  
                                                                        






                                                                                                                           
                 
         
        









                                                                                                                                    










                                                                                                                          
 





                                                                  
                                                                                      

                                                                                                                
                        























                                                                                                                                                    
                                   




                                                                                                                   
                                                            

                                                                                                 










                                                                                                                            





                                                                                                          


                                                                                                          
                                                                                                                                




                                                                                         








                                                                                    
                                                                                           
                                               
                                                                                                                     


                                                              



                                                                                        
                
                                                                                           
                                                                                                      
                    
                                           
                    
                                                                                      
                    



                                                                                    
                                                                    



                                                                                        

                                                                                                     


                                                   

                                                                                       
                                                                                           

                                                                                                                                                                                                  
                                                                                                         

                                                                                                 
                                               



                                                                                                   

                                         

                                                             




                                                                    


                                                                                                            




                                                                                                             

                                                                       
                                                      
                                                                                                                      



                                                                                    
                                                                                                      


                                                            
                                                                  
                                                        
                                                                
                                                                                
                



                                                                                                    



















                                                                                                                                                   
                                                                                                          
                 









                                                                                                                                                     





                                                                                               

                                                                                                                                               
                                                                                                                     



                                                                                                                                                         



                                                                                        
        
                        





                                                                     
        











                                                                                                                        
        
                                                                                                                              
                                                    
                                                       


                                                                                             
        
                               
        

                                     


                                                                                  








                                                                          


                                                           
        

                                                          

                                                     





















                                                                                              




























                                                                                              

                                                              

                                                                                                
                 





                                                


                                                                                              




                                                                                           
 
                                                      
                                                                          
                                                            

                                                                




                                                                                                                                   
            


                                                                                                   
                                       
                                                        


                                                                                      


                                                                                         
                 










                                                                                                                                                  
         

                                                                 




                                                                                                                                   
            


                                                                                                         
                                       
                                                          


                                                                                            


                                                                                           
                 












                                                                                                                                                  
         





                                                                                                  
                                                       








                                                                                                      
                                                       











































                                                                                  



                                              
        
                                               
                                                                    
                                             


                                                                                               


                                                                                
                                                         

         









                                                                                                       


                                                                                                                         

                                                                          
                                                                     

                                                                                                                                         





                                                                                            

                                                                                    
                                                          





                                                                                                               
                    





                                                                                                
                                           
                         
                                                                 
         
                                                          
                                                                                   
         

         
                                                  


                                                                        
                                                           





                                                                
                                            








                                                                  
                                                


                                                                        
                                                             





                                                                
                                            








                                                  
                                          

                                                                                    
                                                             
                                                      
                                                           
                                               
                                                            
                
                                                   
         
                




                                                                                     
                                                                                                          
                                                                                                             
                                                          
                                                                                                                     


                                                                                                                        








                                                                                                            
                 
                




                                                                                                      

                                                                                                      
                                               






                                                                                                        
                                                                                             












                                                                                              



                                                                       


                                                              
                                                                                                 
                                                          
                                                 




                                                               
                                                                                             
                                                                                   
                                                                        



                                                   

                                                                          








                                                                                                    
                                                  


                                                                                                                  




                                                                        

                                                                 
                                                  





                                                                                                       
                
                                                                 
                                                                                                         
         
        
                                             
                                     
                                                                        


                                                                                            
                                                   
                            
                                                 
                       
                                                      


                                                                  
                                                        





                                                                     






















                                                                                                                                  
 
 
                                         

           
 





                                                                                    



                                                       
                                    



                                        



                                                                                      
/*******************************************************************************
 * Copyright (c) 2012, 2019 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
//---------------------------------------------------------------------
//
// JDT UI Bugzilla Add-on for Bugzilla at bugs.eclipse.org.
// For a longer description, see http://www.eclipse.org/jdt/ui/dev.php#scripts
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey: http://www.greasespot.net/
// Then restart Firefox and revisit this script.
//
// To uninstall, go to Add-ons > User Scripts,
// select "JDT UI Bugzilla Add-On", and click Remove.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          JDT UI Bugzilla Add-On
// @namespace     http://www.eclipse.org/jdt/ui
// @description   Script to tune Bugzilla for JDT UI
// @require  https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// Broken by Greasemonkey 4 (resource is not available on file system, so it can't be edited locally): @grant         GM_getResourceText
// @grant         GM_xmlhttpRequest
// @grant         GM.xmlHttpRequest
// @run-at document-start
// @resource      config   https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.config.js
// @downloadURL   https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js
// @updateURL     https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js
// @version 1.20210721T1139

// @include       https://bugs.eclipse.org/bugs/show_bug.cgi*
// @include       https://bugs.eclipse.org/bugs/process_bug.cgi
// @include       https://bugs.eclipse.org/bugs/attachment.cgi*
// @include       https://bugs.eclipse.org/bugs/enter_bug.cgi*
// @include       https://bugs.eclipse.org/bugs/post_bug.cgi*
// @include       https://bugs.eclipse.org/bugs/query.cgi*
// @include       https://bugs.eclipse.org/bugs/buglist.cgi*
// @include       https://bugs.eclipse.org/bugs/show_activity.cgi*
// @include       https://bugs.eclipse.org/bugs/report.cgi*
//
// Test install for new Bugzilla versions:
// @include       https://bugs.eclipse.org/bugstest/*
//
// IBM-internal:
// @include       https://bugs.ottawa.ibm.com/*
//
// Locally saved query.cgi (requires about:config setting greasemonkey.fileIsGreaseable = true):
// @include       file://*/Search%20for%20bugs.htm*
// ==/UserScript==

// --- Configurable options --------------------------------------------
// These values can be overridden in your local jdtbugzilla.config.js.
// Steps in Firefox:
// - Greasemonkey > Manage User Scripts
// - open context menu on "JDT UI Bugzilla Add-On"
// - choose "Show Containing Folder"
// - edit jdtbugzilla.config.js

// Add as many milestones as you like:
var target_milestones= ["4.21 M2", "4.21 M3", "4.21", "BETA J17"];

// Indexes into target_milestones to be used for "Fixed (in <TM>)" links
var main_target_milestones= [0/*, 2*/];

// Add "<name>", "<email>" pairs for people you frequently CC:
var ccs= [
"DM", "daniel_megert@ch.ibm.com",
"MK", "markus.kell.r@gmail.com",
"NG", "noopur_gupta@in.ibm.com",
"KP", "kalyan_prasad@in.ibm.com",
"SS", "sarika.sinha@in.ibm.com",
"JA", "jarthana@in.ibm.com",
"MP", "manpalat@in.ibm.com",
"VC", "Vikas.Chandra@in.ibm.com",
"LS", "lshanmug@in.ibm.com",
"SL", "sravankumarl@in.ibm.com",
"NM", "niraj.modi@in.ibm.com",
];
var ccs_req= [
"DM", "daniel_megert@ch.ibm.com",
"NG", "noopur_gupta@in.ibm.com",
"KP", "kalyan_prasad@in.ibm.com",
];
// Add "<name>", "<email>" pairs for people you frequently assign bugs to:
var assignees= ccs;

// Add "<name>", "<email>" pairs for people you frequently use as flag requestees:
var requestees= ccs_req;

// Add "<name>", "<string>" pairs for template strings that you frequently insert into the comment field (e.g. repo URLs):
var commentTemplates= [
"Fixed with ", "Fixed with ",
"jdt.ui", "http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=",
"platform.text", "http://git.eclipse.org/c/platform/eclipse.platform.text.git/commit/?id=",
"platform.common", "http://git.eclipse.org/c/platform/eclipse.platform.common.git/commit/?id=",
"platform.ui", "http://git.eclipse.org/c/platform/eclipse.platform.ui.git/commit/?id=",
"platform.team", "http://git.eclipse.org/c/platform/eclipse.platform.team.git/commit/?id=",
"pde.ui", "http://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=",
"equinox.bundles", "http://git.eclipse.org/c/equinox/rt.equinox.bundles.git/commit/?id=",
];

// Add "<name>", "<string>" pairs for template strings that you frequently insert into the comment field (e.g. repo URLs).
// Nested arrays are used to group items line-wise.
var commentTemplates2= [
["Fixed with ", "Fixed with "],
[
"eclipse.jdt", "http://git.eclipse.org/c/jdt/eclipse.jdt.git/commit/?id=",
".core",       "http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/commit/?id=",
".debug",      "http://git.eclipse.org/c/jdt/eclipse.jdt.debug.git/commit/?id=",
".ui",         "http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=",
],[
"eclipse.pde.build", "http://git.eclipse.org/c/pde/eclipse.pde.build.git/commit/?id=",
"...ui",             "http://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=",
],[
"eclipse.platform", "http://git.eclipse.org/c/platform/eclipse.platform.git/commit/?id=",
".common",          "http://git.eclipse.org/c/platform/eclipse.platform.common.git/commit/?id=",
".debug",           "http://git.eclipse.org/c/platform/eclipse.platform.debug.git/commit/?id=",
".images",          "http://git.eclipse.org/c/platform/eclipse.platform.images.git/commit/?id=",
],[
".releng",          "http://git.eclipse.org/c/platform/eclipse.platform.releng.git/commit/?id=",
"..aggregator",     "http://git.eclipse.org/c/platform/eclipse.platform.releng.aggregator.git/commit/?id=",
".resources",       "http://git.eclipse.org/c/platform/eclipse.platform.resources.git/commit/?id=",
".runtime",         "http://git.eclipse.org/c/platform/eclipse.platform.runtime.git/commit/?id=",
],[
".swt",             "http://git.eclipse.org/c/platform/eclipse.platform.swt.git/commit/?id=",
".swt.binaries",    "http://git.eclipse.org/c/platform/eclipse.platform.swt.binaries.git/commit/?id=",
".team",            "http://git.eclipse.org/c/platform/eclipse.platform.team.git/commit/?id=",
],[
".text",            "http://git.eclipse.org/c/platform/eclipse.platform.text.git/commit/?id=",
".ua",              "http://git.eclipse.org/c/platform/eclipse.platform.ua.git/commit/?id=",
".ui",              "http://git.eclipse.org/c/platform/eclipse.platform.ui.git/commit/?id=",
],[
"rt.equinox.binaries", "http://git.eclipse.org/c/equinox/rt.equinox.binaries.git/commit/?id=",
"...bundles",          "http://git.eclipse.org/c/equinox/rt.equinox.bundles.git/commit/?id=",
"...framework",        "http://git.eclipse.org/c/equinox/rt.equinox.framework.git/commit/?id=",
"...p2",               "http://git.eclipse.org/c/equinox/rt.equinox.p2.git/commit/?id=",
],[
"www.eclipse.org/eclipse", "http://git.eclipse.org/c/www.eclipse.org/eclipse.git/commit/?id=",
"/news",                   "http://git.eclipse.org/c/www.eclipse.org/eclipse/news.git/commit/?id=",
"../jdt",                  "http://git.eclipse.org/c/www.eclipse.org/jdt.git/commit/?id=",
]];

// Add Products and Components to which you frequently move bugs:
var moveProducts= [ "Platform", "JDT", "PDE", "Equinox" ];
var moveComponents= [ "Core", "Debug", "Doc", "SWT", "Text", "UI" ];

// Add quick platform links ("<name>", "<hardware>", "<os>" triplets):
var platforms= [
"Win7", "PC", "Windows 7",
"Linux", "PC", "Linux",
"Mac", "PC", "Mac OS X",
];

// Add quick version links on the search page (<version> for exact version, <version*> for prefix match):
var queryVersions= [ "3.*", "4.*"];

// Add quick classifications links on the search page (<name>", ["<classification1>", "<classification2>", ...], ["<product1>", "<product2>", ...] triplets):
var queryClassifications= [
"E", ["Eclipse"], ["JDT", "PDE", "Platform"],
" & ", ["Eclipse", "RT"], ["Equinox", "JDT", "PDE", "Platform"],
"RT", ["RT"], ["Equinox"],
];

// Add quick product links on the search page ("<name>", "<Classification>", ["<product1>", "<product2>", ...] triplets):
var queryProducts= [
"EGit", "Technology", ["EGit"],
" & ", "Technology", ["EGit", "JGit"],
"JGit", "Technology", ["JGit"],
];

// Add quick component links on the search page ("<name>", ["<component1>", "<component2>", ...] pairs):
var queryComponents= [
"UI", ["UI"],
" & IDE", ["UI", "IDE"],
];

// Add tags to categorize bugs within a component:
var categories= new Array();
categories["Text"]= [
"[api]",
"[BiDi]",
"[block selection]",
"[breadcrumb]",
"[compare]",
"[content assist]",
"[correction]",
"[dnd]",
"[encoding]",
"[find/replace]",
"[formatting]",
"[Graphics]",
"[help]",
"[hovering]",
"[implementation]",
"[javadoc]",
"[key binding]",
"[language family]",
"[linked mode]",
"[navigation]",
"[painting]",
"[preferences]",
"[printing]",
"[projection]",
"[quick diff]",
"[RCP]",
"[reconciling]",
"[rulers]",
"[save actions]",
"[spell checking]",
"[syntax highlighting]",
"[templates]",
"[templates view]",
"[typing]",
"[validateEdit]",
"[wording]",
];
categories["Text"].url= "http://www.eclipse.org/eclipse/platform-text/development/bug-annotation.htm";

categories["JDT"]= [
"[17]",
"[16]",
"[15]",
"[14]",
"[13]",
"[12]",
"[11]",
"[10]",
"[9]",
"[1.8]",
"[1.7]",
"[5.0]",
"[actions]",
"[api]",
"[ast rewrite]",
"[BiDi]",
"[browsing]",
"[build path]",
"[call hierarchy]",
"[ccp]",
"[change method signature]",
"[clean up]",
"[code mining]",
"[code style]",
"[code templates]",
"[common navigator]",
"[compare]",
"[convert anonymous]",
"[convert local]",
"[create on paste]",
"[dnd]",
"[encapsulate field]",
"[expand selection]",
"[expressions]",
"[extract constant]",
"[extract interface]",
"[extract local]",
"[extract method]",
"[extract superclass]",
"[generalize type]",
"[generate constructor]",
"[generate delegate]",
"[getter setter]",
"[Graphics]",
"[hashcode/equals]",
"[imports on paste]",
"[infer type arguments]",
"[inline]",
"[introduce factory]",
"[introduce indirection]",
"[introduce parameter]",
"[jar exporter]",
"[javadoc wizard]",
"[JUnit]",
"[JUnit 5]",
"[ltk]",
"[mark occurrence]",
"[migrate jar]",
"[move member type]",
"[move method]",
"[move static members]",
"[nls tooling]",
"[open type]",
"[organize imports]",
"[override method]",
"[package explorer]",
"[plan item]",
"[preferences]",
"[pull up]",
"[push down]",
"[quick assist]",
"[quick fix]",
"[refactoring]",
"[rename]",
"[render]",
"[reorg]",
"[search]",
"[surround with try/catch]",
"[toString]",
"[type hierarchy]",
"[type wizards]",
"[use supertype]",
"[working sets]",
];
categories["JDT"].url= "http://www.eclipse.org/jdt/ui/doc/bug-annotation.php";

var assignToSymbol = "&#x261A;"; //BLACK LEFT POINTING INDEX
//var assignToSymbol = "&#x25C1;"; //White triangle left
//var assignToSymbol = "&#x25C0;"; //Black triangle left
//var assignToSymbol = "&#x2318;"; //PLACE OF INTEREST SIGN
//var assignToSymbol = ":=";
//var assignToSymbol = "&#x21b0;"; //Upwards Arrow With Tip Leftwards
//var assignToSymbol = "&#x270D;"; //WRITING HAND
//var assignToSymbol = "&#x270E;"; //LOWER RIGHT PENCIL
//var assignToSymbol = "&#x1f4bb;"; //Computer
//var assignToSymbol = "&#x21F1;"; //North west arrow to corner
//var assignToSymbol = "&#x25C6;"; //Black diamond
//var assignToSymbol = "&#x1f448;"; //Left white hand pointing index (not available on Ubuntu up to 14.04)
//	// not supported:
//var assignToSymbol = "&#x23FA;"; //Black Circle for Record
//var assignToSymbol = "&#x1F844;"; //Leftwards Heavy Arrow
//var assignToSymbol = "&#x1F87C;"; //Wide-Headed North West Heavy Barb Arrow
//var assignToSymbol = "&#x1F884;"; //Wide-Headed North West Very Heavy Barb Arrow

var searchSymbol = "&#x1F50E;"; //RIGHT-POINTING MAGNIFYING GLASS
// Fix bad "emoticon" icon in FF 50:
//  https://bugzilla.mozilla.org/show_bug.cgi?id=1231701 Use EmojiOne by default
//  https://bugzilla.mozilla.org/show_bug.cgi?id=1321586 How to go back to previous emoji set 
var searchSymbolStyle = "font-family: Segoe UI Emoji, Segoe UI Symbol, sans-serif;"

// Various CSS fixes:
var css =
	// Fix baseline of labels:
	      ".field_label { padding-top: .25em; padding-bottom: .3em; }\n"
	// Fix colors in title:
	    + "#titles a { color: #039 ! important; }\n"
	    + "#titles a:visited { color: #636 ! important; }\n"
	    + "#titles a:hover { color: #333 ! important; }\n"
	    + "#titles a:active { color: #000 ! important; }\n"
	    + "#titles { background-color: #C0C0C0; color: #000000; }\n"
	// Decrease height of title:
	    + "#titles { padding-top: 0.3em; padding-bottom: 0.3em; }\n"
	    + "#titles span { padding-top: 0em ! important; padding-bottom: 0em ! important; }\n"
	// Fix color of comment number:
	    + ".bz_comment_number { color: #65379c; }\n"
	// Fix bg color of enhancements in bug lists, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=331415 :
	    + ".bz_enhancement { background-color: #FFFFFF ! important; }\n"
	    + ".bz_row_odd { background-color: #F7F7F7 ! important; }\n"
	    
	// Don't wrap headers in bug lists, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=333392#c4 :
	    + "tr.bz_buglist_header th a { white-space: nowrap; }\n"
	// Remove disgusting underlines:
	    + "td.bz_short_desc_column a { text-decoration: none; }\n"
	    + "td.bz_short_desc_column a:hover { text-decoration: underline; }\n"
	// Highlight row background on hover:
	//    + "tr.bz_bugitem:hover { background-color: #CCCCFF; ! important }" // doesnt work, since other rules are more important...
	
	// Fix attachments table width:
	    + "#attachment_table { width: auto ! important; }\n"
	// Make "Show Obsolete" more prominent:
	    + ".bz_attach_view_hide { font-weight: bold ! important; color: red ! important; }\n"
	// Always show vertical scroll bar for Description field (gives proper wrapping-preview for short comments):
	    + "#comment { overflow-y:scroll; }\n"
	// Render <button> like <input>:
	    + "button { font-family: Verdana, sans-serif; font-size: small; }\n"
	// Make auto-complete drop-downs look like drop-downs:
	    + ".yui-ac-content { box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.8); }\n"
	// Don't fill whole line with email field on bug page (Bugzilla sets to 100% which makes quick links wrap):
	    + ".bz_userfield { width: 300px; }\n"
	    
	// Search field dimensions:
	    + ".search_field_grid select { height: 19ex ! important; width: 12em ! important; }\n"
	    + ".search_field_grid { margin-top: 0em; }\n"
	    + ".search_email_fields { width: 365px; }\n"
	    + "#field_label_short_desc { width: auto; }\n"
	// Don't waste another line for Search > Bugs numbered:
	    + "#bug_id_container .field_help { display:inline; }\n"
	
	// Don't show "Add Me to the CC List" button in "Possible Duplicates" on enter_bug.cgi:
	    + ".yui-dt-col-update_token { display: none; }\n"
	
	// De-colorize CLA flags until hovered, and fix baseline: (partially fixed via bug 498088 comment 14)
	    + ".cla_dec { filter: sepia(1); opacity: 0.33; vertical-align: bottom; }\n"
	    + ".cla_dec:hover { filter: none; opacity: 1.0; }\n"
	
	// "See Also" list: Avoid jagged "Remove" checkboxes and move them out of the way
	    + "#field_container_see_also ul li:hover { background-color:#F4F4F4 }\n"
	    + "#field_container_see_also ul li:hover label { background-color:#F4F4F4 }\n"
	    + "#field_container_see_also ul li label { position:absolute; right:16px; background-color:white }\n"
	
	// CSS for "toggle wide comments"
	    + ".wide { width: 100%; }\n"
	
	// Fix to hide horizontal scroll bar in quoted comments	
		+ ".bz_comment_text span.quote { overflow: visible; }\n"

	// Fix font of <select> elements:
	//     Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1123654 / https://bugzilla.mozilla.org/show_bug.cgi?id=1194055
	//     Firefox 40 changed the default font for <select> to the OS default font ("Tahoma" for me), but not using the OS default font size.
	//     Firefox <= 39 used "MS Sans Serif". Tahoma 10 is very ugly. Let's just inherit the page font:
		+ "select { font-family: inherit; }\n"
	
	// Fix for "See Also" bug references with huge unbreakable summary (bug 511841 referring to bug 511743):
		+ ".bug_urls { max-width: 45em; overflow-wrap: break-word; }\n"

	;

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill for Chromium 37 on Ubuntu 12.04:
if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position){
      position = position || 0;
      return this.substr(position, searchString.length) === searchString;
  };
}

// Features like short bug links (https://bugs.eclipse.org/123456), quick links for product, component, target milestone, etc. only
// make sense in the main Eclipse Bugzilla install. Disable them in other Bugzillas, where the rest of the script still works fine.
var isBugsEclipseOrg= location.href.startsWith("https://bugs.eclipse.org/bugs/");
	
// --- /Configurable options ------------------------------------------

// Broken by Greasemonkey 4:
//if (typeof GM_getResourceText !== "undefined") { // GM_getResourceText is not available in Google Chrome, so let's go with the defaults.
//	var config = GM_getResourceText("config");
//	eval(config);
//}

//----------- Functions:
function hideElem(id) {
    var elem= document.getElementById(id);
    if (elem) {
        elem.setAttribute("class", "bz_default_hidden");
    }
    return elem;
}

function showElem(id) {
    var elem= document.getElementById(id);
    if (elem) {
        elem.removeAttribute("class");
    }
    return elem;
}

function fixCheckboxField(containerId, inputId, labelText) {
	hideElem(containerId);
	var inputIdElem= showElem(inputId);
	if (inputIdElem) {
		inputIdElem.removeChild(inputIdElem.getElementsByTagName("br")[0]);
		inputIdElem.getElementsByTagName("label")[0].textContent= labelText;
		inputIdElem.firstElementChild.setAttribute("style", "margin-right: 1em");
	}
}

function addLink(name, href, parentElem, tooltip, separator) {
// console.debug(name + "," + href + "," + tooltip + "," + separator);
    var linkElem= document.createElement("a");
    linkElem.href= href;
    linkElem.innerHTML= name;
    if (tooltip) {
        linkElem.title= tooltip;
    }
    if (parentElem.hasChildNodes()) {
        if (separator == false) {
            //nop
        } else if (typeof separator == "string") {
            parentElem.appendChild(document.createTextNode(separator));
        } else {
            parentElem.appendChild(document.createTextNode(" | "));
        }
    }
    parentElem.appendChild(linkElem);
    return linkElem;
}

function addMultiLink(name, onClick, onModifierClick, parentElem, tooltip, separator) {
    var linkElem= document.createElement("a");
    var href= 'javascript:'
            + 'var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;'
            + 'if (modClick) {'
            +   onModifierClick
            + '} else {'
            +   onClick
            + '}'
            + 'return false;';
    linkElem.setAttribute("onmouseup", href);
    linkElem.setAttribute("onclick", "return false;"); // blocks Ctrl+Click from opening a new tab (but not middle-click)
    linkElem.href= "javascript:void('Modifier+Click to toggle')";
    linkElem.innerHTML= name;
    if (tooltip) {
        linkElem.title= tooltip;
    }
    if (parentElem.hasChildNodes() && !(separator == false)) {
        parentElem.appendChild(document.createTextNode(" | "));
    }
    parentElem.appendChild(linkElem);
}

function addStatusLink(name, status, resolution, parentElem) {
    var href= 'javascript:document.getElementById("bug_status").value="' + status + '";';
    href += 'showHideStatusItems("",["",""]);';
    if (resolution) {
        href += 'document.getElementById("resolution").value="' + resolution + '";';
    }
    href += 'document.getElementById("assigned_to").focus();'
            + 'document.getElementById("assigned_to").select();'
            + 'void(0);';
    addLink(name, href, parentElem);
}

var addOldAssigneeAsCcScript=
              'var assignee= document.getElementById("assigned_to").value;'
            + 'var newccElem= document.getElementById("newcc");'
            + 'if (assignee.search(/(?:inbox|triaged)@eclipse.org/i) == -1' // don't copy inbox
            + '      && assignee.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)'   // don't copy incomplete addresses
            + '      && !newccElem.value.includes(assignee)) {' // don't copy if already there
            + '  newccElem.value= assignee + ", " + newccElem.value;'
            + '  newccElem.focus();'
            + '  newccElem.selectionStart= 0;'
            + '  newccElem.selectionEnd= assignee.length + 2;'
            + '}';

function getAssigneeLinkScript(email) {
    return 'javascript:'
            + addOldAssigneeAsCcScript
            + 'assignTo("' + email + '");'
            + 'void(0);';
}

function addAssigneeLink(name, email, parentElem) {
	var href= getAssigneeLinkScript(email);
    addLink(name, href, parentElem, email);
}

function addCcLink(name, email, parentElem, fieldName) {
    var href= 'javascript:document.getElementById("' + fieldName + '").value="' + email + ', " + document.getElementById("' + fieldName + '").value;'
            + 'document.getElementById("' + fieldName + '").focus();'
            + 'document.getElementById("' + fieldName + '").selectionStart= 0;'
            + 'document.getElementById("' + fieldName + '").selectionEnd= ' + (email.length + 2) + ';'
            + 'void(0);';
    addLink(name, href, parentElem, email);
}

function addRequesteeLink(name, email, parentElem, fieldId) {
    var href= 'javascript:document.getElementById("' + fieldId + '").value="' + email + '";'
            + 'document.getElementById("' + fieldId + '").focus();'
            + 'void(0);';
    addLink(name, href, parentElem, email);
}

function addProductLink(name, parentElem) {
    var href= 'javascript:'
			+ addOldAssigneeAsCcScript
            + 'document.getElementById("product").value="' + name + '";'
            + 'document.getElementById("set_default_assignee").checked= true;'
            + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";'
            + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "bold");'
            + 'document.getElementById("product").focus();'
            + 'void(0);';
    addLink(name, href, parentElem);
}

function addComponentLink(name, parentElem) {
    var href= 'javascript:'
			+ addOldAssigneeAsCcScript
            + 'document.getElementById("component").value="' + name + '";'
            + 'document.getElementById("set_default_assignee").checked= true;'
            + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "bold");'
            + 'document.getElementById("component").focus();'
            + 'void(0);';
    addLink(name, href, parentElem);
}

function addPlatformLink(parentElem, name, hardware, os) {
    var href= 'javascript:document.getElementById("rep_platform").value="' + hardware + '";'
            + 'document.getElementById("op_sys").value="' + os + '";'
            + 'void(0);';
    addLink(name, href, parentElem);
}

function addSearch_email_fieldsLinks(emailElemName, myMail) {
	var emailElem= document.getElementById(emailElemName);
	if (emailElem) {
	    emailElem.setAttribute("style", "width: 100%");
	    var emailtypeElems= emailElem.parentNode.getElementsByTagName("select");
	    if (!(emailtypeElems && emailtypeElems[0])) { // intermediate <div id="email1_autocomplete" class="yui-ac">
	        emailtypeElems= emailElem.parentNode.parentNode.getElementsByTagName("select");
	        emailElem.parentNode.setAttribute("style", "width: 100%");
	    }
	    if (emailtypeElems && emailtypeElems[0]) {
	        var emailtypeElem= emailtypeElems[0];
	        
			var sp= document.createElement("span");
			emailtypeElem.parentNode.insertBefore(sp, emailtypeElem.nextElementSibling);
			if (myMail) {
		        addEmailLink("me", myMail, emailElemName, sp);
			}
		    for (var i= 0; i < ccs.length; i= i+2) {
		        addEmailLink(ccs[i], ccs[i + 1], emailElemName, sp);
		    }
			emailtypeElem.parentNode.insertBefore(document.createElement("br"), emailtypeElem.nextElementSibling.nextElementSibling);
	        
	    }
		
		// Add "None" and "All" links after "Any of:" labels:
		var sp= document.createElement("span");
		sp.style.marginLeft= ".5em";
		emailElem.parentNode.insertBefore(sp, emailElem.parentNode.firstElementChild);
		var noneHref= 'javascript:'
					+ 'var emailElem= document.getElementById("' + emailElemName + '");'
					+ 'var allInputs= emailElem.parentNode.parentNode.getElementsByTagName("input");'
					+ 'for (var i= 0; i < allInputs.length; i++) {'
					+ '  var inputElem= allInputs[i];'
					+ '  if (inputElem.type == "checkbox") {'
					+ '    inputElem.checked= false;'
					+ '  }'
					+ '}'
					+ 'void(0);';
		addLink("&empty;", noneHref, sp, "select none", false);
		var allHref= 'javascript:'
					+ 'var emailElem= document.getElementById("' + emailElemName + '");'
					+ 'var allInputs= emailElem.parentNode.parentNode.getElementsByTagName("input");'
					+ 'for (var i= 0; i < allInputs.length; i++) {'
					+ '  var inputElem= allInputs[i];'
					+ '  if (inputElem.type == "checkbox") {'
					+ '    inputElem.checked= true;'
					+ '  }'
					+ '}'
					+ 'void(0);';
		addLink("All", allHref, sp, null, true);
	}
}

function addEmailLink(name, email, emailElemName, parentElem) {
    var href= 'javascript:document.getElementsByName("' + emailElemName + '")[0].value="' + email + '";'
            + 'document.getElementsByName("' + emailElemName + '")[0].focus();'
            + 'void(0);';
    addLink(name, href, parentElem, email);
}

function addFromDateLink(parentElem, value, name) {
    if (!name)
        name = value;
    var href= 'javascript:document.getElementById("chfieldfrom").value="' + value + '";'
            + 'document.getElementById("chfieldfrom").focus();'
            + 'void(0);';
    addLink(name, href, parentElem);
}

function addFixedInTargetLink(parentElem, target_milestone) {
    var href= 'javascript:document.getElementById("target_milestone").value="' + target_milestone + '";'
            + 'document.getElementById("bug_status").value="RESOLVED";'
            + 'document.getElementById("resolution").value="FIXED";'
            + 'showHideStatusItems("", ["",""]);'
            + 'document.getElementById("assigned_to").focus();'
            + 'document.getElementById("assigned_to").select();';
            + 'void(0);';
    addLink("(in " + target_milestone + ")", href, parentElem);
}

function addTargetLink(parentElem, milestone) {
    var onModifierClick=
              'if (!document.getElementById("assigned_to")) {'
            +   'var target_milestoneElem= document.getElementById("target_milestone");'
            +   'target_milestoneOptions= target_milestoneElem.options;'
            +   'for (var i= 0; i < target_milestoneOptions.length; i++) {'
            +     'if (target_milestoneOptions[i].text == "' + milestone + '") target_milestoneOptions[i].selected= !target_milestoneOptions[i].selected;'
            +   '}'
            + '}';

    var onClick=
              'var target_milestoneElem= document.getElementById("target_milestone");'
            + 'target_milestoneElem.value="' + milestone + '";'
            + 'target_milestoneElem.focus();';
    
    addMultiLink(milestone, onClick, onModifierClick, parentElem);
}

function createFieldLabelClearAndQuickLinkSpan(fieldLabelElem, fieldId) {
	fieldLabelElem.firstElementChild.firstElementChild.setAttribute("style", "display: inline;");
	fieldLabelElem.setAttribute("style", "text-align: left;");

	var spanElem= document.createElement("span");
//	spanElem.style.marginLeft= ".5em";
	spanElem.style.fontWeight= "normal";
	var href= 'javascript:var fieldElem= document.getElementById("' + fieldId + '");'
			+ 'fieldElem.selectedIndex= -1;'
			+ 'fieldElem.focus();'
			+ 'bz_fireEvent(fieldElem, "change");;'
			+ 'void(0);';
	addLink("&empty;", href, spanElem, "select none", false);
	spanElem.appendChild(document.createTextNode(" "));
	
	fieldLabelElem.firstElementChild.appendChild(spanElem);
	return spanElem;
}

function addQueryClassificationsLink(parentElem, classifications, products, name) {
    var href= 'javascript:var classificationElem= document.getElementById("classification");'
        + '    classificationElem.selectedIndex= -1;'
        + '    var classificationOptions= document.getElementById("classification").options;';
    
    for (var i = 0; i < classifications.length; i++) {
        href += 'for (var i = 0; i < classificationOptions.length; i++) {'
              + '    if (classificationOptions[i].text == "' + classifications[i] + '") classificationOptions[i].selected= true'
              + '}';
    }
    href += 'bz_fireEvent(classificationElem, "change");'
          + 'var productElem= document.getElementById("product");'
    if (products.length > 0) {
        href += 'productElem.value="' + products[0] + '";';
        for (var i = 0; i < products.length; i++) {
            href += 'var productOptions= productElem.options;'
                  + 'for (var i = 0; i < productOptions.length; i++) {'
                  + '    if (productOptions[i].text == "' + products[i] + '") productOptions[i].selected= true'
                  + '}';
        }
        href += 'bz_fireEvent(productElem, "change");';
    }
    href+= 'void(0);';
    addLink(name, href, parentElem, classifications, false);
}

function addQueryProductsLink(parentElem, classification, products, name) {
    var href= 'javascript:var classificationElem= document.getElementById("classification");'
            + 'classificationElem.value="' + classification + '";'
            + 'bz_fireEvent(classificationElem, "change");'
            + 'var productElem= document.getElementById("product");'
            + 'productElem.value="' + products[0] + '";';
    
    for (var i = 0; i < products.length; i++) {
        href += 'var productOptions= productElem.options;'
              + 'for (var i = 0; i < productOptions.length; i++) {'
              + '    if (productOptions[i].text == "' + products[i] + '") productOptions[i].selected= true'
              + '}';
    }
    href += 'bz_fireEvent(productElem, "change");'
            + 'void(0);';
    addLink(name, href, parentElem, products, false);
}

function addQueryComponentsLink(parentElem, components, name) {
    var href= 'javascript:document.getElementById("component").selectedIndex= -1;'
        + '    var componentOptions= document.getElementById("component").options;';
    
    for (var i = 0; i < components.length; i++) {
        href += 'for (var i = 0; i < componentOptions.length; i++) {'
              + '    if (componentOptions[i].text == "' + components[i] + '") componentOptions[i].selected= true'
              + '}';
    }
    href += 'void(0);';
    addLink(name, href, parentElem, components, false);
}

function addQueryStatusesLink(parentElem, statuses, name) {
    var onClick=
          'document.getElementById("bug_status").selectedIndex= -1;'
        + 'var bug_statusOptions= document.getElementById("bug_status").options;';
    for (var i = 0; i < statuses.length; i++) {
        onClick+=
          'for (var i = 0; i < bug_statusOptions.length; i++) {'
        + '    if (bug_statusOptions[i].text == "' + statuses[i] + '") bug_statusOptions[i].selected= true;'
        + '};';
    }
    
    var onModifierClick=
          'var bug_statusOptions= document.getElementById("bug_status").options;';
    for (var i = 0; i < statuses.length; i++) {
        onModifierClick+=
          'for (var i = 0; i < bug_statusOptions.length; i++) {'
        + '  if (bug_statusOptions[i].text == "' + statuses[i] + '") bug_statusOptions[i].selected= !bug_statusOptions[i].selected;'
        + '};';
    }
    
    addMultiLink(name, onClick, onModifierClick, parentElem, null, false);
}

function addQueryVersionsLink(parentElem, version) {
    var onClick= 'javascript:document.getElementById("version").selectedIndex= -1;'
        + '    var versionOptions= document.getElementById("version").options;'
        + 'for (var i = 0; i < versionOptions.length; i++) {';

    if (version.charAt(version.length - 1) == "*")
        onClick += 'if (versionOptions[i].text.substring(0, ' + (version.length - 2) + ') == "' + version.substring(0, version.length - 2) + '") versionOptions[i].selected= true;';
    else
        onClick += 'if (versionOptions[i].text == "' + version + '") versionOptions[i].selected= true;';

    onClick += '}'
        +'void(0);';
    
    
    var onModifierClick= 'javascript:var versionOptions= document.getElementById("version").options;'
        + 'for (var i = 0; i < versionOptions.length; i++) {';

    if (version.charAt(version.length - 1) == "*")
        onModifierClick += 'if (versionOptions[i].text.substring(0, ' + (version.length - 2) + ') == "' + version.substring(0, version.length - 2) + '") versionOptions[i].selected= !versionOptions[i].selected;';
    else
        onModifierClick += 'if (versionOptions[i].text == "' + version + '") versionOptions[i].selected= !versionOptions[i].selected;';

    onModifierClick += '}'
        +'void(0);';
        
        
    addMultiLink(version, onClick, onModifierClick, parentElem);
}

function addQueryOSLink(parentElem, oses, name) {
    var onClick=
          'document.getElementById("op_sys").selectedIndex= -1;'
        + 'var op_sysOptions= document.getElementById("op_sys").options;';
    for (var i = 0; i < oses.length; i++) {
        onClick+=
          'for (var i = 0; i < op_sysOptions.length; i++) {'
        + '    if (op_sysOptions[i].text.indexOf("' + oses[i] + '") == 0) op_sysOptions[i].selected= true;'
        + '};';
    }
    
    var onModifierClick=
          'var op_sysOptions= document.getElementById("op_sys").options;';
    for (var i = 0; i < oses.length; i++) {
        onModifierClick+=
          'for (var i = 0; i < op_sysOptions.length; i++) {'
        + '  if (op_sysOptions[i].text.indexOf("' + oses[i] + '") == 0) op_sysOptions[i].selected= !op_sysOptions[i].selected;'
        + '};';
    }
    
    addMultiLink(name, onClick, onModifierClick, parentElem, null, true);
}

function setOptionSize(elementId, size) {
    var elem= document.getElementById(elementId);
    if (elem) {
        elem.setAttribute("size", size);
    }
}

function setAccessKey(elementId, key) {
    var elem= document.getElementById(elementId);
    if (elem) {
        elem.setAttribute("accesskey", key);
    }
}

function createCategoriesChooser(component, categories) {
	var categoriesElem= document.createElement("select");
	categoriesElem.setAttribute("name", ""); // empty name => field will not be submitted with enclosing form
	categoriesElem.setAttribute("onchange", 
		"var form= document.changeform;" +
		"if (!form) { form= document.queryform; }" +
		"if (!form) { form= document.Create; }" +
		"if (this.value[0] != '[') {" +
		"    if (this.value == '-- clear categories --') {" +
		"        form.short_desc.value= form.short_desc.value.replace(/^(\\[[\\w \\.]*\\]\\s*)+/, '');" +
		"    }" +
		"    return;" +
		"}" +
		"var cat= this.value.substring(1);" +
		"var regex= /^\s*\\[([\\w \\.]*)\\]/y;" +
		"var match;" +
		"var lastEnd= 0;" +
		"while (true) {" +
		"    match= regex.exec(form.short_desc.value);" +
		"    if (match == null || match[1].localeCompare(cat, 'en', {sensitivity: \"base\"}) > 0) {" +
		"        var space= (match == null && lastEnd == 0) ? ' ' : '';" +
		"        form.short_desc.value= form.short_desc.value.substring(0, lastEnd) + this.value + space + form.short_desc.value.substring(lastEnd);" +
		"        return;" +
		"    } else {" +
		"        lastEnd= regex.lastIndex;" +
		"    }" +
		"}"
	);
	var allCategories= [
"-- " + component + " category --",
"-- clear categories --"
];
    allCategories= allCategories.concat(categories);
	for (var k= 0; k < allCategories.length; k++) {
		var newOption= document.createElement("option");
		var categoriesName= allCategories[k];
		newOption.setAttribute("value", categoriesName);
		newOption.innerHTML = categoriesName.substring(1, categoriesName.length - 1);
		categoriesElem.appendChild(newOption);
	}
	return categoriesElem;
}

function createCategoryChoosers() {
	var choosers= document.createElement("span");
	for (var component in categories) {
	    addLink(component + ":", categories[component].url, choosers);
		choosers.appendChild(document.createTextNode(" "));
	    choosers.appendChild(createCategoriesChooser(component, categories[component]));
    }
	return choosers;
}

function createCommentTemplateLinks() {
	return createCommentTemplates2Links();
/*
	// Add links to help enter a URL to a Git commit:
	var pElem= document.createElement("p");
	pElem.style.marginLeft= "1em";
	pElem.style.lineHeight= "2em";
	pElem.appendChild(document.createElement("br"));
	for (var i = 0; i < commentTemplates.length; i+= 2) {
        var aElem= document.createElement("a");
		aElem.appendChild(document.createTextNode(commentTemplates[i]));
        aElem.href='javascript:var cElem=document.getElementById("comment");'
            + 'var s= cElem.selectionStart;var e= cElem.selectionEnd;'
            + 'var url= "' + commentTemplates[i + 1] + '";'
            + 'cElem.value= cElem.value.substring(0, s) + url + cElem.value.substring(e, cElem.value.length);'
            + 'cElem.focus();cElem.selectionStart= s + url.length;cElem.selectionEnd= cElem.selectionStart;'
            + 'void(0);';
        aElem.title= "Insert comment template at caret";
		pElem.appendChild(aElem);
		pElem.appendChild(document.createElement("br"));
    }
    return pElem;
*/
}

function createCommentTemplates2Links() {
	// Add links to help enter a URL to a Git commit:
	var pElem= document.createElement("p");
	pElem.style.marginLeft= "1em";
	pElem.style.lineHeight= "2em";
	for (var i = 0; i < commentTemplates2.length; i++) {
		var commentTemplates2group= commentTemplates2[i];
		if (commentTemplates2group[0].startsWith(".")) {
			var spanElem= document.createElement("span");
			spanElem.style.marginLeft= "1em";
			pElem.appendChild(spanElem);
		}
		for (var j = 0; j < commentTemplates2group.length; j+= 2) {
			var aElem= document.createElement("a");
			aElem.appendChild(document.createTextNode(commentTemplates2group[j]));
			var ref= commentTemplates2group[j + 1];
			aElem.href= ref.replace(/commit\/\?id=$/, "log/");
			aElem.setAttribute('onclick', 'if (event.ctrlKey || event.metaKey) { return true; }'
				+ 'var cElem=document.getElementById("comment");'
				+ 'var s= cElem.selectionStart;var e= cElem.selectionEnd;'
				+ 'var url= "' + commentTemplates2group[j + 1] + '";'
				+ 'cElem.value= cElem.value.substring(0, s) + url + cElem.value.substring(e, cElem.value.length);'
				+ 'cElem.focus();cElem.selectionStart= s + url.length;cElem.selectionEnd= cElem.selectionStart;'
				+ 'return false;');
			aElem.title= "Click: Insert commit link at caret\nCtrl+/Middle-Click: Open log link in new tab";
			pElem.appendChild(aElem);
			pElem.appendChild(document.createTextNode(" "));
		}
		pElem.appendChild(document.createElement("br"));
	}
	return pElem;
}

function setCommitElemNameTitleShortcut(commitElem) {
	commitElem.setAttribute("title", window.navigator.platform.match("Mac") ? "[Command+S]" : "[Ctrl+S]");
	commitElem.innerHTML= "Sa<u>v</u>e&nbsp;Changes";
	commitElem.setAttribute("accesskey", "v");
}

function createScript(script) {
	var scriptElem= document.createElement("script");
	scriptElem.type= "text/javascript";
	scriptElem.innerHTML= script;
	return scriptElem;
}

function escapeHtml(text) {
	if (typeof text === "boolean") {
		return text;
	} if (typeof text != "string") {
		return "";
	}
	var r = {
		'&': '&amp;',
		'<': '&lt;',
		'>': '&gt;',
		'"': '&quot;',
		"'": '&#039;'
	};
	return text.replace(/[&<>"']/g, function(i) { return r[i]; });
}

function getAppendGerritStatusFunction(link) {
	return function (res) {
		var myElem= document.createElement("a");
		myElem.href= link.href;
		myElem.style.marginLeft= "1em";
		
		var jsonText= res.responseText.substr(5);
		var json= JSON.parse(jsonText);
		myElem.textContent= escapeHtml(json.status)
				+ (json.mergeable ? " (mergeable) " : " ")
				+ escapeHtml(json.project)
				+ " [" + escapeHtml(json.branch) + "]"
		;
		myElem.title=
				  "Owner: " + escapeHtml(json.owner.name) + "<" + escapeHtml(json.owner.email) + ">\n"
				+ "Updated: " + escapeHtml(json.updated) + "\n"
				+ "Branch: " + escapeHtml(json.branch) + "\n"
				+ "Change-Id: " + escapeHtml(json.change_id) + "\n"
				+ "Subject: " + escapeHtml(json.subject) + "\n"
		;
//		myElem.title+= jsonText;
		
		link.parentNode.insertBefore(myElem, link.nextSibling);
	};
}

function addSaveShortcutCtrlS(form) {
	var scriptElem= createScript(
		'document.addEventListener("keydown", function(e) {\n'
		+ '  if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey) && e.keyCode == 83) {\n'
		+ '    e.preventDefault();\n'
		+ '    document.getElementById("' + form + '").submit();\n'
		+ '  }\n'
		+ '}, false);\n'
	);
	document.getElementsByTagName("head")[0].appendChild(scriptElem);
}

//-----------

//----------- Start the real work

function main() { // GM 1.0 belches for "return" outside of function, see http://www.greasespot.net/2012/08/greasemonkey-10-release.html

console.log("Running jdtbugzilla.user.js on " + window.location + ", title: " + document.title);

// Don't run in frames or iframes:
if (window.top != window.self) {
    return;
}

var isLocalQuery = window.location.pathname.match(/\/Search%20for%20bugs\.htm/i);

// Remove Eclipse ads:
// old school:
var bannerElem= document.getElementById("banner");
if (bannerElem) {
    bannerElem.parentNode.removeChild(bannerElem);
} else {
    // for solstice (bug 437404):
    var headerElems= document.evaluate("//header[@role='banner']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0; i < headerElems.snapshotLength; i++) {
        var headerElem= headerElems.snapshotItem(i);
        headerElem.parentNode.removeChild(headerElem);
    }
}
var headerIconsElem= document.getElementById("header-icons");
if (headerIconsElem) {
    headerIconsElem.parentNode.removeChild(headerIconsElem);
}

// Identify ourselves:
var headerElem= document.getElementById("common_links");
if (!headerElem) { // Bugzilla < 5.0
	headerElem= document.getElementById("header");
}
if (headerElem && headerElem.lastElementChild) {
    var ver= "";
    if (typeof GM_info !== "undefined") {
        ver= GM_info.script.version;
    }
    console.log(ver);
	if (isLocalQuery) {
		headerElem.lastElementChild.innerHTML +=
			' <span class="separator">| </span><li>not <a href="https://bugs.eclipse.org/bugs/query.cgi">live</a>!</li>';
	} else {
		headerElem.lastElementChild.innerHTML +=
			'<span class="separator">| </span><li><a href="https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js" '
			+ 'title="Page tweaked by jdtbugzilla.user.js ' + ver + '" >Tweaked</a>!</li>';
	}
}

var headElem= document.getElementsByTagName("head")[0];
if (headElem) {
	// Various CSS fixes:
	var styleElem= document.createElement("style");
	styleElem.type= "text/css";
	styleElem.innerHTML = css;
	headElem.appendChild(styleElem);
	
	if (isLocalQuery) {
		// Set a base href to make <form method="post" action="buglist.cgi" id="queryform" ...> work in a local copy of the search page:
		var baseElem= document.createElement("base");
		baseElem.href= "http://bugs.eclipse.org/bugs/";
		headElem.appendChild(baseElem);
		return; // early return
	}
}

// Add "Hide" link to info message, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=333403
//   The "Hide" link stores the last hidden message in localStorage => Only hides this exact message in this browser.
//   To show it again, execute localStorage.clear(); in a bug page.
var messageElem= document.getElementById("message");
if (messageElem && messageElem.textContent) {
	var key= "message.suppressed";
	var msgString= JSON.stringify(messageElem.textContent);
	if (localStorage[key] == msgString) {
		messageElem.parentNode.removeChild(messageElem);
	} else {
		messageElem.appendChild(document.createTextNode(" "));
		// Don't rename hideMessageElem to hideElem. JavaScript is a "language" from hell. See function hideElem().
		var hideMessageElem= addLink("Hide", "javascript:void(0)", messageElem, "Hide this message\n\nLast hidden message: " + localStorage[key], false);
		hideMessageElem.setAttribute("onclick" , "localStorage['" + key + "']='" + msgString + "';this.parentNode.parentNode.removeChild(this.parentNode);return false;");
	}
}

// Add shortcut to set Platform to All/All:
var rep_platformElem= document.getElementById("rep_platform");
var op_sysElem= document.getElementById("op_sys");
if (rep_platformElem && op_sysElem && ! window.location.pathname.match(/.*query\.cgi/)) {
	var platformLinkSpanElem= document.createElement("span");
	platformLinkSpanElem.style.marginLeft= "1em";
	op_sysElem.parentNode.insertBefore(platformLinkSpanElem, op_sysElem.nextSibling);
	
    var href= 'javascript:document.getElementById("rep_platform").value="All";'
            + 'document.getElementById("op_sys").value="All";'
            + 'void(0);';
    addLink("All", href, platformLinkSpanElem);
    
	for (var i= 0; i < platforms.length; i+= 3) {
		addPlatformLink(platformLinkSpanElem, platforms[i], platforms[i+1], platforms[i+2]);
	}
}

var noWrapLinesRegex = /^(\s*(?:\[\w+\]\s*)?(?:at \S+(?:\(Native Method\)|\(Unknown Source\))?|- locked <0x[0-9a-fA-F]+> \(a \S+))$/m;

// Fix the "Comment" field size (too small on the "Attachment Details" page,
//     default cols=80 is too narrow for proper wrapping preview):
var commentElem= document.getElementById("comment");
if (commentElem) {
    commentElem.setAttribute("rows", "10");
    commentElem.setAttribute("cols", "81");
    commentElem.setAttribute("onFocus", "this.rows=25");

	// Fix line wrapping for links in reply comments, see https://bugzilla.mozilla.org/show_bug.cgi?id=810801 :
	
	// This script is a copy of the original wrapReplyText function in comments.js
	// (with string delimiters regularized to ' , \ replaced by \\, and surrounded with '+ "' ... '\n"'):
	
	// TODO: should not wrap at the space between "bug 1234".
	// Fix idea: instead of cutting hard, use a regex like this:
	// ^.{0,80}\s(?<![Bb]ug\s)(?!\s*\d+)
	// Note that this still wouldn't completely fix "bug 1234 comment 1".
	var script= ""
+ "function wrapReplyText(text) {\n"
+ "    // This is -3 to account for '\\n> '\n"
+ "    var maxCol = BUGZILLA.constant.COMMENT_COLS - 3;\n"
+ "    var text_lines = text.replace(/[\\s\\n]+$/, '').split('\\n');\n"
+ "    var wrapped_lines = new Array();\n"
+ "\n"
+ "    for (var i = 0; i < text_lines.length; i++) {\n"
+ "        var paragraph = text_lines[i];\n"
+ "        // Don't wrap already-quoted text.\n"
+ "        if (paragraph.indexOf('>') == 0) {\n"
+ "            wrapped_lines.push('> ' + paragraph);\n"
+ "            continue;\n"
+ "        }\n"
// avoid wrapping noWrapLinesRegex:
+ "        if (paragraph.match(" + noWrapLinesRegex + ")) {\n"
+ "            wrapped_lines.push('> ' + paragraph);\n"
+ "            continue;\n"
+ "        }\n"
// END avoid wrapping noWrapLinesRegex.
+ "\n"
+ "        var replace_lines = new Array();\n"
+ "        while (paragraph.length > maxCol) {\n"
+ "            var testLine = paragraph.substring(0, maxCol);\n"
+ "            var pos = testLine.search(/\\s\\S*$/);\n"
+ "\n"
+ "            if (pos < 1) {\n"
// fix:
+ "                if (paragraph.length > maxCol) {\n"
+ "                    pos = maxCol + paragraph.substring(maxCol).search(/\\s\\S*/);\n"
+ "                    if (pos == maxCol - 1) pos = paragraph.length;\n"
+ "                } else {\n"
+ "                    pos = maxCol;\n"
+ "                }\n"
//+ "                // Try to find some ASCII punctuation that's reasonable\n"
//+ "                // to break on.\n"
//+ "                var punct = '\\\\-\\\\./,!;:';\n"
//+ "                var punctRe = new RegExp('[' + punct + '][^' + punct + ']+$');\n"
//+ "                pos = testLine.search(punctRe) + 1;\n"
//+ "                // Try to find some CJK Punctuation that's reasonable\n"
//+ "                // to break on.\n"
//+ "                if (pos == 0)\n"
//+ "                    pos = testLine.search(/[\\u3000\\u3001\\u3002\\u303E\\u303F]/) + 1;\n"
//+ "                // If we can't find any break point, we simply break long\n"
//+ "                // words. This makes long, punctuation-less CJK text wrap,\n"
//+ "                // even if it wraps incorrectly.\n"
//+ "                if (pos == 0) pos = maxCol;\n"
+ "            }\n"
+ "\n"
+ "            var wrapped_line = paragraph.substring(0, pos);\n"
+ "            replace_lines.push(wrapped_line);\n"
+ "            paragraph = paragraph.substring(pos);\n"
+ "            // Strip whitespace from the start of the line\n"
+ "            paragraph = paragraph.replace(/^\\s+/, '');\n"
+ "        }\n"
+ "        replace_lines.push(paragraph);\n"
+ "        wrapped_lines.push('> ' + replace_lines.join('\\n> '));\n"
+ "    }\n"
+ "    return wrapped_lines.join('\\n') + '\\n\\n';\n"
+ "}\n"
;
	commentElem.parentNode.appendChild(createScript(script));
}

// Loop over <label>s:
var labels= document.getElementsByTagName("label");
for (var i= 0; i < labels.length; i++) {
    var labelElem= labels[i];
    var forAtt= labelElem.getAttribute("for");
	// Another Commit button on top of Additional Comments field
    if (forAtt == "comment" && labelElem.nextSibling) {
	    var commitElem= document.createElement("button");
	    commitElem.setAttribute("type", "submit");
	    commitElem.setAttribute("class", "knob-buttons");
		setCommitElemNameTitleShortcut(commitElem);
	    // Caveat: attachment.cgi is used for 3 purposes: add new, edit details, result after adding.
	    // Of course, the "comment" area is implemented differently on each page...
	    labelElem.parentNode.insertBefore(commitElem, labelElem.nextElementSibling);
	
	// Remove label as clickable area for Security_Advisories checkbox on "Verify Version, Component, Target Milestone" page:
    } else if (forAtt == "group_15") {
        labelElem.removeAttribute("for");
    
    // Add common "from" dates:
    } else if (forAtt == "chfieldfrom") {
        addFromDateLink(labelElem, "2h");
        addFromDateLink(labelElem, "1ds", "today");
        addFromDateLink(labelElem, "1d");
        addFromDateLink(labelElem, "2d");
        addFromDateLink(labelElem, "1w");
        addFromDateLink(labelElem, "1m");
        addFromDateLink(labelElem, "3m");
        addFromDateLink(labelElem, "1y");
    
    // Bug 367944: Bug fields doc doesn't describe severity any more:
    } else if (forAtt == "priority" || forAtt == "bug_severity") {
        labelElem.setAttribute("title",
              "- blocker: blocks development and/or testing work\n"
            + "- critical: crashes, loss of data, severe memory leak\n"
            + "- major: major loss of function\n"
            + "- normal: regular issue, some loss of functionality under specific circumstances\n"
            + "- minor: minor loss of function, or other problem where easy workaround is present\n"
            + "- trivial: cosmetic problem like misspelled words or misaligned text\n"
            + "- enhancement: request for enhancement");
         var field_help_linkElems= labelElem.getElementsByClassName("field_help_link");
         if (field_help_linkElems.length > 0) {
             field_help_linkElems[0].removeAttribute("title");
         }
    }
}

// Add quick links for requestee fields:
var requesteeElems= document.getElementsByClassName("requestee");
for (var i = 0; i < requesteeElems.length; i++) {
    var requesteeElem= requesteeElems[i];
    for (var j= 0; j < requestees.length; j= j+2) {
        addRequesteeLink(requestees[j], requestees[j + 1], requesteeElem.parentNode, requesteeElem.id);
    }
}

//----------- Page-specific fixes:

if (window.location.pathname.match(/.*enter_bug\.cgi/)) {
	process_enter_bug();
} else if (window.location.pathname.match(/.*query\.cgi/)) {
	process_query();
} else if (window.location.pathname.match(/.*buglist\.cgi/)) {
	process_buglist();
} else { // For all result pages:
	process_result_pages();
}


function process_enter_bug() {
    // Remove empty <td colspan="2">&nbsp;</td>, <th>&nbsp;</th>, and <td colspan="3" class="comment">We've made a guess at your...:
    var os_guess_noteElem= document.getElementById("os_guess_note");
	if (os_guess_noteElem) {
	    os_guess_noteElem.parentNode.parentNode.removeChild(os_guess_noteElem.parentNode);
	}

	// Add shortcuts to search Product:
	var field_container_productElem= document.getElementById("field_container_product");
	var productElem= document.getElementsByName("product")[0];
	if (field_container_productElem && productElem) {
		var queryLink= addLink(searchSymbol, "query.cgi"
							 + "?product=" + productElem.value
							 , field_container_productElem, "Search in this product", " | (");
		queryLink.style= searchSymbolStyle;
		addLink("1w", "buglist.cgi"
							 + "?product=" + productElem.value
							 + "&chfieldfrom=1w"
							 , field_container_productElem, "Changed in the last 7 days");
		field_container_productElem.appendChild(document.createTextNode(")"));
		
		// Add shortcuts to search Component:
		var field_label_componentElem= document.getElementById("field_label_component");
		var componentElem= document.getElementById("component");
		if (field_label_componentElem && componentElem) {
			var spanElem = document.createElement("span");
			spanElem.setAttribute("style" , "font-weight:normal;");
			
			field_label_componentElem.appendChild(spanElem);
			
			spanElem.appendChild(document.createTextNode("("));
			
			queryLink= addLink(searchSymbol, "query.cgi?product=" + productElem.value
												+ "&component=" + componentElem.value, spanElem, "Search in selected component", false);
			queryLink.setAttribute("id", "queryLink");
			queryLink.style= searchSymbolStyle;
			
			var changedLink= addLink("1w", "buglist.cgi?product=" + productElem.value
												+ "&component=" + componentElem.value
												+ "&chfieldfrom=1w", spanElem, "Changed in the last 7 days");
			changedLink.setAttribute("id", "changedLink");
			spanElem.appendChild(document.createTextNode(")"));

			componentElem.setAttribute("onchange",
				"set_assign_to();"
				
				+ "document.getElementById('queryLink').href=\"query.cgi"
				+ "?product=" + productElem.value
				+ "&component=\"+document.getElementById('component').value;"
				
				+ "document.getElementById('changedLink').href=\"buglist.cgi"
				+ "?product=" + productElem.value
				+ "&component=\"+document.getElementById('component').value+\""
				+ "&chfieldfrom=1w\";"
			);
		}
	}
	
    // Add another Commit button after Subject):
    var short_descElems= document.getElementsByName("short_desc");
    if (short_descElems.length > 0) {
	    var commitElem= document.createElement("button");
	    commitElem.setAttribute("type", "submit");
	    commitElem.setAttribute("tabindex", "99");
	    commitElem.innerHTML= "S<u>u</u>bmit Bug";
	    commitElem.setAttribute("accesskey", "u");
	    var space= document.createTextNode(" ");
	    short_descElems[0].parentNode.insertBefore(space, short_descElems[0].nextSibling);
	    short_descElems[0].parentNode.insertBefore(commitElem, space.nextSibling);
	    short_descElems[0].size= 76;
	    
		commitElem.setAttribute("title", window.navigator.platform.match("Mac") ? "[Command+S]" : "[Ctrl+S]");
		addSaveShortcutCtrlS("Create");

	    // Set initial focus:
	    short_descElems[0].focus();
	    
		var summaryTr= short_descElems[0].parentNode.parentNode;
	    
	    // Move "Possible Duplicates" after "Description":
		var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container");
		var commentElem= document.getElementById("comment");
		if (possible_duplicates_containerElem && commentElem) {
    		commentElem.parentNode.parentNode.parentNode.insertBefore(possible_duplicates_containerElem, commentElem.parentNode.parentNode.nextSibling);
			// Add links to help enter a URL to a Git commit:
//			commentElem.parentNode.setAttribute("colspan", "2");
//			var td= document.createElement("td");
//			td.appendChild(createCommentTemplateLinks());
//			commentElem.parentNode.parentNode.insertBefore(td, commentElem.parentNode.nextSibling);
		}
		
	    
//	    // Move "Possible Duplicates" before "Summary":
//		var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container");
//		if (possible_duplicates_containerElem) {
//    		summaryTr.parentNode.insertBefore(possible_duplicates_containerElem, summaryTr);
//		}
	    
//	    // Move "Possible Duplicates" to the right of the "Description":
//		var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container");
//		var commentElem= document.getElementById("comment");
//		if (possible_duplicates_containerElem && commentElem) {
//    		possible_duplicates_containerElem.setAttribute("style", "display: inline;");
//		    
//		    var tableElem= document.createElement("table");
//    		tableElem.setAttribute("style", "display: inline;");
//		    tableElem.appendChild(possible_duplicates_containerElem)
//		    
//		    possible_duplicates_containerElem.removeChild(possible_duplicates_containerElem.firstElementChild);
//		    commentElem.parentNode.removeChild(commentElem.parentNode.getElementsByTagName("br")[0]);
//    		commentElem.parentNode.appendChild(tableElem);
//		}
		
		// Add bug categories choosers:
		var tr= document.createElement("tr");
		tr.appendChild(document.createElement("th"));
		var td= document.createElement("td");
		td.setAttribute("colspan", "3");
		td.appendChild(createCategoryChoosers());
		tr.appendChild(td);
		
		summaryTr.parentNode.insertBefore(tr, summaryTr);
    }
    
	var ccElems= document.getElementsByName("cc");
	if (ccElems.length > 0) {
	    var ccElem= ccElems[0];
	    // Add shortcut cc links:
	    for (var i= 0; i < ccs.length; i= i+2) {
            addCcLink(ccs[i], ccs[i + 1], ccElem.parentNode, "cc");
        }
        // inserted cc links should not wrap:
        ccElem.parentNode.setAttribute("style", "white-space:nowrap;");
        // fix width: (default is 100%, which would make the CC links overflow into flags table)
        ccElem.setAttribute("style", "width: 300px");
	}
}


function process_query() {
	var myMail;

	// Loop over <a>s:
	var anchors= document.getElementsByTagName("a");
	for (var i= 0; i < anchors.length; i++) {
	    var aElem= anchors[i];
	    var aElemHref= aElem.getAttribute("href");
	    if (!aElemHref)
	        continue;
	        
	    if (aElemHref == "index.cgi?logout=1") {
	        myMail= aElem.nextSibling.textContent.trim();
	    }
    }
    
//    // Fix "'Edit Search' on bug list does not fill in 'Comment' field": https://bugs.eclipse.org/bugs/show_bug.cgi?id=288654
//    var longdescRegex= /.*&longdesc=([^\&]+)&.*/;
//    if (location.search.match(longdescRegex)) {
//	    var match= window.location.search.replace(longdescRegex, "$1");
//	    var longdescElem= document.getElementById("longdesc");
//	    longdescElem.value= decodeURIComponent(match);
//	}
	
//	// Use GET for search, not POST (makes queries bookmarkable, avoids "do you want to resend?" messages, may fail for complex queries):
//	var queryformElem= document.getElementsByName("queryform");
//	if (queryformElem.length > 0) {
//	    queryformElem[0].method= "get";
//	}

	// Add "Generate Report" button to Search page:
	var searchElem= document.getElementById("Search");
	if (searchElem) {
		var generateElem= document.createElement("input");
		generateElem.value= "Generate Report";
		generateElem.type= "submit";
		generateElem.style.marginLeft = "2em";
		generateElem.setAttribute("onclick", ""
			+ "var formElem= document.forms['queryform'];"
			+ "var input= document.createElement('input');"
			+ "input.type= 'hidden';"
			+ "input.name= 'x_axis_field';"
			+ "input.value= 'product';"
			+ "formElem.appendChild(input);"
			
			+ "input= document.createElement('input');"
			+ "input.type= 'hidden';"
			+ "input.name= 'y_axis_field';"
			+ "input.value= 'component';"
			+ "formElem.appendChild(input);"
			
			+ "input= document.createElement('input');"
			+ "input.type= 'hidden';"
			+ "input.name= 'query_format';"
			+ "input.value= 'report-table';"
			+ "formElem.appendChild(input);"
			
			+ "input= document.createElement('input');"
			+ "input.type= 'hidden';"
			+ "input.name= 'format';"
			+ "input.value= 'table';"
			+ "formElem.appendChild(input);"
			
			+ "input= document.createElement('input');"
			+ "input.type= 'hidden';"
			+ "input.name= 'action';"
			+ "input.value= 'wrap';"
			+ "formElem.appendChild(input);"
			
			+ "formElem.action= 'report.cgi';"
			+ "return true;");
		
		searchElem.parentNode.appendChild(generateElem);
	}

	
    // Remove spam headers:
    var search_helpElem= document.getElementById("search_help");
    if (search_helpElem) {
        search_helpElem.parentNode.removeChild(search_helpElem);
    }
    var titlesElem= document.getElementById("titles");
    if (titlesElem) {
        titlesElem.parentNode.removeChild(titlesElem);
    }
    
    // Reduce tabs size:
    var tabsElems= document.getElementsByClassName("tabs");
    if (tabsElems.length > 0) {
        tabsElems[0].setAttribute("cellpadding", "3");
    }
    
    // Remove section headers and expand contents:
    var bz_section_titleElems= document.evaluate("//div[@class='bz_section_title']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0; i < bz_section_titleElems.snapshotLength; i++) {
        var bz_section_titleElem= bz_section_titleElems.snapshotItem(i);
        bz_section_titleElem.parentNode.replaceChild(document.createElement("hr"), bz_section_titleElem);
    }
    
    var bz_search_sectionElems= document.evaluate("//div[contains(@class,'bz_search_section')] | //ul[contains(@class,'bz_search_section')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0; i < bz_search_sectionElems.snapshotLength; i++) {
        var bz_search_sectionElem= bz_search_sectionElems.snapshotItem(i);
        bz_search_sectionElem.setAttribute("style", "display: block ! important;");
    }
    
	// Add bug categories choosers:
	var Search_topElem= document.getElementById("Search_top");
	if (Search_topElem) {
	    var choosers= createCategoryChoosers();
	    choosers.style.paddingLeft = "1em";
	    Search_topElem.parentNode.insertBefore(choosers, Search_topElem.nextElementSibling);
	}

	// Add target milestone links:
	var targetElem= document.getElementById("field_label_target_milestone");
	if (targetElem && isBugsEclipseOrg) {
//		targetElem.firstElementChild.firstElementChild.textContent = "Target M:";
		var targetLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(targetElem, "target_milestone");
		for (var i= 0; i < target_milestones.length; i++) {
			addTargetLink(targetLinkSpanElem, target_milestones[i]);
		}
		addTargetLink(targetLinkSpanElem, "---");
		
		var sep= targetLinkSpanElem.childNodes[6];
		if (sep) {
		    targetLinkSpanElem.replaceChild(document.createElement("br"), sep);
		}
	}
	
	// Add quick classification links:
	var classificationElem= document.getElementById("field_label_classification");
	if (classificationElem && isBugsEclipseOrg) {
		var classificationLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(classificationElem, "classification");
		for (var i= 0; i < queryClassifications.length; i= i+3) {
            addQueryClassificationsLink(classificationLinkSpanElem, queryClassifications[i+1], queryClassifications[i+2], queryClassifications[i]);
        }
	}
	
	// Add quick product links:
	var productElem= document.getElementById("field_label_product");
	if (productElem && isBugsEclipseOrg) {
		var productLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(productElem, "product");
		for (var i= 0; i < queryProducts.length; i= i+3) {
            addQueryProductsLink(productLinkSpanElem, queryProducts[i+1], queryProducts[i+2], queryProducts[i]);
        }
	}
	
	// Add quick component links:
	var componentElem= document.getElementById("field_label_component");
	if (componentElem && isBugsEclipseOrg) {
		var componentLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(componentElem, "component");
		for (var i= 0; i < queryComponents.length; i= i+2) {
            addQueryComponentsLink(componentLinkSpanElem, queryComponents[i+1], queryComponents[i]);
        }
	}
	
	// Add open/closed links:
	var bug_statusElem= document.getElementById("field_label_bug_status");
	if (bug_statusElem) {
		var statusLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(bug_statusElem, "bug_status");
		addQueryStatusesLink(statusLinkSpanElem, new Array("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"), " Open");
		statusLinkSpanElem.appendChild(document.createTextNode(" "));
		addQueryStatusesLink(statusLinkSpanElem, new Array("RESOLVED", "VERIFIED", "CLOSED"), "Closed");
	}
	
	// Add "Resolution: not FIXED" link:
	var resolutionElem= document.getElementById("field_label_resolution");
	if (resolutionElem) {
		var resolutionLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(resolutionElem, "resolution");
		
	    var href= 'javascript:'
	          + '    var resolutionOptions= document.getElementById("resolution").options;'
              + 'for (var i = 0; i < resolutionOptions.length; i++) {'
              + '    if (resolutionOptions[i].text != "FIXED") resolutionOptions[i].selected= true;'
              + '};'
	          + 'void(0);';
	    addLink("&not;FIXED", href, resolutionLinkSpanElem, null, false);
	}
	
	// Add quick links to detailed bug info fields:
	var versionElem= document.getElementById("field_label_version");
	if (versionElem) {
		var versionLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(versionElem, "version");
		for (var i= 0; i < queryVersions.length; i++) {
    		addQueryVersionsLink(versionLinkSpanElem, queryVersions[i]);
        }
    }
	var bug_severityElem= document.getElementById("field_label_bug_severity");
	if (bug_severityElem) {
		createFieldLabelClearAndQuickLinkSpan(bug_severityElem, "bug_severity");
    }
	var priorityElem= document.getElementById("field_label_priority");
	if (priorityElem) {
		createFieldLabelClearAndQuickLinkSpan(priorityElem, "priority");
    }
	var rep_platformElem= document.getElementById("field_label_rep_platform");
	if (rep_platformElem) {
		createFieldLabelClearAndQuickLinkSpan(rep_platformElem, "rep_platform");
    }
	var op_sysElem= document.getElementById("field_label_op_sys");
	if (op_sysElem) {
		var op_sysLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(op_sysElem, "op_sys");
		addQueryOSLink(op_sysLinkSpanElem, new Array("Mac OS X"), "Mac");
		addQueryOSLink(op_sysLinkSpanElem, new Array("AIX", "HP-UX", "Linux", "Solaris", "Unix"), "*nix");
		addQueryOSLink(op_sysLinkSpanElem, new Array("Windows"), "W");
    }
	
	
	// Increase option list sizes to avoid scrolling (these are probably not used any more):
	setOptionSize("classification", 6);
	setOptionSize("product", 6);
	setOptionSize("component", 6);
	setOptionSize("version", 6);
	setOptionSize("target_milestone", 6);
	
	setOptionSize("bug_status", 8);
	setOptionSize("resolution", 8);
	setOptionSize("bug_severity", 8);
	setOptionSize("priority", 8);
	setOptionSize("rep_platform", 8);
	setOptionSize("op_sys", 8);
	
	setOptionSize("chfield", 5);
	
    // Add shortcut email links:
	addSearch_email_fieldsLinks("email1", myMail);
	addSearch_email_fieldsLinks("email2", myMail);
	addSearch_email_fieldsLinks("email3", myMail);

    // Fix layout of date fields:
    var history_filter_sectionElem= document.getElementById("history_filter_section");
    if (history_filter_sectionElem) {
        history_filter_sectionElem.lastElementChild.setAttribute("style", "width: auto");
    }
    
    // Fix label height:
    styleElem.innerHTML= styleElem.innerHTML
        + ".field_label { line-height: 1.3em ! important; }\n"
        + ".search_field_row { line-height: auto ! important; }\n";

	// Add accesskeys:
	// ("c" is broken in Bugzilla, see https://bugzilla.mozilla.org/show_bug.cgi?id=1299141 )
	setAccessKey("target_milestone", "g");
	setAccessKey("chfieldfrom", "b");
	setAccessKey("Search_top", "q");
	
	// Add tooltip for shortcut for "Search" buttons:
	if (searchElem) {
		searchElem.setAttribute("title", "[Accesskey+Q]");
	}
	var Search_topElem= document.getElementById("Search_top");
	if (Search_topElem) {
		Search_topElem.setAttribute("title", "[Accesskey+Q]");
		//addSaveShortcutCtrlS("queryform");
	}
}
	

function process_buglist() {
    // Add access key to Edit Query:
    var bz_query_editElems= document.getElementsByClassName("bz_query_edit");
	if (bz_query_editElems.length > 0) {
	    var bz_query_editElem= bz_query_editElems[0];
	    var aElem= bz_query_editElem.childNodes[1];
		aElem.setAttribute("accesskey", "e");
		aElem.firstChild.replaceData(0, 1, "");
		var mnemonic= document.createElement("b");
		mnemonic.appendChild(document.createTextNode("E"));
		aElem.insertBefore(mnemonic, aElem.firstChild);
		
	}

	// Add target milestone links (for "Change Several Bugs at Once"):
	var targetElem= document.getElementById("target_milestone");
	if (targetElem && isBugsEclipseOrg) {
		var targetLinkSpanElem= document.createElement("span");
		targetLinkSpanElem.style.marginLeft= ".5em";
		targetLinkSpanElem.style.fontWeight= "normal";
		targetElem.parentNode.appendChild(targetLinkSpanElem);
		for (var i= 0; i < target_milestones.length; i++) {
			addTargetLink(targetLinkSpanElem, target_milestones[i]);
		}
		addTargetLink(targetLinkSpanElem, "---");
	}
    
    // Turn bug link into short link:
    if (isBugsEclipseOrg) {
        var bz_id_columnElems= document.getElementsByClassName("bz_id_column");
        for (var i = 0; i < bz_id_columnElems.length; i++) {
            var aElem= bz_id_columnElems[i].firstElementChild;
            aElem.href= "../" + aElem.textContent;
        }
    }
    
    // Add "Create buglist" functionality in "Change Several Bugs at Once" form:
    var lastElem= document.getElementById("check_all");
    if (lastElem) {
        var spaceElem= document.createTextNode("\n");
        lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling);
        lastElem= spaceElem;
        
        var invertElem= document.createElement("input");
        invertElem.type= "button";
        invertElem.value= "Invert";
        invertElem.name= "check_invert";
        invertElem.setAttribute("onclick", "javascript:"
            + "var inputs= document.getElementsByTagName('input');\n"
            + "for (var i= 0; i < inputs.length; i++) {\n"
            + "    if (inputs[i].type === 'checkbox' && inputs[i].name.substr(0, 3) == 'id_') {\n"
            + "        inputs[i].checked= !inputs[i].checked == true;\n"
            + "    }\n"
            + "}\n"
            + "void(0);");
        lastElem.parentNode.insertBefore(invertElem, lastElem.nextSibling);
        lastElem= invertElem;
        
        spaceElem= document.createTextNode("\n");
        lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling);
        lastElem= spaceElem;
        
        var updateElem= document.createElement("a");
        updateElem.innerHTML= "Update buglist link (checked bugs) -&gt;";
        updateElem.href= "javascript:void(0);";
        updateElem.setAttribute("onclick", "updateBuglistLink();");
        
        lastElem.parentNode.insertBefore(updateElem, lastElem.nextSibling);
        lastElem= updateElem;
        
        spaceElem= document.createTextNode("\n");
        lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling);
        lastElem= spaceElem;
        
        var buglistLinkElem= document.createElement("input");
        buglistLinkElem.type= "text";
        buglistLinkElem.size= 100;
        buglistLinkElem.style= "width: auto";
        buglistLinkElem.id= "buglistLink";
        
        lastElem.parentNode.insertBefore(buglistLinkElem, lastElem.nextSibling);
        
		var scriptElem= createScript(
		    "function updateBuglistLink(init) {\n"
	            + "var inputs= document.getElementsByTagName('input');\n"
	            + "var bugs= '';\n"
	            + "for (var i= 0; i < inputs.length; i++) {\n"
	            + "  var input= inputs[i];\n"
	            + "  if (input.type == 'checkbox' && input.name.substr(0, 3) == 'id_' && (init || input.checked)) {\n"
	            + "    bugs += input.name.substr(3) + ',';\n"
	            + "  }\n"
	            + "}\n"
	            + "var buglistLinkElem= document.getElementById('buglistLink');\n"
	            + "buglistLinkElem.value= 'https://bugs.eclipse.org/bugs/buglist.cgi?bug_id=' + bugs;\n"
	            + "if (!init) {\n"
	            + "  buglistLinkElem.select();\n"
	            + "}\n"
	            + "void(0);\n"
		    + "}\n"
		    + "updateBuglistLink(true);\n"
		);
        lastElem.parentNode.appendChild(scriptElem);
    }
}

function process_result_pages() {
	var bugId;
	var myMail;

	// Rewrite header for direct copy/paste as CVS comment ("Bug xxx: Summary"):
	var titleElem= document.getElementById("title");
	if (titleElem) {
	    var changeformElem= document.getElementById("changeform");
		if (changeformElem) {
		    bugId= changeformElem.elements["id"].value;
		    var short_desc_nonedit_displayElem= document.getElementById("short_desc_nonedit_display");
		    if (short_desc_nonedit_displayElem) {
                // Render bug link as short link:
			    var bugLink= document.createElement("a");
			    bugLink.href= (isBugsEclipseOrg ? "../" : "show_bug.cgi?id=") + bugId;
			    bugLink.appendChild(document.createTextNode("Bug " + bugId));
			    
			    var bugElem= document.createElement("p");
			    bugElem.appendChild(bugLink);
			    bugElem.appendChild(document.createTextNode(": " + short_desc_nonedit_displayElem.textContent));

				if (titleElem.firstElementChild) { // Bugzilla < 5.0
					titleElem.replaceChild(bugElem, titleElem.firstElementChild);
				} else {
					titleElem.replaceChild(bugElem, titleElem.firstChild);
				}
				
				// emergency workaround for Bug 508888: Bugzilla page rendering is broken
				if (headElem) {
					var titleTag= document.getElementsByTagName("title")[0];
					if (titleTag && titleTag.textContent == "") {
						titleTag.textContent= "Bug " + bugId + " - " + short_desc_nonedit_displayElem.textContent;
					}
				}

			    
			    // Hack to stitch header to top, so that it is also visible when scrolled down:
			    //     Better solution would be to use absolute positioning and only have a scroll-y on the bugzilla-body div:
			    //     http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
			    var tableElem= document.getElementById("titles");
			    tableElem.setAttribute("style", "position:fixed; top:0px; left:0px; right:0px; z-index:1000;");
			    // leave some space behind the fixed table:
			    var spacerElem= document.createElement("div");
			    spacerElem.appendChild(document.createTextNode("..."));
			    tableElem.parentNode.insertBefore(spacerElem, tableElem);
			    
			    var subtitleElem= document.getElementById("subtitle");
			    if (subtitleElem) {
				    subtitleElem.textContent= "";
				    
					// Add a convenient Commit button to the fixed header:
					var commitElem= document.createElement("button");
					commitElem.setAttribute("type", "submit");
					commitElem.setAttribute("class", "knob-buttons");
					commitElem.setAttribute("style", "margin: -3px 14px");
					commitElem.setAttribute("form", "changeform");
					setCommitElemNameTitleShortcut(commitElem);
					var tdElem= document.createElement("td");
					tdElem.appendChild(commitElem);
					subtitleElem.parentNode.insertBefore(tdElem, null);
				}
				
				// Fix vscroll when jumping to hash locations (accommodate for fixed header table):
				var bodyElem= document.getElementsByTagName("body")[0];
				if (headElem && bodyElem) {
					var scriptElem= createScript(
					    "function locationHashChanged() {\n"
					    + "  var off= - document.getElementById('titles').offsetHeight - 3;\n"
					    + "  console.log(off);\n"
					    + "  window.scrollBy(0, off);\n"
					    + "}\n"
					);
					headElem.appendChild(scriptElem);
					bodyElem.setAttribute("onhashchange", "locationHashChanged();");
					//TODO: Maybe the pageshow event would also work if the location hash did not change (e.g. on second click to hash link):
					// http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#event-pageshow
				}
			}
			
			// Add bug categories choosers:
			var short_descElem= document.getElementById("short_desc");
			if (short_descElem) {
	            // Insert before summary:
//	            var short_desc_divElem= short_descElem.parentNode.parentNode.parentNode.parentNode.parentNode;
//	            short_desc_divElem.parentNode.insertBefore(createCategoryChoosers(), short_desc_divElem);
	
	            // Insert after summary:
	            var choosers= createCategoryChoosers();
	            choosers.insertBefore(document.createTextNode(" "), choosers.firstChild);
	            short_descElem.setAttribute("style", "width: 53%;");
	            short_descElem.parentNode.insertBefore(choosers, short_descElem.nextSibling);
	            var summaryElem= document.getElementById("summary");
	            if (summaryElem) {
	                summaryElem.setAttribute("style", "width: 100%;"); // necessary for process_bug.cgi, dont ask...
	                summaryElem.parentNode.parentNode.setAttribute("style", "width: 99%;"); // fix horizonal scrollbars
	            }
	        }
  		}
	}
	
	var confirm_product_changeElem= document.getElementsByName("confirm_product_change")[0];
	if (confirm_product_changeElem) {
		var productElem= document.getElementsByName("product")[0];
		var componentElem= document.getElementsByName("component")[0];
		if (productElem && componentElem) {
			addLink("Descriptions", "https://bugs.eclipse.org/bugs/describecomponents.cgi?product=" + productElem.value,
					componentElem.parentNode.firstElementChild);
		}
	}
	
	headElem.appendChild(
		createScript(
              'function assignTo(email) {\n'
            + 'document.getElementById("assigned_to").value= email;\n'
            + 'document.getElementById("set_default_assignee").checked= false;\n'
            + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";\n'
            + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "normal");\n'
            + 'document.getElementById("assigned_to").focus();\n'
            + '}\n'
		)
	);

	// Loop over <a>s:
	var anchors= document.getElementsByTagName("a");
	var diffRegex   = /attachment\.cgi\?id=(\d+)&action=diff/;
	var commentIdRegex= /^c(\d+)$/; // c42
	var commentRegex= /^show_bug\.cgi\?id=(\d+)#c(\d+)$/;
	var bugrefRegex = /show_bug\.cgi\?id=(\d+)/;
	var gerritRegex = /https:\/\/git\.eclipse\.org\/r\/(?:#\/c\/)?(\d+(?:\/.*)?)/;
	// https://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=d609946a67b70c2afbdfe936f9883720e6e2d489
	var gitRegex =    /https:\/\/git\.eclipse\.org\/c\/([^?]+)\.git\/commit\/\?.*id=([0-9a-f]{7})[0-9a-f]+/;
	var lastComment;
	for (var i= 0; i < anchors.length; i++) {
	    var aElem= anchors[i];
	    var aElemHref= aElem.getAttribute("href");
	    if (!aElemHref)
	        continue;
	    
	    // Fix attachment link (revert the new Bugzilla 3.6 "feature" that shows fancy patch viewer but kills copy/paste of patch into Eclipse):
	    if (aElem.name.substr(0, 7) == "attach_" && aElemHref.match(diffRegex)) {
	        aElem.setAttribute("href", aElemHref.replace(diffRegex, "attachment.cgi?id=$1"));
	        
	        // Add [diff] after [details] in attachment references:
	        var diffElem= document.createElement("a");
	        diffElem.textContent= "[diff]";
	        diffElem.href= aElemHref.replace(diffRegex, "attachment.cgi?id=$1&action=diff");
	        aElem.parentNode.appendChild(document.createTextNode(" "));
	        aElem.parentNode.appendChild(diffElem);
	        i+= 2; //skip [details] and new anchor
	    
	    // Change "Comment 42" to ">bug 170000 comment 42<" (simplifies copy/paste of reference):
	    } else if (aElemHref.match(commentRegex) && aElem.parentNode.getAttribute("class") == "bz_comment_number") {
	        aElem.textContent= "comment " + commentIdRegex.exec(aElem.parentNode.parentNode.parentNode.id)[1];
	        
	        var pre= document.createTextNode("bug " + bugId + " ");
	        aElem.parentNode.insertBefore(pre, aElem);
	        lastComment= aElem;

	    // Fix the Status "Edit" link
	    } else if (aElemHref == "#add_comment" && aElem.parentNode.getAttribute("id") == "static_bug_status") {
	    	aElem.setAttribute("href", "#bug_status");

	    // Modifier+click on [-] to toggle wide comments
	    } else if (aElem.getAttribute("class") == "bz_collapse_comment") {
	        var commentId= commentIdRegex.exec(aElem.parentNode.parentNode.parentNode.id)[1];
	        var action=
	              'var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;'
	            + 'if (modClick) {'
	            + '  toggle_wide_comment_display(' + commentId + '); return false;'
	            + '} else {'
	            +   aElem.getAttribute("onclick")
	            + '}'
	            + 'return false;';
	        aElem.setAttribute("onclick", action);
	        aElem.title="Toggle comment display (Modifier+click to toggle wide)";
	    
	    // Remove link in bug header to allow easy copying of bug number:
	    } else if (aElemHref.match(bugrefRegex)) {
	        if (aElem.parentNode.getAttribute("class") == "bz_alias_short_desc_container edit_form") {
	            var pre= document.createTextNode("bug " + bugId);
	            aElem.parentNode.insertBefore(pre, aElem);
	            aElem.parentNode.removeChild(aElem);
	            
	        // Show title of "See Also" bugs:
			} else if (aElem.parentNode.parentNode.parentNode.id == "field_container_see_also"
					&& aElem.getAttribute("class") && aElem.getAttribute("class").includes("bz_bug_link")) {
				var myElem= document.createElement("span");
				myElem.style.marginLeft= "1em";
				myElem.textContent= aElem.title;
				myElem.title= aElem.title;
				aElem.parentNode.insertBefore(myElem, aElem.nextSibling);
            }
        
	    // Turn "Add comment" link into a button:
	    } else if (aElem.parentNode.getAttribute("class") == "bz_add_comment") {
	        var buttonElem= document.createElement("button");
	        buttonElem.setAttribute("onclick", aElem.getAttribute("onclick"));
	        buttonElem.textContent= aElem.textContent + "...";
	        aElem.parentNode.replaceChild(buttonElem, aElem);
	    
	    } else if (aElem.getAttribute("class") == "email" && aElem.firstElementChild) {
	        var email= aElemHref.substr(7);
		    // Add "envelope" mail link, containing "name <email_address>" (e.g. to copy-paste as Git author)
		    var fullElem= aElem.cloneNode();
		    fullElem.innerHTML= "&#x2709;"; //ENVELOPE
		    fullElem.style.textDecoration="none";
	        var fullEmail= aElem.firstElementChild.textContent + " <" + email + ">";
		    fullElem.title= fullEmail;
	        aElem.title= email;
	        fullElem.setAttribute("href", "mailto:" + fullEmail);
	        
		    aElem.parentNode.insertBefore(fullElem, aElem.nextSibling.nextSibling);
		    aElem.parentNode.insertBefore(document.createTextNode(" "), fullElem.nextSibling);
		    
		    i+= 1; // skip new link
		    
		    var nextNode= fullElem.nextElementSibling; // ECA | Friend | null!
		    
			// Add "assign to" link (unless already assigned)
			var assigned_toElem= document.getElementById("assigned_to");
			if (assigned_toElem && assigned_toElem.value != email) {
			    var assignToElem= aElem.cloneNode();
			    assignToElem.innerHTML+= assignToSymbol;
			    assignToElem.style.textDecoration="none";
			    assignToElem.title= "Assign to " + aElem.title;
		        assignToElem.setAttribute("href", getAssigneeLinkScript(email));
		        
			    fullElem.parentNode.insertBefore(assignToElem, nextNode);
			    fullElem.parentNode.insertBefore(document.createTextNode(" "), nextNode);
			    
			    i+= 1; // skip new link
			}
			
			// add link to search for changes by this user in the last week
			var changesElem= addLink(searchSymbol, "buglist.cgi?chfieldfrom=1w"
						 + "&email1=" + email + "&emailassigned_to1=1&emailcc1=1&emaillongdesc1=1&emailqa_contact1=1&emailreporter1=1&emailtype1=exact&order=Last Changed"
					, fullElem.parentNode, "Changes by this user in the last 7 days", false);
			changesElem.setAttribute("style", "text-decoration: none; " + searchSymbolStyle);
			fullElem.parentNode.insertBefore(changesElem, nextNode);
			fullElem.parentNode.insertBefore(document.createTextNode(" "), nextNode);
			i+= 1; // skip new link
		
		// Dim glaring icon for "Bug 429346: Link to editing bugzilla config from bugzilla"
	    } else if (aElemHref == "https://dev.eclipse.org/committers/bugs/bugz_manager.php") {
	        aElem.setAttribute("class", "cla_dec");
	    
	    // Store user's email address
	    } else if (aElemHref == "index.cgi?logout=1") {
	        myMail= aElem.nextSibling.textContent.trim();
	    
	    // Add accesskey
	    } else if (aElem.textContent == "Expand All Comments") {
	        aElem.innerHTML= "E<b>x</b>pand All Comments";
	        aElem.setAttribute("accesskey", "x");
		
		// Improve link rendering for https://bugs.eclipse.org/434841#c37
		} else if (aElem.textContent.match(/\s*Gerrit Change\s*/) && aElemHref.match(gerritRegex)) {
			var changeId= gerritRegex.exec(aElemHref)[1];
			aElem.textContent = "r/" + changeId;
			
			// Lazily load/append Gerrit status:
			// can't use XMLHttpRequest due to Cross-Origin Request blocking (Same Origin Policy)
			if (typeof GM.xmlHttpRequest !== "undefined") {
				GM.xmlHttpRequest({
					method: "GET",
					url: "https://git.eclipse.org/r/changes/" + changeId + "?o=DETAILED_ACCOUNTS",
					onload: getAppendGerritStatusFunction(aElem)
				});
			}
			
		} else if (aElem.textContent.match(/\s*Git Commit\s*/) && aElemHref.match(gitRegex)) {
			var match= gitRegex.exec(aElemHref);
			aElem.textContent = match[2];
			
			var label= document.createElement("span");
			label.style.marginLeft= "1.5em";
			label.textContent= "(" + match[1] + ")";
			aElem.parentNode.insertBefore(label, aElem.nextSibling);
		
		// Show resolved bugs in dependency tree:
		} else if (aElemHref.match(/showdependencytree\.cgi\?id=\d+&hide_resolved=1/)) {
			aElem.setAttribute("href", aElemHref.substr(0, aElemHref.length - 1) + "0");
		
	    } else if (document.getElementById("product") && document.getElementById("component")) { // e.g. not in attachment.cgi?id=*&action=edit
		    // Add "Clone This Bug (in <originating project>)":
		    if (aElem.textContent == "Clone This Bug") {
			    var cloneElem= aElem.cloneNode();
			    var product= document.getElementById("product").value;
			    cloneElem.textContent= "(in " + product + ")";
			    cloneElem.href= aElem.href + "&product=" + product;
			    aElem.parentNode.insertBefore(cloneElem, aElem.nextSibling);
			    aElem.parentNode.insertBefore(document.createTextNode(" "), cloneElem);
		        
		    // Add "New (in <originating project>)":
		    } else if (aElemHref == "enter_bug.cgi") {
			    var cloneElem= aElem.cloneNode();
			    var component= document.getElementById("component").value;
			    var product= document.getElementById("product").value;
			    cloneElem.textContent= "(in " + product + "/" + component + ")";
			    cloneElem.href= aElem.href + "?product=" + product + "&component=" + component;
			    aElem.parentNode.insertBefore(cloneElem, aElem.nextSibling);
			    aElem.parentNode.insertBefore(document.createTextNode(" "), cloneElem);
		    }
		// insert more general stuff further up (not here; previous "else if" was pretty broad...)
		}
	    
	//    // Show obsolete attachments initially:
	//    if (aElem.getAttribute("onclick") == "return toggle_display(this);") {
	//        aElem.setAttribute("name", "toggle_display"); // have to give this a name so we can refer to it from the embedded script afterwards
	//        var scriptElem= document.createElement("script");
	//        scriptElem.type="text/javascript";
	//        scriptElem.innerHTML= 'toggle_display(document.anchors["toggle_display"]);';
	//        aElem.parentNode.insertBefore(scriptElem, aElem.nextSibling)
	//    }
	}

	// add "Jump to my last comment" and "Jump to last comment and Reload" links in header:
	if (lastComment) {
		var header_addl_infoElems= document.getElementsByClassName("header_addl_info");
		if (header_addl_infoElems[0]) {
			// original text: Last modified: 2015-11-09 11:15:40 CET
			var newHTML= '<a href="#">Top</a> '
					+ '(<a href="javascript:scroll_to_my_last_comment();void(0);" title="Jump to my last comment">My</a>) '
					+ '<a href="' + lastComment.href + '" title="Jump to last comment">Last</a> '
					+ '<a href="' + lastComment.href + '" '
					+ 'onclick="var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;'
					  + 'if (!modClick) { window.location.href=\'' + lastComment.href + '\';window.location.reload(false);}" '
					+ 'title="Jump to last comment and Reload">modified &#x1F503;</a>'
					+ header_addl_infoElems[0].innerHTML.substr(13);
			header_addl_infoElems[0].innerHTML= newHTML;
		}
	}
	
	// Edit summary:
	if (!hideElem("summary_alias_container")) { // Bugzilla < 5.0
		hideElem("summary_container");
	}
	if (!showElem("summary_alias_input")) { // Bugzilla < 5.0
		showElem("summary_input");
	}
	
	// Move alias field to bug id line:
	var aliasElem= document.getElementById("alias");
	var summary_alias_inputElem= document.getElementById("summary_alias_input");
	if (aliasElem && summary_alias_inputElem) {
		var aliasTrElem= aliasElem.parentNode.parentNode;
		var spacer= document.createTextNode(" ");
		summary_alias_inputElem.parentNode.insertBefore(spacer, summary_alias_inputElem.previousElementSibling);
		var table= document.createElement("table");
		table.setAttribute("style", "display: inline; vertical-align: -5px");
		table.appendChild(aliasTrElem);
		summary_alias_inputElem.parentNode.insertBefore(table, summary_alias_inputElem.previousElementSibling);
	}
	
	// Edit CC list (already badly hacked on bugs.eclipse.org, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=334083 ):
	hideElem("cc_edit_area_showhide_container");
	var cc_edit_areaElem= showElem("cc_edit_area");
	if (cc_edit_areaElem) {
		cc_edit_areaElem.removeChild(cc_edit_areaElem.getElementsByTagName("br")[0]);
	}
	
	setOptionSize("cc", 8);
	
	// Add shortcut cc links:
	   // ... with auto-complete:
	var newcc_autocompleteElem= document.getElementById("newcc_autocomplete");
	if (newcc_autocompleteElem) {
	    var addDiv= newcc_autocompleteElem.parentNode.firstElementChild;
	    for (var i= 0; i < ccs.length; i= i+2) {
            addCcLink(ccs[i], ccs[i + 1], addDiv, "newcc");
        }
	}
	
	   // ... without auto-complete (https://bugs.eclipse.org/386744):
	var newccElem= document.getElementById("newcc");
	if (newccElem) {
	    var addDiv= newccElem.parentNode.firstElementChild;
	    for (var i= 0; i < ccs.length; i= i+2) {
            addCcLink(ccs[i], ccs[i + 1], addDiv, "newcc");
        }
        
		var ccElem= document.getElementById("cc");
		if (ccElem) {
			// Add "(^ edit)" to CC list:
			var eHref= 'javascript:'
			+ 'var newccElem= document.getElementById("newcc");'
			+ 'var ccElem= document.getElementById("cc");'
			+ 'var ccElems= ccElem.children;'
			+ 'var email= "";'
			+ 'for (var i= 0; i < ccElems.length; i++) {'
			+ '  if (ccElems[i].selected || ccElem.selectedOptions.length == 0) {'
			+ '    if (email.length != 0) {'
			+ '      email += ", ";'
			+ '    }'
			+ '    email += ccElems[i].value;'
			+ '  }'
			+ '}'
			+ 'var endWithComma= newccElem.value.length != 0;'
			+ 'if (endWithComma) {'
			+ '  email += ", ";'
			+ '}'
			+ 'newccElem.value= email + newccElem.value;'
			+ 'newccElem.focus();'
			+ 'newccElem.selectionStart= 0;'
			+ 'newccElem.selectionEnd= email.length - (endWithComma ? 2 : 0);'
			+ 'void(0);';
			
			var eLinkElem= document.createElement("a");
			eLinkElem.href= eHref;
			eLinkElem.style= "vertical-align:top";
			eLinkElem.innerHTML= "(^ edit)";
			eLinkElem.title= "Copy selected CCs to editable/copyable field";
			ccElem.parentNode.insertBefore(eLinkElem, ccElem.nextElementSibling);
			
			var spaceElem= document.createTextNode(" ");
			ccElem.parentNode.insertBefore(spaceElem, eLinkElem.nextSibling);
			
			// Add "Assign to selected CC" to CC list:
			var aHref= 'javascript:'
			+ 'var ccElem= document.getElementById("cc");'
			+ 'var ccElems= ccElem.children;'
			+ 'var email;'
			+ 'for (var i= 0; i < ccElems.length; i++) {'
			+ '  if (ccElems[i].selected || ccElem.selectedOptions.length == 0) {'
			+ '    email = ccElems[i].value;'
			+ '    break;'
			+ '  }'
			+ '}'
			+ 'if (email) {'
			+ '  assignTo(email);'
			+ '}'
			+ 'void(0);';
			
			var aLinkElem= document.createElement("a");
			aLinkElem.href= aHref;
			aLinkElem.style= "vertical-align:top";
			aLinkElem.innerHTML= assignToSymbol;
			aLinkElem.style.textDecoration="none";
			aLinkElem.title= "Assign to selected CC";
			ccElem.parentNode.insertBefore(aLinkElem, spaceElem.nextElementSibling);
		}
	}
	
	// Edit see_also:
	hideElem("container_showhide_see_also");
	showElem("container_see_also");
	
	// Edit & rearrange Assignee & QA:
	fixCheckboxField("bz_assignee_edit_container", "bz_assignee_input", "Default Ass.");
	fixCheckboxField("bz_qa_contact_edit_container", "bz_qa_contact_input", "Default QA");
	
	var set_default_assigneeElem= document.getElementById("set_default_assignee");
	if (set_default_assigneeElem) {
		set_default_assigneeElem.setAttribute("onclick", addOldAssigneeAsCcScript);
	}

    // Fix Product & Component (lose focus on change):
	var classificationElem= document.getElementById("classification");
	var productElem= document.getElementById("product");
	var componentElem= document.getElementById("component");
	if (classificationElem && productElem) {
	    productElem.setAttribute("onchange", "window.setTimeout(function() {"
	                + "document.getElementById('product').focus();"
	                + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";'
                    + "}, 10)"
	                );
	    
		var productsLinkSpanElem= document.createElement("span");
		productsLinkSpanElem.style.marginLeft= "1em";
		productElem.parentNode.insertBefore(productsLinkSpanElem, productElem.nextSibling);
		if (isBugsEclipseOrg) {
			// Add shortcuts to set Product:
			for (var i= 0; i < moveProducts.length; i++) {
				addProductLink(moveProducts[i], productsLinkSpanElem);
			}
			productsLinkSpanElem.appendChild(document.createTextNode(" | "));
		} else {
			productsLinkSpanElem.appendChild(document.createTextNode(" "));
		}
		// Add shortcut to search Product:
		addLink(searchSymbol, "query.cgi"
							 + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value
							 + "&product=" + productElem.options[productElem.selectedIndex].value
							 , productsLinkSpanElem, "Search in this product", " (").style= searchSymbolStyle;
		addLink("1w", "buglist.cgi"
							 + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value
							 + "&product=" + productElem.options[productElem.selectedIndex].value
							 + "&chfieldfrom=1w"
							 , productsLinkSpanElem, "Changed in the last 7 days");
		productsLinkSpanElem.appendChild(document.createTextNode(")"));
	}
	
	if (classificationElem && productElem && componentElem) {
	    componentElem.setAttribute("onchange", "window.setTimeout(function() {"
	                + "document.getElementById('component').focus();"
	                + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";'
                    + "}, 10)"
	                );
	    
		var componentsLinkSpanElem= document.createElement("span");
		componentsLinkSpanElem.style.marginLeft= "1em";
		componentElem.parentNode.insertBefore(componentsLinkSpanElem, componentElem.nextSibling);
		if (isBugsEclipseOrg) {
			// Add shortcuts to set Component:
			for (var i= 0; i < moveComponents.length; i++) {
				addComponentLink(moveComponents[i], componentsLinkSpanElem);
			}
			componentsLinkSpanElem.appendChild(document.createTextNode(" | "));
		} else {
			componentsLinkSpanElem.appendChild(document.createTextNode(" "));
		}
		// Add shortcut to search Component:
		addLink(searchSymbol, "query.cgi"
							 + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value
							 + "&product=" + productElem.options[productElem.selectedIndex].value
							 + "&component=" + componentElem.options[componentElem.selectedIndex].value
							 , componentsLinkSpanElem, "Search in this component", " (").style= searchSymbolStyle;
		addLink("1w", "buglist.cgi"
							 + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value
							 + "&product=" + productElem.options[productElem.selectedIndex].value
							 + "&component=" + componentElem.options[componentElem.selectedIndex].value
							 + "&chfieldfrom=1w"
							 , componentsLinkSpanElem, "Changed in the last 7 days");
		componentsLinkSpanElem.appendChild(document.createTextNode(")"));
	}
	
	// Copy QA and Assignee to the right (read-only):
	var assigneeCopy, qaCopy;
	var bz_assignee_edit_containerElem= document.getElementById("bz_assignee_edit_container");
	if (bz_assignee_edit_containerElem) {
	    var spans= bz_assignee_edit_containerElem.getElementsByTagName("span");
		for (var i= 0; i < spans.length; i++) {
		    var spanElem= spans[i];
		    if (spanElem.getAttribute("class") == "vcard") {
		        assigneeCopy= spanElem.cloneNode(true);
		    }
		}
	}
	var bz_qa_contact_edit_containerElem= document.getElementById("bz_qa_contact_edit_container");
	if (bz_qa_contact_edit_containerElem) {
	    var spans= bz_qa_contact_edit_containerElem.getElementsByTagName("span");
		for (var i= 0; i < spans.length; i++) {
		    var spanElem= spans[i];
		    if (spanElem.getAttribute("class") == "vcard") {
		        qaCopy= spanElem.cloneNode(true);
		    }
		}
	}
	
    var bz_show_bug_column_2Elem= document.getElementById("bz_show_bug_column_2");
    if (bz_show_bug_column_2Elem) {
        var trs= bz_show_bug_column_2Elem.getElementsByTagName("tr");
	    if (qaCopy) {
	        var qaTr= document.createElement("tr");
	        
	        var qaTdLabel= document.createElement("td");
	        qaTdLabel.setAttribute("class", "field_label");
	        qaTdLabel.innerHTML= "<b>QA Contact</b>:";
	        qaTr.appendChild(qaTdLabel);
	        
	        var qaTdValue= document.createElement("td");
	        qaTdValue.appendChild(qaCopy);
	        qaTr.appendChild(qaTdValue);
	        
	        if (trs.length > 0) {
	            trs[1].parentNode.insertBefore(qaTr, trs[1]);
	        }
	    }
        if (assigneeCopy) {
	        var assigneeTr= document.createElement("tr");
	        
	        var assigneeTdLabel= document.createElement("td");
	        assigneeTdLabel.setAttribute("class", "field_label");
	        assigneeTdLabel.innerHTML= "<b>Assignee</b>:";
	        assigneeTr.appendChild(assigneeTdLabel);
	        
	        var assigneeTdValue= document.createElement("td");
	        assigneeTdValue.appendChild(assigneeCopy);
	        assigneeTr.appendChild(assigneeTdValue);
	        
	        if (trs.length > 0) {
	            trs[1].parentNode.insertBefore(assigneeTr, trs[1]);
	        }
        }
	}
	
	// Add accesskeys:
	setAccessKey("bug_status", "t");
	setAccessKey("resolution", "r");
	setAccessKey("target_milestone", "m");
	
	// Add shortcut target milestone links:
	var targetElem= document.getElementById("target_milestone");
	if (targetElem && isBugsEclipseOrg) {
		var targetLinkSpanElem= document.createElement("span");
		targetLinkSpanElem.style.marginLeft= "1em";
		targetElem.parentNode.insertBefore(targetLinkSpanElem, targetElem.nextSibling);
		for (var i= 0; i < target_milestones.length; i++) {
			addTargetLink(targetLinkSpanElem, target_milestones[i]);
		}
		addTargetLink(targetLinkSpanElem, "---");
	}
	
	// Move Status to right spot:
	var statusElem= document.getElementById("status");
	var bz_assignee_inputElem= document.getElementById("bz_assignee_input");
	if (statusElem && bz_assignee_inputElem) {
		var statusTRElem= statusElem.parentNode.parentNode;
		var bz_assignee_inputTRElem= bz_assignee_inputElem.parentNode.parentNode;
		bz_assignee_inputTRElem.parentNode.insertBefore(statusTRElem, bz_assignee_inputTRElem);
		
		// Add shortcut status links:
		var dup_id_discoverableElem= document.getElementById("dup_id_discoverable");
		var statusLinksDivElem= document.createElement("div");
		dup_id_discoverableElem.parentNode.insertBefore(statusLinksDivElem, dup_id_discoverableElem.nextSibling);
	
		var bug_statusElem= document.getElementById("bug_status");
		if (dup_id_discoverableElem && bug_statusElem) {
		    var firstStatus= bug_statusElem.options[0].value;
		    var secondStatus= bug_statusElem.options[1].value;
		    if ((firstStatus == "NEW" || firstStatus == "ASSIGNED" || firstStatus == "REOPENED") && secondStatus != "RESOLVED") {
			    addStatusLink("NEW", "NEW", "", statusLinksDivElem);
			    addStatusLink("ASSIGNED", "ASSIGNED", "", statusLinksDivElem);
			} else {
			    addStatusLink("REOPENED", "REOPENED", "", statusLinksDivElem);
			    addStatusLink("VERIFIED", "VERIFIED", null, statusLinksDivElem);
			}
		    
		    addStatusLink("FIXED", "RESOLVED", "FIXED", statusLinksDivElem);
		    // Add shortcut target milestone link:
		    for (var i = 0; i < main_target_milestones.length; i++) {
		        var targetLinkSpanElem= document.createElement("span");
		        targetLinkSpanElem.style.marginLeft= ".5em";
		        statusLinksDivElem.appendChild(targetLinkSpanElem);
		        addFixedInTargetLink(targetLinkSpanElem, target_milestones[main_target_milestones[i]]);
		    }
		    
		    addStatusLink("INVALID", "RESOLVED", "INVALID", statusLinksDivElem);
		    addStatusLink("WONTFIX", "RESOLVED", "WONTFIX", statusLinksDivElem);
		    addStatusLink("WORKSFORME", "RESOLVED", "WORKSFORME", statusLinksDivElem);
		    addStatusLink("NOT_ECLIPSE", "RESOLVED", "NOT_ECLIPSE", statusLinksDivElem);
		}
		
	    // Add shortcut assignee links:
	    if (myMail) {
            addAssigneeLink("me", myMail, bz_assignee_inputElem);
        }
	    for (var i= 0; i < assignees.length; i= i+2) {
            addAssigneeLink(assignees[i], assignees[i + 1], bz_assignee_inputElem);
        }
	}
	
	// Add JDT UI Java 17 root bug to 'Blocks'
	var blocksLabel= document.getElementById("field_label_blocked");
	if (blocksLabel) {
        var rootBugButton= document.createElement("button");
        var rootTextElem = document.createTextNode("UI17");
        rootBugButton.appendChild(rootTextElem);
        rootBugButton.style.marginLeft= "1em";

        rootBugButton.addEventListener('click', function() {
            var blockedElem= document.getElementById("blocked");
            if (blockedElem) {
                blockedElem.value += 572061;
            }
        });
        
        var trElem= blocksLabel.parentNode;
        var tdElem= document.createElement("td");
				tdElem.appendChild(rootBugButton);
        trElem.appendChild(tdElem);
	}

    // Add JDT Core Java 17 root bug to 'Blocks'
	var blocksLabel= document.getElementById("field_label_blocked");
	if (blocksLabel) {
        var rootBugButton= document.createElement("button");
        var rootTextElem = document.createTextNode("CORE17");
        rootBugButton.appendChild(rootTextElem);
        //rootBugButton.style.marginLeft= "1em";

        rootBugButton.addEventListener('click', function() {
            var blockedElem= document.getElementById("blocked");
            if (blockedElem) {
                blockedElem.value += 570733;
            }
        });
        
        var trElem= blocksLabel.parentNode;
        var tdElem= document.createElement("td");
		tdElem.appendChild(rootBugButton);
        trElem.appendChild(tdElem);
	}

	// Add a convenient Commit button:
	var bz_qa_contact_inputElem= document.getElementById("bz_qa_contact_input");
	if (bz_qa_contact_inputElem) {
	    var commitElem= document.createElement("button");
	    commitElem.setAttribute("type", "submit");
		setCommitElemNameTitleShortcut(commitElem);
	    commitElem.style.marginLeft= "1em";
	    bz_qa_contact_inputElem.appendChild(commitElem);
		
		addSaveShortcutCtrlS("changeform");
	}
		
	// Edit attachment details: 
	if (document.getElementById("attachment_information_read_only")) {
        location.assign("javascript:toggle_attachment_details_visibility();void(0)");
    }
	
	// Move "Expand / Collapse All" away to avoid interfering with selections in the comments section:
	var bz_collapse_expand_commentsElems= document.getElementsByClassName("bz_collapse_expand_comments");
	if (bz_collapse_expand_commentsElems.length > 0) {
		var bz_group_visibility_sectionElems= document.getElementsByClassName("bz_group_visibility_section");
		if (bz_group_visibility_sectionElems.length > 0) {
			bz_collapse_expand_commentsElems[0].setAttribute("style", "padding-top: 4em;");
			bz_group_visibility_sectionElems[0].parentNode.appendChild(bz_collapse_expand_commentsElems[0]);
		} else {
			var add_commentElem= document.getElementById("add_comment");
			if (add_commentElem) {
				var tdRightOfadd_commentElem= add_commentElem.parentNode.nextElementSibling;
				var spacer= document.createElement("div");
				spacer.setAttribute("style", "padding-top: 9em");
				tdRightOfadd_commentElem.appendChild(spacer);
				tdRightOfadd_commentElem.appendChild(bz_collapse_expand_commentsElems[0]);
			}
		}
		
		// Add "Collapse All Before My Last" (Alt+Shift+E) and "Jump To My Last" (Alt+Shift+Y)
		var scriptElem= document.createElement("script");
		scriptElem.type= "text/javascript";
		scriptElem.innerHTML=
		  "function collapse_all_comments_before_my_last() {\n" +
			"var comments = YAHOO.util.Dom.getElementsByClassName('bz_comment_text');\n" +
			"var i = comments.length - 1;\n" +
			"var scrollTarget;\n" +
			"for (; i >= 0; i--) {\n" +
			"	var comment = comments[i];\n" +
			"	if (!comment)\n" +
			"		continue;\n" +
			"	\n" +
			"	var emailElems= comment.parentNode.getElementsByClassName('email');\n" +
			"	if (emailElems[emailElems.length - 1].title == '" + myMail + "') {\n" +
			"		scrollTarget= emailElems[emailElems.length - 1];\n" +
			"		i--;\n" +
			"		break;\n" +
			"	};\n" +
			"}\n" +
			"for (; i >= 0; i--) {\n" +
			"	var comment = comments[i];\n" +
			"	if (!comment)\n" +
			"		continue;\n" +
			"	\n" +
			"	var id = comments[i].id.match(/\\d*$/);\n" +
			"	var link = document.getElementById('comment_link_' + id);\n" +
			"	collapse_comment(link, comment);\n" +
			"}\n" +
			"if (scrollTarget) {\n" +
			"	scrollTarget.scrollIntoView(true);\n" +
			"	locationHashChanged();\n" +
			"};\n" +
		  "}\n" +
		  
		  "function scroll_to_my_last_comment() {\n" +
			"var comments = YAHOO.util.Dom.getElementsByClassName('bz_comment');\n" +
			"var i = comments.length - 1;\n" +
			"var scrollTargetId;\n" +
			"for (; i >= 0; i--) {\n" +
			"	var comment = comments[i];\n" +
			"	if (!comment)\n" +
			"		continue;\n" +
			"	\n" +
			"	var emailElems= comment.getElementsByClassName('email');\n" +
			"	if (emailElems[0].title == '" + myMail + "') {\n" +
			"		scrollTargetId= comment.id;\n" +
			"		i--;\n" +
			"		break;\n" +
			"	};\n" +
			"}\n" +
			"if (scrollTargetId) {\n" +
			"	window.location.hash= scrollTargetId;\n" +
			"};\n" +
		  "}\n" +
		  
		// Click "Collapse All Before My Last":
//		      + "collapse_all_comments_before_my_last();\n" // turned out to be inconvenient
		    "";
		headElem.appendChild(scriptElem);

		var aElem= document.createElement("a");
		aElem.href= "javascript:void(0);";
		aElem.innerHTML= "Collaps<b>e</b> All Before My Last";
		aElem.setAttribute("accesskey", "e");
		aElem.setAttribute("onclick","javascript:collapse_all_comments_before_my_last();\nreturn false;");
		
		var liElem= document.createElement("li");
		liElem.appendChild(aElem);
		bz_collapse_expand_commentsElems[0].appendChild(liElem);
		
		liElem.appendChild(document.createTextNode(" ("))
		aElem= document.createElement("a");
		aElem.href= "javascript:void(0);";
		aElem.innerHTML= "Jump To M<b>y</b> Last";
		aElem.setAttribute("accesskey", "y");
		aElem.setAttribute("onclick","javascript:scroll_to_my_last_comment();\nreturn false;");
		liElem.appendChild(aElem);
		liElem.appendChild(document.createTextNode(")"))
		
		
		// Add links to help enter a URL to a Git commit:
//		bz_collapse_expand_commentsElems[0].parentNode.appendChild(createCommentTemplateLinks());
	}
	
	// Script for "toggle wide comments":
	var scriptElem= createScript(
		"function toggle_wide_comment_display (comment_id) {\n"+
		"  var comment = document.getElementById('comment_text_' + comment_id);\n" +
		"  var re = new RegExp(/\\bwide\\b/);\n" +
		"  if (comment.className.match(re))\n" +
		"    unwiden_comment(comment);\n" +
		"  else\n" +
		"    widen_comment(comment);\n" +
		"}\n" +
		"function widen_comment(comment) {\n"+
		"    YAHOO.util.Dom.addClass(comment, 'wide');\n"+
		"}\n"+
		"\n"+
		"function unwiden_comment(comment) {\n"+
		"    YAHOO.util.Dom.removeClass(comment, 'wide');\n"+
		"}\n"+
		""
	);
	headElem.appendChild(scriptElem);
	
	// Don't wrap lines that match noWrapLinesRegex: (alternative to bug 446727: Increase line length to 140chars in Bugzilla)
	var bz_comment_textElems= document.getElementsByClassName("bz_comment_text");
	for (var i= 0; i < bz_comment_textElems.length; i++) {
		var childNodesElems= bz_comment_textElems[i].childNodes;
		for (var j= 0; j < childNodesElems.length; j++) {
			var child= childNodesElems[j];
			if (child.nodeType == 3 /*text*/) {
				var split= child.textContent.split(noWrapLinesRegex);
				if (split.length > 1) {
					for (var k= 0; k < split.length; k+= 2) {
						var span= document.createTextNode(split[k]);
						child.parentNode.insertBefore(span, child);
						
						var span= document.createElement("span");
						span.textContent= split[k + 1];
						span.style= "white-space: pre";
						child.parentNode.insertBefore(span, child);
					}
					child.parentNode.removeChild(child);
				}
			}
		}
	}
}

console.log("jdtbugzilla.user.js done.");
} // main()


if (document.getElementById("jdtbugzilla")) {
	// Workaround for https://github.com/greasemonkey/greasemonkey/issues/3012 :
	// Script runs twice for Content-Type: multipart/x-mixed-replace
	return;
}

var headElem= document.getElementsByTagName("head")[0];
if (headElem) {
	var styleElem= document.createElement("style");
	styleElem.type= "text/css";
	styleElem.id= "jdtbugzilla";
	styleElem.innerHTML = css;
	headElem.appendChild(styleElem);
}

document.addEventListener('DOMContentLoaded', function() {
  //page has been loaded, run DOM interactive parts (aka "@run-at document-end") here:
  main();
}, true);

Back to the top