<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>NetCAT Simplified Issue Query Form</title>
  <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css">
</head>
 
<body onLoad="clear_form();">
 
<h1>NetBeans 8.1 Quick Issue Search Form</h1>

<table><tr>
    <td><img src="https://qa.netbeans.org/processes/cat/80/logo.png" align="left" hspace="20" alt="NetCAT program logo"></td>
    <td width="20"></td>
    <td>
        This is a special simplified issue query form which requires JavaScript. Use this form to
        search known defects in <b>NetBeans 8.1</b> only. If you want to search all issues, please
        use the <a href="https://netbeans.org/bugzilla/query.cgi">normal IssueZilla query form</a>.
        You can also utilize simplified issue <a href="https://qa.netbeans.org/processes/cat/bug_form.html">submission form</a> for
        defects found in NetBeans 8.1.
    </td>
</tr></table>

<p><h3>Enter Issue Details</h3>

<form method="GET" action="https://netbeans.org/bugzilla/buglist.cgi" name="simpleform" onSubmit="return validate_form()">

<script language="javascript">

// Validate submissions --------------------------------------
function validate_form() {
  var validated=true;

  if (document.simpleform.short_desc.value=='') {
    alert('Please enter a summary substring.');
    validated=false;
  }

  if (document.simpleform.issue_state.selectedIndex=='0') {
    document.simpleform.bug_status[3].value='';
    document.simpleform.bug_status[4].value='';
  } else {
    document.simpleform.bug_status[3].value='RESOLVED';
    document.simpleform.bug_status[4].value='VERIFIED';
  }
  if (document.simpleform.issue_component.selectedIndex!='0') {
    document.simpleform.product[0].value=document.simpleform.issue_component[document.simpleform.issue_component.selectedIndex].value;
    for (i = 1; i <= 26; i++) {
      document.simpleform.product[i].value='';
    }
  } else {
    for (i = 0; i <= 26; i++) {
      document.simpleform.product[i].value=document.simpleform.issue_component[i+1].value;
    }
  }

  return validated;
}

// Clear form if returning with Back button ---------------------
function clear_form() {

  document.simpleform.short_desc.value='';
  document.simpleform.issue_state.options[0].selected=true;

}

document.write('<input type=hidden name="version" value="8.1">\n');
document.write('<input type=hidden name="cf_bug_type" value="DEFECT">\n');
document.write('<input type=hidden name="short_desc_type" value="substring">\n');

document.write('<p><b>NetBeans Version :</b> <font color="7C7C7C">8.1</font>');
document.write('<p><b>Issue Type :</b> <font color="7C7C7C">DEFECT</font>');
document.write('<p><b>Issue Status :</b>\
  <select size="1" name="issue_state">\
  <option value="open">Open defects</option>\
  <option value="all">All defects</option>\
  </select>');
document.write('<input type=hidden multiple name="bug_status" value="NEW">\n');
document.write('<input type=hidden multiple name="bug_status" value="STARTED">\n');
document.write('<input type=hidden multiple name="bug_status" value="REOPENED">\n');
document.write('<input type=hidden multiple name="bug_status" value="RESOLVED">\n');
document.write('<input type=hidden multiple name="bug_status" value="VERIFIED">\n');

document.write('<p><b>Component :</b>\
<SELECT NAME="issue_component">\
<OPTION VALUE="all">All components</option>\
<OPTION VALUE="projects">Ant</option>\
<OPTION VALUE="cd">Connected Developer</option>\
<OPTION VALUE="cnd">C/C++</option>\
<OPTION VALUE="db">Database</option>\
<OPTION VALUE="debugger">Debugger</option>\
<OPTION VALUE="projects">Eclipse projects</option>\
<OPTION VALUE="editor">Editor</option>\
<OPTION VALUE="javaee">Enterprise & web applications</option>\
<OPTION VALUE="versioncontrol">Git</option>\
<OPTION VALUE="groovy">Groovy</option>\
<OPTION VALUE="guibuilder">GUI builder</option>\
<OPTION VALUE="installer">Installer</option>\
<OPTION VALUE="java">Java</option>\
<OPTION VALUE="javafx">JavaFX</option>\
<OPTION VALUE="javascript">JavaScript</option>\
<OPTION VALUE="projects">Maven</option>\
<OPTION VALUE="versioncontrol">Mercurial</option>\
<OPTION VALUE="mobility">Mobility</option>\
<OPTION VALUE="www">NetBeans website</option>\
<OPTION VALUE="php">PHP</option>\
<OPTION VALUE="profiler">Profiler</option>\
<OPTION VALUE="projects">Projects</option>\
<OPTION VALUE="apisupport">NetBeans RCP</option>\
<OPTION VALUE="versioncontrol">Subversion</option>\
<OPTION VALUE="updatecenters">Update center</option>\
<OPTION VALUE="websvc">Web services</option>\
</select>');

document.write('<input type=hidden multiple name="product" value="projects">\n');       // 1
document.write('<input type=hidden multiple name="product" value="cd">\n');             // 2
document.write('<input type=hidden multiple name="product" value="cnd">\n');            // 3
document.write('<input type=hidden multiple name="product" value="db">\n');             // 4
document.write('<input type=hidden multiple name="product" value="debugger">\n');       // 5
document.write('<input type=hidden multiple name="product" value="projects">\n');       // 6
document.write('<input type=hidden multiple name="product" value="editor">\n');         // 7
document.write('<input type=hidden multiple name="product" value="javaee">\n');         // 8
document.write('<input type=hidden multiple name="product" value="versioncontrol">\n'); // 9
document.write('<input type=hidden multiple name="product" value="groovy">\n');         // 10
document.write('<input type=hidden multiple name="product" value="guibuilder">\n');     // 11
document.write('<input type=hidden multiple name="product" value="installer">\n');      // 12
document.write('<input type=hidden multiple name="product" value="java">\n');           // 13
document.write('<input type=hidden multiple name="product" value="javafx">\n');         // 14
document.write('<input type=hidden multiple name="product" value="javascript">\n');     // 15
document.write('<input type=hidden multiple name="product" value="projects">\n');       // 16
document.write('<input type=hidden multiple name="product" value="versioncontrol">\n'); // 17
document.write('<input type=hidden multiple name="product" value="mobility">\n');       // 18
document.write('<input type=hidden multiple name="product" value="www">\n');            // 19
document.write('<input type=hidden multiple name="product" value="php">\n');            // 20
document.write('<input type=hidden multiple name="product" value="profiler">\n');       // 21
document.write('<input type=hidden multiple name="product" value="projects">\n');       // 22
document.write('<input type=hidden multiple name="product" value="apisupport">\n');     // 23
document.write('<input type=hidden multiple name="product" value="versioncontrol">\n'); // 24
document.write('<input type=hidden multiple name="product" value="updatecenters">\n');  // 25
document.write('<input type=hidden multiple name="product" value="websvc">\n');         // 26

document.write('<p><b>Summary Substring:</b>&nbsp;&nbsp;<input name="short_desc" size="30">');

document.write('&nbsp;&nbsp;<input name=submit type="submit" value="    Search    ">\n');

</script></form>

<noscript>
    <font class="titlec">JavaScript Required!</font>

    <p>This is a specially simplified version of the netbeans.org bug query
    form, which uses JavaScript to automatically determine a few things,
    and pre-fill them into the form. You must have JavaScript enabled to
    use this form.

    <p>You are seeing this message instead of the simplified form
    because you either have JavaScript disabled, or you are using
    a browser which does not support it.

    <p>You can always use the <a href="https://netbeans.org/bugzilla/buglist.cgi">regular bug query form</a>.
</noscript>

</body>
</html>
