<#--
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.
-->


<div class="screenlet">
    <div class="screenlet-title-bar">
      <div class="h3">${uiLabelMap.ProductFindProductWithIdValue}</div>
    </div>
    <div class="screenlet-body">
        <form name="idsearchform" method="post" action="<@ofbizUrl>FindProductById</@ofbizUrl>" style="margin: 0;">
          <span class="label">${uiLabelMap.CommonId} ${uiLabelMap.CommonValue}:</span> <input type="text" name="idValue" size="20" maxlength="50" value="${idValue!}" />&nbsp;<a href="javascript:document.idsearchform.submit()" class="buttontext">${uiLabelMap.CommonFind}</a>
        </form>
        <br />
        <h1>${uiLabelMap.ProductSearchResultsWithIdValue}: ${idValue!}</h1>
        <#if !goodIdentifications?has_content && !idProduct?has_content>
          <br />
          <h2>&nbsp;${uiLabelMap.ProductNoResultsFound}.</h2>
        <#else/>
          <table cellspacing="0" class="basic-table">
            <#assign rowClass = "1">
            <#if idProduct?has_content>
            <tr valign="middle"<#if rowClass == "1"> class="alternate-row"</#if>>
                <td>
                    ${idProduct.productId}
                </td>
                <td>&nbsp;&nbsp;</td>
                <td>
                    <a href="<@ofbizUrl>EditProduct?productId=${idProduct.productId}</@ofbizUrl>" class="buttontext">${(idProduct.internalName)!}</a>
                    (${uiLabelMap.ProductSearchResultsFound})
                </td>
            </tr>
            </#if>
            <#list goodIdentifications as goodIdentification>
                <#-- toggle the row color -->
                <#if rowClass == "2">
                  <#assign rowClass = "1">
                <#else>
                  <#assign rowClass = "2">
                </#if>
                <#assign product = goodIdentification.getRelatedOne("Product", true)/>
                <#assign goodIdentificationType = goodIdentification.getRelatedOne("GoodIdentificationType", true)/>
                <tr valign="middle"<#if rowClass == "1"> class="alternate-row"</#if>>
                    <td>
                        ${product.productId}
                    </td>
                    <td>&nbsp;&nbsp;</td>
                    <td>
                        <a href="<@ofbizUrl>EditProduct?productId=${product.productId}</@ofbizUrl>" class="buttontext">${(product.internalName)!}</a>
                        (${uiLabelMap.ProductSearchResultsFound} ${goodIdentificationType.get("description",locale)?default(goodIdentification.goodIdentificationTypeId)}.)
                    </td>
                </tr>
            </#list>
          </table>
        </#if>
    </div>
</div>
