<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>NetBeans Update Center Publishing Request</title>
    <link rel="stylesheet" type="text/css" href="../../netbeans.css">
  </head>
  <body>
    <h2>NetBeans Update Center Publishing Request</h2>
    <p>This is a form for NetBeans community members who have developed
      their own NetBeans plugin and want to have it published on the NetBeans
      Update Center. Please complete the form carefully to help us
      process your request in an efficient manner.</p>
    <p>Thank you for your time and contribution!<br>
      <b>NetBeans Team</b></p>
    <center> <img src="../../images_www/v4/hint.png" border="1" hspace="10" vspace="10"><br>
      <font size="-2"><b>Hint:</b> For your convenience, there are tooltips
        available for all fields or options.</font></center>
    <br>
    <h2 id="tome">Enter Issue Details</h2>
    <p>Fields marked with <span class="red bold">*</span> are mandatory.</p>
    <script type='text/javascript' src='/images_www/js/jquery.simpleCaptcha-0.2.js'></script>
    <script type='text/javascript' src='/images_www/js/jquery.validate.min.js'></script>
    <script type='text/javascript' src='http://flesler-plugins.googlecode.com/files/jquery.scrollTo-1.4.2-min.js'></script>
  <style>
    .simpleCaptchaSelected {
      border: 2px solid blue;
    }
    .captchaImage {
      margin-right:4px;
      cursor: pointer;
    }
    input.error, textarea.error {
      border:1px solid red;
    }
    div.error {
      background:none repeat scroll 0 0 #FBE3E4;
      border: 2px solid #FBC2C4;
      color:#8A1F11;
      padding:2px;
    }
    .captchaImages {
      padding-top:5px;
    }
    .red { color:red; }
    #subres {
      padding:0px 10px 10px 10px;
      border: 1px solid silver;
      background-color: white;
      margin-bottom:20px;
    }
  </style>
  <div id="auf" class="actionbox" style="display:none;">
    <div id="subres" class="hidden"></div>
    <form id="auc_request" name="auc_request" method="post" action="">
      <input type="hidden" name="ssoc" value="" id="ssoc"/>
      <h3>Contributor data</h3>
      <script type="text/javascript">document.write('<input type="hidden" name="username" value="'+username+'"/>')</script>
      <table class="indent">
        <tr>
          <td class="bold">Username:</td>
          <td><span id="unm"><script type="text/javascript">document.write(username)</script></span></td>
        </tr>
        <tr>
          <td class="">Company:</td>
          <td><input type="text" class="field" name="company" style="width:200px;" title="Name of company on behalf of what this UC request is submitted (if applicable)."/>
        </tr>
      </table>
      <br>
      <h3>Plugin data</h3>
      <table class="indent">
        <tr>
          <td class="bold">Name <span class="red">*</span>:</td>
          <td><input type="text" class="field required" name="plugin_name" style="width:350px;" title="Marketing name of plugin(s) to be contributed by this UC request."/>
        </tr>
        <tr>
          <td class="bold">Short description&nbsp;<span class="red">*</span>:</td>
          <td><textarea name="plugin_description" cols="60" rows="4" class="required" title="One or two paragraphs long description of functionality provided by plugin(s)."></textarea>
        </tr>

        <tr>
          <td colspan="2"><br>
            <p><b>What Update Center do you want to have your plugin published on? <span class="red">*</span></b></p>
            <table class="indent">
              <tbody >
                <tr>
                  <td valign="top"><b>UC type:</b></td>
                  <td width="60"></td>
                  <td valign="top"><b>NetBeans version <span class="red">*</span>:</b></td>
                </tr>
                <tr>
                  <td valign="top">
                    <input name="REQUIREDauc_typeRADIO" value="Dev" checked="checked" onclick="dev_auc()" title="Development UC - no particular quality guaranteed" type="radio">Development<br>
                    <input name="REQUIREDauc_typeRADIO" value="Beta" onclick="beta_auc()" title="Beta UC - no showstoppers (crash, data loss, deadlock)" type="radio">Beta<br>
                    <input name="REQUIREDauc_typeRADIO" value="Stable" onclick="stable_auc()" title="Stable UC - no showstoppers or severe defects, internationalization support done" type="radio">Stable<br>
                    <input name="REQUIREDauc_typeRADIO" value="Third-party" onclick="party()" title="Commercial plugins with closed source licence." type="radio">3rd party<br>
                  </td>
                  <td>
                  </td>
                  <td valign="top">
                    <div><input name="netbeans_version" title="Version of the NetBeans which works with plugin." class="required"  type="radio" value="6.9.1">6.9.1</div>
                    <div><input name="netbeans_version" title="Version of the NetBeans which works with plugin." type="radio"  value="6.8">6.8</div>
                  </td>
                </tr>
            </table>
          </td>
        </tr>
        <tr>
          <td colspan="2"><br>
            <p><b>Selected UC type requirements <span class="red">*</span>:</b></p>
            <div class="indent">
              <input name="testedCHECKBOX2"  id="testedCHECKBOX2" disabled="disabled" title="The plugin was tested." type="checkbox" checked="checked"  value="yes">The plugin was tested<br>
              <input name="no_p1CHECKBOX2" id="no_p1CHECKBOX2" disabled="disabled" value="yes" title="There are no known showstopper issues (crash, data loss, deadlock) in plugin(s)." type="checkbox">I am not aware of any <a href="http://qa.netbeans.org/bugzilla/bug_priority_guidelines.html">serious P1 defects</a> in the plugin.<br>
              <input name="no_p2CHECKBOX2" id="no_p2CHECKBOX2" disabled="disabled" value="yes" title="There are no known serious bugs in plugin(s) functionality with no workaround." type="checkbox">I am not aware of any <a href="http://qa.netbeans.org/bugzilla/bug_priority_guidelines.html">serious P2 defects</a> without documented workaround in the plugin.<br>
              <input name="i18nCHECKBOX2" disabled="disabled" value="yes" title="It is possible to localize plugin(s) to other languages in standard way." type="checkbox">The plugin is I18N compliant. (<a href="http://wiki.netbeans.org/wiki/view/UpdateCenterPolicy#section-UpdateCenterPolicy-Internationalization">I18N policy</a>)<br>
              <input name="l10nCHECKBOX2" disabled="disabled" value="yes" title="It would be good to translate the plugin to other languages." type="checkbox">The plugin is worth localizing to non-English languages. (<a href="http://wiki.netbeans.org/wiki/view/UpdateCenterPolicy#section-UpdateCenterPolicy-Localization">L10N policy</a>)
            </div>
      </table>
      <br>
      <h3>Legal details</h3>
      <table class="indent">
        <tr>
          <td class="bold">Distribution licence</td>
          <td>
            <input type="text" class="field required" name="plugin_licence" id="plugin_licence" style="width:350px;" title="Name of licence defining usage permissions of contributed plugin(s)."/>
          </td>
        </tr>
        <tr>
          <td class="bold" colspan="2">
            <br>
            <input type="checkbox" class="field" value="yes" name="plugin_thirdparty" title="The plugin bundles some code not developed by me/us."/> The plugin contains third party code.
            <br>
            <input type="checkbox" class="field" value="yes" name="plugin_patent"  title="The plugin contains some not yet patented code."/> The plugin includes some patentable material.
            <br>
            <input type="checkbox" class="field" value="yes" name="plugin_security" title="The plugin uses some encryption or security technologies." /> The plugin contains encryption or security functionality.
          </td>
        </tr>
      </table>
      <br>
      <h3>Additional details</h3>
      <div class="indent">
        <b>Plugin URL(s) <span class="red">*</span></b><br>
        <input type="text" class="field required" name="plugin_urls" style="width:500px;" title="URL(s) where is the plugin published."/>
        <br><br>
        <b>Why do you want to publish your plugin on the NetBeans UC? <span class="red">*</span></b><br>
        <input type="text" class="field required" name="plugin_reason" style="width:500px;" title="What is your goal by publishing your plugin on the NetBeans Update Center?"/>
        <br><br>
        <b>What documentation is being provided with the plugin? <span class="red">*</span></b><br>
        <textarea name="plugin_doc" cols="62" rows="5 " class="required" title="Is there any publicly available user/developer documentation for the plugin?"></textarea>
        <br><br>
        <b>What is your marketing plan around publishing the plugin on the NetBeans UC? <span class="red">*</span></b><br>
        <textarea name="plugin_marketing" cols="62" rows="5" class="required" title="How are you going to promote publishing of your plugin on the NetBeans Update Center?"></textarea>
      </div>
      <br>
      <p class="bold" style="color:red;">
        After submission, this request will be visible to public. Please, do NOT include any private data, confidential information, internal URLs etc. These can be communicated via e-mail later.
      </p>
      <div class="align-center">
        <div id='captcha1'></div>
      </div>
      <div class="align-center"><br>
        <!--<img src="/images_www/v6/submit-request.png" width="103" height="23" onclick="submitRequest();" style="cursor:pointer;" title="Submit request"/>-->
        <div id="sbmsg"><img src="/images_www/webadmin/loader.gif" width="48" height="48"/><br/>Loading security images</div>
        <input type="submit" value="Submit request" id="sb" style="visibility: hidden;"/>
      </div>

    </form>
  </div>

  <script type="text/javascript">
    $(function() {
      $('#captcha1')
      .bind('loaded.simpleCaptcha', function() {
        $('#sb').css('visibility','visible');
        $('#sbmsg').css('display','none');
      })
      .simpleCaptcha({
        numImages: 4,
        scriptPath:'/service/captcha/',
        introText: '<b>Security task:</b> To confirm you are human, please click on the \'<strong class="captchaText"></strong>\' icon'
      });

      $("#auc_request").validate({
        errorElement: "div",
        errorPlacement: function(error, element) {
          error.insertBefore(element);
        },
        submitHandler: function(form) {
          // set SSO cookie so we can then post to BZ form server
          $('#ssoc').val($.cookie('SSO'));
          // spinner
          $('#sb').after(' <img src="/images_www/webadmin/loader2.gif" id="ld2" style="display:inline-block;margin-bottom:-10px;"/>');
          $('#sb').attr('disabled', 'disabled'); // disable submit
          // do the ajax
          $.post('/service/uc-publishing-request/', $('#auc_request').serialize(), function(res){
            // show result
            $("#subres").html(res).show();
            $("#ld2").remove(); // remove spinner
            $.scrollTo($("#tome"),'400');
            $('#sb').removeAttr('disabled'); // enable submit again
            //$("#auc_request").fadeOut();
          });
        }

      });



      if(username=='guest') {
        $('#auf').css('display','none').after('<p>You must be logged in to see the request form. Use the login link at the top of right column.');
      } else {
        $('#auf').css('display','block');
      }

      $('#testedCHECKBOX2').click(function() {
        if($(this).attr('checked')==false) {
          $('#no_p1CHECKBOX2').removeAttr('checked');
          $('#no_p1CHECKBOX2').attr('disabled', 'disabled');
          $('#no_p2CHECKBOX2').removeAttr('checked');
          $('#no_p2CHECKBOX2').attr('disabled', 'disabled');
        } else {
          $('#no_p1CHECKBOX2').removeAttr('disabled');
          $('#no_p2CHECKBOX2').removeAttr('disabled');
        }
      })
    });
    <!--
    function dev_auc() {
      document.auc_request.no_p1CHECKBOX2.disabled = true;
      document.auc_request.no_p1CHECKBOX2.checked = false;
      document.auc_request.no_p2CHECKBOX2.disabled = true;
      document.auc_request.no_p2CHECKBOX2.checked = false;
      document.auc_request.i18nCHECKBOX2.disabled = true;
      document.auc_request.i18nCHECKBOX2.checked = false;
      document.auc_request.l10nCHECKBOX2.disabled = true;
      document.auc_request.l10nCHECKBOX2.checked = false;
      document.auc_request.testedCHECKBOX2.checked = true;
      document.auc_request.testedCHECKBOX2.disabled = true;
    }
    function beta_auc() {
      document.auc_request.testedCHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.checked = true;
      document.auc_request.no_p2CHECKBOX2.disabled = true;
      document.auc_request.no_p2CHECKBOX2.checked = false;
      document.auc_request.i18nCHECKBOX2.disabled = true;
      document.auc_request.i18nCHECKBOX2.checked = false;
      document.auc_request.l10nCHECKBOX2.disabled = true;
      document.auc_request.l10nCHECKBOX2.checked = false;
      document.auc_request.testedCHECKBOX2.checked = true;
    }
    function stable_auc() {
      document.auc_request.testedCHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.checked = true;
      document.auc_request.no_p2CHECKBOX2.disabled = false;
      document.auc_request.no_p2CHECKBOX2.checked = true;
      document.auc_request.i18nCHECKBOX2.disabled = false;
      document.auc_request.i18nCHECKBOX2.checked = true;
      document.auc_request.l10nCHECKBOX2.disabled = false;
      document.auc_request.l10nCHECKBOX2.checked = false;
      document.auc_request.testedCHECKBOX2.checked = true;
    }
    function party() {
      document.auc_request.testedCHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.disabled = false;
      document.auc_request.no_p1CHECKBOX2.checked = true;
      document.auc_request.no_p2CHECKBOX2.disabled = false;
      document.auc_request.no_p2CHECKBOX2.checked = true;
      document.auc_request.i18nCHECKBOX2.disabled = false;
      document.auc_request.i18nCHECKBOX2.checked = false;
      document.auc_request.l10nCHECKBOX2.disabled = false;
      document.auc_request.l10nCHECKBOX2.checked = false;
      document.auc_request.testedCHECKBOX2.checked = true;
    }
    //-->
    /**
     * Create a cookie with the given key and value and other optional parameters.
     *
     * @example $.cookie('the_cookie', 'the_value');
     * @desc Set the value of a cookie.
     * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
     * @desc Create a cookie with all available options.
     * @example $.cookie('the_cookie', 'the_value');
     * @desc Create a session cookie.
     * @example $.cookie('the_cookie', null);
     * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
     * used when the cookie was set.
     *
     * @param String key The key of the cookie.
     * @param String value The value of the cookie.
     * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
     * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
     * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
     * If set to null or omitted, the cookie will be a session cookie and will not be retained
     * when the the browser exits.
     * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
     * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
     * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
     * require a secure protocol (like HTTPS).
     * @type undefined
     *
     * @name $.cookie
     * @cat Plugins/Cookie
     * @author Klaus Hartl/klaus.hartl@stilbuero.de
     */
    /**
     * Get the value of a cookie with the given key.
     *
     * @example $.cookie('the_cookie');
     * @desc Get the value of a cookie.
     *
     * @param String key The key of the cookie.
     * @return The value of the cookie.
     * @type String
     *
     * @name $.cookie
     * @cat Plugins/Cookie
     * @author Klaus Hartl/klaus.hartl@stilbuero.de
     */
    jQuery.cookie = function (key, value, options) {

      // key and value given, set cookie...
      if (arguments.length > 1 && (value === null || typeof value !== "object")) {
        options = jQuery.extend({}, options);

        if (value === null) {
          options.expires = -1;
        }

        if (typeof options.expires === 'number') {
          var days = options.expires, t = options.expires = new Date();
          t.setDate(t.getDate() + days);
        }

        return (document.cookie = [
          encodeURIComponent(key), '=',
          options.raw ? String(value) : encodeURIComponent(String(value)),
          options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
          options.path ? '; path=' + options.path : '',
          options.domain ? '; domain=' + options.domain : '',
          options.secure ? '; secure' : ''
        ].join(''));
      }

      // key and possibly options given, get cookie...
      options = value || {};
      var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
      return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
    };

  
  </script>
  <noscript><span style="font-style: italic;">Note: You must have
      Javascript enabled to get this site working properly.</span> </noscript>
</body>
</html>
