+
+ <#assign itemsFromList = true />
+ L
+ <#elseif cartLine.getIsPromo()>
+ <#assign promoItems = true />
+ P
+ <#else>
+
+ #if>
+
+
+ <#if cartLine.getProductId()??>
+ <#-- product item -->
+ <#-- start code to display a small image of the product -->
+ <#if cartLine.getParentProductId()??>
+ <#assign parentProductId = cartLine.getParentProductId() />
+ <#else>
+ <#assign parentProductId = cartLine.getProductId() />
+ #if>
+ <#assign smallImageUrl = Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(cartLine.getProduct(), "SMALL_IMAGE_URL", locale, dispatcher, "url")! />
+ <#if !smallImageUrl?string?has_content><#assign smallImageUrl = "/images/defaultImage.jpg" />#if>
+ <#if smallImageUrl?string?has_content>
+
+
+
+ #if>
+ <#-- end code to display a small image of the product -->
+ <#-- ${cartLineIndex} - -->
+ ${cartLine.getProductId()} -
+ ${cartLine.getName()!} : ${cartLine.getDescription()!}
+ <#-- For configurable products, the selected options are shown -->
+ <#if cartLine.getConfigWrapper()??>
+ <#assign selectedOptions = cartLine.getConfigWrapper().getSelectedOptions()! />
+ <#if selectedOptions??>
+
+ <#list selectedOptions as option>
+ ${option.getDescription()}
+ #list>
+ #if>
+ #if>
+ <#-- if inventory is not required check to see if it is out of stock and needs to have a message shown about that... -->
+ <#assign itemProduct = cartLine.getProduct() />
+ <#assign isStoreInventoryNotRequiredAndNotAvailable = Static["org.ofbiz.product.store.ProductStoreWorker"].isStoreInventoryRequiredAndAvailable(request, itemProduct, cartLine.getQuantity(), false, false) />
+ <#if isStoreInventoryNotRequiredAndNotAvailable && itemProduct.inventoryMessage?has_content>
+ (${itemProduct.inventoryMessage})
+ #if>
+ <#else>
+ <#-- this is a non-product item -->
+ ${cartLine.getItemTypeDescription()!}: ${cartLine.getName()!}
+ #if>
+ <#assign attrs = cartLine.getOrderItemAttributes()/>
+ <#if attrs?has_content>
+ <#assign attrEntries = attrs.entrySet()/>
+
+ <#list attrEntries as attrEntry>
+ ${attrEntry.getKey()} : ${attrEntry.getValue()}
+ #list>
+
+ #if>
+ <#if (cartLine.getIsPromo() && cartLine.getAlternativeOptionProductIds()?has_content)>
+ <#-- Show alternate gifts if there are any... -->
+ ${uiLabelMap.OrderChooseFollowingForGift}:
+
+ - ${uiLabelMap.OrderChooseAnotherGift} -
+ <#list cartLine.getAlternativeOptionProductIds() as alternativeOptionProductId>
+ <#assign alternativeOptionName = Static["org.ofbiz.product.product.ProductWorker"].getGwpAlternativeOptionName(dispatcher, delegator, alternativeOptionProductId, requestAttributes.locale) />
+ ${alternativeOptionName?default(alternativeOptionProductId)}
+ #list>
+
+ <#-- this is the old way, it lists out the options and is not as nice as the drop-down
+
+ <#list cartLine.getAlternativeOptionProductIds() as alternativeOptionProductId>
+ <#assign alternativeOptionName = Static["org.ofbiz.product.product.ProductWorker"].getGwpAlternativeOptionName(delegator, alternativeOptionProductId, requestAttributes.locale) />
+ Select: ${alternativeOptionName?default(alternativeOptionProductId)}
+ #list>
+
+ -->
+ #if>
+
+ <#-- gift wrap option -->
+ <#assign showNoGiftWrapOptions = false />
+
+ <#assign giftWrapOption = lineOptionalFeatures.GIFT_WRAP! />
+ <#assign selectedOption = cartLine.getAdditionalProductFeatureAndAppl("GIFT_WRAP")! />
+ <#if giftWrapOption?has_content>
+
+ ${uiLabelMap.EcommerceNoGiftWrap}
+ <#list giftWrapOption as option>
+ selected="selected"#if>>${option.description} : ${option.amount?default(0)}
+ #list>
+
+ <#elseif showNoGiftWrapOptions>
+
+ ${uiLabelMap.EcommerceNoGiftWrap}
+
+ <#else>
+
+ #if>
+
+ <#-- end gift wrap option -->
+
+ <#if cartLine.getIsPromo() || cartLine.getShoppingListId()??>
+ <#if fixedAssetExist == true>
+ <#if cartLine.getReservStart()??>
+
+
+
+ ${cartLine.getReservStart()?string("yyyy-mm-dd")}
+ ${cartLine.getReservLength()?string.number}
+
+
+
+ ${cartLine.getReservPersons()?string.number}
+
+ <#else>
+
+
+ --
+ --
+
+
+ --
+
+ #if>
+ ${cartLine.getQuantity()?string.number}
+ <#else><#-- fixedAssetExist -->
+ ${cartLine.getQuantity()?string.number}
+ #if>
+ <#else><#-- Is Promo or Shoppinglist -->
+ <#if fixedAssetExist == true><#if cartLine.getReservStart()??>
+
+
+
\ No newline at end of file
diff --git a/template/cart/CartQuickAddProduct.ftl b/template/cart/CartQuickAddProduct.ftl
new file mode 100644
index 0000000..445d090
--- /dev/null
+++ b/template/cart/CartQuickAddProduct.ftl
@@ -0,0 +1,23 @@
+
+
+
${uiLabelMap.CommonQuickAdd}
+
+
+
+
+
\ No newline at end of file
diff --git a/template/cart/CartShowPromo.ftl b/template/cart/CartShowPromo.ftl
new file mode 100644
index 0000000..c0fbf62
--- /dev/null
+++ b/template/cart/CartShowPromo.ftl
@@ -0,0 +1,17 @@
+<#if showPromoText?? && showPromoText>
+
+
+
${uiLabelMap.OrderSpecialOffers}
+
+
+ <#-- show promotions text -->
+
+
+
+
+
+#if>
diff --git a/template/cart/PopOverCart.ftl b/template/cart/PopOverCart.ftl
new file mode 100644
index 0000000..cb0c54e
--- /dev/null
+++ b/template/cart/PopOverCart.ftl
@@ -0,0 +1,78 @@
+<#--
+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 shoppingCart = sessionAttributes.shoppingCart!>
+<#if shoppingCart?has_content>
+ <#assign shoppingCartSize = shoppingCart.size()>
+<#else>
+ <#assign shoppingCartSize = 0>
+#if>
+
+ <#if (shoppingCartSize > 0)>
+
+
+
+
+ ${uiLabelMap.OrderQty}
+ ${uiLabelMap.OrderItem}
+ ${uiLabelMap.CommonSubtotal}
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderTotal}:
+
+
+ <@ofbizCurrency amount=shoppingCart.getDisplayGrandTotal() isoCode=shoppingCart.getCurrency()/>
+
+
+
+
+ <#list shoppingCart.items() as cartLine>
+
+ ${cartLine.getQuantity()?string.number}
+
+ <#if cartLine.getProductId()??>
+ <#if cartLine.getParentProductId()??>
+ ${cartLine.getName()}
+ <#else>
+ ${cartLine.getName()}
+ #if>
+ <#else>
+ ${cartLine.getItemTypeDescription()!}
+ #if>
+
+ <@ofbizCurrency amount=cartLine.getDisplayItemSubTotal() isoCode=shoppingCart.getCurrency()/>
+
+ <#if cartLine.getReservStart()??>
+ (${cartLine.getReservStart()?string("yyyy-MM-dd")}, ${cartLine.getReservLength()} <#if cartLine.getReservLength() == 1>${uiLabelMap.CommonDay}<#else>${uiLabelMap.CommonDays}#if>)
+ #if>
+ #list>
+
+
+ <#if hidebottomlinks?default("N") != "Y">
+
${uiLabelMap.OrderCheckout}
+ #if>
+ <#else>
+
${uiLabelMap.OrderShoppingCartEmpty}
+ #if>
+
\ No newline at end of file
diff --git a/template/cart/UpdateCart.ftl b/template/cart/UpdateCart.ftl
new file mode 100644
index 0000000..62ccca4
--- /dev/null
+++ b/template/cart/UpdateCart.ftl
@@ -0,0 +1,184 @@
+<#--
+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 shoppingCart?has_content && shoppingCart.size() > 0>
+ ${uiLabelMap.EcommerceStep} 1: ${uiLabelMap.PageTitleShoppingCart}
+
+
${uiLabelMap.EcommerceClickHereToEdit}
+
+
+
+ ${uiLabelMap.OrderItem}
+ ${uiLabelMap.CommonDescription}
+ ${uiLabelMap.EcommerceUnitPrice}
+ ${uiLabelMap.OrderQuantity}
+ ${uiLabelMap.EcommerceAdjustments}
+ ${uiLabelMap.EcommerceItemTotal}
+
+
+
+
+ ${uiLabelMap.CommonSubtotal}
+ <@ofbizCurrency amount=shoppingCart.getSubTotal() isoCode=shoppingCart.getCurrency() />
+
+ <#assign orderAdjustmentsTotal = 0 />
+ <#list shoppingCart.getAdjustments() as cartAdjustment>
+ <#assign orderAdjustmentsTotal = orderAdjustmentsTotal + Static["org.ofbiz.order.order.OrderReadHelper"].calcOrderAdjustment(cartAdjustment, shoppingCart.getSubTotal()) />
+ #list>
+
+ ${uiLabelMap.ProductDiscount}
+ <@ofbizCurrency amount=orderAdjustmentsTotal isoCode=shoppingCart.getCurrency() />
+
+
+ ${uiLabelMap.OrderShippingAndHandling}
+ <@ofbizCurrency amount=shoppingCart.getTotalShipping() isoCode=shoppingCart.getCurrency() />
+
+
+ ${uiLabelMap.OrderSalesTax}
+ <@ofbizCurrency amount=shoppingCart.getTotalSalesTax() isoCode=shoppingCart.getCurrency() />
+
+
+ ${uiLabelMap.OrderGrandTotal}
+ <@ofbizCurrency amount=shoppingCart.getDisplayGrandTotal() isoCode=shoppingCart.getCurrency() />
+
+
+
+ <#list shoppingCart.items() as cartLine>
+ <#if cartLine.getProductId()??>
+ <#if cartLine.getParentProductId()??>
+ <#assign parentProductId = cartLine.getParentProductId() />
+ <#else>
+ <#assign parentProductId = cartLine.getProductId() />
+ #if>
+ <#assign smallImageUrl = Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(cartLine.getProduct(), "SMALL_IMAGE_URL", locale, dispatcher, "url")! />
+ <#if !smallImageUrl?string?has_content><#assign smallImageUrl = "" />#if>
+ #if>
+
+
+ ${cartLine.getName()!}
+ ${cartLine.getDisplayPrice()}
+ ${cartLine.getQuantity()?string.number}
+ <@ofbizCurrency amount=cartLine.getOtherAdjustments() isoCode=shoppingCart.getCurrency() />
+ <@ofbizCurrency amount=cartLine.getDisplayItemSubTotal() isoCode=shoppingCart.getCurrency() />
+
+ #list>
+
+
+
+
+#if>
\ No newline at end of file
diff --git a/template/cart/microcart.ftl b/template/cart/microcart.ftl
new file mode 100644
index 0000000..e674473
--- /dev/null
+++ b/template/cart/microcart.ftl
@@ -0,0 +1,60 @@
+<#--
+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 shoppingCart = sessionAttributes.shoppingCart!>
+<#if shoppingCart?has_content>
+ <#assign shoppingCartSize = shoppingCart.size()>
+<#else>
+ <#assign shoppingCartSize = 0>
+#if>
+
+ <#if (shoppingCartSize > 0)>
+
+ ${uiLabelMap.EcommerceCartHas} ${shoppingCart.getTotalQuantity()}
+ <#if shoppingCart.getTotalQuantity() == 1>${uiLabelMap.OrderItem}<#else/>${uiLabelMap.OrderItems}#if>,
+ <@ofbizCurrency amount=shoppingCart.getDisplayGrandTotal() isoCode=shoppingCart.getCurrency()/>
+
+
${uiLabelMap.OrderShoppingCartEmpty}
+ <#else>
+
${uiLabelMap.OrderShoppingCartEmpty}
+ #if>
+
+ [${uiLabelMap.OrderViewCart}]
+ <#if (shoppingCartSize > 0)>
+ <#if !initialLocaleComplete?? || initialLocaleComplete?length == 2 >
+ <#if initialLocaleComplete?? && initialLocaleComplete?length == 2 && initialLocaleComplete == "fr">
+ <#assign initialLocaleComplete = "fr_FR"><#-- same idea can be used with other default locale -->
+ <#else>
+ <#assign initialLocaleComplete = "en_US">
+ #if>
+ #if>
+ [${uiLabelMap.OrderCheckoutQuick}]
+ [${uiLabelMap.OrderCheckoutQuick}]
+ [${uiLabelMap.EcommerceOnePageCheckout}]
+ [${uiLabelMap.EcommerceOnePageCheckout}]
+
+
+ <#if shoppingCart?has_content && (shoppingCart.getGrandTotal() > 0)>
+
+ #if>
+ <#else>
+ [${uiLabelMap.OrderCheckoutQuick}]
+ [${uiLabelMap.EcommerceOnePageCheckout}]
+ #if>
+
+
diff --git a/template/cart/minicart.ftl b/template/cart/minicart.ftl
new file mode 100644
index 0000000..eb0fe5c
--- /dev/null
+++ b/template/cart/minicart.ftl
@@ -0,0 +1,97 @@
+<#--
+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 shoppingCart = sessionAttributes.shoppingCart!>
+<#if shoppingCart?has_content>
+ <#assign shoppingCartSize = shoppingCart.size()>
+<#else>
+ <#assign shoppingCartSize = 0>
+#if>
+
+
+
+
${uiLabelMap.OrderCartSummary}
+
+
+ <#if (shoppingCartSize > 0)>
+ <#if hidetoplinks?default("N") != "Y">
+
+ #if>
+
+
+
+ ${uiLabelMap.OrderQty}
+ ${uiLabelMap.OrderItem}
+ ${uiLabelMap.CommonSubtotal}
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderTotal}:
+
+
+ <@ofbizCurrency amount=shoppingCart.getDisplayGrandTotal() isoCode=shoppingCart.getCurrency()/>
+
+
+
+
+ <#list shoppingCart.items() as cartLine>
+
+ ${cartLine.getQuantity()?string.number}
+
+ <#if cartLine.getProductId()??>
+ <#if cartLine.getParentProductId()??>
+ ${cartLine.getName()}
+ <#else>
+ ${cartLine.getName()}
+ #if>
+ <#else>
+ ${cartLine.getItemTypeDescription()!}
+ #if>
+
+ <@ofbizCurrency amount=cartLine.getDisplayItemSubTotal() isoCode=shoppingCart.getCurrency()/>
+
+ <#if cartLine.getReservStart()??>
+ (${cartLine.getReservStart()?string("yyyy-MM-dd")}, ${cartLine.getReservLength()} <#if cartLine.getReservLength() == 1>${uiLabelMap.CommonDay}<#else>${uiLabelMap.CommonDays}#if>)
+ #if>
+ #list>
+
+
+ <#if hidebottomlinks?default("N") != "Y">
+
+ #if>
+ <#else>
+
${uiLabelMap.OrderShoppingCartEmpty}
+ #if>
+
+
diff --git a/template/cart/minipromotext.ftl b/template/cart/minipromotext.ftl
new file mode 100644
index 0000000..0b1588e
--- /dev/null
+++ b/template/cart/minipromotext.ftl
@@ -0,0 +1,46 @@
+<#--
+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 showPromoText>
+
+
+
+ ${uiLabelMap.OrderSpecialOffers}
+
+
+
+
+
+ <#-- show promotions text -->
+
+
+
+#if>
diff --git a/template/cart/promoUseDetailsInline.ftl b/template/cart/promoUseDetailsInline.ftl
new file mode 100644
index 0000000..88b01b9
--- /dev/null
+++ b/template/cart/promoUseDetailsInline.ftl
@@ -0,0 +1,79 @@
+<#--
+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 promoInUseIter = shoppingCart.getProductPromoUseInfoIter() >
+ <#if promoInUseIter?has_content >
+
${uiLabelMap.OrderPromotionsApplied}:
+ #if>
+
+
+ <#list shoppingCart.getProductPromoUseInfoIter() as productPromoUseInfo>
+
+ <#-- TODO: when promo pretty print is done show promo short description here -->
+ ${uiLabelMap.OrderPromotion} ${uiLabelMap.CommonDetails}
+ <#if productPromoUseInfo.productPromoCodeId?has_content> - ${uiLabelMap.OrderWithPromoCode} [${productPromoUseInfo.productPromoCodeId}]#if>
+ <#if (productPromoUseInfo.totalDiscountAmount != 0)> - ${uiLabelMap.CommonTotalValue} <@ofbizCurrency amount=(-1*productPromoUseInfo.totalDiscountAmount) isoCode=shoppingCart.getCurrency()/>#if>
+ <#if productPromoUseInfo.productPromoCodeId?has_content>
+ ${uiLabelMap.OrderRemovePromotion}
+ #if>
+
+ <#if (productPromoUseInfo.quantityLeftInActions > 0)>
+ - Could be used for ${productPromoUseInfo.quantityLeftInActions} more discounted item<#if (productPromoUseInfo.quantityLeftInActions > 1)>s#if> if added to your cart.
+ #if>
+ #list>
+
+
${uiLabelMap.OrderCartItemUseinPromotions}:
+
+ <#list shoppingCart.items() as cartLine>
+ <#assign cartLineIndex = shoppingCart.getItemIndex(cartLine)>
+ <#if cartLine.getIsPromo()>
+ ${uiLabelMap.OrderItemN} ${cartLineIndex+1} [${cartLine.getProductId()!}] - ${uiLabelMap.OrderIsAPromotionalItem}
+ <#else>
+ ${uiLabelMap.OrderItemN} ${cartLineIndex+1} [${cartLine.getProductId()!}] - ${cartLine.getPromoQuantityUsed()?string.number}/${cartLine.getQuantity()?string.number} ${uiLabelMap.CommonUsed} - ${cartLine.getPromoQuantityAvailable()?string.number} ${uiLabelMap.CommonAvailable}
+
+ <#list cartLine.getQuantityUsedPerPromoActualIter() as quantityUsedPerPromoActualEntry>
+ <#assign productPromoActualPK = quantityUsedPerPromoActualEntry.getKey()>
+ <#assign actualQuantityUsed = quantityUsedPerPromoActualEntry.getValue()>
+ <#assign isQualifier = "ProductPromoCond" == productPromoActualPK.getEntityName()>
+ - ${actualQuantityUsed} ${uiLabelMap.CommonUsedAs} <#if isQualifier>${uiLabelMap.CommonQualifier}<#else>${uiLabelMap.CommonBenefit}#if> ${uiLabelMap.OrderOfPromotion} ${uiLabelMap.CommonDetails}
+
+ #list>
+
+
+ <#list cartLine.getQuantityUsedPerPromoFailedIter() as quantityUsedPerPromoFailedEntry>
+ <#assign productPromoFailedPK = quantityUsedPerPromoFailedEntry.getKey()>
+ <#assign failedQuantityUsed = quantityUsedPerPromoFailedEntry.getValue()>
+ <#assign isQualifier = "ProductPromoCond" == productPromoFailedPK.getEntityName()>
+ - ${uiLabelMap.CommonCouldBeUsedAs} <#if isQualifier>${uiLabelMap.CommonQualifier}<#else>${uiLabelMap.CommonBenefit}#if> ${uiLabelMap.OrderOfPromotion} ${uiLabelMap.CommonDetails}
+
+ #list>
+
+ <#list cartLine.getQuantityUsedPerPromoCandidateIter() as quantityUsedPerPromoCandidateEntry>
+ <#assign productPromoCandidatePK = quantityUsedPerPromoCandidateEntry.getKey()>
+ <#assign candidateQuantityUsed = quantityUsedPerPromoCandidateEntry.getValue()>
+ <#assign isQualifier = "ProductPromoCond" == productPromoCandidatePK.getEntityName()>
+
+
+ #list>
+
+ #if>
+ #list>
+
+
diff --git a/template/cart/showcart.ftl b/template/cart/showcart.ftl
new file mode 100644
index 0000000..e52dc4d
--- /dev/null
+++ b/template/cart/showcart.ftl
@@ -0,0 +1,154 @@
+<#--
+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 fixedAssetExist = shoppingCart.containAnyWorkEffortCartItems() /> <#-- change display format when rental items exist in the shoppingcart -->
+
+
+
+<#if associatedProducts?has_content>
+ <#include "CartAssocProducts.ftl" />
+#if>
+
+
diff --git a/template/catalog/LayeredCategoryDetail.ftl b/template/catalog/LayeredCategoryDetail.ftl
new file mode 100644
index 0000000..b8f57df
--- /dev/null
+++ b/template/catalog/LayeredCategoryDetail.ftl
@@ -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.
+-->
+
+<#macro paginationControls>
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize - 1)?double / viewSize?double)>
+ <#if (viewIndexMax?int > 0)>
+
+ <#-- Start Page Select Drop-Down -->
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int + 1} ${uiLabelMap.CommonOf} ${viewIndexMax + 1}
+ <#list 0..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum + 1}
+ #list>
+
+ <#-- End Page Select Drop-Down -->
+ <#if (0 < viewIndex?int)>
+
${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if ((listSize?int - viewSize?int) > 0)>
+
${lowIndex + 1} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ |
${uiLabelMap.CommonNext}
+ #if>
+
+ #if>
+#macro>
+
+
+<#if productCategory??>
+ <#assign categoryName = categoryContentWrapper.get("CATEGORY_NAME", "html")!/>
+ <#assign categoryDescription = categoryContentWrapper.get("DESCRIPTION", "html")!/>
+ <#if categoryName?has_content>
+ ${categoryName}
+ #if>
+ <#if categoryDescription?has_content>
+ ${categoryDescription}
+ #if>
+ <#assign longDescription = categoryContentWrapper.get("LONG_DESCRIPTION", "html")!/>
+ <#assign categoryImageUrl = categoryContentWrapper.get("CATEGORY_IMAGE_URL", "url")!/>
+ <#if categoryImageUrl?string?has_content || longDescription?has_content>
+
+ <#if categoryImageUrl?string?has_content>
+ <#assign height=100/>
+
+ #if>
+ <#if longDescription?has_content>
+ ${longDescription}
+ #if>
+
+ #if>
+#if>
+
+<#if productIds?has_content>
+ <@paginationControls/>
+ <#assign numCol = numCol?default(1)>
+ <#assign numCol = numCol?number>
+ <#assign tabCol = 1>
+
+ style="position: relative; margin-top: ${height}px;"
+ #if>
+ class="productsummary-container<#if (numCol?int > 1)> matrix#if>">
+ <#if (numCol?int > 1)>
+
+ #if>
+ <#list productIds as productId>
+ <#if (numCol?int == 1)>
+ ${setRequestAttribute("optProductId", productId)}
+ ${setRequestAttribute("listIndex", productId_index)}
+ ${screens.render(productsummaryScreen)}
+ <#else>
+ <#if (tabCol?int = 1)>#if>
+
+ ${setRequestAttribute("optProductId", productId)}
+ ${setRequestAttribute("listIndex", productId_index)}
+ ${screens.render(productsummaryScreen)}
+
+ <#if (tabCol?int = numCol)> #if>
+ <#assign tabCol = tabCol+1><#if (tabCol?int > numCol)><#assign tabCol = 1>#if>
+ #if>
+ #list>
+ <#if (numCol?int > 1)>
+
+ #if>
+
+ <@paginationControls/>
+<#else>
+
+ ${uiLabelMap.ProductNoProductsInThisCategory}
+#if>
diff --git a/template/catalog/LayeredNavBar.ftl b/template/catalog/LayeredNavBar.ftl
new file mode 100644
index 0000000..8cee879
--- /dev/null
+++ b/template/catalog/LayeredNavBar.ftl
@@ -0,0 +1,75 @@
+<#--
+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 currentSearchCategory??>
+
+
+
+ ${uiLabelMap.EcommerceLayeredNavigation}
+
+
+ <#escape x as x?xml>
+ <#if productCategory.productCategoryId != currentSearchCategory.productCategoryId>
+ <#assign currentSearchCategoryName = categoryContentWrapper.get("CATEGORY_NAME", "html")?string />
+ <#list searchConstraintStrings as searchConstraintString>
+ <#if searchConstraintString.indexOf(currentSearchCategoryName) != -1>
+
X <#noescape> ${searchConstraintString}#noescape>
+ #if>
+ #list>
+ #if>
+ #escape>
+ <#list searchConstraintStrings as searchConstraintString>
+ <#if searchConstraintString.indexOf("Category: ") = -1 && searchConstraintString != "Exclude Variants">
+
X ${searchConstraintString}
+ #if>
+ #list>
+ <#if showSubCats>
+
+
${uiLabelMap.ProductCategories}
+
+ <#list subCategoryList as category>
+ <#assign subCategoryContentWrapper = category.categoryContentWrapper />
+ <#assign categoryName = subCategoryContentWrapper.get("CATEGORY_NAME", "html")!?string />
+ ${categoryName!} (${category.count})
+ #list>
+
+
+ #if>
+ <#if showColors>
+
+
${colorFeatureType.description}
+
+
+ #if>
+ <#if showPriceRange>
+
+
${uiLabelMap.EcommercePriceRange}
+
+
+ #if>
+
+#if>
diff --git a/template/catalog/MainNav.ftl b/template/catalog/MainNav.ftl
new file mode 100644
index 0000000..3b6184e
--- /dev/null
+++ b/template/catalog/MainNav.ftl
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/template/catalog/ProductCategories.ftl b/template/catalog/ProductCategories.ftl
new file mode 100644
index 0000000..6193aa1
--- /dev/null
+++ b/template/catalog/ProductCategories.ftl
@@ -0,0 +1,207 @@
+<#--
+ 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.
+ -->
+
+
+
+
+
+
+
+
+
+
+
${uiLabelMap.ProductCategories}
+
+
+
+
diff --git a/template/catalog/ProductCategoryLink.ftl b/template/catalog/ProductCategoryLink.ftl
new file mode 100644
index 0000000..095ca74
--- /dev/null
+++ b/template/catalog/ProductCategoryLink.ftl
@@ -0,0 +1,54 @@
+<#--
+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 productCategoryLink = requestAttributes.productCategoryLink!/>
+<#if productCategoryLink?has_content>
+<#if productCategoryLink.detailSubScreen?has_content>
+ ${screens.render(productCategoryLink.detailSubScreen)}
+<#else>
+ <#assign titleText = productCategoryLink.titleText!/>
+ <#assign imageUrl = productCategoryLink.imageUrl!/>
+ <#assign detailText = productCategoryLink.detailText!/>
+
+ <#if productCategoryLink.linkTypeEnumId == "PCLT_SEARCH_PARAM">
+ <#assign linkUrl = requestAttributes._REQUEST_HANDLER_.makeLink(request, response, "keywordsearch?" + productCategoryLink.linkInfo)/>
+ <#elseif productCategoryLink.linkTypeEnumId == "PCLT_ABS_URL">
+ <#assign linkUrl = productCategoryLink.linkInfo!/>
+ <#elseif productCategoryLink.linkTypeEnumId == "PCLT_CAT_ID">
+ <#assign linkUrl = requestAttributes._REQUEST_HANDLER_.makeLink(request, response, "category/~category_id=" + productCategoryLink.linkInfo) + "/~pcategory=" + productCategoryId/>
+ <#assign linkProductCategory = delegator.findOne("ProductCategory", Static["org.ofbiz.base.util.UtilMisc"].toMap("productCategoryId", productCategoryLink.linkInfo), true)/>
+ <#assign linkCategoryContentWrapper = Static["org.ofbiz.product.category.CategoryContentWrapper"].makeCategoryContentWrapper(linkProductCategory, request)/>
+ <#assign titleText = productCategoryLink.titleText?default(linkCategoryContentWrapper.get("CATEGORY_NAME", "html"))!/>
+ <#assign imageUrl = productCategoryLink.imageUrl?default(linkCategoryContentWrapper.get("CATEGORY_IMAGE_URL", "url"))!/>
+ <#assign detailText = productCategoryLink.detailText?default(linkCategoryContentWrapper.get("DESCRIPTION", "html"))!/>
+ #if>
+
+
+ <#if imageUrl?string?has_content>
+
+ #if>
+ <#if titleText?has_content>
+
${titleText}
+ #if>
+ <#if detailText?has_content>
+
${detailText}
+ #if>
+
+#if>
+#if>
diff --git a/template/catalog/ShowBestSellingCategory.ftl b/template/catalog/ShowBestSellingCategory.ftl
new file mode 100644
index 0000000..1f63dd7
--- /dev/null
+++ b/template/catalog/ShowBestSellingCategory.ftl
@@ -0,0 +1,110 @@
+<#--
+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 productCategoryList?has_content>
+
+
+
Popular Categories
+
+
+
+
+
+ <#list productCategoryList as childCategoryList>
+
+ <#assign cateCount = 0/>
+ <#list childCategoryList as productCategory>
+ <#if (cateCount > 2)>
+
+ <#assign cateCount = 0/>
+ #if>
+ <#assign productCategoryId = productCategory.productCategoryId/>
+ <#assign categoryImageUrl = "/images/defaultImage.jpg">
+ <#assign productCategoryMembers = delegator.findByAnd("ProductCategoryAndMember", Static["org.ofbiz.base.util.UtilMisc"].toMap("productCategoryId", productCategoryId), Static["org.ofbiz.base.util.UtilMisc"].toList("-quantity"), false)>
+
+ <#if productCategory.categoryImageUrl?has_content>
+ <#assign categoryImageUrl = productCategory.categoryImageUrl/>
+ <#elseif productCategoryMembers?has_content>
+ <#assign productCategoryMember = Static["org.ofbiz.entity.util.EntityUtil"].getFirst(productCategoryMembers)/>
+ <#assign product = delegator.findOne("Product", Static["org.ofbiz.base.util.UtilMisc"].toMap("productId", productCategoryMember.productId), false)/>
+ <#if product.smallImageUrl?has_content>
+ <#assign categoryImageUrl = product.smallImageUrl/>
+ #if>
+ #if>
+
+
+
+
+
+
+
+ <#if productCategoryMembers??>
+ <#assign i = 0/>
+ <#list productCategoryMembers as productCategoryMember>
+ <#if (i > 2)>
+ <#if productCategoryMembers[i]?has_content>
+
+
+
+ More...
+
+
+
+ #if>
+ <#break>
+ #if>
+ <#if productCategoryMember?has_content>
+ <#assign product = delegator.findOne("Product", Static["org.ofbiz.base.util.UtilMisc"].toMap("productId", productCategoryMember.productId), false)>
+
+
+
+ ">
+ ${product.productName!product.productId}
+
+
+
+
+ #if>
+ <#assign i = i+1/>
+ #list>
+ #if>
+
+
+
+
+
+ <#assign cateCount = cateCount + 1/>
+ #list>
+
+ #list>
+
+
+
+
+
+#if>
diff --git a/template/catalog/SimpleSearch.ftl b/template/catalog/SimpleSearch.ftl
new file mode 100644
index 0000000..f99cd78
--- /dev/null
+++ b/template/catalog/SimpleSearch.ftl
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/template/catalog/advancedsearch.ftl b/template/catalog/advancedsearch.ftl
new file mode 100644
index 0000000..b7282e7
--- /dev/null
+++ b/template/catalog/advancedsearch.ftl
@@ -0,0 +1,125 @@
+<#--
+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 searchOptionsHistoryList = Static["org.ofbiz.product.product.ProductSearchSession"].getSearchOptionsHistoryList(session)/>
+<#assign currentCatalogId = Static["org.ofbiz.product.catalog.CatalogWorker"].getCurrentCatalogId(request)/>
+
+
+
+
+
${uiLabelMap.ProductAdvancedSearchInCategory}
+
+
+
+
diff --git a/template/catalog/ajaxbreadcrumbs.ftl b/template/catalog/ajaxbreadcrumbs.ftl
new file mode 100644
index 0000000..8d3cc79
--- /dev/null
+++ b/template/catalog/ajaxbreadcrumbs.ftl
@@ -0,0 +1,76 @@
+<#--
+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.
+-->
+
+
+
+
diff --git a/template/catalog/breadcrumbs.ftl b/template/catalog/breadcrumbs.ftl
new file mode 100644
index 0000000..b8e66a5
--- /dev/null
+++ b/template/catalog/breadcrumbs.ftl
@@ -0,0 +1,68 @@
+<#--
+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 isDefaultTheme = !layoutSettings.VT_FTR_TMPLT_LOC?contains("multiflex")>
+<#if isDefaultTheme>
+
${uiLabelMap.CommonMain} >
+<#else>
+
${uiLabelMap.CommonMain}
+#if>
+ <#-- Show the category branch -->
+ <#assign crumbs = Static["org.ofbiz.product.category.CategoryWorker"].getTrail(request)/>
+ <#list crumbs as crumb>
+ <#if catContentWrappers?? && catContentWrappers[crumb]??>
+ <#if !isDefaultTheme>
+
+ " class="<#if crumb_has_next>linktext<#else>buttontextdisabled#if>">
+ <#if catContentWrappers[crumb].get("CATEGORY_NAME", "html")??>
+ ${catContentWrappers[crumb].get("CATEGORY_NAME", "html")}
+ <#elseif catContentWrappers[crumb].get("DESCRIPTION", "html")??>
+ ${catContentWrappers[crumb].get("DESCRIPTION", "html")}
+ <#else>
+ ${crumb}
+ #if>
+
+
+ <#else>
+
" class="<#if crumb_has_next>linktext<#else>buttontextdisabled#if>">
+ <#if catContentWrappers[crumb].get("CATEGORY_NAME", "html")??>
+ ${catContentWrappers[crumb].get("CATEGORY_NAME", "html")}
+ <#elseif catContentWrappers[crumb].get("DESCRIPTION", "html")??>
+ ${catContentWrappers[crumb].get("DESCRIPTION", "html")}
+ <#else>
+ ${crumb}
+ #if>
+
+ <#if crumb_has_next> >#if>
+ #if>
+ <#assign previousCategoryId = crumb />
+ #if>
+ #list>
+
+ <#-- Show the product, if there is one -->
+ <#if productContentWrapper??>
+ <#if isDefaultTheme>
+ > ${productContentWrapper.get("PRODUCT_NAME", "html")!}
+ <#else>
+
${productContentWrapper.get("PRODUCT_NAME", "html")!}
+
+ #if>
+ #if>
+
+
diff --git a/template/catalog/categorydetail.ftl b/template/catalog/categorydetail.ftl
new file mode 100644
index 0000000..2756db5
--- /dev/null
+++ b/template/catalog/categorydetail.ftl
@@ -0,0 +1,189 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+-->
+
+
+<#macro paginationControls>
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize)?double / viewSize?double)>
+ <#if (viewIndexMax?int > 0)>
+
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int + 1} ${uiLabelMap.CommonOf} ${viewIndexMax}
+ <#if (viewIndex?int > 1)>
+ <#list 1..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum}
+ #list>
+ #if>
+
+ <#-- End Page Select Drop-Down -->
+ <#if (viewIndex?int > 0)>
+
${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if ((listSize?int - viewSize?int) > 0)>
+
${lowIndex} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ |
${uiLabelMap.CommonNext}
+ #if>
+
+ #if>
+#macro>
+
+
+
+ <#if productCategory??>
+ <#assign categoryName = categoryContentWrapper.get("CATEGORY_NAME", "html")!/>
+ <#assign categoryDescription = categoryContentWrapper.get("DESCRIPTION", "html")!/>
+ <#if categoryName??>
+
${categoryName}
+ #if>
+ <#if categoryDescription??>
+ ${categoryDescription}
+ #if>
+ <#if hasQuantities??>
+
+ #if>
+ <#if searchInCategory?default("Y") == "Y">
+
${uiLabelMap.ProductSearchInCategory}
+ #if>
+ <#assign longDescription = categoryContentWrapper.get("LONG_DESCRIPTION", "html")!/>
+ <#assign categoryImageUrl = categoryContentWrapper.get("CATEGORY_IMAGE_URL", "url")!/>
+ <#if categoryImageUrl?? || longDescription??>
+
+ <#if categoryImageUrl?string?has_content>
+ <#assign height=100/>
+
+ #if>
+ <#if longDescription??>
+ ${longDescription}
+ #if>
+
+ #if>
+ #if>
+
+
+ <#if productCategoryLinkScreen?? && productCategoryLinks??>
+
+ <#list productCategoryLinks as productCategoryLink>
+ ${setRequestAttribute("productCategoryLink",productCategoryLink)}
+ ${screens.render(productCategoryLinkScreen)}
+ #list>
+
+ #if>
+ <#if productCategoryMembers??>
+ <#-- Pagination -->
+ <#if paginateEcommerceStyle??>
+ <@paginationControls/>
+ <#else>
+ <#include "component://common/webcommon/includes/htmlTemplate.ftl"/>
+ <#assign commonUrl = "category?category_id="+ (parameters.category_id!) + "&"/>
+ <#--assign viewIndex = viewIndex - 1/-->
+ <#assign viewIndexFirst = 0/>
+ <#assign viewIndexPrevious = viewIndex - 1/>
+ <#assign viewIndexNext = viewIndex + 1/>
+ <#assign viewIndexLast = Static["org.ofbiz.base.util.UtilMisc"].getViewLastIndex(listSize, viewSize) />
+ <#assign messageMap = Static["org.ofbiz.base.util.UtilMisc"].toMap("lowCount", lowIndex, "highCount", highIndex, "total", listSize)/>
+ <#assign commonDisplaying = Static["org.ofbiz.base.util.UtilProperties"].getMessage("CommonUiLabels", "CommonDisplaying", messageMap, locale)/>
+ <@nextPrev commonUrl=commonUrl ajaxEnabled=false javaScriptEnabled=false paginateStyle="nav-pager" paginateFirstStyle="nav-first" viewIndex=viewIndex highIndex=highIndex listSize=listSize viewSize=viewSize ajaxFirstUrl="" firstUrl="" paginateFirstLabel="" paginatePreviousStyle="nav-previous" ajaxPreviousUrl="" previousUrl="" paginatePreviousLabel="" pageLabel="" ajaxSelectUrl="" selectUrl="" ajaxSelectSizeUrl="" selectSizeUrl="" commonDisplaying=commonDisplaying paginateNextStyle="nav-next" ajaxNextUrl="" nextUrl="" paginateNextLabel="" paginateLastStyle="nav-last" ajaxLastUrl="" lastUrl="" paginateLastLabel="" paginateViewSizeLabel="" />
+ #if>
+ <#assign numCol = numCol?default(1)>
+ <#assign numCol = numCol?number>
+ <#assign tabCol = 1>
+
+ style="position: relative; <#if height!>margin-top: ${height}px;#if>"
+ #if>
+ class="productsummary-container<#if (numCol?int > 1)> matrix#if>">
+ <#--
+ <#if (numCol?int > 1)>
+
+ #if>
+ -->
+ <#list productCategoryMembers as productCategoryMember>
+ <#if (numCol?int == 1)>
+ ${setRequestAttribute("optProductId", productCategoryMember.productId)}
+ ${setRequestAttribute("productCategoryMember", productCategoryMember)}
+ ${setRequestAttribute("listIndex", productCategoryMember_index)}
+ ${screens.render(productsummaryScreen)}
+ <#else>
+ <#if (tabCol?int = 1)>
#if>
+ <#if (numCol?int == 1)>
+
+ #if>
+ <#if (numCol?int == 2)>
+
+ #if>
+ <#if (numCol?int == 3)>
+
+ #if>
+ <#if (numCol?int == 4)>
+
+ #if>
+ ${setRequestAttribute("optProductId", productCategoryMember.productId)}
+ ${setRequestAttribute("productCategoryMember", productCategoryMember)}
+ ${setRequestAttribute("listIndex", productCategoryMember_index)}
+ ${screens.render(productsummaryScreen)}
+
+ <#if (tabCol?int = numCol)>
#if>
+ <#assign tabCol = tabCol+1>
+ <#if (tabCol?int > numCol)><#assign tabCol = 1>#if>
+ #if>
+ #list>
+ <#--
+ <#if (numCol?int > 1)>
+
+ #if>
+ -->
+ <#if paginateEcommerceStyle??>
+ <@paginationControls/>
+ #if>
+ <#else>
+
+
${uiLabelMap.ProductNoProductsInThisCategory}
+ #if>
+
+
+
\ No newline at end of file
diff --git a/template/catalog/choosecatalog.ftl b/template/catalog/choosecatalog.ftl
new file mode 100644
index 0000000..6a14b7e
--- /dev/null
+++ b/template/catalog/choosecatalog.ftl
@@ -0,0 +1,45 @@
+<#--
+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 catalogCol = Static["org.ofbiz.product.catalog.CatalogWorker"].getCatalogIdsAvailable(request)!>
+<#assign currentCatalogId = Static["org.ofbiz.product.catalog.CatalogWorker"].getCurrentCatalogId(request)!>
+<#assign currentCatalogName = Static["org.ofbiz.product.catalog.CatalogWorker"].getCatalogName(request, currentCatalogId)!>
+
+<#-- Only show if there is more than 1 (one) catalog, no sense selecting when there is only one option... -->
+<#if (catalogCol?size > 1)>
+
+
+
+ ${uiLabelMap.ProductChooseCatalog}
+
+
+
+
+
+
+
+#if>
diff --git a/template/catalog/compareproductslist.ftl b/template/catalog/compareproductslist.ftl
new file mode 100644
index 0000000..de1c509
--- /dev/null
+++ b/template/catalog/compareproductslist.ftl
@@ -0,0 +1,53 @@
+<#--
+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.
+-->
+
+
+
${uiLabelMap.ProductCompareProducts}
+
+
+ <#assign productCompareList = Static["org.ofbiz.product.product.ProductEvents"].getProductCompareList(request)/>
+ <#if productCompareList?has_content>
+
+ <#list productCompareList as product>
+
+
+ ${Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(product, "PRODUCT_NAME", request, "html")}
+
+
+
+ ${uiLabelMap.CommonRemove}
+
+
+ #list>
+
+
+
+<#else/>
+
+ ${uiLabelMap.ProductNoProductsToCompare}
+
+#if>
+
+
\ No newline at end of file
diff --git a/template/catalog/configproductdetail.ftl b/template/catalog/configproductdetail.ftl
new file mode 100644
index 0000000..e95c04f
--- /dev/null
+++ b/template/catalog/configproductdetail.ftl
@@ -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!}
+
+
+
+
+
+
+
+
+ <#-- Category next/previous -->
+ <#if category??>
+
+
+ <#if previousProductId??>
+ ${uiLabelMap.CommonPrevious} |
+ #if>
+ ${(category.categoryName)?default(category.description)!}
+ <#if nextProductId??>
+ | ${uiLabelMap.CommonNext}
+ #if>
+
+
+ #if>
+
+
+
+ <#-- Product image/name/price -->
+
+
+ <#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>
+
+ #if>
+
+
+ ${productContentWrapper.get("PRODUCT_NAME", "html")!}
+ ${productContentWrapper.get("DESCRIPTION", "html")!}
+ ${product.productId!}
+ <#-- example of showing a certain type of feature with the product -->
+ <#if sizeProductFeatureAndAppls?has_content>
+
+ <#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>
+
+ #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??>
+ ${uiLabelMap.ProductAggregatedPrice}: <@ofbizCurrency amount=totalPrice isoCode=totalPrice.currencyUsed/>
+ <#else>
+ <#if price.competitivePrice?? && price.price?? && price.price < price.competitivePrice>
+ ${uiLabelMap.ProductCompareAtPrice}: <@ofbizCurrency amount=price.competitivePrice isoCode=price.currencyUsed/>
+ #if>
+ <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+ ${uiLabelMap.ProductListPrice}: <@ofbizCurrency amount=price.listPrice isoCode=price.currencyUsed/>
+ #if>
+ <#if price.listPrice?? && price.defaultPrice?? && price.price?? && price.price < price.defaultPrice && price.defaultPrice < price.listPrice>
+ ${uiLabelMap.ProductRegularPrice}: <@ofbizCurrency amount=price.defaultPrice isoCode=price.currencyUsed/>
+ #if>
+
+
+ <#if price.isSale?? && price.isSale>
+ ${uiLabelMap.OrderOnSale}!
+ <#assign priceStyle = "salePrice">
+ <#else>
+ <#assign priceStyle = "regularPrice">
+ #if>
+ ${uiLabelMap.OrderYourPrice}: <#if "Y" = product.isVirtual!> from #if><@ofbizCurrency amount=price.price isoCode=price.currencyUsed/>
+
+
+ <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+ <#assign priceSaved = price.listPrice - price.price>
+ <#assign percentSaved = (priceSaved / price.listPrice) * 100>
+ ${uiLabelMap.OrderSave}: <@ofbizCurrency amount=priceSaved isoCode=price.currencyUsed/> (${percentSaved?int}%)
+ #if>
+ #if>
+
+ <#-- Included quantities/pieces -->
+ <#if product.quantityIncluded?? && product.quantityIncluded != 0>
+ ${uiLabelMap.OrderIncludes}:
+ ${product.quantityIncluded!}
+ ${product.quantityUomId!}
+
+ #if>
+ <#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+ ${uiLabelMap.OrderPieces}:
+ ${product.piecesIncluded}
+
+ #if>
+ <#if daysToShip??>
+ ${uiLabelMap.ProductUsuallyShipsIn} ${daysToShip} ${uiLabelMap.CommonDays}
+ #if>
+
+ <#-- show tell a friend details only in ecommerce application -->
+
+
+
+ <#if disFeatureList?? && 0 < disFeatureList.size()>
+
+ <#list disFeatureList as currentFeature>
+
+ ${currentFeature.productFeatureTypeId}: ${currentFeature.description}
+
+ #list>
+
+ #if>
+
+
+
+ <#-- check to see if introductionDate hasn't passed yet -->
+ <#if product.introductionDate?? && nowTimestamp.before(product.introductionDate)>
+
+ ${uiLabelMap.ProductProductNotYetMadeAvailable}.
+ <#-- check to see if salesDiscontinuationDate has passed -->
+ <#elseif product.salesDiscontinuationDate?? && nowTimestamp.after(product.salesDiscontinuationDate)>
+ ${uiLabelMap.ProductProductNoLongerAvailable}.
+ <#-- 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>
+
+ Amount:
+
+
+ <#if !configwrapper.isCompleted()>
+ [${uiLabelMap.EcommerceProductNotConfigured}]
+
+ <#else>
+ ${uiLabelMap.OrderAddToCart}
+
+ <#if minimumQuantity?? && minimumQuantity > 0>
+ Minimum order quantity is ${minimumQuantity}.
+ #if>
+ #if>
+ #if>
+ <#if requestParameters.category_id??>
+
+ #if>
+ #if>
+
+
+ <#if sessionAttributes.userLogin?has_content && sessionAttributes.userLogin.userLoginId != "anonymous">
+
+
+ <#else>
+ ${uiLabelMap.OrderYouMust}
${uiLabelMap.CommonBeLogged}
+ ${uiLabelMap.OrderToAddSelectedItemsToShoppingList}.
+ #if>
+
+ <#-- Prefill first select box (virtual products only) -->
+ <#if variantTree?? && 0 < variantTree.size()>
+
+ #if>
+
+ <#-- Swatches (virtual products only) -->
+ <#if variantSample?? && 0 < variantSample.size()>
+ <#assign imageKeys = variantSample.keySet()>
+ <#assign imageMap = variantSample>
+
+
+
+ <#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>
+
+
+
+ ${key}
+
+ #if>
+ <#assign indexer = indexer + 1>
+ #list>
+ <#if (indexer > maxIndex)>
+ ${uiLabelMap.OrderMoreOptionsAvailable}.
+ #if>
+
+
+ #if>
+
+
+
+
+
+ <#-- Long description of product -->
+
+
+ ${productContentWrapper.get("LONG_DESCRIPTION", "html")!}
+
+
+
+
+
+ <#-- Any attributes/etc may go here -->
+ <#-- Product Configurator -->
+
+
+
+
+
+
+
+ <#-- Product Reviews -->
+
+
+ ${uiLabelMap.OrderCustomerReviews}:
+ <#if averageRating?? && (averageRating > 0) && numRatings?? && (numRatings > 1)>
+ ${uiLabelMap.OrderAverageRating}: ${averageRating} <#if numRatings??>(${uiLabelMap.CommonFrom} ${numRatings} ${uiLabelMap.OrderRatings})#if>
+ #if>
+
+
+
+ <#if productReviews?has_content>
+ <#list productReviews as productReview>
+ <#assign postedUserLogin = productReview.getRelatedOne("UserLogin", false)>
+ <#assign postedPerson = postedUserLogin.getRelatedOne("Person", false)!>
+
+
+
+
+
+ ${uiLabelMap.CommonBy}: <#if productReview.postedAnonymous?default("N") == "Y">${uiLabelMap.OrderAnonymous}<#else>${postedPerson.firstName} ${postedPerson.lastName}#if>
+
+
+ ${uiLabelMap.CommonOn}: ${productReview.postedDateTime!}
+
+
+ ${uiLabelMap.OrderRanking}: ${productReview.productRating!?string}
+
+
+
+
+
+
+
+
+
+ ${productReview.productReview!}
+
+
+
+
+
+
+ #list>
+
+
+ ${uiLabelMap.ProductReviewThisProduct}!
+
+
+ <#else>
+
+
+ ${uiLabelMap.ProductProductNotReviewedYet}.
+
+
+
+
+ ${uiLabelMap.ProductBeTheFirstToReviewThisProduct}
+
+
+
+#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>
+
+
${beforeName!}<#if showName == "Y">${productContentWrapper.get("PRODUCT_NAME", "html")!}#if>${afterName!}
+
+ <#list assocProducts as productAssoc>
+
+
+
+ ${setRequestAttribute("optProductId", productAssoc.productIdTo)}
+ ${setRequestAttribute("listIndex", listIndex)}
+ ${setRequestAttribute("formNamePrefix", formNamePrefix)}
+ <#if targetRequestName?has_content>
+ ${setRequestAttribute("targetRequestName", targetRequestName)}
+ #if>
+
+
+ ${screens.render(productsummaryScreen)}
+
+
+ <#local listIndex = listIndex + 1>
+
+ #list>
+ ${setRequestAttribute("optProductId", "")}
+ ${setRequestAttribute("formNamePrefix", "")}
+ ${setRequestAttribute("targetRequestName", "")}
+ #if>
+#macro>
+<#assign productValue = product>
+<#assign listIndex = 1>
+${setRequestAttribute("productValue", productValue)}
+
+
+ <#-- 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=""/>
+
+
+<#-- special cross/up-sell area using commonFeatureResultIds (from common feature product search) -->
+<#if commonFeatureResultIds?has_content>
+
Similar Products That Might Interest You...
+
+
+ <#list commonFeatureResultIds as commonFeatureResultId>
+
+ ${setRequestAttribute("optProductId", commonFeatureResultId)}
+ ${setRequestAttribute("listIndex", commonFeatureResultId_index)}
+ ${setRequestAttribute("formNamePrefix", "cfeatcssl")}
+ <#-- ${setRequestAttribute("targetRequestName", targetRequestName)} -->
+ ${screens.render(productsummaryScreen)}
+
+ <#if commonFeatureResultId_has_next>
+
+ #if>
+ #list>
+#if>
+
diff --git a/template/catalog/detailImage.ftl b/template/catalog/detailImage.ftl
new file mode 100644
index 0000000..d0c5776
--- /dev/null
+++ b/template/catalog/detailImage.ftl
@@ -0,0 +1,32 @@
+<#--
+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 requestParameters.detail?has_content>
+ <#--assign detailImage = Static["org.ofbiz.base.util.Base64"].base64Decode(requestParameters.detail)-->
+
+ <#else>
+
+ #if>
+
+
diff --git a/template/catalog/keywordsearch.ftl b/template/catalog/keywordsearch.ftl
new file mode 100644
index 0000000..c24de3e
--- /dev/null
+++ b/template/catalog/keywordsearch.ftl
@@ -0,0 +1,95 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
${uiLabelMap.ProductProductSearch}
+
+
+
${uiLabelMap.ProductYouSearchedFor}:
+
+<#list searchConstraintStrings as searchConstraintString>
+ X ${searchConstraintString}
+#list>
+
+
${uiLabelMap.CommonSortedBy}: ${searchSortOrderString}
+
+
+
+<#if !productIds?has_content>
+
${uiLabelMap.ProductNoResultsFound}.
+#if>
+
+<#if productIds?has_content>
+
+ <#-- Start Page Select Drop-Down -->
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize - 1)?double / viewSize?double)>
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int + 1} ${uiLabelMap.CommonOf} ${viewIndexMax + 1}
+ <#list 0..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum + 1}
+ #list>
+
+ <#-- End Page Select Drop-Down -->
+
+ <#if (viewIndex?int > 0)>
+ ${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if (listSize?int > 0)>
+ ${lowIndex+1} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ | ${uiLabelMap.CommonNext}
+ #if>
+
+
+#if>
+
+<#if productIds?has_content>
+
+ <#list productIds as productId> <#-- note that there is no boundary range because that is being done before the list is put in the content -->
+ ${setRequestAttribute("optProductId", productId)}
+ ${setRequestAttribute("listIndex", productId_index)}
+ ${screens.render(productsummaryScreen)}
+ #list>
+
+#if>
+
+<#if productIds?has_content>
+
+ <#-- Start Page Select Drop-Down -->
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize - 1)?double / viewSize?double)>
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int + 1} ${uiLabelMap.CommonOf} ${viewIndexMax + 1}
+ <#list 0..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum + 1}
+ #list>
+
+ <#-- End Page Select Drop-Down -->
+
+ <#if (viewIndex?int > 0)>
+ ${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if (listSize?int > 0)>
+ ${lowIndex+1} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ | ${uiLabelMap.CommonNext}
+ #if>
+
+
+#if>
+
diff --git a/template/catalog/keywordsearchbox.ftl b/template/catalog/keywordsearchbox.ftl
new file mode 100644
index 0000000..8544a34
--- /dev/null
+++ b/template/catalog/keywordsearchbox.ftl
@@ -0,0 +1,74 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.ProductSearchCatalog}
+
+
+
\ No newline at end of file
diff --git a/template/catalog/lastviewedproducts.ftl b/template/catalog/lastviewedproducts.ftl
new file mode 100644
index 0000000..4285a58
--- /dev/null
+++ b/template/catalog/lastviewedproducts.ftl
@@ -0,0 +1,51 @@
+<#--
+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.
+-->
+
+
+
+
+ ${uiLabelMap.ProductProductsLastViewed}
+
+
+
+
+
+<#if sessionAttributes.lastViewedProducts?? && sessionAttributes.lastViewedProducts?has_content>
+
+
+ <#list sessionAttributes.lastViewedProducts as productId>
+
+
+ ${setRequestAttribute("optProductId", productId)}
+ ${setRequestAttribute("listIndex", productId_index)}
+ ${screens.render("component://${activeApp}/widget/CatalogScreens.xml#productsummary")}
+
+
+ #list>
+
+
+<#else>
+
+
+
+ ${uiLabelMap.ProductNotViewedAnyProducts}.
+
+
+
+#if>
diff --git a/template/catalog/miniassocprods.ftl b/template/catalog/miniassocprods.ftl
new file mode 100644
index 0000000..f9f0af4
--- /dev/null
+++ b/template/catalog/miniassocprods.ftl
@@ -0,0 +1,38 @@
+<#--
+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 associatedProducts = Static["org.ofbiz.order.shoppingcart.product.ProductDisplayWorker"].getRandomCartProductAssoc(request, true)!>
+<#if associatedProducts?has_content>
+
+
+
${uiLabelMap.EcommerceYouMightLike}...
+
+
+ <#-- random complementary products -->
+
+ <#list associatedProducts as miniProduct>
+ ${setRequestAttribute("miniProdQuantity", 1)}
+ ${setRequestAttribute("miniProdFormName", "theminiassocprod" + miniProduct_index + "form")}
+ ${setRequestAttribute("optProductId", miniProduct.productId)}
+ ${screens.render("component://${activeApp}/widget/CatalogScreens.xml#miniproductsummary")}
+ #list>
+
+
+
+#if>
diff --git a/template/catalog/minilastproductsearches.ftl b/template/catalog/minilastproductsearches.ftl
new file mode 100644
index 0000000..7b0091d
--- /dev/null
+++ b/template/catalog/minilastproductsearches.ftl
@@ -0,0 +1,51 @@
+<#--
+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 maxToShow = 4/>
+<#assign searchOptionsHistoryList = Static["org.ofbiz.product.product.ProductSearchSession"].getSearchOptionsHistoryList(session)!/>
+<#if searchOptionsHistoryList?has_content>
+ <#if (searchOptionsHistoryList?size > maxToShow)><#assign limit=maxToShow/><#else><#assign limit=(searchOptionsHistoryList?size-1)/>#if>
+
+
+
${uiLabelMap.OrderLastSearches}...
+
+ <#list searchOptionsHistoryList[0..limit] as searchOptions>
+ <#-- searchOptions type is ProductSearchSession.ProductSearchOptions -->
+
+ ${uiLabelMap.EcommerceSearchNumber} ${searchOptions_index + 1}
+
+
+ #list>
+
+
+#if>
diff --git a/template/catalog/minilastviewedcategories.ftl b/template/catalog/minilastviewedcategories.ftl
new file mode 100644
index 0000000..e3b8e49
--- /dev/null
+++ b/template/catalog/minilastviewedcategories.ftl
@@ -0,0 +1,48 @@
+<#--
+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 maxToShow = 8/>
+<#assign lastViewedCategories = sessionAttributes.lastViewedCategories!/>
+<#if lastViewedCategories?has_content>
+ <#if (lastViewedCategories?size > maxToShow)><#assign limit=maxToShow/><#else><#assign limit=(lastViewedCategories?size-1)/>#if>
+
+
+
${uiLabelMap.EcommerceLastCategories}
+
+
+
+#if>
diff --git a/template/catalog/minilastviewedproducts.ftl b/template/catalog/minilastviewedproducts.ftl
new file mode 100644
index 0000000..dbe1404
--- /dev/null
+++ b/template/catalog/minilastviewedproducts.ftl
@@ -0,0 +1,48 @@
+<#--
+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 maxToShow = 4/>
+<#assign lastViewedProducts = sessionAttributes.lastViewedProducts!/>
+<#if lastViewedProducts?has_content>
+ <#if (lastViewedProducts?size > maxToShow)><#assign limit=maxToShow/><#else><#assign limit=(lastViewedProducts?size-1)/>#if>
+
+
+
+
+ <#list lastViewedProducts[0..limit] as productId>
+
+ ${setRequestAttribute("miniProdQuantity", "1")}
+ ${setRequestAttribute("optProductId", productId)}
+ ${setRequestAttribute("miniProdFormName", "lastviewed" + productId_index + "form")}
+ ${screens.render("component://${activeApp}/widget/CatalogScreens.xml#miniproductsummary")}
+
+ #list>
+
+
+
+#if>
diff --git a/template/catalog/miniproductsummary.ftl b/template/catalog/miniproductsummary.ftl
new file mode 100644
index 0000000..7138bbb
--- /dev/null
+++ b/template/catalog/miniproductsummary.ftl
@@ -0,0 +1,58 @@
+<#--
+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 miniProduct??>
+
${miniProductContentWrapper.get("PRODUCT_NAME", "html")?default("No Name Available")}
+
+ ${miniProduct.productId}
+ <#if (priceResult.price?default(0) > 0 && miniProduct.requireAmount?default("N") == "N")>
+ <#if "Y" = miniProduct.isVirtual!> ${uiLabelMap.CommonFrom} #if>
+ <#if totalPrice??>
+ ${uiLabelMap.ProductAggregatedPrice}:
<@ofbizCurrency amount=totalPrice isoCode=priceResult.currencyUsed/>
+ <#else>
+
+ <@ofbizCurrency amount=priceResult.price isoCode=priceResult.currencyUsed/>
+ #if>
+ #if>
+ <#if (miniProduct.introductionDate??) && (nowTimeLong < miniProduct.introductionDate.getTime())>
+ <#-- check to see if introductionDate hasn't passed yet -->
+ ${uiLabelMap.ProductNotYetAvailable}
+ <#elseif (miniProduct.salesDiscontinuationDate??) && (nowTimeLong > miniProduct.salesDiscontinuationDate.getTime())>
+ <#-- check to see if salesDiscontinuationDate has passed -->
+ ${uiLabelMap.ProductNoLongerAvailable}
+ <#elseif miniProduct.isVirtual?default("N") == "Y">
+
${uiLabelMap.OrderChooseVariations}...
+ <#elseif miniProduct.requireAmount?default("N") == "Y">
+
${uiLabelMap.OrderChooseAmount}...
+ <#else>
+
+ #if>
+
+#if>
diff --git a/template/catalog/minireorderprods.ftl b/template/catalog/minireorderprods.ftl
new file mode 100644
index 0000000..db48c13
--- /dev/null
+++ b/template/catalog/minireorderprods.ftl
@@ -0,0 +1,37 @@
+<#--
+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 reorderProducts?has_content>
+
+
+
${uiLabelMap.ProductQuickReorder}
+
+
+ <#list reorderProducts as miniProduct>
+
+ ${setRequestAttribute("miniProdQuantity", reorderQuantities.get(miniProduct.productId))}
+ ${setRequestAttribute("miniProdFormName", "theminireorderprod" + miniProduct_index + "form")}
+ ${setRequestAttribute("optProductId", miniProduct.productId)}
+ ${screens.render("component://${activeApp}/widget/CatalogScreens.xml#miniproductsummary")}
+
+ <#if miniProduct_has_next>
+ #if>
+ #list>
+
+
+#if>
diff --git a/template/catalog/populartags.ftl b/template/catalog/populartags.ftl
new file mode 100644
index 0000000..2e447e2
--- /dev/null
+++ b/template/catalog/populartags.ftl
@@ -0,0 +1,29 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 tagCloudList?has_content>
+
+#if>
diff --git a/template/catalog/productdetail.ftl b/template/catalog/productdetail.ftl
new file mode 100644
index 0000000..9739a1a
--- /dev/null
+++ b/template/catalog/productdetail.ftl
@@ -0,0 +1,923 @@
+<#--
+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 price = priceMap! />
+<#assign productImageList = productImageList! />
+<#-- end variable setup -->
+
+<#-- virtual product javascript -->
+${virtualJavaScript!}
+${virtualVariantJavaScript!}
+
+
+<#macro showUnavailableVarients>
+ <#if unavailableVariants??>
+
+ <#list unavailableVariants as prod>
+ <#assign features = prod.getRelated("ProductFeatureAppl", null, null, false)/>
+
+ <#list features as feature>
+ ${feature.getRelatedOne("ProductFeature", false).description} <#if feature_has_next>, #if>
+ #list>
+ ${uiLabelMap.ProductItemOutOfStock}
+
+ #list>
+
+ #if>
+#macro>
+
+
+ <#assign productAdditionalImage1 = productContentWrapper.get("ADDITIONAL_IMAGE_1", "url")! />
+ <#assign productAdditionalImage2 = productContentWrapper.get("ADDITIONAL_IMAGE_2", "url")! />
+ <#assign productAdditionalImage3 = productContentWrapper.get("ADDITIONAL_IMAGE_3", "url")! />
+ <#assign productAdditionalImage4 = productContentWrapper.get("ADDITIONAL_IMAGE_4", "url")! />
+
+ <#-- Category next/previous -->
+ <#if category??>
+
+ #if>
+
+
+
+
+
+ <#if productImageList?has_content>
+ <#-- Product image/name/price -->
+
+ <#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>
+
+
+ #if>
+ <#if !productLargeImageUrl?string?has_content>
+
+ #if>
+
+ <#-- Show Image Approved -->
+
+
+ <#if productImageList?has_content>
+ <#list productImageList as productImage>
+
+
+
+ #list>
+ #if>
+
+ <#else>
+ <#-- Product image/name/price -->
+
+ <#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>
+
+
+ #if>
+ <#if !productLargeImageUrl?string?has_content>
+
+ #if>
+
+
+ <#if productAdditionalImage1?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage2?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage3?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage4?string?has_content>
+
+
+
+ #if>
+
+ #if>
+
+
+
${productContentWrapper.get("PRODUCT_NAME", "html")!}
+
${productContentWrapper.get("DESCRIPTION", "html")!}
+
${product.productId!}
+ <#-- example of showing a certain type of feature with the product -->
+ <#if sizeProductFeatureAndAppls?has_content>
+
+ <#if (sizeProductFeatureAndAppls?size == 1)>
+ ${uiLabelMap.OrderSizeAvailableSingle}:
+ <#else>
+ ${uiLabelMap.OrderSizeAvailableMultiple}:
+ #if>
+ <#list sizeProductFeatureAndAppls as sizeProductFeatureAndAppl>
+ ${sizeProductFeatureAndAppl.description?default(sizeProductFeatureAndAppl.abbrev?default(sizeProductFeatureAndAppl.productFeatureId))}<#if sizeProductFeatureAndAppl_has_next>,#if>
+ #list>
+
+ #if>
+
+ <#-- for prices:
+ - 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 price.competitivePrice?? && price.price?? && price.price < price.competitivePrice>
+
${uiLabelMap.ProductCompareAtPrice}: <@ofbizCurrency amount=price.competitivePrice isoCode=price.currencyUsed />
+ #if>
+ <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+
${uiLabelMap.ProductListPrice}: <@ofbizCurrency amount=price.listPrice isoCode=price.currencyUsed />
+ #if>
+ <#if price.listPrice?? && price.defaultPrice?? && price.price?? && price.price < price.defaultPrice && price.defaultPrice < price.listPrice>
+
${uiLabelMap.ProductRegularPrice}: <@ofbizCurrency amount=price.defaultPrice isoCode=price.currencyUsed />
+ #if>
+ <#if price.specialPromoPrice??>
+
${uiLabelMap.ProductSpecialPromoPrice}: <@ofbizCurrency amount=price.specialPromoPrice isoCode=price.currencyUsed />
+ #if>
+
+
+ <#if price.isSale?? && price.isSale>
+ ${uiLabelMap.OrderOnSale}!
+ <#assign priceStyle = "salePrice" />
+ <#else>
+ <#assign priceStyle = "regularPrice" />
+ #if>
+ ${uiLabelMap.OrderYourPrice}: <#if "Y" = product.isVirtual!> ${uiLabelMap.CommonFrom} #if><@ofbizCurrency amount=price.price isoCode=price.currencyUsed />
+ <#if product.productTypeId! == "ASSET_USAGE" || product.productTypeId! == "ASSET_USAGE_OUT_IN">
+ <#if product.reserv2ndPPPerc?? && product.reserv2ndPPPerc != 0>${uiLabelMap.ProductReserv2ndPPPerc}<#if !product.reservNthPPPerc?? || product.reservNthPPPerc == 0>${uiLabelMap.CommonUntil} ${product.reservMaxPersons!1}#if> <@ofbizCurrency amount=product.reserv2ndPPPerc*price.price/100 isoCode=price.currencyUsed /> #if>
+ <#if product.reservNthPPPerc?? &&product.reservNthPPPerc != 0>${uiLabelMap.ProductReservNthPPPerc} <#if !product.reserv2ndPPPerc?? || product.reserv2ndPPPerc == 0>${uiLabelMap.ProductReservSecond} <#else> ${uiLabelMap.ProductReservThird} #if> ${uiLabelMap.CommonUntil} ${product.reservMaxPersons!1}, ${uiLabelMap.ProductEach}: <@ofbizCurrency amount=product.reservNthPPPerc*price.price/100 isoCode=price.currencyUsed /> #if>
+ <#if (!product.reserv2ndPPPerc?? || product.reserv2ndPPPerc == 0) && (!product.reservNthPPPerc?? || product.reservNthPPPerc == 0)> ${uiLabelMap.ProductMaximum} ${product.reservMaxPersons!1} ${uiLabelMap.ProductPersons}.#if>
+ #if>
+
+
+ <#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+ <#assign priceSaved = price.listPrice - price.price />
+ <#assign percentSaved = (priceSaved / price.listPrice) * 100 />
+
${uiLabelMap.OrderSave}: <@ofbizCurrency amount=priceSaved isoCode=price.currencyUsed /> (${percentSaved?int}%)
+ #if>
+ <#-- show price details ("showPriceDetails" field can be set in the screen definition) -->
+ <#if (showPriceDetails?? && showPriceDetails?default("N") == "Y")>
+ <#if price.orderItemPriceInfos??>
+ <#list price.orderItemPriceInfos as orderItemPriceInfo>
+
${orderItemPriceInfo.description!}
+ #list>
+ #if>
+ #if>
+
+ <#-- Included quantities/pieces -->
+ <#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+
+ ${uiLabelMap.OrderPieces}: ${product.piecesIncluded}
+
+ #if>
+ <#if (product.quantityIncluded?? && product.quantityIncluded != 0) || product.quantityUomId?has_content>
+ <#assign quantityUom = product.getRelatedOne("QuantityUom", true)! />
+
+ ${uiLabelMap.CommonQuantity}: ${product.quantityIncluded!} ${((quantityUom.abbreviation)?default(product.quantityUomId))!}
+
+ #if>
+
+ <#if (product.productWeight?? && product.productWeight != 0) || product.weightUomId?has_content>
+ <#assign weightUom = product.getRelatedOne("WeightUom", true)! />
+
+ ${uiLabelMap.CommonWeight}: ${product.productWeight!} ${((weightUom.abbreviation)?default(product.weightUomId))!}
+
+ #if>
+ <#if (product.productHeight?? && product.productHeight != 0) || product.heightUomId?has_content>
+ <#assign heightUom = product.getRelatedOne("HeightUom", true)! />
+
+ ${uiLabelMap.CommonHeight}: ${product.productHeight!} ${((heightUom.abbreviation)?default(product.heightUomId))!}
+
+ #if>
+ <#if (product.productWidth?? && product.productWidth != 0) || product.widthUomId?has_content>
+ <#assign widthUom = product.getRelatedOne("WidthUom", true)! />
+
+ ${uiLabelMap.CommonWidth}: ${product.productWidth!} ${((widthUom.abbreviation)?default(product.widthUomId))!}
+
+ #if>
+ <#if (product.productDepth?? && product.productDepth != 0) || product.depthUomId?has_content>
+ <#assign depthUom = product.getRelatedOne("DepthUom", true)! />
+
+ ${uiLabelMap.CommonDepth}: ${product.productDepth!} ${((depthUom.abbreviation)?default(product.depthUomId))!}
+
+ #if>
+
+ <#if daysToShip??>
+
${uiLabelMap.ProductUsuallyShipsIn} ${daysToShip} ${uiLabelMap.CommonDays}!
+ #if>
+
+ <#-- show tell a friend details only in ecommerce application -->
+
+
+
+ <#if disFeatureList?? && 0 < disFeatureList.size()>
+
+ <#list disFeatureList as currentFeature>
+ <#assign disFeatureType = currentFeature.getRelatedOne("ProductFeatureType", true) />
+
+ <#if disFeatureType.description??>${disFeatureType.get("description", locale)}<#else>${currentFeature.productFeatureTypeId}#if>: ${currentFeature.description}
+
+ #list>
+
+ #if>
+
+
+
+ Number of days
+ Number of persons
+ Number of rooms
+
+ ${uiLabelMap.OrderAddToCart}
+ <#else>
+ disabled="disabled"#if> />${uiLabelMap.OrderAddToCart}
+ <@showUnavailableVarients/>
+ #if>
+ <#else>
+ <#if productStore??>
+ <#if productStore.requireInventory?? && productStore.requireInventory == "N">
+ disabled="disabled"#if> />${uiLabelMap.OrderAddToCart}
+ <@showUnavailableVarients/>
+ <#else>
+ ${uiLabelMap.OrderAddToCart}
+ ${uiLabelMap.ProductItemOutOfStock}<#if product.inventoryMessage??>— ${product.inventoryMessage}#if>
+ #if>
+ #if>
+ #if>
+ #if>
+ <#if variantPriceList??>
+ <#list variantPriceList as vpricing>
+ <#assign variantName = vpricing.get("variantName")!>
+ <#assign secondVariantName = vpricing.get("secondVariantName")!>
+ <#assign minimumQuantity = vpricing.get("minimumQuantity")>
+ <#if minimumQuantity > 0>
+ minimum order quantity for ${secondVariantName!} ${variantName!} is ${minimumQuantity!}
+ #if>
+ #list>
+ <#elseif minimumQuantity?? && minimumQuantity?has_content && minimumQuantity > 0>
+ minimum order quantity for ${productContentWrapper.get("PRODUCT_NAME", "html")!} is ${minimumQuantity!}
+ #if>
+
+
+
+
+ <#if sessionAttributes.userLogin?has_content && sessionAttributes.userLogin.userLoginId != "anonymous">
+
+
+ <#else>
+ ${uiLabelMap.OrderYouMust}
${uiLabelMap.CommonBeLogged}
+ ${uiLabelMap.OrderToAddSelectedItemsToShoppingList}.
+ #if>
+
+ <#-- Prefill first select box (virtual products only) -->
+ <#if variantTree?? && 0 < variantTree.size()>
+
+ #if>
+
+ <#-- Swatches (virtual products only) -->
+ <#if variantSample?? && 0 < variantSample.size()>
+ <#assign imageKeys = variantSample.keySet() />
+ <#assign imageMap = variantSample />
+
+ <#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>
+ ${key}
+
+
+ #if>
+ <#assign indexer = indexer + 1 />
+ #list>
+ <#if (indexer > maxIndex)>
+ ${uiLabelMap.ProductMoreOptions}
+ #if>
+ #if>
+
+ <#-- Digital Download Files Associated with this Product -->
+ <#if downloadProductContentAndInfoList?has_content>
+
+
${uiLabelMap.OrderDownloadFilesTitle}:
+ <#list downloadProductContentAndInfoList as downloadProductContentAndInfo>
+
${downloadProductContentAndInfo.contentName!}<#if downloadProductContentAndInfo.description?has_content> - ${downloadProductContentAndInfo.description}#if>
+ #list>
+
+ #if>
+
+ <#-- Long description of product -->
+
+
${productContentWrapper.get("LONG_DESCRIPTION", "html")!}
+
${productContentWrapper.get("WARNINGS", "html")!}
+
+
+ <#-- Any attributes/etc may go here -->
+
+ <#-- Product Reviews -->
+
+
${uiLabelMap.OrderCustomerReviews}:
+ <#if averageRating?? && (averageRating > 0) && numRatings?? && (numRatings > 1)>
+
${uiLabelMap.OrderAverageRating}: ${averageRating} <#if numRatings??>(${uiLabelMap.CommonFrom} ${numRatings} ${uiLabelMap.OrderRatings})#if>
+ #if>
+
+ <#if productReviews?has_content>
+ <#list productReviews as productReview>
+ <#assign postedUserLogin = productReview.getRelatedOne("UserLogin", false) />
+ <#assign postedPerson = postedUserLogin.getRelatedOne("Person", false)! />
+
${uiLabelMap.CommonBy}: <#if productReview.postedAnonymous?default("N") == "Y"> ${uiLabelMap.OrderAnonymous}<#else> ${postedPerson.firstName} ${postedPerson.lastName} #if>
+
${uiLabelMap.CommonAt}: ${productReview.postedDateTime!}
+
${uiLabelMap.OrderRanking}: ${productReview.productRating!?string}
+
+
${productReview.productReview!}
+
+ #list>
+
+ <#else>
+
${uiLabelMap.ProductProductNotReviewedYet}.
+
+
+ #if>
+
+ <#-- Upgrades/Up-Sell/Cross-Sell -->
+ <#macro associated assocProducts beforeName showName afterName formNamePrefix targetRequestName>
+ <#assign pageProduct = product />
+ <#assign targetRequest = "product" />
+ <#if targetRequestName?has_content>
+ <#assign targetRequest = targetRequestName />
+ #if>
+ <#if assocProducts?has_content>
+ ${beforeName!}<#if showName == "Y">${productContentWrapper.get("PRODUCT_NAME", "html")!}#if>${afterName!}
+
+
+ <#list assocProducts as productAssoc>
+ <#if productAssoc.productId == product.productId>
+ <#assign assocProductId = productAssoc.productIdTo />
+ <#else>
+ <#assign assocProductId = productAssoc.productId />
+ #if>
+
+ ${setRequestAttribute("optProductId", assocProductId)}
+ ${setRequestAttribute("listIndex", listIndex)}
+ ${setRequestAttribute("formNamePrefix", formNamePrefix)}
+ <#if targetRequestName?has_content>
+ ${setRequestAttribute("targetRequestName", targetRequestName)}
+ #if>
+ ${screens.render(productsummaryScreen)}
+ <#assign product = pageProduct />
+ <#local listIndex = listIndex + 1 />
+ #list>
+
+
+ ${setRequestAttribute("optProductId", "")}
+ ${setRequestAttribute("formNamePrefix", "")}
+ ${setRequestAttribute("targetRequestName", "")}
+ #if>
+ #macro>
+
+ <#assign productValue = product />
+ <#assign listIndex = 1 />
+ ${setRequestAttribute("productValue", productValue)}
+
+ <#-- also bought -->
+ <@associated assocProducts=alsoBoughtProducts beforeName="" showName="N" afterName="${uiLabelMap.ProductAlsoBought}" formNamePrefix="albt" targetRequestName="" />
+ <#-- obsolete -->
+ <@associated assocProducts=obsoleteProducts beforeName="" showName="Y" afterName=" ${uiLabelMap.ProductObsolete}" formNamePrefix="obs" targetRequestName="" />
+ <#-- cross sell -->
+ <@associated assocProducts=crossSellProducts beforeName="" showName="N" afterName="${uiLabelMap.ProductCrossSell}" formNamePrefix="cssl" targetRequestName="crosssell" />
+ <#-- up sell -->
+ <@associated assocProducts=upSellProducts beforeName="${uiLabelMap.ProductUpSell} " showName="Y" afterName=":" formNamePrefix="upsl" targetRequestName="upsell" />
+ <#-- obsolescence -->
+ <@associated assocProducts=obsolenscenseProducts beforeName="" showName="Y" afterName=" ${uiLabelMap.ProductObsolescense}" formNamePrefix="obce" targetRequestName="" />
+
+
+ <#-- special cross/up-sell area using commonFeatureResultIds (from common feature product search) -->
+ <#if commonFeatureResultIds?has_content>
+ ${uiLabelMap.ProductSimilarProducts}
+
+
+ <#list commonFeatureResultIds as commonFeatureResultId>
+ ${setRequestAttribute("optProductId", commonFeatureResultId)}
+ ${setRequestAttribute("listIndex", commonFeatureResultId_index)}
+ ${setRequestAttribute("formNamePrefix", "cfeatcssl")}
+ <#-- ${setRequestAttribute("targetRequestName", targetRequestName)} -->
+ ${screens.render(productsummaryScreen)}
+ #list>
+
+ #if>
+
+
+
+
+
+
diff --git a/template/catalog/productreview.ftl b/template/catalog/productreview.ftl
new file mode 100644
index 0000000..47e4210
--- /dev/null
+++ b/template/catalog/productreview.ftl
@@ -0,0 +1,79 @@
+<#--
+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 productUrl><@ofbizCatalogAltUrl productId=requestParameters.product_id productCategoryId=requestParameters.category_id/>#assign>
+<#if requestParameters.product_id??>
+
+ <#if (requestParameters.productId)?? || (requestParameters.productId)??>
+ " />
+ <#else>
+ <#assign cancel = "Y">
+ #if>
+
+ <#if !cancel??>
+
+ <#else>
+
+ ${uiLabelMap.EcommerceTellAFriendSorry}
+ #if>
+
+
+
diff --git a/template/content/bloglib.ftl b/template/content/bloglib.ftl
new file mode 100644
index 0000000..624e038
--- /dev/null
+++ b/template/content/bloglib.ftl
@@ -0,0 +1,55 @@
+<#--
+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.
+-->
+
+<#macro renderAncestryPath trail siteId startIndex=0 endIndexOffset=0 buttonTitle="Back to" searchOn="" >
+ <#local indent = "">
+ <#local csv = "">
+ <#local counter = 0>
+ <#local len = trail?size>
+
+ <#list trail as content>
+ <#if counter < (len - endIndexOffset) && startIndex <= counter >
+ <#if 0 < counter >
+ <#local csv = csv + ","/>
+ #if>
+ <#local csv = csv + content.contentId/>
+ <#if counter < len && startIndex <= counter >
+
+
+ ${indent}
+ <#if content.contentTypeId == "WEB_SITE_PUB_PT" >
+ ${uiLabelMap.CommonBackTo} ${content.contentName!}
+ <#else>
+ ${uiLabelMap.CommonBackTo} ${content.contentName!}
+ #if>
+ <#local indent = indent + " ">
+ [${content.contentId!}]
+ <#if searchOn?has_content && searchOn?lower_case == "true">
+
+ ${uiLabelMap.CommonSearch}
+ #if>
+ #if>
+
+
+ #if>
+ <#local counter = counter + 1>
+ <#if 20 < counter > <#break/>#if>
+ #list>
+
+#macro>
diff --git a/template/content/content_categories.ftl b/template/content/content_categories.ftl
new file mode 100644
index 0000000..be7f4ad
--- /dev/null
+++ b/template/content/content_categories.ftl
@@ -0,0 +1,48 @@
+<#--
+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 contentRootId = "WebStoreCONTENT"/>
+
+<#-- variable setup and worker calls -->
+<#assign curCategoryId = requestAttributes.curCategoryId!>
+<#assign forumTrailCsv=requestParameters.forumTrailCsv!/>
+<#assign forumTrail=[]/>
+<#assign firstContentId=""/>
+<#if forumTrailCsv?has_content>
+ <#assign forumTrail=Static["org.ofbiz.base.util.StringUtil"].split(forumTrailCsv, ",") />
+ <#if 0 < forumTrail?size>
+ <#assign firstContentId=forumTrail[0]?string/>
+ #if>
+#if>
+
+
+
+
${uiLabelMap.ProductBrowseContent}
+
+
+
+ <#assign count_1=0/>
+ <@loopSubContent contentId=contentRootId viewIndex=0 viewSize=9999 orderBy="contentName">
+
+ ${content.contentName}
+
+ <#assign count_1=(count_1 + 1)/>
+ @loopSubContent>
+
+
+
\ No newline at end of file
diff --git a/template/content/content_topic.ftl b/template/content/content_topic.ftl
new file mode 100644
index 0000000..a84966b
--- /dev/null
+++ b/template/content/content_topic.ftl
@@ -0,0 +1,51 @@
+<#--
+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 contentRootId = "WebStoreCONTENT"/>
+
+<#-- variable setup and worker calls -->
+<#assign curCategoryId = requestAttributes.curCategoryId!>
+<#assign forumTrailCsv=requestParameters.forumTrailCsv!/>
+<#assign forumTrail=[]/>
+<#assign firstContentId=""/>
+<#if forumTrailCsv?has_content>
+ <#assign forumTrail=Static["org.ofbiz.base.util.StringUtil"].split(forumTrailCsv, ",") />
+ <#if 0 < forumTrail?size>
+ <#assign firstContentId=forumTrail[0]?string/>
+ #if>
+#if>
+
+
+
+
+
+ <#assign count_1=0/>
+ <@loopSubContent contentId=contentRootId viewIndex=0 viewSize=9999 orderBy="contentName">
+
+ ${content.contentName}
+
+ <#assign count_1=(count_1 + 1)/>
+ @loopSubContent>
+
+
+
diff --git a/template/content/defaultcontent.ftl b/template/content/defaultcontent.ftl
new file mode 100644
index 0000000..6df2571
--- /dev/null
+++ b/template/content/defaultcontent.ftl
@@ -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.
+-->
+
+<@renderSubContent subContentId=contentId/>
diff --git a/template/content/factoids.ftl b/template/content/factoids.ftl
new file mode 100644
index 0000000..9bbfa1c
--- /dev/null
+++ b/template/content/factoids.ftl
@@ -0,0 +1,48 @@
+<#--
+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 factoidRootId = "WebStoreFACTOID"/>
+
+<#-- variable setup and worker calls -->
+<#assign curCategoryId = requestAttributes.curCategoryId!>
+<#assign factoidTrailCsv = requestParameters.factoidTrailCsv!/>
+<#assign factoidTrail=[]/>
+<#assign firstContentId=""/>
+<#if factoidTrailCsv?has_content>
+ <#assign factoidTrail=Static["org.ofbiz.base.util.StringUtil"].split(factoidTrailCsv, ",") />
+ <#if 0 < factoidTrail?size>
+ <#assign firstContentId=factoidTrail[0]?string/>
+ #if>
+#if>
+
+
+
+
${uiLabelMap.EcommerceFactoids}
+
+
+
+ <#assign count_1=0/>
+ <@limitedSubContent contentId=factoidRootId viewIndex=0 viewSize=9999 orderBy="contentName" limitSize="2">
+
+ <@renderSubContentCache subContentId=subContentId/>
+
+ <#assign count_1=(count_1 + 1)/>
+ @limitedSubContent>
+
+
+
\ No newline at end of file
diff --git a/template/content/minipoll.ftl b/template/content/minipoll.ftl
new file mode 100644
index 0000000..c667f1f
--- /dev/null
+++ b/template/content/minipoll.ftl
@@ -0,0 +1,39 @@
+<#--
+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 groupName = page.randomSurveyGroup!>
+<#if groupName?has_content>
+ <#assign randomSurvey = Static["org.ofbiz.product.store.ProductStoreWorker"].getRandomSurveyWrapper(request, "testSurveyGroup")!>
+#if>
+
+<#if randomSurvey?has_content>
+
+
+
+ ${randomSurvey.getSurveyName()!}
+
+
+
+
+
+ ${randomSurvey.render()}
+
+
+
+#if>
diff --git a/template/content/recentlyviewed.ftl b/template/content/recentlyviewed.ftl
new file mode 100644
index 0000000..a9c5be6
--- /dev/null
+++ b/template/content/recentlyviewed.ftl
@@ -0,0 +1,36 @@
+<#--
+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 mrvList?has_content>
+
+
+
+ ${uiLabelMap.EcommerceLastContent}
+
+
+
+
+ <#list mrvList as mrvArr>
+
+ #list>
+
+
+#if>
\ No newline at end of file
diff --git a/template/content/searchContent.ftl b/template/content/searchContent.ftl
new file mode 100644
index 0000000..dd574a3
--- /dev/null
+++ b/template/content/searchContent.ftl
@@ -0,0 +1,115 @@
+<#--
+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.
+-->
+
+
+
+
+
+
+
+${uiLabelMap.EcommerceEnterQueryParameters}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${listWrapper.renderFormString()}
+
+<#macro listSiteIds contentId indentIndex=0>
+ <#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in listSiteIds, contentId:" + contentId,"")/>
+ <#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in listSiteIds, indentIndex:" + indentIndex,"")/>
+ <#local indent = ""/>
+ <#if 0 < indentIndex >
+ <#list 0..(indentIndex - 1) as idx>
+ <#local indent = indent + " "/>
+ #list>
+ #if>
+<@loopSubContent contentId=contentId viewIndex=0 viewSize=9999 returnAfterPickWhen="1==1";>
+ ${indent}${content.description}
+ <@listSiteIds contentId=content.contentId indentIndex=indentIndex + 1 />
+@loopSubContent>
+#macro>
diff --git a/template/content/showcontenttree.ftl b/template/content/showcontenttree.ftl
new file mode 100644
index 0000000..ff910c9
--- /dev/null
+++ b/template/content/showcontenttree.ftl
@@ -0,0 +1,111 @@
+<#--
+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.
+-->
+
+<#include "bloglib.ftl" />
+<#assign siteId = requestParameters.contentId! />
+
+<@renderAncestryPath trail=ancestorList?default([]) endIndexOffset=1 siteId=siteId searchOn="true"/>
+
+<#if ancestorList?has_content && (0 < ancestorList?size) >
+ <#assign lastContent=ancestorList?last />
+ [${lastContent.contentId}] ${lastContent.description}
+ ${uiLabelMap.CommonSearch}
+
+#if>
+
+<#assign viewIdx = "" />
+<#if requestParameters.viewIndex?has_content>
+<#assign viewIdx = requestParameters.viewIndex! />
+#if>
+<#assign viewSz = "" />
+<#if requestParameters.viewSize?has_content>
+<#assign viewSz = requestParameters.viewSize! />
+#if>
+<#assign nodeTrailCsv=requestParameters.nodeTrailCsv!/>
+<#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in showcontenttree, nodeTrailCsv(0):" + nodeTrailCsv, "")/>
+<#assign nodeTrail=[]/>
+<#assign firstContentId=""/>
+<#if nodeTrailCsv?has_content>
+ <#assign nodeTrail=Static["org.ofbiz.base.util.StringUtil"].split(nodeTrailCsv, ",") />
+ <#if 0 < nodeTrail?size>
+ <#assign firstContentId=nodeTrail[0]?string/>
+ #if>
+#if>
+
+<#--
+<#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in showcontenttree, siteId:" + siteId, "")/>
+<#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in showcontenttree, nodeTrail:" + nodeTrail, "")/>
+-->
+
+
+ <@renderCategoryBrowse contentId=siteId indentIndex=1 nodeTrail=nodeTrail />
+
+
+<#macro renderCategoryBrowse contentId="" indentIndex=0 nodeTrail=[] viewSz=9999 viewIdx=0>
+
+
+ <#local contentIdx = contentId! />
+ <#if (!contentIdx?? || contentIdx?length == 0)>
+ <#local contentIdx = page.contentIdx! />
+ <#if (!contentIdx?? || contentIdx?length == 0)>
+ #if>
+ #if>
+
+ <#local thisContentId=nodeTrail[indentIndex]!/>
+
+ <#local thisNodeTrailCsv = "" />
+ <#local listUpper = (indentIndex - 1) />
+ <#if nodeTrail?size < listUpper >
+ <#local listUpper = (nodeTrail?size - 1)>
+ #if>
+ <#list 0..listUpper as idx>
+ <#if thisNodeTrailCsv?has_content>
+ <#local thisNodeTrailCsv = thisNodeTrailCsv + ","/>
+ #if>
+ <#if nodeTrail[idx]??>
+ <#local thisNodeTrailCsv = thisNodeTrailCsv + nodeTrail[idx]>
+ #if>
+ #list>
+
+
+
+
+ <@loopSubContent contentId=contentIdx viewIndex=viewIdx viewSize=viewSz contentAssocTypeId="PUBLISH_LINK" returnAfterPickWhen="1==1">
+ <#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in showcontenttree, nodeTrailCsv(1):" + nodeTrailCsv, "")/>
+ <#local thisCsv=thisNodeTrailCsv + "," + subContentId />
+ ${uiLabelMap.CommonView} ${content.description!}
+ @loopSubContent>
+
+
+
+ <@loopSubContent contentId=contentIdx viewIndex=viewIdx viewSize=viewSz returnAfterPickWhen="1==1" orderBy="contentName">
+ <#local plusMinus="+"/>
+ <#if thisContentId == subContentId>
+ <#local plusMinus="-"/>
+ #if>
+ <#local thisCsv=thisNodeTrailCsv />
+ <#local thisCsv=thisNodeTrailCsv + "," + subContentId />
+ ${plusMinus} ${content.description!}
+ ${uiLabelMap.CommonSearch}
+ <#if thisContentId == subContentId>
+ <#assign catTrail = nodeTrail + [subContentId]/>
+ <@renderCategoryBrowse contentId=subContentId indentIndex=(indentIndex + 1) nodeTrail=catTrail viewSz=viewSz viewIdx=viewIdx />
+ #if>
+ @loopSubContent>
+#macro>
diff --git a/template/content/tpl_mb_content.ftl b/template/content/tpl_mb_content.ftl
new file mode 100644
index 0000000..258e4aa
--- /dev/null
+++ b/template/content/tpl_mb_content.ftl
@@ -0,0 +1,67 @@
+<#ftl ns_prefixes={"ask":"http://www.automationgroups.com/dtd/ask/"}>
+<#--
+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.
+-->
+
+<#recurse doc>
+
+
+<#macro "ask:document">
+ <#recurse .node>
+#macro>
+
+<#macro "ask:title">
+${.node}
+
+#macro>
+
+<#macro "ask:body">
+ <#recurse .node>
+#macro>
+
+<#macro "ask:section">
+ <#list .node?children as kid>
+ <#if kid?node_name == "sectionTitle">
+ <#recurse kid>
+ <#else>
+ ${kid.@@markup}
+ #if>
+ #list>
+#macro>
+
+<#macro "ask:sectionTitle">
+#macro>
+
+<#macro @text>
+${.node?html}
+#macro>
+<#--
+<#macro content>
+ <#assign contentId="ECMC" + .node.@id[0]/>
+
+
+
+
+
+#macro>
+-->
+
+<#macro @element>
+#macro>
diff --git a/template/content/viewcontent.ftl b/template/content/viewcontent.ftl
new file mode 100644
index 0000000..1c36e45
--- /dev/null
+++ b/template/content/viewcontent.ftl
@@ -0,0 +1,136 @@
+<#--
+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.
+-->
+
+
+
+ <#-- Do this so that we don't have to find the content twice (again in renderSubContent) -->
+ <#assign subContentId=requestParameters.contentId!/>
+ <#assign nodeTrailCsv=requestParameters.nodeTrailCsv!/>
+ <#-- <#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in viewcontent, nodeTrailCsv:" + nodeTrailCsv, "")/> -->
+ <#if ancestorList?has_content && (0 < ancestorList?size) >
+ <#assign lastContent=ancestorList?last />
+ <#assign firstContent=ancestorList[0] />
+ #if>
+ <#if firstContent?has_content>
+ <#assign siteId = firstContent.contentId/>
+ #if>
+ <#if siteId?has_content>
+ <@renderAncestryPath trail=ancestorList?default([]) endIndexOffset=1 siteId=siteId/>
+ #if>
+
+ <#if lastContent?has_content>
+
[${lastContent.contentId}] ${lastContent.description!}
+ #if>
+ <#--
+ <#assign globalNodeTrail=[]/>
+ <#assign firstContentId=""/>
+ <#if nodeTrailCsv?has_content>
+ <#assign globalNodeTrail=Static["org.ofbiz.base.util.StringUtil"].split(nodeTrailCsv, ",") />
+ <#if 0 < globalNodeTrail?size>
+ <#assign firstContentId=globalNodeTrail[0]?string/>
+ #if>
+ #if>
+ <#assign globalNodeTrail=requestParameters.globalNodeTrail?default([])/>
+ -->
+ <#if globalNodeTrail?has_content && (0 < globalNodeTrail?size) >
+ <#assign lastNode = globalNodeTrail?last/>
+ <#if lastNode?has_content>
+ <#assign subContent=lastNode.value/>
+ #if>
+ <#else>
+ <#assign subContent = delegator.findOne("Content", Static["org.ofbiz.base.util.UtilMisc"].toMap("contentId", subContentId), true)/>
+ #if>
+ <#assign dummy=Static["org.ofbiz.base.util.Debug"].logInfo("in viewcontent, subContent:" + subContent, "")/>
+ ${subContent.contentName!}
+
+
+
+
+
+
+ <@renderSubContentCache subContentId=subContentId />
+
+
+ <#--
+ <@wrapSubContentCache subContentId=subContentId wrapTemplateId="WRAP_VIEW" >
+ @wrapSubContentCache >
+ <@checkPermission mode="equals" entityOperation="_CREATE" targetOperation="HAS_USER_ROLE" >
+ Respond
+ @checkPermission>
+ -->
+
+
+
+ <#assign thisContentId = subContentId/>
+ <@loopSubContent contentId=thisContentId viewIndex=0 viewSize=9999 contentAssocTypeId="RELATED_CONTENT">
+ <#assign thisNodeTrailCsv = nodeTrailCsv />
+
+
+ ${content.contentName!}
+
+
+ @loopSubContent>
+
+
+
+
+<#--
+<@checkPermission mode="not-equals" subContentId=subContentId targetOperation="CONTENT_CREATE|CONTENT_RESPOND" contentPurposeList="RESPONSE" >
+ ${permissionErrorMsg!}
+@checkPermission>
+-->
+
+
+
+<#macro renderAncestryPath trail siteId startIndex=0 endIndexOffset=0 buttonTitle="Back to" searchOn="" >
+ <#local indent = "">
+ <#local csv = "">
+ <#local counter = 0>
+ <#local len = trail?size>
+
+ <#list trail as content>
+ <#if counter < (len - endIndexOffset) && startIndex <= counter >
+ <#if 0 < counter >
+ <#local csv = csv + ","/>
+ #if>
+ <#local csv = csv + content.contentId/>
+ <#if counter < len && startIndex <= counter >
+
+
+ ${indent}
+ <#if content.contentTypeId == "WEB_SITE_PUB_PT" >
+ ${uiLabelMap.CommonBackTo} ${content.contentName!}
+ <#else>
+ ${uiLabelMap.CommonBackTo} ${content.contentName!}
+ #if>
+ <#local indent = indent + " ">
+ [${content.contentId!}]
+ <#if searchOn?has_content && searchOn?lower_case == "true">
+
+ ${uiLabelMap.CommonSearch}
+ #if>
+ #if>
+
+
+ #if>
+ <#local counter = counter + 1>
+ <#if 20 < counter > <#break/>#if>
+ #list>
+
+#macro>
diff --git a/template/customer/AccountCMPostalAddress.ftl b/template/customer/AccountCMPostalAddress.ftl
new file mode 100644
index 0000000..e4b4a15
--- /dev/null
+++ b/template/customer/AccountCMPostalAddress.ftl
@@ -0,0 +1,19 @@
+<#assign postalAddress = partyContactMechValueMap.postalAddress! />
+ <#if postalAddress??>
+ <#if postalAddress.toName?has_content>${uiLabelMap.CommonTo}: ${postalAddress.toName} #if>
+ <#if postalAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${postalAddress.attnName} #if>
+ ${postalAddress.address1}
+ <#if postalAddress.address2?has_content>${postalAddress.address2} #if>
+ ${postalAddress.city}<#if postalAddress.stateProvinceGeoId?has_content>, ${postalAddress.stateProvinceGeoId}#if> ${postalAddress.postalCode!}
+ <#if postalAddress.countryGeoId?has_content> ${postalAddress.countryGeoId}#if>
+ <#if (!postalAddress.countryGeoId?has_content || postalAddress.countryGeoId! = "USA")>
+ <#assign addr1 = postalAddress.address1! />
+ <#if (addr1.indexOf(" ") > 0)>
+ <#assign addressNum = addr1.substring(0, addr1.indexOf(" ")) />
+ <#assign addressOther = addr1.substring(addr1.indexOf(" ")+1) />
+ (${uiLabelMap.CommonLookupWhitepages})
+ #if>
+ #if>
+ <#else>
+ ${uiLabelMap.PartyPostalInformationNotFound}.
+ #if>
\ No newline at end of file
diff --git a/template/customer/AccountCMTelecom.ftl b/template/customer/AccountCMTelecom.ftl
new file mode 100644
index 0000000..c67ec0c
--- /dev/null
+++ b/template/customer/AccountCMTelecom.ftl
@@ -0,0 +1,10 @@
+<#assign telecomNumber = partyContactMechValueMap.telecomNumber!>
+
+ <#if telecomNumber??>
+ ${telecomNumber.countryCode!}
+ <#if telecomNumber.areaCode?has_content>${telecomNumber.areaCode}-#if>${telecomNumber.contactNumber!}
+ <#if partyContactMech.extension?has_content>ext ${partyContactMech.extension}#if>
+ <#else>
+ ${uiLabelMap.PartyPhoneNumberInfoNotFound}.
+ #if>
+
\ No newline at end of file
diff --git a/template/customer/AccountCMWebAddress.ftl b/template/customer/AccountCMWebAddress.ftl
new file mode 100644
index 0000000..a0385a5
--- /dev/null
+++ b/template/customer/AccountCMWebAddress.ftl
@@ -0,0 +1,6 @@
+
+ ${contactMech.infoString}
+ <#assign openAddress = contactMech.infoString! />
+ <#if !openAddress.startsWith("http") && !openAddress.startsWith("HTTP")><#assign openAddress = "http://" + openAddress />#if>
+
(${uiLabelMap.CommonOpenNewWindow})
+
\ No newline at end of file
diff --git a/template/customer/AccountCards.ftl b/template/customer/AccountCards.ftl
new file mode 100644
index 0000000..9309f13
--- /dev/null
+++ b/template/customer/AccountCards.ftl
@@ -0,0 +1,119 @@
+
+
+
+
${uiLabelMap.AccountingPaymentMethodInformation}
+
+
+
+
+
+
+ <#if paymentMethodValueMaps?has_content>
+
+ <#list paymentMethodValueMaps as paymentMethodValueMap>
+ <#assign paymentMethod = paymentMethodValueMap.paymentMethod! />
+ <#assign creditCard = paymentMethodValueMap.creditCard! />
+ <#assign giftCard = paymentMethodValueMap.giftCard! />
+ <#assign eftAccount = paymentMethodValueMap.eftAccount! />
+
+ <#if paymentMethod.paymentMethodTypeId! == "CREDIT_CARD">
+
+
+ ${uiLabelMap.AccountingCreditCard}:
+ <#if creditCard.companyNameOnCard?has_content>${creditCard.companyNameOnCard} #if>
+ <#if creditCard.titleOnCard?has_content>${creditCard.titleOnCard} #if>
+ ${creditCard.firstNameOnCard}
+ <#if creditCard.middleNameOnCard?has_content>${creditCard.middleNameOnCard} #if>
+ ${creditCard.lastNameOnCard}
+ <#if creditCard.suffixOnCard?has_content> ${creditCard.suffixOnCard}#if>
+ ${Static["org.ofbiz.party.contact.ContactHelper"].formatCreditCard(creditCard)}
+ <#if paymentMethod.description?has_content>(${paymentMethod.description})#if>
+ <#if paymentMethod.fromDate?has_content>(${uiLabelMap.CommonUpdated}: ${paymentMethod.fromDate.toString()})#if>
+ <#if paymentMethod.thruDate??>(${uiLabelMap.CommonDelete}: ${paymentMethod.thruDate.toString()})#if>
+
+
+
+
+
+ ${uiLabelMap.CommonUpdate}
+
+
+ <#elseif paymentMethod.paymentMethodTypeId! == "GIFT_CARD">
+ <#if giftCard?has_content && giftCard.cardNumber?has_content>
+ <#assign giftCardNumber = "" />
+ <#assign pcardNumber = giftCard.cardNumber />
+ <#if pcardNumber?has_content>
+ <#assign psize = pcardNumber?length - 4 />
+ <#if (0 < psize)>
+ <#list 0 .. psize-1 as foo>
+ <#assign giftCardNumber = giftCardNumber + "*" />
+ #list>
+ <#assign giftCardNumber = giftCardNumber + pcardNumber[psize .. psize + 3] />
+ <#else>
+ <#assign giftCardNumber = pcardNumber />
+ #if>
+ #if>
+ #if>
+
+
+
+ ${uiLabelMap.AccountingGiftCard}: ${giftCardNumber}
+ <#if paymentMethod.description?has_content>(${paymentMethod.description})#if>
+ <#if paymentMethod.fromDate?has_content>(${uiLabelMap.CommonUpdated}: ${paymentMethod.fromDate.toString()})#if>
+ <#if paymentMethod.thruDate??>(${uiLabelMap.CommonDelete}: ${paymentMethod.thruDate.toString()})#if>
+
+
+
+
+
+ ${uiLabelMap.CommonUpdate}
+
+ <#elseif paymentMethod.paymentMethodTypeId! == "EFT_ACCOUNT">
+
+
+ ${uiLabelMap.AccountingEFTAccount}: <#if eftAccount.accountNumber?has_content>${eftAccount.accountNumber}#if>
+ ${eftAccount.nameOnAccount!}
+ <#if eftAccount.bankName?has_content> ${uiLabelMap.AccountingBank}: ${eftAccount.bankName}#if>
+ <#if paymentMethod.description?has_content>(${paymentMethod.description})#if>
+ <#if paymentMethod.fromDate?has_content> ${uiLabelMap.CommonUpdated}: ${paymentMethod.fromDate.toString()}#if>
+ <#if paymentMethod.thruDate??> ${uiLabelMap.CommonDelete}: ${paymentMethod.thruDate.toString()}#if>
+
+
+
+
+
+ ${uiLabelMap.CommonUpdate}
+
+ #if>
+
+
+ ${uiLabelMap.CommonExpire}
+
+
+ <#if (profiledefs.defaultPayMeth)?default("") == paymentMethod.paymentMethodId>
+ ${uiLabelMap.EcommerceIsDefault}
+ <#else>
+
+
+
+
+
+
+ #if>
+
+
+ #list>
+
+ <#else>
+ ${uiLabelMap.AccountingNoPaymentMethodInformation}.
+ #if>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/AccountContactList.ftl b/template/customer/AccountContactList.ftl
new file mode 100644
index 0000000..a081da3
--- /dev/null
+++ b/template/customer/AccountContactList.ftl
@@ -0,0 +1,96 @@
+
+
${uiLabelMap.PartyContactLists}
+
+
+
+
+
+
+
+ ${uiLabelMap.EcommerceNewListSubscription}:
+
+ <#list publicContactLists as publicContactList>
+ <#-- <#assign publicContactListType = publicContactList.getRelatedOne("ContactListType", true)> -->
+ <#assign publicContactMechType = publicContactList.getRelatedOne("ContactMechType", true)! />
+ ${publicContactList.contactListName!} <#-- ${publicContactListType.get("description",locale)} --> <#if publicContactMechType?has_content>[${publicContactMechType.get("description",locale)}]#if>
+ #list>
+
+
+ <#-- -->
+ <#list partyAndContactMechList as partyAndContactMech>
+ <#if partyAndContactMech.infoString?has_content>${partyAndContactMech.infoString}<#elseif partyAndContactMech.tnContactNumber?has_content>${partyAndContactMech.tnCountryCode!}-${partyAndContactMech.tnAreaCode!}-${partyAndContactMech.tnContactNumber}<#elseif partyAndContactMech.paAddress1?has_content>${partyAndContactMech.paAddress1}, ${partyAndContactMech.paAddress2!}, ${partyAndContactMech.paCity!}, ${partyAndContactMech.paStateProvinceGeoId!}, ${partyAndContactMech.paPostalCode!}, ${partyAndContactMech.paPostalCodeExt!} ${partyAndContactMech.paCountryGeoId!}#if>
+ #list>
+
+
+
+
+
+
${uiLabelMap.EcommerceListNote}
+
+
\ No newline at end of file
diff --git a/template/customer/AccountContactMechs.ftl b/template/customer/AccountContactMechs.ftl
new file mode 100644
index 0000000..debbe5a
--- /dev/null
+++ b/template/customer/AccountContactMechs.ftl
@@ -0,0 +1,91 @@
+
+
+
${uiLabelMap.PartyContactInformation}
+
+
+
+ <#if partyContactMechValueMaps?has_content>
+
+
+ ${uiLabelMap.PartyContactType}
+
+ ${uiLabelMap.CommonInformation}
+ ${uiLabelMap.CommonInformation}
+ ${uiLabelMap.PartySolicitingOk}?
+
+
+
+ <#list partyContactMechValueMaps as partyContactMechValueMap>
+ <#assign contactMech = partyContactMechValueMap.contactMech! />
+ <#assign contactMechType = partyContactMechValueMap.contactMechType! />
+ <#assign partyContactMech = partyContactMechValueMap.partyContactMech! />
+
+
+
+ ${contactMechType.get("description",locale)}
+
+
+
+ <#if contactMech.contactMechTypeId! = "POSTAL_ADDRESS">
+ <#include "AccountCMPostalAddress.ftl" />
+ <#elseif contactMech.contactMechTypeId! = "TELECOM_NUMBER">
+ <#include "AccountCMTelecom.ftl" />
+ <#elseif contactMech.contactMechTypeId! = "EMAIL_ADDRESS">
+ ${contactMech.infoString}
+ <#elseif contactMech.contactMechTypeId! = "WEB_ADDRESS">
+ <#include "AccountCMWebAddress.ftl" />
+ <#else>
+ ${contactMech.infoString!}
+ #if>
+ (${uiLabelMap.CommonUpdated}: ${partyContactMech.fromDate.toString()})
+ <#if partyContactMech.thruDate??>${uiLabelMap.CommonDelete}: ${partyContactMech.thruDate.toString()}
#if>
+
+
+ <#list partyContactMechValueMap.partyContactMechPurposes! as partyContactMechPurpose>
+ <#assign contactMechPurposeType = partyContactMechPurpose.getRelatedOne("ContactMechPurposeType", true) />
+
+ <#if contactMechPurposeType??>
+ ${contactMechPurposeType.get("description",locale)}
+ <#if contactMechPurposeType.contactMechPurposeTypeId == "SHIPPING_LOCATION" && (profiledefs.defaultShipAddr)?default("") == contactMech.contactMechId>
+ ${uiLabelMap.EcommerceIsDefault}
+ <#elseif contactMechPurposeType.contactMechPurposeTypeId == "SHIPPING_LOCATION">
+
+
+
+
+
+
+ #if>
+ <#else>
+ ${uiLabelMap.PartyPurposeTypeNotFound}: "${partyContactMechPurpose.contactMechPurposeTypeId}"
+ #if>
+ <#if partyContactMechPurpose.thruDate??>(${uiLabelMap.CommonExpire}:${partyContactMechPurpose.thruDate.toString()})#if>
+
+ #list>
+
+ (${partyContactMech.allowSolicitation!})
+
+
+ ${uiLabelMap.CommonUpdate}
+
+
+
+
+
+
+
+
+
+
+ #list>
+
+ <#else>
+
${uiLabelMap.PartyNoContactInformation}.
+ #if>
+
+
\ No newline at end of file
diff --git a/template/customer/AccountDefaultShipMethod.ftl b/template/customer/AccountDefaultShipMethod.ftl
new file mode 100644
index 0000000..c5bf4af
--- /dev/null
+++ b/template/customer/AccountDefaultShipMethod.ftl
@@ -0,0 +1,29 @@
+
+
+
+
+
+ <#if profiledefs?has_content && profiledefs.defaultShipAddr?has_content && carrierShipMethods?has_content>#if>
+
+
${uiLabelMap.EcommerceDefaultShipmentMethod}
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/AccountFileMgt.ftl b/template/customer/AccountFileMgt.ftl
new file mode 100644
index 0000000..6835baa
--- /dev/null
+++ b/template/customer/AccountFileMgt.ftl
@@ -0,0 +1,61 @@
+
+
${uiLabelMap.EcommerceFileManager}
+
+
+ <#if partyContent?has_content>
+ <#list partyContent as contentRole>
+ <#assign content = contentRole.getRelatedOne("Content", false) />
+ <#assign contentType = content.getRelatedOne("ContentType", true) />
+ <#assign mimeType = content.getRelatedOne("MimeType", true)! />
+ <#assign status = content.getRelatedOne("StatusItem", true) />
+
+ ${content.contentId}
+ ${content.contentName!}
+ ${(contentType.get("description",locale))!}
+ ${(mimeType.description)!}
+ ${(status.get("description",locale))!}
+ ${contentRole.fromDate!}
+
+
+
+
+
+
+ ${uiLabelMap.CommonView}
+ ${uiLabelMap.CommonRemove}
+
+
+ #list>
+ <#else>
+ ${uiLabelMap.EcommerceNoFiles}
+ #if>
+
+
+
${uiLabelMap.EcommerceUploadNewFile}
+
+
+
\ No newline at end of file
diff --git a/template/customer/AccountLoyalityPoints.ftl b/template/customer/AccountLoyalityPoints.ftl
new file mode 100644
index 0000000..044f993
--- /dev/null
+++ b/template/customer/AccountLoyalityPoints.ftl
@@ -0,0 +1,12 @@
+
+
+
+
${uiLabelMap.EcommerceLoyaltyPoints}
+
+
+ <#if monthsToInclude?? && totalSubRemainingAmount?? && totalOrders??>
+ ${uiLabelMap.EcommerceYouHave} ${totalSubRemainingAmount} ${uiLabelMap.EcommercePointsFrom} ${totalOrders} ${uiLabelMap.EcommerceOrderInLast} ${monthsToInclude} ${uiLabelMap.EcommerceMonths}
+ #if>
+
+
+
diff --git a/template/customer/AccountMessages.ftl b/template/customer/AccountMessages.ftl
new file mode 100644
index 0000000..f19ac87
--- /dev/null
+++ b/template/customer/AccountMessages.ftl
@@ -0,0 +1,9 @@
+
+
+
+
${uiLabelMap.CommonMessages}
+
+
+ ${screens.render("component://${activeApp}/widget/CustomerScreens.xml#messagelist-include")}
+
+
diff --git a/template/customer/AccountName.ftl b/template/customer/AccountName.ftl
new file mode 100644
index 0000000..6a4505d
--- /dev/null
+++ b/template/customer/AccountName.ftl
@@ -0,0 +1,72 @@
+
+
+
+
${uiLabelMap.PartyPersonalInformation}
+
+
+
+ <#if person??>
+
+
+ ${uiLabelMap.CommonId} ${partyId!}
+
+
+ ${uiLabelMap.PartyFirstName} ${person.firstName!}
+
+
+ ${uiLabelMap.PartyMiddleName} ${person.middleName!}
+
+
+ ${uiLabelMap.PartyLastName}
+ ${person.lastName!}
+
+ ${person.personalTitle!}
+ ${person.suffix!}
+
+
+ <#if person.nickname?has_content>
+ ${uiLabelMap.PartyNickName} ${person.nickname}
+ #if>
+ <#if person.gender?has_content>
+ ${uiLabelMap.PartyGender} ${person.gender}
+ #if>
+ <#if person.birthDate??>
+ ${uiLabelMap.PartyBirthDate} ${person.birthDate.toString()}
+ #if>
+ <#if person.height??>
+ ${uiLabelMap.PartyHeight} ${person.height}
+ #if>
+ <#if person.weight??>
+ ${uiLabelMap.PartyWeight} ${person.weight}
+ #if>
+ <#if person.mothersMaidenName?has_content>
+ ${uiLabelMap.PartyMaidenName} ${person.mothersMaidenName}
+ #if>
+ <#if person.maritalStatus?has_content>
+ ${uiLabelMap.PartyMaritalStatus} ${person.maritalStatus}
+ #if>
+ <#if person.socialSecurityNumber?has_content>
+ ${uiLabelMap.PartySocialSecurityNumber} ${person.socialSecurityNumber}
+ #if>
+ <#if person.passportNumber?has_content>
+ ${uiLabelMap.PartyPassportNumber} ${person.passportNumber}
+ #if>
+ <#if person.passportExpireDate??>
+ ${uiLabelMap.PartyPassportExpireDate} ${person.passportExpireDate.toString()}
+ #if>
+ <#if person.totalYearsWorkExperience??>
+ ${uiLabelMap.PartyYearsWork} ${person.totalYearsWorkExperience}
+ #if>
+ <#if person.comments?has_content>
+ ${uiLabelMap.CommonComments} ${person.comments}
+ #if>
+
+ <#else>
+
${uiLabelMap.PartyPersonalInformationNotFound}
+ #if>
+
+
diff --git a/template/customer/AccountSurveys.ftl b/template/customer/AccountSurveys.ftl
new file mode 100644
index 0000000..5a42cba
--- /dev/null
+++ b/template/customer/AccountSurveys.ftl
@@ -0,0 +1,33 @@
+
+
+
+
${uiLabelMap.CommonSurveys}
+
+
+ <#if surveys?has_content>
+
+ <#list surveys as surveyAppl>
+ <#assign survey = surveyAppl.getRelatedOne("Survey", false) />
+
+
+ ${survey.surveyName!} - ${survey.description!}
+
+
+ <#assign responses = Static["org.ofbiz.product.store.ProductStoreWorker"].checkSurveyResponse(request, survey.surveyId)?default(0)>
+ <#if (responses < 1)>${uiLabelMap.EcommerceNotCompleted}<#else>${uiLabelMap.EcommerceCompleted}#if>
+
+ <#if (responses == 0 || survey.allowMultiple?default("N") == "Y")>
+ <#assign surveyLabel = uiLabelMap.EcommerceTakeSurvey />
+ <#if (responses > 0 && survey.allowUpdate?default("N") == "Y")>
+ <#assign surveyLabel = uiLabelMap.EcommerceUpdateSurvey />
+ #if>
+ ${surveyLabel}
+ <#else>
+
+ #if>
+
+ #list>
+
+ #if>
+
+
\ No newline at end of file
diff --git a/template/customer/AccountTax.ftl b/template/customer/AccountTax.ftl
new file mode 100644
index 0000000..ed73c37
--- /dev/null
+++ b/template/customer/AccountTax.ftl
@@ -0,0 +1,12 @@
+
+
${uiLabelMap.PartyTaxIdentification}
+
+
+
+
+ ${screens.render("component://order/widget/ordermgr/OrderEntryOrderScreens.xml#customertaxinfo")}
+
+
+
+
+
diff --git a/template/customer/AccountTelco.ftl b/template/customer/AccountTelco.ftl
new file mode 100644
index 0000000..e69de29
diff --git a/template/customer/AccountUserName.ftl b/template/customer/AccountUserName.ftl
new file mode 100644
index 0000000..6196065
--- /dev/null
+++ b/template/customer/AccountUserName.ftl
@@ -0,0 +1,15 @@
+
+
+
+
+
${uiLabelMap.CommonUsername} & ${uiLabelMap.CommonPassword}
+
+
+
+ ${uiLabelMap.CommonUsername}
+
+ ${userLogin.userLoginId}
+
+
+
+
diff --git a/template/customer/AnonContactus.ftl b/template/customer/AnonContactus.ftl
new file mode 100644
index 0000000..fa30cbe
--- /dev/null
+++ b/template/customer/AnonContactus.ftl
@@ -0,0 +1,80 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.CommonContactUs}
+
+
+
+
diff --git a/template/customer/FinAccountDetail.ftl b/template/customer/FinAccountDetail.ftl
new file mode 100644
index 0000000..73a1b5f
--- /dev/null
+++ b/template/customer/FinAccountDetail.ftl
@@ -0,0 +1,106 @@
+<#--
+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.
+-->
+
+
+
+ Account Number:
+ ${ownedFinAccount.finAccountId}
+
+
+ Currency:
+ ${(accountCurrencyUom.description)!} [${ownedFinAccount.currencyUomId!}]
+
+
+ Date Opened:
+ ${ownedFinAccount.fromDate!}
+
+
+ Status:
+ ${(finAccountStatusItem.description)?default("Active")}
+
+ <#if ownedFinAccount.replenishLevel??>
+
+ Replenish Level:
+ ${ownedFinAccount.replenishLevel}
+
+ #if>
+
+
+
+
+ Transaction ${uiLabelMap.CommonDate}
+ ID
+ Order Item
+ Payment
+ Type
+ Amount
+
+ <#list ownedFinAccountTransList as ownedFinAccountTrans>
+ <#assign finAccountTransType = ownedFinAccountTrans.getRelatedOne("FinAccountTransType", false)/>
+ <#assign displayAmount = ownedFinAccountTrans.amount/>
+ <#if ownedFinAccountTrans.finAccountTransTypeId == "WITHDRAWAL">
+ <#assign displayAmount = -displayAmount/>
+ #if>
+
+ ${ownedFinAccountTrans.transactionDate!}
+ ${ownedFinAccountTrans.finAccountTransId}
+ <#if ownedFinAccountTrans.orderId?has_content>${ownedFinAccountTrans.orderId!}:${ownedFinAccountTrans.orderItemSeqId!}<#else> #if>
+ <#if ownedFinAccountTrans.paymentId?has_content>${ownedFinAccountTrans.paymentId!}<#else> #if>
+ ${finAccountTransType.description?default(ownedFinAccountTrans.finAccountTransTypeId)!}
+ <@ofbizCurrency amount=displayAmount isoCode=ownedFinAccount.currencyUomId/>
+
+ #list>
+
+ Actual Balance
+
+
+ <@ofbizCurrency amount=ownedFinAccount.actualBalance isoCode=ownedFinAccount.currencyUomId/>
+
+
+
+<#if ownedFinAccountAuthList?has_content>
+
+
+ Authorization ${uiLabelMap.CommonDate}
+ ID
+ Expires
+ Amount
+
+
+ Actual Balance
+
+
+ <@ofbizCurrency amount=ownedFinAccount.actualBalance isoCode=ownedFinAccount.currencyUomId/>
+
+ <#list ownedFinAccountAuthList as ownedFinAccountAuth>
+
+ ${ownedFinAccountAuth.authorizationDate!}
+ ${ownedFinAccountAuth.finAccountAuthId}
+ ${ownedFinAccountAuth.thruDate!}
+ <@ofbizCurrency amount=-ownedFinAccountAuth.amount isoCode=ownedFinAccount.currencyUomId/>
+
+ #list>
+
+ Available Balance
+
+
+ <@ofbizCurrency amount=ownedFinAccount.availableBalance isoCode=ownedFinAccount.currencyUomId/>
+
+
+#if>
diff --git a/template/customer/MyAccountMenu.ftl b/template/customer/MyAccountMenu.ftl
new file mode 100644
index 0000000..3c5c69b
--- /dev/null
+++ b/template/customer/MyAccountMenu.ftl
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/template/customer/NewCustomerAccount.ftl b/template/customer/NewCustomerAccount.ftl
new file mode 100644
index 0000000..297adfc
--- /dev/null
+++ b/template/customer/NewCustomerAccount.ftl
@@ -0,0 +1,58 @@
+
+
+ <#if getUsername>${uiLabelMap.CommonUsername}#if>
+ <#if getUsername>
+ <@fieldErrors fieldName="USERNAME"/>
+
+
+ ${uiLabelMap.CommonUsername}*
+
+
+ <#if requestParameters.preferredUsername?has_content>
+
+
+ <#else>
+
+ #if>
+
+ #if>
+
+
+
+ ${uiLabelMap.CommonPassword}
+ <#if createAllowPassword>
+
+
+ ${uiLabelMap.CommonPassword}*
+
+
+ <@fieldErrors fieldName="PASSWORD"/>
+
+
+
+
+
+ ${uiLabelMap.PartyRepeatPassword}*
+
+
+ <@fieldErrors fieldName="CONFIRM_PASSWORD"/>
+
+
+
+
+
+ ${uiLabelMap.PartyPasswordHint}
+
+
+ <@fieldErrors fieldName="PASSWORD_HINT"/>
+
+
+
+ <#else/>
+
+
+ ${uiLabelMap.PartyReceivePasswordByEmail}.
+
+
+ #if>
+
\ No newline at end of file
diff --git a/template/customer/NewCustomerAddress.ftl b/template/customer/NewCustomerAddress.ftl
new file mode 100644
index 0000000..aabc87d
--- /dev/null
+++ b/template/customer/NewCustomerAddress.ftl
@@ -0,0 +1,79 @@
+
+ ${uiLabelMap.PartyShippingAddress}
+
+
+ ${uiLabelMap.PartyAddressLine1}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_ADDRESS1"/>
+
+
+
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+ <@fieldErrors fieldName="CUSTOMER_ADDRESS2"/>
+
+
+
+
+
+ ${uiLabelMap.PartyCity}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_CITY"/>
+
+
+
+
+
+ ${uiLabelMap.PartyZipCode}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_POSTAL_CODE"/>
+
+
+
+
+
+ ${uiLabelMap.CommonCountry}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_COUNTRY"/>
+
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+ <#assign defaultCountryGeoId = Static["org.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue("general", "country.geo.id.default", delegator)>
+
+ <#assign countryGeo = delegator.findOne("Geo",Static["org.ofbiz.base.util.UtilMisc"].toMap("geoId",defaultCountryGeoId), false)>
+ ${countryGeo.get("geoName",locale)}
+
+
+
+
+
+
+ ${uiLabelMap.PartyState}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_STATE"/>
+
+
+
+
+
+ ${uiLabelMap.PartyAllowAddressSolicitation}
+
+
+ <@fieldErrors fieldName="CUSTOMER_ADDRESS_ALLOW_SOL"/>
+
+ <#if (((requestParameters.CUSTOMER_ADDRESS_ALLOW_SOL)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((requestParameters.CUSTOMER_ADDRESS_ALLOW_SOL)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/NewCustomerEmail.ftl b/template/customer/NewCustomerEmail.ftl
new file mode 100644
index 0000000..bd5358e
--- /dev/null
+++ b/template/customer/NewCustomerEmail.ftl
@@ -0,0 +1,27 @@
+
+
+ ${uiLabelMap.PartyEmailAddress}
+
+
+ ${uiLabelMap.PartyEmailAddress}*
+
+
+ <@fieldErrors fieldName="CUSTOMER_EMAIL"/>
+
+
+
+
+
+ ${uiLabelMap.PartyAllowSolicitation}
+
+
+
+ <#if (((requestParameters.CUSTOMER_EMAIL_ALLOW_SOL)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((requestParameters.CUSTOMER_EMAIL_ALLOW_SOL)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/NewCustomerName.ftl b/template/customer/NewCustomerName.ftl
new file mode 100644
index 0000000..f2edb27
--- /dev/null
+++ b/template/customer/NewCustomerName.ftl
@@ -0,0 +1,41 @@
+
+ ${uiLabelMap.PartyFullName}
+
+
+ ${uiLabelMap.CommonTitle}
+
+
+ <@fieldErrors fieldName="USER_TITLE"/>
+
+ <#if requestParameters.USER_TITLE?has_content >
+ ${requestParameters.USER_TITLE}
+ --
+ <#else>
+ ${uiLabelMap.CommonSelectOne}
+ #if>
+ ${uiLabelMap.CommonTitleMr}
+ ${uiLabelMap.CommonTitleMrs}
+ ${uiLabelMap.CommonTitleMs}
+ ${uiLabelMap.CommonTitleDr}
+
+
+
+
+
+ ${uiLabelMap.PartyFirstName}*
+
+
+ <@fieldErrors fieldName="USER_FIRST_NAME"/>
+
+
+
+
+
+ ${uiLabelMap.PartyLastName}*
+
+
+ <@fieldErrors fieldName="USER_LAST_NAME"/>
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/NewCustomerTelco.ftl b/template/customer/NewCustomerTelco.ftl
new file mode 100644
index 0000000..f1aa985
--- /dev/null
+++ b/template/customer/NewCustomerTelco.ftl
@@ -0,0 +1,51 @@
+
+ ${uiLabelMap.PartyPhoneNumbers}
+
+
+ ${uiLabelMap.PartyHomePhone}
+
+
+ <@fieldErrors fieldName="CUSTOMER_HOME_CONTACT"/>
+
+
+
+
+
+ ${uiLabelMap.PartyAllowSolicitation}
+
+
+
+ <#if (((requestParameters.CUSTOMER_HOME_ALLOW_SOL)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((requestParameters.CUSTOMER_HOME_ALLOW_SOL)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
+
+
+ ${uiLabelMap.PartyMobilePhone}
+
+
+ <@fieldErrors fieldName="CUSTOMER_MOBILE_CONTACT"/>
+
+
+
+
+
+ ${uiLabelMap.PartyAllowSolicitation}
+
+
+
+ <#if (((requestParameters.CUSTOMER_MOBILE_ALLOW_SOL)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((requestParameters.CUSTOMER_MOBILE_ALLOW_SOL)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
+
diff --git a/template/customer/SerializedInventorySummary.ftl b/template/customer/SerializedInventorySummary.ftl
new file mode 100644
index 0000000..faf59d1
--- /dev/null
+++ b/template/customer/SerializedInventorySummary.ftl
@@ -0,0 +1,62 @@
+<#--
+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.
+-->
+
+
+
+ ${uiLabelMap.ProductSerializedInventorySummary}
+
+
+
+
+
+
+
+ <#list inventoryItemList as inventoryItem>
+ <#assign product = inventoryItem.getRelatedOne('Product', false)!>
+
+ ${inventoryItem.inventoryItemId}
+
+ <#if product?has_content>
+ <#if product.isVariant?default('N') == 'Y'>
+ <#assign product = Static['org.ofbiz.product.product.ProductWorker'].getParentProduct(product.productId, delegator)!>
+ #if>
+ <#if product?has_content>
+ <#assign productName = Static['org.ofbiz.product.product.ProductContentWrapper'].getProductContentAsText(product, 'PRODUCT_NAME', request, "html")!>
+ ${productName?default(product.productId)}
+ #if>
+ #if>
+
+ ${inventoryItem.serialNumber!}
+ ${inventoryItem.softIdentifier!}
+ ${inventoryItem.activationNumber!}
+ ${inventoryItem.activationValidThru!}
+
+ #list>
+
+
+
+
+
diff --git a/template/customer/SubscriptionSummary.ftl b/template/customer/SubscriptionSummary.ftl
new file mode 100644
index 0000000..37828cd
--- /dev/null
+++ b/template/customer/SubscriptionSummary.ftl
@@ -0,0 +1,61 @@
+<#--
+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.
+-->
+
+
+
+ ${uiLabelMap.ProductSubscriptions}
+
+
+
+
+
+
+
+
+ <#list subscriptionList as subscription>
+
+ ${subscription.subscriptionId}
+
+ <#assign subscriptionType = subscription.getRelatedOne('SubscriptionType', false)!>
+ ${(subscriptionType.description)?default(subscription.subscriptionTypeId?default('N/A'))}
+
+ ${subscription.description!}
+
+ <#assign product = subscription.getRelatedOne('Product', false)!>
+ <#if product?has_content>
+ <#assign productName = Static['org.ofbiz.product.product.ProductContentWrapper'].getProductContentAsText(product, 'PRODUCT_NAME', request, "html")!>
+ ${productName?default(product.productId)}
+ #if>
+
+ ${subscription.fromDate!}
+ ${subscription.thruDate!}
+
+ #list>
+
+
+
+
+
diff --git a/template/customer/changepassword.ftl b/template/customer/changepassword.ftl
new file mode 100644
index 0000000..7e4bac9
--- /dev/null
+++ b/template/customer/changepassword.ftl
@@ -0,0 +1,49 @@
+<#--
+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.
+-->
+
\ No newline at end of file
diff --git a/template/customer/customersurvey.ftl b/template/customer/customersurvey.ftl
new file mode 100644
index 0000000..9669541
--- /dev/null
+++ b/template/customer/customersurvey.ftl
@@ -0,0 +1,34 @@
+<#--
+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.
+-->
+
+
+
+
+ <#-- Render the survey -->
+ <#if surveyWrapper?has_content>
+
+ ${surveyWrapper.render()}
+
+ <#else>
+ ${uiLabelMap.OrderNothingToDoHere}
+ #if>
+
+
diff --git a/template/customer/digitalproductedit.ftl b/template/customer/digitalproductedit.ftl
new file mode 100644
index 0000000..ba4b261
--- /dev/null
+++ b/template/customer/digitalproductedit.ftl
@@ -0,0 +1,104 @@
+<#--
+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 productPrice = productPriceList[0]!/>
+
+
+
+
${uiLabelMap.PageTitleDigitalProductEdit}
+
+
+<#if !supplierProduct?has_content && parameters.productId?has_content>
+
${uiLabelMap.EcommerceMessage1} [${parameters.productId}] ${uiLabelMap.EcommerceMessage2}
+<#else>
+
+ <#if !supplierProduct??>
+
${uiLabelMap.EcommerceAddNewDigitalProduct}
+
+
+ <#else>
+ ${uiLabelMap.EcommerceUpdateDigitalProduct}
+
+
+
+
+
+ #if>
+ ${uiLabelMap.CommonBackToList}
+
+
+
+#if>
+
+
+
+<#if supplierProduct?has_content>
+
+
+
${uiLabelMap.OrderDigitalProductFiles}
+
+
+ <#list productContentAndInfoList as productContentAndInfo>
+
+ ${productContentAndInfo.contentName} (${uiLabelMap.CommonSince}: ${productContentAndInfo.fromDate})
+
${uiLabelMap.CommonRemove}
+
+ #list>
+
+
+
${uiLabelMap.EcommerceDigitalAddFromMyFiles}
+
+
+
+
+
+
+
+ <#list ownerContentAndRoleList as ownerContentAndRole>
+ ${ownerContentAndRole.contentName}
+ #list>
+
+ ${uiLabelMap.CommonAdd}
+
+
+
${uiLabelMap.CommonBackToList}
+
+
+#if>
diff --git a/template/customer/digitalproductlist.ftl b/template/customer/digitalproductlist.ftl
new file mode 100644
index 0000000..b958c1f
--- /dev/null
+++ b/template/customer/digitalproductlist.ftl
@@ -0,0 +1,69 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.PageTitleDigitalProductList}
+
+
+
+
+
+
+ ${uiLabelMap.ProductProductName}
+
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+
+ <#list supplierProductList as supplierProduct>
+ <#assign product = supplierProduct.getRelatedOne("Product", true)/>
+
+
+
+ ${(product.productName)!}
+
+
+
+ ${(product.description)!}
+
+
+
+ Edit
+
+
+ #list>
+ <#if !supplierProductList?has_content>
+ ${uiLabelMap.EcommerceNoDigitalProductsFound}
+ #if>
+
+
+
+
+
+
+
${uiLabelMap.EcommerceDigitalProductPurchaseHistoryCommission}
+
+
+
diff --git a/template/customer/editcontactmech.ftl b/template/customer/editcontactmech.ftl
new file mode 100644
index 0000000..fa89967
--- /dev/null
+++ b/template/customer/editcontactmech.ftl
@@ -0,0 +1,249 @@
+<#--
+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 canNotView>
+ ${uiLabelMap.PartyContactInfoNotBelongToYou}.
+ ${uiLabelMap.CommonBack}
+<#else>
+ <#if !contactMech??>
+ <#-- When creating a new contact mech, first select the type, then actually create -->
+ <#if !requestParameters.preContactMechTypeId?? && !preContactMechTypeId??>
+ ${uiLabelMap.PartyCreateNewContactInfo}
+
+
+
+
+ ${uiLabelMap.PartySelectContactType}:
+
+
+ <#list contactMechTypes as contactMechType>
+ ${contactMechType.get("description",locale)}
+ #list>
+ ${uiLabelMap.CommonCreate}
+
+
+
+
+
+ <#--
ERROR: Contact information with ID "${contactMechId}" not found! -->
+ #if>
+ #if>
+
+ <#if contactMechTypeId??>
+ <#if !contactMech??>
+ ${uiLabelMap.PartyCreateNewContactInfo}
+ ${uiLabelMap.CommonGoBack}
+ ${uiLabelMap.CommonSave}
+
+
+
+
+ <#if contactMechPurposeType??>
+
(${uiLabelMap.PartyNewContactHavePurpose} "${contactMechPurposeType.get("description",locale)!}")
+ #if>
+ <#if cmNewPurposeTypeId?has_content>
#if>
+ <#if preContactMechTypeId?has_content>
#if>
+ <#if paymentMethodId?has_content>
#if>
+ <#else>
+
${uiLabelMap.PartyEditContactInfo}
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+
+
+ ${uiLabelMap.PartyContactPurposes}
+
+
+
+ <#list partyContactMechPurposes! as partyContactMechPurpose>
+ <#assign contactMechPurposeType = partyContactMechPurpose.getRelatedOne("ContactMechPurposeType", true) />
+
+
+ <#if contactMechPurposeType??>
+ ${contactMechPurposeType.get("description",locale)}
+ <#else>
+ ${uiLabelMap.PartyPurposeTypeNotFound}: "${partyContactMechPurpose.contactMechPurposeTypeId}"
+ #if>
+ (${uiLabelMap.CommonSince}:${partyContactMechPurpose.fromDate.toString()})
+ <#if partyContactMechPurpose.thruDate??>(${uiLabelMap.CommonExpires}:${partyContactMechPurpose.thruDate.toString()})#if>
+
+
+
+
+
+
+
+ #list>
+ <#if purposeTypes?has_content>
+
+
+
+
+
+
+
+
+ <#list purposeTypes as contactMechPurposeType>
+ ${contactMechPurposeType.get("description",locale)}
+ #list>
+
+
+
+
+ ${uiLabelMap.PartyAddPurpose}
+
+ #if>
+
+
+
+
+
+
+
+ #if>
+
+ <#if contactMechTypeId = "POSTAL_ADDRESS">
+
+ ${uiLabelMap.PartyToName}
+
+
+
+
+
+
+ ${uiLabelMap.PartyAttentionName}
+
+
+
+
+
+
+ ${uiLabelMap.PartyAddressLine1}
+
+
+
+ *
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+
+
+
+
+ ${uiLabelMap.PartyCity}
+
+
+
+ *
+
+
+ ${uiLabelMap.PartyState}
+
+
+
+
+
+
+
+ ${uiLabelMap.PartyZipCode}
+
+
+
+ *
+
+
+ ${uiLabelMap.CommonCountry}
+
+
+
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+ <#if (postalAddress??) && (postalAddress.countryGeoId??)>
+ <#assign defaultCountryGeoId = postalAddress.countryGeoId>
+ <#else>
+ <#assign defaultCountryGeoId = Static["org.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue("general", "country.geo.id.default", delegator)>
+ #if>
+
+ <#assign countryGeo = delegator.findOne("Geo",Static["org.ofbiz.base.util.UtilMisc"].toMap("geoId",defaultCountryGeoId), false)>
+ ${countryGeo.get("geoName",locale)}
+
+
+
+
+ <#elseif contactMechTypeId = "TELECOM_NUMBER">
+
+ ${uiLabelMap.PartyPhoneNumber}
+
+
+
+ -
+ -
+ ${uiLabelMap.PartyExtension}
+
+
+
+
+
+ [${uiLabelMap.CommonCountryCode}] [${uiLabelMap.PartyAreaCode}] [${uiLabelMap.PartyContactNumber}] [${uiLabelMap.PartyExtension}]
+
+ <#elseif contactMechTypeId = "EMAIL_ADDRESS">
+
+ ${uiLabelMap.PartyEmailAddress}
+
+
+
+ *
+
+ <#else>
+
+ ${contactMechType.get("description",locale)!}
+
+
+
+ *
+
+ #if>
+
+ ${uiLabelMap.PartyAllowSolicitation}?
+
+
+
+ <#if (((partyContactMechData.allowSolicitation)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((partyContactMechData.allowSolicitation)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
+
+
+
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+ <#else>
+
${uiLabelMap.CommonGoBack}
+ #if>
+#if>
diff --git a/template/customer/editcreditcard.ftl b/template/customer/editcreditcard.ftl
new file mode 100644
index 0000000..1265eef
--- /dev/null
+++ b/template/customer/editcreditcard.ftl
@@ -0,0 +1,142 @@
+<#--
+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 canNotView>
+
${uiLabelMap.AccountingCardInfoNotBelongToYou}.
+
${uiLabelMap.CommonGoBack}
+<#else>
+ <#if !creditCard??>
+
${uiLabelMap.AccountingAddNewCreditCard}
+
+
+ <#else>
+
${uiLabelMap.AccountingEditCreditCard}
+
+
+
+ #if>
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+
+
+ ${screens.render("component://accounting/widget/CommonScreens.xml#creditCardFields")}
+
+ ${uiLabelMap.PartyBillingAddress}
+
+
+ <#-- Removed because is confusing, can add but would have to come back here with all data populated as before...
+
+ [Create New Address]
+ -->
+
+ <#assign hasCurrent = false />
+ <#if curPostalAddress?has_content>
+ <#assign hasCurrent = true />
+
+
+
+
+
+ ${uiLabelMap.PartyUseCurrentAddress}:
+ <#list curPartyContactMechPurposes as curPartyContactMechPurpose>
+ <#assign curContactMechPurposeType = curPartyContactMechPurpose.getRelatedOne("ContactMechPurposeType", true) />
+
+ ${curContactMechPurposeType.get("description",locale)!}
+ <#if curPartyContactMechPurpose.thruDate??>
+ ((${uiLabelMap.CommonExpire}:${curPartyContactMechPurpose.thruDate.toString()})
+ #if>
+
+ #list>
+
+ <#if curPostalAddress.toName??>${uiLabelMap.CommonTo}: ${curPostalAddress.toName}
#if>
+ <#if curPostalAddress.attnName??>${uiLabelMap.PartyAddrAttnName}: ${curPostalAddress.attnName}
#if>
+ ${curPostalAddress.address1!}
+ <#if curPostalAddress.address2??>${curPostalAddress.address2}
#if>
+ ${curPostalAddress.city}<#if curPostalAddress.stateProvinceGeoId?has_content>, ${curPostalAddress.stateProvinceGeoId}#if> ${curPostalAddress.postalCode}
+ <#if curPostalAddress.countryGeoId??>
${curPostalAddress.countryGeoId}#if>
+
(${uiLabelMap.CommonUpdated}: ${(curPartyContactMech.fromDate.toString())!})
+ <#if curPartyContactMech.thruDate??>
${uiLabelMap.CommonDelete}: ${curPartyContactMech.thruDate.toString()}#if>
+
+
+
+ <#else>
+ <#--
+
+ ${uiLabelMap.PartyBillingAddressNotSelected}
+
+ -->
+ #if>
+ <#-- is confusing
+
+
+ ${uiLabelMap.EcommerceMessage3}
+
+
+ -->
+ <#list postalAddressInfos as postalAddressInfo>
+ <#assign contactMech = postalAddressInfo.contactMech />
+ <#assign partyContactMechPurposes = postalAddressInfo.partyContactMechPurposes />
+ <#assign postalAddress = postalAddressInfo.postalAddress />
+ <#assign partyContactMech = postalAddressInfo.partyContactMech />
+
+
+
+
+
+ <#list partyContactMechPurposes as partyContactMechPurpose>
+ <#assign contactMechPurposeType = partyContactMechPurpose.getRelatedOne("ContactMechPurposeType", true) />
+
+ ${contactMechPurposeType.get("description",locale)!}
+ <#if partyContactMechPurpose.thruDate??>(${uiLabelMap.CommonExpire}:${partyContactMechPurpose.thruDate})#if>
+
+ #list>
+
+ <#if postalAddress.toName??>${uiLabelMap.CommonTo}: ${postalAddress.toName} #if>
+ <#if postalAddress.attnName??>${uiLabelMap.PartyAddrAttnName}: ${postalAddress.attnName} #if>
+ ${postalAddress.address1!}
+ <#if postalAddress.address2??>${postalAddress.address2} #if>
+ ${postalAddress.city}<#if postalAddress.stateProvinceGeoId?has_content>, ${postalAddress.stateProvinceGeoId}#if> ${postalAddress.postalCode}
+ <#if postalAddress.countryGeoId??> ${postalAddress.countryGeoId}#if>
+
+ (${uiLabelMap.CommonUpdated}: ${(partyContactMech.fromDate.toString())!})
+ <#if partyContactMech.thruDate??>${uiLabelMap.CommonDelete}: ${partyContactMech.thruDate.toString()}
#if>
+
+
+ #list>
+ <#if !postalAddressInfos?has_content && !curContactMech??>
+ ${uiLabelMap.PartyNoContactInformation}.
+ #if>
+
+
+ checked="checked"#if> />
+
+
+ ${uiLabelMap.PartyCreateNewBillingAddress}.
+
+
+
+
+
+
+
+
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+#if>
+
diff --git a/template/customer/editeftaccount.ftl b/template/customer/editeftaccount.ftl
new file mode 100644
index 0000000..0b61bb5
--- /dev/null
+++ b/template/customer/editeftaccount.ftl
@@ -0,0 +1,183 @@
+<#--
+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 canNotView>
+
${uiLabelMap.AccountingEFTNotBelongToYou}.
+
${uiLabelMap.CommonGoBack}
+<#else>
+ <#if !eftAccount??>
+
${uiLabelMap.AccountingAddNewEftAccount}
+
+ <#else>
+ ${uiLabelMap.PageTitleEditEFTAccount}
+
+
+ #if>
+ ${uiLabelMap.CommonGoBack}
+ ${uiLabelMap.CommonSave}
+
+
+
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+#if>
+
diff --git a/template/customer/editgiftcard.ftl b/template/customer/editgiftcard.ftl
new file mode 100644
index 0000000..a9d4cac
--- /dev/null
+++ b/template/customer/editgiftcard.ftl
@@ -0,0 +1,113 @@
+<#--
+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 canNotView>
+
${uiLabelMap.AccountingCardInfoNotBelongToYou}.
+
[${uiLabelMap.CommonGoBack}]
+<#else>
+ <#if !giftCard??>
+
${uiLabelMap.AccountingAddNewGiftCard}
+
+ <#else>
+ ${uiLabelMap.AccountingEditGiftCard}
+
+
+ #if>
+ ${uiLabelMap.CommonGoBack}
+ ${uiLabelMap.CommonSave}
+
+
+
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
+#if>
diff --git a/template/customer/editperson.ftl b/template/customer/editperson.ftl
new file mode 100644
index 0000000..68f8540
--- /dev/null
+++ b/template/customer/editperson.ftl
@@ -0,0 +1,178 @@
+<#--
+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 person??>
+
${uiLabelMap.PartyEditPersonalInformation}
+
+<#else>
+ ${uiLabelMap.PartyAddNewPersonalInformation}
+
+#if>
+
+
+
${uiLabelMap.CommonGoBack}
+
${uiLabelMap.CommonSave}
\ No newline at end of file
diff --git a/template/customer/giftcardbalance.ftl b/template/customer/giftcardbalance.ftl
new file mode 100644
index 0000000..c1cf6ae
--- /dev/null
+++ b/template/customer/giftcardbalance.ftl
@@ -0,0 +1,65 @@
+<#--
+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.
+-->
+
+
${uiLabelMap.AccountingGiftCardBalance}
+
+
${uiLabelMap.AccountingEnterGiftCardNumber}
+
+
+
+
+
diff --git a/template/customer/giftcardlink.ftl b/template/customer/giftcardlink.ftl
new file mode 100644
index 0000000..85b895c
--- /dev/null
+++ b/template/customer/giftcardlink.ftl
@@ -0,0 +1,68 @@
+<#--
+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.
+-->
+
+
${uiLabelMap.AccountingGiftCardLink}
+
+
${uiLabelMap.AccountingEnterGiftCardLink}.
+
+
+
+
+ <#if userLogin?has_content>
+
+ #if>
+
+
+
diff --git a/template/customer/messagedetail.ftl b/template/customer/messagedetail.ftl
new file mode 100644
index 0000000..14a57d9
--- /dev/null
+++ b/template/customer/messagedetail.ftl
@@ -0,0 +1,66 @@
+<#--
+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 delegator = requestAttributes.delegator>
+<#if communicationEvent.partyIdFrom??>
+ <#assign fromName = Static["org.ofbiz.party.party.PartyHelper"].getPartyName(delegator, communicationEvent.partyIdFrom, true)>
+#if>
+<#if communicationEvent.partyIdTo??>
+ <#assign toName = Static["org.ofbiz.party.party.PartyHelper"].getPartyName(delegator, communicationEvent.partyIdTo, true)>
+#if>
+
+
+
+
+ <#if (communicationEvent.partyIdFrom! != (userLogin.partyId)!)>
+
+ #if>
+
+
+
${uiLabelMap.EcommerceReadMessage}
+
+
+
+
+
+ ${uiLabelMap.CommonFrom}:
+ ${fromName!}
+
+
+ ${uiLabelMap.CommonTo}:
+ ${toName!}
+
+
+ ${uiLabelMap.CommonDate}:
+ ${communicationEvent.entryDate}
+
+
+ ${uiLabelMap.EcommerceSubject}:
+ ${(communicationEvent.subject)?default("[${uiLabelMap.EcommerceNoSubject}]")}
+
+
+
+
+
+ ${StringUtil.wrapString(communicationEvent.content)?default("[${uiLabelMap.EcommerceEmptyBody}]")}
+
+
+
+
+
diff --git a/template/customer/messagelist.ftl b/template/customer/messagelist.ftl
new file mode 100644
index 0000000..0e38e76
--- /dev/null
+++ b/template/customer/messagelist.ftl
@@ -0,0 +1,85 @@
+<#--
+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.
+-->
+
+<#macro showMessage communicationEvent isSentMessage index>
+ <#if communicationEvent.partyIdFrom?has_content>
+ <#assign partyNameFrom = Static["org.ofbiz.party.party.PartyHelper"].getPartyName(delegator, communicationEvent.partyIdFrom, true)>
+ <#else/>
+ <#assign partyNameFrom = "${uiLabelMap.CommonNA}">
+ #if>
+ <#if communicationEvent.partyIdTo?has_content>
+ <#assign partyNameTo = Static["org.ofbiz.party.party.PartyHelper"].getPartyName(delegator, communicationEvent.partyIdTo, true)>
+ <#else/>
+ <#assign partyNameTo = "${uiLabelMap.CommonNA}">
+ #if>
+
+ ${partyNameFrom}
+ ${partyNameTo}
+ ${communicationEvent.subject?default("")}
+ ${communicationEvent.entryDate}
+
+
+
+
+ ${uiLabelMap.EcommerceRead}
+
+ <#if isSentMessage>
+
+
+
+ ${uiLabelMap.PartyReply}
+ #if>
+
+
+#macro>
+
+
+
+
+ <#if parameters.showSent! == "true">
+
+ <#else>
+
+ #if>
+
+
${uiLabelMap.CommonMessages}
+
+
+
+ <#if (!receivedCommunicationEvents?has_content && !sentCommunicationEvents?has_content)>
+ ${uiLabelMap.EcommerceNoMessages}.
+ <#else/>
+
+ ${uiLabelMap.CommonFrom}
+ ${uiLabelMap.CommonTo}
+ ${uiLabelMap.EcommerceSubject}
+ ${uiLabelMap.EcommerceSentDate}
+
+
+
+ <#list receivedCommunicationEvents! as receivedCommunicationEvent>
+ <@showMessage communicationEvent=receivedCommunicationEvent isSentMessage=false index=receivedCommunicationEvent_index/>
+ #list>
+ <#list sentCommunicationEvents! as sentCommunicationEvent>
+ <@showMessage communicationEvent=sentCommunicationEvent isSentMessage=true index=sentCommunicationEvent_index/>
+ #list>
+ #if>
+
+
+
diff --git a/template/customer/miniSignUpForContactList.ftl b/template/customer/miniSignUpForContactList.ftl
new file mode 100644
index 0000000..3b322e8
--- /dev/null
+++ b/template/customer/miniSignUpForContactList.ftl
@@ -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.
+-->
+
+<#-- A simple macro that builds the contact list -->
+<#macro contactList publicEmailContactLists>
+
+ <#list publicEmailContactLists as publicEmailContactList>
+ <#assign publicContactMechType = publicEmailContactList.contactList.getRelatedOne("ContactMechType", true)!>
+ ${publicEmailContactList.contactListType.description!} - ${publicEmailContactList.contactList.contactListName!}
+ #list>
+
+#macro>
+
+
+
+
diff --git a/template/customer/newcustomer.ftl b/template/customer/newcustomer.ftl
new file mode 100644
index 0000000..b0c79e1
--- /dev/null
+++ b/template/customer/newcustomer.ftl
@@ -0,0 +1,171 @@
+<#--
+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 getUsername>
+
+#if>
+
+<#------------------------------------------------------------------------------
+NOTE: all page headings should start with an h2 tag, not an H1 tag, as
+there should generally always only be one h1 tag on the page and that
+will generally always be reserved for the logo at the top of the page.
+------------------------------------------------------------------------------->
+
+
+
${uiLabelMap.PartyRequestNewAccount}
+
${uiLabelMap.PartyAlreadyHaveAccount}, ${uiLabelMap.CommonLoginHere}
+
+<#macro fieldErrors fieldName>
+ <#if errorMessageList?has_content>
+ <#assign fieldMessages = Static["org.ofbiz.base.util.MessageString"].getMessagesForField(fieldName, true, errorMessageList)>
+
+ <#list fieldMessages as errorMsg>
+ ${errorMsg}
+ #list>
+
+ #if>
+#macro>
+<#macro fieldErrorsMulti fieldName1 fieldName2 fieldName3 fieldName4>
+ <#if errorMessageList?has_content>
+ <#assign fieldMessages = Static["org.ofbiz.base.util.MessageString"].getMessagesForField(fieldName1, fieldName2, fieldName3, fieldName4, true, errorMessageList)>
+
+ <#list fieldMessages as errorMsg>
+ ${errorMsg}
+ #list>
+
+ #if>
+#macro>
+
+
${uiLabelMap.CommonFieldsMarkedAreRequired}
+
+
+
+
+
+ <#----------------------------------------------------------------------
+ If you need to include a brief explanation of the form, or certain
+ elements in the form (such as explaining asterisks denote REQUIRED),
+ then you should use a
tag with a class name of "desc"
+ ----------------------------------------------------------------------->
+
+ <#----------------------------------------------------------------------
+ There are two types of fieldsets, regular (full width) fielsets, and
+ column (half width) fieldsets. If you want to group two sets of inputs
+ side by side in two columns, give each fieldset a class name of "col"
+ ----------------------------------------------------------------------->
+
+
+
+ <#----------------------------------------------------------------------
+ Each input row should be enclosed in a
.
+ This will ensure than each input field clears the one
+ above it. Alternately, if you want several inputs to float next to
+ each other, you can enclose them in a table as illustrated below for
+ the phone numbers, or you can enclose each label/input pair in a span
+
+ Example:
+
+
+
+ Exp. Month
+
+
+
+ Exp. Year
+
+
+ ----------------------------------------------------------------------->
+
+
+ <#include "NewCustomerName.ftl" />
+ <#include "NewCustomerEmail.ftl" />
+
+
+ <#include "NewCustomerAccount.ftl" />
+
+
+
+
+ <#include "NewCustomerAddress.ftl" />
+
+
+ <#include "NewCustomerTelco.ftl" />
+
+
+
+
+<#------------------------------------------------------------------------------
+To create a consistent look and feel for all buttons, input[type=submit],
+and a tags acting as submit buttons, all button actions should have a
+class name of "button". No other class names should be used to style
+button actions.
+------------------------------------------------------------------------------->
+
+
+
+
diff --git a/template/customer/newmsg.ftl b/template/customer/newmsg.ftl
new file mode 100644
index 0000000..30f80cb
--- /dev/null
+++ b/template/customer/newmsg.ftl
@@ -0,0 +1,110 @@
+<#--
+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 showMessageLinks?default("false")?upper_case == "TRUE">
+
+ #if>
+
+
${pageHeader}
+
+
+
+
+
+
+ <#if productStore?has_content>
+
+ #if>
+
+ <#if message?has_content>
+
+ <#if (communicationEvent.origCommEventId?? && communicationEvent.origCommEventId?length > 0)>
+ <#assign orgComm = communicationEvent.origCommEventId>
+ <#else>
+ <#assign orgComm = communicationEvent.communicationEventId>
+ #if>
+
+ #if>
+
+
+
+
diff --git a/template/customer/profile/EditBillToAddress.ftl b/template/customer/profile/EditBillToAddress.ftl
new file mode 100644
index 0000000..345c6e9
--- /dev/null
+++ b/template/customer/profile/EditBillToAddress.ftl
@@ -0,0 +1,91 @@
+<#--
+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 productStoreId = Static["org.ofbiz.product.store.ProductStoreWorker"].getProductStoreId(request) />
+
+
+ ${uiLabelMap.PartyAddressLine1}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+
+ ${uiLabelMap.PartyCity}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyZipCode}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.CommonCountry}*
+
+ <#if billToCountryGeoId??>
+ ${billToCountryProvinceGeo!(billToCountryGeoId!)}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyState}*(${uiLabelMap.CommonRequired})
+
+ <#if billToStateProvinceGeoId?has_content>
+ ${billToStateProvinceGeo!(billToStateProvinceGeoId!)}
+ <#else>
+ ${uiLabelMap.PartyNoState}
+ #if>
+
+
+ <#if billToTelecomNumber?has_content>
+
+ ${uiLabelMap.PartyPhoneNumber}*
+
+
+
+ (${uiLabelMap.CommonRequired})
+
+
+ -
+ -
+ -
+
+ #if>
+
+ ${uiLabelMap.EcommerceMyDefaultShippingAddress}
+ checked="checked"#if> />
+
+ <#--
+
+ -->
+
+
\ No newline at end of file
diff --git a/template/customer/profile/EditPostalAddress.ftl b/template/customer/profile/EditPostalAddress.ftl
new file mode 100644
index 0000000..e8ef4e6
--- /dev/null
+++ b/template/customer/profile/EditPostalAddress.ftl
@@ -0,0 +1,85 @@
+<#--
+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 postalAddress = delegator.findOne("PostalAddress", Static["org.ofbiz.base.util.UtilMisc"].toMap("contactMechId", contactMech.contactMechId), true) />
+
+
+
+
+ <#assign productStoreId = Static["org.ofbiz.product.store.ProductStoreWorker"].getProductStoreId(request) />
+
+
+ ${uiLabelMap.PartyAddressLine1}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+
+ ${uiLabelMap.PartyCity}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyZipCode}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.CommonCountry}*
+
+ <#if postalAddress.countryGeoId??>
+ <#assign geo = delegator.findOne("Geo", Static["org.ofbiz.base.util.UtilMisc"].toMap("geoId", postalAddress.countryGeoId), true) />
+ ${geo.geoName!(postalAddress.countryGeoId)}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyState}*
+
+ <#if postalAddress.stateProvinceGeoId??>
+ <#assign geo = delegator.findOne("Geo", Static["org.ofbiz.base.util.UtilMisc"].toMap("geoId", postalAddress.stateProvinceGeoId), true) />
+ ${geo.geoName!(postalAddress.stateProvinceGeoId)}
+ <#else>
+ ${uiLabelMap.PartyNoState}
+ #if>
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.EcommerceMyDefaultBillingAddress}
+ checked="checked"#if> />
+
+
+ ${uiLabelMap.EcommerceMyDefaultShippingAddress}
+ checked="checked"#if> />
+
+ <#--
+
+ -->
+
+
\ No newline at end of file
diff --git a/template/customer/profile/EditProfile.ftl b/template/customer/profile/EditProfile.ftl
new file mode 100644
index 0000000..5509309
--- /dev/null
+++ b/template/customer/profile/EditProfile.ftl
@@ -0,0 +1,68 @@
+<#--
+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.
+-->
+
+
\ No newline at end of file
diff --git a/template/customer/profile/EditShipToAddress.ftl b/template/customer/profile/EditShipToAddress.ftl
new file mode 100644
index 0000000..4bea77c
--- /dev/null
+++ b/template/customer/profile/EditShipToAddress.ftl
@@ -0,0 +1,91 @@
+<#--
+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 productStoreId = Static["org.ofbiz.product.store.ProductStoreWorker"].getProductStoreId(request) />
+
+
+ ${uiLabelMap.PartyAddressLine1}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+
+ ${uiLabelMap.PartyCity}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyZipCode}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.CommonCountry}*
+
+ <#if shipToCountryGeoId??>
+ ${shipToCountryProvinceGeo!(shipToCountryGeoId!)}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyState}*(${uiLabelMap.CommonRequired})
+
+ <#if shipToStateProvinceGeoId?has_content>
+ ${shipToStateProvinceGeo!(shipToStateProvinceGeoId!)}
+ <#else>
+ ${uiLabelMap.PartyNoState}
+ #if>
+
+
+ <#if shipToTelecomNumber?has_content>
+
+ ${uiLabelMap.PartyPhoneNumber}*
+
+
+
+ (${uiLabelMap.CommonRequired})
+
+
+ -
+ -
+ -
+
+ #if>
+
+ ${uiLabelMap.EcommerceMyDefaultBillingAddress}
+ checked="checked"#if> />
+
+ <#--
+
+ -->
+
+
\ No newline at end of file
diff --git a/template/customer/profile/ManageAddress.ftl b/template/customer/profile/ManageAddress.ftl
new file mode 100644
index 0000000..deac713
--- /dev/null
+++ b/template/customer/profile/ManageAddress.ftl
@@ -0,0 +1,301 @@
+<#--
+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 productStoreId = Static["org.ofbiz.product.store.ProductStoreWorker"].getProductStoreId(request) />
+
+
+
+
+
${uiLabelMap.EcommerceAddressBook}
+
+
+ <#-- Default Addresses -->
+
+
${uiLabelMap.EcommerceDefaultAddresses}
+
+ <#--===================================== Billing Address and Telecom number ===========================================-->
+
${uiLabelMap.EcommercePrimaryBillingAddress}
+
+ <#if billToContactMechId??>
+ ${billToAddress1!}
+ <#if billToAddress2?has_content>${billToAddress2!} #if>
+
+ <#if billToStateProvinceGeoId?has_content && billToStateProvinceGeoId != "_NA_">
+ ${billToStateProvinceGeoId}
+ #if>
+ ${billToCity!},
+ ${billToPostalCode!}
+
+ ${billToCountryGeoId!}
+ <#if billToTelecomNumber?has_content>
+
+ ${billToTelecomNumber.countryCode!}-
+ ${billToTelecomNumber.areaCode!}-
+ ${billToTelecomNumber.contactNumber!}
+ <#if billToExtension??>-${billToExtension!}#if>
+
+ #if>
+
+ <#else>
+ ${uiLabelMap.PartyPostalInformationNotFound}
+ #if>
+
+
+ <#include "EditBillToAddress.ftl" />
+
+
+
+ <#--===================================== Shipping Address and Telecom number ===========================================-->
+
${uiLabelMap.EcommercePrimaryShippingAddress}
+
+ <#if shipToContactMechId??>
+ ${shipToAddress1!}
+ <#if shipToAddress2?has_content>${shipToAddress2!} #if>
+
+ <#if shipToStateProvinceGeoId?has_content && shipToStateProvinceGeoId != "_NA_">
+ ${shipToStateProvinceGeoId}
+ #if>
+ ${shipToCity!},
+ ${shipToPostalCode!}
+
+ ${shipToCountryGeoId!}
+ <#if shipToTelecomNumber?has_content>
+
+ ${shipToTelecomNumber.countryCode!}-
+ ${shipToTelecomNumber.areaCode!}-
+ ${shipToTelecomNumber.contactNumber!}
+ <#if shipToExtension??>-${shipToExtension!}#if>
+
+ #if>
+
+ <#else>
+ ${uiLabelMap.PartyPostalInformationNotFound}
+ #if>
+
+
+ <#include "EditShipToAddress.ftl" />
+
+
+
+
+
+ <#-- Additional Addresses -->
+
+
${uiLabelMap.EcommerceAdditionalAddresses}
+
+
+ <#assign postalAddressFlag = "N" />
+ <#list partyContactMechValueMaps as partyContactMechValueMap>
+ <#assign contactMech = partyContactMechValueMap.contactMech! />
+ <#if contactMech.contactMechTypeId! = "POSTAL_ADDRESS">
+ <#assign partyContactMech = partyContactMechValueMap.partyContactMech! />
+ <#if !(partyContactMechValueMap.partyContactMechPurposes?has_content)>
+ <#assign postalAddressFlag = "Y" />
+ <#assign postalAddress = partyContactMechValueMap.postalAddress! />
+
+ <#include "EditPostalAddress.ftl" />
+
+ <#if postalAddress??>
+
+
+
+
+
+
+
+
+
+
+
+ <#else>
+
+ ${uiLabelMap.PartyPostalInformationNotFound}.
+
+ #if>
+ #if>
+ #if>
+ #list>
+ <#if postalAddressFlag == "N">
+
+ ${uiLabelMap.PartyPostalInformationNotFound}.
+
+ #if>
+
+
+
\ No newline at end of file
diff --git a/template/customer/profile/NewCustomer.ftl b/template/customer/profile/NewCustomer.ftl
new file mode 100644
index 0000000..7c7feb4
--- /dev/null
+++ b/template/customer/profile/NewCustomer.ftl
@@ -0,0 +1,176 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.EcommerceMyAccount}
+
+
+
\ No newline at end of file
diff --git a/template/customer/profile/ViewProfile.ftl b/template/customer/profile/ViewProfile.ftl
new file mode 100644
index 0000000..bc3195f
--- /dev/null
+++ b/template/customer/profile/ViewProfile.ftl
@@ -0,0 +1,103 @@
+<#--
+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.
+-->
+
+
+
${uiLabelMap.EcommerceMyAccount}
+
+
+ <#-- Manage Addresses -->
+
+
${uiLabelMap.EcommerceManageAddresses}
+
${uiLabelMap.EcommerceAddressBook}
+
+
${uiLabelMap.EcommercePrimaryShippingAddress}
+
+ <#if shipToContactMechId??>
+ ${shipToAddress1!}
+ <#if shipToAddress2?has_content>${shipToAddress2!} #if>
+
+
+
+ <#if shipToStateProvinceGeoId?has_content && shipToStateProvinceGeoId != "_NA_">
+ ${shipToStateProvinceGeoId}
+ #if>
+ ${shipToCity!},
+ ${shipToPostalCode!}
+
+ ${shipToCountryGeoId!}
+
+
+ <#if shipToTelecomNumber?has_content>
+
+ ${shipToTelecomNumber.countryCode!}-
+ ${shipToTelecomNumber.areaCode!}-
+ ${shipToTelecomNumber.contactNumber!}
+ <#if shipToExtension??>-${shipToExtension!}#if>
+
+ #if>
+ <#else>
+ ${uiLabelMap.PartyPostalInformationNotFound}
+ #if>
+
+
+
+
${uiLabelMap.EcommercePrimaryBillingAddress}
+
+ <#if billToContactMechId??>
+ ${billToAddress1!}
+ <#if billToAddress2?has_content>${billToAddress2!} #if>
+
+
+
+ <#if billToStateProvinceGeoId?has_content && billToStateProvinceGeoId != "_NA_">
+ ${billToStateProvinceGeoId}
+ #if>
+ ${billToCity!},
+ ${billToPostalCode!}
+
+ ${billToCountryGeoId!}
+
+
+ <#if billToTelecomNumber?has_content>
+
+ ${billToTelecomNumber.countryCode!}-
+ ${billToTelecomNumber.areaCode!}-
+ ${billToTelecomNumber.contactNumber!}
+ <#if billToExtension??>-${billToExtension!}#if>
+
+ #if>
+ <#else>
+ ${uiLabelMap.PartyPostalInformationNotFound}
+ #if>
+
+
+
+
+
\ No newline at end of file
diff --git a/template/customer/viewprofile.ftl b/template/customer/viewprofile.ftl
new file mode 100644
index 0000000..62ae293
--- /dev/null
+++ b/template/customer/viewprofile.ftl
@@ -0,0 +1,108 @@
+<#--
+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 party??>
+<#-- Main Heading -->
+
+
+
+
+
+
+
+
+ <#include "AccountName.ftl" />
+
+
+ <#include "AccountLoyalityPoints.ftl" />
+
+
+ ${screens.render("component://oshop/widget/OrderScreens.xml#orderhistory")}
+
+
+ <#include "AccountMessages.ftl" />
+
+
+ <#include "AccountSurveys.ftl" />
+
+
+ <#include "AccountContactMechs.ftl" />
+
+
+ <#include "AccountCards.ftl" />
+
+
+
+
+
+
+<#-- ============================================================= -->
+<#-- only 5 messages will show; edit the ViewProfile.groovy to change this number -->
+${screens.render("component://${activeApp}/widget/CustomerScreens.xml#FinAccountList-include")}
+
+<#-- Serialized Inventory Summary -->
+${screens.render('component://${activeApp}/widget/CustomerScreens.xml#SerializedInventorySummary')}
+
+<#-- Subscription Summary -->
+${screens.render('component://${activeApp}/widget/CustomerScreens.xml#SubscriptionSummary')}
+
+<#-- Reviews -->
+${screens.render('component://${activeApp}/widget/CustomerScreens.xml#showProductReviews')}
+
+<#else>
+
${uiLabelMap.PartyNoPartyForCurrentUserName}: ${userLogin.userLoginId}
+#if>
diff --git a/template/customer/viewreviews.ftl b/template/customer/viewreviews.ftl
new file mode 100644
index 0000000..990c36c
--- /dev/null
+++ b/template/customer/viewreviews.ftl
@@ -0,0 +1,46 @@
+<#--
+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 reviews?has_content>
+
+
${uiLabelMap.ProductReviews}
+
+
+
+ ${uiLabelMap.EcommerceSentDate}
+ ${uiLabelMap.ProductProductId}
+ ${uiLabelMap.ProductReviews}
+ ${uiLabelMap.ProductRating}
+ ${uiLabelMap.CommonIsAnonymous}
+ ${uiLabelMap.CommonStatus}
+
+ <#list reviews as review>
+
+ ${review.postedDateTime!}
+ ${review.productId}
+ ${review.productReview!}
+ ${review.productRating}
+ ${review.postedAnonymous!}
+ ${review.getRelatedOne("StatusItem", false).get("description", locale)}
+
+ #list>
+
+
+
+#if>
diff --git a/template/data/content.ftl b/template/data/content.ftl
new file mode 100644
index 0000000..7625418
--- /dev/null
+++ b/template/data/content.ftl
@@ -0,0 +1,42 @@
+
+<#--
+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.
+-->
+
+
+
+<#recurse doc>
+
+
+<#macro contents>
+<#recurse .node>
+#macro>
+
+<#macro content>
+ <#assign contentId="ECMC" + .node.@id[0]/>
+
+
+
+
+
+#macro>
+
+<#macro @element>
+#macro>
diff --git a/template/data/topic.ftl b/template/data/topic.ftl
new file mode 100644
index 0000000..333b94a
--- /dev/null
+++ b/template/data/topic.ftl
@@ -0,0 +1,42 @@
+
+<#--
+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.
+-->
+
+
+<#recurse doc>
+
+
+<#macro topics>
+<#recurse .node>
+#macro>
+
+<#macro topic>
+ <#assign contentId="ECMT" + .node.@id[0]/>
+
+ <#assign internalName=.node.@name[0]/>
+ <#assign internalNameParts=internalName?split(".")/>
+ <#assign firstPart=internalNameParts[0] />
+ <#assign nowStamp=Static["org.ofbiz.base.util.UtilDateTime"].nowTimestamp()/>
+ <#if firstPart == "WIDGETS">
+
+ #if>
+#macro>
+
+<#macro @element>
+#macro>
diff --git a/template/data/tree.ftl b/template/data/tree.ftl
new file mode 100644
index 0000000..d34c376
--- /dev/null
+++ b/template/data/tree.ftl
@@ -0,0 +1,46 @@
+
+<#--
+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.
+-->
+
+
+<#recurse doc>
+
+
+<#macro topic_tree>
+<#recurse .node>
+#macro>
+
+<#macro topic>
+ <#assign contentId="ECMT" + .node.@id[0]/>
+ <#recurse .node>
+#macro>
+
+<#macro child>
+ <#assign contentIdTo="ECMT" + .node.@id[0]/>
+ <#assign assocType="SUB_CONTENT"/>
+ <#if .node.@type = "content">
+ <#assign contentIdTo="ECMC" + .node.@id[0]/>
+ <#assign assocType="PUBLISH_LINK"/>
+ #if>
+ <#assign nowStamp=Static["org.ofbiz.base.util.UtilDateTime"].nowTimestamp()/>
+
+#macro>
+
+<#macro @element>
+#macro>
diff --git a/template/email/ContactListEmailTemplate.ftl b/template/email/ContactListEmailTemplate.ftl
new file mode 100644
index 0000000..6ad214c
--- /dev/null
+++ b/template/email/ContactListEmailTemplate.ftl
@@ -0,0 +1,38 @@
+<#--
+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.
+-->
+
+
+
+ ${content}
+
+ <#assign verifyUrl = baseEcommerceSecureUrl + "updateContactListPartyNoUserLogin" />
+
+
+ E-mail: ${emailAddress}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/template/email/ContactListSubscribeEmail.ftl b/template/email/ContactListSubscribeEmail.ftl
new file mode 100644
index 0000000..480be51
--- /dev/null
+++ b/template/email/ContactListSubscribeEmail.ftl
@@ -0,0 +1,31 @@
+<#--
+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.
+-->
+
+
+
Hello ${partyName.firstName!} ${partyName.lastName!} ${partyName.groupName!}!
+
Successfully subscribed from ${contactList.contactListName} contact list.
+
+ <#assign verifyUrl = baseEcommerceSecureUrl +'updateContactListPartyNoUserLogin?contactListId='+contactListParty.contactListId+'&partyId='+contactListParty.partyId+'&fromDate='+contactListParty.fromDate+'&statusId=CLPT_UNSUBS_PENDING&optInVerifyCode='+contactListPartyStatus.optInVerifyCode+'&baseLocation='+baseLocation!>
+ <#if (contactListParty.preferredContactMechId)??>
+ <#assign verifyUrl= verifyUrl+"&preferredContactMechId="+contactListParty.preferredContactMechId>
+ #if>
+
If this was by mistake, click here to unsubscribe your subscription again.
+
+
+
diff --git a/template/email/ContactListUnsubscribeEmail.ftl b/template/email/ContactListUnsubscribeEmail.ftl
new file mode 100644
index 0000000..bf1e1c4
--- /dev/null
+++ b/template/email/ContactListUnsubscribeEmail.ftl
@@ -0,0 +1,33 @@
+<#--
+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.
+-->
+
+
+
Hello ${partyName.firstName!} ${partyName.lastName!} ${partyName.groupName!}!
+
Successfully unsubscribed from ${contactList.contactListName} contact list.
+
+ <#--assign verifyUrl = baseEcommerceSecureUrl +'updateContactListPartyNoUserLogin?contactListId='+contactListParty.contactListId+'&partyId='+contactListParty.partyId+'&fromDate='+contactListParty.fromDate+'&statusId=CLPT_SUBS_PENDING&optInVerifyCode='+contactListPartyStatus.optInVerifyCode+'&baseLocation='+baseLocation!>
+ <#if (contactListParty.preferredContactMechId)??>
+ <#assign verifyUrl= verifyUrl+"&preferredContactMechId="+contactListParty.preferredContactMechId>
+ #if>
+
If this was by mistake, click here subscribe again.
+
+
+
+
+
diff --git a/template/email/ContactListUnsubscribeVerifyEmail.ftl b/template/email/ContactListUnsubscribeVerifyEmail.ftl
new file mode 100644
index 0000000..4f81514
--- /dev/null
+++ b/template/email/ContactListUnsubscribeVerifyEmail.ftl
@@ -0,0 +1,43 @@
+<#--
+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.
+-->
+
+
+
+
+ ${title!}
+ <#-- this needs to be fully qualified to appear in email; the server must also be available -->
+
+
+
+
+ <#-- custom logo or text can be inserted here -->
+ ${title!}
+ <#if note??>${note}
#if>
+
+ Hello ${partyName.firstName!} ${partyName.lastName!} ${partyName.groupName!}!
+ We have received a request for unsubscription to the ${contactList.contactListName} contact list.
+ To complete your unsubscription click the on the following link:
+
+ <#assign verifyUrl = baseEcommerceSecureUrl+'contactListOptOut?contactListId='+contactListParty.contactListId+'&communicationEventId='+communicationEventId!+'&partyId='+contactListParty.partyId+'&fromDate='+contactListParty.fromDate+'&statusId=CLPT_UNSUBSCRIBED&optInVerifyCode='+contactListPartyStatus.optInVerifyCode>
+ <#if (contactListParty.preferredContactMechId)??>
+ <#assign verifyUrl= verifyUrl+"&preferredContactMechId="+contactListParty.preferredContactMechId>
+ #if>
+ Please click here to verify your unsubscription.
+
+
diff --git a/template/email/ContactListVerifyEmail.ftl b/template/email/ContactListVerifyEmail.ftl
new file mode 100644
index 0000000..1fa9a78
--- /dev/null
+++ b/template/email/ContactListVerifyEmail.ftl
@@ -0,0 +1,44 @@
+<#--
+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.
+-->
+
+
+
+
+
${title!}
+ <#-- this needs to be fully qualified to appear in email; the server must also be available -->
+
+
+
+
+<#-- custom logo or text can be inserted here -->
+
${title!}
+<#if note??>
${note}
#if>
+
+
Hello ${partyName.firstName!} ${partyName.lastName!} ${partyName.groupName!}!
+
We have received a request for subscription to the ${contactList.contactListName} contact list.
+
To complete your subscription click the on the following link:
+
+<#assign verifyUrl = baseEcommerceSecureUrl+'/'+'updateContactListPartyNoUserLogin?contactListId='+contactListParty.contactListId+'&partyId='+contactListParty.partyId+'&fromDate='+contactListParty.fromDate+'&statusId=CLPT_ACCEPTED&optInVerifyCode='+contactListPartyStatus.optInVerifyCode+'&baseLocation='+baseLocation!>
+<#if (contactListParty.preferredContactMechId)??>
+ <#assign verifyUrl= verifyUrl+"&preferredContactMechId="+contactListParty.preferredContactMechId>
+#if>
+
Please click here to verify your subscription.
+
+
+
diff --git a/template/email/ContactUsEmail.ftl b/template/email/ContactUsEmail.ftl
new file mode 100644
index 0000000..2ce0d7c
--- /dev/null
+++ b/template/email/ContactUsEmail.ftl
@@ -0,0 +1,28 @@
+<#--
+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.
+-->
+
+
+
+
+
The information filled by the person on contact us page is as follows:
+
${uiLabelMap.CommonName}: ${parameters.firstName!} ${parameters.lastName!}
+
${uiLabelMap.CommonEmail}: ${parameters.email!}
+
${uiLabelMap.CommonMessage}: ${parameters.message!}
+
+
\ No newline at end of file
diff --git a/template/email/OrderNoticeEmail.ftl b/template/email/OrderNoticeEmail.ftl
new file mode 100644
index 0000000..75c626d
--- /dev/null
+++ b/template/email/OrderNoticeEmail.ftl
@@ -0,0 +1,145 @@
+<#--
+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.
+-->
+
+
+
+
+
+
${title!}
+ <#-- this needs to be fully qualified to appear in email; the server must also be available -->
+
+
+
+
+
+<#-- custom logo or text can be inserted here -->
+
+
${title!}
+<#if !isDemoStore?? || isDemoStore>
${uiLabelMap.OrderDemoFrontNote}.
#if>
+<#if note??>
${note}
#if>
+<#if orderHeader??>
+${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+
+${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+<#else>
+
Order not found with ID [${orderId!}], or not allowed to view.
+#if>
+
+
+
diff --git a/template/email/ShipmentNotificationEmail.ftl b/template/email/ShipmentNotificationEmail.ftl
new file mode 100644
index 0000000..8fd66b3
--- /dev/null
+++ b/template/email/ShipmentNotificationEmail.ftl
@@ -0,0 +1,63 @@
+<#--
+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 baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/>#if>
+<#if shipment?has_content>
+
+
+
+
+
+ ${uiLabelMap.OrderTrackingNumber}
+
+ <#list orderShipmentInfoSummaryList as orderShipmentInfoSummary>
+
+
+ Code: ${orderShipmentInfoSummary.trackingCode?default("[Not Yet Known]")}
+ <#if orderShipmentInfoSummary.carrierPartyId?has_content>(${uiLabelMap.ProductCarrier}: ${orderShipmentInfoSummary.carrierPartyId})#if>
+
+
+ #list>
+
+
+
+
+
${uiLabelMap.EcommerceShipmentItems}
+
+
+
+
+ ${uiLabelMap.OrderProduct}
+ ${uiLabelMap.OrderQuantity}
+
+
+ <#list shipmentItems as shipmentItem>
+ <#assign productId = shipmentItem.productId>
+ <#assign product = shipmentItem.getRelatedOne("Product", false)>
+
+ ${productId!} - ${product.internalName!}
+ ${shipmentItem.quantity!}
+
+ #list>
+
+
+
+#if>
diff --git a/template/email/emailpayretry.ftl b/template/email/emailpayretry.ftl
new file mode 100644
index 0000000..067759b
--- /dev/null
+++ b/template/email/emailpayretry.ftl
@@ -0,0 +1,29 @@
+<#--
+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 orderHeader.statusId == "ORDER_REJECTED">
+ ${uiLabelMap.OrderEmailProblemWithYourPaymentMethod} ${orderHeader.orderId}.
+ ${uiLabelMap.OrderEmailProblemCancelledNotProcessed}
+<#elseif orderHeader.statusId == "ORDER_APPROVED">
+ ${uiLabelMap.OrderEmailPaymentOK} ${orderHeader.orderId} ${uiLabelMap.OrderEmailAccepted}
+<#else>
+ ${uiLabelMap.OrderEmailSorry} ${orderHeader.orderId}.
+#if>
+
${uiLabelMap.OrderEmailCustomerService} (email@email.com)
<#-- Customer service email (not a variable why?) must be adapted - JLR 1/6/5 -->
diff --git a/template/email/giftcardpurchase.ftl b/template/email/giftcardpurchase.ftl
new file mode 100644
index 0000000..97ce3df
--- /dev/null
+++ b/template/email/giftcardpurchase.ftl
@@ -0,0 +1,42 @@
+<#--
+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.
+-->
+
+<#-- Three standard fields cardNumber, pinNumber and amount are available from the activation
+ All other fields in this tempalte are designed to work with the values (responses)
+ from surveyId 1000 - The gift card purchase survey.
+ -->
+
+<#if recipientName??>${recipientName},#if>
+
+
+<#-- MyCompany.com (not a variable why?) must be adapted - JLR 1/6/5 -->
+${uiLabelMap.EcommerceYouHaveBeenSent} MyCompany.com <#if senderName??> ${uiLabelMap.EcommerceGiftCardFrom} ${senderName}#if>!
+
+<#if giftMessage?has_content>
+ ${uiLabelMap.OrderGiftMessage}
+
+ ${giftMessage}
+
+#if>
+
+
+ ${uiLabelMap.EcommerceYourCardNumber} ${cardNumber!}
+ ${uiLabelMap.EcommerceYourPinNumber} ${pinNumber!}
+ ${uiLabelMap.EcommerceGiftAmount} ${amount!}
+
diff --git a/template/email/giftcardreload.ftl b/template/email/giftcardreload.ftl
new file mode 100644
index 0000000..8fb1996
--- /dev/null
+++ b/template/email/giftcardreload.ftl
@@ -0,0 +1,52 @@
+<#--
+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.
+-->
+
+<#--
+ Standard fields for this template are: cardNumber, pinNumber, amount, previousAmount, processResult, responseCode
+ All other fields in this template are designed to work with the values (responses) from surveyId 1001
+-->
+
+<#if giftCardNumber?has_content>
+ <#assign displayNumber = "">
+ <#assign numSize = giftCardNumber?length - 4>
+ <#if 0 < numSize>
+ <#list 0 .. numSize-1 as foo>
+ <#assign displayNumber = displayNumber + "*">
+ #list>
+ <#assign displayNumber = displayNumber + giftCardNumber[numSize .. numSize + 3]>
+ <#else>
+ <#assign displayNumber = giftCardNumber>
+ #if>
+#if>
+
+<#if processResult>
+ <#-- success -->
+
+ ${uiLabelMap.EcommerceYourGiftCard} ${displayNumber} ${uiLabelMap.EcommerceYourGiftCardReloaded}
+
+ ${uiLabelMap.EcommerceGiftCardNewBalance} ${amount} ${uiLabelMap.CommonFrom} ${previousAmount}
+
+<#else>
+ <#-- fail -->
+
+ ${uiLabelMap.EcommerceGiftCardReloadFailed} ${responseCode}
+
+ ${uiLabelMap.EcommerceGiftCardRefunded}
+
+#if>
diff --git a/template/email/registration.ftl b/template/email/registration.ftl
new file mode 100644
index 0000000..450c904
--- /dev/null
+++ b/template/email/registration.ftl
@@ -0,0 +1,35 @@
+<#--
+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.
+-->
+
+<#-- All fields from Person and UserLogin are available to this template -->
+
+${person.firstName},
+
+${uiLabelMap.EcommerceThankForRegistering} MyStore.com. <#-- MyStore.com (not a variable why?) must be adapted - JLR 1/6/5 -->
+
+
+${uiLabelMap.EcommerceAccountLogin} ${userLogin.userLoginId}
+${uiLabelMap.EcommercePassword}
+
+${uiLabelMap.EcommerceLosePassword}
+
+${uiLabelMap.EcommerceThankYou},
+MyStore.com <#-- MyStore.com (not a variable why?) must be adapted - JLR 1/6/5 -->
+
+
diff --git a/template/email/returnaccept.ftl b/template/email/returnaccept.ftl
new file mode 100644
index 0000000..c0ab2f7
--- /dev/null
+++ b/template/email/returnaccept.ftl
@@ -0,0 +1,34 @@
+<#--
+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.
+-->
+
+<#-- ReturnHeader and a List of ReturnItem records is available to this template -->
+
+${uiLabelMap.EcommerceReturnRequest}
+
+
+<#list returnItems as item>
+ <#assign returnReason = item.getRelatedOne("ReturnReason", false)!>
+ <#assign returnType = item.getRelatedOne("ReturnType", false)!>
+ ${item.description?default("N/A")} - ${item.returnQuantity?string.number} @ ${item.returnPrice}
+#list>
+
+
+
+${uiLabelMap.EcommerceReturnRequestAccepted} ${returnHeader.returnId}
+
diff --git a/template/email/returncancel.ftl b/template/email/returncancel.ftl
new file mode 100644
index 0000000..5a9eae9
--- /dev/null
+++ b/template/email/returncancel.ftl
@@ -0,0 +1,24 @@
+<#--
+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.
+-->
+
+<#-- ReturnHeader and a List of ReturnItem records is available to this template -->
+
+
+${uiLabelMap.EcommerceReturnRequestNb} ${returnHeader.returnId} ${uiLabelMap.EcommerceReturnRequestCancelled}
+
diff --git a/template/email/returncomplete.ftl b/template/email/returncomplete.ftl
new file mode 100644
index 0000000..3a61e50
--- /dev/null
+++ b/template/email/returncomplete.ftl
@@ -0,0 +1,24 @@
+<#--
+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.
+-->
+
+<#-- ReturnHeader and a List of ReturnItem records is available to this template -->
+
+
+${uiLabelMap.EcommerceReturnRequestNb} ${returnHeader.returnId} ${uiLabelMap.EcommerceReturnRequestCompleted}
+
diff --git a/template/email/tellafriend.ftl b/template/email/tellafriend.ftl
new file mode 100644
index 0000000..ce0f352
--- /dev/null
+++ b/template/email/tellafriend.ftl
@@ -0,0 +1,30 @@
+<#--
+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.
+-->
+
+
+
+${sendTo},
+
+${sendFrom} ${uiLabelMap.EcommerceFollowingMessage}
+
+
${message}
+
+
${pageUrl}
+
+
diff --git a/template/error/404.jsp b/template/error/404.jsp
new file mode 100644
index 0000000..c693609
--- /dev/null
+++ b/template/error/404.jsp
@@ -0,0 +1,53 @@
+<%--
+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.
+--%>
+<%@ page import="java.util.*" %>
+<%@ page import="org.ofbiz.base.util.*" %>
+<%@ page import="org.ofbiz.entity.*" %>
+<%@ page import="org.ofbiz.entity.util.*" %>
+<%@ page import="org.ofbiz.webapp.website.WebSiteWorker" %>
+
+<%
+ServletContext context = pageContext.getServletContext();
+String webSiteId = WebSiteWorker.getWebSiteId(request);
+List
webAnalytics = delegator.findByAnd("WebAnalyticsConfig", UtilMisc.toMap("webSiteId", webSiteId), null, false);
+%>
+
+
+Error 404
+<%if (webAnalytics != null) {%>
+
+<%}%>
+
+
+
+404.
+That's an error.
+
+
+The requested URL
+<%=request.getAttribute("filterRequestUriError")%>
+was not found on this server.
+That's all we know.
+
+
+
diff --git a/template/error/error.jsp b/template/error/error.jsp
new file mode 100644
index 0000000..3aef501
--- /dev/null
+++ b/template/error/error.jsp
@@ -0,0 +1,53 @@
+<%--
+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.
+--%>
+
+<%@ page import="org.ofbiz.base.util.*" %>
+
+
+OFBiz Message
+
+
+
+<% String errorMsg = (String) request.getAttribute("_ERROR_MESSAGE_"); %>
+
+
+
+
+
+
+
+
+
+
+ :ERROR MESSAGE:
+
+
+
+
+ <%=UtilFormatOut.replaceString(errorMsg, "\n", " ")%>
+
+
+
+
+
+
+
+
+
+
diff --git a/template/forum/ViewComboResponse.ftl b/template/forum/ViewComboResponse.ftl
new file mode 100644
index 0000000..bc81b12
--- /dev/null
+++ b/template/forum/ViewComboResponse.ftl
@@ -0,0 +1,53 @@
+<#--
+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 requestAttributes._ERROR_MESSAGE_??>
+${requestAttributes._ERROR_MESSAGE_}
+<#else>
+ <#if trailList??>
+ <#assign indent = "">
+ <#assign csv = "">
+ <#assign counter = 1>
+ <#assign len = trailList?size>
+ <#list trailList as pair>
+ <#if 0 < csv?length >
+ <#assign csv = csv + ","/>
+ #if>
+ <#assign csv = csv + pair[0]!/>
+ <#if counter < len>
+ ${indent}
+ ${pair[0]!} - ${pair[1]!}
+ @ofbizUrl>${uiLabelMap.CommonView}
+ <#assign indent = indent + " ">
+ <#else>
+
+ ${uiLabelMap.EcommerceAddResponseFor}${pair[0]!} - ${pair[1]!}:
+ #if>
+ <#assign counter = counter + 1>
+ #list>
+
+ <#if dataResourceId??>
+
+
+ #if>
+
+ #if>
+ ${singleWrapper.renderFormString()}
+
+#if>
diff --git a/template/forum/bloglib.ftl b/template/forum/bloglib.ftl
new file mode 100644
index 0000000..a7fa50d
--- /dev/null
+++ b/template/forum/bloglib.ftl
@@ -0,0 +1,195 @@
+<#--
+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.
+-->
+
+<#macro renderBlog contentId="" targetPurpose="" stdWrapId="">
+<#if contentId?has_content>
+ <#assign contentIdx = contentId/>
+#if>
+<#assign viewIdx = "" />
+<#if requestParameters.viewIndex?has_content>
+<#assign viewIdx = requestParameters.viewIndex! />
+#if>
+<#assign viewSz = "" />
+<#if requestParameters.viewSize?has_content>
+<#assign viewSz = requestParameters.viewSize! />
+#if>
+
+<#assign sz=0/>
+
+<@loopSubContent contentId=contentIdx viewIndex=viewIdx viewSize=viewSz contentAssocTypeId="PUBLISH_LINK"
+ pickWhen="purposes.contains(\"ARTICLE\") && \"CTNT_PUBLISHED\".equals(content.get(\"statusId\"))"
+ returnAfterPickWhen="purposes.contains(\"ARTICLE\")"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"never follow\")">
+ <#assign thisNodeTrailCsv=nodeTrailCsv!/>
+ <#assign thisSubContentId=subContentId!/>
+ <#assign thisNode=globalNodeTrail?last/>
+ <#if thisNode?has_content>
+ <#assign thisOwnerContentId=thisNode.value.ownerContentId!/>
+ #if>
+
+ <#assign userLoginId=""/>
+ <#if content?has_content && content.createdByUserLogin?has_content>
+ <#assign userLoginId=content.createdByUserLogin/>
+ #if>
+ <#assign authorName=Static["org.ofbiz.content.ContentManagementWorker"].getUserName(request,userLoginId!)/>
+
+
+
+
+
+ by:<#if authorName?has_content>${authorName!}
+ <#else>
+ <#if content?has_content>${content.createdByUserLogin!}#if>
+ #if>
+
+ <#if thisNode?? && thisNode.fromDate??>
+ <#assign nowTime = thisNode.fromDate?string />
+ <#assign shortTime = ""/>
+ <#if nowTime?has_content>
+ <#assign lastColon=nowTime?last_index_of(":") - 1/>
+ <#assign shortTime=nowTime[0..lastColon]/>
+ #if>
+ ${shortTime!}
+ #if>
+
+
+
+ <#if content?has_content>${content.contentName!}#if>
+ --
+ <#if content?has_content>${content.description!}#if>
+
+
+${uiLabelMap.CommonView}
+
+<@checkPermission mode="equals" entityOperation="_UPDATE" subContentId=content.contentId targetOperation="CONTENT_UPDATE" contentPurposeList="ARTICLE">
+
+${uiLabelMap.CommonEdit}
+
+@checkPermission>
+
+<#assign sz=listSize/>
+
+@loopSubContent>
+
+
+<#if sz == 0 >
+ ${uiLabelMap.CommonNoRecordFound}
+#if>
+<@wrapSubContentCache subContentId=contentIdx wrapTemplateId=stdWrapId contentPurposeList="ARTICLE">
+@wrapSubContentCache>
+
+
+<#assign targOp="HAS_USER_ROLE"/>
+<#assign pageTargOp=targetOperation!/>
+<#if pageTargOp?has_content>
+ <#assign targOp=pageTargOp/>
+#if>
+<@checkPermission mode="equals" entityOperation="_CREATE" subContentId=contentDept statusId="CTNT_PUBLISHED" targetOperation=targOp contentPurposeList="ARTICLE" quickCheckContentId=contentIdx>
+
+${uiLabelMap.ProductNewArticle}
+
+@checkPermission>
+<@checkPermission mode="not-equals" entityOperation="_CREATE" subContentId=contentDept statusId="CTNT_PUBLISHED" targetOperation=targOp contentPurposeList="ARTICLE" quickCheckContentId=contentIdx>
+
+${uiLabelMap.EcommerceLoggedToPost}
+
+@checkPermission>
+
+<#--
+<@checkPermission mode="not-equals" entityOperation="_CREATE" subContentId=contentIdx statusId="CTNT_PUBLISHED" targetOperation="HAS_USER_ROLE" contentPurposeList="ARTICLE">
+ ${permissionErrorMsg!}
+@checkPermission>
+-->
+
+#macro>
+
+<#macro renderAncestryPath trail startIndex=0 endIndexOffset=0 buttonTitle="${uiLabelMap.CommonBackTo}">
+ <#local indent = "">
+ <#local csv = "">
+ <#local counter = 0>
+ <#local len = trail?size>
+
+ <#list trail as content>
+ <#if counter < (len - endIndexOffset) && startIndex <= counter >
+ <#if 0 < counter >
+ <#local csv = csv + ","/>
+ #if>
+ <#local csv = csv + content.contentId/>
+ <#if counter < len && startIndex <= counter >
+
+
+ ${indent}
+ <#if content.contentTypeId == "WEB_SITE_PUB_PT" >
+ ${uiLabelMap.CommonBackTo} ${content.contentName!}
+ <#else>
+ ${uiLabelMap.CommonBackTo}to ${content.contentName!}
+ #if>
+ <#local indent = indent + " ">
+ [${content.contentId!}]
+ #if>
+
+ #if>
+ <#local counter = counter + 1>
+ <#if 20 < counter > <#break/>#if>
+ #list>
+
+#macro>
+
+<#macro nextPrev listSize requestURL queryString lowIndex=0 highIndex=10 viewSize=10 viewIndex=0 >
+
+<#assign lowIdx=lowIndex/>
+<#assign highIdx=highIndex/>
+<#assign viewSz=viewSize/>
+<#assign viewIdx=viewIndex/>
+<#assign listSz=listSize/>
+
+<#if !lowIdx?has_content><#assign lowIdx=0/>#if>
+<#if !highIdx?has_content><#assign highIdx=0/>#if>
+<#if !viewSz?has_content><#assign viewSz=10/>#if>
+<#if !viewIdx?has_content><#assign viewIdx=10/>#if>
+<#if !listSz?has_content><#assign listSz=0/>#if>
+
+<#if queryString?has_content>
+ <#assign queryString = Static["org.ofbiz.base.util.UtilHttp"].stripViewParamsFromQueryString(queryString)/>
+#if>
+
+<#assign lowIdxShow = lowIdx + 1 />
+<#if highIdx < lowIdxShow >
+ <#assign lowIdxShow = highIdx/>
+#if>
+
+
+ <#if 0 < listSz?number>
+ <#if 0 < viewIdx?number>
+
+ <#else>
+
+ #if>
+ <#if 0 < listSz>
+
+ #if>
+ <#if highIdx!?number < listSz!?number>
+
+ <#else>
+
+ #if>
+ #if>
+
+
+#macro>
diff --git a/template/forum/createforumarticle.ftl b/template/forum/createforumarticle.ftl
new file mode 100644
index 0000000..1546a08
--- /dev/null
+++ b/template/forum/createforumarticle.ftl
@@ -0,0 +1,22 @@
+<#--
+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.
+-->
+
+<#import "bloglib.ftl" as blog/>
+<@blog.renderAncestryPath trail=ancestorList?default([])/>
+ ${singleWrapper.renderFormString()}
diff --git a/template/forum/createforumresponse.ftl b/template/forum/createforumresponse.ftl
new file mode 100644
index 0000000..1319f01
--- /dev/null
+++ b/template/forum/createforumresponse.ftl
@@ -0,0 +1,28 @@
+<#--
+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.
+-->
+
+<#import "bloglib.ftl" as blog/>
+
+<#--
+<@blog.renderSiteAncestryPath trail=siteAncestorList?default([])/>
+<@blog.renderAncestryPath trail=trailList startIndex=1/>
+-->
+
+ ${singleWrapper.renderFormString()}
+
diff --git a/template/forum/editaddforumdata.ftl b/template/forum/editaddforumdata.ftl
new file mode 100644
index 0000000..0f26da2
--- /dev/null
+++ b/template/forum/editaddforumdata.ftl
@@ -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.
+-->
+
+${singleWrapper.renderFormString()}
diff --git a/template/forum/editaddimage.ftl b/template/forum/editaddimage.ftl
new file mode 100644
index 0000000..9a308a1
--- /dev/null
+++ b/template/forum/editaddimage.ftl
@@ -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.
+-->
+
+ ${singleWrapper.renderFormString()}
diff --git a/template/forum/editforumarticle.ftl b/template/forum/editforumarticle.ftl
new file mode 100644
index 0000000..2a010bf
--- /dev/null
+++ b/template/forum/editforumarticle.ftl
@@ -0,0 +1,94 @@
+<#--
+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.
+-->
+<#import "bloglib.ftl" as blog/>
+<@blog.renderAncestryPath trail=ancestorList?default([]) endIndexOffset=1/>
+<#-- Main Heading -->
+<#--
+
+
+
+ ${contentIdTo!}
+
+
+
+
+
+
+
+-->
+
+
+
+
+
+
+
${uiLabelMap.EcommerceContentInformation}
+
+
+
+ ${uiLabelMap.ProductContentId}
${contentId!}
+ ${uiLabelMap.EcommerceContentName}
${contentName!}
+ ${uiLabelMap.CommonDescription}
+
+
+
+
+
+
+
+
+
+
${uiLabelMap.EcommerceImageInformation}
+
+
+
+ ${uiLabelMap.EcommerceImage}
+
+
+
+
+
+
+
+
+
+
+
${uiLabelMap.EcommerceSummaryInformation}
+
+
+ ${uiLabelMap.ContentSummary}
+
+
+
+
+
+
+
+
+
${uiLabelMap.EcommerceArticleInformation}
+
+
diff --git a/template/forum/editforuminfo.ftl b/template/forum/editforuminfo.ftl
new file mode 100644
index 0000000..7ffb7f0
--- /dev/null
+++ b/template/forum/editforuminfo.ftl
@@ -0,0 +1,22 @@
+<#--
+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.
+-->
+
+<#import "bloglib.ftl" as blog/>
+<@blog.renderAncestryPath trail=ancestorList?default([]) endIndexOffset=1/>
+${singleWrapper.renderFormString()}
diff --git a/template/forum/forumPaging.ftl b/template/forum/forumPaging.ftl
new file mode 100644
index 0000000..8879695
--- /dev/null
+++ b/template/forum/forumPaging.ftl
@@ -0,0 +1,48 @@
+<#--
+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 viewIndex = viewIndex?default(0)>
+<#assign lowIndex = viewIndex?int * viewSize?int + 1>
+<#assign highIndex = viewIndex?int * viewSize?int + viewSize>
+<#-- == viewIndex: ${viewIndex} ==viewSize: ${viewSize} ==lowIndex: ${lowIndex}== highIndex: ${highIndex} == ListSize: ${listSize}-->
+<#if forumMessages?has_content && forumMessages?size gt 0>
+ <#assign listSize = forumMessages?size/>
+ <#if highIndex gt listSize><#assign highIndex = listSize>#if>
+
+ <#assign r = listSize / viewSize />
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil(r)>
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int+1} ${uiLabelMap.CommonOf} ${viewIndexMax}
+ <#list 1..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum}
+ #list>
+
+
+ <#if (viewIndex?int >0)>
+ ${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if (listSize?int > 0)>
+ ${lowIndex} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ | ${uiLabelMap.CommonNext}
+ #if>
+
+
+#if>
diff --git a/template/forum/forums.ftl b/template/forum/forums.ftl
new file mode 100644
index 0000000..cf849a3
--- /dev/null
+++ b/template/forum/forums.ftl
@@ -0,0 +1,33 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.ProductBrowseForums}
+
+
+
\ No newline at end of file
diff --git a/template/forum/messageDisplay.ftl b/template/forum/messageDisplay.ftl
new file mode 100644
index 0000000..3536d16
--- /dev/null
+++ b/template/forum/messageDisplay.ftl
@@ -0,0 +1,53 @@
+<#--
+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.
+-->
+ <#-- Thread content id equals contentId if contentAssocTypeId equals PUBLISH_LINK, else threadContentId = ownerContentId -->
+ <#assign threadContentId = forumMessage.contentId/>
+ <#if forumMessage.caContentAssocTypeId == "RESPONSE">
+ <#assign threadContentId = forumMessage.ownerContentId!/>
+ #if>
+ <#if rsp??>
+ <#assign contentId = rsp.contentId>
+ <#else>
+ <#assign contentId = forumMessage.contentId>
+ #if>
+
+ ${uiLabelMap.CommonTitle}: ${forumMessage.contentName!} ${uiLabelMap.CommonBy}:${forumMessage.createdByUserLogin!} ${uiLabelMap.CommonAt}: ${(forumMessage.createdDate.toString().substring(0,16))!}
+
${uiLabelMap.CommonView}
+
+
+ ${forumMessage.description!}
+
+
+ <#--
+ <#assign result = dispatcher.runSync("getPublicForumMessage", Static["org.ofbiz.base.util.UtilMisc"].toMap("contentId", contentId, "userLogin", userLogin))/>
+ <#if (result.resultData)??>
+
+ ${uiLabelMap.CommonTitle}: ${result.resultData.content.description!} ${uiLabelMap.CommonBy}:${result.resultData.content.createdByUserLogin} ${uiLabelMap.CommonAt}: ${result.resultData.content.createdDate.toString().substring(0,16)}
+
${uiLabelMap.PartyReply}
+
+
+ <#if result.resultData.electronicText??>
+ ${result.resultData.electronicText.textData}
+ #if>
+
+
+ <#else>
+ ${result.errorMessage!}
+ #if>
+ -->
diff --git a/template/forum/mostrecent.ftl b/template/forum/mostrecent.ftl
new file mode 100644
index 0000000..ad6c569
--- /dev/null
+++ b/template/forum/mostrecent.ftl
@@ -0,0 +1,74 @@
+<#--
+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.
+-->
+
+
+
+
diff --git a/template/forum/showblog.ftl b/template/forum/showblog.ftl
new file mode 100644
index 0000000..8650901
--- /dev/null
+++ b/template/forum/showblog.ftl
@@ -0,0 +1,162 @@
+<#--
+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.
+-->
+
+<#import "/includes/bloglib.ftl" as blog/>
+
+
+
${uiLabelMap.EcommerceFromSite}:
+
+<@renderSiteAncestryPath trail=siteAncestorList?default([])/>
+<#if trailList?? && 1 < trailList?size >
+
${uiLabelMap.EcommerceFromParentArticle}:
+#if>
+<#if trailList?has_content>
+ <@blog.renderAncestryPath trail=trailList startIndex=1 endIndexOffset=1 />
+ <#if 0 < trailList?size >
+ <#assign pair=trailList[trailList?size - 1]/>
+ <#assign pair0 = pair[0]!>
+ <#assign pair1 = pair[1]!>
+
+
${uiLabelMap.EcommerceContentFor} ${pair1!}[${pair0!}]:
+ #if>
+<#else>
+#if>
+
+<#assign thisContentId=subContentId!>
+<#if !thisContentId?has_content>
+ <#assign thisContentId=contentId!>
+#if>
+
+
+
+
+ <@renderSubContentCache subContentId=thisContentId />
+
+
+<@checkPermission subContentId=subContentId targetOperation="CONTENT_CREATE|CONTENT_RESPOND" contentPurposeList="RESPONSE" >
+${uiLabelMap.EcommerceRespond}
+@checkPermission>
+
+
+
+
+
+
+<#--
+<@checkPermission mode="not-equals" subContentId=subContentId targetOperation="CONTENT_CREATE|CONTENT_RESPOND" contentPurposeList="RESPONSE" >
+ ${permissionErrorMsg!}
+@checkPermission>
+-->
+
+
+
+ ${uiLabelMap.EcommerceResponses}
+<@loopSubContent contentAssocTypeId="RESPONSE" contentId=subContentId mapKey=""
+ pickWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\") && mapKey == null"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")">
+ <@traverseSubContentCache contentAssocTypeId="RESPONSE"
+ pickWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")"
+ wrapTemplateId=""
+ >
+ <#assign indentStr=indent?default("0")/>
+ <#assign indent=indentStr?number/>
+ <#if 1 < indent >
+ <#assign fillRange=1..indent/>
+ <#assign indentFill=""/>
+ <#list fillRange as i>
+ <#assign indentFill = indentFill + " " />
+ #list>
+ <#assign thisContentId = ""/>
+ <#if nodeTrailCsv??>
+ <#assign idList = nodeTrailCsv?split(",")/>
+ <#if 0 < idList?size >
+ <#assign thisContentId = idList?last>
+ #if>
+ #if>
+ <#if content??>
+
+
+ ${indentFill}
+ ${uiLabelMap.CommonView}
+ ${content.contentId!}-${content.description!}
+
+
+ #if>
+ #if>
+ @traverseSubContentCache>
+@loopSubContent>
+<@wrapSubContentCache subContentId=subContentId wrapTemplateId="WRAP_NEXT_PREV" >
+@wrapSubContentCache>
+
+
+
+
+
+<#-- not used, will be deleted -->
+<#macro getCurrentContent >
+ <#assign globalNodeTrail=globalNodeTrail/>
+ <#if globalNodeTrail??>
+ <#assign currentNode=globalNodeTrail?last/>
+ <#if currentNode??>
+ <#assign currentValue=currentNode.value/>
+ <#if currentValue??>
+ <@wrapSubContentCache subContentId=currentValue.contentId wrapTemplateId="WRAP_ARTICLE" >
+ <@traverseSubContentCache contentAssocTypeId="SUB_CONTENT"
+ pickWhen="mapKey != null && mapKey.equals(\"ARTICLE\")"
+ returnAfterPickWhen="mapKey != null && mapKey.equals(\"ARTICLE\")"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"_never_\")"
+ wrapTemplateId=""
+ >
+ <#assign description=currentValue.description?default("No description")/>
+${uiLabelMap.CommonDescription}[${currentValue.contentId!}]:${description}
+${uiLabelMap.CommonView}
+ @traverseSubContentCache >
+ @wrapSubContentCache>
+ #if>
+ #if>
+ #if>
+#macro>
+
+<#macro renderSiteAncestryPath trail startIndex=0 >
+ <#assign indent = "">
+ <#assign csv = "">
+ <#assign counter = 0>
+ <#assign len = trail?size>
+
+ <#list trail as webSitePublishPoint>
+ <#if counter < len && startIndex <= counter >
+
+
+ ${indent}
+ ${uiLabelMap.CommonBackTo} ${webSitePublishPoint.templateTitle!}
+ <#assign indent = indent + " ">
+ [${webSitePublishPoint.contentId!}]
+ #if>
+
+ <#assign counter = counter + 1>
+ <#if 20 < counter > <#break/>#if>
+ #list>
+
+#macro>
diff --git a/template/forum/showforum.ftl b/template/forum/showforum.ftl
new file mode 100644
index 0000000..e4de3fe
--- /dev/null
+++ b/template/forum/showforum.ftl
@@ -0,0 +1,22 @@
+<#--
+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.
+-->
+
+<#list forumMessages! as forumMessage>
+ <#include "messageDisplay.ftl">
+#list>
diff --git a/template/forum/showforumarticle.ftl b/template/forum/showforumarticle.ftl
new file mode 100644
index 0000000..bf8a93d
--- /dev/null
+++ b/template/forum/showforumarticle.ftl
@@ -0,0 +1,21 @@
+<#--
+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.
+-->
+
+${contentText}
+
\ No newline at end of file
diff --git a/template/forum/showforumresponse.ftl b/template/forum/showforumresponse.ftl
new file mode 100644
index 0000000..956d70b
--- /dev/null
+++ b/template/forum/showforumresponse.ftl
@@ -0,0 +1,160 @@
+<#--
+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.
+-->
+
+<#import "bloglib.ftl" as blog/>
+
+
{${uiLabelMap.EcommerceFromSite}
+
+<@blog.renderAncestryPath trail=ancestorList?default([]) endIndexOffset=1 />
+<#-- Do this so that we don't have to find the content twice (again in renderSubContent) -->
+<#assign lastNode = globalNodeTrail!?last/>
+<#if lastNode?has_content>
+ <#assign subContent=lastNode.value/>
+<#else>
+<#assign subContent = delegator.findOne("Content", Static["org.ofbiz.base.util.UtilMisc"].toMap("contentId", subContentId), true)/>
+<#assign dummy = globalNodeTrail.add(lastNode)/>
+#if>
+
+
${uiLabelMap.EcommerceContentFor} [${subContentId}] ${subContent.contentName!} - ${subContent.description!}:
+
+<#assign thisContentId=subContentId!>
+<#if !thisContentId?has_content>
+ <#assign thisContentId=contentId!>
+#if>
+
+
+
+
+ <@renderSubContentCache subContentId=thisContentId />
+
+
+<@checkPermission subContentId=subContentId targetOperation="HAS_USER_ROLE" contentPurposeList="RESPONSE" >
+${uiLabelMap.EcommerceRespond}
+@checkPermission>
+
+
+
+
+
+
+<#--
+<@checkPermission mode="not-equals" subContentId=subContentId targetOperation="CONTENT_CREATE|CONTENT_RESPOND" contentPurposeList="RESPONSE" >
+ ${permissionErrorMsg!}
+@checkPermission>
+-->
+
+
+
+ ${uiLabelMap.EcommerceResponses}
+<@loopSubContent contentAssocTypeId="RESPONSE" contentId=subContentId mapKey=""
+ pickWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\") && mapKey == null"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")">
+ <@traverseSubContentCache contentAssocTypeId="RESPONSE"
+ pickWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"RESPONSE\")"
+ wrapTemplateId="">
+ <#assign indentStr=indent?default("0")/>
+ <#assign indent=indentStr?number/>
+ <#if 1 < indent >
+ <#assign fillRange=1..indent/>
+ <#assign indentFill=""/>
+ <#list fillRange as i>
+ <#assign indentFill = indentFill + " " />
+ #list>
+ <#assign thisContentId = ""/>
+ <#if nodeTrailCsv??>
+ <#assign idList = nodeTrailCsv?split(",")/>
+ <#if 0 < idList?size >
+ <#assign thisContentId = idList?last>
+ #if>
+ #if>
+ <#if content??>
+
+
+ ${indentFill}
+ ${uiLabelMap.CommonView}
+ ${content.contentId!}-${content.description!}
+
+
+ #if>
+ #if>
+ @traverseSubContentCache>
+@loopSubContent>
+
+<#--
+<@wrapSubContentCache subContentId=subContentId wrapTemplateId="WRAP_NEXT_PREV" >
+@wrapSubContentCache >
+-->
+
+
+
+
+
+
+<#-- not used, will be deleted -->
+<#macro getCurrentContent >
+ <#assign globalNodeTrail=globalNodeTrail/>
+ <#if globalNodeTrail??>
+ <#assign currentNode=globalNodeTrail?last/>
+ <#if currentNode??>
+ <#assign currentValue=currentNode.value/>
+ <#if currentValue??>
+ <@wrapSubContentCache subContentId=currentValue.contentId wrapTemplateId="WRAP_ARTICLE" >
+ <@traverseSubContentCache contentAssocTypeId="SUB_CONTENT"
+ pickWhen="mapKey != null && mapKey.equals(\"ARTICLE\")"
+ returnAfterPickWhen="mapKey != null && mapKey.equals(\"ARTICLE\")"
+ followWhen="contentAssocTypeId != null && contentAssocTypeId.equals(\"_never_\")"
+ wrapTemplateId=""
+ >
+ <#assign description=currentValue.description?default("No description")/>
+${uiLabelMap.CommonDescription}[${currentValue.contentId!}]:${description}
+${uiLabelMap.CommonView}
+ @traverseSubContentCache >
+ @wrapSubContentCache>
+ #if>
+ #if>
+ #if>
+#macro>
+
+<#macro renderSiteAncestryPath trail startIndex=0 >
+ <#assign indent = "">
+ <#assign csv = "">
+ <#assign counter = 0>
+ <#assign len = trail?size>
+
+ <#list trail as webSitePublishPoint>
+ <#if counter < len && startIndex <= counter >
+
+
+ ${indent}
+ ${uiLabelMap.CommonBackTo} ${webSitePublishPoint.templateTitle!}
+ <#assign indent = indent + " ">
+ [${webSitePublishPoint.contentId!}]
+ #if>
+
+ <#assign counter = counter + 1>
+ <#if 20 < counter > <#break/>#if>
+ #list>
+
+#macro>
diff --git a/template/images/blog.css b/template/images/blog.css
new file mode 100644
index 0000000..5524b8d
--- /dev/null
+++ b/template/images/blog.css
@@ -0,0 +1,241 @@
+/*
+ * 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.
+ */
+
+.blogs {
+position: inherit;
+width: inherit;
+font-size: 100%;
+text-decoration: none;
+font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+.treeHeader, .treeHeaderCurrent {
+color: black;
+font-weight: bold;
+text-decoration: none;
+}
+
+.treeHeaderCurrent {
+color: black;
+font-weight: bold;
+}
+
+.treeHeaderOutline {
+color: black;
+font-weight: normal;
+}
+
+.treeHeaderPage {
+color: blue;
+font-weight: bold;
+text-decoration: none;
+}
+
+.treeHeaderSubPage {
+color: blue;
+font-weight: normal;
+text-decoration: none;
+text-align: right;
+width: 100%;
+}
+
+.tocItem {
+color: blue;
+text-decoration: none;
+}
+
+.tocItemCurrent {
+color: black;
+font-weight: bold;
+}
+
+.editwrapper {
+color: black;
+background: #ffffff;
+text-decoration: none;
+margin-left: 12px;
+margin-top: 2px;
+border-top: 1px solid black;
+border-left: 1px solid black;
+}
+
+.contentwrapper {
+color: black;
+background: #ffffff;
+text-decoration: none;
+margin-left: 12px;
+margin-top: 2px;
+}
+
+.floatleft {
+display: inline;
+position: relative;
+vertical-align: text-top;
+/*float: left;*/
+}
+
+.topcentered {
+display: block;
+text-align: center;
+}
+
+/*
+.rightjustify {
+float: right;
+padding-left: 5px;
+display: inline;
+vertical-align: top;
+text-align: right;
+width: 100%;
+height: 100%;
+}
+*/
+.rightjustify {
+display: inline;
+vertical-align: text-top;
+float: right;
+}
+
+.leftjustify {
+display: inline;
+vertical-align: text-top;
+float: left;
+}
+
+.blogheader {
+color: black;
+font-weight: bold;
+text-align: left;
+margin-top: 10px;
+margin-left: 10px;
+}
+
+.blogtext {
+color: #222222;
+font-weight: normal;
+text-align: left;
+margin-left: 20px;
+font-size: 1.0em;
+}
+
+.blogtext:hover {
+background: #fffeee;
+}
+
+.blogtitle, A.blogtitle {
+color: white;
+font-weight: bold;
+text-align: left;
+text-decoration: none;
+display: inline;
+}
+
+A.blogtitle:hover {
+text-decoration: underline;
+}
+
+.blogtitleboxed {
+font-size: 1.1em;
+color: black;
+background: #D4D0C8;
+text-decoration: none;
+border: 1px solid black;
+padding: 4px;
+display: inline;
+}
+
+.bloghr {
+border: 0.1em solid #999999;
+color: white;
+background: #1C334D;
+padding: 4px;
+height: 13px;
+}
+
+.blogwrapper {
+background: #eeeeee;
+padding: 4px;
+margin-top: 6px;
+font-weight: normal;
+text-align: left;
+}
+
+.blogwrapper:hover {
+background: #fffeee;
+}
+
+.blogcontentwrapper {
+background: #f8f8f8;
+font-size: 1.1em;
+border: 1px solid #000000;
+padding: 15px 5px 15px 5px;
+margin-top: 6px;
+margin-bottom: 16px;
+color: black;
+font-weight: normal;
+text-align: left;
+}
+
+.blogcontentwrapper:hover {
+background: #fffeee;
+}
+
+.responseheader, A.responseheader {
+color: #000099;
+font-size: 0.9em;
+font-weight: bold;
+text-align: left;
+text-decoration: none;
+margin-left: 10px;
+}
+
+A.responseheader:hover {
+color: #ff0000;
+text-decoration: underline;
+}
+
+.responsetext {
+color: #222222;
+font-size: 0.75em;
+font-weight: normal;
+text-align: left;
+margin-left: 20px;
+}
+
+.responseTreeWrapper:hover {
+background: #fffeee;
+}
+
+.responseTreeWrapper {
+color: black;
+background: #ffffff;
+font-weight: normal;
+text-align: left;
+text-decoration: none;
+margin-left: 12px;
+margin-top: 2px;
+border-top: 1px solid black;
+border-left: 1px solid black;
+}
+
+.responseSelected {
+background: #BBBBBB;
+border: 1px dashed black;
+}
+
diff --git a/template/images/checkoutProcess.js b/template/images/checkoutProcess.js
new file mode 100644
index 0000000..27afaf9
--- /dev/null
+++ b/template/images/checkoutProcess.js
@@ -0,0 +1,637 @@
+/*
+ * 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.
+ */
+var isCartStepValidate = false;
+var isShipStepValidate = false;
+var isShipOptionStepValidate = false;
+var isBillStepValidate = false;
+
+jQuery(document).ready(function(){
+ // Cart
+ var validateCart = jQuery("#cartForm");
+ validateCart.validate();
+
+ var validateShip = jQuery("#shippingForm");
+ validateShip.validate();
+
+ var validateShipOption = jQuery("#shippingOptionForm");
+ validateShipOption.validate();
+
+ var validateBill = jQuery("#billingForm");
+ validateBill.validate();
+
+ // Goto Edit Cart Panel
+ jQuery('#openCartPanel').click(function() {
+ showEditCartPanel();
+ updateShippingSummary();
+ });
+
+ // Update Shipping Address
+ jQuery('#savePartyAndShippingContact').click(function() {
+ if (validateShip.valid()) {
+ jQuery('#savePartyAndShippingContact').fadeOut('fast');
+ jQuery('#processingShippingOptions').fadeIn('fast');
+ if (createUpdateCustomerAndShippingAddress()){
+ showEditShippingOptionPanel();
+ }
+ jQuery('#processingShippingOptions').fadeOut('fast');
+ jQuery('#savePartyAndShippingContact').fadeIn('fast');
+ }
+ });
+
+ // Goto Edit Shipping panel
+ jQuery('#updateShoppingCart').click(function() {
+ if (validateCart.valid()) {
+ showEditShippingPanel();
+ }
+ });
+ // Goto Edit Shipping Panel
+ jQuery('#openShippingPanel').click(function() {
+ showEditShippingPanel();
+ setShippingOption();
+ });
+
+ // Set Shipping Method to card and goto Billing step
+ jQuery('#saveShippingMethod').click(function() {
+ jQuery('#saveShippingMethod').fadeOut('fast');
+ jQuery('#processingBilling').fadeIn('fast');
+ if (setShippingOption()){
+ showEditBillingPanel();
+ }
+ jQuery('#processingBilling').fadeOut('fast');
+ jQuery('#saveShippingMethod').fadeIn('fast');
+ });
+
+ jQuery('#openShippingOptionPanel').click(function() {
+ showEditShippingOptionPanel();
+ updateBillingSummary();
+ });
+
+ // Billing
+ jQuery('#openBillingPanel').click(function() {
+ showEditBillingPanel();
+ });
+
+ jQuery('#savePaymentAndBillingContact').click(function() {
+ if (validateBill.valid()) {
+ jQuery('#savePaymentAndBillingContact').fadeOut('fast');
+ jQuery('#processingOrderSubmitPanel').fadeIn('fast');
+ if (processBillingAndPayment()) {
+ showOrderSubmitPanel();
+ }
+ jQuery('#processingOrderSubmitPanel').fadeOut('fast');
+ jQuery('#savePaymentAndBillingContact').fadeIn('fast');
+ }
+ });
+
+ // For Billing Address Same As Shipping
+ jQuery('#useShippingAddressForBilling').click(function() {
+ useShippingAddressForBillingToggle();
+ validateBill.valid();
+ });
+
+ // Initiate Observing Edit Cart Events
+ initCartProcessObservers();
+
+ jQuery('#processOrderButton').click(function(){
+ processOrder();
+ });
+
+ if (jQuery('#shippingForm').length) {
+ // Get associate states for Shipping Information
+ jQuery('#shipToCountryGeoId').change(function(){
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ });
+ if (jQuery('#userLoginId').length) {
+ var stateValue = jQuery('#shipToStateProvinceGeoId').val();
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ jQuery('#shipToStateProvinceGeoId').val(stateValue);
+ stateValue = jQuery('#billToStateProvinceGeoId').val();
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ jQuery('#billToStateProvinceGeoId').val(stateValue);
+ } else {
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ }
+ }
+ if (jQuery('#billingForm').length) {
+ // Get associate states for Billing Information
+ jQuery('#billToCountryGeoId').change(function() {
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ });
+ }
+});
+
+// Check server side error
+function getServerError(data) {
+ var serverErrorHash = [];
+ var serverError = "";
+ if (data._ERROR_MESSAGE_LIST_ != undefined) {
+ serverErrorHash = data._ERROR_MESSAGE_LIST_;
+ jQuery.each(serverErrorHash, function(i, error) {
+ var encodedErrorMessage = jQuery('
').text(error.message).html();
+ serverError += encodedErrorMessage + ' ';
+ });
+ }
+ if (data._ERROR_MESSAGE_ != undefined) {
+ serverError = jQuery('
').text(data._ERROR_MESSAGE_).html();
+ }
+ return serverError;
+}
+
+// Begin Show/Hide Step panels
+
+function hideEditCartPanel() {
+ if (jQuery('#editCartPanel').is(':visible')) {
+ jQuery('#editCartPanel').slideUp();
+ jQuery('#cartSummaryPanel').slideDown();
+ }
+}
+function hideEditShippingPanel() {
+ if (jQuery('#editShippingPanel').is(':visible')) {
+ jQuery('#editShippingPanel').slideUp();
+ jQuery('#shippingSummaryPanel').slideDown();
+ }
+}
+function hideEditShippingOptionPanel() {
+ if (jQuery('#editShippingOptionPanel').is(':visible')) {
+ jQuery('#editShippingOptionPanel').slideUp();
+ jQuery('#shippingOptionSummaryPanel').slideDown();
+ }
+}
+function hideEditBillingPanel() {
+ if (jQuery('#editBillingPanel').is(':visible')) {
+ jQuery('#editBillingPanel').slideUp();
+ jQuery('#billingSummaryPanel').slideDown();
+ }
+}
+function hideOrderSubmitPanel() {
+ if (jQuery('#orderSubmitPanel').is(':visible')) {
+ jQuery('#orderSubmitPanel').slideUp();
+ jQuery('#processingOrderButton').slideDown();
+
+ }
+}
+
+function showEditCartPanel() {
+ if (!jQuery('#editCartPanel').is(':visible') ) {
+ jQuery('#cartSummaryPanel').slideUp();
+ hideEditShippingPanel();
+ hideEditShippingOptionPanel();
+ hideEditBillingPanel();
+ hideOrderSubmitPanel();
+ jQuery('#editCartPanel').slideDown();
+ }
+}
+
+function showEditShippingPanel() {
+ if (!jQuery('#editShippingPanel').is(':visible') ) {
+ jQuery('#shippingSummaryPanel').slideUp();
+ hideEditCartPanel();
+ hideEditShippingOptionPanel();
+ hideEditBillingPanel();
+ hideOrderSubmitPanel();
+ jQuery('#editShippingPanel').slideDown();
+
+ }
+}
+
+function showEditShippingOptionPanel() {
+ if (!jQuery('#editShippingOptionPanel').is(':visible') ) {
+ jQuery('#shippingOptionSummaryPanel').slideUp();
+ hideEditCartPanel();
+ hideEditShippingPanel();
+ hideEditBillingPanel();
+ hideOrderSubmitPanel();
+ jQuery('#editShippingOptionPanel').slideDown();
+ }
+}
+
+function showEditBillingPanel() {
+ if (!jQuery('#editBillingPanel').is(':visible') ) {
+ jQuery('#billingSummaryPanel').slideUp();
+ hideEditCartPanel();
+ hideEditShippingPanel();
+ hideEditShippingOptionPanel();
+ hideOrderSubmitPanel();
+ jQuery('#editBillingPanel').slideDown();
+ }
+ if (jQuery('#shipToContactMechId').val() != jQuery('#billToContactMechId').val()) {
+ jQuery('#useShippingAddressForBilling').val('false');
+ jQuery('#billingAddress').slideDown();
+ jQuery('#useShippingAddressForBilling').val('N');
+ }
+}
+
+function showOrderSubmitPanel() {
+ if (!jQuery('#orderSubmitPanel').is(':visible')) {
+ hideEditCartPanel();
+ hideEditShippingPanel();
+ hideEditShippingOptionPanel();
+ hideEditBillingPanel();
+ jQuery('#orderSubmitPanel').slideDown();
+ }
+}
+
+// End Show/Hide Step panels
+
+function createUpdateCustomerAndShippingAddress() {
+ var result = false;
+ jQuery.ajax({
+ url: 'createUpdateShippingAddress',
+ type: 'POST',
+ async: false,
+ data: jQuery('#shippingForm').serialize(),
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ jQuery('#shippingFormServerError').fadeOut('fast');
+ // Process Shipping data response.
+ jQuery('#shipToPartyId').val(json.partyId);
+ jQuery('#billToPartyId').val(json.partyId);
+ jQuery('#shipToContactMechId').val(json.contactMechId);
+ jQuery('#shipToPhoneContactMechId').val(json.shipToPhoneContactMechId);
+ jQuery('#emailContactMechId').val(json.emailContactMechId);
+ //jQuery('#completedShippingMethod').html(json.shippingDescription);
+ updateShippingSummary();
+ getShipOptions();
+ result = true;
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ result = false;
+ }
+ },
+ error: function(error) {
+ if (error != "") {
+ jQuery('#shippingFormServerError').html(error);
+ }
+ result = false;
+ }
+ });
+ return result;
+}
+
+function getShipOptions() {
+ var shipOptions = null;
+ var optionList = [];
+ var result = false;
+ if (jQuery('#shipMethod').val() == "" || jQuery('#shipMethod').val() == null) {
+ jQuery.ajax({
+ url: 'getShipOptions',
+ type: 'POST',
+ async: false,
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ jQuery('#shippingFormServerError').fadeOut('fast');
+ isShipStepValidate = true;
+ shipOptions = json.shippingOptions;
+ var shipMethod = jQuery('#shipMethod');
+ shipMethod.find("option").remove();
+ jQuery.each(shipOptions, function(shipOption) {
+ if (this.productStoreShipMethId){
+ shipMethod.append(jQuery(" " + this.shippingDesc + " "));
+ } else {
+ shipMethod.append(jQuery(" " + this.shippingDesc + " "));
+ }
+ });
+ result = true;
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ result = false;
+ }
+ },
+ error: function(error) {
+ if (error != "") {
+ jQuery('#shippingFormServerError').fadeIn('fast');
+ jQuery('#shippingFormServerError').html(error);
+ isShipStepValidate = false;
+ }
+ result = false;
+ }
+ });
+ }
+ return result;
+}
+
+// Shipping option
+function setShippingOption() {
+ var shipTotal = null;
+ var shipMethod = null;
+ var result = false;
+ jQuery('#shippingOptionFormServerError').fadeOut('fast');
+ jQuery.ajax({
+ url: 'setShippingOption',
+ type: 'POST',
+ async: false,
+ data: jQuery('#shippingOptionForm').serialize(),
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ shipTotal = json.shippingTotal;
+ isShipOptionStepValidate = true;
+ jQuery('#selectedShipmentOption').html(json.shippingDescription);
+ //jQuery('#shippingDescription').value = json.shippingDescription;
+ //jQuery('#shippingTotal').val(json.shippingTotal);
+ //jQuery('#cartGrandTotal').val(json.cartGrandTotal);
+ //jQuery('#totalSalesTax').val(json.totalSalesTax);
+ result = true;
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ result = false;
+ }
+ },
+ error: function(error) {
+ if(error != "") {
+ jQuery('#shippingOptionFormServerError').fadeIn('fast');
+ jQuery('#shippingOptionFormServerError').html(error);
+ isShipOptionStepValidate = false;
+ }
+ result = false;
+ }
+ });
+ updateCartData();
+ return result;
+}
+// Billing
+function useShippingAddressForBillingToggle() {
+ if (jQuery('#useShippingAddressForBilling').is(':checked') ) {
+ jQuery('#billToAddress1').val(jQuery('#shipToAddress1').val());
+ jQuery('#billToAddress2').val(jQuery('#shipToAddress2').val());
+ jQuery('#billToCity').val(jQuery('#shipToCity').val());
+ jQuery('#billToPostalCode').val(jQuery('#shipToPostalCode').val());
+ jQuery('#billToCountryGeoId').val(jQuery('#shipToCountryGeoId').val());
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId','advice-required-billToStateProvinceGeoId','billToStates');
+ jQuery('#useShippingAddressForBilling').val("Y");
+ jQuery('#billToStateProvinceGeoId').val(jQuery('#shipToStateProvinceGeoId').val());
+ jQuery('#billingAddress').slideUp();
+ } else {
+ jQuery('#billingAddress').slideDown();
+ jQuery('#useShippingAddressForBilling').val("N");
+ }
+}
+function processBillingAndPayment() {
+ var result = false;
+ jQuery.ajax({
+ url: 'createUpdateBillingAndPayment',
+ type: 'POST',
+ data: jQuery('#billingForm').serialize(),
+ async: false,
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ jQuery('#billingFormServerError').fadeOut('fast');
+ isBillStepValidate = true;
+ jQuery('#billToContactMechId').val(json.contactMechId);
+ jQuery('#paymentMethodId').val(json.paymentMethodId);
+ jQuery('#billToPhoneContactMechId').val(json.billToPhoneContactMechId);
+ updateBillingSummary();
+ result = true;
+ } else {
+ jQuery('#billingFormServerError').html(serverError);
+ result = false;
+ }
+ },
+ error: function(error) {
+ if(error != "") {
+ jQuery('#billingFormServerError').fadeIn('fast');
+ jQuery('#billingFormServerError').html(error);
+ isBillStepValidate = false;
+ }
+ result = false;
+ }
+ });
+ return result;
+
+}
+function initCartProcessObservers() {
+ var cartForm = jQuery('#cartForm');
+ jQuery('#productPromoCode').change(function() {
+ addPromoCode();
+ });
+ jQuery('#updateShoppingCart').click(function() {
+ showEditShippingPanel();
+ });
+ jQuery('#openCartPanel').click(function() {
+ showEditCartPanel();
+ updateShippingSummary();
+ });
+ var inputs = cartForm.find('input[type=text]');
+ inputs.each(function(e) {
+ if(this.id != 'productPromoCode' && this.id != undefined) {
+ jQuery(this).change(function() {
+ cartItemQtyChanged(this);
+ });
+ }
+ });
+ var links = jQuery("#cartForm a[id^='removeItemLink_']");
+ jQuery.each(links, function() {
+ jQuery(this).bind('click', function(){
+ removeItem(this);
+ });
+ });
+ if (jQuery('#initializedCompletedCartDiscount').length && jQuery('#initializedCompletedCartDiscount').val() == 0) {
+ jQuery('#completedCartDiscountRow').hide();
+ }
+}
+function addPromoCode() {
+ jQuery.ajax({
+ url: 'silentAddPromoCode',
+ type: 'POST',
+ data: {"productPromoCodeId" : jQuery('#productPromoCode').val()},
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ jQuery('#cartFormServerError').fadeOut('fast');
+ updateCartData();
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ result = false;
+ }
+ },
+ error: function(error) {
+ if(error != "") {
+ jQuery('#cartFormServerError').fadeIn('fast');
+ jQuery('#cartFormServerError').html(error);
+ }
+ }
+ });
+}
+
+function getProductLineItemIndex(event, productId) {
+ var itemIndex = null;
+ var productIdParam = "productId=" + productId;
+ var formValues = jQuery('#cartForm').serialize() + "&" + productIdParam;
+ jQuery.ajax({
+ url: 'getShoppingCartItemIndex',
+ type: 'POST',
+ async: false,
+ data: formValues,
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ itemIndex = json.itemIndex;
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ }
+ }
+ });
+ return itemIndex;
+}
+
+function removeItem(elmt) {
+ var removeElement = elmt;
+ var elementId = removeElement.id;
+ var qtyId = elementId.replace('removeItemLink_', 'qty_');
+ var productIdElementId = elementId.replace('removeItemLink_', 'cartLineProductId_');
+ var productId = jQuery("#" + productIdElementId).val();
+ var itemIndex = getProductLineItemIndex(elmt, productId);
+ var formValues = "update_" + itemIndex + "= 0";
+ if (jQuery(qtyId).val() == '' || isNaN(jQuery(qtyId).val())) {
+ jQuery(qtyId).val("0");
+ }
+ updateCartData(qtyId, formValues, 0, itemIndex);
+}
+
+function cartItemQtyChanged(elmt) {
+ var qtyElement = elmt;
+ var elementId = qtyElement.id;
+ var productIdElementId = elementId.replace('qty_', 'cartLineProductId_');
+ var productId = jQuery("#" + productIdElementId).val();
+ if (jQuery(qtyElement).val() && jQuery(qtyElement).val() >= 0 && !isNaN(jQuery(qtyElement).val())) {
+ var itemIndex = getProductLineItemIndex(elmt, productId);
+ qtyParam = "update_" + itemIndex +"="+jQuery(qtyElement).val();
+ var formValues = jQuery('#cartForm').serialize() + '&' + qtyParam;
+ updateCartData(elementId, formValues, qtyElement.value, itemIndex);
+ }
+}
+
+function updateCartData(elementId, formValues, itemQty, itemIndex) {
+ jQuery.ajax({
+ url: 'cartItemQtyUpdate',
+ type: 'POST',
+ data: formValues,
+ success: function(json) {
+ var serverError = getServerError(json);
+ if (!serverError) {
+ if (json.totalQuantity == 0) {
+ jQuery('#emptyCartCheckoutPanel').show();
+ jQuery('#checkoutPanel').hide();
+ jQuery('#microCartNotEmpty').hide();
+ jQuery('#microCartEmpty').show();
+ jQuery('#quickCheckoutEnabled').hide();
+ jQuery('#quickCheckoutDisabled').show();
+ jQuery('#onePageCheckoutEnabled').hide();
+ jQuery('#onePageCheckoutDisabled').show();
+ jQuery('#googleCheckoutEnabled').hide();
+ jQuery('#googleCheckoutDisabled').show();
+ jQuery('#microCartPayPalCheckout').hide();
+ } else {
+ // Replace whole cart panel with updated cart values for updating line item in case of gift item is added or remove in cart after applying coupon code
+ // No need to calculate individual value for shopping cart when whole cart is updating
+ jQuery.ajax({
+ url: 'UpdateCart',
+ type: 'POST',
+ cache: false,
+ success: function(data) {
+ jQuery('#cartPanel').html(data);
+ initCartProcessObservers();
+ }
+ });
+ }
+ } else {
+ jQuery('#shippingFormServerError').html(serverError);
+ result = false;
+ }
+ }
+ });
+}
+function processOrder() {
+ jQuery('#processOrderButton').disabled = true ;
+ jQuery('#processOrderButton').fadeOut('fast');
+ jQuery('#processingOrderButton').fadeIn('fast');
+ jQuery('#orderSubmitForm').submit();
+}
+function getAssociatedBillingStateList(formName, divId) {
+ var optionList = [];
+ jQuery.ajax({
+ url: "getAssociatedStateList",
+ data: jQuery(formName).serialize(),
+ async: false,
+ success: function(transport) {
+ stateList = data.stateList;
+ var billingStates = jQuery("#" + divId);
+ billingStates.find("option").remove();
+ jQuery.each(stateList, function(state) {
+ geoVolues = this.split(': ');
+ billingStates.append(jQuery("" + geoVolues[0] + " "));
+ });
+ }
+ });
+}
+
+function updateShippingSummary() {
+ var fullName = jQuery('#firstName').val() + " " +jQuery('#lastName').val();
+ var extension = "";
+ if (jQuery('#shipToExtension').val()) {
+ extension = "-" + jQuery('#shipToExtension').val();
+ }
+ var shippingContactPhoneNumber = jQuery('#shipToCountryCode').val()+ "-" + jQuery('#shipToAreaCode').val()
+ + "-" + jQuery('#shipToContactNumber').val() + extension;
+ jQuery('#completedShipToAttn').html("Attn: " + fullName);
+ jQuery('#completedShippingContactNumber').html(shippingContactPhoneNumber);
+ jQuery('#completedEmailAddress').html(jQuery('#emailAddress').val());
+ jQuery('#completedShipToAddress1').html(jQuery('#shipToAddress1').val());
+ jQuery('#completedShipToAddress2').html(jQuery('#shipToAddress2').val());
+ if (jQuery('#shipToStateProvinceGeoId').val() == "_NA_") {
+ var shipToGeo = jQuery('#shipToCity').val()+", "+jQuery('#shipToCountryGeoId').val()+" "+jQuery('#shipToPostalCode').val();
+ }
+ else {
+ var shipToGeo = jQuery('#shipToCity').val()+","+jQuery('#shipToStateProvinceGeoId').val() +" "+jQuery('#shipToCountryGeoId').val()+" "+jQuery('#shipToPostalCode').val();
+ }
+ jQuery('#completedShipToGeo').html(shipToGeo);
+ // set shipToContactMechId in Billing form.
+ jQuery('#shipToContactMechIdInBillingForm').val(jQuery('#shipToContactMechId').val());
+}
+
+function updateBillingSummary() {
+ var fullName = jQuery('#firstNameOnCard').val() + " " +jQuery('#lastNameOnCard').val();
+ jQuery('#completedBillToAttn').html("Attn: " + fullName);
+ var extension = "";
+ if (jQuery('#billToExtension').val()) {
+ extension = "-" + jQuery('#billToExtension').val();
+ }
+ var billToPhoneNumber = jQuery('#billToCountryCode').val() + "-" + jQuery('#billToAreaCode').val() + "-" + jQuery('#billToContactNumber').val() + extension;
+ jQuery('#completedBillToPhoneNumber').html(billToPhoneNumber);
+ var cardNumber = "CC#:XXXXXXXXXXXX"+jQuery('#cardNumber').val().replace('-','').slice(12,16);
+ jQuery('#completedCCNumber').html(cardNumber);
+ var expiryDate = "Expires:"+jQuery('#expMonth').val()+"/"+jQuery('#expYear').val();
+ jQuery('#completedExpiryDate').html(expiryDate);
+ jQuery('#completedBillToAddress1').html(jQuery('#billToAddress1').val());
+ jQuery('#completedBillToAddress2').html(jQuery('#billToAddress2').val());
+ if (jQuery('#billToStateProvinceGeoId').val() == "_NA_") {
+ var billToGeo = jQuery('#billToCity').val()+", "+jQuery('#billToCountryGeoId').val()+" "+jQuery('#billToPostalCode').val();
+ }
+ else {
+ var billToGeo = jQuery('#billToCity').val()+", "+jQuery('#billToStateProvinceGeoId').val() +" "+jQuery('#billToCountryGeoId')+" "+jQuery('#billToPostalCode').val();
+ }
+ jQuery('#completedBillToGeo').html(billToGeo);
+ jQuery('#paymentMethod').html(jQuery('#paymentMethodTypeId').val());
+ jQuery('#billToContactMechIdInShipingForm').val(jQuery('#billToContactMechId'));
+}
+
diff --git a/template/images/productAdditionalView.js b/template/images/productAdditionalView.js
new file mode 100644
index 0000000..a028a43
--- /dev/null
+++ b/template/images/productAdditionalView.js
@@ -0,0 +1,56 @@
+/*
+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.
+*/
+
+imgView = {
+ init: function() {
+ if (document.getElementById) {
+ allAnchors = document.getElementsByTagName('a');
+ if (allAnchors.length) {
+ for (var i = 0; i < allAnchors.length; i++) {
+ if (allAnchors[i].getAttributeNode('swapDetail') && allAnchors[i].getAttributeNode('swapDetail').value != '') {
+ allAnchors[i].onmouseover = imgView.showImage;
+ allAnchors[i].onmouseout = imgView.showDetailImage;
+ }
+ }
+ }
+ }
+ },
+ showDetailImage: function() {
+ var mainImage = document.getElementById('detailImage');
+ mainImage.src = document.getElementById('originalImage').value;
+ return false;
+ },
+ showImage: function() {
+ var mainImage = document.getElementById('detailImage');
+ mainImage.src = this.getAttributeNode('swapDetail').value;
+ return false;
+ },
+ addEvent: function(element, eventType, doFunction, useCapture) {
+ if (element.addEventListener) {
+ element.addEventListener(eventType, doFunction, useCapture);
+ return true;
+ }else if (element.attachEvent) {
+ var r = element.attachEvent('on' + eventType, doFunction);
+ return r;
+ }else {
+ element['on' + eventType] = doFunction;
+ }
+ }
+}
+jQuery(document).ready(imgView.init);
diff --git a/template/images/profile.js b/template/images/profile.js
new file mode 100644
index 0000000..0c34862
--- /dev/null
+++ b/template/images/profile.js
@@ -0,0 +1,328 @@
+/*
+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.
+*/
+
+jQuery(document).ready( function() {
+
+ // register a new user/customer
+ if (document.getElementById('newUserForm')) {
+ jQuery("#newUserForm").validate();
+
+ jQuery("#emailAddress").change(setUserNameFromEmail);
+ useShippingAddressAsBillingToggle();
+
+ jQuery("#useShippingAddressForBilling").click(useShippingAddressAsBillingToggle);
+ jQuery("#submitNewUserForm").click(submitValidNewUser);
+ // Get associate states for Shipping Information
+ jQuery("#shipToCountryGeoId").change( function(){
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ });
+ // Get associate states for Billing Information
+ jQuery("#billToCountryGeoId").change( function(){
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ });
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ }
+
+ // edit user information form validation
+ if (document.getElementById('editUserForm')) {
+ jQuery("#editUserForm").validate();
+ }
+
+ // add Address validation
+ if (document.getElementById('addAddress')) {
+ jQuery("#createPostalAddressForm").validate();
+ }
+
+ // special validation on blur for phone number fields
+ if (document.getElementById('shipToPhoneRequired')) {
+ jQuery("#shipToCountryCode").blur( function() {
+ validatePhoneNumber('shipToPhoneRequired', 'shipToCountryCode', 'shipToAreaCode', 'shipToContactNumber');
+ });
+ jQuery("#shipToAreaCode").blur( function() {
+ validatePhoneNumber('shipToPhoneRequired', 'shipToAreaCode', 'shipToCountryCode', 'shipToContactNumber');
+ });
+ jQuery("#shipToContactNumber").blur( function() {
+ validatePhoneNumber('shipToPhoneRequired', 'shipToContactNumber', 'shipToCountryCode', 'shipToAreaCode');
+ });
+ }
+ if (document.getElementById('billToPhoneRequired')) {
+ jQuery("#billToCountryCode").blur( function() {
+ validatePhoneNumber('billToPhoneRequired', 'billToCountryCode', 'billToAreaCode', 'billToContactNumber');
+ });
+ jQuery("#billToAreaCode").blur( function() {
+ validatePhoneNumber('billToPhoneRequired', 'billToAreaCode', 'billToCountryCode', 'billToContactNumber');
+ });
+ jQuery("#billToContactNumber").blur( function() {
+ validatePhoneNumber('billToPhoneRequired', 'billToContactNumber', 'billToCountryCode', 'billToAreaCode');
+ });
+ }
+
+ // postal address validation and geo autocomplete
+ if (document.getElementById('createPostalAddressForm')) {
+ jQuery("#createPostalAddressForm").validate();
+
+ // Get associate states for Postal Address Information
+ jQuery("#countryGeoId").change( function() {
+ getAssociatedStateList('countryGeoId', 'stateProvinceGeoId', 'advice-required-stateProvinceGeoId', 'states');
+ });
+ getAssociatedStateList('countryGeoId', 'stateProvinceGeoId', 'advice-required-stateProvinceGeoId', 'states');
+ }
+ if (document.getElementById('editBillToPostalAddress')) {
+ // Get associate states for Billing Information
+ jQuery("#billToCountryGeoId").change( function() {
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ });
+ if(document.getElementById('billToStateProvinceGeoId').value == "_NA_"){
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ } else {
+ stateValue = document.getElementById('billToStateProvinceGeoId').value;
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ document.getElementById('billToStateProvinceGeoId').value = stateValue;
+ }
+ }
+ if (document.getElementById ('editShipToPostalAddress')) {
+ // Get associate states for Shipping Information
+ jQuery("#shipToCountryGeoId").change( function() {
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ });
+ if(document.getElementById('shipToStateProvinceGeoId').value == "_NA_"){
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ } else {
+ var stateValue = document.getElementById('shipToStateProvinceGeoId').value;
+ getAssociatedStateList('shipToCountryGeoId', 'shipToStateProvinceGeoId', 'advice-required-shipToStateProvinceGeoId', 'shipToStates');
+ document.getElementById('shipToStateProvinceGeoId').value = stateValue;
+ }
+ }
+});
+
+/*
+ * This function is used for validation of Phone number with only 1 error message instead of multiple (for eg: required) on label.
+ * It takes following parameters :-
+ * 1) errorDivId : div to display error,
+ * 2) focusedTextId : Text box, last focused,
+ * 3) textToCheck1, textToCheck2 : Other text boxes to be check.
+ */
+function validatePhoneNumber(errorDivId, focusedTextId, textToCheck1, textToCheck2) {
+ if ((document.getElementById(focusedTextId).value == "")) {
+ jQuery("#" + errorDivId).fadeIn("fast");
+ } else if ((document.getElementById(textToCheck1).value != "") && (document.getElementById(textToCheck2).value != "" )) {
+ jQuery("#" + errorDivId).fadeOut("fast");
+ }
+}
+
+function submitValidNewUser() {
+
+ validatePhoneNumber('shipToPhoneRequired', 'shipToContactNumber', 'shipToCountryCode', 'shipToAreaCode');
+ validatePhoneNumber('billToPhoneRequired', 'billToContactNumber', 'billToCountryCode', 'billToAreaCode');
+ if (jQuery("#newUserForm").valid()) {
+ document.getElementById('newUserForm').submit();
+ }
+}
+
+function submitValidEditUser() {
+ document.getElementById('editUserForm').submit();
+}
+
+function submitValidPostalAddress() {
+ document.getElementById('createPostalAddressForm').submit();
+}
+
+function setUserNameFromEmail() {
+ if (document.getElementById('username').value == "") {
+ document.getElementById('username').value = document.getElementById('emailAddress').value;
+ }
+}
+
+function useShippingAddressAsBillingToggle() {
+ if (document.getElementById('useShippingAddressForBilling').checked) {
+ document.getElementById('billToAddress1').value = document.getElementById('shipToAddress1').value;
+ document.getElementById('billToAddress2').value = document.getElementById('shipToAddress2').value;
+ document.getElementById('billToCity').value = document.getElementById('shipToCity').value;
+ document.getElementById('billToCountryGeoId').value = document.getElementById('shipToCountryGeoId').value;
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+ document.getElementById('billToStateProvinceGeoId').value = document.getElementById('shipToStateProvinceGeoId').value;
+ document.getElementById('billToPostalCode').value = document.getElementById('shipToPostalCode').value;
+
+ document.getElementById('billToAddress1').disabled = true ;
+ document.getElementById('billToAddress2').disabled = true ;
+ document.getElementById('billToCity').disabled = true ;
+ document.getElementById('billToCountryGeoId').disabled = true ;
+ document.getElementById('billToStateProvinceGeoId').disabled = true ;
+ document.getElementById('billToPostalCode').disabled = true;
+ copyShipToBillAddress();
+ hideErrorMessage();
+ } else {
+ stopObservingShipToBillAddress();
+ document.getElementById('billToAddress1').disabled = false ;
+ document.getElementById('billToAddress2').disabled = false ;
+ document.getElementById('billToCity').disabled = false ;
+ document.getElementById('billToCountryGeoId').disabled = false ;
+ document.getElementById('billToStateProvinceGeoId').disabled = false ;
+ document.getElementById('billToPostalCode').disabled = false;
+ }
+}
+
+function getServerError(data) {
+ var serverErrorHash = [];
+ var serverError = "";
+ if (data._ERROR_MESSAGE_LIST_ != undefined) {
+ serverErrorHash = data._ERROR_MESSAGE_LIST_;
+
+ var CommonErrorMessage2 = getJSONuiLabel("CommonUiLabels", "CommonErrorMessage2");
+ showErrorAlert(CommonErrorMessage2, serverErrorHash);
+ jQuery.each(serverErrorHash, function(error, message){
+ if (error != undefined) {
+ serverError += message;
+ }
+ });
+
+ if (serverError == "") {
+ serverError = serverErrorHash;
+ }
+ }
+ if (data._ERROR_MESSAGE_ != undefined) {
+ serverError += data._ERROR_MESSAGE_;
+ }
+ return serverError;
+}
+
+function doAjaxRequest(formId, errorId, popupId, requestUrl) {
+ if (jQuery("#" + formId).valid()) {
+ jQuery.ajax({
+ url: requestUrl,
+ type: 'POST',
+ async: false,
+ data: jQuery("#" + formId).serialize(),
+ success: function(data) {
+ var serverError = getServerError(data);
+ if (serverError != "") {
+ jQuery("#" + errorId).fadeIn("fast");
+ jQuery("#" + popupId).fadeIn("fast");
+ jQuery("#" + errorId).html(serverError);
+ } else {
+ jQuery("#" + errorId).fadeIn("slow");
+ jQuery("#" + popupId).fadeIn("slow");
+ document.getElementById('refreshRequestForm').submit();
+ }
+ }
+
+ });
+
+ }
+}
+
+function createPartyPostalAddress(e) {
+ formId = 'createPostalAddressForm';
+ errorId = 'serverError';
+ popupId = 'displayCreateAddressForm';
+ requestUrl = 'createPartyPostalAddress';
+
+ doAjaxRequest(formId, errorId, popupId, requestUrl);
+
+
+}
+
+function updatePartyPostalAddress(e) {
+ contactMechId = e.split('_')[1];
+ formId = 'editPostalAddress_' + contactMechId;
+ errorId = 'serverError_' + contactMechId;
+ popupId = 'displayEditAddressForm_' + contactMechId;
+ requestUrl = 'updatePartyPostalAddress';
+
+ doAjaxRequest(formId, errorId, popupId, requestUrl);
+}
+
+function updatePartyShipToPostalAddress(e) {
+ formId = 'editShipToPostalAddress';
+ errorId = 'shipToServerError';
+ popupId = 'displayEditShipToPostalAddress';
+ requestUrl = 'updatePartyPostalAddress';
+
+ doAjaxRequest(formId, errorId, popupId, requestUrl);
+}
+
+function updatePartyBillToPostalAddress(e) {
+ formId = 'editBillToPostalAddress';
+ errorId = 'billToServerError';
+ popupId = 'displayEditBillToPostalAddress';
+ requestUrl = 'updatePartyPostalAddress';
+
+ doAjaxRequest(formId, errorId, popupId, requestUrl);
+}
+
+function hideErrorMessage() {
+ jQuery('#advice-required-billToAddress1').fadeOut("fast");
+ jQuery('#advice-required-billToStateProvinceGeoId').fadeOut("fast");
+ jQuery('#advice-required-billToCity').fadeOut("fast");
+ jQuery('#advice-required-billToPostalCode').fadeOut("fast");;
+ jQuery('#advice-required-billToCountryGeoId').fadeOut("fast");
+ jQuery('#billToPhoneRequired').fadeOut("fast");
+}
+
+function copyShipToBillAddress() {
+ jQuery("#shipToAddress1").change( function() {
+ document.getElementById('billToAddress1').value = document.getElementById('shipToAddress1').value;
+ });
+ jQuery("#shipToAddress2").change( function() {
+ document.getElementById('billToAddress2').value = document.getElementById('shipToAddress2').value;
+ });
+ jQuery("#shipToCity").change( function() {
+ document.getElementById('billToCity').value = document.getElementById('shipToCity').value;
+ });
+ jQuery("#shipToStateProvinceGeoId").change( function() {
+ document.getElementById('billToStateProvinceGeoId').value = document.getElementById('shipToStateProvinceGeoId').value;
+ });
+
+ jQuery("#shipToCountryGeoId").change(copyShipToCountryToBillToCountry);
+ jQuery("#shipToPostalCode").change( function() {
+ document.getElementById('billToPostalCode').value = document.getElementById('shipToPostalCode').value;
+ });
+}
+
+function stopObservingShipToBillAddress() {
+ jQuery('#shipToAddress1').unbind('change');
+ jQuery('shipToAddress2').unbind('change');
+ jQuery('shipToCity').unbind('change');
+ jQuery('shipToStateProvinceGeoId').unbind('change');
+ jQuery('shipToCountryGeoId').unbind('change', copyShipToCountryToBillToCountry);
+ jQuery('shipToPostalCode').unbind('change');
+}
+
+function showState(id) {
+ if (document.getElementById('editPostalAddress_' + id)) {
+ // Get associate states for Postal Address Information
+ jQuery("#countryGeoId_" + id).change( function() {
+ getAssociatedStateList('countryGeoId_'+id, 'stateProvinceGeoId_'+id, 'advice-required-stateProvinceGeoId_'+id, 'states_'+id);
+ });
+
+ if (document.getElementById('stateProvinceGeoId_'+id).value == "_NA_") {
+ getAssociatedStateList('countryGeoId_'+id, 'stateProvinceGeoId_'+id, 'advice-required-stateProvinceGeoId_'+id, 'states_'+id);
+ } else {
+ var stateValue = document.getElementById('stateProvinceGeoId_'+id).value;
+ getAssociatedStateList('countryGeoId_'+id, 'stateProvinceGeoId_'+id, 'advice-required-stateProvinceGeoId_'+id, 'states_'+id);
+ document.getElementById('stateProvinceGeoId_'+id).value = stateValue;
+ }
+ }
+}
+
+function copyShipToCountryToBillToCountry(){
+ document.getElementById('billToCountryGeoId').value = document.getElementById('shipToCountryGeoId').value;
+ getAssociatedStateList('billToCountryGeoId', 'billToStateProvinceGeoId', 'advice-required-billToStateProvinceGeoId', 'billToStates');
+}
\ No newline at end of file
diff --git a/template/images/quickAnonCustSettings.js b/template/images/quickAnonCustSettings.js
new file mode 100644
index 0000000..3f13619
--- /dev/null
+++ b/template/images/quickAnonCustSettings.js
@@ -0,0 +1,57 @@
+/*
+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.
+*/
+
+jQuery(document).ready(isValidElement);
+
+function isValidElement(element){
+ jQuery('#quickAnonProcessCustomer').validate();
+ }
+
+jQuery(document).ready(function() {
+ jQuery('#useShippingPostalAddressForBilling').click(changeText2);
+});
+function changeText2(){
+ if(document.getElementById('useShippingPostalAddressForBilling').checked) {
+ document.getElementById('billToName').value = document.getElementById('shipToName').value;
+ document.getElementById('billToAttnName').value = document.getElementById('shipToAttnName').value;
+ document.getElementById('billToAddress1').value = document.getElementById('shipToAddress1').value;
+ document.getElementById('billToAddress2').value = document.getElementById('shipToAddress2').value;
+ document.getElementById('billToCity').value = document.getElementById('shipToCity').value;
+ document.getElementById('billToStateProvinceGeoId').value = document.getElementById('shipToStateProvinceGeoId').value;
+ document.getElementById('billToPostalCode').value = document.getElementById('shipToPostalCode').value;
+ document.getElementById('billToCountryGeoId').value = document.getElementById('shipToCountryGeoId').value;
+ document.getElementById('billToName').disabled = true;
+ document.getElementById('billToAttnName').disabled = true;
+ document.getElementById('billToAddress1').disabled = true;
+ document.getElementById('billToAddress2').disabled = true;
+ document.getElementById('billToCity').disabled = true;
+ document.getElementById('billToStateProvinceGeoId').disabled = true;
+ document.getElementById('billToPostalCode').disabled = true;
+ document.getElementById('billToCountryGeoId').disabled = true;
+ } else {
+ document.getElementById('billToName').disabled = false;
+ document.getElementById('billToAttnName').disabled = false;
+ document.getElementById('billToAddress1').disabled = false;
+ document.getElementById('billToAddress2').disabled = false;
+ document.getElementById('billToCity').disabled = false;
+ document.getElementById('billToStateProvinceGeoId').disabled = false;
+ document.getElementById('billToPostalCode').disabled = false;
+ document.getElementById('billToCountryGeoId').disabled = false;
+ }
+}
\ No newline at end of file
diff --git a/template/images/remove.png b/template/images/remove.png
new file mode 100644
index 0000000..43e9363
Binary files /dev/null and b/template/images/remove.png differ
diff --git a/template/includes/container-end.ftl b/template/includes/container-end.ftl
new file mode 100644
index 0000000..cd2c8fb
--- /dev/null
+++ b/template/includes/container-end.ftl
@@ -0,0 +1,17 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
\ No newline at end of file
diff --git a/template/includes/container-start.ftl b/template/includes/container-start.ftl
new file mode 100644
index 0000000..c87c107
--- /dev/null
+++ b/template/includes/container-start.ftl
@@ -0,0 +1,17 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
\ No newline at end of file
diff --git a/template/includes/ecom-header-bar.ftl b/template/includes/ecom-header-bar.ftl
new file mode 100644
index 0000000..06bc02b
--- /dev/null
+++ b/template/includes/ecom-header-bar.ftl
@@ -0,0 +1,56 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+ <#include "../catalog/MainNav.ftl" />
+
+
+
+
+ <#include "../catalog/SimpleSearch.ftl" />
+
+
+ <#assign shoppingCart = sessionAttributes.shoppingCart!>
+ <#if shoppingCart?has_content>
+ <#assign shoppingCartSize = shoppingCart.size()>
+ <#else>
+ <#assign shoppingCartSize = 0>
+ #if>
+ <#if (shoppingCartSize > 0)>
+
+ ${uiLabelMap.OrderCheckout} >
+
+ <#else>
+
+
+
+ #if>
+
+
+
\ No newline at end of file
diff --git a/template/includes/ecom-header.ftl b/template/includes/ecom-header.ftl
new file mode 100644
index 0000000..5a7f212
--- /dev/null
+++ b/template/includes/ecom-header.ftl
@@ -0,0 +1,75 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 sessionAttributes.overrideLogo??>
+
+ <#elseif catalogHeaderLogo??>
+
+ <#elseif layoutSettings.VT_HDR_IMAGE_URL?has_content>
+
+ #if>
+
+
+ <#if !productStore??>
+
${uiLabelMap.EcommerceNoProductStore}
+ #if>
+ <#if (productStore.title)??>
${productStore.title}
#if>
+ <#if (productStore.subtitle)??>
${productStore.subtitle}
#if>
+
+ <#if sessionAttributes.autoName?has_content>
+ ${uiLabelMap.CommonWelcome}
${sessionAttributes.autoName?html}!
+ (${uiLabelMap.CommonNotYou}?
${uiLabelMap.CommonClickHere} )
+ <#else/>
+ ${uiLabelMap.CommonWelcome}!
+ #if>
+
+
+
+
+ <#if userLogin?has_content && userLogin.userLoginId != "anonymous">
+ <#include "../customer/MyAccountMenu.ftl" />
+
+ <#else/>
+ ${uiLabelMap.EcommerceMyAccount}
+ #if>
+
+
+
+
\ No newline at end of file
diff --git a/template/includes/footer.ftl b/template/includes/footer.ftl
new file mode 100644
index 0000000..8e27284
--- /dev/null
+++ b/template/includes/footer.ftl
@@ -0,0 +1,96 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 nowTimestamp = Static["org.ofbiz.base.util.UtilDateTime"].nowTimestamp()>
+
+
+
+
+
\ No newline at end of file
diff --git a/template/includes/header.ftl b/template/includes/header.ftl
new file mode 100644
index 0000000..1be1824
--- /dev/null
+++ b/template/includes/header.ftl
@@ -0,0 +1,18 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#include "ecom-header.ftl" />
+<#include "ecom-header-bar.ftl" />
\ No newline at end of file
diff --git a/template/includes/headerHead.ftl b/template/includes/headerHead.ftl
new file mode 100644
index 0000000..0b387fc
--- /dev/null
+++ b/template/includes/headerHead.ftl
@@ -0,0 +1,106 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 docLangAttr = locale.toString()?replace("_", "-")>
+<#assign langDir = "ltr">
+<#if "ar.iw"?contains(docLangAttr?substring(0, 2))>
+ <#assign langDir = "rtl">
+#if>
+
+
+
+
+
+
<#if title?has_content>${title}<#elseif titleProperty?has_content>${uiLabelMap.get(titleProperty)}#if>: ${(productStore.storeName)!}
+ <#if layoutSettings.VT_SHORTCUT_ICON?has_content>
+ <#assign shortcutIcon = layoutSettings.VT_SHORTCUT_ICON.get(0)/>
+ <#elseif layoutSettings.shortcutIcon?has_content>
+ <#assign shortcutIcon = layoutSettings.shortcutIcon/>
+ #if>
+ <#if shortcutIcon?has_content>
+
+ #if>
+ <#if layoutSettings.styleSheets?has_content>
+ <#--layoutSettings.styleSheets is a list of style sheets. So, you can have a user-specified "main" style sheet, AND a component style sheet.-->
+ <#list layoutSettings.styleSheets as styleSheet>
+
+ #list>
+ #if>
+ <#if layoutSettings.VT_STYLESHEET?has_content>
+ <#list layoutSettings.VT_STYLESHEET as styleSheet>
+
+ #list>
+ #if>
+ <#if layoutSettings.rtlStyleSheets?has_content && langDir == "rtl">
+ <#--layoutSettings.rtlStyleSheets is a list of rtl style sheets.-->
+ <#list layoutSettings.rtlStyleSheets as styleSheet>
+
+ #list>
+ #if>
+ <#if layoutSettings.VT_RTL_STYLESHEET?has_content && langDir == "rtl">
+ <#list layoutSettings.VT_RTL_STYLESHEET as styleSheet>
+
+ #list>
+ #if>
+ <#-- Append CSS for catalog -->
+ <#if catalogStyleSheet??>
+
+ #if>
+ <#-- Append CSS for tracking codes -->
+ <#if sessionAttributes.overrideCss??>
+
+ #if>
+ <#if layoutSettings.VT_HDR_JAVASCRIPT?has_content>
+ <#list layoutSettings.VT_HDR_JAVASCRIPT as javaScript>
+
+ #list>
+ #if>
+ <#if layoutSettings.javaScripts?has_content>
+ <#--layoutSettings.javaScripts is a list of java scripts. -->
+ <#-- use a Set to make sure each javascript is declared only once, but iterate the list to maintain the correct order -->
+ <#assign javaScriptsSet = Static["org.ofbiz.base.util.UtilMisc"].toSet(layoutSettings.javaScripts)/>
+ <#list layoutSettings.javaScripts as javaScript>
+ <#if javaScriptsSet.contains(javaScript)>
+ <#assign nothing = javaScriptsSet.remove(javaScript)/>
+
+ #if>
+ #list>
+ #if>
+ ${layoutSettings.extraHead!}
+ <#if layoutSettings.VT_EXTRA_HEAD?has_content>
+ <#list layoutSettings.VT_EXTRA_HEAD as extraHead>
+ ${extraHead}
+ #list>
+ #if>
+
+ <#-- Meta tags if defined by the page action -->
+
+ <#if metaDescription??>
+
+ #if>
+ <#if metaKeywords??>
+
+ #if>
+ <#if webAnalyticsConfigs?has_content>
+
+ #if>
+
diff --git a/template/includes/language.ftl b/template/includes/language.ftl
new file mode 100644
index 0000000..47e4d9c
--- /dev/null
+++ b/template/includes/language.ftl
@@ -0,0 +1,37 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
+
${uiLabelMap.CommonLanguageTitle}
+
+
+
+
+ <#assign availableLocales = Static["org.ofbiz.base.util.UtilMisc"].availableLocales()/>
+ <#list availableLocales as availableLocale>
+ <#assign langAttr = availableLocale.toString()?replace("_", "-")>
+ <#assign langDir = "ltr">
+ <#if "ar.iw"?contains(langAttr?substring(0, 2))>
+ <#assign langDir = "rtl">
+ #if>
+ selected="selected"#if>>${availableLocale.getDisplayName(availableLocale)}
+ #list>
+
+
+
+
\ No newline at end of file
diff --git a/template/includes/row-end.ftl b/template/includes/row-end.ftl
new file mode 100644
index 0000000..75daf8e
--- /dev/null
+++ b/template/includes/row-end.ftl
@@ -0,0 +1,17 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
\ No newline at end of file
diff --git a/template/includes/row-start.ftl b/template/includes/row-start.ftl
new file mode 100644
index 0000000..13aa05a
--- /dev/null
+++ b/template/includes/row-start.ftl
@@ -0,0 +1,17 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
\ No newline at end of file
diff --git a/template/login.ftl b/template/login.ftl
new file mode 100644
index 0000000..03cf17b
--- /dev/null
+++ b/template/login.ftl
@@ -0,0 +1,61 @@
+<#--
+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 janrainEnabled = Static["org.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue("ecommerce", "janrain.enabled", delegator)>
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 appName = Static["org.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue("ecommerce", "janrain.appName", delegator)>
+
+<#if janrainEnabled == "Y">
+ <#include "LoginJanrain.ft"/>
+<#else>
+
+
+
${uiLabelMap.CommonLogin}
+
+
+
+
+ <#include "LoginMain.ftl"/>
+
+
+ <#include "LoginForgot.ftl"/>
+
+
+
+
+#if>
+
+
diff --git a/template/main.ftl b/template/main.ftl
new file mode 100644
index 0000000..a471bcd
--- /dev/null
+++ b/template/main.ftl
@@ -0,0 +1,23 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Render the category page -->
+<#if requestAttributes.productCategoryId?has_content>
+ ${screens.render("component://oshop/widget/CatalogScreens.xml#category-include")}
+ ${screens.render("component://oshop/widget/CatalogScreens.xml#bestSellingCategory")}
+<#else>
+
${uiLabelMap.EcommerceNoPROMOTIONCategory}
+#if>
diff --git a/template/order/CheckOutAddress.ftl b/template/order/CheckOutAddress.ftl
new file mode 100644
index 0000000..dd007f6
--- /dev/null
+++ b/template/order/CheckOutAddress.ftl
@@ -0,0 +1,101 @@
+
+
+<#assign cart = shoppingCart!/>
+
+
+
1) ${uiLabelMap.OrderWhereShallWeShipIt}
+
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderSplitShipment}
+ ${uiLabelMap.PartyAddNewAddress}
+ <#if (cart.getShipGroupSize() > 1)>
+ ${uiLabelMap.OrderNOTEMultipleShipmentsExist}
+ #if>
+
+
+ <#if shippingContactMechList?has_content>
+
+ <#list shippingContactMechList as shippingContactMech>
+ <#assign shippingAddress = shippingContactMech.getRelatedOne("PostalAddress", false)>
+ <#assign checkThisAddress = (shippingContactMech_index == 0 && !cart.getShippingContactMechId()?has_content) || (cart.getShippingContactMechId()?default("") == shippingAddress.contactMechId)/>
+
+
+ checked="checked"#if> />
+
+
+
+ <#if shippingAddress.toName?has_content>
${uiLabelMap.CommonTo}: ${shippingAddress.toName}
#if>
+ <#if shippingAddress.attnName?has_content>
${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName}
#if>
+ <#if shippingAddress.address1?has_content>${shippingAddress.address1}
#if>
+ <#if shippingAddress.address2?has_content>${shippingAddress.address2}
#if>
+ <#if shippingAddress.city?has_content>${shippingAddress.city}#if>
+
+ <#if shippingAddress.postalCode?has_content>
${shippingAddress.postalCode}#if>
+ <#if shippingAddress.countryGeoId?has_content>
${shippingAddress.countryGeoId}#if>
+
+
${uiLabelMap.CommonUpdate}
+
${uiLabelMap.OrderSplitShipment}
+
${uiLabelMap.PartyAddNewAddress}
+ <#if (cart.getShipGroupSize() > 1)>
+
${uiLabelMap.OrderNOTEMultipleShipmentsExist}
+ #if>
+
+
+
+
+ #list>
+ #if>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/CheckOutPayOptions.ftl b/template/order/CheckOutPayOptions.ftl
new file mode 100644
index 0000000..2937114
--- /dev/null
+++ b/template/order/CheckOutPayOptions.ftl
@@ -0,0 +1,176 @@
+<#--
+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 cart = shoppingCart! />
+
+
+
3) ${uiLabelMap.OrderHowShallYouPay}?
+
+
+
+
+
+
+
+
+ <#-- Payment Method Selection -->
+
+
${uiLabelMap.CommonAdd}:
+ <#include "CheckoutPayCreditCard.ftl" />
+ <#include "CheckoutPayEftAccount.ftl" />
+ <#include "CheckoutPayExtOffline.ftl" />
+ <#include "CheckoutPayExtCod.ftl" />
+ <#include "CheckoutPayExtWorldPay.ftl" />
+ <#include "CheckoutPayExtPayPal.ftl" />
+ <#if !paymentMethodList?has_content>
+
+ ${uiLabelMap.AccountingNoPaymentMethods}.
+
+ <#else>
+ <#list paymentMethodList as paymentMethod>
+ <#include "CheckoutPayMethodGiftCard.ftl" />
+ <#include "CheckoutPayMethodCreditCard.ftl" />
+ <#include "CheckoutPayMethodEftAccount.ftl" />
+ #list>
+ #if>
+ <#-- special billing account functionality to allow use w/ a payment method -->
+ <#if productStorePaymentMethodTypeIdMap.EXT_BILLACT??>
+ <#if billingAccountList?has_content>
+
+
+
+ <#list billingAccountList as billingAccount>
+ <#assign availableAmount = billingAccount.accountBalance>
+ <#assign accountLimit = billingAccount.accountLimit>
+ selected="selected"#if>>${billingAccount.description?default("")} [${billingAccount.billingAccountId}] ${uiLabelMap.EcommerceAvailable} <@ofbizCurrency amount=availableAmount isoCode=billingAccount.accountCurrencyUomId/> ${uiLabelMap.EcommerceLimit} <@ofbizCurrency amount=accountLimit isoCode=billingAccount.accountCurrencyUomId/>
+ #list>
+
+ ${uiLabelMap.FormFieldTitle_billingAccountId}
+
+
+
+ ${uiLabelMap.OrderBillUpTo}
+
+ #if>
+ #if>
+ <#-- end of special billing account functionality -->
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+
+
+
+ ${uiLabelMap.AccountingUseGiftCardNotOnFile}
+
+
+ ${uiLabelMap.AccountingNumber}
+
+
+ <#if cart.isPinRequiredForGC(delegator)>
+
+ ${uiLabelMap.AccountingPIN}
+
+
+ #if>
+
+ ${uiLabelMap.AccountingAmount}
+
+
+ #if>
+
+ <#-- End Payment Method Selection -->
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/CheckOutPlaceOrder.ftl b/template/order/CheckOutPlaceOrder.ftl
new file mode 100644
index 0000000..c047825
--- /dev/null
+++ b/template/order/CheckOutPlaceOrder.ftl
@@ -0,0 +1,84 @@
+<#--
+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.
+-->
+
+
+
+
+
+
${uiLabelMap.OrderFinalCheckoutReview}
+ <#if !isDemoStore?? && isDemoStore>
${uiLabelMap.OrderDemoFrontNote}.
#if>
+ >
+
+ <#if cart?? && 0 < cart.size()>
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+ <#else>
+
${uiLabelMap.OrderErrorShoppingCartEmpty}.
+ #if>
+
+
+
+
+ <#if (requestParameters.checkoutpage)?has_content>
+
+ #if>
+ <#if (requestAttributes.issuerId)?has_content>
+
+ #if>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/CheckOutShipOptions.ftl b/template/order/CheckOutShipOptions.ftl
new file mode 100644
index 0000000..118284c
--- /dev/null
+++ b/template/order/CheckOutShipOptions.ftl
@@ -0,0 +1,123 @@
+<#--
+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.
+-->
+
+
+
+
+
+
2) ${uiLabelMap.OrderHowShallWeShipIt}
+
+
+
+
+
+
+
+
+ <#include "ShippingOptionAllAtOnce.ftl" />
+ <#include "ShippingOptionSpecInstruction.ftl"/>
+
+ <#include "ShippingOptionPONumber.ftl"/>
+ <#if productStore.showCheckoutGiftOptions! != "N">
+ <#include "ShippingOptionGift.ftl"/>
+ <#else/>
+
+ #if>
+ <#include "ShippingOptionAddEmail.ftl"/>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/CheckoutPayCreditCard.ftl b/template/order/CheckoutPayCreditCard.ftl
new file mode 100644
index 0000000..28b3b8d
--- /dev/null
+++ b/template/order/CheckoutPayCreditCard.ftl
@@ -0,0 +1,3 @@
+<#if productStorePaymentMethodTypeIdMap.CREDIT_CARD??>
+
${uiLabelMap.AccountingCreditCard}
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayEftAccount.ftl b/template/order/CheckoutPayEftAccount.ftl
new file mode 100644
index 0000000..4f918b0
--- /dev/null
+++ b/template/order/CheckoutPayEftAccount.ftl
@@ -0,0 +1,3 @@
+<#if productStorePaymentMethodTypeIdMap.EFT_ACCOUNT??>
+
${uiLabelMap.AccountingEFTAccount}
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayExtBilling.ftl b/template/order/CheckoutPayExtBilling.ftl
new file mode 100644
index 0000000..0e67fb8
--- /dev/null
+++ b/template/order/CheckoutPayExtBilling.ftl
@@ -0,0 +1,19 @@
+<#if productStorePaymentMethodTypeIdMap.EXT_BILLACT??>
+ <#if billingAccountList?has_content>
+
+
+
+ <#list billingAccountList as billingAccount>
+ <#assign availableAmount = billingAccount.accountBalance>
+ <#assign accountLimit = billingAccount.accountLimit>
+ selected="selected"#if>>${billingAccount.description?default("")} [${billingAccount.billingAccountId}] ${uiLabelMap.EcommerceAvailable} <@ofbizCurrency amount=availableAmount isoCode=billingAccount.accountCurrencyUomId/> ${uiLabelMap.EcommerceLimit} <@ofbizCurrency amount=accountLimit isoCode=billingAccount.accountCurrencyUomId/>
+ #list>
+
+ ${uiLabelMap.FormFieldTitle_billingAccountId}
+
+
+
+ ${uiLabelMap.OrderBillUpTo}
+
+ #if>
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayExtCod.ftl b/template/order/CheckoutPayExtCod.ftl
new file mode 100644
index 0000000..e8accaf
--- /dev/null
+++ b/template/order/CheckoutPayExtCod.ftl
@@ -0,0 +1,6 @@
+<#if productStorePaymentMethodTypeIdMap.EXT_COD??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.OrderCOD}
+
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayExtOffline.ftl b/template/order/CheckoutPayExtOffline.ftl
new file mode 100644
index 0000000..ec92e66
--- /dev/null
+++ b/template/order/CheckoutPayExtOffline.ftl
@@ -0,0 +1,6 @@
+<#if productStorePaymentMethodTypeIdMap.EXT_OFFLINE??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.OrderMoneyOrder}
+
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayExtPayPal.ftl b/template/order/CheckoutPayExtPayPal.ftl
new file mode 100644
index 0000000..d7cd7b8
--- /dev/null
+++ b/template/order/CheckoutPayExtPayPal.ftl
@@ -0,0 +1,6 @@
+<#if productStorePaymentMethodTypeIdMap.EXT_PAYPAL??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithPayPal}
+
+#if>
diff --git a/template/order/CheckoutPayExtWorldPay.ftl b/template/order/CheckoutPayExtWorldPay.ftl
new file mode 100644
index 0000000..4944816
--- /dev/null
+++ b/template/order/CheckoutPayExtWorldPay.ftl
@@ -0,0 +1,6 @@
+<#if productStorePaymentMethodTypeIdMap.EXT_WORLDPAY??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithWorldPay}
+
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayMethodCreditCard.ftl b/template/order/CheckoutPayMethodCreditCard.ftl
new file mode 100644
index 0000000..9f354be
--- /dev/null
+++ b/template/order/CheckoutPayMethodCreditCard.ftl
@@ -0,0 +1,12 @@
+<#if paymentMethod.paymentMethodTypeId == "CREDIT_CARD">
+ <#if productStorePaymentMethodTypeIdMap.CREDIT_CARD??>
+ <#assign creditCard = paymentMethod.getRelatedOne("CreditCard", false) />
+
+ #if>
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayMethodEftAccount.ftl b/template/order/CheckoutPayMethodEftAccount.ftl
new file mode 100644
index 0000000..d7dd710
--- /dev/null
+++ b/template/order/CheckoutPayMethodEftAccount.ftl
@@ -0,0 +1,11 @@
+<#if paymentMethod.paymentMethodTypeId == "EFT_ACCOUNT">
+ <#if productStorePaymentMethodTypeIdMap.EFT_ACCOUNT??>
+ <#assign eftAccount = paymentMethod.getRelatedOne("EftAccount", false) />
+
+
checked="checked"#if> />
+
${uiLabelMap.AccountingEFTAccount}:${eftAccount.bankName!}: ${eftAccount.accountNumber!}
+ <#if paymentMethod.description?has_content>
(${paymentMethod.description})
#if>
+
${uiLabelMap.CommonUpdate}
+
+ #if>
+#if>
\ No newline at end of file
diff --git a/template/order/CheckoutPayMethodGiftCard.ftl b/template/order/CheckoutPayMethodGiftCard.ftl
new file mode 100644
index 0000000..1ebec94
--- /dev/null
+++ b/template/order/CheckoutPayMethodGiftCard.ftl
@@ -0,0 +1,27 @@
+<#if paymentMethod.paymentMethodTypeId == "GIFT_CARD">
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+ <#assign giftCard = paymentMethod.getRelatedOne("GiftCard", false) />
+ <#if giftCard?has_content && giftCard.cardNumber?has_content>
+ <#assign giftCardNumber = "" />
+ <#assign pcardNumber = giftCard.cardNumber />
+ <#if pcardNumber?has_content>
+ <#assign psize = pcardNumber?length - 4 />
+ <#if 0 < psize>
+ <#list 0 .. psize-1 as foo>
+ <#assign giftCardNumber = giftCardNumber + "*" />
+ #list>
+ <#assign giftCardNumber = giftCardNumber + pcardNumber[psize .. psize + 3] />
+ <#else>
+ <#assign giftCardNumber = pcardNumber />
+ #if>
+ #if>
+ #if>
+
+ #if>
+#if>
\ No newline at end of file
diff --git a/template/order/OnePageCheckoutProcess.ftl b/template/order/OnePageCheckoutProcess.ftl
new file mode 100644
index 0000000..c86ca01
--- /dev/null
+++ b/template/order/OnePageCheckoutProcess.ftl
@@ -0,0 +1,500 @@
+<#--
+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 shoppingCart = sessionAttributes.shoppingCart! />
+
${uiLabelMap.OrderCheckout}
+ <#if shoppingCart?has_content && shoppingCart.size() > 0>
+
+
+<#-- ========================================================================================================================== -->
+
+ ${screens.render("component://${activeApp}/widget/CartScreens.xml#UpdateCart")}
+
+
+<#-- ========================================================================================================================== -->
+
+
${uiLabelMap.EcommerceStep} 2: ${uiLabelMap.FacilityShipping}
+
+
+<#-- ============================================================= -->
+
+
+
+<#-- ========================================================================================================================== -->
+
+
+<#-- ========================================================================================================================== -->
+
+
${uiLabelMap.EcommerceStep} 4: ${uiLabelMap.AccountingBilling}
+
+
${uiLabelMap.EcommerceClickHereToEdit}
+
+
+
+ ${uiLabelMap.OrderBillUpTo}
+
+
+
+ ${uiLabelMap.EcommerceLocation}
+
+
+
+
+
+
+<#-- ============================================================= -->
+
+
+
+
+<#-- ========================================================================================================================== -->
+
+
+ #if>
+
+<#-- ========================================================================================================================== -->
+
style="display: none;"#if>>
+
${uiLabelMap.EcommerceStep} 1: ${uiLabelMap.PageTitleShoppingCart}
+
You currently have no items in your cart. Click here to view our products.
+
${uiLabelMap.EcommerceStep} 2: ${uiLabelMap.FacilityShipping}
+
${uiLabelMap.EcommerceStep} 3: ${uiLabelMap.PageTitleShippingOptions}
+
${uiLabelMap.EcommerceStep} 4: ${uiLabelMap.AccountingBilling}
+
${uiLabelMap.EcommerceStep} 5: ${uiLabelMap.OrderSubmitOrder}
+
+
diff --git a/template/order/Order.ftl b/template/order/Order.ftl
new file mode 100644
index 0000000..e907b4e
--- /dev/null
+++ b/template/order/Order.ftl
@@ -0,0 +1,53 @@
+<#--
+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 orderHeader?has_content>
+
+
+
+
+
+
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+
+
+
+
+<#else>
+
${uiLabelMap.OrderSpecifiedNotFound}.
+#if>
diff --git a/template/order/OrderHistoryDownloads.ftl b/template/order/OrderHistoryDownloads.ftl
new file mode 100644
index 0000000..d6d4624
--- /dev/null
+++ b/template/order/OrderHistoryDownloads.ftl
@@ -0,0 +1,39 @@
+
+<#if downloadOrderRoleAndProductContentInfoList?has_content>
+
+
+
${uiLabelMap.EcommerceDownloadsAvailableTitle}
+
+
+
+
+
+ ${uiLabelMap.OrderOrder} ${uiLabelMap.CommonNbr}
+ ${uiLabelMap.ProductProductName}
+ ${uiLabelMap.CommonName}
+ ${uiLabelMap.CommonDescription}
+
+
+
+
+ <#if downloadOrderRoleAndProductContentInfoList?has_content>
+ <#list downloadOrderRoleAndProductContentInfoList as downloadOrderRoleAndProductContentInfo>
+
+ ${downloadOrderRoleAndProductContentInfo.orderId}
+ ${downloadOrderRoleAndProductContentInfo.productName}
+ ${downloadOrderRoleAndProductContentInfo.contentName!}
+ ${downloadOrderRoleAndProductContentInfo.description!}
+
+ Download
+
+
+ #list>
+ <#else>
+ ${uiLabelMap.EcommerceDownloadNotFound}
+ #if>
+
+
+
+
+#if>
\ No newline at end of file
diff --git a/template/order/OrderHistoryShipped.ftl b/template/order/OrderHistoryShipped.ftl
new file mode 100644
index 0000000..5634c90
--- /dev/null
+++ b/template/order/OrderHistoryShipped.ftl
@@ -0,0 +1,36 @@
+<#if porderHeaderList?has_content>
+
+
+
${uiLabelMap.OrderPurchaseHistory}
+
+
+
+
+ ${uiLabelMap.CommonDate}
+ ${uiLabelMap.OrderOrder} ${uiLabelMap.CommonNbr}
+ ${uiLabelMap.CommonAmount}
+ ${uiLabelMap.CommonStatus}
+
+
+
+
+ <#if porderHeaderList?has_content>
+ <#list porderHeaderList as porderHeader>
+ <#assign pstatus = porderHeader.getRelatedOne("StatusItem", true) />
+
+ ${porderHeader.orderDate.toString()}
+ ${porderHeader.orderId}
+ <@ofbizCurrency amount=porderHeader.grandTotal isoCode=porderHeader.currencyUom />
+ ${pstatus.get("description",locale)}
+ ${uiLabelMap.CommonView}
+
+ #list>
+ <#else>
+ ${uiLabelMap.OrderNoOrderFound}
+ #if>
+
+
+
+
+#if>
\ No newline at end of file
diff --git a/template/order/OrderHistorySubmitted.ftl b/template/order/OrderHistorySubmitted.ftl
new file mode 100644
index 0000000..08540cc
--- /dev/null
+++ b/template/order/OrderHistorySubmitted.ftl
@@ -0,0 +1,48 @@
+
+
+
${uiLabelMap.OrderSalesHistory}
+
+
+
+
+
+ ${uiLabelMap.OrderOrder} ${uiLabelMap.CommonNbr}
+ ${uiLabelMap.CommonDate}
+ ${uiLabelMap.CommonTime}
+ ${uiLabelMap.CommonStatus}
+ ${uiLabelMap.CommonAmount}
+ ${uiLabelMap.OrderInvoices}
+
+
+
+ <#if orderHeaderList?has_content>
+ <#list orderHeaderList as orderHeader>
+ <#assign status = orderHeader.getRelatedOne("StatusItem", true) />
+ <#assign orderDate = orderHeader.orderDate />
+ <#assign orderTime = orderHeader.orderDate />
+
+ ${orderHeader.orderId}
+ ${orderDate?date}
+ ${orderDate?time}
+ ${status.get("description",locale)}
+ <@ofbizCurrency amount=orderHeader.grandTotal isoCode=orderHeader.currencyUom />
+ <#-- invoices -->
+ <#assign invoices = delegator.findByAnd("OrderItemBilling", Static["org.ofbiz.base.util.UtilMisc"].toMap("orderId", "${orderHeader.orderId}"), Static["org.ofbiz.base.util.UtilMisc"].toList("invoiceId"), false) />
+ <#assign distinctInvoiceIds = Static["org.ofbiz.entity.util.EntityUtil"].getFieldListFromEntityList(invoices, "invoiceId", true)>
+ <#if distinctInvoiceIds?has_content>
+
+ <#list distinctInvoiceIds as invoiceId>
+ ${invoiceId} PDF
+ #list>
+
+ <#else>
+
+ #if>
+ #list>
+ <#else>
+ ${uiLabelMap.OrderNoOrderFound}
+ #if>
+
+
+
+
\ No newline at end of file
diff --git a/template/order/ReviewAddress.ftl b/template/order/ReviewAddress.ftl
new file mode 100644
index 0000000..22a284c
--- /dev/null
+++ b/template/order/ReviewAddress.ftl
@@ -0,0 +1,112 @@
+<#if orderItemShipGroups?has_content>
+
+
+
${uiLabelMap.OrderShippingInformation}
+
+
+ <#-- shipping address -->
+ <#assign groupIdx = 0>
+ <#list orderItemShipGroups as shipGroup>
+ <#if orderHeader?has_content>
+ <#assign shippingAddress = shipGroup.getRelatedOne("PostalAddress", false)!>
+ <#assign groupNumber = shipGroup.shipGroupSeqId!>
+ <#else>
+ <#assign shippingAddress = cart.getShippingAddress(groupIdx)!>
+ <#assign groupNumber = groupIdx + 1>
+ #if>
+ <#if shippingAddress?has_content>
+ ${uiLabelMap.OrderDestination} [${groupNumber}]
+ <#if shippingAddress.toName?has_content>${uiLabelMap.CommonTo}: ${shippingAddress.toName}
#if>
+ <#if shippingAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName}
#if>
+ ${shippingAddress.address1}
+ <#if shippingAddress.address2?has_content>${shippingAddress.address2}#if>
+ <#assign shippingStateGeo = (delegator.findOne("Geo", {"geoId", shippingAddress.stateProvinceGeoId!}, false))! />
+ ${shippingAddress.city}
+ ${shippingAddress.postalCode!}
+ <#if shippingStateGeo?has_content>${shippingStateGeo.geoName!}
#if>
+ <#assign shippingCountryGeo = (delegator.findOne("Geo", {"geoId", shippingAddress.countryGeoId!}, false))! />
+ <#if shippingCountryGeo?has_content>${shippingCountryGeo.geoName!}#if>
+ #if>
+
+ ${uiLabelMap.OrderMethod}:
+ <#if orderHeader?has_content>
+ <#assign shipmentMethodType = shipGroup.getRelatedOne("ShipmentMethodType", false)!>
+ <#assign carrierPartyId = shipGroup.carrierPartyId!>
+ <#else>
+ <#assign shipmentMethodType = cart.getShipmentMethodType(groupIdx)!>
+ <#assign carrierPartyId = cart.getCarrierPartyId(groupIdx)!>
+ #if>
+ <#if carrierPartyId?? && carrierPartyId != "_NA_">${carrierPartyId!}#if>
+ ${(shipmentMethodType.description)?default("N/A")}
+ <#if shippingAccount??>${uiLabelMap.AccountingUseAccount}: ${shippingAccount}#if>
+
+ <#-- tracking number -->
+ <#if trackingNumber?has_content || orderShipmentInfoSummaryList?has_content>
+
+ ${uiLabelMap.OrderTrackingNumber}
+ <#-- TODO: add links to UPS/FEDEX/etc based on carrier partyId -->
+ <#if shipGroup.trackingNumber?has_content>
+ ${shipGroup.trackingNumber}
+ #if>
+ <#if orderShipmentInfoSummaryList?has_content>
+ <#list orderShipmentInfoSummaryList as orderShipmentInfoSummary>
+ <#if (orderShipmentInfoSummaryList?size > 1)>${orderShipmentInfoSummary.shipmentPackageSeqId}: #if>
+ Code: ${orderShipmentInfoSummary.trackingCode?default("[Not Yet Known]")}
+ <#if orderShipmentInfoSummary.boxNumber?has_content>${uiLabelMap.OrderBoxNumber}${orderShipmentInfoSummary.boxNumber}#if>
+ <#if orderShipmentInfoSummary.carrierPartyId?has_content>(${uiLabelMap.ProductCarrier}: ${orderShipmentInfoSummary.carrierPartyId})#if>
+ #list>
+ #if>
+
+ #if>
+ <#-- splitting preference -->
+ <#if orderHeader?has_content>
+ <#assign maySplit = shipGroup.maySplit?default("N")>
+ <#else>
+ <#assign maySplit = cart.getMaySplit(groupIdx)?default("N")>
+ #if>
+
+ ${uiLabelMap.OrderSplittingPreference}:
+ <#if maySplit?default("N") == "N">${uiLabelMap.OrderPleaseWaitUntilBeforeShipping}.#if>
+ <#if maySplit?default("N") == "Y">${uiLabelMap.OrderPleaseShipItemsBecomeAvailable}.#if>
+
+ <#-- shipping instructions -->
+ <#if orderHeader?has_content>
+ <#assign shippingInstructions = shipGroup.shippingInstructions!>
+ <#else>
+ <#assign shippingInstructions = cart.getShippingInstructions(groupIdx)!>
+ #if>
+ <#if shippingInstructions?has_content>
+
+ ${uiLabelMap.OrderInstructions}
+ ${shippingInstructions}
+
+ #if>
+ <#-- gift settings -->
+ <#if orderHeader?has_content>
+ <#assign isGift = shipGroup.isGift?default("N")>
+ <#assign giftMessage = shipGroup.giftMessage!>
+ <#else>
+ <#assign isGift = cart.getIsGift(groupIdx)?default("N")>
+ <#assign giftMessage = cart.getGiftMessage(groupIdx)!>
+ #if>
+ <#if productStore.showCheckoutGiftOptions! != "N">
+
+ ${uiLabelMap.OrderGift}?
+ <#if isGift?default("N") == "N">${uiLabelMap.OrderThisIsNotGift}.#if>
+ <#if isGift?default("N") == "Y">${uiLabelMap.OrderThisIsGift}.#if>
+
+ <#if giftMessage?has_content>
+
+ ${uiLabelMap.OrderGiftMessage}
+ ${giftMessage}
+
+ #if>
+ #if>
+ <#if shipGroup_has_next>
+ #if>
+
+ <#assign groupIdx = groupIdx + 1>
+ #list><#-- end list of orderItemShipGroups -->
+
+
+#if>
\ No newline at end of file
diff --git a/template/order/ReviewItems.ftl b/template/order/ReviewItems.ftl
new file mode 100644
index 0000000..afb73d9
--- /dev/null
+++ b/template/order/ReviewItems.ftl
@@ -0,0 +1,350 @@
+<#--
+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.
+-->
+
+<#-- NOTE: this template is used for the orderstatus screen in ecommerce AND for order notification emails through the OrderNoticeEmail.ftl file -->
+<#-- the "urlPrefix" value will be prepended to URLs by the ofbizUrl transform if/when there is no "request" object in the context -->
+<#if baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/>#if>
+ <#assign numColumns = 8>
+ <#if maySelectItems?default("N") == "Y" && roleTypeId! == "PLACING_CUSTOMER">
+ <#assign numColumns = 11>
+ ${uiLabelMap.OrderAddAllToCart}
+ ${uiLabelMap.OrderAddCheckedToCart}
+ createShoppingListFromOrder?orderId=${orderHeader.orderId}&frequency=6&intervalNumber=1&shoppingListTypeId=SLT_AUTO_REODR@ofbizUrl>" class="btn btn-default">${uiLabelMap.OrderSendMeThisEveryMonth}
+ #if>
+
+
+
+ ${uiLabelMap.OrderOrderItems}
+
+
+
+
+
+
+ ${uiLabelMap.OrderProduct}
+ <#if maySelectItems?default("N") == "Y">
+ ${uiLabelMap.OrderQuantity}
+ ${uiLabelMap.OrderQtyPicked}
+ ${uiLabelMap.OrderQuantityShipped}
+ ${uiLabelMap.CommonCancelled}
+ <#else>
+
+
+
+ ${uiLabelMap.OrderQtyOrdered}
+ #if>
+
+ ${uiLabelMap.EcommerceUnitPrice}
+
+ ${uiLabelMap.OrderAdjustments}
+
+ ${uiLabelMap.CommonSubtotal}
+ <#if maySelectItems?default("N") == "Y" && roleTypeId! == "PLACING_CUSTOMER">
+
+ #if>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.CommonSubtotal}
+ <@ofbizCurrency amount=orderSubTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+
+
+
+ <#list headerAdjustmentsToShow as orderHeaderAdjustment>
+
+ ${localOrderReadHelper.getAdjustmentType(orderHeaderAdjustment)}
+
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderAdjustmentTotal(orderHeaderAdjustment) isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+ #list>
+
+
+
+
+ ${uiLabelMap.OrderShippingAndHandling}
+ <@ofbizCurrency amount=orderShippingTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+
+
+ ${uiLabelMap.OrderSalesTax}
+ <@ofbizCurrency amount=orderTaxTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+ <#if maySelectItems?default("N") == "Y">
+
+
+ <#else>
+
+ #if>
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderGrandTotal}
+
+ <@ofbizCurrency amount=orderGrandTotal isoCode=currencyUomId/>
+
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+
+ <#list orderItems as orderItem>
+ <#-- get info from workeffort and calculate rental quantity, if it was a rental item -->
+ <#assign rentalQuantity = 1> <#-- no change if no rental item -->
+ <#if orderItem.orderItemTypeId == "RENTAL_ORDER_ITEM" && workEfforts??>
+ <#list workEfforts as workEffort>
+ <#if workEffort.workEffortId == orderItem.orderItemSeqId>
+ <#assign rentalQuantity = localOrderReadHelper.getWorkEffortRentalQuantity(workEffort)>
+ <#assign workEffortSave = workEffort>
+ <#break>
+ #if>
+ #list>
+ <#else>
+ <#assign WorkOrderItemFulfillments = orderItem.getRelated("WorkOrderItemFulfillment", null, null, false)!>
+ <#if WorkOrderItemFulfillments?has_content>
+ <#list WorkOrderItemFulfillments as WorkOrderItemFulfillment>
+ <#assign workEffortSave = WorkOrderItemFulfillment.getRelatedOne("WorkEffort", true)!>
+ <#break>
+ #list>
+ #if>
+ #if>
+
+
+
+
+ <#if !orderItem.productId?? || orderItem.productId == "_?_">
+
+ ${orderItem.itemDescription?default("")}
+
+ <#else>
+ <#assign product = orderItem.getRelatedOne("Product", true)!/> <#-- should always exist because of FK constraint, but just in case -->
+
+ " class="linktext">${orderItem.productId} - ${orderItem.itemDescription?default("")}
+ <#assign orderItemAttributes = orderItem.getRelated("OrderItemAttribute", null, null, false)/>
+ <#if orderItemAttributes?has_content>
+
+ <#list orderItemAttributes as orderItemAttribute>
+
+ ${orderItemAttribute.attrName} : ${orderItemAttribute.attrValue}
+
+ #list>
+
+ #if>
+
+ <#if product?has_content>
+ <#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+ [${uiLabelMap.OrderPieces}: ${product.piecesIncluded}]
+ #if>
+ <#if (product.quantityIncluded?? && product.quantityIncluded != 0) || product.quantityUomId?has_content>
+ <#assign quantityUom = product.getRelatedOne("QuantityUom", true)!/>
+ [${uiLabelMap.CommonQuantity}: ${product.quantityIncluded!} ${((quantityUom.abbreviation)?default(product.quantityUomId))!}]
+ #if>
+ <#if (product.productWeight?? && product.productWeight != 0) || product.weightUomId?has_content>
+ <#assign weightUom = product.getRelatedOne("WeightUom", true)!/>
+ [${uiLabelMap.CommonWeight}: ${product.productWeight!} ${((weightUom.abbreviation)?default(product.weightUomId))!}]
+ #if>
+ <#if (product.productHeight?? && product.productHeight != 0) || product.heightUomId?has_content>
+ <#assign heightUom = product.getRelatedOne("HeightUom", true)!/>
+ [${uiLabelMap.CommonHeight}: ${product.productHeight!} ${((heightUom.abbreviation)?default(product.heightUomId))!}]
+ #if>
+ <#if (product.productWidth?? && product.productWidth != 0) || product.widthUomId?has_content>
+ <#assign widthUom = product.getRelatedOne("WidthUom", true)!/>
+ [${uiLabelMap.CommonWidth}: ${product.productWidth!} ${((widthUom.abbreviation)?default(product.widthUomId))!}]
+ #if>
+ <#if (product.productDepth?? && product.productDepth != 0) || product.depthUomId?has_content>
+ <#assign depthUom = product.getRelatedOne("DepthUom", true)!/>
+ [${uiLabelMap.CommonDepth}: ${product.productDepth!} ${((depthUom.abbreviation)?default(product.depthUomId))!}]
+ #if>
+ #if>
+ <#if maySelectItems?default("N") == "Y">
+ <#assign returns = orderItem.getRelated("ReturnItem", null, null, false)!>
+ <#if returns?has_content>
+ <#list returns as return>
+ <#assign returnHeader = return.getRelatedOne("ReturnHeader", false)>
+ <#if returnHeader.statusId != "RETURN_CANCELLED">
+ <#if returnHeader.statusId == "RETURN_REQUESTED" || returnHeader.statusId == "RETURN_APPROVED">
+ <#assign displayState = "Return Pending">
+ <#else>
+ <#assign displayState = "Returned">
+ #if>
+ ${displayState} (#${return.returnId})
+ #if>
+ #list>
+ #if>
+ #if>
+
+
+ <#if !(maySelectItems?default("N") == "Y")>
+
+
+
+ #if>
+
+ ${orderItem.quantity?string.number}
+
+ <#if maySelectItems?default("N") == "Y">
+
+ <#assign pickedQty = localOrderReadHelper.getItemPickedQuantityBd(orderItem)>
+ <#if pickedQty gt 0 && orderHeader.statusId == "ORDER_APPROVED">${pickedQty?default(0)?string.number}<#else>${pickedQty?default(0)?string.number}#if>
+
+
+ <#assign shippedQty = localOrderReadHelper.getItemShippedQuantity(orderItem)>
+ ${shippedQty?default(0)?string.number}
+
+
+ <#assign canceledQty = localOrderReadHelper.getItemCanceledQuantity(orderItem)>
+ ${canceledQty?default(0)?string.number}
+
+ #if>
+
+
+ <@ofbizCurrency amount=orderItem.unitPrice isoCode=currencyUomId/>
+
+
+
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentsTotal(orderItem) isoCode=currencyUomId/>
+
+
+
+ <#if workEfforts??>
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemTotal(orderItem)*rentalQuantity isoCode=currencyUomId/>
+ <#else>
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemTotal(orderItem) isoCode=currencyUomId/>
+ #if>
+
+ <#if maySelectItems?default("N") == "Y" && roleTypeId! == "PLACING_CUSTOMER">
+
+
+
+
+
+ #if>
+ #if>
+
+
+ <#-- now cancel reason and comment field -->
+ <#if maySelectItems?default("N") == "Y" && (orderHeader.statusId != "ORDER_SENT" && orderItem.statusId != "ITEM_COMPLETED" && orderItem.statusId != "ITEM_CANCELLED" && pickedQty == 0)>
+
+ ${uiLabelMap.OrderReturnReason}
+
+
+ <#list orderItemChangeReasons as reason>
+ ${reason.get("description",locale)?default(reason.enumId)}
+ #list>
+
+ ${uiLabelMap.CommonComments}
+
+
+ ${uiLabelMap.CommonCancel}
+
+
+
+ #if>
+
+ <#-- show info from workeffort if it was a rental item -->
+ <#if orderItem.orderItemTypeId == "RENTAL_ORDER_ITEM">
+ <#if workEffortSave??>
+ ${uiLabelMap.CommonFrom}: ${workEffortSave.estimatedStartDate?string("yyyy-MM-dd")} ${uiLabelMap.CommonUntil} ${workEffortSave.estimatedCompletionDate?string("yyyy-MM-dd")} ${uiLabelMap.CommonFor} ${workEffortSave.reservPersons} ${uiLabelMap.CommonPerson}(s)
+ #if>
+ #if>
+
+ <#-- now show adjustment details per line item -->
+ <#assign itemAdjustments = localOrderReadHelper.getOrderItemAdjustments(orderItem)>
+ <#list itemAdjustments as orderItemAdjustment>
+
+
+ ${uiLabelMap.EcommerceAdjustment}: ${StringUtil.wrapString(localOrderReadHelper.getAdjustmentType(orderItemAdjustment))}
+ <#if orderItemAdjustment.description?has_content>: ${StringUtil.wrapString(orderItemAdjustment.description)}#if>
+ <#if orderItemAdjustment.orderAdjustmentTypeId == "SALES_TAX">
+ <#if orderItemAdjustment.primaryGeoId?has_content>
+ <#assign primaryGeo = orderItemAdjustment.getRelatedOne("PrimaryGeo", true)/>
+ <#if primaryGeo.geoName?has_content>
+ ${uiLabelMap.OrderJurisdiction}: ${primaryGeo.geoName} [${primaryGeo.abbreviation!}]
+ #if>
+ <#if orderItemAdjustment.secondaryGeoId?has_content>
+ <#assign secondaryGeo = orderItemAdjustment.getRelatedOne("SecondaryGeo", true)/>
+ (${uiLabelMap.CommonIn}: ${secondaryGeo.geoName} [${secondaryGeo.abbreviation!}])
+ #if>
+ #if>
+ <#if orderItemAdjustment.sourcePercentage??>${uiLabelMap.EcommerceRate}: ${orderItemAdjustment.sourcePercentage}#if>
+ <#if orderItemAdjustment.customerReferenceId?has_content>${uiLabelMap.OrderCustomerTaxId}: ${orderItemAdjustment.customerReferenceId}#if>
+ <#if orderItemAdjustment.exemptAmount??>${uiLabelMap.EcommerceExemptAmount}: ${orderItemAdjustment.exemptAmount}#if>
+ #if>
+
+
+
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentTotal(orderItem, orderItemAdjustment) isoCode=currencyUomId/>
+
+
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+ #list>
+
+ <#-- show the order item ship group info -->
+ <#assign orderItemShipGroupAssocs = orderItem.getRelated("OrderItemShipGroupAssoc", null, null, false)!>
+ <#if orderItemShipGroupAssocs?has_content>
+ <#list orderItemShipGroupAssocs as shipGroupAssoc>
+ <#assign shipGroup = shipGroupAssoc.getRelatedOne("OrderItemShipGroup", false)!>
+ <#assign shipGroupAddress = (shipGroup.getRelatedOne("PostalAddress", false))!>
+
+
+ ${uiLabelMap.OrderShipGroup}: [${shipGroup.shipGroupSeqId}] ${shipGroupAddress.address1?default("N/A")}
+
+
+ ${shipGroupAssoc.quantity?string.number}
+
+
+
+ #list>
+ #if>
+ #list>
+ <#if orderItems?size == 0 || !orderItems?has_content>
+ ${uiLabelMap.OrderSalesOrderLookupFailed}
+ #if>
+
+
+
+
diff --git a/template/order/ReviewPayment.ftl b/template/order/ReviewPayment.ftl
new file mode 100644
index 0000000..59421b8
--- /dev/null
+++ b/template/order/ReviewPayment.ftl
@@ -0,0 +1,120 @@
+
+
+
${uiLabelMap.AccountingPaymentInformation}
+
+
+ <#if paymentMethods?has_content || paymentMethodType?has_content || billingAccount?has_content>
+ <#-- order payment info -->
+ <#-- offline payment address infomation :: change this to use Company's address -->
+ <#if !paymentMethod?has_content && paymentMethodType?has_content>
+ <#if paymentMethodType.paymentMethodTypeId == "EXT_OFFLINE">
+ ${uiLabelMap.AccountingOfflinePayment}
+ <#if orderHeader?has_content && paymentAddress?has_content>
+ ${uiLabelMap.OrderSendPaymentTo}:
+ <#if paymentAddress.toName?has_content>${paymentAddress.toName}#if>
+ <#if paymentAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${paymentAddress.attnName}#if>
+ ${paymentAddress.address1}
+ <#if paymentAddress.address2?has_content>${paymentAddress.address2}#if>
+ <#assign paymentStateGeo = (delegator.findOne("Geo", {"geoId", paymentAddress.stateProvinceGeoId!}, false))! />
+ ${paymentAddress.city}<#if paymentStateGeo?has_content>, ${paymentStateGeo.geoName!}#if> ${paymentAddress.postalCode!}
+ <#assign paymentCountryGeo = (delegator.findOne("Geo", {"geoId", paymentAddress.countryGeoId!}, false))! />
+ <#if paymentCountryGeo?has_content>${paymentCountryGeo.geoName!}#if>
+ ${uiLabelMap.EcommerceBeSureToIncludeYourOrderNb}
+ #if>
+ <#else>
+ <#assign outputted = true>
+ ${uiLabelMap.AccountingPaymentVia} ${paymentMethodType.get("description",locale)}
+ #if>
+ #if>
+
+ <#if paymentMethods?has_content>
+ <#list paymentMethods as paymentMethod>
+ <#if "CREDIT_CARD" == paymentMethod.paymentMethodTypeId>
+ <#assign creditCard = paymentMethod.getRelatedOne("CreditCard", false)>
+ <#assign formattedCardNumber = Static["org.ofbiz.party.contact.ContactHelper"].formatCreditCard(creditCard)>
+ <#elseif "GIFT_CARD" == paymentMethod.paymentMethodTypeId>
+ <#assign giftCard = paymentMethod.getRelatedOne("GiftCard", false)>
+ <#elseif "EFT_ACCOUNT" == paymentMethod.paymentMethodTypeId>
+ <#assign eftAccount = paymentMethod.getRelatedOne("EftAccount", false)>
+ #if>
+ <#-- credit card info -->
+ <#if "CREDIT_CARD" == paymentMethod.paymentMethodTypeId && creditCard?has_content>
+ <#if outputted?default(false)>
+ #if>
+ <#assign pmBillingAddress = creditCard.getRelatedOne("PostalAddress", false)!>
+
+
+
+ ${uiLabelMap.AccountingCreditCard}
+ <#if creditCard.companyNameOnCard?has_content>${creditCard.companyNameOnCard}#if>
+ <#if creditCard.titleOnCard?has_content>${creditCard.titleOnCard}#if>
+ ${creditCard.firstNameOnCard}
+ <#if creditCard.middleNameOnCard?has_content>${creditCard.middleNameOnCard}#if>
+ ${creditCard.lastNameOnCard}
+ <#if creditCard.suffixOnCard?has_content>${creditCard.suffixOnCard}#if>
+
+ ${formattedCardNumber}
+
+
+ <#-- Gift Card info -->
+ <#elseif "GIFT_CARD" == paymentMethod.paymentMethodTypeId && giftCard?has_content>
+ <#if outputted?default(false)>
+ #if>
+ <#if giftCard?has_content && giftCard.cardNumber?has_content>
+ <#assign pmBillingAddress = giftCard.getRelatedOne("PostalAddress", false)!>
+ <#assign giftCardNumber = "">
+ <#assign pcardNumber = giftCard.cardNumber>
+ <#if pcardNumber?has_content>
+ <#assign psize = pcardNumber?length - 4>
+ <#if 0 < psize>
+ <#list 0 .. psize-1 as foo>
+ <#assign giftCardNumber = giftCardNumber + "*">
+ #list>
+ <#assign giftCardNumber = giftCardNumber + pcardNumber[psize .. psize + 3]>
+ <#else>
+ <#assign giftCardNumber = pcardNumber>
+ #if>
+ #if>
+ #if>
+ ${uiLabelMap.AccountingGiftCard}
+ ${giftCardNumber}
+ <#-- EFT account info -->
+ <#elseif "EFT_ACCOUNT" == paymentMethod.paymentMethodTypeId && eftAccount?has_content>
+ <#if outputted?default(false)>
+ #if>
+ <#assign pmBillingAddress = eftAccount.getRelatedOne("PostalAddress", false)!>
+ ${uiLabelMap.AccountingEFTAccount}
+ ${eftAccount.nameOnAccount!}
+ <#if eftAccount.companyNameOnAccount?has_content>${eftAccount.companyNameOnAccount}#if>
+ ${uiLabelMap.AccountingBank}: ${eftAccount.bankName}, ${eftAccount.routingNumber}
+ ${uiLabelMap.AccountingAccount} #: ${eftAccount.accountNumber}
+ #if>
+ <#if pmBillingAddress?has_content>
+ <#if pmBillingAddress.toName?has_content>${uiLabelMap.CommonTo}: ${pmBillingAddress.toName}#if>
+ <#if pmBillingAddress.attnName?has_content>${uiLabelMap.CommonAttn}: ${pmBillingAddress.attnName}#if>
+ <#if pmBillingAddress.address2?has_content>${pmBillingAddress.address2}#if>
+ <#assign pmBillingStateGeo = (delegator.findOne("Geo", {"geoId", pmBillingAddress.stateProvinceGeoId!}, false))! />
+ ${pmBillingAddress.city}<#if pmBillingStateGeo?has_content>, ${ pmBillingStateGeo.geoName!}#if> ${pmBillingAddress.postalCode!}
+ <#assign pmBillingCountryGeo = (delegator.findOne("Geo", {"geoId", pmBillingAddress.countryGeoId!}, false))! />
+ <#if pmBillingCountryGeo?has_content>${pmBillingCountryGeo.geoName!}#if>
+ #if>
+ <#assign outputted = true>
+ #list>
+ #if>
+ <#-- billing account info -->
+ <#if billingAccount?has_content>
+ <#if outputted?default(false)>
+ #if>
+ <#assign outputted = true>
+ ${uiLabelMap.AccountingBillingAccount}
+ #${billingAccount.billingAccountId!} - ${billingAccount.description!}
+ #if>
+ <#if (customerPoNumberSet?has_content)>
+ ${uiLabelMap.OrderPurchaseOrderNumber}
+ <#list customerPoNumberSet as customerPoNumber>
+ ${customerPoNumber!}
+ #list>
+ #if>
+ #if>
+
+
\ No newline at end of file
diff --git a/template/order/ReviewStatus.ftl b/template/order/ReviewStatus.ftl
new file mode 100644
index 0000000..0ceabc7
--- /dev/null
+++ b/template/order/ReviewStatus.ftl
@@ -0,0 +1,12 @@
+
+
+
${uiLabelMap.CommonStatus}
+
+
+ <#if orderHeader?has_content>
+ ${localOrderReadHelper.getStatusString(locale)}
+ <#else>
+ ${uiLabelMap.OrderNotYetOrdered}
+ #if>
+
+
\ No newline at end of file
diff --git a/template/order/ShippingOptionAddEmail.ftl b/template/order/ShippingOptionAddEmail.ftl
new file mode 100644
index 0000000..c027592
--- /dev/null
+++ b/template/order/ShippingOptionAddEmail.ftl
@@ -0,0 +1,25 @@
+
+
+
${uiLabelMap.PartyEmailAddresses}
+
+
+
+
+
+ ${uiLabelMap.OrderEmailSentToFollowingAddresses}:
+
+
+ <#list emailList as email>
+ ${email.infoString!}<#if email_has_next>,#if>
+ #list>
+
+
+
+
+ ${uiLabelMap.OrderCommaSeperatedEmailAddresses}:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/ShippingOptionAllAtOnce.ftl b/template/order/ShippingOptionAllAtOnce.ftl
new file mode 100644
index 0000000..80eba50
--- /dev/null
+++ b/template/order/ShippingOptionAllAtOnce.ftl
@@ -0,0 +1,25 @@
+
+
+
${uiLabelMap.OrderShipAllAtOnce}?
+
+
+
\ No newline at end of file
diff --git a/template/order/ShippingOptionGift.ftl b/template/order/ShippingOptionGift.ftl
new file mode 100644
index 0000000..f734b84
--- /dev/null
+++ b/template/order/ShippingOptionGift.ftl
@@ -0,0 +1,32 @@
+
+
+
${uiLabelMap.OrderIsThisGift}?
+
+
+
+
+
+
${uiLabelMap.OrderGiftMessage}
+
+
+
+
+
+ ${shoppingCart.getGiftMessage()!}
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/ShippingOptionPONumber.ftl b/template/order/ShippingOptionPONumber.ftl
new file mode 100644
index 0000000..a6d6bc4
--- /dev/null
+++ b/template/order/ShippingOptionPONumber.ftl
@@ -0,0 +1,18 @@
+
+
+
${uiLabelMap.OrderPoNumber}?
+
+
+
+
\ No newline at end of file
diff --git a/template/order/ShippingOptionSpecInstruction.ftl b/template/order/ShippingOptionSpecInstruction.ftl
new file mode 100644
index 0000000..978c640
--- /dev/null
+++ b/template/order/ShippingOptionSpecInstruction.ftl
@@ -0,0 +1,14 @@
+
+
+
${uiLabelMap.OrderSpecialInstructions}?
+
+
+
+
+
+ ${shoppingCart.getShippingInstructions()!}
+
+
+
+
+
\ No newline at end of file
diff --git a/template/order/anonymousCheckoutLinks.ftl b/template/order/anonymousCheckoutLinks.ftl
new file mode 100644
index 0000000..8f7772d
--- /dev/null
+++ b/template/order/anonymousCheckoutLinks.ftl
@@ -0,0 +1,51 @@
+<#--
+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.
+-->
+
+
diff --git a/template/order/anonymoustrail.ftl b/template/order/anonymoustrail.ftl
new file mode 100644
index 0000000..42d3179
--- /dev/null
+++ b/template/order/anonymoustrail.ftl
@@ -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.
+-->
+
+<#if shipAddr??>
${uiLabelMap.EcommerceChangeShippingAddress} <#if shipOptions??>
${uiLabelMap.EcommerceChangeShippingOptions} <#if billing??>
${uiLabelMap.EcommerceChangePaymentInfo} #if>#if>#if>
diff --git a/template/order/billsettings.ftl b/template/order/billsettings.ftl
new file mode 100644
index 0000000..63720ad
--- /dev/null
+++ b/template/order/billsettings.ftl
@@ -0,0 +1,293 @@
+<#--
+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 requestParameters.singleUsePayment?default("N") != "Y">
+
+ ${screens.render(anonymoustrailScreen)}
+
+ #if>
+
+
${uiLabelMap.AccountingPaymentInformation}
+
+
+ <#if (paymentMethodType?? && !requestParameters.resetType?has_content) || finalizeMode?default("") == "payment">
+ <#-- after initial screen; show detailed screens for selected type -->
+ <#if paymentMethodType == "CC">
+ <#if creditCard?has_content && postalAddress?has_content>
+
+
+
+ <#elseif requestParameters.useShipAddr??>
+
+ <#else>
+
+ #if>
+ #if>
+ <#if paymentMethodType == "EFT">
+ <#if eftAccount?has_content && postalAddress?has_content>
+
+
+
+ <#elseif requestParameters.useShipAddr??>
+
+ <#else>
+
+ #if>
+ #if>
+ <#if paymentMethodType == "GC">
+
+ #if>
+
+ <#if requestParameters.singleUsePayment?default("N") == "Y">
+
+
+ #if>
+
+
+
+
+
+
+ <#if requestParameters.useShipAddr??>
+
+ #if>
+
+
+ <#else>
+ <#-- initial screen show a list of options -->
+
+
+
+
+
+ #if>
+
+
diff --git a/template/order/ccinfo.ftl b/template/order/ccinfo.ftl
new file mode 100644
index 0000000..c01ce3d
--- /dev/null
+++ b/template/order/ccinfo.ftl
@@ -0,0 +1,26 @@
+<#--
+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 !creditCard?has_content>
+ <#assign creditCard = requestParameters>
+#if>
+
+
+${screens.render("component://accounting/widget/CommonScreens.xml#creditCardFields")}
+
diff --git a/template/order/checkoutpayment.ftl b/template/order/checkoutpayment.ftl
new file mode 100644
index 0000000..1564ce6
--- /dev/null
+++ b/template/order/checkoutpayment.ftl
@@ -0,0 +1,268 @@
+<#--
+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 cart = shoppingCart! />
+
+
+
+
+
+
+
+
+
+
3)${uiLabelMap.OrderHowShallYouPay}?
+
+
+ <#-- Payment Method Selection -->
+
+
+ checked="checked"#if> />
+ ${uiLabelMap.OrderMoneyOrder}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_COD??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.OrderCOD}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_WORLDPAY??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithWorldPay}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_PAYPAL??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithPayPal}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_IDEAL??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithiDEAL}
+
+
+
+
${uiLabelMap.AccountingBank}
+
+ <#if issuerList?has_content>
+ <#list issuerList as issuer>
+ ${issuer.getIssuerName()}
+ #list>
+ #if>
+
+
+ #if>
+ <#if !paymentMethodList?has_content>
+
+ ${uiLabelMap.AccountingNoPaymentMethods}.
+
+ <#else>
+ <#list paymentMethodList as paymentMethod>
+ <#if paymentMethod.paymentMethodTypeId == "GIFT_CARD">
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+ <#assign giftCard = paymentMethod.getRelatedOne("GiftCard", false) />
+
+ <#if giftCard?has_content && giftCard.cardNumber?has_content>
+ <#assign giftCardNumber = "" />
+ <#assign pcardNumber = giftCard.cardNumber />
+ <#if pcardNumber?has_content>
+ <#assign psize = pcardNumber?length - 4 />
+ <#if 0 < psize>
+ <#list 0 .. psize-1 as foo>
+ <#assign giftCardNumber = giftCardNumber + "*" />
+ #list>
+ <#assign giftCardNumber = giftCardNumber + pcardNumber[psize .. psize + 3] />
+ <#else>
+ <#assign giftCardNumber = pcardNumber />
+ #if>
+ #if>
+ #if>
+
+
+ #if>
+ <#elseif paymentMethod.paymentMethodTypeId == "CREDIT_CARD">
+ <#if productStorePaymentMethodTypeIdMap.CREDIT_CARD??>
+ <#assign creditCard = paymentMethod.getRelatedOne("CreditCard", false) />
+
+ #if>
+ <#elseif paymentMethod.paymentMethodTypeId == "EFT_ACCOUNT">
+ <#if productStorePaymentMethodTypeIdMap.EFT_ACCOUNT??>
+ <#assign eftAccount = paymentMethod.getRelatedOne("EftAccount", false) />
+
+
checked="checked"#if> />
+
${uiLabelMap.AccountingEFTAccount}:${eftAccount.bankName!}: ${eftAccount.accountNumber!}
+ <#if paymentMethod.description?has_content>
(${paymentMethod.description})
#if>
+
${uiLabelMap.CommonUpdate}
+
+ #if>
+ #if>
+ #list>
+ #if>
+
+ <#-- special billing account functionality to allow use w/ a payment method -->
+ <#if productStorePaymentMethodTypeIdMap.EXT_BILLACT??>
+ <#if billingAccountList?has_content>
+
+
+
+ <#list billingAccountList as billingAccount>
+ <#assign availableAmount = billingAccount.accountBalance>
+ <#assign accountLimit = billingAccount.accountLimit>
+ selected="selected"#if>>${billingAccount.description?default("")} [${billingAccount.billingAccountId}] ${uiLabelMap.EcommerceAvailable} <@ofbizCurrency amount=availableAmount isoCode=billingAccount.accountCurrencyUomId/> ${uiLabelMap.EcommerceLimit} <@ofbizCurrency amount=accountLimit isoCode=billingAccount.accountCurrencyUomId/>
+ #list>
+
+ ${uiLabelMap.FormFieldTitle_billingAccountId}
+
+
+
+ ${uiLabelMap.OrderBillUpTo}
+
+ #if>
+ #if>
+ <#-- end of special billing account functionality -->
+
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+
+
+
+ ${uiLabelMap.AccountingUseGiftCardNotOnFile}
+
+
+ ${uiLabelMap.AccountingNumber}
+
+
+ <#if cart.isPinRequiredForGC(delegator)>
+
+ ${uiLabelMap.AccountingPIN}
+
+
+ #if>
+
+ ${uiLabelMap.AccountingAmount}
+
+
+ #if>
+
+
+ <#-- End Payment Method Selection -->
+
+
+
+
+
+
diff --git a/template/order/checkoutreview.ftl b/template/order/checkoutreview.ftl
new file mode 100644
index 0000000..7538494
--- /dev/null
+++ b/template/order/checkoutreview.ftl
@@ -0,0 +1,65 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.OrderFinalCheckoutReview}
+<#if !isDemoStore?? && isDemoStore>
${uiLabelMap.OrderDemoFrontNote}.
#if>
+
+<#if cart?? && 0 < cart.size()>
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+
+<#else>
+
${uiLabelMap.OrderErrorShoppingCartEmpty}.
+#if>
diff --git a/template/order/checkoutshippingaddress.ftl b/template/order/checkoutshippingaddress.ftl
new file mode 100644
index 0000000..ba324f6
--- /dev/null
+++ b/template/order/checkoutshippingaddress.ftl
@@ -0,0 +1,149 @@
+<#--
+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 cart = shoppingCart!/>
+
+
+
+
+
+
1) ${uiLabelMap.OrderWhereShallWeShipIt}?
+
+
+
+
+
+ ${uiLabelMap.OrderSplitShipment}
+ ${uiLabelMap.PartyAddNewAddress}
+ <#if (cart.getShipGroupSize() > 1)>
+ ${uiLabelMap.OrderNOTEMultipleShipmentsExist}
+ #if>
+
+
+ <#if shippingContactMechList?has_content>
+
+ <#list shippingContactMechList as shippingContactMech>
+ <#assign shippingAddress = shippingContactMech.getRelatedOne("PostalAddress", false)>
+ <#assign checkThisAddress = (shippingContactMech_index == 0 && !cart.getShippingContactMechId()?has_content) || (cart.getShippingContactMechId()?default("") == shippingAddress.contactMechId)/>
+
+
+ checked="checked"#if> />
+
+
+
+ <#if shippingAddress.toName?has_content>
${uiLabelMap.CommonTo}: ${shippingAddress.toName}
#if>
+ <#if shippingAddress.attnName?has_content>
${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName}
#if>
+ <#if shippingAddress.address1?has_content>${shippingAddress.address1}
#if>
+ <#if shippingAddress.address2?has_content>${shippingAddress.address2}
#if>
+ <#if shippingAddress.city?has_content>${shippingAddress.city}#if>
+ <#if shippingAddress.stateProvinceGeoId?has_content>
${shippingAddress.stateProvinceGeoId}#if>
+ <#if shippingAddress.postalCode?has_content>
${shippingAddress.postalCode}#if>
+ <#if shippingAddress.countryGeoId?has_content>
${shippingAddress.countryGeoId}#if>
+
${uiLabelMap.CommonUpdate}
+
+
+
+
+ #list>
+ #if>
+
+
${uiLabelMap.AccountingAgreementInformation}
+
+
+ <#-- Party Tax Info -->
+
${uiLabelMap.PartyTaxIdentification}
+ ${screens.render("component://order/widget/ordermgr/OrderEntryOrderScreens.xml#customertaxinfo")}
+
+
+
+
+
+
diff --git a/template/order/checkoutshippingoptions.ftl b/template/order/checkoutshippingoptions.ftl
new file mode 100644
index 0000000..2aca856
--- /dev/null
+++ b/template/order/checkoutshippingoptions.ftl
@@ -0,0 +1,203 @@
+<#--
+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.
+-->
+
+
+
+
+
+
+
+
+
+
2) ${uiLabelMap.OrderHowShallWeShipIt}
+
+
+
+
+
+
+
diff --git a/template/order/custsettings.ftl b/template/order/custsettings.ftl
new file mode 100644
index 0000000..a135576
--- /dev/null
+++ b/template/order/custsettings.ftl
@@ -0,0 +1,127 @@
+<#--
+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.
+-->
+
+
+
${uiLabelMap.EcommerceYourNamePhoneAndEmail}
+
+
+
+
+
+ ${uiLabelMap.CommonTitle}
+
+ <#if requestParameters.personalTitle?has_content >
+ ${parameters.personalTitle}
+ --
+ <#else>
+ ${uiLabelMap.CommonSelectOne}
+ #if>
+ ${uiLabelMap.CommonTitleMr}
+ ${uiLabelMap.CommonTitleMrs}
+ ${uiLabelMap.CommonTitleMs}
+ ${uiLabelMap.CommonTitleDr}
+
+
+
+ ${uiLabelMap.PartyFirstName}
+ *
+
+
+ ${uiLabelMap.PartyMiddleInitial}
+
+
+
+ ${uiLabelMap.PartyLastName}
+ *
+
+
+ ${uiLabelMap.PartySuffix}
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.PartyEmailAddress}
+
+ *
+
+
+ ${uiLabelMap.PartyAllowSolicitation}
+
+ <#if (((parameters.emailSol)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((parameters.emailSol)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
+
+
+
+
diff --git a/template/order/eftinfo.ftl b/template/order/eftinfo.ftl
new file mode 100644
index 0000000..8af1ebd
--- /dev/null
+++ b/template/order/eftinfo.ftl
@@ -0,0 +1,60 @@
+<#--
+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.
+-->
+
+<#-- eft fields -->
+<#if !eftAccount?has_content><#assign eftAccount = requestParameters>#if>
+
+
+
${uiLabelMap.AccountingEFTAccountInformation}
+
+ ${uiLabelMap.AccountingNameOnAccount}
+
+ *
+
+
+ ${uiLabelMap.AccountingCompanyNameOnAccount}
+
+
+
+ ${uiLabelMap.AccountingBankName}
+ *
+
+
+ ${uiLabelMap.AccountingRoutingNumber}
+ *
+
+
+ ${uiLabelMap.AccountingAccountType}
+
+
+ ${eftAccount.accountType!}
+
+ Checking
+ Savings
+ *
+
+
+
+ ${uiLabelMap.AccountingAccountNumber}
+ *
+
+
+ ${uiLabelMap.CommonDescription}
+
+
diff --git a/template/order/gcinfo.ftl b/template/order/gcinfo.ftl
new file mode 100644
index 0000000..5995eff
--- /dev/null
+++ b/template/order/gcinfo.ftl
@@ -0,0 +1,62 @@
+<#--
+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.
+-->
+
+<#-- gift card fields -->
+
+ <#assign giftCard = giftCard!>
+ <#if paymentMethodTypeId! != "GIFT_CARD">
+
+
+
+ #if>
+
+ ${uiLabelMap.AccountingGiftCardInformation}
+
+
+
+
+ ${uiLabelMap.AccountingGiftCardNumber}
+
+
+
+ *
+
+
+ ${uiLabelMap.AccountingPINNumber}
+
+
+
+ *
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+
+
+ <#if paymentMethodTypeId! != "GIFT_CARD">
+
+ ${uiLabelMap.AccountingAmountToUse}
+
+
+
+ *
+
+ #if>
diff --git a/template/order/genericaddress.ftl b/template/order/genericaddress.ftl
new file mode 100644
index 0000000..5b57077
--- /dev/null
+++ b/template/order/genericaddress.ftl
@@ -0,0 +1,113 @@
+<#--
+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.
+-->
+
+<#-- generic address information -->
+<#assign toName = (parameters.toName)!>
+<#if !toName?has_content && person?? && person?has_content>
+ <#assign toName = "">
+ <#if person.personalTitle?has_content><#assign toName = person.personalTitle + " ">#if>
+ <#assign toName = toName + person.firstName + " ">
+ <#if person.middleName?has_content><#assign toName = toName + person.middleName + " ">#if>
+ <#assign toName = toName + person.lastName>
+ <#if person.suffix?has_content><#assign toName = toName + " " + person.suffix>#if>
+#if>
+
+
+ ${uiLabelMap.PartyToName}
+
+
+ disabled#if>/>
+
+
+
+ ${uiLabelMap.PartyAttentionName}
+
+
+ disabled#if>/>
+
+
+
+ ${uiLabelMap.PartyAddressLine1}
+
+
+ disabled#if>/>
+ *
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+ disabled#if>/>
+
+
+
+ ${uiLabelMap.PartyCity}
+
+
+ disabled#if>/>
+ *
+
+
+ ${uiLabelMap.PartyState}
+
+
+ disabled#if>>
+ <#if (parameters.stateProvinceGeoId)??>
+ ${parameters.stateProvinceGeoId}
+ ---
+ <#else>
+ ${uiLabelMap.PartyNoState}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#states")}
+
+ *
+
+
+ ${uiLabelMap.PartyZipCode}
+
+
+ disabled#if>/>
+ *
+
+
+ ${uiLabelMap.CommonCountry}
+
+
+ disabled#if>>
+ <#if (parameters.countryGeoId)??>
+ ${parameters.countryGeoId}
+ ---
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+
+ *
+
+
+ ${uiLabelMap.PartyAllowSolicitation}?
+
+
+ disabled#if>>
+ <#if (((parameters.allowSolicitation)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((parameters.allowSolicitation)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
diff --git a/template/order/optionsettings.ftl b/template/order/optionsettings.ftl
new file mode 100644
index 0000000..430585e
--- /dev/null
+++ b/template/order/optionsettings.ftl
@@ -0,0 +1,85 @@
+<#--
+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.
+-->
+
+
${uiLabelMap.OrderShippingInformation}
+
+ ${uiLabelMap.OrderShippingInformation}
+
+
+ ${uiLabelMap.OrderShipAllAtOnce}?
+
+ checked="checked"#if> name="may_split" value="false"/>
+ ${uiLabelMap.OrderPleaseWaitUntilBeforeShipping}.
+
+
+ checked="checked"#if> name="may_split" value="true"/>
+ ${uiLabelMap.OrderPleaseShipItemsBecomeAvailable}.
+
+
+
+
+ ${uiLabelMap.OrderSpecialInstructions}
+ ${shoppingCart.getShippingInstructions()!}
+
+
+ ${uiLabelMap.OrderPoNumber}
+
+
+
+ <#if productStore.showCheckoutGiftOptions! != "N">
+ ${uiLabelMap.OrderIsThisGift}
+
+ checked="checked"#if> name="is_gift" value="true"/>
+ ${uiLabelMap.CommonYes}
+
+
+ checked="checked"#if> name="is_gift" value="false"/>
+ ${uiLabelMap.CommonNo}
+
+
+ ${uiLabelMap.OrderGiftMessage}
+ ${shoppingCart.getGiftMessage()!}
+
+
+ #if>
+
+
+
+
diff --git a/template/order/ordercomplete.ftl b/template/order/ordercomplete.ftl
new file mode 100644
index 0000000..83f1da7
--- /dev/null
+++ b/template/order/ordercomplete.ftl
@@ -0,0 +1,27 @@
+<#--
+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.
+-->
+
${uiLabelMap.EcommerceOrderConfirmation}
+<#if !isDemoStore?? || isDemoStore>
${uiLabelMap.OrderDemoFrontNote}.
#if>
+<#if orderHeader?has_content>
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+
${uiLabelMap.EcommerceContinueShopping}
+<#else>
+
${uiLabelMap.OrderSpecifiedNotFound}.
+#if>
diff --git a/template/order/orderheader.ftl b/template/order/orderheader.ftl
new file mode 100644
index 0000000..03a8166
--- /dev/null
+++ b/template/order/orderheader.ftl
@@ -0,0 +1,57 @@
+<#--
+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.
+-->
+
+<#-- NOTE: this template is used for the orderstatus screen in ecommerce AND for order notification emails through the OrderNoticeEmail.ftl file -->
+<#-- the "urlPrefix" value will be prepended to URLs by the ofbizUrl transform if/when there is no "request" object in the context -->
+<#if baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/>#if>
+<#if (orderHeader.externalId)?? && (orderHeader.externalId)?has_content >
+ <#assign externalOrder = "(" + orderHeader.externalId + ")"/>
+#if>
+
+
diff --git a/template/order/orderhistory.ftl b/template/order/orderhistory.ftl
new file mode 100644
index 0000000..5ae52d1
--- /dev/null
+++ b/template/order/orderhistory.ftl
@@ -0,0 +1,22 @@
+<#--
+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.
+-->
+
+<#include "OrderHistorySubmitted.ftl"/>
+<#include "OrderHistoryShipped.ftl"/>
+<#include "OrderHistoryDownloads.ftl"/>
diff --git a/template/order/orderitems.ftl b/template/order/orderitems.ftl
new file mode 100644
index 0000000..4bff3c7
--- /dev/null
+++ b/template/order/orderitems.ftl
@@ -0,0 +1,301 @@
+<#--
+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.
+-->
+
+<#-- NOTE: this template is used for the orderstatus screen in ecommerce AND for order notification emails through the OrderNoticeEmail.ftl file -->
+<#-- the "urlPrefix" value will be prepended to URLs by the ofbizUrl transform if/when there is no "request" object in the context -->
+<#if baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/>#if>
+
+
+
+
+
+ ${uiLabelMap.OrderProduct}
+ <#if maySelectItems?default("N") == "Y">
+ ${uiLabelMap.OrderQtyOrdered}
+ ${uiLabelMap.OrderQtyPicked}
+ ${uiLabelMap.OrderQtyShipped}
+ ${uiLabelMap.OrderQtyCanceled}
+ <#else>
+
+
+
+ ${uiLabelMap.OrderQtyOrdered}
+ #if>
+ ${uiLabelMap.EcommerceUnitPrice}
+ ${uiLabelMap.OrderAdjustments}
+ ${uiLabelMap.CommonSubtotal}
+ <#if maySelectItems?default("N") == "Y" && roleTypeId! == "PLACING_CUSTOMER">
+
+ #if>
+
+
+
+
+ ${uiLabelMap.CommonSubtotal}
+ <@ofbizCurrency amount=orderSubTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+ <#list headerAdjustmentsToShow as orderHeaderAdjustment>
+
+ ${localOrderReadHelper.getAdjustmentType(orderHeaderAdjustment)}
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderAdjustmentTotal(orderHeaderAdjustment) isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+ #list>
+
+ ${uiLabelMap.OrderShippingAndHandling}
+ <@ofbizCurrency amount=orderShippingTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+ ${uiLabelMap.OrderSalesTax}
+ <@ofbizCurrency amount=orderTaxTotal isoCode=currencyUomId/>
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+ <#if maySelectItems?default("N") == "Y">
+
+
+ <#else>
+
+ #if>
+
+
+ ${uiLabelMap.OrderGrandTotal}
+
+ <@ofbizCurrency amount=orderGrandTotal isoCode=currencyUomId/>
+
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+
+
+ <#list orderItems as orderItem>
+ <#-- get info from workeffort and calculate rental quantity, if it was a rental item -->
+ <#assign rentalQuantity = 1> <#-- no change if no rental item -->
+ <#if orderItem.orderItemTypeId == "RENTAL_ORDER_ITEM" && workEfforts??>
+ <#list workEfforts as workEffort>
+ <#if workEffort.workEffortId == orderItem.orderItemSeqId>
+ <#assign rentalQuantity = localOrderReadHelper.getWorkEffortRentalQuantity(workEffort)>
+ <#assign workEffortSave = workEffort>
+ <#break>
+ #if>
+ #list>
+ <#else>
+ <#assign WorkOrderItemFulfillments = orderItem.getRelated("WorkOrderItemFulfillment", null, null, false)!>
+ <#if WorkOrderItemFulfillments?has_content>
+ <#list WorkOrderItemFulfillments as WorkOrderItemFulfillment>
+ <#assign workEffortSave = WorkOrderItemFulfillment.getRelatedOne("WorkEffort", true)!>
+ <#break>
+ #list>
+ #if>
+ #if>
+
+
+ <#if !orderItem.productId?? || orderItem.productId == "_?_">
+
+ ${orderItem.itemDescription?default("")}
+
+ <#else>
+ <#assign product = orderItem.getRelatedOne("Product", true)!/> <#-- should always exist because of FK constraint, but just in case -->
+
+ " class="linktext">${orderItem.productId} - ${orderItem.itemDescription?default("")}
+ <#assign orderItemAttributes = orderItem.getRelated("OrderItemAttribute", null, null, false)/>
+ <#if orderItemAttributes?has_content>
+
+ <#list orderItemAttributes as orderItemAttribute>
+
+ ${orderItemAttribute.attrName} : ${orderItemAttribute.attrValue}
+
+ #list>
+
+ #if>
+ <#if product?has_content>
+ <#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+ [${uiLabelMap.OrderPieces}: ${product.piecesIncluded}]
+ #if>
+ <#if (product.quantityIncluded?? && product.quantityIncluded != 0) || product.quantityUomId?has_content>
+ <#assign quantityUom = product.getRelatedOne("QuantityUom", true)!/>
+ [${uiLabelMap.CommonQuantity}: ${product.quantityIncluded!} ${((quantityUom.abbreviation)?default(product.quantityUomId))!}]
+ #if>
+ <#if (product.productWeight?? && product.productWeight != 0) || product.weightUomId?has_content>
+ <#assign weightUom = product.getRelatedOne("WeightUom", true)!/>
+ [${uiLabelMap.CommonWeight}: ${product.productWeight!} ${((weightUom.abbreviation)?default(product.weightUomId))!}]
+ #if>
+ <#if (product.productHeight?? && product.productHeight != 0) || product.heightUomId?has_content>
+ <#assign heightUom = product.getRelatedOne("HeightUom", true)!/>
+ [${uiLabelMap.CommonHeight}: ${product.productHeight!} ${((heightUom.abbreviation)?default(product.heightUomId))!}]
+ #if>
+ <#if (product.productWidth?? && product.productWidth != 0) || product.widthUomId?has_content>
+ <#assign widthUom = product.getRelatedOne("WidthUom", true)!/>
+ [${uiLabelMap.CommonWidth}: ${product.productWidth!} ${((widthUom.abbreviation)?default(product.widthUomId))!}]
+ #if>
+ <#if (product.productDepth?? && product.productDepth != 0) || product.depthUomId?has_content>
+ <#assign depthUom = product.getRelatedOne("DepthUom", true)!/>
+ [${uiLabelMap.CommonDepth}: ${product.productDepth!} ${((depthUom.abbreviation)?default(product.depthUomId))!}]
+ #if>
+ #if>
+ <#if maySelectItems?default("N") == "Y">
+ <#assign returns = orderItem.getRelated("ReturnItem", null, null, false)!>
+ <#if returns?has_content>
+ <#list returns as return>
+ <#assign returnHeader = return.getRelatedOne("ReturnHeader", false)>
+ <#if returnHeader.statusId != "RETURN_CANCELLED">
+ <#if returnHeader.statusId == "RETURN_REQUESTED" || returnHeader.statusId == "RETURN_APPROVED">
+ <#assign displayState = "Return Pending">
+ <#else>
+ <#assign displayState = "Returned">
+ #if>
+ ${displayState} (#${return.returnId})
+ #if>
+ #list>
+ #if>
+ #if>
+
+ <#if !(maySelectItems?default("N") == "Y")>
+
+
+
+ #if>
+
+ ${orderItem.quantity?string.number}
+
+ <#if maySelectItems?default("N") == "Y">
+
+ <#assign pickedQty = localOrderReadHelper.getItemPickedQuantityBd(orderItem)>
+ <#if pickedQty gt 0 && orderHeader.statusId == "ORDER_APPROVED">${pickedQty?default(0)?string.number}<#else>${pickedQty?default(0)?string.number}#if>
+
+
+ <#assign shippedQty = localOrderReadHelper.getItemShippedQuantity(orderItem)>
+ ${shippedQty?default(0)?string.number}
+
+
+ <#assign canceledQty = localOrderReadHelper.getItemCanceledQuantity(orderItem)>
+ ${canceledQty?default(0)?string.number}
+
+ #if>
+
+ <@ofbizCurrency amount=orderItem.unitPrice isoCode=currencyUomId/>
+
+
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentsTotal(orderItem) isoCode=currencyUomId/>
+
+
+ <#if workEfforts??>
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemTotal(orderItem)*rentalQuantity isoCode=currencyUomId/>
+ <#else>
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemTotal(orderItem) isoCode=currencyUomId/>
+ #if>
+
+ <#if maySelectItems?default("N") == "Y" && roleTypeId! == "PLACING_CUSTOMER">
+
+
+
+
+
+ #if>
+ #if>
+
+ <#-- now cancel reason and comment field -->
+ <#if maySelectItems?default("N") == "Y" && (orderHeader.statusId != "ORDER_SENT" && orderItem.statusId != "ITEM_COMPLETED" && orderItem.statusId != "ITEM_CANCELLED" && pickedQty == 0)>
+
+ ${uiLabelMap.OrderReturnReason}
+
+
+ <#list orderItemChangeReasons as reason>
+ ${reason.get("description",locale)?default(reason.enumId)}
+ #list>
+
+ ${uiLabelMap.CommonComments}
+
+
+ ${uiLabelMap.CommonCancel}
+
+
+
+ #if>
+ <#-- show info from workeffort if it was a rental item -->
+ <#if orderItem.orderItemTypeId == "RENTAL_ORDER_ITEM">
+ <#if workEffortSave??>
+ ${uiLabelMap.CommonFrom}: ${workEffortSave.estimatedStartDate?string("yyyy-MM-dd")} ${uiLabelMap.CommonUntil} ${workEffortSave.estimatedCompletionDate?string("yyyy-MM-dd")} ${uiLabelMap.CommonFor} ${workEffortSave.reservPersons} ${uiLabelMap.CommonPerson}(s)
+ #if>
+ #if>
+ <#-- now show adjustment details per line item -->
+ <#assign itemAdjustments = localOrderReadHelper.getOrderItemAdjustments(orderItem)>
+ <#list itemAdjustments as orderItemAdjustment>
+
+
+ ${uiLabelMap.EcommerceAdjustment}: ${StringUtil.wrapString(localOrderReadHelper.getAdjustmentType(orderItemAdjustment))}
+ <#if orderItemAdjustment.description?has_content>: ${StringUtil.wrapString(orderItemAdjustment.description)}#if>
+ <#if orderItemAdjustment.orderAdjustmentTypeId == "SALES_TAX">
+ <#if orderItemAdjustment.primaryGeoId?has_content>
+ <#assign primaryGeo = orderItemAdjustment.getRelatedOne("PrimaryGeo", true)/>
+ <#if primaryGeo.geoName?has_content>
+ ${uiLabelMap.OrderJurisdiction}: ${primaryGeo.geoName} [${primaryGeo.abbreviation!}]
+ #if>
+ <#if orderItemAdjustment.secondaryGeoId?has_content>
+ <#assign secondaryGeo = orderItemAdjustment.getRelatedOne("SecondaryGeo", true)/>
+ (${uiLabelMap.CommonIn}: ${secondaryGeo.geoName} [${secondaryGeo.abbreviation!}])
+ #if>
+ #if>
+ <#if orderItemAdjustment.sourcePercentage??>${uiLabelMap.EcommerceRate}: ${orderItemAdjustment.sourcePercentage}#if>
+ <#if orderItemAdjustment.customerReferenceId?has_content>${uiLabelMap.OrderCustomerTaxId}: ${orderItemAdjustment.customerReferenceId}#if>
+ <#if orderItemAdjustment.exemptAmount??>${uiLabelMap.EcommerceExemptAmount}: ${orderItemAdjustment.exemptAmount}#if>
+ #if>
+
+
+
+ <@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentTotal(orderItem, orderItemAdjustment) isoCode=currencyUomId/>
+
+
+ <#if maySelectItems?default("N") == "Y"> #if>
+
+ #list>
+ <#-- show the order item ship group info -->
+ <#assign orderItemShipGroupAssocs = orderItem.getRelated("OrderItemShipGroupAssoc", null, null, false)!>
+ <#if orderItemShipGroupAssocs?has_content>
+ <#list orderItemShipGroupAssocs as shipGroupAssoc>
+ <#assign shipGroup = shipGroupAssoc.getRelatedOne("OrderItemShipGroup", false)!>
+ <#assign shipGroupAddress = (shipGroup.getRelatedOne("PostalAddress", false))!>
+
+
+ ${uiLabelMap.OrderShipGroup}: [${shipGroup.shipGroupSeqId}] ${shipGroupAddress.address1?default("N/A")}
+
+
+ ${shipGroupAssoc.quantity?string.number}
+
+
+
+ #list>
+ #if>
+ #list>
+ <#if orderItems?size == 0 || !orderItems?has_content>
+ ${uiLabelMap.OrderSalesOrderLookupFailed}
+ #if>
+
+
+
+
diff --git a/template/order/orderstatus.ftl b/template/order/orderstatus.ftl
new file mode 100644
index 0000000..b05bfdc
--- /dev/null
+++ b/template/order/orderstatus.ftl
@@ -0,0 +1,29 @@
+<#--
+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 orderHeader?has_content>
+
+
+
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderheader")}
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+
+
+<#else>
+
${uiLabelMap.OrderSpecifiedNotFound}.
+#if>
diff --git a/template/order/paymentinformation.ftl b/template/order/paymentinformation.ftl
new file mode 100644
index 0000000..a41e6f1
--- /dev/null
+++ b/template/order/paymentinformation.ftl
@@ -0,0 +1,247 @@
+<#--
+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 requestParameters.paymentMethodTypeId?has_content>
+ <#assign paymentMethodTypeId = "${requestParameters.paymentMethodTypeId!}">
+#if>
+
+
+
+
+
${uiLabelMap.AccountingPaymentInformation}
+
+
+ <#-- after initial screen; show detailed screens for selected type -->
+ <#if paymentMethodTypeId! == "CREDIT_CARD">
+ <#if creditCard?has_content && postalAddress?has_content && !requestParameters.useShipAddr??>
+
+
+
+ <#elseif requestParameters.useShipAddr??>
+
+ <#else>
+
+ #if>
+ <#elseif paymentMethodTypeId! == "EFT_ACCOUNT">
+ <#if eftAccount?has_content && postalAddress?has_content>
+
+
+
+ <#elseif requestParameters.useShipAddr??>
+
+ <#else>
+
+ #if>
+ <#elseif paymentMethodTypeId! == "GIFT_CARD"> <#--Don't know much how this is handled -->
+
+ <#elseif paymentMethodTypeId! == "EXT_OFFLINE">
+
+ <#else>
+ ${uiLabelMap.AccountingPaymentMethodTypeNotHandled} ${paymentMethodTypeId!}
+ #if>
+
+ <#if requestParameters.singleUsePayment?default("N") == "Y">
+
+
+ #if>
+
+
+
+
+ <#if requestParameters.useShipAddr??>
+
+ #if>
+
+
+
+
+
diff --git a/template/order/paymentoptions.ftl b/template/order/paymentoptions.ftl
new file mode 100644
index 0000000..409f90a
--- /dev/null
+++ b/template/order/paymentoptions.ftl
@@ -0,0 +1,59 @@
+<#--
+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.
+-->
+
+
+
${uiLabelMap.AccountingPaymentInformation}
+ <#-- initial screen show a list of options -->
+
+
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingCheckGiftCard}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_OFFLINE??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.OrderPaymentOfflineCheckMoney}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.CREDIT_CARD??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingVisaMastercardAmexDiscover}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EFT_ACCOUNT??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingAHCElectronicCheck}
+
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_PAYPAL??>
+
+ checked="checked"#if> />
+ ${uiLabelMap.AccountingPayWithPayPal}
+
+ #if>
+
+
+
+
+
diff --git a/template/order/quickAnonCheckoutLinks.ftl b/template/order/quickAnonCheckoutLinks.ftl
new file mode 100644
index 0000000..51a6534
--- /dev/null
+++ b/template/order/quickAnonCheckoutLinks.ftl
@@ -0,0 +1,31 @@
+<#--
+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.
+-->
+
+
diff --git a/template/order/quickAnonCheckoutReview.ftl b/template/order/quickAnonCheckoutReview.ftl
new file mode 100644
index 0000000..1380e27
--- /dev/null
+++ b/template/order/quickAnonCheckoutReview.ftl
@@ -0,0 +1,74 @@
+<#--
+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.
+-->
+
+
+
+
${uiLabelMap.OrderFinalCheckoutReview}
+<#if !isDemoStore?? || isDemoStore>
${uiLabelMap.OrderDemoFrontNote}.
#if>
+
+<#if cart?? && 0 < cart.size()>
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#quickAnonOrderHeader")}
+
+
${screens.render("component://${activeApp}/widget/OrderScreens.xml#orderitems")}
+
+
+
+<#else>
+
${uiLabelMap.OrderErrorShoppingCartEmpty}.
+#if>
diff --git a/template/order/quickAnonCustSettings.ftl b/template/order/quickAnonCustSettings.ftl
new file mode 100644
index 0000000..a6bdf92
--- /dev/null
+++ b/template/order/quickAnonCustSettings.ftl
@@ -0,0 +1,333 @@
+<#--
+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.
+-->
+
+
+<#macro fieldErrors fieldName>
+ <#if errorMessageList?has_content>
+ <#assign fieldMessages = Static["org.ofbiz.base.util.MessageString"].getMessagesForField(fieldName, true, errorMessageList)>
+
+ <#list fieldMessages as errorMsg>
+ ${errorMsg}
+ #list>
+
+ #if>
+#macro>
+<#macro fieldErrorsMulti fieldName1 fieldName2 fieldName3 fieldName4>
+ <#if errorMessageList?has_content>
+ <#assign fieldMessages = Static["org.ofbiz.base.util.MessageString"].getMessagesForField(fieldName1, fieldName2, fieldName3, fieldName4, true, errorMessageList)>
+
+ <#list fieldMessages as errorMsg>
+ ${errorMsg}
+ #list>
+
+ #if>
+#macro>
+
+
+
+
${uiLabelMap.PartyBasicInformation}
+
+
+
diff --git a/template/order/quickAnonOptionSettings.ftl b/template/order/quickAnonOptionSettings.ftl
new file mode 100644
index 0000000..15cced5
--- /dev/null
+++ b/template/order/quickAnonOptionSettings.ftl
@@ -0,0 +1,168 @@
+<#--
+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.
+-->
+
+
+
+
+
diff --git a/template/order/quickAnonOrderHeader.ftl b/template/order/quickAnonOrderHeader.ftl
new file mode 100644
index 0000000..edfa96c
--- /dev/null
+++ b/template/order/quickAnonOrderHeader.ftl
@@ -0,0 +1,160 @@
+<#--
+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.
+-->
+
+<#-- NOTE: this template is used for the orderstatus screen in ecommerce AND for order notification emails through the OrderNoticeEmail.ftl file -->
+<#-- the "urlPrefix" value will be prepended to URLs by the ofbizUrl transform if/when there is no "request" object in the context -->
+<#if baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/>#if>
+
+
+
+ <#-- left side -->
+
+
+
+
+
+ <#if maySelectItems?default("N") == "Y" && returnLink?default("N") == "Y" && (orderHeader.statusId)! == "ORDER_COMPLETED">
+
+ #if>
+
+
${uiLabelMap.OrderOrder} <#if orderHeader?has_content>${uiLabelMap.CommonNbr}
${orderHeader.orderId} #if>${uiLabelMap.CommonInformation}
+
+
+
+ <#-- placing customer information -->
+ <#if localOrderReadHelper?? && orderHeader?has_content>
+ <#assign displayParty = localOrderReadHelper.getPlacingParty()!/>
+ <#if displayParty?has_content>
+ <#assign displayPartyNameResult = dispatcher.runSync("getPartyNameForDate", Static["org.ofbiz.base.util.UtilMisc"].toMap("partyId", displayParty.partyId, "compareDate", orderHeader.orderDate, "userLogin", userLogin))/>
+ #if>
+
+
+ ${uiLabelMap.PartyName}
+
+
+
+
+ ${(displayPartyNameResult.fullName)?default("[Name Not Found]")}
+
+
+
+
+ #if>
+ <#-- order status information -->
+
+
+ ${uiLabelMap.CommonStatus}
+
+
+
+ <#if orderHeader?has_content>
+ ${localOrderReadHelper.getStatusString(locale)}
+ <#else>
+ ${uiLabelMap.OrderNotYetOrdered}
+ #if>
+
+
+ <#-- ordered date -->
+ <#if orderHeader?has_content>
+
+
+
+ ${uiLabelMap.CommonDate}
+
+
+
+ ${orderHeader.orderDate.toString()}
+
+
+ #if>
+ <#if distributorId??>
+
+
+
+ ${uiLabelMap.OrderDistributor}
+
+
+
+ ${distributorId}
+
+
+ #if>
+
+
+
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#quickAnonPaymentInformation")}
+
+
+
+ <#-- right side -->
+
+
+ <#if orderItemShipGroups?has_content>
+
+
+
+
${uiLabelMap.OrderShippingInformation}
+
+
+ <#-- shipping address -->
+ <#assign groupIdx = 0>
+ <#list orderItemShipGroups as shipGroup>
+ <#if orderHeader?has_content>
+ <#assign shippingAddress = shipGroup.getRelatedOne("PostalAddress", false)!>
+ <#assign groupNumber = shipGroup.shipGroupSeqId!>
+ <#else>
+ <#assign shippingAddress = cart.getShippingAddress(groupIdx)!>
+ <#assign groupNumber = groupIdx + 1>
+ #if>
+
+
+ <#if shippingAddress?has_content>
+
+
+ ${uiLabelMap.OrderDestination} [${groupNumber}]
+
+
+
+
+ <#if shippingAddress.toName?has_content>${uiLabelMap.CommonTo}: ${shippingAddress.toName} #if>
+ <#if shippingAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName} #if>
+ ${shippingAddress.address1}
+ <#if shippingAddress.address2?has_content>${shippingAddress.address2} #if>
+ ${shippingAddress.city}<#if shippingAddress.stateProvinceGeoId?has_content>, ${shippingAddress.stateProvinceGeoId} #if>
+ ${shippingAddress.postalCode!}
+ ${shippingAddress.countryGeoId!}
+
+
+
+
+ #if>
+
+ ${screens.render("component://${activeApp}/widget/OrderScreens.xml#quickAnonOptionSettings")}
+
+
+
+ <#assign groupIdx = groupIdx + 1>
+ #list><#-- end list of orderItemShipGroups -->
+
+
+
+ #if>
+
+
+
diff --git a/template/order/quickAnonPaymentInformation.ftl b/template/order/quickAnonPaymentInformation.ftl
new file mode 100644
index 0000000..a398ec9
--- /dev/null
+++ b/template/order/quickAnonPaymentInformation.ftl
@@ -0,0 +1,162 @@
+<#--
+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 requestParameters.paymentMethodTypeId?has_content>
+ <#assign paymentMethodTypeId = "${requestParameters.paymentMethodTypeId!}">
+#if>
+
+
+
+
+
${uiLabelMap.AccountingPaymentInformation}
+
+
+ <#if requestParameters.singleUsePayment?default("N") == "Y">
+
+
+ #if>
+
+
+
+
+ <#if session.getAttribute("billingContactMechId")??>
+
+ #if>
+
+
+
+
+ ${uiLabelMap.OrderSelectPaymentMethod}
+
+
+ Select One
+ <#if productStorePaymentMethodTypeIdMap.CREDIT_CARD??>
+ selected="selected"#if>>${uiLabelMap.AccountingVisaMastercardAmexDiscover}
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EFT_ACCOUNT??>
+ selected="selected"#if>>${uiLabelMap.AccountingAHCElectronicCheck}
+ #if>
+ <#if productStorePaymentMethodTypeIdMap.EXT_OFFLINE??>
+ selected="selected"#if>>${uiLabelMap.OrderPaymentOfflineCheckMoney}
+ #if>
+
+
+
+
+
+ <#-- gift card fields -->
+ <#if productStorePaymentMethodTypeIdMap.GIFT_CARD??>
+
+
+
+
+ ${uiLabelMap.AccountingCheckGiftCard}
+
+
+ #if>
+
+
+
+
diff --git a/template/order/requestreturn.ftl b/template/order/requestreturn.ftl
new file mode 100644
index 0000000..66ea922
--- /dev/null
+++ b/template/order/requestreturn.ftl
@@ -0,0 +1,157 @@
+<#--
+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 maySelectItems?default(false)>
+
+ #if>
+
+
${uiLabelMap.OrderReturnItems}
+
+
+
+
+
+
+
+
+
+ <#if (orderHeader.currencyUom)?has_content>
+
+ #if>
+
+
+ ${uiLabelMap.OrderReturnItemsFromOrder} ${uiLabelMap.CommonNbr}${orderId}
+
+ ${uiLabelMap.CommonSelectAll}
+
+
+
+
+ ${uiLabelMap.CommonDescription}
+ ${uiLabelMap.CommonQuantity}
+ ${uiLabelMap.EcommercePrice}
+ ${uiLabelMap.OrderReason}
+ ${uiLabelMap.OrderRequestedResponse}
+
+
+
+ <#if returnableItems?has_content>
+ <#assign rowCount = 0>
+ <#list returnableItems.keySet() as orderItem>
+ <#if !orderItem.orderAdjustmentId?has_content> <#-- filter orderAdjustments -->
+
+
+
+ <#-- -->
+ <#assign returnItemType = returnItemTypeMap.get(returnableItems.get(orderItem).get("itemTypeKey"))/>
+
+
+
+ <#-- need some order item information -->
+ <#assign orderHeader = orderItem.getRelatedOne("OrderHeader", false)>
+ <#assign itemCount = orderItem.quantity>
+ <#assign itemPrice = orderItem.unitPrice>
+ <#-- end of order item information -->
+
+
+
+
+
+
+
+
+
+ <@ofbizCurrency amount=returnableItems.get(orderItem).get("returnablePrice") isoCode=orderHeader.currencyUom/>
+
+
+
+ <#list returnReasons as reason>
+ ${reason.get("description",locale)?default(reason.returnReasonId)}
+ #list>
+
+
+
+
+ <#list returnTypes as type>
+ ${type.get("description",locale)?default(type.returnTypeId)}
+ #list>
+
+
+
+
+
+
+
+ <#assign rowCount = rowCount + 1>
+ #if>
+ #list>
+
+
+ ${uiLabelMap.OrderSelectShipFromAddress}:
+
+
+
+
+
+ <#list shippingContactMechList as shippingContactMech>
+ <#assign shippingAddress = shippingContactMech.getRelatedOne("PostalAddress", false)>
+
+
+
+
+
+
+ <#if shippingAddress.toName?has_content>
${uiLabelMap.CommonTo}: ${shippingAddress.toName}
#if>
+ <#if shippingAddress.attnName?has_content>
${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName}
#if>
+ <#if shippingAddress.address1?has_content>${shippingAddress.address1}
#if>
+ <#if shippingAddress.address2?has_content>${shippingAddress.address2}
#if>
+ <#if shippingAddress.city?has_content>${shippingAddress.city}#if>
+ <#if shippingAddress.stateProvinceGeoId?has_content>
${shippingAddress.stateProvinceGeoId}#if>
+ <#if shippingAddress.postalCode?has_content>
${shippingAddress.postalCode}#if>
+ <#if shippingAddress.countryGeoId?has_content>
${shippingAddress.countryGeoId}#if>
+
[${uiLabelMap.CommonUpdate}]
+
+
+
+ #list>
+
+
+
+
+
+
+ ${uiLabelMap.OrderReturnSelectedItems}
+
+
+ <#else>
+ ${uiLabelMap.OrderNoReturnableItems} ${uiLabelMap.CommonNbr}${orderId}
+ #if>
+
+
+
+
diff --git a/template/order/shipsettings.ftl b/template/order/shipsettings.ftl
new file mode 100644
index 0000000..9898bff
--- /dev/null
+++ b/template/order/shipsettings.ftl
@@ -0,0 +1,71 @@
+<#--
+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 cart = sessionAttributes.shoppingCart!>
+
${uiLabelMap.OrderShippingInformation}
+
+
+ ${uiLabelMap.OrderShippingInformation}
+
+
+
+ ${uiLabelMap.PartyAddressLine1}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyAddressLine2}
+
+
+
+ ${uiLabelMap.CommonCity}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.PartyZipCode}*
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.CommonCountry}*
+
+ <#if countryGeoId??>
+ ${countryProvinceGeo!(countryGeoId!)}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#countries")}
+
+ (${uiLabelMap.CommonRequired})
+
+
+ ${uiLabelMap.CommonState}*
+
+ <#if stateProvinceGeoId?has_content>
+ ${stateProvinceGeo!(stateProvinceGeoId!)}
+ <#else>
+ ${uiLabelMap.PartyNoState}
+ #if>
+ ${screens.render("component://common/widget/CommonScreens.xml#states")}
+
+ (${uiLabelMap.CommonRequired})
+
+
+
+
+
+
diff --git a/template/order/splitship.ftl b/template/order/splitship.ftl
new file mode 100644
index 0000000..c031223
--- /dev/null
+++ b/template/order/splitship.ftl
@@ -0,0 +1,263 @@
+<#--
+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.
+-->
+
+
+
+
+
+
${uiLabelMap.OrderItemGroups}
+
+
+
+ <#assign shipGroups = cart.getShipGroups()>
+ <#if (shipGroups.size() > 0)>
+ <#assign groupIdx = 0>
+ <#list shipGroups as group>
+ <#assign shipEstimateWrapper = Static["org.ofbiz.order.shoppingcart.shipping.ShippingEstimateWrapper"].getWrapper(dispatcher, cart, groupIdx)>
+ <#assign carrierShipmentMethods = shipEstimateWrapper.getShippingMethods()>
+ <#assign groupNumber = groupIdx + 1>
+
+
+
+
+ ${uiLabelMap.CommonGroup} ${groupNumber}:
+ <#list group.getShipItems() as item>
+ <#assign groupItem = group.getShipItemInfo(item)>
+ ${item.getName()} - (${groupItem.getItemQuantity()})
+ #list>
+
+
+
+
+ <#assign selectedContactMechId = cart.getShippingContactMechId(groupIdx)?default("")>
+
+ ${uiLabelMap.OrderSelectShippingAddress}
+ <#list shippingContactMechList as shippingContactMech>
+ <#assign shippingAddress = shippingContactMech.getRelatedOne("PostalAddress", false)>
+ selected="selected"#if>>${shippingAddress.address1}
+ #list>
+
+
+ <#if cart.getShipmentMethodTypeId(groupIdx)??>
+ <#assign selectedShippingMethod = cart.getShipmentMethodTypeId(groupIdx) + "@" + cart.getCarrierPartyId(groupIdx)>
+ <#else>
+ <#assign selectedShippingMethod = "">
+ #if>
+
+ ${uiLabelMap.OrderSelectShippingMethod}
+ <#list carrierShipmentMethods as carrierShipmentMethod>
+ <#assign shippingEst = shipEstimateWrapper.getShippingEstimate(carrierShipmentMethod)?default(-1)>
+ <#assign shippingMethod = carrierShipmentMethod.shipmentMethodTypeId + "@" + carrierShipmentMethod.partyId>
+ selected="selected"#if>>
+ <#if carrierShipmentMethod.partyId != "_NA_">
+ ${carrierShipmentMethod.partyId!}
+ #if>
+ ${carrierShipmentMethod.description!}
+ <#if shippingEst?has_content>
+ -
+ <#if (shippingEst > -1)>
+ <@ofbizCurrency amount=shippingEst isoCode=cart.getCurrency()/>
+ <#else>
+ ${uiLabelMap.OrderCalculatedOffline}
+ #if>
+ #if>
+
+ #list>
+
+
+ ${uiLabelMap.OrderSpecialInstructions}
+ ${cart.getShippingInstructions(groupIdx)!}
+
+
+
+
+ <#assign maySplitStr = cart.getMaySplit(groupIdx)?default("")>
+ ${uiLabelMap.OrderSplittingPreference}
+ selected="selected"#if>>${uiLabelMap.OrderShipAllItemsTogether}
+ selected="selected"#if>>${uiLabelMap.OrderShipItemsWhenAvailable}
+
+
+
+
+ <#assign isGiftStr = cart.getIsGift(groupIdx)?default("")>
+ ${uiLabelMap.OrderIsGift} ?
+ selected="selected"#if>>${uiLabelMap.OrderNotAGift}
+ selected="selected"#if>>${uiLabelMap.OrderYesIsAGift}
+
+
+
+ ${uiLabelMap.OrderGiftMessage}
+ ${cart.getGiftMessage(groupIdx)!}
+
+
+
+ <#assign groupIdx = groupIdx + 1>
+ <#if group_has_next>
+
+
+
+ #if>
+
+ #list>
+ <#else>
+ ${uiLabelMap.OrderNoShipGroupsDefined}.
+ #if>
+
+
+
+
+
+
+
${uiLabelMap.EcommerceAssignItems}
+
+
+
+
+ ${uiLabelMap.OrderProduct}
+ ${uiLabelMap.OrderTotalQty}
+
+ ${uiLabelMap.OrderMoveQty}
+
+
+
+
+ <#list cart.items() as cartLine>
+ <#assign cartLineIndex = cart.getItemIndex(cartLine)>
+
+
+
+
+
+ <#if cartLine.getProductId()??>
+ <#-- product item -->
+ <#-- start code to display a small image of the product -->
+ <#assign smallImageUrl = Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(cartLine.getProduct(), "SMALL_IMAGE_URL", locale, dispatcher, "url")!>
+ <#if !smallImageUrl?string?has_content><#assign smallImageUrl = "/images/defaultImage.jpg">#if>
+ <#if smallImageUrl?string?has_content>
+
+
+
+ #if>
+ <#-- end code to display a small image of the product -->
+
${cartLine.getProductId()} -
+ ${cartLine.getName()!} : ${cartLine.getDescription()!}
+
+ <#-- display the registered ship groups and quantity -->
+ <#assign itemShipGroups = cart.getShipGroups(cartLine)>
+ <#list itemShipGroups.entrySet() as group>
+
+ <#assign groupNumber = group.getKey() + 1>
+ Group - ${groupNumber} / ${uiLabelMap.CommonQuantity} - ${group.getValue()}
+
+ #list>
+
+ <#-- if inventory is not required check to see if it is out of stock and needs to have a message shown about that... -->
+ <#assign itemProduct = cartLine.getProduct()>
+ <#assign isStoreInventoryNotRequiredAndNotAvailable = Static["org.ofbiz.product.store.ProductStoreWorker"].isStoreInventoryRequiredAndAvailable(request, itemProduct, cartLine.getQuantity(), false, false)>
+ <#if isStoreInventoryNotRequiredAndNotAvailable && itemProduct.inventoryMessage?has_content>
+
(${itemProduct.inventoryMessage})
+ #if>
+
+ <#else>
+ <#-- this is a non-product item -->
+
${cartLine.getItemTypeDescription()!} : ${cartLine.getName()!}
+ #if>
+
+
+
+
+ ${cartLine.getQuantity()?string.number}
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.CommonFrom}:
+
+ <#list itemShipGroups.entrySet() as group>
+ <#assign groupNumber = group.getKey() + 1>
+ ${uiLabelMap.CommonGroup} ${groupNumber}
+ #list>
+
+
+
+
+ ${uiLabelMap.CommonTo}:
+
+ <#list 0..(cart.getShipGroupSize() - 1) as groupIdx>
+ <#assign groupNumber = groupIdx + 1>
+ ${uiLabelMap.CommonGroup} ${groupNumber}
+ #list>
+ ${uiLabelMap.CommonNew} ${uiLabelMap.CommonGroup}
+
+
+
+
+
+
+ #list>
+
+
+
+
+
diff --git a/template/order/startanoncheckout.ftl b/template/order/startanoncheckout.ftl
new file mode 100644
index 0000000..bb9dd28
--- /dev/null
+++ b/template/order/startanoncheckout.ftl
@@ -0,0 +1,39 @@
+<#--
+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 shoppingCart = sessionAttributes.shoppingCart!>
+<#if shoppingCart?has_content>
+ <#assign shoppingCartSize = shoppingCart.size()>
+<#else>
+ <#assign shoppingCartSize = 0>
+#if>
+
+<#if (shoppingCartSize > 0)>
+
+
${uiLabelMap.CommonCheckoutAnonymous}
+
${uiLabelMap.CommonCheckoutAnonymousMsg}:
+
+
+#if>
+
diff --git a/template/product/ConfigProductDetail.ftl b/template/product/ConfigProductDetail.ftl
new file mode 100644
index 0000000..5a2699d
--- /dev/null
+++ b/template/product/ConfigProductDetail.ftl
@@ -0,0 +1,224 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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!}
+
+
+
+
+
+
+ <#-- Category next/previous -->
+ <#if category??>
+
+ #if>
+
+
+
+
+
+ <#include "ProductImage.ftl" />
+
+
+ <#include "ProductMetaData.ftl" />
+ <#include "ProductConfigurator.ftl" />
+ <#include "ProductPieces.ftl" />
+ <#include "ProductSwatches.ftl"/>
+ <#include "ProductTellaFriend.ftl" />
+ <#include "ProductAddToShopList.ftl" />
+
+
+
+
+
+
+
+
+
+ <#include "ProductLongDescription.ftl" />
+ <#include "ProductDigitalDownload.ftl" />
+
+
+ <#include "ProductDimensions.ftl" />
+
+
+ <#include "ProductTags.ftl" />
+
+
+ <#include "ProductReviews.ftl" />
+
+
+
+
+
+
+
+ <#include "ProductCrossSell.ftl" />
+
+
diff --git a/template/product/ProductAddToOrder.ftl b/template/product/ProductAddToOrder.ftl
new file mode 100644
index 0000000..a1cbacb
--- /dev/null
+++ b/template/product/ProductAddToOrder.ftl
@@ -0,0 +1,180 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+ Number of days
+ Number of persons
+ Number of rooms
+
+
+
+ ${uiLabelMap.OrderAddToCart}
+
+ <#else>
+ disabled="disabled"#if> />
+ ${uiLabelMap.OrderAddToCart}
+
+ <@showUnavailableVarients/>
+ #if>
+ <#else>
+ <#if productStore??>
+ <#if productStore.requireInventory?? && productStore.requireInventory == "N">
+
+ disabled="disabled"#if> />
+
+ ${uiLabelMap.OrderAddToCart}
+ <@showUnavailableVarients/>
+ <#else>
+
+ ${uiLabelMap.OrderAddToCart}
+ ${uiLabelMap.ProductItemOutOfStock}<#if product.inventoryMessage??>— ${product.inventoryMessage}#if>
+ #if>
+ #if>
+ #if>
+ #if>
+
+ <#if variantPriceList??>
+ <#list variantPriceList as vpricing>
+ <#assign variantName = vpricing.get("variantName")!>
+ <#assign secondVariantName = vpricing.get("secondVariantName")!>
+ <#assign minimumQuantity = vpricing.get("minimumQuantity")>
+ <#if minimumQuantity > 0>
+ minimum order quantity for ${secondVariantName!} ${variantName!} is ${minimumQuantity!}
+ #if>
+ #list>
+ <#elseif minimumQuantity?? && minimumQuantity?has_content && minimumQuantity > 0>
+ minimum order quantity for ${productContentWrapper.get("PRODUCT_NAME", "html")!} is ${minimumQuantity!}
+ #if>
+
+
+
+
+
+
+<#-- Prefill first select box (virtual products only) -->
+<#if variantTree?? && 0 < variantTree.size()>
+
+#if>
diff --git a/template/product/ProductAddToShopList.ftl b/template/product/ProductAddToShopList.ftl
new file mode 100644
index 0000000..897b0e7
--- /dev/null
+++ b/template/product/ProductAddToShopList.ftl
@@ -0,0 +1,53 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 sessionAttributes.userLogin?has_content && sessionAttributes.userLogin.userLoginId != "anonymous">
+
+
+
+
+
+
+
+
+ <#if shoppingLists?has_content>
+ <#list shoppingLists as shoppingList>
+ ${shoppingList.listName}
+ #list>
+ #if>
+ ---
+ ${uiLabelMap.OrderNewShoppingList}
+
+
+
+ <#--assign nowDate = Static["org.ofbiz.base.util.UtilDateTime"].nowDateString("yyyy-MM-dd")-->
+ <#if product.productTypeId! == "ASSET_USAGE">
+ ${uiLabelMap.CommonStartDate} (yyyy-mm-dd)<@htmlTemplate.renderDateTimeField name="reservStartStr" event="" action="" value="${startDate}" className="" alert="" title="Format: yyyy-MM-dd HH:mm:ss.SSS" size="15" maxlength="30" id="reservStartStr" dateType="date" shortDateInput=false timeDropdownParamName="" defaultDateTimeString="" localizedIconTitle="" timeDropdown="" timeHourName="" classString="" hour1="" hour2="" timeMinutesName="" minutes="" isTwelveHour="" ampmName="" amSelected="" pmSelected="" compositeType="" formName=""/> Number of days Number of persons Qty
+ <#elseif product.productTypeId! == "ASSET_USAGE_OUT_IN">
+ ${uiLabelMap.CommonStartDate} (yyyy-mm-dd) <@htmlTemplate.renderDateTimeField name="reservStartStr" event="" action="" value="${startDate}" className="" alert="" title="Format: yyyy-MM-dd HH:mm:ss.SSS" size="15" maxlength="30" id="reservStartStr" dateType="date" shortDateInput=false timeDropdownParamName="" defaultDateTimeString="" localizedIconTitle="" timeDropdown="" timeHourName="" classString="" hour1="" hour2="" timeMinutesName="" minutes="" isTwelveHour="" ampmName="" amSelected="" pmSelected="" compositeType="" formName=""/> Number of days
+ Qty
+ <#else>
+
+
+ #if>
+ ${uiLabelMap.OrderAddToShoppingList}
+
+
+<#else>
+
+ ${uiLabelMap.OrderYouMust} ${uiLabelMap.CommonBeLogged}
+ ${uiLabelMap.OrderToAddSelectedItemsToShoppingList}.
+#if>
\ No newline at end of file
diff --git a/template/product/ProductConfigurator.ftl b/template/product/ProductConfigurator.ftl
new file mode 100644
index 0000000..2b00bd7
--- /dev/null
+++ b/template/product/ProductConfigurator.ftl
@@ -0,0 +1,175 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/product/ProductCrossSell.ftl b/template/product/ProductCrossSell.ftl
new file mode 100644
index 0000000..393781c
--- /dev/null
+++ b/template/product/ProductCrossSell.ftl
@@ -0,0 +1,94 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Upgrades/Up-Sell/Cross-Sell -->
+<#macro associated assocProducts beforeName showName afterName formNamePrefix targetRequestName>
+ <#assign pageProduct = product />
+ <#assign targetRequest = "product" />
+ <#if targetRequestName?has_content>
+ <#assign targetRequest = targetRequestName />
+ #if>
+ <#if assocProducts?has_content>
+
+
+
${beforeName!}<#if showName == "Y">${productContentWrapper.get("PRODUCT_NAME", "html")!}#if>${afterName!}
+
+
+
+ <#list assocProducts as productAssoc>
+ <#if productAssoc.productId == product.productId>
+ <#assign assocProductId = productAssoc.productIdTo />
+ <#else>
+ <#assign assocProductId = productAssoc.productId />
+ #if>
+
+ ${setRequestAttribute("optProductId", assocProductId)}
+ ${setRequestAttribute("listIndex", listIndex)}
+ ${setRequestAttribute("formNamePrefix", formNamePrefix)}
+ <#if targetRequestName?has_content>
+ ${setRequestAttribute("targetRequestName", targetRequestName)}
+ #if>
+ ${screens.render(productsummaryScreen)}
+ <#assign product = pageProduct />
+ <#local listIndex = listIndex + 1 />
+ #list>
+
+
+
+
+ ${setRequestAttribute("optProductId", "")}
+ ${setRequestAttribute("formNamePrefix", "")}
+ ${setRequestAttribute("targetRequestName", "")}
+ #if>
+#macro>
+
+<#assign productValue = product />
+<#assign listIndex = 1 />
+${setRequestAttribute("productValue", productValue)}
+
+ <#-- also bought -->
+ <@associated assocProducts=alsoBoughtProducts beforeName="" showName="N" afterName="${uiLabelMap.ProductAlsoBought}" formNamePrefix="albt" targetRequestName="" />
+ <#-- obsolete -->
+ <@associated assocProducts=obsoleteProducts beforeName="" showName="Y" afterName=" ${uiLabelMap.ProductObsolete}" formNamePrefix="obs" targetRequestName="" />
+
+ <#-- cross sell -->
+ <@associated assocProducts=crossSellProducts beforeName="" showName="N" afterName="${uiLabelMap.ProductCrossSell}" formNamePrefix="cssl" targetRequestName="crosssell" />
+
+ <#-- up sell -->
+ <@associated assocProducts=upSellProducts beforeName="${uiLabelMap.ProductUpSell} " showName="Y" afterName=":" formNamePrefix="upsl" targetRequestName="upsell" />
+
+ <#-- obsolescence -->
+ <@associated assocProducts=obsolenscenseProducts beforeName="" showName="Y" afterName=" ${uiLabelMap.ProductObsolescense}" formNamePrefix="obce" targetRequestName="" />
+
+
+<#-- special cross/up-sell area using commonFeatureResultIds (from common feature product search) -->
+<#if commonFeatureResultIds?has_content>
+ ${uiLabelMap.ProductSimilarProducts}
+
+ <#list commonFeatureResultIds as commonFeatureResultId>
+ ${setRequestAttribute("optProductId", commonFeatureResultId)}
+ ${setRequestAttribute("listIndex", commonFeatureResultId_index)}
+ ${setRequestAttribute("formNamePrefix", "cfeatcssl")}
+ <#-- ${setRequestAttribute("targetRequestName", targetRequestName)} -->
+ ${screens.render(productsummaryScreen)}
+ #list>
+
+#if>
\ No newline at end of file
diff --git a/template/product/ProductDaysToShip.ftl b/template/product/ProductDaysToShip.ftl
new file mode 100644
index 0000000..235b1f5
--- /dev/null
+++ b/template/product/ProductDaysToShip.ftl
@@ -0,0 +1,20 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 daysToShip??>
+ ${uiLabelMap.ProductUsuallyShipsIn} ${daysToShip} ${uiLabelMap.CommonDays}!
+#if>
diff --git a/template/product/ProductDetail.ftl b/template/product/ProductDetail.ftl
new file mode 100644
index 0000000..ade2e52
--- /dev/null
+++ b/template/product/ProductDetail.ftl
@@ -0,0 +1,399 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 price = priceMap! />
+<#assign productImageList = productImageList! />
+<#-- end variable setup -->
+
+<#-- virtual product javascript -->
+${virtualJavaScript!}
+${virtualVariantJavaScript!}
+
+
+<#macro showUnavailableVarients>
+ <#if unavailableVariants??>
+
+ <#list unavailableVariants as prod>
+ <#assign features = prod.getRelated("ProductFeatureAppl", null, null, false)/>
+
+ <#list features as feature>
+ ${feature.getRelatedOne("ProductFeature", false).description} <#if feature_has_next>, #if>
+ #list>
+ ${uiLabelMap.ProductItemOutOfStock}
+
+ #list>
+
+ #if>
+#macro>
+
+
+
+ <#-- Category next/previous -->
+ <#if category??>
+
+
+
+ #if>
+
+
+
+
+
+
+ <#if product.brandName??>${product.brandName} - #if>${productContentWrapper.get("PRODUCT_NAME", "html")!}
+
+
+
+
+
+ <#include "ProductImage.ftl" />
+
+
+ <#include "ProductMetaData.ftl" />
+ <#include "ProductPrice.ftl" />
+ <#include "ProductAddToOrder.ftl" />
+ <#include "ProductPieces.ftl" />
+ <#include "ProductSwatches.ftl"/>
+ <#include "ProductTellaFriend.ftl" />
+ <#include "ProductAddToShopList.ftl" />
+
+
+
+
+
+
+
+ <#include "ProductLongDescription.ftl" />
+ <#include "ProductDigitalDownload.ftl" />
+
+
+ <#include "ProductDimensions.ftl" />
+
+
+ <#include "ProductTags.ftl" />
+
+
+ <#include "ProductReviews.ftl" />
+
+
+
+
+
+
+
+
+
+
+
+ <#include "ProductCrossSell.ftl" />
+
+
+
\ No newline at end of file
diff --git a/template/product/ProductDigitalDownload.ftl b/template/product/ProductDigitalDownload.ftl
new file mode 100644
index 0000000..937f090
--- /dev/null
+++ b/template/product/ProductDigitalDownload.ftl
@@ -0,0 +1,25 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Digital Download Files Associated with this Product -->
+ <#if downloadProductContentAndInfoList?has_content>
+
+
${uiLabelMap.OrderDownloadFilesTitle}:
+ <#list downloadProductContentAndInfoList as downloadProductContentAndInfo>
+
${downloadProductContentAndInfo.contentName!}<#if downloadProductContentAndInfo.description?has_content> - ${downloadProductContentAndInfo.description}#if>
+ #list>
+
+ #if>
diff --git a/template/product/ProductDimensions.ftl b/template/product/ProductDimensions.ftl
new file mode 100644
index 0000000..5db54e7
--- /dev/null
+++ b/template/product/ProductDimensions.ftl
@@ -0,0 +1,41 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 (product.productWeight?? && product.productWeight != 0) || product.weightUomId?has_content>
+ <#assign weightUom = product.getRelatedOne("WeightUom", true)! />
+
+ ${uiLabelMap.CommonWeight}: ${product.productWeight!} ${((weightUom.abbreviation)?default(product.weightUomId))!}
+
+#if>
+<#if (product.productHeight?? && product.productHeight != 0) || product.heightUomId?has_content>
+ <#assign heightUom = product.getRelatedOne("HeightUom", true)! />
+
+ ${uiLabelMap.CommonHeight}: ${product.productHeight!} ${((heightUom.abbreviation)?default(product.heightUomId))!}
+
+#if>
+<#if (product.productWidth?? && product.productWidth != 0) || product.widthUomId?has_content>
+ <#assign widthUom = product.getRelatedOne("WidthUom", true)! />
+
+ ${uiLabelMap.CommonWidth}: ${product.productWidth!} ${((widthUom.abbreviation)?default(product.widthUomId))!}
+
+#if>
+<#if (product.productDepth?? && product.productDepth != 0) || product.depthUomId?has_content>
+ <#assign depthUom = product.getRelatedOne("DepthUom", true)! />
+
+ ${uiLabelMap.CommonDepth}: ${product.productDepth!} ${((depthUom.abbreviation)?default(product.depthUomId))!}
+
+#if>
diff --git a/template/product/ProductFeatureList.ftl b/template/product/ProductFeatureList.ftl
new file mode 100644
index 0000000..b83400f
--- /dev/null
+++ b/template/product/ProductFeatureList.ftl
@@ -0,0 +1,27 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 disFeatureList?? && 0 < disFeatureList.size()>
+
+ <#list disFeatureList as currentFeature>
+ <#assign disFeatureType = currentFeature.getRelatedOne("ProductFeatureType", true) />
+
+ <#if disFeatureType.description??>${disFeatureType.get("description", locale)}<#else>${currentFeature.productFeatureTypeId}#if>: ${currentFeature.description}
+
+ #list>
+
+#if>
diff --git a/template/product/ProductImage.ftl b/template/product/ProductImage.ftl
new file mode 100644
index 0000000..eddfa3c
--- /dev/null
+++ b/template/product/ProductImage.ftl
@@ -0,0 +1,94 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 productAdditionalImage1 = productContentWrapper.get("ADDITIONAL_IMAGE_1", "url")! />
+<#assign productAdditionalImage2 = productContentWrapper.get("ADDITIONAL_IMAGE_2", "url")! />
+<#assign productAdditionalImage3 = productContentWrapper.get("ADDITIONAL_IMAGE_3", "url")! />
+<#assign productAdditionalImage4 = productContentWrapper.get("ADDITIONAL_IMAGE_4", "url")! />
+
+ <#if productImageList?has_content>
+
+ <#-- Product image/name/price -->
+ <#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>
+
+
+ #if>
+ <#if !productLargeImageUrl?string?has_content>
+
+ #if>
+
Prev
+
Next
+ <#if productImageList?has_content>
+
+ #if>
+
+
+ <#-- Show Image Approved -->
+
+
+ <#else>
+
+ <#-- Product image/name/price -->
+ <#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>
+
+
+ #if>
+ <#if !productLargeImageUrl?string?has_content>
+
+ #if>
+
+
+ <#if productAdditionalImage1?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage2?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage3?string?has_content>
+
+
+
+ #if>
+ <#if productAdditionalImage4?string?has_content>
+
+
+
+ #if>
+
+ #if>
+
\ No newline at end of file
diff --git a/template/product/ProductLongDescription.ftl b/template/product/ProductLongDescription.ftl
new file mode 100644
index 0000000..4fa5dc7
--- /dev/null
+++ b/template/product/ProductLongDescription.ftl
@@ -0,0 +1,21 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Long description of product -->
+
+
${productContentWrapper.get("LONG_DESCRIPTION", "html")!}
+
${productContentWrapper.get("WARNINGS", "html")!}
+
\ No newline at end of file
diff --git a/template/product/ProductMetaData.ftl b/template/product/ProductMetaData.ftl
new file mode 100644
index 0000000..cd79cd6
--- /dev/null
+++ b/template/product/ProductMetaData.ftl
@@ -0,0 +1,36 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
${productContentWrapper.get("DESCRIPTION", "html")!}
+
+
${uiLabelMap.CommonId}: ${product.productId!}
+
+
+<#-- example of showing a certain type of feature with the product -->
+<#if sizeProductFeatureAndAppls?has_content>
+
+ <#if (sizeProductFeatureAndAppls?size == 1)>
+ ${uiLabelMap.OrderSizeAvailableSingle}:
+ <#else>
+ ${uiLabelMap.OrderSizeAvailableMultiple}:
+ #if>
+ <#list sizeProductFeatureAndAppls as sizeProductFeatureAndAppl>
+ ${sizeProductFeatureAndAppl.description?default(sizeProductFeatureAndAppl.abbrev?default(sizeProductFeatureAndAppl.productFeatureId))}<#if sizeProductFeatureAndAppl_has_next>,#if>
+ #list>
+
+#if>
+
\ No newline at end of file
diff --git a/template/product/ProductPieces.ftl b/template/product/ProductPieces.ftl
new file mode 100644
index 0000000..13a7577
--- /dev/null
+++ b/template/product/ProductPieces.ftl
@@ -0,0 +1,28 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Included quantities/pieces -->
+<#if product.piecesIncluded?? && product.piecesIncluded?long != 0>
+
+ ${uiLabelMap.OrderPieces}: ${product.piecesIncluded}
+
+#if>
+<#if (product.quantityIncluded?? && product.quantityIncluded != 0) || product.quantityUomId?has_content>
+ <#assign quantityUom = product.getRelatedOne("QuantityUom", true)! />
+
+ ${uiLabelMap.CommonQuantity}: ${product.quantityIncluded!} ${((quantityUom.abbreviation)?default(product.quantityUomId))!}
+
+#if>
\ No newline at end of file
diff --git a/template/product/ProductPrice.ftl b/template/product/ProductPrice.ftl
new file mode 100644
index 0000000..46ebd70
--- /dev/null
+++ b/template/product/ProductPrice.ftl
@@ -0,0 +1,95 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- for prices:
+- 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 price.competitivePrice?? && price.price?? && price.price < price.competitivePrice>
+
+ ${uiLabelMap.ProductCompareAtPrice}: <@ofbizCurrency amount=price.competitivePrice isoCode=price.currencyUsed />
+
+#if>
+
+<#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+
+ ${uiLabelMap.ProductListPrice}: <@ofbizCurrency amount=price.listPrice isoCode=price.currencyUsed />
+
+#if>
+<#if price.listPrice?? && price.defaultPrice?? && price.price?? && price.price < price.defaultPrice && price.defaultPrice < price.listPrice>
+
+ ${uiLabelMap.ProductRegularPrice}: <@ofbizCurrency amount=price.defaultPrice isoCode=price.currencyUsed />
+
+#if>
+
+<#if price.specialPromoPrice??>
+
+ ${uiLabelMap.ProductSpecialPromoPrice}: <@ofbizCurrency amount=price.specialPromoPrice isoCode=price.currencyUsed />
+
+#if>
+
+
+
+ <#if price.isSale?? && price.isSale>
+
+ ${uiLabelMap.OrderOnSale}!
+ <#assign priceStyle = "salePrice" />
+ <#else>
+ <#assign priceStyle = "regularPrice" />
+ #if>
+
+ ${uiLabelMap.OrderYourPrice}:
+
+ <#if "Y" = product.isVirtual!> ${uiLabelMap.CommonFrom} #if>
+ <@ofbizCurrency amount=price.price isoCode=price.currencyUsed />
+ <#if product.productTypeId! == "ASSET_USAGE" || product.productTypeId! == "ASSET_USAGE_OUT_IN">
+ <#if product.reserv2ndPPPerc?? && product.reserv2ndPPPerc != 0>
+ ${uiLabelMap.ProductReserv2ndPPPerc}<#if !product.reservNthPPPerc?? || product.reservNthPPPerc == 0>${uiLabelMap.CommonUntil} ${product.reservMaxPersons!1}#if> <@ofbizCurrency amount=product.reserv2ndPPPerc*price.price/100 isoCode=price.currencyUsed />
+ #if>
+ <#if product.reservNthPPPerc?? &&product.reservNthPPPerc != 0>
+ ${uiLabelMap.ProductReservNthPPPerc} <#if !product.reserv2ndPPPerc?? || product.reserv2ndPPPerc == 0>${uiLabelMap.ProductReservSecond} <#else> ${uiLabelMap.ProductReservThird} #if> ${uiLabelMap.CommonUntil} ${product.reservMaxPersons!1}, ${uiLabelMap.ProductEach}: <@ofbizCurrency amount=product.reservNthPPPerc*price.price/100 isoCode=price.currencyUsed />
+ #if>
+ <#if (!product.reserv2ndPPPerc?? || product.reserv2ndPPPerc == 0) && (!product.reservNthPPPerc?? || product.reservNthPPPerc == 0)>
+ ${uiLabelMap.ProductMaximum} ${product.reservMaxPersons!1} ${uiLabelMap.ProductPersons}.
+ #if>
+ #if>
+
+
+
+
+<#if price.listPrice?? && price.price?? && price.price < price.listPrice>
+
+ <#assign priceSaved = price.listPrice - price.price />
+ <#assign percentSaved = (priceSaved / price.listPrice) * 100 />
+
+ ${uiLabelMap.OrderYouSave}: <@ofbizCurrency amount=priceSaved isoCode=price.currencyUsed /> (${percentSaved?int}%)
+
+#if>
+
+<#-- show price details ("showPriceDetails" field can be set in the screen definition) -->
+<#if (showPriceDetails?? && showPriceDetails?default("N") == "Y")>
+ <#if price.orderItemPriceInfos??>
+ <#list price.orderItemPriceInfos as orderItemPriceInfo>
+
+ ${orderItemPriceInfo.description!}
+
+ #list>
+ #if>
+#if>
\ No newline at end of file
diff --git a/template/product/ProductRelated.ftl b/template/product/ProductRelated.ftl
new file mode 100644
index 0000000..83c0fee
--- /dev/null
+++ b/template/product/ProductRelated.ftl
@@ -0,0 +1,16 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
\ No newline at end of file
diff --git a/template/product/ProductReviews.ftl b/template/product/ProductReviews.ftl
new file mode 100644
index 0000000..26d5603
--- /dev/null
+++ b/template/product/ProductReviews.ftl
@@ -0,0 +1,66 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Product Reviews -->
+
+
${uiLabelMap.OrderCustomerReviews}:
+ <#if averageRating?? && (averageRating > 0) && numRatings?? && (numRatings > 1)>
+
${uiLabelMap.OrderAverageRating}: ${averageRating} <#if numRatings??>(${uiLabelMap.CommonFrom} ${numRatings} ${uiLabelMap.OrderRatings})#if>
+ #if>
+
+ <#if productReviews?has_content>
+ <#list productReviews as productReview>
+ <#assign postedUserLogin = productReview.getRelatedOne("UserLogin", false) />
+ <#assign postedPerson = postedUserLogin.getRelatedOne("Person", false)! />
+
${uiLabelMap.CommonBy}: <#if productReview.postedAnonymous?default("N") == "Y"> ${uiLabelMap.OrderAnonymous}<#else> ${postedPerson.firstName} ${postedPerson.lastName} #if>
+
${uiLabelMap.CommonAt}: ${productReview.postedDateTime!}
+
${uiLabelMap.OrderRanking}: ${productReview.productRating!?string}
+
+
${productReview.productReview!}
+
+ #list>
+
+ <#else>
+
${uiLabelMap.ProductProductNotReviewedYet}.
+
+ #if>
+
+
+
+
+
+
+
+
+
+
Some text in the modal.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/template/product/ProductSummary.ftl b/template/product/ProductSummary.ftl
new file mode 100644
index 0000000..acd860b
--- /dev/null
+++ b/template/product/ProductSummary.ftl
@@ -0,0 +1,229 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+${virtualJavaScript!}
+
+
+<#if product??>
+ <#-- variable setup -->
+ <#if backendPath?default("N") == "Y">
+ <#assign productUrl><@ofbizCatalogUrl productId=product.productId productCategoryId=categoryId/>#assign>
+ <#else>
+ <#assign productUrl><@ofbizCatalogAltUrl productId=product.productId productCategoryId=categoryId/>#assign>
+ #if>
+
+ <#if requestAttributes.productCategoryMember??>
+ <#assign prodCatMem = requestAttributes.productCategoryMember>
+ #if>
+ <#assign smallImageUrl = productContentWrapper.get("MEDIUM_IMAGE_URL", "url")!>
+ <#if !smallImageUrl?string?has_content><#assign smallImageUrl = "/images/defaultImage.jpg">#if>
+ <#-- end variable setup -->
+ <#assign productInfoLinkId = "productInfoLink">
+ <#assign productInfoLinkId = productInfoLinkId + product.productId/>
+ <#assign productDetailId = "productDetailId"/>
+ <#assign productDetailId = productDetailId + product.productId/>
+
+
+
+
<#if product.brandName??>${product.brandName} - #if>${productContentWrapper.get("PRODUCT_NAME", "html")!}
+
+
+
+
+
+
+
+
+
+
${productContentWrapper.get("DESCRIPTION", "html")!}<#if daysToShip??> - ${uiLabelMap.ProductUsuallyShipsIn} ${daysToShip} ${uiLabelMap.CommonDays}!#if>
+
+ <#-- Display category-specific product comments -->
+ <#if prodCatMem?? && prodCatMem.comments?has_content>
+
${prodCatMem.comments}
+ #if>
+
+ <#-- example of showing a certain type of feature with the product -->
+ <#if sizeProductFeatureAndAppls?has_content>
+
+ <#if (sizeProductFeatureAndAppls?size == 1)>
+ ${uiLabelMap.SizeAvailableSingle}:
+ <#else>
+ ${uiLabelMap.SizeAvailableMultiple}:
+ #if>
+ <#list sizeProductFeatureAndAppls as sizeProductFeatureAndAppl>
+ ${sizeProductFeatureAndAppl.abbrev?default(sizeProductFeatureAndAppl.description?default(sizeProductFeatureAndAppl.productFeatureId))}<#if sizeProductFeatureAndAppl_has_next>,#if>
+ #list>
+
+ #if>
+
+ <#if totalPrice??>
+
${uiLabelMap.ProductAggregatedPrice}: <@ofbizCurrency amount=totalPrice isoCode=totalPrice.currencyUsed/>
+ <#else>
+ <#if price.competitivePrice?? && price.price?? && price.price?double < price.competitivePrice?double>
+ ${uiLabelMap.ProductCompareAtPrice}:
<@ofbizCurrency amount=price.competitivePrice isoCode=price.currencyUsed/>
+ #if>
+ <#if price.listPrice?? && price.price?? && price.price?double < price.listPrice?double>
+ ${uiLabelMap.ProductListPrice}:
<@ofbizCurrency amount=price.listPrice isoCode=price.currencyUsed/>
+ #if>
+
+ <#if price.isSale?? && price.isSale>
+ ${uiLabelMap.OrderOnSale}!
+ <#assign priceStyle = "salePrice">
+ <#else>
+ <#assign priceStyle = "regularPrice">
+ #if>
+
+ <#if (price.price?default(0) > 0 && product.requireAmount?default("N") == "N")>
+ ${uiLabelMap.OrderYourPrice}: <#if "Y" = product.isVirtual!> ${uiLabelMap.CommonFrom} #if><@ofbizCurrency amount=price.price isoCode=price.currencyUsed/>
+ #if>
+
+ <#if price.listPrice?? && price.price?? && price.price?double < price.listPrice?double>
+ <#assign priceSaved = price.listPrice?double - price.price?double>
+ <#assign percentSaved = (priceSaved?double / price.listPrice?double) * 100>
+ ${uiLabelMap.OrderYouSave}:
<@ofbizCurrency amount=priceSaved isoCode=price.currencyUsed/> (${percentSaved?int}%)
+ #if>
+ #if>
+ <#-- show price details ("showPriceDetails" field can be set in the screen definition) -->
+ <#if (showPriceDetails?? && showPriceDetails?default("N") == "Y")>
+ <#if price.orderItemPriceInfos??>
+ <#list price.orderItemPriceInfos as orderItemPriceInfo>
+
${orderItemPriceInfo.description!}
+ #list>
+ #if>
+ #if>
+
+
+
+ <#-- check to see if introductionDate hasn't passed yet -->
+ <#if product.introductionDate?? && nowTimestamp.before(product.introductionDate)>
+
${uiLabelMap.ProductNotYetAvailable}
+ <#-- check to see if salesDiscontinuationDate has passed -->
+ <#elseif product.salesDiscontinuationDate?? && nowTimestamp.after(product.salesDiscontinuationDate)>
+
${uiLabelMap.ProductNoLongerAvailable}
+ <#-- check to see if it is a rental item; will enter parameters on the detail screen-->
+ <#elseif product.productTypeId! == "ASSET_USAGE">
+
${uiLabelMap.OrderMakeBooking}...
+ <#-- check to see if it is an aggregated or configurable product; will enter parameters on the detail screen-->
+ <#elseif product.productTypeId! == "AGGREGATED" || product.productTypeId! == "AGGREGATED_SERVICE">
+
${uiLabelMap.OrderConfigure}...
+ <#-- check to see if the product is a virtual product -->
+ <#elseif product.isVirtual?? && product.isVirtual == "Y">
+
${uiLabelMap.OrderChooseVariations}...
+ <#-- check to see if the product requires an amount -->
+ <#elseif product.requireAmount?? && product.requireAmount == "Y">
+
${uiLabelMap.OrderChooseAmount}...
+ <#elseif product.productTypeId! == "ASSET_USAGE_OUT_IN">
+
${uiLabelMap.OrderRent}...
+ <#else>
+
+
+
+ ${uiLabelMap.OrderAddToCart}
+
+
+ <#if mainProducts?has_content>
+
+
+ Select Unit Of Measure
+ <#list mainProducts as mainProduct>
+ ${mainProduct.uomDesc} : ${mainProduct.piecesIncluded}
+ #list>
+
+
+
+
+
+ #if>
+
+
+ <#if prodCatMem?? && prodCatMem.quantity?? && 0.00 < prodCatMem.quantity?double>
+
+
+
+
+
+ ${uiLabelMap.CommonAddDefault}(${prodCatMem.quantity?string.number}) ${uiLabelMap.OrderToCart}
+
+ <#assign productCategory = delegator.findOne("ProductCategory", Static["org.ofbiz.base.util.UtilMisc"].toMap("productCategoryId", prodCatMem.productCategoryId), false)/>
+ <#if productCategory.productCategoryTypeId != "BEST_SELL_CATEGORY">
+
+
+
+
+
+ ${uiLabelMap.CommonAddDefault}(${prodCatMem.quantity?string.number}) ${uiLabelMap.OrderToCart}
+
+ #if>
+ #if>
+ #if>
+
+
+
+
+
+
+
+
+
+
+
+
+
+<#else>
+ ${uiLabelMap.ProductErrorProductNotFound}.
+#if>
diff --git a/template/product/ProductSwatches.ftl b/template/product/ProductSwatches.ftl
new file mode 100644
index 0000000..630fe85
--- /dev/null
+++ b/template/product/ProductSwatches.ftl
@@ -0,0 +1,44 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- Swatches (virtual products only) -->
+<#if variantSample?? && 0 < variantSample.size()>
+ <#assign imageKeys = variantSample.keySet() />
+ <#assign imageMap = variantSample />
+
+ <#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, "MEDIUM_IMAGE_URL", request, "url")! />
+ <#if !imageUrl?string?has_content>
+ <#assign imageUrl = productContentWrapper.get("MEDIUM_IMAGE_URL", "url")! />
+ #if>
+ <#if !imageUrl?string?has_content>
+ <#assign imageUrl = "/images/defaultImage.jpg" />
+ #if>
+
${key}
+
+
+ #if>
+ <#assign indexer = indexer + 1 />
+ #list>
+ <#if (indexer > maxIndex)>
+
${uiLabelMap.ProductMoreOptions}
+ #if>
+#if>
+
diff --git a/template/product/ProductTags.ftl b/template/product/ProductTags.ftl
new file mode 100644
index 0000000..ef5d9f5
--- /dev/null
+++ b/template/product/ProductTags.ftl
@@ -0,0 +1,55 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
\ No newline at end of file
diff --git a/template/product/ProductTellaFriend.ftl b/template/product/ProductTellaFriend.ftl
new file mode 100644
index 0000000..7e8b02a
--- /dev/null
+++ b/template/product/ProductTellaFriend.ftl
@@ -0,0 +1,21 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+<#-- show tell a friend details only in ecommerce application -->
+
+
diff --git a/template/quote/CreateOrderQuote.ftl b/template/quote/CreateOrderQuote.ftl
new file mode 100644
index 0000000..69c34a5
--- /dev/null
+++ b/template/quote/CreateOrderQuote.ftl
@@ -0,0 +1,27 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
diff --git a/template/quote/QuoteList.ftl b/template/quote/QuoteList.ftl
new file mode 100644
index 0000000..d96f86f
--- /dev/null
+++ b/template/quote/QuoteList.ftl
@@ -0,0 +1,84 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
${uiLabelMap.EcommerceQuoteHistory}
+
+
+
+
+ ${uiLabelMap.OrderQuote} ${uiLabelMap.CommonNbr}
+
+
+
+ ${uiLabelMap.CommonName}
+
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+ ${uiLabelMap.CommonStatus}
+
+
+
+ ${uiLabelMap.OrderOrderQuoteIssueDate}
+ ${uiLabelMap.CommonValidFromDate}
+ ${uiLabelMap.CommonValidThruDate}
+
+
+
+
+ <#list quoteList as quote>
+ <#assign status = quote.getRelatedOne("StatusItem", true)>
+
+
+
+ ${quote.quoteId}
+
+
+
+ ${quote.quoteName!}
+
+
+
+ ${quote.description!}
+
+
+
+ ${status.get("description",locale)}
+
+
+
+ ${quote.issueDate!}
+ ${quote.validFromDate!}
+ ${quote.validThruDate!}
+
+
+
+ ${uiLabelMap.CommonView}
+
+
+
+ #list>
+ <#if !quoteList?has_content>
+ ${uiLabelMap.OrderNoQuoteFound}
+ #if>
+
+
+
diff --git a/template/request/RequestList.ftl b/template/request/RequestList.ftl
new file mode 100644
index 0000000..c4ad085
--- /dev/null
+++ b/template/request/RequestList.ftl
@@ -0,0 +1,93 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
${uiLabelMap.EcommerceRequestHistory}
+
+
+
+
+ ${uiLabelMap.OrderRequest} ${uiLabelMap.CommonNbr}
+
+
+
+ ${uiLabelMap.CommonType}
+
+
+
+ ${uiLabelMap.CommonName}
+
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+ ${uiLabelMap.CommonStatus}
+
+
+
+ ${uiLabelMap.OrderRequestDate}
+ ${uiLabelMap.OrderRequestCreatedDate}
+ ${uiLabelMap.OrderRequestLastModifiedDate}
+
+
+
+
+ <#list requestList as custRequest>
+ <#assign status = custRequest.getRelatedOne("StatusItem", true)>
+ <#assign type = custRequest.getRelatedOne("CustRequestType", true)>
+
+
+
+ ${custRequest.custRequestId}
+
+
+
+ ${type.get("description",locale)!}
+
+
+
+ ${custRequest.custRequestName!}
+
+
+
+ ${custRequest.description!}
+
+
+
+ ${status.get("description",locale)}
+
+
+
+ ${custRequest.custRequestDate!}
+ ${custRequest.createdDate!}
+ ${custRequest.lastModifiedDate!}
+
+
+
+ ${uiLabelMap.CommonView}
+
+
+
+ #list>
+ <#if !requestList?has_content>
+ ${uiLabelMap.OrderNoRequestFound}
+ #if>
+
+
+
diff --git a/template/request/requestInfo.ftl b/template/request/requestInfo.ftl
new file mode 100644
index 0000000..7b8096c
--- /dev/null
+++ b/template/request/requestInfo.ftl
@@ -0,0 +1,123 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
${uiLabelMap.OrderRequest} ${custRequest.custRequestId} ${uiLabelMap.CommonInformation}
+
+
+
+ <#-- request header information -->
+
+
+ ${uiLabelMap.CommonType}
+
+
+
+ ${(custRequestType.get("description",locale))?default(custRequest.custRequestTypeId!)}
+
+
+
+ <#-- request status information -->
+
+
+ ${uiLabelMap.CommonStatus}
+
+
+
+ ${(statusItem.get("description", locale))?default(custRequest.statusId!)}
+
+
+ <#-- party -->
+
+
+
+ ${uiLabelMap.PartyPartyId}
+
+
+
+ ${custRequest.fromPartyId!}
+
+
+ <#-- request name -->
+
+
+
+ ${uiLabelMap.CommonName}
+
+
+
+ ${custRequest.custRequestName!}
+
+
+ <#-- request description -->
+
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+ ${custRequest.description!}
+
+
+ <#-- request currency -->
+
+
+
+ ${uiLabelMap.CommonCurrency}
+
+
+
+ <#if currency??>${currency.get("description", locale)?default(custRequest.maximumAmountUomId!)}#if>
+
+
+ <#-- request currency -->
+
+
+
+ ${uiLabelMap.ProductProductStore}
+
+
+
+ <#if store??>${store.storeName?default(custRequest.productStoreId!)}#if>
+
+
+ <#-- request comment -->
+
+
+
+ ${uiLabelMap.CommonInternalComment}
+
+
+
+ ${custRequest.internalComment!}
+
+
+ <#-- request reason -->
+
+
+
+ ${uiLabelMap.CommonReason}
+
+
+
+ ${custRequest.reason!}
+
+
+
+
+
\ No newline at end of file
diff --git a/template/request/requestRoles.ftl b/template/request/requestRoles.ftl
new file mode 100644
index 0000000..9f1ba28
--- /dev/null
+++ b/template/request/requestRoles.ftl
@@ -0,0 +1,43 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+
${uiLabelMap.OrderRequestRoles}
+
+
+
+ <#assign row = 1>
+ <#list requestParties as requestParty>
+ <#assign roleType = requestParty.getRelatedOne("RoleType", false)>
+ <#assign party = requestParty.getRelatedOne("Party", false)>
+
+
+ ${roleType.get("description", locale)!}
+
+
+
+ ${Static["org.ofbiz.party.party.PartyHelper"].getPartyName(party)}
+
+
+ <#if requestParties.size() != row>
+
+ #if>
+ <#assign row = row + 1>
+ #list>
+
+
+
\ No newline at end of file
diff --git a/template/requirePasswordChange.ftl b/template/requirePasswordChange.ftl
new file mode 100644
index 0000000..b518b7b
--- /dev/null
+++ b/template/requirePasswordChange.ftl
@@ -0,0 +1,66 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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 username = ""/>
+<#if requestParameters.USERNAME?has_content>
+ <#assign username = requestParameters.USERNAME/>
+<#elseif autoUserLogin?has_content>
+ <#assign username = autoUserLogin.userLoginId/>
+#if>
+
+
${uiLabelMap.CommonLogin}
+
+
+
+
+
${uiLabelMap.CommonPasswordChange}
+
+
+
+
+
diff --git a/template/shoppinglist/editShoppingList.ftl b/template/shoppinglist/editShoppingList.ftl
new file mode 100644
index 0000000..f3343ee
--- /dev/null
+++ b/template/shoppinglist/editShoppingList.ftl
@@ -0,0 +1,573 @@
+<#--
+(C) Copyright 2015 Somonar B.V.
+
+ Licensed 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.
+
+ -->
+
+
+<#macro paginationControls>
+ <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize)?double / viewSize?double)>
+ <#if (viewIndexMax?int > 0)>
+
+ <#-- Start Page Select Drop-Down -->
+
+ ${uiLabelMap.CommonPage} ${viewIndex?int} ${uiLabelMap.CommonOf} ${viewIndexMax}
+ <#if (viewIndex?int > 1)>
+ <#list 0..viewIndexMax as curViewNum>
+ ${uiLabelMap.CommonGotoPage} ${curViewNum + 1}
+ #list>
+ #if>
+
+ <#-- End Page Select Drop-Down -->
+
+ <#if (viewIndex?int > 1)>
+
${uiLabelMap.CommonPrevious} |
+ #if>
+ <#if ((listSize?int - viewSize?int) > 0)>
+
${lowIndex} - ${highIndex} ${uiLabelMap.CommonOf} ${listSize}
+ #if>
+ <#if highIndex?int < listSize?int>
+ |
${uiLabelMap.CommonNext}
+ #if>
+
+#if>
+#macro>
+
+
+
+
+
+
${uiLabelMap.EcommerceShoppingLists}
+
+ <#if shoppingLists?has_content>
+
+
+
+ <#if shoppingList?has_content>
+ ${shoppingList.listName}
+ --
+ #if>
+ <#list shoppingLists as list>
+ ${list.listName}
+ #list>
+
+ ${uiLabelMap.CommonEdit}
+
+
+ <#else>
+
${uiLabelMap.EcommerceNoShoppingListsCreate}.
+
+ #if>
+
+
+
+<#if shoppingList?has_content>
+ <#if canView>
+
+
+
+
+
+
+
+
+
${uiLabelMap.EcommerceShoppingListDetail} - ${shoppingList.listName}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.EcommerceListName}
+
+
+
+ ${uiLabelMap.CommonDescription}
+
+
+
+ ${uiLabelMap.OrderListType}
+
+ <#if shoppingListType??>
+ ${shoppingListType.get("description",locale)?default(shoppingListType.shoppingListTypeId)}
+ --
+ #if>
+ <#list shoppingListTypes as shoppingListType>
+ ${shoppingListType.get("description",locale)?default(shoppingListType.shoppingListTypeId)}
+ #list>
+
+
+
+ ${uiLabelMap.EcommercePublic}?
+
+ <#if (((shoppingList.isPublic)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((shoppingList.isPublic)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+ ${uiLabelMap.EcommerceActive}?
+
+ <#if (((shoppingList.isActive)!"") == "Y")>${uiLabelMap.CommonY} #if>
+ <#if (((shoppingList.isActive)!"") == "N")>${uiLabelMap.CommonN} #if>
+
+ ${uiLabelMap.CommonY}
+ ${uiLabelMap.CommonN}
+
+
+
+
+
+
+
+
+
+
+
+<#if shoppingListType?? && shoppingListType.shoppingListTypeId == "SLT_AUTO_REODR">
+ <#assign nowTimestamp = Static["org.ofbiz.base.util.UtilDateTime"].monthBegin()>
+
+
+
+
+
+
+ ${uiLabelMap.EcommerceShoppingListReorder} - ${shoppingList.listName}
+ <#if shoppingList.isActive?default("N") == "N">
+ ${uiLabelMap.EcommerceOrderNotActive}
+ #if>
+
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderShipTo}
+
+ ${uiLabelMap.OrderSelectAShippingAddress}
+ <#if shippingContactMechList?has_content>
+ <#list shippingContactMechList as shippingContactMech>
+ <#assign shippingAddress = shippingContactMech.getRelatedOne("PostalAddress", false)>
+ selected="selected"#if>>${shippingAddress.address1}
+ #list>
+ <#else>
+ ${uiLabelMap.OrderNoAddressesAvailable}
+ #if>
+
+
+ ${uiLabelMap.OrderShipVia}
+
+ ${uiLabelMap.OrderSelectShippingMethod}
+ <#if carrierShipMethods?has_content>
+ <#list carrierShipMethods as shipMeth>
+ <#assign shippingEst = shippingEstWpr.getShippingEstimate(shipMeth)?default(-1)>
+ <#assign shippingMethod = shipMeth.shipmentMethodTypeId + "@" + shipMeth.partyId>
+ selected="selected"#if>>
+ <#if shipMeth.partyId != "_NA_">
+ ${shipMeth.partyId!}
+ #if>
+ ${shipMeth.description!}
+ <#if shippingEst?has_content>
+ -
+ <#if (shippingEst > -1)>
+ <@ofbizCurrency amount=shippingEst isoCode=listCart.getCurrency()/>
+ <#else>
+ ${uiLabelMap.OrderCalculatedOffline}
+ #if>
+ #if>
+
+ #list>
+ <#else>
+ ${uiLabelMap.OrderSelectAddressFirst}
+ #if>
+
+
+ ${uiLabelMap.OrderPayBy}
+
+ ${uiLabelMap.OrderSelectPaymentMethod}
+ <#list paymentMethodList as paymentMethod>
+ <#if paymentMethod.paymentMethodTypeId == "CREDIT_CARD">
+ <#assign creditCard = paymentMethod.getRelatedOne("CreditCard", false)>
+ selected="selected"#if>>CC: ${Static["org.ofbiz.party.contact.ContactHelper"].formatCreditCard(creditCard)}
+ <#elseif paymentMethod.paymentMethodTypeId == "EFT_ACCOUNT">
+ <#assign eftAccount = paymentMethod.getRelatedOne("EftAccount", false)>
+ EFT: ${eftAccount.bankName!}: ${eftAccount.accountNumber!}
+ #if>
+ #list>
+
+
+
+
+ <#if shoppingList.isActive?default("N") == "Y">
+
+ <#assign nextTime = recInfo.next(lastSlOrderTime)?if_exists />
+ <#if nextTime?has_content>
+ <#assign nextTimeStamp = Static["org.ofbiz.base.util.UtilDateTime"].getTimestamp(nextTime)?if_exists />
+ <#if nextTimeStamp?has_content>
+ <#assign nextTimeString = Static["org.ofbiz.base.util.UtilFormatOut"].formatDate(nextTimeStamp)?if_exists />
+ #if>
+ #if>
+ <#if lastSlOrderDate?has_content>
+ <#assign lastOrderedString = Static["org.ofbiz.base.util.UtilFormatOut"].formatDate(lastSlOrderDate)!>
+ #if>
+
+
+
+ ${uiLabelMap.OrderLastOrderedDate}
+ :
+ ${lastOrderedString?default("${uiLabelMap.OrderNotYetOrdered}")}
+
+
+ ${uiLabelMap.EcommerceEstimateNextOrderDate}
+ :
+ ${nextTimeString?default("${uiLabelMap.EcommerceNotYetKnown}")}
+
+
+
+
+
+ #if>
+
+
+
+
+#if>
+
+<#if childShoppingListDatas?has_content>
+
+
+
+
+
+
${uiLabelMap.EcommerceChildShoppingList} - ${shoppingList.listName}
+
+
+
+#if>
+
+
+
+
+
+
+
${uiLabelMap.EcommerceListItems} - ${shoppingList.listName}
+
+
+ <#if shoppingListItemDatas?has_content>
+ <#-- Pagination -->
+ <@paginationControls/>
+
+
+
+ ${uiLabelMap.OrderProduct}
+ - ${uiLabelMap.EcommerceStartdate} - - ${uiLabelMap.EcommerceNbrOfDays} - - ${uiLabelMap.EcommerceNbrOfPersons} - - ${uiLabelMap.CommonQuantity} -
+ <#-- Purchased
-->
+ ${uiLabelMap.EcommercePrice}
+ ${uiLabelMap.OrderTotal}
+
+
+
+
+ <#list shoppingListItemDatas[lowIndex-1..highIndex-1] as shoppingListItemData>
+ <#assign shoppingListItem = shoppingListItemData.shoppingListItem/>
+ <#assign product = shoppingListItemData.product/>
+ <#assign productContentWrapper = Static["org.ofbiz.product.product.ProductContentWrapper"].makeProductContentWrapper(product, request)/>
+ <#assign unitPrice = shoppingListItemData.unitPrice/>
+ <#assign totalPrice = shoppingListItemData.totalPrice/>
+ <#assign productVariantAssocs = shoppingListItemData.productVariantAssocs!/>
+ <#assign isVirtual = product.isVirtual?? && product.isVirtual.equals("Y")/>
+
+
+ ${shoppingListItem.productId} -
+ ${productContentWrapper.get("PRODUCT_NAME", "html")?default("No Name")} : ${productContentWrapper.get("DESCRIPTION", "html")!}
+
+
+
+
+
+
+
+ <#if product.productTypeId == "ASSET_USAGE">
+
+ <#else>
+ ${uiLabelMap.EcommerceShoppingListEmpty}.
+ #if>
+
+
+
+
+
${uiLabelMap.EcommerceShoppingListPriceTotals} - ${shoppingList.listName}
+
+
+ ${uiLabelMap.EcommerceChildListTotalPrice}
+ <@ofbizCurrency amount=shoppingListChildTotal isoCode=currencyUomId/>
+
+
+ ${uiLabelMap.EcommerceListItemsTotalPrice}
+ <@ofbizCurrency amount=shoppingListItemTotal isoCode=currencyUomId/>
+
+
+ ${uiLabelMap.OrderGrandTotal}
+ <@ofbizCurrency amount=shoppingListTotalPrice isoCode=currencyUomId/>
+
+
+
+
+
+
+ <#else>
+ <#-- shoppingList was found, but belongs to a different party -->
+ ${uiLabelMap.EcommerceShoppingListError} ${uiLabelMap.CommonId} ${shoppingList.shoppingListId}) ${uiLabelMap.EcommerceListDoesNotBelong}.
+ #if>
+#if>
diff --git a/template/survey/genericresult.ftl b/template/survey/genericresult.ftl
new file mode 100644
index 0000000..f546238
--- /dev/null
+++ b/template/survey/genericresult.ftl
@@ -0,0 +1,126 @@
+<#--
+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 uiLabelMap = Static["org.ofbiz.base.util.UtilProperties"].getResourceBundleMap("CommonUiLabels", locale)>
+
+${survey.description!}
+
+
+
+ <#list surveyQuestionAndAppls as surveyQuestionAndAppl>
+
+ <#-- special formatting for select boxes -->
+ <#assign align = "left">
+ <#if (surveyQuestionAndAppl.surveyQuestionTypeId == "BOOLEAN" || surveyQuestionAndAppl.surveyQuestionTypeId == "OPTION")>
+ <#assign align = "right">
+ #if>
+
+ <#-- get an answer from the answerMap -->
+ <#if surveyAnswers?has_content>
+ <#assign answer = surveyAnswers.get(surveyQuestionAndAppl.surveyQuestionId)!>
+ #if>
+
+ <#-- get the question results -->
+ <#if surveyResults?has_content>
+ <#assign results = surveyResults.get(surveyQuestionAndAppl.surveyQuestionId)!>
+ #if>
+
+
+
+ <#-- seperator options -->
+ <#if surveyQuestionAndAppl.surveyQuestionTypeId == "SEPERATOR_TEXT">
+ ${surveyQuestionAndAppl.question!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "SEPERATOR_LINE">
+
+ <#else>
+
+ <#-- standard question options -->
+
+ <#assign answerString = "answers">
+ <#if (results._total?default(0) == 1)>
+ <#assign answerString = "answer">
+ #if>
+ ${surveyQuestionAndAppl.question!} (${results._total?default(0)?string.number} ${answerString})
+ <#if surveyQuestionAndAppl.hint?has_content>
+ ${surveyQuestionAndAppl.hint}
+ #if>
+
+
+
+
+ <#if surveyQuestionAndAppl.surveyQuestionTypeId == "BOOLEAN">
+ <#assign selectedOption = (answer.booleanResponse)?default("Y")>
+
+ <#if "Y" == selectedOption>==> #if>${uiLabelMap.CommonY}<#if "Y" == selectedOption> #if> [${results._yes_total?default(0)?string("#")} / ${results._yes_percent?default(0)?string("#")}%]
+
+
+ <#if "N" == selectedOption>==> #if>N<#if "N" == selectedOption> #if> [${results._no_total?default(0)?string("#")} / ${results._no_percent?default(0)?string("#")}%]
+
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "TEXTAREA">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "TEXT_SHORT">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "TEXT_LONG">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "EMAIL">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "URL">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "DATE">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "CREDIT_CARD">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "GIFT_CARD">
+ ${(answer.textResponse)!}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "NUMBER_CURRENCY">
+ ${answer.currencyResponse?number?default(0)}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "NUMBER_FLOAT">
+ ${answer.floatResponse?number?default(0)?string("#")}
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "NUMBER_LONG">
+ ${answer.numericResponse?number?default(0)?string("#")} [${uiLabelMap.CommonTally}: ${results._tally?default(0)?string("#")} / ${uiLabelMap.CommonAverage}: ${results._average?default(0)?string("#")}]
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "PASSWORD">
+ [${uiLabelMap.CommonNotShown}]
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "CONTENT">
+ <#if answer.contentId?has_content>
+ <#assign content = answer.getRelatedOne("Content", false)>
+ ${answer.contentId} - ${content.contentName!}
+ #if>
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "OPTION">
+ <#assign options = surveyQuestionAndAppl.getRelated("SurveyQuestionOption", null, sequenceSort, false)!>
+ <#assign selectedOption = (answer.surveyOptionSeqId)?default("_NA_")>
+ <#if options?has_content>
+ <#list options as option>
+ <#assign optionResults = results.get(option.surveyOptionSeqId)!>
+
+ <#if option.surveyOptionSeqId == selectedOption>==> #if>
+ ${option.description!}
+ <#if option.surveyOptionSeqId == selectedOption> #if>
+ [${optionResults._total?default(0)?string("#")} / ${optionResults._percent?default(0?string("#"))}%]
+
+ #list>
+ #if>
+ <#else>
+ ${uiLabelMap.EcommerceUnsupportedQuestionType}: ${surveyQuestionAndAppl.surveyQuestionTypeId}
+ #if>
+
+
+ #if>
+
+ #list>
+
diff --git a/template/survey/miniresult.ftl b/template/survey/miniresult.ftl
new file mode 100644
index 0000000..0e6ff77
--- /dev/null
+++ b/template/survey/miniresult.ftl
@@ -0,0 +1,79 @@
+<#--
+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.
+-->
+
+
+ <#list surveyQuestionAndAppls as surveyQuestionAndAppl>
+
+ <#-- get an answer from the answerMap -->
+ <#if surveyAnswers?has_content>
+ <#assign answer = surveyAnswers.get(surveyQuestionAndAppl.surveyQuestionId)!>
+ #if>
+
+ <#-- get the question results -->
+ <#if surveyResults?has_content>
+ <#assign results = surveyResults.get(surveyQuestionAndAppl.surveyQuestionId)!>
+ #if>
+
+
+ <#-- standard question options -->
+
+ <#assign answerString = "answers">
+ <#if (results._total?default(0) == 1)>
+ <#assign answerString = "answer">
+ #if>
+ ${surveyQuestionAndAppl.question!} (${results._total?default(0)?string.number} ${answerString})
+
+
+
+
+
+
+
+
+
+ <#if surveyQuestionAndAppl.surveyQuestionTypeId == "BOOLEAN">
+ <#assign selectedOption = (answer.booleanResponse)?default("Y")>
+
+ <#if "Y" == selectedOption>==> #if>${uiLabelMap.CommonY}<#if "Y" == selectedOption> #if> [${results._yes_total?default(0)?string("#")} / ${results._yes_percent?default(0)?string("#")}%]
+
+
+ <#if "N" == selectedOption>==> #if>${uiLabelMap.CommonN}<#if "N" == selectedOption> #if> [${results._no_total?default(0)?string("#")} / ${results._no_percent?default(0)?string("#")}%]
+
+
+ <#elseif surveyQuestionAndAppl.surveyQuestionTypeId == "OPTION">
+ <#assign options = surveyQuestionAndAppl.getRelated("SurveyQuestionOption", null, sequenceSort, false)!>
+ <#assign selectedOption = (answer.surveyOptionSeqId)?default("_NA_")>
+ <#if options?has_content>
+ <#list options as option>
+ <#assign optionResults = results.get(option.surveyOptionSeqId)!>
+
+ <#if option.surveyOptionSeqId == selectedOption>==> #if>
+ ${option.description!}
+ <#if option.surveyOptionSeqId == selectedOption> #if>
+ [${optionResults._total?default(0)?string("#")} / ${optionResults._percent?default(0?string("#"))}%]
+
+ #list>
+ #if>
+ <#else>
+ ${uiLabelMap.EcommerceUnsupportedQuestionType}${surveyQuestionAndAppl.surveyQuestionTypeId}
+ #if>
+
+
+ #list>
+
diff --git a/template/survey/minisurvey.ftl b/template/survey/minisurvey.ftl
new file mode 100644
index 0000000..89402ea
--- /dev/null
+++ b/template/survey/minisurvey.ftl
@@ -0,0 +1,121 @@
+<#--
+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 additionalFields?has_content>
+ <#list additionalFields.keySet() as field>
+
+ #list>
+#if>
+
+<#-- update response -->
+<#if surveyResponseId?has_content>
+
+#if>
+
+<#-- party ID -->
+<#if partyId?has_content>
+
+#if>
+
+<#-- survey ID -->
+
+
+
diff --git a/testdef/oshopTests.xml b/testdef/oshopTests.xml
new file mode 100644
index 0000000..dab61a2
--- /dev/null
+++ b/testdef/oshopTests.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/webapp/ecommerce/WEB-INF/controller.xml b/webapp/ecommerce/WEB-INF/controller.xml
new file mode 100644
index 0000000..a8b6125
--- /dev/null
+++ b/webapp/ecommerce/WEB-INF/controller.xml
@@ -0,0 +1,2169 @@
+
+
+
+
+ OFBiz: eCommerce Controller Configuration File
+ /error/error.jsp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Verify a user is logged in.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Handles setting the currency, agreement and shipment dates of an order.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Handles callbacks from PayPal's Express Checkout Instant Update API
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webapp/ecommerce/WEB-INF/web.xml b/webapp/ecommerce/WEB-INF/web.xml
new file mode 100644
index 0000000..f4c3b35
--- /dev/null
+++ b/webapp/ecommerce/WEB-INF/web.xml
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+ Apache OFBiz - demostore
+ Demo Store for the Apache OFBiz Project
+
+
+ A unique ID used to look up the WebSite entity
+ webSiteId
+ WebStore
+
+
+ A unique name used to identify/recognize the local dispatcher for the Service Engine
+ localDispatcherName
+ ecommerce
+
+
+ The Name of the Entity Delegator to use, defined in entityengine.xml
+ entityDelegatorName
+ default
+
+
+ The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.
+ mainDecoratorLocation
+ component://ecommerce/widget/CommonScreens.xml
+
+
+
+ Forces the JSESSIONID cookie to be sent via http rather https, helps prevent lost sessions in web apps that
+ frequently switch between http and https.
+
+ forceHttpSession
+ true
+
+
+
+ CatalogUrlFilter
+ CatalogUrlFilter
+ org.ofbiz.product.category.CatalogUrlFilter
+ defaultLocaleString en_US
+
+
+ ContentUrlFilter
+ ContentUrlFilter
+ org.ofbiz.content.content.ContentUrlFilter
+
+ defaultLocaleString
+ en_US
+
+ viewRequest ViewBlogArticle
+
+
+ ContextFilter
+ ContextFilter
+ org.ofbiz.webapp.control.ContextFilter
+
+ disableContextSecurity
+ N
+
+
+ allowedPaths
+ /error:/control:/products:/select:/index.html:/index.jsp:/robots.txt:/default.html:/default.jsp:/images
+
+
+
+ CatalogUrlFilter
+ /*
+
+
+ ContentUrlFilter
+ /*
+
+
+ ContextFilter
+ /*
+
+
+ org.ofbiz.webapp.control.ControlEventListener
+
+
+
+
+ org.ofbiz.order.shoppingcart.CartEventListener
+
+ org.ofbiz.webapp.control.LoginEventListener
+
+
+ ControlServlet
+ ControlServlet
+ Main Control Servlet
+ org.ofbiz.webapp.control.ControlServlet
+ 1
+
+
+
+ Catalog (Category/Product) URL Servlet
+ CatalogUrlServlet
+ CatalogUrlServlet
+ org.ofbiz.product.category.CatalogUrlServlet
+ 1
+
+
+
+ ControlServlet
+ /control/*
+
+
+
+ CatalogUrlServlet
+ /products/*
+
+
+
+ 60
+
+ true
+ true
+
+ COOKIE
+
+
+
+ index.jsp
+ index.html
+ index.htm
+
+
+
+ 404
+ /error/404.jsp
+
+
diff --git a/webapp/ecommerce/index.jsp b/webapp/ecommerce/index.jsp
new file mode 100644
index 0000000..b8ade91
--- /dev/null
+++ b/webapp/ecommerce/index.jsp
@@ -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.
+--%>
+
+<%pageContext.forward("control/main");%>
diff --git a/webapp/ecommerce/makebogodata.jsp b/webapp/ecommerce/makebogodata.jsp
new file mode 100644
index 0000000..a071b1b
--- /dev/null
+++ b/webapp/ecommerce/makebogodata.jsp
@@ -0,0 +1,69 @@
+<%--
+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.
+--%>
+
+<%@ page import="org.ofbiz.product.catalog.*" %>
+<%@ page import="org.ofbiz.product.product.*" %>
+<%@ page import="org.ofbiz.entity.*" %>
+<%@ page import="org.ofbiz.base.util.*" %>
+<%@ page import="java.util.*" %>
+<%@ page import="java.math.BigDecimal" %>
+
+
+
+<%
+ List products = delegator.findList("Product", null, null, null, null, false);
+ for (GenericValue product : products) {
+ KeywordIndex.indexKeywords(product);
+ }
+
+ if(request.getParameter("makeall") == null) {
+%>Just added the keywords from all existing product info.
+Create a LOT of products, categories, and keywords.
+<%
+ }
+ else {
+ String[] wordBag = {"a", "product", "big", "ugly", "pretty", "small", "under", "over", "one", "two", "three", "four", "five", "six", "seven", "eight", "tree"};
+ String[] longWordBag = {"b", "item", "little", "cute", "frightening", "massive", "top", "btoom", "bush", "shrub", "gadget"};
+
+ for(int cat=1; cat<=400; cat++)
+ {
+ String parentId = cat<=20?"CATALOG1":"" + (cat/20);
+ delegator.create("ProductCategory", UtilMisc.toMap("productCategoryId", "" + cat, "primaryParentCategoryId", parentId, "description", "Category " + cat));
+ delegator.create("ProductCategoryRollup", UtilMisc.toMap("productCategoryId", "" + cat, "parentProductCategoryId", parentId));
+ for(int prod=1; prod<=50; prod++)
+ {
+ String desc = "Cool Description";
+ for(int i=0; i<10; i++) {
+ int wordNum = (int)(Math.random()*(wordBag.length-1));
+ desc += (" " + wordBag[wordNum]);
+ }
+ String longDesc = "Cool LONG Description";
+ for(int i=0; i<50; i++) {
+ int wordNum = (int)(Math.random()*(longWordBag.length-1));
+ longDesc += (" " + longWordBag[wordNum]);
+ }
+ BigDecimal price = new BigDecimal("2.99").add(BigDecimal.valueOf(prod));
+ GenericValue product = delegator.create("Product", UtilMisc.toMap("productId", "" + (cat*100 + prod), "primaryProductCategoryId", "" + (cat), "productName", "Product " + "" + (cat*100 + prod), "description", desc, "longDescription", longDesc, "defaultPrice", price));
+ KeywordIndex.indexKeywords(product);
+ delegator.create("ProductCategoryMember", UtilMisc.toMap("productId", "" + (cat*100 + prod), "productCategoryId", "" + (cat)));
+ }
+ }
+%>Created lots of products and categories and keywords.<%
+ }
+%>
diff --git a/webapp/ecommerce/robots.txt b/webapp/ecommerce/robots.txt
new file mode 100644
index 0000000..a77ff4b
--- /dev/null
+++ b/webapp/ecommerce/robots.txt
@@ -0,0 +1,2 @@
+User-agent:*
+Disallow:
diff --git a/webapp/oshop/README b/webapp/oshop/README
new file mode 100644
index 0000000..45ff103
--- /dev/null
+++ b/webapp/oshop/README
@@ -0,0 +1,3 @@
+If you want to know more about this feature, please check
+https://cwiki.apache.org/confluence/display/OFBIZ/Search+Engine+Optimisation%2C+SEO+in+ecommerce
+
diff --git a/webapp/oshop/WEB-INF/controller.xml b/webapp/oshop/WEB-INF/controller.xml
new file mode 100644
index 0000000..975d011
--- /dev/null
+++ b/webapp/oshop/WEB-INF/controller.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ OFBiz: oshop SEO Controller Configuration File
+
+
+
diff --git a/webapp/oshop/WEB-INF/web.xml b/webapp/oshop/WEB-INF/web.xml
new file mode 100644
index 0000000..6d33591
--- /dev/null
+++ b/webapp/oshop/WEB-INF/web.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+ Apache OFBiz - demostore
+ Demo Store for the Apache OFBiz Project
+
+
+ A unique ID used to look up the WebSite entity
+ webSiteId
+ oshop
+
+
+ A unique name used to identify/recognize the local dispatcher for the Service Engine
+ localDispatcherName
+ ecommerce
+
+
+ The Name of the Entity Delegator to use, defined in entityengine.xml
+ entityDelegatorName
+ default
+
+
+ The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.
+ mainDecoratorLocation
+ component://oshop/widget/CommonScreens.xml
+
+
+
+ Forces the JSESSIONID cookie to be sent via http rather https, helps prevent lost sessions in web apps that
+ frequently switch between http and https.
+
+ forceHttpSession
+ true
+
+
+ Default page uri. Important: please DO add or remove /control to match url-pattern of SeoControlServlet.
+ defaultPage
+ /main
+
+
+
+ SeoCatalogUrlFilter
+ SeoCatalogUrlFilter
+ org.ofbiz.product.category.CatalogUrlSeoFilter
+ defaultLocaleString en_US
+
+
+ SeoContentUrlFilter
+ SeoContentUrlFilter
+ org.ofbiz.product.category.SeoContentUrlFilter
+
+ defaultLocaleString
+ en_US
+
+ viewRequest ViewBlogArticle
+
+
+ SeoContextFilter
+ SeoContextFilter
+ org.ofbiz.product.category.SeoContextFilter
+
+ disableContextSecurity
+ N
+
+
+ allowedPaths
+ /error:/control:/products:/select:/index.html:/index.jsp:/robots.txt:/default.html:/default.jsp:/images
+
+
+
+ SeoCatalogUrlFilter
+ /*
+
+
+ SeoContentUrlFilter
+ /*
+
+
+ SeoContextFilter
+ /*
+
+
+ org.ofbiz.webapp.control.ControlEventListener
+
+
+
+
+ org.ofbiz.order.shoppingcart.CartEventListener
+
+ org.ofbiz.webapp.control.LoginEventListener
+
+
+ Main SEO Control Servlet
+ SeoControlServlet
+ SeoControlServlet
+ org.ofbiz.product.category.SeoControlServlet
+ 1
+
+
+
+ SEO Catalog (Category/Product) URL Servlet
+ SeoCatalogUrlServlet
+ SeoCatalogUrlServlet
+ org.ofbiz.product.category.SeoCatalogUrlServlet
+ 1
+
+
+
+ SeoControlServlet
+ /*
+
+
+
+ SeoCatalogUrlServlet
+ /products/*
+
+
+
+ 60
+
+ true
+ true
+
+ COOKIE
+
+
+
+ index.jsp
+ index.html
+ index.htm
+
+
+
+ 404
+ /error/404.jsp
+
+
diff --git a/webapp/oshop/error/error.jsp b/webapp/oshop/error/error.jsp
new file mode 100644
index 0000000..3aef501
--- /dev/null
+++ b/webapp/oshop/error/error.jsp
@@ -0,0 +1,53 @@
+<%--
+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.
+--%>
+
+<%@ page import="org.ofbiz.base.util.*" %>
+
+
+OFBiz Message
+
+
+
+<% String errorMsg = (String) request.getAttribute("_ERROR_MESSAGE_"); %>
+
+
+
+
+
+
+
+
+
+
+ :ERROR MESSAGE:
+
+
+
+
+ <%=UtilFormatOut.replaceString(errorMsg, "\n", " ")%>
+
+
+
+
+
+
+
+
+
+
diff --git a/webapp/oshop/index.jsp b/webapp/oshop/index.jsp
new file mode 100644
index 0000000..0ad9a3f
--- /dev/null
+++ b/webapp/oshop/index.jsp
@@ -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.
+--%>
+
+<%response.sendRedirect("control/main");%>
diff --git a/widget/BlogMenus.xml b/widget/BlogMenus.xml
new file mode 100644
index 0000000..70f8013
--- /dev/null
+++ b/widget/BlogMenus.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/BlogScreens.xml b/widget/BlogScreens.xml
new file mode 100644
index 0000000..384a300
--- /dev/null
+++ b/widget/BlogScreens.xml
@@ -0,0 +1,702 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/BlogTemplates.xml b/widget/BlogTemplates.xml
new file mode 100644
index 0000000..37d0b85
--- /dev/null
+++ b/widget/BlogTemplates.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/BlogTrees.xml b/widget/BlogTrees.xml
new file mode 100644
index 0000000..dd77e2e
--- /dev/null
+++ b/widget/BlogTrees.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/CartScreens.xml b/widget/CartScreens.xml
new file mode 100644
index 0000000..e988fde
--- /dev/null
+++ b/widget/CartScreens.xml
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/CatalogScreens.xml b/widget/CatalogScreens.xml
new file mode 100644
index 0000000..fe383e1
--- /dev/null
+++ b/widget/CatalogScreens.xml
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.ProductCategoryNotFoundForCategoryID} ${productCategoryId}!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/CommonScreens.xml b/widget/CommonScreens.xml
new file mode 100644
index 0000000..a21d19d
--- /dev/null
+++ b/widget/CommonScreens.xml
@@ -0,0 +1,978 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/ContentScreens.xml b/widget/ContentScreens.xml
new file mode 100644
index 0000000..1d6de1a
--- /dev/null
+++ b/widget/ContentScreens.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/CustRequestScreens.xml b/widget/CustRequestScreens.xml
new file mode 100644
index 0000000..71ee467
--- /dev/null
+++ b/widget/CustRequestScreens.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderNoRequestFound}
+
+
+
+
+
+
+
+
diff --git a/widget/CustomerScreens.xml b/widget/CustomerScreens.xml
new file mode 100644
index 0000000..6977bee
--- /dev/null
+++ b/widget/CustomerScreens.xml
@@ -0,0 +1,684 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/EmailContactListScreens.xml b/widget/EmailContactListScreens.xml
new file mode 100644
index 0000000..1eae77c
--- /dev/null
+++ b/widget/EmailContactListScreens.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/EmailGiftCardScreens.xml b/widget/EmailGiftCardScreens.xml
new file mode 100644
index 0000000..2d92d49
--- /dev/null
+++ b/widget/EmailGiftCardScreens.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/EmailOrderScreens.xml b/widget/EmailOrderScreens.xml
new file mode 100644
index 0000000..6b1b82d
--- /dev/null
+++ b/widget/EmailOrderScreens.xml
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/EmailProductScreens.xml b/widget/EmailProductScreens.xml
new file mode 100644
index 0000000..b77fe30
--- /dev/null
+++ b/widget/EmailProductScreens.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
diff --git a/widget/EmailReturnScreens.xml b/widget/EmailReturnScreens.xml
new file mode 100644
index 0000000..3464625
--- /dev/null
+++ b/widget/EmailReturnScreens.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/ForumScreens.xml b/widget/ForumScreens.xml
new file mode 100644
index 0000000..161b4c9
--- /dev/null
+++ b/widget/ForumScreens.xml
@@ -0,0 +1,575 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.EcommerceBlogFullMessage}:
+
+
+
+
+
+
+
+
+ ${uiLabelMap.EcommerceBlogAddResponse}
+
+
+
+ ${uiLabelMap.EcommerceBlogAddResponseMessage}
+
+
+
+ ${uiLabelMap.EcommerceBlogMessageTree}:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/ForumTrees.xml b/widget/ForumTrees.xml
new file mode 100644
index 0000000..56c0c6a
--- /dev/null
+++ b/widget/ForumTrees.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/OrderScreens.xml b/widget/OrderScreens.xml
new file mode 100644
index 0000000..5bbe893
--- /dev/null
+++ b/widget/OrderScreens.xml
@@ -0,0 +1,626 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/ProductScreens.xml b/widget/ProductScreens.xml
new file mode 100644
index 0000000..9dbd007
--- /dev/null
+++ b/widget/ProductScreens.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.ProductProductNotFound} ${productId}!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/widget/QuoteScreens.xml b/widget/QuoteScreens.xml
new file mode 100644
index 0000000..7ba715d
--- /dev/null
+++ b/widget/QuoteScreens.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${uiLabelMap.OrderNoQuoteFound}
+
+
+
+
+
+
+
+
diff --git a/widget/ShoppingListScreens.xml b/widget/ShoppingListScreens.xml
new file mode 100644
index 0000000..1e7a128
--- /dev/null
+++ b/widget/ShoppingListScreens.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/forms/BlogForms.xml b/widget/forms/BlogForms.xml
new file mode 100644
index 0000000..778e1b9
--- /dev/null
+++ b/widget/forms/BlogForms.xml
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/forms/ContentForms.xml b/widget/forms/ContentForms.xml
new file mode 100644
index 0000000..a4ada83
--- /dev/null
+++ b/widget/forms/ContentForms.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/forms/ForumForms.xml b/widget/forms/ForumForms.xml
new file mode 100644
index 0000000..1a96016
--- /dev/null
+++ b/widget/forms/ForumForms.xml
@@ -0,0 +1,738 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widget/forms/oshopForms.xml b/widget/forms/oshopForms.xml
new file mode 100644
index 0000000..fcbd983
--- /dev/null
+++ b/widget/forms/oshopForms.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/widget/oshopMenus.xml b/widget/oshopMenus.xml
new file mode 100644
index 0000000..ad876c4
--- /dev/null
+++ b/widget/oshopMenus.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/widget/oshopScreens.xml b/widget/oshopScreens.xml
new file mode 100644
index 0000000..70f7487
--- /dev/null
+++ b/widget/oshopScreens.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file