Jmango360_Japi - Version 3.2.0

Version Notes

* Bug fixes

Download this release

Release Info

Developer Duc Ngo
Extension Jmango360_Japi
Version 3.2.0
Comparing to
See all releases


Code changes from version 3.1.1 to 3.2.0

Files changed (24) hide show
  1. app/code/community/Jmango360/Japi/Block/Adminhtml/System/Config/Form/Log.php +1 -1
  2. app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Billing.php +15 -0
  3. app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Button.php +1 -1
  4. app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Shipping.php +15 -0
  5. app/code/community/Jmango360/Japi/Helper/Product.php +196 -8
  6. app/code/community/Jmango360/Japi/Helper/Product/Grouped.php +8 -1
  7. app/code/community/Jmango360/Japi/Helper/Review/Bazaarvoice.php +638 -0
  8. app/code/community/Jmango360/Japi/Model/Rest/Cart.php +34 -2
  9. app/code/community/Jmango360/Japi/Model/Rest/Cart/Update.php +5 -3
  10. app/code/community/Jmango360/Japi/Model/Rest/Checkout/Onepage.php +1 -1
  11. app/code/community/Jmango360/Japi/Model/Rest/Product/Review.php +28 -0
  12. app/code/community/Jmango360/Japi/Model/Rest/Product/Search.php +12 -0
  13. app/code/community/Jmango360/Japi/Model/Server.php +4 -1
  14. app/code/community/Jmango360/Japi/Model/System/Config/Source/Bazaarvoice/Env.php +12 -0
  15. app/code/community/Jmango360/Japi/controllers/CustomerController.php +33 -3
  16. app/code/community/Jmango360/Japi/etc/config.xml +5 -1
  17. app/code/community/Jmango360/Japi/etc/system.xml +28 -0
  18. app/design/frontend/base/default/template/japi/checkout/onepage.phtml +16 -6
  19. app/design/frontend/base/default/template/japi/checkout/onepage/style.phtml +1 -1
  20. app/design/frontend/base/default/template/japi/customer/address/edit.phtml +5 -0
  21. package.xml +4 -4
  22. skin/frontend/base/default/japi/css/style.css +45 -1
  23. skin/frontend/base/default/japi/css/style.less +35 -1
  24. skin/frontend/base/default/japi/js/checkout.js +58 -11
app/code/community/Jmango360/Japi/Block/Adminhtml/System/Config/Form/Log.php CHANGED
@@ -45,7 +45,7 @@ class Jmango360_Japi_Block_Adminhtml_System_Config_Form_Log extends Mage_Adminht
45
  $html = '<select id="' . $this->_element->getHtmlId() . '" onchange="japiChangeLog(this)">';
46
  $logDir = Mage::getBaseDir('var') . DS . 'log';
47
  foreach (scandir($logDir) as $fileName) {
48
- if ($fileName == '.' || $fileName == '..') continue;
49
  $fileSize = $this->_getLogSize($logDir . DS . $fileName);
50
  $html .= '<option value="' . $fileName . '">' . sprintf('%s (%s)', $fileName, $fileSize) . '</option>';
51
  }
45
  $html = '<select id="' . $this->_element->getHtmlId() . '" onchange="japiChangeLog(this)">';
46
  $logDir = Mage::getBaseDir('var') . DS . 'log';
47
  foreach (scandir($logDir) as $fileName) {
48
+ if ($fileName == '.' || $fileName == '..' || is_dir($logDir . DS . $fileName)) continue;
49
  $fileSize = $this->_getLogSize($logDir . DS . $fileName);
50
  $html .= '<option value="' . $fileName . '">' . sprintf('%s (%s)', $fileName, $fileSize) . '</option>';
51
  }
app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Billing.php CHANGED
@@ -23,4 +23,19 @@ class Jmango360_Japi_Block_Checkout_Onepage_Billing extends Mage_Checkout_Block_
23
 
24
  return $this->_address;
25
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
23
 
24
  return $this->_address;
25
  }
26
+
27
+ public function getAddressesHtmlSelect($type)
28
+ {
29
+ $html = parent::getAddressesHtmlSelect($type);
30
+
31
+ if ($html) {
32
+ $editLink = sprintf('<div class="japi-address-edit"><a href="#" class="japi-address-edit-btn">%s</a></div>',
33
+ $this->__('Edit')
34
+ );
35
+
36
+ $html .= $editLink;
37
+ }
38
+
39
+ return $html;
40
+ }
41
  }
app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Button.php CHANGED
@@ -22,7 +22,7 @@ class Jmango360_Japi_Block_Checkout_Onepage_Button extends Jmango360_Japi_Block_
22
  if (Mage::helper('core')->isModuleEnabled('Iways_PayPalPlus')) {
23
  $this->setTemplate('paypalplus/review/button.phtml');
24
  } else {
25
- $this->setTemplate('japi/checkout/onepage/js.phtml');
26
  }
27
  }
28
  }
22
  if (Mage::helper('core')->isModuleEnabled('Iways_PayPalPlus')) {
23
  $this->setTemplate('paypalplus/review/button.phtml');
24
  } else {
25
+ $this->setTemplate('japi/checkout/onepage/review/button.phtml');
26
  }
27
  }
28
  }
app/code/community/Jmango360/Japi/Block/Checkout/Onepage/Shipping.php CHANGED
@@ -13,4 +13,19 @@ class Jmango360_Japi_Block_Checkout_Onepage_Shipping extends Mage_Checkout_Block
13
 
14
  return $this->_address;
15
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
13
 
14
  return $this->_address;
15
  }
16
+
17
+ public function getAddressesHtmlSelect($type)
18
+ {
19
+ $html = parent::getAddressesHtmlSelect($type);
20
+
21
+ if ($html) {
22
+ $editLink = sprintf('<div class="japi-address-edit"><a href="#" class="japi-address-edit-btn">%s</a></div>',
23
+ $this->__('Edit')
24
+ );
25
+
26
+ $html .= $editLink;
27
+ }
28
+
29
+ return $html;
30
+ }
31
  }
app/code/community/Jmango360/Japi/Helper/Product.php CHANGED
@@ -341,10 +341,11 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
341
  * Convert a product to collection and return to api json
342
  *
343
  * @param int $product
 
344
  * @return null|array
345
  * @throws Jmango360_Japi_Exception
346
  */
347
- public function convertProductIdToApiResponseV2($product)
348
  {
349
  if (!is_numeric($product)) {
350
  return null;
@@ -360,7 +361,9 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
360
  ->addTaxPercents()
361
  ->addIdFilter($product);
362
 
363
- $this->applyHideOnAppFilter($collection);
 
 
364
 
365
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
366
  //Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
@@ -635,6 +638,7 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
635
  'stock' => $this->_getStockLevel($product),
636
  'is_in_stock' => $product->getStockItem() ? (int)$product->getStockItem()->getIsInStock() : null,
637
  'is_saleable' => (int)$product->isSalable(),
 
638
  'price' => $this->calculatePriceIncludeTax($product, $_basePrice),
639
  'final_price' => $this->calculatePriceIncludeTax($product, $product->getFinalPrice()),
640
  'min_price' => $this->calculatePriceIncludeTax($product, $product->getMinPrice()),
@@ -784,6 +788,20 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
784
  $result['has_required_options'] = true;
785
  }
786
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
787
  return $result;
788
  }
789
 
@@ -944,6 +962,22 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
944
  return $result;
945
  }
946
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
947
  /**
948
  * Return download files from MageWorx_Downloads
949
  *
@@ -1158,6 +1192,13 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
1158
  $includeWeeeTax = true
1159
  )
1160
  {
 
 
 
 
 
 
 
1161
  if (version_compare(Mage::getVersion(), '1.8.1.0', '<')) {
1162
  /* @var $taxHelper Jmango360_Japi_Helper_Tax */
1163
  $taxHelper = Mage::helper('japi/tax');
@@ -1220,15 +1261,14 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
1220
  }
1221
  }
1222
  }
1223
- }
1224
 
1225
- if ($convertPrice) {
1226
- // Convert store price
1227
- $store = Mage::app()->getStore();
1228
- $productFinalPrice = $store->convertPrice($productFinalPrice + $weeeTaxAmountInclTaxes, false, false);
1229
  }
1230
 
1231
- return $productFinalPrice;
1232
  }
1233
 
1234
  /**
@@ -1969,4 +2009,152 @@ class Jmango360_Japi_Helper_Product extends Mage_Core_Helper_Abstract
1969
 
1970
  return $data;
1971
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1972
  }
341
  * Convert a product to collection and return to api json
342
  *
343
  * @param int $product
344
+ * @param array $config
345
  * @return null|array
346
  * @throws Jmango360_Japi_Exception
347
  */
348
+ public function convertProductIdToApiResponseV2($product, $config = array())
349
  {
350
  if (!is_numeric($product)) {
351
  return null;
361
  ->addTaxPercents()
362
  ->addIdFilter($product);
363
 
364
+ if (!isset($config['no_apply_hide_on_app'])) {
365
+ $this->applyHideOnAppFilter($collection);
366
+ }
367
 
368
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
369
  //Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
638
  'stock' => $this->_getStockLevel($product),
639
  'is_in_stock' => $product->getStockItem() ? (int)$product->getStockItem()->getIsInStock() : null,
640
  'is_saleable' => (int)$product->isSalable(),
641
+ 'is_available' => $this->_getProductAvailable($product),
642
  'price' => $this->calculatePriceIncludeTax($product, $_basePrice),
643
  'final_price' => $this->calculatePriceIncludeTax($product, $product->getFinalPrice()),
644
  'min_price' => $this->calculatePriceIncludeTax($product, $product->getMinPrice()),
788
  $result['has_required_options'] = true;
789
  }
790
 
791
+ /**
792
+ * MPLUGIN-1750: Support custom product attribute 'mamut_note'
793
+ */
794
+ if (strpos(Mage::getBaseUrl(), 'deleukstetaartenshop') !== false) {
795
+ if (Mage::app()->getLocale()->getLocaleCode() == 'nl_NL') {
796
+ $mamutNote = $this->_getCustomHtmlStyle();
797
+ $mamutNote .= $productHelper->productAttribute($product, $product->getData('mamut_note'), 'description');
798
+ $result['short_description'] = $mamutNote;
799
+ $result['description'] = $mamutNote;
800
+ } else {
801
+ $result['description'] = $result['short_description'];
802
+ }
803
+ }
804
+
805
  return $result;
806
  }
807
 
962
  return $result;
963
  }
964
 
965
+ /**
966
+ * Return "is_available" property for display stock status
967
+ *
968
+ * @param Mage_Catalog_Model_Product $product
969
+ * @return int
970
+ */
971
+ protected function _getProductAvailable(Mage_Catalog_Model_Product $product)
972
+ {
973
+ if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_GROUPED) {
974
+ $associatedProducts = $product->getTypeInstance(true)->getAssociatedProducts($product);
975
+ return (int)($product->isAvailable() && count($associatedProducts) > 0);
976
+ } else {
977
+ return (int)$product->isAvailable();
978
+ }
979
+ }
980
+
981
  /**
982
  * Return download files from MageWorx_Downloads
983
  *
1192
  $includeWeeeTax = true
1193
  )
1194
  {
1195
+ $store = Mage::app()->getStore();
1196
+
1197
+ /**
1198
+ * MPLUGIN-1793: Copy logic from price.phtml
1199
+ */
1200
+ $productFinalPrice = $store->roundPrice($store->convertPrice($productFinalPrice, false, false));
1201
+
1202
  if (version_compare(Mage::getVersion(), '1.8.1.0', '<')) {
1203
  /* @var $taxHelper Jmango360_Japi_Helper_Tax */
1204
  $taxHelper = Mage::helper('japi/tax');
1261
  }
1262
  }
1263
  }
 
1264
 
1265
+ /**
1266
+ * MPLUGIN-1793: Copy logic from price.phtml
1267
+ */
1268
+ $weeeTaxAmountInclTaxes = $store->roundPrice($store->convertPrice($weeeTaxAmountInclTaxes, false, false));
1269
  }
1270
 
1271
+ return $productFinalPrice + $weeeTaxAmountInclTaxes;
1272
  }
1273
 
1274
  /**
2009
 
2010
  return $data;
2011
  }
2012
+
2013
+ /**
2014
+ * Support Klevu_Search catalog storage engine
2015
+ *
2016
+ * @return array
2017
+ * @throws Jmango360_Japi_Exception
2018
+ */
2019
+ public function getProductCollectionFromKlevuSearch()
2020
+ {
2021
+ if (!$this->isModuleEnabled('Klevu_Search')) {
2022
+ throw new Jmango360_Japi_Exception(
2023
+ $this->__('Module(s) %s not found.', 'Klevu_Search'),
2024
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
2025
+ );
2026
+ }
2027
+
2028
+ /**
2029
+ * Init sorting
2030
+ */
2031
+ /* @var Mage_Catalog_Block_Product_List $productListBlock */
2032
+ $productListBlock = Mage::getBlockSingleton('catalog/product_list');
2033
+ $toolbarBlock = $productListBlock->getToolbarBlock();
2034
+ $order = $this->_getRequest()->getParam('order');
2035
+ $dir = $this->_getRequest()->getParam('dir', 'desc');
2036
+ if ($order) {
2037
+ $toolbarBlock->setDefaultOrder($order);
2038
+ $toolbarBlock->setDefaultDirection($dir);
2039
+ }
2040
+
2041
+ /**
2042
+ * Init filter attributes
2043
+ */
2044
+ /* @var $layer Mage_CatalogSearch_Model_Layer */
2045
+ $layer = Mage::getSingleton('catalogsearch/layer');
2046
+ $requestParams = $this->_getRequest()->getParams();
2047
+ $filters = array();
2048
+
2049
+ if (array_key_exists('category', $requestParams)) {
2050
+ $filters['cat'] = null;
2051
+ $requestParams['cat'] = $requestParams['category'];
2052
+ }
2053
+
2054
+ $excludedParams = array(
2055
+ 'SID', 'token', 'order', 'dir', 'p', 'limit', 'q', 'category'
2056
+ );
2057
+
2058
+ foreach ($requestParams as $param => $value) {
2059
+ if (in_array($param, $excludedParams)) continue;
2060
+ $attributeModel = Mage::getModel('eav/config')->getAttribute('catalog_product', $param);
2061
+ if ($attributeModel->getId()) {
2062
+ $filters[$param] = $attributeModel;
2063
+ }
2064
+ }
2065
+
2066
+ foreach ($filters as $attributeCode => $attributeModel) {
2067
+ switch ($attributeCode) {
2068
+ case 'cat':
2069
+ /* @var $filterModel Mage_Catalog_Model_Layer_Filter_Category */
2070
+ $filterModel = Mage::getModel('catalog/layer_filter_category');
2071
+ break;
2072
+ case 'price':
2073
+ /* @var $filterModel Mage_Catalog_Model_Layer_Filter_Price */
2074
+ $filterModel = Mage::getModel('catalog/layer_filter_price');
2075
+ $filterModel->setAttributeModel($attributeModel);
2076
+ break;
2077
+ default:
2078
+ /* @var $filterModel Mage_Catalog_Model_Layer_Filter_Attribute */
2079
+ $filterModel = Mage::getModel('catalogsearch/layer_filter_attribute');
2080
+ $filterModel->setAttributeModel($attributeModel);
2081
+ }
2082
+ $filterModel->setLayer($layer);
2083
+ $layer->getState()->addFilter(
2084
+ Mage::getModel('catalog/layer_filter_item')
2085
+ ->setFilter($filterModel)
2086
+ ->setLabel($requestParams[$attributeCode])
2087
+ ->setValue($requestParams[$attributeCode])
2088
+ );
2089
+ }
2090
+
2091
+ /**
2092
+ * Init product collection
2093
+ */
2094
+ /* @var $productCollection Klevu_Search_Model_CatalogSearch_Resource_Fulltext_Collection */
2095
+ $productCollection = Mage::getResourceModel('catalogsearch/fulltext_collection')
2096
+ ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
2097
+ ->addSearchFilter(Mage::helper('catalogsearch')->getQuery()->getQueryText())
2098
+ ->setStore(Mage::app()->getStore())
2099
+ ->addMinimalPrice()
2100
+ ->addFinalPrice()
2101
+ ->addTaxPercents()
2102
+ ->addStoreFilter()
2103
+ ->addUrlRewrite()
2104
+ ->setPageSize($this->_getRequest()->getParam('limit', 12));
2105
+
2106
+ Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($productCollection);
2107
+ Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($productCollection);
2108
+ $this->applySupportedProductTypes($productCollection);
2109
+ $this->applyHideOnAppFilter($productCollection);
2110
+
2111
+ $data = array();
2112
+
2113
+ /**
2114
+ * Get filter items
2115
+ */
2116
+ $klevuFilters = $productCollection->getKlevuFilters();
2117
+ foreach ($klevuFilters as $key => $filter) {
2118
+ if (array_key_exists($key, $filters)) continue;
2119
+ if ($key == 'category' && array_key_exists('cat', $filters)) continue;
2120
+
2121
+ $item['name'] = $filter['label'];
2122
+ $item['code'] = $key;
2123
+ $item['items'] = null;
2124
+ if ($filter['options']) {
2125
+ foreach ($filter['options'] as $option) {
2126
+ $item['items'][] = array(
2127
+ 'value' => $option['label'],
2128
+ 'label' => $option['label'],
2129
+ 'count' => $option['count']
2130
+ );
2131
+ }
2132
+ }
2133
+ $data['filters'][] = $item;
2134
+ }
2135
+
2136
+ /**
2137
+ * Get toolbar information
2138
+ */
2139
+ $data['toolbar_info'] = array(
2140
+ 'current_page_num' => $this->_getRequest()->getParam('p', 1),
2141
+ 'last_page_num' => ceil($productCollection->getSize() / $productCollection->getPageSize()),
2142
+ 'current_limit' => $this->_getRequest()->getParam('limit', 12),
2143
+ 'available_limit' => null,
2144
+ 'current_order' => null,
2145
+ 'current_direction' => null,
2146
+ 'available_orders' => null
2147
+ );
2148
+ if ($order) {
2149
+ $data['toolbar_info']['current_order'] = $order;
2150
+ $data['toolbar_info']['current_direction'] = $dir;
2151
+ } else {
2152
+ $data['toolbar_info']['current_order'] = 'relevance';
2153
+ $data['toolbar_info']['current_direction'] = 'desc';
2154
+ }
2155
+
2156
+ $data['products'] = $this->convertProductCollectionToApiResponseV2($productCollection);
2157
+
2158
+ return $data;
2159
+ }
2160
  }
app/code/community/Jmango360/Japi/Helper/Product/Grouped.php CHANGED
@@ -16,7 +16,13 @@ class Jmango360_Japi_Helper_Product_Grouped extends Mage_Core_Helper_Abstract
16
  $result = array();
17
  $index = 0;
18
  foreach ($items as $item) {
19
- $result[] = $this->_convertItemToArray($item, $includePrice, $index++);
 
 
 
 
 
 
20
  }
21
  return $result;
22
  }
@@ -67,6 +73,7 @@ class Jmango360_Japi_Helper_Product_Grouped extends Mage_Core_Helper_Abstract
67
  }
68
 
69
  $result['is_saleable'] = (int)$item->isSaleable();
 
70
  $result['position'] = $index !== null ? $index : (int)$item->getPosition();
71
  $result['qty'] = $item->getQty();
72
  $result['stock'] = $item->getStockItem() ? $item->getStockItem()->getQty() : null;
16
  $result = array();
17
  $index = 0;
18
  foreach ($items as $item) {
19
+ /* @var $item Mage_Catalog_Model_Product */
20
+ if (!$item->hasData('hide_in_jm360')) {
21
+ $item->load($item->getId(), array('hide_in_jm360'));
22
+ }
23
+ if (!$item->getData('hide_in_jm360')) {
24
+ $result[] = $this->_convertItemToArray($item, $includePrice, $index++);
25
+ }
26
  }
27
  return $result;
28
  }
73
  }
74
 
75
  $result['is_saleable'] = (int)$item->isSaleable();
76
+ $result['is_available'] = (int)$item->isSaleable();
77
  $result['position'] = $index !== null ? $index : (int)$item->getPosition();
78
  $result['qty'] = $item->getQty();
79
  $result['stock'] = $item->getStockItem() ? $item->getStockItem()->getQty() : null;
app/code/community/Jmango360/Japi/Helper/Review/Bazaarvoice.php ADDED
@@ -0,0 +1,638 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright 2017 JMango360
4
+ */
5
+
6
+ /**
7
+ * Class Jmango360_Japi_Helper_Review_Bazaarvoice
8
+ */
9
+ class Jmango360_Japi_Helper_Review_Bazaarvoice extends Mage_Core_Helper_Abstract
10
+ {
11
+ const URL_STAGING = 'https://stg.api.bazaarvoice.com/';
12
+ const URL_PRODUCTION = 'https://api.bazaarvoice.com/';
13
+ const DEFAULT_LIMIT = 99;
14
+ const DEFAULT_SORT = 'SubmissionTime';
15
+ const DEFAULT_DIR = 'desc';
16
+ const CACHE_KEY_REVIEW_FORM = 'BV_REVIEW_FORM';
17
+ protected $FORM_FIELDS = array(
18
+ 'rating' => 'Overall Rating',
19
+ 'title' => 'Review Title',
20
+ 'reviewtext' => 'Review',
21
+ 'usernickname' => 'Nickname',
22
+ 'useremail' => 'Email',
23
+ 'rating_' => null,
24
+ 'contextdatavalue_' => null,
25
+ 'isrecommended' => 'Would you recommend Brabantia to a friend?',
26
+ 'agreedtotermsandconditions' => 'I agree to the terms & conditions'
27
+ );
28
+ protected $LOGGED_IN_EXCLUDE_FIELDS = array(
29
+ 'useremail'
30
+ );
31
+
32
+ /**
33
+ * Get product Id for Bazaarvoice
34
+ *
35
+ * @param Mage_Catalog_Model_Product $product
36
+ * @return string
37
+ */
38
+ public function getBvProductId($product)
39
+ {
40
+ if (!$product && !$product->getId()) return '';
41
+
42
+ if (class_exists('Bazaarvoice_Connector_Helper_Data')) {
43
+ /* @var $bvHelper Bazaarvoice_Connector_Helper_Data */
44
+ $bvHelper = Mage::helper('bazaarvoice');
45
+ return $bvHelper->getProductId($product);
46
+ }
47
+
48
+ return $this->_getProductId($product);
49
+ }
50
+
51
+ /**
52
+ * Get the uniquely identifying product ID for a catalog product.
53
+ *
54
+ * This is the unique, product family-level id (duplicates are unacceptable).
55
+ * If a product has its own page, this is its product ID. It is not necessarily
56
+ * the SKU ID, as we do not collect separate Ratings & Reviews for different
57
+ * styles of product - i.e. the 'Blue' vs. 'Red Widget'.
58
+ *
59
+ * @param Mage_Catalog_Model_Product $product a reference to a catalog product object
60
+ * @return string The unique product ID to be used with Bazaarvoice
61
+ */
62
+ public function _getProductId($product)
63
+ {
64
+ $rawProductId = $product->getSku();
65
+
66
+ // >> Customizations go here
67
+ $rawProductId = preg_replace_callback('/\./s', create_function('$match', 'return "_bv".ord($match[0])."_";'), $rawProductId);
68
+ // << No further customizations after this
69
+
70
+ return $this->_replaceIllegalCharacters($rawProductId);
71
+ }
72
+
73
+ /**
74
+ * This unique ID can only contain alphanumeric characters (letters and numbers
75
+ * only) and also the asterisk, hyphen, period, and underscore characters. If your
76
+ * product IDs contain invalid characters, simply replace them with an alternate
77
+ * character like an underscore. This will only be used in the feed and not for
78
+ * any customer facing purpose.
79
+ *
80
+ * @param string $rawId
81
+ * @return mixed
82
+ */
83
+ protected function _replaceIllegalCharacters($rawId)
84
+ {
85
+ // We need to use a reversible replacement so that we can reconstruct the original ID later.
86
+ // Example rawId = qwerty$%@#asdf
87
+ // Example encoded = qwerty_bv36__bv37__bv64__bv35_asdf
88
+
89
+ return preg_replace_callback('/[^\w\d\*-\._]/s', create_function('$match', 'return "_bv".ord($match[0])."_";'), $rawId);
90
+ }
91
+
92
+ /**
93
+ * Requesting all reviews for a particular product
94
+ *
95
+ * @param Mage_Catalog_Model_Product $product
96
+ * @return array
97
+ * @throws Jmango360_Japi_Exception
98
+ */
99
+ public function getReviews($product)
100
+ {
101
+ if (!$product->getId()) {
102
+ throw new Jmango360_Japi_Exception(
103
+ Mage::helper('japi')->__('Product not found'),
104
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
105
+ );
106
+ }
107
+
108
+ $productId = $this->getBvProductId($product);
109
+
110
+ $apiKey = $this->_getApiKey();
111
+ $url = $this->_getApiUrl('data/reviews.json', array(
112
+ 'apiVersion' => '5.4',
113
+ 'passkey' => $apiKey,
114
+ 'Filter' => sprintf('ProductId:%s', $productId),
115
+ 'Sort' => $this->_getReviewsSort(),
116
+ 'Offset' => $this->_getReviewsOffset(),
117
+ 'Limit' => $this->_getReviewsLimit(),
118
+ 'Include' => 'Products',
119
+ 'Stats' => 'Reviews',
120
+ 'Locale' => Mage::app()->getLocale()->getLocaleCode()
121
+ ));
122
+
123
+ $result = $this->send('GET', $url);
124
+
125
+ if (isset($result['HasErrors']) && $result['HasErrors']) {
126
+ if (!empty($result['Errors'])) {
127
+ foreach ($result['Errors'] as $error) {
128
+ throw new Jmango360_Japi_Exception(
129
+ sprintf('%s: %s', $error['Code'], $error['Message']),
130
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
131
+ );
132
+ }
133
+ } else {
134
+ throw new Jmango360_Japi_Exception(
135
+ Mage::helper('japi')->__('An error has occurred, please try again later.'),
136
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
137
+ );
138
+ }
139
+ }
140
+
141
+ $data = array(
142
+ 'overview' => $this->_parseReviewOverview($result, $productId),
143
+ 'reviews' => array(),
144
+ 'review_counter' => @$result['TotalResults']
145
+ );
146
+
147
+ if (is_array($result['Results'])) {
148
+ foreach ($result['Results'] as $item) {
149
+ if ($review = $this->_parseReview($item)) {
150
+ $data['reviews'][] = $review;
151
+ }
152
+ }
153
+ }
154
+
155
+ return $data;
156
+ }
157
+
158
+ /**
159
+ * Return review form fields
160
+ *
161
+ * @param Mage_Catalog_Model_Product|null $product
162
+ * @return array
163
+ * @throws Jmango360_Japi_Exception
164
+ */
165
+ public function getForm($product = null)
166
+ {
167
+ $cache = Mage::app()->getCache();
168
+
169
+ /* @var $session Mage_Customer_Model_Session */
170
+ $session = Mage::getSingleton('customer/session');
171
+ if ($session->isLoggedIn()) {
172
+ $cacheKey = self::CACHE_KEY_REVIEW_FORM . '1';
173
+ } else {
174
+ $cacheKey = self::CACHE_KEY_REVIEW_FORM . '0';
175
+ }
176
+
177
+ if (!$cache->load($cacheKey)) {
178
+ if (!$product) {
179
+ /* @var $productCollection Mage_Catalog_Model_Resource_Product_Collection */
180
+ $productCollection = Mage::getResourceModel('catalog/product_collection');
181
+ $productCollection
182
+ ->setStoreId(Mage::app()->getStore()->getId())
183
+ ->setPage(1, 1);
184
+
185
+ Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($productCollection);
186
+ Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($productCollection);
187
+
188
+ $product = $productCollection->getFirstItem();
189
+ }
190
+
191
+ $productId = $this->getBvProductId($product);
192
+
193
+ $apiKey = $this->_getApiKey();
194
+ $url = $this->_getApiUrl('data/submitreview.json', array(
195
+ 'apiVersion' => '5.4',
196
+ 'passkey' => $apiKey,
197
+ 'ProductId' => $productId,
198
+ 'Locale' => Mage::app()->getLocale()->getLocaleCode()
199
+ ));
200
+
201
+ $result = $this->send('GET', $url);
202
+
203
+ $data = array('allow_guest_review' => true);
204
+
205
+ if (!empty($result['Data']['Fields'])) {
206
+ $outputFields = $this->FORM_FIELDS;
207
+ if ($session->isLoggedIn()) {
208
+ foreach ($this->FORM_FIELDS as $fk => $fv) {
209
+ if (in_array($fk, $this->LOGGED_IN_EXCLUDE_FIELDS)) {
210
+ unset($outputFields[$fk]);
211
+ }
212
+ }
213
+ }
214
+ $fields = $result['Data']['Fields'];
215
+ $index = 0;
216
+ foreach ($outputFields as $field => $label) {
217
+ foreach ($fields as $fieldName => $fieldData) {
218
+ if ($field == $fieldName || (strpos($fieldName, $field) === 0 && $field != 'rating')) {
219
+ $fieldTmp = array(
220
+ 'code' => $this->_getFormFieldCode(@$fieldData['Id']),
221
+ 'title' => empty($fieldData['Label']) ? $this->__($label) : @$fieldData['Label'],
222
+ 'type' => $this->_getFormFieldType(@$fieldData['Type']),
223
+ 'required' => @$fieldData['Required'],
224
+ 'id' => ++$index . "",
225
+ 'bv_id' => @$fieldData['Id'],
226
+ 'selected' => @$fieldData['Value'],
227
+ 'values' => array()
228
+ );
229
+
230
+ switch (@$fieldData['Type']) {
231
+ case 'SelectInput':
232
+ if (!empty($fieldData['Options'])) {
233
+ foreach (@$fieldData['Options'] as $option) {
234
+ $fieldTmp['options'][] = array(
235
+ 'value' => @$option['Value'],
236
+ 'label' => @$option['Label']
237
+ );
238
+ if (@$option['Selected']) {
239
+ $fieldTmp['selected'] = @$option['Value'];
240
+ }
241
+ }
242
+ }
243
+ break;
244
+ case 'IntegerInput':
245
+ $fieldTmp['values'] = range(1, 5);
246
+ break;
247
+ case 'TextInput':
248
+ $fieldTmp['min_length'] = @$fieldData['MinLength'];
249
+ $fieldTmp['max_length'] = @$fieldData['MaxLength'];
250
+ break;
251
+ }
252
+
253
+ $data['reviews'][] = $fieldTmp;
254
+ }
255
+ }
256
+ }
257
+ }
258
+
259
+ $cache->save(Mage::helper('core')->jsonEncode($data), $cacheKey, array(Mage_Core_Model_Config::CACHE_TAG));
260
+ }
261
+
262
+ return Mage::helper('core')->jsonDecode($cache->load($cacheKey));
263
+ }
264
+
265
+ /**
266
+ * Submit review for a particular product
267
+ *
268
+ * @param Mage_Catalog_Model_Product $product
269
+ * @param array $data
270
+ * @return array
271
+ * @throws Jmango360_Japi_Exception
272
+ */
273
+ public function submitReview($product = null, $data = array())
274
+ {
275
+ if (!$product->getId()) {
276
+ throw new Jmango360_Japi_Exception(
277
+ Mage::helper('japi')->__('Product not found'),
278
+ Jmango360_Japi_Model_Request::HTTP_BAD_REQUEST
279
+ );
280
+ }
281
+
282
+ $this->_log('SUBMIT ' . print_r($data, true));
283
+
284
+ $productId = $this->getBvProductId($product);
285
+
286
+ /* @var $session Mage_Customer_Model_Session */
287
+ $session = Mage::getSingleton('customer/session');
288
+ if ($session->isLoggedIn()) {
289
+ $submitData['UserId'] = $session->getCustomer()->getId();
290
+ $submitData['UserEmail'] = $session->getCustomer()->getEmail();
291
+ } else {
292
+ $submitData['UserId'] = uniqid();
293
+ $submitData['UserEmail'] = @$data['useremail'];
294
+ }
295
+
296
+ $submitData = array_merge(array(
297
+ 'UserNickname' => @$data['usernickname'],
298
+ 'Title' => @$data['title'],
299
+ 'ReviewText' => @$data['reviewtext'],
300
+ 'Rating' => @$data['ratings']['rating'],
301
+ 'IsRecommended' => $this->_getBooleanValue(@$data['isrecommended']),
302
+ 'AgreedToTermsAndConditions' => 'true'
303
+ ), $submitData);
304
+
305
+ if (!empty($data['ratings'])) {
306
+ $reviewForm = $this->getForm($product);
307
+ if (!empty($reviewForm['reviews'])) {
308
+ $fields = $reviewForm['reviews'];
309
+ } else {
310
+ $fields = array();
311
+ }
312
+ foreach ($data['ratings'] as $rating => $value) {
313
+ foreach ($fields as $field) {
314
+ if ($rating == $field['id']) {
315
+ if (strpos($field['bv_id'], 'rating') === 0) {
316
+ $submitData[str_replace('rating', 'Rating', $field['bv_id'])] = $value;
317
+ } elseif (strpos($field['bv_id'], 'contextdatavalue_') === 0) {
318
+ $submitData[str_replace('contextdatavalue_', 'ContextDataValue_', $field['bv_id'])] = $value;
319
+ }
320
+ }
321
+ }
322
+ }
323
+ }
324
+
325
+ $apiKey = $this->_getApiKey();
326
+ $url = $this->_getApiUrl('data/submitreview.json');
327
+ $submitData = array_merge(array(
328
+ 'apiVersion' => '5.4',
329
+ 'passkey' => $apiKey,
330
+ 'Action' => 'Submit',
331
+ 'ProductId' => $productId,
332
+ 'Locale' => Mage::app()->getLocale()->getLocaleCode()
333
+ ), $submitData);
334
+
335
+ $result = $this->send('POST', $url, $submitData);
336
+
337
+ if (!empty($result['HasErrors'])) {
338
+ if (!empty($result['Errors'])) {
339
+ foreach ($result['Errors'] as $error) {
340
+ throw new Jmango360_Japi_Exception(
341
+ sprintf('%s: %s', $error['Code'], $error['Message']),
342
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
343
+ );
344
+ }
345
+ } elseif (!empty($result['FormErrors']['FieldErrors'])) {
346
+ $messages = array();
347
+ foreach ($result['FormErrors']['FieldErrors'] as $formError) {
348
+ $messages[] = sprintf('%s: %s', $formError['Code'], $formError['Message']);
349
+ }
350
+ if (count($messages)) {
351
+ throw new Jmango360_Japi_Exception(
352
+ join("\n", $messages),
353
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
354
+ );
355
+ }
356
+ } else {
357
+ throw new Jmango360_Japi_Exception(
358
+ Mage::helper('japi')->__('An error has occurred, please try again later.'),
359
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
360
+ );
361
+ }
362
+ }
363
+
364
+ return array('success' => Mage::helper('review')->__('Your review has been accepted for moderation.'));
365
+ }
366
+
367
+ /**
368
+ * Convert boolean value to string
369
+ *
370
+ * @param $value
371
+ * @return string
372
+ */
373
+ protected function _getBooleanValue($value)
374
+ {
375
+ return $value ? ($value == 'false' ? 'false' : 'true') : 'false';
376
+ }
377
+
378
+ /**
379
+ * Reset rating, rating_*, contextdatavalue_* field to ratings field as Magento review code
380
+ *
381
+ * @param $code
382
+ * @return string
383
+ */
384
+ protected function _getFormFieldCode($code)
385
+ {
386
+ if (strpos($code, 'rating') === 0 || strpos($code, 'contextdatavalue_') === 0) {
387
+ return 'ratings';
388
+ }
389
+ return $code;
390
+ }
391
+
392
+ /**
393
+ * Convert to mobile supportted field type
394
+ *
395
+ * @param $bvType
396
+ * @return string
397
+ */
398
+ protected function _getFormFieldType($bvType)
399
+ {
400
+ switch ($bvType) {
401
+ case 'SelectInput':
402
+ return 'select';
403
+ break;
404
+ case 'IntegerInput':
405
+ return 'radio';
406
+ break;
407
+ case 'TextAreaInput':
408
+ return 'area';
409
+ break;
410
+ case 'BooleanInput':
411
+ return 'boolean';
412
+ break;
413
+ default:
414
+ case 'TextInput':
415
+ return 'field';
416
+ break;
417
+ }
418
+ }
419
+
420
+ protected function _parseReviewOverview($result = array(), $productId = null)
421
+ {
422
+ $data = array();
423
+ if (!empty($result['Includes']['Products'][$productId]['ReviewStatistics']['SecondaryRatingsAverages'])) {
424
+ $reviewStatistics = $result['Includes']['Products'][$productId]['ReviewStatistics']['SecondaryRatingsAverages'];
425
+ foreach ($reviewStatistics as $reviewStatistic) {
426
+ $data[] = array(
427
+ 'title' => @$reviewStatistic['Label'],
428
+ 'code' => @$reviewStatistic['Id'],
429
+ 'type' => 'overview',
430
+ 'percent' => round(100 * @$reviewStatistic['AverageRating'] / (empty($reviewStatistic['ValueRange']) ? 5 : $reviewStatistic['ValueRange']))
431
+ );
432
+ }
433
+ }
434
+ return $data;
435
+ }
436
+
437
+ protected function _parseReview($result = array())
438
+ {
439
+ if (!$result || !is_array($result)) return;
440
+ if (!empty($result['ModerationStatus']) && $result['ModerationStatus'] != 'APPROVED') return;
441
+
442
+ $data = array(
443
+ 'nickname' => @$result['UserNickname'],
444
+ 'create_at' => $this->_getDatetimeValue(@$result['SubmissionTime']),
445
+ 'review' => array()
446
+ );
447
+
448
+ if (!empty($result['SecondaryRatings'])) {
449
+ $index = 0;
450
+ foreach ($result['SecondaryRatings'] as $rating) {
451
+ $data['review'][] = array(
452
+ 'code' => 'ratings',
453
+ 'title' => @$rating['Label'],
454
+ 'type' => 'radio',
455
+ 'required' => false,
456
+ 'id' => ++$index . "",
457
+ 'values' => range(1, empty($rating['ValueRange']) ? 5 : $rating['ValueRange']),
458
+ 'selected' => @$rating['Value'],
459
+ 'percent' => round(100 * @$rating['Value'] / (empty($rating['ValueRange']) ? 5 : $rating['ValueRange']))
460
+ );
461
+ }
462
+ }
463
+
464
+ if (!empty($result['Photos'])) {
465
+ $photoReview = array(
466
+ 'code' => 'photo',
467
+ 'title' => $this->__('Photos'),
468
+ 'type' => 'photo',
469
+ 'required' => false,
470
+ 'selected' => array()
471
+ );
472
+ foreach ($result['Photos'] as $photo) {
473
+ $item = array(
474
+ 'id' => @$photo['Id'],
475
+ 'caption' => @$photo['Caption']
476
+ );
477
+ if (!empty($photo['Sizes'])) {
478
+ foreach ($photo['Sizes'] as $size) {
479
+ $item[@$size['Id']] = @$size['Url'];
480
+ }
481
+ }
482
+ $photoReview['selected'][] = $item;
483
+ }
484
+ $data['review'][] = $photoReview;
485
+ }
486
+
487
+ if (!empty($result['Videos'])) {
488
+ $videoReview = array(
489
+ 'code' => 'video',
490
+ 'title' => $this->__('Videos'),
491
+ 'type' => 'video',
492
+ 'required' => false,
493
+ 'selected' => array()
494
+ );
495
+ foreach ($result['Videos'] as $video) {
496
+ $videoReview['selected'][] = array(
497
+ 'video_id' => @$video['VideoId'],
498
+ 'video_host' => @$video['VideoHost'],
499
+ 'video_thumbnail_url' => @$video['VideoThumbnailUrl'],
500
+ 'video_iframe_url' => @$video['VideoIframeUrl'],
501
+ 'caption' => @$video['Caption'],
502
+ 'video_url' => @$video['VideoUrl']
503
+ );
504
+ }
505
+ $data['review'][] = $videoReview;
506
+ }
507
+
508
+ $data['review'] = array_merge($data['review'], array(
509
+ array(
510
+ 'code' => 'nickname',
511
+ 'title' => $this->__('Nickname'),
512
+ 'type' => 'field',
513
+ 'required' => true,
514
+ 'selected' => @$result['UserNickname']
515
+ ),
516
+ array(
517
+ 'code' => 'title',
518
+ 'title' => $this->__('Review Title'),
519
+ 'type' => 'field',
520
+ 'required' => true,
521
+ 'selected' => @$result['Title']
522
+ ),
523
+ array(
524
+ 'code' => 'detail',
525
+ 'title' => $this->__('Review'),
526
+ 'type' => 'area',
527
+ 'required' => true,
528
+ 'selected' => @$result['ReviewText']
529
+ )
530
+ ));
531
+
532
+ return $data;
533
+ }
534
+
535
+ protected function _getDatetimeValue($value)
536
+ {
537
+ $storeTimestamp = Mage::getModel('core/date')->timestamp($value);
538
+ return date('Y-n-j G:i:s', $storeTimestamp);
539
+ }
540
+
541
+ protected function _log($data)
542
+ {
543
+ if (Mage::getStoreConfigFlag('japi/jmango_rest_developer_settings/enable')) {
544
+ Mage::log($data, null, 'japi_bazaarvoice.log');
545
+ }
546
+ }
547
+
548
+ protected function _getReviewsOffset()
549
+ {
550
+ $p = $this->_getRequest()->getParam('p', 1);
551
+ $p = is_numeric($p) ? (int)$p : 1;
552
+ return $p <= 1 ? 0 : ($p - 1) * $this->_getReviewsLimit();
553
+ }
554
+
555
+ protected function _getReviewsLimit()
556
+ {
557
+ $limit = $this->_getRequest()->getParam('limit', self::DEFAULT_LIMIT);
558
+ return is_numeric($limit) ? (int)$limit : self::DEFAULT_LIMIT;
559
+ }
560
+
561
+ protected function _getReviewsSort()
562
+ {
563
+ return sprintf('%s:%s', self::DEFAULT_SORT, self::DEFAULT_DIR);
564
+ }
565
+
566
+ protected function _getApiUrl($uri, $params = array())
567
+ {
568
+ $env = $this->_getEnv();
569
+ $baseUrl = $env == 'staging' ? self::URL_STAGING : self::URL_PRODUCTION;
570
+ if (!empty($params)) {
571
+ return sprintf('%s%s?%s', $baseUrl, $uri, http_build_query($params));
572
+ } else {
573
+ return sprintf('%s%s', $baseUrl, $uri);
574
+ }
575
+ }
576
+
577
+ protected function _getEnv()
578
+ {
579
+ $env = Mage::getStoreConfig('japi/jmango_rest_bazaarvoice_settings/env');
580
+ return $env ? $env : 'staging';
581
+ }
582
+
583
+ protected function _getApiKey()
584
+ {
585
+ $apiKey = Mage::getStoreConfig('japi/jmango_rest_bazaarvoice_settings/api_key');
586
+ if (!$apiKey) {
587
+ throw new Jmango360_Japi_Exception(
588
+ Mage::helper('japi')->__('Invalid API Key value'),
589
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
590
+ );
591
+ }
592
+
593
+ return $apiKey;
594
+ }
595
+
596
+ protected function send($method = 'GET', $url = '', $params = array())
597
+ {
598
+ $this->_log(sprintf('%s %s', $method, $url));
599
+ $this->_log('PARAMS ' . print_r($params, true));
600
+
601
+ $ch = curl_init();
602
+
603
+ curl_setopt($ch, CURLOPT_URL, $url);
604
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
605
+ curl_setopt($ch, CURLOPT_TIMEOUT, 5);
606
+
607
+ if ($method == 'POST') {
608
+ curl_setopt($ch, CURLOPT_POST, 1);
609
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
610
+ }
611
+
612
+ $result = curl_exec($ch);
613
+ $errorNum = curl_errno($ch);
614
+ $errorMeg = curl_error($ch);
615
+
616
+ curl_close($ch);
617
+
618
+ if (!$result) {
619
+ $errorStr = sprintf('ERROR [%s]: %s', $errorNum, $errorMeg);
620
+
621
+ $this->_log($errorStr);
622
+
623
+ throw new Jmango360_Japi_Exception(
624
+ $errorStr,
625
+ Jmango360_Japi_Model_Request::HTTP_INTERNAL_ERROR
626
+ );
627
+ } else {
628
+ $this->_log('RESPONSE ' . $result);
629
+ }
630
+
631
+ return $this->_parseResponse($result);
632
+ }
633
+
634
+ protected function _parseResponse($rawContent)
635
+ {
636
+ return Mage::helper('core')->jsonDecode($rawContent);
637
+ }
638
+ }
app/code/community/Jmango360/Japi/Model/Rest/Cart.php CHANGED
@@ -106,9 +106,9 @@ class Jmango360_Japi_Model_Rest_Cart extends Mage_Checkout_Model_Cart
106
  $index = 0;
107
  $recollect = false;
108
  $cart['items'] = null;
109
- foreach ($this->getQuote()->getAllVisibleItems() as $item) {
110
  /* @var $item Mage_Sales_Model_Quote_Item */
111
- $product = $helper->convertProductIdToApiResponseV2($item->getProductId());
112
 
113
  /**
114
  * MPLUGIN-1259: Workaround to manual remove unavailable product
@@ -167,6 +167,7 @@ class Jmango360_Japi_Model_Rest_Cart extends Mage_Checkout_Model_Cart
167
 
168
  // Move here to prevent being cached in cart object
169
  $cart['items_count'] = $this->getSummaryQty();
 
170
 
171
  /**
172
  * MultiShipping is not supported yet. Always one shipping address is returned in the response
@@ -211,6 +212,37 @@ class Jmango360_Japi_Model_Rest_Cart extends Mage_Checkout_Model_Cart
211
  return $cart;
212
  }
213
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  protected function _resetQuote()
215
  {
216
  $quoteId = $this->getQuote()->getId();
106
  $index = 0;
107
  $recollect = false;
108
  $cart['items'] = null;
109
+ foreach ($this->getCartItems() as $item) {
110
  /* @var $item Mage_Sales_Model_Quote_Item */
111
+ $product = $helper->convertProductIdToApiResponseV2($item->getProductId(), array('no_apply_hide_on_app' => 1));
112
 
113
  /**
114
  * MPLUGIN-1259: Workaround to manual remove unavailable product
167
 
168
  // Move here to prevent being cached in cart object
169
  $cart['items_count'] = $this->getSummaryQty();
170
+ $cart['cart_qty_display'] = (int)Mage::getStoreConfig('checkout/cart_link/use_qty');
171
 
172
  /**
173
  * MultiShipping is not supported yet. Always one shipping address is returned in the response
212
  return $cart;
213
  }
214
 
215
+ /**
216
+ * MPLUGIN-1830: Make sure we load full cart item data
217
+ *
218
+ * @return array
219
+ */
220
+ protected function getCartItems()
221
+ {
222
+ $items = array();
223
+
224
+ foreach ($this->getQuote()->getAllVisibleItems() as $item) {
225
+ /* @var $item Mage_Sales_Model_Quote_Item */
226
+ if (!$item->getId() && $item->getProductId()) {
227
+ $collection = Mage::getModel('sales/quote_item')->getCollection();
228
+ $collection->setQuote($this->getQuote());
229
+ foreach ($collection as $i) {
230
+ /* @var $i Mage_Sales_Model_Quote_Item */
231
+ if ($i->getProductId() == $item->getProductId()) {
232
+ foreach ($i->getData() as $property => $value) {
233
+ if (!$item->hasData($property)) {
234
+ $item->setData($property, $value);
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ $items[] = $item;
241
+ }
242
+
243
+ return $items;
244
+ }
245
+
246
  protected function _resetQuote()
247
  {
248
  $quoteId = $this->getQuote()->getId();
app/code/community/Jmango360/Japi/Model/Rest/Cart/Update.php CHANGED
@@ -114,9 +114,11 @@ class Jmango360_Japi_Model_Rest_Cart_Update extends Jmango360_Japi_Model_Rest_Ca
114
  array('product' => $product, 'request' => $this->_getRequest(), 'response' => $this->_getResponse())
115
  );
116
 
117
- $data['message'] = Mage::helper('japi')->__('%s was added to your shopping cart.', Mage::helper('core')->escapeHtml($product->getName()));
118
- $data['no_redirect_to_cart'] = $this->_getSession()->getNoCartRedirect();
119
- $data['cart'] = $this->getCartData();
 
 
120
 
121
  return $data;
122
  }
114
  array('product' => $product, 'request' => $this->_getRequest(), 'response' => $this->_getResponse())
115
  );
116
 
117
+ $data = $this->_getCart();
118
+ $data['message'] = Mage::helper('japi')->__(
119
+ '%s was added to your shopping cart.',
120
+ Mage::helper('core')->escapeHtml($product->getName())
121
+ );
122
 
123
  return $data;
124
  }
app/code/community/Jmango360/Japi/Model/Rest/Checkout/Onepage.php CHANGED
@@ -747,7 +747,7 @@ class Jmango360_Japi_Model_Rest_Checkout_Onepage extends Jmango360_Japi_Model_Re
747
  foreach ($quote->getAllVisibleItems() as $item) {
748
  /* @var $item Mage_Sales_Model_Quote_Item */
749
  $data['cart']['items'][$index] = $item->getData();
750
- $product = $helper->convertProductIdToApiResponseV2($item->getProductId());
751
  $data['cart']['items'][$index]['product'] = array($product);
752
  $data['cart']['items'][$index]['buy_request'] = $helper->getCartProductBuyRequest($item, $product);
753
  $index++;
747
  foreach ($quote->getAllVisibleItems() as $item) {
748
  /* @var $item Mage_Sales_Model_Quote_Item */
749
  $data['cart']['items'][$index] = $item->getData();
750
+ $product = $helper->convertProductIdToApiResponseV2($item->getProductId(), array('no_apply_hide_on_app' => 1));
751
  $data['cart']['items'][$index]['product'] = array($product);
752
  $data['cart']['items'][$index]['buy_request'] = $helper->getCartProductBuyRequest($item, $product);
753
  $index++;
app/code/community/Jmango360/Japi/Model/Rest/Product/Review.php CHANGED
@@ -9,6 +9,12 @@ class Jmango360_Japi_Model_Rest_Product_Review extends Jmango360_Japi_Model_Rest
9
  {
10
  $product = $this->_initProduct();
11
 
 
 
 
 
 
 
12
  /* @var $reviewHelper Jmango360_Japi_Helper_Product_Review */
13
  $reviewHelper = Mage::helper('japi/product_review');
14
 
@@ -24,6 +30,16 @@ class Jmango360_Japi_Model_Rest_Product_Review extends Jmango360_Japi_Model_Rest
24
  */
25
  public function getForm()
26
  {
 
 
 
 
 
 
 
 
 
 
27
  /* @var $reviewHelper Jmango360_Japi_Helper_Product_Review */
28
  $reviewHelper = Mage::helper('japi/product_review');
29
 
@@ -43,6 +59,12 @@ class Jmango360_Japi_Model_Rest_Product_Review extends Jmango360_Japi_Model_Rest
43
  $data = $this->_getRequest()->getParams();
44
  $rating = $this->_getRequest()->getParam('ratings', array());
45
 
 
 
 
 
 
 
46
  if ($product && !empty($data)) {
47
  $review = Mage::getModel('review/review')->setData($data);
48
  /* @var $review Mage_Review_Model_Review */
@@ -98,4 +120,10 @@ class Jmango360_Japi_Model_Rest_Product_Review extends Jmango360_Japi_Model_Rest
98
  );
99
  }
100
  }
 
 
 
 
 
 
101
  }
9
  {
10
  $product = $this->_initProduct();
11
 
12
+ if ($this->isBazaarvoiceEnabled()) {
13
+ /* @var $bazaarvoiceHelper Jmango360_Japi_Helper_Review_Bazaarvoice */
14
+ $bazaarvoiceHelper = Mage::helper('japi/review_bazaarvoice');
15
+ return $bazaarvoiceHelper->getReviews($product);
16
+ }
17
+
18
  /* @var $reviewHelper Jmango360_Japi_Helper_Product_Review */
19
  $reviewHelper = Mage::helper('japi/product_review');
20
 
30
  */
31
  public function getForm()
32
  {
33
+ if ($this->isBazaarvoiceEnabled()) {
34
+ $product = null;
35
+ if ($this->_getRequest()->getParam('product_id')) {
36
+ $product = $this->_initProduct();
37
+ }
38
+ /* @var $bazaarvoiceHelper Jmango360_Japi_Helper_Review_Bazaarvoice */
39
+ $bazaarvoiceHelper = Mage::helper('japi/review_bazaarvoice');
40
+ return $bazaarvoiceHelper->getForm($product);
41
+ }
42
+
43
  /* @var $reviewHelper Jmango360_Japi_Helper_Product_Review */
44
  $reviewHelper = Mage::helper('japi/product_review');
45
 
59
  $data = $this->_getRequest()->getParams();
60
  $rating = $this->_getRequest()->getParam('ratings', array());
61
 
62
+ if ($this->isBazaarvoiceEnabled()) {
63
+ /* @var $bazaarvoiceHelper Jmango360_Japi_Helper_Review_Bazaarvoice */
64
+ $bazaarvoiceHelper = Mage::helper('japi/review_bazaarvoice');
65
+ return $bazaarvoiceHelper->submitReview($product, $data);
66
+ }
67
+
68
  if ($product && !empty($data)) {
69
  $review = Mage::getModel('review/review')->setData($data);
70
  /* @var $review Mage_Review_Model_Review */
120
  );
121
  }
122
  }
123
+
124
+ protected function isBazaarvoiceEnabled()
125
+ {
126
+ return (Mage::helper('core')->isModuleEnabled('Comaxx_BvConversations') && Mage::getStoreConfigFlag('bazaarvoice/general/enable_bv')) ||
127
+ (Mage::helper('core')->isModuleEnabled('Bazaarvoice_Connector'));
128
+ }
129
  }
app/code/community/Jmango360/Japi/Model/Rest/Product/Search.php CHANGED
@@ -17,10 +17,22 @@ class Jmango360_Japi_Model_Rest_Product_Search extends Jmango360_Japi_Model_Rest
17
  $query->setStoreId(Mage::app()->getStore()->getId());
18
  $data = array();
19
  if ($query->getQueryText() != '') {
 
 
 
20
  if ($helper->isModuleEnabled('Emico_Tweakwise')) {
21
  return $helper->getProductCollectionFromEmicoTweakwise(true);
22
  }
23
 
 
 
 
 
 
 
 
 
 
24
  if ($searchHelper->isMinQueryLength()) {
25
  $query->setId(0)
26
  ->setIsActive(1)
17
  $query->setStoreId(Mage::app()->getStore()->getId());
18
  $data = array();
19
  if ($query->getQueryText() != '') {
20
+ /**
21
+ * Support Emico_Tweakwise
22
+ */
23
  if ($helper->isModuleEnabled('Emico_Tweakwise')) {
24
  return $helper->getProductCollectionFromEmicoTweakwise(true);
25
  }
26
 
27
+ /**
28
+ * Support Klevu_Search
29
+ */
30
+ if ($helper->isModuleEnabled('Klevu_Search')) {
31
+ if (Mage::helper('klevu_search/config')->isLandingEnabled()) {
32
+ return $helper->getProductCollectionFromKlevuSearch();
33
+ }
34
+ }
35
+
36
  if ($searchHelper->isMinQueryLength()) {
37
  $query->setId(0)
38
  ->setIsActive(1)
app/code/community/Jmango360/Japi/Model/Server.php CHANGED
@@ -70,7 +70,10 @@ class Jmango360_Japi_Model_Server extends Mage_Api2_Model_Server
70
  * Bypass flat product check
71
  * MPLUGIN-1777: Ignore when get related products
72
  */
73
- if ($request->getActionName() != 'getRelated') {
 
 
 
74
  Mage::app()->getStore($store)->setConfig(Mage_Catalog_Helper_Product_Flat::XML_PATH_USE_PRODUCT_FLAT, 0);
75
  }
76
 
70
  * Bypass flat product check
71
  * MPLUGIN-1777: Ignore when get related products
72
  */
73
+ if ($request->getActionName() != 'getRelated' &&
74
+ $request->getActionName() != 'getCrossSell' &&
75
+ $request->getActionName() != 'getUpSell'
76
+ ) {
77
  Mage::app()->getStore($store)->setConfig(Mage_Catalog_Helper_Product_Flat::XML_PATH_USE_PRODUCT_FLAT, 0);
78
  }
79
 
app/code/community/Jmango360/Japi/Model/System/Config/Source/Bazaarvoice/Env.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Jmango360_Japi_Model_System_Config_Source_Bazaarvoice_Env
4
+ {
5
+ public function toOptionArray()
6
+ {
7
+ return array(
8
+ 'staging' => Mage::helper('japi')->__('Staging'),
9
+ 'production' => Mage::helper('japi')->__('Production')
10
+ );
11
+ }
12
+ }
app/code/community/Jmango360/Japi/controllers/CustomerController.php CHANGED
@@ -360,8 +360,15 @@ class Jmango360_Japi_CustomerController extends Mage_Customer_AccountController
360
  {
361
  $this->loadLayout();
362
  $this->_updateLayout();
363
- $this->getLayout()->getBlock('head')->setTitle($this->__('Add New Address'));
364
  $session = $this->_getSession();
 
 
 
 
 
 
 
 
365
  if ($session->getIsSubmit()) {
366
  $session->setIsSubmit(false);
367
  $this->getResponse()->setHeader('JM-Account-Id', $session->getCustomerId());
@@ -372,6 +379,11 @@ class Jmango360_Japi_CustomerController extends Mage_Customer_AccountController
372
  $session->addError(Mage::helper('japi')->__('Customer not logged in'));
373
  $this->getResponse()->setHeader('HTTP/1.1', '401 Unauthorized', true);
374
  }
 
 
 
 
 
375
  $this->_initLayoutMessages(array('core/session', 'customer/session'));
376
  $this->renderLayout();
377
  }
@@ -421,8 +433,26 @@ class Jmango360_Japi_CustomerController extends Mage_Customer_AccountController
421
 
422
  if (count($errors) === 0) {
423
  $address->save();
424
- $this->_getSession()->addSuccess($this->__('The address has been saved.'));
425
- return $this->_redirect('*/*/address', array('_secure' => true, 'id' => $address->getId()));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  } else {
427
  $this->_getSession()->setAddressFormData($this->getRequest()->getPost());
428
  foreach ($errors as $errorMessage) {
360
  {
361
  $this->loadLayout();
362
  $this->_updateLayout();
 
363
  $session = $this->_getSession();
364
+ $customer = $session->getCustomer();
365
+ $addressId = $this->getRequest()->getParam('id');
366
+ $address = $customer->getAddressById($addressId);
367
+ if ($address->getId()) {
368
+ $this->getLayout()->getBlock('head')->setTitle($this->__('Edit Address'));
369
+ } else {
370
+ $this->getLayout()->getBlock('head')->setTitle($this->__('Add New Address'));
371
+ }
372
  if ($session->getIsSubmit()) {
373
  $session->setIsSubmit(false);
374
  $this->getResponse()->setHeader('JM-Account-Id', $session->getCustomerId());
379
  $session->addError(Mage::helper('japi')->__('Customer not logged in'));
380
  $this->getResponse()->setHeader('HTTP/1.1', '401 Unauthorized', true);
381
  }
382
+ if ($this->getRequest()->getParam('is_checkout')) {
383
+ /* @var $httpHelper Mage_Core_Helper_Http */
384
+ $httpHelper = Mage::helper('core/http');
385
+ $session->setRefererUrl($httpHelper->getHttpReferer());
386
+ }
387
  $this->_initLayoutMessages(array('core/session', 'customer/session'));
388
  $this->renderLayout();
389
  }
433
 
434
  if (count($errors) === 0) {
435
  $address->save();
436
+ if ($this->getRequest()->getParam('is_checkout')) {
437
+ $redirectUrl = $this->_getSession()->getRefererUrl();
438
+ if ($redirectUrl) {
439
+ if (strpos($redirectUrl, 'japi/checkout/onepage') !== false) {
440
+ $type = $this->getRequest()->getParam('type');
441
+ if ($type == 'billing') {
442
+
443
+ } elseif ($type == 'shipping') {
444
+ Mage::getSingleton('core/session')->setData('is_shipping_address_update', true);
445
+ }
446
+ }
447
+ $this->_getSession()->unsetData('referer_url');
448
+ return $this->_redirectUrl($redirectUrl);
449
+ } else {
450
+ return $this->_redirect('japi/checkout/onepage', array('_secure' => true));
451
+ }
452
+ } else {
453
+ $this->_getSession()->addSuccess($this->__('The address has been saved.'));
454
+ return $this->_redirect('*/*/address', array('_secure' => true, 'id' => $address->getId()));
455
+ }
456
  } else {
457
  $this->_getSession()->setAddressFormData($this->getRequest()->getPost());
458
  foreach ($errors as $errorMessage) {
app/code/community/Jmango360/Japi/etc/config.xml CHANGED
@@ -7,7 +7,7 @@
7
  <config>
8
  <modules>
9
  <Jmango360_Japi>
10
- <version>3.1.1</version>
11
  </Jmango360_Japi>
12
  </modules>
13
 
@@ -409,6 +409,10 @@
409
  <apple_touch_icon></apple_touch_icon>
410
  <android_touch_icon></android_touch_icon>
411
  </jmango_smart_app_banner>
 
 
 
 
412
  <jmango_rest_developer_settings>
413
  <enable>0</enable>
414
  </jmango_rest_developer_settings>
7
  <config>
8
  <modules>
9
  <Jmango360_Japi>
10
+ <version>3.2.0</version>
11
  </Jmango360_Japi>
12
  </modules>
13
 
409
  <apple_touch_icon></apple_touch_icon>
410
  <android_touch_icon></android_touch_icon>
411
  </jmango_smart_app_banner>
412
+ <jmango_rest_bazaarvoice_settings>
413
+ <env>staging</env>
414
+ <api_key></api_key>
415
+ </jmango_rest_bazaarvoice_settings>
416
  <jmango_rest_developer_settings>
417
  <enable>0</enable>
418
  </jmango_rest_developer_settings>
app/code/community/Jmango360/Japi/etc/system.xml CHANGED
@@ -701,6 +701,34 @@
701
  </android_touch_icon>
702
  </fields>
703
  </jmango_smart_app_banner-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
704
  <jmango_rest_developer_settings translate="label" module="japi">
705
  <label>Developer</label>
706
  <show_in_default>1</show_in_default>
701
  </android_touch_icon>
702
  </fields>
703
  </jmango_smart_app_banner-->
704
+ <!--jmango_rest_bazaarvoice_settings translate="label" module="japi">
705
+ <label>Bazaarvoice Settings</label>
706
+ <show_in_default>1</show_in_default>
707
+ <show_in_website>1</show_in_website>
708
+ <show_in_store>1</show_in_store>
709
+ <sort_order>95</sort_order>
710
+ <fields>
711
+ <env translate="label comment" module="japi">
712
+ <label>Environment</label>
713
+ <frontend_type>select</frontend_type>
714
+ <source_model>japi/system_config_source_bazaarvoice_env</source_model>
715
+ <sort_order>10</sort_order>
716
+ <show_in_default>1</show_in_default>
717
+ <show_in_website>1</show_in_website>
718
+ <show_in_store>1</show_in_store>
719
+ <comment>Select environment</comment>
720
+ </env>
721
+ <api_key translate="label comment" module="japi">
722
+ <label>Bazaarvoice API Key</label>
723
+ <frontend_type>text</frontend_type>
724
+ <sort_order>20</sort_order>
725
+ <show_in_default>1</show_in_default>
726
+ <show_in_website>1</show_in_website>
727
+ <show_in_store>1</show_in_store>
728
+ <comment>Bazaarvoice Conversations API key (prod)</comment>
729
+ </api_key>
730
+ </fields>
731
+ </jmango_rest_bazaarvoice_settings-->
732
  <jmango_rest_developer_settings translate="label" module="japi">
733
  <label>Developer</label>
734
  <show_in_default>1</show_in_default>
app/design/frontend/base/default/template/japi/checkout/onepage.phtml CHANGED
@@ -65,13 +65,23 @@
65
  review: '<?php echo $this->getUrl('japi/checkout/review', array('_secure' => true)) ?>',
66
  saveMethod: '<?php echo $this->getUrl('japi/checkout/saveMethod', array('_secure' => true)) ?>',
67
  failure: '<?php echo $this->getUrl('japi/checkout/onepage', array('_secure' => true)) ?>',
68
- shippingMethodUrl: '<?php echo $this->getUrl('japi/checkout/getShippingMethod', array('_secure' => true)) ?>'
69
- });
70
- <?php if (!$error && Mage::getSingleton('core/session')->getData('is_address_update') && $this->getQuote()->getBillingAddress()->getCountryId()): ?>
71
- <?php Mage::getSingleton('core/session')->setData('is_address_update', false) ?>
72
- document.observe("dom:loaded", function () {
73
- checkout.gotoShippingMethodSection();
74
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  <?php endif ?>
76
  //]]>
77
  </script>
65
  review: '<?php echo $this->getUrl('japi/checkout/review', array('_secure' => true)) ?>',
66
  saveMethod: '<?php echo $this->getUrl('japi/checkout/saveMethod', array('_secure' => true)) ?>',
67
  failure: '<?php echo $this->getUrl('japi/checkout/onepage', array('_secure' => true)) ?>',
68
+ shippingMethodUrl: '<?php echo $this->getUrl('japi/checkout/getShippingMethod', array('_secure' => true)) ?>',
69
+ editAddressUrl: '<?php echo $this->getUrl('japi/customer/address', array('_secure' => true)) ?>'
 
 
 
 
70
  });
71
+ <?php if (!$error): ?>
72
+ <?php if (Mage::getSingleton('core/session')->getData('is_address_update')): ?>
73
+ <?php if ($this->getQuote()->getBillingAddress()->getCountryId()): ?>
74
+ <?php Mage::getSingleton('core/session')->setData('is_address_update', false) ?>
75
+ document.observe("dom:loaded", function () {
76
+ checkout.gotoShippingMethodSection();
77
+ });
78
+ <?php endif ?>
79
+ <?php elseif (Mage::getSingleton('core/session')->getData('is_shipping_address_update')): ?>
80
+ <?php Mage::getSingleton('core/session')->unsetData('is_shipping_address_update') ?>
81
+ document.observe("dom:loaded", function () {
82
+ checkout.gotoSection('shipping');
83
+ });
84
+ <?php endif ?>
85
  <?php endif ?>
86
  //]]>
87
  </script>
app/design/frontend/base/default/template/japi/checkout/onepage/style.phtml CHANGED
@@ -19,7 +19,7 @@ $customCss = Mage::getStoreConfig('japi/jmango_rest_checkout_settings/custom_css
19
  $TIGPostNLVersion = Mage::helper('japi')->getExtensionVersion('TIG_PostNL');
20
  ?>
21
  <link type="text/css" rel="stylesheet" media="all"
22
- href="<?php echo $this->getSkinUrl('japi/css/style.css?v=3.1.0') ?>"/>
23
 
24
  <?php if (Mage::helper('japi')->isModuleEnabled('GoMage_Checkout')): ?>
25
  <link type="text/css" rel="stylesheet" media="all"
19
  $TIGPostNLVersion = Mage::helper('japi')->getExtensionVersion('TIG_PostNL');
20
  ?>
21
  <link type="text/css" rel="stylesheet" media="all"
22
+ href="<?php echo $this->getSkinUrl('japi/css/style.css?v=3.2.0') ?>"/>
23
 
24
  <?php if (Mage::helper('japi')->isModuleEnabled('GoMage_Checkout')): ?>
25
  <link type="text/css" rel="stylesheet" media="all"
app/design/frontend/base/default/template/japi/customer/address/edit.phtml CHANGED
@@ -231,6 +231,11 @@
231
  title="<?php echo Mage::helper('core')->quoteEscape($this->__('Save Address')) ?>" class="button">
232
  <span><span><?php echo $this->__('Save Address') ?></span></span>
233
  </button>
 
 
 
 
 
234
  </div>
235
  </form>
236
  <script type="text/javascript">
231
  title="<?php echo Mage::helper('core')->quoteEscape($this->__('Save Address')) ?>" class="button">
232
  <span><span><?php echo $this->__('Save Address') ?></span></span>
233
  </button>
234
+ <?php if ($this->getRequest()->getParam('is_checkout')): ?>
235
+ <!--button type="button" class="button button-cancel" onclick="setLocation('<?php echo Mage::getSingleton('customer/session')->getRefererUrl() ?>')">
236
+ <span><?php echo $this->__('Cancel') ?></span>
237
+ </button-->
238
+ <?php endif; ?>
239
  </div>
240
  </form>
241
  <script type="text/javascript">
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Jmango360_Japi</name>
4
- <version>3.1.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0">Apache License</license>
7
  <channel>community</channel>
@@ -31,9 +31,9 @@ Other generic mobile apps that you can add and configure:&#xD;
31
  For more details on JMango360 please visit our website http://www.jmango360.com or out knowledge site http://support.jmango360.com</description>
32
  <notes>* Bug fixes</notes>
33
  <authors><author><name>Duc Ngo</name><user>jmango360</user><email>duc@jmango360.com</email></author></authors>
34
- <date>2017-03-15</date>
35
- <time>09:46:58</time>
36
- <contents><target name="magecommunity"><dir name="Jmango360"><dir name="Japi"><dir name="Block"><dir name="Adminhtml"><dir name="Catalog"><dir name="Product"><dir name="Grid"><dir name="Column"><dir name="Renderer"><file name="Hide.php" hash="2e9fb95869151bb2a2c7cf7fca6f998f"/></dir></dir></dir></dir></dir><dir name="Order"><file name="Grid.php" hash="22273d3d0acaf1b0a093e524f87c6aff"/></dir><file name="Order.php" hash="04e94160608b989286aebeb190299565"/><dir name="Report"><dir name="Chart"><file name="Customers.php" hash="9a4c7c4af19c584aeb2dd5bc0f6d4735"/><file name="Orders.php" hash="ae5f516c56c5c8c72c14a7b0aa275ac6"/><file name="Sales.php" hash="7d5db491deeaa90571e965bbc2c07e23"/></dir><dir name="Customers"><file name="Chart.php" hash="69f2a7121d61f24d9b75de7281def8e5"/><file name="Grid.php" hash="f1adb7504646338330b7e7ef64a4fc5c"/></dir><file name="Customers.php" hash="6ffd72b1280b6cce39665fd35b5c4a78"/><dir name="Filter"><dir name="Form"><file name="Orders.php" hash="92574de82aa73cdd9de0cc59e20dadc4"/></dir><file name="Form.php" hash="7bf3f161f66abf97fc7db57e0acd59cf"/></dir><dir name="Orders"><file name="Chart.php" hash="75bd0bbe8649f423918dec555d3e9592"/><file name="Grid.php" hash="35590c1a54c8490c3982f0df038b8328"/></dir><file name="Orders.php" hash="6416ac5f6889d5a06f2a32f5ff00cbe2"/><dir name="Sales"><file name="Chart.php" hash="416f4ff4cdaa7f8f099dad3ffccacd68"/><file name="Grid.php" hash="baa9caa57906627ed3f31ec4fd87a500"/></dir><file name="Sales.php" hash="c1d1df3e7b90451e42142bb414a28d6b"/></dir><dir name="System"><dir name="Config"><dir name="Form"><file name="Button.php" hash="2b02a6c90256c9bcc6d99d2d9301413e"/><file name="Log.php" hash="d9221555160853639e1d8939040fb95e"/><file name="User.php" hash="cb7dfc72c7acde78efbabc49617cba3c"/><file name="Version.php" hash="b9802c302ef7ecacf106993e8506d314"/></dir></dir></dir><dir name="Widget"><dir name="Form"><dir name="Renderer"><dir name="Element"><file name="Chart.php" hash="f6f4c2ff80cb71f3e0758809b8ad480d"/></dir></dir></dir></dir></dir><file name="Banner.php" hash="0cafa22b3012e1a3b39f0e72a03534fa"/><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="43581de27feb1a0187bb0aee68bab0e9"/><file name="Category.php" hash="5d01fc7d90af7eccd412ef61056b825b"/><file name="Decimal.php" hash="d40a09709bda7b1011e4d2c970308638"/><file name="Price.php" hash="02dfe6d9429f0190ecf9a41f73653330"/></dir><file name="View.php" hash="cc03d4012f37b248e1b7d21c1fe9f539"/></dir><dir name="Product"><file name="List.php" hash="7a905e6f378ebfaa0604a51e066427dc"/></dir></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="4ba3d242a3343b1786cf081047650bb9"/></dir></dir><file name="Layer.php" hash="4d48db1a2b35151c363ed045646199a9"/></dir><dir name="Checkout"><dir name="Cart"><file name="Totals.php" hash="7aced913b0e0cd1622dd8d03b376327d"/></dir><dir name="Onepage"><file name="Addjs.php" hash="077d09b15ec8823c76854a575359cb1a"/><file name="Address.php" hash="bf596c77e982d4350fc532a3deb79e47"/><file name="Billing.php" hash="c2276c96503c44e79d54a4cc659af42b"/><file name="Button.php" hash="254dbea19be91c6144770645c14569b5"/><file name="Shipping.php" hash="37f8cf7ca7cbd93d991837f0c59eb1c7"/></dir><file name="Onepage.php" hash="b02fe40ae9c73c0d1248c178a4f2d133"/></dir><file name="Form.php" hash="e16eaa258cf650bd2106372fcf43ae9b"/><dir name="GiftMessage"><dir name="Message"><file name="Inline.php" hash="8f20e9383634f46b624f15d77b616380"/></dir></dir><file name="Js.php" hash="8e8091283a5a3142fec7486077a9586e"/></dir><dir name="Controller"><file name="Abstract.php" hash="ccb6cc7460e7bbf30293983bbe61a07d"/></dir><file name="Exception.php" hash="bd30a2efecdf9a8197f066d9574cd1ab"/><dir name="Helper"><dir name="Adminhtml"><dir name="Report"><file name="Order.php" hash="9f7a02c48f3f8e0545488375b03d7333"/></dir></dir><file name="Data.php" hash="88768166f910829b2d07d07aa6169899"/><file name="Debug.php" hash="1002a59a5dee41f34da875979e907cbf"/><dir name="GiftMessage"><file name="Message.php" hash="5d1df4710b0aa3154ce0fa744b0244f3"/></dir><file name="Js.php" hash="55565b7d668b993fae6c180b30766d17"/><dir name="Product"><file name="Bundle.php" hash="c89baf5638e81d030f5a72b011af7cfd"/><file name="Configurable.php" hash="ade7d5ca64b091be916d54746ee38571"/><file name="Downloadable.php" hash="db531632adda525a91625da8d13296d6"/><file name="File.php" hash="0968c5688015b9c7a002457428607f80"/><file name="Grouped.php" hash="e9b47fc58b1ddd3e63e285cd19f1b66d"/><file name="Media.php" hash="291003011bdca7299280ef0136089edf"/><file name="Options.php" hash="1bc8973b5a9227b0b7de93f2307c7fb9"/><file name="Review.php" hash="e415a0215a8dfbdac5ed76e6c065c705"/><file name="TierPrice.php" hash="4a7e94d83eed9e7ba47ee196b4ae15d9"/></dir><file name="Product.php" hash="0d9ade16dad1d259e9b6c58a7d92543f"/><file name="Tax.php" hash="05c99785012d55fce12c4f094385e25c"/></dir><dir name="Model"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="f058e0ced4579a556cbb969a98c7fc66"/><file name="Decimal.php" hash="849e1dbc11c99fb8f7a1f9d33e0d7908"/><file name="Price.php" hash="2bdc6f1ff06ad5aa736972c72558fd25"/></dir></dir></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="81b287f96c40094c2a3743ddc6f6c6cb"/></dir></dir></dir><dir name="Core"><file name="Session.php" hash="7c5531af03c6a98e14dda3d358270938"/></dir><file name="Dispatcher.php" hash="81004902926427ba06a1a90d6e799554"/><dir name="Magpleasure"><dir name="Tierprices"><file name="Price.php" hash="1bfd6ed086649f518b3e98436513a491"/></dir></dir><file name="Observer.php" hash="945e64f9e9a3a4e88a0aee20a2301041"/><dir name="Renderer"><file name="Json.php" hash="b7c471548eecae7c9d05072aa6695cbb"/></dir><file name="Renderer.php" hash="47c320f795f1328a8df37d4b9af56abc"/><file name="Request.php" hash="ece58a0074c2ba238c102983e05d15a8"/><dir name="Resource"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="5bd13fbb5e8012ad24dc7908bc5ea755"/><file name="Decimal.php" hash="551120b728226ed408292fac732a05d7"/><file name="Price.php" hash="321f70b515b4d3deb9c7cc58eb803bf2"/></dir></dir></dir><dir name="Report"><dir name="Order"><file name="Collection.php" hash="1c5e69f548f2b4a0da8f789d7d03b643"/></dir></dir><dir name="Sales"><dir name="Report"><dir name="Order"><dir name="Collection"><file name="Aggregated.php" hash="61848c0b80699acbf478f279231c161d"/><file name="Live.php" hash="ea323ca0eec324ece97f08ece6639fb9"/></dir></dir><file name="Order.php" hash="53641b24d23bd811c278f65b56d5765f"/></dir></dir><file name="Setup.php" hash="3a97ea2e652869965f5b47b9e3099896"/></dir><file name="Response.php" hash="7209bb2e9c5b97b2a46d10ff97aa6740"/><dir name="Rest"><dir name="Cart"><file name="Coupon.php" hash="a5be6cfe674b46b6ba290b0388edf8ad"/><file name="Update.php" hash="3ba5baf802a358068e30dc7c840626b9"/></dir><file name="Cart.php" hash="d974ed0120b3199b0654eaf136780076"/><dir name="Catalog"><dir name="Category"><file name="Assignedproducts.php" hash="6e7aa946a3aaad24b9ddb862f8ef6382"/><file name="Tree.php" hash="5dce196312e33d3f7ac4a2235312e587"/></dir><dir name="Search"><file name="Products.php" hash="8b8f43f4f563dc27002884a57d42c858"/><file name="Terms.php" hash="71cadbe1fa7b19c96f2201f087c832ff"/></dir></dir><file name="Catalog.php" hash="a71eed5f39431b40a80b06f566baa653"/><dir name="Checkout"><file name="Methods.php" hash="ce5e08ab2b5cf944c5b6b9ccc25773e0"/><file name="Onepage.php" hash="2aaa71fd90f16b9290e49e198e0704b3"/><file name="Redirect.php" hash="19932aa45299e5ea3995f52cb9987183"/><file name="Submit.php" hash="50ac35f8218f5c3abeb0946e138db2ae"/></dir><file name="Checkout.php" hash="514f5be707f0a1a1175b825983831705"/><dir name="Cms"><file name="Page.php" hash="93bd77b2b3f2b8b1e72a3e6391553426"/></dir><file name="Cms.php" hash="a12fd4b2a437c8a6c0b2b65a1e471c23"/><dir name="Customer"><file name="Address.php" hash="cef92ca089a5cd7cd1218339104c4894"/><file name="Edit.php" hash="226f77d8cee872c4c622c062cfe1eff0"/><file name="Group.php" hash="c717d5faf52919787aa0f87270856ca3"/><file name="List.php" hash="17f0096755be01327c163a701b9f3780"/><file name="Login.php" hash="77df1e0afcf40e6129fb61397217f053"/><dir name="Order"><file name="List.php" hash="1e6ea53a87108ca487d9a58ac42f382f"/></dir><file name="Order.php" hash="da1565601bac963b72f64b0e6a147704"/><file name="Password.php" hash="6df128903742a8723f0a59c4203f8b12"/><file name="Register.php" hash="e25d0045e0d8ff650ca208b9fe75e3ae"/></dir><file name="Customer.php" hash="ecf57dcf8bbba1ebb12ed10630bd1715"/><file name="Mage.php" hash="1d3efa624b4a9459e88dbc1a65da030a"/><dir name="Product"><file name="Crosssell.php" hash="1fbc8c3886de3703a77e911ac459422c"/><file name="List.php" hash="8d84ec9326a6747de6d2ca0a5aceee6c"/><file name="Price.php" hash="d47c9903d5719b0cee73836419e27bb1"/><file name="Purchased.php" hash="feb7fd9176da74e59722984732d04a9a"/><file name="Related.php" hash="8a6b52fc39f099f4339a91ad5709537a"/><file name="Review.php" hash="842153c90bd08fb9ec550f9aea8c7030"/><file name="Search.php" hash="b118477df326de2b7a738954032b93e9"/><file name="Upsell.php" hash="56a4075e88a75d1cfa89e7da1130a2b4"/><file name="Url.php" hash="0372ce63d63bc5f2982a35b335643661"/><file name="Viewed.php" hash="c2a9c99a56b57d8288eec75657f9bd47"/></dir><file name="Product.php" hash="33f395e10d5578d948bf32a7bd5388fd"/><file name="Wishlist.php" hash="ee26b4efcbf3b2c39aec2c1e3402c35b"/></dir><file name="Server.php" hash="059b4dd18c18c1821426d5553a492146"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Icon.php" hash="242de9b094f94e397dc606dc926cc33f"/><file name="Payment.php" hash="5964322419785004a6c3f84a940d8d13"/><file name="Shipping.php" hash="016f22646fbac10cd81c6b7904c9abde"/></dir><dir name="Source"><dir name="Address"><file name="Attributes.php" hash="1a29b64d271693fba3ea76599d3408e2"/><file name="Validatetype.php" hash="6f4d9767ac0e476ec6a6cd3964882721"/></dir><file name="Attributes.php" hash="4b4de29e00623c971038d6fe895e5e76"/><dir name="Catalog"><file name="Direction.php" hash="68cd86444037506ec39de8eba3c07d8b"/><file name="Sortby.php" hash="d2aba9a3798b8e2eee8c275fbbd202e1"/></dir><file name="Catalogimage.php" hash="500f9994ea13e463a5e5e5d3963cfbd1"/><dir name="Customer"><file name="Attributes.php" hash="8963356aabf88647ab5ecbbbe8cfb9f1"/></dir><file name="Defaultimage.php" hash="04c896116c01b16e2ac8d7f23bbc29d6"/><file name="Payment.php" hash="70e82f4887eb297d6a58160f64bfd204"/><file name="Shipping.php" hash="7d8e5a2dc8a57099d908bef2403aad46"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Japi"><file name="LogController.php" hash="b17e024285aea7b6834cf5bc9b868916"/><file name="OrderController.php" hash="e6b7c1f5a7156a06fa3f51c32e6bbba9"/><file name="ReportController.php" hash="e88b2425e0a39f7f2b0c2902a6d2d5e9"/><file name="TroubleshootingController.php" hash="bb8951d1523a56a0f55e827614a38d66"/></dir></dir><file name="CheckoutController.php" hash="8353c64f00e22143bfc5264bcdc07998"/><dir name="Customer"><file name="AccountController.php" hash="2e055c5b22a2414263a1b7d3fd0607f9"/></dir><file name="CustomerController.php" hash="2cc4407dc6a31c51d276433de67530f0"/><file name="ImageController.php" hash="a5b48d4e075faf989c908bd0954d3878"/><file name="KcoController.php" hash="38e15112f3438edd6723478cf18c6cab"/><file name="KlarnaController.php" hash="fafb22cc7b5e2f69ee3dfb9094a04dcd"/><dir name="Rest"><file name="CartController.php" hash="3994aafe8e31094b765fc0120c888fa3"/><file name="CatalogController.php" hash="8df5b798bb0330f5e3182717e1e15bf7"/><file name="CheckoutController.php" hash="2fd4a4bca1a37788616645f50392a701"/><file name="CmsController.php" hash="cb1bc3f67136434c4d8af1b5660eab1e"/><file name="CustomerController.php" hash="ca2b76f8f4e8a84d81749b37910287bd"/><file name="MageController.php" hash="e267156b2acf82d309b6c8c4680a7371"/><file name="ProductController.php" hash="81c0a0b0afcdfe99d6c651244baa075c"/><file name="WishlistController.php" hash="d7b0c8ff628b4244d120843d54a41248"/></dir><file name="TestController.php" hash="ffb60653808c0e0af00cc73d4755ef99"/></dir><dir name="data"><dir name="japi_setup"><file name="data-install-2.0.0.php" hash="bcf6de66f6b296182268b11b3e80bbeb"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="9d1888abb4ed93ec7b3e1fa678fb1411"/><file name="config.xml" hash="efa9c93d1c40e062e4a0bef349dc8874"/><file name="system.xml" hash="bbba22a58485135d177a1e49162316e3"/></dir><dir name="sql"><dir name="japi_setup"><file name="install-1.0.0.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name="upgrade-2.0.1.2-2.0.2.php" hash="6fc0e0306b685279fc60f298643d181a"/><file name="upgrade-2.1.6-2.2.0.php" hash="947afcf7e20dfc2c3a3e45d8e5c316cd"/><file name="upgrade-2.2.0-2.2.1.php" hash="12a28845acf823eefc5f613b048efe52"/><file name="upgrade-2.8.2-2.9.0.php" hash="2761423f65920af0f8ba05d438710869"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Jmango360_Japi.xml" hash="b60701b3a14084fa1a440ca5fe5bf47b"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="jmango360_japi.xml" hash="d6e1656e4a8e79dd9e37e0b09a5f57a6"/></dir><dir name="template"><dir name="japi"><dir name="report"><file name="chart.phtml" hash="102704d97cf69793a50fa96538bd767f"/><dir name="grid"><file name="container.phtml" hash="79050f4e2bc7b70ae452e850fc27e0b7"/></dir></dir><dir name="widget"><dir name="form"><dir name="renderer"><dir name="element"><file name="chart.phtml" hash="fb14be221a9ec0faad4ace8579c5dddc"/></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="jmango360_japi.xml" hash="f7ec8e2011c45addbe22c548d5800bf3"/></dir><dir name="template"><dir name="japi"><dir name="TIG"><dir name="PostNL"><dir name="av"><dir name="checkout"><dir name="onepage"><file name="billing.phtml" hash="0cb781955d33fae46da09d62bd6fdaf3"/><file name="shipping.phtml" hash="cb72f56f0d26171c429d7a70701e0913"/></dir></dir><dir name="customer"><dir name="address"><file name="edit.phtml" hash="9a623e8c2184d08c2b288456ba50aef4"/><file name="postcode_check.phtml" hash="cbb8bfd76db65041cafacf976312ceb7"/></dir></dir></dir><dir name="do"><dir name="onepage"><file name="available.phtml" hash="8fce41a1696540a4546b52c025f3dde7"/></dir></dir></dir></dir><dir name="checkout"><dir name="onepage"><file name="address.phtml" hash="3164ff4fc2d5f798e591a168d9d937d1"/><file name="agreements.phtml" hash="ae43c3b670b0d11a1217ca927a184ff7"/><file name="billing.phtml" hash="d5491399cbce3e565757023dc3e594ed"/><file name="coupon.phtml" hash="a27beeba5f8b2160dccc6d4198c6517d"/><file name="js.phtml" hash="ac1740fe3e829d228a57b1e1a9dda58b"/><dir name="payment"><file name="info.phtml" hash="26bb640843ee3fb6e72b4f2739f0a111"/><file name="methods.phtml" hash="1680b5e33d8123fdb58ecbd353ff1ba7"/></dir><file name="payment.phtml" hash="cc3bfd21f2a141ea403db094e1264781"/><dir name="review"><file name="button.phtml" hash="e2089ae34e409df2fa13977a55db5f04"/><file name="info.phtml" hash="54ea567e7273a0942fcdddfb95340e8e"/><file name="item.phtml" hash="244bba60d9151be71777e80e138b6ee7"/><file name="totals.phtml" hash="0decbe242701193fee270e1f0f520a93"/></dir><file name="review.phtml" hash="d2494b8faac5833e747a5d329ee4fab7"/><file name="shipping.phtml" hash="d0aba8dade93f6798285f7163ec65e58"/><dir name="shipping_method"><file name="additional.phtml" hash="78c6dab72fefb888f587221639bf9177"/><file name="available.phtml" hash="4feca53deabec45bc3b223e64e32c4f0"/></dir><file name="shipping_method.phtml" hash="edc75d0aecc103ed69b216ef76bc6af2"/><file name="style.phtml" hash="541d090aaadc7a189c07660a3339e82a"/></dir><file name="onepage.phtml" hash="2be9b999efcf0f2d9b32a8b6121c3ffe"/></dir><dir name="customer"><dir name="address"><file name="edit.phtml" hash="4d028d4ca89472c1e0caadb43134d9fd"/></dir><dir name="form"><file name="edit.phtml" hash="484b2b56cbf34dba73c78dc97552c024"/><file name="register.phtml" hash="978dc0d67f796c90e8675cbaec1a06ba"/></dir></dir><dir name="fatturazione"><dir name="customer"><dir name="address"><file name="edit.phtml" hash="e7f27a8a61d9554bfbc4f36dfff60e4d"/></dir></dir></dir><file name="form.phtml" hash="eec0416c8830c4ebe004256d86c7ea59"/><dir name="giftmessage"><file name="inline.phtml" hash="78814da47aed68315b7d1d6b2e64c4c7"/></dir><file name="js.phtml" hash="9af5ac67d9b1a4fc689084e135215f99"/><dir name="kega_checkout"><dir name="onepage"><file name="payment.phtml" hash="36ceb7a03629f08c789f42e98b1c1535"/></dir></dir><dir name="nwt"><dir name="kco"><dir name="cart"><dir name="item"><file name="default.phtml" hash="212018e8f0c4472a07fc81633d27c550"/></dir></dir><file name="checkout.phtml" hash="c7781347405e7e59322d9fc3b2f42b3c"/></dir></dir><dir name="page"><dir name="html"><file name="head.phtml" hash="b6a8cc30cd31bf642c2f885ed1fda855"/><file name="smart-app-banner.phtml" hash="8423731f246db33efb61026dd9ef5ddc"/></dir><file name="rwd.phtml" hash="06c53b02ad843574b22a803a709988f6"/></dir><dir name="symfony"><dir name="postcode"><dir name="checkout"><dir name="onepage"><file name="billing.phtml" hash="65181e0ab40a40671f35c54bc25b99af"/><file name="shipping.phtml" hash="a6e2a192b9998889e5d113a92df62623"/></dir></dir></dir></dir><dir name="vaimo"><dir name="klarna"><dir name="klarnacheckout"><dir name="cart"><dir name="item"><file name="default.phtml" hash="f9f469de9cd1243cab176fc56071db64"/></dir></dir><file name="cart.phtml" hash="b40f17348beb248c4f1ff22374a1a05d"/><dir name="customer"><file name="balance.phtml" hash="198809cb8ebf8a468b89497c9abba07c"/></dir><dir name="discount"><file name="coupon.phtml" hash="1f3686b00a610d3f038c84e3621ef913"/></dir><file name="header.phtml" hash="fed93df0c84265a0f980b0de103945b8"/><file name="main.phtml" hash="94ad4f3aa30ae7db1131a1fe48ea2a99"/><file name="newsletter.phtml" hash="3a2251b9559e8b87b46ddf08b7cd27e2"/><file name="reward.phtml" hash="38c218d3777f11b03c3686067a706d00"/><file name="shipping_method.phtml" hash="44bb3c6efaab76641e02a07c2007a090"/><file name="sidebar.phtml" hash="410508fd9089e0be030915836abb42e2"/></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="japi"><dir name="css"><dir name="TIG"><dir name="Buckaroo3Extended"><file name="styles_opc.css" hash="9b0ecbbeb22655e2e896ec8134fa8188"/></dir></dir><file name="gomage-checkout.css" hash="223657dbb0aba2783bb9e8de4b633d93"/><dir name="icomoon"><dir name="fonts"><file name="icomoon.eot" hash="842065e274d718c38968a81a721d49f4"/><file name="icomoon.svg" hash="2deea3fcd9ecc464a422aa37943b5848"/><file name="icomoon.ttf" hash="8ffbfccd78de7c37eadeca837ee40344"/><file name="icomoon.woff" hash="32df67c3aed8769c316b3e7ff1bb637c"/></dir><file name="style.css" hash="178c956df2a327dc88e4ef8069caa9bc"/></dir><file name="send-cloud.css" hash="77f77fa89359fe508708ec522a5e76d8"/><file name="style.css" hash="da048642edae309cb57b6cb23825b6bb"/><file name="style.less" hash="4bd889bf10716a442dd88d92f661a853"/></dir><dir name="images"><file name="ajax-loader.gif" hash="f48ee069890b16455c3ddcacee9b5f75"/><file name="bg-down.png" hash="04d7cd2963010b610f608aca03a45c63"/><file name="bg-up.png" hash="2882d38108532275fb1d425bbd021c9d"/><file name="glc_sprite.png" hash="5cd6f3ba1df3a6d26db5bbc193ce9c61"/></dir><dir name="js"><file name="checkout.js" hash="42f6b3b996efe081c8d8cf5e9eb15ef8"/><dir name="vaimo"><dir name="klarna"><file name="klarnautils.js" hash="e29553aa8446af7672c9ba1814fac3a5"/></dir></dir><dir name="varien"><file name="form.js" hash="9abc0bb4419828513b5c6e904a041616"/></dir></dir><dir name="lib"><dir name="bootstrap"><dir name="css"><file name="bootstrap.min.css" hash="5d5357cb3704e1f43a1f5bfed2aebf42"/></dir><dir name="fonts"><file name="glyphicons-halflings-regular.eot" hash="f4769f9bdb7466be65088239c12046d1"/><file name="glyphicons-halflings-regular.svg" hash="89889688147bd7575d6327160d64e760"/><file name="glyphicons-halflings-regular.ttf" hash="e18bbf611f2a2e43afc071aa2f4e1512"/><file name="glyphicons-halflings-regular.woff" hash="fa2772327f55d8198301fdb8bcfc8158"/><file name="glyphicons-halflings-regular.woff2" hash="448c34a56d699c29117adc64c43affeb"/></dir><dir name="js"><file name="collapse.js" hash="2bc99ca6c9b060ba5616f41ddd5e2703"/><file name="modal.js" hash="b7d8f688e67e78c07ffde44ec4248fd9"/><file name="transition.js" hash="3cb001675410903ecaadcfeb7c296965"/></dir></dir><dir name="jquery"><file name="jquery-1.11.2.min.js" hash="5790ead7ad3ba27397aedfa3d263b867"/><file name="jquery-noconflict.js" hash="32eb0a33820167f328a227e11210d32a"/></dir><dir name="ladda"><file name="ladda.min.css" hash="614e769024385cf21879d6a238b682e1"/><file name="ladda.min.js" hash="a34bcf417de7fc290ac5b034caca2371"/></dir><dir name="scrollto"><file name="scrollTo.js" hash="5c86793da8a4bfec6338bec965d35f6b"/></dir><dir name="smart-app-banner"><file name="smart-app-banner.css" hash="64c15053dbd22b44a519f55e75f6c2ca"/><file name="smart-app-banner.js" hash="4162cb20424080964b5d886125b73b47"/></dir><dir name="spin"><file name="spin.min.js" hash="1d06ceb800acbeae82d1fa2ad5b571de"/></dir></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="Jmango360_Japi.csv" hash="f6bcc8de631311da22d0097b4508d420"/></dir><dir name="fr_FR"><file name="Jmango360_Japi.csv" hash="18a1f2a8dfca8ba4a2cb98d2e7deb0a1"/></dir><dir name="it_IT"><file name="Jmango360_Japi.csv" hash="1c43aa2f566cd1b2edeaa1e544d1133f"/></dir><dir name="pt_PT"><file name="Jmango360_Japi.csv" hash="31398310d2400a9a1abc548345831778"/></dir><dir name="pt_BR"><file name="Jmango360_Japi.csv" hash="31398310d2400a9a1abc548345831778"/></dir><dir name="ar_SA"><file name="Jmango360_Japi.csv" hash="25b829fa5515c567af7ed8e5e4a2690a"/></dir><dir name="nl_NL"><file name="Jmango360_Japi.csv" hash="0d7d58f3ece899e82406432c4d50a74e"/></dir><dir name="sv_SE"><file name="Jmango360_Japi.csv" hash="3414d54579206e71cabaaea3153bc266"/></dir><dir name="da_DK"><file name="Jmango360_Japi.csv" hash="a8f243d230a312f4d5cee8c99a275ee7"/></dir><dir name="es_ES"><file name="Jmango360_Japi.csv" hash="0f763b984f64e095f863c2e66335c791"/></dir><dir name="de_DE"><file name="Jmango360_Japi.csv" hash="d97408dc0ece1a193669bc491798355a"/></dir></target></contents>
37
  <compatible/>
38
  <dependencies><required><php><min>5.2.0</min><max>7.1.0</max></php></required></dependencies>
39
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Jmango360_Japi</name>
4
+ <version>3.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0">Apache License</license>
7
  <channel>community</channel>
31
  For more details on JMango360 please visit our website http://www.jmango360.com or out knowledge site http://support.jmango360.com</description>
32
  <notes>* Bug fixes</notes>
33
  <authors><author><name>Duc Ngo</name><user>jmango360</user><email>duc@jmango360.com</email></author></authors>
34
+ <date>2017-03-27</date>
35
+ <time>08:14:31</time>
36
+ <contents><target name="magecommunity"><dir name="Jmango360"><dir name="Japi"><dir name="Block"><dir name="Adminhtml"><dir name="Catalog"><dir name="Product"><dir name="Grid"><dir name="Column"><dir name="Renderer"><file name="Hide.php" hash="2e9fb95869151bb2a2c7cf7fca6f998f"/></dir></dir></dir></dir></dir><dir name="Order"><file name="Grid.php" hash="22273d3d0acaf1b0a093e524f87c6aff"/></dir><file name="Order.php" hash="04e94160608b989286aebeb190299565"/><dir name="Report"><dir name="Chart"><file name="Customers.php" hash="9a4c7c4af19c584aeb2dd5bc0f6d4735"/><file name="Orders.php" hash="ae5f516c56c5c8c72c14a7b0aa275ac6"/><file name="Sales.php" hash="7d5db491deeaa90571e965bbc2c07e23"/></dir><dir name="Customers"><file name="Chart.php" hash="69f2a7121d61f24d9b75de7281def8e5"/><file name="Grid.php" hash="f1adb7504646338330b7e7ef64a4fc5c"/></dir><file name="Customers.php" hash="6ffd72b1280b6cce39665fd35b5c4a78"/><dir name="Filter"><dir name="Form"><file name="Orders.php" hash="92574de82aa73cdd9de0cc59e20dadc4"/></dir><file name="Form.php" hash="7bf3f161f66abf97fc7db57e0acd59cf"/></dir><dir name="Orders"><file name="Chart.php" hash="75bd0bbe8649f423918dec555d3e9592"/><file name="Grid.php" hash="35590c1a54c8490c3982f0df038b8328"/></dir><file name="Orders.php" hash="6416ac5f6889d5a06f2a32f5ff00cbe2"/><dir name="Sales"><file name="Chart.php" hash="416f4ff4cdaa7f8f099dad3ffccacd68"/><file name="Grid.php" hash="baa9caa57906627ed3f31ec4fd87a500"/></dir><file name="Sales.php" hash="c1d1df3e7b90451e42142bb414a28d6b"/></dir><dir name="System"><dir name="Config"><dir name="Form"><file name="Button.php" hash="2b02a6c90256c9bcc6d99d2d9301413e"/><file name="Log.php" hash="d92a34eab2fbac5dc45ad12fc7df11ed"/><file name="User.php" hash="cb7dfc72c7acde78efbabc49617cba3c"/><file name="Version.php" hash="b9802c302ef7ecacf106993e8506d314"/></dir></dir></dir><dir name="Widget"><dir name="Form"><dir name="Renderer"><dir name="Element"><file name="Chart.php" hash="f6f4c2ff80cb71f3e0758809b8ad480d"/></dir></dir></dir></dir></dir><file name="Banner.php" hash="0cafa22b3012e1a3b39f0e72a03534fa"/><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="43581de27feb1a0187bb0aee68bab0e9"/><file name="Category.php" hash="5d01fc7d90af7eccd412ef61056b825b"/><file name="Decimal.php" hash="d40a09709bda7b1011e4d2c970308638"/><file name="Price.php" hash="02dfe6d9429f0190ecf9a41f73653330"/></dir><file name="View.php" hash="cc03d4012f37b248e1b7d21c1fe9f539"/></dir><dir name="Product"><file name="List.php" hash="7a905e6f378ebfaa0604a51e066427dc"/></dir></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="4ba3d242a3343b1786cf081047650bb9"/></dir></dir><file name="Layer.php" hash="4d48db1a2b35151c363ed045646199a9"/></dir><dir name="Checkout"><dir name="Cart"><file name="Totals.php" hash="7aced913b0e0cd1622dd8d03b376327d"/></dir><dir name="Onepage"><file name="Addjs.php" hash="077d09b15ec8823c76854a575359cb1a"/><file name="Address.php" hash="bf596c77e982d4350fc532a3deb79e47"/><file name="Billing.php" hash="afc74029a0b8d571e440f50a04ab4340"/><file name="Button.php" hash="039d56b9b7982d5e32433d71f4b53959"/><file name="Shipping.php" hash="aaa1b70ecc095d297d6ab0a90f441c70"/></dir><file name="Onepage.php" hash="b02fe40ae9c73c0d1248c178a4f2d133"/></dir><file name="Form.php" hash="e16eaa258cf650bd2106372fcf43ae9b"/><dir name="GiftMessage"><dir name="Message"><file name="Inline.php" hash="8f20e9383634f46b624f15d77b616380"/></dir></dir><file name="Js.php" hash="8e8091283a5a3142fec7486077a9586e"/></dir><dir name="Controller"><file name="Abstract.php" hash="ccb6cc7460e7bbf30293983bbe61a07d"/></dir><file name="Exception.php" hash="bd30a2efecdf9a8197f066d9574cd1ab"/><dir name="Helper"><dir name="Adminhtml"><dir name="Report"><file name="Order.php" hash="9f7a02c48f3f8e0545488375b03d7333"/></dir></dir><file name="Data.php" hash="88768166f910829b2d07d07aa6169899"/><file name="Debug.php" hash="1002a59a5dee41f34da875979e907cbf"/><dir name="GiftMessage"><file name="Message.php" hash="5d1df4710b0aa3154ce0fa744b0244f3"/></dir><file name="Js.php" hash="55565b7d668b993fae6c180b30766d17"/><dir name="Product"><file name="Bundle.php" hash="c89baf5638e81d030f5a72b011af7cfd"/><file name="Configurable.php" hash="ade7d5ca64b091be916d54746ee38571"/><file name="Downloadable.php" hash="db531632adda525a91625da8d13296d6"/><file name="File.php" hash="0968c5688015b9c7a002457428607f80"/><file name="Grouped.php" hash="82db4c3d5b6ba987004a653729013149"/><file name="Media.php" hash="291003011bdca7299280ef0136089edf"/><file name="Options.php" hash="1bc8973b5a9227b0b7de93f2307c7fb9"/><file name="Review.php" hash="e415a0215a8dfbdac5ed76e6c065c705"/><file name="TierPrice.php" hash="4a7e94d83eed9e7ba47ee196b4ae15d9"/></dir><file name="Product.php" hash="7e47a84709ca16de1edb5a72ffa86117"/><dir name="Review"><file name="Bazaarvoice.php" hash="8d4517212c7e93dfc2a4c7866f86cf10"/></dir><file name="Tax.php" hash="05c99785012d55fce12c4f094385e25c"/></dir><dir name="Model"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="f058e0ced4579a556cbb969a98c7fc66"/><file name="Decimal.php" hash="849e1dbc11c99fb8f7a1f9d33e0d7908"/><file name="Price.php" hash="2bdc6f1ff06ad5aa736972c72558fd25"/></dir></dir></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="81b287f96c40094c2a3743ddc6f6c6cb"/></dir></dir></dir><dir name="Core"><file name="Session.php" hash="7c5531af03c6a98e14dda3d358270938"/></dir><file name="Dispatcher.php" hash="81004902926427ba06a1a90d6e799554"/><dir name="Magpleasure"><dir name="Tierprices"><file name="Price.php" hash="1bfd6ed086649f518b3e98436513a491"/></dir></dir><file name="Observer.php" hash="945e64f9e9a3a4e88a0aee20a2301041"/><dir name="Renderer"><file name="Json.php" hash="b7c471548eecae7c9d05072aa6695cbb"/></dir><file name="Renderer.php" hash="47c320f795f1328a8df37d4b9af56abc"/><file name="Request.php" hash="ece58a0074c2ba238c102983e05d15a8"/><dir name="Resource"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="5bd13fbb5e8012ad24dc7908bc5ea755"/><file name="Decimal.php" hash="551120b728226ed408292fac732a05d7"/><file name="Price.php" hash="321f70b515b4d3deb9c7cc58eb803bf2"/></dir></dir></dir><dir name="Report"><dir name="Order"><file name="Collection.php" hash="1c5e69f548f2b4a0da8f789d7d03b643"/></dir></dir><dir name="Sales"><dir name="Report"><dir name="Order"><dir name="Collection"><file name="Aggregated.php" hash="61848c0b80699acbf478f279231c161d"/><file name="Live.php" hash="ea323ca0eec324ece97f08ece6639fb9"/></dir></dir><file name="Order.php" hash="53641b24d23bd811c278f65b56d5765f"/></dir></dir><file name="Setup.php" hash="3a97ea2e652869965f5b47b9e3099896"/></dir><file name="Response.php" hash="7209bb2e9c5b97b2a46d10ff97aa6740"/><dir name="Rest"><dir name="Cart"><file name="Coupon.php" hash="a5be6cfe674b46b6ba290b0388edf8ad"/><file name="Update.php" hash="c9829cca23b5ada51f76c8ba1fd9f138"/></dir><file name="Cart.php" hash="39e0f2f2b7630e5884d907f42bc5e11a"/><dir name="Catalog"><dir name="Category"><file name="Assignedproducts.php" hash="6e7aa946a3aaad24b9ddb862f8ef6382"/><file name="Tree.php" hash="5dce196312e33d3f7ac4a2235312e587"/></dir><dir name="Search"><file name="Products.php" hash="8b8f43f4f563dc27002884a57d42c858"/><file name="Terms.php" hash="71cadbe1fa7b19c96f2201f087c832ff"/></dir></dir><file name="Catalog.php" hash="a71eed5f39431b40a80b06f566baa653"/><dir name="Checkout"><file name="Methods.php" hash="ce5e08ab2b5cf944c5b6b9ccc25773e0"/><file name="Onepage.php" hash="e1e04e5936867fe452a08ee5774617bf"/><file name="Redirect.php" hash="19932aa45299e5ea3995f52cb9987183"/><file name="Submit.php" hash="50ac35f8218f5c3abeb0946e138db2ae"/></dir><file name="Checkout.php" hash="514f5be707f0a1a1175b825983831705"/><dir name="Cms"><file name="Page.php" hash="93bd77b2b3f2b8b1e72a3e6391553426"/></dir><file name="Cms.php" hash="a12fd4b2a437c8a6c0b2b65a1e471c23"/><dir name="Customer"><file name="Address.php" hash="cef92ca089a5cd7cd1218339104c4894"/><file name="Edit.php" hash="226f77d8cee872c4c622c062cfe1eff0"/><file name="Group.php" hash="c717d5faf52919787aa0f87270856ca3"/><file name="List.php" hash="17f0096755be01327c163a701b9f3780"/><file name="Login.php" hash="77df1e0afcf40e6129fb61397217f053"/><dir name="Order"><file name="List.php" hash="1e6ea53a87108ca487d9a58ac42f382f"/></dir><file name="Order.php" hash="da1565601bac963b72f64b0e6a147704"/><file name="Password.php" hash="6df128903742a8723f0a59c4203f8b12"/><file name="Register.php" hash="e25d0045e0d8ff650ca208b9fe75e3ae"/></dir><file name="Customer.php" hash="ecf57dcf8bbba1ebb12ed10630bd1715"/><file name="Mage.php" hash="1d3efa624b4a9459e88dbc1a65da030a"/><dir name="Product"><file name="Crosssell.php" hash="1fbc8c3886de3703a77e911ac459422c"/><file name="List.php" hash="8d84ec9326a6747de6d2ca0a5aceee6c"/><file name="Price.php" hash="d47c9903d5719b0cee73836419e27bb1"/><file name="Purchased.php" hash="feb7fd9176da74e59722984732d04a9a"/><file name="Related.php" hash="8a6b52fc39f099f4339a91ad5709537a"/><file name="Review.php" hash="9e567623f1664186fcd325de594195a2"/><file name="Search.php" hash="9e130de2d112ee567b4756b63b050809"/><file name="Upsell.php" hash="56a4075e88a75d1cfa89e7da1130a2b4"/><file name="Url.php" hash="0372ce63d63bc5f2982a35b335643661"/><file name="Viewed.php" hash="c2a9c99a56b57d8288eec75657f9bd47"/></dir><file name="Product.php" hash="33f395e10d5578d948bf32a7bd5388fd"/><file name="Wishlist.php" hash="ee26b4efcbf3b2c39aec2c1e3402c35b"/></dir><file name="Server.php" hash="1f51d81e323af28fd78618e62db11d82"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Icon.php" hash="242de9b094f94e397dc606dc926cc33f"/><file name="Payment.php" hash="5964322419785004a6c3f84a940d8d13"/><file name="Shipping.php" hash="016f22646fbac10cd81c6b7904c9abde"/></dir><dir name="Source"><dir name="Address"><file name="Attributes.php" hash="1a29b64d271693fba3ea76599d3408e2"/><file name="Validatetype.php" hash="6f4d9767ac0e476ec6a6cd3964882721"/></dir><file name="Attributes.php" hash="4b4de29e00623c971038d6fe895e5e76"/><dir name="Bazaarvoice"><file name="Env.php" hash="bc619503d1b175e74f7eaf2ba15ae8b4"/></dir><dir name="Catalog"><file name="Direction.php" hash="68cd86444037506ec39de8eba3c07d8b"/><file name="Sortby.php" hash="d2aba9a3798b8e2eee8c275fbbd202e1"/></dir><file name="Catalogimage.php" hash="500f9994ea13e463a5e5e5d3963cfbd1"/><dir name="Customer"><file name="Attributes.php" hash="8963356aabf88647ab5ecbbbe8cfb9f1"/></dir><file name="Defaultimage.php" hash="04c896116c01b16e2ac8d7f23bbc29d6"/><file name="Payment.php" hash="70e82f4887eb297d6a58160f64bfd204"/><file name="Shipping.php" hash="7d8e5a2dc8a57099d908bef2403aad46"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Japi"><file name="LogController.php" hash="b17e024285aea7b6834cf5bc9b868916"/><file name="OrderController.php" hash="e6b7c1f5a7156a06fa3f51c32e6bbba9"/><file name="ReportController.php" hash="e88b2425e0a39f7f2b0c2902a6d2d5e9"/><file name="TroubleshootingController.php" hash="bb8951d1523a56a0f55e827614a38d66"/></dir></dir><file name="CheckoutController.php" hash="8353c64f00e22143bfc5264bcdc07998"/><dir name="Customer"><file name="AccountController.php" hash="2e055c5b22a2414263a1b7d3fd0607f9"/></dir><file name="CustomerController.php" hash="1336f9ccebf73e6e8f69d33503cd2bd7"/><file name="ImageController.php" hash="a5b48d4e075faf989c908bd0954d3878"/><file name="KcoController.php" hash="38e15112f3438edd6723478cf18c6cab"/><file name="KlarnaController.php" hash="fafb22cc7b5e2f69ee3dfb9094a04dcd"/><dir name="Rest"><file name="CartController.php" hash="3994aafe8e31094b765fc0120c888fa3"/><file name="CatalogController.php" hash="8df5b798bb0330f5e3182717e1e15bf7"/><file name="CheckoutController.php" hash="2fd4a4bca1a37788616645f50392a701"/><file name="CmsController.php" hash="cb1bc3f67136434c4d8af1b5660eab1e"/><file name="CustomerController.php" hash="ca2b76f8f4e8a84d81749b37910287bd"/><file name="MageController.php" hash="e267156b2acf82d309b6c8c4680a7371"/><file name="ProductController.php" hash="81c0a0b0afcdfe99d6c651244baa075c"/><file name="WishlistController.php" hash="d7b0c8ff628b4244d120843d54a41248"/></dir><file name="TestController.php" hash="ffb60653808c0e0af00cc73d4755ef99"/></dir><dir name="data"><dir name="japi_setup"><file name="data-install-2.0.0.php" hash="bcf6de66f6b296182268b11b3e80bbeb"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="9d1888abb4ed93ec7b3e1fa678fb1411"/><file name="config.xml" hash="8431bfcbd4be1ec2bc7d5b5a554ff6d7"/><file name="system.xml" hash="bd364c37de5d5b2e04cab5875b66d583"/></dir><dir name="sql"><dir name="japi_setup"><file name="install-1.0.0.php" hash="ce407ff5715c837d02b1aba7975bf512"/><file name="upgrade-2.0.1.2-2.0.2.php" hash="6fc0e0306b685279fc60f298643d181a"/><file name="upgrade-2.1.6-2.2.0.php" hash="947afcf7e20dfc2c3a3e45d8e5c316cd"/><file name="upgrade-2.2.0-2.2.1.php" hash="12a28845acf823eefc5f613b048efe52"/><file name="upgrade-2.8.2-2.9.0.php" hash="2761423f65920af0f8ba05d438710869"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Jmango360_Japi.xml" hash="b60701b3a14084fa1a440ca5fe5bf47b"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="jmango360_japi.xml" hash="d6e1656e4a8e79dd9e37e0b09a5f57a6"/></dir><dir name="template"><dir name="japi"><dir name="report"><file name="chart.phtml" hash="102704d97cf69793a50fa96538bd767f"/><dir name="grid"><file name="container.phtml" hash="79050f4e2bc7b70ae452e850fc27e0b7"/></dir></dir><dir name="widget"><dir name="form"><dir name="renderer"><dir name="element"><file name="chart.phtml" hash="fb14be221a9ec0faad4ace8579c5dddc"/></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="jmango360_japi.xml" hash="f7ec8e2011c45addbe22c548d5800bf3"/></dir><dir name="template"><dir name="japi"><dir name="TIG"><dir name="PostNL"><dir name="av"><dir name="checkout"><dir name="onepage"><file name="billing.phtml" hash="0cb781955d33fae46da09d62bd6fdaf3"/><file name="shipping.phtml" hash="cb72f56f0d26171c429d7a70701e0913"/></dir></dir><dir name="customer"><dir name="address"><file name="edit.phtml" hash="9a623e8c2184d08c2b288456ba50aef4"/><file name="postcode_check.phtml" hash="cbb8bfd76db65041cafacf976312ceb7"/></dir></dir></dir><dir name="do"><dir name="onepage"><file name="available.phtml" hash="8fce41a1696540a4546b52c025f3dde7"/></dir></dir></dir></dir><dir name="checkout"><dir name="onepage"><file name="address.phtml" hash="3164ff4fc2d5f798e591a168d9d937d1"/><file name="agreements.phtml" hash="ae43c3b670b0d11a1217ca927a184ff7"/><file name="billing.phtml" hash="d5491399cbce3e565757023dc3e594ed"/><file name="coupon.phtml" hash="a27beeba5f8b2160dccc6d4198c6517d"/><file name="js.phtml" hash="ac1740fe3e829d228a57b1e1a9dda58b"/><dir name="payment"><file name="info.phtml" hash="26bb640843ee3fb6e72b4f2739f0a111"/><file name="methods.phtml" hash="1680b5e33d8123fdb58ecbd353ff1ba7"/></dir><file name="payment.phtml" hash="cc3bfd21f2a141ea403db094e1264781"/><dir name="review"><file name="button.phtml" hash="e2089ae34e409df2fa13977a55db5f04"/><file name="info.phtml" hash="54ea567e7273a0942fcdddfb95340e8e"/><file name="item.phtml" hash="244bba60d9151be71777e80e138b6ee7"/><file name="totals.phtml" hash="0decbe242701193fee270e1f0f520a93"/></dir><file name="review.phtml" hash="d2494b8faac5833e747a5d329ee4fab7"/><file name="shipping.phtml" hash="d0aba8dade93f6798285f7163ec65e58"/><dir name="shipping_method"><file name="additional.phtml" hash="78c6dab72fefb888f587221639bf9177"/><file name="available.phtml" hash="4feca53deabec45bc3b223e64e32c4f0"/></dir><file name="shipping_method.phtml" hash="edc75d0aecc103ed69b216ef76bc6af2"/><file name="style.phtml" hash="3a5e56f8a42b81291ae25beb36a0994a"/></dir><file name="onepage.phtml" hash="733ad23bfa6442a5fcab8c9a6bbf1b88"/></dir><dir name="customer"><dir name="address"><file name="edit.phtml" hash="900db1b8385f75e448f7ca42c8d113da"/></dir><dir name="form"><file name="edit.phtml" hash="484b2b56cbf34dba73c78dc97552c024"/><file name="register.phtml" hash="978dc0d67f796c90e8675cbaec1a06ba"/></dir></dir><dir name="fatturazione"><dir name="customer"><dir name="address"><file name="edit.phtml" hash="e7f27a8a61d9554bfbc4f36dfff60e4d"/></dir></dir></dir><file name="form.phtml" hash="eec0416c8830c4ebe004256d86c7ea59"/><dir name="giftmessage"><file name="inline.phtml" hash="78814da47aed68315b7d1d6b2e64c4c7"/></dir><file name="js.phtml" hash="9af5ac67d9b1a4fc689084e135215f99"/><dir name="kega_checkout"><dir name="onepage"><file name="payment.phtml" hash="36ceb7a03629f08c789f42e98b1c1535"/></dir></dir><dir name="nwt"><dir name="kco"><dir name="cart"><dir name="item"><file name="default.phtml" hash="212018e8f0c4472a07fc81633d27c550"/></dir></dir><file name="checkout.phtml" hash="c7781347405e7e59322d9fc3b2f42b3c"/></dir></dir><dir name="page"><dir name="html"><file name="head.phtml" hash="b6a8cc30cd31bf642c2f885ed1fda855"/><file name="smart-app-banner.phtml" hash="8423731f246db33efb61026dd9ef5ddc"/></dir><file name="rwd.phtml" hash="06c53b02ad843574b22a803a709988f6"/></dir><dir name="symfony"><dir name="postcode"><dir name="checkout"><dir name="onepage"><file name="billing.phtml" hash="65181e0ab40a40671f35c54bc25b99af"/><file name="shipping.phtml" hash="a6e2a192b9998889e5d113a92df62623"/></dir></dir></dir></dir><dir name="vaimo"><dir name="klarna"><dir name="klarnacheckout"><dir name="cart"><dir name="item"><file name="default.phtml" hash="f9f469de9cd1243cab176fc56071db64"/></dir></dir><file name="cart.phtml" hash="b40f17348beb248c4f1ff22374a1a05d"/><dir name="customer"><file name="balance.phtml" hash="198809cb8ebf8a468b89497c9abba07c"/></dir><dir name="discount"><file name="coupon.phtml" hash="1f3686b00a610d3f038c84e3621ef913"/></dir><file name="header.phtml" hash="fed93df0c84265a0f980b0de103945b8"/><file name="main.phtml" hash="94ad4f3aa30ae7db1131a1fe48ea2a99"/><file name="newsletter.phtml" hash="3a2251b9559e8b87b46ddf08b7cd27e2"/><file name="reward.phtml" hash="38c218d3777f11b03c3686067a706d00"/><file name="shipping_method.phtml" hash="44bb3c6efaab76641e02a07c2007a090"/><file name="sidebar.phtml" hash="410508fd9089e0be030915836abb42e2"/></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="japi"><dir name="css"><dir name="TIG"><dir name="Buckaroo3Extended"><file name="styles_opc.css" hash="9b0ecbbeb22655e2e896ec8134fa8188"/></dir></dir><file name="gomage-checkout.css" hash="223657dbb0aba2783bb9e8de4b633d93"/><dir name="icomoon"><dir name="fonts"><file name="icomoon.eot" hash="842065e274d718c38968a81a721d49f4"/><file name="icomoon.svg" hash="2deea3fcd9ecc464a422aa37943b5848"/><file name="icomoon.ttf" hash="8ffbfccd78de7c37eadeca837ee40344"/><file name="icomoon.woff" hash="32df67c3aed8769c316b3e7ff1bb637c"/></dir><file name="style.css" hash="178c956df2a327dc88e4ef8069caa9bc"/></dir><file name="send-cloud.css" hash="77f77fa89359fe508708ec522a5e76d8"/><file name="style.css" hash="3081e381eebd5625991ef2446443c832"/><file name="style.less" hash="94313ccbd1f43acc928624fc09ef6e52"/></dir><dir name="images"><file name="ajax-loader.gif" hash="f48ee069890b16455c3ddcacee9b5f75"/><file name="bg-down.png" hash="04d7cd2963010b610f608aca03a45c63"/><file name="bg-up.png" hash="2882d38108532275fb1d425bbd021c9d"/><file name="glc_sprite.png" hash="5cd6f3ba1df3a6d26db5bbc193ce9c61"/></dir><dir name="js"><file name="checkout.js" hash="95784759f7fa39bbac4dc1b10347585e"/><dir name="vaimo"><dir name="klarna"><file name="klarnautils.js" hash="e29553aa8446af7672c9ba1814fac3a5"/></dir></dir><dir name="varien"><file name="form.js" hash="9abc0bb4419828513b5c6e904a041616"/></dir></dir><dir name="lib"><dir name="bootstrap"><dir name="css"><file name="bootstrap.min.css" hash="5d5357cb3704e1f43a1f5bfed2aebf42"/></dir><dir name="fonts"><file name="glyphicons-halflings-regular.eot" hash="f4769f9bdb7466be65088239c12046d1"/><file name="glyphicons-halflings-regular.svg" hash="89889688147bd7575d6327160d64e760"/><file name="glyphicons-halflings-regular.ttf" hash="e18bbf611f2a2e43afc071aa2f4e1512"/><file name="glyphicons-halflings-regular.woff" hash="fa2772327f55d8198301fdb8bcfc8158"/><file name="glyphicons-halflings-regular.woff2" hash="448c34a56d699c29117adc64c43affeb"/></dir><dir name="js"><file name="collapse.js" hash="2bc99ca6c9b060ba5616f41ddd5e2703"/><file name="modal.js" hash="b7d8f688e67e78c07ffde44ec4248fd9"/><file name="transition.js" hash="3cb001675410903ecaadcfeb7c296965"/></dir></dir><dir name="jquery"><file name="jquery-1.11.2.min.js" hash="5790ead7ad3ba27397aedfa3d263b867"/><file name="jquery-noconflict.js" hash="32eb0a33820167f328a227e11210d32a"/></dir><dir name="ladda"><file name="ladda.min.css" hash="614e769024385cf21879d6a238b682e1"/><file name="ladda.min.js" hash="a34bcf417de7fc290ac5b034caca2371"/></dir><dir name="scrollto"><file name="scrollTo.js" hash="5c86793da8a4bfec6338bec965d35f6b"/></dir><dir name="smart-app-banner"><file name="smart-app-banner.css" hash="64c15053dbd22b44a519f55e75f6c2ca"/><file name="smart-app-banner.js" hash="4162cb20424080964b5d886125b73b47"/></dir><dir name="spin"><file name="spin.min.js" hash="1d06ceb800acbeae82d1fa2ad5b571de"/></dir></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="Jmango360_Japi.csv" hash="f6bcc8de631311da22d0097b4508d420"/></dir><dir name="fr_FR"><file name="Jmango360_Japi.csv" hash="18a1f2a8dfca8ba4a2cb98d2e7deb0a1"/></dir><dir name="it_IT"><file name="Jmango360_Japi.csv" hash="1c43aa2f566cd1b2edeaa1e544d1133f"/></dir><dir name="pt_PT"><file name="Jmango360_Japi.csv" hash="31398310d2400a9a1abc548345831778"/></dir><dir name="pt_BR"><file name="Jmango360_Japi.csv" hash="31398310d2400a9a1abc548345831778"/></dir><dir name="ar_SA"><file name="Jmango360_Japi.csv" hash="25b829fa5515c567af7ed8e5e4a2690a"/></dir><dir name="nl_NL"><file name="Jmango360_Japi.csv" hash="0d7d58f3ece899e82406432c4d50a74e"/></dir><dir name="sv_SE"><file name="Jmango360_Japi.csv" hash="3414d54579206e71cabaaea3153bc266"/></dir><dir name="da_DK"><file name="Jmango360_Japi.csv" hash="a8f243d230a312f4d5cee8c99a275ee7"/></dir><dir name="es_ES"><file name="Jmango360_Japi.csv" hash="0f763b984f64e095f863c2e66335c791"/></dir><dir name="de_DE"><file name="Jmango360_Japi.csv" hash="d97408dc0ece1a193669bc491798355a"/></dir></target></contents>
37
  <compatible/>
38
  <dependencies><required><php><min>5.2.0</min><max>7.1.0</max></php></required></dependencies>
39
  </package>
skin/frontend/base/default/japi/css/style.css CHANGED
@@ -551,6 +551,50 @@ span.price {
551
  #checkout-step-shipping textarea {
552
  background: #fafafa;
553
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
554
  .no-display {
555
  display: none;
556
  }
@@ -1432,7 +1476,7 @@ span.price {
1432
  display: block;
1433
  }
1434
  /**** Chronopost_Chronorelais ****/
1435
- label[for="s_method_chronorelais_Chronopost_relais_France_2"] {
1436
  display: inline;
1437
  }
1438
  .chronorelais-list .chronorelaismap .mappostalcode {
551
  #checkout-step-shipping textarea {
552
  background: #fafafa;
553
  }
554
+ #checkout-step-billing label[for="shipping-address-select"] + div.input-box,
555
+ #checkout-step-shipping label[for="shipping-address-select"] + div.input-box,
556
+ #checkout-step-billing label[for="billing-address-select"] + div.input-box,
557
+ #checkout-step-shipping label[for="billing-address-select"] + div.input-box {
558
+ display: table;
559
+ width: 100%;
560
+ }
561
+ #checkout-step-billing label[for="shipping-address-select"] + div.input-box select.address-select,
562
+ #checkout-step-shipping label[for="shipping-address-select"] + div.input-box select.address-select,
563
+ #checkout-step-billing label[for="billing-address-select"] + div.input-box select.address-select,
564
+ #checkout-step-shipping label[for="billing-address-select"] + div.input-box select.address-select,
565
+ #checkout-step-billing label[for="shipping-address-select"] + div.input-box .japi-address-edit,
566
+ #checkout-step-shipping label[for="shipping-address-select"] + div.input-box .japi-address-edit,
567
+ #checkout-step-billing label[for="billing-address-select"] + div.input-box .japi-address-edit,
568
+ #checkout-step-shipping label[for="billing-address-select"] + div.input-box .japi-address-edit {
569
+ display: table-cell;
570
+ width: 100%;
571
+ height: 31px;
572
+ }
573
+ #checkout-step-billing label[for="shipping-address-select"] + div.input-box .japi-address-edit,
574
+ #checkout-step-shipping label[for="shipping-address-select"] + div.input-box .japi-address-edit,
575
+ #checkout-step-billing label[for="billing-address-select"] + div.input-box .japi-address-edit,
576
+ #checkout-step-shipping label[for="billing-address-select"] + div.input-box .japi-address-edit {
577
+ width: 50px;
578
+ text-align: center;
579
+ vertical-align: middle;
580
+ padding: 0 0 0 5px;
581
+ }
582
+ #checkout-step-billing label[for="shipping-address-select"] + div.input-box .japi-address-edit a,
583
+ #checkout-step-shipping label[for="shipping-address-select"] + div.input-box .japi-address-edit a,
584
+ #checkout-step-billing label[for="billing-address-select"] + div.input-box .japi-address-edit a,
585
+ #checkout-step-shipping label[for="billing-address-select"] + div.input-box .japi-address-edit a {
586
+ display: block;
587
+ border-radius: 4px;
588
+ height: 31px;
589
+ line-height: 30px;
590
+ background: #d3d3d3;
591
+ color: #333;
592
+ }
593
+ button.button-cancel {
594
+ background: transparent !important;
595
+ border: 1px solid #dadada !important;
596
+ margin-top: 5px !important;
597
+ }
598
  .no-display {
599
  display: none;
600
  }
1476
  display: block;
1477
  }
1478
  /**** Chronopost_Chronorelais ****/
1479
+ label[for^="s_method_chronorelais_Chronopost_relais_France"] {
1480
  display: inline;
1481
  }
1482
  .chronorelais-list .chronorelaismap .mappostalcode {
skin/frontend/base/default/japi/css/style.less CHANGED
@@ -656,6 +656,40 @@ span.price {
656
  input[type="text"], input[type="password"] select, textarea {
657
  background: #fafafa;
658
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  }
660
 
661
  .no-display {
@@ -1728,7 +1762,7 @@ span.price {
1728
  }
1729
 
1730
  /**** Chronopost_Chronorelais ****/
1731
- label[for="s_method_chronorelais_Chronopost_relais_France_2"] {
1732
  display: inline;
1733
  }
1734
 
656
  input[type="text"], input[type="password"] select, textarea {
657
  background: #fafafa;
658
  }
659
+
660
+ label[for="shipping-address-select"] + div.input-box,
661
+ label[for="billing-address-select"] + div.input-box {
662
+ display: table;
663
+ width: 100%;
664
+
665
+ select.address-select, .japi-address-edit {
666
+ display: table-cell;
667
+ width: 100%;
668
+ height: 31px;
669
+ }
670
+
671
+ .japi-address-edit {
672
+ width: 50px;
673
+ text-align: center;
674
+ vertical-align: middle;
675
+ padding: 0 0 0 5px;
676
+
677
+ a {
678
+ display: block;
679
+ border-radius: 4px;
680
+ height: 31px;
681
+ line-height: 30px;
682
+ background: #d3d3d3;
683
+ color: #333;
684
+ }
685
+ }
686
+ }
687
+ }
688
+
689
+ button.button-cancel {
690
+ background: transparent !important;
691
+ border: 1px solid #dadada !important;
692
+ margin-top: 5px !important;
693
  }
694
 
695
  .no-display {
1762
  }
1763
 
1764
  /**** Chronopost_Chronorelais ****/
1765
+ label[for^="s_method_chronorelais_Chronopost_relais_France"] {
1766
  display: inline;
1767
  }
1768
 
skin/frontend/base/default/japi/js/checkout.js CHANGED
@@ -6,10 +6,12 @@ if (!window.toogleVisibilityOnObjects) {
6
  var toogleVisibilityOnObjects = function (source, objects) {
7
  if ($(source) && $(source).checked) {
8
  objects.each(function (item) {
9
- $(item).show();
10
- $$('#' + item + ' .input-text').each(function (item) {
11
- item.removeClassName('validation-passed');
12
- });
 
 
13
  });
14
  } else {
15
  objects.each(function (item) {
@@ -39,18 +41,36 @@ if (!window.toogleVisibilityOnObjects) {
39
  if (!window.toogleVisibility) {
40
  var toogleVisibility = function (objects, show) {
41
  objects.each(function (item) {
42
- if (show) {
43
- $(item).show();
44
- $(item).removeClassName('no-display');
45
- }
46
- else {
47
- $(item).hide();
48
- $(item).addClassName('no-display');
 
49
  }
50
  });
51
  }
52
  }
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  if (typeof Checkout !== "undefined") {
55
  var JMCheckout = Class.create(Checkout, {
56
  initialize: function (accordion, urls) {
@@ -60,6 +80,7 @@ if (typeof Checkout !== "undefined") {
60
  this.saveMethodUrl = urls.saveMethod;
61
  this.failureUrl = urls.failure;
62
  this.shippingMethodUrl = urls.shippingMethodUrl;
 
63
  this.billingForm = false;
64
  this.shippingForm = false;
65
  this.syncBillingShipping = false;
@@ -111,6 +132,32 @@ if (typeof Checkout !== "undefined") {
111
  document.on('click', '#edit-shipping-method', function () {
112
  this.gotoSection('shipping_method');
113
  }.bind(this));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  },
115
 
116
  setLoadWaiting: function (step, keepDisabled) {
6
  var toogleVisibilityOnObjects = function (source, objects) {
7
  if ($(source) && $(source).checked) {
8
  objects.each(function (item) {
9
+ if ($(item)) {
10
+ $(item).show();
11
+ $$('#' + item + ' .input-text').each(function (item) {
12
+ item.removeClassName('validation-passed');
13
+ });
14
+ }
15
  });
16
  } else {
17
  objects.each(function (item) {
41
  if (!window.toogleVisibility) {
42
  var toogleVisibility = function (objects, show) {
43
  objects.each(function (item) {
44
+ if ($(item)) {
45
+ if (show) {
46
+ $(item).show();
47
+ $(item).removeClassName('no-display');
48
+ } else {
49
+ $(item).hide();
50
+ $(item).addClassName('no-display');
51
+ }
52
  }
53
  });
54
  }
55
  }
56
 
57
+ if (!window.toogleRequired) {
58
+ var toogleRequired = function (source, objects) {
59
+ if (!$(source).value.blank()) {
60
+ objects.each(function (item) {
61
+ $(item) && $(item).addClassName('required-entry');
62
+ });
63
+ } else {
64
+ objects.each(function (item) {
65
+ if (typeof shippingMethod != 'undefined' && shippingMethod.validator) {
66
+ shippingMethod.validator.reset(item);
67
+ }
68
+ $(item) && $(item).removeClassName('required-entry');
69
+ });
70
+ }
71
+ }
72
+ }
73
+
74
  if (typeof Checkout !== "undefined") {
75
  var JMCheckout = Class.create(Checkout, {
76
  initialize: function (accordion, urls) {
80
  this.saveMethodUrl = urls.saveMethod;
81
  this.failureUrl = urls.failure;
82
  this.shippingMethodUrl = urls.shippingMethodUrl;
83
+ this.editAddressUrl = urls.editAddressUrl;
84
  this.billingForm = false;
85
  this.shippingForm = false;
86
  this.syncBillingShipping = false;
132
  document.on('click', '#edit-shipping-method', function () {
133
  this.gotoSection('shipping_method');
134
  }.bind(this));
135
+
136
+ document.on('click', '.japi-address-edit-btn', function (e, btn) {
137
+ this.gotoEditAddress(btn);
138
+ }.bind(this))
139
+ },
140
+
141
+ gotoEditAddress: function (btn) {
142
+ var addressSelect = $(btn).up('form').down('select.address-select');
143
+ if (addressSelect) {
144
+ var type;
145
+ if (addressSelect.getAttribute('name').indexOf('billing') > -1) {
146
+ type = 'billing';
147
+ } else if (addressSelect.getAttribute('name').indexOf('shipping') > -1) {
148
+ type = 'shipping';
149
+ }
150
+ var addressId = addressSelect.getValue();
151
+ if (addressId) {
152
+ var url = this.editAddressUrl;
153
+ if (url.indexOf('?') > -1) {
154
+ url += '&';
155
+ } else {
156
+ url += '?';
157
+ }
158
+ window.location.href = url + 'id=' + addressId + '&is_checkout=1&type=' + type;
159
+ }
160
+ }
161
  },
162
 
163
  setLoadWaiting: function (step, keepDisabled) {