svn commit: r1736868 [13/20] - in /ofbiz/trunk/applications/order: template/ template/entry/ template/entry/cart/ template/entry/catalog/ template/entry/order/ template/order/ template/product/ template/quote/ template/reports/ template/request/ templa...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1736868 [13/20] - in /ofbiz/trunk/applications/order: template/ template/entry/ template/entry/cart/ template/entry/catalog/ template/entry/order/ template/order/ template/product/ template/quote/ template/reports/ template/request/ templa...

jleroux@apache.org
Added: ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl?rev=1736868&view=auto
==============================================================================
--- ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl (added)
+++ ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl Mon Mar 28 11:14:22 2016
@@ -0,0 +1,186 @@
+<#--
+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.
+-->
+
+<#escape x as x?xml>
+
+<#list shipGroups as shipGroup>
+  <#assign data = groupData.get(shipGroup.shipGroupSeqId)>
+
+  <#-- print the order ID, ship group, and their bar codes -->
+
+  <fo:table table-layout="fixed" space-after.optimum="10pt">
+    <fo:table-column/>
+    <fo:table-column/>
+    <fo:table-body>
+      <fo:table-row>
+        <fo:table-cell>
+          <fo:block font-size="14pt">${uiLabelMap.OrderOrder} #${shipGroup.orderId}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell>
+          <fo:block text-align="right">
+            <fo:instream-foreign-object>
+              <barcode:barcode xmlns:barcode="http://barcode4j.krysalis.org/ns" message="${shipGroup.orderId}">
+                <barcode:code39><barcode:height>8mm</barcode:height></barcode:code39>
+              </barcode:barcode>
+            </fo:instream-foreign-object>
+          </fo:block>
+        </fo:table-cell>
+      </fo:table-row>
+      <fo:table-row>
+        <fo:table-cell>
+          <fo:block font-size="14pt">${uiLabelMap.OrderShipGroup} #${shipGroup.shipGroupSeqId}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell>
+          <fo:block text-align="right">
+            <fo:instream-foreign-object>
+              <barcode:barcode xmlns:barcode="http://barcode4j.krysalis.org/ns" message="${shipGroup.shipGroupSeqId}">
+                <barcode:code39><barcode:height>8mm</barcode:height></barcode:code39>
+              </barcode:barcode>
+            </fo:instream-foreign-object>
+          </fo:block>
+        </fo:table-cell>
+      </fo:table-row>
+    </fo:table-body>
+  </fo:table>
+
+  <#-- print the address, carrier, and shipment dates -->
+
+  <fo:table table-layout="fixed" space-after.optimum="10pt">
+    <fo:table-column column-width="proportional-column-width(2)"/>
+    <fo:table-column column-width="proportional-column-width(1)"/>
+    <fo:table-column column-width="proportional-column-width(1)"/>
+    <fo:table-body>
+      <fo:table-row>
+        <fo:table-cell number-rows-spanned="4">
+          <#assign address = data.address!>
+          <fo:block>${uiLabelMap.CommonTo}: ${address.toName!}</fo:block>
+          <#if address.attnName?has_content>
+          <fo:block>${uiLabelMap.CommonAttn}: ${address.attnName!}</fo:block>
+          </#if>
+          <fo:block>${address.address1!}</fo:block>
+          <fo:block>${address.address2!}</fo:block>
+          <fo:block>
+            ${address.city!}<#if address.stateProvinceGeoId?has_content>, ${address.stateProvinceGeoId}</#if>
+            ${address.postalCode!} ${address.countryGeoId!}
+          </fo:block>
+
+          <#if data.phoneNumber??>
+            <fo:block><#if data.phoneNumber.areaCode??>(${data.phoneNumber.areaCode}) </#if>${data.phoneNumber.contactNumber}</fo:block>
+          </#if>
+        </fo:table-cell>
+      </fo:table-row>
+      <fo:table-row>
+        <fo:table-cell><fo:block font-weight="bold">${uiLabelMap.ProductShipmentMethod}</fo:block></fo:table-cell>
+        <fo:table-cell><#if data.carrierShipmentMethod??><fo:block>${data.carrierShipmentMethod.partyId} ${data.shipmentMethodType.description}</fo:block></#if></fo:table-cell>
+      </fo:table-row>
+      <fo:table-row>
+        <fo:table-cell><fo:block font-weight="bold">${uiLabelMap.OrderShipBeforeDate}</fo:block></fo:table-cell>
+        <fo:table-cell><fo:block>${shipGroup.shipByDate?default("N/A")}</fo:block></fo:table-cell>
+      </fo:table-row>
+      <fo:table-row>
+        <fo:table-cell><fo:block font-weight="bold">${uiLabelMap.OrderShipAfterDate}</fo:block></fo:table-cell>
+        <fo:table-cell><fo:block>${shipGroup.shipAfterDate?default("N/A")}</fo:block></fo:table-cell>
+      </fo:table-row>
+    </fo:table-body>
+  </fo:table>
+
+  <#assign lines = data.lines>
+  <fo:table table-layout="fixed">
+    <fo:table-column column-width="proportional-column-width(2)"/>
+    <fo:table-column column-width="proportional-column-width(3)"/>
+    <fo:table-column column-width="proportional-column-width(1)"/>
+    <fo:table-column column-width="proportional-column-width(1)"/>
+    <fo:table-column column-width="proportional-column-width(1)"/>
+
+    <fo:table-header>
+      <fo:table-row font-weight="bold">
+        <fo:table-cell background-color="#D4D0C8" height="20pt" display-align="center" border-top-style="solid" border-bottom-style="solid">
+          <fo:block>${uiLabelMap.ProductProduct}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="#D4D0C8" height="20pt" display-align="center" border-top-style="solid" border-bottom-style="solid">
+          <fo:block>${uiLabelMap.CommonDescription}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="#D4D0C8" text-align="right" height="20pt" display-align="center" border-top-style="solid" border-bottom-style="solid">
+          <fo:block>${uiLabelMap.OrderQuantityInShipGroup}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="#D4D0C8" text-align="right" height="20pt" display-align="center" border-top-style="solid" border-bottom-style="solid">
+          <fo:block>${uiLabelMap.OrderQuantityShipped}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="#D4D0C8" text-align="right" height="20pt" display-align="center" border-top-style="solid" border-bottom-style="solid">
+          <fo:block>${uiLabelMap.ProductOpenQuantity}</fo:block>
+        </fo:table-cell>
+      </fo:table-row>
+    </fo:table-header>
+    <fo:table-body>
+
+      <#list lines as line>
+        <#if ((line_index % 2) == 0)>
+          <#assign rowColor = "white">
+        <#else>
+          <#assign rowColor = "#CCCCCC">
+        </#if>
+
+      <fo:table-row>
+        <fo:table-cell background-color="${rowColor}">
+          <fo:block>${line.product.productId}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}">
+          <fo:block>${line.orderItem.itemDescription!}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}">
+          <fo:block text-align="right">${line.quantityInGroup?default(0)}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}">
+          <fo:block text-align="right">${line.quantityShipped?default(0)}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}">
+          <fo:block text-align="right">${line.quantityOpen?default(0)}</fo:block>
+        </fo:table-cell>
+
+      </fo:table-row>
+
+      <#list line.expandedList! as expandedLine>
+      <fo:table-row>
+        <fo:table-cell background-color="${rowColor}" font-style="italic">
+          <fo:block margin-left="20pt">${expandedLine.product.productId}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}" font-style="italic">
+          <fo:block margin-left="20pt">${expandedLine.product.internalName}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}" font-style="italic">
+          <fo:block text-align="right">${expandedLine.quantityInGroup?default(0)}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}" font-style="italic">
+          <fo:block text-align="right">${expandedLine.quantityShipped?default(0)}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell background-color="${rowColor}" font-style="italic">
+          <fo:block text-align="right">${expandedLine.quantityOpen?default(0)}</fo:block>
+        </fo:table-cell>
+      </fo:table-row>
+      </#list>
+
+      </#list>
+
+  </fo:table-body>
+</fo:table>
+
+  <#if shipGroup_has_next><fo:block break-before="page"/></#if>
+</#list>
+
+</#escape>

Propchange: ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/applications/order/template/order/shipGroups.fo.ftl
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/applications/order/template/order/transitions.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/template/order/transitions.ftl?rev=1736868&view=auto
==============================================================================
--- ofbiz/trunk/applications/order/template/order/transitions.ftl (added)
+++ ofbiz/trunk/applications/order/template/order/transitions.ftl Mon Mar 28 11:14:22 2016
@@ -0,0 +1,107 @@
+<#--
+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 inProcess??>
+<div class="screenlet">
+  <div class="screenlet-title-bar">
+    <ul>
+      <li class="h3">${uiLabelMap.OrderProcessingStatus}</li>
+    </ul>
+    <br class="clear"/>
+  </div>
+  <div class="screenlet-body">
+    <table class="basic-table" cellspacing='0'>
+      <tr>
+        <td>
+          <!-- Suspended Processes -->
+          <#if workEffortStatus == "WF_SUSPENDED">
+            <form action="<@ofbizUrl>releasehold</@ofbizUrl>" method="post" name="activityForm">
+              <input type="hidden" name="workEffortId" value="${workEffortId}" />
+              <table class="basic-table" cellspacing='0'>
+                <tr>
+                  <td>${uiLabelMap.OrderProcessingInHold}&nbsp;${uiLabelMap.OrderProcessingInHoldNote}</td>
+                  <td align="right" valign="center">
+                    <a href="javascript:document.activityForm.submit()" class="buttontext">${uiLabelMap.OrderRelease}</a>
+                  </td>
+                </tr>
+              </table>
+            </form>
+          </#if>
+          <!-- Active Processes -->
+          <#if workEffortStatus == "WF_RUNNING">
+            <form action="<@ofbizUrl>holdorder</@ofbizUrl>" method="post" name="activityForm">
+              <input type="hidden" name="workEffortId" value="${workEffortId}" />
+              <table class="basic-table" cellspacing='0'>
+                <tr>
+                  <td>${uiLabelMap.OrderProcessingInActive}</td>
+                  <td align="right" valign="center">
+                    <a href="javascript:document.activityForm.submit()" class="buttontext">${uiLabelMap.OrderHold}</a>
+                  </td>
+                </tr>
+              </table>
+            </form>
+          </#if>
+        </td>
+      </tr>
+    </table>
+  </div>
+</div>
+</#if>
+<br />
+<#if wfTransitions?? && wfTransitions?has_content>
+<div class="screenlet">
+  <div class="screenlet-title-bar">
+    <ul>
+      <li class="h3">${uiLabelMap.OrderProcessingTransitions}</li>
+    </ul>
+    <br class="clear"/>
+  </div>
+  <div class="screenlet-body">
+    <table class="basic-table" cellspacing='0'>
+      <tr>
+        <td>
+          <form action="<@ofbizUrl>completeassignment</@ofbizUrl>" method="post" name="transitionForm">
+            <input type="hidden" name="workEffortId" value="${workEffortId}" />
+            <input type="hidden" name="partyId" value="${assignPartyId}" />
+            <input type="hidden" name="roleTypeId" value="${assignRoleTypeId}" />
+            <input type="hidden" name="fromDate" value="${fromDate}" />
+            <table class="basic-table" cellspacing='0'>
+              <tr>
+                <td>
+                  <select name="approvalCode">
+                    <#list wfTransitions as trans>
+                      <#if trans.extendedAttributes?has_content>
+                        <#assign attrs = Static["org.ofbiz.base.util.StringUtil"].strToMap(trans.extendedAttributes)>
+                        <#if attrs.approvalCode??>
+                          <option value="${attrs.approvalCode}">${trans.transitionName}</option>
+                        </#if>
+                      </#if>
+                    </#list>
+                  </select>
+                </td>
+                <td valign="center">
+                  <a href="javascript:document.transitionForm.submit()" class="buttontext">${uiLabelMap.CommonContinue}</a>
+                </td>
+              </tr>
+            </table>
+          </form>
+        </td>
+      </tr>
+    </table>
+</#if>
\ No newline at end of file

Propchange: ofbiz/trunk/applications/order/template/order/transitions.ftl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/applications/order/template/order/transitions.ftl
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/applications/order/template/order/transitions.ftl
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/applications/order/template/order/viewimage.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/template/order/viewimage.ftl?rev=1736868&view=auto
==============================================================================
--- ofbiz/trunk/applications/order/template/order/viewimage.ftl (added)
+++ ofbiz/trunk/applications/order/template/order/viewimage.ftl Mon Mar 28 11:14:22 2016
@@ -0,0 +1,20 @@
+<#--
+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.
+-->
+<#assign imageUrl = wrapper.get("${orderContentTypeId}", "url")>
+<image src="<@ofbizContentUrl>${imageUrl}</@ofbizContentUrl>"/>

Propchange: ofbiz/trunk/applications/order/template/order/viewimage.ftl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/applications/order/template/order/viewimage.ftl
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/applications/order/template/order/viewimage.ftl
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/applications/order/template/product/configproductdetail.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/template/product/configproductdetail.ftl?rev=1736868&view=auto
==============================================================================
--- ofbiz/trunk/applications/order/template/product/configproductdetail.ftl (added)
+++ ofbiz/trunk/applications/order/template/product/configproductdetail.ftl Mon Mar 28 11:14:22 2016
@@ -0,0 +1,734 @@
+<#--
+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.
+-->
+<#-- variable setup -->
+<#assign productContentWrapper = productContentWrapper!>
+<#assign price = priceMap!>
+<#-- end variable setup -->
+
+<#-- virtual product javascript -->
+${virtualJavaScript!}
+<script language="JavaScript" type="text/javascript">
+<!--
+    var detailImageUrl = null;
+     function setAddProductId(name) {
+        document.addform.add_product_id.value = name;
+        if (document.addform.quantity == null) return;
+        if (name == 'NULL' || isVirtual(name) == true) {
+            document.addform.quantity.disabled = true;
+        } else {
+            document.addform.quantity.disabled = false;
+        }
+     }
+     function isVirtual(product) {
+        var isVirtual = false;
+        <#if virtualJavaScript??>
+        for (i = 0; i < VIR.length; i++) {
+            if (VIR[i] == product) {
+                isVirtual = true;
+            }
+        }
+        </#if>
+        return isVirtual;
+     }
+
+    function addItem() {
+        document.configform.action = document.addform.action;
+        document.configform.quantity.value = document.addform.quantity.value;
+        document.configform.submit();
+    }
+    function verifyConfig() {
+        document.configform.submit();
+    }
+
+    function popupDetail() {
+        var defaultDetailImage = "${firstDetailImage?default(mainDetailImageUrl?default("_NONE_"))}";
+        if (defaultDetailImage == null || defaultDetailImage == "null" || defaultDetailImage == "") {
+            defaultDetailImage = "_NONE_";
+        }
+
+        if (detailImageUrl == null || detailImageUrl == "null") {
+            detailImageUrl = defaultDetailImage;
+        }
+
+        if (detailImageUrl == "_NONE_") {
+            hack = document.createElement('span');
+            hack.innerHTML="${uiLabelMap.CommonNoDetailImageAvailableToDisplay}";
+            showErrorAlert("${uiLabelMap.CommonErrorMessage2}","${uiLabelMap.CommonNoDetailImageAvailableToDisplay}");
+            return;
+        }
+        detailImageUrl = detailImageUrl.replace(/\&\#47;/g, "/");
+        popUp("<@ofbizUrl>detailImage?detail=" + detailImageUrl + "</@ofbizUrl>", 'detailImage', '400', '550');
+    }
+
+    function toggleAmt(toggle) {
+        if (toggle == 'Y') {
+            changeObjectVisibility("add_amount", "visible");
+        }
+
+        if (toggle == 'N') {
+            changeObjectVisibility("add_amount", "hidden");
+        }
+    }
+
+    function findIndex(name) {
+        for (i = 0; i < OPT.length; i++) {
+            if (OPT[i] == name) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    function getList(name, index, src) {
+        currentFeatureIndex = findIndex(name);
+
+        if (currentFeatureIndex == 0) {
+            // set the images for the first selection
+            if (IMG[index] != null) {
+                if (document.images['mainImage'] != null) {
+                    document.images['mainImage'].src = IMG[index];
+                    detailImageUrl = DET[index];
+                }
+            }
+
+            // set the drop down index for swatch selection
+            document.forms["addform"].elements[name].selectedIndex = (index*1)+1;
+        }
+
+        if (currentFeatureIndex < (OPT.length-1)) {
+            // eval the next list if there are more
+            var selectedValue = document.forms["addform"].elements[name].options[(index*1)+1].value;
+            eval("list" + OPT[(currentFeatureIndex+1)] + selectedValue + "()");
+
+            // set the product ID to NULL to trigger the alerts
+            setAddProductId('NULL');
+        } else {
+            // this is the final selection -- locate the selected index of the last selection
+            var indexSelected = document.forms["addform"].elements[name].selectedIndex;
+
+            // using the selected index locate the sku
+            var sku = document.forms["addform"].elements[name].options[indexSelected].value;
+
+            // set the product ID
+            setAddProductId(sku);
+
+            // check for amount box
+            toggleAmt(checkAmtReq(sku));
+        }
+    }
+ //-->
+ </script>
+
+<script language="JavaScript" type="text/javascript">
+<!--
+
+jQuery(document).ready(function () {
+    jQuery('#configFormId').change(getConfigDetails)
+});
+
+function getConfigDetails(event) {
+        jQuery.ajax({
+            url: '<@ofbizUrl>getConfigDetailsEvent</@ofbizUrl>',
+            type: 'POST',
+            data: jQuery('#configFormId').serialize(),
+            success: function(data) {
+                  var totalPrice = data.totalPrice;
+                  var configId = data.configId;
+                  document.getElementById('totalPrice').innerHTML = totalPrice;
+                  document.addToShoppingList.configId.value = configId;
+                  event.stop();
+            }
+        });
+}
+
+-->
+</script>
+
+<div id="productdetail">
+
+<table>
+
+  <#-- Category next/previous -->
+  <#if category??>
+    <tr>
+      <td colspan="2" align="right">
+        <#if previousProductId??>
+          <a href='<@ofbizUrl>product/~category_id=${categoryId!}/~product_id=${previousProductId!}</@ofbizUrl>' class="buttontext">${uiLabelMap.CommonPrevious}</a>&nbsp;|&nbsp;
+        </#if>
+        <a href="<@ofbizUrl>category/~category_id=${categoryId!}</@ofbizUrl>" class="buttontext">${(category.categoryName)?default(category.description)!}</a>
+        <#if nextProductId??>
+          &nbsp;|&nbsp;<a href='<@ofbizUrl>product/~category_id=${categoryId!}/~product_id=${nextProductId!}</@ofbizUrl>' class="buttontext">${uiLabelMap.CommonNext}</a>
+        </#if>
+      </td>
+    </tr>
+  </#if>
+
+  <tr><td colspan="2"></td></tr>
+
+  <#-- Product image/name/price -->
+  <tr>
+    <td valign="top" width="0">
+      <#assign productLargeImageUrl = productContentWrapper.get("LARGE_IMAGE_URL", "url")!>
+      <#-- remove the next two lines to always display the virtual image first (virtual images must exist) -->
+      <#if firstLargeImage?has_content>
+        <#assign productLargeImageUrl = firstLargeImage>
+      </#if>
+      <#if productLargeImageUrl?string?has_content>
+        <a href="javascript:popupDetail();"><img src='<@ofbizContentUrl>${contentPathPrefix!}${productLargeImageUrl!}</@ofbizContentUrl>' name='mainImage' vspace='5' hspace='5' class='cssImgXLarge' align='left' alt="" /></a>
+      </#if>
+    </td>
+    <td align="right" valign="top">
+      <h2>${productContentWrapper.get("PRODUCT_NAME", "html")!}</h2>
+      <div>${productContentWrapper.get("DESCRIPTION", "html")!}</div>
+      <div><b>${product.productId!}</b></div>
+      <#-- example of showing a certain type of feature with the product -->
+      <#if sizeProductFeatureAndAppls?has_content>
+        <div>
+          <#if (sizeProductFeatureAndAppls?size == 1)>
+            <#-- TODO : i18n -->
+            Size:
+          <#else>
+            Sizes Available:
+          </#if>
+          <#list sizeProductFeatureAndAppls as sizeProductFeatureAndAppl>
+            ${sizeProductFeatureAndAppl.description?default(sizeProductFeatureAndAppl.abbrev?default(sizeProductFeatureAndAppl.productFeatureId))}<#if sizeProductFeatureAndAppl_has_next>,</#if>
+          </#list>
+        </div>
+      </#if>
+
+      <#-- for prices:
+              - if totalPrice is present, use it (totalPrice is the price calculated from the parts)
+              - if price < competitivePrice, show competitive or "Compare At" price
+              - if price < listPrice, show list price
+              - if price < defaultPrice and defaultPrice < listPrice, show default
+              - if isSale show price with salePrice style and print "On Sale!"
+      -->
+      <#if totalPrice??>
+        <div>${uiLabelMap.ProductAggregatedPrice}: <span id='totalPrice' class='basePrice'><@ofbizCurrency amount=totalPrice isoCode=totalPrice.currencyUsed/></span></div>
+      <#else>
+      <#if price.competitivePrice?? && price.price?? && price.price < price.competitivePrice>
+        <div>${uiLabelMap.ProductCompareAtPrice}: <span class='basePrice'><@ofbizCurrency amount=price.competitivePrice isoCode=price.currencyUsed/></span></div>
+      </#if>
+      <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+        <div>${uiLabelMap.ProductListPrice}: <span class='basePrice'><@ofbizCurrency amount=price.listPrice isoCode=price.currencyUsed/></span></div>
+      </#if>
+      <#if price.listPrice?? && price.defaultPrice?? && price.price?? && price.price < price.defaultPrice && price.defaultPrice < price.listPrice>
+        <div>${uiLabelMap.ProductRegularPrice}: <span class='basePrice'><@ofbizCurrency amount=price.defaultPrice isoCode=price.currencyUsed/></span></div>
+      </#if>
+      <div>
+
+          <#if price.isSale?? && price.isSale>
+            <span class='salePrice'>${uiLabelMap.OrderOnSale}!</span>
+            <#assign priceStyle = "salePrice">
+          <#else>
+            <#assign priceStyle = "regularPrice">
+          </#if>
+            ${uiLabelMap.OrderYourPrice}: <#if "Y" = product.isVirtual!> from </#if><span class='${priceStyle}'><@ofbizCurrency amount=price.price isoCode=price.currencyUsed/></span>
+
+      </div>
+      <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+        <#assign priceSaved = price.listPrice - price.price>
+        <#assign percentSaved = (priceSaved / price.listPrice) * 100>
+        <div>${uiLabelMap.OrderSave}: <span class="basePrice"><@ofbizCurrency amount=priceSaved isoCode=price.currencyUsed/> (${percentSaved?int}%)</span></div>
+      </#if>
+      </#if>
+
+      <#-- Included quantities/pieces -->
+      <#if product.quantityIncluded?? && product.quantityIncluded != 0>
+        <div>${uiLabelMap.OrderIncludes}:
+          ${product.quantityIncluded!}
+          ${product.quantityUomId!}
+        </div>
+      </#if>
+      <#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+        <div>${uiLabelMap.OrderPieces}:
+          ${product.piecesIncluded}
+        </div>
+      </#if>
+      <#if daysToShip??>
+        <div>${uiLabelMap.ProductUsuallyShipsIn} ${daysToShip} ${uiLabelMap.CommonDays}</div>
+      </#if>
+
+      <#-- show tell a friend details only in ecommerce application -->
+      <div>&nbsp;</div>
+      <div>
+        <a href="javascript:popUpSmall('<@ofbizUrl>tellafriend?productId=${product.productId}</@ofbizUrl>','tellafriend');" class="buttontext">${uiLabelMap.CommonTellAFriend}</a>
+      </div>
+
+      <#if disFeatureList?? && 0 < disFeatureList.size()>
+        <p>&nbsp;</p>
+        <#list disFeatureList as currentFeature>
+            <div>
+                ${currentFeature.productFeatureTypeId}:&nbsp;${currentFeature.description}
+            </div>
+        </#list>
+            <div>&nbsp;</div>
+      </#if>
+
+      <form method="post" action="<@ofbizUrl>additem<#if requestAttributes._CURRENT_VIEW_??>/${requestAttributes._CURRENT_VIEW_}</#if></@ofbizUrl>" name="addform" style='margin: 0;'>
+        <#assign inStock = true>
+        <#-- Variant Selection -->
+        <#if product.isVirtual?? && product.isVirtual?upper_case == "Y">
+          <#if variantTree?? && 0 < variantTree.size()>
+            <#list featureSet as currentType>
+              <div>
+                <select name="FT${currentType}" onchange="javascript:getList(this.name, (this.selectedIndex-1), 1);">
+                  <option>${featureTypes.get(currentType)}</option>
+                </select>
+              </div>
+            </#list>
+            <input type='hidden' name="product_id" value='${product.productId}' />
+            <input type='hidden' name="add_product_id" value='NULL' />
+          <#else>
+            <input type='hidden' name="product_id" value='${product.productId}' />
+            <input type='hidden' name="add_product_id" value='NULL' />
+            <div class='tabletext'><b>${uiLabelMap.ProductItemOutOfStock}.</b></div>
+            <#assign inStock = false>
+          </#if>
+        <#else>
+          <input type='hidden' name="product_id" value='${product.productId}' />
+          <input type='hidden' name="add_product_id" value='${product.productId}' />
+          <#if productNotAvailable??>
+            <#assign isStoreInventoryRequired = Static["org.ofbiz.product.store.ProductStoreWorker"].isStoreInventoryRequired(request, product)>
+            <#if isStoreInventoryRequired>
+              <div class='tabletext'><b>${uiLabelMap.ProductItemOutOfStock}.</b></div>
+              <#assign inStock = false>
+            <#else>
+              <div class='tabletext'><b>${product.inventoryMessage!}</b></div>
+            </#if>
+          </#if>
+        </#if>
+
+        </td></tr><tr><td colspan="2" align="right">
+
+        <#-- check to see if introductionDate hasn't passed yet -->
+        <#if product.introductionDate?? && nowTimestamp.before(product.introductionDate)>
+          <p>&nbsp;</p>
+          <div class='tabletext' style='color: red;'>${uiLabelMap.ProductProductNotYetMadeAvailable}.</div>
+        <#-- check to see if salesDiscontinuationDate has passed -->
+        <#elseif product.salesDiscontinuationDate?? && nowTimestamp.after(product.salesDiscontinuationDate)>
+          <div class='tabletext' style='color: red;'>${uiLabelMap.ProductProductNoLongerAvailable}.</div>
+        <#-- check to see if the product requires inventory check and has inventory -->
+        <#else>
+          <#if inStock>
+            <#if product.requireAmount?default("N") == "Y">
+              <#assign hiddenStyle = "visible">
+            <#else>
+              <#assign hiddenStyle = "hidden">
+            </#if>
+            <div id="add_amount" class="${hiddenStyle}">
+              <span style="white-space: nowrap;"><b>Amount:</b></span>&nbsp;
+              <input type="text" size="5" name="add_amount" value="" />
+            </div>
+            <#if !configwrapper.isCompleted()>
+              <div>[${uiLabelMap.EcommerceProductNotConfigured}]&nbsp;
+              <input type="text" size="5" name="quantity" value="0" disabled="disabled" /></div>
+            <#else>
+              <a href="javascript:addItem()" class="buttontext"><span style="white-space: nowrap;">${uiLabelMap.OrderAddToCart}</span></a>&nbsp;
+              <input type="text" size="5" name="quantity" value="1" />
+                <#if minimumQuantity?? &&  minimumQuantity &gt; 0>
+                  Minimum order quantity is ${minimumQuantity}.
+               </#if>
+            </#if>
+          </#if>
+          <#if requestParameters.category_id??>
+            <input type='hidden' name='category_id' value='${requestParameters.category_id}' />
+          </#if>
+        </#if>
+      </form>
+    <div>
+      <#if sessionAttributes.userLogin?has_content && sessionAttributes.userLogin.userLoginId != "anonymous">
+
+        <form name="addToShoppingList" method="post" action="<@ofbizUrl>addItemToShoppingList<#if requestAttributes._CURRENT_VIEW_??>/${requestAttributes._CURRENT_VIEW_}</#if></@ofbizUrl>">
+          <input type="hidden" name="productId" value="${product.productId}" />
+          <input type="hidden" name="product_id" value="${product.productId}" />
+          <input type="hidden" name="configId" value="${configId!}" />
+          <select name="shoppingListId">
+            <#if shoppingLists?has_content>
+              <#list shoppingLists as shoppingList>
+                <option value="${shoppingList.shoppingListId}">${shoppingList.listName}</option>
+              </#list>
+            </#if>
+            <option value="">---</option>
+            <option value="">${uiLabelMap.OrderNewShoppingList}</option>
+          </select>
+          &nbsp;&nbsp;
+          <input type="text" size="5" name="quantity" value="1" />
+          <a href="javascript:document.addToShoppingList.submit();" class="buttontext">[${uiLabelMap.OrderAddToShoppingList}]</a>
+        </form>
+      <#else> <br />
+        ${uiLabelMap.OrderYouMust} <a href="<@ofbizUrl>checkLogin/showcart</@ofbizUrl>" class="buttontext">${uiLabelMap.CommonBeLogged}</a>
+        ${uiLabelMap.OrderToAddSelectedItemsToShoppingList}.&nbsp;
+      </#if>
+      </div>
+      <#-- Prefill first select box (virtual products only) -->
+      <#if variantTree?? && 0 < variantTree.size()>
+        <script language="JavaScript" type="text/javascript">eval("list" + "${featureOrderFirst}" + "()");</script>
+      </#if>
+
+      <#-- Swatches (virtual products only) -->
+      <#if variantSample?? && 0 < variantSample.size()>
+        <#assign imageKeys = variantSample.keySet()>
+        <#assign imageMap = variantSample>
+        <p>&nbsp;</p>
+        <table cellspacing="0" cellpadding="0">
+          <tr>
+            <#assign maxIndex = 7>
+            <#assign indexer = 0>
+            <#list imageKeys as key>
+              <#assign swatchProduct = imageMap.get(key)>
+              <#if swatchProduct?has_content && indexer < maxIndex>
+                <#assign imageUrl = Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(swatchProduct, "SMALL_IMAGE_URL", request, "url")!>
+                <#if !imageUrl?string?has_content>
+                  <#assign imageUrl = productContentWrapper.get("SMALL_IMAGE_URL", "url")!>
+                </#if>
+                <#if !imageUrl?string?has_content>
+                  <#assign imageUrl = "/images/defaultImage.jpg">
+                </#if>
+                <td align="center" valign="bottom">
+                  <a href="javascript:getList('FT${featureOrderFirst}','${indexer}',1);"><img src="<@ofbizContentUrl>${contentPathPrefix!}${imageUrl}</@ofbizContentUrl>" class='cssImgSmall' alt="" /></a>
+                  <br />
+                  <a href="javascript:getList('FT${featureOrderFirst}','${indexer}',1);" class="buttontext">${key}</a>
+                </td>
+              </#if>
+              <#assign indexer = indexer + 1>
+            </#list>
+            <#if (indexer > maxIndex)>
+              <div><b>${uiLabelMap.OrderMoreOptionsAvailable}.</b></div>
+            </#if>
+          </tr>
+        </table>
+      </#if>
+    </td>
+  </tr>
+
+
+
+  <#-- Long description of product -->
+  <tr>
+    <td colspan="2">
+      <div>${productContentWrapper.get("LONG_DESCRIPTION", "html")!}</div>
+    </td>
+  </tr>
+
+  <tr><td colspan="2"><hr class='sepbar'/></td></tr>
+
+  <#-- Any attributes/etc may go here -->
+  <#-- Product Configurator -->
+  <tr>
+    <td colspan="2">
+      <form name="configform" id="configFormId" method="post" action="<@ofbizUrl>product<#if requestAttributes._CURRENT_VIEW_??>/${requestAttributes._CURRENT_VIEW_}</#if></@ofbizUrl>">
+        <input type='hidden' name='add_product_id' value='${product.productId}' />
+        <input type='hidden' name='add_category_id' value='' />
+        <input type='hidden' name='quantity' value='1' />
+
+        <input type='hidden' name='product_id' value='${product.productId}' />
+        <table >
+          <tr>
+            <td>
+                <div>
+                    <a href="javascript:verifyConfig();" class="buttontext">${uiLabelMap.OrderVerifyConfiguration}</a>
+                </div>
+            </td>
+          </tr>
+
+          <#assign counter = 0>
+          <#assign questions = configwrapper.questions>
+          <#list questions as question>
+          <tr>
+            <td>
+              <div>${question.question}</div>
+              <#if question.isFirst()>
+                <a name='#${question.getConfigItem().getString("configItemId")}'></a>
+                <div>${StringUtil.wrapString(question.description!)}</div>
+                <#assign instructions = question.content.get("INSTRUCTIONS", "html")!>
+                <#if instructions?has_content>
+                  <a href="javascript:showErrorAlert("${uiLabelMap.CommonErrorMessage2}","${instructions}");" class="buttontext">Instructions</a>
+                </#if>
+                <#assign image = question.content.get("IMAGE_URL", "url")!>
+                <#if image?string?has_content>
+                  <img src='<@ofbizContentUrl>${contentPathPrefix!}${image!}</@ofbizContentUrl>' vspace='5' hspace='5' class='cssImgXLarge' align='left' alt="" />
+                </#if>
+              <#else>
+                <div><a href='#${question.getConfigItem().getString("configItemId")}' class="buttontext">Details</a></div>
+              </#if>
+            </td>
+          </tr>
+          <tr>
+            <td>
+            <#if question.isStandard()>
+              <#-- Standard item: all the options are always included -->
+              <#assign options = question.options>
+              <#list options as option>
+                <div>${option.description} <#if !option.isAvailable()> (*)</#if></div>
+              </#list>
+            <#else>
+              <#if question.isSingleChoice()>
+                <#-- Single choice question -->
+                <#assign options = question.options>
+                <#assign selectedOption = question.getSelected()!>
+                <#assign selectedPrice = 0.0>
+                <#if selectedOption?has_content>
+                  <#assign selectedPrice = selectedOption.getPrice()>
+                </#if>
+                <#-- The single choice input can be implemented with radio buttons or a select field -->
+                <#if renderSingleChoiceWithRadioButtons?? && "Y" == renderSingleChoiceWithRadioButtons>
+                <#-- This is the radio button implementation -->
+                <#if !question.isMandatory()>
+                  <div><input type="radio" name='${counter}' value='<#if !question.isSelected()>checked</#if>' /> No option</div>
+                </#if>
+                <#assign optionCounter = 0>
+                <#list options as option>
+                  <#assign componentCounter = 0>
+                  <#if showOffsetPrice?? && "Y" == showOffsetPrice>
+                    <#assign shownPrice = option.price - selectedPrice>
+                  <#else>
+                    <#assign shownPrice = option.price>
+                  </#if>
+                    <#-- Render virtual compoennts -->
+                    <#if option.hasVirtualComponent()>
+                      <div >
+                        <input type='radio' name='${counter}' id="${counter}_${optionCounter}" value='${optionCounter}' onclick="javascript:checkOptionVariants('${counter}_${optionCounter}');" />
+                        ${option.description} <#if !option.isAvailable()> (*)</#if>
+                        <#assign components = option.getComponents()>
+                        <#list components as component>
+                          <#if (option.isVirtualComponent(component))>
+                            ${setRequestAttribute("inlineProductId", component.productId)}
+                            ${setRequestAttribute("inlineCounter", counter+ "_" +optionCounter + "_"+componentCounter)}
+                            ${setRequestAttribute("addJavaScript", componentCounter)}
+                            ${screens.render(inlineProductDetailScreen)}
+                            <#assign componentCounter = componentCounter + 1>
+                          </#if>
+                        </#list>
+                      </div>
+                    <#else>
+                      <div>
+                        <input type="radio" name='${counter}' value='${optionCounter}' <#if option.isSelected() || (!question.isSelected() && optionCounter == 0 && question.isMandatory())>checked="checked"</#if> />
+                        ${option.description}&nbsp;
+                        <#if (shownPrice > 0)>+<@ofbizCurrency amount=shownPrice isoCode=price.currencyUsed/>&nbsp;</#if>
+                        <#if (shownPrice < 0)>-<@ofbizCurrency amount=(-1*shownPrice) isoCode=price.currencyUsed/>&nbsp;</#if>
+                        <#if !option.isAvailable()>(*)</#if>
+                      </div>
+                    </#if>
+                  <#assign optionCounter = optionCounter + 1>
+                </#list>
+                <#else>
+                <#-- And this is the select box implementation -->
+                <select name='${counter}'>
+                <#if !question.isMandatory()>
+                  <option value=''>---</option>
+                </#if>
+                <#assign options = question.options>
+                <#assign optionCounter = 0>
+                <#list options as option>
+                  <#if showOffsetPrice?? && "Y" == showOffsetPrice>
+                    <#assign shownPrice = option.price - selectedPrice>
+                  <#else>
+                    <#assign shownPrice = option.price>
+                  </#if>
+                  <#if option.isSelected()>
+                    <#assign optionCounter = optionCounter + 1>
+                  </#if>
+                  <option value='${optionCounter}' <#if option.isSelected()>selected="selected"</#if>>
+                    ${option.description}&nbsp;
+                    <#if (shownPrice > 0)>+<@ofbizCurrency amount=shownPrice isoCode=price.currencyUsed/>&nbsp;</#if>
+                    <#if (shownPrice < 0)>-<@ofbizCurrency amount=(-1*shownPrice) isoCode=price.currencyUsed/>&nbsp;</#if>
+                    <#if !option.isAvailable()> (*)</#if>
+                  </option>
+                  <#assign optionCounter = optionCounter + 1>
+                </#list>
+                </select>
+                </#if>
+              <#else>
+                <#-- Multi choice question -->
+                <#assign options = question.options>
+                <#assign optionCounter = 0>
+                <#list options as option>
+                    <#assign componentCounter = 0>
+                    <#-- Render virtual compoennts -->
+                    <#if option.hasVirtualComponent()>
+                      <div >
+                        <input type='CHECKBOX' name='${counter}' id="${counter}_${optionCounter}" value='${optionCounter}' onclick="javascript:checkOptionVariants('${counter}_${optionCounter}');" />
+                        ${option.description} <#if !option.isAvailable()> (*)</#if>
+                        <#assign components = option.getComponents()>
+                        <#list components as component>
+                          <#if (option.isVirtualComponent(component))>
+                            ${setRequestAttribute("inlineProductId", component.productId)}
+                            ${setRequestAttribute("inlineCounter", counter+ "_" +optionCounter + "_"+componentCounter)}
+                            ${setRequestAttribute("addJavaScript", componentCounter)}
+                            ${screens.render(inlineProductDetailScreen)}
+                            <#assign componentCounter = componentCounter + 1>
+                          </#if>
+                        </#list>
+                      </div>
+                    <#else>
+                    <div>
+                      <input type='CHECKBOX' name='${counter}' value='${optionCounter}' <#if option.isSelected()>checked="checked"</#if> />
+                      ${option.description} +<@ofbizCurrency amount=option.price isoCode=price.currencyUsed/><#if !option.isAvailable()> (*)</#if>
+                    </div>
+                    </#if>
+                  <#assign optionCounter = optionCounter + 1>
+                </#list>
+              </#if>
+            </#if>
+            </td>
+          </tr>
+
+          <#assign counter = counter + 1>
+        </#list>
+        </table>
+      </form>
+    </td>
+  </tr>
+
+
+  <#-- Product Reviews -->
+  <tr>
+    <td colspan="2">
+      <div>${uiLabelMap.OrderCustomerReviews}:</div>
+      <#if averageRating?? && (averageRating > 0) && numRatings?? && (numRatings > 1)>
+          <div>${uiLabelMap.OrderAverageRating}: ${averageRating} <#if numRatings??>(${uiLabelMap.CommonFrom} ${numRatings} ${uiLabelMap.OrderRatings})</#if></div>
+      </#if>
+    </td>
+  </tr>
+  <tr><td colspan="2"><hr class='sepbar'/></td></tr>
+  <#if productReviews?has_content>
+    <#list productReviews as productReview>
+      <#assign postedUserLogin = productReview.getRelatedOne("UserLogin", false)>
+      <#assign postedPerson = postedUserLogin.getRelatedOne("Person", false)!>
+      <tr>
+        <td colspan="2">
+          <table border="0" cellpadding="0" cellspacing='0'>
+            <tr>
+              <td>
+                <div>${uiLabelMap.CommonBy}: <#if productReview.postedAnonymous?default("N") == "Y">${uiLabelMap.OrderAnonymous}<#else>${postedPerson.firstName} ${postedPerson.lastName}</#if></div>
+              </td>
+              <td>
+                <div>${uiLabelMap.CommonOn}: ${productReview.postedDateTime!}</div>
+              </td>
+              <td>
+                <div>${uiLabelMap.OrderRanking}: ${productReview.productRating!?string}</div>
+              </td>
+            </tr>
+            <tr>
+              <td colspan="3">
+                <div>&nbsp;</div>
+              </td>
+            </tr>
+            <tr>
+              <td colspan="3">
+                <div>${productReview.productReview!}</div>
+              </td>
+            </tr>
+
+          </table>
+        </td>
+      </tr>
+    </#list>
+    <tr>
+      <td colspan="2">
+        <a href="<@ofbizUrl>reviewProduct?category_id=${categoryId!}&amp;product_id=${product.productId}</@ofbizUrl>" class="buttontext">${uiLabelMap.ProductReviewThisProduct}!</a>
+      </td>
+    </tr>
+  <#else>
+    <tr>
+      <td colspan="2">
+        <div>${uiLabelMap.ProductProductNotReviewedYet}.</div>
+      </td>
+    </tr>
+    <tr>
+      <td colspan="2">
+        <a href="<@ofbizUrl>reviewProduct?category_id=${categoryId!}&amp;product_id=${product.productId}</@ofbizUrl>" class="buttontext">${uiLabelMap.ProductBeTheFirstToReviewThisProduct}</a>
+      </td>
+    </tr>
+</table>
+</#if>
+
+<#-- Upgrades/Up-Sell/Cross-Sell -->
+  <#macro associated assocProducts beforeName showName afterName formNamePrefix targetRequestName>
+  <#assign targetRequest = "product">
+  <#if targetRequestName?has_content>
+    <#assign targetRequest = targetRequestName>
+  </#if>
+  <#if assocProducts?has_content>
+    <tr><td>&nbsp;</td></tr>
+    <tr><td colspan="2"><h2>${beforeName!}<#if showName == "Y">${productContentWrapper.get("PRODUCT_NAME", "html")!}</#if>${afterName!}</h2></td></tr>
+
+    <#list assocProducts as productAssoc>
+      <tr><td>
+        <div>
+          <a href='<@ofbizUrl>${targetRequest}/<#if categoryId??>~category_id=${categoryId}/</#if>~product_id=${productAssoc.productIdTo!}</@ofbizUrl>' class="buttontext">
+            ${productAssoc.productIdTo!}
+          </a>
+          - ${productAssoc.reason!}
+        </div>
+      </td></tr>
+      ${setRequestAttribute("optProductId", productAssoc.productIdTo)}
+      ${setRequestAttribute("listIndex", listIndex)}
+      ${setRequestAttribute("formNamePrefix", formNamePrefix)}
+      <#if targetRequestName?has_content>
+        ${setRequestAttribute("targetRequestName", targetRequestName)}
+      </#if>
+      <tr>
+        <td>
+          ${screens.render(productsummaryScreen)}
+        </td>
+      </tr>
+      <#local listIndex = listIndex + 1>
+
+    </#list>
+    ${setRequestAttribute("optProductId", "")}
+    ${setRequestAttribute("formNamePrefix", "")}
+    ${setRequestAttribute("targetRequestName", "")}
+  </#if>
+</#macro>
+<#assign productValue = product>
+<#assign listIndex = 1>
+${setRequestAttribute("productValue", productValue)}
+
+<table >
+  <#-- obsolete -->
+  <@associated assocProducts=obsoleteProducts beforeName="" showName="Y" afterName=" is made obsolete by these products:" formNamePrefix="obs" targetRequestName=""/>
+  <#-- cross sell -->
+  <@associated assocProducts=crossSellProducts beforeName="" showName="N" afterName="You might be interested in these as well:" formNamePrefix="cssl" targetRequestName="crosssell"/>
+  <#-- up sell -->
+  <@associated assocProducts=upSellProducts beforeName="Try these instead of " showName="Y" afterName=":" formNamePrefix="upsl" targetRequestName="upsell"/>
+  <#-- obsolescence -->
+  <@associated assocProducts=obsolenscenseProducts beforeName="" showName="Y" afterName=" makes these products obsolete:" formNamePrefix="obce" targetRequestName=""/>
+</table>
+
+<#-- special cross/up-sell area using commonFeatureResultIds (from common feature product search) -->
+<#if commonFeatureResultIds?has_content>
+  <h2>Similar Products That Might Interest You...</h2>
+
+
+  <#list commonFeatureResultIds as commonFeatureResultId>
+    <div>
+      ${setRequestAttribute("optProductId", commonFeatureResultId)}
+      ${setRequestAttribute("listIndex", commonFeatureResultId_index)}
+      ${setRequestAttribute("formNamePrefix", "cfeatcssl")}
+      <#-- ${setRequestAttribute("targetRequestName", targetRequestName)} -->
+      ${screens.render(productsummaryScreen)}
+    </div>
+    <#if commonFeatureResultId_has_next>
+      <hr />
+    </#if>
+  </#list>
+</#if>
+</div>

Propchange: ofbiz/trunk/applications/order/template/product/configproductdetail.ftl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/applications/order/template/product/configproductdetail.ftl
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/applications/order/template/product/configproductdetail.ftl
------------------------------------------------------------------------------
    svn:mime-type = text/plain