bluesnap_payment - Version 2.0.3.2

Version Notes

- changed text in system

Download this release

Release Info

Developer Nachshon Fishbane
Extension bluesnap_payment
Version 2.0.3.2
Comparing to
See all releases


Code changes from version 2.0.2.5 to 2.0.3.2

Files changed (26) hide show
  1. app/code/community/Bluesnap/Payment/Block/Adminhtml/Sales/Order/Grid.php +2 -11
  2. app/code/community/Bluesnap/Payment/Block/Payment/Form/Cse.php +26 -1
  3. app/code/community/Bluesnap/Payment/Helper/Data.php +1 -1
  4. app/code/community/Bluesnap/Payment/Model/Api/Cse.php +116 -145
  5. app/code/community/Bluesnap/Payment/Model/Api/Logger.php +2 -2
  6. app/code/community/Bluesnap/Payment/Model/Api/Refund.php +4 -3
  7. app/code/community/Bluesnap/Payment/Model/Api/Saved.php +51 -11
  8. app/code/community/Bluesnap/Payment/Model/Directory/Currency/Import.php +1 -1
  9. app/code/community/Bluesnap/Payment/Model/Logger/Db.php +19 -5
  10. app/code/community/Bluesnap/Payment/Model/Observer.php +20 -88
  11. app/code/community/Bluesnap/Payment/Model/Payment/Cse.php +19 -14
  12. app/code/community/Bluesnap/Payment/Model/Sales/Order/Payment.php +2 -2
  13. app/code/community/Bluesnap/Payment/Model/Sslvalidation.php +132 -0
  14. app/code/community/Bluesnap/Payment/etc/config.xml +3 -10
  15. app/code/community/Bluesnap/Payment/etc/system.xml +24 -3
  16. app/code/community/Bluesnap/Payment/sql/bluesnap_setup/mysql4-upgrade-1.0.2-1.0.3.php +2 -2
  17. app/code/community/Bluesnap/Payment/sql/bluesnap_setup/mysql4-upgrade-1.0.3-1.0.4.php +13 -13
  18. app/design/frontend/base/default/layout/bluesnap/payment.xml +38 -37
  19. app/design/frontend/base/default/template/bluesnap/payment/form/cse.phtml +220 -107
  20. js/bluesnap/credit-card-detect.js +229 -0
  21. js/bluesnap/payform.js +683 -0
  22. js/lib/jquery/bluesnap-noconflict.js +1 -0
  23. js/lib/jquery/jquery-3.0.0.min.js +4 -0
  24. package.xml +5 -5
  25. skin/frontend/base/default/js/bluesnap/credit-card-detect.js +73 -0
  26. skin/frontend/base/default/js/bluesnap/payform.js +36 -27
app/code/community/Bluesnap/Payment/Block/Adminhtml/Sales/Order/Grid.php CHANGED
@@ -30,18 +30,9 @@ class Bluesnap_Payment_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_B
30
  {
31
  $collection = Mage::getResourceModel($this->_getCollectionClass());
32
 
33
- //billing name, shipping name
34
- // $adapter = $this->getReadConnection();
35
- //$ifnullFirst = $adapter->getIfNullSql('{{table}}.firstname', $adapter->quote(''));
36
- //$ifnullLast = $adapter->getIfNullSql('{{table}}.lastname', $adapter->quote(''));
37
-
38
- //$concatAddress = $adapter->getConcatSql(array($ifnullFirst, $adapter->quote(' '), $ifnullLast));
39
- $collection->getSelect()->columns(array('billing_name' => "CONCAT(customer_firstname,' ',customer_lastname)"));
40
- $collection->getSelect()->columns(array('shipping_name' => "CONCAT(customer_firstname,' ',customer_lastname)"));
41
  $collection->getSelect()->columns(array('payment_method' => new Zend_Db_Expr("(SELECT method FROM sales_flat_order_payment WHERE parent_id=main_table.entity_id)")));
42
-
43
- // echo $collection->getSelect()->__toString();
44
- // die();
45
 
46
  $this->setCollection($collection);
47
 
30
  {
31
  $collection = Mage::getResourceModel($this->_getCollectionClass());
32
 
 
 
 
 
 
 
 
 
33
  $collection->getSelect()->columns(array('payment_method' => new Zend_Db_Expr("(SELECT method FROM sales_flat_order_payment WHERE parent_id=main_table.entity_id)")));
34
+ $collection->getSelect()->columns(array('shipping_name' => new Zend_Db_Expr("(SELECT CONCAT(firstname,' ',lastname) FROM sales_flat_order_address WHERE parent_id=main_table.entity_id AND address_type='shipping')")));
35
+ $collection->getSelect()->columns(array('billing_name' => new Zend_Db_Expr("(SELECT CONCAT(firstname,' ',lastname) FROM sales_flat_order_address WHERE parent_id=main_table.entity_id AND address_type='billing')")));
 
36
 
37
  $this->setCollection($collection);
38
 
app/code/community/Bluesnap/Payment/Block/Payment/Form/Cse.php CHANGED
@@ -65,8 +65,33 @@ class Bluesnap_Payment_Block_Payment_Form_Cse extends Mage_Payment_Block_Form_Cc
65
  */
66
  protected function _toHtml()
67
  {
68
- $this->setChild('cards', $this->getCardsBlock());
69
  $this->setChild('method_form_block', $this->getMethodFormBlock());
 
 
 
 
 
 
 
 
 
 
 
70
  return parent::_toHtml();
71
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
65
  */
66
  protected function _toHtml()
67
  {
68
+ $this->setChild('cards', $this->getCardsBlock());
69
  $this->setChild('method_form_block', $this->getMethodFormBlock());
70
+ if( $this->getLayout()->getBlock('head')){
71
+ $this->getLayout()->getBlock('head')->addLinkRel('text/javascript','https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js');
72
+ $this->getLayout()->getBlock('head')->addItem('js','bluesnap/credit-card-detect.js');
73
+ $this->getLayout()->getBlock('head')->addItem('js','bluesnap/payform.js');
74
+ $this->getLayout()->getBlock('head')->addItem('js','bluesnap/bsadmin.js');
75
+ $this->getLayout()->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
76
+ $this->getLayout()->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
77
+ $this->getLayout()->getBlock('head')->addItem('skin_css', 'css/bluesnap/buynow/checkout.css');
78
+ $this->getLayout()->getBlock('head')->addItem('js_css', 'lib/jquery/jquery-ui/jquery-ui.css');
79
+ }
80
+
81
  return parent::_toHtml();
82
  }
83
+
84
+ protected function _prepareLayout()
85
+ {
86
+ //$this->getLayout()->getBlock('head')->addLinkRel('text/javascript','https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js');
87
+ //$this->getLayout()->getBlock('head')->addItem('js','bluesnap/credit-card-detect.js');
88
+ //$this->getLayout()->getBlock('head')->addItem('js','bluesnap/payform.js');
89
+ //$this->getLayout()->getBlock('head')->addItem('js','bluesnap/bsadmin.js');
90
+ //$this->getLayout()->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
91
+ //$this->getLayout()->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
92
+ //$this->getLayout()->getBlock('head')->addItem('skin_css', 'css/bluesnap/buynow/checkout.css');
93
+ //$this->getLayout()->getBlock('head')->addItem('js_css', 'lib/jquery/jquery-ui/jquery-ui.css');
94
+ return parent::_prepareLayout();
95
+
96
+ }
97
  }
app/code/community/Bluesnap/Payment/Helper/Data.php CHANGED
@@ -103,7 +103,7 @@ class Bluesnap_Payment_Helper_Data extends Bluesnap_Payment_Helper_Config
103
  $message = "ECP details couldn't be verified";
104
  break;
105
  default:
106
- $message = 'Something went wrong during placing your order. Please contact support.';
107
  }
108
 
109
  return $message;
103
  $message = "ECP details couldn't be verified";
104
  break;
105
  default:
106
+ $message = 'Unfortunately an error has occurred and your payment cannot be processed at this time, please verify your payment details or try again later. If the problem persists, please contact our support team';
107
  }
108
 
109
  return $message;
app/code/community/Bluesnap/Payment/Model/Api/Cse.php CHANGED
@@ -88,30 +88,19 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
88
  if ($paymentaction != 'authorize_capture') {
89
  //Auth minimal amount
90
  if ($bsShopperId) {
91
-
92
  //Here we Check if order is comming from admin or frontend
93
  $order = $payment->getOrder();
94
- if (!empty($order->getRemoteIp())) {
95
- //frontend order
96
- $api = Mage::getModel('bluesnap/api_saved');
97
- $response = $api->createAuthOrder($payment, $bsShopperId);
98
-
99
- } else {
100
- //admin order
101
- $api = Mage::getModel('bluesnap/api_saved');
102
- $response = $api->createAuthOrder($payment, $bsShopperId);
103
- }
104
-
105
  } else {
106
  // new customer
107
  $response = $this->placeAuthOrder($payment);
108
-
109
  }
110
 
111
  } else {
112
  //Here we Check if order is comming from admin or frontend
113
  $order = $payment->getOrder();
114
- if (!empty($order->getRemoteIp())) {
115
  //frontend order
116
  if ($bsShopperId) {
117
  // returning shopper
@@ -171,15 +160,13 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
171
  $price = 1;
172
  $currencyApi = Mage::getModel('bluesnap/api_currency');
173
  $currResponse = $currencyApi->convert('USD', $baseCurrencyCode, $price);
174
- // $sum['amount'] = Mage::helper('directory')->currencyConvert($price, 'USD',$baseCurrencyCode);
175
  $sum['amount'] = $currResponse;
176
  } else $sum['amount'] = 1;
177
 
178
-
179
  $data = array(
180
  'web-info' => array(
181
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
182
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
183
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
184
  ),
185
  'shopper-details' => array(
@@ -189,13 +176,8 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
189
  'first-name' => $billing->getFirstname(),
190
  'last-name' => $billing->getLastname(),
191
  'email' => $order->getCustomerEmail(),
192
- // 'address1' => $billing->getStreet(1),
193
- // 'address2' => $billing->getStreet(2),
194
- // 'city' => $billing->getCity(),
195
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
196
  'country' => strtoupper($billing->getCountry()),
197
- // 'phone' => $billing->getTelephone(),
198
- // 'zip' => $billing->getPostcode(),
199
  ),
200
  'shopper-currency' => $sum['currency'],
201
  'payment-info' => array(
@@ -204,19 +186,15 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
204
  'billing-contact-info' => array(
205
  'first-name' => $billing->getFirstname(),
206
  'last-name' => $billing->getLastname(),
207
- // 'address1' => $billing->getStreet(1),
208
- // 'address2' => $billing->getStreet(2),
209
- // 'city' => $billing->getCity(),
210
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
211
  'country' => strtoupper($billing->getCountry()),
212
- // 'zip' => $billing->getPostcode(),
213
  ),
214
  'credit-card' => array(
215
- 'encrypted-card-number' => $payment->getCcNumber(),
216
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
217
  'expiration-month' => $payment->getCcExpMonth(),
218
  'expiration-year' => $payment->getCcExpYear(),
219
- 'encrypted-security-code' => $payment->getCcCid(),
220
  ),
221
  ),
222
  ),
@@ -233,8 +211,8 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
233
  'ordering-shopper' => array(
234
  'seller-shopper-id' => '',
235
  'web-info' => array(
236
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
237
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
238
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
239
  ),
240
  ),
@@ -263,11 +241,11 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
263
  ),
264
  ),
265
  );
266
-
267
  $xml = new SimpleXMLElement('<shopping-context xmlns="' . $this->_getXmlNs() . '"/>');
268
  $request = Mage::helper('bluesnap')->arrayToXml($data, $xml)->asXML();
269
 
270
- //BSNPMG-86 - remove sensitive data from logs
271
  $logData = $data;
272
  $logData['shopper-details']['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
273
  $logData['shopper-details']['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-security-code'] = '****';
@@ -279,17 +257,9 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
279
  // send request
280
  $url = $this->getServiceUrl('shopping-context');
281
  $response = $this->_request($url, $request, 0, false, true);
282
- //$response = $this->_parseXmlResponse($responseXml);
283
- //hide sensitive data
284
- // $this->_requestXml=$logRequestXml;
285
- //$requestUrl = $logResponse->order->{'post-sale-info'}->invoices->invoice->url;
286
  $responseArr = $this->parseHeaders($response);
287
- // @todo : this will give an error
288
- // $logResponse->shopper->{'shopper-info'}->password = '****';
289
-
290
- // $this->_responseXml=$logResponse->asXml();
291
-
292
-
293
  try {
294
  // $response = $this->parseCreateResponse($response, null, $order);
295
  } catch (Exception $e) {
@@ -353,17 +323,46 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
353
  }
354
 
355
  // if card was not used before — save card for shopper
356
- //if (!isset($cards[$payment->getCcLast4()])) {
357
- //BSNPMG-108
358
  if ($payment->getCcNumber()) {
359
- $this->addCardToShopper($payment, $total, $bsShopperId);
360
-
 
 
 
 
 
 
 
 
 
 
 
361
  } else { //BSNPMG-34 no need to update shopper call when new card added
362
 
363
  $this->updateShopper($payment, $total, $bsShopperId);
364
-
365
  }
366
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
367
 
368
  $data = array(
369
  'ordering-shopper' => array(
@@ -372,11 +371,11 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
372
  'shopper-id' => $bsShopperId,
373
  'credit-card' => array(
374
  'card-last-four-digits' => $payment->getCcLast4(),
375
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
376
  ),
377
  'web-info' => array(
378
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
379
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
380
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
381
  ),
382
  'fraud-info' => array(
@@ -421,16 +420,12 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
421
  // send request
422
  $url = $this->getServiceUrl('orders');
423
  $responseXml = $this->_request($url, $request);
424
-
425
-
426
  $response = $this->_parseXmlResponse($responseXml);
427
 
428
  try {
429
 
430
- $response = $this->parseCreateResponse($response, $bsShopperId, $order);
431
  } catch (Exception $e) {
432
- //Mage::logException($e);
433
- //throw $e;
434
  throw new Bluesnap_Payment_Model_Api_Exception(Mage::helper('core')->__('Something went wrong during placing your order. Please contact support.'));
435
  }
436
 
@@ -460,7 +455,7 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
460
 
461
  $data = array(
462
  'web-info' => array(
463
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
464
  ),
465
  //BSNPMG-163 - fraud support
466
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
@@ -478,21 +473,14 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
478
  'billing-contact-info' => array(
479
  'first-name' => $billing->getFirstname(),
480
  'last-name' => $billing->getLastname(),
481
- //BSNPMG-106
482
- // 'company-name' => $billing->getCompany(),
483
- // 'address1' => $billing->getStreet(1),
484
- // 'address2' => $billing->getStreet(2),
485
- // 'city' => $billing->getCity(),
486
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
487
- // 'zip' => $billing->getPostcode(),
488
  'country' => strtoupper($billing->getCountry()),
489
  ),
490
  'credit-card' => array(
491
- 'encrypted-card-number' => $payment->getCcNumber(),
492
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
493
  'expiration-month' => $payment->getCcExpMonth(),
494
  'expiration-year' => $payment->getCcExpYear(),
495
- 'encrypted-security-code' => $payment->getCcCid(),
496
  'card-last-four-digits' => $payment->getCcLast4(),
497
  ),
498
  ),
@@ -505,12 +493,13 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
505
 
506
  $url = $this->getServiceUrl('shoppers/' . $bsShopperId);
507
  $responseXml = $this->_request($url, $requestXml, self::HTTP_METHOD_PUT);
 
508
  //http://docs.bluesnap.com/api/services/shoppers/update-shopper
509
  //If successful, the response HTTP status code is 204 No Content.
510
  //Otherwise, Errors will be returned in a messages resource.
511
  //@todo: verify response code (204 for update shopper)
512
 
513
- //BSNPMG-86 remove sensitive data from logs
514
  $logData = $data;
515
  $logData['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
516
  $logData['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-security-code'] = '****';
@@ -527,20 +516,27 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
527
  Mage::logException($e);
528
 
529
  Mage::throwException(mage::helper('bluesnap')->__('Can not authorize your card'));
530
- //throw $e;
 
 
 
 
 
531
  }
532
 
533
  //need to unset the value in session for new card to be avaialable
534
  $this->getSession()->unsetData('bs_shopper');
535
-
 
 
 
536
  // and save it again in the session
537
- $this->retrieveShopper($bsShopperId);
538
 
539
  // unregister cards from registery
540
  Mage::unregister('bs_shopper_cards');
541
-
542
-
543
- $this->getLogger()->logSuccess($logRequestXml, $this->_responseXml, 0, "addCardToShopper success", "addCardToShopper", $order->getIncrementId(), $url);
544
 
545
  }
546
 
@@ -551,12 +547,11 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
551
  * @return Varien_Simplexml_Element
552
  * @throws Mage_Core_Exception
553
  */
554
- public function retrieveShopper($bsShopperId)
555
  {
556
- //BSNPMG-35 - save shopper in session
557
- //if (!Mage::registry('bs_shopper')) {
558
 
559
- if (!$this->getSession()->getData('bs_shopper')) {
560
 
561
  // send request
562
  $url = $this->getServiceUrl('shoppers/' . $bsShopperId);
@@ -587,7 +582,6 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
587
  $responseXml = $this->getSession()->getData('bs_shopper');
588
  $response = $this->_parseXmlResponse($responseXml);
589
 
590
- //return Mage::registry('bs_shopper');
591
  return $response;
592
  }
593
 
@@ -616,9 +610,9 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
616
 
617
  $data = array(
618
  'web-info' => array(
619
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
620
  ),
621
- //BSNPMG-163 - fraud support
622
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
623
  'fraud-info' => array(
624
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
@@ -627,20 +621,12 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
627
  'store-id' => Mage::helper('bluesnap')->getBluesnapStoreId(),
628
  'shopper-currency' => $sum['currency'],
629
  'charged-currency' => $sum['currency'],
630
- ////BSNPMG-106
631
  'shopper-contact-info' => array(
632
  'first-name' => $billing->getFirstname(),
633
  'last-name' => $billing->getLastname(),
634
  'email' => $order->getCustomerEmail(),
635
- // 'company-name' => $billing->getCompany(),
636
- // 'address1' => $billing->getStreet(1),
637
- // 'address2' => $billing->getStreet(2),
638
- // 'city' => $billing->getCity(),
639
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
640
- // 'zip' => $billing->getPostcode(),
641
  'country' => strtoupper($billing->getCountry()),
642
- // 'phone' => $billing->getTelephone(),
643
- // 'fax' => $billing->getFax(),
644
  ),
645
  'payment-info' => array(
646
  'credit-cards-info' => array(
@@ -648,20 +634,14 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
648
  'billing-contact-info' => array(
649
  'first-name' => $billing->getFirstname(),
650
  'last-name' => $billing->getLastname(),
651
- // 'company-name' => $billing->getCompany(),
652
- // 'address1' => $billing->getStreet(1),
653
- // 'address2' => $billing->getStreet(2),
654
- // 'city' => $billing->getCity(),
655
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
656
- // 'zip' => $billing->getPostcode(),
657
  'country' => strtoupper($billing->getCountry()),
658
  ),
659
  'credit-card' => array(
660
- 'encrypted-card-number' => $payment->getCcNumber(),
661
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
662
  'expiration-month' => $payment->getCcExpMonth(),
663
  'expiration-year' => $payment->getCcExpYear(),
664
- 'encrypted-security-code' => $payment->getCcCid(),
665
  'card-last-four-digits' => $payment->getCcLast4(),
666
  ),
667
  ),
@@ -701,7 +681,7 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
701
  * @return array
702
  * @throws Mage_Core_Exception
703
  */
704
- protected function parseCreateResponse($responseXml, $bsShopperId = null, $order = null)
705
  {
706
  $result = array('shopperId' => null, 'invoiceId' => null);
707
  // $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
@@ -709,9 +689,10 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
709
  if ($responseXml->message) {
710
  // $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
711
  $error = (string)$responseXml->message->description;
 
712
  $e = new Bluesnap_Payment_Model_Api_Exception($error, (int)$responseXml->message->code);
713
  Mage::logException($e);
714
- $this->getLogger()->logError($this->_requestXml, $this->_responseXml, (int)$responseXml->message->code, $error, "createOrder", $order->getIncrementId());
715
 
716
  throw $e;
717
 
@@ -752,7 +733,7 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
752
  {
753
  $order = $payment->getOrder();
754
  $billing = $order->getBillingAddress();
755
-
756
  if (!Mage::helper('bluesnap')->isStateSupported($billing->getRegionCode())) {
757
  throw new Bluesnap_Payment_Model_Api_Exception(Mage::helper('core')->__('State is not supported'));
758
  }
@@ -767,15 +748,15 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
767
  }
768
 
769
  //http://docs.bluesnap.com/api/services/orders/batch-create-shopper-and-order
770
-
771
  $data = array(
772
  'shopper' => array(
773
  'web-info' => array(
774
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
775
  ),
776
  //BSNPMG-163 - fraud support
777
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
778
- //BSNPMG-106
779
  'shopper-info' => array(
780
  'store-id' => Mage::helper('bluesnap')->getBluesnapStoreId(),
781
  'shopper-currency' => $sum['currency'],
@@ -786,15 +767,9 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
786
  'first-name' => $billing->getFirstname(),
787
  'last-name' => $billing->getLastname(),
788
  'email' => $order->getCustomerEmail(),
789
- // 'company-name' => $billing->getCompany(),
790
- // 'address1' => $billing->getStreet(1),
791
- // 'address2' => $billing->getStreet(2),
792
- // 'city' => $billing->getCity(),
793
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
794
- // 'zip' => $billing->getPostcode(),
795
  'country' => strtoupper($billing->getCountry()),
796
- // 'phone' => $billing->getTelephone(),
797
- // 'fax' => $billing->getFax(),
798
  ),
799
  'payment-info' => array(
800
  'credit-cards-info' => array(
@@ -802,20 +777,14 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
802
  'billing-contact-info' => array(
803
  'first-name' => $billing->getFirstname(),
804
  'last-name' => $billing->getLastname(),
805
- // 'company-name' => $billing->getCompany(),
806
- // 'address1' => $billing->getStreet(1),
807
- // 'address2' => $billing->getStreet(2),
808
- // 'city' => $billing->getCity(),
809
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
810
- // 'zip' => $billing->getPostcode(),
811
  'country' => strtoupper($billing->getCountry()),
812
  ),
813
  'credit-card' => array(
814
- 'encrypted-card-number' => $payment->getCcNumber(),
815
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
816
  'expiration-month' => $payment->getCcExpMonth(),
817
  'expiration-year' => $payment->getCcExpYear(),
818
- 'encrypted-security-code' => $payment->getCcCid(),
819
  ),
820
  ),
821
  )
@@ -826,8 +795,8 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
826
  'ordering-shopper' => array(
827
  'seller-shopper-id' => '',
828
  'web-info' => array(
829
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
830
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
831
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
832
  ),
833
  'fraud-info' => array(
@@ -847,7 +816,6 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
847
  'soft-descriptor' => $order->getIncrementId(),
848
  'description' => $order->getIncrementId(),
849
  'title' => $order->getIncrementId(),
850
- //BSNPMG-78
851
  'sku-name' => 'Order #' . $order->getIncrementId(),
852
  ),
853
  'quantity' => '1',
@@ -864,9 +832,10 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
864
  ),
865
  ),
866
  );
 
867
  $xml = new SimpleXMLElement('<batch-order xmlns="' . $this->_getXmlNs() . '"/>');
868
  $request = Mage::helper('bluesnap')->arrayToXml($data, $xml)->asXML();
869
-
870
  //BSNPMG-86 - remove sensitive data from logs
871
  $logData = $data;
872
  $logData['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
@@ -880,15 +849,14 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
880
  $url = $this->getServiceUrl('batch/order-placement');
881
 
882
  $responseXml = $this->_request($url, $request);
883
-
884
  $response = $this->_parseXmlResponse($responseXml);
885
-
 
886
  //hide sensitive data
887
  $this->_requestXml = $logRequestXml;
888
  $logResponse = $this->_parseXmlResponse($responseXml);
889
-
890
- //$requestUrl = $logResponse->order->{'post-sale-info'}->invoices->invoice->url;
891
-
892
  $logResponse->shopper->{'shopper-info'}->password = '****';
893
 
894
  $this->_responseXml = $logResponse->asXml();
@@ -981,17 +949,25 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
981
  {
982
 
983
  if (!Mage::registry('bs_shopper_cards')) {
984
- $xml = $this->retrieveShopper($bsShopperId);
985
- $cards_info = $xml->xpath('//ns1:credit-card');
986
-
987
- $cards = array();
988
- foreach ($cards_info as $info) {
989
- $last = (string)$info->{'card-last-four-digits'};
990
- $type = (string)$info->{'card-type'};
991
- $cards[$last] = $type;
992
- }
993
-
994
- Mage::register('bs_shopper_cards', $cards);
 
 
 
 
 
 
 
 
995
  }
996
 
997
 
@@ -1047,7 +1023,7 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
1047
 
1048
  $data = array(
1049
  'web-info' => array(
1050
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
1051
  ),
1052
  'fraud-info' => array(
1053
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
@@ -1059,13 +1035,8 @@ class Bluesnap_Payment_Model_Api_Cse extends Bluesnap_Payment_Model_Api_Abstract
1059
  'first-name' => $billing->getFirstname(),
1060
  'last-name' => $billing->getLastname(),
1061
  'email' => $order->getCustomerEmail(),
1062
- // 'company-name' => $billing->getCompany(),
1063
- // 'address1' => $billing->getStreet(1),
1064
- // 'address2' => $billing->getStreet(2),
1065
- // 'city' => $billing->getCity(),
1066
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
1067
  'country' => strtoupper($billing->getCountry()),
1068
- // 'zip' => $billing->getPostcode(),
1069
  ),
1070
  ),
1071
  );
88
  if ($paymentaction != 'authorize_capture') {
89
  //Auth minimal amount
90
  if ($bsShopperId) {
 
91
  //Here we Check if order is comming from admin or frontend
92
  $order = $payment->getOrder();
93
+ $api = Mage::getModel('bluesnap/api_saved');
94
+ $response = $api->createAuthOrder($payment, $bsShopperId);
 
 
 
 
 
 
 
 
 
95
  } else {
96
  // new customer
97
  $response = $this->placeAuthOrder($payment);
 
98
  }
99
 
100
  } else {
101
  //Here we Check if order is comming from admin or frontend
102
  $order = $payment->getOrder();
103
+ if ($order->getRemoteIp()) {
104
  //frontend order
105
  if ($bsShopperId) {
106
  // returning shopper
160
  $price = 1;
161
  $currencyApi = Mage::getModel('bluesnap/api_currency');
162
  $currResponse = $currencyApi->convert('USD', $baseCurrencyCode, $price);
 
163
  $sum['amount'] = $currResponse;
164
  } else $sum['amount'] = 1;
165
 
 
166
  $data = array(
167
  'web-info' => array(
168
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
169
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
170
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
171
  ),
172
  'shopper-details' => array(
176
  'first-name' => $billing->getFirstname(),
177
  'last-name' => $billing->getLastname(),
178
  'email' => $order->getCustomerEmail(),
 
 
 
179
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
180
  'country' => strtoupper($billing->getCountry()),
 
 
181
  ),
182
  'shopper-currency' => $sum['currency'],
183
  'payment-info' => array(
186
  'billing-contact-info' => array(
187
  'first-name' => $billing->getFirstname(),
188
  'last-name' => $billing->getLastname(),
 
 
 
189
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
190
  'country' => strtoupper($billing->getCountry()),
 
191
  ),
192
  'credit-card' => array(
193
+ 'encrypted-card-number' => Mage::app()->getRequest()->getParam('encryptedCreditCard'),
194
+ // 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
195
  'expiration-month' => $payment->getCcExpMonth(),
196
  'expiration-year' => $payment->getCcExpYear(),
197
+ 'encrypted-security-code' => Mage::app()->getRequest()->getParam('encryptedCvv'),
198
  ),
199
  ),
200
  ),
211
  'ordering-shopper' => array(
212
  'seller-shopper-id' => '',
213
  'web-info' => array(
214
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
215
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
216
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
217
  ),
218
  ),
241
  ),
242
  ),
243
  );
244
+ // Zend_Debug::dump($data); exit;
245
  $xml = new SimpleXMLElement('<shopping-context xmlns="' . $this->_getXmlNs() . '"/>');
246
  $request = Mage::helper('bluesnap')->arrayToXml($data, $xml)->asXML();
247
 
248
+ // remove sensitive data from logs
249
  $logData = $data;
250
  $logData['shopper-details']['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
251
  $logData['shopper-details']['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-security-code'] = '****';
257
  // send request
258
  $url = $this->getServiceUrl('shopping-context');
259
  $response = $this->_request($url, $request, 0, false, true);
260
+
 
 
 
261
  $responseArr = $this->parseHeaders($response);
262
+
 
 
 
 
 
263
  try {
264
  // $response = $this->parseCreateResponse($response, null, $order);
265
  } catch (Exception $e) {
323
  }
324
 
325
  // if card was not used before — save card for shopper
326
+ $validCC = false;
 
327
  if ($payment->getCcNumber()) {
328
+ $response = $this->addCardToShopper($payment, $total, $bsShopperId);
329
+
330
+ $CCs = $response->descend("shopper-info/payment-info/credit-cards-info/credit-card-info");
331
+
332
+ foreach($CCs AS $cc) {
333
+ if(
334
+ (int)$cc->descend("credit-card/expiration-month") == $payment->getCcExpMonth() &&
335
+ (int)$cc->descend("credit-card/expiration-year") == $payment->getCcExpYear() &&
336
+ (int)$cc->descend("credit-card/card-last-four-digits") == $payment->getCcLast4()
337
+ ) {
338
+ $validCC = $cc->descend("credit-card");
339
+ }
340
+ }
341
  } else { //BSNPMG-34 no need to update shopper call when new card added
342
 
343
  $this->updateShopper($payment, $total, $bsShopperId);
 
344
  }
345
+
346
+ $response = $this->retrieveShopper($bsShopperId, $action);
347
+
348
+ $CCs = $response->descend("shopper-info/payment-info/credit-cards-info/credit-card-info");
349
+
350
+ foreach($CCs AS $cc) {
351
+ if(
352
+ (int)$cc->descend("credit-card/expiration-month") == $payment->getCcExpMonth() &&
353
+ (int)$cc->descend("credit-card/expiration-year") == $payment->getCcExpYear() &&
354
+ (int)$cc->descend("credit-card/card-last-four-digits") == $payment->getCcLast4()
355
+ ) {
356
+ $validCC = $cc->descend("credit-card");
357
+ }
358
+ }
359
+
360
+ if($validCC) {
361
+ $type = (string) $validCC->descend("card-type");
362
+ $payment->setCcType($type)->save();
363
+ } else {
364
+ $type = (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : '');
365
+ }
366
 
367
  $data = array(
368
  'ordering-shopper' => array(
371
  'shopper-id' => $bsShopperId,
372
  'credit-card' => array(
373
  'card-last-four-digits' => $payment->getCcLast4(),
374
+ 'card-type' => $type,
375
  ),
376
  'web-info' => array(
377
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
378
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
379
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
380
  ),
381
  'fraud-info' => array(
420
  // send request
421
  $url = $this->getServiceUrl('orders');
422
  $responseXml = $this->_request($url, $request);
 
 
423
  $response = $this->_parseXmlResponse($responseXml);
424
 
425
  try {
426
 
427
+ $response = $this->parseCreateResponse($response, $bsShopperId, $order,$url);
428
  } catch (Exception $e) {
 
 
429
  throw new Bluesnap_Payment_Model_Api_Exception(Mage::helper('core')->__('Something went wrong during placing your order. Please contact support.'));
430
  }
431
 
455
 
456
  $data = array(
457
  'web-info' => array(
458
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
459
  ),
460
  //BSNPMG-163 - fraud support
461
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
473
  'billing-contact-info' => array(
474
  'first-name' => $billing->getFirstname(),
475
  'last-name' => $billing->getLastname(),
 
 
 
 
 
476
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
 
477
  'country' => strtoupper($billing->getCountry()),
478
  ),
479
  'credit-card' => array(
480
+ 'encrypted-card-number' => Mage::app()->getRequest()->getParam('encryptedCreditCard'),
 
481
  'expiration-month' => $payment->getCcExpMonth(),
482
  'expiration-year' => $payment->getCcExpYear(),
483
+ 'encrypted-security-code' => Mage::app()->getRequest()->getParam('encryptedCvv'),
484
  'card-last-four-digits' => $payment->getCcLast4(),
485
  ),
486
  ),
493
 
494
  $url = $this->getServiceUrl('shoppers/' . $bsShopperId);
495
  $responseXml = $this->_request($url, $requestXml, self::HTTP_METHOD_PUT);
496
+
497
  //http://docs.bluesnap.com/api/services/shoppers/update-shopper
498
  //If successful, the response HTTP status code is 204 No Content.
499
  //Otherwise, Errors will be returned in a messages resource.
500
  //@todo: verify response code (204 for update shopper)
501
 
502
+ //remove sensitive data from logs
503
  $logData = $data;
504
  $logData['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
505
  $logData['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-security-code'] = '****';
516
  Mage::logException($e);
517
 
518
  Mage::throwException(mage::helper('bluesnap')->__('Can not authorize your card'));
519
+
520
+ }
521
+ else {
522
+ //log success add card to shopper API call
523
+ $this->getLogger()->logSuccess($logRequestXml, $this->_responseXml, 0, "addCardToShopper success", "addCardToShopper", $order->getIncrementId(), $url);
524
+
525
  }
526
 
527
  //need to unset the value in session for new card to be avaialable
528
  $this->getSession()->unsetData('bs_shopper');
529
+
530
+
531
+
532
+
533
  // and save it again in the session
534
+ $response = $this->retrieveShopper($bsShopperId);
535
 
536
  // unregister cards from registery
537
  Mage::unregister('bs_shopper_cards');
538
+
539
+ return $response;
 
540
 
541
  }
542
 
547
  * @return Varien_Simplexml_Element
548
  * @throws Mage_Core_Exception
549
  */
550
+ public function retrieveShopper($bsShopperId, $action=NULL)
551
  {
552
+
 
553
 
554
+ if (!$this->getSession()->getData('bs_shopper') || $action=="invoice") {
555
 
556
  // send request
557
  $url = $this->getServiceUrl('shoppers/' . $bsShopperId);
582
  $responseXml = $this->getSession()->getData('bs_shopper');
583
  $response = $this->_parseXmlResponse($responseXml);
584
 
 
585
  return $response;
586
  }
587
 
610
 
611
  $data = array(
612
  'web-info' => array(
613
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
614
  ),
615
+
616
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
617
  'fraud-info' => array(
618
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
621
  'store-id' => Mage::helper('bluesnap')->getBluesnapStoreId(),
622
  'shopper-currency' => $sum['currency'],
623
  'charged-currency' => $sum['currency'],
 
624
  'shopper-contact-info' => array(
625
  'first-name' => $billing->getFirstname(),
626
  'last-name' => $billing->getLastname(),
627
  'email' => $order->getCustomerEmail(),
 
 
 
 
628
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
 
629
  'country' => strtoupper($billing->getCountry()),
 
 
630
  ),
631
  'payment-info' => array(
632
  'credit-cards-info' => array(
634
  'billing-contact-info' => array(
635
  'first-name' => $billing->getFirstname(),
636
  'last-name' => $billing->getLastname(),
 
 
 
 
637
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
 
638
  'country' => strtoupper($billing->getCountry()),
639
  ),
640
  'credit-card' => array(
641
+ 'encrypted-card-number' => Mage::app()->getRequest()->getParam('encryptedCreditCard'),
 
642
  'expiration-month' => $payment->getCcExpMonth(),
643
  'expiration-year' => $payment->getCcExpYear(),
644
+ 'encrypted-security-code' => Mage::app()->getRequest()->getParam('encryptedCvv'),
645
  'card-last-four-digits' => $payment->getCcLast4(),
646
  ),
647
  ),
681
  * @return array
682
  * @throws Mage_Core_Exception
683
  */
684
+ protected function parseCreateResponse($responseXml, $bsShopperId = null, $order = null, $url= " ")
685
  {
686
  $result = array('shopperId' => null, 'invoiceId' => null);
687
  // $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
689
  if ($responseXml->message) {
690
  // $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
691
  $error = (string)$responseXml->message->description;
692
+
693
  $e = new Bluesnap_Payment_Model_Api_Exception($error, (int)$responseXml->message->code);
694
  Mage::logException($e);
695
+ $this->getLogger()->logError($this->_requestXml, $this->_responseXml, (int)$responseXml->message->code, $error, "createOrder", $order->getIncrementId(),$url);
696
 
697
  throw $e;
698
 
733
  {
734
  $order = $payment->getOrder();
735
  $billing = $order->getBillingAddress();
736
+
737
  if (!Mage::helper('bluesnap')->isStateSupported($billing->getRegionCode())) {
738
  throw new Bluesnap_Payment_Model_Api_Exception(Mage::helper('core')->__('State is not supported'));
739
  }
748
  }
749
 
750
  //http://docs.bluesnap.com/api/services/orders/batch-create-shopper-and-order
751
+
752
  $data = array(
753
  'shopper' => array(
754
  'web-info' => array(
755
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
756
  ),
757
  //BSNPMG-163 - fraud support
758
  //http://docs.bluesnap.com/api/services/shoppers/create-shopper
759
+
760
  'shopper-info' => array(
761
  'store-id' => Mage::helper('bluesnap')->getBluesnapStoreId(),
762
  'shopper-currency' => $sum['currency'],
767
  'first-name' => $billing->getFirstname(),
768
  'last-name' => $billing->getLastname(),
769
  'email' => $order->getCustomerEmail(),
770
+
 
 
 
771
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
 
772
  'country' => strtoupper($billing->getCountry()),
 
 
773
  ),
774
  'payment-info' => array(
775
  'credit-cards-info' => array(
777
  'billing-contact-info' => array(
778
  'first-name' => $billing->getFirstname(),
779
  'last-name' => $billing->getLastname(),
 
 
 
 
780
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
 
781
  'country' => strtoupper($billing->getCountry()),
782
  ),
783
  'credit-card' => array(
784
+ 'encrypted-card-number' => Mage::app()->getRequest()->getParam('encryptedCreditCard'),
 
785
  'expiration-month' => $payment->getCcExpMonth(),
786
  'expiration-year' => $payment->getCcExpYear(),
787
+ 'encrypted-security-code' => Mage::app()->getRequest()->getParam('encryptedCvv'),
788
  ),
789
  ),
790
  )
795
  'ordering-shopper' => array(
796
  'seller-shopper-id' => '',
797
  'web-info' => array(
798
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
799
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
800
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
801
  ),
802
  'fraud-info' => array(
816
  'soft-descriptor' => $order->getIncrementId(),
817
  'description' => $order->getIncrementId(),
818
  'title' => $order->getIncrementId(),
 
819
  'sku-name' => 'Order #' . $order->getIncrementId(),
820
  ),
821
  'quantity' => '1',
832
  ),
833
  ),
834
  );
835
+
836
  $xml = new SimpleXMLElement('<batch-order xmlns="' . $this->_getXmlNs() . '"/>');
837
  $request = Mage::helper('bluesnap')->arrayToXml($data, $xml)->asXML();
838
+
839
  //BSNPMG-86 - remove sensitive data from logs
840
  $logData = $data;
841
  $logData['shopper']['shopper-info']['payment-info']['credit-cards-info']['credit-card-info']['credit-card']['encrypted-card-number'] = '****';
849
  $url = $this->getServiceUrl('batch/order-placement');
850
 
851
  $responseXml = $this->_request($url, $request);
852
+
853
  $response = $this->_parseXmlResponse($responseXml);
854
+ $ccType = (string) $response->descend("shopper/shopper-info/payment-info/credit-cards-info/credit-card-info/credit-card/card-type");
855
+ $payment->setCcType($ccType)->save();
856
  //hide sensitive data
857
  $this->_requestXml = $logRequestXml;
858
  $logResponse = $this->_parseXmlResponse($responseXml);
859
+
 
 
860
  $logResponse->shopper->{'shopper-info'}->password = '****';
861
 
862
  $this->_responseXml = $logResponse->asXml();
949
  {
950
 
951
  if (!Mage::registry('bs_shopper_cards')) {
952
+ try
953
+ {
954
+ $xml = $this->retrieveShopper($bsShopperId);
955
+ $cards_info = $xml->xpath('//ns1:credit-card');
956
+
957
+ $cards = array();
958
+ foreach ($cards_info as $info) {
959
+ $last = (string)$info->{'card-last-four-digits'};
960
+ $type = (string)$info->{'card-type'};
961
+ $cards[$last] = $type;
962
+ }
963
+
964
+ Mage::register('bs_shopper_cards', $cards);
965
+ }
966
+ catch(Exception $e)
967
+ {
968
+ // throw new Exception("cound not find cards");
969
+ }
970
+
971
  }
972
 
973
 
1023
 
1024
  $data = array(
1025
  'web-info' => array(
1026
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
1027
  ),
1028
  'fraud-info' => array(
1029
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
1035
  'first-name' => $billing->getFirstname(),
1036
  'last-name' => $billing->getLastname(),
1037
  'email' => $order->getCustomerEmail(),
 
 
 
 
1038
  'state' => strtoupper($billing->getCountry()) == 'US' || strtoupper($billing->getCountry()) == 'CA' ? $billing->getRegionCode() : '',
1039
  'country' => strtoupper($billing->getCountry()),
 
1040
  ),
1041
  ),
1042
  );
app/code/community/Bluesnap/Payment/Model/Api/Logger.php CHANGED
@@ -16,7 +16,7 @@ class Bluesnap_Payment_Model_Api_Logger
16
  $this->_loggers['mail'] = Mage::getsingleton('Bluesnap_Payment_Model_Logger_Mail');
17
  }
18
 
19
- function logSuccess($request, $response, $responseCode, $message, $method = null, $incrementId = null, $url = null)
20
  {
21
  $event = new Varien_Object();
22
  $event->setPriority(Zend_Log::INFO);
@@ -54,7 +54,7 @@ class Bluesnap_Payment_Model_Api_Logger
54
  }
55
  }
56
 
57
- function logError($request, $response, $responseCode, $message, $method = null, $incrementId = null, $url = null)
58
  {
59
  $event = new Varien_Object();
60
 
16
  $this->_loggers['mail'] = Mage::getsingleton('Bluesnap_Payment_Model_Logger_Mail');
17
  }
18
 
19
+ function logSuccess($request, $response, $responseCode, $message, $method = null, $incrementId = null, $url = " ")
20
  {
21
  $event = new Varien_Object();
22
  $event->setPriority(Zend_Log::INFO);
54
  }
55
  }
56
 
57
+ function logError($request, $response, $responseCode, $message, $method = null, $incrementId = null, $url = " ")
58
  {
59
  $event = new Varien_Object();
60
 
app/code/community/Bluesnap/Payment/Model/Api/Refund.php CHANGED
@@ -43,6 +43,7 @@ class Bluesnap_Payment_Model_Api_Refund extends Bluesnap_Payment_Model_Api_Abstr
43
 
44
  $requestUrl = $url . '?' . $query;
45
  $response = $this->_request($requestUrl, null, self::HTTP_METHOD_PUT);
 
46
  if ($this->_curlInfo['http_code'] != 204 || !empty($response)) {
47
  // error
48
  try {
@@ -55,14 +56,14 @@ class Bluesnap_Payment_Model_Api_Refund extends Bluesnap_Payment_Model_Api_Abstr
55
  $xml = $response;
56
  $message = $response;
57
  }
58
-
59
  $e = Mage::exception('Bluesnap_Payment', $message,
60
  (int)$xml->message->code);
61
 
62
  Mage::logException($e);
63
  $this->getLogger()->logError($requestUrl, $this->_responseXml, 0, $message, "refund", $incrementId, $url);
64
-
65
- throw $e;
 
66
 
67
  } else {
68
  $this->getLogger()->logSuccess($requestUrl, '204/successful', 0, "refunded", "refund", $incrementId, $url);
43
 
44
  $requestUrl = $url . '?' . $query;
45
  $response = $this->_request($requestUrl, null, self::HTTP_METHOD_PUT);
46
+
47
  if ($this->_curlInfo['http_code'] != 204 || !empty($response)) {
48
  // error
49
  try {
56
  $xml = $response;
57
  $message = $response;
58
  }
 
59
  $e = Mage::exception('Bluesnap_Payment', $message,
60
  (int)$xml->message->code);
61
 
62
  Mage::logException($e);
63
  $this->getLogger()->logError($requestUrl, $this->_responseXml, 0, $message, "refund", $incrementId, $url);
64
+
65
+ Mage::throwException($message);
66
+ //throw $e;
67
 
68
  } else {
69
  $this->getLogger()->logSuccess($requestUrl, '204/successful', 0, "refunded", "refund", $incrementId, $url);
app/code/community/Bluesnap/Payment/Model/Api/Saved.php CHANGED
@@ -73,18 +73,37 @@ class Bluesnap_Payment_Model_Api_Saved extends Bluesnap_Payment_Model_Api_Cse
73
 
74
  } else $sum['amount'] = 1;
75
 
76
- if ($payment->getCcNumber()) {
77
- $this->addCardToShopper($payment, $sum, $bsShopperId);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
  } else {
80
  $this->updateShopperWithNoCC($payment, $sum, $bsShopperId);
81
-
82
  }
83
 
84
  $data1 = array(
85
  'web-info' => array(
86
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
87
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
88
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
89
  ),
90
  'order-details' => array(
@@ -93,7 +112,7 @@ class Bluesnap_Payment_Model_Api_Saved extends Bluesnap_Payment_Model_Api_Cse
93
  'shopper-id' => $bsShopperId,
94
  'credit-card' => array(
95
  'card-last-four-digits' => $payment->getCcLast4(),
96
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
97
  ),
98
  'fraud-info' => array(
99
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
@@ -208,16 +227,36 @@ class Bluesnap_Payment_Model_Api_Saved extends Bluesnap_Payment_Model_Api_Cse
208
  else $this->updateShopperWithNoCC($payment, $sum, $bsShopperId);
209
  }
210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  $data = array(
212
  'ordering-shopper' => array(
213
  'shopper-id' => $bsShopperId,
214
  'credit-card' => array(
215
  'card-last-four-digits' => $payment->getCcLast4(),
216
- 'card-type' => (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : ''),
217
  ),
218
  'web-info' => array(
219
- 'ip' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
220
- 'remote-host' => !empty($order->getRemoteIp()) ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
221
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
222
  ),
223
  'fraud-info' => array(
@@ -269,8 +308,9 @@ class Bluesnap_Payment_Model_Api_Saved extends Bluesnap_Payment_Model_Api_Cse
269
  $response = $this->parseCreateResponse($response, $bsShopperId, $order);
270
  } catch (Exception $e) {
271
  Mage::logException($e);
272
- //throw $e;
273
- throw new Bluesnap_Payment_Model_Api_Exception(Mage::helper('core')->__('Something went wrong during placing your order. Please contact support.'));
 
274
  }
275
 
276
  $this->getLogger()->logSuccess($this->_requestXml, $this->_responseXml, 0, "createOrder success", "createOrder", $order->getIncrementId(), $url);
73
 
74
  } else $sum['amount'] = 1;
75
 
76
+ if (Mage::app()->getRequest()->getParam('encryptedCreditCard')) {
77
+ $response = $this->addCardToShopper($payment, $sum, $bsShopperId);
78
+
79
+ $CCs = $response->descend("shopper-info/payment-info/credit-cards-info/credit-card-info");
80
+
81
+ foreach($CCs AS $cc) {
82
+ if(
83
+ (int)$cc->descend("credit-card/expiration-month") == $payment->getCcExpMonth() &&
84
+ (int)$cc->descend("credit-card/expiration-year") == $payment->getCcExpYear() &&
85
+ (int)$cc->descend("credit-card/card-last-four-digits") == $payment->getCcLast4()
86
+ ) {
87
+ $validCC = $cc->descend("credit-card");
88
+ }
89
+ }
90
+
91
+ if($validCC) {
92
+ $type = (string) $validCC->descend("card-type");
93
+ $payment->setCcType($type)->save();
94
+ } else {
95
+ $type = (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : '');
96
+ }
97
 
98
  } else {
99
  $this->updateShopperWithNoCC($payment, $sum, $bsShopperId);
100
+ $type = (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : '');
101
  }
102
 
103
  $data1 = array(
104
  'web-info' => array(
105
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
106
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
107
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
108
  ),
109
  'order-details' => array(
112
  'shopper-id' => $bsShopperId,
113
  'credit-card' => array(
114
  'card-last-four-digits' => $payment->getCcLast4(),
115
+ 'card-type' => $type,
116
  ),
117
  'fraud-info' => array(
118
  'fraud-session-id' => Mage::getSingleton('checkout/session')->getSessionId(),
227
  else $this->updateShopperWithNoCC($payment, $sum, $bsShopperId);
228
  }
229
 
230
+ $response = $this->retrieveShopper($bsShopperId, $action);
231
+ Mage::log($response,NULL,'fff.log');
232
+ $CCs = $response->descend("shopper-info/payment-info/credit-cards-info/credit-card-info");
233
+
234
+ foreach($CCs AS $cc) {
235
+ if(
236
+ (int)$cc->descend("credit-card/expiration-month") == $payment->getCcExpMonth() &&
237
+ (int)$cc->descend("credit-card/expiration-year") == $payment->getCcExpYear() &&
238
+ (int)$cc->descend("credit-card/card-last-four-digits") == $payment->getCcLast4()
239
+ ) {
240
+ $validCC = $cc->descend("credit-card");
241
+ }
242
+ }
243
+
244
+ if($validCC) {
245
+ $type = (string) $validCC->descend("card-type");
246
+ $payment->setCcType($type)->save();
247
+ } else {
248
+ $type = (isset($this->cardTypes[$payment->getCcType()]) ? $this->cardTypes[$payment->getCcType()] : '');
249
+ }
250
  $data = array(
251
  'ordering-shopper' => array(
252
  'shopper-id' => $bsShopperId,
253
  'credit-card' => array(
254
  'card-last-four-digits' => $payment->getCcLast4(),
255
+ 'card-type' => $type,
256
  ),
257
  'web-info' => array(
258
+ 'ip' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
259
+ 'remote-host' => $order->getRemoteIp() ? $order->getRemoteIp() : $_SERVER['REMOTE_ADDR'],
260
  'user-agent' => Mage::helper('core/http')->getHttpUserAgent(),
261
  ),
262
  'fraud-info' => array(
308
  $response = $this->parseCreateResponse($response, $bsShopperId, $order);
309
  } catch (Exception $e) {
310
  Mage::logException($e);
311
+
312
+ $error_message = Mage::helper('bluesnap')->getErroMessage($error_code);
313
+ throw new Bluesnap_Payment_Model_Api_Exception($error_message);
314
  }
315
 
316
  $this->getLogger()->logSuccess($this->_requestXml, $this->_responseXml, 0, "createOrder success", "createOrder", $order->getIncrementId(), $url);
app/code/community/Bluesnap/Payment/Model/Directory/Currency/Import.php CHANGED
@@ -46,7 +46,7 @@ class Bluesnap_Payment_Model_Directory_Currency_Import extends Mage_Directory_Mo
46
  $this->_messages[] = Mage::helper('directory')->__('Cannot retrieve BlueSnap rate from %s.', $this->_url);
47
  return null;
48
  }
49
- $this->_messages['info'][] = "Successfully retrieved $currencyFrom => $currencyTo = " . $value / self::AMOUNT;
50
 
51
  $this->getLogger()->logSuccess('convert rates import', "Successfully retrieved $currencyFrom => $currencyTo = " . $value / self::AMOUNT, 0, "Import Rates success", "convert rates", '', '');
52
 
46
  $this->_messages[] = Mage::helper('directory')->__('Cannot retrieve BlueSnap rate from %s.', $this->_url);
47
  return null;
48
  }
49
+ // $this->_messages['info'][] = "Successfully retrieved $currencyFrom => $currencyTo = " . $value / self::AMOUNT;
50
 
51
  $this->getLogger()->logSuccess('convert rates import', "Successfully retrieved $currencyFrom => $currencyTo = " . $value / self::AMOUNT, 0, "Import Rates success", "convert rates", '', '');
52
 
app/code/community/Bluesnap/Payment/Model/Logger/Db.php CHANGED
@@ -9,11 +9,11 @@ class Bluesnap_Payment_Model_Logger_Db extends Zend_Log_Writer_Db
9
 
10
  public function __construct($db = null, $table = null, $columnMap = null)
11
  {
12
-
13
  //parent::__construct(null);
14
  $resource = Mage::getSingleton('core/resource');
15
  $this->_db = $resource->getConnection('core_write');
16
-
17
  $this->_table = 'bluesnap_api_logger';
18
 
19
  $this->_columnMap = array(
@@ -51,10 +51,24 @@ class Bluesnap_Payment_Model_Logger_Db extends Zend_Log_Writer_Db
51
  {
52
  $this->_filters = array();
53
  }
54
-
55
- function _write($event)
56
  {
57
- parent::_write($event);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
  }
60
 
9
 
10
  public function __construct($db = null, $table = null, $columnMap = null)
11
  {
12
+
13
  //parent::__construct(null);
14
  $resource = Mage::getSingleton('core/resource');
15
  $this->_db = $resource->getConnection('core_write');
16
+
17
  $this->_table = 'bluesnap_api_logger';
18
 
19
  $this->_columnMap = array(
51
  {
52
  $this->_filters = array();
53
  }
54
+
55
+ function _write($event)
56
  {
57
+ if ($this->_db === null) {
58
+ #require_once 'Zend/Log/Exception.php';
59
+ throw new Zend_Log_Exception('Database adapter is null');
60
+ }
61
+
62
+ if ($this->_columnMap === null) {
63
+ $dataToInsert = $event;
64
+ } else {
65
+ $dataToInsert = array();
66
+ foreach ($this->_columnMap as $columnName => $fieldKey) {
67
+ $dataToInsert[$columnName] = $event[$fieldKey];
68
+ }
69
+ }
70
+
71
+ $this->_db->insert($this->_table, $dataToInsert);
72
  }
73
  }
74
 
app/code/community/Bluesnap/Payment/Model/Observer.php CHANGED
@@ -196,94 +196,7 @@ class Bluesnap_Payment_Model_Observer
196
 
197
  }
198
 
199
- //check if server is secured
200
- function checkSecure($observer)
201
- {
202
- $postData = $observer->getEvent()->getData();
203
- if ($this->getIsSandbox($postData) == '0') {
204
- if (!isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "on") {
205
- // set sandbox mode becasue admin is not secured
206
- $this->setSandbox($postData);
207
-
208
- //check if ssl is installed to show the right message
209
- if (!$this->is_exist_ssl(Mage::getBaseUrl())) Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you are using HTTPS.'));
210
- else Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in admin.'));
211
- } else {
212
- if (!Mage::app()->getStore()->isFrontUrlSecure()) {
213
- $this->setSandbox($postData);
214
- Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in frontend.'));
215
-
216
- }
217
- if (!Mage::app()->getStore()->isAdminUrlSecure()) {
218
- $this->setSandbox($postData);
219
- Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in admin.'));
220
- }
221
-
222
- }
223
- }
224
- }
225
-
226
- private function getIsSandbox($postData)
227
- {
228
- if (is_null($postData['store']) && $postData['website']) //check for website scope
229
- {
230
- $scopeId = Mage::getModel('core/website')->load($postData['website'])->getId();
231
- $isSnadBox = Mage::app()->getWebsite($scopeId)->getConfig('bluesnap/general/is_sandbox_mode');
232
- } elseif ($postData['store']) //check for store scope
233
- {
234
- $scopeId = Mage::getModel('core/store')->load($postData['store'])->getId();
235
- $isSnadBox = Mage::app()->getWebsite($scopeId)->getConfig('bluesnap/general/is_sandbox_mode');
236
- } else //for default scope
237
- {
238
- $scopeId = 0;
239
- $isSnadBox = Mage::getStoreConfig('bluesnap/general/is_sandbox_mode');
240
- }
241
-
242
- return $isSnadBox;
243
- }
244
-
245
- private function setSandbox($postData)
246
- {
247
- if (is_null($postData['store']) && $postData['website']) //check for website scope
248
- {
249
- $scopeId = Mage::getModel('core/website')->load($postData['website'])->getId();
250
- $currentScope = 'websites';
251
- } elseif ($postData['store']) //check for store scope
252
- {
253
- $scopeId = Mage::getModel('core/store')->load($postData['store'])->getId();
254
- $currentScope = 'stores';
255
- } else //for default scope
256
- {
257
- $scopeId = 0;
258
- $currentScope = 'default';
259
- }
260
-
261
- if ($currentScop == 'default') Mage::getConfig()->saveConfig('bluesnap/general/is_sandbox_mode', '1');
262
- else Mage::getConfig()->saveConfig('bluesnap/general/is_sandbox_mode', '1', $currentScope, $scopeId);
263
- }
264
-
265
- //we check if ssl is installed on server and user is working on non secure page
266
-
267
- private function is_exist_ssl($baseurl)
268
- {
269
- $domain=parse_url($baseurl, PHP_URL_HOST);
270
- $ch = curl_init();
271
- curl_setopt($ch, CURLOPT_URL, "https://" . $domain);
272
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
273
- curl_setopt($ch, CURLOPT_HEADER, 0);
274
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
275
- curl_exec($ch);
276
-
277
- if (!curl_error($ch)) {
278
- $info = curl_getinfo($ch);
279
- if ($info['http_code'] == 200) {
280
- return true;
281
- }
282
- return false;
283
- } else {
284
- return false;
285
- }
286
- }
287
  public function sendCron() {
288
  $days = Mage::getStoreConfig('bluesnap/logger/collect_data_for');
289
 
@@ -294,4 +207,23 @@ class Bluesnap_Payment_Model_Observer
294
  }
295
  $collection->save();
296
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
196
 
197
  }
198
 
199
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  public function sendCron() {
201
  $days = Mage::getStoreConfig('bluesnap/logger/collect_data_for');
202
 
207
  }
208
  $collection->save();
209
  }
210
+
211
+ public function addJsOnestep($observer){
212
+ $controller = $observer->getAction();
213
+ $controllerName = $controller->getRequest()->getRouteName();
214
+ $exist = strpos($controllerName, 'onestepcheckout');
215
+ if ($exist !== FALSE) {
216
+ $layout = $controller->getLayout();
217
+ //if( $layout->getBlock('head')){
218
+ $layout->getBlock('head')->addLinkRel('text/javascript','https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js');
219
+ $layout->getBlock('head')->addItem('js','bluesnap/credit-card-detect.js');
220
+ $layout->getBlock('head')->addItem('js','bluesnap/payform.js');
221
+ $layout->getBlock('head')->addItem('js','bluesnap/bsadmin.js');
222
+ $layout->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
223
+ $layout->getBlock('head')->addItem('js','lib/jquery/jquery-ui/jquery-ui.js');
224
+ $layout->getBlock('head')->addItem('skin_css', 'css/bluesnap/buynow/checkout.css');
225
+ $layout->getBlock('head')->addItem('js_css', 'lib/jquery/jquery-ui/jquery-ui.css');
226
+ //}
227
+ }
228
+ }
229
  }
app/code/community/Bluesnap/Payment/Model/Payment/Cse.php CHANGED
@@ -56,9 +56,9 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
56
 
57
  if ($quote) {
58
  $isApplicableMasks = array(
59
- self::CHECK_USE_CHECKOUT,
60
- self::CHECK_USE_FOR_COUNTRY,
61
- self::CHECK_ORDER_TOTAL_MIN_MAX
62
  );
63
  foreach ($isApplicableMasks as $mask) {
64
  if (!$this->isApplicableToQuote($quote, $mask)) {
@@ -212,6 +212,8 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
212
  $info->setCcLast($cseCcLast);
213
  $info->setCcLast4($cseCcLast);
214
  $info->setAdditionalInformation('is_saved', false);
 
 
215
  }
216
 
217
  /**
@@ -248,11 +250,11 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
248
  if ($result['http_code'] == '201') {
249
  $order = $payment->getOrder();
250
 
251
- if (empty($order->getRemoteIp())) $payment->unsAdditionalInformation();
252
 
253
  $payment->setAdditionalInformation('transaction_type', 'shopping-context');
254
 
255
- if (!empty($order->getRemoteIp())) $payment->setAdditionalInformation('is_saved', true);
256
  //getting the tranasaction id from location info
257
  $loc = explode("/", $result['location']);
258
  $transaction_id = $loc[count($loc) - 1];
@@ -275,14 +277,14 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
275
  sprintf("BlueSnap Credit/Debit card authorized transaction. Order ID: \"%s\".", $transaction_id));
276
 
277
  } else {
278
- $this->processError($result);
279
  }
280
 
281
  } else {
282
  $message = 'Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time';
283
 
284
  Mage::log($message, Zend_Log::ERR);
285
- $this->getLogger()->logError("", "", 0, $message, "cse::capture", $payment->getOrder()->getIncrementId());
286
 
287
  Mage::throwException(Mage::helper('bluesnap')->__($message));
288
 
@@ -294,7 +296,7 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
294
  * @param $result
295
  * @throws Mage_Core_Exception
296
  */
297
- public function processError($result)
298
  {
299
  $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
300
  if (isset($result['message']['description'])) {
@@ -304,7 +306,8 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
304
  $error .= "\r\n" . ' (' . $result['message']['invalid-property']['message-value'] . ')';
305
  }
306
  }
307
- $this->getLogger()->logError("", "", "", $result['message']['description'], "cse::capture");
 
308
  Mage::throwException($error);
309
  }
310
 
@@ -318,6 +321,7 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
318
  */
319
  public function capture(Varien_Object $payment, $amount)
320
  {
 
321
  $apiType = $payment->getAdditionalInformation('is_saved') ? 'saved' : 'cse';
322
  $type = $payment->getAdditionalInformation('transaction_type') == 'shopping-context' ? 'auth' : 'capture';
323
 
@@ -342,10 +346,11 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
342
  if ($result = $api->placeOrder($payment, $bsShopperId)) {
343
  if (!empty($result['invoiceId'])) {
344
  $bsTransactionId = $result['invoiceId'];
345
- //seems bug? itzik
346
- //$status = Bluesnap_Payment_Helper_Config::BLUESNAP_DEFAULT_INVOICE_STATUS;
 
347
  $status = $result['status'];
348
- if (empty($order->getRemoteIp())) $payment->unsAdditionalInformation();
349
 
350
  /* @var $order Mage_Sales_Model_Order */
351
 
@@ -417,7 +422,7 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
417
  }
418
  } else {
419
  $message = 'Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time';
420
-
421
  Mage::log($message, Zend_Log::ERR);
422
  $this->getLogger()->logError("", "", 0, $message, "cse::capture", $payment->getOrder()->getIncrementId());
423
 
@@ -440,7 +445,7 @@ class Bluesnap_Payment_Model_Payment_Cse extends Bluesnap_Payment_Model_Payment_
440
 
441
  $order = $payment->getOrder();
442
 
443
- if (empty($order->getRemoteIp())) $payment->unsAdditionalInformation();
444
 
445
  $payment->setAdditionalInformation('transactionAmount', $result['transaction']['amount']);
446
  $payment->setAdditionalInformation('transactionCurrency', $result['transaction']['currency']);
56
 
57
  if ($quote) {
58
  $isApplicableMasks = array(
59
+ // self::CHECK_USE_CHECKOUT,
60
+ // self::CHECK_USE_FOR_COUNTRY,
61
+ // self::CHECK_ORDER_TOTAL_MIN_MAX
62
  );
63
  foreach ($isApplicableMasks as $mask) {
64
  if (!$this->isApplicableToQuote($quote, $mask)) {
212
  $info->setCcLast($cseCcLast);
213
  $info->setCcLast4($cseCcLast);
214
  $info->setAdditionalInformation('is_saved', false);
215
+
216
+ return $info;
217
  }
218
 
219
  /**
250
  if ($result['http_code'] == '201') {
251
  $order = $payment->getOrder();
252
 
253
+ if (!$order->getRemoteIp()) $payment->unsAdditionalInformation();
254
 
255
  $payment->setAdditionalInformation('transaction_type', 'shopping-context');
256
 
257
+ if ($order->getRemoteIp()) $payment->setAdditionalInformation('is_saved', true);
258
  //getting the tranasaction id from location info
259
  $loc = explode("/", $result['location']);
260
  $transaction_id = $loc[count($loc) - 1];
277
  sprintf("BlueSnap Credit/Debit card authorized transaction. Order ID: \"%s\".", $transaction_id));
278
 
279
  } else {
280
+ $this->processError($result,'authorize');
281
  }
282
 
283
  } else {
284
  $message = 'Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time';
285
 
286
  Mage::log($message, Zend_Log::ERR);
287
+ $this->getLogger()->logError("", "", 0, $message, "cse::authorize", $payment->getOrder()->getIncrementId());
288
 
289
  Mage::throwException(Mage::helper('bluesnap')->__($message));
290
 
296
  * @param $result
297
  * @throws Mage_Core_Exception
298
  */
299
+ public function processError($result, $type=NULL)
300
  {
301
  $error = Mage::helper('bluesnap')->__('Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time');
302
  if (isset($result['message']['description'])) {
306
  $error .= "\r\n" . ' (' . $result['message']['invalid-property']['message-value'] . ')';
307
  }
308
  }
309
+ if($type=='authorize') $this->getLogger()->logError("", "", "", $error, "cse::authorize");
310
+ else $this->getLogger()->logError("", "", "", $result['message']['description'], "cse::capture");
311
  Mage::throwException($error);
312
  }
313
 
321
  */
322
  public function capture(Varien_Object $payment, $amount)
323
  {
324
+ //Mage::log($payment->getData(),NULL,'bs.log');
325
  $apiType = $payment->getAdditionalInformation('is_saved') ? 'saved' : 'cse';
326
  $type = $payment->getAdditionalInformation('transaction_type') == 'shopping-context' ? 'auth' : 'capture';
327
 
346
  if ($result = $api->placeOrder($payment, $bsShopperId)) {
347
  if (!empty($result['invoiceId'])) {
348
  $bsTransactionId = $result['invoiceId'];
349
+
350
+ // Mage::log('error101',NULL,'errorTest.log');
351
+
352
  $status = $result['status'];
353
+ if (!$order->getRemoteIp()) $payment->unsAdditionalInformation();
354
 
355
  /* @var $order Mage_Sales_Model_Order */
356
 
422
  }
423
  } else {
424
  $message = 'Unfortunately the transaction cannot be processed at this time due to an unspecified error, please try a different card or try again at a later time';
425
+
426
  Mage::log($message, Zend_Log::ERR);
427
  $this->getLogger()->logError("", "", 0, $message, "cse::capture", $payment->getOrder()->getIncrementId());
428
 
445
 
446
  $order = $payment->getOrder();
447
 
448
+ if ($order->getRemoteIp()) $payment->unsAdditionalInformation();
449
 
450
  $payment->setAdditionalInformation('transactionAmount', $result['transaction']['amount']);
451
  $payment->setAdditionalInformation('transactionCurrency', $result['transaction']['currency']);
app/code/community/Bluesnap/Payment/Model/Sales/Order/Payment.php CHANGED
@@ -116,8 +116,8 @@ class Bluesnap_Payment_Model_Sales_Order_Payment extends Mage_Sales_Model_Order_
116
  }
117
  // check for authorization amount to be equal to grand total
118
  $this->setShouldCloseParentTransaction(false);
119
- $isSameCurrency = $this->_isSameCurrency();
120
- if (!$isSameCurrency || !$this->_isCaptureFinal($amount)) {
121
  $this->setIsFraudDetected(true);
122
  }
123
 
116
  }
117
  // check for authorization amount to be equal to grand total
118
  $this->setShouldCloseParentTransaction(false);
119
+ // $isSameCurrency = $this->_isSameCurrency();
120
+ if (!$this->_isCaptureFinal($amount)) {
121
  $this->setIsFraudDetected(true);
122
  }
123
 
app/code/community/Bluesnap/Payment/Model/Sslvalidation.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Bluesnap_Payment_Model_Sslvalidation extends Mage_Core_Model_Config_Data
3
+ {
4
+ public function save()
5
+ {
6
+ $isSandbox = $this->getValue();
7
+
8
+ if($isSandbox == 0) //exit if we're less than 10 digits long
9
+ {
10
+ $canProceed = $this->checkSecure($isSandbox);
11
+
12
+ switch ($canProceed) {
13
+ case 0:
14
+ Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you are using HTTPS.'));
15
+ break;
16
+ case 2:
17
+ Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in admin.'));
18
+ break;
19
+ case 3:
20
+ Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in frontend.'));
21
+ break;
22
+ case 4:
23
+ Mage::throwException(Mage::helper('bluesnap')->__('Due to Payment Security reasons, BlueSnap’s payment can’t be set to production on an unsecured page. Please ensure you enable secure URLs in admin.'));
24
+ break;
25
+ }
26
+ if($canProceed!=1) {
27
+ exit();
28
+ }
29
+ }
30
+
31
+ return parent::save(); //call original save method so whatever happened
32
+ //before still happens (the value saves)
33
+ }
34
+
35
+ //check if server is secured
36
+ function checkSecure($isSandbox)
37
+ {
38
+ if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "on") {
39
+ // set sandbox mode becasue admin is not secured
40
+ $this->setSandbox($postData);
41
+
42
+ //check if ssl is installed to show the right message
43
+ if (!$this->is_exist_ssl(Mage::getBaseUrl())) return 0;
44
+ else return 2;
45
+ } else {
46
+ if (!$this->checkAllwebsites()) {
47
+ return 3;
48
+ }
49
+ if (!Mage::app()->getStore()->isAdminUrlSecure()) {
50
+ return 4;
51
+ }
52
+ }
53
+ return 1;
54
+ }
55
+
56
+
57
+ private function checkAllwebsites(){
58
+ foreach (Mage::app()->getWebsites() as $website) {
59
+ if(Mage::app()->getWebsite($website->getId())->getConfig('web/secure/use_in_frontend')!=1) return false;
60
+ }
61
+ return true;
62
+ }
63
+
64
+ private function getIsSandbox($postData)
65
+ {
66
+ if (is_null($postData['store']) && $postData['website']) //check for website scope
67
+ {
68
+ $scopeId = Mage::getModel('core/website')->load($postData['website'])->getId();
69
+ $isSnadBox = Mage::app()->getWebsite($scopeId)->getConfig('bluesnap/general/is_sandbox_mode');
70
+ } elseif ($postData['store']) //check for store scope
71
+ {
72
+ $scopeId = Mage::getModel('core/store')->load($postData['store'])->getId();
73
+ $isSnadBox = Mage::app()->getWebsite($scopeId)->getConfig('bluesnap/general/is_sandbox_mode');
74
+ } else //for default scope
75
+ {
76
+ $scopeId = 0;
77
+ $isSnadBox = Mage::getStoreConfig('bluesnap/general/is_sandbox_mode');
78
+ }
79
+
80
+ return $isSnadBox;
81
+ }
82
+
83
+
84
+ private function setSandbox($postData)
85
+ {
86
+ if (is_null($postData['store']) && $postData['website']) //check for website scope
87
+ {
88
+ $scopeId = Mage::getModel('core/website')->load($postData['website'])->getId();
89
+ $currentScope = 'websites';
90
+
91
+ } elseif ($postData['store']) //check for store scope
92
+ {
93
+
94
+ $scopeId = Mage::getModel('core/store')->load($postData['store'])->getId();
95
+ $currentScope = 'stores';
96
+
97
+ } else //for default scope
98
+ {
99
+ $scopeId = 0;
100
+ $currentScope = 'default';
101
+ }
102
+
103
+ if ($currentScop == 'default') {
104
+ Mage::getConfig()->saveConfig('bluesnap/general/is_sandbox_mode', '1');
105
+
106
+ }
107
+ else Mage::getConfig()->saveConfig('bluesnap/general/is_sandbox_mode', '1', $currentScope, $scopeId);
108
+ }
109
+
110
+ //we check if ssl is installed on server and user is working on non secure page
111
+
112
+ private function is_exist_ssl($baseurl)
113
+ {
114
+ $domain=parse_url($baseurl, PHP_URL_HOST);
115
+ $ch = curl_init();
116
+ curl_setopt($ch, CURLOPT_URL, "https://" . $domain);
117
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
118
+ curl_setopt($ch, CURLOPT_HEADER, 0);
119
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
120
+ curl_exec($ch);
121
+
122
+ if (!curl_error($ch)) {
123
+ $info = curl_getinfo($ch);
124
+ if ($info['http_code'] == 200) {
125
+ return true;
126
+ }
127
+ return false;
128
+ } else {
129
+ return false;
130
+ }
131
+ }
132
+ }
app/code/community/Bluesnap/Payment/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Bluesnap_Payment>
5
- <version>2.0.2.4</version>
6
  </Bluesnap_Payment>
7
  </modules>
8
 
@@ -255,15 +255,6 @@
255
  </modules>
256
  </translate>
257
  <events>
258
- <admin_system_config_changed_section_bluesnap>
259
- <observers>
260
- <bluesnap_system_config_changed_section_bluesnap>
261
- <type>singleton</type>
262
- <class>Bluesnap_Payment_Model_Observer</class>
263
- <method>checkSecure</method>
264
- </bluesnap_system_config_changed_section_bluesnap>
265
- </observers>
266
- </admin_system_config_changed_section_bluesnap>
267
  <sales_order_grid_collection_load_before_>
268
  <observers>
269
  <bluesnap_sales_order_grid_collection_load_before>
@@ -312,6 +303,8 @@
312
  <general>
313
  <protection_key backend_model="adminhtml/system_config_backend_encrypted"/>
314
  <api_password backend_model="adminhtml/system_config_backend_encrypted"/>
 
 
315
  </general>
316
  <logger>
317
  <mail_subject>Api Alert</mail_subject>
2
  <config>
3
  <modules>
4
  <Bluesnap_Payment>
5
+ <version>2.0.3.2</version>
6
  </Bluesnap_Payment>
7
  </modules>
8
 
255
  </modules>
256
  </translate>
257
  <events>
 
 
 
 
 
 
 
 
 
258
  <sales_order_grid_collection_load_before_>
259
  <observers>
260
  <bluesnap_sales_order_grid_collection_load_before>
303
  <general>
304
  <protection_key backend_model="adminhtml/system_config_backend_encrypted"/>
305
  <api_password backend_model="adminhtml/system_config_backend_encrypted"/>
306
+ <bluesnap_general_is_sandbox_mode>1</bluesnap_general_is_sandbox_mode>
307
+ <include_jquery>0</include_jquery>
308
  </general>
309
  <logger>
310
  <mail_subject>Api Alert</mail_subject>
app/code/community/Bluesnap/Payment/etc/system.xml CHANGED
@@ -191,6 +191,16 @@
191
  <show_in_website>1</show_in_website>
192
  <show_in_store>1</show_in_store>
193
  <fields>
 
 
 
 
 
 
 
 
 
 
194
  <store_id translate="label" module="bluesnap">
195
  <label>Store ID</label>
196
  <comment>Store id provided by BlueSnap when you signed up for an account.</comment>
@@ -241,7 +251,9 @@
241
  <show_in_store>0</show_in_store>
242
  <validate>validate-number</validate>
243
  </order_contract_id>
 
244
  <is_sandbox_mode translate="label" module="bluesnap">
 
245
  <label>Sandbox Mode</label>
246
  <comment>Place BlueSnap payment gateway in testing (sandbox) mode</comment>
247
  <frontend_type>select</frontend_type>
@@ -283,7 +295,7 @@
283
 
284
  </display_base_currency_to_customer>
285
 
286
- <callback_url translate="label" module="bluesnap">
287
  <label>Callback Url</label>
288
  <comment>Back to seller url.</comment>
289
  <frontend_type>text</frontend_type>
@@ -292,9 +304,18 @@
292
  <show_in_website>1</show_in_website>
293
  <show_in_store>0</show_in_store>
294
 
295
- </callback_url>
296
-
297
 
 
 
 
 
 
 
 
 
 
 
298
  </fields>
299
  </general>
300
  <logger translate="label" module="bluesnap">
191
  <show_in_website>1</show_in_website>
192
  <show_in_store>1</show_in_store>
193
  <fields>
194
+ <merchant_id translate="label" module="bluesnap">
195
+ <label>Merchant ID</label>
196
+ <comment>Merchant id provided by BlueSnap.</comment>
197
+ <frontend_type>text</frontend_type>
198
+ <sort_order>10</sort_order>
199
+ <show_in_default>1</show_in_default>
200
+ <show_in_website>1</show_in_website>
201
+ <show_in_store>0</show_in_store>
202
+ <validate>validate-number</validate>
203
+ </merchant_id>
204
  <store_id translate="label" module="bluesnap">
205
  <label>Store ID</label>
206
  <comment>Store id provided by BlueSnap when you signed up for an account.</comment>
251
  <show_in_store>0</show_in_store>
252
  <validate>validate-number</validate>
253
  </order_contract_id>
254
+
255
  <is_sandbox_mode translate="label" module="bluesnap">
256
+ <backend_model>bluesnap/sslvalidation</backend_model>
257
  <label>Sandbox Mode</label>
258
  <comment>Place BlueSnap payment gateway in testing (sandbox) mode</comment>
259
  <frontend_type>select</frontend_type>
295
 
296
  </display_base_currency_to_customer>
297
 
298
+ <!-- <callback_url translate="label" module="bluesnap">
299
  <label>Callback Url</label>
300
  <comment>Back to seller url.</comment>
301
  <frontend_type>text</frontend_type>
304
  <show_in_website>1</show_in_website>
305
  <show_in_store>0</show_in_store>
306
 
307
+ </callback_url> -->
 
308
 
309
+ <include_jquery translate="label" module="bluesnap">
310
+ <label>Include jQuery library</label>
311
+ <frontend_type>select</frontend_type>
312
+ <sort_orer>60</sort_orer>
313
+ <source_model>adminhtml/system_config_source_yesno</source_model>
314
+ <show_in_default>1</show_in_default>
315
+ <show_in_website>1</show_in_website>
316
+ <show_in_store>1</show_in_store>
317
+ <comment>Bluesnap requires this library to be installed in order to run transactions successfully. If you do not have this library already installed as part of an existing plugin or extension, please select "Yes"</comment>
318
+ </include_jquery>
319
  </fields>
320
  </general>
321
  <logger translate="label" module="bluesnap">
app/code/community/Bluesnap/Payment/sql/bluesnap_setup/mysql4-upgrade-1.0.2-1.0.3.php CHANGED
@@ -6,8 +6,8 @@ $installer = $this;
6
  $installer->startSetup();
7
 
8
  $installer->run(
9
- "DROP TABLE IF EXISTS `bluesnap_api_logger`;
10
- CREATE TABLE `bluesnap_api_logger` (
11
  `event_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
12
  `request` text,
13
  `response` text,
6
  $installer->startSetup();
7
 
8
  $installer->run(
9
+ "DROP TABLE IF EXISTS ".$installer->getTable('bluesnap/logger').";
10
+ CREATE TABLE ".$installer->getTable('bluesnap/logger')." (
11
  `event_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
12
  `request` text,
13
  `response` text,
app/code/community/Bluesnap/Payment/sql/bluesnap_setup/mysql4-upgrade-1.0.3-1.0.4.php CHANGED
@@ -1,14 +1,14 @@
1
- <?php
2
-
3
- $installer = $this;
4
- $installer->startSetup();
5
-
6
- $installer->getConnection()
7
- ->addColumn($installer->getTable('bluesnap/logger'), 'request_url', array(
8
- 'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
9
- 'nullable' => false,
10
- 'length' => 255,
11
- 'comment' => 'request url'
12
- ));
13
-
14
  $installer->endSetup();
1
+ <?php
2
+
3
+ $installer = $this;
4
+ $installer->startSetup();
5
+
6
+ $installer->getConnection()
7
+ ->addColumn($installer->getTable('bluesnap/logger'), 'request_url', array(
8
+ 'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
9
+ 'nullable' => false,
10
+ 'length' => 255,
11
+ 'comment' => 'request url'
12
+ ));
13
+
14
  $installer->endSetup();
app/design/frontend/base/default/layout/bluesnap/payment.xml CHANGED
@@ -74,46 +74,47 @@
74
  </reference>
75
  </bluesnap_checkout_callback>
76
 
77
- <!-- Add CSE script on the checkout page -->
78
- <checkout_onepage_index>
79
- <reference name="head">
80
- <action method="addItem">
81
- <type>skin_css</type>
82
- <name>css/bluesnap/buynow/checkout.css</name>
83
- </action>
84
 
85
- <action method="addItem">
86
- <type>skin_js</type>
87
- <name>js/bluesnap/credit-card-detect.js</name>
88
- </action>
89
-
90
- <action method="addItem">
91
- <type>skin_js</type>
92
- <name>js/bluesnap/payform.js</name>
93
- </action>
94
 
95
- <action method="addItem">
96
- <type>js</type>
97
- <name>lib/jquery/jquery-ui/jquery-ui.js</name>
98
- </action>
99
- <action method="addItem">
100
- <type>js_css</type>
101
- <name>lib/jquery/jquery-ui/jquery-ui.css</name>
102
- </action>
103
 
104
- <block type="core/text" name="bluesnap.cse">
105
- <action method="setText">
106
- <text>
107
- <![CDATA[<script type="text/javascript" src="https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js"></script>]]>
108
- </text>
109
  </action>
110
- </block>
111
- </reference>
112
- </checkout_onepage_index>
113
-
114
-
115
-
116
-
117
-
 
 
 
 
118
 
 
 
 
 
 
 
 
 
 
119
  </layout>
74
  </reference>
75
  </bluesnap_checkout_callback>
76
 
77
+ <checkout_onepage_index>
78
+ <reference name="head">
79
+ <action method="addItem">
80
+ <type>skin_css</type>
81
+ <name>css/bluesnap/buynow/checkout.css</name>
82
+ </action>
 
83
 
84
+ <action method="addItem">
85
+ <type>skin_js</type>
86
+ <name>js/bluesnap/credit-card-detect.js</name>
87
+ </action>
 
 
 
 
 
88
 
89
+ <action method="addItem">
90
+ <type>skin_js</type>
91
+ <name>js/bluesnap/payform.js</name>
92
+ </action>
 
 
 
 
93
 
94
+ <action method="addItem" ifconfig="bluesnap/general/include_jquery">
95
+ <type>js</type>
96
+ <name>lib/jquery/jquery-3.0.0.min.js</name>
 
 
97
  </action>
98
+ <action method="addItem" ifconfig="bluesnap/general/include_jquery">
99
+ <type>js</type>
100
+ <name>lib/jquery/bluesnap-noconflict.js</name>
101
+ </action>
102
+ <action method="addItem">
103
+ <type>js</type>
104
+ <name>lib/jquery/jquery-ui/jquery-ui.js</name>
105
+ </action>
106
+ <action method="addItem">
107
+ <type>js_css</type>
108
+ <name>lib/jquery/jquery-ui/jquery-ui.css</name>
109
+ </action>
110
 
111
+ <block type="core/text" name="bluesnap.cse">
112
+ <action method="setText">
113
+ <text>
114
+ <![CDATA[<script type="text/javascript" src="https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js"></script>]]>
115
+ </text>
116
+ </action>
117
+ </block>
118
+ </reference>
119
+ </checkout_onepage_index>
120
  </layout>
app/design/frontend/base/default/template/bluesnap/payment/form/cse.phtml CHANGED
@@ -2,41 +2,155 @@
2
  /**
3
  * @see Bluesnap_Payment_Block_Payment_Form_Cse
4
  * @var $this Bluesnap_Payment_Block_Payment_Form_Cse
5
- * //http://getspritexy.com/
6
  */
7
  ?>
8
-
9
  <?php $_code = $this->getMethodCode() ?>
10
- <?php
11
- $cards = $this->getCards() ?>
12
-
13
- <script type="text/javascript">// <![CDATA[
14
- jQuery( document ).ready(function($) {
15
- $('#cse_cc_number').creditCardType();
16
- $( ".tooltip" ).tooltip(
17
- {
18
- position: { my: 'center bottom', at: 'center top-10' },
19
- show: { effect: "fade", duration: 800 }
20
- }
21
- );
22
- });
23
- // jQuery.$.widget.tooltip.prototype.options.duration=800;
24
- // jQuery.$.widget.tooltip.prototype.options.effect='fadeIn';
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  function removeSpaceCc(el){
27
  var val = el.value.replace(/\s/g, "");
28
  document.getElementById("cse_cc_number").value=val;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  }
 
30
 
31
-
32
-
33
-
34
-
35
- // ]]></script>
36
-
37
-
38
-
39
- <ul class="form-list" id="payment_form_<?php echo $_code ?>" style="display:none;">
40
 
41
  <?php if (count($cards)): ?>
42
  <li>
@@ -54,7 +168,7 @@ $cards = $this->getCards() ?>
54
  </li>
55
  <?php endforeach ?>
56
  <li><a href="#"
57
- onclick="$('card-form').show();$('no_saved_card').checked=true;return false;"><?php echo $this->__('Provide another card') ?></a>
58
  <input type="radio" name="bluesnap_card_saved" id="no_saved_card" value="no"
59
  class="validate-one-required-by-name bluesnap_card_saved" style="display:none"/>
60
  </li>
@@ -62,18 +176,16 @@ $cards = $this->getCards() ?>
62
  </li>
63
  <?php endif ?>
64
  <li>
65
- <ul id="card-form" <?php if (count($cards)): ?>style="display:none;"<?php endif?>>
66
 
67
  <?php
68
  $showCcTypesDropdown = $this->getMethod()->getConfigData('show_cctypes_dropdown'); ?>
69
 
70
  <li style="display:<?php echo $showCcTypesDropdown ? 'block':'none'?>">
71
- <label for="<?php echo $_code ?>_cc_type"
72
- class="required"><em>*</em><?php echo $this->__('Credit Card Type') ?></label>
73
 
74
  <div class="input-box">
75
- <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]"
76
- class="required-entry validate-cc-type-select">
77
  <option value=""><?php echo $this->__('--Please Select--') ?></option>
78
  <?php $_ccType = $this->getInfoData('cc_type') ?>
79
  <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
@@ -114,20 +226,13 @@ $cards = $this->getCards() ?>
114
 
115
  <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]"
116
  title="<?php echo $this->__('Credit Card Number') ?>"
117
- class="input-text required-entry validate-number validate-cc-number validate-cc-type" value=""
118
- data-bluesnap="encryptedCreditCard" onchange="jQuery(this).val(jQuery(this).val().replace(/\s+/g, ''));"
119
 
120
  />
121
  <span id="cse_cc_number_valid" class="pli-cc pli-cc-valid" style="display: none;" ></span>
122
  <span id="cse_cc_number_not_valid" class="pli-cc pli-cc-not-valid tooltip" style="display: none;"
123
- title="<?php echo $this->__("Card Number should be between 12 and 21 characters long")?>"
124
- ></span>
125
-
126
-
127
-
128
-
129
-
130
-
131
 
132
 
133
  <input type="hidden" name="<?php echo $_code ?>_cc_last" id="<?php echo $_code ?>_cc_last" value=""/>
@@ -147,8 +252,6 @@ $cards = $this->getCards() ?>
147
  <?php endforeach ?>
148
  </select>
149
 
150
-
151
- ></span>
152
  </div>
153
  <div class="v-fix">
154
  <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
@@ -175,15 +278,13 @@ $cards = $this->getCards() ?>
175
  <div class="input-box">
176
  <div class="v-fix">
177
  <input type="text" title="<?php echo $this->__('Card Verification Number') ?>"
178
- class="input-text cvv required-entry validate-cc-cvn"
179
  id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" data-bluesnap="encryptedCvv"
180
- value=""/>
181
 
182
  <span id="cse_cc_cid_valid" class="pli-cc pli-cc-valid" style="display: none;" ></span>
183
  <span id="cse_cc_cid_not_valid" class="pli-cc pli-cc-not-valid tooltip" style="display: none;"
184
- title="<?php echo $this->__("Security Code should be between 3 and 4 characters long")?>"
185
-
186
- ></span>
187
 
188
  </div>
189
  <a href="#" class="cvv-what-is-this"><?php echo $this->__('What is this?') ?></a>
@@ -191,65 +292,77 @@ $cards = $this->getCards() ?>
191
  </li>
192
  <?php endif; ?>
193
  </ul>
194
- <iframe width='1' height='1' frameborder='0' scrolling='no' src='https://www.bluesnap.com/servlet/logo.gif?&s=<?php echo Mage::getSingleton('checkout/session')->getSessionId()?>'>
195
- <img width='1' height='1' src='https://www.bluesnap.com/logo.gif?s=<?php echo Mage::getSingleton('checkout/session')->getSessionId()?>'>
 
196
  </iframe>
197
  </li>
198
  </ul>
199
- <script type="text/javascript">
200
- //<![CDATA[
201
- Payment.addMethods({
202
- save: function () {
203
- if (checkout.loadWaiting != false) return;
204
-
205
- if (payment.currentMethod == 'cse') {
206
- var saved_card = $$('input:checked[type=radio][name=bluesnap_card_saved]');
207
- if (saved_card.length) {
208
- var card_saved_value = saved_card[0].value;
209
- if (card_saved_value == 'no' && $('<?php echo $_code ?>_cc_number').value.length < 12) {
210
- // alert('<?php echo $this->__('Card was not selected')?>');
211
- // checkout.loadWaiting = false;
212
- //return;
213
- }
214
- }
215
- }
216
-
217
- jQuery("#cse_cc_type_valid").hide();
218
- jQuery("#cse_cc_type_not_valid").hide();
219
-
220
- jQuery("#cse_cc_number_valid").hide();
221
- jQuery("#cse_cc_number_not_valid").hide();
222
-
223
- jQuery("#cse_cc_expiration_valid").hide();
224
- jQuery("#cse_cc_expiration_not_valid").hide();
225
-
226
- jQuery("#cse_cc_cid_valid").hide();
227
- jQuery("#cse_cc_cid_not_valid").hide();
228
-
229
- var validator = new Validation(this.form);
230
- //BSNPMG-108 dc validation fix https://github.com/Adyen/magento/commit/55095cbd6078fa9420490600ed1c9a3d3d1c173b
231
- Validation.creditCartTypes.set('DC', [new RegExp('^3(?:0[0-5]|[68][0-9])[0-9]{11}$'), new RegExp('^[0-9]{3}$'), true]);
232
- Validation.creditCartTypes.set('CB', [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true]);
233
-
234
- if (this.validate() && validator.validate()) {
235
- checkout.setLoadWaiting('payment');
236
- var bsnp = new BlueSnap('<?php echo $this->getpublicKey()?>');
237
- bsnp.encrypt('co-payment-form');
238
- $('<?php echo $_code?>_cc_last').value = $('<?php echo $_code ?>_cc_number').value.substr(-4);
239
- var request = new Ajax.Request(
240
- this.saveUrl,
241
- {
242
- method: 'post',
243
- onComplete: this.onComplete,
244
- onSuccess: this.onSave,
245
- onFailure: checkout.ajaxFailure.bind(checkout),
246
- parameters: Form.serialize(this.form)
247
- }
248
- );
249
- }
250
- }
251
- });
252
- //]]>
253
- </script>
254
  <style type="text/css">#payment-tool-tip{background:#FFFFFF;padding:4px;position: absolute;border: 1px solid #aaa;border-radius: 5px;}</style>
255
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
  * @see Bluesnap_Payment_Block_Payment_Form_Cse
4
  * @var $this Bluesnap_Payment_Block_Payment_Form_Cse
 
5
  */
6
  ?>
 
7
  <?php $_code = $this->getMethodCode() ?>
8
+ <?php $cards = $this->getCards() ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ <script type="text/javascript">
11
+ CreditCartScriptLoaded = false;
12
+
13
+ // load scripts if they are not available
14
+
15
+ if(typeof BlueSnap == "undefined") {
16
+ var bluesnap = document.createElement('script');
17
+ bluesnap.type = 'text/javascript';
18
+ bluesnap.src = 'https://gateway.bluesnap.com/js/cse/v1.0.2/bluesnap.js';
19
+ document.head.appendChild(bluesnap);
20
+
21
+ var creditcard = document.createElement('script');
22
+ creditcard.type = 'text/javascript';
23
+ creditcard.src = '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/bluesnap/credit-card-detect.js';
24
+ document.head.appendChild(creditcard);
25
+
26
+ var payformSourceFile = document.createElement('script');
27
+ payformSourceFile.type = 'text/javascript';
28
+ payformSourceFile.src = '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/bluesnap/payform.js';
29
+
30
+ document.head.appendChild(payformSourceFile);
31
+
32
+ var jqueryui = document.createElement('script');
33
+ jqueryui.type = 'text/javascript';
34
+ jqueryui.src = '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/lib/jquery/jquery-ui/jquery-ui.js';
35
+
36
+ document.head.appendChild(jqueryui);
37
+
38
+ var checkout = document.createElement('link');
39
+ checkout.rel = 'stylesheet';
40
+ checkout.type = 'text/css';
41
+ checkout.media = 'all';
42
+ checkout.href = '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>skin/frontend/base/default/css/bluesnap/buynow/checkout.css';
43
+
44
+ document.head.appendChild(checkout);
45
+
46
+ var jquerycss = document.createElement('link');
47
+ jquerycss.rel = 'stylesheet';
48
+ jquerycss.type = 'text/css';
49
+ jquerycss.media = 'all';
50
+ jquerycss.href = '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/lib/jquery/jquery-ui/jquery-ui.css';
51
+
52
+ document.getElementsByTagName('head')[0].appendChild(jquerycss);
53
+ }
54
+
55
+ // Add new cc types to magento validation
56
+
57
+ Validation.creditCartTypes.set('DC', [new RegExp('^3(?:0[0-5]|[68][0-9])[0-9]{11}$'), new RegExp('^[0-9]{3}$'), true]);
58
+ Validation.creditCartTypes.set('CB', [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true]);
59
+
60
+ // load cc validation jquery plugin
61
+
62
+ var loading = jQuery.getScript('<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/bluesnap/credit-card-detect.js');
63
+
64
+ jQuery.when( loading ).then(function() {
65
+ jQuery.creditCardType();
66
+ jQuery("#<?php echo $_code ?>_cc_number").blur(function(){
67
+ removeSpaceCc(this);
68
+ bsencrypt(this);
69
+ });
70
+
71
+ });
72
+ jQuery(document).ready(function($) {
73
+ var loading = jQuery.getScript('<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);?>js/bluesnap/credit-card-detect.js');
74
+
75
+ jQuery.when( loading ).then(function() {
76
+ jQuery.creditCardType();
77
+ jQuery("#<?php echo $_code ?>_cc_number").blur(function(){
78
+ removeSpaceCc(this);
79
+ bsencrypt(this);
80
+ });
81
+
82
+ });
83
+ if(typeof jQuery.fn.tooltip != 'undefined') {
84
+ jQuery( ".tooltip" ).tooltip(
85
+ {
86
+ position: { my: 'center bottom', at: 'center top-10' },
87
+ show: { effect: "fade", duration: 800 }
88
+ }
89
+ );
90
+ }
91
+ <?php if (count($cards)):?>$('card-form').hide();<?php endif?>
92
+
93
+ jQuery('.bluesnap-payment-container').bind("DOMSubtreeModified",function(){
94
+ var findEl = jQuery(".bluesnap-payment-container .opc-cc-list");
95
+ if(findEl.length > 0) {
96
+ findEl.parent().parent().hide();
97
+ }
98
+
99
+ if(jQuery(".ssl-placeholder").length > 1) {
100
+ for(i=1; i <= jQuery(".ssl-placeholder").length; i++) {
101
+ var item = jQuery(".ssl-placeholder")[i];
102
+ jQuery(item).hide();
103
+ }
104
+ }
105
+ });
106
+
107
+ });
108
+
109
  function removeSpaceCc(el){
110
  var val = el.value.replace(/\s/g, "");
111
  document.getElementById("cse_cc_number").value=val;
112
+ if(document.getElementById("cse_cc_type").value==''){
113
+ var creditCardType = payform.parseCardType(val);
114
+ switch(creditCardType) {
115
+ case 'visa':
116
+ jQuery('.pli-cc-VISA').addClass('pli-active');
117
+ jQuery("select[id=cse_cc_type]").val('VI');
118
+ break;
119
+ case 'mastercard':
120
+ jQuery('.pli-cc-MASTERCARD').addClass('pli-active');
121
+ jQuery("select[id=cse_cc_type]").val('MC');
122
+ break;
123
+ case 'amex':
124
+ jQuery('.pli-cc-AMEX').addClass('pli-active');
125
+ jQuery("select[id=cse_cc_type]").val('AE');
126
+ break;
127
+ case 'discover':
128
+ jQuery('.pli-cc-DISCOVER').addClass('pli-active');
129
+ jQuery("select[id=cse_cc_type]").val('DI');
130
+ break;
131
+ case 'jcb':
132
+ jQuery('.pli-cc-JCB').addClass('pli-active');
133
+ jQuery("select[id=cse_cc_type]").val('JCB');
134
+ break;
135
+ case 'dinersclub':
136
+ jQuery('.pli-cc-DINERS').addClass('pli-active');
137
+ jQuery("select[id=cse_cc_type]").val('DC');
138
+ break;
139
+ case 'carteblue':
140
+ jQuery('.pli-cc-CARTE_BLEUE').addClass('pli-active');
141
+ jQuery("select[id=cse_cc_type]").val('CB');
142
+ break;
143
+ };
144
+
145
+ if(jQuery(".validation-advice")) {
146
+ jQuery(".validation-advice").hide();
147
+ }
148
+
149
+ }
150
  }
151
+ </script>
152
 
153
+ <ul class="form-list bluesnap-payment-container" id="payment_form_<?php echo $_code ?>" style="display:none;">
 
 
 
 
 
 
 
 
154
 
155
  <?php if (count($cards)): ?>
156
  <li>
168
  </li>
169
  <?php endforeach ?>
170
  <li><a href="#"
171
+ onclick="$('card-form').show();$('card-form').removeClassName('no-display');$('no_saved_card').checked=true;jQuery('#cse_cc_number').creditCardType();return false;"><?php echo $this->__('Provide another card') ?></a>
172
  <input type="radio" name="bluesnap_card_saved" id="no_saved_card" value="no"
173
  class="validate-one-required-by-name bluesnap_card_saved" style="display:none"/>
174
  </li>
176
  </li>
177
  <?php endif ?>
178
  <li>
179
+ <ul id="card-form"<?php if (count($cards)):?> class="no-display"<?php endif?> <?php if (count($cards)):?>style="display:none;"<?php endif?>>
180
 
181
  <?php
182
  $showCcTypesDropdown = $this->getMethod()->getConfigData('show_cctypes_dropdown'); ?>
183
 
184
  <li style="display:<?php echo $showCcTypesDropdown ? 'block':'none'?>">
185
+ <label for="<?php echo $_code ?>_cc_type"><em>*</em><?php echo $this->__('Credit Card Type') ?></label>
 
186
 
187
  <div class="input-box">
188
+ <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]">
 
189
  <option value=""><?php echo $this->__('--Please Select--') ?></option>
190
  <?php $_ccType = $this->getInfoData('cc_type') ?>
191
  <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
226
 
227
  <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]"
228
  title="<?php echo $this->__('Credit Card Number') ?>"
229
+ class="input-text required-entry validate-cc-number" value=""
230
+ data-bluesnap="encryptedCreditCard" onchange="removeSpaceCc(this);if (typeof bsencrypt == 'function') bsencrypt(this);"
231
 
232
  />
233
  <span id="cse_cc_number_valid" class="pli-cc pli-cc-valid" style="display: none;" ></span>
234
  <span id="cse_cc_number_not_valid" class="pli-cc pli-cc-not-valid tooltip" style="display: none;"
235
+ title="<?php echo $this->__("Card Number should be between 12 and 21 characters long")?>"></span>
 
 
 
 
 
 
 
236
 
237
 
238
  <input type="hidden" name="<?php echo $_code ?>_cc_last" id="<?php echo $_code ?>_cc_last" value=""/>
252
  <?php endforeach ?>
253
  </select>
254
 
 
 
255
  </div>
256
  <div class="v-fix">
257
  <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
278
  <div class="input-box">
279
  <div class="v-fix">
280
  <input type="text" title="<?php echo $this->__('Card Verification Number') ?>"
281
+ class="input-text cvv validate-cc-cvn required-entry"
282
  id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" data-bluesnap="encryptedCvv"
283
+ value="" onchange="if (typeof bsencrypt == 'function') bsencrypt(this);"/>
284
 
285
  <span id="cse_cc_cid_valid" class="pli-cc pli-cc-valid" style="display: none;" ></span>
286
  <span id="cse_cc_cid_not_valid" class="pli-cc pli-cc-not-valid tooltip" style="display: none;"
287
+ title="<?php echo $this->__("Security Code should be between 3 and 4 characters long")?>"></span>
 
 
288
 
289
  </div>
290
  <a href="#" class="cvv-what-is-this"><?php echo $this->__('What is this?') ?></a>
292
  </li>
293
  <?php endif; ?>
294
  </ul>
295
+ <?php $storeId = Mage::app()->getStore()->getStoreId();?>
296
+ <iframe width='1' height='1' frameborder='0' scrolling='no' src='https://www.bluesnap.com/servlet/logo.htm?d=<?php echo $configValue = Mage::getStoreConfig('bluesnap/general/merchant_id', $storeId);?>&s=<?php echo Mage::getSingleton('checkout/session')->getSessionId()?>'>
297
+ <img width='1' height='1' src='https://www.bluesnap.com/logo.gif?d=<?php echo $configValue = Mage::getStoreConfig('bluesnap/general/merchant_id', $storeId);?>&s=<?php echo Mage::getSingleton('checkout/session')->getSessionId()?>'>
298
  </iframe>
299
  </li>
300
  </ul>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  <style type="text/css">#payment-tool-tip{background:#FFFFFF;padding:4px;position: absolute;border: 1px solid #aaa;border-radius: 5px;}</style>
302
+ <script type="text/javascript">
303
+ if (typeof Payment !== 'undefined') {
304
+ // the Payment is defined
305
+
306
+ Payment.addMethods({
307
+ save: function () {
308
+ if (checkout.loadWaiting != false) return;
309
+
310
+ if (payment.currentMethod == 'cse') {
311
+ var saved_card = $$('input:checked[type=radio][name=bluesnap_card_saved]');
312
+ if (saved_card.length) {
313
+ var card_saved_value = saved_card[0].value;
314
+ if (card_saved_value == 'no' && $('<?php echo $_code ?>_cc_number').value.length < 12) {
315
+ // alert('<?php echo $this->__('Card was not selected')?>');
316
+ // checkout.loadWaiting = false;
317
+ //return;
318
+ }
319
+ }
320
+ }
321
+
322
+ jQuery("#cse_cc_type_valid").hide();
323
+ jQuery("#cse_cc_type_not_valid").hide();
324
+
325
+ jQuery("#cse_cc_number_valid").hide();
326
+ jQuery("#cse_cc_number_not_valid").hide();
327
+
328
+ jQuery("#cse_cc_expiration_valid").hide();
329
+ jQuery("#cse_cc_expiration_not_valid").hide();
330
+
331
+ jQuery("#cse_cc_cid_valid").hide();
332
+ jQuery("#cse_cc_cid_not_valid").hide();
333
+
334
+ var validator = new Validation(this.form);
335
+ //BSNPMG-108 dc validation fix https://github.com/Adyen/magento/commit/55095cbd6078fa9420490600ed1c9a3d3d1c173b
336
+ if (this.validate() && validator.validate()) {
337
+ checkout.setLoadWaiting('payment');
338
+ var bsnp = new BlueSnap('<?php echo $this->getpublicKey()?>');
339
+ bsnp.encrypt('co-payment-form');
340
+ $('<?php echo $_code?>_cc_last').value = $('<?php echo $_code ?>_cc_number').value.substr(-4);
341
+ var request = new Ajax.Request(
342
+ this.saveUrl,
343
+ {
344
+ method: 'post',
345
+ onComplete: this.onComplete,
346
+ onSuccess: this.onSave,
347
+ onFailure: checkout.ajaxFailure.bind(checkout),
348
+ parameters: Form.serialize(this.form)
349
+ }
350
+ );
351
+ }
352
+ }
353
+ });
354
+ }
355
+
356
+ function bsencrypt(el){
357
+ // var bskey = $('bspubkey').value;
358
+ var bsnp = new BlueSnap('<?php echo $this->getpublicKey()?>');
359
+
360
+ <?php if(Mage::registry('bluesnap_disable_encryption')) : ?>
361
+ // bsnp.encrypt(el.up('form').id);
362
+ <?php else : ?>
363
+ bsnp.encrypt(el.up('form').id);
364
+ <?php endif; ?>
365
+ $('<?php echo $_code?>_cc_last').value = $('<?php echo $_code ?>_cc_number').value.substr(-4);
366
+ };
367
+
368
+ </script>
js/bluesnap/credit-card-detect.js ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($) {
2
+ //https://github.com/jessepollak/card/blob/master/lib/js/jquery.card.js
3
+ //https://github.com/jondavidjohn/payform#custom-cards
4
+ $.validateCreditCard = function(number,month,year,type) {
5
+ return payform.validateCardNumber(number) && payform.validateCardExpiry(month, year) && payform.validateCardCVC(cvc, type);
6
+ }
7
+
8
+ $.getCreditCardType = function(val) {
9
+ return payform.parseCardType(val);
10
+ };
11
+
12
+ $.creditCardType = function(options) {
13
+ //formatter
14
+ //https://learn.jquery.com/using-jquery-core/faq/how-do-i-pull-a-native-dom-element-from-a-jquery-object/
15
+
16
+ var settings = {
17
+ target: '#credit-card-type'
18
+ };
19
+
20
+ if(options) {
21
+ $.extend(settings, options);
22
+ }
23
+
24
+ var ccNumberKeyupHandler = function() {
25
+ $(".pli-credit-cards span").removeClass("pli-active");
26
+ $("select[id=cse_cc_type]").val('');
27
+ creditCardType=$.getCreditCardType($(this).val());
28
+
29
+ switch(creditCardType) {
30
+ case 'visa':
31
+ $('.pli-cc-VISA').addClass('pli-active');
32
+ $("select[id=cse_cc_type]").val('VI');
33
+ break;
34
+ case 'mastercard':
35
+ $('.pli-cc-MASTERCARD').addClass('pli-active');
36
+ $("select[id=cse_cc_type]").val('MC');
37
+ break;
38
+ case 'amex':
39
+ $('.pli-cc-AMEX').addClass('pli-active');
40
+ $("select[id=cse_cc_type]").val('AE');
41
+ break;
42
+ case 'discover':
43
+ $('.pli-cc-DISCOVER').addClass('pli-active');
44
+ $("select[id=cse_cc_type]").val('DI');
45
+ break;
46
+ case 'jcb':
47
+ $('.pli-cc-JCB').addClass('pli-active');
48
+ $("select[id=cse_cc_type]").val('JCB');
49
+ break;
50
+ case 'dinersclub':
51
+ $('.pli-cc-DINERS').addClass('pli-active');
52
+ $("select[id=cse_cc_type]").val('DC');
53
+ break;
54
+ case 'carteblue':
55
+ $('.pli-cc-CARTE_BLEUE').addClass('pli-active');
56
+ $("select[id=cse_cc_type]").val('CB');
57
+ break;
58
+ };
59
+
60
+ if($(".validation-advice")) {
61
+ $(".validation-advice").hide();
62
+ }
63
+ if(payform.validateCardNumber($("input[id=cse_cc_number]").val())) {
64
+ $("input[id=cse_cc_number]")[0].setStyle({'borderColor':'green'});
65
+ } else {
66
+ $("input[id=cse_cc_number]")[0].setStyle({'borderColor':'red'});
67
+ }
68
+
69
+ };
70
+
71
+ var ccCvvKeyupHandler = function() {
72
+ if($('#advice-required-entry-cse_cc_cid')) {
73
+ $('#advice-required-entry-cse_cc_cid').hide();
74
+ }
75
+ var card = payform.cardFromNumber($("input[id=cse_cc_number]").val());
76
+
77
+ if(payform.validateCardCVC($("input[id=cse_cc_cid]").val(), card.type)) {
78
+ $("input[id=cse_cc_cid]")[0].setStyle({'borderColor':'green'});
79
+
80
+ } else {
81
+ $("input[id=cse_cc_cid]")[0].setStyle({'borderColor':'red'});
82
+ }
83
+
84
+ };
85
+
86
+ var ccExpChangeHandler = function() {
87
+ if(payform.validateCardExpiry($("select[id=cse_expiration]").val(),$("select[id=cse_expiration_yr]").val())) {
88
+ $("select[id=cse_expiration]")[0].setStyle({'borderColor':'green'});
89
+ $("select[id=cse_expiration_yr]")[0].setStyle({'borderColor':'green'});
90
+ } else {
91
+ $("select[id=cse_expiration]")[0].setStyle({'borderColor':'red'});
92
+ $("select[id=cse_expiration_yr]")[0].setStyle({'borderColor':'red'});
93
+ }
94
+
95
+
96
+ };
97
+
98
+ var ccNumberBlurHandler = function() {
99
+ if(payform.validateCardNumber($("input[id=cse_cc_number]").val())) {
100
+ $("#cse_cc_number_valid").show();
101
+ $("#cse_cc_number_not_valid").hide();
102
+
103
+ $("#cse_cc_type_valid").show();
104
+ $("#cse_cc_type_not_valid").hide();
105
+
106
+ } else {
107
+ $("#cse_cc_number_valid").hide();
108
+ $("#cse_cc_number_not_valid").show();
109
+
110
+ $("#cse_cc_type_valid").hide();
111
+ $("#cse_cc_type_not_valid").show();
112
+ }
113
+ }
114
+
115
+ var ccCidBlurHandler = function() {
116
+ var card = payform.cardFromNumber($("input[id=cse_cc_number]").val());
117
+
118
+ if(payform.validateCardCVC($("input[id=cse_cc_cid]").val(), card.type)) {
119
+ $("#cse_cc_cid_valid").show();
120
+ $("#cse_cc_cid_not_valid").hide();
121
+
122
+ } else {
123
+ $("#cse_cc_cid_valid").hide();
124
+ $("#cse_cc_cid_not_valid").show();
125
+
126
+ }
127
+ }
128
+
129
+ var ccExpBlurHandler = function() {
130
+ if(payform.validateCardExpiry($("#cse_expiration").val(),$("#cse_expiration_yr").val() ) ) {
131
+ $("#cse_cc_expiration_valid").show();
132
+ $("#cse_cc_expiration_not_valid").hide();
133
+
134
+ } else {
135
+ $("#cse_cc_expiration_valid").hide();
136
+ $("#cse_cc_expiration_not_valid").show();
137
+ }
138
+ }
139
+
140
+ return $("#cse_cc_number").each(function() {
141
+ $(this).on('keyup', ccNumberKeyupHandler);
142
+ $("input[id=cse_cc_cid]").bind('keyup',ccCvvKeyupHandler);
143
+ $("select[id=cse_expiration]").bind('change',ccExpChangeHandler);
144
+ $("select[id=cse_expiration_yr]").bind('change',ccExpChangeHandler);
145
+
146
+ $("input[id=cse_cc_number]").bind('blur',ccNumberBlurHandler);
147
+ $("input[id=cse_cc_cid]").bind('blur',ccCidBlurHandler);
148
+
149
+ $("select[id=cse_expiration]").bind('blur',ccExpBlurHandler);
150
+ $("select[id=cse_expiration_yr]").bind('blur',ccExpBlurHandler);
151
+
152
+
153
+ });
154
+
155
+
156
+ };
157
+ })(jQuery);
158
+
159
+
160
+ function removeSpaceCc(el){
161
+ var val = el.value.replace(/\s/g, "");
162
+ document.getElementById("cse_cc_number").value=val;
163
+
164
+ if(document.getElementById("cse_cc_type").value=='' || payform.parseCardType(val) != getType(document.getElementById("cse_cc_type").value)){
165
+ if(document.getElementById("cse_cc_type").value!='') jQuery(".pli-credit-cards span").removeClass("pli-active");
166
+ var creditCardType = payform.parseCardType(val);
167
+ switch(creditCardType) {
168
+ case 'visa':
169
+ jQuery('.pli-cc-VISA').addClass('pli-active');
170
+ jQuery("select[id=cse_cc_type]").val('VI');
171
+ break;
172
+ case 'mastercard':
173
+ jQuery('.pli-cc-MASTERCARD').addClass('pli-active');
174
+ jQuery("select[id=cse_cc_type]").val('MC');
175
+ break;
176
+ case 'amex':
177
+ jQuery('.pli-cc-AMEX').addClass('pli-active');
178
+ jQuery("select[id=cse_cc_type]").val('AE');
179
+ break;
180
+ case 'discover':
181
+ jQuery('.pli-cc-DISCOVER').addClass('pli-active');
182
+ jQuery("select[id=cse_cc_type]").val('DI');
183
+ break;
184
+ case 'jcb':
185
+ jQuery('.pli-cc-JCB').addClass('pli-active');
186
+ jQuery("select[id=cse_cc_type]").val('JCB');
187
+ break;
188
+ case 'dinersclub':
189
+ jQuery('.pli-cc-DINERS').addClass('pli-active');
190
+ jQuery("select[id=cse_cc_type]").val('DC');
191
+ break;
192
+ case 'carteblue':
193
+ jQuery('.pli-cc-CARTE_BLEUE').addClass('pli-active');
194
+ jQuery("select[id=cse_cc_type]").val('CB');
195
+ break;
196
+ };
197
+
198
+ if(jQuery(".validation-advice")) {
199
+ jQuery(".validation-advice").hide();
200
+ }
201
+
202
+ }
203
+ }
204
+
205
+ function getType(code){
206
+ switch(code) {
207
+ case 'VI':
208
+ return "visa";
209
+ break;
210
+ case 'MC':
211
+ return 'mastercard';
212
+ break;
213
+ case 'AE':
214
+ return "amex";
215
+ break;
216
+ case 'DI':
217
+ return 'discover';
218
+ break;
219
+ case 'JCB':
220
+ return 'jcb';
221
+ break;
222
+ case 'DC':
223
+ return "dinersclub";
224
+ break;
225
+ case 'CB':
226
+ return 'carteblue';
227
+ break;
228
+ };
229
+ }
js/bluesnap/payform.js ADDED
@@ -0,0 +1,683 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /*
3
+ Payform Javascript Library
4
+
5
+ URL: https://github.com/jondavidjohn/payform
6
+ Author: Jonathan D. Johnson <me@jondavidjohn.com>
7
+ License: MIT
8
+ Version: 1.1.0
9
+ */
10
+
11
+ (function() {
12
+ var 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; };
13
+
14
+ (function(name, definition) {
15
+ if (typeof module !== "undefined" && module !== null) {
16
+ return module.exports = definition();
17
+ } else if (typeof define === 'function' && typeof define.amd === 'object') {
18
+ return define(name, definition);
19
+ } else {
20
+ return this[name] = definition();
21
+ }
22
+ })('payform', function() {
23
+ var _eventNormalize, _getCaretPos, _on, cardFromNumber, cardFromType, defaultFormat, formatBackCardNumber, formatBackExpiry, formatCardExpiry, formatCardNumber, formatForwardExpiry, formatForwardSlashAndSpace, hasTextSelected, luhnCheck, payform, reFormatCVC, reFormatCardNumber, reFormatExpiry, replaceFullWidthChars, restrictCVC, restrictCardNumber, restrictExpiry, restrictNumeric;
24
+ _getCaretPos = function(ele) {
25
+ var r, rc, re;
26
+ if (ele.selectionStart != null) {
27
+ return ele.selectionStart;
28
+ } else if (document.selection != null) {
29
+ ele.focus();
30
+ r = document.selection.createRange();
31
+ re = ele.createTextRange();
32
+ rc = re.duplicate();
33
+ re.moveToBookmark(r.getBookmark());
34
+ rc.setEndPoint('EndToStart', re);
35
+ return rc.text.length;
36
+ }
37
+ };
38
+ _eventNormalize = function(listener) {
39
+ return function(e) {
40
+ if (e == null) {
41
+ e = window.event;
42
+ }
43
+ e.target = e.target || e.srcElement;
44
+ e.which = e.which || e.keyCode;
45
+ if (e.preventDefault == null) {
46
+ e.preventDefault = function() {
47
+ return this.returnValue = false;
48
+ };
49
+ }
50
+ return listener(e);
51
+ };
52
+ };
53
+ _on = function(ele, event, listener) {
54
+ listener = _eventNormalize(listener);
55
+ if (ele.addEventListener != null) {
56
+ return ele.addEventListener(event, listener, false);
57
+ } else {
58
+ return ele.attachEvent("on" + event, listener);
59
+ }
60
+ };
61
+ payform = {};
62
+ defaultFormat = /(\d{1,4})/g;
63
+ payform.cards = [
64
+
65
+ {
66
+ type: 'carteblue',
67
+ pattern: /^((3(6[1-4]|77451))|(4(059(?!34)|150|201|561|562|533|556|97))|(5(0[1-4]|13|30066|341[0-1]|587[0-2]|6|8))|(6(27244|390|75[1-6]|799999998))).*/,
68
+ format: defaultFormat,
69
+ length: [16],
70
+ cvcLength: [3],
71
+ luhn: true
72
+ },
73
+
74
+ {
75
+ type: 'visaelectron',
76
+ pattern: /^4(026|17500|405|508|844|91[37])/,
77
+ format: defaultFormat,
78
+ length: [16],
79
+ cvcLength: [3],
80
+ luhn: true
81
+ }, {
82
+ type: 'maestro',
83
+ pattern: /^(5(018|0[23]|[68])|6(39|7))/,
84
+ format: defaultFormat,
85
+ length: [12, 13, 14, 15, 16, 17, 18, 19],
86
+ cvcLength: [3],
87
+ luhn: true
88
+ }, {
89
+ type: 'forbrugsforeningen',
90
+ pattern: /^600/,
91
+ format: defaultFormat,
92
+ length: [16],
93
+ cvcLength: [3],
94
+ luhn: true
95
+ }, {
96
+ type: 'dankort',
97
+ pattern: /^5019/,
98
+ format: defaultFormat,
99
+ length: [16],
100
+ cvcLength: [3],
101
+ luhn: true
102
+ }, {
103
+ type: 'visa',
104
+ pattern: /^4/,
105
+ format: defaultFormat,
106
+ length: [13, 16],
107
+ cvcLength: [3],
108
+ luhn: true
109
+
110
+ },
111
+ {
112
+ type: 'mastercard',
113
+ pattern: /^(5[1-5]|2[2-7])/,
114
+ format: defaultFormat,
115
+ length: [16],
116
+ cvcLength: [3],
117
+ luhn: true
118
+ },
119
+ {
120
+ type: 'amex',
121
+ pattern: /^3(4|7)/,
122
+ // pattern: /^3[47]/,
123
+ format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
124
+ length: [15],
125
+ cvcLength: [4],
126
+ luhn: true
127
+ }, {
128
+ type: 'dinersclub',
129
+ pattern: /^3[0689]/,
130
+ format: /(\d{1,4})(\d{1,6})?(\d{1,4})?/,
131
+ length: [14],
132
+ cvcLength: [3],
133
+ luhn: true
134
+ },
135
+ {
136
+ type: 'discover',
137
+ pattern: /^6([045]|22)/,
138
+ format: defaultFormat,
139
+ length: [16],
140
+ cvcLength: [3],
141
+ luhn: true
142
+ }, {
143
+ type: 'unionpay',
144
+ pattern: /^(62|88)/,
145
+ format: defaultFormat,
146
+ length: [16, 17, 18, 19],
147
+ cvcLength: [3],
148
+ luhn: false
149
+ }, {
150
+ type: 'jcb',
151
+ pattern: /^35/,
152
+ format: defaultFormat,
153
+ length: [16],
154
+ cvcLength: [3],
155
+ luhn: true
156
+ },
157
+
158
+ // from https://github.com/PawelDecowski/jquery-creditcardvalidator/blob/master/jquery.creditCardValidator.js
159
+
160
+ {
161
+ type: 'carte_blanche',
162
+ // name: 'carte_blanche',
163
+ pattern: /^30[0-5]/,
164
+ format: defaultFormat,
165
+ length: [14],
166
+ cvcLength: [3],
167
+ luhn: true
168
+ },
169
+ {
170
+ type: 'dinersclub',
171
+ // name: 'dinersclub',
172
+ pattern: /^36/,
173
+ format: defaultFormat,
174
+ length: [14],
175
+ cvcLength: [3],
176
+ luhn: true
177
+ }, {
178
+ type: 'jcb',
179
+ // name: 'jcb',
180
+ format: defaultFormat,
181
+ pattern: /^35(2[89]|[3-8][0-9])/,
182
+ length: [16],
183
+ cvcLength: [3],
184
+ luhn: true
185
+
186
+ }, {
187
+ type: 'laser',
188
+ // name: 'laser',
189
+ format: defaultFormat,
190
+ pattern: /^(6304|670[69]|6771)/,
191
+ length: [16, 17, 18, 19]
192
+ }, {
193
+ type: 'visa_electron',
194
+ // name: 'visa_electron',
195
+ format: defaultFormat,
196
+ pattern: /^(4026|417500|4508|4844|491(3|7))/,
197
+ length: [16],
198
+ cvcLength: [3],
199
+ luhn: true
200
+ }, {
201
+ type: 'visa',
202
+ // name: 'visa',
203
+ format: defaultFormat,
204
+ pattern: /^4/,
205
+ length: [16],
206
+ cvcLength: [3],
207
+ luhn: true
208
+ }, {
209
+ type: 'mastercard',
210
+ // name: 'mastercard',
211
+ format: defaultFormat,
212
+ pattern: /^5[1-5]/,
213
+ length: [16],
214
+ cvcLength: [3],
215
+ luhn: true
216
+ }, {
217
+ type: 'maestro',
218
+ // name: 'maestro',
219
+ format: defaultFormat,
220
+ pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
221
+ length: [12, 13, 14, 15, 16, 17, 18, 19],
222
+ cvcLength: [3],
223
+ luhn: true
224
+ }, {
225
+ type: 'discover',
226
+ // name: 'discover',
227
+ format: defaultFormat,
228
+ 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)/,
229
+ length: [16],
230
+ cvcLength: [3],
231
+ luhn: true
232
+ }
233
+
234
+
235
+
236
+ ];
237
+ cardFromNumber = function(num) {
238
+ var card, i, len, ref;
239
+ num = (num + '').replace(/\D/g, '');
240
+ ref = payform.cards;
241
+ for (i = 0, len = ref.length; i < len; i++) {
242
+ card = ref[i];
243
+ if (card.pattern.test(num)) {
244
+ return card;
245
+ }
246
+ }
247
+ };
248
+ cardFromType = function(type) {
249
+ var card, i, len, ref;
250
+ ref = payform.cards;
251
+ for (i = 0, len = ref.length; i < len; i++) {
252
+ card = ref[i];
253
+ if (card.type === type) {
254
+ return card;
255
+ }
256
+ }
257
+ };
258
+ luhnCheck = function(num) {
259
+ var digit, digits, i, len, odd, sum;
260
+ odd = true;
261
+ sum = 0;
262
+ digits = (num + '').split('').reverse();
263
+ for (i = 0, len = digits.length; i < len; i++) {
264
+ digit = digits[i];
265
+ digit = parseInt(digit, 10);
266
+ if ((odd = !odd)) {
267
+ digit *= 2;
268
+ }
269
+ if (digit > 9) {
270
+ digit -= 9;
271
+ }
272
+ sum += digit;
273
+ }
274
+ return sum % 10 === 0;
275
+ };
276
+ hasTextSelected = function(target) {
277
+ var ref;
278
+ if ((typeof document !== "undefined" && document !== null ? (ref = document.selection) != null ? ref.createRange : void 0 : void 0) != null) {
279
+ if (document.selection.createRange().text) {
280
+ return true;
281
+ }
282
+ }
283
+ return (target.selectionStart != null) && target.selectionStart !== target.selectionEnd;
284
+ };
285
+ replaceFullWidthChars = function(str) {
286
+ var char, chars, fullWidth, halfWidth, i, idx, len, value;
287
+ if (str == null) {
288
+ str = '';
289
+ }
290
+ fullWidth = '\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19';
291
+ halfWidth = '0123456789';
292
+ value = '';
293
+ chars = str.split('');
294
+ for (i = 0, len = chars.length; i < len; i++) {
295
+ char = chars[i];
296
+ idx = fullWidth.indexOf(char);
297
+ if (idx > -1) {
298
+ char = halfWidth[idx];
299
+ }
300
+ value += char;
301
+ }
302
+ return value;
303
+ };
304
+ reFormatCardNumber = function(e) {
305
+ var cursor;
306
+ cursor = _getCaretPos(e.target);
307
+ e.target.value = payform.formatCardNumber(e.target.value);
308
+ if ((cursor != null) && e.type !== 'change') {
309
+ return e.target.setSelectionRange(cursor, cursor);
310
+ }
311
+ };
312
+ formatCardNumber = function(e) {
313
+ var card, cursor, digit, length, re, upperLength, value;
314
+ digit = String.fromCharCode(e.which);
315
+ if (!/^\d+$/.test(digit)) {
316
+ return;
317
+ }
318
+ value = e.target.value;
319
+ card = cardFromNumber(value + digit);
320
+ length = (value.replace(/\D/g, '') + digit).length;
321
+ upperLength = 16;
322
+ if (card) {
323
+ upperLength = card.length[card.length.length - 1];
324
+ }
325
+ if (length >= upperLength) {
326
+ return;
327
+ }
328
+ cursor = _getCaretPos(e.target);
329
+ if (cursor && cursor !== value.length) {
330
+ return;
331
+ }
332
+ if (card && card.type === 'amex') {
333
+ re = /^(\d{4}|\d{4}\s\d{6})$/;
334
+ } else {
335
+ re = /(?:^|\s)(\d{4})$/;
336
+ }
337
+ if (re.test(value)) {
338
+ e.preventDefault();
339
+ return setTimeout(function() {
340
+ return e.target.value = value + " " + digit;
341
+ });
342
+ } else if (re.test(value + digit)) {
343
+ e.preventDefault();
344
+ return setTimeout(function() {
345
+ return e.target.value = (value + digit) + " ";
346
+ });
347
+ }
348
+ };
349
+ formatBackCardNumber = function(e) {
350
+ var cursor, value;
351
+ value = e.target.value;
352
+ if (e.which !== 8) {
353
+ return;
354
+ }
355
+ cursor = _getCaretPos(e.target);
356
+ if (cursor && cursor !== value.length) {
357
+ return;
358
+ }
359
+ if (/\d\s$/.test(value)) {
360
+ e.preventDefault();
361
+ return setTimeout(function() {
362
+ return e.target.value = value.replace(/\d\s$/, '');
363
+ });
364
+ } else if (/\s\d?$/.test(value)) {
365
+ e.preventDefault();
366
+ return setTimeout(function() {
367
+ return e.target.value = value.replace(/\d$/, '');
368
+ });
369
+ }
370
+ };
371
+ reFormatExpiry = function(e) {
372
+ var cursor;
373
+ cursor = _getCaretPos(e.target);
374
+ e.target.value = payform.formatCardExpiry(e.target.value);
375
+ if ((cursor != null) && e.type !== 'change') {
376
+ return e.target.setSelectionRange(cursor, cursor);
377
+ }
378
+ };
379
+
380
+ formatCardExpiry = function(e) {
381
+ var digit, val;
382
+ digit = String.fromCharCode(e.which);
383
+ if (!/^\d+$/.test(digit)) {
384
+ return;
385
+ }
386
+ val = e.target.value + digit;
387
+ if (/^\d$/.test(val) && (val !== '0' && val !== '1')) {
388
+ e.preventDefault();
389
+ return setTimeout(function() {
390
+ return e.target.value = "0" + val + " / ";
391
+ });
392
+ } else if (/^\d\d$/.test(val)) {
393
+ e.preventDefault();
394
+ return setTimeout(function() {
395
+ return e.target.value = val + " / ";
396
+ });
397
+ }
398
+ };
399
+ formatForwardExpiry = function(e) {
400
+ var digit, val;
401
+ digit = String.fromCharCode(e.which);
402
+ if (!/^\d+$/.test(digit)) {
403
+ return;
404
+ }
405
+ val = e.target.value;
406
+ if (/^\d\d$/.test(val)) {
407
+ return e.target.value = val + " / ";
408
+ }
409
+ };
410
+ formatForwardSlashAndSpace = function(e) {
411
+ var val, which;
412
+ which = String.fromCharCode(e.which);
413
+ if (!(which === '/' || which === ' ')) {
414
+ return;
415
+ }
416
+ val = e.target.value;
417
+ if (/^\d$/.test(val) && val !== '0') {
418
+ return e.target.value = "0" + val + " / ";
419
+ }
420
+ };
421
+ formatBackExpiry = function(e) {
422
+ var cursor, value;
423
+ value = e.target.value;
424
+ if (e.which !== 8) {
425
+ return;
426
+ }
427
+ cursor = _getCaretPos(e.target);
428
+ if (cursor && cursor !== value.length) {
429
+ return;
430
+ }
431
+ if (/\d\s\/\s$/.test(value)) {
432
+ e.preventDefault();
433
+ return setTimeout(function() {
434
+ return e.target.value = value.replace(/\d\s\/\s$/, '');
435
+ });
436
+ }
437
+ };
438
+ reFormatCVC = function(e) {
439
+ var cursor;
440
+ cursor = _getCaretPos(e.target);
441
+ e.target.value = replaceFullWidthChars(e.target.value).replace(/\D/g, '').slice(0, 4);
442
+ if ((cursor != null) && e.type !== 'change') {
443
+ return e.target.setSelectionRange(cursor, cursor);
444
+ }
445
+ };
446
+ restrictNumeric = function(e) {
447
+ var input;
448
+ if (e.metaKey || e.ctrlKey) {
449
+ return;
450
+ }
451
+ if (e.which === 0) {
452
+ return;
453
+ }
454
+ if (e.which < 33) {
455
+ return;
456
+ }
457
+ input = String.fromCharCode(e.which);
458
+ if (!/^\d+$/.test(input)) {
459
+ return e.preventDefault();
460
+ }
461
+ };
462
+ restrictCardNumber = function(e) {
463
+ var card, digit, value;
464
+ digit = String.fromCharCode(e.which);
465
+ if (!/^\d+$/.test(digit)) {
466
+ return;
467
+ }
468
+ if (hasTextSelected(e.target)) {
469
+ return;
470
+ }
471
+ value = (e.target.value + digit).replace(/\D/g, '');
472
+ card = cardFromNumber(value);
473
+ if (card && value.length > card.length[card.length.length - 1]) {
474
+ return e.preventDefault();
475
+ } else if (value.length > 16) {
476
+ return e.preventDefault();
477
+ }
478
+ };
479
+ restrictExpiry = function(e) {
480
+ var digit, value;
481
+ digit = String.fromCharCode(e.which);
482
+ if (!/^\d+$/.test(digit)) {
483
+ return;
484
+ }
485
+ if (hasTextSelected(e.target)) {
486
+ return;
487
+ }
488
+ value = e.target.value + digit;
489
+ value = value.replace(/\D/g, '');
490
+ if (value.length > 6) {
491
+ return e.preventDefault();
492
+ }
493
+ };
494
+ restrictCVC = function(e) {
495
+ var digit, val;
496
+ digit = String.fromCharCode(e.which);
497
+ if (!/^\d+$/.test(digit)) {
498
+ return;
499
+ }
500
+ if (hasTextSelected(e.target)) {
501
+ return;
502
+ }
503
+ val = e.target.value + digit;
504
+ if (val.length > 4) {
505
+ return e.preventDefault();
506
+ }
507
+ };
508
+ payform.cvcInput = function(input) {
509
+ _on(input, 'keypress', restrictNumeric);
510
+ _on(input, 'keypress', restrictCVC);
511
+ _on(input, 'paste', reFormatCVC);
512
+ _on(input, 'change', reFormatCVC);
513
+ return _on(input, 'input', reFormatCVC);
514
+ };
515
+ payform.expiryInput = function(input) {
516
+ _on(input, 'keypress', restrictNumeric);
517
+ _on(input, 'keypress', restrictExpiry);
518
+ _on(input, 'keypress', formatCardExpiry);
519
+ _on(input, 'keypress', formatForwardSlashAndSpace);
520
+ _on(input, 'keypress', formatForwardExpiry);
521
+ _on(input, 'keydown', formatBackExpiry);
522
+ _on(input, 'change', reFormatExpiry);
523
+ return _on(input, 'input', reFormatExpiry);
524
+ };
525
+ payform.cardNumberInput = function(input) {
526
+ _on(input, 'keypress', restrictNumeric);
527
+ _on(input, 'keypress', restrictCardNumber);
528
+ _on(input, 'keypress', formatCardNumber);
529
+ _on(input, 'keydown', formatBackCardNumber);
530
+ _on(input, 'paste', reFormatCardNumber);
531
+ _on(input, 'change', reFormatCardNumber);
532
+ return _on(input, 'input', reFormatCardNumber);
533
+ };
534
+ payform.numericInput = function(input) {
535
+ _on(input, 'keypress', restrictNumeric);
536
+ _on(input, 'paste', restrictNumeric);
537
+ _on(input, 'change', restrictNumeric);
538
+ return _on(input, 'input', restrictNumeric);
539
+ };
540
+ payform.cardFromNumber = function(num) {
541
+ return cardFromNumber(num);
542
+ };
543
+ payform.parseCardExpiry = function(value) {
544
+ var month, prefix, ref, year;
545
+ value = value.replace(/\s/g, '');
546
+ ref = value.split('/', 2), month = ref[0], year = ref[1];
547
+ if ((year != null ? year.length : void 0) === 2 && /^\d+$/.test(year)) {
548
+ prefix = (new Date).getFullYear();
549
+ prefix = prefix.toString().slice(0, 2);
550
+ year = prefix + year;
551
+ }
552
+ month = parseInt(month, 10);
553
+ year = parseInt(year, 10);
554
+ return {
555
+ month: month,
556
+ year: year
557
+ };
558
+ };
559
+ payform.validateCardNumber = function(num) {
560
+ var card, ref;
561
+
562
+ num = (num + '').replace(/\s+|-/g, '');
563
+ if (!/^\d+$/.test(num)) {
564
+ return false;
565
+ }
566
+
567
+ card = cardFromNumber(num);
568
+ if (!card) {
569
+ return false;
570
+ }
571
+
572
+ return (ref = num.length, indexOf.call(card.length, ref) >= 0) && (card.luhn === false || luhnCheck(num));
573
+ };
574
+ payform.validateCardExpiry = function(month, year) {
575
+ var currentTime, expiry, ref;
576
+ if (typeof month === 'object' && 'month' in month) {
577
+ ref = month, month = ref.month, year = ref.year;
578
+ }
579
+ if (!(month && year)) {
580
+ return false;
581
+ }
582
+ month = String(month).trim();
583
+ year = String(year).trim();
584
+ if (!/^\d+$/.test(month)) {
585
+ return false;
586
+ }
587
+ if (!/^\d+$/.test(year)) {
588
+ return false;
589
+ }
590
+ if (!((1 <= month && month <= 12))) {
591
+ return false;
592
+ }
593
+ if (year.length === 2) {
594
+ if (year < 70) {
595
+ year = "20" + year;
596
+ } else {
597
+ year = "19" + year;
598
+ }
599
+ }
600
+ if (year.length !== 4) {
601
+ return false;
602
+ }
603
+ expiry = new Date(year, month);
604
+ currentTime = new Date;
605
+ expiry.setMonth(expiry.getMonth() - 1);
606
+ expiry.setMonth(expiry.getMonth() + 1, 1);
607
+ return expiry > currentTime;
608
+ };
609
+ payform.validateCardCVC = function(cvc, type) {
610
+ var card, ref;
611
+ cvc = String(cvc).trim();
612
+
613
+ if(!type) {
614
+ type = this.parseCardType($("cse_cc_number").getValue());
615
+ }
616
+
617
+ if (!/^\d+$/.test(cvc)) {
618
+ return false;
619
+ }
620
+ card = cardFromType(type);
621
+
622
+ if (card != null) {
623
+ return ref = cvc.length, indexOf.call(card.cvcLength, ref) >= 0;
624
+ } else {
625
+ return cvc.length >= 3 && cvc.length <= 4;
626
+ }
627
+ };
628
+ payform.parseCardType = function(num) {
629
+ var ref;
630
+ if (!num) {
631
+ return null;
632
+ }
633
+ return ((ref = cardFromNumber(num)) != null ? ref.type : void 0) || null;
634
+ };
635
+ payform.formatCardNumber = function(num) {
636
+ var card, groups, ref, upperLength;
637
+ num = replaceFullWidthChars(num);
638
+ num = num.replace(/\D/g, '');
639
+ card = cardFromNumber(num);
640
+ if (!card) {
641
+ return num;
642
+ }
643
+ upperLength = card.length[card.length.length - 1];
644
+ num = num.slice(0, upperLength);
645
+ if (card.format.global) {
646
+ return (ref = num.match(card.format)) != null ? ref.join(' ') : void 0;
647
+ } else {
648
+ groups = card.format.exec(num);
649
+ if (groups == null) {
650
+ return;
651
+ }
652
+ groups.shift();
653
+ groups = groups.filter(Boolean);
654
+ return groups.join(' ');
655
+ }
656
+ };
657
+ payform.formatCardExpiry = function(expiry) {
658
+ var mon, parts, sep, year;
659
+ expiry = replaceFullWidthChars(expiry);
660
+ parts = expiry.match(/^\D*(\d{1,2})(\D+)?(\d{1,4})?/);
661
+ if (!parts) {
662
+ return '';
663
+ }
664
+ mon = parts[1] || '';
665
+ sep = parts[2] || '';
666
+ year = parts[3] || '';
667
+ if (year.length > 0) {
668
+ sep = ' / ';
669
+ } else if (sep === ' /') {
670
+ mon = mon.substring(0, 1);
671
+ sep = '';
672
+ } else if (mon.length === 2 || sep.length > 0) {
673
+ sep = ' / ';
674
+ } else if (mon.length === 1 && (mon !== '0' && mon !== '1')) {
675
+ mon = "0" + mon;
676
+ sep = ' / ';
677
+ }
678
+ return mon + sep + year;
679
+ };
680
+ return payform;
681
+ });
682
+
683
+ }).call(this);
js/lib/jquery/bluesnap-noconflict.js ADDED
@@ -0,0 +1 @@
 
1
+ var $j = jQuery.noConflict();
js/lib/jquery/jquery-3.0.0.min.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*! jQuery v3.0.0 | (c) jQuery Foundation | jquery.org/license */
2
+ !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.0.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return a&&"[object Object]"===k.call(a)?(b=e(a))?(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n):!0:!1},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;d>f;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a)?(d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e):void 0},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"===c||r.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;d>b;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(f>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(1>=b&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){
3
+ return j.call(r(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;g>f;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;d>c;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;o>n;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){return this.originalEvent?b(this.originalEvent):void 0}:function(){return this.originalEvent?this.originalEvent[a]:void 0},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==va()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===va()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&r.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;m>l;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;i>l;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;e>d;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;e>d;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),0>=d||null==d){if(d=Ma(a,b,f),(0>d||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){return c?!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)}):void 0},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){return b?(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;e>g;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);g>f;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;e>d;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c);
4
+ }}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){return r.isArray(b)?a.checked=r.inArray(r(a).val(),b)>-1:void 0}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?r.event.trigger(a,b,c,!0):void 0}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;return o.cors||Pb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){return c?(c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c):void 0})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
package.xml CHANGED
@@ -1,18 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>bluesnap_payment</name>
4
- <version>2.0.2.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Community GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Magento Extension for BlueSnap payment</summary>
10
  <description>Magento Extension for BlueSnap payment</description>
11
- <notes>- fix force ssl issues </notes>
12
  <authors><author><name>Nachshon Fishbane</name><user>nahshf</user><email>nachshon@fisha.co.il</email></author></authors>
13
- <date>2016-03-17</date>
14
- <time>08:53:51</time>
15
- <contents><target name="magecommunity"><dir name="Bluesnap"><dir name="Payment"><dir name="Block"><dir name="Adminhtml"><dir name="Api"><dir name="Logger"><file name="Grid.php" hash="e35bcb916e09738a725c0a312e982feb"/></dir><file name="Logger.php" hash="7af64a11fe665ca23066a00ae1202613"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="d8b261305976d56263dbc85191a3cdb1"/></dir><dir name="Grid"><dir name="Renderer"><file name="Paymentmethod.php" hash="4480da922527c8112cf070fccaf1fb4c"/></dir></dir><file name="Grid.php" hash="920fa76250ae3ad33b182a8147364673"/><dir name="Invoice"><file name="Totals.php" hash="89e1277f55d54e6988a1570175b0b4c4"/></dir><file name="Totals.php" hash="f6792ad7311197814aa01be3ce820509"/><dir name="View"><dir name="Tab"><file name="Creditmemos.php" hash="41ac64fb7ec61359c51e9130731b2f33"/><file name="Invoices.php" hash="02a1e7dfdc8662e5336ef7982022d74a"/></dir></dir></dir></dir><dir name="Widget"><dir name="Grid"><dir name="Column"><dir name="Renderer"><file name="Xml.php" hash="1d1d40b7015a2cf644c322bf5c8c866c"/></dir></dir></dir></dir></dir><dir name="Buynow"><file name="Iframe.php" hash="52486def3cd9f2dcd83d54d3be08d578"/><dir name="Info"><file name="Order.php" hash="9c8b04eccc780a873b09a11cd080e547"/></dir></dir><dir name="Checkout"><dir name="Cart"><file name="Totals.php" hash="7eae09cf26577676c617694aa7cf8640"/></dir><file name="Grandtotal.php" hash="ba6fd8aaf003c015abfa466adfb2e644"/></dir><dir name="Customer"><dir name="Widget"><file name="Name.php" hash="3a4e9de6e6068a9c9646eb68f24a0d48"/></dir></dir><dir name="Order"><file name="Totals.php" hash="30d2f0311e1aceb1ee3c2adf0aad284c"/></dir><dir name="Payment"><dir name="Form"><file name="Buynow.php" hash="36a0238b3949f3f9d3bc3bef4dc72203"/><file name="Cse.php" hash="d907c3832ae228d252dfc8558cf9695c"/><file name="Saved.php" hash="7ad6d859034c93e46f47380914539493"/></dir><dir name="Info"><file name="Buynow.php" hash="94237e9a306db4199df55aacddee8272"/><file name="Cse.php" hash="14f154e5371b2e376ff8b3d7c7b78b5c"/></dir></dir></dir><file name="Exception.php" hash="0337cb725383fa330ab08803d95d0770"/><dir name="Helper"><file name="Checkout.php" hash="63cdf126f87f2afb7dee46e34e94d45e"/><file name="Config.php" hash="6b7ec2cae242e75d9344d890d860e618"/><file name="Data.php" hash="87444919689cf622f532d0343f6c8cb4"/><file name="Email.php" hash="e3acaafcd503e947fc28ae39c2616893"/><file name="Sales.php" hash="0ffc35ee24e44fb5c921e2b0f72fc3f1"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="19516e30bef2d5c158627b3cbc42f0f2"/><file name="Buynow.php" hash="5dc62c76f61cbe70e08ea5fe842e2b40"/><file name="Config.php" hash="e45b9fd65420aa5172814e20160a66e6"/><file name="Cse.php" hash="49847d21cd091512785d2b39b47d74e9"/><file name="Currency.php" hash="c792fe8012211b8d89ebf6a171d20690"/><file name="Exception.php" hash="ecd51203c6ad643980b3c260f64df0bf"/><file name="Logger.php" hash="21a966590e313fb615e6660db19088d1"/><file name="Refund.php" hash="451622e145fb36df859941712d287772"/><file name="Saved.php" hash="f90f15b8b85f60fb539c30610d75bc43"/></dir><dir name="Directory"><dir name="Currency"><file name="Import.php" hash="709b8ab48804e96cfe86a95cc13ff00b"/></dir><file name="Currency.php" hash="8235b8195671a7d69708157469b2ed7b"/><file name="Observer.php" hash="de717bb7dcac6fe1c9c96623f17a919b"/></dir><file name="Ipn.php" hash="16066535e74cce434c532c09600b0020"/><dir name="Logger"><dir name="Db"><file name="Entry.php" hash="c8ec0373040489819cbdd653c31a179a"/></dir><file name="Db.php" hash="4da177acece44978edefb4e46c1c75dc"/><file name="File.php" hash="12eb5993943f7be0a0bb83c2b740abad"/><file name="Mail.php" hash="7ee74389226a425f4f10d78ad820dd5f"/></dir><file name="Observer.php" hash="d84ef7aed328da93a8ad1b983ae4ed30"/><dir name="Payment"><file name="Abstract.php" hash="23222f7e488f3e3898624866100447e9"/><file name="Buynow.php" hash="a7b96667c7ab05caf1b1c818c88acfdd"/><file name="Cse.php" hash="188ee440d1c7953492d9ce623159137b"/></dir><dir name="Resource"><dir name="Directory"><file name="Currency.php" hash="21fdc0c6e85652cc07cec3f7e287e1c9"/></dir><dir name="Logger"><dir name="Db"><dir name="Entry"><file name="Collection.php" hash="328246533e58befe7308120a0c6919ee"/></dir><file name="Entry.php" hash="8b7deb7f148846f3913390de6de5dccd"/></dir></dir></dir><dir name="Sales"><dir name="Order"><file name="Payment.php" hash="f2fb2ab21fdd463ccc19aa007d1486fc"/></dir><file name="Order.php" hash="901431fa7219a40200abcc9502f50ed6"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="PaymentAction.php" hash="575ee53a84e5dcb9f01db85af6a9f814"/><file name="Priorities.php" hash="836b142dee2ed56ee06d9c6de5ef0d30"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Bluesnap"><file name="LoggerController.php" hash="105c40df4cac28602b47677033d1c05c"/></dir></dir><file name="CheckoutController.php" hash="ffcc6df5e95e79cb0b464a27ea94304d"/><file name="IpnController.php" hash="2ccff15342071d1b02b710cd6bea06ee"/></dir><dir name="etc"><file name="adminhtml.xml" hash="fea2afd0b7b1bad56357d41a55c674e5"/><file name="config.xml" hash="44288dc8449f4596341d2524a40afbf0"/><file name="currencies.xml" hash="3945d48f94901335a17d60b8023734b3"/><file name="system.xml" hash="42521faf8af89246d745756c8d01e1cc"/></dir><dir name="sql"><dir name="bluesnap_setup"><file name="mysql4-install-1.0.0.php" hash="deff408cebf43a0da27df234b3a4a574"/><file name="mysql4-upgrade-1.0.0-1.0.2.php" hash="52410fd8ad042a40d689cdd11029336f"/><file name="mysql4-upgrade-1.0.2-1.0.3.php" hash="c46114a7c3d63191ad2f7981a28e6d61"/><file name="mysql4-upgrade-1.0.3-1.0.4.php" hash="0ca97a398e2217d46ae1bead746c13ee"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Bluesnap_Payment.xml" hash="d3304c1c54e41d26ee462e511984e924"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="bluesnap"><dir><dir name="customer"><dir name="widget"><file name="name.phtml" hash="98710530af5e22bedbcb48854f0f5bb6"/></dir></dir><dir name="payment"><dir name="buynow"><dir name="checkout"><dir name="info"><dir name="order"><dir name="items"><dir name="renderer"><file name="bundle.phtml" hash="867621a538e465f43f817a0ef75f85ae"/><file name="default.phtml" hash="31d37f4de5cd9661bc25c61f8ea72684"/><file name="downloadable.phtml" hash="daa576d0856a7808ba572246d10bf44b"/></dir></dir><file name="items.phtml" hash="3d7417a464c5cc98da6670305c7d7912"/></dir><file name="order.phtml" hash="db7b9d59b520e29d1c871518420dc7fa"/></dir></dir><file name="redirect.phtml" hash="6b5ad1684c9fe882df886b420f79c357"/></dir><dir name="form"><file name="buynow.phtml" hash="d18dc5a30deff9ea585e4b6a92553d2f"/><file name="cse.phtml" hash="b8ec8141b365b6110a65ee32e5e622c5"/><file name="saved.phtml" hash="63dba7d1300862d74523e673e5886d0a"/></dir><dir name="info"><file name="buynow.phtml" hash="a0b46dbd5993b7da89fea982b11c5b43"/></dir><file name="methods-test.phtml" hash="f495f87981d55bfad3b9897ee01e03ef"/><dir name="sales"><dir name="order"><file name="totals.phtml" hash="0144d7a8b2db6a0b491f22aac911582b"/></dir></dir><dir name="tax"><dir name="checkout"><file name="grandtotal.phtml" hash="e6aaa428653de04a146dfa5d588ab052"/></dir></dir></dir></dir></dir></dir><dir name="layout"><dir name="bluesnap"><file name="payment.xml" hash="21559c82102292fdd3867325f2e1a9c0"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="bluesnap"><file name="head_js.phtml" hash="874c25bd8bfcdbddd0e890de369e7c35"/><dir><dir name="payment"><dir name="form"><file name="buynow.phtml" hash="d18dc5a30deff9ea585e4b6a92553d2f"/><file name="cse.phtml" hash="355607f6ea20ab8e065961154d995c06"/><file name="saved.phtml" hash="c6a5ae314cba0f2ef8844886c8832b40"/></dir><dir name="info"><file name="buynow.phtml" hash="15118c84071e9111010a647cfb8e8ba3"/></dir></dir><dir name="sales"><dir name="order"><file name="totals.phtml" hash="4440829e839cd288d5220c2e6b9936e9"/></dir></dir></dir></dir></dir><dir name="layout"><file name="bluesnap.xml" hash="63ded7cc83af17f90ed419dc8f67b034"/></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><file name="transaction_refunded.html" hash="63ed356d54eb6d8bebdd9e3f01d8577c"/><file name="transaction_refund_failed.html" hash="8d1dc8b5f2efd354a1e3f246323604f3"/><file name="transaction_declined.html" hash="3ad925930b208fca54375b7d223a87f1"/><file name="transaction_chargeback.html" hash="d209b430260880c27bb32f7ffd535b6b"/></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="js"><dir name="bluesnap"><file name="credit-card-detect.js" hash="910c698e825854d3905113b37e5d52d9"/><file name="payform.js" hash="305e24d4a404eb512bbed5ab9ee186c6"/></dir></dir><dir name="css"><dir name="bluesnap"><dir name="buynow"><file name="checkout.css" hash="d15caa2328c6dd238479ff848510462c"/></dir></dir></dir><dir name="images"><dir name="bluesnap"><dir name="buynow"><file name="bluesnap-icons.png" hash="7e2c587b2fb4118753e542edf1ec99e1"/><file name="cards.png" hash="a428701f5315f2ca85f1e92fe08f6b33"/><file name="credit-card-icons.jpg" hash="605484903d131fbccfd71dc9c669efdd"/><file name="sprite-cards.png" hash="aac569c1960ff2b18fbeb1bcba2655e1"/></dir></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="lib"><dir name="jquery"><dir name="jquery-ui"><dir><dir name="external"><dir name="jquery"><file name="jquery.js" hash="91515770ce8c55de23b306444d8ea998"/></dir></dir><dir name="images"><file name="ui-bg_diagonals-thick_18_b81900_40x40.png" hash="210d3532b494ab40582720391610fced"/><file name="ui-bg_diagonals-thick_20_666666_40x40.png" hash="936672ede7670bf3137617a10ff5a822"/><file name="ui-bg_glass_100_f6f6f6_1x400.png" hash="a560a96b625b078136e0b8a7c44296e5"/><file name="ui-bg_glass_100_fdf5ce_1x400.png" hash="2f810182cc0cbc8379f224134e77115c"/><file name="ui-bg_glass_65_ffffff_1x400.png" hash="5c8670d69f9806c382e58d44e762be97"/><file name="ui-bg_gloss-wave_35_f6a828_500x100.png" hash="5ac041ef2a6a16a186195c21d7719d55"/><file name="ui-bg_highlight-soft_100_eeeeee_1x100.png" hash="b62dea37c2b588ca16c615b4cd283f18"/><file name="ui-bg_highlight-soft_75_ffe45c_1x100.png" hash="4a2b80d82a880c8feba6466c437ffaf7"/><file name="ui-icons_222222_256x240.png" hash="3a3c5468f484f07ac4a320d9e22acb8c"/><file name="ui-icons_228ef1_256x240.png" hash="92b29683b6a48eae7de7eb4b1cfa039c"/><file name="ui-icons_ef8c08_256x240.png" hash="f492970693640894fb54166c75dd2925"/><file name="ui-icons_ffd27a_256x240.png" hash="dda1b6f694b0d196aefc66a1d6d758f6"/><file name="ui-icons_ffffff_256x240.png" hash="41612b0f4a034424f8321c9f824a94da"/></dir></dir><file name="index.html" hash="599df27072772c383d59eff35ce47389"/><file name="jquery-ui.css" hash="d546ace9545c984dad3366bad72a2846"/><file name="jquery-ui.js" hash="b78f2c8ec1b19df2352bb7eac8449a31"/><file name="jquery-ui.min.css" hash="b38cb48591129782d11d8ed7dc907cba"/><file name="jquery-ui.min.js" hash="6b5d4f0060b4c9b850dc2c658fb621e5"/><file name="jquery-ui.structure.css" hash="d0513b6eb397ffd447a25b818bbf849a"/><file name="jquery-ui.structure.min.css" hash="fbd5637f600da6f2c183cddf1793e2a7"/><file name="jquery-ui.theme.css" hash="8ca374e05408e9710e3c389af2d1ccf5"/><file name="jquery-ui.theme.min.css" hash="55a14f8a1354b43b7f1ac8820b89ef94"/></dir></dir></dir><dir name="bluesnap"><file name="bsadmin.js" hash="66b4b771d221a69762f68fe7266c3ba2"/></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.3.0</min><max>5.7.0</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>bluesnap_payment</name>
4
+ <version>2.0.3.2</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Community GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Magento Extension for BlueSnap payment</summary>
10
  <description>Magento Extension for BlueSnap payment</description>
11
+ <notes>- changed text in system </notes>
12
  <authors><author><name>Nachshon Fishbane</name><user>nahshf</user><email>nachshon@fisha.co.il</email></author></authors>
13
+ <date>2016-07-28</date>
14
+ <time>17:12:29</time>
15
+ <contents><target name="magecommunity"><dir name="Bluesnap"><dir name="Payment"><dir name="Block"><dir name="Adminhtml"><dir name="Api"><dir name="Logger"><file name="Grid.php" hash="e35bcb916e09738a725c0a312e982feb"/></dir><file name="Logger.php" hash="7af64a11fe665ca23066a00ae1202613"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="d8b261305976d56263dbc85191a3cdb1"/></dir><dir name="Grid"><dir name="Renderer"><file name="Paymentmethod.php" hash="4480da922527c8112cf070fccaf1fb4c"/></dir></dir><file name="Grid.php" hash="61337375bdc7c2199cab847fc30f2e04"/><dir name="Invoice"><file name="Totals.php" hash="89e1277f55d54e6988a1570175b0b4c4"/></dir><file name="Totals.php" hash="f6792ad7311197814aa01be3ce820509"/><dir name="View"><dir name="Tab"><file name="Creditmemos.php" hash="41ac64fb7ec61359c51e9130731b2f33"/><file name="Invoices.php" hash="02a1e7dfdc8662e5336ef7982022d74a"/></dir></dir></dir></dir><dir name="Widget"><dir name="Grid"><dir name="Column"><dir name="Renderer"><file name="Xml.php" hash="1d1d40b7015a2cf644c322bf5c8c866c"/></dir></dir></dir></dir></dir><dir name="Buynow"><file name="Iframe.php" hash="52486def3cd9f2dcd83d54d3be08d578"/><dir name="Info"><file name="Order.php" hash="9c8b04eccc780a873b09a11cd080e547"/></dir></dir><dir name="Checkout"><dir name="Cart"><file name="Totals.php" hash="7eae09cf26577676c617694aa7cf8640"/></dir><file name="Grandtotal.php" hash="ba6fd8aaf003c015abfa466adfb2e644"/></dir><dir name="Customer"><dir name="Widget"><file name="Name.php" hash="3a4e9de6e6068a9c9646eb68f24a0d48"/></dir></dir><dir name="Order"><file name="Totals.php" hash="30d2f0311e1aceb1ee3c2adf0aad284c"/></dir><dir name="Payment"><dir name="Form"><file name="Buynow.php" hash="36a0238b3949f3f9d3bc3bef4dc72203"/><file name="Cse.php" hash="9497889bc1f0e962efe4afb5c3b4a0aa"/><file name="Saved.php" hash="7ad6d859034c93e46f47380914539493"/></dir><dir name="Info"><file name="Buynow.php" hash="94237e9a306db4199df55aacddee8272"/><file name="Cse.php" hash="14f154e5371b2e376ff8b3d7c7b78b5c"/></dir></dir></dir><file name="Exception.php" hash="0337cb725383fa330ab08803d95d0770"/><dir name="Helper"><file name="Checkout.php" hash="63cdf126f87f2afb7dee46e34e94d45e"/><file name="Config.php" hash="6b7ec2cae242e75d9344d890d860e618"/><file name="Data.php" hash="87d778cea74dc17b7dff0b9231a08cfb"/><file name="Email.php" hash="e3acaafcd503e947fc28ae39c2616893"/><file name="Sales.php" hash="0ffc35ee24e44fb5c921e2b0f72fc3f1"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="19516e30bef2d5c158627b3cbc42f0f2"/><file name="Buynow.php" hash="5dc62c76f61cbe70e08ea5fe842e2b40"/><file name="Config.php" hash="e45b9fd65420aa5172814e20160a66e6"/><file name="Cse.php" hash="380f04f7a7a23ed73f2a14c735096dd7"/><file name="Currency.php" hash="c792fe8012211b8d89ebf6a171d20690"/><file name="Exception.php" hash="ecd51203c6ad643980b3c260f64df0bf"/><file name="Logger.php" hash="4ef0d3dae4ba2df0ba6c0fff7753a18b"/><file name="Refund.php" hash="78e23a01fefaabe7b673fbd8ff3929d9"/><file name="Saved.php" hash="27f0a9ab9d8498c046ccdb605cb8d490"/></dir><dir name="Directory"><dir name="Currency"><file name="Import.php" hash="4c75acef7a276dbacd34d4a9407055ae"/></dir><file name="Currency.php" hash="8235b8195671a7d69708157469b2ed7b"/><file name="Observer.php" hash="de717bb7dcac6fe1c9c96623f17a919b"/></dir><file name="Ipn.php" hash="16066535e74cce434c532c09600b0020"/><dir name="Logger"><dir name="Db"><file name="Entry.php" hash="c8ec0373040489819cbdd653c31a179a"/></dir><file name="Db.php" hash="a181a248d2b410a0d5964540a574343d"/><file name="File.php" hash="12eb5993943f7be0a0bb83c2b740abad"/><file name="Mail.php" hash="7ee74389226a425f4f10d78ad820dd5f"/></dir><file name="Observer.php" hash="5394eb772b0045c4b78b699ced24a8ab"/><dir name="Payment"><file name="Abstract.php" hash="23222f7e488f3e3898624866100447e9"/><file name="Buynow.php" hash="a7b96667c7ab05caf1b1c818c88acfdd"/><file name="Cse.php" hash="68cb0a93bf7e9ca276f0b152478647d6"/></dir><dir name="Resource"><dir name="Directory"><file name="Currency.php" hash="21fdc0c6e85652cc07cec3f7e287e1c9"/></dir><dir name="Logger"><dir name="Db"><dir name="Entry"><file name="Collection.php" hash="328246533e58befe7308120a0c6919ee"/></dir><file name="Entry.php" hash="8b7deb7f148846f3913390de6de5dccd"/></dir></dir></dir><dir name="Sales"><dir name="Order"><file name="Payment.php" hash="74bb18a53d41fa10a7ede2e740ae6375"/></dir><file name="Order.php" hash="901431fa7219a40200abcc9502f50ed6"/></dir><file name="Sslvalidation.php" hash="541f09f741591d5cb583f9021c312dc3"/><dir name="System"><dir name="Config"><dir name="Source"><file name="PaymentAction.php" hash="575ee53a84e5dcb9f01db85af6a9f814"/><file name="Priorities.php" hash="836b142dee2ed56ee06d9c6de5ef0d30"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Bluesnap"><file name="LoggerController.php" hash="105c40df4cac28602b47677033d1c05c"/></dir></dir><file name="CheckoutController.php" hash="ffcc6df5e95e79cb0b464a27ea94304d"/><file name="IpnController.php" hash="2ccff15342071d1b02b710cd6bea06ee"/></dir><dir name="etc"><file name="adminhtml.xml" hash="fea2afd0b7b1bad56357d41a55c674e5"/><file name="config.xml" hash="e1ad733fa695a81021ad3a85c907eace"/><file name="currencies.xml" hash="3945d48f94901335a17d60b8023734b3"/><file name="system.xml" hash="750418c4f637fce4d5bf43f9a629ba9c"/></dir><dir name="sql"><dir name="bluesnap_setup"><file name="mysql4-install-1.0.0.php" hash="deff408cebf43a0da27df234b3a4a574"/><file name="mysql4-upgrade-1.0.0-1.0.2.php" hash="52410fd8ad042a40d689cdd11029336f"/><file name="mysql4-upgrade-1.0.2-1.0.3.php" hash="920c513178069a52611c95612e3b8f13"/><file name="mysql4-upgrade-1.0.3-1.0.4.php" hash="1e71bac7b62e64233df39a669fb5effb"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Bluesnap_Payment.xml" hash="d3304c1c54e41d26ee462e511984e924"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="bluesnap"><dir><dir name="customer"><dir name="widget"><file name="name.phtml" hash="98710530af5e22bedbcb48854f0f5bb6"/></dir></dir><dir name="payment"><dir name="buynow"><dir name="checkout"><dir name="info"><dir name="order"><dir name="items"><dir name="renderer"><file name="bundle.phtml" hash="867621a538e465f43f817a0ef75f85ae"/><file name="default.phtml" hash="31d37f4de5cd9661bc25c61f8ea72684"/><file name="downloadable.phtml" hash="daa576d0856a7808ba572246d10bf44b"/></dir></dir><file name="items.phtml" hash="3d7417a464c5cc98da6670305c7d7912"/></dir><file name="order.phtml" hash="db7b9d59b520e29d1c871518420dc7fa"/></dir></dir><file name="redirect.phtml" hash="6b5ad1684c9fe882df886b420f79c357"/></dir><dir name="form"><file name="buynow.phtml" hash="d18dc5a30deff9ea585e4b6a92553d2f"/><file name="cse.phtml" hash="a402643578967212832487bc8c87587e"/><file name="saved.phtml" hash="63dba7d1300862d74523e673e5886d0a"/></dir><dir name="info"><file name="buynow.phtml" hash="a0b46dbd5993b7da89fea982b11c5b43"/></dir><file name="methods-test.phtml" hash="f495f87981d55bfad3b9897ee01e03ef"/><dir name="sales"><dir name="order"><file name="totals.phtml" hash="0144d7a8b2db6a0b491f22aac911582b"/></dir></dir><dir name="tax"><dir name="checkout"><file name="grandtotal.phtml" hash="e6aaa428653de04a146dfa5d588ab052"/></dir></dir></dir></dir></dir></dir><dir name="layout"><dir name="bluesnap"><file name="payment.xml" hash="38c606a548436e0aec20725555d7862d"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="bluesnap"><file name="head_js.phtml" hash="874c25bd8bfcdbddd0e890de369e7c35"/><dir><dir name="payment"><dir name="form"><file name="buynow.phtml" hash="d18dc5a30deff9ea585e4b6a92553d2f"/><file name="cse.phtml" hash="355607f6ea20ab8e065961154d995c06"/><file name="saved.phtml" hash="c6a5ae314cba0f2ef8844886c8832b40"/></dir><dir name="info"><file name="buynow.phtml" hash="15118c84071e9111010a647cfb8e8ba3"/></dir></dir><dir name="sales"><dir name="order"><file name="totals.phtml" hash="4440829e839cd288d5220c2e6b9936e9"/></dir></dir></dir></dir></dir><dir name="layout"><file name="bluesnap.xml" hash="63ded7cc83af17f90ed419dc8f67b034"/></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><file name="transaction_refunded.html" hash="63ed356d54eb6d8bebdd9e3f01d8577c"/><file name="transaction_refund_failed.html" hash="8d1dc8b5f2efd354a1e3f246323604f3"/><file name="transaction_declined.html" hash="3ad925930b208fca54375b7d223a87f1"/><file name="transaction_chargeback.html" hash="d209b430260880c27bb32f7ffd535b6b"/></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="js"><dir name="bluesnap"><file name="credit-card-detect.js" hash="2d42294168ebc3a211799a36bcf80a33"/><file name="payform.js" hash="2c6f09a9445ab1d2683543c84f5fc112"/></dir></dir><dir name="css"><dir name="bluesnap"><dir name="buynow"><file name="checkout.css" hash="d15caa2328c6dd238479ff848510462c"/></dir></dir></dir><dir name="images"><dir name="bluesnap"><dir name="buynow"><file name="bluesnap-icons.png" hash="7e2c587b2fb4118753e542edf1ec99e1"/><file name="cards.png" hash="a428701f5315f2ca85f1e92fe08f6b33"/><file name="credit-card-icons.jpg" hash="605484903d131fbccfd71dc9c669efdd"/><file name="sprite-cards.png" hash="aac569c1960ff2b18fbeb1bcba2655e1"/></dir></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="bluesnap"><file name="bsadmin.js" hash="66b4b771d221a69762f68fe7266c3ba2"/><file name="payform.js" hash="2c6f09a9445ab1d2683543c84f5fc112"/><file name="credit-card-detect.js" hash="ae11ea2ff6e52c0d12e022077718176b"/></dir><dir name="lib"><dir name="jquery"><file name="jquery-3.0.0.min.js" hash="d0212568ce69457081dacf84e327fa5c"/><file name="bluesnap-noconflict.js" hash="aa385db0edc8478d5f7c7ae23e4b42f5"/><dir name="jquery-ui"><dir><dir name="external"><dir name="jquery"><file name="jquery.js" hash="91515770ce8c55de23b306444d8ea998"/></dir></dir><dir name="images"><file name="ui-bg_diagonals-thick_18_b81900_40x40.png" hash="210d3532b494ab40582720391610fced"/><file name="ui-bg_diagonals-thick_20_666666_40x40.png" hash="936672ede7670bf3137617a10ff5a822"/><file name="ui-bg_glass_100_f6f6f6_1x400.png" hash="a560a96b625b078136e0b8a7c44296e5"/><file name="ui-bg_glass_100_fdf5ce_1x400.png" hash="2f810182cc0cbc8379f224134e77115c"/><file name="ui-bg_glass_65_ffffff_1x400.png" hash="5c8670d69f9806c382e58d44e762be97"/><file name="ui-bg_gloss-wave_35_f6a828_500x100.png" hash="5ac041ef2a6a16a186195c21d7719d55"/><file name="ui-bg_highlight-soft_100_eeeeee_1x100.png" hash="b62dea37c2b588ca16c615b4cd283f18"/><file name="ui-bg_highlight-soft_75_ffe45c_1x100.png" hash="4a2b80d82a880c8feba6466c437ffaf7"/><file name="ui-icons_222222_256x240.png" hash="3a3c5468f484f07ac4a320d9e22acb8c"/><file name="ui-icons_228ef1_256x240.png" hash="92b29683b6a48eae7de7eb4b1cfa039c"/><file name="ui-icons_ef8c08_256x240.png" hash="f492970693640894fb54166c75dd2925"/><file name="ui-icons_ffd27a_256x240.png" hash="dda1b6f694b0d196aefc66a1d6d758f6"/><file name="ui-icons_ffffff_256x240.png" hash="41612b0f4a034424f8321c9f824a94da"/></dir></dir><file name="index.html" hash="599df27072772c383d59eff35ce47389"/><file name="jquery-ui.css" hash="d546ace9545c984dad3366bad72a2846"/><file name="jquery-ui.js" hash="b78f2c8ec1b19df2352bb7eac8449a31"/><file name="jquery-ui.min.css" hash="b38cb48591129782d11d8ed7dc907cba"/><file name="jquery-ui.min.js" hash="6b5d4f0060b4c9b850dc2c658fb621e5"/><file name="jquery-ui.structure.css" hash="d0513b6eb397ffd447a25b818bbf849a"/><file name="jquery-ui.structure.min.css" hash="fbd5637f600da6f2c183cddf1793e2a7"/><file name="jquery-ui.theme.css" hash="8ca374e05408e9710e3c389af2d1ccf5"/><file name="jquery-ui.theme.min.css" hash="55a14f8a1354b43b7f1ac8820b89ef94"/></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.3.0</min><max>5.7.0</max></php></required></dependencies>
18
  </package>
skin/frontend/base/default/js/bluesnap/credit-card-detect.js CHANGED
@@ -216,3 +216,76 @@
216
 
217
  };
218
  })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
 
217
  };
218
  })(jQuery);
219
+
220
+
221
+ function removeSpaceCc(el){
222
+ var val = el.value.replace(/\s/g, "");
223
+ document.getElementById("cse_cc_number").value=val;
224
+ console.log(payform.parseCardType(val));
225
+ console.log(getType(document.getElementById("cse_cc_type").value));
226
+
227
+ if(document.getElementById("cse_cc_type").value=='' || payform.parseCardType(val) != getType(document.getElementById("cse_cc_type").value)){
228
+ var creditCardType = payform.parseCardType(val);
229
+ switch(creditCardType) {
230
+ case 'visa':
231
+ jQuery('.pli-cc-VISA').addClass('pli-active');
232
+ jQuery("select[id=cse_cc_type]").val('VI');
233
+ break;
234
+ case 'mastercard':
235
+ jQuery('.pli-cc-MASTERCARD').addClass('pli-active');
236
+ jQuery("select[id=cse_cc_type]").val('MC');
237
+ break;
238
+ case 'amex':
239
+ jQuery('.pli-cc-AMEX').addClass('pli-active');
240
+ jQuery("select[id=cse_cc_type]").val('AE');
241
+ break;
242
+ case 'discover':
243
+ jQuery('.pli-cc-DISCOVER').addClass('pli-active');
244
+ jQuery("select[id=cse_cc_type]").val('DI');
245
+ break;
246
+ case 'jcb':
247
+ jQuery('.pli-cc-JCB').addClass('pli-active');
248
+ jQuery("select[id=cse_cc_type]").val('JCB');
249
+ break;
250
+ case 'dinersclub':
251
+ jQuery('.pli-cc-DINERS').addClass('pli-active');
252
+ jQuery("select[id=cse_cc_type]").val('DC');
253
+ break;
254
+ case 'carteblue':
255
+ jQuery('.pli-cc-CARTE_BLEUE').addClass('pli-active');
256
+ jQuery("select[id=cse_cc_type]").val('CB');
257
+ break;
258
+ };
259
+
260
+ if(jQuery(".validation-advice")) {
261
+ jQuery(".validation-advice").hide();
262
+ }
263
+
264
+ }
265
+ }
266
+
267
+ function getType(code){
268
+ switch(code) {
269
+ case 'VI':
270
+ return "visa";
271
+ break;
272
+ case 'MC':
273
+ return 'mastercard';
274
+ break;
275
+ case 'AE':
276
+ return "amex";
277
+ break;
278
+ case 'DI':
279
+ return 'discover';
280
+ break;
281
+ case 'JCB':
282
+ return 'jcb';
283
+ break;
284
+ case 'DC':
285
+ return "dinersclub";
286
+ break;
287
+ case 'CB':
288
+ return 'carteblue';
289
+ break;
290
+ };
291
+ }
skin/frontend/base/default/js/bluesnap/payform.js CHANGED
@@ -108,10 +108,6 @@
108
  luhn: true
109
 
110
  },
111
-
112
-
113
-
114
-
115
  {
116
  type: 'mastercard',
117
  pattern: /^(5[1-5]|2[2-7])/,
@@ -122,10 +118,11 @@
122
  },
123
  {
124
  type: 'amex',
125
- pattern: /^3[47]/,
 
126
  format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
127
  length: [15],
128
- cvcLength: [3, 4],
129
  luhn: true
130
  }, {
131
  type: 'dinersclub',
@@ -135,9 +132,6 @@
135
  cvcLength: [3],
136
  luhn: true
137
  },
138
-
139
-
140
-
141
  {
142
  type: 'discover',
143
  pattern: /^6([045]|22)/,
@@ -162,16 +156,10 @@
162
  },
163
 
164
  // from https://github.com/PawelDecowski/jquery-creditcardvalidator/blob/master/jquery.creditCardValidator.js
165
- {
166
- name: 'amex',
167
- pattern: /^3[47]/,
168
- format: defaultFormat,
169
- length: [15],
170
- cvcLength: [3, 4],
171
- luhn: true
172
- },
173
  {
174
- name: 'carte_blanche',
 
175
  pattern: /^30[0-5]/,
176
  format: defaultFormat,
177
  length: [14],
@@ -179,14 +167,16 @@
179
  luhn: true
180
  },
181
  {
182
- name: 'dinersclub',
 
183
  pattern: /^36/,
184
  format: defaultFormat,
185
  length: [14],
186
  cvcLength: [3],
187
  luhn: true
188
  }, {
189
- name: 'jcb',
 
190
  format: defaultFormat,
191
  pattern: /^35(2[89]|[3-8][0-9])/,
192
  length: [16],
@@ -194,40 +184,46 @@
194
  luhn: true
195
 
196
  }, {
197
- name: 'laser',
 
198
  format: defaultFormat,
199
  pattern: /^(6304|670[69]|6771)/,
200
  length: [16, 17, 18, 19]
201
  }, {
202
- name: 'visa_electron',
 
203
  format: defaultFormat,
204
  pattern: /^(4026|417500|4508|4844|491(3|7))/,
205
  length: [16],
206
  cvcLength: [3],
207
  luhn: true
208
  }, {
209
- name: 'visa',
 
210
  format: defaultFormat,
211
  pattern: /^4/,
212
  length: [16],
213
  cvcLength: [3],
214
  luhn: true
215
  }, {
216
- name: 'mastercard',
 
217
  format: defaultFormat,
218
  pattern: /^5[1-5]/,
219
  length: [16],
220
  cvcLength: [3],
221
  luhn: true
222
  }, {
223
- name: 'maestro',
 
224
  format: defaultFormat,
225
  pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
226
  length: [12, 13, 14, 15, 16, 17, 18, 19],
227
  cvcLength: [3],
228
  luhn: true
229
  }, {
230
- name: 'discover',
 
231
  format: defaultFormat,
232
  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)/,
233
  length: [16],
@@ -380,6 +376,7 @@
380
  return e.target.setSelectionRange(cursor, cursor);
381
  }
382
  };
 
383
  formatCardExpiry = function(e) {
384
  var digit, val;
385
  digit = String.fromCharCode(e.which);
@@ -540,6 +537,9 @@
540
  _on(input, 'change', restrictNumeric);
541
  return _on(input, 'input', restrictNumeric);
542
  };
 
 
 
543
  payform.parseCardExpiry = function(value) {
544
  var month, prefix, ref, year;
545
  value = value.replace(/\s/g, '');
@@ -558,14 +558,17 @@
558
  };
559
  payform.validateCardNumber = function(num) {
560
  var card, ref;
 
561
  num = (num + '').replace(/\s+|-/g, '');
562
  if (!/^\d+$/.test(num)) {
563
  return false;
564
  }
565
- card = cardFromNumber(num);
 
566
  if (!card) {
567
  return false;
568
  }
 
569
  return (ref = num.length, indexOf.call(card.length, ref) >= 0) && (card.luhn === false || luhnCheck(num));
570
  };
571
  payform.validateCardExpiry = function(month, year) {
@@ -606,10 +609,16 @@
606
  payform.validateCardCVC = function(cvc, type) {
607
  var card, ref;
608
  cvc = String(cvc).trim();
 
 
 
 
 
609
  if (!/^\d+$/.test(cvc)) {
610
  return false;
611
  }
612
  card = cardFromType(type);
 
613
  if (card != null) {
614
  return ref = cvc.length, indexOf.call(card.cvcLength, ref) >= 0;
615
  } else {
108
  luhn: true
109
 
110
  },
 
 
 
 
111
  {
112
  type: 'mastercard',
113
  pattern: /^(5[1-5]|2[2-7])/,
118
  },
119
  {
120
  type: 'amex',
121
+ pattern: /^3(4|7)/,
122
+ // pattern: /^3[47]/,
123
  format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
124
  length: [15],
125
+ cvcLength: [4],
126
  luhn: true
127
  }, {
128
  type: 'dinersclub',
132
  cvcLength: [3],
133
  luhn: true
134
  },
 
 
 
135
  {
136
  type: 'discover',
137
  pattern: /^6([045]|22)/,
156
  },
157
 
158
  // from https://github.com/PawelDecowski/jquery-creditcardvalidator/blob/master/jquery.creditCardValidator.js
159
+
 
 
 
 
 
 
 
160
  {
161
+ type: 'carte_blanche',
162
+ // name: 'carte_blanche',
163
  pattern: /^30[0-5]/,
164
  format: defaultFormat,
165
  length: [14],
167
  luhn: true
168
  },
169
  {
170
+ type: 'dinersclub',
171
+ // name: 'dinersclub',
172
  pattern: /^36/,
173
  format: defaultFormat,
174
  length: [14],
175
  cvcLength: [3],
176
  luhn: true
177
  }, {
178
+ type: 'jcb',
179
+ // name: 'jcb',
180
  format: defaultFormat,
181
  pattern: /^35(2[89]|[3-8][0-9])/,
182
  length: [16],
184
  luhn: true
185
 
186
  }, {
187
+ type: 'laser',
188
+ // name: 'laser',
189
  format: defaultFormat,
190
  pattern: /^(6304|670[69]|6771)/,
191
  length: [16, 17, 18, 19]
192
  }, {
193
+ type: 'visa_electron',
194
+ // name: 'visa_electron',
195
  format: defaultFormat,
196
  pattern: /^(4026|417500|4508|4844|491(3|7))/,
197
  length: [16],
198
  cvcLength: [3],
199
  luhn: true
200
  }, {
201
+ type: 'visa',
202
+ // name: 'visa',
203
  format: defaultFormat,
204
  pattern: /^4/,
205
  length: [16],
206
  cvcLength: [3],
207
  luhn: true
208
  }, {
209
+ type: 'mastercard',
210
+ // name: 'mastercard',
211
  format: defaultFormat,
212
  pattern: /^5[1-5]/,
213
  length: [16],
214
  cvcLength: [3],
215
  luhn: true
216
  }, {
217
+ type: 'maestro',
218
+ // name: 'maestro',
219
  format: defaultFormat,
220
  pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
221
  length: [12, 13, 14, 15, 16, 17, 18, 19],
222
  cvcLength: [3],
223
  luhn: true
224
  }, {
225
+ type: 'discover',
226
+ // name: 'discover',
227
  format: defaultFormat,
228
  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)/,
229
  length: [16],
376
  return e.target.setSelectionRange(cursor, cursor);
377
  }
378
  };
379
+
380
  formatCardExpiry = function(e) {
381
  var digit, val;
382
  digit = String.fromCharCode(e.which);
537
  _on(input, 'change', restrictNumeric);
538
  return _on(input, 'input', restrictNumeric);
539
  };
540
+ payform.cardFromNumber = function(num) {
541
+ return cardFromNumber(num);
542
+ };
543
  payform.parseCardExpiry = function(value) {
544
  var month, prefix, ref, year;
545
  value = value.replace(/\s/g, '');
558
  };
559
  payform.validateCardNumber = function(num) {
560
  var card, ref;
561
+
562
  num = (num + '').replace(/\s+|-/g, '');
563
  if (!/^\d+$/.test(num)) {
564
  return false;
565
  }
566
+
567
+ card = cardFromNumber(num);
568
  if (!card) {
569
  return false;
570
  }
571
+
572
  return (ref = num.length, indexOf.call(card.length, ref) >= 0) && (card.luhn === false || luhnCheck(num));
573
  };
574
  payform.validateCardExpiry = function(month, year) {
609
  payform.validateCardCVC = function(cvc, type) {
610
  var card, ref;
611
  cvc = String(cvc).trim();
612
+
613
+ if(!type) {
614
+ type = this.parseCardType($("cse_cc_number").getValue());
615
+ }
616
+
617
  if (!/^\d+$/.test(cvc)) {
618
  return false;
619
  }
620
  card = cardFromType(type);
621
+
622
  if (card != null) {
623
  return ref = cvc.length, indexOf.call(card.cvcLength, ref) >= 0;
624
  } else {