ZooZ_payment - Version 3.0.0.1

Version Notes

Added two new cards

Download this release

Release Info

Developer CreativeMinds
Extension ZooZ_payment
Version 3.0.0.1
Comparing to
See all releases


Code changes from version 2.0.8 to 3.0.0.1

Files changed (96) hide show
  1. app/code/community/ZooZ/ZoozPayment/Block/Abstract.php +0 -70
  2. app/code/community/ZooZ/ZoozPayment/Block/Estimate.php +0 -95
  3. app/code/community/ZooZ/ZoozPayment/Block/Estimate/Abstract.php +0 -69
  4. app/code/community/ZooZ/ZoozPayment/Block/Estimate/Result.php +0 -95
  5. app/code/community/ZooZ/ZoozPayment/Block/Index.php +0 -8
  6. app/code/community/ZooZ/ZoozPayment/Helper/Carrier.php +0 -95
  7. app/code/community/ZooZ/ZoozPayment/Helper/Data.php +0 -28
  8. app/code/community/ZooZ/ZoozPayment/Helper/Sanbox.php +0 -31
  9. app/code/community/ZooZ/ZoozPayment/Model/Estimate.php +0 -238
  10. app/code/community/ZooZ/ZoozPayment/Model/Observer.php +0 -247
  11. app/code/community/ZooZ/ZoozPayment/Model/Order.php +0 -191
  12. app/code/community/ZooZ/ZoozPayment/Model/Session.php +0 -30
  13. app/code/community/ZooZ/ZoozPayment/Model/Source/Action.php +0 -18
  14. app/code/community/ZooZ/ZoozPayment/Model/Source/Status.php +0 -18
  15. app/code/community/ZooZ/ZoozPayment/Model/Standard.php +0 -739
  16. app/code/community/ZooZ/ZoozPayment/controllers/CartController.php +0 -85
  17. app/code/community/ZooZ/ZoozPayment/controllers/EstimateController.php +0 -156
  18. app/code/community/ZooZ/ZoozPayment/controllers/IndexController.php +0 -88
  19. app/code/community/ZooZ/ZoozPayment/controllers/StandardController.php +0 -151
  20. app/code/community/ZooZ/ZoozPayment/etc/config.xml +0 -77
  21. app/code/community/ZooZ/ZoozPayment/etc/system.xml +0 -119
  22. app/code/community/Zooz/Payments/Block/Customer/Creditcard.php +169 -0
  23. app/code/community/Zooz/Payments/Block/Form/Payments.php +146 -0
  24. app/code/community/Zooz/Payments/Block/Info/Payments.php +96 -0
  25. app/code/community/Zooz/Payments/Exception.php +33 -0
  26. app/code/community/Zooz/Payments/Helper/Data.php +1229 -0
  27. app/code/community/Zooz/Payments/Model/Api.php +477 -0
  28. app/code/community/Zooz/Payments/Model/Config.php +322 -0
  29. app/code/community/Zooz/Payments/Model/Info.php +37 -0
  30. app/code/community/Zooz/Payments/Model/Ipn.php +338 -0
  31. app/code/community/Zooz/Payments/Model/Mysql4/Debug.php +15 -0
  32. app/code/community/Zooz/Payments/Model/Observer.php +57 -0
  33. app/code/community/Zooz/Payments/Model/Payments.php +1077 -0
  34. app/code/community/Zooz/Payments/Model/Payments/Cards.php +190 -0
  35. app/code/community/Zooz/Payments/Model/Payments/Request.php +13 -0
  36. app/code/community/Zooz/Payments/Model/Payments/Result.php +12 -0
  37. app/code/community/Zooz/Payments/Model/Payments/Source/Cctype.php +42 -0
  38. app/code/community/Zooz/Payments/Model/Payments/Source/PaymentAction.php +27 -0
  39. app/code/community/Zooz/Payments/Model/Payments/Source/PaymentMode.php +27 -0
  40. app/code/community/Zooz/Payments/Model/Resource/Payments.php +20 -0
  41. app/code/community/Zooz/Payments/Model/Resource/Payments/Collection.php +20 -0
  42. app/code/community/Zooz/Payments/UnavailableException.php +12 -0
  43. app/code/community/Zooz/Payments/controllers/Adminhtml/Zooz/PaymentController.php +70 -0
  44. app/code/community/Zooz/Payments/controllers/CustomerController.php +198 -0
  45. app/code/community/Zooz/Payments/controllers/IpnController.php +40 -0
  46. app/code/community/Zooz/Payments/controllers/PaymentController.php +78 -0
  47. app/code/community/Zooz/Payments/etc/config.xml +180 -0
  48. app/code/community/Zooz/Payments/etc/system.xml +162 -0
  49. app/code/community/Zooz/Payments/sql/payments_setup/install-1.0.0.0.php +20 -0
  50. app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.0-1.0.0.1.php +22 -0
  51. app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.1-1.0.0.2.php +22 -0
  52. app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.2-1.0.0.3.php +22 -0
  53. app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.3-1.0.0.4.php +18 -0
  54. app/design/adminhtml/default/default/template/zoozpayments/form/payments.phtml +56 -0
  55. app/design/adminhtml/default/default/template/zoozpayments/info/payments.phtml +38 -0
  56. app/design/adminhtml/default/default/template/zoozpayments/info/pdf.phtml +25 -0
  57. app/design/frontend/base/default/layout/payments.xml +53 -0
  58. app/design/frontend/base/default/template/zoozpayments/.DS_Store +0 -0
  59. app/design/frontend/base/default/template/zoozpayments/checkout/.DS_Store +0 -0
  60. app/design/frontend/base/default/template/zoozpayments/checkout/onepage/payment.phtml +206 -0
  61. app/design/frontend/base/default/template/zoozpayments/customer/creditcard/edit.phtml +151 -0
  62. app/design/frontend/base/default/template/zoozpayments/customer/creditcard/iframe.phtml +16 -0
  63. app/design/frontend/base/default/template/zoozpayments/customer/creditcard/list.phtml +242 -0
  64. app/design/frontend/base/default/template/zoozpayments/form/payments.phtml +134 -0
  65. app/design/frontend/base/default/template/zoozpayments/form/payments/data.phtml +1 -0
  66. app/design/frontend/base/default/template/zoozpayments/form/payments/iframe.phtml +23 -0
  67. app/design/frontend/base/default/template/zoozpayments/form/payments/new.phtml +85 -0
  68. app/design/frontend/base/default/template/zoozpayments/form/payments/saved.phtml +19 -0
  69. app/design/frontend/base/default/template/zoozpayments/info/payments.phtml +38 -0
  70. app/design/frontend/base/default/template/zoozpayments/redirect.phtml +11 -0
  71. app/design/frontend/default/default/layout/zoozpayment.xml +0 -75
  72. app/design/frontend/default/default/template/zoozpayment/index.phtml +0 -28
  73. app/design/frontend/default/default/template/zoozpayment/result.phtml +0 -25
  74. app/design/frontend/default/default/template/zoozpayment/review.phtml +0 -141
  75. app/design/frontend/default/default/template/zoozpayment/shortcut-checkout.phtml +0 -19
  76. app/design/frontend/default/default/template/zoozpayment/shortcut.phtml +0 -22
  77. app/design/frontend/default/default/template/zoozpayment/sidebar.phtml +0 -99
  78. app/etc/modules/ZooZ_ZoozPayment.xml +0 -10
  79. app/etc/modules/Zooz_Payments.xml +19 -0
  80. js/zoozpayments/jquery.creditCardValidator.js +220 -0
  81. lib/zooz/address.php +0 -48
  82. lib/zooz/invoice.item.php +0 -29
  83. lib/zooz/invoice.php +0 -42
  84. lib/zooz/nvps.php +0 -30
  85. lib/zooz/transaction.details.php +0 -68
  86. lib/zooz/user.details.php +0 -37
  87. lib/zooz/zooz.exception.php +0 -10
  88. lib/zooz/zooz.extended.server.api.php +0 -240
  89. package.xml +10 -10
  90. skin/frontend/base/default/css/zoozpayments/sprite-credit-card-types.png +0 -0
  91. skin/frontend/base/default/css/zoozpayments/zooz-cc.png +0 -0
  92. skin/frontend/base/default/css/zoozpayments/zoozpayments.css +240 -0
  93. skin/frontend/base/default/zooz/images/fastcheckout.png +0 -0
  94. skin/frontend/base/default/zooz/images/loading.gif +0 -0
  95. skin/frontend/base/default/zooz/js/jquery-1.9.0.min.js +0 -6
  96. skin/frontend/base/default/zooz/js/zooz-magento.js +0 -31
app/code/community/ZooZ/ZoozPayment/Block/Abstract.php DELETED
@@ -1,70 +0,0 @@
1
- <?php
2
-
3
-
4
- /**
5
- * Abstract block for estimate module
6
- *
7
- */
8
- abstract class ZooZ_ZoozPayment_Block_Abstract extends Mage_Catalog_Block_Product_Abstract
9
- {
10
-
11
- protected $_estimate = null;
12
-
13
-
14
-
15
- protected $_config = null;
16
-
17
-
18
- protected $_session = null;
19
-
20
-
21
- protected $_carriers = null;
22
-
23
- public function getEstimate()
24
- {
25
- if ($this->_estimate === null) {
26
- $this->_estimate = Mage::getSingleton('zoozpayment/estimate');
27
- }
28
-
29
- return $this->_estimate;
30
- }
31
-
32
- /**
33
- * Retrieve configuration model for module
34
- *
35
- * @return Lotus_Getshipping_Model_Config
36
- */
37
- public function getConfig()
38
- {
39
- if ($this->_config === null) {
40
- $this->_config = Mage::getSingleton('zoozpayment/config');
41
- }
42
-
43
- return $this->_config;
44
- }
45
-
46
- /**
47
- * Retrieve session model object
48
- *
49
- * @return Lotus_Getshipping_Model_Session
50
- */
51
- public function getSession()
52
- {
53
-
54
- if ($this->_session === null) {
55
- $this->_session = Mage::getSingleton('zoozpayment/session');
56
- }
57
-
58
- return $this->_session;
59
- }
60
-
61
- /**
62
- * Check is enabled functionality
63
- *
64
- * @return boolean
65
- */
66
- public function isEnabled()
67
- {
68
- return $this->getConfig()->isEnabled() && !$this->getProduct()->isVirtual();
69
- }
70
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Block/Estimate.php DELETED
@@ -1,95 +0,0 @@
1
- <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- *
12
- * @category EcomDev
13
- * @package Lotus_Getshipping
14
- * @copyright Copyright (c) 2010 Ecommerce Developer Blog (http://www.ecomdev.org)
15
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
16
- */
17
-
18
- /**
19
- * Estiamtion results block
20
- *
21
- *
22
- */
23
- class ZooZ_ZoozPayment_Block_Estimate extends ZooZ_ZoozPayment_Block_Abstract
24
- {
25
-
26
- /**
27
- * Retrieves result from estimate model
28
- *
29
- * @return array|null
30
- */
31
- public function getResult()
32
- {
33
- return $this->getEstimate()->getResult();
34
- }
35
-
36
- /**
37
- * Check result existance
38
- *
39
- * @return boolean
40
- */
41
- public function hasResult()
42
- {
43
- return $this->getResult() !== null;
44
- }
45
-
46
- /**
47
- * Retrieve carrier name for shipping rate group
48
- *
49
- * @param string $code
50
- * @return string|null
51
- */
52
- public function getCarrierName($code)
53
- {
54
- $carrier = Mage::getSingleton('shipping/config')->getCarrierInstance($code);
55
- if ($carrier) {
56
- return $carrier->getConfigData('title');
57
- }
58
-
59
- return null;
60
- }
61
-
62
- /**
63
- * Retrieve shipping price for current address and rate
64
- *
65
- * @param decimal $price
66
- * @param boolean $flag show include tax price flag
67
- * @return string
68
- */
69
- public function getShippingPrice($price, $flag)
70
- {
71
- return $this->formatPrice(
72
- $this->helper('tax')->getShippingPrice(
73
- $price,
74
- $flag,
75
- $this->getEstimate()
76
- ->getQuote()
77
- ->getShippingAddress()
78
- )
79
- );
80
- }
81
-
82
- /**
83
- * Format price value depends on store settings
84
- *
85
- * @param decimal $price
86
- * @return string
87
- */
88
- public function formatPrice($price)
89
- {
90
- return $this->getEstimate()
91
- ->getQuote()
92
- ->getStore()
93
- ->convertPrice($price, true);
94
- }
95
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Block/Estimate/Abstract.php DELETED
@@ -1,69 +0,0 @@
1
- <?php
2
-
3
-
4
- /**
5
- * Abstract block for estimate module
6
- *
7
- */
8
- abstract class ZooZ_ZoozPayment_Block_Estimate_Abstract extends Mage_Catalog_Block_Product_Abstract
9
- {
10
-
11
- protected $_estimate = null;
12
-
13
-
14
-
15
- protected $_config = null;
16
-
17
-
18
- protected $_session = null;
19
-
20
-
21
- protected $_carriers = null;
22
-
23
- public function getEstimate()
24
- {
25
- if ($this->_estimate === null) {
26
- $this->_estimate = Mage::getSingleton('zoozpayment/estimate');
27
- }
28
-
29
- return $this->_estimate;
30
- }
31
-
32
- /**
33
- * Retrieve configuration model for module
34
- *
35
- * @return Lotus_Getshipping_Model_Config
36
- */
37
- public function getConfig()
38
- {
39
- if ($this->_config === null) {
40
- $this->_config = Mage::getSingleton('zoozpayment/config');
41
- }
42
-
43
- return $this->_config;
44
- }
45
-
46
- /**
47
- * Retrieve session model object
48
- *
49
- * @return Lotus_Getshipping_Model_Session
50
- */
51
- public function getSession()
52
- {
53
- if ($this->_session === null) {
54
- $this->_session = Mage::getSingleton('zoozpayment/session');
55
- }
56
-
57
- return $this->_session;
58
- }
59
-
60
- /**
61
- * Check is enabled functionality
62
- *
63
- * @return boolean
64
- */
65
- public function isEnabled()
66
- {
67
- return $this->getConfig()->isEnabled() && !$this->getProduct()->isVirtual();
68
- }
69
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Block/Estimate/Result.php DELETED
@@ -1,95 +0,0 @@
1
- <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- *
12
- * @category EcomDev
13
- * @package Lotus_Getshipping
14
- * @copyright Copyright (c) 2010 Ecommerce Developer Blog (http://www.ecomdev.org)
15
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
16
- */
17
-
18
- /**
19
- * Estiamtion results block
20
- *
21
- *
22
- */
23
- class ZooZ_ZoozPayment_Block_Estimate_Result extends ZooZ_ZoozPayment_Block_Estimate_Abstract
24
- {
25
-
26
- /**
27
- * Retrieves result from estimate model
28
- *
29
- * @return array|null
30
- */
31
- public function getResult()
32
- {
33
- return $this->getEstimate()->getResult();
34
- }
35
-
36
- /**
37
- * Check result existance
38
- *
39
- * @return boolean
40
- */
41
- public function hasResult()
42
- {
43
- return $this->getResult() !== null;
44
- }
45
-
46
- /**
47
- * Retrieve carrier name for shipping rate group
48
- *
49
- * @param string $code
50
- * @return string|null
51
- */
52
- public function getCarrierName($code)
53
- {
54
- $carrier = Mage::getSingleton('shipping/config')->getCarrierInstance($code);
55
- if ($carrier) {
56
- return $carrier->getConfigData('title');
57
- }
58
-
59
- return null;
60
- }
61
-
62
- /**
63
- * Retrieve shipping price for current address and rate
64
- *
65
- * @param decimal $price
66
- * @param boolean $flag show include tax price flag
67
- * @return string
68
- */
69
- public function getShippingPrice($price, $flag)
70
- {
71
- return $this->formatPrice(
72
- $this->helper('tax')->getShippingPrice(
73
- $price,
74
- $flag,
75
- $this->getEstimate()
76
- ->getQuote()
77
- ->getShippingAddress()
78
- )
79
- );
80
- }
81
-
82
- /**
83
- * Format price value depends on store settings
84
- *
85
- * @param decimal $price
86
- * @return string
87
- */
88
- public function formatPrice($price)
89
- {
90
- return $this->getEstimate()
91
- ->getQuote()
92
- ->getStore()
93
- ->convertPrice($price, true);
94
- }
95
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Block/Index.php DELETED
@@ -1,8 +0,0 @@
1
- <?php
2
- class ZooZ_ZoozPayment_Block_Index extends Mage_Core_Block_Template{
3
-
4
-
5
-
6
-
7
-
8
- }
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Helper/Carrier.php DELETED
@@ -1,95 +0,0 @@
1
- <?php
2
- class ZooZ_ZoozPayment_Helper_Carrier extends Mage_Shipping_Model_Carrier_Abstract
3
- {
4
- /**
5
- * unique internal shipping method identifier
6
- *
7
- * @var string [a-z0-9_]
8
- */
9
- protected $_code = '';
10
- public function setCarrier($code)
11
- {
12
- $this->_code=$code;
13
- }
14
- /**
15
- * Collect rates for this shipping method based on information in $request
16
- *
17
- * @param Mage_Shipping_Model_Rate_Request $data
18
- * @return Mage_Shipping_Model_Rate_Result
19
- */
20
- public function check()
21
- {
22
- if (!Mage::getStoreConfig('carriers/'.$this->_code.'/active')) {
23
- return false;
24
- }
25
- return true;
26
- }
27
- public function collectRates(Mage_Shipping_Model_Rate_Request $request)
28
- {
29
- // skip if not enabled
30
- if (!Mage::getStoreConfig('carriers/'.$this->_code.'/active')) {
31
- return false;
32
- }
33
-
34
- /**
35
- * here we are retrieving shipping rates from external service
36
- * or using internal logic to calculate the rate from $request
37
- * you can see an example in Mage_Usa_Model_Shipping_Carrier_Ups::setRequest()
38
- */
39
-
40
- // get necessary configuration values
41
- $handling = Mage::getStoreConfig('carriers/'.$this->_code.'/handling');
42
-
43
- // this object will be returned as result of this method
44
- // containing all the shipping rates of this method
45
- $result = Mage::getModel('shipping/rate_result');
46
-
47
- // $response is an array that we have
48
- foreach ($response as $rMethod) {
49
- // create new instance of method rate
50
- $method = Mage::getModel('shipping/rate_result_method');
51
-
52
- // record carrier information
53
- $method->setCarrier($this->_code);
54
- $method->setCarrierTitle(Mage::getStoreConfig('carriers/'.$this->_code.'/title'));
55
-
56
- // record method information
57
- $method->setMethod($rMethod['code']);
58
- $method->setMethodTitle($rMethod['title']);
59
-
60
- // rate cost is optional property to record how much it costs to vendor to ship
61
- $method->setCost($rMethod['amount']);
62
-
63
- // in our example handling is fixed amount that is added to cost
64
- // to receive price the customer will pay for shipping method.
65
- // it could be as well percentage:
66
- /// $method->setPrice($rMethod['amount']*$handling/100);
67
- $method->setPrice($rMethod['amount']+$handling);
68
-
69
- // add this rate to the result
70
- $result->append($method);
71
- }
72
-
73
- return $result;
74
- }
75
-
76
- /**
77
- * This method is used when viewing / listing Shipping Methods with Codes programmatically
78
- */
79
- public function getAllowedMethods() {
80
- return $this->getConfigData('name');
81
- }
82
- public function getAllowedPrice() {
83
- return $this->getConfigData('price');
84
- }
85
- public function getAllowedType() {
86
- return $this->getConfigData('type');
87
- }
88
- public function getAllowedHandlingType() {
89
- return $this->getConfigData('handling_type');
90
- }
91
- public function getAllowedHandlingFee() {
92
- return $this->getConfigData('handling_fee');
93
- }
94
- }
95
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Helper/Data.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
-
3
- class ZooZ_ZoozPayment_Helper_Data extends Mage_Core_Helper_Abstract {
4
-
5
- public function getTax() {
6
- $totals = Mage::getSingleton("checkout/session")->getQuote()->getTotals(); //Total object
7
- if (isset($totals['tax']) && $totals['tax']->getValue()) {
8
- return $totals['tax']->getValue();
9
- } else {
10
- return 0;
11
- }
12
- }
13
-
14
- public function getshipping() {
15
- $quote = Mage::getSingleton('checkout/session')->getQuote();
16
- return $shipping = $quote->getShippingAddress()->getShippingAmount();
17
- }
18
-
19
- public function getdiscount() {
20
- $quote = Mage::getSingleton("checkout/session")->getQuote(); //Total object
21
- Mage::log('Data.php -- Get discount - getSubtotalWithDiscount: ' . $quote->getSubtotalWithDiscount() . ' subtotal:' . $quote->getSubtotal());
22
-
23
- return (float) $quote->getSubtotal() - $quote->getSubtotalWithDiscount();
24
-
25
- }
26
-
27
- }
28
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Helper/Sanbox.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- class ZooZ_ZoozPayment_Helper_Sanbox
3
- {
4
- /**
5
- * Options getter
6
- *
7
- * @return array
8
- */
9
- public function toOptionArray()
10
- {
11
- return array(
12
- array('value' => 1, 'label'=>Mage::helper('adminhtml')->__('Sandbox')),
13
- array('value' => 0, 'label'=>Mage::helper('adminhtml')->__('Production')),
14
- );
15
- }
16
-
17
- /**
18
- * Get options in "key-value" format
19
- *
20
- * @return array
21
- */
22
- public function toArray()
23
- {
24
- return array(
25
- 0 => Mage::helper('adminhtml')->__('Production'),
26
- 1 => Mage::helper('adminhtml')->__('Sandbox'),
27
- );
28
- }
29
-
30
- }
31
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Estimate.php DELETED
@@ -1,238 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Magento
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the Open Software License (OSL 3.0)
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://opensource.org/licenses/osl-3.0.php
12
- *
13
- * @category EcomDev
14
- * @package Lotus_Getshipping
15
- * @copyright Copyright (c) 2010 Ecommerce Developer Blog (http://www.ecomdev.org)
16
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
17
- */
18
-
19
- /**
20
- * Estimate model
21
- *
22
- */
23
- class ZooZ_ZoozPayment_Model_Estimate {
24
-
25
- /**
26
- * Customer object,
27
- * if customer isn't logged in it quals to false
28
- *
29
- * @var Mage_Customer_Model_Customer|boolean
30
- */
31
- protected $_customer = null;
32
-
33
- /**
34
- * Sales quote object to add products for shipping estimation
35
- *
36
- * @var Mage_Sales_Model_Quote
37
- */
38
- protected $_quote = null;
39
-
40
- /**
41
- * Product model
42
- *
43
- * @var Mage_Catalog_Model_Product
44
- */
45
- protected $_product = array();
46
-
47
- /**
48
- * Estimation result
49
- *
50
- * @var array
51
- */
52
- protected $_result = array();
53
-
54
- /**
55
- * Delivery address information
56
- *
57
- * @var array
58
- */
59
- protected $_addressInfo = null;
60
-
61
- /**
62
- * Set address info for estimation
63
- *
64
- * @param array $info
65
- * @return Lotus_Getshipping_Model_Estimate
66
- */
67
- public function setAddressInfo($info) {
68
- $this->_addressInfo = $info;
69
- return $this;
70
- }
71
-
72
- /**
73
- * Retrieve address information
74
- *
75
- * @return boolean
76
- */
77
- public function getAddressInfo() {
78
- return $this->_addressInfo;
79
- }
80
-
81
- /**
82
- * Set a product for the estimation
83
- *
84
- * @param Mage_Catalog_Model_Product $product
85
- * @return Lotus_Getshipping_Model_Estimate
86
- */
87
- public function setProduct($product) {
88
- $this->_product[] = $product;
89
- return $this;
90
- }
91
-
92
- /**
93
- * Retrieve product for the estimation
94
- */
95
- public function getProduct() {
96
- return $this->_product;
97
- }
98
-
99
- /**
100
- * Retrieve shipping rate result
101
- *
102
- * @return array|null
103
- */
104
- public function getResult() {
105
-
106
- return $this->_result;
107
- }
108
-
109
- /**
110
- * Retrieve list of shipping rates
111
- *
112
- * @param Mage_Catalog_Model_Product $product
113
- * @param array $info
114
- * @param array $address
115
- * @return Lotus_Getshipping_Model_Estimate
116
- */
117
- public function estimate() {
118
- $products = $this->getProduct();
119
- foreach ($products as $product) {
120
- $addToCartInfo = (array) $product->getAddToCartInfo();
121
- $addressInfo = (array) $this->getAddressInfo();
122
- if (!($product instanceof Mage_Catalog_Model_Product) || !$product->getId()) {
123
- Mage::throwException(
124
- Mage::helper('zoozpayment')->__('Please specify a valid product')
125
- );
126
- }
127
-
128
- if (!isset($addressInfo['country_id'])) {
129
- Mage::throwException(
130
- Mage::helper('zoozpayment')->__('Please specify a country')
131
- );
132
- }
133
-
134
- if (empty($addressInfo['cart'])) {
135
- $this->resetQuote();
136
- }
137
- $shippingAddress = $this->getQuote()->getShippingAddress();
138
-
139
- $shippingAddress->setCountryId($addressInfo['country_id']);
140
-
141
- if (isset($addressInfo['region_id'])) {
142
- $shippingAddress->setRegionId($addressInfo['region_id']);
143
- }
144
-
145
- if (isset($addressInfo['postcode'])) {
146
- $shippingAddress->setPostcode($addressInfo['postcode']);
147
- }
148
-
149
- if (isset($addressInfo['region'])) {
150
- $shippingAddress->setRegion($addressInfo['region']);
151
- }
152
-
153
- if (isset($addressInfo['city'])) {
154
- $shippingAddress->setCity($addressInfo['city']);
155
- }
156
-
157
- $shippingAddress->setCollectShippingRates(true);
158
-
159
- if (isset($addressInfo['coupon_code'])) {
160
- $this->getQuote()->setCouponCode($addressInfo['coupon_code']);
161
- }
162
-
163
- $request = new Varien_Object($addToCartInfo);
164
-
165
- if ($product->getStockItem()) {
166
- $minimumQty = $product->getStockItem()->getMinSaleQty();
167
- if ($minimumQty > 0 && $request->getQty() < $minimumQty) {
168
- $request->setQty($minimumQty);
169
- }
170
- }
171
-
172
- $result = $this->getQuote()->addProduct($product, $request);
173
- }
174
- if (is_string($result)) {
175
- Mage::throwException($result);
176
- }
177
-
178
- Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item' => $result, 'product' => $product));
179
-
180
- $this->getQuote()->collectTotals();
181
- $this->_result = $shippingAddress->getGroupedAllShippingRates();
182
- return $this;
183
- }
184
-
185
- /**
186
- * Retrieve sales quote object
187
- *
188
- * @return Mage_Sales_Model_Quote
189
- */
190
- public function getQuote() {
191
- if ($this->_quote === null) {
192
- $addressInfo = $this->getAddressInfo();
193
- if (!empty($addressInfo['cart'])) {
194
- $quote = Mage::getSingleton('checkout/session')->getQuote();
195
- } else {
196
- $quote = Mage::getModel('sales/quote');
197
- }
198
-
199
- $this->_quote = $quote;
200
- }
201
-
202
- return $this->_quote;
203
- }
204
-
205
- /**
206
- * Reset quote object
207
- *
208
- * @return Lotus_Getshipping_Model_Estimate
209
- */
210
- public function resetQuote() {
211
- $this->getQuote()->removeAllAddresses();
212
-
213
- if ($this->getCustomer()) {
214
- $this->getQuote()->setCustomer($this->getCustomer());
215
- }
216
-
217
- return $this;
218
- }
219
-
220
- /**
221
- * Retrieve currently logged in customer,
222
- * if customer isn't logged it returns false
223
- *
224
- * @return Mage_Customer_Model_Customer|boolean
225
- */
226
- public function getCustomer() {
227
- if ($this->_customer === null) {
228
- $customerSession = Mage::getSingleton('customer/session');
229
- if ($customerSession->isLoggedIn()) {
230
- $this->_customer = $customerSession->getCustomer();
231
- } else {
232
- $this->_customer = false;
233
- }
234
- }
235
- return $this->_customer;
236
- }
237
-
238
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Observer.php DELETED
@@ -1,247 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Magento Enterprise Edition
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the Magento Enterprise Edition License
9
- * that is bundled with this package in the file LICENSE_EE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://www.magentocommerce.com/license/enterprise-edition
12
- * If you did not receive a copy of the license and are unable to
13
- * obtain it through the world-wide-web, please send an email
14
- * to license@magentocommerce.com so we can send you a copy immediately.
15
- *
16
- * DISCLAIMER
17
- *
18
- * Do not edit or add to this file if you wish to upgrade Magento to newer
19
- * versions in the future. If you wish to customize Magento for your
20
- * needs please refer to http://www.magentocommerce.com for more information.
21
- *
22
- * @category Mage
23
- * @package Mage_Tax
24
- * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
25
- * @license http://www.magentocommerce.com/license/enterprise-edition
26
- */
27
-
28
- /**
29
- * Tax Event Observer
30
- *
31
- * @author Magento Core Team <core@magentocommerce.com>
32
- */
33
- class ZooZ_ZoozPayment_Model_Observer {
34
-
35
- /**
36
- * Put quote address tax information into order
37
- *
38
- * @param Varien_Event_Observer $observer
39
- */
40
- public function salesEventConvertQuoteAddressToOrder(Varien_Event_Observer $observer) {
41
- $address = $observer->getEvent()->getAddress();
42
- $order = $observer->getEvent()->getOrder();
43
-
44
- $taxes = $address->getAppliedTaxes();
45
- if (is_array($taxes)) {
46
- if (is_array($order->getAppliedTaxes())) {
47
- $taxes = array_merge($order->getAppliedTaxes(), $taxes);
48
- }
49
- $order->setAppliedTaxes($taxes);
50
- $order->setConvertingFromQuote(true);
51
- }
52
- }
53
-
54
- /**
55
- * Save order tax information
56
- *
57
- * @param Varien_Event_Observer $observer
58
- */
59
- public function salesEventOrderAfterSave(Varien_Event_Observer $observer) {
60
- $order = $observer->getEvent()->getOrder();
61
-
62
- if (!$order->getConvertingFromQuote() || $order->getAppliedTaxIsSaved()) {
63
- return;
64
- }
65
-
66
- $getTaxesForItems = $order->getQuote()->getTaxesForItems();
67
- $taxes = $order->getAppliedTaxes();
68
-
69
- $ratesIdQuoteItemId = array();
70
- if (!is_array($getTaxesForItems)) {
71
- $getTaxesForItems = array();
72
- }
73
- foreach ($getTaxesForItems as $quoteItemId => $taxesArray) {
74
- foreach ($taxesArray as $rates) {
75
- if (count($rates['rates']) == 1) {
76
- $ratesIdQuoteItemId[$rates['id']][] = array(
77
- 'id' => $quoteItemId,
78
- 'percent' => $rates['percent'],
79
- 'code' => $rates['rates'][0]['code']
80
- );
81
- } else {
82
- $percentDelta = $rates['percent'];
83
- $percentSum = 0;
84
- foreach ($rates['rates'] as $rate) {
85
- $ratesIdQuoteItemId[$rates['id']][] = array(
86
- 'id' => $quoteItemId,
87
- 'percent' => $rate['percent'],
88
- 'code' => $rate['code']
89
- );
90
- $percentSum += $rate['percent'];
91
- }
92
-
93
- if ($percentDelta != $percentSum) {
94
- $delta = $percentDelta - $percentSum;
95
- foreach ($ratesIdQuoteItemId[$rates['id']] as &$rateTax) {
96
- if ($rateTax['id'] == $quoteItemId) {
97
- $rateTax['percent'] = (($rateTax['percent'] / $percentSum) * $delta) + $rateTax['percent'];
98
- }
99
- }
100
- }
101
- }
102
- }
103
- }
104
-
105
- foreach ($taxes as $id => $row) {
106
- foreach ($row['rates'] as $tax) {
107
- if (is_null($row['percent'])) {
108
- $baseRealAmount = $row['base_amount'];
109
- } else {
110
- if ($row['percent'] == 0 || $tax['percent'] == 0) {
111
- continue;
112
- }
113
- $baseRealAmount = $row['base_amount'] / $row['percent'] * $tax['percent'];
114
- }
115
- $hidden = (isset($row['hidden']) ? $row['hidden'] : 0);
116
- $data = array(
117
- 'order_id' => $order->getId(),
118
- 'code' => $tax['code'],
119
- 'title' => $tax['title'],
120
- 'hidden' => $hidden,
121
- 'percent' => $tax['percent'],
122
- 'priority' => $tax['priority'],
123
- 'position' => $tax['position'],
124
- 'amount' => $row['amount'],
125
- 'base_amount' => $row['base_amount'],
126
- 'process' => $row['process'],
127
- 'base_real_amount' => $baseRealAmount,
128
- );
129
-
130
- $result = Mage::getModel('tax/sales_order_tax')->setData($data)->save();
131
-
132
- if (isset($ratesIdQuoteItemId[$id])) {
133
- foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
134
- if ($quoteItemId['code'] == $tax['code']) {
135
- $item = $order->getItemByQuoteItemId($quoteItemId['id']);
136
- if ($item) {
137
- $define = 'FIX_' . $item->getId() . '_' . $result->getTaxId();
138
- if (!defined($define) || constant($define) != true) {
139
- $data = array(
140
- 'item_id' => $item->getId(),
141
- 'tax_id' => $result->getTaxId(),
142
- 'tax_percent' => $quoteItemId['percent']
143
- );
144
- Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
145
- define($define, true);
146
- }
147
- }
148
- }
149
- }
150
- }
151
- }
152
- }
153
-
154
- $order->setAppliedTaxIsSaved(true);
155
- }
156
-
157
- /**
158
- * Prepare select which is using to select index data for layered navigation
159
- *
160
- * @param Varien_Event_Observer $observer
161
- * @return Mage_Tax_Model_Observer
162
- */
163
- public function prepareCatalogIndexPriceSelect(Varien_Event_Observer $observer) {
164
- $table = $observer->getEvent()->getTable();
165
- $response = $observer->getEvent()->getResponseObject();
166
- $select = $observer->getEvent()->getSelect();
167
- $storeId = $observer->getEvent()->getStoreId();
168
-
169
- $additionalCalculations = $response->getAdditionalCalculations();
170
- $calculation = Mage::helper('tax')->getPriceTaxSql(
171
- $table . '.min_price', $table . '.tax_class_id'
172
- );
173
-
174
- if (!empty($calculation)) {
175
- $additionalCalculations[] = $calculation;
176
- $response->setAdditionalCalculations($additionalCalculations);
177
- /**
178
- * Tax class presented in price index table
179
- */
180
- //Mage::helper('tax')->joinTaxClass($select, $storeId, $table);
181
- }
182
-
183
- return $this;
184
- }
185
-
186
- /**
187
- * Add tax percent values to product collection items
188
- *
189
- * @param Varien_Event_Observer $observer
190
- * @return Mage_Tax_Model_Observer
191
- */
192
- public function addTaxPercentToProductCollection($observer) {
193
- $helper = Mage::helper('tax');
194
- $collection = $observer->getEvent()->getCollection();
195
- $store = $collection->getStoreId();
196
- if (!$helper->needPriceConversion($store)) {
197
- return $this;
198
- }
199
-
200
- if ($collection->requireTaxPercent()) {
201
- $request = Mage::getSingleton('tax/calculation')->getRateRequest();
202
- foreach ($collection as $item) {
203
- if (null === $item->getTaxClassId()) {
204
- $item->setTaxClassId($item->getMinimalTaxClassId());
205
- }
206
- if (!isset($classToRate[$item->getTaxClassId()])) {
207
- $request->setProductClassId($item->getTaxClassId());
208
- $classToRate[$item->getTaxClassId()] = Mage::getSingleton('tax/calculation')->getRate($request);
209
- }
210
- $item->setTaxPercent($classToRate[$item->getTaxClassId()]);
211
- }
212
- }
213
- return $this;
214
- }
215
-
216
- /**
217
- * Refresh sales tax report statistics for last day
218
- *
219
- * @param Mage_Cron_Model_Schedule $schedule
220
- * @return Mage_Tax_Model_Observer
221
- */
222
- public function aggregateSalesReportTaxData($schedule) {
223
- Mage::app()->getLocale()->emulate(0);
224
- $currentDate = Mage::app()->getLocale()->date();
225
- $date = $currentDate->subHour(25);
226
- Mage::getResourceModel('tax/report_tax')->aggregate($date);
227
- Mage::app()->getLocale()->revert();
228
- return $this;
229
- }
230
-
231
- /**
232
- * Reset extra tax amounts on quote addresses before recollecting totals
233
- *
234
- * @param Varien_Event_Observer $observer
235
- * @return Mage_Tax_Model_Observer
236
- */
237
- public function quoteCollectTotalsBefore(Varien_Event_Observer $observer) {
238
- /* @var $quote Mage_Sales_Model_Quote */
239
- $quote = $observer->getEvent()->getQuote();
240
- foreach ($quote->getAllAddresses() as $address) {
241
- $address->setExtraTaxAmount(0);
242
- $address->setBaseExtraTaxAmount(0);
243
- }
244
- return $this;
245
- }
246
-
247
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Order.php DELETED
@@ -1,191 +0,0 @@
1
- <?php
2
-
3
- class ZooZ_ZoozPayment_Model_Order extends Mage_Core_Model_Abstract {
4
-
5
- public function saveOrder($info = null, $giftInfo = null) {
6
- try {
7
-
8
- $shipping_price = $info->shippingAmount;
9
- $shipping_name = $info->shippingMethod;
10
- $shipping_carrier_name = $info->shippingCarrierName;
11
-
12
- $shipping_carrier_code = $info->shippingCarrierCode;
13
- Mage::log($shipping_name);
14
- Mage::log($shipping_carrier_name);
15
- Mage::log($shipping_carrier_code);
16
- Mage::log($shipping_price);
17
- $session = Mage::getSingleton("customer/session");
18
- $customer_session = $session->getCustomer();
19
- $customer = Mage::getModel('customer/customer')->load($customer_session->getId());
20
- $notLogin = false;
21
- $storeId = Mage::app()->getStore()->getId();
22
- $quote = Mage::getSingleton('checkout/session')->getQuote();
23
- $quote->save();
24
-
25
- Mage::log("quote sub:" . $quote->getSubtotalWithDiscount());
26
- if (Mage::getSingleton('customer/session')->IsLoggedIn()) {
27
- $customer = Mage::getModel('customer/customer')->load($customer->getId());
28
- $storeId = $customer->getStoreId();
29
- $notLogin = true;
30
- }
31
- if ($info != null) {
32
- /* Have Return Info Shipping Address */
33
- Mage::log("Have Return Info Shipping Address");
34
- $user = $info->user;
35
-
36
- $shippingAddress = $quote->getShippingAddress();
37
- $shipp_address = $info->shippingAddress;
38
- Mage::log($shipp_address);
39
- $phone_number = $user->phoneNumber;
40
- if ($phone_number == '') {
41
- $phone_number = "0987654321";
42
- }
43
- $shippingAddress->setStoreId($storeId)
44
- ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
45
- ->setCustomerId($customer->getId())
46
- ->setFirstname($shipp_address->firstName)
47
- ->setLastname($shipp_address->lastName)
48
- ->setStreet($shipp_address->street)
49
- ->setCity($shipp_address->city)
50
- ->setCountryId($shipp_address->countryCode)
51
- ->setRegion($shipp_address->state)
52
- ->setPostcode($shipp_address->zipCode)
53
- ->setTelephone($phone_number);
54
- $shippingAddress->setShippingMethod($shipping_name);
55
- $shippingAddress->setShippingDescription($shipping_name . " (" . $shipping_carrier_name . ")");
56
- $shippingAddress->setCollectShippingRates(true)->collectShippingRates();
57
-
58
- if ($notLogin) {
59
- /* Is Customer Login */
60
- Mage::log("Is Customer Login");
61
- $billing = $customer->getDefaultBillingAddress();
62
- if ($billing) {
63
- $billingAddress = $quote->getBillingAddress();
64
- $billingAddress
65
- ->setFirstname($billing->getFirstname())
66
- ->setLastname($billing->getLastname())
67
- ->setStreet($billing->getStreet())
68
- ->setCity($billing->getCity())
69
- ->setCountryId($billing->getCountryId())
70
- ->setPostcode($billing->getPostcode());
71
- $billingAddress->setRegionId($billing->getRegionId());// != "" ? $billing->getRegion() : $shipp_address->state);
72
- $billingAddress->setTelephone($billing->getTelephone() != "" ? $billing->getTelephone() : $phone_number);
73
-
74
- $quote->setBillingAddress($billingAddress);
75
- $quote->setShippingAddress($shippingAddress);
76
- } else {
77
- $billingAddress = $quote->getBillingAddress();
78
- $billingAddress
79
- ->setFirstname($shipp_address->firstName)
80
- ->setLastname($shipp_address->lastName)
81
- ->setStreet($shipp_address->street)
82
- ->setCity($shipp_address->city)
83
- ->setCountryId($shipp_address->countryCode)
84
- ->setRegion($shipp_address->state)
85
- ->setPostcode($shipp_address->zipCode)
86
- ->setTelephone($phone_number);
87
-
88
- // $shippingAddress->setSameAsBilling(true);
89
- $quote->setShippingAddress($shippingAddress);
90
- $quote->setBillingAddress($billingAddress);
91
- }
92
- } else {
93
- /* Customer Is Not Login */
94
- Mage::log(" Customer Is Not Login");
95
- $billingAddress = $quote->getBillingAddress();
96
- $billingAddress->setFirstname($shipp_address->firstName)
97
- ->setLastname($shipp_address->lastName)
98
- ->setStreet($shipp_address->street)
99
- ->setCity($shipp_address->city)
100
- ->setCountryId($shipp_address->countryCode)
101
- ->setRegion($shipp_address->state)
102
- ->setPostcode($shipp_address->zipCode)
103
- ->setTelephone($phone_number);
104
- $shippingAddress->setSameAsBilling(true);
105
- $quote->setCustomerIsGuest(1)
106
- ->setCustomerEmail($user->email)
107
- ->setCustomerFirstname($shipp_address->firstName)
108
- ->setCustomerLastname($shipp_address->lastName)
109
- ->setCustomerGroupId(0)
110
- ->setCustomerIsGuest(1);
111
- $quote->setBillingAddress($billingAddress);
112
- $quote->setShippingAddress($shippingAddress);
113
- }
114
- }
115
- $quote->save();
116
- $quote = Mage::getSingleton('checkout/session')->getQuote();
117
- $session = Mage::getSingleton('checkout/session');
118
- $giftcartcheck = false;
119
-
120
- $payment = $quote->getPayment();
121
- $payment->setMethod('zoozpayment');
122
- Mage::log("quote sub1:" . $quote->getSubtotalWithDiscount());
123
- $quote->collectTotals();
124
- Mage::log("quote sub2:" . $quote->getSubtotalWithDiscount());
125
- $service = Mage::getModel('sales/service_quote', $quote);
126
- $service->submitAll();
127
- $order = $service->getOrder();
128
- if (!$order) {
129
- return;
130
- }
131
-
132
-
133
- if ($giftInfo != null && $giftInfo != "") {
134
- $gift_customer = 0;
135
- if ($customer->getId()) {
136
- $gift_customer = $customer->getId();
137
- }
138
- //$Mage::log($info);
139
- //$Mage::log($info['gift']['message']);
140
-
141
- $model = Mage::getModel('giftmessage/message');
142
- $model->setCustomerId(0);
143
- $model->setSender($giftInfo['from']);
144
- $model->setRecipient($giftInfo['to']);
145
- $model->setMessage($giftInfo['message']);
146
- $model->save();
147
- $gift_id = $model->getId();
148
- $order->setGiftMessageId($gift_id);
149
- }
150
- $session = Mage::getSingleton('checkout/session');
151
- $session->setLastRealOrderId($order->getIncrementId());
152
- $session->setLastSuccessQuoteId($session->getQuote()->getId());
153
- $session->setLastQuoteId($session->getQuote()->getId());
154
- $session->setLastOrderId($order->getId());
155
-
156
-
157
-
158
- $cart2 = Mage::getSingleton('checkout/cart');
159
- $cart2->init();
160
- $cart2->truncate();
161
- $cart2->save();
162
- $cart2->getItems()->clear()->save();
163
- //
164
- $order->save();
165
- Mage::log('zooz payment success');
166
- } catch (Exception $ex) {
167
- Mage::log($ex->getMessage());
168
- }
169
- }
170
-
171
- public function cloneAddress() {
172
- // set Billing Address
173
- $addressData = array(
174
- 'firstname' => 'Test',
175
- 'lastname' => 'Test',
176
- 'street' => 'Sample Street 10',
177
- 'city' => 'Somewhere',
178
- 'postcode' => '123456',
179
- 'telephone' => '123456',
180
- 'country_id' => 'US',
181
- 'region_id' => 12, // id from directory_country_region table
182
- );
183
-
184
- $tempAddress = Mage::getModel('sales/order_address')
185
- ->setData($addressData)
186
- ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING);
187
-
188
- return $tempAddress;
189
- }
190
-
191
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Session.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- *
12
- * @category EcomDev
13
- * @package EcomDev_ProductPageShipping
14
- * @copyright Copyright (c) 2010 Ecommerce Developer Blog (http://www.ecomdev.org)
15
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
16
- */
17
-
18
- /**
19
- * Session model
20
- *
21
- * Using for saving the form data between estimations
22
- *
23
- */
24
- class ZooZ_ZoozPayment_Model_Session extends Mage_Core_Model_Session_Abstract
25
- {
26
- public function __construct()
27
- {
28
- $this->init('zoozpayment');
29
- }
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Source/Action.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
-
3
- class ZooZ_ZoozPayment_Model_Source_Action {
4
-
5
- public function toOptionArray() {
6
- return array(
7
- array(
8
- 'value' => Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE,
9
- 'label' => Mage::helper('core')->__('Authorize')
10
- ),
11
- array(
12
- 'value' => Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE_CAPTURE,
13
- 'label' => Mage::helper('core')->__('Authorize & Capture')
14
- )
15
- );
16
- }
17
-
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Source/Status.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
- class ZooZ_ZoozPayment_Model_Source_Status
3
- {
4
- public function toOptionArray()
5
- {
6
- return array(
7
- array(
8
- 'value' => Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
9
- 'label' => Mage::helper('core')->__('Pending')
10
- ),
11
- array(
12
- 'value' => Mage_Sales_Model_Order::STATE_PROCESSING,
13
- 'label' => Mage::helper('core')->__('Processing')
14
- )
15
-
16
- );
17
- }
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/Model/Standard.php DELETED
@@ -1,739 +0,0 @@
1
- <?php
2
-
3
- require_once(Mage::getBaseDir('lib') . '/zooz/zooz.extended.server.api.php');
4
-
5
- class ZooZ_ZoozPayment_Model_Standard extends Mage_Payment_Model_Method_Abstract {
6
-
7
- protected $_code = 'zoozpayment';
8
- protected $_isInitializeNeeded = true;
9
- protected $_canUseInternal = false;
10
- protected $_canUseForMultishipping = true;
11
- protected $_canAuthorize = true;
12
- protected $_canCapture = true;
13
- protected $_canRefund = true;
14
- protected $_canRefundInvoicePartial = true;
15
- protected $_canCapturePartial = true;
16
-
17
- # protected $_canVoid = true;
18
-
19
- public function canCapture() {
20
- return $this->_canCapture;
21
- }
22
-
23
- public function canCapturePartial() {
24
- return $this->_canCapturePartial;
25
- }
26
-
27
- public function initialize($paymentAction, $stateObject) {
28
- $state = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT;
29
- $stateObject->setState($state);
30
- $stateObject->setStatus('pending_payment');
31
- $stateObject->setIsNotified(false);
32
- }
33
-
34
- public function canRefund() {
35
- return $this->_canRefund;
36
- }
37
-
38
- public function canRefundInvoicePartial() {
39
- return $this->_canRefundInvoicePartial;
40
- }
41
-
42
- public function refund(Varien_Object $payment, $amount) {
43
- $isSandbox = false;
44
- if ($this->getIsSandBox()) {
45
- $isSandbox = true;
46
- }
47
- $zooz_useremail = Mage::getStoreConfig('payment/zoozpayment/zooz_useremail');
48
- $zooz_serverkey = Mage::getStoreConfig('payment/zoozpayment/zooz_serverkey');
49
-
50
- if ($isSandbox) {
51
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, true);
52
- } else {
53
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, false);
54
- }
55
-
56
- // $info = $zooz->getTransactionDetailsByTransactionID($payment->getLastTransId());
57
-
58
- if ($zooz->refundTransaction($payment->getLastTransId(), $amount)) {
59
- $payment->setTransactionId($payment->getLastTransId());
60
- $payment->setIsTransactionClosed(false);
61
- $payment->setStatus(Mage_Payment_Model_Method_Abstract::STATUS_APPROVED);
62
- } else {
63
- $this->showException('Error in you refund request');
64
- }
65
- return $this;
66
- }
67
-
68
- public function capture(Varien_Object $payment, $amount) {
69
- //code execute to getway
70
- //commitTransaction($transactionID, $amount=NULL, $invoice=NULL)
71
- $isSandbox = false;
72
- if ($this->getIsSandBox()) {
73
- $isSandbox = true;
74
- }
75
- $zooz_useremail = Mage::getStoreConfig('payment/zoozpayment/zooz_useremail');
76
- $zooz_serverkey = Mage::getStoreConfig('payment/zoozpayment/zooz_serverkey');
77
-
78
- if ($isSandbox) {
79
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, true);
80
- } else {
81
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, false);
82
- }
83
-
84
- if($amount == 0){
85
- $payment->setTransactionId($payment->getLastTransId());
86
- $payment->setIsTransactionClosed(false);
87
- $payment->setStatus(Mage_Payment_Model_Method_Abstract::STATUS_APPROVED);
88
-
89
- }else if ($zooz->commitTransaction($payment->getLastTransId(), $amount)) {
90
- $payment->setTransactionId($payment->getLastTransId());
91
- $payment->setIsTransactionClosed(false);
92
- $payment->setStatus(Mage_Payment_Model_Method_Abstract::STATUS_APPROVED);
93
- }
94
- return $this;
95
- }
96
-
97
- /**
98
- * Return Order place redirect url
99
- *
100
- * @return string
101
- */
102
- public function getOrderPlaceRedirectUrl() {
103
- //when you click on place order you will be redirected on this url, if you don't want this action remove this method
104
- return Mage::getUrl('zoozpayment/standard/redirect', array('_secure' => true));
105
- }
106
-
107
- public function getAppUniqueId() {
108
- return $config = Mage::getStoreConfig('payment/zoozpayment/app_unique_id');
109
- }
110
-
111
- public function getAppKey() {
112
- return $config = Mage::getStoreConfig('payment/zoozpayment/app_key');
113
- }
114
-
115
- public function getIsSandBox() {
116
- return $config = Mage::getStoreConfig('payment/zoozpayment/sandbox_flag');
117
- }
118
-
119
- public function getSandboxUrl() {
120
- return $config = Mage::getStoreConfig('payment/zoozpayment/zooz_sandbox_url');
121
- }
122
-
123
- public function getProductionUrl() {
124
- return $config = Mage::getStoreConfig('payment/zoozpayment/zooz_production_url');
125
- }
126
-
127
- /**
128
- * Instantiate state and set it to state object
129
- * @param string $paymentAction
130
- * @param Varien_Object
131
- */
132
- public function processing($start = false) {
133
- if ($start == true) {
134
-
135
- $postFields = $this->getPostFieldFromCart();
136
- } else {
137
- $postFields = $this->getPostField();
138
- }
139
- if ($postFields != '') {
140
- // Flag to indicate whether sandbox environment should be used
141
- $isSandbox = false;
142
- if ($this->getIsSandBox()) {
143
- $isSandbox = true;
144
- }
145
-
146
- $url;
147
- $zoozServer;
148
-
149
- if ($isSandbox == true) {
150
-
151
- $zoozServer = $this->getSandboxUrl();
152
- $url = $zoozServer . "/mobile/SecuredWebServlet";
153
- } else {
154
-
155
- $zoozServer = $this->getProductionUrl();
156
- $url = $zoozServer . "/mobile/SecuredWebServlet";
157
- }
158
-
159
- if (!function_exists('curl_init')) {
160
- Mage::getSingleton('checkout/session')->addError('Sorry cURL is not installed!');
161
- return Mage::getUrl('checkout/cart');
162
- }
163
-
164
- // OK cool - then let's create a new cURL resource handle
165
- $ch = curl_init();
166
-
167
- // Now set some options
168
- // Set URL
169
- curl_setopt($ch, CURLOPT_URL, $url);
170
-
171
- //Header fields: ZooZUniqueID, ZooZAppKey, ZooZResponseType
172
- $header = array('ZooZUniqueID: ' . $this->getAppUniqueId(), 'ZooZAppKey: ' . $this->getAppKey(), 'ZooZResponseType: NVP');
173
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
174
-
175
- // If it is a post request
176
- curl_setopt($ch, CURLOPT_POST, 1);
177
-
178
- // Timeout in seconds
179
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
180
-
181
- // If you are experiencing issues recieving the token on the sandbox environment, please set this option
182
- if ($isSandbox) {
183
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
184
- }
185
-
186
- //Mandatory POST fields: cmd, amount, currencyCode
187
- curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
188
-
189
- ob_start();
190
-
191
- curl_exec($ch);
192
-
193
- $result = ob_get_contents();
194
-
195
- ob_end_clean();
196
-
197
- curl_close($ch);
198
-
199
- parse_str($result);
200
-
201
-
202
- if ($statusCode == 0) {
203
-
204
- // Get token from ZooZ server
205
- $trimmedSessionToken = rtrim($sessionToken, "\n");
206
-
207
- // Send token back to page
208
- if ($start == true) {
209
- $success = Mage::getUrl('zoozpayment/standard/successexpress');
210
- } else {
211
- $success = Mage::getUrl('zoozpayment/standard/success');
212
- }
213
-
214
- $cancel = Mage::getUrl('zoozpayment/standard/cancel');
215
-
216
- $redirect = $zoozServer . "/mobile/mobileweb/zooz-checkout.jsp?";
217
- $redirect .= "token=" . $trimmedSessionToken;
218
- $redirect .= "&uniqueID=" . $this->getAppUniqueId();
219
- $redirect .= "&largeViewport=true";
220
- $redirect .= "&returnUrl=" . $success;
221
- $redirect .= "&cancelUrl=" . $cancel;
222
- $redirect .= "&isShippingRequired=false";
223
-
224
- // process order
225
- $session = Mage::getSingleton('checkout/session');
226
- $session->setZoozQuoteId($session->getQuoteId());
227
-
228
- //Mage::log($redirect);
229
- return $redirect;
230
-
231
- $session->unsQuoteId();
232
- $session->unsRedirectUrl();
233
- } else if (isset($errorMessage)) {
234
- Mage::getSingleton('checkout/session')->addError("Error to open transaction to ZooZ server. " . $errorMessage);
235
- return Mage::getUrl('checkout/cart');
236
- }
237
- //Close the cURL resource, and free system resources
238
- } else {
239
- return Mage::getUrl('checkout/cart');
240
- }
241
- }
242
-
243
- public function ajaxprocessing($start = false) {
244
- if ($start == true) {
245
-
246
- $postFields = $this->getPostFieldFromCart();
247
- } else {
248
- $postFields = $this->getPostField();
249
- }
250
- if (Mage::getSingleton('customer/session')->IsLoggedIn()) {
251
- $session = Mage::getSingleton("customer/session");
252
- $customer = $session->getCustomer();
253
- $customerLoginID = $customer->getId();
254
- $postFields.="&customerLoginID=$customerLoginID";
255
- }
256
-
257
- if ($postFields != '') {
258
-
259
- $postFields.="&dynamicShippingUrl=" . Mage::getUrl('zoozpayment/estimate/index');
260
- if (Mage::getStoreConfig('sales/gift_options/allow_order', null)) {
261
- $postFields.="&providerSupportedFeatures=[100,104]";
262
- } else {
263
- $postFields.="&providerSupportedFeatures=[104]";
264
- }
265
- //Mage::log($postFields);
266
- //die($postFields);
267
- // Flag to indicate whether sandbox environment should be used
268
- $isSandbox = false;
269
- if ($this->getIsSandBox()) {
270
- $isSandbox = true;
271
- }
272
-
273
- $url;
274
- $zoozServer;
275
-
276
- if ($isSandbox == true) {
277
-
278
- $zoozServer = $this->getSandboxUrl();
279
- $url = $zoozServer . "/mobile/SecuredWebServlet";
280
- } else {
281
-
282
- $zoozServer = $this->getProductionUrl();
283
- $url = $zoozServer . "/mobile/SecuredWebServlet";
284
- }
285
-
286
- // is cURL installed yet?
287
-
288
- if (!function_exists('curl_init')) {
289
- Mage::getSingleton('checkout/session')->addError('Sorry cURL is not installed!');
290
- return Mage::getUrl('checkout/cart');
291
- }
292
-
293
- // OK cool - then let's create a new cURL resource handle
294
- $ch = curl_init();
295
-
296
- // Now set some options
297
- // Set URL
298
- curl_setopt($ch, CURLOPT_URL, $url);
299
-
300
- //Header fields: ZooZUniqueID, ZooZAppKey, ZooZResponseType
301
- $header = array('ZooZUniqueID: ' . $this->getAppUniqueId(), 'ZooZAppKey: ' . $this->getAppKey(), 'ZooZResponseType: NVP');
302
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
303
-
304
- // If it is a post request
305
- curl_setopt($ch, CURLOPT_POST, 1);
306
-
307
- // Timeout in seconds
308
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
309
-
310
- // If you are experiencing issues recieving the token on the sandbox environment, please set this option
311
- if ($isSandbox) {
312
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
313
- }
314
-
315
- //Mandatory POST fields: cmd, amount, currencyCode
316
- curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
317
-
318
- ob_start();
319
-
320
- curl_exec($ch);
321
-
322
- $result = ob_get_contents();
323
-
324
- ob_end_clean();
325
-
326
- curl_close($ch);
327
-
328
- parse_str($result);
329
-
330
- // Mage::log($result);
331
-
332
- if ($statusCode == 0) {
333
- // Get token from ZooZ server
334
- $trimmedSessionToken = rtrim($sessionToken, "\n");
335
-
336
- $session = Mage::getSingleton('checkout/session');
337
- $session->setZoozQuoteId($session->getQuoteId());
338
- if ($start == true)
339
- $typecheckout = 1;
340
- else
341
- $typecheckout = 0;
342
- Mage::getSingleton('core/session')->setZooztype($typecheckout);
343
- return $trimmedSessionToken;
344
- //return $trimmedSessionToken;
345
- // Send token back to page
346
- } else if (isset($errorMessage)) {
347
- Mage::getSingleton('checkout/session')->addError("Error to open transaction to ZooZ server. " . $errorMessage);
348
- return Mage::getUrl('checkout/cart');
349
- }
350
- // Close the cURL resource, and free system resources
351
- } else {
352
-
353
- return Mage::getUrl('checkout/cart');
354
- }
355
- }
356
-
357
- protected function _getCart() {
358
- return Mage::getSingleton('checkout/cart');
359
- }
360
-
361
- public function getPostFieldFromCart() {
362
-
363
- //Mage::log("getPostFieldFromCart");
364
- $postFields = "";
365
- // $cart = Mage::helper('checkout/cart')->getCart();
366
- $cart = $this->_getCart();
367
- $cart->save();
368
-
369
- $quote = Mage::getSingleton('checkout/session')->getQuote();
370
-
371
- $session = Mage::getSingleton('checkout/session');
372
-
373
-
374
-
375
- $itemsCount = $cart->getItemsCount();
376
-
377
- if ($itemsCount > 0) {
378
- $data = $cart->getQuote()->getData();
379
-
380
- //Mage::log($data);
381
- // cmd
382
- $amount = $data['grand_total'] - Mage::helper('zoozpayment')->getshipping();
383
- $postFields .= "cmd=openTrx";
384
- $postFields .= "&amount=" . $amount;
385
- $postFields .= "&currencyCode=" . $data['quote_currency_code'];
386
- //$postFields .= "&taxAmount=".$data['tax_amount'];
387
- //shipping
388
- $carrier = Mage::helper('zoozpayment/carrier');
389
- $carrier->setCarrier('freeshipping');
390
- $carrier_temp = '';
391
- $carrier_temp_0 = '';
392
- if ($carrier->check()) {
393
- $carrier_temp_0 = "{name:'" . $carrier->getAllowedMethods() . "', price: " . (float) $carrier->getAllowedPrice() . "}";
394
- $carrier_temp.=$carrier_temp_0;
395
- }
396
- $carrier->setCarrier('flatrate');
397
- $carrier_temp_1 = '';
398
- if ($carrier->check()) {
399
- $cart = Mage::helper('checkout/cart')->getCart();
400
- $items = $cart->getQuote()->getAllVisibleItems();
401
- $total = 0;
402
- $price_total = 0;
403
- foreach ($items as $item) {
404
- $total+=$item->getQty();
405
- // $price_total+= $item->getPrice()*$item->getQty();
406
- }
407
- if ($carrier->getAllowedType() == "I") {
408
- $price = $total * (float) $carrier->getAllowedPrice();
409
- } elseif ($carrier->getAllowedType() == "O") {
410
- $price = (float) $carrier->getAllowedPrice();
411
- } else {
412
- $price = 0;
413
- }
414
- if ($carrier->getAllowedHandlingType() == 'F') {
415
- $price_handing = (float) $carrier->getAllowedHandlingFee();
416
- $price_handing = number_format($price_handing, 2);
417
- }
418
- if ($carrier->getAllowedHandlingType() == 'P') {
419
-
420
- $price_handing = ((float) $carrier->getAllowedHandlingFee() * $price) / 100;
421
- $price_handing = number_format($price_handing, 2);
422
- }
423
- $price = $price + $price_handing;
424
- $carrier_temp_1 = "{name:'" . $carrier->getAllowedMethods() . "', price: " . $price . "}";
425
- if ($carrier_temp != '')
426
- $carrier_temp.="," . $carrier_temp_1;
427
- else
428
- $carrier_temp = $carrier_temp_1;
429
- }
430
- $postFields.="&isShippingRequired=true";
431
- if ($carrier_temp != '') {
432
- $postFields.= "&shippingMethods=[" . $carrier_temp . "]";
433
- } else {
434
- $postFields.="&isShippingRequired=false";
435
- }
436
- //shipping
437
- //
438
- // customer
439
- if (Mage::getSingleton('customer/session')->isLoggedIn()) {
440
-
441
- /* Get the customer data */
442
- $customer = Mage::getSingleton('customer/session')->getCustomer();
443
- /* Get the customer's first name */
444
- $firstname = $customer->getFirstname();
445
- /* Get the customer's last name */
446
- $lastname = $customer->getLastname();
447
- /* Get the customer's email address */
448
- $email = $customer->getEmail();
449
- $_billingData = $customer->getDefaultBillingAddress();
450
- $_shippingData = $customer->getDefaultShippingAddress();
451
-
452
- $postFields .= "&user.idNumber=" . $customer->getId();
453
- $postFields .= "&user.email=" . $email;
454
- $postFields .= "&user.firstName=" . $firstname;
455
- $postFields .= "&user.lastName=" . $lastname;
456
- if (is_object($_billingData)) {
457
- $postFields .= "&user.phone.phoneNumber=" . $_billingData->getTelephone();
458
- }
459
-
460
-
461
- //$postFields .= "&user.additionalDetails=Payment for ".$data['entity_id'];
462
- //Billing and Shipping
463
- if (is_object($_billingData)) {
464
- $postFields .= "&billingAddress.firstName=" . $_billingData['firstname'];
465
- $postFields .= "&billingAddress.lastName=" . $_billingData['lastname'];
466
- //$postFields .= "&billingAddress.phone.countryCode=USA";
467
- //$postFields .= "&billingAddress.phone.number=1222323".$_billingData['telephone'];
468
- $postFields .= "&billingAddress.street=" . $_billingData['street'];
469
- $postFields .= "&billingAddress.city=" . $_billingData['city'];
470
- //$postFields .= "&billingAddress.state=22";
471
- $postFields .= "&billingAddress.state=" . $_billingData['region'];
472
- $postFields .= "&billingAddress.country=" . $_billingData['country_id'];
473
- $postFields .= "&billingAddress.zipCode=" . $_billingData['postcode'];
474
- }
475
-
476
- // shipping address
477
- if (is_object($_shippingData)) {
478
- $postFields .= "&shippingAddress.firstName=" . $_shippingData['firstname'];
479
- $postFields .= "&shippingAddress.lastName=" . $_shippingData['lastname'];
480
- //$postFields .= "&shippingAddress.phone.countryCode=2323";
481
- //$postFields .= "&shippingAddress.phone.number=232323".$_shippingData['telephone'];
482
- $postFields .= "&shippingAddress.street=" . $_shippingData['street'];
483
- $postFields .= "&shippingAddress.city=" . $_shippingData['city'];
484
- //$postFields .= "&shippingAddress.state=22";
485
- $postFields .= "&shippingAddress.state=" . $_shippingData['region'];
486
- $postFields .= "&shippingAddress.country=" . $_shippingData['country_id'];
487
- $postFields .= "&shippingAddress.zipCode=" . $_shippingData['postcode'];
488
- }
489
- } else {
490
-
491
- }
492
- // invoice
493
- $postFields .= "&invoice.number=" . $data['entity_id'];
494
- $postFields .= "&invoice.additionalDetails=" . $data['entity_id'] . ': $' . $data['base_grand_total'];
495
-
496
- // items
497
- $cartItems = $cart->getQuote()->getAllVisibleItems();
498
- $i = 1;
499
- // $tax = 0;
500
- foreach ($cartItems as $item) {
501
- $itemdata = $item->getData();
502
-
503
- $postFields .= "&invoice.items(" . $i . ").id=" . $itemdata['product_id'];
504
- $postFields .= "&invoice.items(" . $i . ").name=" . $itemdata['name'];
505
- $postFields .= "&invoice.items(" . $i . ").quantity=" . $itemdata['qty'];
506
- $postFields .= "&invoice.items(" . $i . ").price=" . $itemdata['price'];
507
- // $tax += ($item->getData('tax_percent') * $itemdata['price'] * $itemdata['qty']) / 100;
508
- $i++;
509
- }
510
-
511
- $quote = Mage::getSingleton('checkout/session')->getQuote();
512
-
513
- $coupon_code = $quote->getCouponCode();
514
- $discount = Mage::helper('zoozpayment')->getdiscount();
515
-
516
- // $discount = $quote->getSubtotal() - $quote->getSubtotalWithDiscount();
517
- /*
518
- $postFields .= "&invoice.items(" . $i . ").id=-i";
519
- $postFields .= "&invoice.items(" . $i . ").name=Discount";
520
- $postFields .= "&invoice.items(" . $i . ").quantity=" . 1;
521
- $postFields .= "&invoice.items(" . $i . ").price=-" . $data['subtotal'];
522
- $i += 1;
523
- */
524
-
525
- if ($discount != '' && $discount > 0) {
526
- $postFields .= "&invoice.items(" . $i . ").id=-i";
527
- $postFields .= "&invoice.items(" . $i . ").name=Discount";
528
- $postFields .= "&invoice.items(" . $i . ").quantity=" . 1;
529
- $postFields .= "&invoice.items(" . $i . ").price=-" . $discount;
530
- $i += 1;
531
- }
532
-
533
- if (isset($code) && $code != '') {
534
-
535
- $postFields .= "&invoice.items(" . $i . ").id=-i";
536
- $postFields .= "&invoice.items(" . $i . ").quantity=" . 1;
537
- $postFields .= "&invoice.items(" . $i . ").price=-" . $amount;
538
- }
539
- }
540
- $tax = $discount = Mage::helper('zoozpayment')->getTax();
541
- $postFields .= "&taxAmount=" . $tax;
542
-
543
- // if (isset($code) && $code != '') {
544
- $postFields.="&featureProvider=102";
545
- // }
546
-
547
-
548
-
549
- return $postFields;
550
- }
551
-
552
- public function getPostField() {
553
-
554
- $postFields = "";
555
- $session = Mage::getSingleton('checkout/session');
556
- $session->setQuoteId($session->getZoozQuoteId(true));
557
- if ($session->getLastRealOrderId()) {
558
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
559
- if ($order->getId()) {
560
- $_orderData = $order->getData();
561
- $_shippingData = $order->getShippingAddress()->getData();
562
- $_billingData = $order->getBillingAddress()->getData();
563
-
564
- // cmd
565
- $postFields .= "cmd=openTrx";
566
- $postFields .= "&amount=" . $_orderData['grand_total'];
567
- $postFields .= "&currencyCode=" . $_orderData['order_currency_code'];
568
- $postFields .= "&taxAmount=" . $_orderData['tax_amount'];
569
- $postFields.="&isShippingRequired=false";
570
- // customer
571
- $postFields .= "&user.idNumber=" . $_orderData['customer_id'];
572
- $postFields .= "&user.email=" . $_orderData['customer_email'];
573
- $postFields .= "&user.firstName=" . $_orderData['customer_firstname'];
574
- $postFields .= "&user.lastName=" . $_orderData['customer_lastname'];
575
- $postFields .= "&user.phone.phoneNumber=" . $_shippingData['telephone'];
576
- $postFields .= "&user.additionalDetails=Payment for Invoice #" . $_orderData['increment_id'];
577
-
578
- // invoice
579
- $postFields .= "&invoice.number=" . $_orderData['increment_id'];
580
- $postFields .= "&invoice.additionalDetails=" . $_orderData['shipping_description'] . ': $' . $_orderData['shipping_amount'];
581
-
582
- // items
583
- $items = $order->getAllItems();
584
- $i = 1;
585
- foreach ($items as $itemId => $item) {
586
- $postFields .= "&invoice.items(" . $i . ").id=" . $item->getProductId();
587
- $postFields .= "&invoice.items(" . $i . ").name=" . $item->getName();
588
- $postFields .= "&invoice.items(" . $i . ").quantity=" . $item->getQtyToInvoice();
589
- $postFields .= "&invoice.items(" . $i . ").price=" . $item->getPrice();
590
- $i++;
591
- }
592
-
593
- $quote = Mage::getSingleton('checkout/session')->getQuote();
594
- $coupon_code = $quote->getCouponCode();
595
- $discount = $quote->getSubtotal() - $quote->getSubtotalWithDiscount();
596
-
597
- if ($coupon_code != '') {
598
- $postFields .= "&invoice.items(" . $i . ").id=" . $i;
599
- $postFields .= "&invoice.items(" . $i . ").name=Discount";
600
- $postFields .= "&invoice.items(" . $i . ").quantity=" . 1;
601
- $postFields .= "&invoice.items(" . $i . ").price=" . $discount;
602
- }
603
-
604
-
605
- if ($code != '') {
606
-
607
- $postFields .= "&invoice.items(" . $i . ").id=" . $i;
608
- $postFields .= "&invoice.items(" . $i . ").quantity=" . 1;
609
- $postFields .= "&invoice.items(" . $i . ").price=-" . $amount;
610
- }
611
-
612
- // billing address
613
- $postFields .= "&billingAddress.firstName=" . $_billingData['firstname'];
614
- $postFields .= "&billingAddress.lastName=" . $_billingData['lastname'];
615
- $postFields .= "&billingAddress.phone.countryCode=USA";
616
- $postFields .= "&billingAddress.phone.number=1222323" . $_billingData['telephone'];
617
- $postFields .= "&billingAddress.street=" . $_billingData['street'];
618
- $postFields .= "&billingAddress.city=" . $_billingData['city'];
619
- //$postFields .= "&billingAddress.state=22";
620
- $postFields .= "&billingAddress.state=" . $_billingData['region'];
621
- $postFields .= "&billingAddress.country=" . $_billingData['country_id'];
622
- $postFields .= "&billingAddress.zipCode=" . $_billingData['postcode'];
623
-
624
- // shipping address
625
- $postFields .= "&shippingAddress.firstName=" . $_shippingData['firstname'];
626
- $postFields .= "&shippingAddress.lastName=" . $_shippingData['lastname'];
627
- $postFields .= "&shippingAddress.phone.countryCode=2323";
628
- $postFields .= "&shippingAddress.phone.number=232323" . $_shippingData['telephone'];
629
- $postFields .= "&shippingAddress.street=" . $_shippingData['street'];
630
- $postFields .= "&shippingAddress.city=" . $_shippingData['city'];
631
- //$postFields .= "&shippingAddress.state=22";
632
- $postFields .= "&shippingAddress.state=" . $_shippingData['region'];
633
- $postFields .= "&shippingAddress.country=" . $_shippingData['country_id'];
634
- $postFields .= "&shippingAddress.zipCode=" . $_shippingData['postcode'];
635
- }
636
- }
637
-
638
-
639
- return $postFields;
640
- }
641
-
642
- public function successprocessing() {
643
- // Flag to indicate whether sandbox environment should be used
644
- $isSandbox = false;
645
-
646
- if ($this->getIsSandBox()) {
647
- $isSandbox = true;
648
- }
649
-
650
- $url;
651
-
652
- if ($isSandbox == true) {
653
-
654
- $zoozServer = $this->getSandboxUrl();
655
- $url = $zoozServer . "/mobile/SecuredWebServlet";
656
- } else {
657
-
658
- $zoozServer = $this->getProductionUrl();
659
- $url = $zoozServer . "/mobile/SecuredWebServlet";
660
- }
661
- // is cURL installed yet?
662
-
663
- if (!function_exists('curl_init')) {
664
- Mage::getSingleton('checkout/session')->addError('Sorry cURL is not installed!');
665
- return Mage::getUrl('checkout/cart');
666
- }
667
-
668
- // OK cool - then let's create a new cURL resource handle
669
- $ch = curl_init();
670
-
671
- // Now set some options
672
- // Set URL
673
- curl_setopt($ch, CURLOPT_URL, $url);
674
-
675
- //Header fields: ZooZUniqueID, ZooZAppKey, ZooZResponseType
676
- $header = array('ZooZUniqueID: ' . $this->getAppUniqueId(), 'ZooZAppKey: ' . $this->getAppKey(), 'ZooZResponseType: NVP');
677
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
678
-
679
- // If it is a post request
680
- curl_setopt($ch, CURLOPT_POST, 1);
681
-
682
- // Timeout in seconds
683
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
684
-
685
- // If you are experiencing issues recieving the token on the sandbox environment, please set this option
686
- if ($isSandbox) {
687
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
688
- }
689
-
690
- $params = Mage::app()->getRequest()->getParams();
691
-
692
- $transactionID = $params['transactionID'];
693
-
694
- $sessionToken = $params['sessionToken'];
695
-
696
- curl_setopt($ch, CURLOPT_POSTFIELDS, "cmd=verifyTrx&transactionID=" . $transactionID);
697
-
698
- ob_start();
699
-
700
- curl_exec($ch);
701
-
702
- $result = ob_get_contents();
703
-
704
- ob_end_clean();
705
-
706
- parse_str($result);
707
-
708
- curl_close($ch);
709
-
710
- // create order with billding return
711
- $zooz_useremail = Mage::getStoreConfig('payment/zoozpayment/zooz_useremail');
712
- $zooz_serverkey = Mage::getStoreConfig('payment/zoozpayment/zooz_serverkey');
713
-
714
- if ($isSandbox) {
715
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, true);
716
- } else {
717
- $zooz = new ZooZExtendedServerAPI($zooz_useremail, $zooz_serverkey, false);
718
- }
719
- //
720
- //$info = $zooz->getTransactionDetailsByTransactionID('4QQ6RIRDNNKI7GN37JLHI7BSAI');
721
-
722
- $info = $zooz->getTransactionDetailsByTransactionID($transactionID);
723
-
724
- //Get Gift information from Params
725
-
726
- if (isset($params['gift']) && $params['gift'] != '')
727
- $giftInfo = $params['gift'];
728
- else
729
- $giftInfo = null;
730
- //
731
- Mage::getModel('zoozpayment/order')->saveOrder($info, $giftInfo);
732
- // create order with billding return
733
- //Mage::log($result);
734
- Mage::getSingleton('core/session')->setZoozInfo($info);
735
-
736
- return $statusCode;
737
- }
738
-
739
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/controllers/CartController.php DELETED
@@ -1,85 +0,0 @@
1
- <?php
2
- require_once 'Mage/Checkout/controllers/CartController.php';
3
- class ZooZ_ZoozPayment_CartController extends Mage_Checkout_CartController
4
- {
5
- public function addAction()
6
- {
7
-
8
-
9
- $cart = $this->_getCart();
10
- $params = $this->getRequest()->getParams();
11
-
12
- $response = array();
13
- try {
14
- if (isset($params['qty'])) {
15
- $filter = new Zend_Filter_LocalizedToNormalized(
16
- array('locale' => Mage::app()->getLocale()->getLocaleCode())
17
- );
18
- $params['qty'] = $filter->filter($params['qty']);
19
- }
20
-
21
- $product = $this->_initProduct();
22
- $related = $this->getRequest()->getParam('related_product');
23
-
24
- /**
25
- * Check product availability
26
- */
27
- if (!$product) {
28
- $response['status'] = 'ERROR';
29
- $response['message'] = $this->__('Unable to find Product ID');
30
- }
31
-
32
- $cart->addProduct($product, $params);
33
- if (!empty($related)) {
34
- $cart->addProductsByIds(explode(',', $related));
35
- }
36
-
37
- $cart->save();
38
-
39
- $this->_getSession()->setCartWasUpdated(true);
40
-
41
-
42
-
43
-
44
- /**
45
- * @todo remove wishlist observer processAddToCart
46
- */
47
- Mage::dispatchEvent('checkout_cart_add_product_complete',
48
- array('product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse())
49
- );
50
-
51
- if (!$cart->getQuote()->getHasError()){
52
- //New Code Here
53
- Mage::register('referrer_url', $this->_getRefererUrl());
54
- $trimmedSessionToken = Mage::getModel('zoozpayment/standard')->ajaxprocessing(true);
55
-
56
- if($trimmedSessionToken != '') {
57
- //Mage::getModel('zoozpayment/order')->saveOrder();
58
- echo "var data = {'token' : '" . $trimmedSessionToken . "'}";
59
- return;
60
- }
61
- }
62
- } catch (Mage_Core_Exception $e) {
63
- $msg = "";
64
- if ($this->_getSession()->getUseNotice(true)) {
65
- $msg = $e->getMessage();
66
- } else {
67
- $messages = array_unique(explode("\n", $e->getMessage()));
68
- foreach ($messages as $message) {
69
- $msg .= $message.'<br/>';
70
- }
71
- }
72
-
73
- $response['status'] = 'ERROR';
74
- $response['message'] = $msg;
75
- $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
76
- return;
77
- } catch (Exception $e) {
78
- $response['status'] = 'ERROR';
79
- $response['message'] = $this->__('Cannot add the item to shopping cart.');
80
- Mage::logException($e);
81
- $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
82
- return;
83
- }
84
- }
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/controllers/EstimateController.php DELETED
@@ -1,156 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Magento
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the Open Software License (OSL 3.0)
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://opensource.org/licenses/osl-3.0.php
12
- *
13
- * @category EcomDev
14
- * @package EcomDev_ProductPageShipping
15
- * @copyright Copyright (c) 2010 Ecommerce Developer Blog (http://www.ecomdev.org)
16
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
17
- */
18
- require_once 'app/code/core/Mage/Catalog/controllers/ProductController.php';
19
-
20
- /**
21
- * Estimate shiping controller, passes the request to estimate model
22
- * Extended from product controller for supporting of full product initialization
23
- *
24
- */
25
- class ZooZ_ZoozPayment_EstimateController extends Mage_Catalog_ProductController {
26
-
27
- /**
28
- * Estimate action
29
- *
30
- * Initializes the product and passes data to estimate model in block
31
- */
32
- protected $productId;
33
-
34
- protected function _initProduct() {
35
- $params = new Varien_Object();
36
- $productId = $this->productId;
37
- //return Mage::helper('catalog/product')->initProduct($productId, $this, $params);
38
- return Mage::getModel('catalog/product')->load($productId);
39
- }
40
-
41
- public function quoteAction() {
42
- echo $discount = Mage::helper('zoozpayment')->getdiscount();
43
- die();
44
- $quote = Mage::getSingleton('checkout/session')->getQuote();
45
- $payment = $quote->getPayment();
46
-
47
- $payment->setMethod('zoozpayment');
48
- //
49
- $quote->collectTotals();
50
- $service = Mage::getModel('sales/service_quote', $quote);
51
- $service->submitAll();
52
- //
53
- $cart = Mage::helper('checkout/cart')->getCart();
54
- $data = $cart->getQuote()->getData();
55
-
56
- //$quote = Mage::getSingleton('checkout/session')->getQuote();
57
- // print_r($quote->getData());
58
- // $rewardsQuote = Mage::getSingleton('rewards/session')->getQuote();
59
- // print_r($rewardsQuote);
60
- // $cart = Mage::getSingleton('checkout/cart');
61
- // $rewardsQuote = Mage::getModel('rewards/sales_quote');
62
- //
63
- // $rewardsQuote->updateItemCatalogPoints( $cart->getQuote() );
64
- //
65
- // $cart->getQuote ()->collectTotals ();
66
- // $cart->getQuote ()->getShippingAddress ()->setCollectShippingRates ( true );
67
- // $cart->getQuote ()->getShippingAddress ()->collectShippingRates();
68
- //
69
- // $rewardsQuote->updateDisabledEarnings( $cart->getQuote() );
70
- // $cart = Mage::getSingleton('checkout/cart');
71
- // $rewardsQuote->updateItemCatalogPoints($cart->getQuote());
72
- // $rewardsQuote->setPointsSpending('500');
73
- // $cart = Mage::getSingleton('checkout/cart');
74
- // $rewardsQuote = Mage::getModel('rewards/sales_quote');
75
- //
76
- // $rewardsQuote->updateItemCatalogPoints($cart->getQuote());
77
- //
78
- // $cart->getQuote()->collectTotals();
79
- // $cart->getQuote()->getShippingAddress()->setCollectShippingRates(true);
80
- // $cart->getQuote()->getShippingAddress()->collectShippingRates();
81
- //
82
- // $rewardsQuote->updateDisabledEarnings($cart->getQuote());
83
- // echo $rewardsQuote->getTotalPointsSpendingAsStringList()."kkkk";
84
- // print_r($rewardsQuote->updateShoppingCartPoints($cart));
85
- //magento.zooz.com/magentoe/index.php/zoozpayment/index/test/
86
- }
87
-
88
- public function indexAction() {
89
- Mage::log("Received Estimate controller index action");
90
- $data_json = $this->getRequest()->getPost('data');
91
- if ($data_json == '') {
92
- $data_json = file_get_contents('php://input');
93
- }
94
- Mage::log("Json received" . $data_json);
95
-
96
-
97
- if ($data_json == '') {
98
- Mage::log("Could not receive data.");
99
- return;
100
- }
101
- $variable_post = json_decode($data_json);
102
- $arr_addressinfo = get_object_vars($variable_post->estimate);
103
- $arr_cart = $variable_post->cart;
104
- $this->getResponse()->setHeader('Content-type', 'application/json');
105
- Mage::log("Loading layout");
106
- $this->loadLayout(false);
107
- $block = $this->getLayout()->getBlock('shipping.estimate.result');
108
- Mage::log("Block receieved");
109
- if ($block) {
110
-
111
- $estimate = $block->getEstimate();
112
- foreach ($arr_cart as $pro) {
113
- Mage::log("Itterating product ID: " . $pro->invoiceItemId);
114
- if ($pro->invoiceItemId == '-i') {
115
- continue;
116
- }
117
-
118
- $this->productId = $pro->invoiceItemId;
119
-
120
- $product = $this->_initProduct($pro->invoiceItemId);
121
- if (isset($pro->options) && $pro->options != '') {
122
-
123
- $params = get_object_vars($pro->options);
124
- $pro_cart = array('product' => $pro->invoiceItemId, 'qty' => $pro->qty, 'options' => $params);
125
- } else {
126
-
127
- $pro_cart = array('product' => $pro->invoiceItemId, 'qty' => $pro->qty);
128
- }
129
-
130
- $product->setAddToCartInfo($pro_cart);
131
- $estimate->setProduct($product);
132
- Mage::unregister('current_category');
133
- Mage::unregister('current_product');
134
- Mage::unregister('product');
135
- }
136
- ///$addressInfo = $arr_addressinfo;
137
- $addressConvert = array("city" => isset($arr_addressinfo["city"]) ? $arr_addressinfo["city"] : "", "region_id" => isset($arr_addressinfo["stateName"]) ? $arr_addressinfo["stateName"] : "", "postcode" => isset($arr_addressinfo["zipCode"]) ? $arr_addressinfo["zipCode"] : "", "country_id" => isset($arr_addressinfo["countryCode"]) ? $arr_addressinfo["countryCode"] : "");
138
- Mage::log("Address converted");
139
- $estimate->setAddressInfo((array) $addressConvert);
140
- $block->getSession()->setFormValues($addressConvert);
141
- try {
142
- $estimate->estimate();
143
- } catch (Mage_Core_Exception $e) {
144
- Mage::getSingleton('catalog/session')->addError($e->getMessage());
145
- } catch (Exception $e) {
146
- Mage::logException($e);
147
- Mage::getSingleton('catalog/session')->addError(
148
- Mage::helper('zoozpayment')->__('There was an error during processing your shipping request')
149
- );
150
- }
151
- }
152
- $this->_initLayoutMessages('catalog/session');
153
- $this->renderLayout();
154
- }
155
-
156
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/controllers/IndexController.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
-
3
- class ZooZ_ZoozPayment_IndexController extends Mage_Core_Controller_Front_Action {
4
-
5
- //public function IndexAction() {
6
- //$this->getResponse()->setRedirect(Mage::getUrl('', array('_secure' => true)));
7
- //}
8
- public function testAction() {
9
- // $tempAddress = Mage::getModel('sales/quote_address')->load(596 );
10
- // $quote = Mage::getSingleton('checkout/session')->getQuote();
11
- // echo $giftcardAmount = $quote->getGiftCardsAmountUsed();
12
- // die();
13
- $quote = Mage::getSingleton('checkout/session')->getQuote();
14
- print_r($quote->getData());
15
- die();
16
- $coupon_code = $quote->getCouponCode();
17
- $oCoupon = Mage::getModel('salesrule/coupon')->load($coupon_code, 'code');
18
- $oRule = Mage::getModel('salesrule/rule')->load($oCoupon->getRuleId());
19
- $oRule->getName();
20
- die();
21
- $date = new DateTime('now');
22
- echo $date->format('Y-m-d H:i:s');
23
- die();
24
- $card_history = Mage::getModel('enterprise_giftcardaccount/history');
25
- $card_history->setGiftcardaccountId();
26
- $card_history->setUpdatedAt();
27
- $card_history->setAction(1);
28
- $card_history->setBalanceAmount();
29
- $card_history->setAdditionalInfo();
30
- $card_history->setBalanceDelta();
31
-
32
- print_r($card_history->getData());
33
-
34
- die();
35
- $_card = Mage::getModel('enterprise_giftcardaccount/giftcardaccount')->load(1);
36
- $_card->setBalance(80);
37
- $_card->save();
38
- print_r($_card->getData());
39
- //
40
- die();
41
- $giftcart_s = 'a:1:{i:0;a:4:{s:1:"i";s:1:"2";s:1:"c";s:12:"02DQ9T1K0Y0V";s:1:"a";d:17;s:2:"ba";s:7:"17.0000";}}';
42
- $giftcart = unserialize($giftcart_s);
43
- $temp_1 = $giftcart[0];
44
- $temp_1['authorized'] = $temp_1['a'];
45
- $temp_2[] = $temp_1;
46
- $giftcart_auth = serialize($temp_2);
47
-
48
- die();
49
- $quote = Mage::getSingleton('checkout/session')->getQuote();
50
- $shippingAddress = $quote->getShippingAddress();
51
- // $shippingAddress->setShippingMethod(freeshipping_freeshipping);
52
- // $shippingAddress->save();
53
- print_r($shippingAddress->getData());
54
- echo "Dev";
55
- // $quote = Mage::getSingleton('checkout/session')->getQuote();
56
- //
57
- // $cart = unserialize($quote->getGiftCards());
58
- //
59
- // echo $quote->getGiftCardsAmount();
60
- // echo $quote->getBaseGiftCardsAmount();
61
- // echo $quote->getGiftCardsAmountUsed();
62
- // echo $quote->getBaseGiftCardsAmountUsed();
63
- // print_r($quote->getData());
64
- // a:1:{i:0;a:5:{s:1:"i";s:1:"2";s:1:"c";s:12:"02DQ9T1K0Y0V";s:1:"a";d:252;s:2:"ba";d:252;s:10:"authorized";d:252;}}
65
- // echo $giftcardAmount = $quote->getGiftCardsAmountUsed();
66
- // die();
67
- }
68
-
69
- public function IndexAction() {
70
- $this->loadLayout();
71
- $this->getLayout()->getBlock("head")->setTitle($this->__("Zoozpayment checkout"));
72
-
73
- $breadcrumbs = $this->getLayout()->getBlock("breadcrumbs");
74
- $breadcrumbs->addCrumb("home", array(
75
- "label" => $this->__("Home Page"),
76
- "title" => $this->__("Home Page"),
77
- "link" => Mage::getBaseUrl()
78
- ));
79
-
80
- $breadcrumbs->addCrumb("zoozpayment", array(
81
- "label" => $this->__("Zoozpayment checkout"),
82
- "title" => $this->__("Zoozpayment checkout")
83
- ));
84
-
85
- $this->renderLayout();
86
- }
87
-
88
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/controllers/StandardController.php DELETED
@@ -1,151 +0,0 @@
1
- <?php
2
-
3
- class ZooZ_ZoozPayment_StandardController extends Mage_Core_Controller_Front_Action {
4
-
5
- public function indexAction() {
6
- $this->getResponse()->setRedirect(Mage::getUrl('', array('_secure' => true)));
7
- }
8
-
9
- public function redirectAction() {
10
-
11
- $trimmedSessionToken = Mage::getModel('zoozpayment/standard')->ajaxprocessing();
12
- if ($trimmedSessionToken != '') {
13
-
14
- $this->getResponse()->setRedirect(Mage::getUrl('zoozpayment') . '?token=' . $trimmedSessionToken);
15
- }
16
- }
17
-
18
- public function successexpressAction() {
19
-
20
- $statusCode = Mage::getModel('zoozpayment/standard')->successprocessing();
21
- if ($statusCode == 0) {
22
-
23
- $session = Mage::getSingleton('checkout/session');
24
- $session->setQuoteId($session->getZoozQuoteId(true));
25
- if ($session->getLastRealOrderId()) {
26
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
27
- if ($order->getId()) {
28
- // $status = Mage::getStoreConfig('payment/zoozpayment/order_status');
29
- $grandtotal = Mage::getSingleton('core/session')->getZoozGrandTotal();
30
- $info = Mage::getSingleton('core/session')->getZoozInfo();
31
- $payment = $order->getPayment();
32
- $payment->setStatus(Mage_Payment_Model_Method_Abstract::STATUS_APPROVED)
33
- ->setTransactionId($info->transactionID)
34
- ->setStatusDescription('Payment was successful.')
35
- ->setAdditionalData(serialize(''))
36
- ->setIsTransactionClosed('')
37
- ->authorize(true, $grandtotal)
38
- ->save();
39
- $order->setPayment($payment);
40
- $order->save(); //Save details in order
41
- if (Mage::getStoreConfig('payment/zoozpayment/payment_action') == "authorize_capture") {
42
- try {
43
- if (!$order->canInvoice()) {
44
- Mage::throwException(Mage::helper('core')->__('Cannot create an invoice.'));
45
- }
46
- $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
47
- if (!$invoice->getTotalQty()) {
48
- Mage::throwException(Mage::helper('core')->__('Cannot create an invoice without products.'));
49
- }
50
- $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
51
- $invoice->register();
52
- $transactionSave = Mage::getModel('core/resource_transaction')
53
- ->addObject($invoice)
54
- ->addObject($invoice->getOrder());
55
- $transactionSave->save();
56
- } catch (Mage_Core_Exception $e) {
57
-
58
- }
59
- }
60
- Mage::getSingleton('core/session')->unsZoozGrandTotal();
61
- Mage::getSingleton('core/session')->unsZoozInfo();
62
- // $order->setState($status, true)->save();
63
- }
64
- }
65
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/onepage/success'));
66
- } else {
67
- $session = Mage::getSingleton('checkout/session');
68
- $session->setQuoteId($session->getZoozQuoteId(true));
69
- if ($session->getLastRealOrderId()) {
70
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
71
- if ($order->getId()) {
72
- $order->cancel()->save();
73
- }
74
- }
75
- $params = Mage::app()->getRequest()->getParams();
76
-
77
- Mage::getSingleton('checkout/session')->addError($params['errorMessage']);
78
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
79
- }
80
- }
81
-
82
- public function successAction() {
83
-
84
- $statusCode = Mage::getModel('zoozpayment/standard')->successprocessing();
85
-
86
- if ($statusCode == 0) {
87
- $session = Mage::getSingleton('checkout/session');
88
- $session->setQuoteId($session->getZoozQuoteId(true));
89
- if ($session->getLastRealOrderId()) {
90
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
91
- if ($order->getId()) {
92
- $order->setState(Mage_Sales_Model_Order::STATE_NEW, true)->save();
93
- }
94
- }
95
-
96
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/onepage/success'));
97
- } else {
98
- $session = Mage::getSingleton('checkout/session');
99
- $session->setQuoteId($session->getZoozQuoteId(true));
100
- if ($session->getLastRealOrderId()) {
101
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
102
- if ($order->getId()) {
103
- $order->cancel()->save();
104
- }
105
- }
106
- $params = Mage::app()->getRequest()->getParams();
107
-
108
- Mage::getSingleton('checkout/session')->addError($params['errorMessage']);
109
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
110
- }
111
- }
112
-
113
- function cancelAction() {
114
- $session = Mage::getSingleton('checkout/session');
115
- $session->setQuoteId($session->getZoozQuoteId(true));
116
- if ($session->getLastRealOrderId()) {
117
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
118
- if ($order->getId()) {
119
- $order->cancel()->save();
120
- }
121
- }
122
-
123
- $params = Mage::app()->getRequest()->getParams();
124
- Mage::log($params);
125
- Mage::getSingleton('checkout/session')->addError($params['errorMessage']);
126
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
127
- }
128
-
129
- function ajaxstartAction() {
130
-
131
- $trimmedSessionToken = Mage::getModel('zoozpayment/standard')->ajaxprocessing(true);
132
- if ($trimmedSessionToken != '') {
133
-
134
- echo "var data = {'token' : '" . $trimmedSessionToken . "'}";
135
-
136
- return;
137
- }
138
- }
139
-
140
- function startAction() {
141
-
142
- $url = Mage::getModel('zoozpayment/standard')->processing(true);
143
- if ($url) {
144
- Mage::getModel('zoozpayment/order')->saveOrder();
145
- $this->getResponse()->setRedirect($url);
146
- } else {
147
- $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
148
- }
149
- }
150
-
151
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/etc/config.xml DELETED
@@ -1,77 +0,0 @@
1
- <?xml version="1.0"?>
2
- <config>
3
- <modules>
4
- <ZooZ_ZoozPayment>
5
- <version>0.1.0</version>
6
- </ZooZ_ZoozPayment>
7
- </modules>
8
- <global>
9
- <helpers>
10
- <zoozpayment>
11
- <class>ZooZ_ZoozPayment_Helper</class>
12
- </zoozpayment>
13
- </helpers>
14
-
15
- <models>
16
- <zoozpayment>
17
- <class>ZooZ_ZoozPayment_Model</class>
18
- </zoozpayment>
19
- <tax>
20
- <rewrite>
21
- <!-- Model -->
22
- <observer>ZooZ_ZoozPayment_Model_Observer</observer>
23
- </rewrite>
24
- </tax>
25
- </models>
26
- <helpers>
27
- <zoozpayment>
28
- <class>ZooZ_ZoozPayment_Helper</class>
29
- </zoozpayment>
30
- </helpers>
31
- <blocks>
32
- <zoozpayment>
33
- <class>ZooZ_ZoozPayment_Block</class>
34
- </zoozpayment>
35
- </blocks>
36
- </global>
37
- <default>
38
- <payment>
39
- <zoozpayment>
40
- <model>zoozpayment/standard</model>
41
- <active>1</active>
42
- <order_status>pending</order_status>
43
- <title>ZooZ Payment</title>
44
- <payment_action>sale</payment_action>
45
- <allowspecific>0</allowspecific>
46
- <sort_order>1</sort_order>
47
- <zooz_sandbox_url>https://sandbox.zooz.co</zooz_sandbox_url>
48
- <zooz_production_url>https://app.zooz.com</zooz_production_url>
49
- <app_key>6fe2b3eb-3017-4d84-a5df-c14d675008ae</app_key>
50
- <app_unique_id>com.yourcompany.DemoZooZSDK.magento</app_unique_id>
51
- <zooz_serverkey>FMJM7QYXIOO2Y55FXBK7GTHUWE</zooz_serverkey>
52
- <zooz_useremail>ronen@tactusmobile.com</zooz_useremail>
53
- </zoozpayment>
54
- </payment>
55
- </default>
56
-
57
-
58
- <frontend>
59
- <routers>
60
- <zoozpayment>
61
- <use>standard</use>
62
- <args>
63
- <module>ZooZ_ZoozPayment</module>
64
- <frontName>zoozpayment</frontName>
65
- </args>
66
- </zoozpayment>
67
- </routers>
68
- <layout>
69
- <updates>
70
- <zoozpayment>
71
- <file>zoozpayment.xml</file>
72
- </zoozpayment>
73
- </updates>
74
- </layout>
75
- </frontend>
76
-
77
- </config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/ZooZ/ZoozPayment/etc/system.xml DELETED
@@ -1,119 +0,0 @@
1
- <?xml version="1.0"?>
2
- <config>
3
- <sections>
4
- <payment>
5
- <groups>
6
- <zoozpayment translate="label comment" module="paypal">
7
- <label>ZooZ Payment</label>
8
- <frontend_type>text</frontend_type>
9
- <sort_order>100</sort_order>
10
- <show_in_default>1</show_in_default>
11
- <show_in_website>1</show_in_website>
12
- <show_in_store>1</show_in_store>
13
- <fields>
14
- <active translate="label">
15
- <label>Enabled</label>
16
- <frontend_type>select</frontend_type>
17
- <source_model>adminhtml/system_config_source_yesno</source_model>
18
- <sort_order>10</sort_order>
19
- <show_in_default>1</show_in_default>
20
- <show_in_website>1</show_in_website>
21
- <show_in_store>0</show_in_store>
22
- </active>
23
- <title translate="label">
24
- <label>Title</label>
25
- <frontend_type>text</frontend_type>
26
- <sort_order>20</sort_order>
27
- <show_in_default>1</show_in_default>
28
- <show_in_website>1</show_in_website>
29
- <show_in_store>1</show_in_store>
30
- </title>
31
- <payment_action translate="label">
32
- <label>Payment Action</label>
33
- <frontend_type>select</frontend_type>
34
- <source_model>zoozpayment/source_action</source_model>
35
- <sort_order>21</sort_order>
36
- <show_in_default>1</show_in_default>
37
- <show_in_website>1</show_in_website>
38
- </payment_action>
39
- <order_status translate="label">
40
- <label>New Order Status</label>
41
- <frontend_type>select</frontend_type>
42
- <source_model>zoozpayment/source_status</source_model>
43
- <sort_order>30</sort_order>
44
- <show_in_default>1</show_in_default>
45
- <show_in_website>1</show_in_website>
46
- <show_in_store>0</show_in_store>
47
- </order_status>
48
- <sandbox_flag translate="label">
49
- <label>Sandbox</label>
50
- <frontend_type>select</frontend_type>
51
- <source_model>adminhtml/system_config_source_yesno</source_model>
52
- <sort_order>40</sort_order>
53
- <show_in_default>1</show_in_default>
54
- <show_in_website>1</show_in_website>
55
- <show_in_store>0</show_in_store>
56
- </sandbox_flag>
57
- <zooz_useremail translate="label">
58
- <label>Zooz User email</label>
59
- <frontend_type>text</frontend_type>
60
- <sort_order>70</sort_order>
61
- <show_in_default>1</show_in_default>
62
- <show_in_website>1</show_in_website>
63
- <show_in_store>0</show_in_store>
64
- </zooz_useremail>
65
- <zooz_serverkey translate="label">
66
- <label>Zooz Server Key</label>
67
- <frontend_type>password</frontend_type>
68
- <sort_order>80</sort_order>
69
- <show_in_default>1</show_in_default>
70
- <show_in_website>1</show_in_website>
71
- <show_in_store>0</show_in_store>
72
- </zooz_serverkey>
73
-
74
- <app_key>
75
- <label>App key</label>
76
- <frontend_type>password</frontend_type>
77
- <sort_order>100</sort_order>
78
- <show_in_default>1</show_in_default>
79
- <show_in_website>1</show_in_website>
80
- <show_in_store>0</show_in_store>
81
- </app_key>
82
- <app_unique_id>
83
- <label>App Unique ID</label>
84
- <frontend_type>text</frontend_type>
85
- <sort_order>110</sort_order>
86
- <show_in_default>1</show_in_default>
87
- <show_in_website>1</show_in_website>
88
- <show_in_store>0</show_in_store>
89
- </app_unique_id>
90
- <zooz_sandbox_url>
91
- <label>Zooz sandbox URL</label>
92
- <frontend_type>text</frontend_type>
93
- <sort_order>130</sort_order>
94
- <show_in_default>0</show_in_default>
95
- <show_in_website>0</show_in_website>
96
- <show_in_store>0</show_in_store>
97
- </zooz_sandbox_url>
98
- <zooz_production_url>
99
- <label>Zooz production URL</label>
100
- <frontend_type>text</frontend_type>
101
- <sort_order>131</sort_order>
102
- <show_in_default>0</show_in_default>
103
- <show_in_website>0</show_in_website>
104
- <show_in_store>0</show_in_store>
105
- </zooz_production_url>
106
- <sort_order translate="label">
107
- <label>Sort Order</label>
108
- <frontend_type>text</frontend_type>
109
- </sort_order>
110
- <sort_order>100</sort_order>
111
- <show_in_default>1</show_in_default>
112
- <show_in_website>1</show_in_website>
113
- <show_in_store>0</show_in_store>
114
- </fields>
115
- </zoozpayment>
116
- </groups>
117
- </payment>
118
- </sections>
119
- </config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/Zooz/Payments/Block/Customer/Creditcard.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Block_Customer_Creditcard extends Mage_Core_Block_Template {
10
+
11
+ protected $_api = false;
12
+
13
+ protected $_customer = false;
14
+
15
+ protected function _construct() {
16
+ parent::_construct();
17
+ $this->_api = Mage::getSingleton('payments/api');
18
+ $this->_customer = Mage::getSingleton('customer/session')->getCustomer();
19
+ }
20
+
21
+ /**
22
+ * Retrieve payment model object
23
+ *
24
+ * @return Zooz_Payments_Model_Payments
25
+ */
26
+ protected function _getPayment() {
27
+ return Mage::getSingleton('payments/payments');
28
+ }
29
+
30
+ /**
31
+ * Retrieve payment configuration object
32
+ *
33
+ * @return Zooz_Payments_Model_Config
34
+ */
35
+ protected function _getConfig() {
36
+ return Mage::getSingleton('payments/config');
37
+ }
38
+
39
+ public function getPaymentMethods()
40
+ {
41
+ $customerLoginId = false;
42
+
43
+ if($this->_customer) {
44
+ $customerLoginId = $this->_customer->getId();
45
+ if($customerLoginId > 0) {
46
+ return $this->_api->getPaymentMethods($customerLoginId, true);
47
+ }
48
+ }
49
+
50
+ return false;
51
+ }
52
+
53
+ public function getCountryCollection()
54
+ {
55
+ if (!$this->_countryCollection) {
56
+ $this->_countryCollection = Mage::getSingleton('directory/country')->getResourceCollection()
57
+ ->loadByStore();
58
+ }
59
+ return $this->_countryCollection;
60
+ }
61
+
62
+ public function getCountryHtmlSelect()
63
+ {
64
+ $countryId = null;
65
+
66
+ $customerAddressId = $this->_customer->getDefaultBilling();
67
+ if ($customerAddressId) {
68
+ $address = Mage::getModel('customer/address')->load($customerAddressId);
69
+ $countryId = $address['country_id'];
70
+ }
71
+
72
+ if (is_null($countryId)) {
73
+ $countryId = Mage::helper('core')->getDefaultCountry();
74
+ }
75
+ $select = $this->getLayout()->createBlock('core/html_select')
76
+ ->setName('country_id')
77
+ ->setId('country_id')
78
+ ->setTitle(Mage::helper('payments')->__('Country'))
79
+ ->setClass('validate-select')
80
+ ->setValue($countryId)
81
+ ->setOptions($this->getCountryOptions());
82
+
83
+ return $select->getHtml();
84
+ }
85
+
86
+ public function getCountryOptions()
87
+ {
88
+ $options = false;
89
+ $useCache = Mage::app()->useCache('config');
90
+ if ($useCache) {
91
+ $cacheId = 'DIRECTORY_COUNTRY_SELECT_STORE_' . Mage::app()->getStore()->getCode();
92
+ $cacheTags = array('config');
93
+ if ($optionsCache = Mage::app()->loadCache($cacheId)) {
94
+ $options = unserialize($optionsCache);
95
+ }
96
+ }
97
+
98
+ if ($options == false) {
99
+ $options = $this->getCountryCollection()->toOptionArray();
100
+ if ($useCache) {
101
+ Mage::app()->saveCache(serialize($options), $cacheId, $cacheTags);
102
+ }
103
+ }
104
+ return $options;
105
+ }
106
+
107
+ /**
108
+ * Retrieve availables credit card types
109
+ *
110
+ * @return array
111
+ */
112
+ public function getCcTypes() {
113
+ $method = $this->_getPayment();
114
+ return $this->_getConfig()->getCcAvailableTypes($method);
115
+ }
116
+
117
+ /**
118
+ * Retrieve credit card expire months
119
+ *
120
+ * @return array
121
+ */
122
+ public function getCcMonths()
123
+ {
124
+ $months = $this->getData('cc_months');
125
+ $result = $this->_getConfig()->getCcMonths($months);
126
+ $this->setData('cc_months', $result);
127
+ return $result;
128
+ }
129
+
130
+ /**
131
+ * Retrieve credit card expire years
132
+ *
133
+ * @return array
134
+ */
135
+ public function getCcYears()
136
+ {
137
+ $years = $this->getData('cc_years');
138
+ $result = $this->_getConfig()->getCcYears($years);
139
+ $this->setData('cc_years', $result);
140
+ return $result;
141
+ }
142
+
143
+ public function getCreditCardDetails()
144
+ {
145
+ $paymentData = false;
146
+
147
+ $token = $this->getRequest()->getParam('t');
148
+ $paymentMethods = $this->_api->getPaymentMethods($this->_customer->getId(), true);
149
+ foreach($paymentMethods as $key => $pm) {
150
+ if($pm->getData('paymentMethodToken') == $token) {
151
+ $paymentData = $pm->getData();
152
+ }
153
+ }
154
+
155
+ return $paymentData;
156
+ }
157
+
158
+
159
+ /**
160
+ * Retrieve availables credit card types
161
+ *
162
+ * @return array
163
+ */
164
+ public function getCcAvailableTypesByConfig() {
165
+
166
+ return Mage::getStoreConfig('payment/payments/cctypes');
167
+
168
+ }
169
+ }
app/code/community/Zooz/Payments/Block/Form/Payments.php ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Block_Form_Payments extends Mage_Payment_Block_Form {
10
+
11
+ protected function _construct() {
12
+ parent::_construct();
13
+ $this->setTemplate('zoozpayments/form/payments.phtml');
14
+ }
15
+
16
+ /**
17
+ * Retrieve payment configuration object
18
+ *
19
+ * @return Zooz_Payments_Model_Config
20
+ */
21
+ protected function _getConfig() {
22
+ return Mage::getSingleton('payments/config');
23
+ }
24
+
25
+ /**
26
+ * Retrieve payment model object
27
+ *
28
+ * @return Zooz_Payments_Model_Payments
29
+ */
30
+ protected function _getPayment() {
31
+ return Mage::getSingleton('payments/payments');
32
+ }
33
+
34
+ /**
35
+ * Retrieve availables credit card types
36
+ *
37
+ * @return array
38
+ */
39
+ public function getCcAvailableTypes() {
40
+
41
+ $method = $this->getMethod();
42
+
43
+ return $this->_getConfig()->getCcAvailableTypes($method);
44
+ }
45
+
46
+
47
+
48
+
49
+
50
+ /**
51
+ * Checks whether customer is allowed to save credit card data
52
+ *
53
+ * @return bool
54
+ */
55
+ public function isSavingCardDataAllowed()
56
+ {
57
+ return Mage::getModel('payments/config')->isSavingCardDataAllowed();
58
+ }
59
+
60
+ public function getSavedCards()
61
+ {
62
+ $customerId = Mage::getSingleton('customer/session')->getCustomerId();
63
+
64
+ //if saving cards is not customer user shoulnd't be allowed to use saved credit card
65
+ if (!$this->isSavingCardDataAllowed() || !$customerId) {
66
+ return array();
67
+ }
68
+
69
+ $api = Mage::getModel('payments/api');
70
+ $cardsData = $api->getPaymentMethods($customerId);
71
+ return $cardsData;
72
+ }
73
+
74
+ /**
75
+ * Retrieve credit card expire months
76
+ *
77
+ * @return array
78
+ */
79
+ public function getCcMonths()
80
+ {
81
+ $months = $this->getData('cc_months');
82
+ $result = $this->_getConfig()->getCcMonths($months);
83
+ $this->setData('cc_months', $result);
84
+ return $result;
85
+ }
86
+
87
+ /**
88
+ * Retrieve credit card expire years
89
+ *
90
+ * @return array
91
+ */
92
+ public function getCcYears()
93
+ {
94
+ $years = $this->getData('cc_years');
95
+ $result = $this->_getConfig()->getCcYears($years);
96
+ $this->setData('cc_years', $result);
97
+ return $result;
98
+ }
99
+
100
+ /**
101
+ * Retrive payment mode type
102
+ *
103
+ * @return string
104
+ */
105
+ public function getPaymentModeType()
106
+ {
107
+ if ($this->getMethod()) {
108
+ $configData = $this->getMethod()->getConfigData('payment_mode');
109
+ if(is_null($configData)){
110
+ return Zooz_Payments_Model_Payments::ACTION_MODE_SANDBOX;
111
+ }
112
+ return $configData;
113
+ }
114
+ return Zooz_Payments_Model_Payments::ACTION_MODE_SANDBOX;
115
+ }
116
+
117
+ public function getPaymentToken($payment, $amount)
118
+ {
119
+ $paymentModel = $this->_getPayment();
120
+ $result = $paymentModel->getPaymentToken($payment, $amount);
121
+ return $result;
122
+ }
123
+
124
+ /**
125
+ * @return bool
126
+ */
127
+ public function isPciIframeEnabled()
128
+ {
129
+ return $this->_getConfig()->isPciIframeEnabled();
130
+ }
131
+
132
+ public function getIframeUrl()
133
+ {
134
+ return $this->_getConfig()->getPciIframeUrl();
135
+ }
136
+
137
+ public function getUniqueId()
138
+ {
139
+ return $this->_getConfig()->getProgramId();
140
+ }
141
+
142
+ public function isSandbox()
143
+ {
144
+ return $this->_getConfig()->isSandbox();
145
+ }
146
+ }
app/code/community/Zooz/Payments/Block/Info/Payments.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Block_Info_Payments extends Mage_Payment_Block_Info_Cc {
10
+
11
+ /**
12
+ * Checkout progress information block flag
13
+ *
14
+ * @var bool
15
+ */
16
+ protected $_isCheckoutProgressBlockFlag = true;
17
+ /**
18
+ * Set block template
19
+ */
20
+ protected function _construct()
21
+ {
22
+ parent::_construct();
23
+ $this->setTemplate('zoozpayments/info/payments.phtml');
24
+ }
25
+
26
+ /**
27
+ * Render as PDF
28
+ *
29
+ * @return string
30
+ */
31
+ public function toPdf()
32
+ {
33
+ $this->setTemplate('zoozpayments/info/pdf.phtml');
34
+ return $this->toHtml();
35
+ }
36
+
37
+ /**
38
+ * Retrieve card info object
39
+ *
40
+ * @return mixed
41
+ */
42
+ public function getInfo()
43
+ {
44
+ if ($this->hasCardInfoObject()) {
45
+ return $this->getCardInfoObject();
46
+ }
47
+ return parent::getInfo();
48
+ }
49
+
50
+ /**
51
+ * Set checkout progress information block flag
52
+ * to avoid showing credit card information from payment quote
53
+ * in Previously used card information block
54
+ *
55
+ * @param bool $flag
56
+ * @return Mage_Paygate_Block_Authorizenet_Info_Cc
57
+ */
58
+ public function setCheckoutProgressBlock($flag)
59
+ {
60
+ $this->_isCheckoutProgressBlockFlag = $flag;
61
+ return $this;
62
+ }
63
+
64
+ /**
65
+ * Retrieve credit cards info
66
+ *
67
+ * @return array
68
+ */
69
+ public function getCards()
70
+ {
71
+ $cardsData = $this->getMethod()->getCardsStorage()->getCards();
72
+ $cards = array();
73
+
74
+ if (is_array($cardsData)) {
75
+ foreach ($cardsData as $cardInfo) {
76
+ $data = array();
77
+ if ($cardInfo->getProcessedAmount()) {
78
+ $amount = Mage::helper('core')->currency($cardInfo->getProcessedAmount(), true, false);
79
+ $data[Mage::helper('payments')->__('Processed Amount')] = $amount;
80
+ }
81
+ if ($cardInfo->getBalanceOnCard() && is_numeric($cardInfo->getBalanceOnCard())) {
82
+ $balance = Mage::helper('core')->currency($cardInfo->getBalanceOnCard(), true, false);
83
+ $data[Mage::helper('payments')->__('Remaining Balance')] = $balance;
84
+ }
85
+ $this->setCardInfoObject($cardInfo);
86
+ $cards[] = array_merge($this->getSpecificInformation(), $data);
87
+ $this->unsCardInfoObject();
88
+ $this->_paymentSpecificInformation = null;
89
+ }
90
+ }
91
+ if ($this->getInfo()->getCcType() && $this->_isCheckoutProgressBlockFlag) {
92
+ $cards[] = $this->getSpecificInformation();
93
+ }
94
+ return $cards;
95
+ }
96
+ }
app/code/community/Zooz/Payments/Exception.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Exception extends Mage_Payment_Exception
10
+ {
11
+ protected $_code = null;
12
+
13
+ public function __construct($message = null, $code = 0)
14
+ {
15
+ $this->_code = $code;
16
+ parent::__construct($message, 0);
17
+ self::logException($message);
18
+ }
19
+
20
+ public function getFields()
21
+ {
22
+ return $this->_code;
23
+ }
24
+
25
+ /**
26
+ * Log an ZooZ_Payments_Exception
27
+ * @param string $e
28
+ */
29
+ public static function logException($e)
30
+ {
31
+ Mage::log("\n" . $e, Zend_Log::ERR, 'zooz_exception.log');
32
+ }
33
+ }
app/code/community/Zooz/Payments/Helper/Data.php ADDED
@@ -0,0 +1,1229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */
9
+
10
+ class Zooz_Payments_Helper_Data extends Mage_Core_Helper_Abstract
11
+ {
12
+ const CUSTOMER_IFRAME = 'https://paymentpages.zooz.com/Magento/iframe_customer_dashboard.html';
13
+
14
+ private $_subtypeToTypeCodeMap = array(
15
+ 'visa' => 'VI',
16
+ 'mastercard' => 'MC',
17
+ 'americanexpress' => 'AE',
18
+ 'discover' => 'DI',
19
+ 'diners' => 'DICL',
20
+ 'jcb' => 'JCB',
21
+ );
22
+
23
+ /**
24
+ * Converts a lot of messages to message
25
+ *
26
+ * @param array $messages
27
+ * @return string
28
+ */
29
+ public function convertMessagesToMessage($messages)
30
+ {
31
+ return implode(' | ', $messages);
32
+ }
33
+
34
+ /**
35
+ * Return message for gateway transaction request
36
+ *
37
+ * @param Mage_Payment_Model_Info $payment
38
+ * @param string $requestType
39
+ * @param string $lastTransactionId
40
+ * @param Varien_Object $card
41
+ * @param float $amount
42
+ * @param string $exception
43
+ * @return bool|string
44
+ */
45
+ public function getTransactionMessage($payment, $requestType, $lastTransactionId, $card, $amount = false, $exception = false
46
+ )
47
+ {
48
+ return $this->getExtendedTransactionMessage(
49
+ $payment, $requestType, $lastTransactionId, $card, $amount, $exception
50
+ );
51
+ }
52
+
53
+ /**
54
+ * Return message for gateway transaction request
55
+ *
56
+ * @param Mage_Payment_Model_Info $payment
57
+ * @param string $requestType
58
+ * @param string $lastTransactionId
59
+ * @param Varien_Object $card
60
+ * @param float $amount
61
+ * @param string $exception
62
+ * @param string $additionalMessage Custom message, which will be added to the end of generated message
63
+ * @return bool|string
64
+ */
65
+ public function getExtendedTransactionMessage($payment, $requestType, $lastTransactionId, $card, $amount = false, $exception = false, $additionalMessage = false
66
+ )
67
+ {
68
+ $operation = $this->_getOperation($requestType);
69
+
70
+ if (!$operation) {
71
+ return false;
72
+ }
73
+
74
+ if ($amount) {
75
+ $amount = $this->__('amount %s', $this->_formatPrice($payment, $amount));
76
+ }
77
+
78
+ if ($exception) {
79
+ $result = $this->__('failed');
80
+ } else {
81
+ $result = $this->__('successful');
82
+ }
83
+
84
+ $card = $this->__('Credit Card: xxxx-%s', $card->getCcLast4());
85
+
86
+ $pattern = '%s %s %s - %s.';
87
+ $texts = array($card, $amount, $operation, $result);
88
+
89
+ if (!is_null($lastTransactionId)) {
90
+ $pattern .= ' %s.';
91
+ $texts[] = $this->__('Zooz Transaction ID %s', $lastTransactionId);
92
+ }
93
+
94
+ if ($additionalMessage) {
95
+ $pattern .= ' %s.';
96
+ $texts[] = $additionalMessage;
97
+ }
98
+ $pattern .= ' %s';
99
+ $texts[] = $exception;
100
+
101
+ return call_user_func_array(array($this, '__'), array_merge(array($pattern), $texts));
102
+ }
103
+
104
+ /**
105
+ * Return operation name for request type
106
+ *
107
+ * @param string $requestType
108
+ * @return bool|string
109
+ */
110
+ protected function _getOperation($requestType)
111
+ {
112
+ switch ($requestType) {
113
+ case Zooz_Payments_Model_Payments::REQUEST_TYPE_AUTH_ONLY:
114
+ return $this->__('authorize');
115
+ case Zooz_Payments_Model_Payments::REQUEST_TYPE_AUTH_CAPTURE:
116
+ return $this->__('authorize and capture');
117
+ default:
118
+ return false;
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Get phone number country code based on country code
124
+ *
125
+ * @param string $countryCode
126
+ * @return string phone code
127
+ */
128
+ public function getPhoneCode($address)
129
+ {
130
+ $countryCodes = array(
131
+ array(
132
+ 'country_code' => 'AF',
133
+ 'phone_code' => '93',
134
+ ),
135
+ array(
136
+ 'country_code' => 'AX',
137
+ 'phone_code' => '35818',
138
+ ),
139
+ array(
140
+ 'country_code' => 'NL',
141
+ 'phone_code' => '31',
142
+ ),
143
+ array(
144
+ 'country_code' => 'AN',
145
+ 'phone_code' => '599',
146
+ ),
147
+ array(
148
+ 'country_code' => 'AL',
149
+ 'phone_code' => '355',
150
+ ),
151
+ array(
152
+ 'country_code' => 'DZ',
153
+ 'phone_code' => '213',
154
+ ),
155
+ array(
156
+ 'country_code' => 'AS',
157
+ 'phone_code' => '685',
158
+ ),
159
+ array(
160
+ 'country_code' => 'AD',
161
+ 'phone_code' => '376',
162
+ ),
163
+ array(
164
+ 'country_code' => 'AO',
165
+ 'phone_code' => '244',
166
+ ),
167
+ array(
168
+ 'country_code' => 'AI',
169
+ 'phone_code' => '1264',
170
+ ),
171
+ array(
172
+ 'country_code' => 'AQ',
173
+ 'phone_code' => '672',
174
+ ),
175
+ array(
176
+ 'country_code' => 'AG',
177
+ 'phone_code' => '1268',
178
+ ),
179
+ array(
180
+ 'country_code' => 'AE',
181
+ 'phone_code' => '971',
182
+ ),
183
+ array(
184
+ 'country_code' => 'AR',
185
+ 'phone_code' => '54',
186
+ ),
187
+ array(
188
+ 'country_code' => 'AM',
189
+ 'phone_code' => '374',
190
+ ),
191
+ array(
192
+ 'country_code' => 'AW',
193
+ 'phone_code' => '297',
194
+ ),
195
+ array(
196
+ 'country_code' => 'AU',
197
+ 'phone_code' => '61',
198
+ ),
199
+ array(
200
+ 'country_code' => 'AZ',
201
+ 'phone_code' => '994',
202
+ ),
203
+ array(
204
+ 'country_code' => 'BS',
205
+ 'phone_code' => '1242',
206
+ ),
207
+ array(
208
+ 'country_code' => 'BH',
209
+ 'phone_code' => '973',
210
+ ),
211
+ array(
212
+ 'country_code' => 'BD',
213
+ 'phone_code' => '880',
214
+ ),
215
+ array(
216
+ 'country_code' => 'BB',
217
+ 'phone_code' => '1242',
218
+ ),
219
+ array(
220
+ 'country_code' => 'BE',
221
+ 'phone_code' => '32',
222
+ ),
223
+ array(
224
+ 'country_code' => 'BZ',
225
+ 'phone_code' => '501',
226
+ ),
227
+ array(
228
+ 'country_code' => 'BJ',
229
+ 'phone_code' => '229',
230
+ ),
231
+ array(
232
+ 'country_code' => 'BM',
233
+ 'phone_code' => '1441',
234
+ ),
235
+ array(
236
+ 'country_code' => 'BT',
237
+ 'phone_code' => '975',
238
+ ),
239
+ array(
240
+ 'country_code' => 'BO',
241
+ 'phone_code' => '591',
242
+ ),
243
+ array(
244
+ 'country_code' => 'BA',
245
+ 'phone_code' => '387',
246
+ ),
247
+ array(
248
+ 'country_code' => 'BW',
249
+ 'phone_code' => '267',
250
+ ),
251
+ array(
252
+ 'country_code' => 'BV',
253
+ 'phone_code' => '47',
254
+ ),
255
+ array(
256
+ 'country_code' => 'BR',
257
+ 'phone_code' => '55',
258
+ ),
259
+ array(
260
+ 'country_code' => 'GB',
261
+ 'phone_code' => '44',
262
+ ),
263
+ array(
264
+ 'country_code' => 'IO',
265
+ 'phone_code' => '246',
266
+ ),
267
+ array(
268
+ 'country_code' => 'VG',
269
+ 'phone_code' => '1284',
270
+ ),
271
+ array(
272
+ 'country_code' => 'BN',
273
+ 'phone_code' => '673',
274
+ ),
275
+ array(
276
+ 'country_code' => 'BG',
277
+ 'phone_code' => '359',
278
+ ),
279
+ array(
280
+ 'country_code' => 'BF',
281
+ 'phone_code' => '226',
282
+ ),
283
+ array(
284
+ 'country_code' => 'BI',
285
+ 'phone_code' => '257',
286
+ ),
287
+ array(
288
+ 'country_code' => 'KY',
289
+ 'phone_code' => '1345',
290
+ ),
291
+ array(
292
+ 'country_code' => 'CL',
293
+ 'phone_code' => '56',
294
+ ),
295
+ array(
296
+ 'country_code' => 'CK',
297
+ 'phone_code' => '682',
298
+ ),
299
+ array(
300
+ 'country_code' => 'CR',
301
+ 'phone_code' => '506',
302
+ ),
303
+ array(
304
+ 'country_code' => 'DJ',
305
+ 'phone_code' => '253',
306
+ ),
307
+ array(
308
+ 'country_code' => 'DM',
309
+ 'phone_code' => '1767',
310
+ ),
311
+ array(
312
+ 'country_code' => 'DO',
313
+ 'phone_code' => '1809',
314
+ ),
315
+ array(
316
+ 'country_code' => 'EC',
317
+ 'phone_code' => '593',
318
+ ),
319
+ array(
320
+ 'country_code' => 'EG',
321
+ 'phone_code' => '20',
322
+ ),
323
+ array(
324
+ 'country_code' => 'SV',
325
+ 'phone_code' => '503',
326
+ ),
327
+ array(
328
+ 'country_code' => 'ER',
329
+ 'phone_code' => '291',
330
+ ),
331
+ array(
332
+ 'country_code' => 'ES',
333
+ 'phone_code' => '34',
334
+ ),
335
+ array(
336
+ 'country_code' => 'ZA',
337
+ 'phone_code' => '27',
338
+ ),
339
+ array(
340
+ 'country_code' => 'GS',
341
+ 'phone_code' => '500',
342
+ ),
343
+ array(
344
+ 'country_code' => 'KR',
345
+ 'phone_code' => '82',
346
+ ),
347
+ array(
348
+ 'country_code' => 'ET',
349
+ 'phone_code' => '251',
350
+ ),
351
+ array(
352
+ 'country_code' => 'FK',
353
+ 'phone_code' => '500',
354
+ ),
355
+ array(
356
+ 'country_code' => 'FJ',
357
+ 'phone_code' => '679',
358
+ ),
359
+ array(
360
+ 'country_code' => 'PH',
361
+ 'phone_code' => '63',
362
+ ),
363
+ array(
364
+ 'country_code' => 'FO',
365
+ 'phone_code' => '298',
366
+ ),
367
+ array(
368
+ 'country_code' => 'GA',
369
+ 'phone_code' => '241',
370
+ ),
371
+ array(
372
+ 'country_code' => 'GM',
373
+ 'phone_code' => '220',
374
+ ),
375
+ array(
376
+ 'country_code' => 'GE',
377
+ 'phone_code' => '995',
378
+ ),
379
+ array(
380
+ 'country_code' => 'GH',
381
+ 'phone_code' => '233',
382
+ ),
383
+ array(
384
+ 'country_code' => 'GI',
385
+ 'phone_code' => '350',
386
+ ),
387
+ array(
388
+ 'country_code' => 'GD',
389
+ 'phone_code' => '1473',
390
+ ),
391
+ array(
392
+ 'country_code' => 'GL',
393
+ 'phone_code' => '299',
394
+ ),
395
+ array(
396
+ 'country_code' => 'GP',
397
+ 'phone_code' => '590',
398
+ ),
399
+ array(
400
+ 'country_code' => 'GU',
401
+ 'phone_code' => '1671',
402
+ ),
403
+ array(
404
+ 'country_code' => 'GT',
405
+ 'phone_code' => '502',
406
+ ),
407
+ array(
408
+ 'country_code' => 'GG',
409
+ 'phone_code' => '44',
410
+ ),
411
+ array(
412
+ 'country_code' => 'GN',
413
+ 'phone_code' => '224',
414
+ ),
415
+ array(
416
+ 'country_code' => 'GW',
417
+ 'phone_code' => '245',
418
+ ),
419
+ array(
420
+ 'country_code' => 'GY',
421
+ 'phone_code' => '592',
422
+ ),
423
+ array(
424
+ 'country_code' => 'HT',
425
+ 'phone_code' => '509',
426
+ ),
427
+ array(
428
+ 'country_code' => 'HM',
429
+ 'phone_code' => '61',
430
+ ),
431
+ array(
432
+ 'country_code' => 'HN',
433
+ 'phone_code' => '504',
434
+ ),
435
+ array(
436
+ 'country_code' => 'HK',
437
+ 'phone_code' => '852',
438
+ ),
439
+ array(
440
+ 'country_code' => 'SJ',
441
+ 'phone_code' => '47',
442
+ ),
443
+ array(
444
+ 'country_code' => 'ID',
445
+ 'phone_code' => '62',
446
+ ),
447
+ array(
448
+ 'country_code' => 'IN',
449
+ 'phone_code' => '91',
450
+ ),
451
+ array(
452
+ 'country_code' => 'IQ',
453
+ 'phone_code' => '964',
454
+ ),
455
+ array(
456
+ 'country_code' => 'IR',
457
+ 'phone_code' => '98',
458
+ ),
459
+ array(
460
+ 'country_code' => 'IE',
461
+ 'phone_code' => '353',
462
+ ),
463
+ array(
464
+ 'country_code' => 'IS',
465
+ 'phone_code' => '354',
466
+ ),
467
+ array(
468
+ 'country_code' => 'IL',
469
+ 'phone_code' => '972',
470
+ ),
471
+ array(
472
+ 'country_code' => 'IT',
473
+ 'phone_code' => '39',
474
+ ),
475
+ array(
476
+ 'country_code' => 'TL',
477
+ 'phone_code' => '670',
478
+ ),
479
+ array(
480
+ 'country_code' => 'AT',
481
+ 'phone_code' => '43',
482
+ ),
483
+ array(
484
+ 'country_code' => 'JM',
485
+ 'phone_code' => '1876',
486
+ ),
487
+ array(
488
+ 'country_code' => 'JP',
489
+ 'phone_code' => '81',
490
+ ),
491
+ array(
492
+ 'country_code' => 'YE',
493
+ 'phone_code' => '967',
494
+ ),
495
+ array(
496
+ 'country_code' => 'JE',
497
+ 'phone_code' => '44',
498
+ ),
499
+ array(
500
+ 'country_code' => 'JO',
501
+ 'phone_code' => '962',
502
+ ),
503
+ array(
504
+ 'country_code' => 'CX',
505
+ 'phone_code' => '61',
506
+ ),
507
+ array(
508
+ 'country_code' => 'KH',
509
+ 'phone_code' => '855',
510
+ ),
511
+ array(
512
+ 'country_code' => 'CM',
513
+ 'phone_code' => '237',
514
+ ),
515
+ array(
516
+ 'country_code' => 'CA',
517
+ 'phone_code' => '1',
518
+ ),
519
+ array(
520
+ 'country_code' => 'CV',
521
+ 'phone_code' => '238',
522
+ ),
523
+ array(
524
+ 'country_code' => 'KZ',
525
+ 'phone_code' => '7',
526
+ ),
527
+ array(
528
+ 'country_code' => 'KE',
529
+ 'phone_code' => '254',
530
+ ),
531
+ array(
532
+ 'country_code' => 'CF',
533
+ 'phone_code' => '236',
534
+ ),
535
+ array(
536
+ 'country_code' => 'CN',
537
+ 'phone_code' => '86',
538
+ ),
539
+ array(
540
+ 'country_code' => 'KG',
541
+ 'phone_code' => '996',
542
+ ),
543
+ array(
544
+ 'country_code' => 'KI',
545
+ 'phone_code' => '686',
546
+ ),
547
+ array(
548
+ 'country_code' => 'CO',
549
+ 'phone_code' => '57',
550
+ ),
551
+ array(
552
+ 'country_code' => 'KM',
553
+ 'phone_code' => '269',
554
+ ),
555
+ array(
556
+ 'country_code' => 'CG',
557
+ 'phone_code' => '242',
558
+ ),
559
+ array(
560
+ 'country_code' => 'CD',
561
+ 'phone_code' => '243',
562
+ ),
563
+ array(
564
+ 'country_code' => 'CC',
565
+ 'phone_code' => '61',
566
+ ),
567
+ array(
568
+ 'country_code' => 'GR',
569
+ 'phone_code' => '30',
570
+ ),
571
+ array(
572
+ 'country_code' => 'HR',
573
+ 'phone_code' => '385',
574
+ ),
575
+ array(
576
+ 'country_code' => 'CU',
577
+ 'phone_code' => '53',
578
+ ),
579
+ array(
580
+ 'country_code' => 'KW',
581
+ 'phone_code' => '965',
582
+ ),
583
+ array(
584
+ 'country_code' => 'CY',
585
+ 'phone_code' => '357',
586
+ ),
587
+ array(
588
+ 'country_code' => 'LA',
589
+ 'phone_code' => '856',
590
+ ),
591
+ array(
592
+ 'country_code' => 'LV',
593
+ 'phone_code' => '371',
594
+ ),
595
+ array(
596
+ 'country_code' => 'LS',
597
+ 'phone_code' => '266',
598
+ ),
599
+ array(
600
+ 'country_code' => 'LB',
601
+ 'phone_code' => '961',
602
+ ),
603
+ array(
604
+ 'country_code' => 'LR',
605
+ 'phone_code' => '231',
606
+ ),
607
+ array(
608
+ 'country_code' => 'LY',
609
+ 'phone_code' => '218',
610
+ ),
611
+ array(
612
+ 'country_code' => 'LI',
613
+ 'phone_code' => '423',
614
+ ),
615
+ array(
616
+ 'country_code' => 'LT',
617
+ 'phone_code' => '370',
618
+ ),
619
+ array(
620
+ 'country_code' => 'LU',
621
+ 'phone_code' => '352',
622
+ ),
623
+ array(
624
+ 'country_code' => 'EH',
625
+ 'phone_code' => '21228',
626
+ ),
627
+ array(
628
+ 'country_code' => 'MO',
629
+ 'phone_code' => '853',
630
+ ),
631
+ array(
632
+ 'country_code' => 'MG',
633
+ 'phone_code' => '261',
634
+ ),
635
+ array(
636
+ 'country_code' => 'MK',
637
+ 'phone_code' => '389',
638
+ ),
639
+ array(
640
+ 'country_code' => 'MW',
641
+ 'phone_code' => '265',
642
+ ),
643
+ array(
644
+ 'country_code' => 'MV',
645
+ 'phone_code' => '960',
646
+ ),
647
+ array(
648
+ 'country_code' => 'MY',
649
+ 'phone_code' => '60',
650
+ ),
651
+ array(
652
+ 'country_code' => 'ML',
653
+ 'phone_code' => '223',
654
+ ),
655
+ array(
656
+ 'country_code' => 'MT',
657
+ 'phone_code' => '356',
658
+ ),
659
+ array(
660
+ 'country_code' => 'IM',
661
+ 'phone_code' => '44',
662
+ ),
663
+ array(
664
+ 'country_code' => 'MA',
665
+ 'phone_code' => '212',
666
+ ),
667
+ array(
668
+ 'country_code' => 'MH',
669
+ 'phone_code' => '692',
670
+ ),
671
+ array(
672
+ 'country_code' => 'MQ',
673
+ 'phone_code' => '596',
674
+ ),
675
+ array(
676
+ 'country_code' => 'MR',
677
+ 'phone_code' => '222',
678
+ ),
679
+ array(
680
+ 'country_code' => 'MU',
681
+ 'phone_code' => '230',
682
+ ),
683
+ array(
684
+ 'country_code' => 'YT',
685
+ 'phone_code' => '262',
686
+ ),
687
+ array(
688
+ 'country_code' => 'MX',
689
+ 'phone_code' => '52',
690
+ ),
691
+ array(
692
+ 'country_code' => 'FM',
693
+ 'phone_code' => '691',
694
+ ),
695
+ array(
696
+ 'country_code' => 'MD',
697
+ 'phone_code' => '373',
698
+ ),
699
+ array(
700
+ 'country_code' => 'MC',
701
+ 'phone_code' => '377',
702
+ ),
703
+ array(
704
+ 'country_code' => 'MN',
705
+ 'phone_code' => '976',
706
+ ),
707
+ array(
708
+ 'country_code' => 'ME',
709
+ 'phone_code' => '382',
710
+ ),
711
+ array(
712
+ 'country_code' => 'MS',
713
+ 'phone_code' => '1664',
714
+ ),
715
+ array(
716
+ 'country_code' => 'MZ',
717
+ 'phone_code' => '258',
718
+ ),
719
+ array(
720
+ 'country_code' => 'MM',
721
+ 'phone_code' => '95',
722
+ ),
723
+ array(
724
+ 'country_code' => 'NA',
725
+ 'phone_code' => '264',
726
+ ),
727
+ array(
728
+ 'country_code' => 'NR',
729
+ 'phone_code' => '674',
730
+ ),
731
+ array(
732
+ 'country_code' => 'NP',
733
+ 'phone_code' => '977',
734
+ ),
735
+ array(
736
+ 'country_code' => 'NI',
737
+ 'phone_code' => '505',
738
+ ),
739
+ array(
740
+ 'country_code' => 'NE',
741
+ 'phone_code' => '227',
742
+ ),
743
+ array(
744
+ 'country_code' => 'NG',
745
+ 'phone_code' => '234',
746
+ ),
747
+ array(
748
+ 'country_code' => 'NU',
749
+ 'phone_code' => '683',
750
+ ),
751
+ array(
752
+ 'country_code' => 'NF',
753
+ 'phone_code' => '672',
754
+ ),
755
+ array(
756
+ 'country_code' => 'NO',
757
+ 'phone_code' => '47',
758
+ ),
759
+ array(
760
+ 'country_code' => 'CI',
761
+ 'phone_code' => '255',
762
+ ),
763
+ array(
764
+ 'country_code' => 'OM',
765
+ 'phone_code' => '968',
766
+ ),
767
+ array(
768
+ 'country_code' => 'PK',
769
+ 'phone_code' => '92',
770
+ ),
771
+ array(
772
+ 'country_code' => 'PW',
773
+ 'phone_code' => '680',
774
+ ),
775
+ array(
776
+ 'country_code' => 'PS',
777
+ 'phone_code' => '970',
778
+ ),
779
+ array(
780
+ 'country_code' => 'PA',
781
+ 'phone_code' => '507',
782
+ ),
783
+ array(
784
+ 'country_code' => 'PG',
785
+ 'phone_code' => '675',
786
+ ),
787
+ array(
788
+ 'country_code' => 'PY',
789
+ 'phone_code' => '595',
790
+ ),
791
+ array(
792
+ 'country_code' => 'PE',
793
+ 'phone_code' => '51',
794
+ ),
795
+ array(
796
+ 'country_code' => 'PN',
797
+ 'phone_code' => '870',
798
+ ),
799
+ array(
800
+ 'country_code' => 'KP',
801
+ 'phone_code' => '850',
802
+ ),
803
+ array(
804
+ 'country_code' => 'MP',
805
+ 'phone_code' => '1670',
806
+ ),
807
+ array(
808
+ 'country_code' => 'PT',
809
+ 'phone_code' => '351',
810
+ ),
811
+ array(
812
+ 'country_code' => 'PR',
813
+ 'phone_code' => '1',
814
+ ),
815
+ array(
816
+ 'country_code' => 'PL',
817
+ 'phone_code' => '48',
818
+ ),
819
+ array(
820
+ 'country_code' => 'GQ',
821
+ 'phone_code' => '240',
822
+ ),
823
+ array(
824
+ 'country_code' => 'QA',
825
+ 'phone_code' => '974',
826
+ ),
827
+ array(
828
+ 'country_code' => 'FR',
829
+ 'phone_code' => '33',
830
+ ),
831
+ array(
832
+ 'country_code' => 'GF',
833
+ 'phone_code' => '594',
834
+ ),
835
+ array(
836
+ 'country_code' => 'PF',
837
+ 'phone_code' => '689',
838
+ ),
839
+ array(
840
+ 'country_code' => 'TF',
841
+ 'phone_code' => '33',
842
+ ),
843
+ array(
844
+ 'country_code' => 'RO',
845
+ 'phone_code' => '40',
846
+ ),
847
+ array(
848
+ 'country_code' => 'RW',
849
+ 'phone_code' => '250',
850
+ ),
851
+ array(
852
+ 'country_code' => 'SE',
853
+ 'phone_code' => '46',
854
+ ),
855
+ array(
856
+ 'country_code' => 'RE',
857
+ 'phone_code' => '262',
858
+ ),
859
+ array(
860
+ 'country_code' => 'SH',
861
+ 'phone_code' => '290',
862
+ ),
863
+ array(
864
+ 'country_code' => 'KN',
865
+ 'phone_code' => '1869',
866
+ ),
867
+ array(
868
+ 'country_code' => 'LC',
869
+ 'phone_code' => '1758',
870
+ ),
871
+ array(
872
+ 'country_code' => 'VC',
873
+ 'phone_code' => '1784',
874
+ ),
875
+ array(
876
+ 'country_code' => 'BL',
877
+ 'phone_code' => '590',
878
+ ),
879
+ array(
880
+ 'country_code' => 'MF',
881
+ 'phone_code' => '1599',
882
+ ),
883
+ array(
884
+ 'country_code' => 'PM',
885
+ 'phone_code' => '508',
886
+ ),
887
+ array(
888
+ 'country_code' => 'DE',
889
+ 'phone_code' => '49',
890
+ ),
891
+ array(
892
+ 'country_code' => 'SB',
893
+ 'phone_code' => '677',
894
+ ),
895
+ array(
896
+ 'country_code' => 'ZM',
897
+ 'phone_code' => '260',
898
+ ),
899
+ array(
900
+ 'country_code' => 'WS',
901
+ 'phone_code' => '685',
902
+ ),
903
+ array(
904
+ 'country_code' => 'SM',
905
+ 'phone_code' => '378',
906
+ ),
907
+ array(
908
+ 'country_code' => 'SA',
909
+ 'phone_code' => '966',
910
+ ),
911
+ array(
912
+ 'country_code' => 'SN',
913
+ 'phone_code' => '221',
914
+ ),
915
+ array(
916
+ 'country_code' => 'RS',
917
+ 'phone_code' => '381',
918
+ ),
919
+ array(
920
+ 'country_code' => 'SC',
921
+ 'phone_code' => '248',
922
+ ),
923
+ array(
924
+ 'country_code' => 'SL',
925
+ 'phone_code' => '232',
926
+ ),
927
+ array(
928
+ 'country_code' => 'SG',
929
+ 'phone_code' => '65',
930
+ ),
931
+ array(
932
+ 'country_code' => 'SK',
933
+ 'phone_code' => '421',
934
+ ),
935
+ array(
936
+ 'country_code' => 'SI',
937
+ 'phone_code' => '386',
938
+ ),
939
+ array(
940
+ 'country_code' => 'SO',
941
+ 'phone_code' => '252',
942
+ ),
943
+ array(
944
+ 'country_code' => 'LK',
945
+ 'phone_code' => '94',
946
+ ),
947
+ array(
948
+ 'country_code' => 'SD',
949
+ 'phone_code' => '249',
950
+ ),
951
+ array(
952
+ 'country_code' => 'FI',
953
+ 'phone_code' => '358',
954
+ ),
955
+ array(
956
+ 'country_code' => 'SR',
957
+ 'phone_code' => '594',
958
+ ),
959
+ array(
960
+ 'country_code' => 'CH',
961
+ 'phone_code' => '41',
962
+ ),
963
+ array(
964
+ 'country_code' => 'SZ',
965
+ 'phone_code' => '268',
966
+ ),
967
+ array(
968
+ 'country_code' => 'SY',
969
+ 'phone_code' => '963',
970
+ ),
971
+ array(
972
+ 'country_code' => 'ST',
973
+ 'phone_code' => '239',
974
+ ),
975
+ array(
976
+ 'country_code' => 'TJ',
977
+ 'phone_code' => '992',
978
+ ),
979
+ array(
980
+ 'country_code' => 'TW',
981
+ 'phone_code' => '886',
982
+ ),
983
+ array(
984
+ 'country_code' => 'TZ',
985
+ 'phone_code' => '255',
986
+ ),
987
+ array(
988
+ 'country_code' => 'DK',
989
+ 'phone_code' => '45',
990
+ ),
991
+ array(
992
+ 'country_code' => 'TH',
993
+ 'phone_code' => '66',
994
+ ),
995
+ array(
996
+ 'country_code' => 'TG',
997
+ 'phone_code' => '228',
998
+ ),
999
+ array(
1000
+ 'country_code' => 'TK',
1001
+ 'phone_code' => '690',
1002
+ ),
1003
+ array(
1004
+ 'country_code' => 'TO',
1005
+ 'phone_code' => '676',
1006
+ ),
1007
+ array(
1008
+ 'country_code' => 'TT',
1009
+ 'phone_code' => '1868',
1010
+ ),
1011
+ array(
1012
+ 'country_code' => 'TN',
1013
+ 'phone_code' => '216',
1014
+ ),
1015
+ array(
1016
+ 'country_code' => 'TR',
1017
+ 'phone_code' => '90',
1018
+ ),
1019
+ array(
1020
+ 'country_code' => 'TM',
1021
+ 'phone_code' => '993',
1022
+ ),
1023
+ array(
1024
+ 'country_code' => 'TC',
1025
+ 'phone_code' => '1649',
1026
+ ),
1027
+ array(
1028
+ 'country_code' => 'TV',
1029
+ 'phone_code' => '688',
1030
+ ),
1031
+ array(
1032
+ 'country_code' => 'TD',
1033
+ 'phone_code' => '235',
1034
+ ),
1035
+ array(
1036
+ 'country_code' => 'CZ',
1037
+ 'phone_code' => '420',
1038
+ ),
1039
+ array(
1040
+ 'country_code' => 'UG',
1041
+ 'phone_code' => '256',
1042
+ ),
1043
+ array(
1044
+ 'country_code' => 'UA',
1045
+ 'phone_code' => '380',
1046
+ ),
1047
+ array(
1048
+ 'country_code' => 'HU',
1049
+ 'phone_code' => '36',
1050
+ ),
1051
+ array(
1052
+ 'country_code' => 'UY',
1053
+ 'phone_code' => '598',
1054
+ ),
1055
+ array(
1056
+ 'country_code' => 'NC',
1057
+ 'phone_code' => '687',
1058
+ ),
1059
+ array(
1060
+ 'country_code' => 'NZ',
1061
+ 'phone_code' => '64',
1062
+ ),
1063
+ array(
1064
+ 'country_code' => 'UZ',
1065
+ 'phone_code' => '998',
1066
+ ),
1067
+ array(
1068
+ 'country_code' => 'BY',
1069
+ 'phone_code' => '375',
1070
+ ),
1071
+ array(
1072
+ 'country_code' => 'VU',
1073
+ 'phone_code' => '678',
1074
+ ),
1075
+ array(
1076
+ 'country_code' => 'VA',
1077
+ 'phone_code' => '39',
1078
+ ),
1079
+ array(
1080
+ 'country_code' => 'VE',
1081
+ 'phone_code' => '58',
1082
+ ),
1083
+ array(
1084
+ 'country_code' => 'RU',
1085
+ 'phone_code' => '7',
1086
+ ),
1087
+ array(
1088
+ 'country_code' => 'VN',
1089
+ 'phone_code' => '84',
1090
+ ),
1091
+ array(
1092
+ 'country_code' => 'EE',
1093
+ 'phone_code' => '372',
1094
+ ),
1095
+ array(
1096
+ 'country_code' => 'WF',
1097
+ 'phone_code' => '681',
1098
+ ),
1099
+ array(
1100
+ 'country_code' => 'US',
1101
+ 'phone_code' => '1',
1102
+ ),
1103
+ array(
1104
+ 'country_code' => 'VI',
1105
+ 'phone_code' => '1340',
1106
+ ),
1107
+ array(
1108
+ 'country_code' => 'UM',
1109
+ 'phone_code' => '1',
1110
+ ),
1111
+ array(
1112
+ 'country_code' => 'ZW',
1113
+ 'phone_code' => '263',
1114
+ )
1115
+ );
1116
+
1117
+
1118
+ usort($countryCodes, array($this, 'sortShuffle'));
1119
+
1120
+ $phoneNumber = str_replace("+", "", $address->getTelephone());
1121
+
1122
+ foreach( $countryCodes as $key => $value )
1123
+ {
1124
+ if ( substr( $phoneNumber, 0, strlen( $value['phone_code'] ) ) == $value['phone_code'] )
1125
+ {
1126
+ return $value['country_code'];
1127
+ }
1128
+ }
1129
+
1130
+ foreach( $countryCodes as $key => $value )
1131
+ {
1132
+ if ( substr( $phoneNumber, 0, strlen( $address->getCountryId() ) ) == $address->getCountryId() )
1133
+ {
1134
+ return $value['phone_code'];
1135
+ }
1136
+ }
1137
+
1138
+ return $address->getCountryId();
1139
+ }
1140
+
1141
+ public function preparePhone($phoneNr, $region) {
1142
+ $phoneNr = str_replace("+", "", $phoneNr);
1143
+ return substr( $phoneNr, strlen( $region ));
1144
+ }
1145
+
1146
+
1147
+ public function handleError($error)
1148
+ {
1149
+ $type = array("393729", "393730", "393731", "393732", "393733", "393734", "393735", "393736", "393737", "393744", "393745", "393746", "393747", "393749", "393750", "393751", "393752", "393760", "393764", "393769", "393776", "393986", "393987", "393988");
1150
+
1151
+ if (in_array($error['responseErrorCode'], $type)) {
1152
+ switch ($error['responseErrorCode']) {
1153
+ case "393730":
1154
+ $message = $this->__("Sorry, cannot process transaction. Your card's CVV number is incorrect.");
1155
+ break;
1156
+ case "393731":
1157
+ $message = $this->__("Sorry, cannot complete transaction. You typed an invalid card number.");
1158
+ break;
1159
+ case "393732":
1160
+ $message = $this->__("It seems your card has expired. Please verify your details or use other payment source.");
1161
+ break;
1162
+ default:
1163
+ $message = $this->__("The transaction cannot be completed at this time - your card was declined. Please try a different card.");
1164
+ }
1165
+ return $message;
1166
+ } else {
1167
+ $adminEmail = Mage::getStoreConfig('trans_email/ident_general/email');
1168
+ $adminName = Mage::getStoreConfig('trans_email/ident_general/name');
1169
+
1170
+ $mail = Mage::getModel('core/email');
1171
+ $mail->setToName($adminName);
1172
+ $mail->setToEmail($adminEmail);
1173
+ $mail->setFromEmail($adminEmail);
1174
+ $mail->setFromName($adminName);
1175
+ $mail->setBody(nl2br($error['errorMessage']));
1176
+ $mail->setSubject("Zooz payment : error #" . $error['responseErrorCode']);
1177
+ $mail->setType('html');
1178
+
1179
+ try {
1180
+ $mail->send();
1181
+ }
1182
+ catch (Exception $e) {
1183
+ Mage::log($e->getMessage());
1184
+ }
1185
+ return $error['errorMessage'];
1186
+ }
1187
+ }
1188
+ public function getPaymentGatewayUrl()
1189
+ {
1190
+ return Mage::getUrl('zoozpayments/payment/gateway', array('_secure' => false));
1191
+ }
1192
+
1193
+ /**
1194
+ * Format price with currency sign
1195
+ * @param Mage_Payment_Model_Info $payment
1196
+ * @param float $amount
1197
+ * @return string
1198
+ */
1199
+ protected function _formatPrice($payment, $amount)
1200
+ {
1201
+ return $payment->getOrder()->getBaseCurrency()->formatTxt($amount);
1202
+ }
1203
+
1204
+ /**
1205
+ * Translates payment method subtype returned by getPaymentMethods to credit card type code used in magento
1206
+ *
1207
+ * @param string $subtype
1208
+ * @return string
1209
+ */
1210
+ public function translateCardSubtypeToTypeCode($subtype)
1211
+ {
1212
+ $subtype = strtolower($subtype);
1213
+ return isset($this->_subtypeToTypeCodeMap[$subtype]) ? $this->_subtypeToTypeCodeMap[$subtype] : '';
1214
+
1215
+ }
1216
+
1217
+ function sortShuffle($a, $b)
1218
+ {
1219
+ return ($a['phone_code'] > $b['phone_code']) ? -1 : 1;
1220
+ }
1221
+
1222
+ public function canSaveCc() {
1223
+ return Mage::getSingleton('payments/config')->isPciIframeEnabled();
1224
+ }
1225
+
1226
+ public function getCustomerIframeUrl() {
1227
+ return self::CUSTOMER_IFRAME;
1228
+ }
1229
+ }
app/code/community/Zooz/Payments/Model/Api.php ADDED
@@ -0,0 +1,477 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Zooz_Payments_Model_Api
4
+ {
5
+ const ACTION_MODE_SANDBOX = 'sandbox';
6
+ const ACTION_MODE_PRODUCTION = 'production';
7
+
8
+ const URI_SANDBOX = 'https://sandbox.zooz.co/mobile/ZooZPaymentAPI';
9
+ const URI_PRODUCTION = 'https://app.zooz.com/mobile/ZooZPaymentAPI';
10
+
11
+ const RESPONSE_CODE_SUCCESS = 0;
12
+ const RESPONSE_CODE_FAILURE = -1;
13
+
14
+ const PAYMENT_METHOD_STATUS_VALID = 0;
15
+ const PAYMENT_METHOD_STATUS_EXPIRED = 1;
16
+ const PAYMENT_METHOD_STATUS_NOTVALID = 2;
17
+
18
+ const XML_PATH_CONFIG_GROUP = 'payment/payments/';
19
+
20
+ private function getConfigData($field, $storeId = null)
21
+ {
22
+ $path = self::XML_PATH_CONFIG_GROUP . $field;
23
+ return Mage::getStoreConfig($path, $storeId);
24
+ }
25
+
26
+ /**
27
+ * @return Zooz_Payments_Model_Payments_Request
28
+ */
29
+ protected function _getRequest()
30
+ {
31
+ return Mage::getModel('payments/payments_request');
32
+ }
33
+
34
+ /**
35
+ * @return Zooz_Payments_Helper_Data
36
+ */
37
+ protected function _getHelper()
38
+ {
39
+ return Mage::helper('payments');
40
+ }
41
+
42
+ /**
43
+ * Gateway response wrapper
44
+ *
45
+ * @param string $text
46
+ * @return string
47
+ */
48
+ protected function _wrapGatewayError($text)
49
+ {
50
+ return Mage::helper('payments')->__('Gateway error: %s', $text);
51
+ }
52
+
53
+ /**
54
+ * Returns payment gateway uri depending on selected environment (sandbox/production)
55
+ *
56
+ * @return string
57
+ */
58
+ private function _getRequestUri()
59
+ {
60
+ if ($this->getConfigData('payment_mode') == self::ACTION_MODE_PRODUCTION) {
61
+ return self::URI_PRODUCTION;
62
+ }
63
+
64
+ return self::URI_SANDBOX;
65
+ }
66
+
67
+ /**
68
+ *
69
+ *
70
+ * @return Varien_Http_Client
71
+ * @throws Zend_Http_Client_Exception
72
+ */
73
+ private function _getApiClient()
74
+ {
75
+ $client = new Varien_Http_Client();
76
+ $client->setUri($this->_getRequestUri());
77
+ $client->setConfig(array(
78
+ 'maxredirects'=>0,
79
+ 'timeout'=>30,
80
+
81
+ ));
82
+ $client->setHeaders(array(
83
+ 'programId' => $this->getConfigData('program_id'),
84
+ 'programKey' => Mage::helper('core')->decrypt($this->getConfigData('program_key')),
85
+ 'ZooZResponseType' => 'JSon'
86
+ ));
87
+ $client->setMethod(Zend_Http_Client::POST);
88
+
89
+ return $client;
90
+ }
91
+
92
+ /**
93
+ * Post request to gateway and return response
94
+ *
95
+ * @param Varien_Object $request
96
+ * @return Zooz_Payments_Model_Payments_Result
97
+ */
98
+ protected function _postRequest(Varien_Object $request)
99
+ {
100
+ $helper = $this->_getHelper();
101
+ $debugData = array('request' => $request);
102
+ $result = Mage::getModel('payments/payments_result');
103
+
104
+ $client = $this->_getApiClient();
105
+ $client->setRawData(json_encode($request->getData()), 'application/json');
106
+
107
+ try {
108
+ $response = $client->request();
109
+ } catch (Exception $ex) {
110
+ $result
111
+ ->setResponseCode(self::RESPONSE_CODE_FAILURE)
112
+ ->setResponseReasonCode($ex->getCode())
113
+ ->setResponseReasonText($ex->getMessage());
114
+
115
+ $debugData['result'] = $result->getData();
116
+ //TODO implement debug
117
+ // $this->_debug($debugData);
118
+ Mage::log($ex->getMessage(),NULL,'debgs.log');
119
+ Mage::throwException($this->_wrapGatewayError($ex->getMessage()));
120
+ }
121
+
122
+ $responseAsArray = json_decode($response->getBody(), true);
123
+
124
+ try {
125
+ if (!is_array($responseAsArray)) {
126
+ throw new Zooz_Payments_Exception($helper->__('Not able to deserialize response'));
127
+ }
128
+
129
+ if ($responseAsArray['responseStatus'] != 0) {
130
+ throw new Zooz_Payments_Exception(
131
+ $responseAsArray['responseObject']['errorDescription'],
132
+ $responseAsArray['responseObject']['responseErrorCode']
133
+ );
134
+ }
135
+ } catch (Zooz_Payments_Exception $ex) {
136
+ $message = Mage::helper('payments')->handleError($responseAsArray['responseObject']);
137
+ $result
138
+ ->setResponseCode(self::RESPONSE_CODE_FAILURE)
139
+ ->setResponseReasonCode($ex->getFields())
140
+ ->setResponseReasonText($message);
141
+
142
+ $debugData['result'] = $result->getData();
143
+ //TODO implement debug
144
+ // $this->_debug($debugData);
145
+
146
+ return $result;
147
+ }
148
+
149
+ $result
150
+ ->setResponseCode(self::RESPONSE_CODE_SUCCESS)
151
+ ->addData($responseAsArray['responseObject']);
152
+
153
+
154
+ $debugData['result'] = $result->getData();
155
+ //TODO implement debug
156
+ // $this->_debug($debugData);
157
+ return $result;
158
+ }
159
+
160
+ /**
161
+ * @param Mage_Payment_Model_Info $payment
162
+ * @param $amount
163
+ * @param $customerLoginId
164
+ * @return Zooz_Payments_Model_Payments_Result
165
+ */
166
+ public function openPayment(Mage_Payment_Model_Info $payment, $amount, $customerLoginId)
167
+ {
168
+
169
+ $request = $this->_getRequest();
170
+ /* @var $order Mage_Sales_Model_Order */
171
+
172
+ if($payment->getOrder() !== null) {
173
+ $order = $payment->getOrder();
174
+ $shippingAmount = $order->getShippingAmount();
175
+
176
+ } else {
177
+ $order = Mage::getModel('checkout/session')->getQuote();
178
+ $shippingAmount = $order->getShippingAddress()->getShippingAmount();
179
+
180
+ }
181
+
182
+
183
+ $requestData = array(
184
+ 'command' => 'openPayment',
185
+ 'paymentDetails' => array(
186
+ 'amount' => $amount,
187
+ 'shippingAmount' => $shippingAmount,
188
+ 'currencyCode' => $order->getBaseCurrencyCode(),
189
+ 'taxAmount' => $order->getBaseTaxAmount(),
190
+ 'invoice' => array(
191
+ 'number' => $order->getIncrementId(),
192
+ 'items' => array()
193
+ ),
194
+ 'user' => array(
195
+ 'firstName' => $order->getCustomerFirstname(),
196
+ 'lastName' => $order->getCustomerLastname(),
197
+ 'phone' => array(
198
+ 'countryCode' => '',
199
+ 'phoneNumber' => ''
200
+ ),
201
+ 'email' => $order->getCustomerEmail()
202
+ )
203
+ ),
204
+ 'customerDetails' => array(
205
+ 'customerLoginID' => $customerLoginId
206
+ )
207
+ );
208
+
209
+ if($payment->getOrder() !== null) {
210
+ $items = $order->getAllItems();
211
+ } else {
212
+ $items = $order->getAllVisibleItems();
213
+ }
214
+
215
+ foreach($items as $key => $val) {
216
+ $requestData['paymentDetails']['invoice']['items'][$key]['name'] = $val->getName();
217
+ $requestData['paymentDetails']['invoice']['items'][$key]['id'] = $val->getProductId();
218
+ $requestData['paymentDetails']['invoice']['items'][$key]['quantity'] = $val->getQtyOrdered();
219
+ $requestData['paymentDetails']['invoice']['items'][$key]['price'] = $val->getPrice();
220
+ }
221
+
222
+ $billing = $order->getBillingAddress();
223
+
224
+ if ($billing) {
225
+ $phoneCode = Mage::helper('payments')->getPhoneCode($billing);
226
+
227
+ $addressData = array(
228
+ 'countryCode' => $billing->getCountry(),
229
+ 'state' => $billing->getRegion(),
230
+ 'city' => $billing->getCity(),
231
+ 'address1' => $billing->getStreet1(),
232
+ 'address2' => $billing->getStreet2(),
233
+ 'zipCode' => $billing->getPostcode(),
234
+ 'firstName' => $billing->getFirstname(),
235
+ 'lastName' => $billing->getLastname(),
236
+ 'phone' => array(
237
+ 'countryCode' => $phoneCode,
238
+ 'phoneNumber' => Mage::helper('payments')->preparePhone($billing->getTelephone(), $phoneCode)
239
+ )
240
+ );
241
+
242
+ $requestData['paymentDetails']['user']['phone']['countryCode'] = $phoneCode;
243
+ $requestData['paymentDetails']['user']['phone']['phoneNumber'] = Mage::helper('payments')->preparePhone($billing->getTelephone(), $phoneCode);
244
+
245
+ $requestData['paymentDetails']['user']['addresses'] = array();
246
+ $requestData['paymentDetails']['user']['addresses']['billing'] = $addressData;
247
+ }
248
+
249
+ $shipping = $order->getShippingAddress();
250
+ if ($shipping) {
251
+ $phoneCode = Mage::helper('payments')->getPhoneCode($shipping);
252
+ $addressData = array(
253
+ 'countryCode' => $shipping->getCountry(),
254
+ 'state' => $shipping->getRegion(),
255
+ 'city' => $shipping->getCity(),
256
+ 'address1' => $shipping->getStreet1(),
257
+ 'address2' => $shipping->getStreet2(),
258
+ 'zipCode' => $shipping->getPostcode(),
259
+ 'firstName' => $shipping->getFirstname(),
260
+ 'lastName' => $shipping->getLastname(),
261
+ 'phone' => array(
262
+ 'countryCode' => $phoneCode,
263
+ 'phoneNumber' => Mage::helper('payments')->preparePhone($shipping->getTelephone(), $phoneCode)
264
+ )
265
+ );
266
+
267
+ $requestData['paymentDetails']['user']['addresses']['shipping'] = $addressData;
268
+ }
269
+
270
+ $request->addData($requestData);
271
+
272
+ $response = $this->_postRequest($request);
273
+
274
+ return $response;
275
+ }
276
+
277
+ /**
278
+ * @return bool
279
+ */
280
+ protected function _isSavingCardDataAllowed()
281
+ {
282
+ return Mage::getModel('payments/config')->isSavingCardDataAllowed();
283
+ }
284
+
285
+ /**
286
+ * @param Varien_Object|array $cardData
287
+ * @param string $customerLoginId
288
+ * @param string $paymentToken
289
+ * @return Zooz_Payments_Model_Payments_Result
290
+ */
291
+ public function addPaymentMethod($customerLoginId, $cardData, $paymentToken = null)
292
+ {
293
+ if ($paymentToken === null) {
294
+ $bilingAddress = is_object($cardData->getBillingAddress()) ? $cardData->getBillingAddress() : null;
295
+ $paymentToken = $this->_getToken($customerLoginId, $bilingAddress);
296
+ }
297
+
298
+ if (!($cardData instanceof Varien_Object)) {
299
+ $cardData = new Varien_Object($cardData);
300
+ }
301
+
302
+ $request = $this->_getRequest();
303
+ $requestData = array(
304
+ 'command' => 'addPaymentMethod',
305
+ 'paymentToken' => $paymentToken,
306
+ 'email' => $cardData->getHolderEmail(),
307
+ 'paymentMethod' => array(
308
+ 'paymentMethodType' => 'CreditCard',
309
+ 'paymentMethodDetails' => array(
310
+ 'expirationDate' => $cardData->getCcExpMonth() . '/' . $cardData->getCcExpYear(),
311
+ 'cardHolderName' => $cardData->getHolderFirstname() . ' ' . $cardData->getHolderLastname(),
312
+ 'cardNumber' => $cardData->getCcNumber(),
313
+ 'cvvNumber' => $cardData->getCcCvv()
314
+ ),
315
+ 'configuration' => array(
316
+ 'rememberPaymentMethod' => false
317
+ )
318
+ ),
319
+ );
320
+
321
+ if ($this->_isSavingCardDataAllowed() && $cardData->getCcSaveData()) {
322
+ $requestData['paymentMethod']['configuration']['rememberPaymentMethod'] = true;
323
+ }
324
+
325
+ $request->addData($requestData);
326
+ $response = $this->_postRequest($request);
327
+
328
+ return $response;
329
+ }
330
+
331
+ /**
332
+ * Remove customer saved credit card
333
+ *
334
+ * @param string $customerLoginId
335
+ * @param string $paymentMethodToken
336
+ * @return Zooz_Payments_Model_Payments_Result
337
+ */
338
+ public function removePaymentMethod($customerLoginId, $paymentMethodToken)
339
+ {
340
+ $request = $this->_getRequest();
341
+ $requestData = array(
342
+ 'command' => 'removePaymentMethod',
343
+ 'customerLoginID' => $customerLoginId,
344
+ 'paymentMethodToken' => $paymentMethodToken
345
+ );
346
+
347
+ $request->addData($requestData);
348
+ $response = $this->_postRequest($request);
349
+
350
+ return $response;
351
+ }
352
+
353
+ public function getToken($customerLoginId = false) {
354
+
355
+ if(!$customerLoginId) {
356
+ $customerLoginId = Mage::getModel('customer/session')->getCustomer()->getId();
357
+ }
358
+
359
+ return $this->_getToken($customerLoginId);
360
+ }
361
+
362
+ /**
363
+ * @param string $customerLoginId
364
+ * @return string|null
365
+ */
366
+ private function _getToken($customerLoginId, $billingAddress = null)
367
+ {
368
+ $request = $this->_getRequest();
369
+ $requestData = array(
370
+ 'command' => 'getToken',
371
+ 'tokenType' => 'customerToken',
372
+ 'registerDetails' => array(
373
+ 'currencyCode' => Mage::app()->getStore()->getCurrentCurrencyCode()
374
+ ),
375
+ 'customerDetails' => array(
376
+ 'customerLoginID' => $customerLoginId
377
+ )
378
+ );
379
+
380
+ if($billingAddress !== null) {
381
+ $requestData['registerDetails']['billingAddress']['countryCode'] = $billingAddress->getCountryCode();
382
+ $requestData['registerDetails']['billingAddress']['state'] = $billingAddress->getState();
383
+ $requestData['registerDetails']['billingAddress']['city'] = $billingAddress->getCity();
384
+ $requestData['registerDetails']['billingAddress']['address1'] = $billingAddress->getStreet();
385
+ $requestData['registerDetails']['billingAddress']['zipCode'] = $billingAddress->getZipCode();
386
+ $requestData['registerDetails']['billingAddress']['firstName'] = $billingAddress->getFirstname();
387
+ $requestData['registerDetails']['billingAddress']['lastName'] = $billingAddress->getLastname();
388
+ $requestData['registerDetails']['billingAddress']['phone']['countryCode'] = Mage::helper('payments')->getPhoneCode($billingAddress);
389
+ $requestData['registerDetails']['billingAddress']['phone']['phoneNumber'] = $billingAddress->getPhoneNumber();
390
+ }
391
+ $request->addData($requestData);
392
+
393
+ $response = $this->_postRequest($request);
394
+ if ($response->getResponseCode() !== self::RESPONSE_CODE_SUCCESS) {
395
+ return null;
396
+ }
397
+
398
+ return $response->getData('customerToken');
399
+ }
400
+
401
+ /**
402
+ * Retrieves list of payment methods saved in Zooz
403
+ *
404
+ * @param $customerLoginId
405
+ * @param bool $includeNotValid determines whether not valid and expired methods should be retrieved
406
+ * @return Varien_Object[]
407
+ */
408
+ public function getPaymentMethods($customerLoginId, $includeNotValid = false)
409
+ {
410
+ $request = $this->_getRequest();
411
+ $request->addData(array(
412
+ 'command' => 'getPaymentMethods',
413
+ 'customerLoginID' => $customerLoginId
414
+ ));
415
+
416
+ $methods = array();
417
+ $response = $this->_postRequest($request);
418
+ if ($response->getResponseCode() !== self::RESPONSE_CODE_SUCCESS
419
+ || !$response->hasData('paymentMethods')
420
+ || !is_array($response->getData('paymentMethods'))) {
421
+ return $methods;
422
+ }
423
+
424
+ foreach ($response->getData('paymentMethods') as $methodData) {
425
+ if (!$includeNotValid && $methodData['paymentMethodStatus'] != self::PAYMENT_METHOD_STATUS_VALID) {
426
+ continue;
427
+ }
428
+ $method = new Varien_Object();
429
+ $method->addData($methodData);
430
+ $methods[] = $method;
431
+ }
432
+
433
+ return $methods;
434
+ }
435
+ public function getPaymentDetails($customerLoginId)
436
+ {
437
+ $request = $this->_getRequest();
438
+ $request->addData(array(
439
+ 'command' => 'getPaymentDetails',
440
+ 'paymentToken' => $customerLoginId
441
+ ));
442
+
443
+
444
+ $response = $this->_postRequest($request);
445
+
446
+ if ($response->getResponseCode() !== self::RESPONSE_CODE_SUCCESS
447
+ || !$response->hasData('paymentMethods')
448
+ || !is_array($response->getData('paymentMethods'))) {
449
+ return $response;
450
+ }
451
+
452
+ return $response;
453
+ }
454
+
455
+ /**
456
+ * Retrieves single saved payment method
457
+ *
458
+ * @param string $paymentMethodToken
459
+ * @param string $customerLoginId
460
+ * @return null|Varien_Object
461
+ */
462
+ public function getPaymentMethod($paymentMethodToken, $customerLoginId)
463
+ {
464
+ $paymentMethods = $this->getPaymentMethods($customerLoginId);
465
+ foreach ($paymentMethods as $paymentMethod) {
466
+ if ($paymentMethod->getData('paymentMethodToken') == $paymentMethodToken) {
467
+ return $paymentMethod;
468
+ }
469
+ }
470
+
471
+ return null;
472
+ }
473
+
474
+ public function updateBilling($customer_id, $address) {
475
+ return $this->_getToken($customer_id, $address);
476
+ }
477
+ }
app/code/community/Zooz/Payments/Model/Config.php ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Payment configuration model
11
+ *
12
+ * Used for retrieving configuration data by payment models
13
+ *
14
+ * @category Zooz
15
+ * @package Zooz_Payments
16
+ */
17
+ class Zooz_Payments_Model_Config extends Mage_Core_Block_Template
18
+ {
19
+
20
+ const XML_PATH_SAVE_CREDIT_CARD_ALLOWED = 'payment/payments/save_cart_data_allowed';
21
+ const XML_PATH_PCI_IFRAME_ENABLED = 'payment/payments/iframe_for_pci';
22
+
23
+ const PCI_IFRAME_URL = 'https://paymentpages.zooz.com/Magento/iframe.html';
24
+
25
+ const XML_PATH_PROGRAM_ID = 'payment/payments/program_id';
26
+ const XML_PATH_IS_SANDBOX = 'payment/payments/payment_mode';
27
+
28
+ protected static $_methods;
29
+
30
+ /**
31
+ * Retrieve active system payments
32
+ *
33
+ * @param mixed $store
34
+ * @return array
35
+ */
36
+ public function getActiveMethods($store=null)
37
+ {
38
+ $methods = array();
39
+ $config = Mage::getStoreConfig('payment', $store);
40
+ foreach ($config as $code => $methodConfig) {
41
+ if (Mage::getStoreConfigFlag('payment/'.$code.'/active', $store)) {
42
+ if (array_key_exists('model', $methodConfig)) {
43
+ $methodModel = Mage::getModel($methodConfig['model']);
44
+ if ($methodModel && $methodModel->getConfigData('active', $store)) {
45
+ $methods[$code] = $this->_getMethod($code, $methodConfig);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return $methods;
51
+ }
52
+
53
+ /**
54
+ * Retrieve all system payments
55
+ *
56
+ * @param mixed $store
57
+ * @return array
58
+ */
59
+ public function getAllMethods($store=null)
60
+ {
61
+ $methods = array();
62
+ $config = Mage::getStoreConfig('payments', $store);
63
+ foreach ($config as $code => $methodConfig) {
64
+ $data = $this->_getMethod($code, $methodConfig);
65
+ if (false !== $data) {
66
+ $methods[$code] = $data;
67
+ }
68
+ }
69
+ return $methods;
70
+ }
71
+
72
+ protected function _getMethod($code, $config, $store=null)
73
+ {
74
+ if (isset(self::$_methods[$code])) {
75
+ return self::$_methods[$code];
76
+ }
77
+ if (empty($config['model'])) {
78
+ return false;
79
+ }
80
+ $modelName = $config['model'];
81
+
82
+ $className = Mage::getConfig()->getModelClassName($modelName);
83
+ if (!mageFindClassFile($className)) {
84
+ return false;
85
+ }
86
+
87
+ $method = Mage::getModel($modelName);
88
+ $method->setId($code)->setStore($store);
89
+ self::$_methods[$code] = $method;
90
+ return self::$_methods[$code];
91
+ }
92
+
93
+ /**
94
+ * Retrieve Program ID
95
+ * The Program ID, as registered in the Zooz Developer Portal.
96
+ *
97
+ * @return string
98
+ */
99
+ public function getProgramId($storeId = null)
100
+ {
101
+ return Mage::getStoreConfig(self::XML_PATH_PROGRAM_ID, $storeId);
102
+ }
103
+
104
+ /**
105
+ * Retrieve Program Key
106
+ * The Program Key, as generated upon app / site registration.
107
+ *
108
+ * @return string
109
+ */
110
+ public function getProgramKey()
111
+ {
112
+ return Mage::helper('core')->decrypt($this->getConfigData('program_key'));
113
+ }
114
+
115
+ /**
116
+ * Retrieve availables credit card types
117
+ *
118
+ * @return array
119
+ */
120
+ public function getCcAvailableTypes($method = false) {
121
+ $types = $this->getCcTypes();
122
+ if ($method) {
123
+ $availableTypes = $method->getConfigData('cctypes');
124
+ if ($availableTypes) {
125
+ $availableTypes = explode(',', $availableTypes);
126
+ foreach ($types as $code=>$name) {
127
+ if (!in_array($code, $availableTypes)) {
128
+ unset($types[$code]);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return $types;
134
+ }
135
+
136
+ /**
137
+ * Retrieve array of credit card types
138
+ *
139
+ * @return array
140
+ */
141
+ public function getCcTypes()
142
+ {
143
+
144
+ $_types = Mage::getConfig()->getNode('global/payments/cc/types')->asArray();
145
+
146
+
147
+
148
+ uasort($_types, array('Zooz_Payments_Model_Config', 'compareCcTypes'));
149
+
150
+ $types = array();
151
+ foreach ($_types as $data) {
152
+ if (isset($data['code']) && isset($data['name'])) {
153
+ $types[$data['code']] = $data['name'];
154
+ }
155
+ }
156
+ return $types;
157
+ }
158
+
159
+ /**
160
+ * Retrieve list of months translation
161
+ *
162
+ * @return array
163
+ */
164
+ public function getMonths()
165
+ {
166
+ $data = Mage::app()->getLocale()->getTranslationList('month');
167
+ foreach ($data as $key => $value) {
168
+ $monthNum = ($key < 10) ? '0'.$key : $key;
169
+ $data[$key] = $monthNum . ' - ' . $value;
170
+ }
171
+ return $data;
172
+ }
173
+
174
+ /**
175
+ * Retrieve credit card expire months
176
+ *
177
+ * @return array
178
+ */
179
+ public function getCcMonths($months)
180
+ {
181
+ if (is_null($months)) {
182
+ $months[0] = $this->__('Month');
183
+ $months = array_merge($months, $this->getMonths());
184
+ }
185
+ return $months;
186
+ }
187
+
188
+ /**
189
+ * Retrieve array of available years
190
+ *
191
+ * @return array
192
+ */
193
+ public function getYears()
194
+ {
195
+ $years = array();
196
+ $first = date("Y");
197
+
198
+ for ($index=0; $index <= 10; $index++) {
199
+ $year = $first + $index;
200
+ $years[$year] = $year;
201
+ }
202
+ return $years;
203
+ }
204
+
205
+ /**
206
+ * Retrieve credit card expire years
207
+ *
208
+ * @return array
209
+ */
210
+ public function getCcYears($years)
211
+ {
212
+ if (is_null($years)) {
213
+ $years = $this->getYears();
214
+ $years = array(0=>$this->__('Year'))+$years;
215
+ }
216
+ return $years;
217
+ }
218
+
219
+ /**
220
+ * Check whether sandbox mode is enabled
221
+ *
222
+ * @return bool
223
+ */
224
+ public function isSandbox($storeId = null)
225
+ {
226
+ $result = Mage::getStoreConfig(self::XML_PATH_IS_SANDBOX, $storeId) == Zooz_Payments_Model_Payments::ACTION_MODE_SANDBOX ? true : false;
227
+ return $result;
228
+ }
229
+
230
+ /**
231
+ * Check whether method active in configuration and supported for merchant country or not
232
+ *
233
+ * @param string $method Method code
234
+ * @return bool
235
+ */
236
+ public function isMethodActive($method)
237
+ {
238
+ if ($this->isMethodSupportedForCountry($method)
239
+ && Mage::getStoreConfigFlag("payment/{$method}/active", $this->_storeId)
240
+ ) {
241
+ return true;
242
+ }
243
+ return false;
244
+ }
245
+
246
+ /**
247
+ * Check whether method supported for specified country or not
248
+ * Use $_methodCode and merchant country by default
249
+ *
250
+ * @return bool
251
+ */
252
+ public function isMethodSupportedForCountry($method = null, $countryCode = null)
253
+ {
254
+ if ($method === null) {
255
+ $method = $this->getMethodCode();
256
+ }
257
+ if ($countryCode === null) {
258
+ $countryCode = $this->getMerchantCountry();
259
+ }
260
+ $countryMethods = $this->getCountryMethods($countryCode);
261
+ if (in_array($method, $countryMethods)) {
262
+ return true;
263
+ }
264
+ return false;
265
+ }
266
+
267
+ /**
268
+ * @param int $storeId
269
+ * @return bool
270
+ */
271
+ public function isSavingCardDataAllowed($storeId = null)
272
+ {
273
+ return Mage::getStoreConfigFlag(self::XML_PATH_SAVE_CREDIT_CARD_ALLOWED, $storeId)
274
+ && Mage::getSingleton('customer/session')->isLoggedIn();
275
+ }
276
+
277
+ /**
278
+ * @param int $storeId
279
+ * @return bool
280
+ */
281
+ public function isPciIframeEnabled($storeId = null)
282
+ {
283
+
284
+ return Mage::getStoreConfigFlag(self::XML_PATH_PCI_IFRAME_ENABLED, $storeId);
285
+ }
286
+
287
+ /**
288
+ * @param int $storeId
289
+ * @return string
290
+ */
291
+ public function getPciIframeUrl($storeId = null)
292
+ {
293
+ return self::PCI_IFRAME_URL;
294
+ }
295
+
296
+ /**
297
+ * Statis Method for compare sort order of CC Types
298
+ *
299
+ * @param array $a
300
+ * @param array $b
301
+ * @return int
302
+ */
303
+ static function compareCcTypes($a, $b)
304
+ {
305
+ if (!isset($a['order'])) {
306
+ $a['order'] = 0;
307
+ }
308
+
309
+ if (!isset($b['order'])) {
310
+ $b['order'] = 0;
311
+ }
312
+
313
+ if ($a['order'] == $b['order']) {
314
+ return 0;
315
+ } else if ($a['order'] > $b['order']) {
316
+ return 1;
317
+ } else {
318
+ return -1;
319
+ }
320
+
321
+ }
322
+ }
app/code/community/Zooz/Payments/Model/Info.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Zooz payment information model
11
+ * Provides business logic information about payment flow
12
+ */
13
+ class Zooz_Payments_Model_Info
14
+ {
15
+ /**
16
+ * @var string
17
+ */
18
+ const PAYMENTSTATUS_APPROVED = 1001;
19
+ const PAYMENTSTATUS_AUTHORIZED_PENDING_COMPLETION = 1002;
20
+ const PAYMENTSTATUS_AUTHORIZED_PENDING_USER_COMPLETION = 1003;
21
+ const PAYMENTSTATUS_REFUNDED = 1004;
22
+ const PAYMENTSTATUS_REFUND_DUE_CHARGEBACK = 1005;
23
+ const PAYMENTSTATUS_CHARGED_BACK = 1006;
24
+ const PAYMENTSTATUS_REFUND = 1007;
25
+ const PAYMENTSTATUS_PENDING_USER_PAYMENT_COMPLETION = 1008;
26
+ const PAYMENTSTATUS_VOIDED = 1009;
27
+ const PAYMENTSTATUS_REFUND_DECLINED = 1011;
28
+ const PAYMENTSTATUS_SUSPICIOUS_TRANSACTION = 1013;
29
+ const PAYMENTSTATUS_PAYMENT_EXPIRED = 1014;
30
+ const PAYMENTSTATUS_PAYMENT_IS_WAITING_FOR_AUTHORIZATION = 1015;
31
+ const PAYMENTSTATUS_PAYMENT_IS_WAITING_FOR_APPROVAL = 1016;
32
+ const PAYMENTSTATUS_PAYMENT_APPROVED_PENDING_FOR_REFUND = 1017;
33
+ const PAYMENTSTATUS_REFUND_IS_WAITING_FOR_APPROVAL = 1018;
34
+
35
+ const PAYMENT_REASON_CODE_REFUND = 'refund';
36
+
37
+ }
app/code/community/Zooz/Payments/Model/Ipn.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Zooz Instant Payment Notification processor model
11
+ */
12
+ class Zooz_Payments_Model_Ipn
13
+ {
14
+ /**
15
+ * Default log filename
16
+ *
17
+ * @var string
18
+ */
19
+ const DEFAULT_LOG_FILE = 'zooz_payments_ipn.log';
20
+
21
+ /**
22
+ * Store order instance
23
+ *
24
+ * @var Mage_Sales_Model_Order
25
+ */
26
+ protected $_order = null;
27
+
28
+ /**
29
+ *
30
+ * @var Zooz_Payments_Model_Config
31
+ */
32
+ protected $_config = null;
33
+
34
+ /**
35
+ * ZooZ info instance
36
+ *
37
+ * @var Zooz_Payments_Model_Info
38
+ */
39
+ protected $_info = null;
40
+
41
+ /**
42
+ * IPN request data
43
+ * @var array
44
+ */
45
+ protected $_request = array();
46
+
47
+ /**
48
+ * Collected debug information
49
+ *
50
+ * @var array
51
+ */
52
+ protected $_debugData = array();
53
+
54
+ /**
55
+ * IP addresses that are valid source of IPN requests
56
+ *
57
+ * @var array
58
+ */
59
+ private $_validRemoteAddresses = array(
60
+ '54.200.242.136',
61
+ '54.200.93.153',
62
+ '54.201.49.185',
63
+ '54.200.38.78',
64
+ '54.69.146.25',
65
+ '54.68.2.155',
66
+ '54.68.182.134',
67
+ '54.148.9.225',
68
+ '54.69.192.240',
69
+ );
70
+
71
+ /**
72
+ * IPN request data getter
73
+ *
74
+ * @param string $key
75
+ * @return array|string
76
+ */
77
+ public function getRequestData($key = null)
78
+ {
79
+ if (null === $key) {
80
+ return $this->_request;
81
+ }
82
+ return isset($this->_request[$key]) ? $this->_request[$key] : null;
83
+ }
84
+
85
+ /**
86
+ * Get ipn data, send verification to Zooz, run corresponding handler
87
+ *
88
+ * @param array $request
89
+ * @throws Exception
90
+ */
91
+ public function processIpnRequest(array $request)
92
+ {
93
+ $this->_request = $request;
94
+ $this->_debugData = array('ipn' => $request);
95
+ ksort($this->_debugData['ipn']);
96
+
97
+ try {
98
+ $this->_validateRequest($request);
99
+ $this->_processOrder();
100
+ } catch (Exception $e) {
101
+ $this->_debugData['exception'] = $e->getMessage();
102
+ $this->_debug();
103
+ throw $e;
104
+ }
105
+ $this->_debug();
106
+ }
107
+
108
+ /**
109
+ * Load and validate order, instantiate proper configuration
110
+ *
111
+ *
112
+ * @return Mage_Sales_Model_Order
113
+ * @throws Exception
114
+ */
115
+ protected function _getOrder()
116
+ {
117
+ if (empty($this->_order)) {
118
+ // get proper order
119
+ $id = $this->_request['invoice']['number'];
120
+ $this->_order = Mage::getModel('sales/order')->loadByIncrementId($id);
121
+ if (!$this->_order->getId()) {
122
+ $this->_debugData['exception'] = sprintf('Wrong order ID: "%s".', $id);
123
+ $this->_debug();
124
+ Mage::app()->getResponse()
125
+ ->setHeader('HTTP/1.1','503 Service Unavailable')
126
+ ->sendResponse();
127
+ exit;
128
+ }
129
+ // re-initialize config with the method code and store id
130
+ $methodCode = $this->_order->getPayment()->getMethod();
131
+ $this->_config = Mage::getModel('payments/config', array($methodCode, $this->_order->getStoreId()));
132
+ // if (!$this->_config->isMethodActive($methodCode)) {
133
+ // throw new Exception(sprintf('Method "%s" is not available.', $methodCode));
134
+ // }
135
+
136
+ }
137
+ return $this->_order;
138
+ }
139
+
140
+ /**
141
+ * IPN workflow implementation
142
+ * Everything should be added to order comments. In positive processing cases customer will get email notifications.
143
+ * Admin will be notified on errors.
144
+ */
145
+ protected function _processOrder()
146
+ {
147
+ $this->_order = null;
148
+ $this->_getOrder();
149
+
150
+ $this->_info = Mage::getSingleton('payments/info');
151
+ try {
152
+ $this->_registerTransaction();
153
+ } catch (Mage_Core_Exception $e) {
154
+ $comment = $this->_createIpnComment(Mage::helper('payments')->__('Note: %s', $e->getMessage()), true);
155
+ $comment->save();
156
+ throw $e;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Process regular IPN notifications
162
+ */
163
+ protected function _registerTransaction()
164
+ {
165
+ try {
166
+ // Handle payment_status
167
+ $paymentStatus = $this->_request['paymentStatusCode'];
168
+ switch ($paymentStatus) {
169
+ // paid
170
+ case Zooz_Payments_Model_Info::PAYMENTSTATUS_APPROVED:
171
+ $this->_registerPaymentCapture(true);
172
+ break;
173
+ case Zooz_Payments_Model_Info::PAYMENTSTATUS_REFUNDED:
174
+ $this->_registerPaymentRefund(true);
175
+ break;
176
+ // authorization void
177
+ case Zooz_Payments_Model_Info::PAYMENTSTATUS_VOIDED:
178
+ $this->_registerPaymentVoid();
179
+ break;
180
+ default:
181
+ throw new Exception("Cannot handle payment status '{$paymentStatus}'.");
182
+ }
183
+ } catch (Mage_Core_Exception $e) {
184
+ $comment = $this->_createIpnComment(Mage::helper('payments')->__('Note: %s', $e->getMessage()), true);
185
+ $comment->save();
186
+ throw $e;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Process completed payment (either full or partial)
192
+ *
193
+ * @param bool $skipFraudDetection
194
+ */
195
+ protected function _registerPaymentCapture($skipFraudDetection = false)
196
+ {
197
+ $parentTransactionId = $this->getRequestData('paymentToken');
198
+ // $this->_importPaymentInformation();
199
+ $payment = $this->_order->getPayment();
200
+ $payment->setTransactionId($parentTransactionId . '-capture')
201
+ ->setCurrencyCode($this->getRequestData('currencyCode'))
202
+ ->setPreparedMessage($this->_createIpnComment(''))
203
+ ->setParentTransactionId($parentTransactionId)
204
+ ->setShouldCloseParentTransaction(Zooz_Payments_Model_Info::PAYMENTSTATUS_APPROVED === $this->getRequestData('paymentStatusCode'))
205
+ ->setIsTransactionClosed(0)
206
+ ->registerCaptureNotification(
207
+ $this->getRequestData('amount'),
208
+ $skipFraudDetection && $parentTransactionId
209
+ );
210
+ $this->_order->save();
211
+
212
+ // notify customer
213
+ $invoice = $payment->getCreatedInvoice();
214
+ if ($invoice && !$this->_order->getEmailSent()) {
215
+ $this->_order->queueNewOrderEmail()->addStatusHistoryComment(
216
+ Mage::helper('payments')->__('Notified customer about invoice #%s.', $invoice->getIncrementId())
217
+ )
218
+ ->setIsCustomerNotified(true)
219
+ ->save();
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Process a refund or a chargeback
225
+ *
226
+ * @param bool $skipFraudDetection
227
+ */
228
+ protected function _registerPaymentRefund($skipFraudDetection = false)
229
+ {
230
+ $parentTransactionId = $this->getRequestData('paymentToken');
231
+ $payment = $this->_order->getPayment();
232
+
233
+ $amount = $this->_order->getBaseCurrency()->formatTxt($payment->getBaseAmountRefundedOnline());
234
+
235
+ $comment = Mage::helper('payments')->__('Refunded amount of %s. Transaction ID: "%s"', $this->getRequestData('amount'), $parentTransactionId);
236
+
237
+ $payment->setPreparedMessage($comment)
238
+ ->setTransactionId($parentTransactionId . '-refund')
239
+ ->setParentTransactionId($parentTransactionId)
240
+ ->setIsTransactionClosed(1)
241
+ ->registerRefundNotification(
242
+ $this->getRequestData('amount'),
243
+ $skipFraudDetection && $parentTransactionId
244
+ );
245
+
246
+ $this->_order->addStatusHistoryComment($comment, false);
247
+ $this->_order->save();
248
+
249
+ // TODO: there is no way to close a capture right now
250
+ $creditmemo = $payment->getCreatedCreditmemo();
251
+ if ($creditmemo) {
252
+ $creditmemo->sendEmail();
253
+ $this->_order->addStatusHistoryComment(
254
+ Mage::helper('payments')->__('Notified customer about creditmemo #%s.', $creditmemo->getIncrementId())
255
+ )
256
+ ->setIsCustomerNotified(true)
257
+ ->save();
258
+ }
259
+ }
260
+
261
+ /**
262
+ * Process voided authorization
263
+ */
264
+ protected function _registerPaymentVoid()
265
+ {
266
+ // $this->_importPaymentInformation();
267
+
268
+ $parentTransactionId = $this->getRequestData('paymentToken');
269
+ $payment = $this->_order->getPayment();
270
+
271
+ $payment->setPreparedMessage($this->_createIpnComment(''))
272
+ ->setParentTransactionId($parentTransactionId)
273
+ ->registerVoidNotification();
274
+
275
+ $this->_order->save();
276
+ }
277
+
278
+ protected function _validateRequest(array $request)
279
+ {
280
+ $remoteAddr = Mage::helper('core/http')->getRemoteAddr();
281
+ if (!in_array($remoteAddr, $this->_validRemoteAddresses)) {
282
+ throw new Exception("$remoteAddr is not a valid remote address for Zooz IPN request");
283
+ }
284
+
285
+ if (!$this->_validateIpnSignature($request)) {
286
+ throw new Exception("Request signature is invalid");
287
+ }
288
+ }
289
+
290
+ private function _validateIpnSignature(array $request)
291
+ {
292
+ return true; //TODO complete signature validation
293
+ $text = sprintf('%.2F', $request['amount']);
294
+ $text .= $request['paymentId'];
295
+ $text .= $request['paymentMethod']['paymentMethodLastUsedTimestamp'];
296
+ $text .= $request['paymentMethod']['paymentMethodToken'];
297
+ $text .= $request['processorReferenceId'];
298
+ $text .= 'merchantServerApiKey';
299
+
300
+ return false;
301
+ }
302
+
303
+ /**
304
+ * Generate an "IPN" comment with additional explanation.
305
+ * Returns the generated comment or order status history object
306
+ *
307
+ * @param string $comment
308
+ * @param bool $addToHistory
309
+ * @return string|Mage_Sales_Model_Order_Status_History
310
+ */
311
+ protected function _createIpnComment($comment = '', $addToHistory = false)
312
+ {
313
+ $paymentStatus = $this->getRequestData('paymentStatus');
314
+ $message = Mage::helper('payments')->__('IPN "%s".', $paymentStatus);
315
+ if ($comment) {
316
+ $message .= ' ' . $comment;
317
+ }
318
+ if ($addToHistory) {
319
+ $message = $this->_order->addStatusHistoryComment($message);
320
+ $message->setIsCustomerNotified(null);
321
+ }
322
+ return $message;
323
+ }
324
+
325
+ /**
326
+ * Log debug data to file
327
+ *
328
+ * @param mixed $debugData
329
+ */
330
+ protected function _debug()
331
+ {
332
+ if ($this->_config && $this->_config->debug) {
333
+ $file = $this->_config->getMethodCode() ? "payment_{$this->_config->getMethodCode()}.log"
334
+ : self::DEFAULT_LOG_FILE;
335
+ Mage::getModel('core/log_adapter', $file)->log($this->_debugData);
336
+ }
337
+ }
338
+ }
app/code/community/Zooz/Payments/Model/Mysql4/Debug.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */
9
+ class Zooz_Payments_Model_Mysql4_Debug extends Mage_Core_Model_Mysql4_Abstract {
10
+
11
+ protected function _construct() {
12
+ $this->_init('zooz/api_debug', 'debug_id');
13
+ }
14
+
15
+ }
app/code/community/Zooz/Payments/Model/Observer.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Zooz_Payments_Model_Observer
4
+ {
5
+
6
+
7
+ public function handleSalesOrderSaveBefore(Varien_Event_Observer $observer)
8
+ {
9
+
10
+ $order = $observer->getEvent()->getOrder();
11
+ $payment = $order->getPayment();
12
+ $post = Mage::app()->getRequest()->getPost();
13
+
14
+ if($post['payment']['method'] == 'payments' && isset($post['payment']['is_iframe']) &&$post['payment']['is_iframe'] == 1) {
15
+ $payment_detail = $this->_getApi()->getPaymentDetails($post['payment']['cc_payment_token']);
16
+ $additional = $payment->getAdditionalInformation();
17
+
18
+ $type = strtolower($payment_detail["paymentMethod"]["subtype"]);
19
+
20
+ if($type == 'visa') {
21
+ $type = "VI";
22
+ }
23
+ if($type == 'mastercard') {
24
+ $type = "MC";
25
+ }
26
+ if($type == 'americanexpress') {
27
+ $type = "AE";
28
+ }
29
+ if($type == 'discover') {
30
+ $type = "DI";
31
+ }
32
+ foreach($additional['zooz_cards'] as $key => $value) {
33
+ foreach($value as $k => $v) {
34
+ if($k=='cc_last4') {
35
+ $additional['zooz_cards'][array_keys($additional['zooz_cards'])[0]][$k] = $payment_detail["paymentMethod"]["lastFourDigits"];
36
+ }
37
+ if($k=='cc_type') {
38
+ $additional['zooz_cards'][array_keys($additional['zooz_cards'])[0]][$k] = $type;
39
+ }
40
+ }
41
+ }
42
+
43
+
44
+ $payment->setAdditionalInformation($additional);
45
+
46
+ $payment->save();
47
+ }
48
+
49
+
50
+ }
51
+
52
+ protected function _getApi()
53
+ {
54
+ return Mage::getSingleton('payments/api');
55
+ }
56
+
57
+ }
app/code/community/Zooz/Payments/Model/Payments.php ADDED
@@ -0,0 +1,1077 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Model_Payments extends Mage_Payment_Model_Method_Cc {
10
+
11
+ const ACTION_MODE_SANDBOX = 'sandbox';
12
+ const ACTION_MODE_PRODUCTION = 'production';
13
+
14
+ const REQUEST_METHOD_CC = 'CC';
15
+ const REQUEST_METHOD_ECHECK = 'ECHECK';
16
+
17
+ const REQUEST_TYPE_AUTH_CAPTURE = 'AUTH_CAPTURE';
18
+ const REQUEST_TYPE_AUTH_ONLY = 'AUTH_ONLY';
19
+ const REQUEST_TYPE_PRIOR_AUTH_CAPTURE = 'PRIOR_AUTH_CAPTURE';
20
+ const REQUEST_TYPE_CREDIT = 'CREDIT';
21
+ const REQUEST_TYPE_VOID = 'VOID';
22
+
23
+ const RESPONSE_CODE_ERROR = -1;
24
+ const RESPONSE_CODE_SUCCESS = 0;
25
+
26
+ const URI_SANDBOX = 'https://sandbox.zooz.co/mobile/ZooZPaymentAPI';
27
+ const URI_PRODUCTION = 'https://app.zooz.com/mobile/ZooZPaymentAPI';
28
+
29
+ const REFUND_REASON_GENERAL = 'GENERAL_REFUND';
30
+ const REFUND_REASON_SERVICE_NOT_RENDER = 'SERVICE_NOT_RENDER';
31
+ const REFUND_REASON_GOODS_NOT_PROVIDED = 'GOODS_NOT_PROVIDED';
32
+ const REFUND_REASON_GOODS_RETURNED = 'GOODS_RETURNED';
33
+
34
+ const METHOD_CODE = 'payments';
35
+
36
+ private static $sandbox = true;
37
+ private static $uniqueID = '';
38
+ private static $appKey = '';
39
+
40
+ protected $_code = self::METHOD_CODE;
41
+
42
+ /**
43
+ * Form block type
44
+ */
45
+ protected $_formBlockType = 'payments/form_payments';
46
+
47
+ /**
48
+ * Info block type
49
+ */
50
+ protected $_infoBlockType = 'payments/info_payments';
51
+
52
+ /**
53
+ * Availability options
54
+ */
55
+ protected $_isGateway = true;
56
+ protected $_canAuthorize = true;
57
+ protected $_canCapture = true;
58
+ protected $_canCapturePartial = false;
59
+ protected $_canRefund = true;
60
+ protected $_canRefundInvoicePartial = true;
61
+ protected $_canVoid = true;
62
+ protected $_canUseInternal = true;
63
+ protected $_canUseCheckout = true;
64
+ protected $_canUseForMultishipping = true;
65
+ protected $_canSaveCc = false;
66
+ protected $_canFetchTransactionInfo = true;
67
+
68
+ private $_paymentToken = null;
69
+ private $_paymentMethodToken = null;
70
+
71
+ public function _construct()
72
+ {
73
+ $this->_init('debug/zooz');
74
+ }
75
+
76
+ /**
77
+ * Send authorize request to gateway
78
+ *
79
+ * @param Varien_Object $payment
80
+ * @param decimal $amount
81
+ * @return Zooz_Payments_Model_Payments
82
+ */
83
+ public function authorize(Varien_Object $payment, $amount)
84
+ {
85
+
86
+ if ($amount <= 0) {
87
+ Mage::throwException(Mage::helper('payments')->__('Invalid amount for authorization.'));
88
+ }
89
+
90
+ $this->_initCardsStorage($payment);
91
+
92
+ // if ($this->isPartialAuthorization($payment)) {
93
+ // $this->_partialAuthorization($payment, $amount, self::REQUEST_TYPE_AUTH_ONLY);
94
+ // $payment->setSkipTransactionCreation(true);
95
+ // return $this;
96
+ // }
97
+
98
+ if($payment->getIsIframe()) {
99
+ $this->_paymentToken = $payment->getCcPaymentToken();
100
+ $this->_paymentMethodToken = $payment->getCcSavedCard();
101
+ } else {
102
+ $this->_openPayment($payment, $amount);
103
+ if ($this->_isSavingCardDataAllowed() && $payment->getCcSavedCard()) {
104
+ $paymentMethod = $this->_getSavedCard($payment->getCcSavedCard(), $this->_getCustomerLoginId($payment));
105
+ if ($paymentMethod !== null) {
106
+ $this->_paymentMethodToken = $payment->getCcSavedCard();
107
+ } else {
108
+ Mage::throwException('Invalid credit card selected');
109
+ }
110
+ } else {
111
+ $this->_addPaymentMethod($payment);
112
+ }
113
+ }
114
+
115
+ $this->_place($payment, $amount, self::REQUEST_TYPE_AUTH_ONLY);
116
+ $payment->setSkipTransactionCreation(true);
117
+
118
+ return $this;
119
+ }
120
+
121
+ /**
122
+ * Send capture request to gateway
123
+ *
124
+ * @param Varien_Object $payment
125
+ * @param decimal $amount
126
+ * @return Zooz_Payments_Model_Payments
127
+ */
128
+ public function capture(Varien_Object $payment, $amount)
129
+ {
130
+
131
+ if ($amount <= 0) {
132
+ Mage::throwException(Mage::helper('payments')->__('Invalid amount for capture.'));
133
+ }
134
+
135
+ $this->_initCardsStorage($payment);
136
+ if ($this->_isPreauthorizeCapture($payment)) {
137
+ $this->_preauthorizeCapture($payment, $amount);
138
+ } else {
139
+ if($payment->getIsIframe()) {
140
+ $this->_paymentToken = $payment->getCcPaymentToken();
141
+ $this->_paymentMethodToken = $payment->getCcSavedCard();
142
+ } else {
143
+ $this->_openPayment($payment, $amount);
144
+ if ($this->_isSavingCardDataAllowed() && $payment->getCcSavedCard()) {
145
+ $paymentMethod = $this->_getSavedCard($payment->getCcSavedCard(), $this->_getCustomerLoginId($payment));
146
+ if ($paymentMethod !== null) {
147
+ $this->_paymentMethodToken = $payment->getCcSavedCard();
148
+ } else {
149
+ Mage::throwException('Invalid credit card selected');
150
+ }
151
+ } else {
152
+ $this->_addPaymentMethod($payment);
153
+ }
154
+ }
155
+ $this->_place($payment, $amount, self::REQUEST_TYPE_AUTH_CAPTURE);
156
+ }
157
+
158
+ $payment->setSkipTransactionCreation(true);
159
+ return $this;
160
+ }
161
+
162
+ /**
163
+ * Void the payment
164
+ *
165
+ * @param Varien_Object $payment
166
+ * @param type $amount
167
+ * @return Zooz_Payments_Model_Payments
168
+ */
169
+ public function void(Varien_Object $payment)
170
+ {
171
+ $cardsStorage = $this->getCardsStorage($payment);
172
+
173
+ $messages = array();
174
+ $isSuccessful = false;
175
+ $isFiled = false;
176
+ foreach($cardsStorage->getCards() as $card) {
177
+ try {
178
+ $newTransaction = $this->_voidCardTransaction($payment, $card);
179
+ $messages[] = $newTransaction->getMessage();
180
+ $isSuccessful = true;
181
+ } catch (Exception $e) {
182
+ $messages[] = $e->getMessage();
183
+ $isFiled = true;
184
+ continue;
185
+ }
186
+ $cardsStorage->updateCard($card);
187
+ }
188
+
189
+ if ($isFiled) {
190
+ $this->_processFailureMultitransactionAction($payment, $messages, $isSuccessful);
191
+ }
192
+
193
+ $payment->setSkipTransactionCreation(true);
194
+ return $this;
195
+ }
196
+
197
+ /**
198
+ * Cancel the payment through gateway
199
+ *
200
+ * @param Varien_Object $payment
201
+ * @return Zooz_Payments_Model_Payments
202
+ */
203
+ public function cancel(Varien_Object $payment)
204
+ {
205
+ return $this->void($payment);
206
+ }
207
+
208
+ /**
209
+ * Check refund availability
210
+ *
211
+ * @return bool
212
+ */
213
+ public function canRefund()
214
+ {
215
+
216
+ foreach($this->getCardsStorage()->getCards() as $card) {
217
+ $lastTransaction = $this->getInfoInstance()->getTransaction($card->getLastTransId());
218
+ if ($lastTransaction
219
+ && $lastTransaction->getTxnType() == Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE
220
+ && !$lastTransaction->getIsClosed()
221
+ ) {
222
+ return true;
223
+ }
224
+ }
225
+ return false;
226
+ }
227
+
228
+ /**
229
+ * Refund the amount with transaction id
230
+ *
231
+ * @param Varien_Object $payment
232
+ * @param decimal $amount
233
+ * @return Mage_Paygate_Model_Authorizenet
234
+ * @throws Mage_Core_Exception
235
+ */
236
+ public function refund(Varien_Object $payment, $requestedAmount)
237
+ {
238
+ $cardsStorage = $this->getCardsStorage($payment);
239
+
240
+ if ($this->_formatAmount(
241
+ $cardsStorage->getCapturedAmount() - $cardsStorage->getRefundedAmount()
242
+ ) < $requestedAmount
243
+ ) {
244
+ Mage::throwException(Mage::helper('payments')->__('Invalid amount for refund.'));
245
+ }
246
+
247
+ $messages = array();
248
+ $isSuccessful = false;
249
+ $isFiled = false;
250
+ foreach($cardsStorage->getCards() as $card) {
251
+ if ($requestedAmount > 0) {
252
+ $cardAmountForRefund = $this->_formatAmount($card->getCapturedAmount() - $card->getRefundedAmount());
253
+ if ($cardAmountForRefund <= 0) {
254
+ continue;
255
+ }
256
+ if ($cardAmountForRefund > $requestedAmount) {
257
+ $cardAmountForRefund = $requestedAmount;
258
+ }
259
+ try {
260
+ $newTransaction = $this->_refundCardTransaction($payment, $cardAmountForRefund, $card);
261
+ $messages[] = $newTransaction->getMessage();
262
+ $isSuccessful = true;
263
+ } catch (Exception $e) {
264
+ $messages[] = $e->getMessage();
265
+ $isFiled = true;
266
+ continue;
267
+ }
268
+ $card->setRefundedAmount($this->_formatAmount($card->getRefundedAmount() + $cardAmountForRefund));
269
+ $cardsStorage->updateCard($card);
270
+ $requestedAmount = $this->_formatAmount($requestedAmount - $cardAmountForRefund);
271
+ } else {
272
+ $payment->setSkipTransactionCreation(true);
273
+ return $this;
274
+ }
275
+ }
276
+
277
+ if ($isFiled) {
278
+ $this->_processFailureMultitransactionAction($payment, $messages, $isSuccessful);
279
+ }
280
+
281
+ $payment->setSkipTransactionCreation(true);
282
+ return $this;
283
+ }
284
+
285
+ public function getPaymentToken($payment, $amount)
286
+ {
287
+
288
+ $result = $this->_openPayment($payment, $amount);
289
+ return $this->_paymentToken;
290
+ }
291
+
292
+
293
+ protected function _openPayment($payment, $amount)
294
+ {
295
+
296
+ $api = Mage::getModel('payments/api');
297
+ $result = $api->openPayment($payment, $amount, $this->_getCustomerLoginId($payment));
298
+ $this->_paymentToken = $result->getData('paymentToken');
299
+
300
+ return $this;
301
+ }
302
+
303
+ /**
304
+ * @param Mage_Payment_Model_Info $payment
305
+ * @return $this
306
+ */
307
+ private function _addPaymentMethod($payment)
308
+ {
309
+ $checkout = $this->_getSession()->getQuote();
310
+ $billAddress = $checkout->getBillingAddress();
311
+ $info = $this->getInfoInstance();
312
+ $cardData = new Varien_Object();
313
+ $cardData
314
+ ->setHolderEmail($payment->getOrder()->getCustomerEmail())
315
+ ->setHolderFirstname($billAddress->getFirstname())
316
+ ->setHolderLastname($billAddress->getLastname())
317
+ ->setCcExpMonth($info->getCcExpMonth())
318
+ ->setCcExpYear($info->getCcExpYear())
319
+ ->setCcNumber($info->getCcNumber())
320
+ ->setCcCvv($info->getCcCid())
321
+ ->setCcSaveData($info->getCcSaveData());
322
+
323
+ $api = Mage::getModel('payments/api');
324
+ $response = $api->addPaymentMethod($this->_getCustomerLoginId($payment), $cardData, $this->_paymentToken);
325
+
326
+ $this->_paymentMethodToken = $response->getData('paymentMethodToken');
327
+
328
+ return $this;
329
+ }
330
+
331
+ /**
332
+ * Send request with new payment to gateway
333
+ *
334
+ * @param Mage_Payment_Model_Info $payment
335
+ * @param decimal $amount
336
+ * @param string $requestType
337
+ * @return Zooz_Payments_Model_Payments
338
+ * @throws Mage_Core_Exception
339
+ */
340
+ protected function _place($payment, $amount, $requestType)
341
+ {
342
+ $payment->setAmount($amount);
343
+
344
+ $info = $this->getInfoInstance();
345
+ $request = $this->_getRequest();
346
+ $request->addData(array(
347
+ 'paymentToken' => $this->_paymentToken,
348
+ 'paymentMethod' => array(
349
+ 'paymentMethodType' => 'CreditCard',
350
+ 'paymentMethodToken' => $this->_paymentMethodToken,
351
+ 'paymentMethodDetails' => array(
352
+ 'cvvNumber' => $info->getCcCid()
353
+ )
354
+ )
355
+ ));
356
+
357
+ switch ($requestType) {
358
+ case self::REQUEST_TYPE_AUTH_ONLY:
359
+ $request->setCommand('authorizePayment');
360
+ $newTransactionType = Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH;
361
+ $defaultExceptionMessage = Mage::helper('payments')->__('Payment authorization error.');
362
+ break;
363
+ case self::REQUEST_TYPE_AUTH_CAPTURE:
364
+ $request->setCommand('sale');
365
+ $newTransactionType = Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE;
366
+ $defaultExceptionMessage = Mage::helper('payments')->__('Payment capturing error.');
367
+ break;
368
+ }
369
+
370
+ $result = $this->_postRequest($request);
371
+
372
+ switch ($result->getResponseCode()) {
373
+ case self::RESPONSE_CODE_SUCCESS:
374
+ $this->getCardsStorage($payment)->flushCards();
375
+ $card = $this->_registerCard($result, $payment);
376
+ $this->_addTransaction(
377
+ $payment,
378
+ $card->getLastTransId(),
379
+ $newTransactionType,
380
+ array('is_transaction_closed' => 0),
381
+ array($this->_realTransactionIdKey => $card->getLastTransId()),
382
+ Mage::helper('payments')->getTransactionMessage(
383
+ $payment, $requestType, $card->getLastTransId(), $card, $amount
384
+ )
385
+ );
386
+ if ($requestType == self::REQUEST_TYPE_AUTH_CAPTURE) {
387
+ $card->setCapturedAmount($card->getProcessedAmount());
388
+ $this->getCardsStorage($payment)->updateCard($card);
389
+ }
390
+ return $this;
391
+ case self::RESPONSE_CODE_ERROR:
392
+ Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
393
+ default:
394
+ Mage::throwException($defaultExceptionMessage);
395
+ }
396
+ return $this;
397
+ }
398
+
399
+ /**
400
+ * Return true if there are authorized transactions
401
+ *
402
+ * @param Mage_Payment_Model_Info $payment
403
+ * @return bool
404
+ */
405
+ protected function _isPreauthorizeCapture($payment)
406
+ {
407
+ if ($this->getCardsStorage()->getCardsCount() <= 0) {
408
+ return false;
409
+ }
410
+ foreach($this->getCardsStorage()->getCards() as $card) {
411
+ $lastTransaction = $payment->getTransaction($card->getLastTransId());
412
+ if (!$lastTransaction
413
+ || $lastTransaction->getTxnType() != Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH
414
+ ) {
415
+ return false;
416
+ }
417
+ }
418
+ return true;
419
+ }
420
+
421
+ /**
422
+ * Send capture request to gateway for capture authorized transactions
423
+ *
424
+ * @param Mage_Payment_Model_Info $payment
425
+ * @param decimal $amount
426
+ * @return Zooz_Payments_Model_Payments
427
+ */
428
+ protected function _preauthorizeCapture($payment, $requestedAmount)
429
+ {
430
+ $cardsStorage = $this->getCardsStorage($payment);
431
+
432
+ if ($this->_formatAmount(
433
+ $cardsStorage->getProcessedAmount() - $cardsStorage->getCapturedAmount()
434
+ ) < $requestedAmount
435
+ ) {
436
+ Mage::throwException(Mage::helper('payments')->__('Invalid amount for capture.'));
437
+ }
438
+
439
+ $messages = array();
440
+ $isSuccessful = false;
441
+ $isFiled = false;
442
+ foreach($cardsStorage->getCards() as $card) {
443
+ if ($requestedAmount > 0) {
444
+ $cardAmountForCapture = $card->getProcessedAmount();
445
+ if ($cardAmountForCapture > $requestedAmount) {
446
+ $cardAmountForCapture = $requestedAmount;
447
+ }
448
+ try {
449
+ $newTransaction = $this->_preauthorizeCaptureCardTransaction(
450
+ $payment, $cardAmountForCapture , $card
451
+ );
452
+ $messages[] = $newTransaction->getMessage();
453
+ $isSuccessful = true;
454
+ } catch (Exception $e) {
455
+ $messages[] = $e->getMessage();
456
+ $isFiled = true;
457
+ continue;
458
+ }
459
+ $card->setCapturedAmount($cardAmountForCapture);
460
+ $cardsStorage->updateCard($card);
461
+ $requestedAmount = $this->_formatAmount($requestedAmount - $cardAmountForCapture);
462
+ } else {
463
+ /**
464
+ * This functional is commented because partial capture is disable. See self::_canCapturePartial.
465
+ */
466
+ //$this->_voidCardTransaction($payment, $card);
467
+ }
468
+ }
469
+
470
+ if ($isFiled) {
471
+ $this->_processFailureMultitransactionAction($payment, $messages, $isSuccessful);
472
+ }
473
+ return $this;
474
+ }
475
+
476
+ /**
477
+ * Send capture request to gateway for capture authorized transactions of card
478
+ *
479
+ * @param Mage_Payment_Model_Info $payment
480
+ * @param decimal $amount
481
+ * @param Varien_Object $card
482
+ * @return Mage_Sales_Model_Order_Payment_Transaction
483
+ */
484
+ protected function _preauthorizeCaptureCardTransaction($payment, $amount, $card)
485
+ {
486
+ $payment->setAmount($amount);
487
+ $authTransactionId = $card->getLastTransId();
488
+
489
+ $request = $this->_getRequest();
490
+ $request->addData(array(
491
+ 'command' => 'commitPayment',
492
+ 'paymentToken' => $authTransactionId,
493
+
494
+ ));
495
+
496
+ $result = $this->_postRequest($request);
497
+
498
+ switch ($result->getResponseCode()) {
499
+ case self::RESPONSE_CODE_SUCCESS:
500
+ $captureTransactionId = $authTransactionId . '-capture';
501
+ $card->setLastTransId($captureTransactionId);
502
+ return $this->_addTransaction(
503
+ $payment,
504
+ $captureTransactionId,
505
+ Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE,
506
+ array(
507
+ 'is_transaction_closed' => 0,
508
+ 'parent_transaction_id' => $authTransactionId
509
+ ),
510
+ array($this->_realTransactionIdKey => $authTransactionId),
511
+ Mage::helper('payments')->getTransactionMessage(
512
+ $payment, self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE, $authTransactionId, $card, $amount
513
+ )
514
+ );
515
+ break;
516
+ case self::RESPONSE_CODE_ERROR:
517
+ $exceptionMessage = $this->_wrapGatewayError($result->getResponseReasonText());
518
+ break;
519
+ default:
520
+ $exceptionMessage = Mage::helper('payments')->__('Payment capturing error.');
521
+ break;
522
+ }
523
+
524
+ $exceptionMessage = Mage::helper('payments')->getTransactionMessage(
525
+ $payment, self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE, $authTransactionId, $card, $amount, $exceptionMessage
526
+ );
527
+ Mage::throwException($exceptionMessage);
528
+ }
529
+
530
+ /**
531
+ * Void the card transaction through gateway
532
+ *
533
+ * @param Mage_Payment_Model_Info $payment
534
+ * @param Varien_Object $card
535
+ * @return Mage_Sales_Model_Order_Payment_Transaction
536
+ */
537
+ protected function _voidCardTransaction($payment, $card)
538
+ {
539
+ $authTransactionId = $card->getLastTransId();
540
+
541
+ $request = $this->_getRequest();
542
+ $request->addData(array(
543
+ 'command' => 'voidPayment',
544
+ 'paymentToken' => $authTransactionId
545
+ )
546
+ );
547
+
548
+ $result = $this->_postRequest($request);
549
+
550
+ switch ($result->getResponseCode()) {
551
+ case self::RESPONSE_CODE_SUCCESS:
552
+ $voidTransactionId = $authTransactionId . '-void';
553
+ $card->setLastTransId($voidTransactionId);
554
+ return $this->_addTransaction(
555
+ $payment, $voidTransactionId, Mage_Sales_Model_Order_Payment_Transaction::TYPE_VOID,
556
+ array(
557
+ 'is_transaction_closed' => 1,
558
+ 'should_close_parent_transaction' => 1,
559
+ 'parent_transaction_id' => $authTransactionId
560
+ ),
561
+ array($this->_realTransactionIdKey => $authTransactionId),
562
+ Mage::helper('payments')->getTransactionMessage(
563
+ $payment, self::REQUEST_TYPE_VOID, $authTransactionId, $card
564
+ )
565
+ );
566
+ break;
567
+ case self::RESPONSE_CODE_ERROR:
568
+ Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
569
+ break;
570
+ default:
571
+ Mage::throwException($defaultExceptionMessage);
572
+ break;
573
+ }
574
+
575
+ $exceptionMessage = Mage::helper('payments')->getTransactionMessage(
576
+ $payment, self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE, $authTransactionId, $card, $amount, $exceptionMessage
577
+ );
578
+ Mage::throwException($exceptionMessage);
579
+ }
580
+
581
+ /**
582
+ * Refund the card transaction through gateway
583
+ *
584
+ * @param Mage_Payment_Model_Info $payment
585
+ * @param Varien_Object $card
586
+ * @return Mage_Sales_Model_Order_Payment_Transaction
587
+ */
588
+ protected function _refundCardTransaction($payment, $amount, $card)
589
+ {
590
+ $authTransactionId = $card->getLastTransId();
591
+
592
+ $request = $this->_getRequest();
593
+ $request->addData(array(
594
+ 'command' => 'refundPayment',
595
+ 'paymentToken' => $authTransactionId,
596
+ 'amount' => $amount,
597
+ 'refundReason' => self::REFUND_REASON_GENERAL,
598
+ 'uniqueTransactionID' => 'refundTxId-' . $authTransactionId . '-' . time()
599
+ )
600
+ );
601
+
602
+ $result = $this->_postRequest($request);
603
+
604
+ switch ($result->getResponseCode()) {
605
+ case self::RESPONSE_CODE_SUCCESS:
606
+ $captureTransactionId = $authTransactionId . '-capture';
607
+ $refundTransactionId = $authTransactionId . '-refund';
608
+ $shouldCloseCaptureTransaction = 0;
609
+ /**
610
+ * If it is last amount for refund, transaction with type "capture" will be closed
611
+ * and card will has last transaction with type "refund"
612
+ */
613
+ if ($this->_formatAmount($card->getCapturedAmount() - $card->getRefundedAmount()) == $amount) {
614
+ $card->setLastTransId($refundTransactionId);
615
+ $shouldCloseCaptureTransaction = 1;
616
+ }
617
+ return $this->_addTransaction(
618
+ $payment,
619
+ $refundTransactionId,
620
+ Mage_Sales_Model_Order_Payment_Transaction::TYPE_REFUND,
621
+ array(
622
+ 'is_transaction_closed' => 1,
623
+ 'should_close_parent_transaction' => $shouldCloseCaptureTransaction,
624
+ 'parent_transaction_id' => $captureTransactionId
625
+ ),
626
+ array($this->_realTransactionIdKey => $authTransactionId),
627
+ Mage::helper('payments')->getTransactionMessage(
628
+ $payment, self::REQUEST_TYPE_CREDIT, $authTransactionId, $card, $amount
629
+ )
630
+ );
631
+ case self::RESPONSE_CODE_ERROR:
632
+ Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
633
+ break;
634
+ default:
635
+ Mage::throwException($defaultExceptionMessage);
636
+ break;
637
+ }
638
+
639
+ $exceptionMessage = Mage::helper('payments')->getTransactionMessage(
640
+ $payment, self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE, $authTransactionId, $card, $amount, $exceptionMessage
641
+ );
642
+ Mage::throwException($exceptionMessage);
643
+ }
644
+
645
+ /**
646
+ * Process exceptions for gateway action with a lot of transactions
647
+ *
648
+ * @param Mage_Payment_Model_Info $payment
649
+ * @param string $messages
650
+ * @param bool $isSuccessfulTransactions
651
+ */
652
+ protected function _processFailureMultitransactionAction($payment, $messages, $isSuccessfulTransactions)
653
+ {
654
+ if ($isSuccessfulTransactions) {
655
+ $messages[] = Mage::helper('payments')->__('Gateway actions are locked because the gateway cannot complete one or more of the transactions. Please log in to your Authorize.Net account to manually resolve the issue(s).');
656
+ /**
657
+ * If there is successful transactions we can not to cancel order but
658
+ * have to save information about processed transactions in order`s comments and disable
659
+ * opportunity to voiding\capturing\refunding in future. Current order and payment will not be saved because we have to
660
+ * load new order object and set information into this object.
661
+ */
662
+ $currentOrderId = $payment->getOrder()->getId();
663
+ $copyOrder = Mage::getModel('sales/order')->load($currentOrderId);
664
+ $copyOrder->getPayment()->setAdditionalInformation($this->_isGatewayActionsLockedKey, 1);
665
+ foreach($messages as $message) {
666
+ $copyOrder->addStatusHistoryComment($message);
667
+ }
668
+ $copyOrder->save();
669
+ }
670
+ Mage::throwException(Mage::helper('payments')->convertMessagesToMessage($messages));
671
+ }
672
+
673
+ public function validate()
674
+ {
675
+ $helper = $this->_getHelper();
676
+ /* @var $info Mage_Payment_Model_Info */
677
+ $info = $this->getInfoInstance();
678
+
679
+ if(!$info->getIsIframe()) {
680
+ if (!$this->_isSavingCardDataAllowed() || !$info->getCcSavedCard()) {
681
+ return parent::validate();
682
+ }
683
+ }
684
+
685
+
686
+ $isOrder = $info instanceof Mage_Sales_Model_Order_Payment;
687
+ /**
688
+ * this validation is normally (in standard workflow) done in Mage_Payment_Model_Method_Abstract::validate
689
+ * called from Mage_Payment_Model_Method_Cc::validate. If saved card is used this method won't be called.
690
+ * That's why this has to be validated here
691
+ */
692
+ if ($isOrder) {
693
+ $billingCountry = $info->getOrder()->getBillingAddress()->getCountryId();
694
+ } else {
695
+ $billingCountry = $info->getQuote()->getBillingAddress()->getCountryId();
696
+ }
697
+ if (!$this->canUseForCountry($billingCountry)) {
698
+ Mage::throwException(Mage::helper('payment')->__('Selected payment type is not allowed for billing country.'));
699
+ }
700
+ //end additinal validation
701
+
702
+ if(!$info->getIsIframe()) {
703
+ $customerLoginId = $isOrder ? $info->getOrder()->getCustomerId() : $info->getQuote()->getCustomerId();
704
+ $savedCard = $this->_getSavedCard($info->getCcSavedCard(), $customerLoginId);
705
+ if ($savedCard === null) {
706
+ Mage::throwException($helper->__('Invalid credit card'));
707
+ }
708
+ $ccType = $helper->translateCardSubtypeToTypeCode($savedCard->getSubtype());
709
+ }
710
+
711
+
712
+
713
+ return $this;
714
+ }
715
+
716
+ public function getVerificationRegEx()
717
+ {
718
+ return array_merge(parent::getVerificationRegEx(), array(
719
+ 'DC' => '/^[0-9]{3}$/' // Diners Club CCV
720
+ ));
721
+ }
722
+
723
+ public function OtherCcType($type)
724
+ {
725
+ return in_array($type, array('OT', 'DC'));
726
+ }
727
+
728
+ /**
729
+ * @param $paymentMethodToken
730
+ * @param $customerLoginId
731
+ * @return null|Varien_Object
732
+ */
733
+ private function _getSavedCard($paymentMethodToken, $customerLoginId)
734
+ {
735
+ $api = Mage::getModel('payments/api');
736
+ return $api->getPaymentMethod($paymentMethodToken, $customerLoginId);
737
+ }
738
+
739
+ private function _getApiClient()
740
+ {
741
+ $client = new Varien_Http_Client();
742
+ $client->setUri($this->_getRequestUri());
743
+ $client->setConfig(array(
744
+ 'maxredirects'=>0,
745
+ 'timeout'=>30,
746
+
747
+ ));
748
+ $client->setHeaders(array(
749
+ 'programId' => $this->getConfigData('program_id'),
750
+ 'programKey' => Mage::helper('core')->decrypt($this->getConfigData('program_key')),
751
+ 'ZooZResponseType' => 'JSon'
752
+ ));
753
+ $client->setMethod(Zend_Http_Client::POST);
754
+
755
+ return $client;
756
+ }
757
+
758
+ private function _getRequestUri()
759
+ {
760
+ if ($this->getConfigData('payment_mode') == self::ACTION_MODE_PRODUCTION) {
761
+ return self::URI_PRODUCTION;
762
+ }
763
+
764
+ return self::URI_SANDBOX;
765
+ }
766
+
767
+ /**
768
+ * Post request to gateway and return responce
769
+ * @param Zooz_Payments_Model_Payments_Request $request)
770
+ * @return Zooz_Payments_Model_Payments_Result
771
+ */
772
+ protected function _postRequest(Varien_Object $request)
773
+ {
774
+ $helper = $this->_getHelper();
775
+ $debugData = array('request' => $request);
776
+ $result = Mage::getModel('payments/payments_result');
777
+
778
+ $client = $this->_getApiClient();
779
+ $client->setRawData(json_encode($request->getData()), 'application/json');
780
+
781
+ try {
782
+ $response = $client->request();
783
+ } catch (Exception $ex) {
784
+ $result
785
+ ->setResponseCode(-1)
786
+ ->setResponseReasonCode($ex->getCode())
787
+ ->setResponseReasonText($ex->getMessage());
788
+
789
+ $debugData['result'] = $result->getData();
790
+ Mage::log($ex->getMessage(),NULL,'debgs.log');
791
+ $this->_debug($debugData);
792
+ Mage::throwException($this->_wrapGatewayError($ex->getMessage()));
793
+ }
794
+
795
+ $responseAsArray = json_decode($response->getBody(), true);
796
+
797
+ try {
798
+ if (!is_array($responseAsArray)) {
799
+ throw new Zooz_Payments_Exception($helper->__('Not able to deserialize response'));
800
+ }
801
+
802
+ if ($responseAsArray['responseStatus'] != 0) {
803
+ throw new Zooz_Payments_Exception(
804
+ $responseAsArray['responseObject']['errorDescription'],
805
+ $responseAsArray['responseObject']['responseErrorCode']
806
+ );
807
+ }
808
+ } catch (Zooz_Payments_Exception $ex) {
809
+ $message = Mage::helper('payments')->handleError($responseAsArray['responseObject']);
810
+ $result
811
+ ->setResponseCode(-1)
812
+ ->setResponseReasonCode($ex->getFields())
813
+ ->setResponseReasonText($message);
814
+
815
+ $debugData['result'] = $result->getData();
816
+ $this->_debug($debugData);
817
+ Mage::log($ex->getMessage(),NULL,'debgs.log');
818
+ return $result;
819
+ }
820
+
821
+ $result
822
+ ->setResponseCode(0)
823
+ ->addData($responseAsArray['responseObject']);
824
+
825
+ Mage::log('pp1',NULL,'debgs.log');
826
+ $debugData['result'] = $result->getData();
827
+ $this->_debug($debugData);
828
+
829
+ return $result;
830
+ }
831
+
832
+ /**
833
+ * Retrieves customer login id for zooz api calls
834
+ *
835
+ * @param Mage_Payment_Model_Info $payment
836
+ * @return int
837
+ */
838
+ private function _getCustomerLoginId(Mage_Payment_Model_Info $payment)
839
+ {
840
+ $quoteId = $this->_getSession()->getQuote()->getId();
841
+ if($payment->getOrder() !== null) {
842
+ if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getSingleton('customer/session')->getCustomer()->getId();
843
+ return $payment->getOrder()->getCustomerId() ? $payment->getOrder()->getCustomerId() : $quoteId;
844
+ } else {
845
+ if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getSingleton('customer/session')->getCustomer()->getId();
846
+ return $quoteId;
847
+ }
848
+ }
849
+
850
+ public function assignData($data)
851
+ {
852
+ if (!($data instanceof Varien_Object)) {
853
+ $data = new Varien_Object($data);
854
+ }
855
+
856
+ parent::assignData($data);
857
+
858
+ $info = $this->getInfoInstance();
859
+ $info->setCcSavedCard($data->getCcSavedCard());
860
+ $info->setCcSavedCid($data->getCcSavedCid());
861
+ $info->setCcSaveData($data->getCcSaveData());
862
+
863
+ $info->setIsIframe($data->getIsIframe());
864
+ $info->setCcPaymentToken($data->getCcPaymentToken());
865
+
866
+ return $this;
867
+ }
868
+
869
+ /**
870
+ * @return bool
871
+ */
872
+ protected function _isSavingCardDataAllowed()
873
+ {
874
+ return Mage::getModel('payments/config')->isSavingCardDataAllowed();
875
+ }
876
+
877
+ protected function _getHelper()
878
+ {
879
+ return Mage::helper('payments');
880
+ }
881
+
882
+ protected function _getRequest()
883
+ {
884
+ return Mage::getModel('payments/payments_request');
885
+ }
886
+
887
+ /**
888
+ * Gateway response wrapper
889
+ *
890
+ * @param string $text
891
+ * @return string
892
+ */
893
+ protected function _wrapGatewayError($text)
894
+ {
895
+ return Mage::helper('payments')->__('Gateway error: %s', $text);
896
+ }
897
+
898
+ /**
899
+ * Retrieve session object
900
+ *
901
+ * @return Mage_Core_Model_Session_Abstract
902
+ */
903
+ protected function _getSession()
904
+ {
905
+ if (Mage::app()->getStore()->isAdmin()) {
906
+ return Mage::getSingleton('adminhtml/session_quote');
907
+ } else {
908
+ return Mage::getSingleton('checkout/session');
909
+ }
910
+ }
911
+
912
+ /**
913
+ * Retrieve logged customer info from session
914
+ *
915
+ * @return Mage_Core_Model_Abstract
916
+ */
917
+ protected function _getLoggedCustomer()
918
+ {
919
+ if (Mage::getSingleton('customer/session')->isLoggedIn()) {
920
+ return Mage::getSingleton('customer/session')->getCustomer();
921
+ }
922
+
923
+ return false;
924
+ }
925
+
926
+ /**
927
+ * Init cards storage model
928
+ *
929
+ * @param Mage_Payment_Model_Info $payment
930
+ */
931
+ protected function _initCardsStorage($payment)
932
+ {
933
+ $this->_cardsStorage = Mage::getModel('payments/payments_cards')->setPayment($payment);
934
+ }
935
+
936
+ /**
937
+ * Return cards storage model
938
+ *
939
+ * @param Mage_Payment_Model_Info $payment
940
+ * @return Zooz_Payments_Model_Payments_Cards
941
+ */
942
+ public function getCardsStorage($payment = null)
943
+ {
944
+ if (is_null($payment)) {
945
+ $payment = $this->getInfoInstance();
946
+ }
947
+ if (is_null($this->_cardsStorage)) {
948
+ $this->_initCardsStorage($payment);
949
+ }
950
+ return $this->_cardsStorage;
951
+ }
952
+
953
+ /**
954
+ * It sets card`s data into additional information of payment model
955
+ *
956
+ * @param Zooz_Payments_Model_Payments_Result $response
957
+ * @param Mage_Sales_Model_Order_Payment $payment
958
+ * @return Varien_Object
959
+ */
960
+ protected function _registerCard(Varien_Object $response, Mage_Sales_Model_Order_Payment $payment)
961
+ {
962
+ $cardsStorage = $this->getCardsStorage($payment);
963
+ $card = $cardsStorage->registerCard();
964
+ $card
965
+ ->setRequestedAmount($response->getRequestedAmount())
966
+ ->setBalanceOnCard($response->getBalanceOnCard())
967
+ ->setLastTransId($this->_paymentToken)
968
+ ->setProcessedAmount($payment->getAmount())
969
+ ->setCcType($payment->getCcType())
970
+ ->setCcOwner($payment->getCcOwner())
971
+ ->setCcLast4($payment->getCcLast4())
972
+ ->setCcExpMonth($payment->getCcExpMonth())
973
+ ->setCcExpYear($payment->getCcExpYear())
974
+ ->setCcSsIssue($payment->getCcSsIssue())
975
+ ->setCcSsStartMonth($payment->getCcSsStartMonth())
976
+ ->setCcSsStartYear($payment->getCcSsStartYear());
977
+
978
+ $cardsStorage->updateCard($card);
979
+ $this->_clearAssignedData($payment);
980
+ return $card;
981
+ }
982
+
983
+ /**
984
+ * Reset assigned data in payment info model
985
+ *
986
+ * @param Mage_Payment_Model_Info
987
+ * @return Zooz_Payments_Model_Payments
988
+ */
989
+ private function _clearAssignedData($payment)
990
+ {
991
+ $payment->setCcType(null)
992
+ ->setCcOwner(null)
993
+ ->setCcLast4(null)
994
+ ->setCcNumber(null)
995
+ ->setCcCid(null)
996
+ ->setCcExpMonth(null)
997
+ ->setCcExpYear(null)
998
+ ->setCcSsIssue(null)
999
+ ->setCcSsStartMonth(null)
1000
+ ->setCcSsStartYear(null)
1001
+ ;
1002
+ return $this;
1003
+ }
1004
+
1005
+ /**
1006
+ * Add payment transaction
1007
+ *
1008
+ * @param Mage_Sales_Model_Order_Payment $payment
1009
+ * @param string $transactionId
1010
+ * @param string $transactionType
1011
+ * @param array $transactionDetails
1012
+ * @param array $transactionAdditionalInfo
1013
+ * @return null|Mage_Sales_Model_Order_Payment_Transaction
1014
+ */
1015
+ protected function _addTransaction(Mage_Sales_Model_Order_Payment $payment, $transactionId, $transactionType,
1016
+ array $transactionDetails = array(), array $transactionAdditionalInfo = array(), $message = false
1017
+ ) {
1018
+ $payment->setTransactionId($transactionId);
1019
+ $payment->resetTransactionAdditionalInfo();
1020
+ foreach ($transactionDetails as $key => $value) {
1021
+ $payment->setData($key, $value);
1022
+ }
1023
+ foreach ($transactionAdditionalInfo as $key => $value) {
1024
+ $payment->setTransactionAdditionalInfo($key, $value);
1025
+ }
1026
+ $transaction = $payment->addTransaction($transactionType, null, false , $message);
1027
+ foreach ($transactionDetails as $key => $value) {
1028
+ $payment->unsetData($key);
1029
+ }
1030
+ $payment->unsLastTransId();
1031
+
1032
+ /**
1033
+ * It for self using
1034
+ */
1035
+ $transaction->setMessage($message);
1036
+
1037
+ return $transaction;
1038
+ }
1039
+
1040
+ /**
1041
+ * Mock capture transaction id in invoice
1042
+ *
1043
+ * @param Mage_Sales_Model_Order_Invoice $invoice
1044
+ * @param Mage_Sales_Model_Order_Payment $payment
1045
+ * @return Mage_Payment_Model_Method_Abstract
1046
+ */
1047
+ public function processInvoice($invoice, $payment)
1048
+ {
1049
+ $invoice->setTransactionId(1);
1050
+ return $this;
1051
+ }
1052
+
1053
+ /**
1054
+ * Set transaction ID into creditmemo for informational purposes
1055
+ * @param Mage_Sales_Model_Order_Creditmemo $creditmemo
1056
+ * @param Mage_Sales_Model_Order_Payment $payment
1057
+ * @return Mage_Payment_Model_Method_Abstract
1058
+ */
1059
+ public function processCreditmemo($creditmemo, $payment)
1060
+ {
1061
+ $creditmemo->setTransactionId(1);
1062
+ return $this;
1063
+ }
1064
+
1065
+ /**
1066
+ * Round up and cast specified amount to float or string
1067
+ *
1068
+ * @param string|float $amount
1069
+ * @param bool $asFloat
1070
+ * @return string|float
1071
+ */
1072
+ protected function _formatAmount($amount, $asFloat = false)
1073
+ {
1074
+ $amount = sprintf('%.2F', $amount); // "f" depends on locale, "F" doesn't
1075
+ return $asFloat ? (float)$amount : $amount;
1076
+ }
1077
+ }
app/code/community/Zooz/Payments/Model/Payments/Cards.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Model_Payments_Cards
10
+ {
11
+ const CARDS_NAMESPACE = 'zooz_cards';
12
+ const CARD_ID_KEY = 'id';
13
+ const CARD_PROCESSED_AMOUNT_KEY = 'processed_amount';
14
+ const CARD_CAPTURED_AMOUNT_KEY = 'captured_amount';
15
+ const CARD_REFUNDED_AMOUNT_KEY = 'refunded_amount';
16
+
17
+ /**
18
+ * Cards information
19
+ *
20
+ * @var mixed
21
+ */
22
+ protected $_cards = array();
23
+
24
+ /**
25
+ * Payment instance
26
+ *
27
+ * @var Mage_Payment_Model_Info
28
+ */
29
+ protected $_payment = null;
30
+
31
+ /**
32
+ * Set payment instance for storing credit card information and partial authorizations
33
+ *
34
+ * @param Mage_Payment_Model_Info $payment
35
+ * @return Zooz_Payments_Model_Payments_Cards
36
+ */
37
+ public function setPayment(Mage_Payment_Model_Info $payment)
38
+ {
39
+ $this->_payment = $payment;
40
+ $paymentCardsInformation = $this->_payment->getAdditionalInformation(self::CARDS_NAMESPACE);
41
+ if ($paymentCardsInformation) {
42
+ $this->_cards = $paymentCardsInformation;
43
+ }
44
+
45
+ return $this;
46
+ }
47
+
48
+ /**
49
+ * Add based on $cardInfo card to payment and return Id of new item
50
+ *
51
+ * @param mixed $cardInfo
52
+ * @return string
53
+ */
54
+ public function registerCard($cardInfo = array())
55
+ {
56
+ $this->_isPaymentValid();
57
+ $cardId = md5(microtime(1));
58
+ $cardInfo[self::CARD_ID_KEY] = $cardId;
59
+ $this->_cards[$cardId] = $cardInfo;
60
+ $this->_payment->setAdditionalInformation(self::CARDS_NAMESPACE, $this->_cards);
61
+ return $this->getCard($cardId);
62
+ }
63
+
64
+ /**
65
+ * Save data from card object in cards storage
66
+ *
67
+ * @param Varien_Object $card
68
+ * @return Zooz_Payments_Model_Payments_Cards
69
+ */
70
+ public function updateCard($card)
71
+ {
72
+ $cardId = $card->getData(self::CARD_ID_KEY);
73
+ if ($cardId && isset($this->_cards[$cardId])) {
74
+ $this->_cards[$cardId] = $card->getData();
75
+ $this->_payment->setAdditionalInformation(self::CARDS_NAMESPACE, $this->_cards);
76
+ }
77
+ return $this;
78
+ }
79
+
80
+ /**
81
+ * Retrieve card by ID
82
+ *
83
+ * @param string $cardId
84
+ * @return Varien_Object|bool
85
+ */
86
+ public function getCard($cardId)
87
+ {
88
+ if (isset($this->_cards[$cardId])) {
89
+ $card = new Varien_Object($this->_cards[$cardId]);
90
+ return $card;
91
+ }
92
+ return false;
93
+ }
94
+
95
+ /**
96
+ * Get all stored cards
97
+ *
98
+ * @return array
99
+ */
100
+ public function getCards()
101
+ {
102
+ $this->_isPaymentValid();
103
+ $_cards = array();
104
+ foreach(array_keys($this->_cards) as $key) {
105
+ $_cards[$key] = $this->getCard($key);
106
+ }
107
+ return $_cards;
108
+ }
109
+
110
+ /**
111
+ * Return count of saved cards
112
+ *
113
+ * @return int
114
+ */
115
+ public function getCardsCount()
116
+ {
117
+ $this->_isPaymentValid();
118
+ return count($this->_cards);
119
+ }
120
+
121
+ /**
122
+ * Return processed amount for all cards
123
+ *
124
+ * @return float
125
+ */
126
+ public function getProcessedAmount()
127
+ {
128
+ return $this->_getAmount(self::CARD_PROCESSED_AMOUNT_KEY);
129
+ }
130
+
131
+ /**
132
+ * Return captured amount for all cards
133
+ *
134
+ * @return float
135
+ */
136
+ public function getCapturedAmount()
137
+ {
138
+ return $this->_getAmount(self::CARD_CAPTURED_AMOUNT_KEY);
139
+ }
140
+
141
+ /**
142
+ * Return refunded amount for all cards
143
+ *
144
+ * @return float
145
+ */
146
+ public function getRefundedAmount()
147
+ {
148
+ return $this->_getAmount(self::CARD_REFUNDED_AMOUNT_KEY);
149
+ }
150
+
151
+ /**
152
+ * Remove all cards from payment instance
153
+ *
154
+ * @return Zooz_Payments_Model_Payments_Cards
155
+ */
156
+ public function flushCards()
157
+ {
158
+ $this->_cards = array();
159
+ $this->_payment->setAdditionalInformation(self::CARDS_NAMESPACE, null);
160
+ return $this;
161
+ }
162
+
163
+ /**
164
+ * Check for payment instace present
165
+ *
166
+ * @throws Exception
167
+ */
168
+ protected function _isPaymentValid()
169
+ {
170
+ if (!$this->_payment) {
171
+ throw new Exception('Payment instance is not set');
172
+ }
173
+ }
174
+ /**
175
+ * Return total for cards data fields
176
+ *
177
+ * $param string $key
178
+ * @return float
179
+ */
180
+ public function _getAmount($key)
181
+ {
182
+ $amount = 0;
183
+ foreach ($this->_cards as $card) {
184
+ if (isset($card[$key])) {
185
+ $amount += $card[$key];
186
+ }
187
+ }
188
+ return $amount;
189
+ }
190
+ }
app/code/community/Zooz/Payments/Model/Payments/Request.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+
10
+ class Zooz_Payments_Model_Payments_Request extends Varien_Object
11
+ {
12
+
13
+ }
app/code/community/Zooz/Payments/Model/Payments/Result.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_Model_Payments_Result extends Varien_Object
10
+ {
11
+
12
+ }
app/code/community/Zooz/Payments/Model/Payments/Source/Cctype.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * ZooZ Payments CC Types Source Model
11
+ *
12
+ * @category Zooz
13
+ * @package Zooz_Payment
14
+ */
15
+ class Zooz_Payments_Model_Payments_Source_Cctype extends Mage_Payment_Model_Source_Cctype
16
+ {
17
+ public function getAllowedTypes()
18
+ {
19
+ return array('VI', 'MC', 'AE', 'DI','DC','JCB', 'OT');
20
+ }
21
+
22
+ public function toOptionArray()
23
+ {
24
+ /**
25
+ * making filter by allowed cards
26
+ */
27
+ $allowed = $this->getAllowedTypes();
28
+ $options = array();
29
+
30
+ foreach (Mage::getSingleton('payments/config')->getCcTypes() as $code => $name) {
31
+
32
+ if (in_array($code, $allowed) || !count($allowed)) {
33
+ $options[] = array(
34
+ 'value' => $code,
35
+ 'label' => $name
36
+ );
37
+ }
38
+ }
39
+
40
+ return $options;
41
+ }
42
+ }
app/code/community/Zooz/Payments/Model/Payments/Source/PaymentAction.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Zooz Payments Action Dropdown source
11
+ */
12
+ class Zooz_Payments_Model_Payments_Source_PaymentAction
13
+ {
14
+ public function toOptionArray()
15
+ {
16
+ return array(
17
+ array(
18
+ 'value' => Zooz_Payments_Model_Payments::ACTION_AUTHORIZE,
19
+ 'label' => Mage::helper('payments')->__('Authorize Only')
20
+ ),
21
+ array(
22
+ 'value' => Zooz_Payments_Model_Payments::ACTION_AUTHORIZE_CAPTURE,
23
+ 'label' => Mage::helper('payments')->__('Authorize and Capture')
24
+ ),
25
+ );
26
+ }
27
+ }
app/code/community/Zooz/Payments/Model/Payments/Source/PaymentMode.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * ZooZ Payments Mode Dropdown source
11
+ */
12
+ class Zooz_Payments_Model_Payments_Source_PaymentMode
13
+ {
14
+ public function toOptionArray()
15
+ {
16
+ return array(
17
+ array(
18
+ 'value' => Zooz_Payments_Model_Payments::ACTION_MODE_SANDBOX,
19
+ 'label' => Mage::helper('payments')->__('Sandbox')
20
+ ),
21
+ array(
22
+ 'value' => Zooz_Payments_Model_Payments::ACTION_MODE_PRODUCTION,
23
+ 'label' => Mage::helper('payments')->__('Production')
24
+ ),
25
+ );
26
+ }
27
+ }
app/code/community/Zooz/Payments/Model/Resource/Payments.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */
9
+ class Zooz_Payments_Model_Resource_Payments extends Mage_Core_Model_Resource_Db_Abstract
10
+ {
11
+ /**
12
+ * Initialize resource model
13
+ *
14
+ * @return void
15
+ */
16
+ public function _construct()
17
+ {
18
+ $this->_init('debug/zooz', 'debug_id');
19
+ }
20
+ }
app/code/community/Zooz/Payments/Model/Resource/Payments/Collection.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */
9
+ class Zooz_Payments_Model_Resource_Payments_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
10
+ {
11
+ /**
12
+ * Initialize resource model
13
+ *
14
+ * @return void
15
+ */
16
+ protected function _construct()
17
+ {
18
+ $this->_init('debug/zooz');
19
+ }
20
+ }
app/code/community/Zooz/Payments/UnavailableException.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_UnavailableException extends Mage_Core_Exception
10
+ {
11
+
12
+ }
app/code/community/Zooz/Payments/controllers/Adminhtml/Zooz/PaymentController.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Zooz Payments Controller
11
+ *
12
+ * @category Zooz
13
+ * @package Zooz_Payments
14
+ */
15
+ class Zooz_Payments_Adminhtml_Zooz_PaymentController extends Mage_Adminhtml_Controller_Action
16
+ {
17
+
18
+ /**
19
+ * Cancel active partail authorizations
20
+ */
21
+ public function cancelAction()
22
+ {
23
+ $result['success'] = false;
24
+ try {
25
+ $paymentMethod = Mage::helper('payments')->getMethodInstance(Zooz_Payments_Model_Payments::METHOD_CODE);
26
+ if ($paymentMethod) {
27
+ $paymentMethod->setStore(Mage::getSingleton('adminhtml/session_quote')->getQuote()->getStoreId());
28
+ $paymentMethod->cancelPartialAuthorization(Mage::getSingleton('adminhtml/session_quote')->getQuote()->getPayment());
29
+ }
30
+
31
+ $result['success'] = true;
32
+ $result['update_html'] = $this->_getPaymentMethodsHtml();
33
+ } catch (Mage_Core_Exception $e) {
34
+ Mage::logException($e);
35
+ $result['error_message'] = $e->getMessage();
36
+ } catch (Exception $e) {
37
+ Mage::logException($e);
38
+ $result['error_message'] = $this->__('There was an error canceling transactions. Please contact us or try again later.');
39
+ }
40
+
41
+ Mage::getSingleton('adminhtml/session_quote')->getQuote()->getPayment()->save();
42
+ $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
43
+ }
44
+
45
+ /**
46
+ * Get payment method step html
47
+ *
48
+ * @return string
49
+ */
50
+ protected function _getPaymentMethodsHtml()
51
+ {
52
+ $layout = $this->getLayout();
53
+ $update = $layout->getUpdate();
54
+ $update->load('checkout_onepage_paymentmethod');
55
+ $layout->generateXml();
56
+ $layout->generateBlocks();
57
+ $output = $layout->getOutput();
58
+ return $output;
59
+ }
60
+
61
+ /**
62
+ * Check is allowed access to action
63
+ *
64
+ * @return bool
65
+ */
66
+ protected function _isAllowed()
67
+ {
68
+ return Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/review_payment');
69
+ }
70
+ }
app/code/community/Zooz/Payments/controllers/CustomerController.php ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Customer controller
11
+ */
12
+ class Zooz_Payments_CustomerController extends Mage_Core_Controller_Front_Action
13
+ {
14
+ const RESPONSE_CODE_SUCCESS = 0;
15
+ const RESPONSE_CODE_FAILURE = -1;
16
+
17
+ public function indexAction()
18
+ {
19
+ if (!$this->_getSession()->isLoggedIn()) {
20
+ $this->_redirect('customer/account/login');
21
+ return;
22
+ }
23
+
24
+ $this->loadLayout();
25
+ $this->renderLayout();
26
+ }
27
+
28
+ public function creditcardsAction() {
29
+ if (!$this->_getSession()->isLoggedIn()) {
30
+ $this->_redirect('customer/account/login');
31
+ return;
32
+ }
33
+
34
+ if ($this->getRequest()->isPost()) {
35
+ $data = $this->getRequest()->getParams();
36
+ if (isset($data)) {
37
+ $result = $this->_save($data);
38
+ switch ($result->getResponseCode()) {
39
+ case self::RESPONSE_CODE_SUCCESS:
40
+ Mage::getSingleton('core/session')->addSuccess('Credit card has been added.');
41
+ break;
42
+ case self::RESPONSE_CODE_FAILURE:
43
+ Mage::getSingleton('core/session')->addError('Credit card has not been saved. Please try again.');
44
+ break;
45
+ }
46
+
47
+ $this->_redirect('payments/customer/creditcards');
48
+ }
49
+ }
50
+
51
+ $this->loadLayout();
52
+ $this->_initLayoutMessages('customer/session');
53
+ $this->renderLayout();
54
+ }
55
+
56
+ public function deletecardAction()
57
+ {
58
+ $isValidToken = false;
59
+ $token = $this->getRequest()->getParam('t');
60
+ $customer = $this->_getCustomer();
61
+ $api = $this->_getApi();
62
+ $paymentMethods = $api->getPaymentMethods($customer->getId(), true);
63
+
64
+ foreach($paymentMethods as $key => $pm) {
65
+ if($pm->getData('paymentMethodToken') == $token) {
66
+ $isValidToken = true;
67
+ }
68
+ }
69
+
70
+ if($isValidToken) {
71
+ $this->_delete($customer->getId(), $token);
72
+ Mage::getSingleton('core/session')->addSuccess('Credit card has been deleted.');
73
+ $this->_redirect('payments/customer/creditcards');
74
+ } else {
75
+ Mage::getSingleton('core/session')->addError('Credit card token is not valid. Please try again.');
76
+ $this->_redirect('payments/customer/creditcards');
77
+ }
78
+ }
79
+
80
+ public function editcardAction()
81
+ {
82
+ $isValidToken = false;
83
+ $token = $this->getRequest()->getParam('t');
84
+ $customer = $this->_getCustomer();
85
+ $api = $this->_getApi();
86
+ $paymentMethods = $api->getPaymentMethods($customer->getId(), true);
87
+
88
+ foreach($paymentMethods as $key => $pm) {
89
+ if($pm->getData('paymentMethodToken') == $token) {
90
+ $isValidToken = true;
91
+ }
92
+ }
93
+
94
+ if($isValidToken) {
95
+
96
+ } else {
97
+ Mage::getSingleton('core/session')->addError('Credit card token is not valid. Please try again.');
98
+ $this->_redirect('payments/customer/creditcards');
99
+ }
100
+
101
+ $this->loadLayout();
102
+ $this->_initLayoutMessages('customer/session');
103
+ $this->renderLayout();
104
+ }
105
+
106
+ public function updateCustomerAddressAction() {
107
+ if(!Mage::app()->getRequest()->isAjax()){
108
+ $this->norouteAction();
109
+ exit;
110
+ }
111
+
112
+ $postData = $this->getRequest()->getPost();
113
+ parse_str($postData['form'], $billing);
114
+
115
+ $customer = $this->_getCustomer();
116
+
117
+ $address = new Varien_Object();
118
+ $address->addData(
119
+ array(
120
+ 'state' => $billing['state'],
121
+ 'city' => $billing['city'],
122
+ 'street' => $billing['street'],
123
+ 'zip_code' => $billing['zipcode'],
124
+ 'firstname' => $billing['firstname'],
125
+ 'lastname' => $billing['lastname'],
126
+ 'telephone' => $billing['telephone'],
127
+ 'phone_number' => $billing['telephone'],
128
+ 'country_code' => $billing['country_id'],
129
+ )
130
+ );
131
+
132
+ $response = Mage::getModel("payments/api")->updateBilling($customer->getId(), $address);
133
+ $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('token' => $response)));
134
+ }
135
+
136
+ protected function _save($data)
137
+ {
138
+ if(!isset($data['payment'])) return new Varien_Object(array("response_code" => 0));
139
+
140
+ $cardData = new Varien_Object();
141
+ $billingAddress = new Varien_Object();
142
+
143
+ $customer = $this->_getCustomer();
144
+ $customerData = Mage::getModel('customer/customer')->load($customer->getId())->getData();
145
+ $holderEmail = $customerData['email'];
146
+
147
+ $billingAddress->setFirstname($data['firstname'])
148
+ ->setLastname($data['lastname'])
149
+ ->setStreet($data['street'])
150
+ ->setCity($data['city'])
151
+ ->setState($data['state'])
152
+ ->setZipCode($data['zipcode'])
153
+ ->setCountryCode($data['country_id'])
154
+ ->setPhoneNumber($data['telephone']);
155
+
156
+ $cardData->setHolderEmail($holderEmail)
157
+ ->setCcExpMonth($data['payment']['cc_exp_month'])
158
+ ->setCcExpYear($data['payment']['cc_exp_year'])
159
+ ->setHolderFirstname($data['firstname'])
160
+ ->setHolderLastname($data['lastname'])
161
+ ->setCcNumber($data['payment']['cc_number'])
162
+ ->setCcCvv($data['payment']['cc_cid'])
163
+ ->setCcSaveData(true)
164
+ ->setBillingAddress($billingAddress);
165
+
166
+ $response = $this->_getApi()->addPaymentMethod($customer->getId(), $cardData);
167
+
168
+ return $response;
169
+ }
170
+
171
+ protected function _delete($cutomerLoginId, $paymentMethodToken)
172
+ {
173
+ $response = $this->_getApi()->removePaymentMethod($cutomerLoginId, $paymentMethodToken);
174
+ return $response;
175
+ }
176
+
177
+ protected function _getApi()
178
+ {
179
+ return Mage::getSingleton('payments/api');
180
+ }
181
+
182
+ /**
183
+ * Retrieve customer session model object
184
+ *
185
+ * @return Mage_Customer_Model_Session
186
+ */
187
+ protected function _getSession()
188
+ {
189
+ return Mage::getSingleton('customer/session');
190
+ }
191
+
192
+ protected function _getCustomer()
193
+ {
194
+ return Mage::getSingleton('customer/session');
195
+ }
196
+
197
+
198
+ }
app/code/community/Zooz/Payments/controllers/IpnController.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ /**
10
+ * Unified IPN controller for ZooZ Payments
11
+ */
12
+ class Zooz_Payments_IpnController extends Mage_Core_Controller_Front_Action
13
+ {
14
+ /**
15
+ * Instantiate IPN model and pass IPN request to it
16
+ */
17
+ public function indexAction()
18
+ {
19
+ if (!$this->getRequest()->isPost()) {
20
+ return;
21
+ }
22
+
23
+ try {
24
+ $data = json_decode(file_get_contents('php://input'), true);
25
+
26
+ if (!is_array($data) || empty($data)) {
27
+ throw new Exception('IPN request contains no data');
28
+ }
29
+
30
+ Mage::getModel('payments/ipn')->processIpnRequest($data);
31
+ } catch (Zooz_Payments_UnavailableException $e) {
32
+ Mage::logException($e);
33
+ $this->getResponse()->setHeader('HTTP/1.1','503 Service Unavailable')->sendResponse();
34
+ exit;
35
+ } catch (Exception $e) {
36
+ Mage::logException($e);
37
+ $this->getResponse()->setHttpResponseCode(500);
38
+ }
39
+ }
40
+ }
app/code/community/Zooz/Payments/controllers/PaymentController.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ class Zooz_Payments_PaymentController extends Mage_Core_Controller_Front_Action {
10
+
11
+ public function indexAction() {
12
+ $params = $this->getRequest()->getParams();
13
+ }
14
+
15
+ /**
16
+ * Cancel active partail authorizations
17
+ */
18
+ public function cancelAction()
19
+ {
20
+ $result['success'] = false;
21
+ try {
22
+ $paymentMethod = Mage::helper('payments')->getMethodInstance(Zooz_Payments_Model_Payments::METHOD_CODE);
23
+ if ($paymentMethod) {
24
+ $paymentMethod->cancelPartialAuthorization(Mage::getSingleton('checkout/session')->getQuote()->getPayment());
25
+ }
26
+ $result['success'] = true;
27
+ $result['update_html'] = $this->_getPaymentMethodsHtml();
28
+ } catch (Mage_Core_Exception $e) {
29
+ Mage::logException($e);
30
+ $result['error_message'] = $e->getMessage();
31
+ } catch (Exception $e) {
32
+ Mage::logException($e);
33
+ $result['error_message'] = $this->__('There was an error canceling transactions. Please contact us or try again later.');
34
+ }
35
+
36
+ Mage::getSingleton('checkout/session')->getQuote()->getPayment()->save();
37
+ $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
38
+ }
39
+
40
+ public function setpaymentmethodAction()
41
+ {
42
+ if (!$this->getRequest()->isPost()) {
43
+ return;
44
+ }
45
+
46
+ var_dump($this->getRequest()->getParams());
47
+ die;
48
+
49
+ try {
50
+ $data = json_decode($this->getRequest()->getParams());
51
+ print_r($data);
52
+ die;
53
+ } catch (Zooz_Payments_UnavailableException $e) {
54
+ Mage::logException($e);
55
+ $this->getResponse()->setHeader('HTTP/1.1','503 Service Unavailable')->sendResponse();
56
+ exit;
57
+ } catch (Exception $e) {
58
+ Mage::logException($e);
59
+ $this->getResponse()->setHttpResponseCode(500);
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Get payment method step html
65
+ *
66
+ * @return string
67
+ */
68
+ protected function _getPaymentMethodsHtml()
69
+ {
70
+ $layout = $this->getLayout();
71
+ $update = $layout->getUpdate();
72
+ $update->load('checkout_onepage_paymentmethod');
73
+ $layout->generateXml();
74
+ $layout->generateBlocks();
75
+ $output = $layout->getOutput();
76
+ return $output;
77
+ }
78
+ }
app/code/community/Zooz/Payments/etc/config.xml ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Zooz_Payments>
5
+ <version>3.0.0.1</version>
6
+ </Zooz_Payments>
7
+ </modules>
8
+
9
+ <global>
10
+ <fieldsets>
11
+ <sales_convert_quote_payment>
12
+ <cc_type>
13
+ <to_order_payment>*</to_order_payment>
14
+ </cc_type>
15
+ <cc_number>
16
+ <to_order_payment>*</to_order_payment>
17
+ </cc_number>
18
+ <cc_exp_month>
19
+ <to_order_payment>*</to_order_payment>
20
+ </cc_exp_month>
21
+ <cc_exp_year>
22
+ <to_order_payment>*</to_order_payment>
23
+ </cc_exp_year>
24
+ <cc_cid>
25
+ <to_order_payment>*</to_order_payment>
26
+ </cc_cid>
27
+ <cc_saved_card>
28
+ <to_order_payment>*</to_order_payment>
29
+ </cc_saved_card>
30
+ <cc_payment_token>
31
+ <to_order_payment>*</to_order_payment>
32
+ </cc_payment_token>
33
+ <is_iframe>
34
+ <to_order_payment>*</to_order_payment>
35
+ </is_iframe>
36
+ <cc_saved_cid>
37
+ <to_order_payment>*</to_order_payment>
38
+ </cc_saved_cid>
39
+ <cc_save_data>
40
+ <to_order_payment>*</to_order_payment>
41
+ </cc_save_data>
42
+ </sales_convert_quote_payment>
43
+ </fieldsets>
44
+
45
+ <helpers>
46
+ <payments>
47
+ <class>Zooz_Payments_Helper</class>
48
+ </payments>
49
+ </helpers>
50
+
51
+ <blocks>
52
+ <payments>
53
+ <class>Zooz_Payments_Block</class>
54
+ </payments>
55
+ </blocks>
56
+
57
+ <models>
58
+ <payments>
59
+ <class>Zooz_Payments_Model</class>
60
+ <resourceModel>payments_resource</resourceModel>
61
+ </payments>
62
+ <payments_resource>
63
+ <class>Zooz_Payments_Model_Resource</class>
64
+ <entities>
65
+ <debug>
66
+ <table>zooz</table>
67
+ </debug>
68
+ </entities>
69
+ </payments_resource>
70
+ </models>
71
+
72
+ <resources>
73
+ <payments_setup>
74
+ <setup>
75
+ <module>Zooz_Payments</module>
76
+ </setup>
77
+ <connection>
78
+ <use>core_setup</use>
79
+ </connection>
80
+ </payments_setup>
81
+ <payments_write>
82
+ <connection>
83
+ <use>core_write</use>
84
+ </connection>
85
+ </payments_write>
86
+ <payments_read>
87
+ <connection>
88
+ <use>core_read</use>
89
+ </connection>
90
+ </payments_read>
91
+ </resources>
92
+
93
+ <payments>
94
+ <cc>
95
+ <types>
96
+ <VI>
97
+ <code>VI</code>
98
+ <name>Visa</name>
99
+ <order>10</order>
100
+ </VI>
101
+ <MC>
102
+ <code>MC</code>
103
+ <name>MasterCard</name>
104
+ <order>20</order>
105
+ </MC>
106
+ <AE>
107
+ <code>AE</code>
108
+ <name>American Express</name>
109
+ <order>30</order>
110
+ </AE>
111
+ <DI>
112
+ <code>DI</code>
113
+ <name>Discover</name>
114
+ <order>40</order>
115
+ </DI>
116
+ <DC>
117
+ <code>DC</code>
118
+ <name>Diners</name>
119
+ <order>50</order>
120
+ </DC>
121
+ <JCB>
122
+ <code>JCB</code>
123
+ <name>JCB</name>
124
+ <order>60</order>
125
+ </JCB>
126
+ <OT>
127
+ <code>OT</code>
128
+ <name>Other</name>
129
+ <order>70</order>
130
+ </OT>
131
+ </types>
132
+ </cc>
133
+ </payments>
134
+ <events>
135
+ <sales_order_place_after>
136
+ <observers>
137
+ <zooz_order_save_before>
138
+ <type>singleton</type>
139
+ <class>payments/observer</class>
140
+ <method>handleSalesOrderSaveBefore</method>
141
+ </zooz_order_save_before>
142
+ </observers>
143
+ </sales_order_place_after>
144
+ </events>
145
+ </global>
146
+
147
+ <default>
148
+ <payment>
149
+ <payments>
150
+ <active>1</active>
151
+ <model>payments/payments</model>
152
+ <order_status>pending</order_status>
153
+ <title>ZooZ Payment</title>
154
+ <allowspecific>0</allowspecific>
155
+ <payment_action>authorize</payment_action>
156
+ <payment_mode>sandbox</payment_mode>
157
+ <useccv>1</useccv>
158
+ </payments>
159
+ </payment>
160
+ </default>
161
+
162
+ <frontend>
163
+ <routers>
164
+ <payments>
165
+ <use>standard</use>
166
+ <args>
167
+ <module>Zooz_Payments</module>
168
+ <frontName>payments</frontName>
169
+ </args>
170
+ </payments>
171
+ </routers>
172
+ <layout>
173
+ <updates>
174
+ <payments>
175
+ <file>payments.xml</file>
176
+ </payments>
177
+ </updates>
178
+ </layout>
179
+ </frontend>
180
+ </config>
app/code/community/Zooz/Payments/etc/system.xml ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * ZooZ Payment Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payment
8
+ */
9
+ -->
10
+ <config>
11
+ <sections>
12
+ <payment>
13
+ <groups>
14
+ <payments translate="label" module="payments">
15
+ <label>Zooz Payments</label>
16
+ <frontend_type>text</frontend_type>
17
+ <sort_order>35</sort_order>
18
+ <show_in_default>1</show_in_default>
19
+ <show_in_website>1</show_in_website>
20
+ <show_in_store>1</show_in_store>
21
+ <fields>
22
+ <active translate="label">
23
+ <label>Enabled</label>
24
+ <frontend_type>select</frontend_type>
25
+ <source_model>adminhtml/system_config_source_yesno</source_model>
26
+ <sort_order>1</sort_order>
27
+ <show_in_default>1</show_in_default>
28
+ <show_in_website>1</show_in_website>
29
+ <show_in_store>1</show_in_store>
30
+ </active>
31
+ <title translate="label">
32
+ <label>Title</label>
33
+ <frontend_type>text</frontend_type>
34
+ <sort_order>5</sort_order>
35
+ <show_in_default>1</show_in_default>
36
+ <show_in_website>1</show_in_website>
37
+ <show_in_store>1</show_in_store>
38
+ </title>
39
+ <payment_action translate="label">
40
+ <label>Payment Action</label>
41
+ <frontend_type>select</frontend_type>
42
+ <source_model>payments/payments_source_paymentAction</source_model>
43
+ <sort_order>10</sort_order>
44
+ <show_in_default>1</show_in_default>
45
+ <show_in_website>1</show_in_website>
46
+ <show_in_store>1</show_in_store>
47
+ </payment_action>
48
+ <payment_mode translate="label">
49
+ <label>Payment Mode</label>
50
+ <frontend_type>select</frontend_type>
51
+ <source_model>payments/payments_source_paymentMode</source_model>
52
+ <sort_order>15</sort_order>
53
+ <show_in_default>1</show_in_default>
54
+ <show_in_website>1</show_in_website>
55
+ <show_in_store>0</show_in_store>
56
+ </payment_mode>
57
+ <program_id translate="label">
58
+ <label>Program ID</label>
59
+ <comment>The Program ID, as registered in the Zooz Developer Portal.</comment>
60
+ <frontend_type>text</frontend_type>
61
+ <sort_order>17</sort_order>
62
+ <show_in_default>1</show_in_default>
63
+ <show_in_website>1</show_in_website>
64
+ <show_in_store>1</show_in_store>
65
+ </program_id>
66
+ <program_key translate="label">
67
+ <label>Program Key</label>
68
+ <comment>The Program Key, as generated upon app / site registration.</comment>
69
+ <frontend_type>obscure</frontend_type>
70
+ <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
71
+ <sort_order>18</sort_order>
72
+ <show_in_default>1</show_in_default>
73
+ <show_in_website>1</show_in_website>
74
+ <show_in_store>1</show_in_store>
75
+ </program_key>
76
+ <order_status translate="label">
77
+ <label>New Order Status</label>
78
+ <comment>Status once order is complete</comment>
79
+ <frontend_type>select</frontend_type>
80
+ <source_model>adminhtml/system_config_source_order_status_processing</source_model>
81
+ <sort_order>20</sort_order>
82
+ <show_in_default>1</show_in_default>
83
+ <show_in_website>1</show_in_website>
84
+ <show_in_store>0</show_in_store>
85
+ </order_status>
86
+ <iframe_for_pci translate="label">
87
+ <label>Iframe for PCI compliance</label>
88
+ <frontend_type>select</frontend_type>
89
+ <source_model>adminhtml/system_config_source_yesno</source_model>
90
+ <sort_order>23</sort_order>
91
+ <show_in_default>1</show_in_default>
92
+ <show_in_website>1</show_in_website>
93
+ <show_in_store>0</show_in_store>
94
+ </iframe_for_pci>
95
+ <cctypes translate="label">
96
+ <label>Credit Card Types</label>
97
+ <frontend_type>multiselect</frontend_type>
98
+ <source_model>payments/payments_source_cctype</source_model>
99
+ <sort_order>25</sort_order>
100
+ <show_in_default>1</show_in_default>
101
+ <show_in_website>1</show_in_website>
102
+ <show_in_store>0</show_in_store>
103
+ </cctypes>
104
+ <min_order_total translate="label">
105
+ <label>Minimum Order Total</label>
106
+ <frontend_type>text</frontend_type>
107
+ <sort_order>35</sort_order>
108
+ <show_in_default>1</show_in_default>
109
+ <show_in_website>1</show_in_website>
110
+ <show_in_store>0</show_in_store>
111
+ </min_order_total>
112
+ <max_order_total translate="label">
113
+ <label>Maximum Order Total</label>
114
+ <frontend_type>text</frontend_type>
115
+ <sort_order>40</sort_order>
116
+ <show_in_default>1</show_in_default>
117
+ <show_in_website>1</show_in_website>
118
+ <show_in_store>0</show_in_store>
119
+ </max_order_total>
120
+ <sort_order translate="label">
121
+ <label>Sort Order</label>
122
+ <frontend_type>text</frontend_type>
123
+ <sort_order>45</sort_order>
124
+ <show_in_default>1</show_in_default>
125
+ <show_in_website>1</show_in_website>
126
+ <show_in_store>0</show_in_store>
127
+ </sort_order>
128
+ <save_cart_data_allowed translate="label">
129
+ <label>Allow customers to save credit card data for future use</label>
130
+ <frontend_type>select</frontend_type>
131
+ <source_model>adminhtml/system_config_source_yesno</source_model>
132
+ <sort_order>47</sort_order>
133
+ <show_in_default>1</show_in_default>
134
+ <show_in_website>1</show_in_website>
135
+ <show_in_store>0</show_in_store>
136
+ </save_cart_data_allowed>
137
+ <allowspecific translate="label">
138
+ <label>Payment from applicable countries</label>
139
+ <frontend_type>allowspecific</frontend_type>
140
+ <source_model>adminhtml/system_config_source_payment_allspecificcountries</source_model>
141
+ <show_in_default>1</show_in_default>
142
+ <show_in_website>1</show_in_website>
143
+ <show_in_store>1</show_in_store>
144
+ <sort_order>55</sort_order>
145
+ </allowspecific>
146
+ <specificcountry translate="label">
147
+ <label>Payment from Specific countries</label>
148
+ <frontend_type>multiselect</frontend_type>
149
+ <source_model>adminhtml/system_config_source_country</source_model>
150
+ <show_in_default>1</show_in_default>
151
+ <show_in_website>1</show_in_website>
152
+ <show_in_store>1</show_in_store>
153
+ <sort_order>60</sort_order>
154
+ </specificcountry>
155
+ <model>
156
+ </model>
157
+ </fields>
158
+ </payments>
159
+ </groups>
160
+ </payment>
161
+ </sections>
162
+ </config>
app/code/community/Zooz/Payments/sql/payments_setup/install-1.0.0.0.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ $installer = $this;
10
+ $installer->startSetup();
11
+ $installer->run("
12
+ ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
13
+ ADD `zooz_credit_card_number` INT( 32 ) NOT NULL,
14
+ ADD `zooz_credit_card_name` VARCHAR( 255 ) NOT NULL;
15
+
16
+ ALTER TABLE `{$installer->getTable('sales/order_payment')}`
17
+ ADD `zooz_credit_card_number` INT( 32 ) NOT NULL,
18
+ ADD `zooz_credit_card_name` VARCHAR( 255 ) NOT NULL;
19
+ ");
20
+ $installer->endSetup();
app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.0-1.0.0.1.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ $installer = $this;
10
+
11
+ $installer->startSetup();
12
+ $installer->run("
13
+ DROP TABLE IF EXISTS `{$this->getTable('zooz')}`;
14
+ CREATE TABLE `{$this->getTable('zooz')}` (
15
+ `debug_id` int(11) NOT NULL AUTO_INCREMENT,
16
+ `zooz_response` text NULL,
17
+ PRIMARY KEY (`debug_id`)
18
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
19
+
20
+ ");
21
+
22
+ $installer->endSetup();
app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.1-1.0.0.2.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ $installer = $this;
10
+
11
+ $installer->startSetup();
12
+ $installer->run("
13
+ DROP TABLE IF EXISTS `{$this->getTable('zooz')}`;
14
+ CREATE TABLE `{$this->getTable('zooz')}` (
15
+ `debug_id` int(11) NOT NULL AUTO_INCREMENT,
16
+ `adyen_response` text NULL,
17
+ PRIMARY KEY (`debug_id`)
18
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
19
+
20
+ ");
21
+
22
+ $installer->endSetup();
app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.2-1.0.0.3.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ $installer = $this;
10
+ $installer->startSetup();
11
+ $installer->run("
12
+ ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
13
+ ADD `zooz_credit_card_type` VARCHAR( 32 ) NOT NULL,
14
+ ADD `zooz_credit_card_exp_month` INT( 2 ) NOT NULL,
15
+ ADD `zooz_credit_card_exp_year` INT( 2 ) NOT NULL;
16
+
17
+ ALTER TABLE `{$installer->getTable('sales/order_payment')}`
18
+ ADD `zooz_credit_card_type` VARCHAR( 32 ) NOT NULL,
19
+ ADD `zooz_credit_card_exp_month` INT( 2 ) NOT NULL,
20
+ ADD `zooz_credit_card_exp_year` INT( 2 ) NOT NULL;
21
+ ");
22
+ $installer->endSetup();
app/code/community/Zooz/Payments/sql/payments_setup/upgrade-1.0.0.3-1.0.0.4.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+
9
+ $installer = $this;
10
+ $installer->startSetup();
11
+ $installer->run("
12
+ ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
13
+ ADD `zooz_credit_card_cid` INT( 3 ) NOT NULL;
14
+
15
+ ALTER TABLE `{$installer->getTable('sales/order_payment')}`
16
+ ADD `zooz_credit_card_cid` INT( 3 ) NOT NULL;
17
+ ");
18
+ $installer->endSetup();
app/design/adminhtml/default/default/template/zoozpayments/form/payments.phtml ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+ ?>
9
+ <?php $_formMessage=$this->getPartialAuthorizationFormMessage(); ?>
10
+ <?php $_isPartialAuthorization=$this->isPartialAuthorization(); ?>
11
+ <?php if ($_isPartialAuthorization || $_formMessage): ?>
12
+ <div class="form-list" id="payment_form_<?php echo $this->getMethodCode() ?>_before" style="display:none;">
13
+ <?php if ($_formMessage): ?>
14
+ <?php echo $this->showNoticeMessage($_formMessage) ?>
15
+ <?php endif;?>
16
+
17
+ <?php if ($_isPartialAuthorization): ?>
18
+ <?php echo $this->getChildHtml('cards') ?>
19
+ <div class="release-amounts">
20
+ <?php echo $this->getCancelButtonHtml()?>
21
+ <p class="note"><?php echo $this->__('To cancel pending authorizations and release amounts that have already been processed during this payment, click Cancel.') ?></p>
22
+ </div>
23
+ <?php echo $this->showNoticeMessage($this->__('Please enter another credit card number to complete your purchase.')) ?>
24
+ <script type="text/javascript">
25
+ //<![CDATA[
26
+ function cancelPaymentAuthorizations(){
27
+ new Ajax.Request('<?php echo $this->getAdminCancelUrl() ?>', {
28
+ onSuccess : function(transport) {
29
+ try{
30
+ response = eval('(' + transport.responseText + ')');
31
+ } catch (e) {
32
+ response = {};
33
+ }
34
+
35
+ if (response.success) {
36
+ order.loadArea(['billing_method','totals'], true, []);
37
+ } else {
38
+ var msg = response.error_message;
39
+ if (msg) {
40
+ alert(msg);
41
+ }
42
+ }
43
+ }
44
+ });
45
+ }
46
+ <?php if ($_message = $this->getPartialAuthorizationConfirmationMessage()): ?>
47
+ if (!confirm('<?php echo Mage::helper('core')->jsQuoteEscape($_message) ?>')) {
48
+ cancelPaymentAuthorizations();
49
+ }
50
+ <?php endif;?>
51
+ //]]>
52
+ </script>
53
+ <?php endif;?>
54
+ </div>
55
+ <?php endif;?>
56
+ <?php echo $this->getChildHtml('method_form_block') ?>
app/design/adminhtml/default/default/template/zoozpayments/info/payments.phtml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+ ?>
9
+
10
+ <div class="cards-list">
11
+
12
+ <?php if (!$this->getHideTitle()): ?>
13
+ <div class="bold"><?php echo $this->escapeHtml($this->getMethod()->getTitle()) ?></div>
14
+ <?php endif;?>
15
+
16
+ <?php
17
+ $cards = $this->getCards();
18
+ $showCount = count($cards) > 1;
19
+ ?>
20
+
21
+ <?php foreach ($cards as $key => $card): ?>
22
+ <?php if ($showCount): ?>
23
+ <span><?php echo sprintf($this->__('Credit Card %s'), $key + 1); ?></span>
24
+ <?php endif;?>
25
+
26
+ <table class="info-table<?php if ($showCount):?> offset<?php endif;?>">
27
+ <tbody>
28
+ <?php foreach ($card as $_label => $_value):?>
29
+ <tr>
30
+ <td><?php echo $this->escapeHtml($_label)?>:</td>
31
+ <td><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n"))?></td>
32
+ </tr>
33
+ <?php endforeach; ?>
34
+ </tbody>
35
+ </table>
36
+ <?php endforeach; ?>
37
+
38
+ </div>
app/design/adminhtml/default/default/template/zoozpayments/info/pdf.phtml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+ ?>
9
+
10
+ <?php
11
+ $cards = $this->getCards();
12
+ $showCount = count($cards) > 1;
13
+ ?>
14
+
15
+ <?php echo $this->escapeHtml($this->getMethod()->getTitle()) ?>{{pdf_row_separator}}
16
+ <?php foreach ($cards as $key => $card): ?>
17
+ <?php if ($showCount): ?>
18
+ <?php echo sprintf($this->__('Credit Card %s'), $key + 1); ?>
19
+ {{pdf_row_separator}}
20
+ <?php endif;?>
21
+
22
+ <?php foreach ($card as $_label => $_value):?>
23
+ <?php echo $_label ?>: <?php echo implode($this->getValueAsArray($_value), ' ')?>{{pdf_row_separator}}
24
+ <?php endforeach; ?>
25
+ <?php endforeach; ?>
app/design/frontend/base/default/layout/payments.xml ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */
9
+
10
+ -->
11
+ <layout version="0.1.0">
12
+ <checkout_onepage_index>
13
+ <reference name="head">
14
+ <action method="addCss"><stylesheet>css/zoozpayments/zoozpayments.css</stylesheet></action>
15
+ <action method="addJs"><file>zoozpayments/jquery.creditCardValidator.js</file></action>
16
+ </reference>
17
+ <reference name="checkout.onepage.payment">
18
+ <action method="setTemplate"><template>zoozpayments/checkout/onepage/payment.phtml</template></action>
19
+ <block type="payments/form_payments" name="zooz.payments" />
20
+ </reference>
21
+ </checkout_onepage_index>
22
+
23
+ <customer_account>
24
+ <reference name="head">
25
+ <action method="addCss"><stylesheet>css/zoozpayments/zoozpayments.css</stylesheet></action>
26
+ <action method="addJs"><file>zoozpayments/jquery.creditCardValidator.js</file></action>
27
+ </reference>
28
+ <reference name="customer_account_navigation">
29
+ <action method="addLink">
30
+ <name>creditcards</name>
31
+ <path>payments/customer/creditcards</path>
32
+ <label>Credit Cards</label>
33
+ </action>
34
+ </reference>
35
+ </customer_account>
36
+
37
+ <payments_customer_creditcards>
38
+ <update handle="customer_account"/>
39
+ <reference name="my.account.wrapper">
40
+ <block type="payments/customer_creditcard" name="customer_credit_cards" template="zoozpayments/customer/creditcard/list.phtml">
41
+ <block type="payments/form_payments" name="customer_iframe_card" template="zoozpayments/customer/creditcard/iframe.phtml" />
42
+ </block>
43
+ <block type="customer/account_dashboard" name="customer.account.link.back" template="customer/account/link/back.phtml" /> <!-- add a back link -->
44
+ </reference>
45
+ </payments_customer_creditcards>
46
+
47
+ <payments_customer_editcard>
48
+ <update handle="customer_account"/>
49
+ <reference name="my.account.wrapper">
50
+ <block type="payments/customer_creditcard" name="customer_credit_cards" template="zoozpayments/customer/creditcard/edit.phtml"/>
51
+ </reference>
52
+ </payments_customer_editcard>
53
+ </layout>
app/design/frontend/base/default/template/zoozpayments/.DS_Store ADDED
Binary file
app/design/frontend/base/default/template/zoozpayments/checkout/.DS_Store ADDED
Binary file
app/design/frontend/base/default/template/zoozpayments/checkout/onepage/payment.phtml ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package rwd_default
23
+ * @copyright Copyright (c) 2006-2016 X.commerce, Inc. and affiliates (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ $zoozPaymentsBlock = $this->getChild('zooz.payments');
27
+
28
+ $quote = Mage::getModel('checkout/session')->getQuote();
29
+ $quoteData = $quote->getData();
30
+ $payment = $quote->getPayment();
31
+ $grandTotal = $quoteData['grand_total'];
32
+ $paymentToken = $zoozPaymentsBlock->getPaymentToken($payment, $grandTotal);
33
+ $uniqueId = $zoozPaymentsBlock->getUniqueId();
34
+ $isSandbox = $zoozPaymentsBlock->isSandbox();
35
+ $_savedCards = $zoozPaymentsBlock->getSavedCards();
36
+ $isSavingCardDataAllowed = $zoozPaymentsBlock->isSavingCardDataAllowed();
37
+ ?>
38
+ <script type="text/javascript">
39
+ //<![CDATA[
40
+ var quoteBaseGrandTotal = <?php echo (float) $this->getQuoteBaseGrandTotal(); ?>;
41
+ var checkQuoteBaseGrandTotal = quoteBaseGrandTotal;
42
+ var payment = new Payment('co-payment-form', '<?php echo $this->getUrl('checkout/onepage/savePayment') ?>');
43
+ var lastPrice;
44
+ //]]>
45
+ </script>
46
+ <form action="" id="co-payment-form">
47
+ <div class="fieldset">
48
+ <?php echo $this->getChildChildHtml('methods_additional', '', true, true) ?>
49
+ <?php echo $this->getChildHtml('methods') ?>
50
+ </div>
51
+ </form>
52
+ <div class="tool-tip" id="payment-tool-tip" style="display:none;">
53
+ <div class="btn-close"><a href="#" id="payment-tool-tip-close" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Close')) ?>"><?php echo $this->__('Close') ?></a></div>
54
+ <div class="tool-tip-content"><img src="<?php echo $this->getSkinUrl('images/cvv.gif') ?>" alt="<?php echo Mage::helper('core')->quoteEscape($this->__('Card Verification Number Visual Reference')) ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Card Verification Number Visual Reference')) ?>" /></div>
55
+ </div>
56
+ <?php echo $this->getChildChildHtml('additional') ?>
57
+ <div class="buttons-set" id="payment-buttons-container">
58
+ <?php // Moved to CC form ?>
59
+ <?php /* <p class="required"><?php echo $this->__('* Required Fields') ?></p> */ ?>
60
+ <p class="back-link"><a href="#" onclick="checkout.back();
61
+ return false;"><small>&laquo; </small><?php echo $this->__('Back') ?></a></p>
62
+ <?php if ($zoozPaymentsBlock && $zoozPaymentsBlock->isPciIframeEnabled() && !($isSavingCardDataAllowed && count($_savedCards))): ?>
63
+ <button type="button" class="button" onclick="zoozIframeSubmit()"><span><span><?php echo $this->__('Continue') ?></span></span></button>
64
+ <?php else: ?>
65
+ <button type="button" class="button" onclick="payment.save()"><span><span><?php echo $this->__('Continue') ?></span></span></button>
66
+ <?php endif; ?>
67
+ <span class="please-wait" id="payment-please-wait" style="display:none;">
68
+ <img src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif') ?>" alt="<?php echo Mage::helper('core')->quoteEscape($this->__('Loading next step...')) ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Loading next step...')) ?>" class="v-middle" /> <?php echo $this->__('Loading next step...') ?>
69
+ </span>
70
+ </div>
71
+ <script type="text/javascript">
72
+ //<![CDATA[
73
+ function toggleToolTip(event) {
74
+ if ($('payment-tool-tip')) {
75
+ $('payment-tool-tip').setStyle({
76
+ top: (Event.pointerY(event) - 560) + 'px'//,
77
+ //left: (Event.pointerX(event)+100)+'px'
78
+ })
79
+ $('payment-tool-tip').toggle();
80
+ }
81
+ Event.stop(event);
82
+ }
83
+ if ($('payment-tool-tip-close')) {
84
+ Event.observe($('payment-tool-tip-close'), 'click', toggleToolTip);
85
+ }
86
+
87
+ function zoozIframeSubmit() {
88
+ iframeWin = document.getElementById("zooziframe").contentWindow;
89
+
90
+ var paymentToken = jQuery("#payments_cc_payment_token").val();
91
+ var customerEmail = jQuery("#payments_cc_customer_email").val();
92
+ var customerName = jQuery("#payments_cc_customer_name").val();
93
+
94
+ var dataToSend = {
95
+ action: "submit",
96
+ email: customerEmail,
97
+ customerToken: paymentToken,
98
+ name: customerName,
99
+ uniqueId: '<?php echo $uniqueId; ?>',
100
+ isSandbox: <?php echo $isSandbox; ?>
101
+ };
102
+
103
+ var paymentOrigin = "https://paymentpages.zooz.com";
104
+ // var paymentOrigin = "http://zoozm1.dev/";
105
+
106
+ /*
107
+ * make sure that the browsers you target all supoort sending an object in postMessage. Otherwise serialize the object as string using
108
+ JSON. tringify and consume it after deserialization
109
+ */
110
+ iframeWin.postMessage(dataToSend, paymentOrigin);
111
+ }
112
+
113
+ window.addEventListener("message", handleMessage, false);
114
+
115
+ function handleMessage(event) {
116
+ var paymentOrigin = "https://paymentpages.zooz.com";
117
+ // var paymentOrigin = "http://zoozm1.dev/";
118
+ if (!(event.origin === paymentOrigin)) {
119
+ return false;
120
+ }
121
+
122
+ var response = event.data;
123
+
124
+ var zoozData = {};
125
+ zoozData.cardData = {};
126
+
127
+ if (response.action == "formFields") {
128
+ console.log('Response recieved for checkFormData ')
129
+ } else if (response.action == "add") {
130
+ if(response.success == false){
131
+ var code= response.responseError.split(":");
132
+ console.log(getErrorMessage(code[0]));
133
+ if(getErrorMessage(code[0])){
134
+ alert(getErrorMessage(code[0]));
135
+ }
136
+ else{
137
+ alert(code[1]);
138
+ }
139
+ exit;
140
+ }else{
141
+ jQuery('#payments_cc_saved_card').attr('value', response.paymentMethodToken);
142
+ payment.save();
143
+
144
+ }
145
+
146
+ // zoozData.paymentMethodToken = response.paymentMethodToken;
147
+ // zoozData.paymentMethodStatus = response.paymentMethodStatus;
148
+ // zoozData.cardData.maskedCCNumber = response.maskedCCNumber;
149
+ // zoozData.cardData.month = response.month;
150
+ // zoozData.cardData.year = response.year;
151
+ //
152
+ // var zoozJsonData = JSON.stringify(zoozData);
153
+ //
154
+ // console.log(zoozJsonData);
155
+ //
156
+ // event.preventDefault();
157
+ //
158
+ // var request = jQuery.ajax({
159
+ // url: event.origin+"/payments/payment/setpaymentmethod/",
160
+ // method: "POST",
161
+ // dataType: "json",
162
+ // data: zoozJsonData
163
+ // });
164
+ //
165
+ // request.done(function( msg ) {
166
+ // console.log(msg);
167
+ // });
168
+ //
169
+ // request.fail(function( jqXHR, textStatus ) {
170
+ // console.log("Request failed: " + textStatus);
171
+ // });
172
+
173
+
174
+ return true;
175
+ }
176
+
177
+ return false;
178
+ }
179
+ function getErrorMessage(code){
180
+ var type1= new Array ("393729","393730","393731","393732","393733","393734","393735","393736","393737","393744","393745","393746","393747","393749","393750","393751","393752","393760","393764","393769","393776","393986","393987","393988");
181
+ var message;
182
+ if(type1.indexOf(code)>0){
183
+ switch(code) {
184
+ case "393730":
185
+ message = "Sorry, cannot process transaction. Your card's CVV number is incorrect." ;
186
+ break;
187
+ case "393731":
188
+ message = "Sorry, cannot complete transaction. You typed an invalid card number." ;
189
+ break;
190
+ case "393732":
191
+ message = "It seems your card has expired. Please verify your details or use other payment source." ;
192
+ break;
193
+ default:
194
+ message = "The transaction cannot be completed at this time - your card was declined. Please try a different card." ;
195
+ }
196
+ return message;
197
+ } else return false;
198
+ }
199
+
200
+ //]]>
201
+ </script>
202
+ <script type="text/javascript">
203
+ //<![CDATA[
204
+ payment.currentMethod = "<?php echo $this->getChild('methods')->getSelectedMethodCode() ?>";
205
+ //]]>
206
+ </script>
app/design/frontend/base/default/template/zoozpayments/customer/creditcard/edit.phtml ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+ ?>
9
+ <?php
10
+ /**
11
+ * Edit customer credit card entry template
12
+ *
13
+ * @see Mage_Customer_Block_Creditcard_Edit
14
+ */
15
+ $cardDetails = $this->getCreditCardDetails();
16
+ ?>
17
+ <div class="page-title">
18
+ <h1><?php echo $this->__('Edit Credit Card'); ?></h1>
19
+ </div>
20
+ <?php echo $this->getMessagesBlock()->toHtml() ?>
21
+ <div class="col1-set creditcard-edit">
22
+ <div class="col-1 creditcard-form">
23
+ <p class="required"><?php echo $this->__('* Required Fields') ?></p>
24
+ <form action="" method="post" id="form-validate">
25
+ <div class="section">
26
+ <h3><?php echo $this->__('Cardholder Information'); ?></h3>
27
+ <ul class="form-list">
28
+ <li class="fields">
29
+ <div class="field name-firstname">
30
+ <label for="firstname" class="required"><em>*</em><?php echo $this->__('First Name') ?></label>
31
+ <div class="input-box">
32
+ <input type="text" id="firstname" name="firstname" value="<?php echo isset($cardDetails['billingAddress']['firstName']) ? $this->escapeHtml($cardDetails['billingAddress']['firstName']) : ''; ?>" title="<?php echo $this->__('First Name') ?>" maxlength="255" class="input-text required-entry" />
33
+ </div>
34
+ </div>
35
+ <div class="field name-lastname">
36
+ <label for="lastname" class="required"><em>*</em><?php echo $this->__('Last Name') ?></label>
37
+ <div class="input-box">
38
+ <input type="text" id="lastname" name="lastname" value="<?php echo isset($cardDetails['billingAddress']['lastName']) ? $this->escapeHtml($cardDetails['billingAddress']['lastName']) : ''; ?>" title="<?php echo $this->__('Last Name') ?>" maxlength="255" class="input-text required-entry" />
39
+ </div>
40
+ </div>
41
+ </li>
42
+ <li class="fields">
43
+ <div class="field">
44
+ <label for="street" class="required"><em>*</em><?php echo $this->__('Street Address') ?></label>
45
+ <div class="input-box">
46
+ <input type="text" id="street" name="street" value="<?php echo isset($cardDetails['billingAddress']['address1']) ? $this->escapeHtml($cardDetails['billingAddress']['address1']) : ''; ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Street Address')) ?>" class="input-text required-entry" />
47
+ </div>
48
+ </div>
49
+ <div class="field">
50
+ <label for="city" class="required"><em>*</em><?php echo $this->__('City') ?></label>
51
+ <div class="input-box">
52
+ <input type="text" id="city" name="city" value="<?php echo isset($cardDetails['billingAddress']['city']) ? $this->escapeHtml($cardDetails['billingAddress']['city']) : ''; ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('City')) ?>" class="input-text required-entry" />
53
+ </div>
54
+ </div>
55
+ <div class="field">
56
+ <label for="state" class="required"><em>*</em><?php echo $this->__('State/Province') ?></label>
57
+ <div class="input-box">
58
+ <input type="text" id="state" name="state" value="<?php echo isset($cardDetails['billingAddress']['state']) ? $this->escapeHtml($cardDetails['billingAddress']['state']) : ''; ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('State/Province')) ?>" class="input-text required-entry" />
59
+ </div>
60
+ </div>
61
+ </li>
62
+ <li class="fields">
63
+ <div class="zipcode">
64
+ <label for="zipcode" class="required"><em>*</em><?php echo $this->__('Zip/Postal Code') ?></label>
65
+ <div class="input-box">
66
+ <input type="text" id="zipcode" name="zipcode" value="<?php echo isset($cardDetails['billingAddress']['zipCode']) ? $this->escapeHtml($cardDetails['billingAddress']['zipCode']) : ''; ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Zip/Postal Code')) ?>" class="input-text required-entry" />
67
+ </div>
68
+ </div>
69
+ <div class="field">
70
+ <label for="country" class="required"><em>*</em><?php echo $this->__('Country') ?></label>
71
+ <div class="input-box">
72
+ <?php echo $this->getCountryHtmlSelect() ?>
73
+ </div>
74
+ </div>
75
+ </li>
76
+ <li class="fields">
77
+ <div class="field">
78
+ <label for="telephone" class="required"><em>*</em><?php echo $this->__('Telephone') ?></label>
79
+ <div class="input-box">
80
+ <input type="text" name="telephone" value="<?php echo isset($cardDetails['billingAddress']['phone']['phoneNumber']) ? $this->escapeHtml($cardDetails['billingAddress']['phone']['phoneNumber']) : ''; ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Telephone')) ?>" class="input-text required-entry" id="telephone" />
81
+ </div>
82
+ </div>
83
+ </li>
84
+ </ul>
85
+ </div>
86
+ <div class="section">
87
+ <h3><?php echo $this->__('Credit Card Information'); ?></h3>
88
+ <ul class="form-list">
89
+ <li class="fields">
90
+ <div class="field">
91
+ <label for="cc_type" class="required"><em>*</em><?php echo $this->__('Credit Card Type') ?></label>
92
+ <div class="input-box">
93
+ <select id="cc_type" name="payment[cc_type]" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Credit Card Type')) ?>" class="required-entry validate-cc-type-select">
94
+ <option value=""><?php echo $this->__('--Please Select--') ?></option>
95
+ <?php foreach ($this->getCcTypes() as $_typeCode => $_typeName): ?>
96
+ <option value="<?php echo $_typeCode ?>"<?php echo strtoupper($cardDetails['subtype']) == trim(strtoupper($_typeName)) ? ' selected="selected"' : ''; ?>><?php echo $_typeName ?></option>
97
+ <?php endforeach ?>
98
+ </select>
99
+ </div>
100
+ </div>
101
+ <div class="field">
102
+ <label for="cc_number" class="required"><em>*</em><?php echo $this->__('Credit Card Number') ?></label>
103
+ <div class="input-box">
104
+ <input type="text" class="input-text required validate-cc-number" title="<?php echo $this->__('Credit Card number') ?>" id="cc_number" name="payment[cc_number]" value="<?php echo 'XXXX-' . $this->escapeHtml($cardDetails['lastFourDigits']); ?>" />
105
+ </div>
106
+ </div>
107
+ </li>
108
+ <li>
109
+ <label for="expiration" class="required"><em>*</em><?php echo $this->__('Expiration Date') ?></label>
110
+ <div class="input-box">
111
+ <div class="v-fix">
112
+ <select id="expiration" name="payment[cc_exp_month]" class="month validate-cc-exp required-entry">
113
+ <?php foreach ($this->getCcMonths() as $k => $v): ?>
114
+ <option value="<?php echo $k ? $k : '' ?>"<?php echo $cardDetails['expirationMonth'] == $v ? ' selected="selected"' : ''; ?>><?php echo $v ?></option>
115
+ <?php endforeach ?>
116
+ </select>
117
+ </div>
118
+ <div class="v-fix">
119
+ <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
120
+ <select id="expiration_yr" name="payment[cc_exp_year]" class="year required-entry">
121
+ <?php foreach ($this->getCcYears() as $k => $v): ?>
122
+ <option value="<?php echo $k ? $k : '' ?>"<?php echo $cardDetails['expirationYear'] == $v ? ' selected="selected"' : ''; ?>><?php echo $v ?></option>
123
+ <?php endforeach ?>
124
+ </select>
125
+ </div>
126
+ </div>
127
+ </li>
128
+ <li id="cc_type_cvv_div">
129
+ <label for="cc_cid" class=""><em>*</em><?php echo $this->__('Card Verification Number') ?></label>
130
+ <div class="input-box">
131
+ <div class="v-fix">
132
+ <input type="text" title="<?php echo Mage::helper('core')->jsQuoteEscape($this->__('Card Verification Number')) ?>" class="input-text cvv required-entry" id="cc_cid" name="payment[cc_cid]" value="" />
133
+ </div>
134
+ </div>
135
+ </li>
136
+ </ul>
137
+ </div>
138
+ <div class="buttons-set">
139
+ <p class="back-link"><a href="/payments/customer/creditcards"><small>&laquo; </small><?php echo $this->__('Back') ?></a></p>
140
+ <button data-action="save-customer-address" type="submit" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Save Address')) ?>" class="button"><span><span><?php echo $this->__('Save Credit Card') ?></span></span></button>
141
+ </div>
142
+
143
+ </form>
144
+
145
+ </div>
146
+ </div>
147
+ <script type="text/javascript">
148
+ //<![CDATA[
149
+ var dataForm = new VarienForm('form-validate', true);
150
+ //]]>
151
+ </script>
app/design/frontend/base/default/template/zoozpayments/customer/creditcard/iframe.phtml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php /* @var $this Zooz_Payments_Block_Form_Payments */ ?>
2
+ <?php
3
+ $quote = Mage::getModel('checkout/session')->getQuote();
4
+ $quoteData = $quote->getData();
5
+ $payment = $quote->getPayment();
6
+ $grandTotal = $quoteData['grand_total'];
7
+ $paymentToken = $this->getPaymentToken($payment, $grandTotal);
8
+ $_savedCards = $this->getSavedCards();
9
+ $_canSave = $this->getData("isSavingCardDataAllowed");
10
+ if (Mage::getSingleton('customer/session')->isLoggedIn() && count($_savedCards)) $savedC=true;
11
+ else $savedC=false;
12
+ ?>
13
+ <div id="payment_form_<?php echo $this->getCode(); ?>" class="form-list">
14
+ <iframe id="zooziframe" width="400" height="<?php echo $_canSave ? 280 : 220; ?>px" frameborder="0" scrolling="no"
15
+ src="<?php echo Mage::helper("payments")->getCustomerIframeUrl(); ?>?cards=<?php echo $this->getData("ccAvailableTypes"); ?>"></iframe>
16
+ </div>
app/design/frontend/base/default/template/zoozpayments/customer/creditcard/list.phtml ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $uniqueId = Mage::getModel("payments/config")->getProgramId();
3
+ $isSandbox = Mage::getModel("payments/config")->isSandbox();
4
+ ?>
5
+ <div class="credit-cards">
6
+ <div class="page-title">
7
+ <h1><?php echo $this->__('My Payment Data') ?></h1>
8
+ </div>
9
+ <?php echo $this->getMessagesBlock()->toHtml() ?>
10
+ <div class="col2-set creditcard-list">
11
+ <div class="col-1 creditcard-saved">
12
+ <h2><?php echo $this->__('Saved Credit Cards') ?></h2>
13
+ <ol>
14
+ <?php if($_pMethods = $this->getPaymentMethods()) : ?>
15
+ <?php foreach($_pMethods as $key => $method) : ?>
16
+ <?php $data = $method->getData(); ?>
17
+ <li class="item">
18
+ <div class="title">
19
+ <h3><?php echo $this->__('Card: XXXX-') . $data['lastFourDigits']; ?></h3>
20
+ <div class="exp-date">
21
+ <?php $expMonth = $data['expirationMonth'] < 10 ? '0' . $data['expirationMonth'] : $data['expirationMonth']; ?>
22
+ <?php echo $expMonth . '/' . $data['expirationYear']; ?>
23
+ </div>
24
+ </div>
25
+ <div class="card-details">
26
+ <?php echo $data['subtype']; ?><br />
27
+ <?php echo $data['cardHolderName']; ?><br />
28
+ <?php if(isset($data['billingAddress'])) : ?>
29
+ <?php echo $data['billingAddress']['address1']; ?><br />
30
+ <?php echo (isset($data['billingAddress']['address2']) && !empty($data['billingAddress']['address2'])) ? $data['billingAddress']['address2'] . '<br />' : ''; ?>
31
+ <?php echo $data['billingAddress']['city'] . ', ' . (isset($data['billingAddress']['state']) ? $data['billingAddress']['state'] : "") . ', ' . $data['billingAddress']['zipCode']; ?><br />
32
+ <?php echo $data['billingAddress']['country']; ?><br />
33
+ <?php if(isset($data['billingAddress']['phone']['countryCode'])) : ?>
34
+ <?php echo 'T: +(' . $data['billingAddress']['phone']['countryCode'] . ') ' . $data['billingAddress']['phone']['phoneNumber']; ?>
35
+ <?php endif; ?>
36
+ <?php endif; ?>
37
+ </div>
38
+ <div class="button-set">
39
+ <!--<p><a href="/payments/customer/editcard/t/<?php echo $data['paymentMethodToken']; ?>">Edit</a></p>-->
40
+ <p><a href="/payments/customer/deletecard/t/<?php echo $data['paymentMethodToken']; ?>" onclick="return deleteCreditCard('<?php echo $data['paymentMethodToken']; ?>');">Delete</a></p>
41
+ </div>
42
+ </li>
43
+ <?php endforeach; ?>
44
+ <?php else: ?>
45
+ <li class="item no-entries">
46
+ <?php echo $this->__('You have no credit cards added to your account.') ?>
47
+ </li>
48
+ <?php endif ?>
49
+ </ol>
50
+ </div>
51
+ <div class="col-2 creditcard-new">
52
+ <h2><?php echo $this->__('Add New Credit Card') ?></h2>
53
+ <form action="" method="post" id="form-validate-add-new">
54
+ <input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>">
55
+ <div class="section">
56
+ <h3><?php echo $this->__('Cardholder Information'); ?></h3>
57
+ <ul class="form-list">
58
+ <li class="fields">
59
+ <div class="field name-firstname">
60
+ <label for="firstname" class="required"><em>*</em><?php echo $this->__('First Name') ?></label>
61
+ <div class="input-box">
62
+ <input type="text" id="firstname" name="firstname" value="" title="<?php echo $this->__('First Name') ?>" maxlength="255" class="input-text required-entry" />
63
+ </div>
64
+ </div>
65
+ <div class="field name-lastname">
66
+ <label for="lastname" class="required"><em>*</em><?php echo $this->__('Last Name') ?></label>
67
+ <div class="input-box">
68
+ <input type="text" id="lastname" name="lastname" value="" title="<?php echo $this->__('Last Name') ?>" maxlength="255" class="input-text required-entry" />
69
+ </div>
70
+ </div>
71
+ </li>
72
+ <li class="fields">
73
+ <div class="field">
74
+ <label for="street" class="required"><em>*</em><?php echo $this->__('Street Address') ?></label>
75
+ <div class="input-box">
76
+ <input type="text" id="street" name="street" value="" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Street Address')) ?>" class="input-text required-entry" />
77
+ </div>
78
+ </div>
79
+ <div class="field">
80
+ <label for="city" class="required"><em>*</em><?php echo $this->__('City') ?></label>
81
+ <div class="input-box">
82
+ <input type="text" id="city" name="city" value="" title="<?php echo Mage::helper('core')->quoteEscape($this->__('City')) ?>" class="input-text required-entry" />
83
+ </div>
84
+ </div>
85
+ <div class="field">
86
+ <label for="state" class="required"><em>*</em><?php echo $this->__('State/Province') ?></label>
87
+ <div class="input-box">
88
+ <input type="text" id="state" name="state" value="" title="<?php echo Mage::helper('core')->quoteEscape($this->__('State/Province')) ?>" class="input-text required-entry" />
89
+ </div>
90
+ </div>
91
+ </li>
92
+ <li class="fields">
93
+ <div class="zipcode">
94
+ <label for="zipcode" class="required"><em>*</em><?php echo $this->__('Zip/Postal Code') ?></label>
95
+ <div class="input-box">
96
+ <input type="text" id="zipcode" name="zipcode" value="" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Zip/Postal Code')) ?>" class="input-text required-entry" />
97
+ </div>
98
+ </div>
99
+ <div class="field">
100
+ <label for="country" class="required"><em>*</em><?php echo $this->__('Country') ?></label>
101
+ <div class="input-box">
102
+ <?php echo $this->getCountryHtmlSelect() ?>
103
+ </div>
104
+ </div>
105
+ </li>
106
+ <li class="fields">
107
+ <div class="field">
108
+ <label for="telephone" class="required"><em>*</em><?php echo $this->__('Telephone') ?></label>
109
+ <div class="input-box">
110
+ <input type="text" name="telephone" value="" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Telephone')) ?>" class="input-text required-entry" id="telephone" />
111
+ </div>
112
+ </div>
113
+ </li>
114
+ </ul>
115
+ </div>
116
+ <?php if(!Mage::helper("payments")->canSaveCc()) : ?>
117
+ <div class="section">
118
+ <h3><?php echo $this->__('Credit Card Information'); ?></h3>
119
+ <ul class="form-list">
120
+ <li class="fields">
121
+ <div class="field">
122
+ <label for="cc_type" class="required"><em>*</em><?php echo $this->__('Credit Card Type') ?></label>
123
+ <div class="input-box">
124
+ <select id="cc_type" name="payment[cc_type]" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Credit Card Type')) ?>" class="required-entry">
125
+ <option value=""><?php echo $this->__('--Please Select--') ?></option>
126
+ <?php foreach ($this->getCcTypes() as $_typeCode => $_typeName): ?>
127
+ <option value="<?php echo $_typeCode ?>"><?php echo $_typeName ?></option>
128
+ <?php endforeach ?>
129
+ </select>
130
+ </div>
131
+ </div>
132
+ <div class="field">
133
+ <label for="cc_number" class=""><em>*</em><?php echo $this->__('Credit Card Number') ?></label>
134
+ <div class="input-box">
135
+ <input type="text" class="input-text required-entry validate-cc-number" title="<?php echo $this->__('Credit Card number') ?>" id="cc_number" name="payment[cc_number]" autocomplete="off" value="" />
136
+ </div>
137
+ </div>
138
+ </li>
139
+ <li class="fields">
140
+ <div class="field">
141
+ <label for="expiration" class="required"><em>*</em><?php echo $this->__('Expiration Date') ?></label>
142
+ <div class="input-box">
143
+ <div class="v-fix">
144
+ <select id="expiration" name="payment[cc_exp_month]" class="month required-entry">
145
+ <?php foreach ($this->getCcMonths() as $k => $v): ?>
146
+ <option value="<?php echo $k ? $k : '' ?>"><?php echo $v ?></option>
147
+ <?php endforeach ?>
148
+ </select>
149
+ </div>
150
+ <div class="v-fix">
151
+ <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
152
+ <select id="expiration_yr" name="payment[cc_exp_year]" class="year required-entry">
153
+ <?php foreach ($this->getCcYears() as $k => $v): ?>
154
+ <option value="<?php echo $k ? $k : '' ?>"><?php echo $v ?></option>
155
+ <?php endforeach ?>
156
+ </select>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </li>
161
+ <li class="fields">
162
+ <div class="field">
163
+ <label for="cc_cid"><em>*</em><?php echo $this->__('Card Verification Number') ?></label>
164
+ <div class="input-box">
165
+ <input type="text" class="input-text cvv" title="<?php echo $this->__('Card Verification Number') ?>" id="cc_cid" name="payment[cc_cid]" autocomplete="off" value="" />
166
+ </div>
167
+ </div>
168
+ </li>
169
+ </ul>
170
+ </div>
171
+ <?php else : ?>
172
+ <div class="section">
173
+
174
+ <h3><?php echo $this->__('Credit Card Information') ?></h3>
175
+ <?php echo $this->getChild("customer_iframe_card")
176
+ ->setData('ccAvailableTypes', $this->getCcAvailableTypesByConfig())
177
+ ->setData('isSavingCardDataAllowed', true)
178
+ ->toHtml(); ?>
179
+ </div>
180
+ <?php endif; ?>
181
+ <div class="buttons-set">
182
+ <button data-action="save-customer-credit-card" type="submit" onclick="<?php echo Mage::helper("payments")->canSaveCc() ? 'validate(event);' : '' ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Save Credit Card')) ?>" class="button"><span><span><?php echo $this->__('Save') ?></span></span></button>
183
+ </div>
184
+ </form>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ <script type="text/javascript">
189
+
190
+ var dataForm = new VarienForm('form-validate-add-new', true);
191
+ function deleteCreditCard(token) {
192
+ if(confirm('<?php echo Mage::helper('core')->jsQuoteEscape($this->__('Are you sure you want to delete this credit card?')) ?>')) {
193
+ window.location='<?php echo $this->getUrl("payments/customer/deletecard/") ?>t/'+token;
194
+ }
195
+ return false;
196
+ }
197
+
198
+ function validate(event) {
199
+ event.preventDefault();
200
+ if (dataForm.validator.validate()) {
201
+ zoozIframeSubmit();
202
+
203
+ }
204
+ return;
205
+ }
206
+
207
+ function zoozIframeSubmit() {
208
+ new Ajax.Request("<?php echo $this->getUrl("payments/customer/updateCustomerAddress/") ?>",
209
+ {
210
+ method:'post',
211
+ parameters : {
212
+ form : $("form-validate-add-new").serialize(),
213
+ },
214
+ onSuccess: function(transport) {
215
+ var response = JSON.parse(transport.responseText);
216
+
217
+ iframeWin = document.getElementById("zooziframe").contentWindow;
218
+ var dataToSend = {
219
+ uniqueId: '<?php echo $uniqueId; ?>',
220
+ customerEmail: '<?php echo Mage::getModel('customer/session')->getCustomer()->getEmail(); ?>',
221
+ formData: $("form-validate-add-new").serialize(true),
222
+ isSandbox: <?php echo $isSandbox; ?>,
223
+ token: response.token
224
+ };
225
+
226
+ var paymentOrigin = "https://paymentpages.zooz.com";
227
+
228
+ iframeWin.postMessage(dataToSend, paymentOrigin);
229
+ },
230
+ onFailure: function() { alert('Something went wrong...'); }
231
+ });
232
+ }
233
+ window.addEventListener("message", handleMessage, false);
234
+
235
+ function handleMessage(event) {
236
+ var data = event.data;
237
+ if(data.action == "addCard" && data.success) {
238
+ $("form-validate-add-new").submit();
239
+ }
240
+ }
241
+
242
+ </script>
app/design/frontend/base/default/template/zoozpayments/form/payments.phtml ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* @var $this Zooz_Payments_Block_Form_Payments */
3
+ $_code = $this->getMethodCode();
4
+ $_savedCards = $this->getSavedCards();
5
+ $_ccType = $this->getInfoData('cc_type');
6
+ $_ccNumber = $this->htmlEscape($this->getInfoData('cc_number'));
7
+ $_ccExpMonth = $this->getInfoData('cc_exp_month');
8
+ $_ccExpYear = $this->getInfoData('cc_exp_year');
9
+ $_isLoggedIn = Mage::getSingleton('customer/session')->isLoggedIn();
10
+ $newCardForm = $this->getLayout()->createBlock("payments/form_payments")
11
+ ->setData('code', $_code)
12
+ ->setData('savedCards', $_savedCards)
13
+ ->setData('ccType', $_ccType)
14
+ ->setData('ccAvailableTypes', $this->getCcAvailableTypes())
15
+ ->setData('ccNumber', $_ccNumber)
16
+ ->setData('ccExpMonth', $_ccExpMonth)
17
+ ->setData('ccExpYear', $_ccExpYear)
18
+ ->setTemplate("zoozpayments/form/payments/new.phtml")->toHtml();
19
+ $savedCardsForm = $this->getLayout()->createBlock("payments/form_payments")
20
+ ->setData('code', $_code)
21
+ ->setData('savedCards', $_savedCards)
22
+ ->setTemplate("zoozpayments/form/payments/saved.phtml")->toHtml();
23
+
24
+ $iframeForm = $this->getLayout()
25
+ ->createBlock('payments/form_payments')
26
+ ->setCode($_code)
27
+ ->setData('ccAvailableTypes', $this->getCcAvailableTypes())
28
+ ->setData('isSavingCardDataAllowed', $this->isSavingCardDataAllowed())
29
+ ->setTemplate('zoozpayments/form/payments/iframe.phtml');
30
+ ?>
31
+ <?php if ($this->isPciIframeEnabled()): ?>
32
+ <ul class="form-list" id="payment_form_<?php echo $_code; ?>" style="display:none;">
33
+ <?php if ($this->isSavingCardDataAllowed() && count($_savedCards)): ?>
34
+ <ul class="cc-saved-form">
35
+ <?php echo $savedCardsForm; ?>
36
+ </ul>
37
+ <ul class="cc-new-form">
38
+ <?php echo $iframeForm->toHtml(); ?>
39
+ </ul>
40
+ <li id="cc-use-different"><?php echo $this->__('Or'); ?>, <a class="cc-current-saved"
41
+ href="#"><?php echo $this->__('use a different card'); ?></a>
42
+ </li>
43
+ <?php else: ?>
44
+ <?php echo $iframeForm->toHtml(); ?>
45
+ <?php endif; ?>
46
+ </ul>
47
+ <?php else: ?>
48
+ <ul class="form-list" id="payment_form_<?php echo $_code; ?>" style="display:none;">
49
+ <li>
50
+ <p class="required">* Required Fields</p>
51
+ </li>
52
+ <?php if ($this->isSavingCardDataAllowed() && count($_savedCards)): ?>
53
+ <ul class="cc-saved-form">
54
+ <?php echo $savedCardsForm; ?>
55
+ </ul>
56
+ <ul class="cc-new-form">
57
+ <?php echo $newCardForm; ?>
58
+ </ul>
59
+ <li id="cc-use-different"><?php echo $this->__('Or'); ?>, <a class="cc-current-saved"
60
+ href="#"><?php echo $this->__('use a different card'); ?></a>
61
+ </li>
62
+ <?php else: ?>
63
+ <?php echo $newCardForm; ?>
64
+ <?php endif; ?>
65
+ </ul>
66
+ <div>
67
+ <?php echo $this->getMethod()->getConfigData('message'); ?>
68
+ </div>
69
+ <?php endif; ?>
70
+ <script type="text/javascript">
71
+ jQuery(document).ready(function () {
72
+ jQuery('input#p_method_payments').click(function () {
73
+ if (jQuery('ul.cc-new-form').length) {
74
+ var cName = jQuery('#cc-use-different a').attr('class');
75
+ switchCcForm(cName, 'outside');
76
+ }
77
+ });
78
+
79
+ jQuery('#cc-use-different a').click(function () {
80
+ var cName = this.className;
81
+ switchCcForm(cName, 'inside');
82
+ return false;
83
+ });
84
+
85
+ function switchCcForm(cName, position) {
86
+
87
+ if (position == 'outside') {
88
+ cName = 'cc-current-new';
89
+ }
90
+
91
+ switch (cName) {
92
+ case 'cc-current-saved':
93
+ jQuery('ul.cc-saved-form').hide();
94
+ jQuery('ul.cc-saved-form input').attr('disabled', 'disabled');
95
+ jQuery('ul.cc-saved-form select').attr('disabled', 'disabled');
96
+
97
+ jQuery('ul.cc-new-form input').removeAttr('disabled');
98
+ jQuery('ul.cc-new-form select').removeAttr('disabled');
99
+ jQuery('ul.cc-new-form').show();
100
+ jQuery('div#payment_form_payments').show();
101
+
102
+ jQuery('#cc-use-different a').html('<?php echo $this->__('use saved card'); ?>');
103
+ jQuery('#cc-use-different a').attr('class', 'cc-current-new');
104
+
105
+ if(jQuery("#zooziframe").length) {
106
+ jQuery("#payment-buttons-container button").attr("onclick", "zoozIframeSubmit();");
107
+ }
108
+
109
+ break;
110
+ case 'cc-current-new':
111
+ jQuery('ul.cc-new-form').hide();
112
+ jQuery('ul.cc-new-form input').attr('disabled', 'disabled');
113
+ jQuery('ul.cc-new-form select').attr('disabled', 'disabled');
114
+
115
+ jQuery('ul.cc-saved-form input').removeAttr('disabled');
116
+ jQuery('ul.cc-saved-form select').removeAttr('disabled');
117
+ jQuery('ul.cc-saved-form').show();
118
+
119
+ jQuery('#cc-use-different a').html('<?php echo $this->__('use a different card'); ?>');
120
+ jQuery('#cc-use-different a').attr('class', 'cc-current-saved');
121
+
122
+ if(jQuery("#zooziframe").length) {
123
+ jQuery("#payment-buttons-container button").attr("onclick", "payment.save();");
124
+ }
125
+
126
+ break;
127
+ default:
128
+ break;
129
+ }
130
+
131
+ return false;
132
+ }
133
+ });
134
+ </script>
app/design/frontend/base/default/template/zoozpayments/form/payments/data.phtml ADDED
@@ -0,0 +1 @@
 
1
+ <?php $this->getPaymentToken(); ?>
app/design/frontend/base/default/template/zoozpayments/form/payments/iframe.phtml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php /* @var $this Zooz_Payments_Block_Form_Payments */ ?>
2
+ <?php
3
+ $quote = Mage::getModel('checkout/session')->getQuote();
4
+ $quoteData = $quote->getData();
5
+ $payment = $quote->getPayment();
6
+ $grandTotal = $quoteData['grand_total'];
7
+ $paymentToken = $this->getPaymentToken($payment, $grandTotal);
8
+ $_savedCards = $this->getSavedCards();
9
+ $_canSave = $this->getData("isSavingCardDataAllowed");
10
+ if (Mage::getSingleton('customer/session')->isLoggedIn() && count($_savedCards)) $savedC=true;
11
+ else $savedC=false;
12
+ ?>
13
+ <div id="payment_form_<?php echo $this->getCode(); ?>" <?php echo $savedC?'style="display:none;"':''?> class="form-list">
14
+ <iframe id="zooziframe" width="400" height="<?php echo $_canSave ? 280 : 220; ?>px" frameborder="0" scrolling="no"
15
+ src="<?php echo $this->getIframeUrl(); ?>?cards=<?php echo implode(",", array_keys($this->getData("ccAvailableTypes"))); ?>&save=<?php echo (int) $_canSave; ?>"></iframe>
16
+ <li>
17
+ <input type="hidden" id="<?php echo $this->getCode(); ?>_is_iframe" name="payment[is_iframe]" value="1" />
18
+ <input type="hidden" id="<?php echo $this->getCode(); ?>_cc_payment_token" name="payment[cc_payment_token]" value="<?php echo $paymentToken; ?>" />
19
+ <input type="hidden" id="<?php echo $this->getCode(); ?>_cc_saved_card" name="payment[cc_saved_card]" value="" />
20
+ <input type="hidden" id="<?php echo $this->getCode(); ?>_cc_customer_email" name="payment[cc_customer_email]" value="<?php echo $quote->getCustomerEmail(); ?>" />
21
+ <input type="hidden" id="<?php echo $this->getCode(); ?>_cc_customer_name" name="payment[cc_customer_name]" value="<?php echo $quote->getCustomerFirstname() . ' ' . $quote->getCustomerLastname(); ?>" />
22
+ </li>
23
+ </div>
app/design/frontend/base/default/template/zoozpayments/form/payments/new.phtml ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $_code = $this->getData('code');
3
+ $_savedCards = $this->getData('savedCards');
4
+ $_ccType = $this->getData('cc_type');
5
+ $_ccAvailableTypes = $this->getData('ccAvailableTypes');
6
+ $_ccNumber = $this->getData('ccNumber');
7
+
8
+ $_ccExpMonth = $this->getData('ccExpMonth');
9
+ $_ccExpYear = $this->getData('ccExpYear');
10
+ ?>
11
+
12
+ <li>
13
+ <label for="<?php echo $_code ?>_cc_type" class="required"><em>*</em><?php echo $this->__('Credit Card Number') ?></label>
14
+ <div class="credit-card-types">
15
+ <ul id="icons-card-types">
16
+ <?php foreach ($_ccAvailableTypes as $_typeCode => $_typeName): ?>
17
+ <li class="card-type card-type-<?php echo $_typeCode; ?>">
18
+ <?php echo $_typeName; ?>
19
+ </li>
20
+ <?php endforeach ?>
21
+ </ul>
22
+ <input type="hidden" name="payment[cc_type]" value="<?php echo $_ccType; ?>" id="<?php echo $_code ?>_cc_type" />
23
+ </div>
24
+ </li>
25
+ <li>
26
+ <div class="input-box">
27
+ <input type="text" class="input-text required validate-cc-number" title="<?php echo $this->__('Credit Card number') ?>" id="<?php echo $_code; ?>_cc_number" name="payment[cc_number]" autocomplete="off" value="<?php echo $_ccNumber; ?>" />
28
+ </div>
29
+ </li>
30
+ <li>
31
+ <label for="<?php echo $_code; ?>_expiration" class="required"><em>*</em><?php echo $this->__('Expiration Date') ?></label>
32
+ <div class="input-box">
33
+ <div class="v-fix">
34
+ <select id="<?php echo $_code ?>_expiration" name="payment[cc_exp_month]" class="month validate-cc-exp required-entry">
35
+ <?php foreach ($this->getCcMonths() as $k => $v): ?>
36
+ <option value="<?php echo $k ? $k : '' ?>"<?php if ($k == $_ccExpMonth): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
37
+ <?php endforeach ?>
38
+ </select>
39
+ </div>
40
+ <div class="v-fix">
41
+ <select id="<?php echo $_code ?>_expiration_yr" name="payment[cc_exp_year]" class="year required-entry">
42
+ <?php foreach ($this->getCcYears() as $k => $v): ?>
43
+ <option value="<?php echo $k ? $k : '' ?>"<?php if ($k == $_ccExpYear): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
44
+ <?php endforeach ?>
45
+ </select>
46
+ </div>
47
+ </div>
48
+ </li>
49
+ <li id="<?php echo $_code ?>_cc_type_cvv_div">
50
+ <label for="<?php echo $_code ?>_cc_cid" class=""><em>*</em><?php echo $this->__('Card Verification Number') ?></label>
51
+ <div class="input-box">
52
+ <div class="v-fix">
53
+ <input type="text" title="<?php echo Mage::helper('core')->jsQuoteEscape($this->__('Card Verification Number')) ?>" class="input-text cvv required-entry" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" value="" />
54
+ </div>
55
+ <a href="#" class="cvv-what-is-this"><?php echo $this->__('What is this?') ?></a>
56
+ </div>
57
+ </li>
58
+ <?php if ($this->isSavingCardDataAllowed()): ?>
59
+ <li id="<?php echo $_code ?>_cc_save_data">
60
+ <div class="input-box">
61
+ <div class="v-fix">
62
+ <input type="checkbox" title="<?php echo Mage::helper('core')->jsQuoteEscape($this->__('Save this payment method for future use')) ?>" id="<?php echo $_code ?>_cc_save_data" name="payment[cc_save_data]" value="1" />
63
+ <label for="<?php echo $_code ?>_cc_save_data"><?php echo $this->__('Save this payment method for future use') ?></label>
64
+ </div>
65
+ </div>
66
+ </li>
67
+ <?php endif; ?>
68
+
69
+ <script type="text/javascript">
70
+ jQuery(document).ready(function() {
71
+ jQuery('#payments_cc_number').validateCreditCard(function (result) {
72
+ if (result.card_type != null) {
73
+ var cardClass = 'card-type-' + result.card_type.name;
74
+ if(result.card_type.name=="diners_club_carte_blanche" || result.card_type.name=="diners_club_international") var cardClass = 'card-type-DC';
75
+
76
+ jQuery('#icons-card-types li').removeClass(function (index, css) {
77
+ return (css.match(/(^|\s)active-card-type-\S+/g) || []).join(' ');
78
+ });
79
+ jQuery('.' + cardClass).addClass('active-' + cardClass);
80
+
81
+ jQuery('input#payments_cc_type').attr("value", result.card_type.name);
82
+ }
83
+ });
84
+ });
85
+ </script>
app/design/frontend/base/default/template/zoozpayments/form/payments/saved.phtml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $_code = $this->getData('code');
3
+ $_savedCards = $this->getData('savedCards');
4
+
5
+ ?>
6
+
7
+ <li>
8
+ <label for="<?php echo $_code; ?>_saved_card"><?php echo $this->__('Pay with saved credit card') ?></label>
9
+ <div class="input-box">
10
+ <div class="v-fix">
11
+ <select id="<?php echo $_code ?>_saved_card" name="payment[cc_saved_card]">
12
+ <?php foreach ($_savedCards as $_savedCard): ?>
13
+ <option value="<?php echo $_savedCard['paymentMethodToken'] ?>">XXXX-<?php echo $_savedCard['lastFourDigits'] ?></option>
14
+ <?php endforeach ?>
15
+ </select>
16
+ </div>
17
+ </div>
18
+ <input type="hidden" id="<?php echo $_code ?>cc_saved_cid" name="payment[cc_saved_cid]" value="" />
19
+ </li>
app/design/frontend/base/default/template/zoozpayments/info/payments.phtml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ZooZ Payments Integration
4
+ *
5
+ * @category Zooz
6
+ * @package Zooz_Payments
7
+ */
8
+ ?>
9
+
10
+ <?php if (!$this->getHideTitle()): ?>
11
+ <p><strong><?php echo $this->escapeHtml($this->getMethod()->getTitle()) ?></strong></p>
12
+ <?php endif;?>
13
+
14
+ <?php
15
+ $cards = $this->getCards();
16
+ $showCount = count($cards) > 1;
17
+ ?>
18
+
19
+ <dl class="cards-list">
20
+ <?php foreach ($cards as $key => $card): ?>
21
+ <?php if ($showCount): ?>
22
+ <dt><?php echo sprintf($this->__('Credit Card %s'), $key + 1); ?></dt>
23
+ <?php endif;?>
24
+
25
+ <dd <?php if ($showCount):?> class="offset"<?php endif;?>>
26
+ <table class="info-table">
27
+ <tbody>
28
+ <?php foreach ($card as $_label => $_value):?>
29
+ <tr>
30
+ <th><?php echo $this->escapeHtml($_label)?>:</th>
31
+ <td><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n"))?></td>
32
+ </tr>
33
+ <?php endforeach; ?>
34
+ </tbody>
35
+ </table>
36
+ </dd>
37
+ <?php endforeach; ?>
38
+ </dl>
app/design/frontend/base/default/template/zoozpayments/redirect.phtml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $order = new Mage_Sales_Model_Order();
3
+ $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
4
+ $order->loadByIncrementId($orderId);
5
+ ?>
6
+ <h2><?php echo $this->__('ZooZ Demo Payment Gateway') ?></h2>
7
+ <p>It's a demo page acting as a payment gateway interface! So don't worry you won't get charged.</p>
8
+ <form name="zooz-payments" method="post" action="<?php echo Mage::helper('payments')->getPaymentGatewayUrl(); ?>">
9
+ <input type="hidden" name="orderId" value="<?php echo $orderId; ?>">
10
+ <input type="submit" value="<?php echo $this->__('Make Payment') ?>" />
11
+ </form>
app/design/frontend/default/default/layout/zoozpayment.xml DELETED
@@ -1,75 +0,0 @@
1
- <?xml version="1.0"?>
2
-
3
- <layout version="0.1.0">
4
-
5
- <default>
6
- <reference name="head">
7
- <action method="addItem">
8
- <type>skin_js</type>
9
- <name>zooz/js/jquery-1.9.0.min.js</name>
10
- </action>
11
-
12
- <action method="addItem">
13
- <type>skin_js</type>
14
- <name>zooz/js/zooz-magento.js</name>
15
- </action>
16
- <block type="core/text" name="zooz-ext.js"><action method="setText"><text><![CDATA[<script type="text/javascript" src="https://app.zooz.com/mobile/js/zooz-ext-web-ajax.js"></script>]]></text></action></block>
17
- <block type="core/text" name="google.cdn.jquery">
18
- <action method="setText">
19
- <text>
20
- <![CDATA[<script type="text/javascript">jQuery.noConflict();</script>]]>
21
- </text>
22
- </action>
23
- </block>
24
- </reference>
25
- <reference name="top.links">
26
- <remove name="checkout_cart_link"/>
27
- </reference>
28
- <reference name="top.links">
29
- <block type="checkout/links" name="checkout_cart_link_zooz">
30
- <action method="addCartLink" ></action>
31
- </block>
32
- </reference>
33
- <reference name="right">
34
- <reference name="cart_sidebar">
35
- <action method="setTemplate">
36
- <template>zoozpayment/sidebar.phtml</template>
37
- </action>
38
- </reference>
39
- </reference>
40
- </default>
41
- <zoozpayment_index_index>
42
- <reference name="root">
43
- <action method="setTemplate">
44
- <template>page/empty.phtml</template>
45
- </action>
46
- </reference>
47
- <reference name="content">
48
- <block type="zoozpayment/index" name="zoozpayment_index" template="zoozpayment/index.phtml"/>
49
- </reference>
50
- </zoozpayment_index_index>
51
-
52
- <catalog_product_view>
53
- <reference name="product.info.addtocart">
54
- <block type="page/html_wrapper" name="product.info.addtocart.zooz.wrapper" translate="label">
55
- <label>Zooz Payment Checkout Shortcut Wrapper</label>
56
- <block type="core/template" name="product.info.addtocart.zooz" template="zoozpayment/shortcut.phtml"/>
57
- </block>
58
- </reference>
59
- </catalog_product_view>
60
- <checkout_cart_index>
61
- <reference name="checkout.cart.top_methods">
62
- <remove name="checkout.cart.methods.onepage"/>
63
- </reference>
64
- <reference name="checkout.cart.methods">
65
- <remove name="checkout.cart.methods.onepage"/>
66
- <remove name="checkout.cart.methods.multishipping"/>
67
- <block type="core/template" name="checkout.cart.methods.zooz.bottom" after="checkout.cart.methods.onepage" template="zoozpayment/shortcut-checkout.phtml" />
68
- </reference>
69
- </checkout_cart_index>
70
- <zoozpayment_estimate_index>
71
- <block type="zoozpayment/estimate" name="shipping.estimate.result" template="zoozpayment/result.phtml" output="toHtml" />
72
- </zoozpayment_estimate_index>
73
-
74
- </layout>
75
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/index.phtml DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- $token = Mage::app()->getRequest()->getParam('token');
3
- if($token != ''):
4
- ?>
5
- <script src="http://dev.zooz.co:8090/mobile/js/zooz-ext-web-ajax.js"></script>
6
- <script type="text/javascript">
7
- <?php if(Mage::getModel('zoozpayment/standard')->getIsSandBox()): ?>
8
- var sandbox = true;
9
- <?php else: ?>
10
- var sandbox = false;
11
- <?php endif; ?>
12
-
13
- jQuery(document).ready(function(){
14
- zoozStartCheckout({
15
- token : "<?php echo $token; ?>",
16
- uniqueId : "<?php echo Mage::getModel('zoozpayment/standard')->getAppUniqueId(); ?>",
17
- isSandbox : sandbox,
18
- returnUrl : "<?php echo $this->getUrl('zoozpayment/standard/successexpress');?>",
19
- cancelUrl : "<?php echo $this->getUrl('zoozpayment/standard/cancel');?>"
20
-
21
- });
22
- });
23
- </script>
24
- <?php else: ?>
25
- <p>No content</p>
26
- <?php endif; ?>
27
-
28
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/result.phtml DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
-
3
- if ($this->getResult()) {
4
- $response = array();
5
- foreach ($this->getResult() as $code => $_rates) {
6
-
7
- $arr = array();
8
- foreach ($_rates as $_rate) {
9
- if (!$_rate->getErrorMessage()) {
10
- $rate_name = $_rate->getMethodTitle();
11
- //
12
- $rate_name = $_rate->getCode();
13
- $arr[] = array('name' => $rate_name, 'price' => $_rate->getPrice());
14
- }
15
- }
16
- $response[] = array('carrierName' => $this->getCarrierName($code), 'carrierCode' => $code, 'rates' => $arr);
17
- }
18
- if (count($arr) == 0) {
19
- $result[] = array('error' => true, 'message' => 'There is no shipping method available for this address.');
20
- echo json_encode($result);
21
- } else {
22
- echo json_encode($response);
23
- }
24
- }
25
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/review.phtml DELETED
@@ -1,141 +0,0 @@
1
- <div class="page-title">
2
- <h1><?php echo $this->__('Review Order') ?></h1>
3
- </div>
4
- <?php echo $this->getMessagesBlock()->toHtml() ?>
5
- <script type="text/javascript">
6
- //<![CDATA[
7
- var countryRegions = <?php echo $this->helper('directory')->getRegionJson() ?>
8
- //]]>
9
- </script>
10
- <h2 class="sub-title">
11
- Please confirm your addresses
12
- </h2>
13
- <div class="paypal-review-order">
14
- <form method="post" id="order_review_form" action="<?php echo $this->getPlaceOrderUrl() ?>">
15
- <?php if(!$billingBlock->isCustomerLoggedIn()): ?>
16
- <div class="info-set col2-set">
17
- <h2 class="legend"><?php echo $this->__('Customer Information') ?></h2>
18
- <ul class="form-list form-list-narrow">
19
- <li id="customer-info-form" class="address-form">
20
- <div class="field">
21
- <label for="customer:email" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
22
- <div class="input-box">
23
- <input type="text" name="customer-email" id="customer:email" value="<?php echo $this->escapeHtml($billingBlock->getAddress()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="input-text validate-email required-entry" />
24
- </div>
25
- </div>
26
- </li>
27
- </ul>
28
- </div>
29
- <?php endif ?>
30
- <div class="info-set col2-set">
31
- <div class="col-1" id="billing-address">
32
- <h2 class="legend"><?php echo $this->__('Billing Address') ?></h2>
33
- <?php if ($shippingAddress): ?>
34
- <?php echo $billingBlock->setShowAsShippingCheckbox(true)->toHtml(); ?>
35
- <?php else: ?>
36
- <?php echo $billingBlock->toHtml(); ?>
37
- <?php endif; ?>
38
- </div>
39
- <?php if ($shippingAddress): ?>
40
- <div class="col-2" id="shipping-address">
41
- <h2 class="legend"><?php echo $this->__('Shipping Address') ?></h2>
42
- <?php echo $this->getChild('shipping')->setFieldNamePrefix('shipping')->setHideEmailAddress(true)->toHtml(); ?>
43
- </div>
44
- </div>
45
-
46
- <div class="info-set col2-set">
47
- <div class="col-2">
48
- <div class="box paypal-shipping-method">
49
- <div class="box-title">
50
- <h3><?php echo $this->__('Shipping Method') ?></h3>
51
- </div>
52
- <div class="box-content">
53
- <?php echo $this->getChild('shipping_method')->toHtml(); ?>
54
- </div>
55
- </div>
56
- </div>
57
- <?php endif; ?>
58
- </div>
59
-
60
- <div class="info-set">
61
- <h2 class="legend"><?php echo $this->__('Items in Your Shopping Cart') ?><span class="separator"> | </span><a href="<?php echo $this->getUrl('checkout/cart') ?>"><?php echo $this->__('Edit Shopping Cart') ?></a></h2>
62
- <div id="details-reload">
63
- <?php echo $this->getChildHtml('details') ?>
64
- </div>
65
- </div>
66
- <?php echo $this->getChildHtml('agreements'); ?>
67
- <div class="buttons-set buttons-set-order" id="review-buttons-container">
68
- <button type="button" id="review_button" value="<?php echo $this->__('Place Order') ?>" class="button btn-checkout"><span><span><?php echo $this->__('Place Order') ?></span></span></button>
69
- <button type="button" id="review_submit" value="<?php echo $this->__('Place Order') ?>" class="button btn-checkout"><span><span><?php echo $this->__('Place Order') ?></span></span></button>
70
- <button type="button" id="update_order" class="button btn-checkout"><span><span><?php echo $this->__('Update Order Data') ?></span></span></button>
71
- <span class="please-wait" id="review-please-wait" style="display:none;">
72
- <img src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif') ?>" alt="<?php echo $this->__('Submitting order information...') ?>" title="<?php echo $this->__('Submitting order information...') ?>" class="v-middle" /> <?php echo $this->__('Submitting order information...') ?>
73
- </span>
74
- </div>
75
- </form>
76
- </div>
77
- <script type="text/javascript">
78
- //<![CDATA[
79
- // submit buttons are not needed when submitting with ajax
80
- $('review_submit').hide();
81
- if ($('update_shipping_method_submit')) {
82
- $('update_shipping_method_submit').hide();
83
- }
84
-
85
- <?php if ($this->getUseAjax()):?>
86
- OrderReviewController.prototype._submitOrder = function() {
87
- if (this._canSubmitOrder) {
88
- if (this._pleaseWait) {
89
- this._pleaseWait.show();
90
- }
91
- new Ajax.Request(this.form.action, {
92
- parameters: {isAjax: 1, method: 'POST'},
93
- onSuccess: function(transport) {
94
- try{
95
- response = eval('(' + transport.responseText + ')');
96
- } catch (e) {
97
- response = {};
98
- }
99
- if (response.redirect) {
100
- setLocation(response.redirect);
101
- return;
102
- }
103
- if (response.success) {
104
- setLocation('<?php echo $this->getSuccessUrl()?>');
105
- return;
106
- } else {
107
- var msg = response.error_messages;
108
- if (typeof(msg)=='object') {
109
- msg = msg.join("\n");
110
- }
111
- if (msg) {
112
- $('review-please-wait').hide();
113
- alert(msg);
114
- return;
115
- }
116
- }
117
- $('review-please-wait').hide();
118
- alert('<?php echo $this->jsQuoteEscape($this->__('Unknown Error. Please try again later.')); ?>');
119
- return;
120
- },
121
- onFailure: function(){
122
- alert('<?php echo $this->jsQuoteEscape($this->__('Server Error. Please try again.')) ?>');
123
- $('review-please-wait').hide();
124
- }
125
- });
126
- }
127
- }
128
- <?php endif ?>
129
- PayPalExpressAjax = new OrderReviewController($('order_review_form'), $('review_button'),
130
- 'shipping_method', null, 'details-reload'
131
- );
132
- PayPalExpressAjax.addPleaseWait($('review-please-wait'));
133
- PayPalExpressAjax.setShippingAddressContainer($('shipping-address'));
134
- PayPalExpressAjax.setShippingMethodContainer('shipping-method-container');
135
- PayPalExpressAjax.shippingMethodsUpdateUrl = '<?php echo $this->escapeHtml($this->getUpdateShippingMethodsUrl()) ?>';
136
- PayPalExpressAjax.setUpdateButton($('update_order'),'<?php echo $this->escapeHtml($this->getUpdateOrderSubmitUrl()) ?>','details-reload');
137
- if ($('billing:as_shipping')) {
138
- PayPalExpressAjax.setCopyElement($('billing:as_shipping'));
139
- }
140
- //]]>
141
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/shortcut-checkout.phtml DELETED
@@ -1,19 +0,0 @@
1
- <a id="zooz-payment-link" style="background-color: #679100; padding: 10px; color: white; font-size: small;" href="<?php echo $this->getUrl('zoozpayment/standard/ajaxstart');?>" onclick='return localDoZooz(this);' >Checkout
2
- </a>
3
- <img id="zooz-payment-loading" class='zooz-payment-loading' style="display: none; margin-left: 10px;z-index:1000" src="<?php echo $this->getSkinUrl('zooz/images/loading.gif');?>" alt="loading" title="loading" />
4
- <style>
5
- .cart .title-buttons .checkout-types li { float: none; }
6
- </style>
7
- <script type="text/javascript">
8
- function localDoZooz(ref){
9
- var isSandbox = <?php echo Mage::getModel('zoozpayment/standard')->getIsSandBox(); ?>;
10
- var formObject = jQuery('#product_addtocart_form');
11
- var url = jQuery(ref).attr('href');
12
- var uniqueId = "<?php echo Mage::getModel('zoozpayment/standard')->getAppUniqueId(); ?>";
13
- var returnUrl = "<?php echo $this->getUrl('zoozpayment/standard/successexpress');?>";
14
- var cancelUrl = "<?php echo $this->getUrl('zoozpayment/standard/cancel');?>";
15
- startZooz(isSandbox, formObject, url, uniqueId, returnUrl, cancelUrl);
16
-
17
- return false;
18
- }
19
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/shortcut.phtml DELETED
@@ -1,22 +0,0 @@
1
-
2
- <br/>
3
- <br/>
4
- <a id="zooz-payment-link" style="float: right; background-color: #679100; padding: 10px; color: white; font-size: small;" href="<?php echo $this->getUrl('zoozpayment/cart/add'); ?>" onclick="return localDoZooz(this);">
5
- Quick Checkout
6
- </a>
7
- <img id="zooz-payment-loading" class="zooz-payment-loading" style="display: none; margin-left: 10px;" src="<?php echo $this->getSkinUrl('zooz/images/loading.gif'); ?>" alt="loading" title="loading" />
8
- <script type="text/javascript">
9
-
10
-
11
- function localDoZooz(ref){
12
- var isSandbox = <?php echo Mage::getModel('zoozpayment/standard')->getIsSandBox(); ?>;
13
- var formObject = jQuery('#product_addtocart_form');
14
- var url = jQuery(ref).attr('href');
15
- var uniqueId = "<?php echo Mage::getModel('zoozpayment/standard')->getAppUniqueId(); ?>";
16
- var returnUrl = "<?php echo $this->getUrl('zoozpayment/standard/successexpress');?>";
17
- var cancelUrl = "<?php echo $this->getUrl('zoozpayment/standard/cancel');?>";
18
- startZooz(isSandbox, formObject, url, uniqueId, returnUrl, cancelUrl);
19
-
20
- return false;
21
- }
22
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/default/default/template/zoozpayment/sidebar.phtml DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Academic Free License (AFL 3.0)
8
- * that is bundled with this package in the file LICENSE_AFL.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/afl-3.0.php
11
- * If you did not receive a copy of the license and are unable to
12
- * obtain it through the world-wide-web, please send an email
13
- * to license@magentocommerce.com so we can send you a copy immediately.
14
- *
15
- * DISCLAIMER
16
- *
17
- * Do not edit or add to this file if you wish to upgrade Magento to newer
18
- * versions in the future. If you wish to customize Magento for your
19
- * needs please refer to http://www.magentocommerce.com for more information.
20
- *
21
- * @category design
22
- * @package base_default
23
- * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
- * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
- */
26
-
27
- /**
28
- * Shoping cart sidebar
29
- *
30
- * @see Mage_Checkout_Block_Cart_Sidebar
31
- */
32
-
33
- ?>
34
- <?php if ($this->getIsNeedToDisplaySideBar()):?>
35
- <div class="block block-cart">
36
- <?php $_cartQty = $this->getSummaryCount() ?>
37
- <div class="block-title">
38
- <strong><span><?php echo $this->__('My Cart') ?></span></strong>
39
- </div>
40
- <div class="block-content">
41
- <?php if ($_cartQty>0): ?>
42
- <div class="summary">
43
- <?php if ($_cartQty==1): ?>
44
- <p class="amount"><?php echo $this->__('There is <a href="%s">1 item</a> in your cart.', $this->getUrl('checkout/cart')) ?></p>
45
- <?php else: ?>
46
- <p class="amount"><?php echo $this->__('There are <a href="%s">%s items</a> in your cart.', $this->getUrl('checkout/cart'), $_cartQty) ?></p>
47
- <?php endif ?>
48
- <p class="subtotal">
49
- <?php if ($this->canApplyMsrp()): ?>
50
- <span class="map-cart-sidebar-total"><?php echo $this->__('ORDER TOTAL WILL BE DISPLAYED BEFORE YOU SUBMIT THE ORDER'); ?></span>
51
- <?php else: ?>
52
- <span class="label"><?php echo $this->__('Cart Subtotal:') ?></span> <?php echo Mage::helper('checkout')->formatPrice($this->getSubtotal()) ?>
53
- <?php if ($_subtotalInclTax = $this->getSubtotalInclTax()): ?>
54
- <br />(<?php echo Mage::helper('checkout')->formatPrice($_subtotalInclTax) ?> <?php echo Mage::helper('tax')->getIncExcText(true) ?>)
55
- <?php endif; ?>
56
- <?php endif; ?>
57
- </p>
58
- </div>
59
- <?php endif ?>
60
- <?php if($_cartQty && $this->isPossibleOnepageCheckout()): ?>
61
- <div class="actions">
62
- <a id="zooz-payment-link-side-bar" onclick='localDoZooz(this)' href="<?php echo $this->getUrl('zoozpayment/standard/ajaxstart');?>" style="float: right; background-color: #679100; padding: 10px; color: white; font-size: small;">Quick checkout
63
- </a>
64
- <img id="zooz-payment-loading-cart" class="zooz-payment-loading" style="display: none; margin-left: 10px;" src="<?php echo $this->getSkinUrl('zooz/images/loading.gif');?>" alt="loading" title="loading" />
65
- </div>
66
- <style>
67
- .cart .title-buttons .checkout-types li { float: none; }
68
- </style>
69
- <script type="text/javascript">
70
- function localDoZooz(ref){
71
- var isSandbox = <?php echo Mage::getModel('zoozpayment/standard')->getIsSandBox(); ?>;
72
- var formObject = jQuery('#product_addtocart_form');
73
- var url = jQuery(ref).attr('href');
74
- var uniqueId = "<?php echo Mage::getModel('zoozpayment/standard')->getAppUniqueId(); ?>";
75
- var returnUrl = "<?php echo $this->getUrl('zoozpayment/standard/successexpress');?>";
76
- var cancelUrl = "<?php echo $this->getUrl('zoozpayment/standard/cancel');?>";
77
- startZooz(isSandbox, formObject, url, uniqueId, returnUrl, cancelUrl);
78
-
79
- return false;
80
- }
81
- </script>
82
-
83
-
84
- <?php endif ?>
85
- <?php $_items = $this->getRecentItems() ?>
86
- <?php if(count($_items)): ?>
87
- <p class="block-subtitle"><?php echo $this->__('Recently added item(s)') ?></p>
88
- <ol id="cart-sidebar" class="mini-products-list">
89
- <?php foreach($_items as $_item): ?>
90
- <?php echo $this->getItemHtml($_item) ?>
91
- <?php endforeach; ?>
92
- </ol>
93
- <script type="text/javascript">decorateList('cart-sidebar', 'none-recursive')</script>
94
- <?php else: ?>
95
- <p class="empty"><?php echo $this->__('You have no items in your shopping cart.') ?></p>
96
- <?php endif ?>
97
- </div>
98
- </div>
99
- <?php endif;?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/etc/modules/ZooZ_ZoozPayment.xml DELETED
@@ -1,10 +0,0 @@
1
- <?xml version="1.0"?>
2
- <config>
3
- <modules>
4
- <ZooZ_ZoozPayment>
5
- <active>true</active>
6
- <codePool>community</codePool>
7
- <version>0.1.0</version>
8
- </ZooZ_ZoozPayment>
9
- </modules>
10
- </config>
 
 
 
 
 
 
 
 
 
 
app/etc/modules/Zooz_Payments.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * ZooZ Payments Integration
5
+ *
6
+ * @category Zooz
7
+ * @package Zooz_Payments
8
+ */-->
9
+ <config>
10
+ <modules>
11
+ <Zooz_Payments>
12
+ <active>true</active>
13
+ <codePool>community</codePool>
14
+ <depends>
15
+ <Mage_Payment/>
16
+ </depends>
17
+ </Zooz_Payments>
18
+ </modules>
19
+ </config>
js/zoozpayments/jquery.creditCardValidator.js ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by CoffeeScript 1.8.0
2
+
3
+ /*
4
+ jQuery Credit Card Validator 1.0
5
+
6
+ Copyright 2012-2015 Pawel Decowski
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software
13
+ is furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included
16
+ in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24
+ IN THE SOFTWARE.
25
+ */
26
+
27
+ (function() {
28
+ var $,
29
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
30
+
31
+ $ = jQuery;
32
+
33
+ $.fn.removeClassRegex = function (regex) {
34
+ return $(this).removeClass(function (index, classes) {
35
+ return classes.split(/\s+/).filter(function (c) {
36
+ return regex.test(c);
37
+ }).join(' ');
38
+ });
39
+ };
40
+
41
+ $.fn.validateCreditCard = function(callback, options) {
42
+ var bind, card, card_type, card_types, get_card_type, is_valid_length, is_valid_luhn, normalize, validate, validate_number, _i, _len, _ref;
43
+ card_types = [
44
+ {
45
+ name: 'AE',
46
+ pattern: /^3[47]/,
47
+ valid_length: [15]
48
+ }, {
49
+ name: 'DC',
50
+ pattern: /^30[0-5]/,
51
+ valid_length: [14]
52
+ }, {
53
+ name: 'DC',
54
+ pattern: /^36/,
55
+ valid_length: [14]
56
+ }, {
57
+ name: 'DC',
58
+ pattern: /^36/,
59
+ valid_length: [14]
60
+ }, {
61
+ name: 'JCB',
62
+ pattern: /^35(2[89]|[3-8][0-9])/,
63
+ valid_length: [16]
64
+ }, {
65
+ name: 'laser',
66
+ pattern: /^(6304|670[69]|6771)/,
67
+ valid_length: [16, 17, 18, 19]
68
+ }, {
69
+ name: 'visa_electron',
70
+ pattern: /^(4026|417500|4508|4844|491(3|7))/,
71
+ valid_length: [16]
72
+ }, {
73
+ name: 'VI',
74
+ pattern: /^4/,
75
+ valid_length: [16]
76
+ }, {
77
+ name: 'MC',
78
+ pattern: /^5[1-5]/,
79
+ valid_length: [16]
80
+ }, {
81
+ name: 'maestro',
82
+ pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
83
+ valid_length: [12, 13, 14, 15, 16, 17, 18, 19]
84
+ }, {
85
+ name: 'DI',
86
+ pattern: /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,
87
+ valid_length: [16]
88
+ }
89
+ ];
90
+ bind = false;
91
+ if (callback) {
92
+ if (typeof callback === 'object') {
93
+ options = callback;
94
+ bind = false;
95
+ callback = null;
96
+ } else if (typeof callback === 'function') {
97
+ bind = true;
98
+ }
99
+ }
100
+ if (options == null) {
101
+ options = {};
102
+ }
103
+ if (options.accept == null) {
104
+ options.accept = (function() {
105
+ var _i, _len, _results;
106
+ _results = [];
107
+ for (_i = 0, _len = card_types.length; _i < _len; _i++) {
108
+ card = card_types[_i];
109
+ _results.push(card.name);
110
+ }
111
+ return _results;
112
+ })();
113
+ }
114
+ _ref = options.accept;
115
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
116
+ card_type = _ref[_i];
117
+ if (__indexOf.call((function() {
118
+ var _j, _len1, _results;
119
+ _results = [];
120
+ for (_j = 0, _len1 = card_types.length; _j < _len1; _j++) {
121
+ card = card_types[_j];
122
+ _results.push(card.name);
123
+ }
124
+ return _results;
125
+ })(), card_type) < 0) {
126
+ throw "Credit card type '" + card_type + "' is not supported";
127
+ }
128
+ }
129
+ get_card_type = function(number) {
130
+ var _j, _len1, _ref1;
131
+ _ref1 = (function() {
132
+ var _k, _len1, _ref1, _results;
133
+ _results = [];
134
+ for (_k = 0, _len1 = card_types.length; _k < _len1; _k++) {
135
+ card = card_types[_k];
136
+ if (_ref1 = card.name, __indexOf.call(options.accept, _ref1) >= 0) {
137
+ _results.push(card);
138
+ }
139
+ }
140
+ return _results;
141
+ })();
142
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
143
+ card_type = _ref1[_j];
144
+ if (number.match(card_type.pattern)) {
145
+ return card_type;
146
+ }
147
+ }
148
+ return null;
149
+ };
150
+ is_valid_luhn = function(number) {
151
+ var digit, n, sum, _j, _len1, _ref1;
152
+ sum = 0;
153
+ _ref1 = number.split('').reverse();
154
+ for (n = _j = 0, _len1 = _ref1.length; _j < _len1; n = ++_j) {
155
+ digit = _ref1[n];
156
+ digit = +digit;
157
+ if (n % 2) {
158
+ digit *= 2;
159
+ if (digit < 10) {
160
+ sum += digit;
161
+ } else {
162
+ sum += digit - 9;
163
+ }
164
+ } else {
165
+ sum += digit;
166
+ }
167
+ }
168
+ return sum % 10 === 0;
169
+ };
170
+ is_valid_length = function(number, card_type) {
171
+ var _ref1;
172
+ return _ref1 = number.length, __indexOf.call(card_type.valid_length, _ref1) >= 0;
173
+ };
174
+ validate_number = (function(_this) {
175
+ return function(number) {
176
+ var length_valid, luhn_valid;
177
+ card_type = get_card_type(number);
178
+ luhn_valid = false;
179
+ length_valid = false;
180
+ if (card_type != null) {
181
+ luhn_valid = is_valid_luhn(number);
182
+ length_valid = is_valid_length(number, card_type);
183
+ }
184
+ return {
185
+ card_type: card_type,
186
+ valid: luhn_valid && length_valid,
187
+ luhn_valid: luhn_valid,
188
+ length_valid: length_valid
189
+ };
190
+ };
191
+ })(this);
192
+ validate = (function(_this) {
193
+ return function() {
194
+ var number;
195
+ number = normalize($(_this).val());
196
+ return validate_number(number);
197
+ };
198
+ })(this);
199
+ normalize = function(number) {
200
+ return number.replace(/[ -]/g, '');
201
+ };
202
+ if (!bind) {
203
+ return validate();
204
+ }
205
+ this.on('input.jccv', (function(_this) {
206
+ return function() {
207
+ $(_this).off('keyup.jccv');
208
+ return callback.call(_this, validate());
209
+ };
210
+ })(this));
211
+ this.on('keyup.jccv', (function(_this) {
212
+ return function() {
213
+ return callback.call(_this, validate());
214
+ };
215
+ })(this));
216
+ callback.call(this, validate());
217
+ return this;
218
+ };
219
+
220
+ }).call(this);
lib/zooz/address.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
-
3
- class Address {
4
-
5
- public $addressType;
6
- public $firstName;
7
- public $lastName;
8
- // public $phoneCountryCode;
9
- // public $phoneNumber;
10
- public $street;
11
- public $city;
12
- public $state;
13
- public $country;
14
- public $countryCode;
15
- public $zipCode;
16
-
17
- function __construct($addressType, $firstName, $lastName, $street, $city, $state, $country, $zipCode, $countryCode) {
18
- $this->addressType = $addressType;
19
- $this->firstName = $firstName;
20
- $this->lastName = $lastName;
21
- $this->street = $street;
22
- $this->city = $city;
23
- $this->state = $state;
24
- $this->country = $country;
25
- $this->countryCode = $countryCode;
26
- $this->zipCode = $zipCode;
27
- }
28
-
29
- public static function createAddressFromJson($addressType, $jsonObj) {
30
- return new Address($addressType, utf8_decode($jsonObj[firstName]), utf8_decode($jsonObj[lastName]), utf8_decode($jsonObj[street]), utf8_decode($jsonObj[city]), utf8_decode($jsonObj[state]), utf8_decode($jsonObj[country]), $jsonObj[zipCode], utf8_decode($jsonObj[countryCode]));
31
- }
32
-
33
- public static function createAddress($addressType, $firstName, $lastName, $street, $city, $state, $country, $zipCode, $countryCode) {
34
- return new Address($addressType, $firstName, $lastName, $street, $city, $state, $country, $zipCode, $countryCode);
35
- }
36
-
37
- }
38
-
39
-
40
- class AddressType {
41
-
42
- const billingAddress = "billingAddress";
43
-
44
- const shippingAddress = "shippingAddress";
45
-
46
- }
47
-
48
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/invoice.item.php DELETED
@@ -1,29 +0,0 @@
1
- <?php
2
- class InvoiceItem {
3
-
4
- public $name;
5
- public $id;
6
- public $quantity;
7
- public $price;
8
- public $taxAmount;
9
- public $additionalDetails;
10
-
11
- private function __construct($name, $id, $quantity, $price, $taxAmount, $additionalDetails) {
12
- $this->name = $name;
13
- $this->id = $id;
14
- $this->quantity = $quantity;
15
- $this->price = $price;
16
- $this->taxAmount = $taxAmount;
17
- $this->additionalDetails = $additionalDetails;
18
- }
19
-
20
- public static function createInvoiceItemFromJson($jsonObj) {
21
- return new InvoiceItem(utf8_decode($jsonObj[name]), $jsonObj[id], $jsonObj[quantity], $jsonObj[price], $jsonObj[taxAmount], utf8_decode($jsonObj[additionalDetails]));
22
- }
23
-
24
- public static function createInvoiceItem($name, $id, $quantity, $price, $taxAmount, $additionalDetails) {
25
- return new InvoiceItem($name, $id, $quantity, $price, $taxAmount, $additionalDetails);
26
- }
27
-
28
- }
29
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/invoice.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
-
4
- require_once(Mage::getBaseDir('lib') . '/zooz/invoice.item.php');
5
-
6
- class Invoice {
7
-
8
- public $number;
9
- public $items;
10
- public $additionalDetails;
11
-
12
- private function __construct($number, $additionalDetails, $items) {
13
- $this->number = $number;
14
- if (empty($items)) {
15
- $this->items = Array();
16
- } else {
17
- $this->invoiceItems = $items;
18
- }
19
- $this->additionalDetails = $additionalDetails;
20
- }
21
-
22
- public static function createInvoiceFromJson($jsonObj) {
23
- $items = Array();
24
- if (!empty($jsonObj[items])) {
25
- foreach ($jsonObj[items] as $key => $value) {
26
- array_push($items, InvoiceItem::createInvoiceItemFromJson($value));
27
- }
28
- }
29
- return new Invoice($jsonObj[number], utf8_decode($jsonObj[additionalDetails]), $items);
30
- }
31
-
32
- public static function createInvoice($number = NULL, $additionalDetails = NULL, $items = NULL) {
33
- return new Invoice($number, $additionalDetails, $items);
34
- }
35
-
36
- public function addItem($name, $id, $quantity, $price, $taxAmount, $additionalDetails = NULL) {
37
- array_push($this->items, InvoiceItem::createInvoiceItem($name, $id, $quantity, $price, $taxAmount, $additionalDetails));
38
- }
39
-
40
- }
41
-
42
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/nvps.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- class NVPs {
3
-
4
- public $nameValuePairs;
5
-
6
- function __construct() {
7
- $this->nameValuePairs = Array();
8
- }
9
-
10
- function add($name, $value) {
11
- if (!empty($name) && ($value == 0 || !empty($value))) {
12
- $this->nameValuePairs[$name] = $value;
13
- }
14
- }
15
-
16
- function addAll(NVPs $nvps) {
17
- $this->nameValuePairs = array_merge($this->nameValuePairs, $nvps->nameValuePairs);
18
- }
19
-
20
- function toString() {
21
- $str = "";
22
- foreach ($this->nameValuePairs as $name => $value) {
23
- $str .= '&' . $name . '=' . urlencode($value);
24
- }
25
- return $str;
26
- }
27
- }
28
-
29
-
30
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/transaction.details.php DELETED
@@ -1,68 +0,0 @@
1
- <?php
2
-
3
- require_once(Mage::getBaseDir('lib') . '/zooz/address.php');
4
- require_once(Mage::getBaseDir('lib') . '/zooz/invoice.php');
5
- require_once(Mage::getBaseDir('lib') . '/zooz/user.details.php');
6
-
7
-
8
- class TransactionDetails {
9
-
10
- public $appName;
11
- public $transactionID;
12
- public $isSandbox;
13
- public $transactionStatus;
14
- public $fundSourceType;
15
- public $lastFourDigits;
16
- public $amount;
17
- public $paidAmount;
18
- public $currencyCode;
19
- public $transactionFee;
20
- public $transactionTimestamp;
21
- public $user;
22
- public $invoice;
23
- public $billingAddress;
24
- public $shippingAddress;
25
- public $shippingMethod;
26
- public $shippingAmount;
27
- public $shippingCarrierCode;
28
- public $shippingCarrierName;
29
-
30
- function __construct($jsonObj) {
31
-
32
- $this->amount = $jsonObj[amount];
33
- $this->appName = utf8_decode($jsonObj[appName]);
34
- if (!empty($jsonObj[addresses])) {
35
- if (!empty($jsonObj[addresses][billing])) {
36
- $this->billingAddress = Address::createAddressFromJson(AddressType::billingAddress, $jsonObj[addresses][billing]);
37
- }
38
- if (!empty($jsonObj[addresses][shipping])) {
39
- $this->shippingAddress = Address::createAddressFromJson(AddressType::shippingAddress, $jsonObj[addresses][shipping]);
40
- }
41
-
42
- }
43
- $this->currencyCode = $jsonObj[currencyCode];
44
- $this->fundSourceType = $jsonObj[fundSourceType];
45
- if (!empty($jsonObj[invoice])) {
46
- $this->invoice = Invoice::createInvoiceFromJson($jsonObj[invoice]);
47
- }
48
- $this->isSandbox = $jsonObj[isSandbox];
49
- $this->lastFourDigits = $jsonObj[lastFourDigits];
50
- $this->paidAmount = $jsonObj[paidAmount];
51
- $this->transactionFee = $jsonObj[transactionFee];
52
- $this->transactionID = $jsonObj[transactionID];
53
- $this->transactionStatus = $jsonObj[transactionStatus];
54
- $this->transactionTimestamp = new DateTime();
55
- $this->transactionTimestamp->setTimestamp(intval($jsonObj[transactionTimestamp])/1000);
56
- if (!empty($jsonObj[user])) {
57
- $this->user = UserDetails::createUserDetailsFromJson($jsonObj[user]);
58
- }
59
- $this->shippingMethod = $jsonObj[shippingMethod];
60
- $this->shippingAmount = $jsonObj[shippingAmount];
61
- $this->shippingCarrierCode = $jsonObj[shippingCarrierCode];
62
- $this->shippingCarrierName = $jsonObj[shippingCarrierName];
63
- }
64
-
65
-
66
-
67
- }
68
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/user.details.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
-
3
- class UserDetails {
4
-
5
- public $firstName;
6
- public $lastName;
7
- public $phoneCountryCode;
8
- public $phoneNumber;
9
- public $email;
10
- public $additionalDetails;
11
-
12
- private function __construct($firstName, $lastName, $phoneCountryCode, $phoneNumber, $email, $additionalDetails) {
13
- $this->firstName = $firstName;
14
- $this->lastName = $lastName;
15
- $this->phoneCountryCode = $phoneCountryCode;
16
- $this->phoneNumber = $phoneNumber;
17
- $this->email = $email;
18
- $this->additionalDetails = $additionalDetails;
19
- }
20
-
21
- public static function createUserDetailsFromJson($jsonObj) {
22
- $phoneCountryCode = NULL;
23
- $phoneNumber = NULL;
24
-
25
- if (!empty($jsonObj[phone])) {
26
- $phoneCountryCode = $jsonObj[phone][countryCode];
27
- $phoneNumber = $jsonObj[phone][phoneNumber];
28
- }
29
- return new UserDetails(utf8_decode($jsonObj[firstName]), utf8_decode($jsonObj[lastName]), $phoneCountryCode, $phoneNumber, $jsonObj[email], utf8_decode($jsonObj[additionalDetails]));
30
- }
31
-
32
- public static function createUserDetails($firstName, $lastName, $phoneCountryCode, $phoneNumber, $email, $additionalDetails) {
33
- return new UserDetails($firstName, $lastName, $phoneCountryCode, $phoneNumber, $email, $additionalDetails);
34
- }
35
-
36
- }
37
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/zooz/zooz.exception.php DELETED
@@ -1,10 +0,0 @@
1
- <?php
2
- class ZooZException extends Exception {
3
-
4
- function __construct($message, $code = 0, $previous = NULL) {
5
- parent::__construct($message, $code, $previous);
6
- }
7
-
8
-
9
- }
10
- ?>
 
 
 
 
 
 
 
 
 
 
lib/zooz/zooz.extended.server.api.php DELETED
@@ -1,240 +0,0 @@
1
- <?php
2
-
3
- require_once(Mage::getBaseDir('lib') . '/zooz/nvps.php');
4
- require_once(Mage::getBaseDir('lib') . '/zooz/transaction.details.php');
5
- require_once(Mage::getBaseDir('lib') . '/zooz/zooz.exception.php');
6
-
7
-
8
- class ZooZExtendedServerAPI {
9
-
10
- private $ch;
11
-
12
-
13
- #const SANDBOX_URL = "http://dev.zooz.co:9090";# Mage::getModel('zoozpayment/standard')->getSandboxUrl();
14
- #const PRODUCTION_URL = ""; #Mage::getStoreConfig('payment/zoozpayment/zooz_production_url');
15
-
16
-
17
-
18
- const VERSION_NUMBER = "1.0.6";
19
-
20
- /**
21
- * ZooZExtendedServerAPI Constructor.
22
- *
23
- * @param string $zoozDeveloperId - Developer email as entered in ZooZ Developer portal.
24
- * @param string $zoozServerAPIKey - ZooZ Server API Key assigned to you upon registration. Can be found on the "Account" section of the ZooZ Developer Portal.
25
- * @param string $isSandbox - TRUE to use sandbox environment, FALSE to use live environment.
26
- * @throws ZooZException
27
- */
28
- function __construct($zoozDeveloperId, $zoozServerAPIKey, $isSandbox) {
29
- if (!function_exists('curl_init')){
30
- throw new ZooZException('Sorry cURL is not installed!');
31
- }
32
-
33
- if (empty($zoozDeveloperId)) {
34
- throw new ZooZException("Please enter your developer email as registered in ZooZ's developer portal");
35
- }
36
-
37
- if (empty($zoozServerAPIKey)) {
38
- throw new ZooZException("Please enter ZooZ Server API Key as diaplayed in ZooZ's developer portal under 'My Account'");
39
- }
40
-
41
- $this->ch = curl_init();
42
-
43
- $zoozServer;
44
-
45
- if ($isSandbox) {
46
- #Mage::log(Mage::getModel('zoozpayment/standard')->getSandboxUrl());
47
- $zoozServer = Mage::getModel('zoozpayment/standard')->getSandboxUrl(); #self::SANDBOX_URL;
48
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
49
- } else {
50
- $zoozServer = Mage::getModel('zoozpayment/standard')->getProductionUrl(); #self::PRODUCTION_URL;
51
- }
52
-
53
- $zoozServer .= "/mobile/ExtendedServerAPI";
54
-
55
- curl_setopt($this->ch, CURLOPT_HTTPHEADER, array(
56
- 'ZooZDeveloperId: ' . $zoozDeveloperId,
57
- 'ZooZServerAPIKey: ' . urlencode($zoozServerAPIKey),
58
- ) );
59
-
60
- curl_setopt($this->ch, CURLOPT_URL, $zoozServer);
61
- curl_setopt($this->ch, CURLOPT_TIMEOUT, 30 );
62
- curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
63
- curl_setopt($this->ch, CURLOPT_POST, true);
64
-
65
- }
66
-
67
- /**
68
- * Get transaction details with the transaction ID API.
69
- * This allows you to retrieve complete transaction details and transaction statuses before and/or after commit or refund.
70
- * This call does not change the transaction state.
71
- *
72
- * @param string $transactionID - Transaction ID as returned by the SDK upon transaction completion.
73
- * @throws ZooZException
74
- * @return TransactionDetails - Transaction details for above transaction
75
- */
76
- function getTransactionDetailsByTransactionID($transactionID) {
77
-
78
- if (empty($transactionID)) {
79
- throw new ZooZException("transactionID is empty");
80
- }
81
-
82
- $nvps = new NVPs();
83
- $nvps->add("cmd", "getTransactionDetails");
84
- $nvps->add("ver", self::VERSION_NUMBER);
85
- $nvps->add("transactionID", $transactionID);
86
-
87
- $responseObj = $this->postToZooZ($nvps->toString());
88
-
89
-
90
- return new TransactionDetails($responseObj);
91
-
92
-
93
- }
94
-
95
- /**
96
- * Retrieve transaction full details and transaction status before or/and after commit or refund for all transactions associated with the payee's email.
97
- *
98
- * @param string $email - Payee's email
99
- * @param DateTime $fromDate (optional) - minimum date to query
100
- * @param DateTime $toDate (optional) - maximum date to query
101
- * @throws ZooZException
102
- * @return TransactionDetails[] - Array of transaction details for all transactions associated with the above email
103
- */
104
- function getTransactionDetailsByPayeeEmail($email, $fromDate=NULL, $toDate=NULL) {
105
-
106
- if (empty($email)) {
107
- throw new ZooZException("email is empty");
108
- }
109
-
110
- $nvps = new NVPs();
111
- $nvps->add("cmd", "getTransactionDetailsByPayeeEmail");
112
- $nvps->add("ver", self::VERSION_NUMBER);
113
- $nvps->add("email", $email);
114
-
115
- if (!empty($fromDate)) {
116
- $nvps->add("fromDate", date_format($fromDate, 'Y-m-d'));
117
- }
118
-
119
- if (!empty($toDate)) {
120
- $nvps->add("toDate", date_format($toDate, 'Y-m-d'));
121
- }
122
-
123
- $responseObj = $this->postToZooZ($nvps->toString());
124
-
125
- $transactionDetailsArr = Array();
126
- if (!empty($responseObj) && !empty($responseObj[payments])) {
127
- foreach ($responseObj[payments] as $key => $value) {
128
- array_push($transactionDetailsArr, new TransactionDetails($value));
129
- }
130
- }
131
- return $transactionDetailsArr;
132
- }
133
-
134
- /**
135
- * Commit a transaction in pending status (If your app is set to allow deferred payments).
136
- *
137
- * @param string $transactionID - Transaction ID as returned by the SDK upon transaction completion.
138
- * @param double $amount - (Optional) amount for partial commit, must be lower that the original transaction amount.
139
- * @param Invoice $invoice - (Optional) invoice to be updated for payment.
140
- * @throws ZooZException
141
- * @return boolean - TRUE if action completed successfully.
142
- */
143
- function commitTransaction($transactionID, $amount=NULL, $invoice=NULL) {
144
-
145
- if (empty($transactionID)) {
146
- throw new ZooZException("transactionID is empty");
147
- }
148
-
149
- $nvps = new NVPs();
150
- $nvps->add("cmd", "commitTransaction");
151
- $nvps->add("ver", self::VERSION_NUMBER);
152
- $nvps->add("transactionID", $transactionID);
153
-
154
-
155
- if ($amount != null) {
156
- $nvps->add("amount", $amount);
157
- }
158
-
159
-
160
- if (!empty($invoice)) {
161
- $nvps->add("invoice", json_encode($invoice));
162
- }
163
-
164
- $responseObj = $this->postToZooZ($nvps->toString());
165
- if (!empty($responseObj) && !empty($responseObj[boolean]) && $responseObj[boolean] == true) {
166
- return true;
167
- }
168
- return false;
169
- }
170
-
171
- /**
172
- * Refund a transaction (Up to 60 days after execution)
173
- *
174
- * @param string $transactionID - Transaction ID as returned by the SDK upon transaction completion.
175
- * @param double $amount - (Optional) amount for partial refund, must be lower that the original transaction amount.
176
- * @throws ZooZException
177
- * @return boolean - TRUE if action completed successfully.
178
- */
179
- function refundTransaction($transactionID, $amount=NULL) {
180
-
181
- if (empty($transactionID)) {
182
- throw new ZooZException("transactionID is empty");
183
- }
184
-
185
- $nvps = new NVPs();
186
- $nvps->add("cmd", "refundTransaction");
187
- $nvps->add("ver", self::VERSION_NUMBER);
188
- $nvps->add("transactionID", $transactionID);
189
-
190
- if ($amount != null) {
191
- $nvps->add("amount", $amount);
192
- }
193
-
194
- $responseObj = $this->postToZooZ($nvps->toString());
195
- if (!empty($responseObj) && !empty($responseObj[boolean]) && $responseObj[boolean] == true) {
196
- return true;
197
- }
198
- return false;
199
- }
200
-
201
- private function postToZooZ($data) {
202
-
203
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
204
- $chResult = curl_exec($this->ch);
205
- $chResult = trim($chResult, "\n");
206
- //Mage::log($chResult);
207
-
208
- $errorMsg = "Error communicating with ZooZ server, please check your network connection";
209
-
210
- $errorCode = -1;
211
-
212
- if (empty($chResult)) {
213
- throw new ZooZException($errorMsg);
214
- }
215
-
216
-
217
-
218
- $decoded = json_decode(trim($chResult), TRUE);
219
- //Mage::log($decoded);
220
- if ($decoded['ResponseStatus'] != 0) {
221
- if (!empty($decoded['ResponseObject']) && !empty($decoded['ResponseObject']['errorMessage'])) {
222
- $errorMsg = $decoded['ResponseObject']['errorMessage'];
223
- $errorCode = $decoded['ResponseStatus'];
224
- }
225
- throw new ZooZException($errorMsg, $errorCode);
226
- }
227
-
228
- return $decoded['ResponseObject'];
229
-
230
- }
231
-
232
- /**
233
- * ZooZExtendedServerAPI destructor
234
- */
235
- function __destruct() {
236
- curl_close($this->ch);
237
- }
238
-
239
- }
240
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,18 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>ZooZ_payment</name>
4
- <version>2.0.8</version>
5
  <stability>stable</stability>
6
- <license uri="http://opensource.org/licenses/osl-3.0.php">GNU General Public License</license>
7
  <channel>community</channel>
8
  <extends/>
9
- <summary>Checkout module for higher conversions</summary>
10
- <description>Zooz is a complete checkout plugin replaces completely the standard UI and handle payment processing and shipping address.</description>
11
- <notes>Upgraded with commit and refund functionality</notes>
12
- <authors><author><name>ZooZ Payments</name><user>Zooz_Payments</user><email>info@zooz.com</email></author></authors>
13
- <date>2014-04-23</date>
14
- <time>16:26:20</time>
15
- <contents><target name="magecommunity"><dir name="ZooZ"><dir name="ZoozPayment"><dir name="Block"><file name="Abstract.php" hash="0ac3cf5751fad5f6fd8d2240adedb197"/><dir name="Estimate"><file name="Abstract.php" hash="822638b4ec0a3d0f1f39b4d9f673de5e"/><file name="Result.php" hash="e26d7b8acaeb5424a608e43127844140"/></dir><file name="Estimate.php" hash="e16de59381c39d89633b7e3e53ee6028"/><file name="Index.php" hash="bea9161ac24756a7cf0c841ad8411da9"/></dir><dir name="Helper"><file name="Carrier.php" hash="a6482b94fcb7e419a3759171d0267df6"/><file name="Data.php" hash="7ffe139c5d5b130a9939f0a03604576c"/><file name="Sanbox.php" hash="9521c1d925d462d8e7d78a3318ee3ee0"/></dir><dir name="Model"><file name="Estimate.php" hash="0fc4bfdec840ff3ed9a43c97202e4314"/><file name="Observer.php" hash="e7583aab0d5594c832a86524a8d24be5"/><file name="Order.php" hash="940864d6b424a88f77d96eab97864200"/><file name="Session.php" hash="f2ae892657034ca2d55205f0703eedde"/><dir name="Source"><file name="Action.php" hash="a63cbdc25709c8a73b83001f19da9bdf"/><file name="Status.php" hash="449c28b272bf8c663b8c29e7ff5d5789"/></dir><file name="Standard.php" hash="cfce615a9de0d56f6e6aa373931fec18"/></dir><dir name="controllers"><file name="CartController.php" hash="6c1c69df795bece32f6565acfef22f6d"/><file name="EstimateController.php" hash="4e8b5fcefe3b179d28675971a4f2e746"/><file name="IndexController.php" hash="00854f4a4d1fcc78e02ade0ae244f668"/><file name="StandardController.php" hash="aa40a54c84535d434e3c6c17230f1bb1"/></dir><dir name="etc"><file name="config.xml" hash="d5dc49c2a0bfbc60d062632352928289"/><file name="system.xml" hash="900402e07be9b23378cc3f9207965445"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="ZooZ_ZoozPayment.xml" hash="9b5ce2a8c325f210479527a1c0ebd8a9"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="zoozpayment.xml" hash="a3eaf1bf8eb27c4e20d0b30814f20d4f"/></dir><dir name="template"><dir name="zoozpayment"><file name="index.phtml" hash="c5aaccadf9379fb66c2591c060f7abb5"/><file name="result.phtml" hash="924e788ed0c118910ac098488c76324f"/><file name="review.phtml" hash="162e8a7f5548d80bfd987bd6ee0877e4"/><file name="shortcut-checkout.phtml" hash="d86c127a22f05d826997dd122efeeed6"/><file name="shortcut.phtml" hash="11eb2973b1ce3b7c948d8ed233c33bae"/><file name="sidebar.phtml" hash="2a96c03b4100bb88ba3e9e3fcaa8aa8b"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="zooz"><dir name="images"><file name="fastcheckout.png" hash="8f53be05b8c4a3903aec32745e9bf263"/><file name="loading.gif" hash="9a8269421303631316be4ab5e34870e1"/></dir><dir name="js"><file name="jquery-1.9.0.min.js" hash="6c4a706b2e324656fb77c0585c1cff55"/><file name="zooz-magento.js" hash="70e716b6bb6c50091d2bdd7bf1fa26b3"/></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="zooz"><file name="address.php" hash="40af42bf39330383e05c57bd6ba71759"/><file name="invoice.item.php" hash="37803cf953ca2dab2583cc34f80f7844"/><file name="invoice.php" hash="2e75b69bf1592243c70fd90ebaeba41a"/><file name="nvps.php" hash="cffaa4eb22d14af1ea3e69a522e21ad0"/><file name="transaction.details.php" hash="9e7fea0feb69e7468922e6fb8323a489"/><file name="user.details.php" hash="1e571f792f5e87187e1c85172a19c99d"/><file name="zooz.exception.php" hash="dc5a70ef56e64b1bc76f0407c2187f79"/><file name="zooz.extended.server.api.php" hash="f02d08bda2d088c36f34615788111dfd"/></dir></target></contents>
16
  <compatible/>
17
- <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>ZooZ_payment</name>
4
+ <version>3.0.0.1</version>
5
  <stability>stable</stability>
6
+ <license>freeware</license>
7
  <channel>community</channel>
8
  <extends/>
9
+ <summary>Zooz payments package</summary>
10
+ <description>Zooz payments package</description>
11
+ <notes>Added two new cards</notes>
12
+ <authors><author><name>CreativeMinds</name><user>cminds</user><email>wojtek@cminds.com</email></author></authors>
13
+ <date>2016-06-01</date>
14
+ <time>09:10:28</time>
15
+ <contents><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="zoozpayments"><file name="sprite-credit-card-types.png" hash="6c2e0ed5488cfeb218ceb27c5577e852"/><file name="zooz-cc.png" hash="3b66a873519785b378acfb0b0e0c8412"/><file name="zoozpayments.css" hash="3416c8bf3064c3856115f0c1b633a67f"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="zoozpayments"><file name="jquery.creditCardValidator.js" hash="17fc482f5c8c4730f28e7d0bbcabe72b"/></dir></dir></target><target name="magecommunity"><dir name="Zooz"><dir name="Payments"><dir name="Block"><dir name="Customer"><file name="Creditcard.php" hash="40ed914093d4dd8505ac5c3896cd4105"/></dir><dir name="Form"><file name="Payments.php" hash="e0fa2a7923c08b38d1d78d233bd6f38e"/></dir><dir name="Info"><file name="Payments.php" hash="b59cf3509272c9d8fa57c806ddb864c1"/></dir></dir><file name="Exception.php" hash="e49547ad5ae8f5648c30c4fab6f606ee"/><dir name="Helper"><file name="Data.php" hash="6302290885cc3007da7e49d288e7998d"/></dir><dir name="Model"><file name="Api.php" hash="fa669ab525c505dddfe29beee0991837"/><file name="Config.php" hash="4e161d3ae3248235d7a4aa5144e60fe4"/><file name="Info.php" hash="c2b148a6ea1897c64050899a6fdc6a5a"/><file name="Ipn.php" hash="c70a448eca02e5b61e8d3464637b694e"/><dir name="Mysql4"><file name="Debug.php" hash="6e5bc2f93042ba4f016f15f81483daea"/></dir><file name="Observer.php" hash="1dc74ce8e949dabf811d567a069640d0"/><dir name="Payments"><file name="Cards.php" hash="927e304e987c4020ce46c8f0d0b53912"/><file name="Request.php" hash="7a0fb26596ceacc64f3aa01987f06feb"/><file name="Result.php" hash="c9608ca92bc7bbe60511fc11b5f8d79a"/><dir name="Source"><file name="Cctype.php" hash="87ad1d9fbfeabddb0b8b38bfb690ee7e"/><file name="PaymentAction.php" hash="6be437ff22f852f2eac556923a3afdf7"/><file name="PaymentMode.php" hash="f2872cc940adfe5351d24201ad094884"/></dir></dir><file name="Payments.php" hash="c6586808b13350e7afbb87663e0c2a6f"/><dir name="Resource"><dir name="Payments"><file name="Collection.php" hash="c6a4f347e06dc35562ac08444112b6c8"/></dir><file name="Payments.php" hash="b887885de7e101d492689c793c87be65"/></dir></dir><file name="UnavailableException.php" hash="2bfdd035f35d3dffaf44e6bcb9a4f6d6"/><dir name="controllers"><dir name="Adminhtml"><dir name="Zooz"><file name="PaymentController.php" hash="3aac1119e3e861a1ba2aae00b3d59048"/></dir></dir><file name="CustomerController.php" hash="bc18086abe1860e4bb5a686dc0569c06"/><file name="IpnController.php" hash="27fc0087901fe59220758e3848159ada"/><file name="PaymentController.php" hash="62c6927dc44f346e1482abce1218523e"/></dir><dir name="etc"><file name="config.xml" hash="f562d70e504b8d1e063ba28e8bba86f4"/><file name="system.xml" hash="7da86d74bdcbffec8a6db733064e6d87"/></dir><dir name="sql"><dir name="payments_setup"><file name="install-1.0.0.0.php" hash="2e240b26b7dc6d1434aa9f78d3107b5d"/><file name="upgrade-1.0.0.0-1.0.0.1.php" hash="d59299a49ba84795fdae33321b893b48"/><file name="upgrade-1.0.0.1-1.0.0.2.php" hash="9dd0a32f5674834d06845ab5167ff7b0"/><file name="upgrade-1.0.0.2-1.0.0.3.php" hash="78826e6ca8de98fa9f76a5f17df3ebe4"/><file name="upgrade-1.0.0.3-1.0.0.4.php" hash="b4ce3ed58d9d3678268a834d4857f875"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="zoozpayments"><dir name="form"><file name="payments.phtml" hash="08e8347be54fe60c7a6175c0d47b7c98"/></dir><dir name="info"><file name="payments.phtml" hash="5b26244b93e7c079e410159e8e5a7461"/><file name="pdf.phtml" hash="d63e867c1b2269b26d7a31af16da2372"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="payments.xml" hash="6823ee1d13c4cf86ea410d17d68d49c8"/></dir><dir name="template"><dir name="zoozpayments"><dir name="checkout"><dir name="onepage"><file name="payment.phtml" hash="edb64e1fbec271a5e940972d34b3330a"/></dir><file name=".DS_Store" hash="0de33780b8186e211ff7222a9bf9fa6e"/></dir><dir name="customer"><dir name="creditcard"><file name="edit.phtml" hash="b040d06945d191a2b84b61f2362bd86d"/><file name="iframe.phtml" hash="163fb4b0adf9e53547e20f765a365897"/><file name="list.phtml" hash="45073aac94bf0bb7a91f92ce94e37ab3"/></dir></dir><dir name="form"><dir name="payments"><file name="data.phtml" hash="8e3c31eda55c15a53cf12d85cec22be6"/><file name="iframe.phtml" hash="bd7e334e2a77d7a1cb4284a2cc126e9e"/><file name="new.phtml" hash="425b79256241d921571d9f172ada1a87"/><file name="saved.phtml" hash="f28a9a69b1082da04e660bf47c5cc7ac"/></dir><file name="payments.phtml" hash="49adaae56f956bc759dab95cd59740c4"/></dir><dir name="info"><file name="payments.phtml" hash="141a8094bbeb6c95818f7b9d7dfcbc7c"/></dir><file name="redirect.phtml" hash="546a08a2999203ce90646d78f3857fe3"/><file name=".DS_Store" hash="d902c5d9c62c1d9af9b4f3f2154167e5"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Zooz_Payments.xml" hash="451f889f850d621228b70a8e24845068"/></dir></target></contents>
16
  <compatible/>
17
+ <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
18
  </package>
skin/frontend/base/default/css/zoozpayments/sprite-credit-card-types.png ADDED
Binary file
skin/frontend/base/default/css/zoozpayments/zooz-cc.png ADDED
Binary file
skin/frontend/base/default/css/zoozpayments/zoozpayments.css ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Frontend - payment process */
2
+ #payment_form_payments {
3
+ clear: both;
4
+ width: 100%;
5
+ }
6
+
7
+ div.credit-card-types {
8
+ float: left;
9
+ width: 100%;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+
14
+ ul#icons-card-types {
15
+ width: 100%;
16
+ clear: both;
17
+ }
18
+
19
+ ul#icons-card-types,
20
+ ul#icons-card-types li {
21
+ display: block;
22
+ float: left;
23
+ }
24
+
25
+ ul#icons-card-types li {
26
+ width: 40px;
27
+ height: 25px;
28
+ text-indent: -5555px;
29
+ margin-right: 3px;
30
+ background: url('zooz-cc.png') 0 0 no-repeat;
31
+ }
32
+
33
+ ul#icons-card-types li.card-type-AE {
34
+ background-position: -100px -35px;
35
+ }
36
+
37
+ ul#icons-card-types li.active-card-type-AE {
38
+ background-position: -100px 0;
39
+ }
40
+
41
+ ul#icons-card-types li.card-type-VI {
42
+ background-position: 0 -35px;
43
+ }
44
+
45
+ ul#icons-card-types li.active-card-type-VI {
46
+ background-position: 0 0;
47
+ }
48
+
49
+ ul#icons-card-types li.card-type-MC {
50
+ background-position: -50px -35px;
51
+ }
52
+
53
+ ul#icons-card-types li.active-card-type-MC {
54
+ background-position: -50px 0;
55
+ }
56
+
57
+ ul#icons-card-types li.card-type-DI {
58
+ background-position: -150px -35px;
59
+ }
60
+
61
+ ul#icons-card-types li.active-card-type-DI {
62
+ background-position: -150px 0;
63
+ }
64
+
65
+ ul#icons-card-types li.card-type-JCB {
66
+ background-position: -200px -35px;
67
+ }
68
+
69
+ ul#icons-card-types li.active-card-type-JCB {
70
+ background-position: -200px 0;
71
+ }
72
+
73
+ ul#icons-card-types li.card-type-DC {
74
+ background-position: -250px -35px;
75
+ }
76
+
77
+ ul#icons-card-types li.active-card-type-DC {
78
+ background-position: -250px 0;
79
+ }
80
+
81
+ select.month,
82
+ select.year,
83
+ select#payments_saved_card {
84
+ padding: 3px 0;
85
+ -webkit-border-radius: 2px;
86
+ -moz-border-radius: 2px;
87
+ -ms-border-radius: 2px;
88
+ -o-border-radius: 2px;
89
+ border-radius: 2px;
90
+ border: 1px solid silver;
91
+ background: #FFFFFF;
92
+ font-size: 15px;
93
+ }
94
+
95
+ select#payments_saved_card {
96
+ width: 120px;
97
+ }
98
+
99
+ /* Customer account */
100
+ .creditcard-saved li.item {
101
+ clear: both;
102
+ float: left;
103
+ width: 96%;
104
+ margin: 0 0 10px 0;
105
+ padding: 2%;
106
+ border: 1px solid #ddd;
107
+ }
108
+
109
+ .creditcard-saved li.no-entries {
110
+ border: none;
111
+ width: 100%;
112
+ padding: 0;
113
+ }
114
+
115
+ .creditcard-saved li.item title {
116
+ width: 100%;
117
+ clear: both;
118
+ float: left;
119
+ margin-bottom: 5px;
120
+ }
121
+
122
+ li#payments_cc_type_saved_cvv_div label::after,
123
+ li#payments_cc_type_cvv_div label::after {
124
+ color: #df280a;
125
+ content: " *";
126
+ font-family: "Helvetica Neue",Verdana,Arial,sans-serif;
127
+ font-size: 12px;
128
+ font-weight: normal;
129
+ }
130
+
131
+ li#payments_cc_type_saved_cvv_div label em,
132
+ li#payments_cc_type_cvv_div label em {
133
+ display: none;
134
+ }
135
+
136
+ #payments_cc_save_data .input-box {
137
+ clear: both;
138
+ width: 100%;
139
+ margin-bottom: 5px;
140
+ }
141
+
142
+ #payments_cc_save_data .input-box label,
143
+ #payments_cc_save_data .input-box input {
144
+ float: left;
145
+ display: block;
146
+ }
147
+
148
+ #payments_cc_save_data .input-box input {
149
+ margin: 3px 7px 0 0;
150
+ border: 1px solid silver;
151
+ }
152
+
153
+ .creditcard-saved li.item div.title h3,
154
+ .creditcard-saved li.item div.title div.exp-date {
155
+ width: 45%;
156
+ font-size: 16px;
157
+ font-weight: bold;
158
+ float: left;
159
+ }
160
+
161
+ .creditcard-saved li.item div.title div.exp-date {
162
+ float: right;
163
+ text-align: right;
164
+ }
165
+
166
+ .creditcard-saved li.item div.card-details {
167
+ clear: both;
168
+ float: left;
169
+ width: 100%;
170
+ }
171
+
172
+ .creditcard-saved li.item .button-set {
173
+ clear: both;
174
+ float: left;
175
+ width: 100%;
176
+ margin: 5px 0 0 0;
177
+ border-top: 1px solid #ddd;
178
+ }
179
+
180
+ .creditcard-saved li.item .button-set p {
181
+ float: right;
182
+ margin-top: 5px;
183
+ }
184
+
185
+ .creditcard-saved li.item .button-set p a {
186
+ color: #fff;
187
+ display: block;
188
+ background-color: #3399cc;
189
+ padding: 4px 7px;
190
+ text-transform: uppercase;
191
+ margin-left: 5px;
192
+ font-size: 13px;
193
+ }
194
+
195
+ .creditcard-saved li.item .button-set p a:hover {
196
+ background-color: #2E8AB8;
197
+ text-decoration: none;
198
+ }
199
+
200
+ .creditcard-new select,
201
+ .creditcard-edit select {
202
+ padding: 3px 0;
203
+ -webkit-border-radius: 2px;
204
+ -moz-border-radius: 2px;
205
+ -ms-border-radius: 2px;
206
+ -o-border-radius: 2px;
207
+ border-radius: 2px;
208
+ border: 1px solid silver;
209
+ background: #FFFFFF;
210
+ font-size: 15px;
211
+ }
212
+
213
+ .creditcard-new select:focus,
214
+ .creditcard-edit:focus {
215
+ border: 1px solid #3399cc;
216
+ }
217
+
218
+ .creditcard-new select.month,
219
+ .creditcard-edit select.month {
220
+ width: 150px;
221
+ margin-right: 10px;
222
+ }
223
+ .creditcard-new select.year,
224
+ .creditcard-edit select.year {
225
+ width: 96px;
226
+ }
227
+
228
+ .creditcard-new input.cvv,
229
+ .creditcard-edit input.cvv {
230
+ width: 5em !important;
231
+ }
232
+
233
+ /* saved / new credit card forms */
234
+ ul.cc-saved-form {
235
+ display: block;
236
+ }
237
+
238
+ ul.cc-new-form {
239
+ display: none;
240
+ }
skin/frontend/base/default/zooz/images/fastcheckout.png DELETED
Binary file
skin/frontend/base/default/zooz/images/loading.gif DELETED
Binary file
skin/frontend/base/default/zooz/js/jquery-1.9.0.min.js DELETED
@@ -1,6 +0,0 @@
1
- /*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(cn[0].contentWindow||cn[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=A(e,t),cn.detach()),bn[e]=n),n}function A(e,t){var n=st(t.createElement(e)).appendTo(t.body),r=st.css(n[0],"display");return n.remove(),r}function j(e,t,n,r){var i;if(st.isArray(t))st.each(t,function(t,i){n||kn.test(e)?r(e,i):j(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==st.type(t))r(e,t);else for(i in t)j(e+"["+i+"]",t[i],n,r)}function D(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(lt)||[];if(st.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function L(e,n,r,i){function o(u){var l;return a[u]=!0,st.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||s||a[c]?s?!(l=c):t:(n.dataTypes.unshift(c),o(c),!1)}),l}var a={},s=e===$n;return o(n.dataTypes[0])||!a["*"]&&o("*")}function H(e,n){var r,i,o=st.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((o[r]?e:i||(i={}))[r]=n[r]);return i&&st.extend(!0,e,i),e}function M(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(o in c)o in r&&(n[c[o]]=r[o]);for(;"*"===l[0];)l.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("Content-Type"));if(i)for(o in u)if(u[o]&&u[o].test(i)){l.unshift(o);break}if(l[0]in r)a=l[0];else{for(o in r){if(!l[0]||e.converters[o+" "+l[0]]){a=o;break}s||(s=o)}a=a||s}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function q(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=u[++s];)if("*"!==i){if("*"!==l&&l!==i){if(n=a[l+" "+i]||a["* "+i],!n)for(r in a)if(o=r.split(" "),o[1]===i&&(n=a[l+" "+o[0]]||a["* "+o[0]])){n===!0?n=a[r]:a[r]!==!0&&(i=o[0],u.splice(s--,0,i));break}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(c){return{state:"parsererror",error:n?c:"No conversion from "+l+" to "+i}}}l=i}return{state:"success",data:t}}function _(){try{return new e.XMLHttpRequest}catch(t){}}function F(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function O(){return setTimeout(function(){Qn=t}),Qn=st.now()}function B(e,t){st.each(t,function(t,n){for(var r=(rr[t]||[]).concat(rr["*"]),i=0,o=r.length;o>i;i++)if(r[i].call(e,t,n))return})}function P(e,t,n){var r,i,o=0,a=nr.length,s=st.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Qn||O(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:st.extend({},t),opts:st.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Qn||O(),duration:n.duration,tweens:[],createTween:function(t,n){var r=st.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(R(c,l.opts.specialEasing);a>o;o++)if(r=nr[o].call(l,e,c,l.opts))return r;return B(l,c),st.isFunction(l.opts.start)&&l.opts.start.call(e,l),st.fx.timer(st.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function R(e,t){var n,r,i,o,a;for(n in e)if(r=st.camelCase(n),i=t[r],o=e[n],st.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=st.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function W(e,t,n){var r,i,o,a,s,u,l,c,f,p=this,d=e.style,h={},g=[],m=e.nodeType&&w(e);n.queue||(c=st._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,f=c.empty.fire,c.empty.fire=function(){c.unqueued||f()}),c.unqueued++,p.always(function(){p.always(function(){c.unqueued--,st.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===st.css(e,"display")&&"none"===st.css(e,"float")&&(st.support.inlineBlockNeedsLayout&&"inline"!==S(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",st.support.shrinkWrapBlocks||p.done(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(r in t)if(o=t[r],Zn.exec(o)){if(delete t[r],u=u||"toggle"===o,o===(m?"hide":"show"))continue;g.push(r)}if(a=g.length){s=st._data(e,"fxshow")||st._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?st(e).show():p.done(function(){st(e).hide()}),p.done(function(){var t;st._removeData(e,"fxshow");for(t in h)st.style(e,t,h[t])});for(r=0;a>r;r++)i=g[r],l=p.createTween(i,m?s[i]:0),h[i]=s[i]||st.style(e,i),i in s||(s[i]=l.start,m&&(l.end=l.start,l.start="width"===i||"height"===i?1:0))}}function $(e,t,n,r,i){return new $.prototype.init(e,t,n,r,i)}function I(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=wn[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function z(e){return st.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var X,U,V=e.document,Y=e.location,J=e.jQuery,G=e.$,Q={},K=[],Z="1.9.0",et=K.concat,tt=K.push,nt=K.slice,rt=K.indexOf,it=Q.toString,ot=Q.hasOwnProperty,at=Z.trim,st=function(e,t){return new st.fn.init(e,t,X)},ut=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,lt=/\S+/g,ct=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ft=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,pt=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,dt=/^[\],:{}\s]*$/,ht=/(?:^|:|,)(?:\s*\[)+/g,gt=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,mt=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,yt=/^-ms-/,vt=/-([\da-z])/gi,bt=function(e,t){return t.toUpperCase()},xt=function(){V.addEventListener?(V.removeEventListener("DOMContentLoaded",xt,!1),st.ready()):"complete"===V.readyState&&(V.detachEvent("onreadystatechange",xt),st.ready())};st.fn=st.prototype={jquery:Z,constructor:st,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:ft.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof st?n[0]:n,st.merge(this,st.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:V,!0)),pt.test(i[1])&&st.isPlainObject(n))for(i in n)st.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=V.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=V,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):st.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),st.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return nt.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=st.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return st.each(this,e,t)},ready:function(e){return st.ready.promise().done(e),this},slice:function(){return this.pushStack(nt.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(st.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:tt,sort:[].sort,splice:[].splice},st.fn.init.prototype=st.fn,st.extend=st.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||st.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(e=arguments[u]))for(n in e)r=s[n],i=e[n],s!==i&&(c&&i&&(st.isPlainObject(i)||(o=st.isArray(i)))?(o?(o=!1,a=r&&st.isArray(r)?r:[]):a=r&&st.isPlainObject(r)?r:{},s[n]=st.extend(c,a,i)):i!==t&&(s[n]=i));return s},st.extend({noConflict:function(t){return e.$===st&&(e.$=G),t&&e.jQuery===st&&(e.jQuery=J),st},isReady:!1,readyWait:1,holdReady:function(e){e?st.readyWait++:st.ready(!0)},ready:function(e){if(e===!0?!--st.readyWait:!st.isReady){if(!V.body)return setTimeout(st.ready);st.isReady=!0,e!==!0&&--st.readyWait>0||(U.resolveWith(V,[st]),st.fn.trigger&&st(V).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===st.type(e)},isArray:Array.isArray||function(e){return"array"===st.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?Q[it.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==st.type(e)||e.nodeType||st.isWindow(e))return!1;try{if(e.constructor&&!ot.call(e,"constructor")&&!ot.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||ot.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||V;var r=pt.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=st.buildFragment([e],t,i),i&&st(i).remove(),st.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=st.trim(n),n&&dt.test(n.replace(gt,"@").replace(mt,"]").replace(ht,"")))?Function("return "+n)():(st.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||st.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&st.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(yt,"ms-").replace(vt,bt)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:at&&!at.call("\ufeff\u00a0")?function(e){return null==e?"":at.call(e)}:function(e){return null==e?"":(e+"").replace(ct,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?st.merge(r,"string"==typeof e?[e]:e):tt.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(rt)return rt.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else for(;n[o]!==t;)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),u=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&(u[u.length]=i);else for(o in e)i=t(e[o],o,r),null!=i&&(u[u.length]=i);return et.apply([],u)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(r=e[n],n=e,e=r),st.isFunction(e)?(i=nt.call(arguments,2),o=function(){return e.apply(n||this,i.concat(nt.call(arguments)))},o.guid=e.guid=e.guid||st.guid++,o):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===st.type(r)){o=!0;for(u in r)st.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,st.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(st(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),st.ready.promise=function(t){if(!U)if(U=st.Deferred(),"complete"===V.readyState)setTimeout(st.ready);else if(V.addEventListener)V.addEventListener("DOMContentLoaded",xt,!1),e.addEventListener("load",st.ready,!1);else{V.attachEvent("onreadystatechange",xt),e.attachEvent("onload",st.ready);var n=!1;try{n=null==e.frameElement&&V.documentElement}catch(r){}n&&n.doScroll&&function i(){if(!st.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}st.ready()}}()}return U.promise(t)},st.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){Q["[object "+t+"]"]=t.toLowerCase()}),X=st(V);var Tt={};st.Callbacks=function(e){e="string"==typeof e?Tt[e]||r(e):st.extend({},e);var n,i,o,a,s,u,l=[],c=!e.once&&[],f=function(t){for(n=e.memory&&t,i=!0,u=a||0,a=0,s=l.length,o=!0;l&&s>u;u++)if(l[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}o=!1,l&&(c?c.length&&f(c.shift()):n?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function r(t){st.each(t,function(t,n){var i=st.type(n);"function"===i?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==i&&r(n)})})(arguments),o?s=l.length:n&&(a=t,f(n))}return this},remove:function(){return l&&st.each(arguments,function(e,t){for(var n;(n=st.inArray(t,l,n))>-1;)l.splice(n,1),o&&(s>=n&&s--,u>=n&&u--)}),this},has:function(e){return st.inArray(e,l)>-1},empty:function(){return l=[],this},disable:function(){return l=c=n=t,this},disabled:function(){return!l},lock:function(){return c=t,n||p.disable(),this},locked:function(){return!c},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!c||(o?c.push(t):f(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},st.extend({Deferred:function(e){var t=[["resolve","done",st.Callbacks("once memory"),"resolved"],["reject","fail",st.Callbacks("once memory"),"rejected"],["notify","progress",st.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return st.Deferred(function(n){st.each(t,function(t,o){var a=o[0],s=st.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&st.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?st.extend(e,r):r}},i={};return r.pipe=r.then,st.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=nt.call(arguments),a=o.length,s=1!==a||e&&st.isFunction(e.promise)?a:0,u=1===s?e:st.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?nt.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=Array(a),n=Array(a),r=Array(a);a>i;i++)o[i]&&st.isFunction(o[i].promise)?o[i].promise().done(l(i,r,o)).fail(u.reject).progress(l(i,n,t)):--s;return s||u.resolveWith(r,o),u.promise()}}),st.support=function(){var n,r,i,o,a,s,u,l,c,f,p=V.createElement("div");if(p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=p.getElementsByTagName("*"),i=p.getElementsByTagName("a")[0],!r||!i||!r.length)return{};o=V.createElement("select"),a=o.appendChild(V.createElement("option")),s=p.getElementsByTagName("input")[0],i.style.cssText="top:1px;float:left;opacity:.5",n={getSetAttribute:"t"!==p.className,leadingWhitespace:3===p.firstChild.nodeType,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(i.getAttribute("style")),hrefNormalized:"/a"===i.getAttribute("href"),opacity:/^0.5/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:!!s.value,optSelected:a.selected,enctype:!!V.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==V.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===V.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},s.checked=!0,n.noCloneChecked=s.cloneNode(!0).checked,o.disabled=!0,n.optDisabled=!a.disabled;try{delete p.test}catch(d){n.deleteExpando=!1}s=V.createElement("input"),s.setAttribute("value",""),n.input=""===s.getAttribute("value"),s.value="t",s.setAttribute("type","radio"),n.radioValue="t"===s.value,s.setAttribute("checked","t"),s.setAttribute("name","t"),u=V.createDocumentFragment(),u.appendChild(s),n.appendChecked=s.checked,n.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,p.attachEvent&&(p.attachEvent("onclick",function(){n.noCloneEvent=!1}),p.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})p.setAttribute(l="on"+f,"t"),n[f+"Bubbles"]=l in e||p.attributes[l].expando===!1;return p.style.backgroundClip="content-box",p.cloneNode(!0).style.backgroundClip="",n.clearCloneStyle="content-box"===p.style.backgroundClip,st(function(){var r,i,o,a="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",s=V.getElementsByTagName("body")[0];s&&(r=V.createElement("div"),r.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",s.appendChild(r).appendChild(p),p.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=p.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",c=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",n.reliableHiddenOffsets=c&&0===o[0].offsetHeight,p.innerHTML="",p.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",n.boxSizing=4===p.offsetWidth,n.doesNotIncludeMarginInBodyOffset=1!==s.offsetTop,e.getComputedStyle&&(n.pixelPosition="1%"!==(e.getComputedStyle(p,null)||{}).top,n.boxSizingReliable="4px"===(e.getComputedStyle(p,null)||{width:"4px"}).width,i=p.appendChild(V.createElement("div")),i.style.cssText=p.style.cssText=a,i.style.marginRight=i.style.width="0",p.style.width="1px",n.reliableMarginRight=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight)),p.style.zoom!==t&&(p.innerHTML="",p.style.cssText=a+"width:1px;padding:1px;display:inline;zoom:1",n.inlineBlockNeedsLayout=3===p.offsetWidth,p.style.display="block",p.innerHTML="<div></div>",p.firstChild.style.width="5px",n.shrinkWrapBlocks=3!==p.offsetWidth,s.style.zoom=1),s.removeChild(r),r=p=o=i=null)}),r=o=u=a=i=s=null,n}();var wt=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,Nt=/([A-Z])/g;st.extend({cache:{},expando:"jQuery"+(Z+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?st.cache[e[st.expando]]:e[st.expando],!!e&&!s(e)},data:function(e,t,n){return i(e,t,n,!1)},removeData:function(e,t){return o(e,t,!1)},_data:function(e,t,n){return i(e,t,n,!0)},_removeData:function(e,t){return o(e,t,!0)},acceptData:function(e){var t=e.nodeName&&st.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),st.fn.extend({data:function(e,n){var r,i,o=this[0],s=0,u=null;if(e===t){if(this.length&&(u=st.data(o),1===o.nodeType&&!st._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>s;s++)i=r[s].name,i.indexOf("data-")||(i=st.camelCase(i.substring(5)),a(o,i,u[i]));st._data(o,"parsedAttrs",!0)}return u}return"object"==typeof e?this.each(function(){st.data(this,e)}):st.access(this,function(n){return n===t?o?a(o,e,st.data(o,e)):null:(this.each(function(){st.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){st.removeData(this,e)})}}),st.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=st._data(e,n),r&&(!i||st.isArray(r)?i=st._data(e,n,st.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=st.queue(e,t),r=n.length,i=n.shift(),o=st._queueHooks(e,t),a=function(){st.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return st._data(e,n)||st._data(e,n,{empty:st.Callbacks("once memory").add(function(){st._removeData(e,t+"queue"),st._removeData(e,n)})})}}),st.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?st.queue(this[0],e):n===t?this:this.each(function(){var t=st.queue(this,e,n);st._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&st.dequeue(this,e)})},dequeue:function(e){return this.each(function(){st.dequeue(this,e)})},delay:function(e,t){return e=st.fx?st.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=st.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};for("string"!=typeof e&&(n=e,e=t),e=e||"fx";s--;)r=st._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var Ct,kt,Et=/[\t\r\n]/g,St=/\r/g,At=/^(?:input|select|textarea|button|object)$/i,jt=/^(?:a|area)$/i,Dt=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,Lt=/^(?:checked|selected)$/i,Ht=st.support.getSetAttribute,Mt=st.support.input;st.fn.extend({attr:function(e,t){return st.access(this,st.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){st.removeAttr(this,e)})},prop:function(e,t){return st.access(this,st.prop,e,t,arguments.length>1)},removeProp:function(e){return e=st.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(st.isFunction(e))return this.each(function(t){st(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(lt)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Et," "):" ")){for(o=0;i=t[o++];)0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=st.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(st.isFunction(e))return this.each(function(t){st(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(lt)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Et," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");n.className=e?st.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return st.isFunction(e)?this.each(function(n){st(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n)for(var i,o=0,a=st(this),s=t,u=e.match(lt)||[];i=u[o++];)s=r?s:!a.hasClass(i),a[s?"addClass":"removeClass"](i);else("undefined"===n||"boolean"===n)&&(this.className&&st._data(this,"__className__",this.className),this.className=this.className||e===!1?"":st._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(Et," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=st.isFunction(e),this.each(function(r){var o,a=st(this);1===this.nodeType&&(o=i?e.call(this,r,a.val()):e,null==o?o="":"number"==typeof o?o+="":st.isArray(o)&&(o=st.map(o,function(e){return null==e?"":e+""})),n=st.valHooks[this.type]||st.valHooks[this.nodeName.toLowerCase()],n&&"set"in n&&n.set(this,o,"value")!==t||(this.value=o))});if(o)return n=st.valHooks[o.type]||st.valHooks[o.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(o,"value"))!==t?r:(r=o.value,"string"==typeof r?r.replace(St,""):null==r?"":r)}}}),st.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(st.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&st.nodeName(n.parentNode,"optgroup"))){if(t=st(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=st.makeArray(t);return st(e).find("option").each(function(){this.selected=st.inArray(st(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return e.getAttribute===t?st.prop(e,n,r):(a=1!==s||!st.isXMLDoc(e),a&&(n=n.toLowerCase(),o=st.attrHooks[n]||(Dt.test(n)?kt:Ct)),r===t?o&&a&&"get"in o&&null!==(i=o.get(e,n))?i:(e.getAttribute!==t&&(i=e.getAttribute(n)),null==i?t:i):null!==r?o&&a&&"set"in o&&(i=o.set(e,r,n))!==t?i:(e.setAttribute(n,r+""),r):(st.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(lt);if(o&&1===e.nodeType)for(;n=o[i++];)r=st.propFix[n]||n,Dt.test(n)?!Ht&&Lt.test(n)?e[st.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:st.attr(e,n,""),e.removeAttribute(Ht?n:r)},attrHooks:{type:{set:function(e,t){if(!st.support.radioValue&&"radio"===t&&st.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!st.isXMLDoc(e),a&&(n=st.propFix[n]||n,o=st.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):At.test(e.nodeName)||jt.test(e.nodeName)&&e.href?0:t}}}}),kt={get:function(e,n){var r=st.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?Mt&&Ht?null!=i:Lt.test(n)?e[st.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?st.removeAttr(e,n):Mt&&Ht||!Lt.test(n)?e.setAttribute(!Ht&&st.propFix[n]||n,n):e[st.camelCase("default-"+n)]=e[n]=!0,n}},Mt&&Ht||(st.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return st.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t
2
- },set:function(e,n,r){return st.nodeName(e,"input")?(e.defaultValue=n,t):Ct&&Ct.set(e,n,r)}}),Ht||(Ct=st.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},st.attrHooks.contenteditable={get:Ct.get,set:function(e,t,n){Ct.set(e,""===t?!1:t,n)}},st.each(["width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),st.support.hrefNormalized||(st.each(["href","src","width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),st.each(["href","src"],function(e,t){st.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),st.support.style||(st.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),st.support.optSelected||(st.propHooks.selected=st.extend(st.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),st.support.enctype||(st.propFix.enctype="encoding"),st.support.checkOn||st.each(["radio","checkbox"],function(){st.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),st.each(["radio","checkbox"],function(){st.valHooks[this]=st.extend(st.valHooks[this],{set:function(e,n){return st.isArray(n)?e.checked=st.inArray(st(e).val(),n)>=0:t}})});var qt=/^(?:input|select|textarea)$/i,_t=/^key/,Ft=/^(?:mouse|contextmenu)|click/,Ot=/^(?:focusinfocus|focusoutblur)$/,Bt=/^([^.]*)(?:\.(.+)|)$/;st.event={global:{},add:function(e,n,r,i,o){var a,s,u,l,c,f,p,d,h,g,m,y=3!==e.nodeType&&8!==e.nodeType&&st._data(e);if(y){for(r.handler&&(a=r,r=a.handler,o=a.selector),r.guid||(r.guid=st.guid++),(l=y.events)||(l=y.events={}),(s=y.handle)||(s=y.handle=function(e){return st===t||e&&st.event.triggered===e.type?t:st.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=(n||"").match(lt)||[""],c=n.length;c--;)u=Bt.exec(n[c])||[],h=m=u[1],g=(u[2]||"").split(".").sort(),p=st.event.special[h]||{},h=(o?p.delegateType:p.bindType)||h,p=st.event.special[h]||{},f=st.extend({type:h,origType:m,data:i,handler:r,guid:r.guid,selector:o,needsContext:o&&st.expr.match.needsContext.test(o),namespace:g.join(".")},a),(d=l[h])||(d=l[h]=[],d.delegateCount=0,p.setup&&p.setup.call(e,i,g,s)!==!1||(e.addEventListener?e.addEventListener(h,s,!1):e.attachEvent&&e.attachEvent("on"+h,s))),p.add&&(p.add.call(e,f),f.handler.guid||(f.handler.guid=r.guid)),o?d.splice(d.delegateCount++,0,f):d.push(f),st.event.global[h]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,m=st.hasData(e)&&st._data(e);if(m&&(u=m.events)){for(t=(t||"").match(lt)||[""],l=t.length;l--;)if(s=Bt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(f=st.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||st.removeEvent(e,d,m.handle),delete u[d])}else for(d in u)st.event.remove(e,d+t[l],n,r,!0);st.isEmptyObject(u)&&(delete m.handle,st._removeData(e,"events"))}},trigger:function(n,r,i,o){var a,s,u,l,c,f,p,d=[i||V],h=n.type||n,g=n.namespace?n.namespace.split("."):[];if(s=u=i=i||V,3!==i.nodeType&&8!==i.nodeType&&!Ot.test(h+st.event.triggered)&&(h.indexOf(".")>=0&&(g=h.split("."),h=g.shift(),g.sort()),c=0>h.indexOf(":")&&"on"+h,n=n[st.expando]?n:new st.Event(h,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=g.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:st.makeArray(r,[n]),p=st.event.special[h]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!st.isWindow(i)){for(l=p.delegateType||h,Ot.test(l+h)||(s=s.parentNode);s;s=s.parentNode)d.push(s),u=s;u===(i.ownerDocument||V)&&d.push(u.defaultView||u.parentWindow||e)}for(a=0;(s=d[a++])&&!n.isPropagationStopped();)n.type=a>1?l:p.bindType||h,f=(st._data(s,"events")||{})[n.type]&&st._data(s,"handle"),f&&f.apply(s,r),f=c&&s[c],f&&st.acceptData(s)&&f.apply&&f.apply(s,r)===!1&&n.preventDefault();if(n.type=h,!(o||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===h&&st.nodeName(i,"a")||!st.acceptData(i)||!c||!i[h]||st.isWindow(i))){u=i[c],u&&(i[c]=null),st.event.triggered=h;try{i[h]()}catch(m){}st.event.triggered=t,u&&(i[c]=u)}return n.result}},dispatch:function(e){e=st.event.fix(e);var n,r,i,o,a,s=[],u=nt.call(arguments),l=(st._data(this,"events")||{})[e.type]||[],c=st.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=st.event.handlers.call(this,e,l),n=0;(o=s[n++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,r=0;(a=o.handlers[r++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(a.namespace))&&(e.handleObj=a,e.data=a.data,i=((st.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u),i!==t&&(e.result=i)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(l.disabled!==!0||"click"!==e.type){for(i=[],r=0;u>r;r++)a=n[r],o=a.selector+" ",i[o]===t&&(i[o]=a.needsContext?st(o,this).index(l)>=0:st.find(o,this,null,[l]).length),i[o]&&i.push(a);i.length&&s.push({elem:l,handlers:i})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[st.expando])return e;var t,n,r=e,i=st.event.fixHooks[e.type]||{},o=i.props?this.props.concat(i.props):this.props;for(e=new st.Event(r),t=o.length;t--;)n=o[t],e[n]=r[n];return e.target||(e.target=r.srcElement||V),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,i.filter?i.filter(e,r):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,a=n.button,s=n.fromElement;return null==e.pageX&&null!=n.clientX&&(r=e.target.ownerDocument||V,i=r.documentElement,o=r.body,e.pageX=n.clientX+(i&&i.scrollLeft||o&&o.scrollLeft||0)-(i&&i.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(i&&i.scrollTop||o&&o.scrollTop||0)-(i&&i.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&s&&(e.relatedTarget=s===e.target?n.toElement:s),e.which||a===t||(e.which=1&a?1:2&a?3:4&a?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return st.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==V.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===V.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=st.extend(new st.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?st.event.trigger(i,null,t):st.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},st.removeEvent=V.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,n,r){var i="on"+n;e.detachEvent&&(e[i]===t&&(e[i]=null),e.detachEvent(i,r))},st.Event=function(e,n){return this instanceof st.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?u:l):this.type=e,n&&st.extend(this,n),this.timeStamp=e&&e.timeStamp||st.now(),this[st.expando]=!0,t):new st.Event(e,n)},st.Event.prototype={isDefaultPrevented:l,isPropagationStopped:l,isImmediatePropagationStopped:l,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=u,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=u,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u,this.stopPropagation()}},st.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){st.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!st.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),st.support.submitBubbles||(st.event.special.submit={setup:function(){return st.nodeName(this,"form")?!1:(st.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=st.nodeName(n,"input")||st.nodeName(n,"button")?n.form:t;r&&!st._data(r,"submitBubbles")&&(st.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),st._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&st.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return st.nodeName(this,"form")?!1:(st.event.remove(this,"._submit"),t)}}),st.support.changeBubbles||(st.event.special.change={setup:function(){return qt.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(st.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),st.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),st.event.simulate("change",this,e,!0)})),!1):(st.event.add(this,"beforeactivate._change",function(e){var t=e.target;qt.test(t.nodeName)&&!st._data(t,"changeBubbles")&&(st.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||st.event.simulate("change",this.parentNode,e,!0)}),st._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return st.event.remove(this,"._change"),!qt.test(this.nodeName)}}),st.support.focusinBubbles||st.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){st.event.simulate(t,e.target,st.event.fix(e),!0)};st.event.special[t]={setup:function(){0===n++&&V.addEventListener(e,r,!0)},teardown:function(){0===--n&&V.removeEventListener(e,r,!0)}}}),st.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(s in e)this.on(s,n,r,e[s],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=l;else if(!i)return this;return 1===o&&(a=i,i=function(e){return st().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=st.guid++)),this.each(function(){st.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,st(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=l),this.each(function(){st.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){st.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?st.event.trigger(e,n,r,!0):t},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),st.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){st.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)},_t.test(t)&&(st.event.fixHooks[t]=st.event.keyHooks),Ft.test(t)&&(st.event.fixHooks[t]=st.event.mouseHooks)}),function(e,t){function n(e){return ht.test(e+"")}function r(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>C.cacheLength&&delete e[t.shift()],e[n]=r}}function i(e){return e[P]=!0,e}function o(e){var t=L.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function a(e,t,n,r){var i,o,a,s,u,l,c,d,h,g;if((t?t.ownerDocument||t:R)!==L&&D(t),t=t||L,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!M&&!r){if(i=gt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&O(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return Q.apply(n,K.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&W.getByClassName&&t.getElementsByClassName)return Q.apply(n,K.call(t.getElementsByClassName(a),0)),n}if(W.qsa&&!q.test(e)){if(c=!0,d=P,h=t,g=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(l=f(e),(c=t.getAttribute("id"))?d=c.replace(vt,"\\$&"):t.setAttribute("id",d),d="[id='"+d+"'] ",u=l.length;u--;)l[u]=d+p(l[u]);h=dt.test(e)&&t.parentNode||t,g=l.join(",")}if(g)try{return Q.apply(n,K.call(h.querySelectorAll(g),0)),n}catch(m){}finally{c||t.removeAttribute("id")}}}return x(e.replace(at,"$1"),t,n,r)}function s(e,t){for(var n=e&&t&&e.nextSibling;n;n=n.nextSibling)if(n===t)return-1;return e?1:-1}function u(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return i(function(t){return t=+t,i(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function f(e,t){var n,r,i,o,s,u,l,c=X[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=C.preFilter;s;){(!n||(r=ut.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(i=[])),n=!1,(r=lt.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(at," ")}),s=s.slice(n.length));for(o in C.filter)!(r=pt[o].exec(s))||l[o]&&!(r=l[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?a.error(e):X(e,u).slice(0)}function p(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,i=n&&"parentNode"===t.dir,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=$+" "+o;if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i)if(l=t[P]||(t[P]={}),(u=l[r])&&u[0]===c){if((s=u[1])===!0||s===N)return s===!0}else if(u=l[r]=[c],u[1]=e(t,n,a)||N,u[1]===!0)return!0}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function m(e,t,n,r,o,a){return r&&!r[P]&&(r=m(r)),o&&!o[P]&&(o=m(o,a)),i(function(i,a,s,u){var l,c,f,p=[],d=[],h=a.length,m=i||b(t||"*",s.nodeType?[s]:s,[]),y=!e||!i&&t?m:g(m,p,e,s,u),v=n?o||(i?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r)for(l=g(v,d),r(l,[],s,u),c=l.length;c--;)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f));if(i){if(o||e){if(o){for(l=[],c=v.length;c--;)(f=v[c])&&l.push(y[c]=f);o(null,v=[],l,u)}for(c=v.length;c--;)(f=v[c])&&(l=o?Z.call(i,f):p[c])>-1&&(i[l]=!(a[l]=f))}}else v=g(v===a?v.splice(h,v.length):v),o?o(null,a,v,u):Q.apply(a,v)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,u=d(function(e){return e===t},a,!0),l=d(function(e){return Z.call(t,e)>-1},a,!0),c=[function(e,n,r){return!o&&(r||n!==j)||((t=n).nodeType?u(e,n,r):l(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])c=[d(h(c),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return m(s>1&&h(c),s>1&&p(e.slice(0,s-1)).replace(at,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&p(e))}c.push(n)}return h(c)}function v(e,t){var n=0,r=t.length>0,o=e.length>0,s=function(i,s,u,l,c){var f,p,d,h=[],m=0,y="0",v=i&&[],b=null!=c,x=j,T=i||o&&C.find.TAG("*",c&&s.parentNode||s),w=$+=null==x?1:Math.E;for(b&&(j=s!==L&&s,N=n);null!=(f=T[y]);y++){if(o&&f){for(p=0;d=e[p];p++)if(d(f,s,u)){l.push(f);break}b&&($=w,N=++n)}r&&((f=!d&&f)&&m--,i&&v.push(f))}if(m+=y,r&&y!==m){for(p=0;d=t[p];p++)d(v,h,s,u);if(i){if(m>0)for(;y--;)v[y]||h[y]||(h[y]=G.call(l));h=g(h)}Q.apply(l,h),b&&!i&&h.length>0&&m+t.length>1&&a.uniqueSort(l)}return b&&($=w,j=x),v};return r?i(s):s}function b(e,t,n){for(var r=0,i=t.length;i>r;r++)a(e,t[r],n);return n}function x(e,t,n,r){var i,o,a,s,u,l=f(e);if(!r&&1===l.length){if(o=l[0]=l[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&9===t.nodeType&&!M&&C.relative[o[1].type]){if(t=C.find.ID(a.matches[0].replace(xt,Tt),t)[0],!t)return n;e=e.slice(o.shift().value.length)}for(i=pt.needsContext.test(e)?-1:o.length-1;i>=0&&(a=o[i],!C.relative[s=a.type]);i--)if((u=C.find[s])&&(r=u(a.matches[0].replace(xt,Tt),dt.test(o[0].type)&&t.parentNode||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return Q.apply(n,K.call(r,0)),n;break}}return S(e,l)(r,t,M,n,dt.test(e)),n}function T(){}var w,N,C,k,E,S,A,j,D,L,H,M,q,_,F,O,B,P="sizzle"+-new Date,R=e.document,W={},$=0,I=0,z=r(),X=r(),U=r(),V=typeof t,Y=1<<31,J=[],G=J.pop,Q=J.push,K=J.slice,Z=J.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},et="[\\x20\\t\\r\\n\\f]",tt="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",nt=tt.replace("w","w#"),rt="([*^$|!~]?=)",it="\\["+et+"*("+tt+")"+et+"*(?:"+rt+et+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+nt+")|)|)"+et+"*\\]",ot=":("+tt+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+it.replace(3,8)+")*)|.*)\\)|)",at=RegExp("^"+et+"+|((?:^|[^\\\\])(?:\\\\.)*)"+et+"+$","g"),ut=RegExp("^"+et+"*,"+et+"*"),lt=RegExp("^"+et+"*([\\x20\\t\\r\\n\\f>+~])"+et+"*"),ct=RegExp(ot),ft=RegExp("^"+nt+"$"),pt={ID:RegExp("^#("+tt+")"),CLASS:RegExp("^\\.("+tt+")"),NAME:RegExp("^\\[name=['\"]?("+tt+")['\"]?\\]"),TAG:RegExp("^("+tt.replace("w","w*")+")"),ATTR:RegExp("^"+it),PSEUDO:RegExp("^"+ot),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+et+"*(even|odd|(([+-]|)(\\d*)n|)"+et+"*(?:([+-]|)"+et+"*(\\d+)|))"+et+"*\\)|)","i"),needsContext:RegExp("^"+et+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+et+"*((?:-\\d)?\\d*)"+et+"*\\)|)(?=[^-]|$)","i")},dt=/[\x20\t\r\n\f]*[+~]/,ht=/\{\s*\[native code\]\s*\}/,gt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,mt=/^(?:input|select|textarea|button)$/i,yt=/^h\d$/i,vt=/'|\\/g,bt=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,xt=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,Tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{K.call(H.childNodes,0)[0].nodeType}catch(wt){K=function(e){for(var t,n=[];t=this[e];e++)n.push(t);return n}}E=a.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},D=a.setDocument=function(e){var r=e?e.ownerDocument||e:R;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=r.documentElement,M=E(r),W.tagNameNoComments=o(function(e){return e.appendChild(r.createComment("")),!e.getElementsByTagName("*").length}),W.attributes=o(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),W.getByClassName=o(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),W.getByName=o(function(e){e.id=P+0,e.innerHTML="<a name='"+P+"'></a><div name='"+P+"'></div>",H.insertBefore(e,H.firstChild);var t=r.getElementsByName&&r.getElementsByName(P).length===2+r.getElementsByName(P+0).length;return W.getIdNotName=!r.getElementById(P),H.removeChild(e),t}),C.attrHandle=o(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==V&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},W.getIdNotName?(C.find.ID=function(e,t){if(typeof t.getElementById!==V&&!M){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},C.filter.ID=function(e){var t=e.replace(xt,Tt);return function(e){return e.getAttribute("id")===t}}):(C.find.ID=function(e,n){if(typeof n.getElementById!==V&&!M){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==V&&r.getAttributeNode("id").value===e?[r]:t:[]}},C.filter.ID=function(e){var t=e.replace(xt,Tt);return function(e){var n=typeof e.getAttributeNode!==V&&e.getAttributeNode("id");return n&&n.value===t}}),C.find.TAG=W.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==V?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i];i++)1===n.nodeType&&r.push(n);return r}return o},C.find.NAME=W.getByName&&function(e,n){return typeof n.getElementsByName!==V?n.getElementsByName(name):t},C.find.CLASS=W.getByClassName&&function(e,n){return typeof n.getElementsByClassName===V||M?t:n.getElementsByClassName(e)},_=[],q=[":focus"],(W.qsa=n(r.querySelectorAll))&&(o(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||q.push("\\["+et+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||q.push(":checked")}),o(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&q.push("[*^$]="+et+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),q.push(",.*:")})),(W.matchesSelector=n(F=H.matchesSelector||H.mozMatchesSelector||H.webkitMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){W.disconnectedMatch=F.call(e,"div"),F.call(e,"[s!='']:x"),_.push("!=",ot)}),q=RegExp(q.join("|")),_=RegExp(_.join("|")),O=n(H.contains)||H.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},B=H.compareDocumentPosition?function(e,t){var n;return e===t?(A=!0,0):(n=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&n||e.parentNode&&11===e.parentNode.nodeType?e===r||O(R,e)?-1:t===r||O(R,t)?1:0:4&n?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var n,i=0,o=e.parentNode,a=t.parentNode,u=[e],l=[t];if(e===t)return A=!0,0;if(e.sourceIndex&&t.sourceIndex)return(~t.sourceIndex||Y)-(O(R,e)&&~e.sourceIndex||Y);if(!o||!a)return e===r?-1:t===r?1:o?-1:a?1:0;if(o===a)return s(e,t);for(n=e;n=n.parentNode;)u.unshift(n);for(n=t;n=n.parentNode;)l.unshift(n);for(;u[i]===l[i];)i++;return i?s(u[i],l[i]):u[i]===R?-1:l[i]===R?1:0},A=!1,[0,0].sort(B),W.detectDuplicates=A,L):L},a.matches=function(e,t){return a(e,null,null,t)},a.matchesSelector=function(e,t){if((e.ownerDocument||e)!==L&&D(e),t=t.replace(bt,"='$1']"),!(!W.matchesSelector||M||_&&_.test(t)||q.test(t)))try{var n=F.call(e,t);if(n||W.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return a(t,L,null,[e]).length>0},a.contains=function(e,t){return(e.ownerDocument||e)!==L&&D(e),O(e,t)},a.attr=function(e,t){var n;return(e.ownerDocument||e)!==L&&D(e),M||(t=t.toLowerCase()),(n=C.attrHandle[t])?n(e):M||W.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},a.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},a.uniqueSort=function(e){var t,n=[],r=1,i=0;if(A=!W.detectDuplicates,e.sort(B),A){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));for(;i--;)e.splice(n[i],1)}return e},k=a.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=k(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=k(t);return n},C=a.selectors={cacheLength:50,createPseudo:i,match:pt,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xt,Tt),e[3]=(e[4]||e[5]||"").replace(xt,Tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||a.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&a.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return pt.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&ct.test(n)&&(t=f(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(xt,Tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=z[e+" "];return t||(t=RegExp("(^|"+et+")"+e+"("+et+"|$)"))&&z(e,function(e){return t.test(e.className||typeof e.getAttribute!==V&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=a.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.substr(i.length-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){for(;g;){for(f=t;f=f[g];)if(s?f.nodeName.toLowerCase()===y:1===f.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(c=m[P]||(m[P]={}),l=c[e]||[],d=l[0]===$&&l[1],p=l[0]===$&&l[2],f=d&&m.childNodes[d];f=++d&&f&&f[g]||(p=d=0)||h.pop();)if(1===f.nodeType&&++p&&f===t){c[e]=[$,d,p];break}}else if(v&&(l=(t[P]||(t[P]={}))[e])&&l[0]===$)p=l[1];else for(;(f=++d&&f&&f[g]||(p=d=0)||h.pop())&&((s?f.nodeName.toLowerCase()!==y:1!==f.nodeType)||!++p||(v&&((f[P]||(f[P]={}))[e]=[$,p]),f!==t)););return p-=i,p===r||0===p%r&&p/r>=0}}},PSEUDO:function(e,t){var n,r=C.pseudos[e]||C.setFilters[e.toLowerCase()]||a.error("unsupported pseudo: "+e);return r[P]?r(t):r.length>1?(n=[e,e,"",t],C.setFilters.hasOwnProperty(e.toLowerCase())?i(function(e,n){for(var i,o=r(e,t),a=o.length;a--;)i=Z.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:i(function(e){var t=[],n=[],r=S(e.replace(at,"$1"));return r[P]?i(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:i(function(e){return function(t){return a(e,t).length>0}}),contains:i(function(e){return function(t){return(t.textContent||t.innerText||k(t)).indexOf(e)>-1}}),lang:i(function(e){return ft.test(e||"")||a.error("unsupported lang: "+e),e=e.replace(xt,Tt).toLowerCase(),function(t){var n;do if(n=M?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return yt.test(e.nodeName)},input:function(e){return mt.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;t>++r;)e.push(r);return e})}};for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=u(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=l(w);S=a.compile=function(e,t){var n,r=[],i=[],o=U[e+" "];if(!o){for(t||(t=f(e)),n=t.length;n--;)o=y(t[n]),o[P]?r.push(o):i.push(o);o=U(e,v(i,r))}return o},C.pseudos.nth=C.pseudos.eq,C.filters=T.prototype=C.pseudos,C.setFilters=new T,D(),a.attr=st.attr,st.find=a,st.expr=a.selectors,st.expr[":"]=st.expr.pseudos,st.unique=a.uniqueSort,st.text=a.getText,st.isXMLDoc=a.isXML,st.contains=a.contains}(e);var Pt=/Until$/,Rt=/^(?:parents|prev(?:Until|All))/,Wt=/^.[^:#\[\.,]*$/,$t=st.expr.match.needsContext,It={children:!0,contents:!0,next:!0,prev:!0};st.fn.extend({find:function(e){var t,n,r;if("string"!=typeof e)return r=this,this.pushStack(st(e).filter(function(){for(t=0;r.length>t;t++)if(st.contains(r[t],this))return!0}));for(n=[],t=0;this.length>t;t++)st.find(e,this[t],n);return n=this.pushStack(st.unique(n)),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=st(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(st.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(f(this,e,!1))},filter:function(e){return this.pushStack(f(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?$t.test(e)?st(e,this.context).index(this[0])>=0:st.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=$t.test(e)||"string"!=typeof e?st(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n.ownerDocument&&n!==t&&11!==n.nodeType;){if(a?a.index(n)>-1:st.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return this.pushStack(o.length>1?st.unique(o):o)},index:function(e){return e?"string"==typeof e?st.inArray(this[0],st(e)):st.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?st(e,t):st.makeArray(e&&e.nodeType?[e]:e),r=st.merge(this.get(),n);return this.pushStack(st.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),st.fn.andSelf=st.fn.addBack,st.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return st.dir(e,"parentNode")},parentsUntil:function(e,t,n){return st.dir(e,"parentNode",n)},next:function(e){return c(e,"nextSibling")},prev:function(e){return c(e,"previousSibling")
3
- },nextAll:function(e){return st.dir(e,"nextSibling")},prevAll:function(e){return st.dir(e,"previousSibling")},nextUntil:function(e,t,n){return st.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return st.dir(e,"previousSibling",n)},siblings:function(e){return st.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return st.sibling(e.firstChild)},contents:function(e){return st.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:st.merge([],e.childNodes)}},function(e,t){st.fn[e]=function(n,r){var i=st.map(this,t,n);return Pt.test(e)||(r=n),r&&"string"==typeof r&&(i=st.filter(r,i)),i=this.length>1&&!It[e]?st.unique(i):i,this.length>1&&Rt.test(e)&&(i=i.reverse()),this.pushStack(i)}}),st.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?st.find.matchesSelector(t[0],e)?[t[0]]:[]:st.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!st(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var zt="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Xt=/ jQuery\d+="(?:null|\d+)"/g,Ut=RegExp("<(?:"+zt+")[\\s/>]","i"),Vt=/^\s+/,Yt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Jt=/<([\w:]+)/,Gt=/<tbody/i,Qt=/<|&#?\w+;/,Kt=/<(?:script|style|link)/i,Zt=/^(?:checkbox|radio)$/i,en=/checked\s*(?:[^=]|=\s*.checked.)/i,tn=/^$|\/(?:java|ecma)script/i,nn=/^true\/(.*)/,rn=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,on={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:st.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},an=p(V),sn=an.appendChild(V.createElement("div"));on.optgroup=on.option,on.tbody=on.tfoot=on.colgroup=on.caption=on.thead,on.th=on.td,st.fn.extend({text:function(e){return st.access(this,function(e){return e===t?st.text(this):this.empty().append((this[0]&&this[0].ownerDocument||V).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(st.isFunction(e))return this.each(function(t){st(this).wrapAll(e.call(this,t))});if(this[0]){var t=st(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return st.isFunction(e)?this.each(function(t){st(this).wrapInner(e.call(this,t))}):this.each(function(){var t=st(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=st.isFunction(e);return this.each(function(n){st(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){st.nodeName(this,"body")||st(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||st.filter(e,[n]).length>0)&&(t||1!==n.nodeType||st.cleanData(b(n)),n.parentNode&&(t&&st.contains(n.ownerDocument,n)&&m(b(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&st.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&st.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return st.clone(this,e,t)})},html:function(e){return st.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(Xt,""):t;if(!("string"!=typeof e||Kt.test(e)||!st.support.htmlSerialize&&Ut.test(e)||!st.support.leadingWhitespace&&Vt.test(e)||on[(Jt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(Yt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(st.cleanData(b(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=st.isFunction(e);return t||"string"==typeof e||(e=st(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;(n&&1===this.nodeType||11===this.nodeType)&&(st(this).remove(),t?t.parentNode.insertBefore(e,t):n.appendChild(e))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=et.apply([],e);var i,o,a,s,u,l,c=0,f=this.length,p=this,m=f-1,y=e[0],v=st.isFunction(y);if(v||!(1>=f||"string"!=typeof y||st.support.checkClone)&&en.test(y))return this.each(function(i){var o=p.eq(i);v&&(e[0]=y.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(f&&(i=st.buildFragment(e,this[0].ownerDocument,!1,this),o=i.firstChild,1===i.childNodes.length&&(i=o),o)){for(n=n&&st.nodeName(o,"tr"),a=st.map(b(i,"script"),h),s=a.length;f>c;c++)u=i,c!==m&&(u=st.clone(u,!0,!0),s&&st.merge(a,b(u,"script"))),r.call(n&&st.nodeName(this[c],"table")?d(this[c],"tbody"):this[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,st.map(a,g),c=0;s>c;c++)u=a[c],tn.test(u.type||"")&&!st._data(u,"globalEval")&&st.contains(l,u)&&(u.src?st.ajax({url:u.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):st.globalEval((u.text||u.textContent||u.innerHTML||"").replace(rn,"")));i=o=null}return this}}),st.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){st.fn[e]=function(e){for(var n,r=0,i=[],o=st(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),st(o[r])[t](n),tt.apply(i,n.get());return this.pushStack(i)}}),st.extend({clone:function(e,t,n){var r,i,o,a,s,u=st.contains(e.ownerDocument,e);if(st.support.html5Clone||st.isXMLDoc(e)||!Ut.test("<"+e.nodeName+">")?s=e.cloneNode(!0):(sn.innerHTML=e.outerHTML,sn.removeChild(s=sn.firstChild)),!(st.support.noCloneEvent&&st.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||st.isXMLDoc(e)))for(r=b(s),i=b(e),a=0;null!=(o=i[a]);++a)r[a]&&v(o,r[a]);if(t)if(n)for(i=i||b(e),r=r||b(s),a=0;null!=(o=i[a]);a++)y(o,r[a]);else y(e,s);return r=b(s,"script"),r.length>0&&m(r,!u&&b(e,"script")),r=i=o=null,s},buildFragment:function(e,t,n,r){for(var i,o,a,s,u,l,c,f=e.length,d=p(t),h=[],g=0;f>g;g++)if(o=e[g],o||0===o)if("object"===st.type(o))st.merge(h,o.nodeType?[o]:o);else if(Qt.test(o)){for(s=s||d.appendChild(t.createElement("div")),a=(Jt.exec(o)||["",""])[1].toLowerCase(),u=on[a]||on._default,s.innerHTML=u[1]+o.replace(Yt,"<$1></$2>")+u[2],c=u[0];c--;)s=s.lastChild;if(!st.support.leadingWhitespace&&Vt.test(o)&&h.push(t.createTextNode(Vt.exec(o)[0])),!st.support.tbody)for(o="table"!==a||Gt.test(o)?"<table>"!==u[1]||Gt.test(o)?0:s:s.firstChild,c=o&&o.childNodes.length;c--;)st.nodeName(l=o.childNodes[c],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(st.merge(h,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=d.lastChild}else h.push(t.createTextNode(o));for(s&&d.removeChild(s),st.support.appendChecked||st.grep(b(h,"input"),x),g=0;o=h[g++];)if((!r||-1===st.inArray(o,r))&&(i=st.contains(o.ownerDocument,o),s=b(d.appendChild(o),"script"),i&&m(s),n))for(c=0;o=s[c++];)tn.test(o.type||"")&&n.push(o);return s=null,d},cleanData:function(e,n){for(var r,i,o,a,s=0,u=st.expando,l=st.cache,c=st.support.deleteExpando,f=st.event.special;null!=(o=e[s]);s++)if((n||st.acceptData(o))&&(i=o[u],r=i&&l[i])){if(r.events)for(a in r.events)f[a]?st.event.remove(o,a):st.removeEvent(o,a,r.handle);l[i]&&(delete l[i],c?delete o[u]:o.removeAttribute!==t?o.removeAttribute(u):o[u]=null,K.push(i))}}});var un,ln,cn,fn=/alpha\([^)]*\)/i,pn=/opacity\s*=\s*([^)]*)/,dn=/^(top|right|bottom|left)$/,hn=/^(none|table(?!-c[ea]).+)/,gn=/^margin/,mn=RegExp("^("+ut+")(.*)$","i"),yn=RegExp("^("+ut+")(?!px)[a-z%]+$","i"),vn=RegExp("^([+-])=("+ut+")","i"),bn={BODY:"block"},xn={position:"absolute",visibility:"hidden",display:"block"},Tn={letterSpacing:0,fontWeight:400},wn=["Top","Right","Bottom","Left"],Nn=["Webkit","O","Moz","ms"];st.fn.extend({css:function(e,n){return st.access(this,function(e,n,r){var i,o,a={},s=0;if(st.isArray(n)){for(i=ln(e),o=n.length;o>s;s++)a[n[s]]=st.css(e,n[s],!1,i);return a}return r!==t?st.style(e,n,r):st.css(e,n)},e,n,arguments.length>1)},show:function(){return N(this,!0)},hide:function(){return N(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:w(this))?st(this).show():st(this).hide()})}}),st.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=un(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":st.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=st.camelCase(n),l=e.style;if(n=st.cssProps[u]||(st.cssProps[u]=T(l,u)),s=st.cssHooks[n]||st.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=vn.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(st.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||st.cssNumber[u]||(r+="px"),st.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=st.camelCase(n);return n=st.cssProps[u]||(st.cssProps[u]=T(e.style,u)),s=st.cssHooks[n]||st.cssHooks[u],s&&"get"in s&&(o=s.get(e,!0,r)),o===t&&(o=un(e,n,i)),"normal"===o&&n in Tn&&(o=Tn[n]),r?(a=parseFloat(o),r===!0||st.isNumeric(a)?a||0:o):o},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(ln=function(t){return e.getComputedStyle(t,null)},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||st.contains(e.ownerDocument,e)||(u=st.style(e,n)),yn.test(u)&&gn.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):V.documentElement.currentStyle&&(ln=function(e){return e.currentStyle},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),yn.test(u)&&!dn.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),st.each(["height","width"],function(e,n){st.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&hn.test(st.css(e,"display"))?st.swap(e,xn,function(){return E(e,n,i)}):E(e,n,i):t},set:function(e,t,r){var i=r&&ln(e);return C(e,t,r?k(e,n,r,st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,i),i):0)}}}),st.support.opacity||(st.cssHooks.opacity={get:function(e,t){return pn.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=st.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===st.trim(o.replace(fn,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=fn.test(o)?o.replace(fn,i):o+" "+i)}}),st(function(){st.support.reliableMarginRight||(st.cssHooks.marginRight={get:function(e,n){return n?st.swap(e,{display:"inline-block"},un,[e,"marginRight"]):t}}),!st.support.pixelPosition&&st.fn.position&&st.each(["top","left"],function(e,n){st.cssHooks[n]={get:function(e,r){return r?(r=un(e,n),yn.test(r)?st(e).position()[n]+"px":r):t}}})}),st.expr&&st.expr.filters&&(st.expr.filters.hidden=function(e){return 0===e.offsetWidth&&0===e.offsetHeight||!st.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||st.css(e,"display"))},st.expr.filters.visible=function(e){return!st.expr.filters.hidden(e)}),st.each({margin:"",padding:"",border:"Width"},function(e,t){st.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+wn[r]+t]=o[r]||o[r-2]||o[0];return i}},gn.test(e)||(st.cssHooks[e+t].set=C)});var Cn=/%20/g,kn=/\[\]$/,En=/\r?\n/g,Sn=/^(?:submit|button|image|reset)$/i,An=/^(?:input|select|textarea|keygen)/i;st.fn.extend({serialize:function(){return st.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=st.prop(this,"elements");return e?st.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!st(this).is(":disabled")&&An.test(this.nodeName)&&!Sn.test(e)&&(this.checked||!Zt.test(e))}).map(function(e,t){var n=st(this).val();return null==n?null:st.isArray(n)?st.map(n,function(e){return{name:t.name,value:e.replace(En,"\r\n")}}):{name:t.name,value:n.replace(En,"\r\n")}}).get()}}),st.param=function(e,n){var r,i=[],o=function(e,t){t=st.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=st.ajaxSettings&&st.ajaxSettings.traditional),st.isArray(e)||e.jquery&&!st.isPlainObject(e))st.each(e,function(){o(this.name,this.value)});else for(r in e)j(r,e[r],n,o);return i.join("&").replace(Cn,"+")};var jn,Dn,Ln=st.now(),Hn=/\?/,Mn=/#.*$/,qn=/([?&])_=[^&]*/,_n=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Fn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,On=/^(?:GET|HEAD)$/,Bn=/^\/\//,Pn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Rn=st.fn.load,Wn={},$n={},In="*/".concat("*");try{Dn=Y.href}catch(zn){Dn=V.createElement("a"),Dn.href="",Dn=Dn.href}jn=Pn.exec(Dn.toLowerCase())||[],st.fn.load=function(e,n,r){if("string"!=typeof e&&Rn)return Rn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),st.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(o="POST"),s.length>0&&st.ajax({url:e,type:o,dataType:"html",data:n}).done(function(e){a=arguments,s.html(i?st("<div>").append(st.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,a||[e.responseText,t,e])}),this},st.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){st.fn[t]=function(e){return this.on(t,e)}}),st.each(["get","post"],function(e,n){st[n]=function(e,r,i,o){return st.isFunction(r)&&(o=o||i,i=r,r=t),st.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),st.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Dn,type:"GET",isLocal:Fn.test(jn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":In,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":st.parseJSON,"text xml":st.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?H(H(e,st.ajaxSettings),t):H(st.ajaxSettings,e)},ajaxPrefilter:D(Wn),ajaxTransport:D($n),ajax:function(e,n){function r(e,n,r,s){var l,f,v,b,T,N=n;2!==x&&(x=2,u&&clearTimeout(u),i=t,a=s||"",w.readyState=e>0?4:0,r&&(b=M(p,w,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=w.getResponseHeader("Last-Modified"),T&&(st.lastModified[o]=T),T=w.getResponseHeader("etag"),T&&(st.etag[o]=T)),304===e?(l=!0,N="notmodified"):(l=q(p,b),N=l.state,f=l.data,v=l.error,l=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),w.status=e,w.statusText=(n||N)+"",l?g.resolveWith(d,[f,N,w]):g.rejectWith(d,[w,N,v]),w.statusCode(y),y=t,c&&h.trigger(l?"ajaxSuccess":"ajaxError",[w,p,l?f:v]),m.fireWith(d,[w,N]),c&&(h.trigger("ajaxComplete",[w,p]),--st.active||st.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var i,o,a,s,u,l,c,f,p=st.ajaxSetup({},n),d=p.context||p,h=p.context&&(d.nodeType||d.jquery)?st(d):st.event,g=st.Deferred(),m=st.Callbacks("once memory"),y=p.statusCode||{},v={},b={},x=0,T="canceled",w={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!s)for(s={};t=_n.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=b[n]=b[n]||e,v[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)y[t]=[y[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||T;return i&&i.abort(t),r(0,t),this}};if(g.promise(w).complete=m.add,w.success=w.done,w.error=w.fail,p.url=((e||p.url||Dn)+"").replace(Mn,"").replace(Bn,jn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=st.trim(p.dataType||"*").toLowerCase().match(lt)||[""],null==p.crossDomain&&(l=Pn.exec(p.url.toLowerCase()),p.crossDomain=!(!l||l[1]===jn[1]&&l[2]===jn[2]&&(l[3]||("http:"===l[1]?80:443))==(jn[3]||("http:"===jn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=st.param(p.data,p.traditional)),L(Wn,p,n,w),2===x)return w;c=p.global,c&&0===st.active++&&st.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!On.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(Hn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=qn.test(o)?o.replace(qn,"$1_="+Ln++):o+(Hn.test(o)?"&":"?")+"_="+Ln++)),p.ifModified&&(st.lastModified[o]&&w.setRequestHeader("If-Modified-Since",st.lastModified[o]),st.etag[o]&&w.setRequestHeader("If-None-Match",st.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",p.contentType),w.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+In+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)w.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(p.beforeSend.call(d,w,p)===!1||2===x))return w.abort();T="abort";for(f in{success:1,error:1,complete:1})w[f](p[f]);if(i=L($n,p,n,w)){w.readyState=1,c&&h.trigger("ajaxSend",[w,p]),p.async&&p.timeout>0&&(u=setTimeout(function(){w.abort("timeout")},p.timeout));try{x=1,i.send(v,r)}catch(N){if(!(2>x))throw N;r(-1,N)}}else r(-1,"No Transport");return w},getScript:function(e,n){return st.get(e,t,n,"script")},getJSON:function(e,t,n){return st.get(e,t,n,"json")}}),st.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return st.globalEval(e),e}}}),st.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),st.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=V.head||st("head")[0]||V.documentElement;return{send:function(t,i){n=V.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Xn=[],Un=/(=)\?(?=&|$)|\?\?/;st.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xn.pop()||st.expando+"_"+Ln++;return this[e]=!0,e}}),st.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Un.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Un.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=st.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Un,"$1"+o):n.jsonp!==!1&&(n.url+=(Hn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||st.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Xn.push(o)),s&&st.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Vn,Yn,Jn=0,Gn=e.ActiveXObject&&function(){var e;for(e in Vn)Vn[e](t,!0)};st.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&_()||F()}:_,Yn=st.ajaxSettings.xhr(),st.support.cors=!!Yn&&"withCredentials"in Yn,Yn=st.support.ajax=!!Yn,Yn&&st.ajaxTransport(function(n){if(!n.crossDomain||st.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,f,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=st.noop,Gn&&delete Vn[a]),i)4!==u.readyState&&u.abort();else{f={},s=u.status,p=u.responseXML,c=u.getAllResponseHeaders(),p&&p.documentElement&&(f.xml=p),"string"==typeof u.responseText&&(f.text=u.responseText);try{l=u.statusText}catch(d){l=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(s,l,f,c)},n.async?4===u.readyState?setTimeout(r):(a=++Jn,Gn&&(Vn||(Vn={},st(e).unload(Gn)),Vn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Qn,Kn,Zn=/^(?:toggle|show|hide)$/,er=RegExp("^(?:([+-])=|)("+ut+")([a-z%]*)$","i"),tr=/queueHooks$/,nr=[W],rr={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=er.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(st.cssNumber[e]?"":"px"),"px"!==r&&s){s=st.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,st.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};st.Animation=st.extend(P,{tweener:function(e,t){st.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],rr[n]=rr[n]||[],rr[n].unshift(t)},prefilter:function(e,t){t?nr.unshift(e):nr.push(e)}}),st.Tween=$,$.prototype={constructor:$,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(st.cssNumber[n]?"":"px")},cur:function(){var e=$.propHooks[this.prop];return e&&e.get?e.get(this):$.propHooks._default.get(this)},run:function(e){var t,n=$.propHooks[this.prop];return this.pos=t=this.options.duration?st.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):$.propHooks._default.set(this),this}},$.prototype.init.prototype=$.prototype,$.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=st.css(e.elem,e.prop,"auto"),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){st.fx.step[e.prop]?st.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[st.cssProps[e.prop]]||st.cssHooks[e.prop])?st.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},$.propHooks.scrollTop=$.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},st.each(["toggle","show","hide"],function(e,t){var n=st.fn[t];st.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(I(t,!0),e,r,i)}}),st.fn.extend({fadeTo:function(e,t,n,r){return this.filter(w).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=st.isEmptyObject(e),o=st.speed(t,n,r),a=function(){var t=P(this,st.extend({},e),o);a.finish=function(){t.stop(!0)},(i||st._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=st.timers,a=st._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&tr.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&st.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=st._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=st.timers,a=r?r.length:0;for(n.finish=!0,st.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),st.each({slideDown:I("show"),slideUp:I("hide"),slideToggle:I("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){st.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),st.speed=function(e,t,n){var r=e&&"object"==typeof e?st.extend({},e):{complete:n||!n&&t||st.isFunction(e)&&e,duration:e,easing:n&&t||t&&!st.isFunction(t)&&t};return r.duration=st.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in st.fx.speeds?st.fx.speeds[r.duration]:st.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){st.isFunction(r.old)&&r.old.call(this),r.queue&&st.dequeue(this,r.queue)},r},st.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},st.timers=[],st.fx=$.prototype.init,st.fx.tick=function(){var e,n=st.timers,r=0;for(Qn=st.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||st.fx.stop(),Qn=t},st.fx.timer=function(e){e()&&st.timers.push(e)&&st.fx.start()},st.fx.interval=13,st.fx.start=function(){Kn||(Kn=setInterval(st.fx.tick,st.fx.interval))},st.fx.stop=function(){clearInterval(Kn),Kn=null},st.fx.speeds={slow:600,fast:200,_default:400},st.fx.step={},st.expr&&st.expr.filters&&(st.expr.filters.animated=function(e){return st.grep(st.timers,function(t){return e===t.elem}).length}),st.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){st.offset.setOffset(this,e,t)});var n,r,i={top:0,left:0},o=this[0],a=o&&o.ownerDocument;if(a)return n=a.documentElement,st.contains(n,o)?(o.getBoundingClientRect!==t&&(i=o.getBoundingClientRect()),r=z(a),{top:i.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:i.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):i},st.offset={setOffset:function(e,t,n){var r=st.css(e,"position");"static"===r&&(e.style.position="relative");var i,o,a=st(e),s=a.offset(),u=st.css(e,"top"),l=st.css(e,"left"),c=("absolute"===r||"fixed"===r)&&st.inArray("auto",[u,l])>-1,f={},p={};c?(p=a.position(),i=p.top,o=p.left):(i=parseFloat(u)||0,o=parseFloat(l)||0),st.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+i),null!=t.left&&(f.left=t.left-s.left+o),"using"in t?t.using.call(e,f):a.css(f)}},st.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===st.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),st.nodeName(e[0],"html")||(n=e.offset()),n.top+=st.css(e[0],"borderTopWidth",!0),n.left+=st.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-st.css(r,"marginTop",!0),left:t.left-n.left-st.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||V.documentElement;e&&!st.nodeName(e,"html")&&"static"===st.css(e,"position");)e=e.offsetParent;return e||V.documentElement})}}),st.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);st.fn[e]=function(i){return st.access(this,function(e,i,o){var a=z(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?st(a).scrollLeft():o,r?o:st(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}}),st.each({Height:"height",Width:"width"},function(e,n){st.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){st.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return st.access(this,function(n,r,i){var o;return st.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?st.css(n,r,s):st.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=st,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return st})})(window);
4
- //@ sourceMappingURL=jquery.min.map
5
-
6
- jQuery.noConflict();
 
 
 
 
 
 
skin/frontend/base/default/zooz/js/zooz-magento.js DELETED
@@ -1,31 +0,0 @@
1
- function startZooz(isSandbox, formObject, url, uniqueId, returnUrl, cancelUrl){
2
- var sandbox = (isSandbox==1);
3
- var customStyleA = "https://app.zooz.com/ZoozCustomWC3/company/base-styles-a.css";
4
- var customStyleB = "https://app.zooz.com/ZoozCustomWC3/company/base-styles-b.css";
5
- var customStyle = "";//customStyleB;
6
- //DYO.chooseVariation(93);
7
- // if(zooz_button_color == 'gold')
8
- // customStyle = customStyleB;
9
-
10
- jQuery('.zooz-payment-loading').show();
11
- jQuery.ajax({
12
- type: formObject.attr('method'),
13
- url: url,
14
- data: formObject.serialize(),
15
- cache: false,
16
- success: function (response) {
17
- jQuery('.zooz-payment-loading').hide();
18
- eval(response);
19
- zoozStartCheckout({
20
- token : data.token,
21
- uniqueId : uniqueId,
22
- isSandbox : sandbox,
23
- customStylesheet: customStyle,
24
- returnUrl : returnUrl,
25
- cancelUrl : cancelUrl
26
-
27
- });
28
- }
29
- });
30
- return false;
31
- }