<#--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<#if asm_multipleSelect??> <#-- we check only this var and suppose the others are also present -->
<script type="text/javascript">
jQuery(document).ready(function() {
    multiple = jQuery("#${asm_multipleSelect!}");

  <#if asm_title??>
    // set the dropdown "title" if??
    multiple.attr('title', '${asm_title}');
  </#if>
  
    // use asmSelect in Widget Forms
    multiple.asmSelect({
      addItemTarget: 'top',
      sortable: ${asm_sortable!'false'},
      removeLabel: '${uiLabelMap.CommonRemove!'Remove'}'
      //, debugMode: true
    });
      
  <#if asm_relatedField??> <#-- can be used without related field -->
    // track possible relatedField changes
    // on initial focus (focus-field-name must be asm_relatedField) or if the field value changes, select related multi values. 
    typeValue = jQuery('#${asm_typeField}').val();
    jQuery("#${asm_relatedField}").one('focus', function() {
      selectMultipleRelatedValues('${asm_requestName}', '${asm_paramKey}', '${asm_relatedField}', '${asm_multipleSelect}', '${asm_type}', typeValue, '${asm_responseName}');
    });
    jQuery("#${asm_relatedField}").change(function() {
      selectMultipleRelatedValues('${asm_requestName}', '${asm_paramKey}', '${asm_relatedField}', '${asm_multipleSelect}', '${asm_type}', typeValue, '${asm_responseName}');
    });
    selectMultipleRelatedValues('${asm_requestName}', '${asm_paramKey}', '${asm_relatedField}', '${asm_multipleSelect}', '${asm_type}', typeValue, '${asm_responseName}');
  </#if>
  });  
</script>

<style type="text/css">
#${asm_multipleSelectForm} {
    width: ${asm_formSize!700}px; 
    position: relative;
}

.asmListItem {
  width: ${asm_asmListItemPercentOfForm!95}%; 
}
</style>
</#if>
