[%# This Source Code Form is subject to the terms of the Mozilla Public
  # License, v. 2.0. If a copy of the MPL was not distributed with this
  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  #
  # This Source Code Form is "Incompatible With Secondary Licenses", as
  # defined by the Mozilla Public License, v. 2.0.
  #%]
  
[% SWITCH field.type %]
  [% CASE [ constants.FIELD_TYPE_FREETEXT,
            constants.FIELD_TYPE_TEXTAREA, 
            constants.FIELD_TYPE_UNKNOWN ] %]
    [% INCLUDE "bug/field-label.html.tmpl"
      field = field
      tag_name = "span"
      editable = 1
    %]
    [% INCLUDE "search/type-select.html.tmpl"
       name = field.name _ "_type",
       types = types, 
       selected = type_selected
    %]    
    <input name="[% field.name FILTER html %]" 
           id="[% field.name FILTER html %]" size="40"
           [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
           value="[% value FILTER html %]" [% 'autofocus' IF focus %]>
  [% CASE constants.FIELD_TYPE_KEYWORDS %]
    [% INCLUDE "bug/field-label.html.tmpl"
      field = field
      tag_name = "span"
      editable = 1
    %]
    [% INCLUDE "search/type-select.html.tmpl"
       name = field.name _ "_type",
       types = types, 
       selected = type_selected
    %]
    <div id="[% field.name FILTER html %]_container">
       <input name="[% field.name FILTER html %]" 
              id="[% field.name FILTER html %]" size="40"
              [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
              value="[% value FILTER html %]" [% 'autofocus' IF focus %]>
       <div id="[% field.name FILTER html %]_autocomplete"></div>
    </div>
    <script type="text/javascript">
      if (typeof YAHOO.bugzilla.field_array === "undefined")
        YAHOO.bugzilla.field_array = [];
      YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [
        [%- FOREACH val = possible_values %]
          [%-# %]"[% val FILTER js %]"
          [%- "," IF NOT loop.last %][% END %]];
      YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
                                            '[% field.name FILTER js %]_autocomplete');
    </script>
  [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
    [% INCLUDE "bug/field-label.html.tmpl"
      field = field
      tag_name = "span"
      editable = 1
    %]
    from <input name="[% field.name FILTER html %]from" 
                id="[% field.name FILTER html %]" 
                size="10" maxlength="10"
                value="[% value.0 FILTER html %]" 
                onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
         <button type="button" class="calendar_button"
                        id="button_calendar_[% field.name FILTER html %]"
                        onclick="showCalendar('[% field.name FILTER js %]')">
           <span>Calendar</span>
         </button>
         <span id="con_calendar_[% field.name FILTER html %]"></span>               
    to <input name="[% field.name FILTER html %]to" 
              id="[% field.name FILTER html %]to" size="10" maxlength="10"
              value="[% value.1 FILTER html %]" 
              onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
       <button type="button" class="calendar_button"
                      id="button_calendar_[% field.name FILTER html %]to"
                      onclick="showCalendar('[% field.name FILTER js %]to')">
         <span>Calendar</span>
       </button>
    <small>(YYYY-MM-DD or relative dates)</small>
    
    <span id="con_calendar_[% field.name FILTER html %]to"></span>
    <script type="text/javascript">
      <!--
        [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
        [% PROCESS "global/calendar.js.tmpl" id = field.name _ 'to' %]
      //--></script>
  [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT, 
            constants.FIELD_TYPE_MULTI_SELECT ] %]
    <div id="container_[% field.name FILTER html %]" class="search_field_grid">      
      [% INCLUDE "bug/field-label.html.tmpl"
        field = field
        editable = 1
        tag_name = "span"
      %]
      <select name="[% field.name FILTER html%]" 
              id="[% field.name FILTER html %]" 
        [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
        multiple="multiple" size="7">
        [% legal_values = ${field.name} %]
        [% IF field.name == "component" %]
          [% legal_values = ${"component_"} %]
        [% END %]
        [% FOREACH current_value = legal_values %]
          [% SET v = current_value.name OR '---' -%]
          [% SET display = display_value(field.name, current_value.name) %]
          <option value="[% v FILTER html %]"
            id="v[% current_value.id FILTER html %]_[% field.name FILTER html %]"
            [% ' selected="selected"' IF value.contains( v ) %]>
            [%~ display FILTER html ~%]
          </option>
        [% END %]
      </select>
    </div>

    [% IF value_controllers.${field.name}.defined %]
      <script type="text/javascript"><!--
        [%+ FILTER collapse %]
          [% FOREACH accessor = value_controllers.${field.name}.keys %]
            [% PROCESS controller_js %]
          [% END %]
        [%~ END ~%]
      // --></script>
    [% END %]
    [% IF duplicates.${field.name}.keys.size %]
      [% SET field_dups = duplicates.${field.name} %]
      [% SET dup_counts = duplicate_count.${field.name} %]
      <script type="text/javascript">
       [%+ FILTER collapse %]
          bz_option_duplicates['[% field.name FILTER js %]'] = {
            [% FOREACH dup = field_dups.keys %]
              [% dup FILTER js %]:[% field_dups.$dup.id FILTER js %]
              [%~ ',' UNLESS loop.last %]
            [% END ~%]
          };
          bz_option_duplicate_count['[% field.name FILTER js %]'] = {
            [% FOREACH dup_target = dup_counts.keys %]
              [% dup_target FILTER js %]:[% dup_counts.$dup_target FILTER js %]
              [%~ ',' UNLESS loop.last %]
            [% END %]
          };
        [% END %]
      </script>
    [% END %]

  [% END %]
[%# END OF SWITCH %]

[% BLOCK controller_js %]
  [%# If there are selected values already, we need to fire the
    # "change" event once the page has loaded, so we can set all
    # the values in all the other <select>s properly.
    #%]
  YAHOO.util.Event.onDOMReady(function() {
      var field = document.getElementById('[% field.name FILTER js %]');
      if (field.selectedIndex != -1) bz_fireEvent(field, 'change');
  });

  [% SET sub_field = value_controllers.${field.name}.$accessor %]
  [% SET prod_per_class = {} %]
  [% IF field.name == "classification" %]
    [% FOREACH p = product %]
      [% prod_per_class.${p.classification_id}.${p.id} = 1 %]
    [% END %]
  [% END %]

  [% FOREACH legal_value = legal_values %]
    [% SET controlled_ids = [] %]
    [% IF field.name == "classification" %]
      [% controlled_ids = prod_per_class.${legal_value.id}.keys %]
    [% ELSE %]
      [% FOREACH sub_value = legal_value.$accessor %]
        [% controlled_ids.push(sub_value.id) %]
      [% END %]
    [% END %]
    [% NEXT IF !controlled_ids.size %]
      showValueWhen('[% sub_field.name FILTER js %]',
                    [[% controlled_ids.join(',') FILTER js %]],
                    '[% field.name FILTER js %]',
                    [% legal_value.id FILTER js %],
                    true);
  [% END %]
[% END %]
