Novalnet - Version 10.2.1

Version Notes

- Implemented Novalnet SafetyPay and Novalnet Direct Debit SEPA payment methods.

- Version compatibility has been checked.

- Updated callback script file.

- Updated auto refill option for Credit card, Direct Debit SEPA, Direct Debit Austria & Direct Debit German payment methods.

- Updated Direct Debit SEPA payment module as per new testcase.

- Implemented Referrer id, Reference parameters in all payment methods.

- Updated callback script file as per new testcase.

- Added partial refund feature for Novalnet payment methods.

Download this release

Release Info

Developer Gabriel Dixon
Extension Novalnet
Version 10.2.1
Comparing to
See all releases


Code changes from version 10.2.0 to 10.2.1

Files changed (45) hide show
  1. app/code/community/Novalnet/Payment/Block/Adminhtml/Sales/Order/Invoice/View.php +28 -31
  2. app/code/community/Novalnet/Payment/Block/Payment/Method/NovalnetRedirect.php +6 -1
  3. app/code/community/Novalnet/Payment/Helper/AssignData.php +16 -15
  4. app/code/community/Novalnet/Payment/Helper/Data.php +4 -4
  5. app/code/community/Novalnet/Payment/Model/Adminhtml/Sales/Order/Create.php +1 -1
  6. app/code/community/Novalnet/Payment/Model/Callbackscript.php +94 -56
  7. app/code/community/Novalnet/Payment/Model/Config.php +1 -0
  8. app/code/community/Novalnet/Payment/Model/Factory.php +14 -13
  9. app/code/community/Novalnet/Payment/Model/Ipn.php +9 -14
  10. app/code/community/Novalnet/Payment/Model/Novalnet/Request.php +0 -1
  11. app/code/community/Novalnet/Payment/Model/Observer.php +24 -0
  12. app/code/community/Novalnet/Payment/Model/Payment/Method/Abstract.php +40 -67
  13. app/code/community/Novalnet/Payment/Model/Recurring.php +38 -9
  14. app/code/community/Novalnet/Payment/Model/Sales/Order/Invoice.php +0 -1
  15. app/code/community/Novalnet/Payment/controllers/Adminhtml/Novalnetpayment/Sales/OrderController.php +22 -22
  16. app/code/community/Novalnet/Payment/controllers/CcController.php +22 -17
  17. app/code/community/Novalnet/Payment/controllers/GatewayController.php +74 -23
  18. app/code/community/Novalnet/Payment/etc/config.xml +10 -1
  19. app/code/community/Novalnet/Payment/etc/system.xml +9 -9
  20. app/code/community/Novalnet/Payment/sql/novalnet_setup/{mysql4-install-10.2.0.php → mysql4-install-10.2.1.php} +0 -0
  21. app/design/adminhtml/default/default/template/novalnet/payment/method/info/Invoice.phtml +3 -3
  22. app/design/adminhtml/default/default/template/novalnet/payment/method/info/Paypal.phtml +3 -0
  23. app/design/adminhtml/default/default/template/novalnet/payment/method/info/Prepayment.phtml +3 -3
  24. app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Invoice.phtml +4 -3
  25. app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Paypal.phtml +3 -0
  26. app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Prepayment.phtml +4 -3
  27. app/design/adminhtml/default/default/template/novalnet/sales/order/view/tab/info.phtml +7 -5
  28. app/design/frontend/base/default/template/novalnet/payment/method/info/Invoice.phtml +4 -5
  29. app/design/frontend/base/default/template/novalnet/payment/method/info/Paypal.phtml +3 -0
  30. app/design/frontend/base/default/template/novalnet/payment/method/info/Prepayment.phtml +4 -5
  31. app/design/frontend/base/default/template/novalnet/payment/method/pdf/Invoice.phtml +4 -3
  32. app/design/frontend/base/default/template/novalnet/payment/method/pdf/Paypal.phtml +3 -0
  33. app/design/frontend/base/default/template/novalnet/payment/method/pdf/Prepayment.phtml +4 -3
  34. app/design/frontend/default/default/template/novalnet/payment/method/info/Invoice.phtml +4 -5
  35. app/design/frontend/default/default/template/novalnet/payment/method/info/Paypal.phtml +3 -0
  36. app/design/frontend/default/default/template/novalnet/payment/method/info/Prepayment.phtml +4 -5
  37. app/design/frontend/rwd/default/template/novalnet/payment/method/form/Cciframe.phtml +1 -1
  38. app/design/frontend/rwd/default/template/novalnet/payment/method/info/Invoice.phtml +4 -5
  39. app/design/frontend/rwd/default/template/novalnet/payment/method/info/Paypal.phtml +3 -0
  40. app/design/frontend/rwd/default/template/novalnet/payment/method/info/Prepayment.phtml +4 -5
  41. app/locale/de_DE/Novalnet_Payment.csv +3 -4
  42. app/locale/en_US/Novalnet_Payment.csv +1 -2
  43. js/novalnet/novalnetJquery.js +5 -2486
  44. package.xml +12 -8
  45. skin/frontend/base/default/images/novalnet/logo.png +0 -0
app/code/community/Novalnet/Payment/Block/Adminhtml/Sales/Order/Invoice/View.php CHANGED
@@ -31,44 +31,42 @@ class Novalnet_Payment_Block_Adminhtml_Sales_Order_Invoice_View extends Mage_Adm
31
  parent::__construct();
32
  $helper = Mage::helper('novalnet_payment');
33
  $order = $this->getInvoice()->getOrder();
34
- $nominalItem = $helper->checkNominalItem($order->getAllItems());
35
- $totalPaid = $order->getTotalPaid();
36
-
37
  $payment = $order->getPayment();
38
- $orderRefundAmount = $payment->getAmountRefunded();
39
  $paymentMethod = $payment->getMethodInstance()->getCode();
40
- $orderId = $order->getIncrementId();
41
  $sorderId = $order->getId();
42
- $refundedAmount = $helper->getFormatedAmount($payment->getAmountRefunded());
43
-
44
  $amount = $helper->getAmountCollection($sorderId, 1, NULL);
45
- $callbackTrans = $helper->loadCallbackValue($orderId);
46
- $callbackValue = ($callbackTrans && $callbackTrans->getCallbackAmount())
47
- ? $callbackTrans->getCallbackAmount() : '';
48
- if (($payment->getAmountRefunded() < $amount) || ($nominalItem && $payment->getAmountRefunded() < $totalPaid)) {
49
- $this->_removeButton('print');
50
- $this->_removeButton('capture');
51
- if ($paymentMethod == Novalnet_Payment_Model_Config::NN_INVOICE && $callbackValue && $callbackValue > (string) $refundedAmount) {
52
- $this->getCreditMemoButton();
53
- }else if($paymentMethod != Novalnet_Payment_Model_Config::NN_INVOICE){
54
- $this->getCreditMemoButton();
55
- }
56
- if ($this->getInvoice()->getId()) {
57
- $this->getPrintButton();
 
 
 
 
 
 
 
 
 
58
  }
59
- } else if (preg_match("/novalnet/i", $paymentMethod) && $paymentMethod == Novalnet_Payment_Model_Config::NN_INVOICE && !$amount && $orderRefundAmount < $totalPaid) {
60
- $this->_removeButton('print');
61
- $this->_removeButton('capture');
62
 
63
- if ($callbackValue && $callbackValue > (string) $refundedAmount) {
 
 
64
  $this->getCreditMemoButton();
 
 
 
65
  }
66
- if ($this->getInvoice()->getId()) {
67
- $this->getPrintButton();
68
- }
69
- }else if($paymentMethod == Novalnet_Payment_Model_Config::NN_INVOICE && !$callbackValue){
70
- $this->_removeButton('capture');
71
- }
72
  }
73
 
74
  /**
@@ -77,7 +75,6 @@ class Novalnet_Payment_Block_Adminhtml_Sales_Order_Invoice_View extends Mage_Adm
77
  */
78
  private function getCreditMemoButton()
79
  {
80
-
81
  $this->_addButton('capture', array(// capture?
82
  'label' => Mage::helper('sales')->__('Credit Memo'),
83
  'class' => 'go',
31
  parent::__construct();
32
  $helper = Mage::helper('novalnet_payment');
33
  $order = $this->getInvoice()->getOrder();
 
 
 
34
  $payment = $order->getPayment();
 
35
  $paymentMethod = $payment->getMethodInstance()->getCode();
 
36
  $sorderId = $order->getId();
 
 
37
  $amount = $helper->getAmountCollection($sorderId, 1, NULL);
38
+ $nominalItem = $helper->checkNominalItem($order->getAllItems());
39
+ $totalPaid = $order->getTotalPaid();
40
+ $getTid = $helper->makeValidNumber($payment->getLastTransId());
41
+ $getTransactionStatus = $helper->loadTransactionStatus($getTid);
42
+
43
+ // Allow only for Novalnet payment methods
44
+ if (preg_match("/novalnet/i", $paymentMethod)
45
+ && $paymentMethod == Novalnet_Payment_Model_Config::NN_INVOICE) {
46
+ $this->_removeButton('print');
47
+ $this->_removeButton('capture');
48
+
49
+ if ($this->getInvoice()->getOrder()->canCreditmemo()) {
50
+ if (($payment->canRefundPartialPerInvoice()
51
+ && $this->getInvoice()->canRefund()
52
+ && $payment->getAmountPaid() > $payment->getAmountRefunded())
53
+ || ($payment->canRefund() && !$this->getInvoice()->getIsUsedForRefund())) {
54
+ $this->getCreditMemoButton();
55
+ }
56
+ }
57
+ if ($this->getInvoice()->getId()) {
58
+ $this->getPrintButton();
59
+ }
60
  }
 
 
 
61
 
62
+ if (($payment->getAmountRefunded() < $amount) || ($nominalItem && $payment->getAmountRefunded() < $totalPaid)) {
63
+ $this->_removeButton('print');
64
+ $this->_removeButton('capture');
65
  $this->getCreditMemoButton();
66
+ if ($this->getInvoice()->getId()) {
67
+ $this->getPrintButton();
68
+ }
69
  }
 
 
 
 
 
 
70
  }
71
 
72
  /**
75
  */
76
  private function getCreditMemoButton()
77
  {
 
78
  $this->_addButton('capture', array(// capture?
79
  'label' => Mage::helper('sales')->__('Credit Memo'),
80
  'class' => 'go',
app/code/community/Novalnet/Payment/Block/Payment/Method/NovalnetRedirect.php CHANGED
@@ -43,7 +43,10 @@ class Novalnet_Payment_Block_Payment_Method_NovalnetRedirect extends Mage_Core_B
43
  ->setMethod(Novalnet_Payment_Model_Config::NOVALNET_RETURN_METHOD)
44
  ->setUseContainer(true);
45
 
46
- $getFormData = $paymentObj->buildRequest()->getData();
 
 
 
47
  foreach ($getFormData as $field => $value) {
48
  $form->addField($field, 'hidden', array('name' => $field, 'value' => $value));
49
  }
@@ -71,6 +74,8 @@ class Novalnet_Payment_Block_Payment_Method_NovalnetRedirect extends Mage_Core_B
71
  ->setCreatedDate($helper->getCurrentDateTime())
72
  ->save();
73
 
 
 
74
  // IE & Firefox will not submit form if the form is full of hidden fileds.
75
  $form->addField('continue', 'submit', array('name' => 'Continue', 'value' => $this->__('Continue')));
76
 
43
  ->setMethod(Novalnet_Payment_Model_Config::NOVALNET_RETURN_METHOD)
44
  ->setUseContainer(true);
45
 
46
+ $checkoutSession = $helper->getCheckoutSession();
47
+ $profileId = $checkoutSession->getRecurringProfileNumber();
48
+ $getFormData = (!empty($profileId)
49
+ ? $checkoutSession->getPaymentReqData()->getData() : $paymentObj->buildRequest()->getData());
50
  foreach ($getFormData as $field => $value) {
51
  $form->addField($field, 'hidden', array('name' => $field, 'value' => $value));
52
  }
74
  ->setCreatedDate($helper->getCurrentDateTime())
75
  ->save();
76
 
77
+ $checkoutSession->unsRecurringProfileNumber(); //unset recurring profile data
78
+
79
  // IE & Firefox will not submit form if the form is full of hidden fileds.
80
  $form->addField('continue', 'submit', array('name' => 'Continue', 'value' => $this->__('Continue')));
81
 
app/code/community/Novalnet/Payment/Helper/AssignData.php CHANGED
@@ -37,7 +37,6 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
37
  */
38
  protected $_files = array(
39
  'novalnetJquery.js',
40
- 'novalnetcc.js',
41
  'novalnetsepa.js'
42
  );
43
 
@@ -83,7 +82,7 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
83
  ->setNnCallbackPinNovalnetSepa(trim($data->getCallbackPin()))
84
  ->setNnNewCallbackPinNovalnetSepa($data->getNewCallbackPin())
85
  ->setSepaDuedate($this->getModel($paymentCode)->getNovalnetConfig('sepa_due_date'))
86
- ->setCallbackPinValidationFlag(true);
87
  $this->getCheckout()->setSepaHash($this->novalnetCardDetails('result_sepa_hash'))
88
  ->setSepaUniqueId($this->novalnetCardDetails('result_mandate_unique'))
89
  ->setNnPaymentCode($paymentCode);
@@ -92,7 +91,7 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
92
  $infoInstance->setNnCallbackTelNovalnetInvoice($data->getCallbackTel())
93
  ->setNnCallbackPinNovalnetInvoice(trim($data->getCallbackPin()))
94
  ->setNnNewCallbackPinNovalnetInvoice($data->getNewCallbackPin())
95
- ->setCallbackPinValidationFlag(true);
96
  $this->getCheckout()->setNnPaymentCode($paymentCode);
97
  break;
98
  }
@@ -114,6 +113,8 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
114
  $sepaHolder = $paymentInfo['account_holder'];
115
  $sepaDueDate = $infoInstance->getSepaDuedate();
116
  $callbackVal = $this->getModel($paymentCode)->getNovalnetConfig('callback');
 
 
117
 
118
  if (strlen($sepaDueDate) > 0 && ($sepaDueDate < 7 || !$this->checkIsNumeric($sepaDueDate))) {
119
  Mage::throwException($this->__('SEPA Due date is not valid') . '!');
@@ -125,13 +126,13 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
125
  Mage::throwException($this->__('Your account details are invalid') . '!');
126
  } elseif ($this->checkCallbackAmount($paymentCode)
127
  && $callbackVal == '1' && !$infoInstance->getNnCallbackTelNovalnetSepa()
128
- && !$this->checkIsAdmin()) {
129
  Mage::throwException($this->__('Please enter your telephone number') . '!');
130
  } elseif ($this->checkCallbackAmount($paymentCode)
131
  && $callbackVal == '2' && !$infoInstance->getNnCallbackTelNovalnetSepa()
132
- && !$this->checkIsAdmin()) {
133
  Mage::throwException($this->__('Please enter your mobile number') . '!');
134
- }
135
  break;
136
  case Novalnet_Payment_Model_Config::NN_INVOICE:
137
  case Novalnet_Payment_Model_Config::NN_PREPAYMENT:
@@ -140,7 +141,7 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
140
  $paymentRefThree = $this->getModel($paymentCode)->getNovalnetConfig('payment_ref_three');
141
 
142
  if (!$paymentRefOne && !$paymentRefTwo && !$paymentRefThree) {
143
- Mage::throwException('Payment reference is missing or invalid');
144
  }
145
  break;
146
  case Novalnet_Payment_Model_Config::NN_CC:
@@ -333,11 +334,11 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
333
  $dueDate = $result->getDueDate();
334
  $note = NULL;
335
  $note .= $dueDate
336
- ? 'Due Date: <b><span id="due_date">' . Mage::helper('core')->formatDate($dueDate) . '</span></b>|NN Account Holder: <b>NOVALNET AG</b>'
337
- : 'NN Account Holder: <b>NOVALNET AG</b>';
338
- $note .= '|IBAN: <b> ' . $result->getInvoiceIban() . '</b>';
339
- $note .= '|BIC: <b>' . $result->getInvoiceBic() . '</b>';
340
- $note .= '|NN_Bank: <b>' . $result->getInvoiceBankname() . ' ' . trim($result->getInvoiceBankplace()) . '</b>';
341
  return $note;
342
  }
343
 
@@ -349,7 +350,7 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
349
  */
350
  public function getBankDetailsAmount($amount)
351
  {
352
- return 'NN_Amount: <b>' . Mage::helper('core')->currency($amount, true, false) . '</b>';
353
  }
354
 
355
 
@@ -384,12 +385,12 @@ class Novalnet_Payment_Helper_AssignData extends Novalnet_Payment_Helper_Data
384
  $i = 0;
385
  if (!empty($paymentRefOne)) {
386
  $i = ($refCount == 1) ? '' : $i + 1;
387
- $note .= "|NN_Reference$i:<b>BNR-$productId-$orderNo</b>";
388
  }
389
 
390
  if (!empty($paymentRefTwo)) {
391
  $i = ($refCount == 1) ? '' : $i + 1;
392
- $note .= "|NN_Reference$i:<b>TID $tid</b>";
393
  }
394
 
395
  if (!empty($paymentRefThree)) {
37
  */
38
  protected $_files = array(
39
  'novalnetJquery.js',
 
40
  'novalnetsepa.js'
41
  );
42
 
82
  ->setNnCallbackPinNovalnetSepa(trim($data->getCallbackPin()))
83
  ->setNnNewCallbackPinNovalnetSepa($data->getNewCallbackPin())
84
  ->setSepaDuedate($this->getModel($paymentCode)->getNovalnetConfig('sepa_due_date'))
85
+ ->setCallbackPinValidationFlag(true);
86
  $this->getCheckout()->setSepaHash($this->novalnetCardDetails('result_sepa_hash'))
87
  ->setSepaUniqueId($this->novalnetCardDetails('result_mandate_unique'))
88
  ->setNnPaymentCode($paymentCode);
91
  $infoInstance->setNnCallbackTelNovalnetInvoice($data->getCallbackTel())
92
  ->setNnCallbackPinNovalnetInvoice(trim($data->getCallbackPin()))
93
  ->setNnNewCallbackPinNovalnetInvoice($data->getNewCallbackPin())
94
+ ->setCallbackPinValidationFlag(true);
95
  $this->getCheckout()->setNnPaymentCode($paymentCode);
96
  break;
97
  }
113
  $sepaHolder = $paymentInfo['account_holder'];
114
  $sepaDueDate = $infoInstance->getSepaDuedate();
115
  $callbackVal = $this->getModel($paymentCode)->getNovalnetConfig('callback');
116
+ $infoObject = ($infoInstance->getOrder()) ? $infoInstance->getOrder() : $infoInstance->getQuote();
117
+ $countryCode = strtoupper($infoObject->getBillingAddress()->getCountryId());
118
 
119
  if (strlen($sepaDueDate) > 0 && ($sepaDueDate < 7 || !$this->checkIsNumeric($sepaDueDate))) {
120
  Mage::throwException($this->__('SEPA Due date is not valid') . '!');
126
  Mage::throwException($this->__('Your account details are invalid') . '!');
127
  } elseif ($this->checkCallbackAmount($paymentCode)
128
  && $callbackVal == '1' && !$infoInstance->getNnCallbackTelNovalnetSepa()
129
+ && $this->isCallbackTypeAllowed($countryCode)) {
130
  Mage::throwException($this->__('Please enter your telephone number') . '!');
131
  } elseif ($this->checkCallbackAmount($paymentCode)
132
  && $callbackVal == '2' && !$infoInstance->getNnCallbackTelNovalnetSepa()
133
+ && $this->isCallbackTypeAllowed($countryCode)) {
134
  Mage::throwException($this->__('Please enter your mobile number') . '!');
135
+ }
136
  break;
137
  case Novalnet_Payment_Model_Config::NN_INVOICE:
138
  case Novalnet_Payment_Model_Config::NN_PREPAYMENT:
141
  $paymentRefThree = $this->getModel($paymentCode)->getNovalnetConfig('payment_ref_three');
142
 
143
  if (!$paymentRefOne && !$paymentRefTwo && !$paymentRefThree) {
144
+ Mage::throwException($this->__('Payment reference is missing or invalid') . '!');
145
  }
146
  break;
147
  case Novalnet_Payment_Model_Config::NN_CC:
334
  $dueDate = $result->getDueDate();
335
  $note = NULL;
336
  $note .= $dueDate
337
+ ? 'Due Date: ' . Mage::helper('core')->formatDate($dueDate) . '|NN Account Holder: NOVALNET AG'
338
+ : 'NN Account Holder: NOVALNET AG';
339
+ $note .= '|IBAN: ' . $result->getInvoiceIban();
340
+ $note .= '|BIC: ' . $result->getInvoiceBic();
341
+ $note .= '|NN_Bank: ' . $result->getInvoiceBankname() . ' ' . trim($result->getInvoiceBankplace());
342
  return $note;
343
  }
344
 
350
  */
351
  public function getBankDetailsAmount($amount)
352
  {
353
+ return 'NN_Amount: ' . Mage::helper('core')->currency($amount, true, false);
354
  }
355
 
356
 
385
  $i = 0;
386
  if (!empty($paymentRefOne)) {
387
  $i = ($refCount == 1) ? '' : $i + 1;
388
+ $note .= "|NN_Reference$i:BNR-$productId-$orderNo";
389
  }
390
 
391
  if (!empty($paymentRefTwo)) {
392
  $i = ($refCount == 1) ? '' : $i + 1;
393
+ $note .= "|NN_Reference$i:TID $tid";
394
  }
395
 
396
  if (!empty($paymentRefThree)) {
app/code/community/Novalnet/Payment/Helper/Data.php CHANGED
@@ -487,10 +487,10 @@ class Novalnet_Payment_Helper_Data extends Mage_Core_Helper_Abstract
487
  $exludedGroupes = trim($userGroupId);
488
  if (strlen($exludedGroupes)) {
489
  $exludedGroupes = explode(',', $exludedGroupes);
490
- $custGrpId = $this->getCustomerSession()->getCustomerGroupId();
491
  if ($this->checkIsAdmin()) {
492
- $custGrpId = $this->getAdminCheckoutSession()->getQuote()->getCustomerId();
493
- }
494
  return !in_array($custGrpId, $exludedGroupes);
495
  }
496
  return true;
@@ -854,7 +854,7 @@ class Novalnet_Payment_Helper_Data extends Mage_Core_Helper_Abstract
854
  /**
855
  * Check the email id is valid
856
  *
857
- * @param mixed $value
858
  * @return boolean
859
  */
860
  public function validateEmail($emailId)
487
  $exludedGroupes = trim($userGroupId);
488
  if (strlen($exludedGroupes)) {
489
  $exludedGroupes = explode(',', $exludedGroupes);
490
+ $custGrpId = $this->getCustomerSession()->getCustomerGroupId();
491
  if ($this->checkIsAdmin()) {
492
+ $custGrpId = $this->getAdminCheckoutSession()->getQuote()->getCustomerId();
493
+ }
494
  return !in_array($custGrpId, $exludedGroupes);
495
  }
496
  return true;
854
  /**
855
  * Check the email id is valid
856
  *
857
+ * @param mixed $emailId
858
  * @return boolean
859
  */
860
  public function validateEmail($emailId)
app/code/community/Novalnet/Payment/Model/Adminhtml/Sales/Order/Create.php CHANGED
@@ -65,7 +65,7 @@ class Novalnet_Payment_Model_Adminhtml_Sales_Order_Create extends Mage_Adminhtml
65
  $paymentObj = $payment->getMethodInstance();
66
  $request = $this->getSession()->getPaymentReqData();
67
  $response = $paymentObj->postRequest($request);
68
- $status = $paymentObj->validateNovalnetResponse($payment, $response);
69
  $this->getSession()->unsPaymentReqData()
70
  ->unsPaymentResData();
71
  }
65
  $paymentObj = $payment->getMethodInstance();
66
  $request = $this->getSession()->getPaymentReqData();
67
  $response = $paymentObj->postRequest($request);
68
+ $paymentObj->validateNovalnetResponse($payment, $response);
69
  $this->getSession()->unsPaymentReqData()
70
  ->unsPaymentResData();
71
  }
app/code/community/Novalnet/Payment/Model/Callbackscript.php CHANGED
@@ -1,5 +1,4 @@
1
  <?php
2
-
3
  /**
4
  * Magento
5
  *
@@ -48,7 +47,7 @@ class Novalnet_Payment_Model_Callbackscript
48
  'novalnetinvoice' => array('INVOICE_START', 'INVOICE_CREDIT', 'SUBSCRIPTION_STOP'),
49
  'novalnetprepayment' => array('INVOICE_START', 'INVOICE_CREDIT', 'SUBSCRIPTION_STOP'),
50
  'novalnetideal' => array('IDEAL'),
51
- 'novalnetpaypal' => array('PAYPAL', 'PAYPAL_BOOKBACK'),
52
  'novalneteps' => array('EPS'),
53
  'novalnetgiropay' => array('GIROPAY'),
54
  'novalnetbanktransfer' => array('ONLINE_TRANSFER', 'REFUND_BY_BANK_TRANSFER_EU'),
@@ -56,7 +55,7 @@ class Novalnet_Payment_Model_Callbackscript
56
  'DEBT_COLLECTION_SEPA', 'CREDIT_ENTRY_SEPA'));
57
  $this->invoiceAllowed = array('INVOICE_CREDIT', 'INVOICE_START');
58
  $this->recurringAllowed = array('INVOICE_CREDIT', 'INVOICE_START', 'CREDITCARD',
59
- 'DIRECT_DEBIT_SEPA', 'SUBSCRIPTION_STOP');
60
 
61
  /** @Array Type of payment available - Level : 0 */
62
  $this->paymentTypes = array('INVOICE_START', 'PAYPAL', 'ONLINE_TRANSFER',
@@ -154,12 +153,6 @@ class Novalnet_Payment_Model_Callbackscript
154
  $paymentObj->_vendorId = ($getResponseData['vendor']) ? $getResponseData['vendor'] : $paymentObj->getNovalnetConfig('merchant_id', true, $storeId);
155
  $paymentObj->_authCode = ($getResponseData['auth_code']) ? $getResponseData['auth_code'] : $paymentObj->getNovalnetConfig('auth_code', true, $storeId);
156
  $paymentObj->_productId = ($getResponseData['product']) ? $getResponseData['product'] : $paymentObj->getNovalnetConfig('product_id', true, $storeId);
157
- // Get Admin Transaction status via API
158
- if ($this->recurring) {
159
- $paymentTid = $response['signup_tid'];
160
- } else {
161
- $paymentTid = (in_array($response['payment_type'], $this->chargebacks)) ? $response['tid_payment'] : (in_array($response['payment_type'], $this->invoiceAllowed)) ? $response['tid_payment'] : $response['tid'];
162
- }
163
  $checkTidExist = $payment->getLastTransId();
164
  $this->paymentTypeValidation($order);
165
  if (!empty($this->orderNo) && $order->getIncrementId() == $this->orderNo && empty($checkTidExist)) {
@@ -169,7 +162,6 @@ class Novalnet_Payment_Model_Callbackscript
169
  $order->unhold()->save();
170
  }
171
 
172
- $redirectPayment = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('redirectPayments');
173
  $serverResponseMode = $response['test_mode'];
174
  $shopMode = $paymentObj->getNovalnetConfig('live_mode', '', $storeId);
175
  $testMode = ((isset($serverResponseMode) && $serverResponseMode == 1) || (isset($shopMode) && $shopMode == 0)) ? 1 : 0;
@@ -186,22 +178,20 @@ class Novalnet_Payment_Model_Callbackscript
186
  // Payment process based on response status
187
  if ($payment->getAdditionalInformation($paymentObj->getCode() . '_successAction') != 1) {
188
  $payment->setAdditionalInformation($paymentObj->getCode() . '_successAction', 1);
189
- if ($order->canInvoice() && $this->request['status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED && in_array($this->request['tid_status'], array(100,99,98,91,90)) ) {
190
- $payment->setTransactionId($txnId) // Add capture text to make the new transaction
191
- ->setParentTransactionId(null)
192
- ->setIsTransactionClosed(true)
193
  ->setLastTransId($txnId)
194
- ->capture(null)
195
- ->save();
196
- } else {
197
- $payment->setTransactionId($txnId)
198
- ->setLastTransId($txnId)
199
- ->setParentTransactionId(null)
200
- ->save();
201
  }
 
202
  $onHoldStatus = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('paymentOnholdStaus');
203
  array_push($onHoldStatus, '100', '90');
204
  if (in_array($this->request['status'], $onHoldStatus) && in_array($this->request['tid_status'], array(100,99,98,91,90)) ) {
 
205
  $orderStatus = $this->getOrderStatus($order);
206
  $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, $orderStatus, $helper->__('Customer successfully returned from Novalnet'), true
207
  )->save();
@@ -210,6 +200,7 @@ class Novalnet_Payment_Model_Callbackscript
210
  $payment->setStatus(Mage_Sales_Model_Order::STATE_CANCELED)
211
  ->setIsTransactionClosed(true)
212
  ->save();
 
213
  $paymentObj->saveCancelledOrder($dataObj, $payment);
214
  $this->showDebug("Novalnet callback received. Transaction status not valid");
215
  }
@@ -434,7 +425,7 @@ class Novalnet_Payment_Model_Callbackscript
434
  }
435
  }
436
 
437
- if ($request['payment_type'] == 'INVOICE_CREDIT' && !empty($request['status']) && 100 != $request['status']) {
438
  $this->showDebug('Novalnet callback received. Callback Script executed already. Refer Order :' . $this->orderNo);
439
  }
440
 
@@ -513,7 +504,7 @@ class Novalnet_Payment_Model_Callbackscript
513
  $data = unserialize($payment->getAdditionalData());
514
  $currency = $this->currency;
515
  if ($this->level == 1) { //level 1 payments - Type of Chargebacks
516
- if ($request['status'] == 100 && $request['tid_status'] == 100) {
517
  // Update callback comments for Chargebacks
518
  if (in_array($this->request['payment_type'], $this->chargebacks)) {
519
  $bookBack = array('CREDITCARD_BOOKBACK', 'REFUND_BY_BANK_TRANSFER_EU', 'PAYPAL_BOOKBACK');
@@ -522,7 +513,7 @@ class Novalnet_Payment_Model_Callbackscript
522
  $script = 'Novalnet callback received. Refund/Bookback executed successfully for the TID: ' . $tId . ' amount: ' . ($request['amount'])
523
  / 100 . ' ' . $currency . " on " . date('Y-m-d H:i:s') . '. The subsequent TID: ' . $request['tid'];
524
  } else {
525
- $script = 'Novalnet Callback script received. Chargeback executed sucessfully for the TID ' . $tId . ' amount ' . ($request['amount']) / 100 . ' ' . $currency . " on " . $this->currentTime . '. The subsequent TID: ' . $request['tid'];
526
  }
527
  $this->emailBody = $script;
528
  $this->saveAdditionalInfo($payment, $data, $script, $order);
@@ -540,16 +531,17 @@ class Novalnet_Payment_Model_Callbackscript
540
 
541
  $invoice = $order->getInvoiceCollection()->getFirstItem();
542
  $paid = $invoice->getState();
543
- $subsPaymentType = array('DIRECT_DEBIT_SEPA', 'INVOICE_START');
544
  if ($this->level == 0 || $this->level == 2) {
545
  if($this->recurring && in_array($this->request['payment_type'], $subsPaymentType)) {
546
- if(!empty($request['tid_status']) && !empty($request['status']) && in_array($request['tid_status'], array('91', '98', '99', '100') )) {
547
- if (!empty($this->request['signup_tid']) && $this->request['subs_billing'] == 1 && $request['status'] == 100 ) {
548
  $recurringProfileId = $this->getProfileInformation($request);
549
  $periodMaxCycles = $recurringProfileId->getPeriodMaxCycles();
550
  $profileId = $recurringProfileId->getId();
551
  $helper = $this->_getNovalnetHelper();
552
- if (!$this->request['paid_until']) {
 
553
  $this->showDebug("Novalnet callback received. Subscription Suspended. Refer Order :" . $this->orderNo);
554
  }
555
 
@@ -565,7 +557,7 @@ class Novalnet_Payment_Model_Callbackscript
565
  $this->createOrder($order, $script, $data, $payment, $profileId);
566
  return true;
567
  } else {
568
- $request['termination_reason'] = $request['status_message'];
569
  $this->subscriptionCancel($request);
570
  return true;
571
  }
@@ -573,35 +565,36 @@ class Novalnet_Payment_Model_Callbackscript
573
  $this->showDebug("Novalnet callback received. Status is not valid.");
574
  }
575
  }
576
- if((isset($request['status']) && $request['status'] == 100) && (isset($request['tid_status']) && $request['tid_status'] == 100) ) {
577
  $saveInvoice = '';
578
  $saveInvoice = $this->saveInvoice($order, $nominalItem, $paid);
579
  if ($invoice) {
580
- if ($saveInvoice && $request['payment_type'] == 'INVOICE_CREDIT') {
581
  $order->setState($state, true, 'Novalnet callback set state ' . $state . ' for Order-ID = ' . $this->orderNo);
582
  $order->addStatusToHistory($status, 'Novalnet callback added order status ' . $status);
583
  $this->emailBody .= 'Novalnet callback set state to ' . $state . $this->lineBreak;
584
  $this->emailBody .= 'Novalnet callback set status to ' . $status . ' ... ' . $this->lineBreak;
585
  $order->save();
586
 
587
- $transMode = (version_compare($helper->getMagentoVersion(), '1.6', '<')) ? false : true;
588
  if (in_array($request['payment_type'], $this->invoiceAllowed)) {
589
  if ($nominalItem) {
590
  $tidPayment = isset($request['signup_tid']) && $request['signup_tid'] && $request['subs_billing'] ? trim($request['signup_tid']) : trim($request['tid_payment']);
591
  } else {
592
  $tidPayment = trim($request['tid']);
593
  }
594
- $payment->setTransactionId($tidPayment)
595
- ->setIsTransactionClosed($transMode);
596
- $transaction = $payment->addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, null, false);
597
- $transaction->setParentTxnId(null)
598
- ->save();
599
  $amount = $this->_getNovalnetHelper()->getFormatedAmount($request['amount'], 'RAW');
600
  $currency = $this->currency;
601
  $script = 'Novalnet Callback Script executed successfully for the TID: ' . $request['tid_payment'] . ' with amount ' . $amount . ' ' . $currency . ' on ' . $this->currentTime . '. Please refer PAID transaction in our Novalnet Merchant Administration with the TID: ' . $request['tid'];
602
  } else {
 
603
  $script = 'Novalnet Callback Script executed successfully on ' . $this->currentTime;
604
  }
 
 
 
 
 
 
605
  $this->saveAdditionalInfo($payment, $data, $script, $order);
606
  $changeAmount = $helper->getAmountCollection($order->getId(), 1, NULL);
607
  if ($changeAmount) {
@@ -672,15 +665,6 @@ class Novalnet_Payment_Model_Callbackscript
672
  ->addObject($invoice)
673
  ->addObject($invoice->getOrder())
674
  ->save();
675
- $orderStatus = $this->getOrderStatus($order);
676
- $order->setState($orderStatus, true)->save();
677
- if ($this->recurring || $nominalItem) {
678
- $profileInfo = $this->getProfileInformation($request);
679
- if ($profileInfo->getState() != 'canceled') {
680
- $profileInfo->setState('active');
681
- $profileInfo->save();
682
- }
683
- }
684
 
685
  $amount = $helper->getFormatedAmount($request['amount'], 'RAW');
686
  if (in_array($request['payment_type'], $this->invoiceAllowed)) {
@@ -758,6 +742,23 @@ class Novalnet_Payment_Model_Callbackscript
758
  }
759
  }
760
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
761
  /**
762
  * Get the payment method code from order
763
  *
@@ -865,7 +866,7 @@ class Novalnet_Payment_Model_Callbackscript
865
  {
866
  $helper = $this->_getNovalnetHelper();
867
  $script = 'Novalnet Callback script received. Subscription has been stopped for the TID:' . $request['signup_tid'] . " on " . $this->currentTime;
868
- $script .= '<br>Reason for Cancellation: ' . $request['termination_reason'];
869
  $this->emailBody = $script;
870
  $recurringProfileId = $this->getProfileInformation($request);
871
  $orderNumber = $helper->getModelRecurring()->getRecurringOrderNo($recurringProfileId);
@@ -949,13 +950,13 @@ class Novalnet_Payment_Model_Callbackscript
949
  $redirectPayment = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('redirectPayments');
950
  array_push($redirectPayment, Novalnet_Payment_Model_Config::NN_PREPAYMENT, Novalnet_Payment_Model_Config::NN_INVOICE, Novalnet_Payment_Model_Config::NN_CC);
951
 
952
- $status = $paymentObj->getNovalnetConfig('order_status', '', $storeId);
953
  if ($paymentObj->getCode() && in_array($paymentObj->getCode(), $redirectPayment)) {
954
- $status = $paymentObj->getNovalnetConfig('order_status_after_payment', '', $storeId);
955
  }
956
 
957
- if ($paymentObj->getCode() && $paymentObj->getCode() == Novalnet_Payment_Model_Config::NN_PAYPAL && ($this->request['status'] == Novalnet_Payment_Model_Config::PAYPAL_PENDING_CODE)) {
958
- $status = $paymentObj->getNovalnetConfig('order_status', '', $storeId) ? $paymentObj->getNovalnetConfig('order_status', '', $storeId) : Mage_Sales_Model_Order::STATE_PENDING_PAYMENT;
959
  }
960
 
961
  if (!$status) {
@@ -1110,14 +1111,13 @@ class Novalnet_Payment_Model_Callbackscript
1110
  if ($this->recurring || $nominalItem) {
1111
  $profileInfo = $this->getProfileInformation($request);
1112
  $billingAmount = $profileInfo->getBillingAmount();
1113
- $initialAmount = $profileInfo->getInitAmount();
1114
  }
1115
 
1116
  $changeAmount = $this->_getNovalnetHelper()->getAmountCollection($order->getId(), 1, NULL);
1117
  if ($changeAmount) {
1118
  $amountvalue = $changeAmount;
1119
- } elseif (($this->recurring || $nominalItem) && ($initialAmount && $billingAmount)) {
1120
- $amountvalue = round(($initialAmount + $billingAmount + $profileInfo->getShippingAmount()
1121
  + $profileInfo->getTaxAmount()), 2);
1122
  } else {
1123
  $amountvalue = $order->getGrandTotal();
@@ -1191,6 +1191,10 @@ class Novalnet_Payment_Model_Callbackscript
1191
  $request = $this->request;
1192
  $orgTid = $this->requestTid($request);
1193
 
 
 
 
 
1194
  $tablePrefix = Mage::getConfig()->getTablePrefix();
1195
  if (in_array($request['payment_type'], $this->chargebacks)) {
1196
  $orderPayment = $tablePrefix . 'sales_payment_transaction';
@@ -1276,14 +1280,17 @@ class Novalnet_Payment_Model_Callbackscript
1276
  $orderNew = $this->setOrderItemsDetails($order, $orderNew);
1277
  $payment = $orderNew->getPayment();
1278
  $paymentObj = $payment->getMethodInstance();
1279
- $setOrderAfterStatus = $paymentObj->getConfigData('order_status', $storeId);
 
 
 
1280
  $setOrderAfterStatus = $setOrderAfterStatus ? $setOrderAfterStatus : Mage_Sales_Model_Order::STATE_PROCESSING;
1281
  $orderNew->addStatusToHistory($setOrderAfterStatus, $helper->__('Novalnet Recurring Callback script Executed Successfully'), false);
1282
  $tid = trim($this->request['tid']);
1283
  $orderNew->save();
1284
  $newOrderId = $orderNew->getId();
1285
  $parentOrderNo = $this->getOrderIdByTransId() ? $this->getOrderIdByTransId() : $orderNew->getIncrementId();
1286
- $script .= $comments = ' Recurring Payment for order id : ' . $parentOrderNo . '<br>';
1287
  $next_charging_date = isset($this->request['next_subs_cycle']) ? $this->request['next_subs_cycle'] : $this->request['paid_until'] ;
1288
  $script .= $nextDate = !$this->endTime ? '<br>Next charging date is: ' . $next_charging_date . '<br>' : '';
1289
  $this->emailBody = $script;
@@ -1583,4 +1590,35 @@ class Novalnet_Payment_Model_Callbackscript
1583
  }
1584
  }
1585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1586
  }
1
  <?php
 
2
  /**
3
  * Magento
4
  *
47
  'novalnetinvoice' => array('INVOICE_START', 'INVOICE_CREDIT', 'SUBSCRIPTION_STOP'),
48
  'novalnetprepayment' => array('INVOICE_START', 'INVOICE_CREDIT', 'SUBSCRIPTION_STOP'),
49
  'novalnetideal' => array('IDEAL'),
50
+ 'novalnetpaypal' => array('PAYPAL', 'PAYPAL_BOOKBACK', 'SUBSCRIPTION_STOP'),
51
  'novalneteps' => array('EPS'),
52
  'novalnetgiropay' => array('GIROPAY'),
53
  'novalnetbanktransfer' => array('ONLINE_TRANSFER', 'REFUND_BY_BANK_TRANSFER_EU'),
55
  'DEBT_COLLECTION_SEPA', 'CREDIT_ENTRY_SEPA'));
56
  $this->invoiceAllowed = array('INVOICE_CREDIT', 'INVOICE_START');
57
  $this->recurringAllowed = array('INVOICE_CREDIT', 'INVOICE_START', 'CREDITCARD',
58
+ 'DIRECT_DEBIT_SEPA', 'SUBSCRIPTION_STOP', 'PAYPAL');
59
 
60
  /** @Array Type of payment available - Level : 0 */
61
  $this->paymentTypes = array('INVOICE_START', 'PAYPAL', 'ONLINE_TRANSFER',
153
  $paymentObj->_vendorId = ($getResponseData['vendor']) ? $getResponseData['vendor'] : $paymentObj->getNovalnetConfig('merchant_id', true, $storeId);
154
  $paymentObj->_authCode = ($getResponseData['auth_code']) ? $getResponseData['auth_code'] : $paymentObj->getNovalnetConfig('auth_code', true, $storeId);
155
  $paymentObj->_productId = ($getResponseData['product']) ? $getResponseData['product'] : $paymentObj->getNovalnetConfig('product_id', true, $storeId);
 
 
 
 
 
 
156
  $checkTidExist = $payment->getLastTransId();
157
  $this->paymentTypeValidation($order);
158
  if (!empty($this->orderNo) && $order->getIncrementId() == $this->orderNo && empty($checkTidExist)) {
162
  $order->unhold()->save();
163
  }
164
 
 
165
  $serverResponseMode = $response['test_mode'];
166
  $shopMode = $paymentObj->getNovalnetConfig('live_mode', '', $storeId);
167
  $testMode = ((isset($serverResponseMode) && $serverResponseMode == 1) || (isset($shopMode) && $shopMode == 0)) ? 1 : 0;
178
  // Payment process based on response status
179
  if ($payment->getAdditionalInformation($paymentObj->getCode() . '_successAction') != 1) {
180
  $payment->setAdditionalInformation($paymentObj->getCode() . '_successAction', 1);
181
+ $payment->setTransactionId($txnId)
 
 
 
182
  ->setLastTransId($txnId)
183
+ ->setParentTransactionId(null);
184
+ if ($order->canInvoice()
185
+ && $this->request['status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED
186
+ && $this->request['tid_status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED ) {
187
+ $payment->setIsTransactionClosed(true)
188
+ ->capture(null);
 
189
  }
190
+ $payment->save();
191
  $onHoldStatus = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('paymentOnholdStaus');
192
  array_push($onHoldStatus, '100', '90');
193
  if (in_array($this->request['status'], $onHoldStatus) && in_array($this->request['tid_status'], array(100,99,98,91,90)) ) {
194
+ $this->callbackRegisterRecurring($payment, 'Success');
195
  $orderStatus = $this->getOrderStatus($order);
196
  $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, $orderStatus, $helper->__('Customer successfully returned from Novalnet'), true
197
  )->save();
200
  $payment->setStatus(Mage_Sales_Model_Order::STATE_CANCELED)
201
  ->setIsTransactionClosed(true)
202
  ->save();
203
+ $this->callbackRegisterRecurring($payment);
204
  $paymentObj->saveCancelledOrder($dataObj, $payment);
205
  $this->showDebug("Novalnet callback received. Transaction status not valid");
206
  }
425
  }
426
  }
427
 
428
+ if ($request['payment_type'] == 'INVOICE_CREDIT' && !empty($request['status']) && Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED != $request['status']) {
429
  $this->showDebug('Novalnet callback received. Callback Script executed already. Refer Order :' . $this->orderNo);
430
  }
431
 
504
  $data = unserialize($payment->getAdditionalData());
505
  $currency = $this->currency;
506
  if ($this->level == 1) { //level 1 payments - Type of Chargebacks
507
+ if ($request['status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED && $request['tid_status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
508
  // Update callback comments for Chargebacks
509
  if (in_array($this->request['payment_type'], $this->chargebacks)) {
510
  $bookBack = array('CREDITCARD_BOOKBACK', 'REFUND_BY_BANK_TRANSFER_EU', 'PAYPAL_BOOKBACK');
513
  $script = 'Novalnet callback received. Refund/Bookback executed successfully for the TID: ' . $tId . ' amount: ' . ($request['amount'])
514
  / 100 . ' ' . $currency . " on " . date('Y-m-d H:i:s') . '. The subsequent TID: ' . $request['tid'];
515
  } else {
516
+ $script = 'Novalnet callback received. Chargeback executed successfully for the TID ' . $tId . ' amount ' . ($request['amount']) / 100 . ' ' . $currency . " on " . $this->currentTime . '. The subsequent TID: ' . $request['tid'];
517
  }
518
  $this->emailBody = $script;
519
  $this->saveAdditionalInfo($payment, $data, $script, $order);
531
 
532
  $invoice = $order->getInvoiceCollection()->getFirstItem();
533
  $paid = $invoice->getState();
534
+ $subsPaymentType = array('DIRECT_DEBIT_SEPA', 'INVOICE_START', 'CREDITCARD', 'PAYPAL');
535
  if ($this->level == 0 || $this->level == 2) {
536
  if($this->recurring && in_array($this->request['payment_type'], $subsPaymentType)) {
537
+ if(!empty($request['tid_status']) && !empty($request['status']) && in_array($request['tid_status'], array(90, 91, 98, 99, 100) )) {
538
+ if (!empty($this->request['signup_tid']) && $request['status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED ) {
539
  $recurringProfileId = $this->getProfileInformation($request);
540
  $periodMaxCycles = $recurringProfileId->getPeriodMaxCycles();
541
  $profileId = $recurringProfileId->getId();
542
  $helper = $this->_getNovalnetHelper();
543
+ $next_charging_date = isset($this->request['next_subs_cycle']) ? $this->request['next_subs_cycle'] : $this->request['paid_until'] ;
544
+ if (!$next_charging_date) {
545
  $this->showDebug("Novalnet callback received. Subscription Suspended. Refer Order :" . $this->orderNo);
546
  }
547
 
557
  $this->createOrder($order, $script, $data, $payment, $profileId);
558
  return true;
559
  } else {
560
+ $request['termination_reason'] = (!empty($request['status_text']) ? $request['status_text'] : (!empty($request['status_message']) ? $request['status_message'] : $request['status_desc']));
561
  $this->subscriptionCancel($request);
562
  return true;
563
  }
565
  $this->showDebug("Novalnet callback received. Status is not valid.");
566
  }
567
  }
568
+ if((isset($request['status']) && $request['status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) && (isset($request['tid_status']) && $request['tid_status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) ) {
569
  $saveInvoice = '';
570
  $saveInvoice = $this->saveInvoice($order, $nominalItem, $paid);
571
  if ($invoice) {
572
+ if ($saveInvoice && in_array($request['payment_type'], array('INVOICE_CREDIT', 'PAYPAL'))) {
573
  $order->setState($state, true, 'Novalnet callback set state ' . $state . ' for Order-ID = ' . $this->orderNo);
574
  $order->addStatusToHistory($status, 'Novalnet callback added order status ' . $status);
575
  $this->emailBody .= 'Novalnet callback set state to ' . $state . $this->lineBreak;
576
  $this->emailBody .= 'Novalnet callback set status to ' . $status . ' ... ' . $this->lineBreak;
577
  $order->save();
578
 
 
579
  if (in_array($request['payment_type'], $this->invoiceAllowed)) {
580
  if ($nominalItem) {
581
  $tidPayment = isset($request['signup_tid']) && $request['signup_tid'] && $request['subs_billing'] ? trim($request['signup_tid']) : trim($request['tid_payment']);
582
  } else {
583
  $tidPayment = trim($request['tid']);
584
  }
 
 
 
 
 
585
  $amount = $this->_getNovalnetHelper()->getFormatedAmount($request['amount'], 'RAW');
586
  $currency = $this->currency;
587
  $script = 'Novalnet Callback Script executed successfully for the TID: ' . $request['tid_payment'] . ' with amount ' . $amount . ' ' . $currency . ' on ' . $this->currentTime . '. Please refer PAID transaction in our Novalnet Merchant Administration with the TID: ' . $request['tid'];
588
  } else {
589
+ $tidPayment = trim($request['tid']);
590
  $script = 'Novalnet Callback Script executed successfully on ' . $this->currentTime;
591
  }
592
+ $transMode = (version_compare($helper->getMagentoVersion(), '1.6', '<')) ? false : true;
593
+ $payment->setTransactionId($tidPayment)
594
+ ->setIsTransactionClosed($transMode);
595
+ $transaction = $payment->addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, null, false);
596
+ $transaction->setParentTxnId(null)
597
+ ->save();
598
  $this->saveAdditionalInfo($payment, $data, $script, $order);
599
  $changeAmount = $helper->getAmountCollection($order->getId(), 1, NULL);
600
  if ($changeAmount) {
665
  ->addObject($invoice)
666
  ->addObject($invoice->getOrder())
667
  ->save();
 
 
 
 
 
 
 
 
 
668
 
669
  $amount = $helper->getFormatedAmount($request['amount'], 'RAW');
670
  if (in_array($request['payment_type'], $this->invoiceAllowed)) {
742
  }
743
  }
744
 
745
+ /**
746
+ * Save order status invoice payment
747
+ *
748
+ * @param none
749
+ * @return none
750
+ */
751
+ private function _updateOrderStatus($order)
752
+ {
753
+ $orderStatus = $this->getOrderStatus($order); // Get order status
754
+ $state = Mage_Sales_Model_Order::STATE_PROCESSING;
755
+ $order->setState($state, true, 'Novalnet callback set state ' . $state . ' for Order-ID = ' . $this->orderNo);
756
+ $order->addStatusToHistory($orderStatus, 'Novalnet callback added order status ' . $orderStatus);
757
+ $this->emailBody .= 'Novalnet callback set state to ' . $state . $this->lineBreak;
758
+ $this->emailBody .= 'Novalnet callback set status to ' . $orderStatus . ' ... ' . $this->lineBreak;
759
+ $order->save();
760
+ }
761
+
762
  /**
763
  * Get the payment method code from order
764
  *
866
  {
867
  $helper = $this->_getNovalnetHelper();
868
  $script = 'Novalnet Callback script received. Subscription has been stopped for the TID:' . $request['signup_tid'] . " on " . $this->currentTime;
869
+ $script .= '<br>Subscription has been canceled due to: ' . $request['termination_reason'];
870
  $this->emailBody = $script;
871
  $recurringProfileId = $this->getProfileInformation($request);
872
  $orderNumber = $helper->getModelRecurring()->getRecurringOrderNo($recurringProfileId);
950
  $redirectPayment = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('redirectPayments');
951
  array_push($redirectPayment, Novalnet_Payment_Model_Config::NN_PREPAYMENT, Novalnet_Payment_Model_Config::NN_INVOICE, Novalnet_Payment_Model_Config::NN_CC);
952
 
953
+ $status = $paymentObj->getConfigData('order_status', '', $storeId);
954
  if ($paymentObj->getCode() && in_array($paymentObj->getCode(), $redirectPayment)) {
955
+ $status = $paymentObj->getConfigData('order_status_after_payment', '', $storeId);
956
  }
957
 
958
+ if ($paymentObj->getCode() && $paymentObj->getCode() == Novalnet_Payment_Model_Config::NN_PAYPAL && ($this->request['tid_status'] == Novalnet_Payment_Model_Config::PAYPAL_PENDING_CODE)) {
959
+ $status = $paymentObj->getConfigData('order_status', '', $storeId) ? $paymentObj->getConfigData('order_status', '', $storeId) : Mage_Sales_Model_Order::STATE_PENDING_PAYMENT;
960
  }
961
 
962
  if (!$status) {
1111
  if ($this->recurring || $nominalItem) {
1112
  $profileInfo = $this->getProfileInformation($request);
1113
  $billingAmount = $profileInfo->getBillingAmount();
 
1114
  }
1115
 
1116
  $changeAmount = $this->_getNovalnetHelper()->getAmountCollection($order->getId(), 1, NULL);
1117
  if ($changeAmount) {
1118
  $amountvalue = $changeAmount;
1119
+ } elseif (($this->recurring || $nominalItem) && ($billingAmount)) {
1120
+ $amountvalue = round(($billingAmount + $profileInfo->getShippingAmount()
1121
  + $profileInfo->getTaxAmount()), 2);
1122
  } else {
1123
  $amountvalue = $order->getGrandTotal();
1191
  $request = $this->request;
1192
  $orgTid = $this->requestTid($request);
1193
 
1194
+ if(empty($orgTid)) { // Check whether the original/parent transaction id exists
1195
+ return false;
1196
+ }
1197
+
1198
  $tablePrefix = Mage::getConfig()->getTablePrefix();
1199
  if (in_array($request['payment_type'], $this->chargebacks)) {
1200
  $orderPayment = $tablePrefix . 'sales_payment_transaction';
1280
  $orderNew = $this->setOrderItemsDetails($order, $orderNew);
1281
  $payment = $orderNew->getPayment();
1282
  $paymentObj = $payment->getMethodInstance();
1283
+ $setOrderAfterStatus = ($this->request['tid_status'] == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED
1284
+ && !in_array($this->request['payment_type'], $this->invoiceAllowed))
1285
+ ? $paymentObj->getConfigData('order_status_after_payment', $storeId)
1286
+ : $paymentObj->getConfigData('order_status', $storeId);
1287
  $setOrderAfterStatus = $setOrderAfterStatus ? $setOrderAfterStatus : Mage_Sales_Model_Order::STATE_PROCESSING;
1288
  $orderNew->addStatusToHistory($setOrderAfterStatus, $helper->__('Novalnet Recurring Callback script Executed Successfully'), false);
1289
  $tid = trim($this->request['tid']);
1290
  $orderNew->save();
1291
  $newOrderId = $orderNew->getId();
1292
  $parentOrderNo = $this->getOrderIdByTransId() ? $this->getOrderIdByTransId() : $orderNew->getIncrementId();
1293
+ $script .= $comments = ' Reference Order No : ' . $parentOrderNo . '<br>';
1294
  $next_charging_date = isset($this->request['next_subs_cycle']) ? $this->request['next_subs_cycle'] : $this->request['paid_until'] ;
1295
  $script .= $nextDate = !$this->endTime ? '<br>Next charging date is: ' . $next_charging_date . '<br>' : '';
1296
  $this->emailBody = $script;
1590
  }
1591
  }
1592
 
1593
+ /**
1594
+ * Register recurring profile data
1595
+ *
1596
+ * @param varien_object $payment
1597
+ * @param string $status
1598
+ */
1599
+ public function callbackRegisterRecurring($payment, $status = NULL)
1600
+ {
1601
+ $response = $this->request;
1602
+ $additionalData = unserialize($payment->getAdditionalData());
1603
+ $profileId = (!empty($response['profile_id']) ? $response['profile_id']
1604
+ : ((!empty($response['input5']) && $response['input5'] == 'profile_id') ? $response['inputval5'] : ''));
1605
+ if($profileId) {
1606
+ $profile = Mage::getModel('sales/recurring_profile')
1607
+ ->load($profileId, 'profile_id');
1608
+ if ($status == 'Success') {
1609
+ $profile->setState(Mage_Sales_Model_Recurring_Profile::STATE_ACTIVE);
1610
+ $data['paidUntil'] = !empty($response['next_subs_cycle']) ? $response['next_subs_cycle'] : $response['paid_until'];
1611
+ $data = $additionalData ? array_merge($additionalData, $data) : $data;
1612
+ $payment->setPreparedMessage($response['status'])
1613
+ ->setAdditionalInformation('subs_id', $response['subs_id'])
1614
+ ->setAdditionalData(serialize($data))
1615
+ ->save();
1616
+ } else {
1617
+ $profile->setState(Mage_Sales_Model_Recurring_Profile::STATE_CANCELED);
1618
+ }
1619
+ $profile->setReferenceId($response['tid'])
1620
+ ->save();
1621
+ }
1622
+ }
1623
+
1624
  }
app/code/community/Novalnet/Payment/Model/Config.php CHANGED
@@ -80,6 +80,7 @@ class Novalnet_Payment_Model_Config
80
  protected $_novalnetHashParams = array('auth_code', 'product', 'tariff', 'amount',
81
  'test_mode', 'uniqid');
82
  protected $_fraudCheckPayment = array('novalnetInvoice', 'novalnetSepa');
 
83
 
84
  /* ******************************************** */
85
  /* NOVALNET CC PARAMS */
80
  protected $_novalnetHashParams = array('auth_code', 'product', 'tariff', 'amount',
81
  'test_mode', 'uniqid');
82
  protected $_fraudCheckPayment = array('novalnetInvoice', 'novalnetSepa');
83
+ protected $_subscriptionRedirectPayments = array('novalnetCc', 'novalnetPaypal');
84
 
85
  /* ******************************************** */
86
  /* NOVALNET CC PARAMS */
app/code/community/Novalnet/Payment/Model/Factory.php CHANGED
@@ -76,11 +76,11 @@ class Novalnet_Payment_Model_Factory
76
  */
77
  public function getTransactionData($getTid, $payment, $amountAfterRefund, $call, $refundTid
78
  = NULL, $customerId = NULL, $response = NULL)
79
- {
80
  $helper = Mage::helper('novalnet_payment');
81
- $paymentObj = $payment->getMethodInstance();
82
- $amount = $helper->getFormatedAmount($response->getAmount(), 'RAW');
83
- if ($call == 1) {
84
  $loadTransaction = $helper->loadTransactionStatus($getTid);
85
  $loadTransaction->setTransactionStatus($response->getTidStatus())
86
  ->setAmount($amount)
@@ -90,14 +90,14 @@ class Novalnet_Payment_Model_Factory
90
  $loadTransaction->setAmount($amountAfterRefund)
91
  ->save();
92
  }
93
- } else {
94
  if ($refundTid) { // Only log the novalnet transaction which contains TID
95
  $response->setStatus($response->getTidStatus());
96
  $paymentObj->logNovalnetStatusData($response, $refundTid, $customerId, NULL, $response->getAmount());
97
  }
98
- }
99
  return $response;
100
-
101
  }
102
 
103
  /**
@@ -128,7 +128,7 @@ class Novalnet_Payment_Model_Factory
128
  ->save();
129
  }
130
  }
131
-
132
  /**
133
  * Set RequestParams Form
134
  *
@@ -143,13 +143,14 @@ class Novalnet_Payment_Model_Factory
143
  $helper = Mage::helper('novalnet_payment');
144
  $billing = $infoObject->getBillingAddress();
145
  $shipping = $infoObject->getShippingAddress();
146
- if (!$infoObject->getIsVirtual())
147
- $company = $billing->getCompany() ? $billing->getCompany() : ($shipping->getCompany() ? $shipping->getCompany() : '');
 
148
  $email = $billing->getEmail() ? $billing->getEmail() : $infoObject->getCustomerEmail();
149
  $request = $company ? $request->setCompany($company) : $request;
150
  $vendorScriptUrlConfig = Mage::getStoreConfig('novalnet_global/novalnetsetting/vendor_script_url');
151
- $vendorScriptUrl = $vendorScriptUrlConfig ? $vendorScriptUrlConfig :
152
- Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB).'callback_novalnet2magento.php';
153
  $request->setTestMode($livemode)
154
  ->setAmount($amount)
155
  ->setCurrency($infoObject->getBaseCurrencyCode())
@@ -176,7 +177,7 @@ class Novalnet_Payment_Model_Factory
176
  ->setSystemVersion($helper->getMagentoVersion() . '-' . $helper->getNovalnetVersion())
177
  ->setNotifyUrl($vendorScriptUrl)
178
  ->setInput1('order_id')
179
- ->setInputval1($orderId);
180
  }
181
 
182
  /**
76
  */
77
  public function getTransactionData($getTid, $payment, $amountAfterRefund, $call, $refundTid
78
  = NULL, $customerId = NULL, $response = NULL)
79
+ {
80
  $helper = Mage::helper('novalnet_payment');
81
+ $paymentObj = $payment->getMethodInstance();
82
+ $amount = $helper->getFormatedAmount($response->getAmount(), 'RAW');
83
+ if ($call == 1) {
84
  $loadTransaction = $helper->loadTransactionStatus($getTid);
85
  $loadTransaction->setTransactionStatus($response->getTidStatus())
86
  ->setAmount($amount)
90
  $loadTransaction->setAmount($amountAfterRefund)
91
  ->save();
92
  }
93
+ } else {
94
  if ($refundTid) { // Only log the novalnet transaction which contains TID
95
  $response->setStatus($response->getTidStatus());
96
  $paymentObj->logNovalnetStatusData($response, $refundTid, $customerId, NULL, $response->getAmount());
97
  }
98
+ }
99
  return $response;
100
+
101
  }
102
 
103
  /**
128
  ->save();
129
  }
130
  }
131
+
132
  /**
133
  * Set RequestParams Form
134
  *
143
  $helper = Mage::helper('novalnet_payment');
144
  $billing = $infoObject->getBillingAddress();
145
  $shipping = $infoObject->getShippingAddress();
146
+ if (!$infoObject->getIsVirtual()) {
147
+ $company = $billing->getCompany() ? $billing->getCompany() : ($shipping->getCompany() ? $shipping->getCompany() : '');
148
+ }
149
  $email = $billing->getEmail() ? $billing->getEmail() : $infoObject->getCustomerEmail();
150
  $request = $company ? $request->setCompany($company) : $request;
151
  $vendorScriptUrlConfig = Mage::getStoreConfig('novalnet_global/novalnetsetting/vendor_script_url');
152
+ $vendorScriptUrl = $vendorScriptUrlConfig ? $vendorScriptUrlConfig :
153
+ Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB).'callback_novalnet2magento.php';
154
  $request->setTestMode($livemode)
155
  ->setAmount($amount)
156
  ->setCurrency($infoObject->getBaseCurrencyCode())
177
  ->setSystemVersion($helper->getMagentoVersion() . '-' . $helper->getNovalnetVersion())
178
  ->setNotifyUrl($vendorScriptUrl)
179
  ->setInput1('order_id')
180
+ ->setInputval1($orderId);
181
  }
182
 
183
  /**
app/code/community/Novalnet/Payment/Model/Ipn.php CHANGED
@@ -284,7 +284,6 @@ class Novalnet_Payment_Model_Ipn
284
  {
285
  $tid = $this->getRequestData('tid');
286
  $product = $this->getRequestData('product');
287
- $paidAmount = $this->getRequestData('amount');
288
  $recurringProfile = $this->_recurringProfile;
289
 
290
  $billlingAmount = $recurringProfile->getBillingAmount();
@@ -303,7 +302,7 @@ class Novalnet_Payment_Model_Ipn
303
 
304
  $order = $recurringProfile->createOrder($productItemInfo);
305
  $this->_order = $order;
306
- $payment = $order->getPayment();
307
  $order->save();
308
  $payment->setAdditionalData($this->getRequestData('additional_data'))
309
  ->save();
@@ -318,23 +317,19 @@ class Novalnet_Payment_Model_Ipn
318
  $payment->setIsTransactionPending(true);
319
  }
320
 
321
- $reslutStatus = $resultdata->getStatus();
322
  $recurringProfile->addOrderRelation($order->getId());
323
- $this->_helper->getCoresession()->setStatusCode($reslutStatus);
324
- $closed = $reslutStatus == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED
325
  ? 1 : 0;
326
  $payment->setTransactionId($tid)
327
  ->setPreparedMessage($this->_createIpnComment(''))
328
  ->setAdditionalInformation('subs_id', $subsId)
329
- ->setIsTransactionClosed($closed);
330
- $resultdata->setAmount($order->getGrandTotal());
331
  $paymentObj->logNovalnetStatusData($resultdata, trim($tid));
332
  $paymentObj->logNovalnetTransactionData($requestdata, $resultdata, trim($tid), $this->_helper->getCustomerId(), $this->_helper->getMagentoStoreId());
333
  $payment->registerCaptureNotification($originalPrice, 0);
334
- if ($reslutStatus == 100 && $paymentMethod != Novalnet_Payment_Model_Config::NN_PREPAYMENT) {
335
- $order->setTotalPaid($paidAmount);
336
- $order->setBaseTotalPaid($paidAmount);
337
- }
338
 
339
  $order->save();
340
 
@@ -363,8 +358,8 @@ class Novalnet_Payment_Model_Ipn
363
  // notify customer
364
  $subscriptionPayments = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('subscriptionPayments');
365
 
366
- if (($reslutStatus != 100 && in_array($paymentMethod, $subscriptionPayments))
367
- || ($reslutStatus == 100 && $paymentMethod == Novalnet_Payment_Model_Config::NN_PREPAYMENT)) {
368
  if (!$order->getEmailSent() && $order->getId()) {
369
  $order->sendNewOrderEmail()
370
  ->setEmailSent(true)
@@ -372,7 +367,7 @@ class Novalnet_Payment_Model_Ipn
372
  }
373
  } else if ($invoice = $payment->getCreatedInvoice()) {
374
  $message = $this->_helper->__('Notified customer about invoice #%s.', $invoice->getIncrementId());
375
- $comment = $order->sendNewOrderEmail()->addStatusHistoryComment($message)
376
  ->setIsCustomerNotified(true)
377
  ->save();
378
  }
284
  {
285
  $tid = $this->getRequestData('tid');
286
  $product = $this->getRequestData('product');
 
287
  $recurringProfile = $this->_recurringProfile;
288
 
289
  $billlingAmount = $recurringProfile->getBillingAmount();
302
 
303
  $order = $recurringProfile->createOrder($productItemInfo);
304
  $this->_order = $order;
305
+ $payment = $order->getPayment();
306
  $order->save();
307
  $payment->setAdditionalData($this->getRequestData('additional_data'))
308
  ->save();
317
  $payment->setIsTransactionPending(true);
318
  }
319
 
320
+ $resultStatus = $resultdata->getStatus();
321
  $recurringProfile->addOrderRelation($order->getId());
322
+ $this->_helper->getCoresession()->setStatusCode($resultStatus);
323
+ $closed = $resultStatus == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED
324
  ? 1 : 0;
325
  $payment->setTransactionId($tid)
326
  ->setPreparedMessage($this->_createIpnComment(''))
327
  ->setAdditionalInformation('subs_id', $subsId)
328
+ ->setIsTransactionClosed($closed);
329
+ $resultdata->setAmount($order->getGrandTotal());
330
  $paymentObj->logNovalnetStatusData($resultdata, trim($tid));
331
  $paymentObj->logNovalnetTransactionData($requestdata, $resultdata, trim($tid), $this->_helper->getCustomerId(), $this->_helper->getMagentoStoreId());
332
  $payment->registerCaptureNotification($originalPrice, 0);
 
 
 
 
333
 
334
  $order->save();
335
 
358
  // notify customer
359
  $subscriptionPayments = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('subscriptionPayments');
360
 
361
+ if (($resultStatus != 100 && in_array($paymentMethod, $subscriptionPayments))
362
+ || ($resultStatus == 100 && $paymentMethod == Novalnet_Payment_Model_Config::NN_PREPAYMENT)) {
363
  if (!$order->getEmailSent() && $order->getId()) {
364
  $order->sendNewOrderEmail()
365
  ->setEmailSent(true)
367
  }
368
  } else if ($invoice = $payment->getCreatedInvoice()) {
369
  $message = $this->_helper->__('Notified customer about invoice #%s.', $invoice->getIncrementId());
370
+ $order->sendNewOrderEmail()->addStatusHistoryComment($message)
371
  ->setIsCustomerNotified(true)
372
  ->save();
373
  }
app/code/community/Novalnet/Payment/Model/Novalnet/Request.php CHANGED
@@ -28,7 +28,6 @@ class Novalnet_Payment_Model_Novalnet_Request extends Varien_Object
28
  public function toLatin1()
29
  {
30
  $data = $this->toArray();
31
- mage::log($data, null, 'test.log', true);
32
  foreach ($data as $key => $val) {
33
  $setKey = "set" . ucfirst($key);
34
  $this->$setKey(utf8_decode($val));
28
  public function toLatin1()
29
  {
30
  $data = $this->toArray();
 
31
  foreach ($data as $key => $val) {
32
  $setKey = "set" . ucfirst($key);
33
  $this->$setKey(utf8_decode($val));
app/code/community/Novalnet/Payment/Model/Observer.php CHANGED
@@ -148,4 +148,28 @@ class Novalnet_Payment_Model_Observer
148
  }
149
  }
150
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  }
148
  }
149
  }
150
  }
151
+
152
+ /**
153
+ * Update redirect url for paypal recurring product
154
+ *
155
+ * @param null
156
+ * @return null
157
+ */
158
+ public function updateRecurringUrl(Varien_Event_Observer $observer)
159
+ {
160
+ $quote = $observer->getEvent()->getQuote();
161
+ $paymentCode = $quote->getPayment()->getMethodInstance()->getCode();
162
+ $helper = Mage::helper('novalnet_payment');
163
+ $profile = Mage::getSingleton('checkout/session')->getLastRecurringProfileIds();
164
+ $recurringProfile = (!empty($profile)) ? array_filter($profile) : '';
165
+ $subRedirectPayments = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('subscriptionRedirectPayments');
166
+ if(!empty($recurringProfile) && in_array($paymentCode, $subRedirectPayments)) {
167
+ $orderId = $helper->getCheckoutSession()->getRecurringOrderId();
168
+ $actionUrl = ($paymentCode == Novalnet_Payment_Model_Config::NN_CC)
169
+ ? $helper->getUrl(Novalnet_Payment_Model_Config::CC_IFRAME_URL)
170
+ : $helper->getUrl(Novalnet_Payment_Model_Config::GATEWAY_REDIRECT_URL);
171
+ $helper->getCheckoutSession()->setLastRealOrderId($orderId)
172
+ ->setRedirectUrl($actionUrl);
173
+ }
174
+ }
175
  }
app/code/community/Novalnet/Payment/Model/Payment/Method/Abstract.php CHANGED
@@ -79,7 +79,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
79
  public function canUseCheckout() {
80
  $quote = Mage::getModel('checkout/cart')->getQuote();
81
  $redirectPayment = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('redirectPayments');
82
- array_push($redirectPayment, Novalnet_Payment_Model_Config::NN_CC);
83
  if (!empty($quote) && $quote->hasNominalItems()
84
  && (in_array($this->_code, $redirectPayment)
85
  || $this->helper->checkIsAdmin())) {
@@ -179,12 +179,12 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
179
  $data = unserialize($payment->getAdditionalData());
180
  $data['subsCancelReason'] = $getRequest['reason'];
181
  $payment->setAdditionalData(serialize($data))->save();
182
- $this->logNovalnetTransactionData($request, $response, $profile->getReferenceId(), $customerId, $storeId, $orderNo);
183
  if ($response->getStatus() != Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
184
  $this->showException($response->getStatusDesc(), false);
185
  }
186
  } elseif ($profile->getNewState() == 'suspended' || $profile->getNewState() == 'active') {
187
- $this->infoRequestxml($profile->getNewState(), $profile, $subsId, $storeId, $customerId, $orderNo);
188
  }
189
  }
190
 
@@ -197,9 +197,10 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
197
  * @param int $storeId
198
  * @param int $customerId
199
  * @param int $orderNo
 
200
  * @return null
201
  */
202
- private function infoRequestxml($action, $profile, $subsId, $storeId, $customerId, $orderNo)
203
  {
204
  if ($action == 'suspended') {
205
  $pausePeriod = 1;
@@ -215,6 +216,10 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
215
  $subsId = NULL;
216
  }
217
 
 
 
 
 
218
  $request = '<?xml version="1.0" encoding="UTF-8"?>';
219
  $request .= '<nnxml><info_request>';
220
  $request .= '<vendor_id>' . $this->_vendorId . '</vendor_id>';
@@ -233,7 +238,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
233
  $xml = simplexml_load_string($request);
234
  $json = json_encode($xml);
235
  $array = json_decode($json, TRUE);
236
- $request = new Varien_Object($array);
237
  $this->logNovalnetTransactionData($request, $result, $profile->getReferenceId(), $customerId, $storeId, $orderNo, $subsId);
238
  if ($result->getStatus() != Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
239
  $statusDesc = $result->getStatusDesc();
@@ -288,6 +293,9 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
288
  } elseif (!empty($quote) && !$quote->hasNominalItems()
289
  && !$helper->isModuleActive($quote->getGrandTotal())) {
290
  return false;
 
 
 
291
  } elseif (time() < $this->_getCheckout()->$getNnDisableTime()) {
292
  return false;
293
  }
@@ -499,6 +507,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
499
  * Set additional reference params
500
  *
501
  * @param varien_object $request
 
502
  */
503
  public function setReferenceParams($request) {
504
  $referenceOne = trim(strip_tags(trim($this->getNovalnetConfig('reference_one'))));
@@ -535,8 +544,6 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
535
  {
536
  $result = new Varien_Object();
537
  $helper = $this->helper;
538
- $paymentKey = $helper->getPaymentId($this->_code);
539
- $quote = $this->_getCheckout()->getQuote();
540
  $payportUrl = $helper->getPayportUrl('paygate');
541
 
542
  if ($this->_validateBasicParams()) {
@@ -548,24 +555,24 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
548
  }
549
  return $result;
550
  }
551
-
552
  /**
553
  * load order transaction details
554
  *
555
- * @param tid
556
  * @return integer
557
  */
558
  public function updatedAmount($tid)
559
  {
560
- $updated_amount = $this->helper->loadTransactionStatus($tid);
561
  return $updated_amount;
562
  }
563
 
564
  /**
565
  * Assign Novalnet authentication Data
566
  *
567
- * @param int $storeId
568
  * @param varien_object $request
 
569
  * @return null
570
  */
571
  public function assignNnAuthData(Varien_Object $request, $storeId = NULL)
@@ -638,7 +645,6 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
638
  $helper = $this->helper;
639
  $order = $payment->getOrder();
640
  $refundAmount = $helper->getFormatedAmount($amount);
641
- $customerId = $order->getCustomerId();
642
  $orderItems = $this->getPaymentAllItems($order);
643
  $nominalItem = $helper->checkNominalItem($orderItems);
644
  $data = unserialize($payment->getAdditionalData());
@@ -654,21 +660,16 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
654
  }
655
  }
656
 
657
- if ($this->_code == Novalnet_Payment_Model_Config::NN_INVOICE) {
658
- $this->_refundValidation($payment, $refundAmount);
659
- }
660
-
661
  $orderAmount = NULL;
662
  $modelFactory = $helper->getModelFactory();
663
  if ($nominalItem) {
664
- $currency = Mage::app()->getLocale()->currency($this->_getInfoObject()->getBaseCurrencyCode())->getSymbol();
665
  $orderAmount = $helper->getFormatedAmount($this->_getAmount());
666
  }
667
  $response = $this->payportRequest($payment, 'refund', $refundAmount, $getTid, $orderAmount);
668
 
669
  if ($response->getStatus() == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
670
  $amountAfterRefund = ($order->getTotalPaid() - $order->getBaseTotalRefunded());
671
- $response->setAmount($helper->getFormatedAmount($this->_getAmount()));
672
  $statusCode = $modelFactory->getTransactionData($getTid, $payment, $amountAfterRefund, 1, NULL, NULL, $response);
673
  $txnId = $response->getTid();
674
  $refundTid = !empty($txnId) ? $txnId : $payment->getLastTransId() . '-refund';
@@ -695,7 +696,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
695
 
696
  $modelFactory->refundValidateProcess($helper, $payment, $refundTid,$data);
697
  if ($txnId) {
698
- $response->setAmount($amount);
699
  $modelFactory->getTransactionData($refundTid, $payment, $amountAfterRefund, 2, $refundTid, $order->getCustomerId(), $response);
700
  }
701
  } else {
@@ -707,34 +708,6 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
707
  return $this;
708
  }
709
 
710
- /**
711
- * refund validation for InvoicePayment
712
- *
713
- * @param varien_object $payment
714
- * @param float $refundAmount
715
- * @return boolean
716
- */
717
- private function _refundValidation($payment, $refundAmount)
718
- {
719
- $orderId = $payment->getOrder()->getIncrementId();
720
- $helper = $this->helper;
721
- $callbackTrans = $helper->loadCallbackValue($orderId);
722
- $callbackValue = ($callbackTrans && $callbackTrans->getCallbackAmount())
723
- ? $callbackTrans->getCallbackAmount() : '';
724
- $currency = Mage::app()->getLocale()->currency($this->_getInfoObject()->getBaseCurrencyCode())->getSymbol();
725
- if ($callbackValue < (string) $refundAmount) {
726
- $this->showException('Maximum amount available to refund is ' . $currency . $helper->getFormatedAmount($callbackValue, 'RAW'));
727
- }
728
-
729
- $refundedAmount = $helper->getFormatedAmount($payment->getAmountRefunded());
730
- $totalrefundAmount = $refundedAmount + $refundAmount;
731
- $availAmount = $callbackValue - $refundedAmount;
732
- if ($payment->getAmountRefunded() && $callbackValue < (string) $totalrefundAmount) {
733
- $this->showException('Maximum amount available to refund is ' . $currency . $helper->getFormatedAmount($availAmount, 'RAW'));
734
- }
735
- return true;
736
- }
737
-
738
  /**
739
  * Void payment
740
  *
@@ -946,7 +919,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
946
  {
947
  $order = $payment->getOrder();
948
  $statusMessage = $result->getStatusMessage() ? $result->getStatusMessage() : ($result->getStatusDesc() ? $result->getStatusDesc()
949
- : ($result->getStatusText() ? $result->getStatusText() : $this->helper->__('Payment was not successfull')));
950
  $paystatus = "<b><font color='red'>" . $this->helper->__('Payment Failed') . "</font> - " . $statusMessage . "</b>";
951
  $data = unserialize($payment->getAdditionalData());
952
  // Set Novalnet Mode
@@ -956,7 +929,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
956
  : $this->helper->getDecodedParam($result->getTestMode(), $authorizeKey);
957
  $shopMode = $this->getNovalnetConfig('live_mode', true);
958
  $testMode = (((isset($serverResponse) && $serverResponse == 1) || (isset($shopMode)
959
- && $shopMode == 0)) ? 1 : 0 );
960
  $data['NnTestOrder'] = $testMode;
961
  $data['NnComments'] = $paystatus;
962
  $payment->setLastTransId($result->getTid())
@@ -1074,8 +1047,6 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1074
  $this->dataHelper->importNovalnetEncodeData($request, $authorizeKey);
1075
  break;
1076
  case Novalnet_Payment_Model_Config::NN_CC:
1077
- $checkoutSession = $this->_getCheckout();
1078
- $amount = $helper->getFormatedAmount($this->_getAmount());
1079
  $authorizeKey = $this->loadAffAccDetail();
1080
  $request->setUniqid(uniqid())
1081
  ->setSession(session_id())
@@ -1116,7 +1087,7 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1116
  * Validate the Novalnet response
1117
  *
1118
  * @param varien_object $payment
1119
- * @param varien_object $request
1120
  * @return boolean
1121
  */
1122
  public function validateNovalnetResponse($payment, $result = NULL)
@@ -1165,14 +1136,16 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1165
  ->save();
1166
  $order->setPayment($payment);
1167
  $order->save();
1168
- $nnAffId = $helper->getCoresession()->getNnAffId();
1169
- if ($nnAffId) {
1170
- $this->doNovalnetAffUserInfoLog($nnAffId);
1171
- }
1172
  if (!$this->isCallbackTypeCall()) {
1173
  $this->logNovalnetTransactionData($request, $result, $txnId, $this->helper->getCustomerId(), $this->helper->getMagentoStoreId());
1174
  }
1175
- $statusText = ($result->getStatusText()) ? $result->getStatusText() : $helper->__('successful');
 
 
1176
  $helper->getCoresession()->addSuccess($statusText);
1177
  $error = false;
1178
  break;
@@ -1241,10 +1214,9 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1241
  public function sepaPaymentRefill()
1242
  {
1243
  $helper = $this->helper;
1244
- $customerLogin = $helper->getCustomerSession()->isLoggedIn();
1245
 
1246
- if ($customerLogin && !$helper->checkIsAdmin()) {
1247
- $customerId = $helper->getCustomerId();
1248
  $modNovalSepaReFillCollection = $helper->getModelSepaRefill()->getCollection();
1249
  $modNovalSepaReFillCollection->addFieldToFilter('customer_id', $customerId);
1250
  $modNovalSepaRefill = count($modNovalSepaReFillCollection)
@@ -1295,13 +1267,10 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1295
  * @param varien_object $payment
1296
  * @param string $reqType
1297
  * @param varien_object $extraOption
1298
- * @param varien_object $requestData
1299
- * @param array $params
1300
  * @return mixed
1301
  */
1302
- public function doNovalnetStatusCall($tid, $payment = NULL, $reqType = Novalnet_Payment_Model_Config::TRANS_STATUS, $extraOption
1303
- = NULL, $requestData = NULL, $params = NULL)
1304
- {
1305
  $requestType = ($reqType == Novalnet_Payment_Model_Config::TRANS_STATUS)
1306
  ? Novalnet_Payment_Model_Config::TRANS_STATUS : $reqType;
1307
 
@@ -1459,8 +1428,8 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1459
  /**
1460
  * Initiate callback process after selecting payment method
1461
  *
1462
- * @param string $paymentCode
1463
- * @param mixed $$infoInstance
1464
  * @return null
1465
  */
1466
  private function _initiateCallbackProcess($code, $infoInstance)
@@ -1636,6 +1605,8 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1636
  $callbackPin = "getNnCallbackPin" . $paymentCode;
1637
  $setNnDisableTime = "setNnDisableTime" . $paymentCode;
1638
  $methodSession = $this->_getMethodSession();
 
 
1639
 
1640
  if ($methodSession->getNnCallbackSuccessState()) {
1641
  $type = Novalnet_Payment_Model_Config::PIN_STATUS;
@@ -1647,6 +1618,8 @@ class Novalnet_Payment_Model_Payment_Method_Abstract extends Mage_Payment_Model_
1647
  // Analyze the response from Novalnet
1648
  if ($result->getStatus() == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
1649
  $methodSession->setNnCallbackSuccessState(false);
 
 
1650
  } else {
1651
  if ($result->getStatus() == Novalnet_Payment_Model_Config::METHOD_DISABLE_CODE) {
1652
  $this->_getCheckout()->$setNnDisableTime(time() + (30 * 60));
79
  public function canUseCheckout() {
80
  $quote = Mage::getModel('checkout/cart')->getQuote();
81
  $redirectPayment = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('redirectPayments');
82
+ unset($redirectPayment[0]);
83
  if (!empty($quote) && $quote->hasNominalItems()
84
  && (in_array($this->_code, $redirectPayment)
85
  || $this->helper->checkIsAdmin())) {
179
  $data = unserialize($payment->getAdditionalData());
180
  $data['subsCancelReason'] = $getRequest['reason'];
181
  $payment->setAdditionalData(serialize($data))->save();
182
+ $this->logNovalnetTransactionData($request, $response, $profile->getReferenceId(), $customerId, $storeId, $orderNo[0]);
183
  if ($response->getStatus() != Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
184
  $this->showException($response->getStatusDesc(), false);
185
  }
186
  } elseif ($profile->getNewState() == 'suspended' || $profile->getNewState() == 'active') {
187
+ $this->infoRequestxml($profile->getNewState(), $profile, $subsId, $storeId, $customerId, $orderNo[0], $payment);
188
  }
189
  }
190
 
197
  * @param int $storeId
198
  * @param int $customerId
199
  * @param int $orderNo
200
+ * @param varien_object $payment
201
  * @return null
202
  */
203
+ private function infoRequestxml($action, $profile, $subsId, $storeId, $customerId, $orderNo, $payment)
204
  {
205
  if ($action == 'suspended') {
206
  $pausePeriod = 1;
216
  $subsId = NULL;
217
  }
218
 
219
+ if ($payment) {
220
+ $this->assignVendorConfig($payment);
221
+ }
222
+
223
  $request = '<?xml version="1.0" encoding="UTF-8"?>';
224
  $request .= '<nnxml><info_request>';
225
  $request .= '<vendor_id>' . $this->_vendorId . '</vendor_id>';
238
  $xml = simplexml_load_string($request);
239
  $json = json_encode($xml);
240
  $array = json_decode($json, TRUE);
241
+ $request = new Varien_Object($array['info_request']);
242
  $this->logNovalnetTransactionData($request, $result, $profile->getReferenceId(), $customerId, $storeId, $orderNo, $subsId);
243
  if ($result->getStatus() != Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
244
  $statusDesc = $result->getStatusDesc();
293
  } elseif (!empty($quote) && !$quote->hasNominalItems()
294
  && !$helper->isModuleActive($quote->getGrandTotal())) {
295
  return false;
296
+ } elseif (!empty($quote) && $quote->hasNominalItems()
297
+ && $this->helper->checkIsAdmin()) {
298
+ return false;
299
  } elseif (time() < $this->_getCheckout()->$getNnDisableTime()) {
300
  return false;
301
  }
507
  * Set additional reference params
508
  *
509
  * @param varien_object $request
510
+ * @return null
511
  */
512
  public function setReferenceParams($request) {
513
  $referenceOne = trim(strip_tags(trim($this->getNovalnetConfig('reference_one'))));
544
  {
545
  $result = new Varien_Object();
546
  $helper = $this->helper;
 
 
547
  $payportUrl = $helper->getPayportUrl('paygate');
548
 
549
  if ($this->_validateBasicParams()) {
555
  }
556
  return $result;
557
  }
558
+
559
  /**
560
  * load order transaction details
561
  *
562
+ * @param tid
563
  * @return integer
564
  */
565
  public function updatedAmount($tid)
566
  {
567
+ $updated_amount = $this->helper->loadTransactionStatus($tid);
568
  return $updated_amount;
569
  }
570
 
571
  /**
572
  * Assign Novalnet authentication Data
573
  *
 
574
  * @param varien_object $request
575
+ * @param int $storeId
576
  * @return null
577
  */
578
  public function assignNnAuthData(Varien_Object $request, $storeId = NULL)
645
  $helper = $this->helper;
646
  $order = $payment->getOrder();
647
  $refundAmount = $helper->getFormatedAmount($amount);
 
648
  $orderItems = $this->getPaymentAllItems($order);
649
  $nominalItem = $helper->checkNominalItem($orderItems);
650
  $data = unserialize($payment->getAdditionalData());
660
  }
661
  }
662
 
 
 
 
 
663
  $orderAmount = NULL;
664
  $modelFactory = $helper->getModelFactory();
665
  if ($nominalItem) {
 
666
  $orderAmount = $helper->getFormatedAmount($this->_getAmount());
667
  }
668
  $response = $this->payportRequest($payment, 'refund', $refundAmount, $getTid, $orderAmount);
669
 
670
  if ($response->getStatus() == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
671
  $amountAfterRefund = ($order->getTotalPaid() - $order->getBaseTotalRefunded());
672
+ $response->setAmount($helper->getFormatedAmount($this->_getAmount()));
673
  $statusCode = $modelFactory->getTransactionData($getTid, $payment, $amountAfterRefund, 1, NULL, NULL, $response);
674
  $txnId = $response->getTid();
675
  $refundTid = !empty($txnId) ? $txnId : $payment->getLastTransId() . '-refund';
696
 
697
  $modelFactory->refundValidateProcess($helper, $payment, $refundTid,$data);
698
  if ($txnId) {
699
+ $response->setAmount($amount);
700
  $modelFactory->getTransactionData($refundTid, $payment, $amountAfterRefund, 2, $refundTid, $order->getCustomerId(), $response);
701
  }
702
  } else {
708
  return $this;
709
  }
710
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711
  /**
712
  * Void payment
713
  *
919
  {
920
  $order = $payment->getOrder();
921
  $statusMessage = $result->getStatusMessage() ? $result->getStatusMessage() : ($result->getStatusDesc() ? $result->getStatusDesc()
922
+ : ($result->getStatusText() ? $result->getStatusText() : $this->helper->__('Payment was not successfull')));
923
  $paystatus = "<b><font color='red'>" . $this->helper->__('Payment Failed') . "</font> - " . $statusMessage . "</b>";
924
  $data = unserialize($payment->getAdditionalData());
925
  // Set Novalnet Mode
929
  : $this->helper->getDecodedParam($result->getTestMode(), $authorizeKey);
930
  $shopMode = $this->getNovalnetConfig('live_mode', true);
931
  $testMode = (((isset($serverResponse) && $serverResponse == 1) || (isset($shopMode)
932
+ && $shopMode == 0)) ? 1 : 0 );
933
  $data['NnTestOrder'] = $testMode;
934
  $data['NnComments'] = $paystatus;
935
  $payment->setLastTransId($result->getTid())
1047
  $this->dataHelper->importNovalnetEncodeData($request, $authorizeKey);
1048
  break;
1049
  case Novalnet_Payment_Model_Config::NN_CC:
 
 
1050
  $authorizeKey = $this->loadAffAccDetail();
1051
  $request->setUniqid(uniqid())
1052
  ->setSession(session_id())
1087
  * Validate the Novalnet response
1088
  *
1089
  * @param varien_object $payment
1090
+ * @param varien_object $result
1091
  * @return boolean
1092
  */
1093
  public function validateNovalnetResponse($payment, $result = NULL)
1136
  ->save();
1137
  $order->setPayment($payment);
1138
  $order->save();
1139
+ $nnAffId = $helper->getCoresession()->getNnAffId();
1140
+ if ($nnAffId) {
1141
+ $this->doNovalnetAffUserInfoLog($nnAffId);
1142
+ }
1143
  if (!$this->isCallbackTypeCall()) {
1144
  $this->logNovalnetTransactionData($request, $result, $txnId, $this->helper->getCustomerId(), $this->helper->getMagentoStoreId());
1145
  }
1146
+ $statusText = $result->getStatusMessage() ? $result->getStatusMessage()
1147
+ : ($result->getStatusDesc() ? $result->getStatusDesc() : ($result->getStatusText()
1148
+ ? $result->getStatusText() : $helper->__('successful')));
1149
  $helper->getCoresession()->addSuccess($statusText);
1150
  $error = false;
1151
  break;
1214
  public function sepaPaymentRefill()
1215
  {
1216
  $helper = $this->helper;
1217
+ $customerId = $helper->getCustomerId();
1218
 
1219
+ if ($customerId != 'guest') {
 
1220
  $modNovalSepaReFillCollection = $helper->getModelSepaRefill()->getCollection();
1221
  $modNovalSepaReFillCollection->addFieldToFilter('customer_id', $customerId);
1222
  $modNovalSepaRefill = count($modNovalSepaReFillCollection)
1267
  * @param varien_object $payment
1268
  * @param string $reqType
1269
  * @param varien_object $extraOption
 
 
1270
  * @return mixed
1271
  */
1272
+ public function doNovalnetStatusCall($tid, $payment = NULL, $reqType = Novalnet_Payment_Model_Config::TRANS_STATUS, $extraOption = NULL)
1273
+ {
 
1274
  $requestType = ($reqType == Novalnet_Payment_Model_Config::TRANS_STATUS)
1275
  ? Novalnet_Payment_Model_Config::TRANS_STATUS : $reqType;
1276
 
1428
  /**
1429
  * Initiate callback process after selecting payment method
1430
  *
1431
+ * @param string $code
1432
+ * @param mixed $infoInstance
1433
  * @return null
1434
  */
1435
  private function _initiateCallbackProcess($code, $infoInstance)
1605
  $callbackPin = "getNnCallbackPin" . $paymentCode;
1606
  $setNnDisableTime = "setNnDisableTime" . $paymentCode;
1607
  $methodSession = $this->_getMethodSession();
1608
+ $checkoutSession = $this->_getCheckout();
1609
+ $nominalItem = $checkoutSession->getQuote()->hasNominalItems();
1610
 
1611
  if ($methodSession->getNnCallbackSuccessState()) {
1612
  $type = Novalnet_Payment_Model_Config::PIN_STATUS;
1618
  // Analyze the response from Novalnet
1619
  if ($result->getStatus() == Novalnet_Payment_Model_Config::RESPONSE_CODE_APPROVED) {
1620
  $methodSession->setNnCallbackSuccessState(false);
1621
+ ($nominalItem) ? $checkoutSession->getNominalResponse()->setTidStatus($result->getTidStatus())
1622
+ : $checkoutSession->getPaymentResData()->setTidStatus($result->getTidStatus());
1623
  } else {
1624
  if ($result->getStatus() == Novalnet_Payment_Model_Config::METHOD_DISABLE_CODE) {
1625
  $this->_getCheckout()->$setNnDisableTime(time() + (30 * 60));
app/code/community/Novalnet/Payment/Model/Recurring.php CHANGED
@@ -49,6 +49,7 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
49
  $quote = $checkoutSession->getQuote();
50
  $paymentObj = $quote->getPayment()->getMethodInstance();
51
  $paymentCode = $quote->getPayment()->getMethod();
 
52
 
53
  if ($checkoutSession->getNominalRequest() && $checkoutSession->getNominalResponse()) {
54
  $paymentObj->validateCallbackProcess(ucfirst($paymentCode));
@@ -56,6 +57,11 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
56
  $result = $checkoutSession->getNominalResponse();
57
  } else {
58
  $request = $this->_buildRecurringRequest($profile, $paymentObj);
 
 
 
 
 
59
  $result = $paymentObj->postRequest($request);
60
  }
61
 
@@ -71,7 +77,7 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
71
  $paymentObj->sepaPaymentRefill();
72
  }
73
 
74
- $ipnRequest = Mage::getModel('novalnet_payment/ipn')->processIpnRequest($this->_buildPostBackRequestForRecurring($request,$profile, $result, $paymentObj), new Varien_Http_Adapter_Curl(), $request, $result);
75
  // unset form payment method session
76
  $paymentObj->unsetFormMethodSession();
77
  // unset payment request and response values
@@ -153,7 +159,9 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
153
  $subsequentPeriod = !empty($period) ? $period : $tariffPeriod;
154
  $request->setTariffPeriod($tariffPeriod)
155
  ->setTariffPeriod2($subsequentPeriod)
156
- ->setTariffPeriod2Amount($originalAmount);
 
 
157
 
158
  return $request;
159
  }
@@ -202,7 +210,7 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
202
  /**
203
  * Get recurring capture total amount
204
  *
205
- * @param int $lastTranId
206
  * @param varien_object $order
207
  * @return int
208
  */
@@ -210,18 +218,17 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
210
  {
211
  $profileInfo = Mage::getModel('sales/recurring_profile')->load($lastTransId, 'reference_id');
212
  $billingAmount = $profileInfo->getBillingAmount();
213
- $initialAmount = $profileInfo->getInitAmount();
214
 
215
- if (!empty($initialAmount) && !empty($billingAmount)) {
216
- $amount = round(($initialAmount + $billingAmount
217
  + $profileInfo->getShippingAmount() + $profileInfo->getTaxAmount()), 2);
218
  } else {
219
  $amount = $order->getGrandTotal();
220
  }
221
 
222
- $loadTransaction = Mage::helper('novalnet_payment')->loadTransactionStatus($lastTransId)
223
- ->setAmount($amount)
224
- ->save();
225
  return $amount;
226
  }
227
 
@@ -253,4 +260,26 @@ class Novalnet_Payment_Model_Recurring extends Mage_Core_Model_Abstract
253
  Mage::getSingleton('checkout/session')->unsNnRegularAmount()
254
  ->unsNnRowAmount();
255
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  }
49
  $quote = $checkoutSession->getQuote();
50
  $paymentObj = $quote->getPayment()->getMethodInstance();
51
  $paymentCode = $quote->getPayment()->getMethod();
52
+ $subRedirectPayments = Novalnet_Payment_Model_Config::getInstance()->getNovalnetVariable('subscriptionRedirectPayments');
53
 
54
  if ($checkoutSession->getNominalRequest() && $checkoutSession->getNominalResponse()) {
55
  $paymentObj->validateCallbackProcess(ucfirst($paymentCode));
57
  $result = $checkoutSession->getNominalResponse();
58
  } else {
59
  $request = $this->_buildRecurringRequest($profile, $paymentObj);
60
+ if (in_array($paymentCode, $subRedirectPayments)) {
61
+ $checkoutSession->setPaymentReqData($request);
62
+ $this->_registerRecurringProfile($profile);
63
+ return true;
64
+ }
65
  $result = $paymentObj->postRequest($request);
66
  }
67
 
77
  $paymentObj->sepaPaymentRefill();
78
  }
79
 
80
+ Mage::getModel('novalnet_payment/ipn')->processIpnRequest($this->_buildPostBackRequestForRecurring($request,$profile, $result, $paymentObj), new Varien_Http_Adapter_Curl(), $request, $result);
81
  // unset form payment method session
82
  $paymentObj->unsetFormMethodSession();
83
  // unset payment request and response values
159
  $subsequentPeriod = !empty($period) ? $period : $tariffPeriod;
160
  $request->setTariffPeriod($tariffPeriod)
161
  ->setTariffPeriod2($subsequentPeriod)
162
+ ->setTariffPeriod2Amount($originalAmount)
163
+ ->setInput5('profile_id')
164
+ ->setInputval5($profile->getId());
165
 
166
  return $request;
167
  }
210
  /**
211
  * Get recurring capture total amount
212
  *
213
+ * @param int $lastTransId
214
  * @param varien_object $order
215
  * @return int
216
  */
218
  {
219
  $profileInfo = Mage::getModel('sales/recurring_profile')->load($lastTransId, 'reference_id');
220
  $billingAmount = $profileInfo->getBillingAmount();
 
221
 
222
+ if (!empty($billingAmount)) {
223
+ $amount = round(($billingAmount
224
  + $profileInfo->getShippingAmount() + $profileInfo->getTaxAmount()), 2);
225
  } else {
226
  $amount = $order->getGrandTotal();
227
  }
228
 
229
+ Mage::helper('novalnet_payment')->loadTransactionStatus($lastTransId)
230
+ ->setAmount($amount)
231
+ ->save();
232
  return $amount;
233
  }
234
 
260
  Mage::getSingleton('checkout/session')->unsNnRegularAmount()
261
  ->unsNnRowAmount();
262
  }
263
+
264
+ /**
265
+ * Register recurring profile and create order
266
+ *
267
+ * @param Mage_Payment_Model_Recurring_Profile $profile
268
+ */
269
+ protected function _registerRecurringProfile(Mage_Payment_Model_Recurring_Profile $profile)
270
+ {
271
+ $productItemInfo = new Varien_Object;
272
+ $productItemInfo->setPaymentType(Mage_Sales_Model_Recurring_Profile::PAYMENT_TYPE_REGULAR);
273
+ $productItemInfo->setTaxAmount($profile->getTaxAmount());
274
+ $productItemInfo->setShippingAmount($profile->getShippingAmount());
275
+ $productItemInfo->setPrice($profile->getBillingAmount());
276
+ $order = $profile->createOrder($productItemInfo);
277
+ $order->save();
278
+
279
+ $profile->addOrderRelation($order->getId());
280
+ $checkoutSession = Mage::helper('novalnet_payment')->getCheckoutSession();
281
+ $checkoutSession->setRecurringOrderId($order->getIncrementId())
282
+ ->setRecurringProfileNumber($profile->getId());
283
+ return true;
284
+ }
285
  }
app/code/community/Novalnet/Payment/Model/Sales/Order/Invoice.php CHANGED
@@ -86,7 +86,6 @@ class Novalnet_Payment_Model_Sales_Order_Invoice extends Mage_Sales_Model_Order_
86
  $amount = $helper->getModelRecurring()->getRecurringCaptureTotal($lastTranId,$this->getOrder());
87
  $this->getOrder()->setTotalPaid($amount);
88
  $this->getOrder()->setBaseTotalPaid($amount);
89
-
90
  } else {
91
  $this->getOrder()->setTotalPaid($this->getOrder()->getTotalPaid() + $this->getGrandTotal());
92
  $this->getOrder()->setBaseTotalPaid(
86
  $amount = $helper->getModelRecurring()->getRecurringCaptureTotal($lastTranId,$this->getOrder());
87
  $this->getOrder()->setTotalPaid($amount);
88
  $this->getOrder()->setBaseTotalPaid($amount);
 
89
  } else {
90
  $this->getOrder()->setTotalPaid($this->getOrder()->getTotalPaid() + $this->getGrandTotal());
91
  $this->getOrder()->setBaseTotalPaid(
app/code/community/Novalnet/Payment/controllers/Adminhtml/Novalnetpayment/Sales/OrderController.php CHANGED
@@ -127,8 +127,8 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
127
  ? false : true;
128
  $loadTransStatus->setTransactionStatus($responseCodeApproved)
129
  ->save();
130
- $data = unserialize($payment->getAdditionalData());
131
- $data['captureTid'] = $lastTranId;
132
  $data['CaptureCreateAt'] = Mage::getModel('core/date')->date('Y-m-d H:i:s');
133
  $payment->setAdditionalData(serialize($data))
134
  ->save();
@@ -144,18 +144,18 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
144
  ->save();
145
  }
146
  }
147
- $this->setOrderStatus($order, 'confirmStatus');
148
- $customerId = $payment->getOrder()->getCustomerId();
149
- $paymentObj->logNovalnetTransactionData($request, $response, $payment->getLastTransId(), $customerId, $storeId);
150
- }
151
- if ($responseStatus != $responseCodeApproved) {
152
- $this->_getSession()->addSuccess(
153
- $this->__('There was an error in refund request. Status Code : ' . $responseStatus)
154
- );
155
- } else {
156
- $this->_getSession()->addSuccess(
157
- $this->__('The order has been updated.')
158
- );
159
  }
160
  } catch (Mage_Core_Exception $e) {
161
  $this->_getSession()->addError($e->getMessage());
@@ -213,7 +213,6 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
213
  $order = $this->_initOrder();
214
  $helper = Mage::helper('novalnet_payment');
215
  $incrementId = $order->getIncrementId();
216
- $currency = $order->getOrderCurrencyCode();
217
  $callbackTrans = $helper->loadCallbackValue($incrementId);
218
  $callbackValue = $callbackTrans && $callbackTrans->getCallbackAmount() ? ($callbackTrans->getCallbackAmount() / 100) : '';
219
 
@@ -246,16 +245,16 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
246
 
247
  $amountChanged = $rawAmount;
248
  $loadTransStatus = $helper->loadTransactionStatus($lastTranId);
249
- $transStatus = $loadTransStatus->getTransactionStatus();
250
  if (!in_array(NULL, $request->toArray()) && !empty($transStatus)) {
251
  $buildNovalnetParam = http_build_query($request->getData());
252
  $payportUrl = $helper->getPayportUrl('paygate');
253
  $dataHelper = Mage::helper('novalnet_payment/AssignData');
254
  $response = $dataHelper->setRawCallRequest($buildNovalnetParam, $payportUrl, $paymentObj);
255
  if ($response->getStatus() == $responseCodeApproved) {
256
- // set transaction amount
257
- $loadTransStatus->setAmount($amountChanged)
258
- ->save();
259
  // make capture transaction open for lower versions to make refund
260
  if (version_compare($helper->getMagentoVersion(), '1.6', '<')) {
261
  $payment->setIsTransactionClosed(false)
@@ -268,15 +267,16 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
268
  if ($invoiceDuedate) {
269
  $note = explode('|',$data['NnNote']);
270
  $formatDate = Mage::helper('core')->formatDate($invoiceDuedate);
271
- $note[0] = 'Due Date: <b><span id="due_date">'.$formatDate.'</span></b>';
272
  $data['NnNote'] = implode('|',$note);
 
273
  }
274
  $data['NnNoteAmount'] = $dataHelper->getBankDetailsAmount($amountChanged);
275
  $payment->setAdditionalData(serialize($data))
276
  ->save();
277
  $modNovalamountchanged->setInvoiceDuedate($invoiceDuedate);
278
  }
279
- $countAmount = $helper->getAmountCollection($orderId, NULL, NULL);
280
  $modNovalamountchanged = $countAmount ? $helper->getModelAmountchanged()->load($orderId, 'order_id')
281
  : $helper->getModelAmountchanged();
282
  $modNovalamountchanged->setOrderId($orderId)
@@ -307,7 +307,7 @@ class Novalnet_Payment_Adminhtml_Novalnetpayment_Sales_OrderController extends M
307
  }
308
  } else {
309
  Mage::throwException($response->getStatusDesc());
310
- }
311
  $customerId = $order->getCustomerId();
312
  $paymentObj->logNovalnetTransactionData($request, $response, $lastTranId, $customerId, $storeId);
313
  $this->_getSession()->addSuccess(
127
  ? false : true;
128
  $loadTransStatus->setTransactionStatus($responseCodeApproved)
129
  ->save();
130
+ $data = unserialize($payment->getAdditionalData());
131
+ $data['captureTid'] = $lastTranId;
132
  $data['CaptureCreateAt'] = Mage::getModel('core/date')->date('Y-m-d H:i:s');
133
  $payment->setAdditionalData(serialize($data))
134
  ->save();
144
  ->save();
145
  }
146
  }
147
+ $this->setOrderStatus($order, 'confirmStatus');
148
+ $customerId = $payment->getOrder()->getCustomerId();
149
+ $paymentObj->logNovalnetTransactionData($request, $response, $payment->getLastTransId(), $customerId, $storeId);
150
+ if ($responseStatus != $responseCodeApproved) {
151
+ $this->_getSession()->addSuccess(
152
+ $this->__('There was an error in refund request. Status Code : ' . $responseStatus)
153
+ );
154
+ } else {
155
+ $this->_getSession()->addSuccess(
156
+ $this->__('The order has been updated.')
157
+ );
158
+ }
159
  }
160
  } catch (Mage_Core_Exception $e) {
161
  $this->_getSession()->addError($e->getMessage());
213
  $order = $this->_initOrder();
214
  $helper = Mage::helper('novalnet_payment');
215
  $incrementId = $order->getIncrementId();
 
216
  $callbackTrans = $helper->loadCallbackValue($incrementId);
217
  $callbackValue = $callbackTrans && $callbackTrans->getCallbackAmount() ? ($callbackTrans->getCallbackAmount() / 100) : '';
218
 
245
 
246
  $amountChanged = $rawAmount;
247
  $loadTransStatus = $helper->loadTransactionStatus($lastTranId);
248
+ $transStatus = $loadTransStatus->getTransactionStatus();
249
  if (!in_array(NULL, $request->toArray()) && !empty($transStatus)) {
250
  $buildNovalnetParam = http_build_query($request->getData());
251
  $payportUrl = $helper->getPayportUrl('paygate');
252
  $dataHelper = Mage::helper('novalnet_payment/AssignData');
253
  $response = $dataHelper->setRawCallRequest($buildNovalnetParam, $payportUrl, $paymentObj);
254
  if ($response->getStatus() == $responseCodeApproved) {
255
+ // set transaction amount
256
+ $loadTransStatus->setAmount($amountChanged)
257
+ ->save();
258
  // make capture transaction open for lower versions to make refund
259
  if (version_compare($helper->getMagentoVersion(), '1.6', '<')) {
260
  $payment->setIsTransactionClosed(false)
267
  if ($invoiceDuedate) {
268
  $note = explode('|',$data['NnNote']);
269
  $formatDate = Mage::helper('core')->formatDate($invoiceDuedate);
270
+ $note[0] = 'Due Date: ' . $formatDate;
271
  $data['NnNote'] = implode('|',$note);
272
+ $data['NnDueDate'] = 'Due Date: <span id="due_date">' . $formatDate . '</span>';
273
  }
274
  $data['NnNoteAmount'] = $dataHelper->getBankDetailsAmount($amountChanged);
275
  $payment->setAdditionalData(serialize($data))
276
  ->save();
277
  $modNovalamountchanged->setInvoiceDuedate($invoiceDuedate);
278
  }
279
+ $countAmount = $helper->getAmountCollection($orderId, NULL, NULL);
280
  $modNovalamountchanged = $countAmount ? $helper->getModelAmountchanged()->load($orderId, 'order_id')
281
  : $helper->getModelAmountchanged();
282
  $modNovalamountchanged->setOrderId($orderId)
307
  }
308
  } else {
309
  Mage::throwException($response->getStatusDesc());
310
+ }
311
  $customerId = $order->getCustomerId();
312
  $paymentObj->logNovalnetTransactionData($request, $response, $lastTranId, $customerId, $storeId);
313
  $this->_getSession()->addSuccess(
app/code/community/Novalnet/Payment/controllers/CcController.php CHANGED
@@ -50,26 +50,31 @@ class Novalnet_Payment_CcController extends Mage_Core_Controller_Front_Action
50
  $authorizeKey = $paymentObj->loadAffAccDetail();
51
  $paymentRequest = $helper->getCheckoutSession()->getPaymentReqData();
52
 
53
- // Get Vendor configuration values from payport request
54
- $authCode = $helper->getDecodedParam($paymentRequest->getVendorAuthcode(), $authorizeKey);
55
- $productId = $helper->getDecodedParam($paymentRequest->getProductId(), $authorizeKey);
56
- $tariffId = $helper->getDecodedParam($paymentRequest->getTariffId(), $authorizeKey);
 
57
 
58
- // Payment additional data
59
- $data = array('vendor' => $paymentRequest->getVendorId(),
60
- 'auth_code' => $authCode,
61
- 'product' => $productId,
62
- 'tariff' => $tariffId,
63
- 'key' => $paymentRequest->getKey(),
64
- 'authorize_key' => $authorizeKey
65
- );
66
 
67
- $payment->setAdditionalData(serialize($data))->save();
68
- $status = $state = Mage_Sales_Model_Order::STATE_HOLDED; //set State,Status to HOLD
69
- $order->setState($state, $status, $helper->__('Customer was redirected to Novalnet'), false)->save();
 
70
 
71
- //Now showing it with rendering of layout
72
- $this->renderLayout();
 
 
 
73
  }
74
 
75
  /**
50
  $authorizeKey = $paymentObj->loadAffAccDetail();
51
  $paymentRequest = $helper->getCheckoutSession()->getPaymentReqData();
52
 
53
+ if(!$payment->getLastTransId()) {
54
+ // Get Vendor configuration values from payport request
55
+ $authCode = $helper->getDecodedParam($paymentRequest->getVendorAuthcode(), $authorizeKey);
56
+ $productId = $helper->getDecodedParam($paymentRequest->getProductId(), $authorizeKey);
57
+ $tariffId = $helper->getDecodedParam($paymentRequest->getTariffId(), $authorizeKey);
58
 
59
+ // Payment additional data
60
+ $data = array('vendor' => $paymentRequest->getVendorId(),
61
+ 'auth_code' => $authCode,
62
+ 'product' => $productId,
63
+ 'tariff' => $tariffId,
64
+ 'key' => $paymentRequest->getKey(),
65
+ 'authorize_key' => $authorizeKey
66
+ );
67
 
68
+ $payment->setAdditionalData(serialize($data))->save();
69
+ $status = $state = Mage_Sales_Model_Order::STATE_HOLDED; //set State,Status to HOLD
70
+ $order->setState($state, $status, $helper->__('Customer was redirected to Novalnet'), false)->save();
71
+ $helper->getCheckoutSession()->unsRecurringProfileNumber(); //unset recurring profile data
72
 
73
+ //Now showing it with rendering of layout
74
+ $this->renderLayout();
75
+ } else {
76
+ $this->_redirect('checkout/cart');
77
+ }
78
  }
79
 
80
  /**
app/code/community/Novalnet/Payment/controllers/GatewayController.php CHANGED
@@ -106,8 +106,20 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
106
  $payment->setAdditionalInformation($errorActionFlag, 1);
107
  $dataObj = new Varien_Object($response);
108
  $paymentObj->saveCancelledOrder($dataObj, $payment);
109
- $statusMessage = ($dataObj->getStatusText()) ? $dataObj->getStatusText()
110
- : $dataObj->getStatusDesc();
 
 
 
 
 
 
 
 
 
 
 
 
111
  $helper->getCoresession()->addError($statusMessage);
112
  }
113
 
@@ -205,6 +217,13 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
205
  return false;
206
  }
207
 
 
 
 
 
 
 
 
208
  //success
209
  if (($paymentObj->getCode() == Novalnet_Payment_Model_Config::NN_PAYPAL
210
  && $response['status'] == Novalnet_Payment_Model_Config::PAYPAL_PENDING_CODE)
@@ -213,7 +232,19 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
213
  $testMode = $this->setNovalnetMode($paymentObj,$response,$authorizeKey);
214
  $data['NnTestOrder'] = $testMode;
215
  $data['NnTid'] = $response['tid'];
216
- $amount = is_numeric($response['amount']) ? $response['amount'] : $helper->getDecodedParam($response['amount'], $authorizeKey);
 
 
 
 
 
 
 
 
 
 
 
 
217
 
218
  $payment->setStatus(Novalnet_Payment_Model_Payment_Method_Abstract::STATUS_SUCCESS)
219
  ->setStatusDescription($helper->__('Payment was successful.'))
@@ -232,8 +263,15 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
232
  $status = true;
233
  } else {
234
  $paymentObj->saveCancelledOrder($dataObj, $payment);
235
- $statusMessage = ($dataObj->getStatusText()) ? $dataObj->getStatusText()
236
- : $dataObj->getStatusDesc();
 
 
 
 
 
 
 
237
  $helper->getCoresession()->addError($statusMessage);
238
  $status = false;
239
  }
@@ -295,13 +333,13 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
295
  }
296
  }
297
 
298
- $dataObj = new Varien_Object($response);
299
  $nnAffId = $helper->getCoresession()->getNnAffId();
300
- if ($nnAffId) {
301
- $paymentObj->doNovalnetAffUserInfoLog($nnAffId);
302
- }
303
- $statusText = ($response['status_text']) ? $response['status_text']
304
- : $helper->__('successful');
 
305
  $helper->getCoresession()->addSuccess($statusText);
306
  $order->save();
307
  $amount = is_numeric($response['amount']) ? $response['amount'] : $helper->getDecodedParam($response['amount'], $authorizeKey);
@@ -339,16 +377,6 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
339
  return Mage::getModel('sales/order')->loadByIncrementId($this->_getCheckout()->getLastRealOrderId());
340
  }
341
 
342
- /**
343
- * Get Current payment method instance
344
- *
345
- * @return payment method instance
346
- */
347
- private function _getPaymentObject()
348
- {
349
- return $this->_getOrder()->getPayment()->getMethodInstance();
350
- }
351
-
352
  /**
353
  * Log Novalnet transaction status data
354
  *
@@ -398,9 +426,9 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
398
  /**
399
  * Set payment status for Novalnet redirect payment methods
400
  *
401
- * @param varien_object $paymentObj
402
- * @param array $response
403
  * @param mixed $authorizeKey
 
 
404
  * @return array
405
  */
406
  private function responseStatus($authorizeKey,$response,$paymentObj)
@@ -427,4 +455,27 @@ class Novalnet_Payment_GatewayController extends Mage_Core_Controller_Front_Acti
427
  && $shopMode == 0)) ? 1 : 0 );
428
  return $testMode;
429
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
430
  }
106
  $payment->setAdditionalInformation($errorActionFlag, 1);
107
  $dataObj = new Varien_Object($response);
108
  $paymentObj->saveCancelledOrder($dataObj, $payment);
109
+ $profileId = (!empty($response['profile_id'])
110
+ ? $response['profile_id']
111
+ : ((!empty($response['input5']) && $response['input5'] == 'profile_id') ? $response['inputval5'] : ''));
112
+ if ($profileId) {
113
+ $recurringProfile = $this->loadRecurringProfile($profileId);
114
+ $recurringProfile->setState(Mage_Sales_Model_Recurring_Profile::STATE_CANCELED)
115
+ ->setReferenceId($dataObj->getTid())
116
+ ->save();
117
+ $this->unsetRecurringData(); //unset recurring order id and profile id
118
+ $this->_getCheckout()->setLastOrderId($order->getId());
119
+ }
120
+ $statusMessage = $dataObj->getStatusMessage() ? $dataObj->getStatusMessage()
121
+ : ($dataObj->getStatusDesc() ? $dataObj->getStatusDesc() : ($dataObj->getStatusText()
122
+ ? $dataObj->getStatusText() : $helper->__('Payment was not successfull')));
123
  $helper->getCoresession()->addError($statusMessage);
124
  }
125
 
217
  return false;
218
  }
219
 
220
+ $profileId = (!empty($response['profile_id'])
221
+ ? $response['profile_id']
222
+ : ((!empty($response['input5']) && $response['input5'] == 'profile_id') ? $response['inputval5'] : ''));
223
+ if ($profileId) {
224
+ $recurringProfile = $this->loadRecurringProfile($profileId);
225
+ }
226
+
227
  //success
228
  if (($paymentObj->getCode() == Novalnet_Payment_Model_Config::NN_PAYPAL
229
  && $response['status'] == Novalnet_Payment_Model_Config::PAYPAL_PENDING_CODE)
232
  $testMode = $this->setNovalnetMode($paymentObj,$response,$authorizeKey);
233
  $data['NnTestOrder'] = $testMode;
234
  $data['NnTid'] = $response['tid'];
235
+ if (!empty($profileId)) {
236
+ $recurringProfile->setState(Mage_Sales_Model_Recurring_Profile::STATE_ACTIVE)
237
+ ->setReferenceId($response['tid'])
238
+ ->save();
239
+
240
+ $recurringAmount = round(($recurringProfile->getBillingAmount() + $recurringProfile->getShippingAmount() + $recurringProfile->getTaxAmount()), 2);
241
+ $payment->registerCaptureNotification($recurringAmount, 0);
242
+ $IpnComment = $helper->__('IPN "%s".', $response['status']);
243
+ $payment->setPreparedMessage($IpnComment)
244
+ ->setAdditionalInformation('subs_id', $response['subs_id']);
245
+ $data['paidUntil'] = !empty($response['next_subs_cycle']) ? $response['next_subs_cycle'] : $response['paid_until'];
246
+ $this->unsetRecurringData(); //unset recurring order id and profile id
247
+ }
248
 
249
  $payment->setStatus(Novalnet_Payment_Model_Payment_Method_Abstract::STATUS_SUCCESS)
250
  ->setStatusDescription($helper->__('Payment was successful.'))
263
  $status = true;
264
  } else {
265
  $paymentObj->saveCancelledOrder($dataObj, $payment);
266
+ if (!empty($profileId)) {
267
+ $recurringProfile->setState(Mage_Sales_Model_Recurring_Profile::STATE_CANCELED)
268
+ ->setReferenceId($response['tid'])
269
+ ->save();
270
+ $this->unsetRecurringData(); //unset recurring order id and profile id
271
+ }
272
+ $statusMessage = $dataObj->getStatusMessage() ? $dataObj->getStatusMessage()
273
+ : ($dataObj->getStatusDesc() ? $dataObj->getStatusDesc() : ($dataObj->getStatusText()
274
+ ? $dataObj->getStatusText() : $helper->__('Payment was not successfull')));
275
  $helper->getCoresession()->addError($statusMessage);
276
  $status = false;
277
  }
333
  }
334
  }
335
 
 
336
  $nnAffId = $helper->getCoresession()->getNnAffId();
337
+ if ($nnAffId) {
338
+ $paymentObj->doNovalnetAffUserInfoLog($nnAffId);
339
+ }
340
+ $statusText = !empty($response['status_message']) ? $response['status_message']
341
+ : (!empty($response['status_desc']) ? $response['status_desc'] : (!empty($response['status_text'])
342
+ ? $response['status_text'] : $helper->__('successful')));
343
  $helper->getCoresession()->addSuccess($statusText);
344
  $order->save();
345
  $amount = is_numeric($response['amount']) ? $response['amount'] : $helper->getDecodedParam($response['amount'], $authorizeKey);
377
  return Mage::getModel('sales/order')->loadByIncrementId($this->_getCheckout()->getLastRealOrderId());
378
  }
379
 
 
 
 
 
 
 
 
 
 
 
380
  /**
381
  * Log Novalnet transaction status data
382
  *
426
  /**
427
  * Set payment status for Novalnet redirect payment methods
428
  *
 
 
429
  * @param mixed $authorizeKey
430
+ * @param array $response
431
+ * @param varien_object $paymentObj
432
  * @return array
433
  */
434
  private function responseStatus($authorizeKey,$response,$paymentObj)
455
  && $shopMode == 0)) ? 1 : 0 );
456
  return $testMode;
457
  }
458
+
459
+ /**
460
+ * Unset recurring payment data
461
+ *
462
+ * @param null
463
+ * @return null
464
+ */
465
+ private function unsetRecurringData()
466
+ {
467
+ $this->_getCheckout()->unsRecurringOrderId();
468
+ }
469
+
470
+ /**
471
+ * load recurring payment profile
472
+ *
473
+ * @param int $profileId
474
+ * @return varien_object
475
+ */
476
+ private function loadRecurringProfile($profileId)
477
+ {
478
+ return Mage::getModel('sales/recurring_profile')
479
+ ->load($profileId, 'profile_id');
480
+ }
481
  }
app/code/community/Novalnet/Payment/etc/config.xml CHANGED
@@ -29,7 +29,7 @@
29
  <modules>
30
  <Novalnet_Payment>
31
  <!-- declare module's version information for database updates -->
32
- <version>10.2.0</version>
33
  </Novalnet_Payment>
34
  </modules>
35
 
@@ -233,6 +233,15 @@
233
  </novalnet_payment_cart_save_after>
234
  </observers>
235
  </checkout_cart_save_after>
 
 
 
 
 
 
 
 
 
236
  </events>
237
  </global>
238
 
29
  <modules>
30
  <Novalnet_Payment>
31
  <!-- declare module's version information for database updates -->
32
+ <version>10.2.1</version>
33
  </Novalnet_Payment>
34
  </modules>
35
 
233
  </novalnet_payment_cart_save_after>
234
  </observers>
235
  </checkout_cart_save_after>
236
+ <checkout_submit_all_after>
237
+ <observers>
238
+ <novalnet_payment_recurring_redirect_url>
239
+ <type>singleton</type>
240
+ <class>Novalnet_Payment_Model_Observer</class>
241
+ <method>updateRecurringUrl</method>
242
+ </novalnet_payment_recurring_redirect_url>
243
+ </observers>
244
+ </checkout_submit_all_after>
245
  </events>
246
  </global>
247
 
app/code/community/Novalnet/Payment/etc/system.xml CHANGED
@@ -328,7 +328,7 @@
328
  <show_in_store>1</show_in_store>
329
  </active>
330
  <title translate="label">
331
- <label>Title</label>
332
  <frontend_type>text</frontend_type>
333
  <config_path>payment/novalnetCc/title</config_path>
334
  <validate>required-entry</validate>
@@ -505,7 +505,7 @@
505
  <show_in_store>1</show_in_store>
506
  </active>
507
  <title translate="label">
508
- <label>Title</label>
509
  <frontend_type>text</frontend_type>
510
  <config_path>payment/novalnetSepa/title</config_path>
511
  <validate>required-entry</validate>
@@ -684,7 +684,7 @@
684
  <show_in_store>1</show_in_store>
685
  </active>
686
  <title translate="label">
687
- <label>Title</label>
688
  <frontend_type>text</frontend_type>
689
  <config_path>payment/novalnetInvoice/title</config_path>
690
  <validate>required-entry</validate>
@@ -881,7 +881,7 @@
881
  <show_in_store>1</show_in_store>
882
  </active>
883
  <title translate="label">
884
- <label>Title</label>
885
  <frontend_type>text</frontend_type>
886
  <config_path>payment/novalnetPrepayment/title</config_path>
887
  <validate>required-entry</validate>
@@ -1067,7 +1067,7 @@
1067
  <show_in_store>1</show_in_store>
1068
  </active>
1069
  <title translate="label">
1070
- <label>Title</label>
1071
  <frontend_type>text</frontend_type>
1072
  <config_path>payment/novalnetBanktransfer/title</config_path>
1073
  <validate>required-entry</validate>
@@ -1224,7 +1224,7 @@
1224
  <show_in_store>1</show_in_store>
1225
  </active>
1226
  <title translate="label">
1227
- <label>Title</label>
1228
  <frontend_type>text</frontend_type>
1229
  <config_path>payment/novalnetPaypal/title</config_path>
1230
  <validate>required-entry</validate>
@@ -1381,7 +1381,7 @@
1381
  <show_in_store>1</show_in_store>
1382
  </active>
1383
  <title translate="label">
1384
- <label>Title</label>
1385
  <frontend_type>text</frontend_type>
1386
  <config_path>payment/novalnetIdeal/title</config_path>
1387
  <validate>required-entry</validate>
@@ -1538,7 +1538,7 @@
1538
  <show_in_store>1</show_in_store>
1539
  </active>
1540
  <title translate="label">
1541
- <label>Title</label>
1542
  <frontend_type>text</frontend_type>
1543
  <config_path>payment/novalnetEps/title</config_path>
1544
  <validate>required-entry</validate>
@@ -1695,7 +1695,7 @@
1695
  <show_in_store>1</show_in_store>
1696
  </active>
1697
  <title translate="label">
1698
- <label>Title</label>
1699
  <frontend_type>text</frontend_type>
1700
  <config_path>payment/novalnetGiropay/title</config_path>
1701
  <validate>required-entry</validate>
328
  <show_in_store>1</show_in_store>
329
  </active>
330
  <title translate="label">
331
+ <label>Novalnet Title</label>
332
  <frontend_type>text</frontend_type>
333
  <config_path>payment/novalnetCc/title</config_path>
334
  <validate>required-entry</validate>
505
  <show_in_store>1</show_in_store>
506
  </active>
507
  <title translate="label">
508
+ <label>Novalnet Title</label>
509
  <frontend_type>text</frontend_type>
510
  <config_path>payment/novalnetSepa/title</config_path>
511
  <validate>required-entry</validate>
684
  <show_in_store>1</show_in_store>
685
  </active>
686
  <title translate="label">
687
+ <label>Novalnet Title</label>
688
  <frontend_type>text</frontend_type>
689
  <config_path>payment/novalnetInvoice/title</config_path>
690
  <validate>required-entry</validate>
881
  <show_in_store>1</show_in_store>
882
  </active>
883
  <title translate="label">
884
+ <label>Novalnet Title</label>
885
  <frontend_type>text</frontend_type>
886
  <config_path>payment/novalnetPrepayment/title</config_path>
887
  <validate>required-entry</validate>
1067
  <show_in_store>1</show_in_store>
1068
  </active>
1069
  <title translate="label">
1070
+ <label>Novalnet Title</label>
1071
  <frontend_type>text</frontend_type>
1072
  <config_path>payment/novalnetBanktransfer/title</config_path>
1073
  <validate>required-entry</validate>
1224
  <show_in_store>1</show_in_store>
1225
  </active>
1226
  <title translate="label">
1227
+ <label>Novalnet Title</label>
1228
  <frontend_type>text</frontend_type>
1229
  <config_path>payment/novalnetPaypal/title</config_path>
1230
  <validate>required-entry</validate>
1381
  <show_in_store>1</show_in_store>
1382
  </active>
1383
  <title translate="label">
1384
+ <label>Novalnet Title</label>
1385
  <frontend_type>text</frontend_type>
1386
  <config_path>payment/novalnetIdeal/title</config_path>
1387
  <validate>required-entry</validate>
1538
  <show_in_store>1</show_in_store>
1539
  </active>
1540
  <title translate="label">
1541
+ <label>Novalnet Title</label>
1542
  <frontend_type>text</frontend_type>
1543
  <config_path>payment/novalnetEps/title</config_path>
1544
  <validate>required-entry</validate>
1695
  <show_in_store>1</show_in_store>
1696
  </active>
1697
  <title translate="label">
1698
+ <label>Novalnet Title</label>
1699
  <frontend_type>text</frontend_type>
1700
  <config_path>payment/novalnetGiropay/title</config_path>
1701
  <validate>required-entry</validate>
app/code/community/Novalnet/Payment/sql/novalnet_setup/{mysql4-install-10.2.0.php → mysql4-install-10.2.1.php} RENAMED
File without changes
app/design/adminhtml/default/default/template/novalnet/payment/method/info/Invoice.phtml CHANGED
@@ -57,7 +57,7 @@ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalDat
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -83,10 +83,10 @@ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalDat
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
- echo '<br><b>' . $this->__($text) . '</b>';
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/adminhtml/default/default/template/novalnet/payment/method/info/Paypal.phtml CHANGED
@@ -27,6 +27,7 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php
@@ -35,6 +36,8 @@ if ($_info):
35
  ?>
36
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
37
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
 
 
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php
36
  ?>
37
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
38
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
39
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>
40
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>
41
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
42
  <?php
43
  if ($this->getAdditionalData('refunded_tid')):
app/design/adminhtml/default/default/template/novalnet/payment/method/info/Prepayment.phtml CHANGED
@@ -57,7 +57,7 @@ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalDat
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -83,10 +83,10 @@ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalDat
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
- echo '<br><b>' . $this->__($text) . '</b>';
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Invoice.phtml CHANGED
@@ -56,7 +56,8 @@ endif;
56
  echo nl2br($this->getAdditionalData('NnNote'));
57
  else:
58
  $note = explode('|', $this->getAdditionalData('NnNote'));
59
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b></br>';
 
60
  foreach ($note as $noteValue):
61
  list($text, $value) = explode(':', $noteValue);
62
  echo $this->__($text) . ' : ' . $value
@@ -83,10 +84,10 @@ endif;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
- echo $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b></br>';
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
- echo '<b>' . $this->__($text) . '</b></br>';
90
  else:
91
  echo $this->__($text) . ' : ' . $value
92
  ?> {{pdf_row_separator}} <?php
56
  echo nl2br($this->getAdditionalData('NnNote'));
57
  else:
58
  $note = explode('|', $this->getAdditionalData('NnNote'));
59
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
60
+ ?> {{pdf_row_separator}} <?php
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo $this->__($text) . ' : ' . $value
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
+ echo $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value . '</br>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
+ echo $this->__($text) . '</br>';
91
  else:
92
  echo $this->__($text) . ' : ' . $value
93
  ?> {{pdf_row_separator}} <?php
app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Paypal.phtml CHANGED
@@ -27,11 +27,14 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php if ($this->getAdditionalData('NnTestOrder')) echo $this->__('Testorder'); ?>{{pdf_row_separator}}
33
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?>{{pdf_row_separator}}
34
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>{{pdf_row_separator}}
 
 
35
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>{{pdf_row_separator}}
36
  <?php
37
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php if ($this->getAdditionalData('NnTestOrder')) echo $this->__('Testorder'); ?>{{pdf_row_separator}}
34
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?>{{pdf_row_separator}}
35
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>{{pdf_row_separator}}
36
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>{{pdf_row_separator}}
37
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>{{pdf_row_separator}}
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>{{pdf_row_separator}}
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
app/design/adminhtml/default/default/template/novalnet/payment/method/pdf/Prepayment.phtml CHANGED
@@ -57,7 +57,8 @@ endif;
57
  echo nl2br($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b></br>';
 
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo $this->__($text) . ' : ' . $value
@@ -84,10 +85,10 @@ endif;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b></br>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<b>' . $this->__($text) . '</b></br>';
91
  else:
92
  echo $this->__($text) . ' : ' . $value
93
  ?> {{pdf_row_separator}} <?php
57
  echo nl2br($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
+ ?> {{pdf_row_separator}} <?php
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo $this->__($text) . ' : ' . $value
85
  if (preg_match("/Order No&/i", $value)):
86
  list($referenceTxt, $value) = explode('&', $value);
87
  str_replace('&', '', $referenceTxt);
88
+ echo $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value . '</br>';
89
  else:
90
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
91
+ echo $this->__($text) . '</br>';
92
  else:
93
  echo $this->__($text) . ' : ' . $value
94
  ?> {{pdf_row_separator}} <?php
app/design/adminhtml/default/default/template/novalnet/sales/order/view/tab/info.phtml CHANGED
@@ -31,9 +31,11 @@ $paymentObj = $payment->getMethodInstance();
31
  $data = unserialize($payment->getAdditionalData());
32
  $parentTid = isset($data['NnTid']) ? $data['NnTid'] : '';
33
  $sepaparentTid = isset($data['NnSepaParentTid']) ? $data['NnSepaParentTid'] : '';
34
- preg_match('|<span id="due_date">(.+?)</span>|s', $this->getPaymentHtml(), $match);
35
- if($match) {
36
- $due_date = date("Y-m-d", strtotime($match['1'] .' +1 day'));
 
 
37
  }
38
  ?>
39
  <div>
@@ -113,7 +115,7 @@ if($match) {
113
  } else if ($status == 100 && in_array($paymentname, $invoicepayment)
114
  && ($paid == 1 || !$paid)) {
115
  $amount = $helper->getFormatedAmount($update_details->getAmount());
116
- $date = $due_date;
117
  ?>
118
  <div class="entry-edit">
119
  <div class="entry-edit-head">
@@ -124,7 +126,7 @@ if($match) {
124
  <tr><td><span style='width:50%;'><?php echo $this->__('Novalnet transaction amount') ?>:&nbsp;</span></td>
125
  <td><input class="validate-date required-entry" type="text" id="amount_changed" name="amount_changed" value="<?php echo $amount; ?>" onkeypress="return novalnetAllowNumeric(event)"; style="width:6em" /></td></tr>
126
 
127
- <tr><td><?php echo $this->__('Invoice Due Date') ?>:</td><td><input class="validate-date" type="text" id="invoice_duedate" name="invoice_duedate" value="<?php echo $date; ?>" style="width:6em" /></td>
128
  </tr>
129
 
130
  <tr><td colspan=2>
31
  $data = unserialize($payment->getAdditionalData());
32
  $parentTid = isset($data['NnTid']) ? $data['NnTid'] : '';
33
  $sepaparentTid = isset($data['NnSepaParentTid']) ? $data['NnSepaParentTid'] : '';
34
+ if(!empty($data['NnDueDate'])) {
35
+ preg_match('|<span id="due_date">(.+?)</span>|s', $data['NnDueDate'], $match);
36
+ }
37
+ if(!empty($match)) {
38
+ $due_date = date("Y-m-d", strtotime($match['1'] .' +1 day'));
39
  }
40
  ?>
41
  <div>
115
  } else if ($status == 100 && in_array($paymentname, $invoicepayment)
116
  && ($paid == 1 || !$paid)) {
117
  $amount = $helper->getFormatedAmount($update_details->getAmount());
118
+ $date = !empty($due_date) ? $due_date : '';
119
  ?>
120
  <div class="entry-edit">
121
  <div class="entry-edit-head">
126
  <tr><td><span style='width:50%;'><?php echo $this->__('Novalnet transaction amount') ?>:&nbsp;</span></td>
127
  <td><input class="validate-date required-entry" type="text" id="amount_changed" name="amount_changed" value="<?php echo $amount; ?>" onkeypress="return novalnetAllowNumeric(event)"; style="width:6em" /></td></tr>
128
 
129
+ <tr><td><?php echo $this->__('Invoice Due Date') ?>:</td><td><input class="validate-date" type="text" id="invoice_duedate" name="invoice_duedate" value="<?php echo $date; ?>" style="width:6em" readonly /></td>
130
  </tr>
131
 
132
  <tr><td colspan=2>
app/design/frontend/base/default/template/novalnet/payment/method/info/Invoice.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/frontend/base/default/template/novalnet/payment/method/info/Paypal.phtml CHANGED
@@ -27,6 +27,7 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php
@@ -35,6 +36,8 @@ if ($_info):
35
  ?>
36
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
37
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
 
 
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php
36
  ?>
37
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
38
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
39
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>
40
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>
41
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
42
  <?php
43
  if ($this->getAdditionalData('refunded_tid')):
app/design/frontend/base/default/template/novalnet/payment/method/info/Prepayment.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/frontend/base/default/template/novalnet/payment/method/pdf/Invoice.phtml CHANGED
@@ -56,7 +56,8 @@ endif;
56
  echo nl2br($this->getAdditionalData('NnNote'));
57
  else:
58
  $note = explode('|', $this->getAdditionalData('NnNote'));
59
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b></br>';
 
60
  foreach ($note as $noteValue):
61
  list($text, $value) = explode(':', $noteValue);
62
  echo $this->__($text) . ' : ' . $value
@@ -83,10 +84,10 @@ endif;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
- echo $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b></br>';
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
- echo '<b>' . $this->__($text) . '</b></br>';
90
  else:
91
  echo $this->__($text) . ' : ' . $value
92
  ?> {{pdf_row_separator}} <?php
56
  echo nl2br($this->getAdditionalData('NnNote'));
57
  else:
58
  $note = explode('|', $this->getAdditionalData('NnNote'));
59
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
60
+ ?> {{pdf_row_separator}} <?php
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo $this->__($text) . ' : ' . $value
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
+ echo $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value . '</br>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
+ echo $this->__($text) . '</br>';
91
  else:
92
  echo $this->__($text) . ' : ' . $value
93
  ?> {{pdf_row_separator}} <?php
app/design/frontend/base/default/template/novalnet/payment/method/pdf/Paypal.phtml CHANGED
@@ -27,11 +27,14 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php if ($this->getAdditionalData('NnTestOrder')) echo $this->__('Testorder'); ?>{{pdf_row_separator}}
33
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?>{{pdf_row_separator}}
34
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>{{pdf_row_separator}}
 
 
35
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>{{pdf_row_separator}}
36
  <?php
37
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php if ($this->getAdditionalData('NnTestOrder')) echo $this->__('Testorder'); ?>{{pdf_row_separator}}
34
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?>{{pdf_row_separator}}
35
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>{{pdf_row_separator}}
36
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>{{pdf_row_separator}}
37
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>{{pdf_row_separator}}
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>{{pdf_row_separator}}
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
app/design/frontend/base/default/template/novalnet/payment/method/pdf/Prepayment.phtml CHANGED
@@ -57,7 +57,8 @@ endif;
57
  echo nl2br($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b></br>';
 
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo $this->__($text) . ' : ' . $value
@@ -84,10 +85,10 @@ endif;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b></br>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<b>' . $this->__($text) . '</b></br>';
91
  else:
92
  echo $this->__($text) . ' : ' . $value
93
  ?> {{pdf_row_separator}} <?php
57
  echo nl2br($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
+ ?> {{pdf_row_separator}} <?php
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo $this->__($text) . ' : ' . $value
85
  if (preg_match("/Order No&/i", $value)):
86
  list($referenceTxt, $value) = explode('&', $value);
87
  str_replace('&', '', $referenceTxt);
88
+ echo $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value . '</br>';
89
  else:
90
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
91
+ echo $this->__($text) . '</br>';
92
  else:
93
  echo $this->__($text) . ' : ' . $value
94
  ?> {{pdf_row_separator}} <?php
app/design/frontend/default/default/template/novalnet/payment/method/info/Invoice.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/frontend/default/default/template/novalnet/payment/method/info/Paypal.phtml CHANGED
@@ -27,6 +27,7 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php
@@ -35,6 +36,8 @@ if ($_info):
35
  ?>
36
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
37
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
 
 
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php
36
  ?>
37
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
38
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
39
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>
40
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>
41
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
42
  <?php
43
  if ($this->getAdditionalData('refunded_tid')):
app/design/frontend/default/default/template/novalnet/payment/method/info/Prepayment.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/frontend/rwd/default/template/novalnet/payment/method/form/Cciframe.phtml CHANGED
@@ -48,7 +48,7 @@ foreach ($paymentRequest->getData() as $field=>$value) {
48
  }
49
 
50
  $html.= $form->toHtml();
51
- $html.="<iframe id='cc_iframe' scrolling='no' style='width:100%;height:450px;border:none;margin-left:-30%' name='cc_iframe' onload=document.getElementById('nnloader').style.display='none'></iframe></form>";
52
  $html.= '<script type="text/javascript">document.getElementById("' . $code . '").submit();</script>';
53
  $html.= '</body></html>';
54
  echo $html;
48
  }
49
 
50
  $html.= $form->toHtml();
51
+ $html.="<iframe id='cc_iframe' scrolling='no' style='width:100%;height:450px;border:none' name='cc_iframe' onload=document.getElementById('nnloader').style.display='none'></iframe></form>";
52
  $html.= '<script type="text/javascript">document.getElementById("' . $code . '").submit();</script>';
53
  $html.= '</body></html>';
54
  echo $html;
app/design/frontend/rwd/default/template/novalnet/payment/method/info/Invoice.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/creditmemo|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/design/frontend/rwd/default/template/novalnet/payment/method/info/Paypal.phtml CHANGED
@@ -27,6 +27,7 @@ $_info = $this->getInfo();
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
 
30
  if ($_info):
31
  ?>
32
  <?php
@@ -35,6 +36,8 @@ if ($_info):
35
  ?>
36
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
37
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
 
 
38
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
39
  <?php
40
  if ($this->getAdditionalData('refunded_tid')):
27
  $transactionId = $this->getAdditionalData('NnTid') ? $this->getAdditionalData('NnTid') : $_info->getLastTransId();
28
  $helper = Mage::helper('novalnet_payment');
29
  $currentTime = $this->getAdditionalData('voidCreateAt');
30
+ $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
31
  if ($_info):
32
  ?>
33
  <?php
36
  ?>
37
  <?php echo $this->htmlEscape($this->getMethod()->getTitle()) ?><br />
38
  <?php if ($transactionId) echo $this->__('Novalnet Transaction ID: %s', $helper->makeValidNumber($transactionId)) . '<br /><br>' ?>
39
+ <?php if ($nextCycleDate) echo $this->__('Next Payment Date is: %s', $nextCycleDate) . '<br /><br>' ?>
40
+ <?php if ($this->getAdditionalData('subsCancelReason')) echo $this->__('Subscription Cancellation: %s', $this->getAdditionalData('subsCancelReason')) . '<br /><br>' ?>
41
  <?php if ($this->getAdditionalData('voidTid')) echo $this->__('The transaction has been canceled on %s', $currentTime) . '<br><br>' ?>
42
  <?php
43
  if ($this->getAdditionalData('refunded_tid')):
app/design/frontend/rwd/default/template/novalnet/payment/method/info/Prepayment.phtml CHANGED
@@ -31,7 +31,6 @@ $currentTime = $this->getAdditionalData('voidCreateAt');
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
34
- $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
35
  ?>
36
  <?php if ($_info): ?>
37
  <?php
@@ -51,14 +50,14 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
51
  endforeach;
52
  endif;
53
  ?>
54
- <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl) || $recurringOrder): ?>
55
  <?php
56
  if (strlen($this->getAdditionalData('NnNote'))):
57
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
58
  echo '<br>' . ($this->getAdditionalData('NnNote'));
59
  else:
60
  $note = explode('|', $this->getAdditionalData('NnNote'));
61
- echo '<br><b>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG') . '</b>';
62
  foreach ($note as $noteValue):
63
  list($text, $value) = explode(':', $noteValue);
64
  echo '<br>' . $this->__($text) . ' : ' . $value;
@@ -84,10 +83,10 @@ $recurringOrder = $this->getAdditionalData('NnRecurringOrder') ? true : false;
84
  if (preg_match("/Order No&/i", $value)):
85
  list($referenceTxt, $value) = explode('&', $value);
86
  str_replace('&', '', $referenceTxt);
87
- echo '<br>' . $this->__($text) . ' : ' . '<b>' . $this->__($referenceTxt) . ' ' . $value . '</b>';
88
  else:
89
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
90
- echo '<br><b>' . $this->__($text) . '</b>';
91
  else:
92
  echo '<br>' . $this->__($text) . ' : ' . $value;
93
  endif;
31
  $captureTime = $this->getAdditionalData('CaptureCreateAt');
32
  $nextCycleId = $this->getAdditionalData('NnSepaParentTid') ? $this->getAdditionalData('NnSepaParentTid') : $this->getAdditionalData('NnTid');
33
  $nextCycleDate = $this->getAdditionalData('paidUntil') ? $this->getAdditionalData('paidUntil') : '';
 
34
  ?>
35
  <?php if ($_info): ?>
36
  <?php
50
  endforeach;
51
  endif;
52
  ?>
53
+ <?php if (!preg_match("/invoice|creditmemo|shipment|callback_novalnet2magento/i", $currentUrl)): ?>
54
  <?php
55
  if (strlen($this->getAdditionalData('NnNote'))):
56
  if (strstr($this->getAdditionalData('NnNote'), 'br')):
57
  echo '<br>' . ($this->getAdditionalData('NnNote'));
58
  else:
59
  $note = explode('|', $this->getAdditionalData('NnNote'));
60
+ echo '<br>' . $this->__('Please transfer the invoice amount with the following information to our payment provider Novalnet AG');
61
  foreach ($note as $noteValue):
62
  list($text, $value) = explode(':', $noteValue);
63
  echo '<br>' . $this->__($text) . ' : ' . $value;
83
  if (preg_match("/Order No&/i", $value)):
84
  list($referenceTxt, $value) = explode('&', $value);
85
  str_replace('&', '', $referenceTxt);
86
+ echo '<br>' . $this->__($text) . ' : ' . $this->__($referenceTxt) . ' ' . $value;
87
  else:
88
  if ($text == 'NN_Reference_desc1' || $text == 'NN_Reference_desc2'):
89
+ echo '<br>' . $this->__($text);
90
  else:
91
  echo '<br>' . $this->__($text) . ' : ' . $value;
92
  endif;
app/locale/de_DE/Novalnet_Payment.csv CHANGED
@@ -11,7 +11,7 @@
11
  "Enter Novalnet subscription tariff ID","Geben Sie Ihre Novalnet-abonnement-Tarif-ID ein."
12
  "Payment access key","Zahlungs-Zugriffsschlüssel"
13
  "Enter the Novalnet payment access key","Geben Sie den Novalnet-Zahlungs-Zugriffsschlüssel ein."
14
- "Set a limit for on-hold transaction","Limit für onhold-Buchungen setzen (in Cent)"
15
  "Manual checking of order description","Falls der Bestellbetrag das angegebene Limit übersteigt, wird die Transaktion ausgesetzt, bis Sie diese selbst bestätigen."
16
  "Novalnet Live Mode","Live-Modus aktivieren"
17
  "Selected payment methods will be in Live Mode","Für ausgewählten Zahlungsarten wird der Live-Modus gesetzt"
@@ -50,7 +50,7 @@
50
  "Novalnet Eps","Novalnet Eps"
51
  "Novalnet Giropay","Novalnet giropay"
52
  "Enable module","Zahlungsart aktivieren"
53
- "Title","Titel *"
54
  "Enable 3D secure","3D-Secure aktivieren"
55
  "CC-3D secure description","3D-Secure wird für Kreditkarten aktiviert. Die kartenausgebende Bank fragt vom Käufer ein Passwort ab, welches helfen soll, betrügerische Zahlungen zu verhindern. Dies kann von der kartenausgebenden Bank als Beweis verwendet werden, dass der Käufer tatsächlich der Inhaber der Kreditkarte ist. Damit soll das Risiko von Chargebacks verringert werden."
56
  "Order completion status","Abschluss-Status der Bestellung"
@@ -167,7 +167,6 @@
167
  "Gateway request error: %s","Fehler beim übertragen der Daten: %s"
168
  "Please fill in all the mandatory fields","Füllen Sie bitte alle Pflichtfelder aus."
169
  "Basic parameter not valid","Ungültige Parameter für die Händlereinstellungen"
170
- "Please enter the E-Mail Address","Ihre Emailadresse ist ungültig."
171
  "Novalnet Order Information","Novalnet Bestellinformationen"
172
  "Order-ID","Bestellnummer"
173
  "Transaction-ID","Transaktions-ID"
@@ -237,7 +236,7 @@
237
  "The transaction amount %s has been updated successfully on %s","Der Betrag der Transaktion %s wurde am %s erfolgreich geändert."
238
  "Refund reference","Referenz für die Rückerstattung"
239
  "Period for subsequent subscription cycle","Zeitraum für den folgenden Abonnementzyklus"
240
- "The period of the subsequent subscription cycle (E.g: 1d/1m/1y)","Beschreibung: Zeitraum des folgenden Abonnementzyklus (z.B. 1d/1m/1y)"
241
  "New Tid: %s for the refunded amount %s","Neue TID: der erstattete Betrag für %s ist %s"
242
  "The date should be in future","Das Datum sollte in der Zukunft liegen."
243
  "Enter your PIN","PIN eingeben."
11
  "Enter Novalnet subscription tariff ID","Geben Sie Ihre Novalnet-abonnement-Tarif-ID ein."
12
  "Payment access key","Zahlungs-Zugriffsschlüssel"
13
  "Enter the Novalnet payment access key","Geben Sie den Novalnet-Zahlungs-Zugriffsschlüssel ein."
14
+ "Set a limit for on-hold transaction","Limit für on_hold-Buchungen setzen(in Cent)"
15
  "Manual checking of order description","Falls der Bestellbetrag das angegebene Limit übersteigt, wird die Transaktion ausgesetzt, bis Sie diese selbst bestätigen."
16
  "Novalnet Live Mode","Live-Modus aktivieren"
17
  "Selected payment methods will be in Live Mode","Für ausgewählten Zahlungsarten wird der Live-Modus gesetzt"
50
  "Novalnet Eps","Novalnet Eps"
51
  "Novalnet Giropay","Novalnet giropay"
52
  "Enable module","Zahlungsart aktivieren"
53
+ "Novalnet Title","Novalnet Titel *"
54
  "Enable 3D secure","3D-Secure aktivieren"
55
  "CC-3D secure description","3D-Secure wird für Kreditkarten aktiviert. Die kartenausgebende Bank fragt vom Käufer ein Passwort ab, welches helfen soll, betrügerische Zahlungen zu verhindern. Dies kann von der kartenausgebenden Bank als Beweis verwendet werden, dass der Käufer tatsächlich der Inhaber der Kreditkarte ist. Damit soll das Risiko von Chargebacks verringert werden."
56
  "Order completion status","Abschluss-Status der Bestellung"
167
  "Gateway request error: %s","Fehler beim übertragen der Daten: %s"
168
  "Please fill in all the mandatory fields","Füllen Sie bitte alle Pflichtfelder aus."
169
  "Basic parameter not valid","Ungültige Parameter für die Händlereinstellungen"
 
170
  "Novalnet Order Information","Novalnet Bestellinformationen"
171
  "Order-ID","Bestellnummer"
172
  "Transaction-ID","Transaktions-ID"
236
  "The transaction amount %s has been updated successfully on %s","Der Betrag der Transaktion %s wurde am %s erfolgreich geändert."
237
  "Refund reference","Referenz für die Rückerstattung"
238
  "Period for subsequent subscription cycle","Zeitraum für den folgenden Abonnementzyklus"
239
+ "The period of the subsequent subscription cycle (E.g: 1d/1m/1y)","Zeitraum des folgenden Abonnementzyklus (z.B. 1d/1m/1y)"
240
  "New Tid: %s for the refunded amount %s","Neue TID: der erstattete Betrag für %s ist %s"
241
  "The date should be in future","Das Datum sollte in der Zukunft liegen."
242
  "Enter your PIN","PIN eingeben."
app/locale/en_US/Novalnet_Payment.csv CHANGED
@@ -49,7 +49,7 @@
49
  "Novalnet Eps","Novalnet Eps"
50
  "Novalnet Giropay","Novalnet giropay"
51
  "Enable module","Enable payment method"
52
- "Title","Novalnet Title *"
53
  "Enable 3D secure","Enable 3D secure"
54
  "CC-3D secure description","The 3D-Secure will be activated for credit cards. The issuing bank prompts the buyer for a password what, in turn, help to prevent a fraudulent payment. It can be used by the issuing bank as evidence that the buyer is indeed their card holder. This is intended to help decrease a risk of charge-back."
55
  "Order completion status","Order completion status"
@@ -170,7 +170,6 @@
170
  "Gateway request error: %s","Gateway request error: %s"
171
  "Please fill in all the mandatory fields","Please fill in all the mandatory fields"
172
  "Basic parameter not valid","Basic parameter not valid"
173
- "Please enter the E-Mail Address","Your E-mail address is invalid"
174
  "Novalnet Order Information","Novalnet Order Information"
175
  "Order-ID","Order-ID"
176
  "Transaction-ID","Transaction-ID"
49
  "Novalnet Eps","Novalnet Eps"
50
  "Novalnet Giropay","Novalnet giropay"
51
  "Enable module","Enable payment method"
52
+ "Novalnet Title","Novalnet Title *"
53
  "Enable 3D secure","Enable 3D secure"
54
  "CC-3D secure description","The 3D-Secure will be activated for credit cards. The issuing bank prompts the buyer for a password what, in turn, help to prevent a fraudulent payment. It can be used by the issuing bank as evidence that the buyer is indeed their card holder. This is intended to help decrease a risk of charge-back."
55
  "Order completion status","Order completion status"
170
  "Gateway request error: %s","Gateway request error: %s"
171
  "Please fill in all the mandatory fields","Please fill in all the mandatory fields"
172
  "Basic parameter not valid","Basic parameter not valid"
 
173
  "Novalnet Order Information","Novalnet Order Information"
174
  "Order-ID","Order-ID"
175
  "Transaction-ID","Transaction-ID"
js/novalnet/novalnetJquery.js CHANGED
@@ -1,2486 +1,5 @@
1
- /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
2
- //@ sourceMappingURL=jquery-1.10.2.min.map
3
- */
4
- (function(e, t) {
5
- var n, r, i = typeof t, o = e.location, a = e.document, s = a.documentElement, l = e.jQuery, u = e.$, c = {}, p = [], f = "1.10.2", d = p.concat, h = p.push, g = p.slice, m = p.indexOf, y = c.toString, v = c.hasOwnProperty, b = f.trim, x = function(e, t) {
6
- return new x.fn.init(e, t, r)
7
- }, w = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, T = /\S+/g, C = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, N = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, k = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, E = /^[\],:{}\s]*$/, S = /(?:^|:|,)(?:\s*\[)+/g, A = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, j = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, D = /^-ms-/, L = /-([\da-z])/gi, H = function(e, t) {
8
- return t.toUpperCase()
9
- }, q = function(e) {
10
- (a.addEventListener || "load" === e.type || "complete" === a.readyState) && (_(), x.ready())
11
- }, _ = function() {
12
- a.addEventListener ? (a.removeEventListener("DOMContentLoaded", q, !1), e.removeEventListener("load", q, !1)) : (a.detachEvent("onreadystatechange", q), e.detachEvent("onload", q))
13
- };
14
- x.fn = x.prototype = {jquery: f, constructor: x, init: function(e, n, r) {
15
- var i, o;
16
- if (!e)
17
- return this;
18
- if ("string" == typeof e) {
19
- if (i = "<" === e.charAt(0) && ">" === e.charAt(e.length - 1) && e.length >= 3 ? [null, e, null] : N.exec(e), !i || !i[1] && n)
20
- return!n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e);
21
- if (i[1]) {
22
- if (n = n instanceof x ? n[0] : n, x.merge(this, x.parseHTML(i[1], n && n.nodeType ? n.ownerDocument || n : a, !0)), k.test(i[1]) && x.isPlainObject(n))
23
- for (i in n)
24
- x.isFunction(this[i]) ? this[i](n[i]) : this.attr(i, n[i]);
25
- return this
26
- }
27
- if (o = a.getElementById(i[2]), o && o.parentNode) {
28
- if (o.id !== i[2])
29
- return r.find(e);
30
- this.length = 1, this[0] = o
31
- }
32
- return this.context = a, this.selector = e, this
33
- }
34
- return e.nodeType ? (this.context = this[0] = e, this.length = 1, this) : x.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, this.context = e.context), x.makeArray(e, this))
35
- }, selector: "", length: 0, toArray: function() {
36
- return g.call(this)
37
- }, get: function(e) {
38
- return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e]
39
- }, pushStack: function(e) {
40
- var t = x.merge(this.constructor(), e);
41
- return t.prevObject = this, t.context = this.context, t
42
- }, each: function(e, t) {
43
- return x.each(this, e, t)
44
- }, ready: function(e) {
45
- return x.ready.promise().done(e), this
46
- }, slice: function() {
47
- return this.pushStack(g.apply(this, arguments))
48
- }, first: function() {
49
- return this.eq(0)
50
- }, last: function() {
51
- return this.eq(-1)
52
- }, eq: function(e) {
53
- var t = this.length, n = +e + (0 > e ? t : 0);
54
- return this.pushStack(n >= 0 && t > n ? [this[n]] : [])
55
- }, map: function(e) {
56
- return this.pushStack(x.map(this, function(t, n) {
57
- return e.call(t, n, t)
58
- }))
59
- }, end: function() {
60
- return this.prevObject || this.constructor(null)
61
- }, push: h, sort: [].sort, splice: [].splice}, x.fn.init.prototype = x.fn, x.extend = x.fn.extend = function() {
62
- var e, n, r, i, o, a, s = arguments[0] || {}, l = 1, u = arguments.length, c = !1;
63
- for ("boolean" == typeof s && (c = s, s = arguments[1] || {}, l = 2), "object" == typeof s || x.isFunction(s) || (s = {}), u === l && (s = this, --l); u > l; l++)
64
- if (null != (o = arguments[l]))
65
- for (i in o)
66
- e = s[i], r = o[i], s !== r && (c && r && (x.isPlainObject(r) || (n = x.isArray(r))) ? (n ? (n = !1, a = e && x.isArray(e) ? e : []) : a = e && x.isPlainObject(e) ? e : {}, s[i] = x.extend(c, a, r)) : r !== t && (s[i] = r));
67
- return s
68
- }, x.extend({expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), noConflict: function(t) {
69
- return e.$ === x && (e.$ = u), t && e.jQuery === x && (e.jQuery = l), x
70
- }, isReady: !1, readyWait: 1, holdReady: function(e) {
71
- e ? x.readyWait++ : x.ready(!0)
72
- }, ready: function(e) {
73
- if (e === !0 ? !--x.readyWait : !x.isReady) {
74
- if (!a.body)
75
- return setTimeout(x.ready);
76
- x.isReady = !0, e !== !0 && --x.readyWait > 0 || (n.resolveWith(a, [x]), x.fn.trigger && x(a).trigger("ready").off("ready"))
77
- }
78
- }, isFunction: function(e) {
79
- return"function" === x.type(e)
80
- }, isArray: Array.isArray || function(e) {
81
- return"array" === x.type(e)
82
- }, isWindow: function(e) {
83
- return null != e && e == e.window
84
- }, isNumeric: function(e) {
85
- return!isNaN(parseFloat(e)) && isFinite(e)
86
- }, type: function(e) {
87
- return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? c[y.call(e)] || "object" : typeof e
88
- }, isPlainObject: function(e) {
89
- var n;
90
- if (!e || "object" !== x.type(e) || e.nodeType || x.isWindow(e))
91
- return!1;
92
- try {
93
- if (e.constructor && !v.call(e, "constructor") && !v.call(e.constructor.prototype, "isPrototypeOf"))
94
- return!1
95
- } catch (r) {
96
- return!1
97
- }
98
- if (x.support.ownLast)
99
- for (n in e)
100
- return v.call(e, n);
101
- for (n in e)
102
- ;
103
- return n === t || v.call(e, n)
104
- }, isEmptyObject: function(e) {
105
- var t;
106
- for (t in e)
107
- return!1;
108
- return!0
109
- }, error: function(e) {
110
- throw Error(e)
111
- }, parseHTML: function(e, t, n) {
112
- if (!e || "string" != typeof e)
113
- return null;
114
- "boolean" == typeof t && (n = t, t = !1), t = t || a;
115
- var r = k.exec(e), i = !n && [];
116
- return r ? [t.createElement(r[1])] : (r = x.buildFragment([e], t, i), i && x(i).remove(), x.merge([], r.childNodes))
117
- }, parseJSON: function(n) {
118
- return e.JSON && e.JSON.parse ? e.JSON.parse(n) : null === n ? n : "string" == typeof n && (n = x.trim(n), n && E.test(n.replace(A, "@").replace(j, "]").replace(S, ""))) ? Function("return " + n)() : (x.error("Invalid JSON: " + n), t)
119
- }, parseXML: function(n) {
120
- var r, i;
121
- if (!n || "string" != typeof n)
122
- return null;
123
- try {
124
- e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n))
125
- } catch (o) {
126
- r = t
127
- }
128
- return r && r.documentElement && !r.getElementsByTagName("parsererror").length || x.error("Invalid XML: " + n), r
129
- }, noop: function() {
130
- }, globalEval: function(t) {
131
- t && x.trim(t) && (e.execScript || function(t) {
132
- e.eval.call(e, t)
133
- })(t)
134
- }, camelCase: function(e) {
135
- return e.replace(D, "ms-").replace(L, H)
136
- }, nodeName: function(e, t) {
137
- return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
138
- }, each: function(e, t, n) {
139
- var r, i = 0, o = e.length, a = M(e);
140
- if (n) {
141
- if (a) {
142
- for (; o > i; i++)
143
- if (r = t.apply(e[i], n), r === !1)
144
- break
145
- } else
146
- for (i in e)
147
- if (r = t.apply(e[i], n), r === !1)
148
- break
149
- } else if (a) {
150
- for (; o > i; i++)
151
- if (r = t.call(e[i], i, e[i]), r === !1)
152
- break
153
- } else
154
- for (i in e)
155
- if (r = t.call(e[i], i, e[i]), r === !1)
156
- break;
157
- return e
158
- }, trim: b && !b.call("\ufeff\u00a0") ? function(e) {
159
- return null == e ? "" : b.call(e)
160
- } : function(e) {
161
- return null == e ? "" : (e + "").replace(C, "")
162
- }, makeArray: function(e, t) {
163
- var n = t || [];
164
- return null != e && (M(Object(e)) ? x.merge(n, "string" == typeof e ? [e] : e) : h.call(n, e)), n
165
- }, inArray: function(e, t, n) {
166
- var r;
167
- if (t) {
168
- if (m)
169
- return m.call(t, e, n);
170
- for (r = t.length, n = n?0 > n?Math.max(0, r + n):n:0; r > n; n++)
171
- if (n in t && t[n] === e)
172
- return n
173
- }
174
- return-1
175
- }, merge: function(e, n) {
176
- var r = n.length, i = e.length, o = 0;
177
- if ("number" == typeof r)
178
- for (; r > o; o++)
179
- e[i++] = n[o];
180
- else
181
- while (n[o] !== t)
182
- e[i++] = n[o++];
183
- return e.length = i, e
184
- }, grep: function(e, t, n) {
185
- var r, i = [], o = 0, a = e.length;
186
- for (n = !!n; a > o; o++)
187
- r = !!t(e[o], o), n !== r && i.push(e[o]);
188
- return i
189
- }, map: function(e, t, n) {
190
- var r, i = 0, o = e.length, a = M(e), s = [];
191
- if (a)
192
- for (; o > i; i++)
193
- r = t(e[i], i, n), null != r && (s[s.length] = r);
194
- else
195
- for (i in e)
196
- r = t(e[i], i, n), null != r && (s[s.length] = r);
197
- return d.apply([], s)
198
- }, guid: 1, proxy: function(e, n) {
199
- var r, i, o;
200
- return"string" == typeof n && (o = e[n], n = e, e = o), x.isFunction(e) ? (r = g.call(arguments, 2), i = function() {
201
- return e.apply(n || this, r.concat(g.call(arguments)))
202
- }, i.guid = e.guid = e.guid || x.guid++, i) : t
203
- }, access: function(e, n, r, i, o, a, s) {
204
- var l = 0, u = e.length, c = null == r;
205
- if ("object" === x.type(r)) {
206
- o = !0;
207
- for (l in r)
208
- x.access(e, n, l, r[l], !0, a, s)
209
- } else if (i !== t && (o = !0, x.isFunction(i) || (s = !0), c && (s ? (n.call(e, i), n = null) : (c = n, n = function(e, t, n) {
210
- return c.call(x(e), n)
211
- })), n))
212
- for (; u > l; l++)
213
- n(e[l], r, s ? i : i.call(e[l], l, n(e[l], r)));
214
- return o ? e : c ? n.call(e) : u ? n(e[0], r) : a
215
- }, now: function() {
216
- return(new Date).getTime()
217
- }, swap: function(e, t, n, r) {
218
- var i, o, a = {};
219
- for (o in t)
220
- a[o] = e.style[o], e.style[o] = t[o];
221
- i = n.apply(e, r || []);
222
- for (o in t)
223
- e.style[o] = a[o];
224
- return i
225
- }}), x.ready.promise = function(t) {
226
- if (!n)
227
- if (n = x.Deferred(), "complete" === a.readyState)
228
- setTimeout(x.ready);
229
- else if (a.addEventListener)
230
- a.addEventListener("DOMContentLoaded", q, !1), e.addEventListener("load", q, !1);
231
- else {
232
- a.attachEvent("onreadystatechange", q), e.attachEvent("onload", q);
233
- var r = !1;
234
- try {
235
- r = null == e.frameElement && a.documentElement
236
- } catch (i) {
237
- }
238
- r && r.doScroll && function o() {
239
- if (!x.isReady) {
240
- try {
241
- r.doScroll("left")
242
- } catch (e) {
243
- return setTimeout(o, 50)
244
- }
245
- _(), x.ready()
246
- }
247
- }()
248
- }
249
- return n.promise(t)
250
- }, x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(e, t) {
251
- c["[object " + t + "]"] = t.toLowerCase()
252
- });
253
- function M(e) {
254
- var t = e.length, n = x.type(e);
255
- return x.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e)
256
- }
257
- r = x(a), function(e, t) {
258
- var n, r, i, o, a, s, l, u, c, p, f, d, h, g, m, y, v, b = "sizzle" + -new Date, w = e.document, T = 0, C = 0, N = st(), k = st(), E = st(), S = !1, A = function(e, t) {
259
- return e === t ? (S = !0, 0) : 0
260
- }, j = typeof t, D = 1 << 31, L = {}.hasOwnProperty, H = [], q = H.pop, _ = H.push, M = H.push, O = H.slice, F = H.indexOf || function(e) {
261
- var t = 0, n = this.length;
262
- for (; n > t; t++)
263
- if (this[t] === e)
264
- return t;
265
- return-1
266
- }, B = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", P = "[\\x20\\t\\r\\n\\f]", R = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", W = R.replace("w", "w#"), $ = "\\[" + P + "*(" + R + ")" + P + "*(?:([*^$|!~]?=)" + P + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + W + ")|)|)" + P + "*\\]", I = ":(" + R + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + $.replace(3, 8) + ")*)|.*)\\)|)", z = RegExp("^" + P + "+|((?:^|[^\\\\])(?:\\\\.)*)" + P + "+$", "g"), X = RegExp("^" + P + "*," + P + "*"), U = RegExp("^" + P + "*([>+~]|" + P + ")" + P + "*"), V = RegExp(P + "*[+~]"), Y = RegExp("=" + P + "*([^\\]'\"]*)" + P + "*\\]", "g"), J = RegExp(I), G = RegExp("^" + W + "$"), Q = {ID: RegExp("^#(" + R + ")"), CLASS: RegExp("^\\.(" + R + ")"), TAG: RegExp("^(" + R.replace("w", "w*") + ")"), ATTR: RegExp("^" + $), PSEUDO: RegExp("^" + I), CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + P + "*(even|odd|(([+-]|)(\\d*)n|)" + P + "*(?:([+-]|)" + P + "*(\\d+)|))" + P + "*\\)|)", "i"), bool: RegExp("^(?:" + B + ")$", "i"), needsContext: RegExp("^" + P + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + P + "*((?:-\\d)?\\d*)" + P + "*\\)|)(?=[^-]|$)", "i")}, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, et = /^(?:input|select|textarea|button)$/i, tt = /^h\d$/i, nt = /'|\\/g, rt = RegExp("\\\\([\\da-f]{1,6}" + P + "?|(" + P + ")|.)", "ig"), it = function(e, t, n) {
267
- var r = "0x" + t - 65536;
268
- return r !== r || n ? t : 0 > r ? String.fromCharCode(r + 65536) : String.fromCharCode(55296 | r >> 10, 56320 | 1023 & r)
269
- };
270
- try {
271
- M.apply(H = O.call(w.childNodes), w.childNodes), H[w.childNodes.length].nodeType
272
- } catch (ot) {
273
- M = {apply: H.length ? function(e, t) {
274
- _.apply(e, O.call(t))
275
- } : function(e, t) {
276
- var n = e.length, r = 0;
277
- while (e[n++] = t[r++])
278
- ;
279
- e.length = n - 1
280
- }}
281
- }
282
- function at(e, t, n, i) {
283
- var o, a, s, l, u, c, d, m, y, x;
284
- if ((t ? t.ownerDocument || t : w) !== f && p(t), t = t || f, n = n || [], !e || "string" != typeof e)
285
- return n;
286
- if (1 !== (l = t.nodeType) && 9 !== l)
287
- return[];
288
- if (h && !i) {
289
- if (o = Z.exec(e))
290
- if (s = o[1]) {
291
- if (9 === l) {
292
- if (a = t.getElementById(s), !a || !a.parentNode)
293
- return n;
294
- if (a.id === s)
295
- return n.push(a), n
296
- } else if (t.ownerDocument && (a = t.ownerDocument.getElementById(s)) && v(t, a) && a.id === s)
297
- return n.push(a), n
298
- } else {
299
- if (o[2])
300
- return M.apply(n, t.getElementsByTagName(e)), n;
301
- if ((s = o[3]) && r.getElementsByClassName && t.getElementsByClassName)
302
- return M.apply(n, t.getElementsByClassName(s)), n
303
- }
304
- if (r.qsa && (!g || !g.test(e))) {
305
- if (m = d = b, y = t, x = 9 === l && e, 1 === l && "object" !== t.nodeName.toLowerCase()) {
306
- c = mt(e), (d = t.getAttribute("id")) ? m = d.replace(nt, "\\$&") : t.setAttribute("id", m), m = "[id='" + m + "'] ", u = c.length;
307
- while (u--)
308
- c[u] = m + yt(c[u]);
309
- y = V.test(e) && t.parentNode || t, x = c.join(",")
310
- }
311
- if (x)
312
- try {
313
- return M.apply(n, y.querySelectorAll(x)), n
314
- } catch (T) {
315
- } finally {
316
- d || t.removeAttribute("id")
317
- }
318
- }
319
- }
320
- return kt(e.replace(z, "$1"), t, n, i)
321
- }
322
- function st() {
323
- var e = [];
324
- function t(n, r) {
325
- return e.push(n += " ") > o.cacheLength && delete t[e.shift()], t[n] = r
326
- }
327
- return t
328
- }
329
- function lt(e) {
330
- return e[b] = !0, e
331
- }
332
- function ut(e) {
333
- var t = f.createElement("div");
334
- try {
335
- return!!e(t)
336
- } catch (n) {
337
- return!1
338
- } finally {
339
- t.parentNode && t.parentNode.removeChild(t), t = null
340
- }
341
- }
342
- function ct(e, t) {
343
- var n = e.split("|"), r = e.length;
344
- while (r--)
345
- o.attrHandle[n[r]] = t
346
- }
347
- function pt(e, t) {
348
- var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && (~t.sourceIndex || D) - (~e.sourceIndex || D);
349
- if (r)
350
- return r;
351
- if (n)
352
- while (n = n.nextSibling)
353
- if (n === t)
354
- return-1;
355
- return e ? 1 : -1
356
- }
357
- function ft(e) {
358
- return function(t) {
359
- var n = t.nodeName.toLowerCase();
360
- return"input" === n && t.type === e
361
- }
362
- }
363
- function dt(e) {
364
- return function(t) {
365
- var n = t.nodeName.toLowerCase();
366
- return("input" === n || "button" === n) && t.type === e
367
- }
368
- }
369
- function ht(e) {
370
- return lt(function(t) {
371
- return t = +t, lt(function(n, r) {
372
- var i, o = e([], n.length, t), a = o.length;
373
- while (a--)
374
- n[i = o[a]] && (n[i] = !(r[i] = n[i]))
375
- })
376
- })
377
- }
378
- s = at.isXML = function(e) {
379
- var t = e && (e.ownerDocument || e).documentElement;
380
- return t ? "HTML" !== t.nodeName : !1
381
- }, r = at.support = {}, p = at.setDocument = function(e) {
382
- var n = e ? e.ownerDocument || e : w, i = n.defaultView;
383
- return n !== f && 9 === n.nodeType && n.documentElement ? (f = n, d = n.documentElement, h = !s(n), i && i.attachEvent && i !== i.top && i.attachEvent("onbeforeunload", function() {
384
- p()
385
- }), r.attributes = ut(function(e) {
386
- return e.className = "i", !e.getAttribute("className")
387
- }), r.getElementsByTagName = ut(function(e) {
388
- return e.appendChild(n.createComment("")), !e.getElementsByTagName("*").length
389
- }), r.getElementsByClassName = ut(function(e) {
390
- return e.innerHTML = "<div class='a'></div><div class='a i'></div>", e.firstChild.className = "i", 2 === e.getElementsByClassName("i").length
391
- }), r.getById = ut(function(e) {
392
- return d.appendChild(e).id = b, !n.getElementsByName || !n.getElementsByName(b).length
393
- }), r.getById ? (o.find.ID = function(e, t) {
394
- if (typeof t.getElementById !== j && h) {
395
- var n = t.getElementById(e);
396
- return n && n.parentNode ? [n] : []
397
- }
398
- }, o.filter.ID = function(e) {
399
- var t = e.replace(rt, it);
400
- return function(e) {
401
- return e.getAttribute("id") === t
402
- }
403
- }) : (delete o.find.ID, o.filter.ID = function(e) {
404
- var t = e.replace(rt, it);
405
- return function(e) {
406
- var n = typeof e.getAttributeNode !== j && e.getAttributeNode("id");
407
- return n && n.value === t
408
- }
409
- }), o.find.TAG = r.getElementsByTagName ? function(e, n) {
410
- return typeof n.getElementsByTagName !== j ? n.getElementsByTagName(e) : t
411
- } : function(e, t) {
412
- var n, r = [], i = 0, o = t.getElementsByTagName(e);
413
- if ("*" === e) {
414
- while (n = o[i++])
415
- 1 === n.nodeType && r.push(n);
416
- return r
417
- }
418
- return o
419
- }, o.find.CLASS = r.getElementsByClassName && function(e, n) {
420
- return typeof n.getElementsByClassName !== j && h ? n.getElementsByClassName(e) : t
421
- }, m = [], g = [], (r.qsa = K.test(n.querySelectorAll)) && (ut(function(e) {
422
- e.innerHTML = "<select><option selected=''></option></select>", e.querySelectorAll("[selected]").length || g.push("\\[" + P + "*(?:value|" + B + ")"), e.querySelectorAll(":checked").length || g.push(":checked")
423
- }), ut(function(e) {
424
- var t = n.createElement("input");
425
- t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("t", ""), e.querySelectorAll("[t^='']").length && g.push("[*^$]=" + P + "*(?:''|\"\")"), e.querySelectorAll(":enabled").length || g.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), g.push(",.*:")
426
- })), (r.matchesSelector = K.test(y = d.webkitMatchesSelector || d.mozMatchesSelector || d.oMatchesSelector || d.msMatchesSelector)) && ut(function(e) {
427
- r.disconnectedMatch = y.call(e, "div"), y.call(e, "[s!='']:x"), m.push("!=", I)
428
- }), g = g.length && RegExp(g.join("|")), m = m.length && RegExp(m.join("|")), v = K.test(d.contains) || d.compareDocumentPosition ? function(e, t) {
429
- var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode;
430
- return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r)))
431
- } : function(e, t) {
432
- if (t)
433
- while (t = t.parentNode)
434
- if (t === e)
435
- return!0;
436
- return!1
437
- }, A = d.compareDocumentPosition ? function(e, t) {
438
- if (e === t)
439
- return S = !0, 0;
440
- var i = t.compareDocumentPosition && e.compareDocumentPosition && e.compareDocumentPosition(t);
441
- return i ? 1 & i || !r.sortDetached && t.compareDocumentPosition(e) === i ? e === n || v(w, e) ? -1 : t === n || v(w, t) ? 1 : c ? F.call(c, e) - F.call(c, t) : 0 : 4 & i ? -1 : 1 : e.compareDocumentPosition ? -1 : 1
442
- } : function(e, t) {
443
- var r, i = 0, o = e.parentNode, a = t.parentNode, s = [e], l = [t];
444
- if (e === t)
445
- return S = !0, 0;
446
- if (!o || !a)
447
- return e === n ? -1 : t === n ? 1 : o ? -1 : a ? 1 : c ? F.call(c, e) - F.call(c, t) : 0;
448
- if (o === a)
449
- return pt(e, t);
450
- r = e;
451
- while (r = r.parentNode)
452
- s.unshift(r);
453
- r = t;
454
- while (r = r.parentNode)
455
- l.unshift(r);
456
- while (s[i] === l[i])
457
- i++;
458
- return i ? pt(s[i], l[i]) : s[i] === w ? -1 : l[i] === w ? 1 : 0
459
- }, n) : f
460
- }, at.matches = function(e, t) {
461
- return at(e, null, null, t)
462
- }, at.matchesSelector = function(e, t) {
463
- if ((e.ownerDocument || e) !== f && p(e), t = t.replace(Y, "='$1']"), !(!r.matchesSelector || !h || m && m.test(t) || g && g.test(t)))
464
- try {
465
- var n = y.call(e, t);
466
- if (n || r.disconnectedMatch || e.document && 11 !== e.document.nodeType)
467
- return n
468
- } catch (i) {
469
- }
470
- return at(t, f, null, [e]).length > 0
471
- }, at.contains = function(e, t) {
472
- return(e.ownerDocument || e) !== f && p(e), v(e, t)
473
- }, at.attr = function(e, n) {
474
- (e.ownerDocument || e) !== f && p(e);
475
- var i = o.attrHandle[n.toLowerCase()], a = i && L.call(o.attrHandle, n.toLowerCase()) ? i(e, n, !h) : t;
476
- return a === t ? r.attributes || !h ? e.getAttribute(n) : (a = e.getAttributeNode(n)) && a.specified ? a.value : null : a
477
- }, at.error = function(e) {
478
- throw Error("Syntax error, unrecognized expression: " + e)
479
- }, at.uniqueSort = function(e) {
480
- var t, n = [], i = 0, o = 0;
481
- if (S = !r.detectDuplicates, c = !r.sortStable && e.slice(0), e.sort(A), S) {
482
- while (t = e[o++])
483
- t === e[o] && (i = n.push(o));
484
- while (i--)
485
- e.splice(n[i], 1)
486
- }
487
- return e
488
- }, a = at.getText = function(e) {
489
- var t, n = "", r = 0, i = e.nodeType;
490
- if (i) {
491
- if (1 === i || 9 === i || 11 === i) {
492
- if ("string" == typeof e.textContent)
493
- return e.textContent;
494
- for (e = e.firstChild; e; e = e.nextSibling)
495
- n += a(e)
496
- } else if (3 === i || 4 === i)
497
- return e.nodeValue
498
- } else
499
- for (; t = e[r]; r++)
500
- n += a(t);
501
- return n
502
- }, o = at.selectors = {cacheLength: 50, createPseudo: lt, match: Q, attrHandle: {}, find: {}, relative: {">": {dir: "parentNode", first: !0}, " ": {dir: "parentNode"}, "+": {dir: "previousSibling", first: !0}, "~": {dir: "previousSibling"}}, preFilter: {ATTR: function(e) {
503
- return e[1] = e[1].replace(rt, it), e[3] = (e[4] || e[5] || "").replace(rt, it), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4)
504
- }, CHILD: function(e) {
505
- return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || at.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && at.error(e[0]), e
506
- }, PSEUDO: function(e) {
507
- var n, r = !e[5] && e[2];
508
- return Q.CHILD.test(e[0]) ? null : (e[3] && e[4] !== t ? e[2] = e[4] : r && J.test(r) && (n = mt(r, !0)) && (n = r.indexOf(")", r.length - n) - r.length) && (e[0] = e[0].slice(0, n), e[2] = r.slice(0, n)), e.slice(0, 3))
509
- }}, filter: {TAG: function(e) {
510
- var t = e.replace(rt, it).toLowerCase();
511
- return"*" === e ? function() {
512
- return!0
513
- } : function(e) {
514
- return e.nodeName && e.nodeName.toLowerCase() === t
515
- }
516
- }, CLASS: function(e) {
517
- var t = N[e + " "];
518
- return t || (t = RegExp("(^|" + P + ")" + e + "(" + P + "|$)")) && N(e, function(e) {
519
- return t.test("string" == typeof e.className && e.className || typeof e.getAttribute !== j && e.getAttribute("class") || "")
520
- })
521
- }, ATTR: function(e, t, n) {
522
- return function(r) {
523
- var i = at.attr(r, e);
524
- return null == i ? "!=" === t : t ? (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i + " ").indexOf(n) > -1 : "|=" === t ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0
525
- }
526
- }, CHILD: function(e, t, n, r, i) {
527
- var o = "nth" !== e.slice(0, 3), a = "last" !== e.slice(-4), s = "of-type" === t;
528
- return 1 === r && 0 === i ? function(e) {
529
- return!!e.parentNode
530
- } : function(t, n, l) {
531
- var u, c, p, f, d, h, g = o !== a ? "nextSibling" : "previousSibling", m = t.parentNode, y = s && t.nodeName.toLowerCase(), v = !l && !s;
532
- if (m) {
533
- if (o) {
534
- while (g) {
535
- p = t;
536
- while (p = p[g])
537
- if (s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType)
538
- return!1;
539
- h = g = "only" === e && !h && "nextSibling"
540
- }
541
- return!0
542
- }
543
- if (h = [a ? m.firstChild : m.lastChild], a && v) {
544
- c = m[b] || (m[b] = {}), u = c[e] || [], d = u[0] === T && u[1], f = u[0] === T && u[2], p = d && m.childNodes[d];
545
- while (p = ++d && p && p[g] || (f = d = 0) || h.pop())
546
- if (1 === p.nodeType && ++f && p === t) {
547
- c[e] = [T, d, f];
548
- break
549
- }
550
- } else if (v && (u = (t[b] || (t[b] = {}))[e]) && u[0] === T)
551
- f = u[1];
552
- else
553
- while (p = ++d && p && p[g] || (f = d = 0) || h.pop())
554
- if ((s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) && ++f && (v && ((p[b] || (p[b] = {}))[e] = [T, f]), p === t))
555
- break;
556
- return f -= i, f === r || 0 === f % r && f / r >= 0
557
- }
558
- }
559
- }, PSEUDO: function(e, t) {
560
- var n, r = o.pseudos[e] || o.setFilters[e.toLowerCase()] || at.error("unsupported pseudo: " + e);
561
- return r[b] ? r(t) : r.length > 1 ? (n = [e, e, "", t], o.setFilters.hasOwnProperty(e.toLowerCase()) ? lt(function(e, n) {
562
- var i, o = r(e, t), a = o.length;
563
- while (a--)
564
- i = F.call(e, o[a]), e[i] = !(n[i] = o[a])
565
- }) : function(e) {
566
- return r(e, 0, n)
567
- }) : r
568
- }}, pseudos: {not: lt(function(e) {
569
- var t = [], n = [], r = l(e.replace(z, "$1"));
570
- return r[b] ? lt(function(e, t, n, i) {
571
- var o, a = r(e, null, i, []), s = e.length;
572
- while (s--)
573
- (o = a[s]) && (e[s] = !(t[s] = o))
574
- }) : function(e, i, o) {
575
- return t[0] = e, r(t, null, o, n), !n.pop()
576
- }
577
- }), has: lt(function(e) {
578
- return function(t) {
579
- return at(e, t).length > 0
580
- }
581
- }), contains: lt(function(e) {
582
- return function(t) {
583
- return(t.textContent || t.innerText || a(t)).indexOf(e) > -1
584
- }
585
- }), lang: lt(function(e) {
586
- return G.test(e || "") || at.error("unsupported lang: " + e), e = e.replace(rt, it).toLowerCase(), function(t) {
587
- var n;
588
- do
589
- if (n = h ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang"))
590
- return n = n.toLowerCase(), n === e || 0 === n.indexOf(e + "-");
591
- while ((t = t.parentNode) && 1 === t.nodeType);
592
- return!1
593
- }
594
- }), target: function(t) {
595
- var n = e.location && e.location.hash;
596
- return n && n.slice(1) === t.id
597
- }, root: function(e) {
598
- return e === d
599
- }, focus: function(e) {
600
- return e === f.activeElement && (!f.hasFocus || f.hasFocus()) && !!(e.type || e.href || ~e.tabIndex)
601
- }, enabled: function(e) {
602
- return e.disabled === !1
603
- }, disabled: function(e) {
604
- return e.disabled === !0
605
- }, checked: function(e) {
606
- var t = e.nodeName.toLowerCase();
607
- return"input" === t && !!e.checked || "option" === t && !!e.selected
608
- }, selected: function(e) {
609
- return e.parentNode && e.parentNode.selectedIndex, e.selected === !0
610
- }, empty: function(e) {
611
- for (e = e.firstChild; e; e = e.nextSibling)
612
- if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType)
613
- return!1;
614
- return!0
615
- }, parent: function(e) {
616
- return!o.pseudos.empty(e)
617
- }, header: function(e) {
618
- return tt.test(e.nodeName)
619
- }, input: function(e) {
620
- return et.test(e.nodeName)
621
- }, button: function(e) {
622
- var t = e.nodeName.toLowerCase();
623
- return"input" === t && "button" === e.type || "button" === t
624
- }, text: function(e) {
625
- var t;
626
- return"input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || t.toLowerCase() === e.type)
627
- }, first: ht(function() {
628
- return[0]
629
- }), last: ht(function(e, t) {
630
- return[t - 1]
631
- }), eq: ht(function(e, t, n) {
632
- return[0 > n ? n + t : n]
633
- }), even: ht(function(e, t) {
634
- var n = 0;
635
- for (; t > n; n += 2)
636
- e.push(n);
637
- return e
638
- }), odd: ht(function(e, t) {
639
- var n = 1;
640
- for (; t > n; n += 2)
641
- e.push(n);
642
- return e
643
- }), lt: ht(function(e, t, n) {
644
- var r = 0 > n ? n + t : n;
645
- for (; --r >= 0; )
646
- e.push(r);
647
- return e
648
- }), gt: ht(function(e, t, n) {
649
- var r = 0 > n ? n + t : n;
650
- for (; t > ++r; )
651
- e.push(r);
652
- return e
653
- })}}, o.pseudos.nth = o.pseudos.eq;
654
- for (n in{radio:!0, checkbox:!0, file:!0, password:!0, image:!0})
655
- o.pseudos[n] = ft(n);
656
- for (n in{submit:!0, reset:!0})
657
- o.pseudos[n] = dt(n);
658
- function gt() {
659
- }
660
- gt.prototype = o.filters = o.pseudos, o.setFilters = new gt;
661
- function mt(e, t) {
662
- var n, r, i, a, s, l, u, c = k[e + " "];
663
- if (c)
664
- return t ? 0 : c.slice(0);
665
- s = e, l = [], u = o.preFilter;
666
- while (s) {
667
- (!n || (r = X.exec(s))) && (r && (s = s.slice(r[0].length) || s), l.push(i = [])), n = !1, (r = U.exec(s)) && (n = r.shift(), i.push({value: n, type: r[0].replace(z, " ")}), s = s.slice(n.length));
668
- for (a in o.filter)
669
- !(r = Q[a].exec(s)) || u[a] && !(r = u[a](r)) || (n = r.shift(), i.push({value: n, type: a, matches: r}), s = s.slice(n.length));
670
- if (!n)
671
- break
672
- }
673
- return t ? s.length : s ? at.error(e) : k(e, l).slice(0)
674
- }
675
- function yt(e) {
676
- var t = 0, n = e.length, r = "";
677
- for (; n > t; t++)
678
- r += e[t].value;
679
- return r
680
- }
681
- function vt(e, t, n) {
682
- var r = t.dir, o = n && "parentNode" === r, a = C++;
683
- return t.first ? function(t, n, i) {
684
- while (t = t[r])
685
- if (1 === t.nodeType || o)
686
- return e(t, n, i)
687
- } : function(t, n, s) {
688
- var l, u, c, p = T + " " + a;
689
- if (s) {
690
- while (t = t[r])
691
- if ((1 === t.nodeType || o) && e(t, n, s))
692
- return!0
693
- } else
694
- while (t = t[r])
695
- if (1 === t.nodeType || o)
696
- if (c = t[b] || (t[b] = {}), (u = c[r]) && u[0] === p) {
697
- if ((l = u[1]) === !0 || l === i)
698
- return l === !0
699
- } else if (u = c[r] = [p], u[1] = e(t, n, s) || i, u[1] === !0)
700
- return!0
701
- }
702
- }
703
- function bt(e) {
704
- return e.length > 1 ? function(t, n, r) {
705
- var i = e.length;
706
- while (i--)
707
- if (!e[i](t, n, r))
708
- return!1;
709
- return!0
710
- } : e[0]
711
- }
712
- function xt(e, t, n, r, i) {
713
- var o, a = [], s = 0, l = e.length, u = null != t;
714
- for (; l > s; s++)
715
- (o = e[s]) && (!n || n(o, r, i)) && (a.push(o), u && t.push(s));
716
- return a
717
- }
718
- function wt(e, t, n, r, i, o) {
719
- return r && !r[b] && (r = wt(r)), i && !i[b] && (i = wt(i, o)), lt(function(o, a, s, l) {
720
- var u, c, p, f = [], d = [], h = a.length, g = o || Nt(t || "*", s.nodeType ? [s] : s, []), m = !e || !o && t ? g : xt(g, f, e, s, l), y = n ? i || (o ? e : h || r) ? [] : a : m;
721
- if (n && n(m, y, s, l), r) {
722
- u = xt(y, d), r(u, [], s, l), c = u.length;
723
- while (c--)
724
- (p = u[c]) && (y[d[c]] = !(m[d[c]] = p))
725
- }
726
- if (o) {
727
- if (i || e) {
728
- if (i) {
729
- u = [], c = y.length;
730
- while (c--)
731
- (p = y[c]) && u.push(m[c] = p);
732
- i(null, y = [], u, l)
733
- }
734
- c = y.length;
735
- while (c--)
736
- (p = y[c]) && (u = i ? F.call(o, p) : f[c]) > -1 && (o[u] = !(a[u] = p))
737
- }
738
- } else
739
- y = xt(y === a ? y.splice(h, y.length) : y), i ? i(null, a, y, l) : M.apply(a, y)
740
- })
741
- }
742
- function Tt(e) {
743
- var t, n, r, i = e.length, a = o.relative[e[0].type], s = a || o.relative[" "], l = a ? 1 : 0, c = vt(function(e) {
744
- return e === t
745
- }, s, !0), p = vt(function(e) {
746
- return F.call(t, e) > -1
747
- }, s, !0), f = [function(e, n, r) {
748
- return!a && (r || n !== u) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r))
749
- }];
750
- for (; i > l; l++)
751
- if (n = o.relative[e[l].type])
752
- f = [vt(bt(f), n)];
753
- else {
754
- if (n = o.filter[e[l].type].apply(null, e[l].matches), n[b]) {
755
- for (r = ++l; i > r; r++)
756
- if (o.relative[e[r].type])
757
- break;
758
- return wt(l > 1 && bt(f), l > 1 && yt(e.slice(0, l - 1).concat({value: " " === e[l - 2].type ? "*" : ""})).replace(z, "$1"), n, r > l && Tt(e.slice(l, r)), i > r && Tt(e = e.slice(r)), i > r && yt(e))
759
- }
760
- f.push(n)
761
- }
762
- return bt(f)
763
- }
764
- function Ct(e, t) {
765
- var n = 0, r = t.length > 0, a = e.length > 0, s = function(s, l, c, p, d) {
766
- var h, g, m, y = [], v = 0, b = "0", x = s && [], w = null != d, C = u, N = s || a && o.find.TAG("*", d && l.parentNode || l), k = T += null == C ? 1 : Math.random() || .1;
767
- for (w && (u = l !== f && l, i = n); null != (h = N[b]); b++) {
768
- if (a && h) {
769
- g = 0;
770
- while (m = e[g++])
771
- if (m(h, l, c)) {
772
- p.push(h);
773
- break
774
- }
775
- w && (T = k, i = ++n)
776
- }
777
- r && ((h = !m && h) && v--, s && x.push(h))
778
- }
779
- if (v += b, r && b !== v) {
780
- g = 0;
781
- while (m = t[g++])
782
- m(x, y, l, c);
783
- if (s) {
784
- if (v > 0)
785
- while (b--)
786
- x[b] || y[b] || (y[b] = q.call(p));
787
- y = xt(y)
788
- }
789
- M.apply(p, y), w && !s && y.length > 0 && v + t.length > 1 && at.uniqueSort(p)
790
- }
791
- return w && (T = k, u = C), x
792
- };
793
- return r ? lt(s) : s
794
- }
795
- l = at.compile = function(e, t) {
796
- var n, r = [], i = [], o = E[e + " "];
797
- if (!o) {
798
- t || (t = mt(e)), n = t.length;
799
- while (n--)
800
- o = Tt(t[n]), o[b] ? r.push(o) : i.push(o);
801
- o = E(e, Ct(i, r))
802
- }
803
- return o
804
- };
805
- function Nt(e, t, n) {
806
- var r = 0, i = t.length;
807
- for (; i > r; r++)
808
- at(e, t[r], n);
809
- return n
810
- }
811
- function kt(e, t, n, i) {
812
- var a, s, u, c, p, f = mt(e);
813
- if (!i && 1 === f.length) {
814
- if (s = f[0] = f[0].slice(0), s.length > 2 && "ID" === (u = s[0]).type && r.getById && 9 === t.nodeType && h && o.relative[s[1].type]) {
815
- if (t = (o.find.ID(u.matches[0].replace(rt, it), t) || [])[0], !t)
816
- return n;
817
- e = e.slice(s.shift().value.length)
818
- }
819
- a = Q.needsContext.test(e) ? 0 : s.length;
820
- while (a--) {
821
- if (u = s[a], o.relative[c = u.type])
822
- break;
823
- if ((p = o.find[c]) && (i = p(u.matches[0].replace(rt, it), V.test(s[0].type) && t.parentNode || t))) {
824
- if (s.splice(a, 1), e = i.length && yt(s), !e)
825
- return M.apply(n, i), n;
826
- break
827
- }
828
- }
829
- }
830
- return l(e, f)(i, t, !h, n, V.test(e)), n
831
- }
832
- r.sortStable = b.split("").sort(A).join("") === b, r.detectDuplicates = S, p(), r.sortDetached = ut(function(e) {
833
- return 1 & e.compareDocumentPosition(f.createElement("div"))
834
- }), ut(function(e) {
835
- return e.innerHTML = "<a href='#'></a>", "#" === e.firstChild.getAttribute("href")
836
- }) || ct("type|href|height|width", function(e, n, r) {
837
- return r ? t : e.getAttribute(n, "type" === n.toLowerCase() ? 1 : 2)
838
- }), r.attributes && ut(function(e) {
839
- return e.innerHTML = "<input/>", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value")
840
- }) || ct("value", function(e, n, r) {
841
- return r || "input" !== e.nodeName.toLowerCase() ? t : e.defaultValue
842
- }), ut(function(e) {
843
- return null == e.getAttribute("disabled")
844
- }) || ct(B, function(e, n, r) {
845
- var i;
846
- return r ? t : (i = e.getAttributeNode(n)) && i.specified ? i.value : e[n] === !0 ? n.toLowerCase() : null
847
- }), x.find = at, x.expr = at.selectors, x.expr[":"] = x.expr.pseudos, x.unique = at.uniqueSort, x.text = at.getText, x.isXMLDoc = at.isXML, x.contains = at.contains
848
- }(e);
849
- var O = {};
850
- function F(e) {
851
- var t = O[e] = {};
852
- return x.each(e.match(T) || [], function(e, n) {
853
- t[n] = !0
854
- }), t
855
- }
856
- x.Callbacks = function(e) {
857
- e = "string" == typeof e ? O[e] || F(e) : x.extend({}, e);
858
- var n, r, i, o, a, s, l = [], u = !e.once && [], c = function(t) {
859
- for (r = e.memory && t, i = !0, a = s || 0, s = 0, o = l.length, n = !0; l && o > a; a++)
860
- if (l[a].apply(t[0], t[1]) === !1 && e.stopOnFalse) {
861
- r = !1;
862
- break
863
- }
864
- n = !1, l && (u ? u.length && c(u.shift()) : r ? l = [] : p.disable())
865
- }, p = {add: function() {
866
- if (l) {
867
- var t = l.length;
868
- (function i(t) {
869
- x.each(t, function(t, n) {
870
- var r = x.type(n);
871
- "function" === r ? e.unique && p.has(n) || l.push(n) : n && n.length && "string" !== r && i(n)
872
- })
873
- })(arguments), n ? o = l.length : r && (s = t, c(r))
874
- }
875
- return this
876
- }, remove: function() {
877
- return l && x.each(arguments, function(e, t) {
878
- var r;
879
- while ((r = x.inArray(t, l, r)) > - 1)
880
- l.splice(r, 1), n && (o >= r && o--, a >= r && a--)
881
- }), this
882
- }, has: function(e) {
883
- return e ? x.inArray(e, l) > -1 : !(!l || !l.length)
884
- }, empty: function() {
885
- return l = [], o = 0, this
886
- }, disable: function() {
887
- return l = u = r = t, this
888
- }, disabled: function() {
889
- return!l
890
- }, lock: function() {
891
- return u = t, r || p.disable(), this
892
- }, locked: function() {
893
- return!u
894
- }, fireWith: function(e, t) {
895
- return!l || i && !u || (t = t || [], t = [e, t.slice ? t.slice() : t], n ? u.push(t) : c(t)), this
896
- }, fire: function() {
897
- return p.fireWith(this, arguments), this
898
- }, fired: function() {
899
- return!!i
900
- }};
901
- return p
902
- }, x.extend({Deferred: function(e) {
903
- var t = [["resolve", "done", x.Callbacks("once memory"), "resolved"], ["reject", "fail", x.Callbacks("once memory"), "rejected"], ["notify", "progress", x.Callbacks("memory")]], n = "pending", r = {state: function() {
904
- return n
905
- }, always: function() {
906
- return i.done(arguments).fail(arguments), this
907
- }, then: function() {
908
- var e = arguments;
909
- return x.Deferred(function(n) {
910
- x.each(t, function(t, o) {
911
- var a = o[0], s = x.isFunction(e[t]) && e[t];
912
- i[o[1]](function() {
913
- var e = s && s.apply(this, arguments);
914
- e && x.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[a + "With"](this === r ? n.promise() : this, s ? [e] : arguments)
915
- })
916
- }), e = null
917
- }).promise()
918
- }, promise: function(e) {
919
- return null != e ? x.extend(e, r) : r
920
- }}, i = {};
921
- return r.pipe = r.then, x.each(t, function(e, o) {
922
- var a = o[2], s = o[3];
923
- r[o[1]] = a.add, s && a.add(function() {
924
- n = s
925
- }, t[1 ^ e][2].disable, t[2][2].lock), i[o[0]] = function() {
926
- return i[o[0] + "With"](this === i ? r : this, arguments), this
927
- }, i[o[0] + "With"] = a.fireWith
928
- }), r.promise(i), e && e.call(i, i), i
929
- }, when: function(e) {
930
- var t = 0, n = g.call(arguments), r = n.length, i = 1 !== r || e && x.isFunction(e.promise) ? r : 0, o = 1 === i ? e : x.Deferred(), a = function(e, t, n) {
931
- return function(r) {
932
- t[e] = this, n[e] = arguments.length > 1 ? g.call(arguments) : r, n === s ? o.notifyWith(t, n) : --i || o.resolveWith(t, n)
933
- }
934
- }, s, l, u;
935
- if (r > 1)
936
- for (s = Array(r), l = Array(r), u = Array(r); r > t; t++)
937
- n[t] && x.isFunction(n[t].promise) ? n[t].promise().done(a(t, u, n)).fail(o.reject).progress(a(t, l, s)) : --i;
938
- return i || o.resolveWith(u, n), o.promise()
939
- }}), x.support = function(t) {
940
- var n, r, o, s, l, u, c, p, f, d = a.createElement("div");
941
- if (d.setAttribute("className", "t"), d.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", n = d.getElementsByTagName("*") || [], r = d.getElementsByTagName("a")[0], !r || !r.style || !n.length)
942
- return t;
943
- s = a.createElement("select"), u = s.appendChild(a.createElement("option")), o = d.getElementsByTagName("input")[0], r.style.cssText = "top:1px;float:left;opacity:.5", t.getSetAttribute = "t" !== d.className, t.leadingWhitespace = 3 === d.firstChild.nodeType, t.tbody = !d.getElementsByTagName("tbody").length, t.htmlSerialize = !!d.getElementsByTagName("link").length, t.style = /top/.test(r.getAttribute("style")), t.hrefNormalized = "/a" === r.getAttribute("href"), t.opacity = /^0.5/.test(r.style.opacity), t.cssFloat = !!r.style.cssFloat, t.checkOn = !!o.value, t.optSelected = u.selected, t.enctype = !!a.createElement("form").enctype, t.html5Clone = "<:nav></:nav>" !== a.createElement("nav").cloneNode(!0).outerHTML, t.inlineBlockNeedsLayout = !1, t.shrinkWrapBlocks = !1, t.pixelPosition = !1, t.deleteExpando = !0, t.noCloneEvent = !0, t.reliableMarginRight = !0, t.boxSizingReliable = !0, o.checked = !0, t.noCloneChecked = o.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !u.disabled;
944
- try {
945
- delete d.test
946
- } catch (h) {
947
- t.deleteExpando = !1
948
- }
949
- o = a.createElement("input"), o.setAttribute("value", ""), t.input = "" === o.getAttribute("value"), o.value = "t", o.setAttribute("type", "radio"), t.radioValue = "t" === o.value, o.setAttribute("checked", "t"), o.setAttribute("name", "t"), l = a.createDocumentFragment(), l.appendChild(o), t.appendChecked = o.checked, t.checkClone = l.cloneNode(!0).cloneNode(!0).lastChild.checked, d.attachEvent && (d.attachEvent("onclick", function() {
950
- t.noCloneEvent = !1
951
- }), d.cloneNode(!0).click());
952
- for (f in{submit:!0, change:!0, focusin:!0})
953
- d.setAttribute(c = "on" + f, "t"), t[f + "Bubbles"] = c in e || d.attributes[c].expando === !1;
954
- d.style.backgroundClip = "content-box", d.cloneNode(!0).style.backgroundClip = "", t.clearCloneStyle = "content-box" === d.style.backgroundClip;
955
- for (f in x(t))
956
- break;
957
- return t.ownLast = "0" !== f, x(function() {
958
- var n, r, o, s = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", l = a.getElementsByTagName("body")[0];
959
- l && (n = a.createElement("div"), n.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", l.appendChild(n).appendChild(d), d.innerHTML = "<table><tr><td></td><td>t</td></tr></table>", o = d.getElementsByTagName("td"), o[0].style.cssText = "padding:0;margin:0;border:0;display:none", p = 0 === o[0].offsetHeight, o[0].style.display = "", o[1].style.display = "none", t.reliableHiddenOffsets = p && 0 === o[0].offsetHeight, d.innerHTML = "", d.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", x.swap(l, null != l.style.zoom ? {zoom: 1} : {}, function() {
960
- t.boxSizing = 4 === d.offsetWidth
961
- }), e.getComputedStyle && (t.pixelPosition = "1%" !== (e.getComputedStyle(d, null) || {}).top, t.boxSizingReliable = "4px" === (e.getComputedStyle(d, null) || {width: "4px"}).width, r = d.appendChild(a.createElement("div")), r.style.cssText = d.style.cssText = s, r.style.marginRight = r.style.width = "0", d.style.width = "1px", t.reliableMarginRight = !parseFloat((e.getComputedStyle(r, null) || {}).marginRight)), typeof d.style.zoom !== i && (d.innerHTML = "", d.style.cssText = s + "width:1px;padding:1px;display:inline;zoom:1", t.inlineBlockNeedsLayout = 3 === d.offsetWidth, d.style.display = "block", d.innerHTML = "<div></div>", d.firstChild.style.width = "5px", t.shrinkWrapBlocks = 3 !== d.offsetWidth, t.inlineBlockNeedsLayout && (l.style.zoom = 1)), l.removeChild(n), n = d = o = r = null)
962
- }), n = s = l = u = r = o = null, t
963
- }({});
964
- var B = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, P = /([A-Z])/g;
965
- function R(e, n, r, i) {
966
- if (x.acceptData(e)) {
967
- var o, a, s = x.expando, l = e.nodeType, u = l ? x.cache : e, c = l ? e[s] : e[s] && s;
968
- if (c && u[c] && (i || u[c].data) || r !== t || "string" != typeof n)
969
- return c || (c = l ? e[s] = p.pop() || x.guid++ : s), u[c] || (u[c] = l ? {} : {toJSON: x.noop}), ("object" == typeof n || "function" == typeof n) && (i ? u[c] = x.extend(u[c], n) : u[c].data = x.extend(u[c].data, n)), a = u[c], i || (a.data || (a.data = {}), a = a.data), r !== t && (a[x.camelCase(n)] = r), "string" == typeof n ? (o = a[n], null == o && (o = a[x.camelCase(n)])) : o = a, o
970
- }
971
- }
972
- function W(e, t, n) {
973
- if (x.acceptData(e)) {
974
- var r, i, o = e.nodeType, a = o ? x.cache : e, s = o ? e[x.expando] : x.expando;
975
- if (a[s]) {
976
- if (t && (r = n ? a[s] : a[s].data)) {
977
- x.isArray(t) ? t = t.concat(x.map(t, x.camelCase)) : t in r ? t = [t] : (t = x.camelCase(t), t = t in r ? [t] : t.split(" ")), i = t.length;
978
- while (i--)
979
- delete r[t[i]];
980
- if (n ? !I(r) : !x.isEmptyObject(r))
981
- return
982
- }
983
- (n || (delete a[s].data, I(a[s]))) && (o ? x.cleanData([e], !0) : x.support.deleteExpando || a != a.window ? delete a[s] : a[s] = null)
984
- }
985
- }
986
- }
987
- x.extend({cache: {}, noData: {applet: !0, embed: !0, object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"}, hasData: function(e) {
988
- return e = e.nodeType ? x.cache[e[x.expando]] : e[x.expando], !!e && !I(e)
989
- }, data: function(e, t, n) {
990
- return R(e, t, n)
991
- }, removeData: function(e, t) {
992
- return W(e, t)
993
- }, _data: function(e, t, n) {
994
- return R(e, t, n, !0)
995
- }, _removeData: function(e, t) {
996
- return W(e, t, !0)
997
- }, acceptData: function(e) {
998
- if (e.nodeType && 1 !== e.nodeType && 9 !== e.nodeType)
999
- return!1;
1000
- var t = e.nodeName && x.noData[e.nodeName.toLowerCase()];
1001
- return!t || t !== !0 && e.getAttribute("classid") === t
1002
- }}), x.fn.extend({data: function(e, n) {
1003
- var r, i, o = null, a = 0, s = this[0];
1004
- if (e === t) {
1005
- if (this.length && (o = x.data(s), 1 === s.nodeType && !x._data(s, "parsedAttrs"))) {
1006
- for (r = s.attributes; r.length > a; a++)
1007
- i = r[a].name, 0 === i.indexOf("data-") && (i = x.camelCase(i.slice(5)), $(s, i, o[i]));
1008
- x._data(s, "parsedAttrs", !0)
1009
- }
1010
- return o
1011
- }
1012
- return"object" == typeof e ? this.each(function() {
1013
- x.data(this, e)
1014
- }) : arguments.length > 1 ? this.each(function() {
1015
- x.data(this, e, n)
1016
- }) : s ? $(s, e, x.data(s, e)) : null
1017
- }, removeData: function(e) {
1018
- return this.each(function() {
1019
- x.removeData(this, e)
1020
- })
1021
- }});
1022
- function $(e, n, r) {
1023
- if (r === t && 1 === e.nodeType) {
1024
- var i = "data-" + n.replace(P, "-$1").toLowerCase();
1025
- if (r = e.getAttribute(i), "string" == typeof r) {
1026
- try {
1027
- r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : B.test(r) ? x.parseJSON(r) : r
1028
- } catch (o) {
1029
- }
1030
- x.data(e, n, r)
1031
- } else
1032
- r = t
1033
- }
1034
- return r
1035
- }
1036
- function I(e) {
1037
- var t;
1038
- for (t in e)
1039
- if (("data" !== t || !x.isEmptyObject(e[t])) && "toJSON" !== t)
1040
- return!1;
1041
- return!0
1042
- }
1043
- x.extend({queue: function(e, n, r) {
1044
- var i;
1045
- return e ? (n = (n || "fx") + "queue", i = x._data(e, n), r && (!i || x.isArray(r) ? i = x._data(e, n, x.makeArray(r)) : i.push(r)), i || []) : t
1046
- }, dequeue: function(e, t) {
1047
- t = t || "fx";
1048
- var n = x.queue(e, t), r = n.length, i = n.shift(), o = x._queueHooks(e, t), a = function() {
1049
- x.dequeue(e, t)
1050
- };
1051
- "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, a, o)), !r && o && o.empty.fire()
1052
- }, _queueHooks: function(e, t) {
1053
- var n = t + "queueHooks";
1054
- return x._data(e, n) || x._data(e, n, {empty: x.Callbacks("once memory").add(function() {
1055
- x._removeData(e, t + "queue"), x._removeData(e, n)
1056
- })})
1057
- }}), x.fn.extend({queue: function(e, n) {
1058
- var r = 2;
1059
- return"string" != typeof e && (n = e, e = "fx", r--), r > arguments.length ? x.queue(this[0], e) : n === t ? this : this.each(function() {
1060
- var t = x.queue(this, e, n);
1061
- x._queueHooks(this, e), "fx" === e && "inprogress" !== t[0] && x.dequeue(this, e)
1062
- })
1063
- }, dequeue: function(e) {
1064
- return this.each(function() {
1065
- x.dequeue(this, e)
1066
- })
1067
- }, delay: function(e, t) {
1068
- return e = x.fx ? x.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function(t, n) {
1069
- var r = setTimeout(t, e);
1070
- n.stop = function() {
1071
- clearTimeout(r)
1072
- }
1073
- })
1074
- }, clearQueue: function(e) {
1075
- return this.queue(e || "fx", [])
1076
- }, promise: function(e, n) {
1077
- var r, i = 1, o = x.Deferred(), a = this, s = this.length, l = function() {
1078
- --i || o.resolveWith(a, [a])
1079
- };
1080
- "string" != typeof e && (n = e, e = t), e = e || "fx";
1081
- while (s--)
1082
- r = x._data(a[s], e + "queueHooks"), r && r.empty && (i++, r.empty.add(l));
1083
- return l(), o.promise(n)
1084
- }});
1085
- var z, X, U = /[\t\r\n\f]/g, V = /\r/g, Y = /^(?:input|select|textarea|button|object)$/i, J = /^(?:a|area)$/i, G = /^(?:checked|selected)$/i, Q = x.support.getSetAttribute, K = x.support.input;
1086
- x.fn.extend({attr: function(e, t) {
1087
- return x.access(this, x.attr, e, t, arguments.length > 1)
1088
- }, removeAttr: function(e) {
1089
- return this.each(function() {
1090
- x.removeAttr(this, e)
1091
- })
1092
- }, prop: function(e, t) {
1093
- return x.access(this, x.prop, e, t, arguments.length > 1)
1094
- }, removeProp: function(e) {
1095
- return e = x.propFix[e] || e, this.each(function() {
1096
- try {
1097
- this[e] = t, delete this[e]
1098
- } catch (n) {
1099
- }
1100
- })
1101
- }, addClass: function(e) {
1102
- var t, n, r, i, o, a = 0, s = this.length, l = "string" == typeof e && e;
1103
- if (x.isFunction(e))
1104
- return this.each(function(t) {
1105
- x(this).addClass(e.call(this, t, this.className))
1106
- });
1107
- if (l)
1108
- for (t = (e || "").match(T) || []; s > a; a++)
1109
- if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(U, " ") : " ")) {
1110
- o = 0;
1111
- while (i = t[o++])
1112
- 0 > r.indexOf(" " + i + " ") && (r += i + " ");
1113
- n.className = x.trim(r)
1114
- }
1115
- return this
1116
- }, removeClass: function(e) {
1117
- var t, n, r, i, o, a = 0, s = this.length, l = 0 === arguments.length || "string" == typeof e && e;
1118
- if (x.isFunction(e))
1119
- return this.each(function(t) {
1120
- x(this).removeClass(e.call(this, t, this.className))
1121
- });
1122
- if (l)
1123
- for (t = (e || "").match(T) || []; s > a; a++)
1124
- if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(U, " ") : "")) {
1125
- o = 0;
1126
- while (i = t[o++])
1127
- while (r.indexOf(" " + i + " ") >= 0)
1128
- r = r.replace(" " + i + " ", " ");
1129
- n.className = e ? x.trim(r) : ""
1130
- }
1131
- return this
1132
- }, toggleClass: function(e, t) {
1133
- var n = typeof e;
1134
- return"boolean" == typeof t && "string" === n ? t ? this.addClass(e) : this.removeClass(e) : x.isFunction(e) ? this.each(function(n) {
1135
- x(this).toggleClass(e.call(this, n, this.className, t), t)
1136
- }) : this.each(function() {
1137
- if ("string" === n) {
1138
- var t, r = 0, o = x(this), a = e.match(T) || [];
1139
- while (t = a[r++])
1140
- o.hasClass(t) ? o.removeClass(t) : o.addClass(t)
1141
- } else
1142
- (n === i || "boolean" === n) && (this.className && x._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : x._data(this, "__className__") || "")
1143
- })
1144
- }, hasClass: function(e) {
1145
- var t = " " + e + " ", n = 0, r = this.length;
1146
- for (; r > n; n++)
1147
- if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(U, " ").indexOf(t) >= 0)
1148
- return!0;
1149
- return!1
1150
- }, val: function(e) {
1151
- var n, r, i, o = this[0];
1152
- {
1153
- if (arguments.length)
1154
- return i = x.isFunction(e), this.each(function(n) {
1155
- var o;
1156
- 1 === this.nodeType && (o = i ? e.call(this, n, x(this).val()) : e, null == o ? o = "" : "number" == typeof o ? o += "" : x.isArray(o) && (o = x.map(o, function(e) {
1157
- return null == e ? "" : e + ""
1158
- })), r = x.valHooks[this.type] || x.valHooks[this.nodeName.toLowerCase()], r && "set"in r && r.set(this, o, "value") !== t || (this.value = o))
1159
- });
1160
- if (o)
1161
- return r = x.valHooks[o.type] || x.valHooks[o.nodeName.toLowerCase()], r && "get"in r && (n = r.get(o, "value")) !== t ? n : (n = o.value, "string" == typeof n ? n.replace(V, "") : null == n ? "" : n)
1162
- }
1163
- }}), x.extend({valHooks: {option: {get: function(e) {
1164
- var t = x.find.attr(e, "value");
1165
- return null != t ? t : e.text
1166
- }}, select: {get: function(e) {
1167
- var t, n, r = e.options, i = e.selectedIndex, o = "select-one" === e.type || 0 > i, a = o ? null : [], s = o ? i + 1 : r.length, l = 0 > i ? s : o ? i : 0;
1168
- for (; s > l; l++)
1169
- if (n = r[l], !(!n.selected && l !== i || (x.support.optDisabled ? n.disabled : null !== n.getAttribute("disabled")) || n.parentNode.disabled && x.nodeName(n.parentNode, "optgroup"))) {
1170
- if (t = x(n).val(), o)
1171
- return t;
1172
- a.push(t)
1173
- }
1174
- return a
1175
- }, set: function(e, t) {
1176
- var n, r, i = e.options, o = x.makeArray(t), a = i.length;
1177
- while (a--)
1178
- r = i[a], (r.selected = x.inArray(x(r).val(), o) >= 0) && (n = !0);
1179
- return n || (e.selectedIndex = -1), o
1180
- }}}, attr: function(e, n, r) {
1181
- var o, a, s = e.nodeType;
1182
- if (e && 3 !== s && 8 !== s && 2 !== s)
1183
- return typeof e.getAttribute === i ? x.prop(e, n, r) : (1 === s && x.isXMLDoc(e) || (n = n.toLowerCase(), o = x.attrHooks[n] || (x.expr.match.bool.test(n) ? X : z)), r === t ? o && "get"in o && null !== (a = o.get(e, n)) ? a : (a = x.find.attr(e, n), null == a ? t : a) : null !== r ? o && "set"in o && (a = o.set(e, r, n)) !== t ? a : (e.setAttribute(n, r + ""), r) : (x.removeAttr(e, n), t))
1184
- }, removeAttr: function(e, t) {
1185
- var n, r, i = 0, o = t && t.match(T);
1186
- if (o && 1 === e.nodeType)
1187
- while (n = o[i++])
1188
- r = x.propFix[n] || n, x.expr.match.bool.test(n) ? K && Q || !G.test(n) ? e[r] = !1 : e[x.camelCase("default-" + n)] = e[r] = !1 : x.attr(e, n, ""), e.removeAttribute(Q ? n : r)
1189
- }, attrHooks: {type: {set: function(e, t) {
1190
- if (!x.support.radioValue && "radio" === t && x.nodeName(e, "input")) {
1191
- var n = e.value;
1192
- return e.setAttribute("type", t), n && (e.value = n), t
1193
- }
1194
- }}}, propFix: {"for": "htmlFor", "class": "className"}, prop: function(e, n, r) {
1195
- var i, o, a, s = e.nodeType;
1196
- if (e && 3 !== s && 8 !== s && 2 !== s)
1197
- return a = 1 !== s || !x.isXMLDoc(e), a && (n = x.propFix[n] || n, o = x.propHooks[n]), r !== t ? o && "set"in o && (i = o.set(e, r, n)) !== t ? i : e[n] = r : o && "get"in o && null !== (i = o.get(e, n)) ? i : e[n]
1198
- }, propHooks: {tabIndex: {get: function(e) {
1199
- var t = x.find.attr(e, "tabindex");
1200
- return t ? parseInt(t, 10) : Y.test(e.nodeName) || J.test(e.nodeName) && e.href ? 0 : -1
1201
- }}}}), X = {set: function(e, t, n) {
1202
- return t === !1 ? x.removeAttr(e, n) : K && Q || !G.test(n) ? e.setAttribute(!Q && x.propFix[n] || n, n) : e[x.camelCase("default-" + n)] = e[n] = !0, n
1203
- }}, x.each(x.expr.match.bool.source.match(/\w+/g), function(e, n) {
1204
- var r = x.expr.attrHandle[n] || x.find.attr;
1205
- x.expr.attrHandle[n] = K && Q || !G.test(n) ? function(e, n, i) {
1206
- var o = x.expr.attrHandle[n], a = i ? t : (x.expr.attrHandle[n] = t) != r(e, n, i) ? n.toLowerCase() : null;
1207
- return x.expr.attrHandle[n] = o, a
1208
- } : function(e, n, r) {
1209
- return r ? t : e[x.camelCase("default-" + n)] ? n.toLowerCase() : null
1210
- }
1211
- }), K && Q || (x.attrHooks.value = {set: function(e, n, r) {
1212
- return x.nodeName(e, "input") ? (e.defaultValue = n, t) : z && z.set(e, n, r)
1213
- }}), Q || (z = {set: function(e, n, r) {
1214
- var i = e.getAttributeNode(r);
1215
- return i || e.setAttributeNode(i = e.ownerDocument.createAttribute(r)), i.value = n += "", "value" === r || n === e.getAttribute(r) ? n : t
1216
- }}, x.expr.attrHandle.id = x.expr.attrHandle.name = x.expr.attrHandle.coords = function(e, n, r) {
1217
- var i;
1218
- return r ? t : (i = e.getAttributeNode(n)) && "" !== i.value ? i.value : null
1219
- }, x.valHooks.button = {get: function(e, n) {
1220
- var r = e.getAttributeNode(n);
1221
- return r && r.specified ? r.value : t
1222
- }, set: z.set}, x.attrHooks.contenteditable = {set: function(e, t, n) {
1223
- z.set(e, "" === t ? !1 : t, n)
1224
- }}, x.each(["width", "height"], function(e, n) {
1225
- x.attrHooks[n] = {set: function(e, r) {
1226
- return"" === r ? (e.setAttribute(n, "auto"), r) : t
1227
- }}
1228
- })), x.support.hrefNormalized || x.each(["href", "src"], function(e, t) {
1229
- x.propHooks[t] = {get: function(e) {
1230
- return e.getAttribute(t, 4)
1231
- }}
1232
- }), x.support.style || (x.attrHooks.style = {get: function(e) {
1233
- return e.style.cssText || t
1234
- }, set: function(e, t) {
1235
- return e.style.cssText = t + ""
1236
- }}), x.support.optSelected || (x.propHooks.selected = {get: function(e) {
1237
- var t = e.parentNode;
1238
- return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null
1239
- }}), x.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() {
1240
- x.propFix[this.toLowerCase()] = this
1241
- }), x.support.enctype || (x.propFix.enctype = "encoding"), x.each(["radio", "checkbox"], function() {
1242
- x.valHooks[this] = {set: function(e, n) {
1243
- return x.isArray(n) ? e.checked = x.inArray(x(e).val(), n) >= 0 : t
1244
- }}, x.support.checkOn || (x.valHooks[this].get = function(e) {
1245
- return null === e.getAttribute("value") ? "on" : e.value
1246
- })
1247
- });
1248
- var Z = /^(?:input|select|textarea)$/i, et = /^key/, tt = /^(?:mouse|contextmenu)|click/, nt = /^(?:focusinfocus|focusoutblur)$/, rt = /^([^.]*)(?:\.(.+)|)$/;
1249
- function it() {
1250
- return!0
1251
- }
1252
- function ot() {
1253
- return!1
1254
- }
1255
- function at() {
1256
- try {
1257
- return a.activeElement
1258
- } catch (e) {
1259
- }
1260
- }
1261
- x.event = {global: {}, add: function(e, n, r, o, a) {
1262
- var s, l, u, c, p, f, d, h, g, m, y, v = x._data(e);
1263
- if (v) {
1264
- r.handler && (c = r, r = c.handler, a = c.selector), r.guid || (r.guid = x.guid++), (l = v.events) || (l = v.events = {}), (f = v.handle) || (f = v.handle = function(e) {
1265
- return typeof x === i || e && x.event.triggered === e.type ? t : x.event.dispatch.apply(f.elem, arguments)
1266
- }, f.elem = e), n = (n || "").match(T) || [""], u = n.length;
1267
- while (u--)
1268
- s = rt.exec(n[u]) || [], g = y = s[1], m = (s[2] || "").split(".").sort(), g && (p = x.event.special[g] || {}, g = (a ? p.delegateType : p.bindType) || g, p = x.event.special[g] || {}, d = x.extend({type: g, origType: y, data: o, handler: r, guid: r.guid, selector: a, needsContext: a && x.expr.match.needsContext.test(a), namespace: m.join(".")}, c), (h = l[g]) || (h = l[g] = [], h.delegateCount = 0, p.setup && p.setup.call(e, o, m, f) !== !1 || (e.addEventListener ? e.addEventListener(g, f, !1) : e.attachEvent && e.attachEvent("on" + g, f))), p.add && (p.add.call(e, d), d.handler.guid || (d.handler.guid = r.guid)), a ? h.splice(h.delegateCount++, 0, d) : h.push(d), x.event.global[g] = !0);
1269
- e = null
1270
- }
1271
- }, remove: function(e, t, n, r, i) {
1272
- var o, a, s, l, u, c, p, f, d, h, g, m = x.hasData(e) && x._data(e);
1273
- if (m && (c = m.events)) {
1274
- t = (t || "").match(T) || [""], u = t.length;
1275
- while (u--)
1276
- if (s = rt.exec(t[u]) || [], d = g = s[1], h = (s[2] || "").split(".").sort(), d) {
1277
- p = x.event.special[d] || {}, d = (r ? p.delegateType : p.bindType) || d, f = c[d] || [], s = s[2] && RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), l = o = f.length;
1278
- while (o--)
1279
- a = f[o], !i && g !== a.origType || n && n.guid !== a.guid || s && !s.test(a.namespace) || r && r !== a.selector && ("**" !== r || !a.selector) || (f.splice(o, 1), a.selector && f.delegateCount--, p.remove && p.remove.call(e, a));
1280
- l && !f.length && (p.teardown && p.teardown.call(e, h, m.handle) !== !1 || x.removeEvent(e, d, m.handle), delete c[d])
1281
- } else
1282
- for (d in c)
1283
- x.event.remove(e, d + t[u], n, r, !0);
1284
- x.isEmptyObject(c) && (delete m.handle, x._removeData(e, "events"))
1285
- }
1286
- }, trigger: function(n, r, i, o) {
1287
- var s, l, u, c, p, f, d, h = [i || a], g = v.call(n, "type") ? n.type : n, m = v.call(n, "namespace") ? n.namespace.split(".") : [];
1288
- if (u = f = i = i || a, 3 !== i.nodeType && 8 !== i.nodeType && !nt.test(g + x.event.triggered) && (g.indexOf(".") >= 0 && (m = g.split("."), g = m.shift(), m.sort()), l = 0 > g.indexOf(":") && "on" + g, n = n[x.expando] ? n : new x.Event(g, "object" == typeof n && n), n.isTrigger = o ? 2 : 3, n.namespace = m.join("."), n.namespace_re = n.namespace ? RegExp("(^|\\.)" + m.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, n.result = t, n.target || (n.target = i), r = null == r ? [n] : x.makeArray(r, [n]), p = x.event.special[g] || {}, o || !p.trigger || p.trigger.apply(i, r) !== !1)) {
1289
- if (!o && !p.noBubble && !x.isWindow(i)) {
1290
- for (c = p.delegateType || g, nt.test(c + g) || (u = u.parentNode); u; u = u.parentNode)
1291
- h.push(u), f = u;
1292
- f === (i.ownerDocument || a) && h.push(f.defaultView || f.parentWindow || e)
1293
- }
1294
- d = 0;
1295
- while ((u = h[d++]) && !n.isPropagationStopped())
1296
- n.type = d > 1 ? c : p.bindType || g, s = (x._data(u, "events") || {})[n.type] && x._data(u, "handle"), s && s.apply(u, r), s = l && u[l], s && x.acceptData(u) && s.apply && s.apply(u, r) === !1 && n.preventDefault();
1297
- if (n.type = g, !o && !n.isDefaultPrevented() && (!p._default || p._default.apply(h.pop(), r) === !1) && x.acceptData(i) && l && i[g] && !x.isWindow(i)) {
1298
- f = i[l], f && (i[l] = null), x.event.triggered = g;
1299
- try {
1300
- i[g]()
1301
- } catch (y) {
1302
- }
1303
- x.event.triggered = t, f && (i[l] = f)
1304
- }
1305
- return n.result
1306
- }
1307
- }, dispatch: function(e) {
1308
- e = x.event.fix(e);
1309
- var n, r, i, o, a, s = [], l = g.call(arguments), u = (x._data(this, "events") || {})[e.type] || [], c = x.event.special[e.type] || {};
1310
- if (l[0] = e, e.delegateTarget = this, !c.preDispatch || c.preDispatch.call(this, e) !== !1) {
1311
- s = x.event.handlers.call(this, e, u), n = 0;
1312
- while ((o = s[n++]) && !e.isPropagationStopped()) {
1313
- e.currentTarget = o.elem, a = 0;
1314
- while ((i = o.handlers[a++]) && !e.isImmediatePropagationStopped())
1315
- (!e.namespace_re || e.namespace_re.test(i.namespace)) && (e.handleObj = i, e.data = i.data, r = ((x.event.special[i.origType] || {}).handle || i.handler).apply(o.elem, l), r !== t && (e.result = r) === !1 && (e.preventDefault(), e.stopPropagation()))
1316
- }
1317
- return c.postDispatch && c.postDispatch.call(this, e), e.result
1318
- }
1319
- }, handlers: function(e, n) {
1320
- var r, i, o, a, s = [], l = n.delegateCount, u = e.target;
1321
- if (l && u.nodeType && (!e.button || "click" !== e.type))
1322
- for (; u != this; u = u.parentNode || this)
1323
- if (1 === u.nodeType && (u.disabled !== !0 || "click" !== e.type)) {
1324
- for (o = [], a = 0; l > a; a++)
1325
- i = n[a], r = i.selector + " ", o[r] === t && (o[r] = i.needsContext ? x(r, this).index(u) >= 0 : x.find(r, this, null, [u]).length), o[r] && o.push(i);
1326
- o.length && s.push({elem: u, handlers: o})
1327
- }
1328
- return n.length > l && s.push({elem: this, handlers: n.slice(l)}), s
1329
- }, fix: function(e) {
1330
- if (e[x.expando])
1331
- return e;
1332
- var t, n, r, i = e.type, o = e, s = this.fixHooks[i];
1333
- s || (this.fixHooks[i] = s = tt.test(i) ? this.mouseHooks : et.test(i) ? this.keyHooks : {}), r = s.props ? this.props.concat(s.props) : this.props, e = new x.Event(o), t = r.length;
1334
- while (t--)
1335
- n = r[t], e[n] = o[n];
1336
- return e.target || (e.target = o.srcElement || a), 3 === e.target.nodeType && (e.target = e.target.parentNode), e.metaKey = !!e.metaKey, s.filter ? s.filter(e, o) : e
1337
- }, props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: {props: "char charCode key keyCode".split(" "), filter: function(e, t) {
1338
- return null == e.which && (e.which = null != t.charCode ? t.charCode : t.keyCode), e
1339
- }}, mouseHooks: {props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function(e, n) {
1340
- var r, i, o, s = n.button, l = n.fromElement;
1341
- return null == e.pageX && null != n.clientX && (i = e.target.ownerDocument || a, o = i.documentElement, r = i.body, e.pageX = n.clientX + (o && o.scrollLeft || r && r.scrollLeft || 0) - (o && o.clientLeft || r && r.clientLeft || 0), e.pageY = n.clientY + (o && o.scrollTop || r && r.scrollTop || 0) - (o && o.clientTop || r && r.clientTop || 0)), !e.relatedTarget && l && (e.relatedTarget = l === e.target ? n.toElement : l), e.which || s === t || (e.which = 1 & s ? 1 : 2 & s ? 3 : 4 & s ? 2 : 0), e
1342
- }}, special: {load: {noBubble: !0}, focus: {trigger: function() {
1343
- if (this !== at() && this.focus)
1344
- try {
1345
- return this.focus(), !1
1346
- } catch (e) {
1347
- }
1348
- }, delegateType: "focusin"}, blur: {trigger: function() {
1349
- return this === at() && this.blur ? (this.blur(), !1) : t
1350
- }, delegateType: "focusout"}, click: {trigger: function() {
1351
- return x.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : t
1352
- }, _default: function(e) {
1353
- return x.nodeName(e.target, "a")
1354
- }}, beforeunload: {postDispatch: function(e) {
1355
- e.result !== t && (e.originalEvent.returnValue = e.result)
1356
- }}}, simulate: function(e, t, n, r) {
1357
- var i = x.extend(new x.Event, n, {type: e, isSimulated: !0, originalEvent: {}});
1358
- r ? x.event.trigger(i, null, t) : x.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault()
1359
- }}, x.removeEvent = a.removeEventListener ? function(e, t, n) {
1360
- e.removeEventListener && e.removeEventListener(t, n, !1)
1361
- } : function(e, t, n) {
1362
- var r = "on" + t;
1363
- e.detachEvent && (typeof e[r] === i && (e[r] = null), e.detachEvent(r, n))
1364
- }, x.Event = function(e, n) {
1365
- return this instanceof x.Event ? (e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? it : ot) : this.type = e, n && x.extend(this, n), this.timeStamp = e && e.timeStamp || x.now(), this[x.expando] = !0, t) : new x.Event(e, n)
1366
- }, x.Event.prototype = {isDefaultPrevented: ot, isPropagationStopped: ot, isImmediatePropagationStopped: ot, preventDefault: function() {
1367
- var e = this.originalEvent;
1368
- this.isDefaultPrevented = it, e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1)
1369
- }, stopPropagation: function() {
1370
- var e = this.originalEvent;
1371
- this.isPropagationStopped = it, e && (e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0)
1372
- }, stopImmediatePropagation: function() {
1373
- this.isImmediatePropagationStopped = it, this.stopPropagation()
1374
- }}, x.each({mouseenter: "mouseover", mouseleave: "mouseout"}, function(e, t) {
1375
- x.event.special[e] = {delegateType: t, bindType: t, handle: function(e) {
1376
- var n, r = this, i = e.relatedTarget, o = e.handleObj;
1377
- return(!i || i !== r && !x.contains(r, i)) && (e.type = o.origType, n = o.handler.apply(this, arguments), e.type = t), n
1378
- }}
1379
- }), x.support.submitBubbles || (x.event.special.submit = {setup: function() {
1380
- return x.nodeName(this, "form") ? !1 : (x.event.add(this, "click._submit keypress._submit", function(e) {
1381
- var n = e.target, r = x.nodeName(n, "input") || x.nodeName(n, "button") ? n.form : t;
1382
- r && !x._data(r, "submitBubbles") && (x.event.add(r, "submit._submit", function(e) {
1383
- e._submit_bubble = !0
1384
- }), x._data(r, "submitBubbles", !0))
1385
- }), t)
1386
- }, postDispatch: function(e) {
1387
- e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && x.event.simulate("submit", this.parentNode, e, !0))
1388
- }, teardown: function() {
1389
- return x.nodeName(this, "form") ? !1 : (x.event.remove(this, "._submit"), t)
1390
- }}), x.support.changeBubbles || (x.event.special.change = {setup: function() {
1391
- return Z.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (x.event.add(this, "propertychange._change", function(e) {
1392
- "checked" === e.originalEvent.propertyName && (this._just_changed = !0)
1393
- }), x.event.add(this, "click._change", function(e) {
1394
- this._just_changed && !e.isTrigger && (this._just_changed = !1), x.event.simulate("change", this, e, !0)
1395
- })), !1) : (x.event.add(this, "beforeactivate._change", function(e) {
1396
- var t = e.target;
1397
- Z.test(t.nodeName) && !x._data(t, "changeBubbles") && (x.event.add(t, "change._change", function(e) {
1398
- !this.parentNode || e.isSimulated || e.isTrigger || x.event.simulate("change", this.parentNode, e, !0)
1399
- }), x._data(t, "changeBubbles", !0))
1400
- }), t)
1401
- }, handle: function(e) {
1402
- var n = e.target;
1403
- return this !== n || e.isSimulated || e.isTrigger || "radio" !== n.type && "checkbox" !== n.type ? e.handleObj.handler.apply(this, arguments) : t
1404
- }, teardown: function() {
1405
- return x.event.remove(this, "._change"), !Z.test(this.nodeName)
1406
- }}), x.support.focusinBubbles || x.each({focus: "focusin", blur: "focusout"}, function(e, t) {
1407
- var n = 0, r = function(e) {
1408
- x.event.simulate(t, e.target, x.event.fix(e), !0)
1409
- };
1410
- x.event.special[t] = {setup: function() {
1411
- 0 === n++ && a.addEventListener(e, r, !0)
1412
- }, teardown: function() {
1413
- 0 === --n && a.removeEventListener(e, r, !0)
1414
- }}
1415
- }), x.fn.extend({on: function(e, n, r, i, o) {
1416
- var a, s;
1417
- if ("object" == typeof e) {
1418
- "string" != typeof n && (r = r || n, n = t);
1419
- for (a in e)
1420
- this.on(a, n, r, e[a], o);
1421
- return this
1422
- }
1423
- if (null == r && null == i ? (i = n, r = n = t) : null == i && ("string" == typeof n ? (i = r, r = t) : (i = r, r = n, n = t)), i === !1)
1424
- i = ot;
1425
- else if (!i)
1426
- return this;
1427
- return 1 === o && (s = i, i = function(e) {
1428
- return x().off(e), s.apply(this, arguments)
1429
- }, i.guid = s.guid || (s.guid = x.guid++)), this.each(function() {
1430
- x.event.add(this, e, i, r, n)
1431
- })
1432
- }, one: function(e, t, n, r) {
1433
- return this.on(e, t, n, r, 1)
1434
- }, off: function(e, n, r) {
1435
- var i, o;
1436
- if (e && e.preventDefault && e.handleObj)
1437
- return i = e.handleObj, x(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), this;
1438
- if ("object" == typeof e) {
1439
- for (o in e)
1440
- this.off(o, n, e[o]);
1441
- return this
1442
- }
1443
- return(n === !1 || "function" == typeof n) && (r = n, n = t), r === !1 && (r = ot), this.each(function() {
1444
- x.event.remove(this, e, r, n)
1445
- })
1446
- }, trigger: function(e, t) {
1447
- return this.each(function() {
1448
- x.event.trigger(e, t, this)
1449
- })
1450
- }, triggerHandler: function(e, n) {
1451
- var r = this[0];
1452
- return r ? x.event.trigger(e, n, r, !0) : t
1453
- }});
1454
- var st = /^.[^:#\[\.,]*$/, lt = /^(?:parents|prev(?:Until|All))/, ut = x.expr.match.needsContext, ct = {children: !0, contents: !0, next: !0, prev: !0};
1455
- x.fn.extend({find: function(e) {
1456
- var t, n = [], r = this, i = r.length;
1457
- if ("string" != typeof e)
1458
- return this.pushStack(x(e).filter(function() {
1459
- for (t = 0; i > t; t++)
1460
- if (x.contains(r[t], this))
1461
- return!0
1462
- }));
1463
- for (t = 0; i > t; t++)
1464
- x.find(e, r[t], n);
1465
- return n = this.pushStack(i > 1 ? x.unique(n) : n), n.selector = this.selector ? this.selector + " " + e : e, n
1466
- }, has: function(e) {
1467
- var t, n = x(e, this), r = n.length;
1468
- return this.filter(function() {
1469
- for (t = 0; r > t; t++)
1470
- if (x.contains(this, n[t]))
1471
- return!0
1472
- })
1473
- }, not: function(e) {
1474
- return this.pushStack(ft(this, e || [], !0))
1475
- }, filter: function(e) {
1476
- return this.pushStack(ft(this, e || [], !1))
1477
- }, is: function(e) {
1478
- return!!ft(this, "string" == typeof e && ut.test(e) ? x(e) : e || [], !1).length
1479
- }, closest: function(e, t) {
1480
- var n, r = 0, i = this.length, o = [], a = ut.test(e) || "string" != typeof e ? x(e, t || this.context) : 0;
1481
- for (; i > r; r++)
1482
- for (n = this[r]; n && n !== t; n = n.parentNode)
1483
- if (11 > n.nodeType && (a ? a.index(n) > -1 : 1 === n.nodeType && x.find.matchesSelector(n, e))) {
1484
- n = o.push(n);
1485
- break
1486
- }
1487
- return this.pushStack(o.length > 1 ? x.unique(o) : o)
1488
- }, index: function(e) {
1489
- return e ? "string" == typeof e ? x.inArray(this[0], x(e)) : x.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
1490
- }, add: function(e, t) {
1491
- var n = "string" == typeof e ? x(e, t) : x.makeArray(e && e.nodeType ? [e] : e), r = x.merge(this.get(), n);
1492
- return this.pushStack(x.unique(r))
1493
- }, addBack: function(e) {
1494
- return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
1495
- }});
1496
- function pt(e, t) {
1497
- do
1498
- e = e[t];
1499
- while (e && 1 !== e.nodeType);
1500
- return e
1501
- }
1502
- x.each({parent: function(e) {
1503
- var t = e.parentNode;
1504
- return t && 11 !== t.nodeType ? t : null
1505
- }, parents: function(e) {
1506
- return x.dir(e, "parentNode")
1507
- }, parentsUntil: function(e, t, n) {
1508
- return x.dir(e, "parentNode", n)
1509
- }, next: function(e) {
1510
- return pt(e, "nextSibling")
1511
- }, prev: function(e) {
1512
- return pt(e, "previousSibling")
1513
- }, nextAll: function(e) {
1514
- return x.dir(e, "nextSibling")
1515
- }, prevAll: function(e) {
1516
- return x.dir(e, "previousSibling")
1517
- }, nextUntil: function(e, t, n) {
1518
- return x.dir(e, "nextSibling", n)
1519
- }, prevUntil: function(e, t, n) {
1520
- return x.dir(e, "previousSibling", n)
1521
- }, siblings: function(e) {
1522
- return x.sibling((e.parentNode || {}).firstChild, e)
1523
- }, children: function(e) {
1524
- return x.sibling(e.firstChild)
1525
- }, contents: function(e) {
1526
- return x.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : x.merge([], e.childNodes)
1527
- }}, function(e, t) {
1528
- x.fn[e] = function(n, r) {
1529
- var i = x.map(this, t, n);
1530
- return"Until" !== e.slice(-5) && (r = n), r && "string" == typeof r && (i = x.filter(r, i)), this.length > 1 && (ct[e] || (i = x.unique(i)), lt.test(e) && (i = i.reverse())), this.pushStack(i)
1531
- }
1532
- }), x.extend({filter: function(e, t, n) {
1533
- var r = t[0];
1534
- return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? x.find.matchesSelector(r, e) ? [r] : [] : x.find.matches(e, x.grep(t, function(e) {
1535
- return 1 === e.nodeType
1536
- }))
1537
- }, dir: function(e, n, r) {
1538
- var i = [], o = e[n];
1539
- while (o && 9 !== o.nodeType && (r === t || 1 !== o.nodeType || !x(o).is(r)))
1540
- 1 === o.nodeType && i.push(o), o = o[n];
1541
- return i
1542
- }, sibling: function(e, t) {
1543
- var n = [];
1544
- for (; e; e = e.nextSibling)
1545
- 1 === e.nodeType && e !== t && n.push(e);
1546
- return n
1547
- }});
1548
- function ft(e, t, n) {
1549
- if (x.isFunction(t))
1550
- return x.grep(e, function(e, r) {
1551
- return!!t.call(e, r, e) !== n
1552
- });
1553
- if (t.nodeType)
1554
- return x.grep(e, function(e) {
1555
- return e === t !== n
1556
- });
1557
- if ("string" == typeof t) {
1558
- if (st.test(t))
1559
- return x.filter(t, e, n);
1560
- t = x.filter(t, e)
1561
- }
1562
- return x.grep(e, function(e) {
1563
- return x.inArray(e, t) >= 0 !== n
1564
- })
1565
- }
1566
- function dt(e) {
1567
- var t = ht.split("|"), n = e.createDocumentFragment();
1568
- if (n.createElement)
1569
- while (t.length)
1570
- n.createElement(t.pop());
1571
- return n
1572
- }
1573
- var ht = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", gt = / jQuery\d+="(?:null|\d+)"/g, mt = RegExp("<(?:" + ht + ")[\\s/>]", "i"), yt = /^\s+/, vt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, bt = /<([\w:]+)/, xt = /<tbody/i, wt = /<|&#?\w+;/, Tt = /<(?:script|style|link)/i, Ct = /^(?:checkbox|radio)$/i, Nt = /checked\s*(?:[^=]|=\s*.checked.)/i, kt = /^$|\/(?:java|ecma)script/i, Et = /^true\/(.*)/, St = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, At = {option: [1, "<select multiple='multiple'>", "</select>"], legend: [1, "<fieldset>", "</fieldset>"], area: [1, "<map>", "</map>"], param: [1, "<object>", "</object>"], thead: [1, "<table>", "</table>"], tr: [2, "<table><tbody>", "</tbody></table>"], col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _default: x.support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]}, jt = dt(a), Dt = jt.appendChild(a.createElement("div"));
1574
- At.optgroup = At.option, At.tbody = At.tfoot = At.colgroup = At.caption = At.thead, At.th = At.td, x.fn.extend({text: function(e) {
1575
- return x.access(this, function(e) {
1576
- return e === t ? x.text(this) : this.empty().append((this[0] && this[0].ownerDocument || a).createTextNode(e))
1577
- }, null, e, arguments.length)
1578
- }, append: function() {
1579
- return this.domManip(arguments, function(e) {
1580
- if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
1581
- var t = Lt(this, e);
1582
- t.appendChild(e)
1583
- }
1584
- })
1585
- }, prepend: function() {
1586
- return this.domManip(arguments, function(e) {
1587
- if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
1588
- var t = Lt(this, e);
1589
- t.insertBefore(e, t.firstChild)
1590
- }
1591
- })
1592
- }, before: function() {
1593
- return this.domManip(arguments, function(e) {
1594
- this.parentNode && this.parentNode.insertBefore(e, this)
1595
- })
1596
- }, after: function() {
1597
- return this.domManip(arguments, function(e) {
1598
- this.parentNode && this.parentNode.insertBefore(e, this.nextSibling)
1599
- })
1600
- }, remove: function(e, t) {
1601
- var n, r = e ? x.filter(e, this) : this, i = 0;
1602
- for (; null != (n = r[i]); i++)
1603
- t || 1 !== n.nodeType || x.cleanData(Ft(n)), n.parentNode && (t && x.contains(n.ownerDocument, n) && _t(Ft(n, "script")), n.parentNode.removeChild(n));
1604
- return this
1605
- }, empty: function() {
1606
- var e, t = 0;
1607
- for (; null != (e = this[t]); t++) {
1608
- 1 === e.nodeType && x.cleanData(Ft(e, !1));
1609
- while (e.firstChild)
1610
- e.removeChild(e.firstChild);
1611
- e.options && x.nodeName(e, "select") && (e.options.length = 0)
1612
- }
1613
- return this
1614
- }, clone: function(e, t) {
1615
- return e = null == e ? !1 : e, t = null == t ? e : t, this.map(function() {
1616
- return x.clone(this, e, t)
1617
- })
1618
- }, html: function(e) {
1619
- return x.access(this, function(e) {
1620
- var n = this[0] || {}, r = 0, i = this.length;
1621
- if (e === t)
1622
- return 1 === n.nodeType ? n.innerHTML.replace(gt, "") : t;
1623
- if (!("string" != typeof e || Tt.test(e) || !x.support.htmlSerialize && mt.test(e) || !x.support.leadingWhitespace && yt.test(e) || At[(bt.exec(e) || ["", ""])[1].toLowerCase()])) {
1624
- e = e.replace(vt, "<$1></$2>");
1625
- try {
1626
- for (; i > r; r++)
1627
- n = this[r] || {}, 1 === n.nodeType && (x.cleanData(Ft(n, !1)), n.innerHTML = e);
1628
- n = 0
1629
- } catch (o) {
1630
- }
1631
- }
1632
- n && this.empty().append(e)
1633
- }, null, e, arguments.length)
1634
- }, replaceWith: function() {
1635
- var e = x.map(this, function(e) {
1636
- return[e.nextSibling, e.parentNode]
1637
- }), t = 0;
1638
- return this.domManip(arguments, function(n) {
1639
- var r = e[t++], i = e[t++];
1640
- i && (r && r.parentNode !== i && (r = this.nextSibling), x(this).remove(), i.insertBefore(n, r))
1641
- }, !0), t ? this : this.remove()
1642
- }, detach: function(e) {
1643
- return this.remove(e, !0)
1644
- }, domManip: function(e, t, n) {
1645
- e = d.apply([], e);
1646
- var r, i, o, a, s, l, u = 0, c = this.length, p = this, f = c - 1, h = e[0], g = x.isFunction(h);
1647
- if (g || !(1 >= c || "string" != typeof h || x.support.checkClone) && Nt.test(h))
1648
- return this.each(function(r) {
1649
- var i = p.eq(r);
1650
- g && (e[0] = h.call(this, r, i.html())), i.domManip(e, t, n)
1651
- });
1652
- if (c && (l = x.buildFragment(e, this[0].ownerDocument, !1, !n && this), r = l.firstChild, 1 === l.childNodes.length && (l = r), r)) {
1653
- for (a = x.map(Ft(l, "script"), Ht), o = a.length; c > u; u++)
1654
- i = l, u !== f && (i = x.clone(i, !0, !0), o && x.merge(a, Ft(i, "script"))), t.call(this[u], i, u);
1655
- if (o)
1656
- for (s = a[a.length - 1].ownerDocument, x.map(a, qt), u = 0; o > u; u++)
1657
- i = a[u], kt.test(i.type || "") && !x._data(i, "globalEval") && x.contains(s, i) && (i.src ? x._evalUrl(i.src) : x.globalEval((i.text || i.textContent || i.innerHTML || "").replace(St, "")));
1658
- l = r = null
1659
- }
1660
- return this
1661
- }});
1662
- function Lt(e, t) {
1663
- return x.nodeName(e, "table") && x.nodeName(1 === t.nodeType ? t : t.firstChild, "tr") ? e.getElementsByTagName("tbody")[0] || e.appendChild(e.ownerDocument.createElement("tbody")) : e
1664
- }
1665
- function Ht(e) {
1666
- return e.type = (null !== x.find.attr(e, "type")) + "/" + e.type, e
1667
- }
1668
- function qt(e) {
1669
- var t = Et.exec(e.type);
1670
- return t ? e.type = t[1] : e.removeAttribute("type"), e
1671
- }
1672
- function _t(e, t) {
1673
- var n, r = 0;
1674
- for (; null != (n = e[r]); r++)
1675
- x._data(n, "globalEval", !t || x._data(t[r], "globalEval"))
1676
- }
1677
- function Mt(e, t) {
1678
- if (1 === t.nodeType && x.hasData(e)) {
1679
- var n, r, i, o = x._data(e), a = x._data(t, o), s = o.events;
1680
- if (s) {
1681
- delete a.handle, a.events = {};
1682
- for (n in s)
1683
- for (r = 0, i = s[n].length; i > r; r++)
1684
- x.event.add(t, n, s[n][r])
1685
- }
1686
- a.data && (a.data = x.extend({}, a.data))
1687
- }
1688
- }
1689
- function Ot(e, t) {
1690
- var n, r, i;
1691
- if (1 === t.nodeType) {
1692
- if (n = t.nodeName.toLowerCase(), !x.support.noCloneEvent && t[x.expando]) {
1693
- i = x._data(t);
1694
- for (r in i.events)
1695
- x.removeEvent(t, r, i.handle);
1696
- t.removeAttribute(x.expando)
1697
- }
1698
- "script" === n && t.text !== e.text ? (Ht(t).text = e.text, qt(t)) : "object" === n ? (t.parentNode && (t.outerHTML = e.outerHTML), x.support.html5Clone && e.innerHTML && !x.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : "input" === n && Ct.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : "option" === n ? t.defaultSelected = t.selected = e.defaultSelected : ("input" === n || "textarea" === n) && (t.defaultValue = e.defaultValue)
1699
- }
1700
- }
1701
- x.each({appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith"}, function(e, t) {
1702
- x.fn[e] = function(e) {
1703
- var n, r = 0, i = [], o = x(e), a = o.length - 1;
1704
- for (; a >= r; r++)
1705
- n = r === a ? this : this.clone(!0), x(o[r])[t](n), h.apply(i, n.get());
1706
- return this.pushStack(i)
1707
- }
1708
- });
1709
- function Ft(e, n) {
1710
- var r, o, a = 0, s = typeof e.getElementsByTagName !== i ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== i ? e.querySelectorAll(n || "*") : t;
1711
- if (!s)
1712
- for (s = [], r = e.childNodes || e; null != (o = r[a]); a++)
1713
- !n || x.nodeName(o, n) ? s.push(o) : x.merge(s, Ft(o, n));
1714
- return n === t || n && x.nodeName(e, n) ? x.merge([e], s) : s
1715
- }
1716
- function Bt(e) {
1717
- Ct.test(e.type) && (e.defaultChecked = e.checked)
1718
- }
1719
- x.extend({clone: function(e, t, n) {
1720
- var r, i, o, a, s, l = x.contains(e.ownerDocument, e);
1721
- if (x.support.html5Clone || x.isXMLDoc(e) || !mt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (Dt.innerHTML = e.outerHTML, Dt.removeChild(o = Dt.firstChild)), !(x.support.noCloneEvent && x.support.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || x.isXMLDoc(e)))
1722
- for (r = Ft(o), s = Ft(e), a = 0; null != (i = s[a]); ++a)
1723
- r[a] && Ot(i, r[a]);
1724
- if (t)
1725
- if (n)
1726
- for (s = s || Ft(e), r = r || Ft(o), a = 0; null != (i = s[a]); a++)
1727
- Mt(i, r[a]);
1728
- else
1729
- Mt(e, o);
1730
- return r = Ft(o, "script"), r.length > 0 && _t(r, !l && Ft(e, "script")), r = s = i = null, o
1731
- }, buildFragment: function(e, t, n, r) {
1732
- var i, o, a, s, l, u, c, p = e.length, f = dt(t), d = [], h = 0;
1733
- for (; p > h; h++)
1734
- if (o = e[h], o || 0 === o)
1735
- if ("object" === x.type(o))
1736
- x.merge(d, o.nodeType ? [o] : o);
1737
- else if (wt.test(o)) {
1738
- s = s || f.appendChild(t.createElement("div")), l = (bt.exec(o) || ["", ""])[1].toLowerCase(), c = At[l] || At._default, s.innerHTML = c[1] + o.replace(vt, "<$1></$2>") + c[2], i = c[0];
1739
- while (i--)
1740
- s = s.lastChild;
1741
- if (!x.support.leadingWhitespace && yt.test(o) && d.push(t.createTextNode(yt.exec(o)[0])), !x.support.tbody) {
1742
- o = "table" !== l || xt.test(o) ? "<table>" !== c[1] || xt.test(o) ? 0 : s : s.firstChild, i = o && o.childNodes.length;
1743
- while (i--)
1744
- x.nodeName(u = o.childNodes[i], "tbody") && !u.childNodes.length && o.removeChild(u)
1745
- }
1746
- x.merge(d, s.childNodes), s.textContent = "";
1747
- while (s.firstChild)
1748
- s.removeChild(s.firstChild);
1749
- s = f.lastChild
1750
- } else
1751
- d.push(t.createTextNode(o));
1752
- s && f.removeChild(s), x.support.appendChecked || x.grep(Ft(d, "input"), Bt), h = 0;
1753
- while (o = d[h++])
1754
- if ((!r || -1 === x.inArray(o, r)) && (a = x.contains(o.ownerDocument, o), s = Ft(f.appendChild(o), "script"), a && _t(s), n)) {
1755
- i = 0;
1756
- while (o = s[i++])
1757
- kt.test(o.type || "") && n.push(o)
1758
- }
1759
- return s = null, f
1760
- }, cleanData: function(e, t) {
1761
- var n, r, o, a, s = 0, l = x.expando, u = x.cache, c = x.support.deleteExpando, f = x.event.special;
1762
- for (; null != (n = e[s]); s++)
1763
- if ((t || x.acceptData(n)) && (o = n[l], a = o && u[o])) {
1764
- if (a.events)
1765
- for (r in a.events)
1766
- f[r] ? x.event.remove(n, r) : x.removeEvent(n, r, a.handle);
1767
- u[o] && (delete u[o], c ? delete n[l] : typeof n.removeAttribute !== i ? n.removeAttribute(l) : n[l] = null, p.push(o))
1768
- }
1769
- }, _evalUrl: function(e) {
1770
- return x.ajax({url: e, type: "GET", dataType: "script", async: !1, global: !1, "throws": !0})
1771
- }}), x.fn.extend({wrapAll: function(e) {
1772
- if (x.isFunction(e))
1773
- return this.each(function(t) {
1774
- x(this).wrapAll(e.call(this, t))
1775
- });
1776
- if (this[0]) {
1777
- var t = x(e, this[0].ownerDocument).eq(0).clone(!0);
1778
- this[0].parentNode && t.insertBefore(this[0]), t.map(function() {
1779
- var e = this;
1780
- while (e.firstChild && 1 === e.firstChild.nodeType)
1781
- e = e.firstChild;
1782
- return e
1783
- }).append(this)
1784
- }
1785
- return this
1786
- }, wrapInner: function(e) {
1787
- return x.isFunction(e) ? this.each(function(t) {
1788
- x(this).wrapInner(e.call(this, t))
1789
- }) : this.each(function() {
1790
- var t = x(this), n = t.contents();
1791
- n.length ? n.wrapAll(e) : t.append(e)
1792
- })
1793
- }, wrap: function(e) {
1794
- var t = x.isFunction(e);
1795
- return this.each(function(n) {
1796
- x(this).wrapAll(t ? e.call(this, n) : e)
1797
- })
1798
- }, unwrap: function() {
1799
- return this.parent().each(function() {
1800
- x.nodeName(this, "body") || x(this).replaceWith(this.childNodes)
1801
- }).end()
1802
- }});
1803
- var Pt, Rt, Wt, $t = /alpha\([^)]*\)/i, It = /opacity\s*=\s*([^)]*)/, zt = /^(top|right|bottom|left)$/, Xt = /^(none|table(?!-c[ea]).+)/, Ut = /^margin/, Vt = RegExp("^(" + w + ")(.*)$", "i"), Yt = RegExp("^(" + w + ")(?!px)[a-z%]+$", "i"), Jt = RegExp("^([+-])=(" + w + ")", "i"), Gt = {BODY: "block"}, Qt = {position: "absolute", visibility: "hidden", display: "block"}, Kt = {letterSpacing: 0, fontWeight: 400}, Zt = ["Top", "Right", "Bottom", "Left"], en = ["Webkit", "O", "Moz", "ms"];
1804
- function tn(e, t) {
1805
- if (t in e)
1806
- return t;
1807
- var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = en.length;
1808
- while (i--)
1809
- if (t = en[i] + n, t in e)
1810
- return t;
1811
- return r
1812
- }
1813
- function nn(e, t) {
1814
- return e = t || e, "none" === x.css(e, "display") || !x.contains(e.ownerDocument, e)
1815
- }
1816
- function rn(e, t) {
1817
- var n, r, i, o = [], a = 0, s = e.length;
1818
- for (; s > a; a++)
1819
- r = e[a], r.style && (o[a] = x._data(r, "olddisplay"), n = r.style.display, t ? (o[a] || "none" !== n || (r.style.display = ""), "" === r.style.display && nn(r) && (o[a] = x._data(r, "olddisplay", ln(r.nodeName)))) : o[a] || (i = nn(r), (n && "none" !== n || !i) && x._data(r, "olddisplay", i ? n : x.css(r, "display"))));
1820
- for (a = 0; s > a; a++)
1821
- r = e[a], r.style && (t && "none" !== r.style.display && "" !== r.style.display || (r.style.display = t ? o[a] || "" : "none"));
1822
- return e
1823
- }
1824
- x.fn.extend({css: function(e, n) {
1825
- return x.access(this, function(e, n, r) {
1826
- var i, o, a = {}, s = 0;
1827
- if (x.isArray(n)) {
1828
- for (o = Rt(e), i = n.length; i > s; s++)
1829
- a[n[s]] = x.css(e, n[s], !1, o);
1830
- return a
1831
- }
1832
- return r !== t ? x.style(e, n, r) : x.css(e, n)
1833
- }, e, n, arguments.length > 1)
1834
- }, show: function() {
1835
- return rn(this, !0)
1836
- }, hide: function() {
1837
- return rn(this)
1838
- }, toggle: function(e) {
1839
- return"boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function() {
1840
- nn(this) ? x(this).show() : x(this).hide()
1841
- })
1842
- }}), x.extend({cssHooks: {opacity: {get: function(e, t) {
1843
- if (t) {
1844
- var n = Wt(e, "opacity");
1845
- return"" === n ? "1" : n
1846
- }
1847
- }}}, cssNumber: {columnCount: !0, fillOpacity: !0, fontWeight: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0}, cssProps: {"float": x.support.cssFloat ? "cssFloat" : "styleFloat"}, style: function(e, n, r, i) {
1848
- if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) {
1849
- var o, a, s, l = x.camelCase(n), u = e.style;
1850
- if (n = x.cssProps[l] || (x.cssProps[l] = tn(u, l)), s = x.cssHooks[n] || x.cssHooks[l], r === t)
1851
- return s && "get"in s && (o = s.get(e, !1, i)) !== t ? o : u[n];
1852
- if (a = typeof r, "string" === a && (o = Jt.exec(r)) && (r = (o[1] + 1) * o[2] + parseFloat(x.css(e, n)), a = "number"), !(null == r || "number" === a && isNaN(r) || ("number" !== a || x.cssNumber[l] || (r += "px"), x.support.clearCloneStyle || "" !== r || 0 !== n.indexOf("background") || (u[n] = "inherit"), s && "set"in s && (r = s.set(e, r, i)) === t)))
1853
- try {
1854
- u[n] = r
1855
- } catch (c) {
1856
- }
1857
- }
1858
- }, css: function(e, n, r, i) {
1859
- var o, a, s, l = x.camelCase(n);
1860
- return n = x.cssProps[l] || (x.cssProps[l] = tn(e.style, l)), s = x.cssHooks[n] || x.cssHooks[l], s && "get"in s && (a = s.get(e, !0, r)), a === t && (a = Wt(e, n, i)), "normal" === a && n in Kt && (a = Kt[n]), "" === r || r ? (o = parseFloat(a), r === !0 || x.isNumeric(o) ? o || 0 : a) : a
1861
- }}), e.getComputedStyle ? (Rt = function(t) {
1862
- return e.getComputedStyle(t, null)
1863
- }, Wt = function(e, n, r) {
1864
- var i, o, a, s = r || Rt(e), l = s ? s.getPropertyValue(n) || s[n] : t, u = e.style;
1865
- return s && ("" !== l || x.contains(e.ownerDocument, e) || (l = x.style(e, n)), Yt.test(l) && Ut.test(n) && (i = u.width, o = u.minWidth, a = u.maxWidth, u.minWidth = u.maxWidth = u.width = l, l = s.width, u.width = i, u.minWidth = o, u.maxWidth = a)), l
1866
- }) : a.documentElement.currentStyle && (Rt = function(e) {
1867
- return e.currentStyle
1868
- }, Wt = function(e, n, r) {
1869
- var i, o, a, s = r || Rt(e), l = s ? s[n] : t, u = e.style;
1870
- return null == l && u && u[n] && (l = u[n]), Yt.test(l) && !zt.test(n) && (i = u.left, o = e.runtimeStyle, a = o && o.left, a && (o.left = e.currentStyle.left), u.left = "fontSize" === n ? "1em" : l, l = u.pixelLeft + "px", u.left = i, a && (o.left = a)), "" === l ? "auto" : l
1871
- });
1872
- function on(e, t, n) {
1873
- var r = Vt.exec(t);
1874
- return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t
1875
- }
1876
- function an(e, t, n, r, i) {
1877
- var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0, a = 0;
1878
- for (; 4 > o; o += 2)
1879
- "margin" === n && (a += x.css(e, n + Zt[o], !0, i)), r ? ("content" === n && (a -= x.css(e, "padding" + Zt[o], !0, i)), "margin" !== n && (a -= x.css(e, "border" + Zt[o] + "Width", !0, i))) : (a += x.css(e, "padding" + Zt[o], !0, i), "padding" !== n && (a += x.css(e, "border" + Zt[o] + "Width", !0, i)));
1880
- return a
1881
- }
1882
- function sn(e, t, n) {
1883
- var r = !0, i = "width" === t ? e.offsetWidth : e.offsetHeight, o = Rt(e), a = x.support.boxSizing && "border-box" === x.css(e, "boxSizing", !1, o);
1884
- if (0 >= i || null == i) {
1885
- if (i = Wt(e, t, o), (0 > i || null == i) && (i = e.style[t]), Yt.test(i))
1886
- return i;
1887
- r = a && (x.support.boxSizingReliable || i === e.style[t]), i = parseFloat(i) || 0
1888
- }
1889
- return i + an(e, t, n || (a ? "border" : "content"), r, o) + "px"
1890
- }
1891
- function ln(e) {
1892
- var t = a, n = Gt[e];
1893
- return n || (n = un(e, t), "none" !== n && n || (Pt = (Pt || x("<iframe frameborder='0' width='0' height='0'/>").css("cssText", "display:block !important")).appendTo(t.documentElement), t = (Pt[0].contentWindow || Pt[0].contentDocument).document, t.write("<!doctype html><html><body>"), t.close(), n = un(e, t), Pt.detach()), Gt[e] = n), n
1894
- }
1895
- function un(e, t) {
1896
- var n = x(t.createElement(e)).appendTo(t.body), r = x.css(n[0], "display");
1897
- return n.remove(), r
1898
- }
1899
- x.each(["height", "width"], function(e, n) {
1900
- x.cssHooks[n] = {get: function(e, r, i) {
1901
- return r ? 0 === e.offsetWidth && Xt.test(x.css(e, "display")) ? x.swap(e, Qt, function() {
1902
- return sn(e, n, i)
1903
- }) : sn(e, n, i) : t
1904
- }, set: function(e, t, r) {
1905
- var i = r && Rt(e);
1906
- return on(e, t, r ? an(e, n, r, x.support.boxSizing && "border-box" === x.css(e, "boxSizing", !1, i), i) : 0)
1907
- }}
1908
- }), x.support.opacity || (x.cssHooks.opacity = {get: function(e, t) {
1909
- return It.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : ""
1910
- }, set: function(e, t) {
1911
- var n = e.style, r = e.currentStyle, i = x.isNumeric(t) ? "alpha(opacity=" + 100 * t + ")" : "", o = r && r.filter || n.filter || "";
1912
- n.zoom = 1, (t >= 1 || "" === t) && "" === x.trim(o.replace($t, "")) && n.removeAttribute && (n.removeAttribute("filter"), "" === t || r && !r.filter) || (n.filter = $t.test(o) ? o.replace($t, i) : o + " " + i)
1913
- }}), x(function() {
1914
- x.support.reliableMarginRight || (x.cssHooks.marginRight = {get: function(e, n) {
1915
- return n ? x.swap(e, {display: "inline-block"}, Wt, [e, "marginRight"]) : t
1916
- }}), !x.support.pixelPosition && x.fn.position && x.each(["top", "left"], function(e, n) {
1917
- x.cssHooks[n] = {get: function(e, r) {
1918
- return r ? (r = Wt(e, n), Yt.test(r) ? x(e).position()[n] + "px" : r) : t
1919
- }}
1920
- })
1921
- }), x.expr && x.expr.filters && (x.expr.filters.hidden = function(e) {
1922
- return 0 >= e.offsetWidth && 0 >= e.offsetHeight || !x.support.reliableHiddenOffsets && "none" === (e.style && e.style.display || x.css(e, "display"))
1923
- }, x.expr.filters.visible = function(e) {
1924
- return!x.expr.filters.hidden(e)
1925
- }), x.each({margin: "", padding: "", border: "Width"}, function(e, t) {
1926
- x.cssHooks[e + t] = {expand: function(n) {
1927
- var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n];
1928
- for (; 4 > r; r++)
1929
- i[e + Zt[r] + t] = o[r] || o[r - 2] || o[0];
1930
- return i
1931
- }}, Ut.test(e) || (x.cssHooks[e + t].set = on)
1932
- });
1933
- var cn = /%20/g, pn = /\[\]$/, fn = /\r?\n/g, dn = /^(?:submit|button|image|reset|file)$/i, hn = /^(?:input|select|textarea|keygen)/i;
1934
- x.fn.extend({serialize: function() {
1935
- return x.param(this.serializeArray())
1936
- }, serializeArray: function() {
1937
- return this.map(function() {
1938
- var e = x.prop(this, "elements");
1939
- return e ? x.makeArray(e) : this
1940
- }).filter(function() {
1941
- var e = this.type;
1942
- return this.name && !x(this).is(":disabled") && hn.test(this.nodeName) && !dn.test(e) && (this.checked || !Ct.test(e))
1943
- }).map(function(e, t) {
1944
- var n = x(this).val();
1945
- return null == n ? null : x.isArray(n) ? x.map(n, function(e) {
1946
- return{name: t.name, value: e.replace(fn, "\r\n")}
1947
- }) : {name: t.name, value: n.replace(fn, "\r\n")}
1948
- }).get()
1949
- }}), x.param = function(e, n) {
1950
- var r, i = [], o = function(e, t) {
1951
- t = x.isFunction(t) ? t() : null == t ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t)
1952
- };
1953
- if (n === t && (n = x.ajaxSettings && x.ajaxSettings.traditional), x.isArray(e) || e.jquery && !x.isPlainObject(e))
1954
- x.each(e, function() {
1955
- o(this.name, this.value)
1956
- });
1957
- else
1958
- for (r in e)
1959
- gn(r, e[r], n, o);
1960
- return i.join("&").replace(cn, "+")
1961
- };
1962
- function gn(e, t, n, r) {
1963
- var i;
1964
- if (x.isArray(t))
1965
- x.each(t, function(t, i) {
1966
- n || pn.test(e) ? r(e, i) : gn(e + "[" + ("object" == typeof i ? t : "") + "]", i, n, r)
1967
- });
1968
- else if (n || "object" !== x.type(t))
1969
- r(e, t);
1970
- else
1971
- for (i in t)
1972
- gn(e + "[" + i + "]", t[i], n, r)
1973
- }
1974
- x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function(e, t) {
1975
- x.fn[t] = function(e, n) {
1976
- return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t)
1977
- }
1978
- }), x.fn.extend({hover: function(e, t) {
1979
- return this.mouseenter(e).mouseleave(t || e)
1980
- }, bind: function(e, t, n) {
1981
- return this.on(e, null, t, n)
1982
- }, unbind: function(e, t) {
1983
- return this.off(e, null, t)
1984
- }, delegate: function(e, t, n, r) {
1985
- return this.on(t, e, n, r)
1986
- }, undelegate: function(e, t, n) {
1987
- return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n)
1988
- }});
1989
- var mn, yn, vn = x.now(), bn = /\?/, xn = /#.*$/, wn = /([?&])_=[^&]*/, Tn = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm, Cn = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Nn = /^(?:GET|HEAD)$/, kn = /^\/\//, En = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, Sn = x.fn.load, An = {}, jn = {}, Dn = "*/".concat("*");
1990
- try {
1991
- yn = o.href
1992
- } catch (Ln) {
1993
- yn = a.createElement("a"), yn.href = "", yn = yn.href
1994
- }
1995
- mn = En.exec(yn.toLowerCase()) || [];
1996
- function Hn(e) {
1997
- return function(t, n) {
1998
- "string" != typeof t && (n = t, t = "*");
1999
- var r, i = 0, o = t.toLowerCase().match(T) || [];
2000
- if (x.isFunction(n))
2001
- while (r = o[i++])
2002
- "+" === r[0] ? (r = r.slice(1) || "*", (e[r] = e[r] || []).unshift(n)) : (e[r] = e[r] || []).push(n)
2003
- }
2004
- }
2005
- function qn(e, n, r, i) {
2006
- var o = {}, a = e === jn;
2007
- function s(l) {
2008
- var u;
2009
- return o[l] = !0, x.each(e[l] || [], function(e, l) {
2010
- var c = l(n, r, i);
2011
- return"string" != typeof c || a || o[c] ? a ? !(u = c) : t : (n.dataTypes.unshift(c), s(c), !1)
2012
- }), u
2013
- }
2014
- return s(n.dataTypes[0]) || !o["*"] && s("*")
2015
- }
2016
- function _n(e, n) {
2017
- var r, i, o = x.ajaxSettings.flatOptions || {};
2018
- for (i in n)
2019
- n[i] !== t && ((o[i] ? e : r || (r = {}))[i] = n[i]);
2020
- return r && x.extend(!0, e, r), e
2021
- }
2022
- x.fn.load = function(e, n, r) {
2023
- if ("string" != typeof e && Sn)
2024
- return Sn.apply(this, arguments);
2025
- var i, o, a, s = this, l = e.indexOf(" ");
2026
- return l >= 0 && (i = e.slice(l, e.length), e = e.slice(0, l)), x.isFunction(n) ? (r = n, n = t) : n && "object" == typeof n && (a = "POST"), s.length > 0 && x.ajax({url: e, type: a, dataType: "html", data: n}).done(function(e) {
2027
- o = arguments, s.html(i ? x("<div>").append(x.parseHTML(e)).find(i) : e)
2028
- }).complete(r && function(e, t) {
2029
- s.each(r, o || [e.responseText, t, e])
2030
- }), this
2031
- }, x.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(e, t) {
2032
- x.fn[t] = function(e) {
2033
- return this.on(t, e)
2034
- }
2035
- }), x.extend({active: 0, lastModified: {}, etag: {}, ajaxSettings: {url: yn, type: "GET", isLocal: Cn.test(mn[1]), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: {"*": Dn, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript"}, contents: {xml: /xml/, html: /html/, json: /json/}, responseFields: {xml: "responseXML", text: "responseText", json: "responseJSON"}, converters: {"* text": String, "text html": !0, "text json": x.parseJSON, "text xml": x.parseXML}, flatOptions: {url: !0, context: !0}}, ajaxSetup: function(e, t) {
2036
- return t ? _n(_n(e, x.ajaxSettings), t) : _n(x.ajaxSettings, e)
2037
- }, ajaxPrefilter: Hn(An), ajaxTransport: Hn(jn), ajax: function(e, n) {
2038
- "object" == typeof e && (n = e, e = t), n = n || {};
2039
- var r, i, o, a, s, l, u, c, p = x.ajaxSetup({}, n), f = p.context || p, d = p.context && (f.nodeType || f.jquery) ? x(f) : x.event, h = x.Deferred(), g = x.Callbacks("once memory"), m = p.statusCode || {}, y = {}, v = {}, b = 0, w = "canceled", C = {readyState: 0, getResponseHeader: function(e) {
2040
- var t;
2041
- if (2 === b) {
2042
- if (!c) {
2043
- c = {};
2044
- while (t = Tn.exec(a))
2045
- c[t[1].toLowerCase()] = t[2]
2046
- }
2047
- t = c[e.toLowerCase()]
2048
- }
2049
- return null == t ? null : t
2050
- }, getAllResponseHeaders: function() {
2051
- return 2 === b ? a : null
2052
- }, setRequestHeader: function(e, t) {
2053
- var n = e.toLowerCase();
2054
- return b || (e = v[n] = v[n] || e, y[e] = t), this
2055
- }, overrideMimeType: function(e) {
2056
- return b || (p.mimeType = e), this
2057
- }, statusCode: function(e) {
2058
- var t;
2059
- if (e)
2060
- if (2 > b)
2061
- for (t in e)
2062
- m[t] = [m[t], e[t]];
2063
- else
2064
- C.always(e[C.status]);
2065
- return this
2066
- }, abort: function(e) {
2067
- var t = e || w;
2068
- return u && u.abort(t), k(0, t), this
2069
- }};
2070
- if (h.promise(C).complete = g.add, C.success = C.done, C.error = C.fail, p.url = ((e || p.url || yn) + "").replace(xn, "").replace(kn, mn[1] + "//"), p.type = n.method || n.type || p.method || p.type, p.dataTypes = x.trim(p.dataType || "*").toLowerCase().match(T) || [""], null == p.crossDomain && (r = En.exec(p.url.toLowerCase()), p.crossDomain = !(!r || r[1] === mn[1] && r[2] === mn[2] && (r[3] || ("http:" === r[1] ? "80" : "443")) === (mn[3] || ("http:" === mn[1] ? "80" : "443")))), p.data && p.processData && "string" != typeof p.data && (p.data = x.param(p.data, p.traditional)), qn(An, p, n, C), 2 === b)
2071
- return C;
2072
- l = p.global, l && 0 === x.active++ && x.event.trigger("ajaxStart"), p.type = p.type.toUpperCase(), p.hasContent = !Nn.test(p.type), o = p.url, p.hasContent || (p.data && (o = p.url += (bn.test(o) ? "&" : "?") + p.data, delete p.data), p.cache === !1 && (p.url = wn.test(o) ? o.replace(wn, "$1_=" + vn++) : o + (bn.test(o) ? "&" : "?") + "_=" + vn++)), p.ifModified && (x.lastModified[o] && C.setRequestHeader("If-Modified-Since", x.lastModified[o]), x.etag[o] && C.setRequestHeader("If-None-Match", x.etag[o])), (p.data && p.hasContent && p.contentType !== !1 || n.contentType) && C.setRequestHeader("Content-Type", p.contentType), C.setRequestHeader("Accept", p.dataTypes[0] && p.accepts[p.dataTypes[0]] ? p.accepts[p.dataTypes[0]] + ("*" !== p.dataTypes[0] ? ", " + Dn + "; q=0.01" : "") : p.accepts["*"]);
2073
- for (i in p.headers)
2074
- C.setRequestHeader(i, p.headers[i]);
2075
- if (p.beforeSend && (p.beforeSend.call(f, C, p) === !1 || 2 === b))
2076
- return C.abort();
2077
- w = "abort";
2078
- for (i in{success:1, error:1, complete:1})
2079
- C[i](p[i]);
2080
- if (u = qn(jn, p, n, C)) {
2081
- C.readyState = 1, l && d.trigger("ajaxSend", [C, p]), p.async && p.timeout > 0 && (s = setTimeout(function() {
2082
- C.abort("timeout")
2083
- }, p.timeout));
2084
- try {
2085
- b = 1, u.send(y, k)
2086
- } catch (N) {
2087
- if (!(2 > b))
2088
- throw N;
2089
- k(-1, N)
2090
- }
2091
- } else
2092
- k(-1, "No Transport");
2093
- function k(e, n, r, i) {
2094
- var c, y, v, w, T, N = n;
2095
- 2 !== b && (b = 2, s && clearTimeout(s), u = t, a = i || "", C.readyState = e > 0 ? 4 : 0, c = e >= 200 && 300 > e || 304 === e, r && (w = Mn(p, C, r)), w = On(p, w, C, c), c ? (p.ifModified && (T = C.getResponseHeader("Last-Modified"), T && (x.lastModified[o] = T), T = C.getResponseHeader("etag"), T && (x.etag[o] = T)), 204 === e || "HEAD" === p.type ? N = "nocontent" : 304 === e ? N = "notmodified" : (N = w.state, y = w.data, v = w.error, c = !v)) : (v = N, (e || !N) && (N = "error", 0 > e && (e = 0))), C.status = e, C.statusText = (n || N) + "", c ? h.resolveWith(f, [y, N, C]) : h.rejectWith(f, [C, N, v]), C.statusCode(m), m = t, l && d.trigger(c ? "ajaxSuccess" : "ajaxError", [C, p, c ? y : v]), g.fireWith(f, [C, N]), l && (d.trigger("ajaxComplete", [C, p]), --x.active || x.event.trigger("ajaxStop")))
2096
- }
2097
- return C
2098
- }, getJSON: function(e, t, n) {
2099
- return x.get(e, t, n, "json")
2100
- }, getScript: function(e, n) {
2101
- return x.get(e, t, n, "script")
2102
- }}), x.each(["get", "post"], function(e, n) {
2103
- x[n] = function(e, r, i, o) {
2104
- return x.isFunction(r) && (o = o || i, i = r, r = t), x.ajax({url: e, type: n, dataType: o, data: r, success: i})
2105
- }
2106
- });
2107
- function Mn(e, n, r) {
2108
- var i, o, a, s, l = e.contents, u = e.dataTypes;
2109
- while ("*" === u[0])
2110
- u.shift(), o === t && (o = e.mimeType || n.getResponseHeader("Content-Type"));
2111
- if (o)
2112
- for (s in l)
2113
- if (l[s] && l[s].test(o)) {
2114
- u.unshift(s);
2115
- break
2116
- }
2117
- if (u[0]in r)
2118
- a = u[0];
2119
- else {
2120
- for (s in r) {
2121
- if (!u[0] || e.converters[s + " " + u[0]]) {
2122
- a = s;
2123
- break
2124
- }
2125
- i || (i = s)
2126
- }
2127
- a = a || i
2128
- }
2129
- return a ? (a !== u[0] && u.unshift(a), r[a]) : t
2130
- }
2131
- function On(e, t, n, r) {
2132
- var i, o, a, s, l, u = {}, c = e.dataTypes.slice();
2133
- if (c[1])
2134
- for (a in e.converters)
2135
- u[a.toLowerCase()] = e.converters[a];
2136
- o = c.shift();
2137
- while (o)
2138
- if (e.responseFields[o] && (n[e.responseFields[o]] = t), !l && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), l = o, o = c.shift())
2139
- if ("*" === o)
2140
- o = l;
2141
- else if ("*" !== l && l !== o) {
2142
- if (a = u[l + " " + o] || u["* " + o], !a)
2143
- for (i in u)
2144
- if (s = i.split(" "), s[1] === o && (a = u[l + " " + s[0]] || u["* " + s[0]])) {
2145
- a === !0 ? a = u[i] : u[i] !== !0 && (o = s[0], c.unshift(s[1]));
2146
- break
2147
- }
2148
- if (a !== !0)
2149
- if (a && e["throws"])
2150
- t = a(t);
2151
- else
2152
- try {
2153
- t = a(t)
2154
- } catch (p) {
2155
- return{state: "parsererror", error: a ? p : "No conversion from " + l + " to " + o}
2156
- }
2157
- }
2158
- return{state: "success", data: t}
2159
- }
2160
- x.ajaxSetup({accepts: {script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"}, contents: {script: /(?:java|ecma)script/}, converters: {"text script": function(e) {
2161
- return x.globalEval(e), e
2162
- }}}), x.ajaxPrefilter("script", function(e) {
2163
- e.cache === t && (e.cache = !1), e.crossDomain && (e.type = "GET", e.global = !1)
2164
- }), x.ajaxTransport("script", function(e) {
2165
- if (e.crossDomain) {
2166
- var n, r = a.head || x("head")[0] || a.documentElement;
2167
- return{send: function(t, i) {
2168
- n = a.createElement("script"), n.async = !0, e.scriptCharset && (n.charset = e.scriptCharset), n.src = e.url, n.onload = n.onreadystatechange = function(e, t) {
2169
- (t || !n.readyState || /loaded|complete/.test(n.readyState)) && (n.onload = n.onreadystatechange = null, n.parentNode && n.parentNode.removeChild(n), n = null, t || i(200, "success"))
2170
- }, r.insertBefore(n, r.firstChild)
2171
- }, abort: function() {
2172
- n && n.onload(t, !0)
2173
- }}
2174
- }
2175
- });
2176
- var Fn = [], Bn = /(=)\?(?=&|$)|\?\?/;
2177
- x.ajaxSetup({jsonp: "callback", jsonpCallback: function() {
2178
- var e = Fn.pop() || x.expando + "_" + vn++;
2179
- return this[e] = !0, e
2180
- }}), x.ajaxPrefilter("json jsonp", function(n, r, i) {
2181
- var o, a, s, l = n.jsonp !== !1 && (Bn.test(n.url) ? "url" : "string" == typeof n.data && !(n.contentType || "").indexOf("application/x-www-form-urlencoded") && Bn.test(n.data) && "data");
2182
- return l || "jsonp" === n.dataTypes[0] ? (o = n.jsonpCallback = x.isFunction(n.jsonpCallback) ? n.jsonpCallback() : n.jsonpCallback, l ? n[l] = n[l].replace(Bn, "$1" + o) : n.jsonp !== !1 && (n.url += (bn.test(n.url) ? "&" : "?") + n.jsonp + "=" + o), n.converters["script json"] = function() {
2183
- return s || x.error(o + " was not called"), s[0]
2184
- }, n.dataTypes[0] = "json", a = e[o], e[o] = function() {
2185
- s = arguments
2186
- }, i.always(function() {
2187
- e[o] = a, n[o] && (n.jsonpCallback = r.jsonpCallback, Fn.push(o)), s && x.isFunction(a) && a(s[0]), s = a = t
2188
- }), "script") : t
2189
- });
2190
- var Pn, Rn, Wn = 0, $n = e.ActiveXObject && function() {
2191
- var e;
2192
- for (e in Pn)
2193
- Pn[e](t, !0)
2194
- };
2195
- function In() {
2196
- try {
2197
- return new e.XMLHttpRequest
2198
- } catch (t) {
2199
- }
2200
- }
2201
- function zn() {
2202
- try {
2203
- return new e.ActiveXObject("Microsoft.XMLHTTP")
2204
- } catch (t) {
2205
- }
2206
- }
2207
- x.ajaxSettings.xhr = e.ActiveXObject ? function() {
2208
- return!this.isLocal && In() || zn()
2209
- } : In, Rn = x.ajaxSettings.xhr(), x.support.cors = !!Rn && "withCredentials"in Rn, Rn = x.support.ajax = !!Rn, Rn && x.ajaxTransport(function(n) {
2210
- if (!n.crossDomain || x.support.cors) {
2211
- var r;
2212
- return{send: function(i, o) {
2213
- var a, s, l = n.xhr();
2214
- if (n.username ? l.open(n.type, n.url, n.async, n.username, n.password) : l.open(n.type, n.url, n.async), n.xhrFields)
2215
- for (s in n.xhrFields)
2216
- l[s] = n.xhrFields[s];
2217
- n.mimeType && l.overrideMimeType && l.overrideMimeType(n.mimeType), n.crossDomain || i["X-Requested-With"] || (i["X-Requested-With"] = "XMLHttpRequest");
2218
- try {
2219
- for (s in i)
2220
- l.setRequestHeader(s, i[s])
2221
- } catch (u) {
2222
- }
2223
- l.send(n.hasContent && n.data || null), r = function(e, i) {
2224
- var s, u, c, p;
2225
- try {
2226
- if (r && (i || 4 === l.readyState))
2227
- if (r = t, a && (l.onreadystatechange = x.noop, $n && delete Pn[a]), i)
2228
- 4 !== l.readyState && l.abort();
2229
- else {
2230
- p = {}, s = l.status, u = l.getAllResponseHeaders(), "string" == typeof l.responseText && (p.text = l.responseText);
2231
- try {
2232
- c = l.statusText
2233
- } catch (f) {
2234
- c = ""
2235
- }
2236
- s || !n.isLocal || n.crossDomain ? 1223 === s && (s = 204) : s = p.text ? 200 : 404
2237
- }
2238
- } catch (d) {
2239
- i || o(-1, d)
2240
- }
2241
- p && o(s, c, p, u)
2242
- }, n.async ? 4 === l.readyState ? setTimeout(r) : (a = ++Wn, $n && (Pn || (Pn = {}, x(e).unload($n)), Pn[a] = r), l.onreadystatechange = r) : r()
2243
- }, abort: function() {
2244
- r && r(t, !0)
2245
- }}
2246
- }
2247
- });
2248
- var Xn, Un, Vn = /^(?:toggle|show|hide)$/, Yn = RegExp("^(?:([+-])=|)(" + w + ")([a-z%]*)$", "i"), Jn = /queueHooks$/, Gn = [nr], Qn = {"*": [function(e, t) {
2249
- var n = this.createTween(e, t), r = n.cur(), i = Yn.exec(t), o = i && i[3] || (x.cssNumber[e] ? "" : "px"), a = (x.cssNumber[e] || "px" !== o && +r) && Yn.exec(x.css(n.elem, e)), s = 1, l = 20;
2250
- if (a && a[3] !== o) {
2251
- o = o || a[3], i = i || [], a = +r || 1;
2252
- do
2253
- s = s || ".5", a /= s, x.style(n.elem, e, a + o);
2254
- while (s !== (s = n.cur() / r) && 1 !== s && --l)
2255
- }
2256
- return i && (a = n.start = +a || +r || 0, n.unit = o, n.end = i[1] ? a + (i[1] + 1) * i[2] : +i[2]), n
2257
- }]};
2258
- function Kn() {
2259
- return setTimeout(function() {
2260
- Xn = t
2261
- }), Xn = x.now()
2262
- }
2263
- function Zn(e, t, n) {
2264
- var r, i = (Qn[t] || []).concat(Qn["*"]), o = 0, a = i.length;
2265
- for (; a > o; o++)
2266
- if (r = i[o].call(n, t, e))
2267
- return r
2268
- }
2269
- function er(e, t, n) {
2270
- var r, i, o = 0, a = Gn.length, s = x.Deferred().always(function() {
2271
- delete l.elem
2272
- }), l = function() {
2273
- if (i)
2274
- return!1;
2275
- var t = Xn || Kn(), n = Math.max(0, u.startTime + u.duration - t), r = n / u.duration || 0, o = 1 - r, a = 0, l = u.tweens.length;
2276
- for (; l > a; a++)
2277
- u.tweens[a].run(o);
2278
- return s.notifyWith(e, [u, o, n]), 1 > o && l ? n : (s.resolveWith(e, [u]), !1)
2279
- }, u = s.promise({elem: e, props: x.extend({}, t), opts: x.extend(!0, {specialEasing: {}}, n), originalProperties: t, originalOptions: n, startTime: Xn || Kn(), duration: n.duration, tweens: [], createTween: function(t, n) {
2280
- var r = x.Tween(e, u.opts, t, n, u.opts.specialEasing[t] || u.opts.easing);
2281
- return u.tweens.push(r), r
2282
- }, stop: function(t) {
2283
- var n = 0, r = t ? u.tweens.length : 0;
2284
- if (i)
2285
- return this;
2286
- for (i = !0; r > n; n++)
2287
- u.tweens[n].run(1);
2288
- return t ? s.resolveWith(e, [u, t]) : s.rejectWith(e, [u, t]), this
2289
- }}), c = u.props;
2290
- for (tr(c, u.opts.specialEasing); a > o; o++)
2291
- if (r = Gn[o].call(u, e, c, u.opts))
2292
- return r;
2293
- return x.map(c, Zn, u), x.isFunction(u.opts.start) && u.opts.start.call(e, u), x.fx.timer(x.extend(l, {elem: e, anim: u, queue: u.opts.queue})), u.progress(u.opts.progress).done(u.opts.done, u.opts.complete).fail(u.opts.fail).always(u.opts.always)
2294
- }
2295
- function tr(e, t) {
2296
- var n, r, i, o, a;
2297
- for (n in e)
2298
- if (r = x.camelCase(n), i = t[r], o = e[n], x.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), a = x.cssHooks[r], a && "expand"in a) {
2299
- o = a.expand(o), delete e[r];
2300
- for (n in o)
2301
- n in e || (e[n] = o[n], t[n] = i)
2302
- } else
2303
- t[r] = i
2304
- }
2305
- x.Animation = x.extend(er, {tweener: function(e, t) {
2306
- x.isFunction(e) ? (t = e, e = ["*"]) : e = e.split(" ");
2307
- var n, r = 0, i = e.length;
2308
- for (; i > r; r++)
2309
- n = e[r], Qn[n] = Qn[n] || [], Qn[n].unshift(t)
2310
- }, prefilter: function(e, t) {
2311
- t ? Gn.unshift(e) : Gn.push(e)
2312
- }});
2313
- function nr(e, t, n) {
2314
- var r, i, o, a, s, l, u = this, c = {}, p = e.style, f = e.nodeType && nn(e), d = x._data(e, "fxshow");
2315
- n.queue || (s = x._queueHooks(e, "fx"), null == s.unqueued && (s.unqueued = 0, l = s.empty.fire, s.empty.fire = function() {
2316
- s.unqueued || l()
2317
- }), s.unqueued++, u.always(function() {
2318
- u.always(function() {
2319
- s.unqueued--, x.queue(e, "fx").length || s.empty.fire()
2320
- })
2321
- })), 1 === e.nodeType && ("height"in t || "width"in t) && (n.overflow = [p.overflow, p.overflowX, p.overflowY], "inline" === x.css(e, "display") && "none" === x.css(e, "float") && (x.support.inlineBlockNeedsLayout && "inline" !== ln(e.nodeName) ? p.zoom = 1 : p.display = "inline-block")), n.overflow && (p.overflow = "hidden", x.support.shrinkWrapBlocks || u.always(function() {
2322
- p.overflow = n.overflow[0], p.overflowX = n.overflow[1], p.overflowY = n.overflow[2]
2323
- }));
2324
- for (r in t)
2325
- if (i = t[r], Vn.exec(i)) {
2326
- if (delete t[r], o = o || "toggle" === i, i === (f ? "hide" : "show"))
2327
- continue;
2328
- c[r] = d && d[r] || x.style(e, r)
2329
- }
2330
- if (!x.isEmptyObject(c)) {
2331
- d ? "hidden"in d && (f = d.hidden) : d = x._data(e, "fxshow", {}), o && (d.hidden = !f), f ? x(e).show() : u.done(function() {
2332
- x(e).hide()
2333
- }), u.done(function() {
2334
- var t;
2335
- x._removeData(e, "fxshow");
2336
- for (t in c)
2337
- x.style(e, t, c[t])
2338
- });
2339
- for (r in c)
2340
- a = Zn(f ? d[r] : 0, r, u), r in d || (d[r] = a.start, f && (a.end = a.start, a.start = "width" === r || "height" === r ? 1 : 0))
2341
- }
2342
- }
2343
- function rr(e, t, n, r, i) {
2344
- return new rr.prototype.init(e, t, n, r, i)
2345
- }
2346
- x.Tween = rr, rr.prototype = {constructor: rr, init: function(e, t, n, r, i, o) {
2347
- this.elem = e, this.prop = n, this.easing = i || "swing", this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (x.cssNumber[n] ? "" : "px")
2348
- }, cur: function() {
2349
- var e = rr.propHooks[this.prop];
2350
- return e && e.get ? e.get(this) : rr.propHooks._default.get(this)
2351
- }, run: function(e) {
2352
- var t, n = rr.propHooks[this.prop];
2353
- return this.pos = t = this.options.duration ? x.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : rr.propHooks._default.set(this), this
2354
- }}, rr.prototype.init.prototype = rr.prototype, rr.propHooks = {_default: {get: function(e) {
2355
- var t;
2356
- return null == e.elem[e.prop] || e.elem.style && null != e.elem.style[e.prop] ? (t = x.css(e.elem, e.prop, ""), t && "auto" !== t ? t : 0) : e.elem[e.prop]
2357
- }, set: function(e) {
2358
- x.fx.step[e.prop] ? x.fx.step[e.prop](e) : e.elem.style && (null != e.elem.style[x.cssProps[e.prop]] || x.cssHooks[e.prop]) ? x.style(e.elem, e.prop, e.now + e.unit) : e.elem[e.prop] = e.now
2359
- }}}, rr.propHooks.scrollTop = rr.propHooks.scrollLeft = {set: function(e) {
2360
- e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now)
2361
- }}, x.each(["toggle", "show", "hide"], function(e, t) {
2362
- var n = x.fn[t];
2363
- x.fn[t] = function(e, r, i) {
2364
- return null == e || "boolean" == typeof e ? n.apply(this, arguments) : this.animate(ir(t, !0), e, r, i)
2365
- }
2366
- }), x.fn.extend({fadeTo: function(e, t, n, r) {
2367
- return this.filter(nn).css("opacity", 0).show().end().animate({opacity: t}, e, n, r)
2368
- }, animate: function(e, t, n, r) {
2369
- var i = x.isEmptyObject(e), o = x.speed(t, n, r), a = function() {
2370
- var t = er(this, x.extend({}, e), o);
2371
- (i || x._data(this, "finish")) && t.stop(!0)
2372
- };
2373
- return a.finish = a, i || o.queue === !1 ? this.each(a) : this.queue(o.queue, a)
2374
- }, stop: function(e, n, r) {
2375
- var i = function(e) {
2376
- var t = e.stop;
2377
- delete e.stop, t(r)
2378
- };
2379
- return"string" != typeof e && (r = n, n = e, e = t), n && e !== !1 && this.queue(e || "fx", []), this.each(function() {
2380
- var t = !0, n = null != e && e + "queueHooks", o = x.timers, a = x._data(this);
2381
- if (n)
2382
- a[n] && a[n].stop && i(a[n]);
2383
- else
2384
- for (n in a)
2385
- a[n] && a[n].stop && Jn.test(n) && i(a[n]);
2386
- for (n = o.length; n--; )
2387
- o[n].elem !== this || null != e && o[n].queue !== e || (o[n].anim.stop(r), t = !1, o.splice(n, 1));
2388
- (t || !r) && x.dequeue(this, e)
2389
- })
2390
- }, finish: function(e) {
2391
- return e !== !1 && (e = e || "fx"), this.each(function() {
2392
- var t, n = x._data(this), r = n[e + "queue"], i = n[e + "queueHooks"], o = x.timers, a = r ? r.length : 0;
2393
- for (n.finish = !0, x.queue(this, e, []), i && i.stop && i.stop.call(this, !0), t = o.length; t--; )
2394
- o[t].elem === this && o[t].queue === e && (o[t].anim.stop(!0), o.splice(t, 1));
2395
- for (t = 0; a > t; t++)
2396
- r[t] && r[t].finish && r[t].finish.call(this);
2397
- delete n.finish
2398
- })
2399
- }});
2400
- function ir(e, t) {
2401
- var n, r = {height: e}, i = 0;
2402
- for (t = t?1:0; 4 > i; i += 2 - t)
2403
- n = Zt[i], r["margin" + n] = r["padding" + n] = e;
2404
- return t && (r.opacity = r.width = e), r
2405
- }
2406
- x.each({slideDown: ir("show"), slideUp: ir("hide"), slideToggle: ir("toggle"), fadeIn: {opacity: "show"}, fadeOut: {opacity: "hide"}, fadeToggle: {opacity: "toggle"}}, function(e, t) {
2407
- x.fn[e] = function(e, n, r) {
2408
- return this.animate(t, e, n, r)
2409
- }
2410
- }), x.speed = function(e, t, n) {
2411
- var r = e && "object" == typeof e ? x.extend({}, e) : {complete: n || !n && t || x.isFunction(e) && e, duration: e, easing: n && t || t && !x.isFunction(t) && t};
2412
- return r.duration = x.fx.off ? 0 : "number" == typeof r.duration ? r.duration : r.duration in x.fx.speeds ? x.fx.speeds[r.duration] : x.fx.speeds._default, (null == r.queue || r.queue === !0) && (r.queue = "fx"), r.old = r.complete, r.complete = function() {
2413
- x.isFunction(r.old) && r.old.call(this), r.queue && x.dequeue(this, r.queue)
2414
- }, r
2415
- }, x.easing = {linear: function(e) {
2416
- return e
2417
- }, swing: function(e) {
2418
- return.5 - Math.cos(e * Math.PI) / 2
2419
- }}, x.timers = [], x.fx = rr.prototype.init, x.fx.tick = function() {
2420
- var e, n = x.timers, r = 0;
2421
- for (Xn = x.now(); n.length > r; r++)
2422
- e = n[r], e() || n[r] !== e || n.splice(r--, 1);
2423
- n.length || x.fx.stop(), Xn = t
2424
- }, x.fx.timer = function(e) {
2425
- e() && x.timers.push(e) && x.fx.start()
2426
- }, x.fx.interval = 13, x.fx.start = function() {
2427
- Un || (Un = setInterval(x.fx.tick, x.fx.interval))
2428
- }, x.fx.stop = function() {
2429
- clearInterval(Un), Un = null
2430
- }, x.fx.speeds = {slow: 600, fast: 200, _default: 400}, x.fx.step = {}, x.expr && x.expr.filters && (x.expr.filters.animated = function(e) {
2431
- return x.grep(x.timers, function(t) {
2432
- return e === t.elem
2433
- }).length
2434
- }), x.fn.offset = function(e) {
2435
- if (arguments.length)
2436
- return e === t ? this : this.each(function(t) {
2437
- x.offset.setOffset(this, e, t)
2438
- });
2439
- var n, r, o = {top: 0, left: 0}, a = this[0], s = a && a.ownerDocument;
2440
- if (s)
2441
- return n = s.documentElement, x.contains(n, a) ? (typeof a.getBoundingClientRect !== i && (o = a.getBoundingClientRect()), r = or(s), {top: o.top + (r.pageYOffset || n.scrollTop) - (n.clientTop || 0), left: o.left + (r.pageXOffset || n.scrollLeft) - (n.clientLeft || 0)}) : o
2442
- }, x.offset = {setOffset: function(e, t, n) {
2443
- var r = x.css(e, "position");
2444
- "static" === r && (e.style.position = "relative");
2445
- var i = x(e), o = i.offset(), a = x.css(e, "top"), s = x.css(e, "left"), l = ("absolute" === r || "fixed" === r) && x.inArray("auto", [a, s]) > -1, u = {}, c = {}, p, f;
2446
- l ? (c = i.position(), p = c.top, f = c.left) : (p = parseFloat(a) || 0, f = parseFloat(s) || 0), x.isFunction(t) && (t = t.call(e, n, o)), null != t.top && (u.top = t.top - o.top + p), null != t.left && (u.left = t.left - o.left + f), "using"in t ? t.using.call(e, u) : i.css(u)
2447
- }}, x.fn.extend({position: function() {
2448
- if (this[0]) {
2449
- var e, t, n = {top: 0, left: 0}, r = this[0];
2450
- return"fixed" === x.css(r, "position") ? t = r.getBoundingClientRect() : (e = this.offsetParent(), t = this.offset(), x.nodeName(e[0], "html") || (n = e.offset()), n.top += x.css(e[0], "borderTopWidth", !0), n.left += x.css(e[0], "borderLeftWidth", !0)), {top: t.top - n.top - x.css(r, "marginTop", !0), left: t.left - n.left - x.css(r, "marginLeft", !0)}
2451
- }
2452
- }, offsetParent: function() {
2453
- return this.map(function() {
2454
- var e = this.offsetParent || s;
2455
- while (e && !x.nodeName(e, "html") && "static" === x.css(e, "position"))
2456
- e = e.offsetParent;
2457
- return e || s
2458
- })
2459
- }}), x.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function(e, n) {
2460
- var r = /Y/.test(n);
2461
- x.fn[e] = function(i) {
2462
- return x.access(this, function(e, i, o) {
2463
- var a = or(e);
2464
- return o === t ? a ? n in a ? a[n] : a.document.documentElement[i] : e[i] : (a ? a.scrollTo(r ? x(a).scrollLeft() : o, r ? o : x(a).scrollTop()) : e[i] = o, t)
2465
- }, e, i, arguments.length, null)
2466
- }
2467
- });
2468
- function or(e) {
2469
- return x.isWindow(e) ? e : 9 === e.nodeType ? e.defaultView || e.parentWindow : !1
2470
- }
2471
- x.each({Height: "height", Width: "width"}, function(e, n) {
2472
- x.each({padding: "inner" + e, content: n, "": "outer" + e}, function(r, i) {
2473
- x.fn[i] = function(i, o) {
2474
- var a = arguments.length && (r || "boolean" != typeof i), s = r || (i === !0 || o === !0 ? "margin" : "border");
2475
- return x.access(this, function(n, r, i) {
2476
- var o;
2477
- return x.isWindow(n) ? n.document.documentElement["client" + e] : 9 === n.nodeType ? (o = n.documentElement, Math.max(n.body["scroll" + e], o["scroll" + e], n.body["offset" + e], o["offset" + e], o["client" + e])) : i === t ? x.css(n, r, s) : x.style(n, r, i, s)
2478
- }, n, a ? i : t, a, null)
2479
- }
2480
- })
2481
- }), x.fn.size = function() {
2482
- return this.length
2483
- }, x.fn.andSelf = x.fn.addBack, "object" == typeof module && module && "object" == typeof module.exports ? module.exports = x : (e.jQuery = e.$ = x, "function" == typeof define && define.amd && define("jquery", [], function() {
2484
- return x
2485
- }))
2486
- })(window);
1
+ /*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
2
+ !function(a,b){"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){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.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(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.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||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[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,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=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=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=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)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.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,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$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("div");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=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);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 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 pa(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=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.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.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);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 p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.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===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(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,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):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(U,"='$1']"),!(!c.matchesSelector||!p||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&&D.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.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:X,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(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===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 X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.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(ca,da).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("(^|"+L+")"+a+"("+L+"|$)"))&&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(Q," ")+" ").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;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/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=J(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(R,"$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(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).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:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!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 Z.test(a.nodeName)},input:function(a){return Y.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:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(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 qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,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=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[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 ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(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 ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(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 wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(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?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(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=[sa(ta(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 wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};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=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(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(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.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(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(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("div"))}),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(K,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);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;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&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
3
+
4
+ return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.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=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.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 m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.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=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(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},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(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=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.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+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=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};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(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+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{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":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
5
+ return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.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):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.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 kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),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:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.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.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.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)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(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=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.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)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.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})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,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||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.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=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},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)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.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 Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(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}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,21 +1,25 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Novalnet</name>
4
- <version>10.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Novalnet AG ist ein deutsches EPayment - Unternehmen, bietet alle relevanten Zahlungsarten weltweit. / Novalnet is a German based payment service provider, which offers all the available payments and solutions worldwide.</summary>
10
  <description>The NOVALNET AG is an essential component of e-Payment platform that facilitates your company to process all type of payments. As one of the leading company in Online-Payment the NOVALNET AG provides its customers an individual, technically qualified secured Payment system and also the best possible support throughout. NOVALNET AG is not only an e-Payment provider but also we offer our Merchants an optimal strategic solution for easy payment processing which is pocket-friendly for our customer.</description>
11
- <notes>- Credit Card Iframe implemented.&#xD;
12
- - Giropay payment has been implemented.&#xD;
13
- - Novalnet payment module has been optimized as per new testcase.&#xD;
14
- - Logo control has been implemented in global configuration.</notes>
 
 
 
 
15
  <authors><author><name>Gabriel Dixon</name><user>Novalnet</user><email>gd@novalnet.de</email></author></authors>
16
- <date>2016-06-09</date>
17
- <time>05:33:52</time>
18
- <contents><target name="magecommunity"><dir name="Novalnet"><dir><dir name="Payment"><dir name="Block"><dir name="Adminhtml"><dir name="Configuration"><dir name="Wizard"><dir name="Config"><file name="Form.php" hash="5c01c0c2d7c63befc9fe7f798929962e"/><dir name="Payment"><file name="Form.php" hash="44e9fde94bd2482a79e8f277cc937d6b"/></dir></dir><dir name="Page"><file name="Edit.php" hash="59e9b413aada07f1b3bf10bb9a43b544"/><file name="Save.php" hash="b1a7c090ccc884d26ae45a6c05b46f72"/><file name="View.php" hash="7c1ce5273e41fc3480173739f31a6ff9"/></dir></dir></dir><dir name="Information"><file name="Module.php" hash="75fd2101d18cd5d7beef47ea4a29f71a"/><file name="Novalnetmerchantadmin.php" hash="06da0d0cdd62ad813e7d44c7dea52c50"/></dir><dir name="Recurring"><dir name="Profile"><file name="Grid.php" hash="8d268602f66ca03d850dead164a06a25"/></dir><file name="Profile.php" hash="73fe4f1585514ef378400683867418bb"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="f431589d2f9257c0f066ae5826a8517d"/></dir><file name="Grid.php" hash="a13b0765c0996d64b4888d555b2c17d2"/><dir name="Invoice"><file name="Totals.php" hash="1ad938eb50e5c00d293b8c3a6ff9eebe"/><file name="View.php" hash="5cdb6b489a2faf63cdf652506309bbd7"/></dir><file name="Totals.php" hash="0f65a959f7334170718893dfe74026a0"/><dir name="View"><dir name="Tab"><file name="Invoices.php" hash="4c60eb90766404e50fee4c192ebcd426"/><dir name="Renderer"><file name="Invoices.php" hash="0ab1754a021e0229ce992cf41273c94a"/></dir><file name="TransactionOverview.php" hash="e36f9051093c5d9a8c21d47d1f16688e"/><file name="TransactionStatus.php" hash="a5d53fd379eabc30b548cb3337e1078b"/></dir></dir><file name="View.php" hash="0f614c6ec5c833ca7d431c28a65d1b6c"/></dir><file name="Order.php" hash="7d3f23b4d944138e25db603a161c764e"/><file name="Sales.php" hash="955045ba24383e85fdd2e4dd7a8fa437"/></dir><dir name="Transaction"><file name="Grid.php" hash="3eba0b9331de206d03ddd61c1731e14e"/><dir name="View"><file name="Form.php" hash="1960a7abc65e82c6893cb59cbd8fff13"/></dir><file name="View.php" hash="ee88ede00cfa4b0b2e90cd4c4fcc65f3"/></dir><file name="Transaction.php" hash="9d67e39e951ef6e31da72bfd4d648249"/><dir name="Transactionoverview"><file name="Grid.php" hash="3bd754b1281e16ce294b26f37bc969f6"/><dir name="View"><file name="Form.php" hash="3414da367d9f47ecc670233ddead8a56"/></dir><file name="View.php" hash="c5722048d2eb4135074acf4b2a27f672"/></dir><file name="Transactionoverview.php" hash="40526ce2c4af87feed44d464cd7e6ac9"/><dir name="Widget"><dir name="Grid"><file name="Container.php" hash="b93320134d3110b6432218040db5ffbc"/></dir><dir name="View"><file name="Container.php" hash="d402dcb6071d8c24d892294a09cfbec6"/></dir></dir><file name="Widget.php" hash="1f9ae2c8024f5da73b1977dfd52f2d18"/></dir><dir name="Payment"><dir name="Method"><dir name="Form"><file name="Banktransfer.php" hash="a231f5ab5ad63031fe868e0f9f52610f"/><file name="Cc.php" hash="699fd33026e39737006f28db5e598be6"/><file name="Eps.php" hash="7ad3f6f582a7fbab8994ec5666dcafac"/><file name="Giropay.php" hash="6a5a005d1638740e74de2fc349c61a5f"/><file name="Ideal.php" hash="0b5cef6a75c6a8f82210777e7aa59183"/><file name="Invoice.php" hash="89b2573cee7a17a841e8e6eeffd1c609"/><file name="Paypal.php" hash="46f1782da1aa5012bece4c29fc02877e"/><file name="Prepayment.php" hash="1c0ab7247f95b7c77c811fe5673bf915"/><file name="Sepa.php" hash="4784d7fa0c2d4e59e43bbfac24d30fcb"/></dir><dir name="Info"><file name="Banktransfer.php" hash="305a88edf754556f71429337f757db58"/><file name="Cc.php" hash="a3634a25d40fa0d5ca625336e137fb53"/><file name="Eps.php" hash="30c52f4ecdda24b7c49abe41ab3176bc"/><file name="Giropay.php" hash="9287a33043c09544d285d21b49fe5c02"/><file name="Ideal.php" hash="f461565d677b5cd5255a1b2a31441ef3"/><file name="Invoice.php" hash="6d00fcbc62f149c672e7534ec3ef0ce2"/><file name="Paypal.php" hash="33e2d4054ea779569bf045f80c591de5"/><file name="Prepayment.php" hash="db9cc173b0b9162d3fe02495b0997d81"/><file name="Sepa.php" hash="c482a3d0b92967bf6bc5cc0dc67a14c4"/></dir><file name="NovalnetRedirect.php" hash="e7b09b15c7f4dc912475d95edc3a7e44"/></dir></dir><dir name="Sales"><dir name="Adminhtml"><dir name="Recurring"><dir name="Profile"><file name="View.php" hash="f9ca71342712d0ee020a38b95e1acc19"/></dir></dir></dir><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="500b8e1df55809805956c3fea10fff30"/></dir><dir name="Invoice"><file name="Totals.php" hash="1912290334b0ec75a56c491047d644f4"/></dir><file name="Totals.php" hash="bdadd23e5c416859b316f9b8c81b334f"/></dir><dir name="Recurring"><dir name="Profile"><file name="View.php" hash="93772e2667a307720258c1727ca6a323"/></dir></dir></dir></dir><dir name="Helper"><file name="AssignData.php" hash="025156034e7a08c7e2eab297aa690f47"/><file name="Data.php" hash="1e76e81a9831476062306b4aedf98ba8"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="Sales"><dir name="Order"><file name="Create.php" hash="8fde60d74f78c96569c6d3b73bd86932"/></dir></dir></dir><file name="Affiliate.php" hash="bca77b040491dff857c2cdb911a054a0"/><file name="Affiliateuser.php" hash="0372dbed2d1029a680959773b2709bfb"/><file name="Amountchanged.php" hash="7d0168bda12abb4f3311b3caaca98620"/><file name="Callback.php" hash="5d0f4ceb46107d9e1a9d817964fe0574"/><file name="Callbackscript.php" hash="4c3669523d330177521b95a4b2e22f94"/><file name="Config.php" hash="0aba11d02b87f5ca92da273c877535e3"/><file name="Factory.php" hash="d977180925781f21020ddcbeda1e63bc"/><file name="Ipn.php" hash="a34522774899d3947b1c01cf932047dc"/><dir name="Novalnet"><file name="Request.php" hash="cb8083d10dcfe9f51b0b3da0ceb84f32"/><dir name="Source"><file name="Callbacktypes.php" hash="3c7f9d5d7a678f4383b6788d5a019c9a"/><file name="Cctype.php" hash="472af325dab51588ef188197fb7d1359"/></dir></dir><file name="Observer.php" hash="13607ea2508da1e4813c1f3c0617a5be"/><dir name="Payment"><dir name="Method"><file name="Abstract.php" hash="7d3298d7c2b4b78f62d69b0af0331434"/><file name="NovalnetBanktransfer.php" hash="dfa091c9488ccc8ad6d5b5664b3c2bd8"/><file name="NovalnetCc.php" hash="ceba58bdb389d7dff1d6723a120581d3"/><file name="NovalnetEps.php" hash="b2febd2162047aec50ffe5aa1b109016"/><file name="NovalnetGiropay.php" hash="245d8ed31fcea8470e6866dc343b69f0"/><file name="NovalnetIdeal.php" hash="ed3c789b6af8ecc996bbbf5d4c6288d8"/><file name="NovalnetInvoice.php" hash="4275c69f13dfda8e88ce6d86d15ce2e4"/><file name="NovalnetPaypal.php" hash="9b99fc7f794cb243a6ff112ad4dc61d3"/><file name="NovalnetPrepayment.php" hash="496fcccae3a4fdc3a56ed40ef88b2021"/><file name="NovalnetSepa.php" hash="b77b45ea7ab6c0eeb5cb279927a11aa3"/></dir></dir><dir name="Quote"><dir name="Address"><dir name="Total"><file name="Nominal.php" hash="5abce0d137b3920cb71f9c4239f099c4"/></dir></dir></dir><dir name="Recurring"><file name="Profile.php" hash="629dd964723e6c9cf368027c8e10c524"/></dir><file name="Recurring.php" hash="19418343ec165bc7e2c5a59c658f0e9c"/><dir name="Resource"><dir name="Affiliate"><file name="Collection.php" hash="f2811c65cc8caa7052a7e7d189f343f0"/></dir><file name="Affiliate.php" hash="ab8d59fc4ba22fd7bc49a5fb71b70839"/><dir name="Affiliateuser"><file name="Collection.php" hash="2fbe2f731b543693f5fa8c6c5c3886ce"/></dir><file name="Affiliateuser.php" hash="e039c87c1e745b122f3bbd607cde5262"/><dir name="Amountchanged"><file name="Collection.php" hash="e37a1c838050f4dcd6ab704a8290edc6"/></dir><file name="Amountchanged.php" hash="60f629e50a145376e721d76f2bfecf5a"/><dir name="Callback"><file name="Collection.php" hash="96caaa34c22b23abe02f131bbdab1410"/></dir><file name="Callback.php" hash="0aed1718693e9a0cf9fa7499da8d6540"/><dir name="Recurring"><file name="Collection.php" hash="0425a54cbd5a151b9952ac1ca984cdfb"/></dir><file name="Recurring.php" hash="3025d79e76002ae78a2ecf83f22da5d8"/><dir name="Separefill"><file name="Collection.php" hash="80c806dfdd0f2d5e8d38d1b6ace1dde3"/></dir><file name="Separefill.php" hash="42998510658420d72d6daebf499d8510"/><dir name="Transactionoverview"><file name="Collection.php" hash="45936c49560ce385e726ec5569cbf346"/></dir><file name="Transactionoverview.php" hash="5c450ac67d4ce4fc61e587fb13426575"/><dir name="Transactionstatus"><file name="Collection.php" hash="7ee9610a4c61ca0eec01bbf85a53239a"/></dir><file name="Transactionstatus.php" hash="fa4d892f539e35d1cf72e2f86cb33fbc"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><dir name="Total"><file name="Grand.php" hash="56271520c3d438aabff16c610a363999"/></dir></dir><file name="Invoice.php" hash="2c17aa8cf3c7cc294705aa2c4414937b"/><file name="Payment.php" hash="a52e5e6842f1b6939e1c7c4d15f6ae4a"/><dir name="Pdf"><file name="Creditmemo.php" hash="6422058fa644b004fb9bb3f67eddb864"/><file name="Invoice.php" hash="9d3443f506db76be63f48443a0dc2d67"/></dir></dir></dir><file name="Separefill.php" hash="30071c48971a8e3aaf1f392753463e07"/><dir name="System"><dir name="Config"><file name="Activemethods.php" hash="d78fcf9ff4ad87920e13695ad04cfbcf"/><dir name="Backend"><file name="Notifyurl.php" hash="2de195613f33418ec11ef4af365c97e5"/></dir></dir></dir><file name="Transactionoverview.php" hash="efa669cfa0fece162980ea1025bd0b30"/><file name="Transactionstatus.php" hash="9634b88d4bd47535f2ba655a056c862f"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Novalnetpayment"><dir name="Configuration"><dir name="Wizard"><file name="PageController.php" hash="6db5c486829e4b24e18137fbe226998d"/></dir></dir><dir name="Information"><file name="ModuleController.php" hash="01d392c6fc4d448f3920fcbf83187bf2"/><file name="NovalnetmerchantadminController.php" hash="acc5a7b92ea208dfd9ffbac07f00245e"/></dir><dir name="Sales"><file name="OrderController.php" hash="fd622543ccde3af2f99c42551ebd2c69"/><dir name="Recurring"><file name="ProfileController.php" hash="a8edc5cef2ce4a2da0d3de7c3cd8e942"/></dir></dir><file name="TransactionController.php" hash="b8a4cade236884038107a8e8ecb35dfb"/><file name="TransactionoverviewController.php" hash="86e435849fcdeacaa5efe522b0bbd6da"/></dir></dir><file name="CcController.php" hash="e70003deb8b68e01bbdc04405e58210b"/><dir name="Checkout"><file name="OnepageController.php" hash="404883f46bb04da156603654ea501a35"/></dir><file name="GatewayController.php" hash="27a84824920299eeeb5649db2f70eac2"/></dir><dir name="etc"><file name="adminhtml.xml" hash="ad2030c8e043b3caa121821742f6a18b"/><file name="config.xml" hash="893f4db121f3cbf4f3c4cb95defc9e60"/><file name="system.xml" hash="8acf6e931a79c26e334752eeed4e757f"/></dir><dir name="sql"><dir name="novalnet_setup"><file name="mysql4-install-10.2.0.php" hash="56cad91274e1a14efe512f5b25978e49"/><file name="mysql4-upgrade-1.4.0-5.0.0.php" hash="ffccf2a5b0fd8064c835cbdd9c470579"/><file name="mysql4-upgrade-5.0.0-5.0.1.php" hash="8cd6252ea18fc8b834505ecc6a87a580"/><file name="mysql4-upgrade-5.0.1-5.0.2.php" hash="74c4f0092df70173fb269391b3b7eebb"/><file name="mysql4-upgrade-5.0.2-5.0.3.php" hash="946953f6fc66a2cf8831f903b696b9ba"/><file name="mysql4-upgrade-5.0.3-5.0.4.php" hash="b46b9f89231d23b9223ebb1c0008ff68"/><file name="mysql4-upgrade-5.0.4-10.0.0.php" hash="bbf1eec32a6fac3f17e5f3be68ba3950"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="novalnet"><file name="configuration.xml" hash="31ce321413371e6e84b50ef686012764"/></dir></dir><dir name="template"><dir name="novalnet"><dir><dir name="information"><file name="module.phtml" hash="3704fbf6762df384f7cb62a26b343d3c"/><file name="novalnetmerchantadmin.phtml" hash="cf8dcdac2873c4e1ec578a7178761daa"/></dir><dir name="payment"><dir name="configuration"><file name="formcontainer.phtml" hash="c20c7c3c8825d1c0ac343b45fecb8102"/><file name="paymentcontainer.phtml" hash="e5f5122ca43ab1a74c6d5479172febf5"/><file name="store_switcher.phtml" hash="53604516a94474d34db5f5f6839f5953"/><file name="viewcontainer.phtml" hash="92bf968020d0851cf6bf271627239599"/></dir><dir name="method"><dir name="form"><file name="Invoice.phtml" hash="b66c0012bf33ab11226977553d0412d6"/><file name="Prepayment.phtml" hash="b280e8c0b18dcbf8930b7c9ef40c9b48"/><file name="Sepa.phtml" hash="b375f23313e18523d5220b1daa24343e"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="9efb38554d632256e7a80fd384d4a63d"/><file name="Paypal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Prepayment.phtml" hash="8e0eceb8ec6c4929a77281f3b3297497"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir><dir name="pdf"><file name="Banktransfer.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Cc.phtml" hash="7054b56fdf9694049fb24cc4e985028e"/><file name="Eps.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Giropay.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Ideal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Invoice.phtml" hash="51a605d82841c5d7aebc2d97573f6f51"/><file name="Paypal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Prepayment.phtml" hash="a94b37263044648969d470a2cbe0eb6f"/><file name="Sepa.phtml" hash="844c5175f3e8549581017dd3113a044d"/></dir></dir></dir><dir name="sales"><dir name="order"><dir name="view"><file name="info.phtml" hash="4d2485bb1ce07a3affccb9b96fcb0373"/><dir name="tab"><file name="info.phtml" hash="f9a8262d2df1fe95ae7495b78614ff44"/><file name="transactionoverview.phtml" hash="f1d65fdb3134dbb0ab386b037fa092a9"/></dir></dir></dir></dir><dir name="transaction"><dir name="overview"><dir name="view"><file name="form.phtml" hash="cf4281cb1b4ab597b8df0da13995f584"/></dir></dir><dir name="view"><file name="form.phtml" hash="f7563df0ecb2e757c692feb531719a95"/></dir></dir><dir name="widget"><dir name="view"><file name="container.phtml" hash="0d9f98d4d35927b9407f2531841327a4"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="2a05f1042e71f20a141745685c5a5e4d"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="97c7dd8a44620234b53a4299d8f6275e"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="55583752a8d9a49877290182b154d4ff"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="3b73ee792e09f43ed69680d7fe6b8e4d"/><file name="Paypal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Prepayment.phtml" hash="59ca9e08328ba1c25b628b9046c7397a"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir><dir name="pdf"><file name="Banktransfer.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Cc.phtml" hash="7054b56fdf9694049fb24cc4e985028e"/><file name="Eps.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Giropay.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Ideal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Invoice.phtml" hash="51a605d82841c5d7aebc2d97573f6f51"/><file name="Paypal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Prepayment.phtml" hash="a94b37263044648969d470a2cbe0eb6f"/><file name="Sepa.phtml" hash="844c5175f3e8549581017dd3113a044d"/></dir></dir></dir><dir name="sales"><dir name="recurring"><dir name="profile"><file name="view.phtml" hash="dedae5e61bf16782952a770d25889a55"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="default"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="d19cba61050d5388b5024eba22aca304"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="5d6dd3e0e571ddb571c7f9fc0f83e1ac"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="2c5ca34e9672079d17b0e3937ce40a4f"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="3b73ee792e09f43ed69680d7fe6b8e4d"/><file name="Paypal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Prepayment.phtml" hash="59ca9e08328ba1c25b628b9046c7397a"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="rwd"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="56ffff9683449e3052c8321746b53146"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="5d6dd3e0e571ddb571c7f9fc0f83e1ac"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="2c5ca34e9672079d17b0e3937ce40a4f"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="3b73ee792e09f43ed69680d7fe6b8e4d"/><file name="Paypal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Prepayment.phtml" hash="59ca9e08328ba1c25b628b9046c7397a"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Novalnet_Payment.xml" hash="29d2dcb3ce9637da0d1a608772e88d8b"/></dir></target><target name="magelocale"><dir name="de_DE"><dir name="template"><dir name="email"><dir name="novalnet"><file name="novalnet_callback_email.html" hash="83f425ef8306d744fe37fd3a4bcb2f91"/></dir></dir></dir><file name="Novalnet_Payment.csv" hash="dd7c2d95f44737a32e4f092dfe2f7ead"/></dir><dir name="en_US"><dir name="template"><dir name="email"><dir name="novalnet"><file name="novalnet_callback_email.html" hash="83f425ef8306d744fe37fd3a4bcb2f91"/></dir></dir></dir><file name="Novalnet_Payment.csv" hash="473ec53420ba9eac1fcb6b3ab470ed39"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="novalnet"><file name="amex.png" hash="eba8a73ec679d171cb95a8e97ae7751c"/><file name="banktransfer.png" hash="e2bf8f3ddb71ed7b72ba83b60a979a5c"/><file name="cartasi.png" hash="84fefb3d2951736d4d7bf4bd03c54d85"/><file name="eps.png" hash="f8385180c7bd61ab177c883d3be3bb80"/><file name="giropay.png" hash="e3483d16bc59ff8b4875e56ed8dc9134"/><file name="ideal.png" hash="1a34e7dfc1bf6aa01327f38bc89d5b87"/><file name="invoice.png" hash="efd780bc0534bfe0bb1fa41774047a8f"/><file name="logo.png" hash="ebc76fa4208e642873f67d91fbfe2722"/><file name="maestro.png" hash="ab385b3321f7e1a5a3c184922fc9809e"/><file name="mastercard.png" hash="b1d57e40941ba8bf5af315268d24e1a7"/><file name="novalnet-loading-icon.gif" hash="a930c6d9a8470b5e31449a5683deb419"/><file name="paypal.png" hash="5ecff46ae20d4b1e6ffc5fba3e967668"/><file name="prepayment.png" hash="66f537fd62760ec1e90490b5b0085fd9"/><file name="sepa.png" hash="699fb8a970bd5ab2c4e50895c67ba861"/><file name="visacard.png" hash="7d2daec51fb0e39e9fda8564ec9b0569"/></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="novalnet"><file name="novalnetJquery.js" hash="ce805da206227418232aa9b1901b3480"/><file name="novalnetsepa.js" hash="7867a5a17258625e606d9f0ae893f7fb"/></dir></dir><dir name="."><file name="callback_novalnet2magento.php" hash="b84f2adabfb0cc2ed16bba56f682699c"/></dir></target></contents>
19
  <compatible/>
20
  <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
21
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Novalnet</name>
4
+ <version>10.2.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Novalnet AG ist ein deutsches EPayment - Unternehmen, bietet alle relevanten Zahlungsarten weltweit. / Novalnet is a German based payment service provider, which offers all the available payments and solutions worldwide.</summary>
10
  <description>The NOVALNET AG is an essential component of e-Payment platform that facilitates your company to process all type of payments. As one of the leading company in Online-Payment the NOVALNET AG provides its customers an individual, technically qualified secured Payment system and also the best possible support throughout. NOVALNET AG is not only an e-Payment provider but also we offer our Merchants an optimal strategic solution for easy payment processing which is pocket-friendly for our customer.</description>
11
+ <notes>- Implemented Novalnet SafetyPay and Novalnet Direct Debit SEPA payment methods.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
12
+ - Version compatibility has been checked.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
13
+ - Updated callback script file.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
14
+ - Updated auto refill option for Credit card, Direct Debit SEPA, Direct Debit Austria &amp;amp; Direct Debit German payment methods.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
15
+ - Updated Direct Debit SEPA payment module as per new testcase.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
16
+ - Implemented Referrer id, Reference parameters in all payment methods.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
17
+ - Updated callback script file as per new testcase.&amp;amp;amp;#xD;&amp;amp;#xD;&amp;#xD;&#xD;
18
+ - Added partial refund feature for Novalnet payment methods.</notes>
19
  <authors><author><name>Gabriel Dixon</name><user>Novalnet</user><email>gd@novalnet.de</email></author></authors>
20
+ <date>2016-07-30</date>
21
+ <time>05:58:51</time>
22
+ <contents><target name="magecommunity"><dir name="Novalnet"><dir><dir name="Payment"><dir name="Block"><dir name="Adminhtml"><dir name="Configuration"><dir name="Wizard"><dir name="Config"><file name="Form.php" hash="5c01c0c2d7c63befc9fe7f798929962e"/><dir name="Payment"><file name="Form.php" hash="44e9fde94bd2482a79e8f277cc937d6b"/></dir></dir><dir name="Page"><file name="Edit.php" hash="59e9b413aada07f1b3bf10bb9a43b544"/><file name="Save.php" hash="b1a7c090ccc884d26ae45a6c05b46f72"/><file name="View.php" hash="7c1ce5273e41fc3480173739f31a6ff9"/></dir></dir></dir><dir name="Information"><file name="Module.php" hash="75fd2101d18cd5d7beef47ea4a29f71a"/><file name="Novalnetmerchantadmin.php" hash="06da0d0cdd62ad813e7d44c7dea52c50"/></dir><dir name="Recurring"><dir name="Profile"><file name="Grid.php" hash="8d268602f66ca03d850dead164a06a25"/></dir><file name="Profile.php" hash="73fe4f1585514ef378400683867418bb"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="f431589d2f9257c0f066ae5826a8517d"/></dir><file name="Grid.php" hash="a13b0765c0996d64b4888d555b2c17d2"/><dir name="Invoice"><file name="Totals.php" hash="1ad938eb50e5c00d293b8c3a6ff9eebe"/><file name="View.php" hash="03a5c86e3ce5ccd8739693c2d946dc3e"/></dir><file name="Totals.php" hash="0f65a959f7334170718893dfe74026a0"/><dir name="View"><dir name="Tab"><file name="Invoices.php" hash="4c60eb90766404e50fee4c192ebcd426"/><dir name="Renderer"><file name="Invoices.php" hash="0ab1754a021e0229ce992cf41273c94a"/></dir><file name="TransactionOverview.php" hash="e36f9051093c5d9a8c21d47d1f16688e"/><file name="TransactionStatus.php" hash="a5d53fd379eabc30b548cb3337e1078b"/></dir></dir><file name="View.php" hash="0f614c6ec5c833ca7d431c28a65d1b6c"/></dir><file name="Order.php" hash="7d3f23b4d944138e25db603a161c764e"/><file name="Sales.php" hash="955045ba24383e85fdd2e4dd7a8fa437"/></dir><dir name="Transaction"><file name="Grid.php" hash="3eba0b9331de206d03ddd61c1731e14e"/><dir name="View"><file name="Form.php" hash="1960a7abc65e82c6893cb59cbd8fff13"/></dir><file name="View.php" hash="ee88ede00cfa4b0b2e90cd4c4fcc65f3"/></dir><file name="Transaction.php" hash="9d67e39e951ef6e31da72bfd4d648249"/><dir name="Transactionoverview"><file name="Grid.php" hash="3bd754b1281e16ce294b26f37bc969f6"/><dir name="View"><file name="Form.php" hash="3414da367d9f47ecc670233ddead8a56"/></dir><file name="View.php" hash="c5722048d2eb4135074acf4b2a27f672"/></dir><file name="Transactionoverview.php" hash="40526ce2c4af87feed44d464cd7e6ac9"/><dir name="Widget"><dir name="Grid"><file name="Container.php" hash="b93320134d3110b6432218040db5ffbc"/></dir><dir name="View"><file name="Container.php" hash="d402dcb6071d8c24d892294a09cfbec6"/></dir></dir><file name="Widget.php" hash="1f9ae2c8024f5da73b1977dfd52f2d18"/></dir><dir name="Payment"><dir name="Method"><dir name="Form"><file name="Banktransfer.php" hash="a231f5ab5ad63031fe868e0f9f52610f"/><file name="Cc.php" hash="699fd33026e39737006f28db5e598be6"/><file name="Eps.php" hash="7ad3f6f582a7fbab8994ec5666dcafac"/><file name="Giropay.php" hash="6a5a005d1638740e74de2fc349c61a5f"/><file name="Ideal.php" hash="0b5cef6a75c6a8f82210777e7aa59183"/><file name="Invoice.php" hash="89b2573cee7a17a841e8e6eeffd1c609"/><file name="Paypal.php" hash="46f1782da1aa5012bece4c29fc02877e"/><file name="Prepayment.php" hash="1c0ab7247f95b7c77c811fe5673bf915"/><file name="Sepa.php" hash="4784d7fa0c2d4e59e43bbfac24d30fcb"/></dir><dir name="Info"><file name="Banktransfer.php" hash="305a88edf754556f71429337f757db58"/><file name="Cc.php" hash="a3634a25d40fa0d5ca625336e137fb53"/><file name="Eps.php" hash="30c52f4ecdda24b7c49abe41ab3176bc"/><file name="Giropay.php" hash="9287a33043c09544d285d21b49fe5c02"/><file name="Ideal.php" hash="f461565d677b5cd5255a1b2a31441ef3"/><file name="Invoice.php" hash="6d00fcbc62f149c672e7534ec3ef0ce2"/><file name="Paypal.php" hash="33e2d4054ea779569bf045f80c591de5"/><file name="Prepayment.php" hash="db9cc173b0b9162d3fe02495b0997d81"/><file name="Sepa.php" hash="c482a3d0b92967bf6bc5cc0dc67a14c4"/></dir><file name="NovalnetRedirect.php" hash="af97697bc910f94b34b439eb44ec3efb"/></dir></dir><dir name="Sales"><dir name="Adminhtml"><dir name="Recurring"><dir name="Profile"><file name="View.php" hash="f9ca71342712d0ee020a38b95e1acc19"/></dir></dir></dir><dir name="Order"><dir name="Creditmemo"><file name="Totals.php" hash="500b8e1df55809805956c3fea10fff30"/></dir><dir name="Invoice"><file name="Totals.php" hash="1912290334b0ec75a56c491047d644f4"/></dir><file name="Totals.php" hash="bdadd23e5c416859b316f9b8c81b334f"/></dir><dir name="Recurring"><dir name="Profile"><file name="View.php" hash="93772e2667a307720258c1727ca6a323"/></dir></dir></dir></dir><dir name="Helper"><file name="AssignData.php" hash="b17428f21f6e226b98ca61e1478233c0"/><file name="Data.php" hash="07ad5e0060ed0ce67eb3a6d960512525"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="Sales"><dir name="Order"><file name="Create.php" hash="27a9f5fd901339e30cf4a95daefcf15e"/></dir></dir></dir><file name="Affiliate.php" hash="bca77b040491dff857c2cdb911a054a0"/><file name="Affiliateuser.php" hash="0372dbed2d1029a680959773b2709bfb"/><file name="Amountchanged.php" hash="7d0168bda12abb4f3311b3caaca98620"/><file name="Callback.php" hash="5d0f4ceb46107d9e1a9d817964fe0574"/><file name="Callbackscript.php" hash="f5dd838d4bc003f9842781927e0c079d"/><file name="Config.php" hash="bdaf9d20203a7488a595d5d213cc78e2"/><file name="Factory.php" hash="828522d945750100ec5edb013e0db6a0"/><file name="Ipn.php" hash="c945e58abcac72395184efd377d68eb4"/><dir name="Novalnet"><file name="Request.php" hash="8bd1d9d7d121b11a91b4b8587ad62bbc"/><dir name="Source"><file name="Callbacktypes.php" hash="3c7f9d5d7a678f4383b6788d5a019c9a"/><file name="Cctype.php" hash="472af325dab51588ef188197fb7d1359"/></dir></dir><file name="Observer.php" hash="c10567f1c3d9559974432fee1390342b"/><dir name="Payment"><dir name="Method"><file name="Abstract.php" hash="c7795c1a2d619952e22192136afe3a71"/><file name="NovalnetBanktransfer.php" hash="dfa091c9488ccc8ad6d5b5664b3c2bd8"/><file name="NovalnetCc.php" hash="ceba58bdb389d7dff1d6723a120581d3"/><file name="NovalnetEps.php" hash="b2febd2162047aec50ffe5aa1b109016"/><file name="NovalnetGiropay.php" hash="245d8ed31fcea8470e6866dc343b69f0"/><file name="NovalnetIdeal.php" hash="ed3c789b6af8ecc996bbbf5d4c6288d8"/><file name="NovalnetInvoice.php" hash="4275c69f13dfda8e88ce6d86d15ce2e4"/><file name="NovalnetPaypal.php" hash="9b99fc7f794cb243a6ff112ad4dc61d3"/><file name="NovalnetPrepayment.php" hash="496fcccae3a4fdc3a56ed40ef88b2021"/><file name="NovalnetSepa.php" hash="b77b45ea7ab6c0eeb5cb279927a11aa3"/></dir></dir><dir name="Quote"><dir name="Address"><dir name="Total"><file name="Nominal.php" hash="5abce0d137b3920cb71f9c4239f099c4"/></dir></dir></dir><dir name="Recurring"><file name="Profile.php" hash="629dd964723e6c9cf368027c8e10c524"/></dir><file name="Recurring.php" hash="183e3e4d45de8d387c48d2749e5fa14a"/><dir name="Resource"><dir name="Affiliate"><file name="Collection.php" hash="f2811c65cc8caa7052a7e7d189f343f0"/></dir><file name="Affiliate.php" hash="ab8d59fc4ba22fd7bc49a5fb71b70839"/><dir name="Affiliateuser"><file name="Collection.php" hash="2fbe2f731b543693f5fa8c6c5c3886ce"/></dir><file name="Affiliateuser.php" hash="e039c87c1e745b122f3bbd607cde5262"/><dir name="Amountchanged"><file name="Collection.php" hash="e37a1c838050f4dcd6ab704a8290edc6"/></dir><file name="Amountchanged.php" hash="60f629e50a145376e721d76f2bfecf5a"/><dir name="Callback"><file name="Collection.php" hash="96caaa34c22b23abe02f131bbdab1410"/></dir><file name="Callback.php" hash="0aed1718693e9a0cf9fa7499da8d6540"/><dir name="Recurring"><file name="Collection.php" hash="0425a54cbd5a151b9952ac1ca984cdfb"/></dir><file name="Recurring.php" hash="3025d79e76002ae78a2ecf83f22da5d8"/><dir name="Separefill"><file name="Collection.php" hash="80c806dfdd0f2d5e8d38d1b6ace1dde3"/></dir><file name="Separefill.php" hash="42998510658420d72d6daebf499d8510"/><dir name="Transactionoverview"><file name="Collection.php" hash="45936c49560ce385e726ec5569cbf346"/></dir><file name="Transactionoverview.php" hash="5c450ac67d4ce4fc61e587fb13426575"/><dir name="Transactionstatus"><file name="Collection.php" hash="7ee9610a4c61ca0eec01bbf85a53239a"/></dir><file name="Transactionstatus.php" hash="fa4d892f539e35d1cf72e2f86cb33fbc"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><dir name="Total"><file name="Grand.php" hash="56271520c3d438aabff16c610a363999"/></dir></dir><file name="Invoice.php" hash="11b9443a4efe9f89eed376bb8499ce01"/><file name="Payment.php" hash="a52e5e6842f1b6939e1c7c4d15f6ae4a"/><dir name="Pdf"><file name="Creditmemo.php" hash="6422058fa644b004fb9bb3f67eddb864"/><file name="Invoice.php" hash="9d3443f506db76be63f48443a0dc2d67"/></dir></dir></dir><file name="Separefill.php" hash="30071c48971a8e3aaf1f392753463e07"/><dir name="System"><dir name="Config"><file name="Activemethods.php" hash="d78fcf9ff4ad87920e13695ad04cfbcf"/><dir name="Backend"><file name="Notifyurl.php" hash="2de195613f33418ec11ef4af365c97e5"/></dir></dir></dir><file name="Transactionoverview.php" hash="efa669cfa0fece162980ea1025bd0b30"/><file name="Transactionstatus.php" hash="9634b88d4bd47535f2ba655a056c862f"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Novalnetpayment"><dir name="Configuration"><dir name="Wizard"><file name="PageController.php" hash="6db5c486829e4b24e18137fbe226998d"/></dir></dir><dir name="Information"><file name="ModuleController.php" hash="01d392c6fc4d448f3920fcbf83187bf2"/><file name="NovalnetmerchantadminController.php" hash="acc5a7b92ea208dfd9ffbac07f00245e"/></dir><dir name="Sales"><file name="OrderController.php" hash="d20c42e3b735bb0a6dd838440343d9be"/><dir name="Recurring"><file name="ProfileController.php" hash="a8edc5cef2ce4a2da0d3de7c3cd8e942"/></dir></dir><file name="TransactionController.php" hash="b8a4cade236884038107a8e8ecb35dfb"/><file name="TransactionoverviewController.php" hash="86e435849fcdeacaa5efe522b0bbd6da"/></dir></dir><file name="CcController.php" hash="1d3c8fd71174f96bb44e93f1f877e503"/><dir name="Checkout"><file name="OnepageController.php" hash="404883f46bb04da156603654ea501a35"/></dir><file name="GatewayController.php" hash="99f7e737ad61e15dbe64ab78452daba8"/></dir><dir name="etc"><file name="adminhtml.xml" hash="ad2030c8e043b3caa121821742f6a18b"/><file name="config.xml" hash="ffc8f6f6d0257e147d13903af279b784"/><file name="system.xml" hash="13c02396af337e5064106a26505fc2f6"/></dir><dir name="sql"><dir name="novalnet_setup"><file name="mysql4-install-10.2.1.php" hash="56cad91274e1a14efe512f5b25978e49"/><file name="mysql4-upgrade-1.4.0-5.0.0.php" hash="ffccf2a5b0fd8064c835cbdd9c470579"/><file name="mysql4-upgrade-5.0.0-5.0.1.php" hash="8cd6252ea18fc8b834505ecc6a87a580"/><file name="mysql4-upgrade-5.0.1-5.0.2.php" hash="74c4f0092df70173fb269391b3b7eebb"/><file name="mysql4-upgrade-5.0.2-5.0.3.php" hash="946953f6fc66a2cf8831f903b696b9ba"/><file name="mysql4-upgrade-5.0.3-5.0.4.php" hash="b46b9f89231d23b9223ebb1c0008ff68"/><file name="mysql4-upgrade-5.0.4-10.0.0.php" hash="bbf1eec32a6fac3f17e5f3be68ba3950"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="novalnet"><file name="configuration.xml" hash="31ce321413371e6e84b50ef686012764"/></dir></dir><dir name="template"><dir name="novalnet"><dir><dir name="information"><file name="module.phtml" hash="3704fbf6762df384f7cb62a26b343d3c"/><file name="novalnetmerchantadmin.phtml" hash="cf8dcdac2873c4e1ec578a7178761daa"/></dir><dir name="payment"><dir name="configuration"><file name="formcontainer.phtml" hash="c20c7c3c8825d1c0ac343b45fecb8102"/><file name="paymentcontainer.phtml" hash="e5f5122ca43ab1a74c6d5479172febf5"/><file name="store_switcher.phtml" hash="53604516a94474d34db5f5f6839f5953"/><file name="viewcontainer.phtml" hash="92bf968020d0851cf6bf271627239599"/></dir><dir name="method"><dir name="form"><file name="Invoice.phtml" hash="b66c0012bf33ab11226977553d0412d6"/><file name="Prepayment.phtml" hash="b280e8c0b18dcbf8930b7c9ef40c9b48"/><file name="Sepa.phtml" hash="b375f23313e18523d5220b1daa24343e"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="504759518587b834d18d3160bb135766"/><file name="Paypal.phtml" hash="19fb1cd5b42b7af02098df5c995bb7c0"/><file name="Prepayment.phtml" hash="5062509344972a5dd78a07ff8f4bd817"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir><dir name="pdf"><file name="Banktransfer.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Cc.phtml" hash="7054b56fdf9694049fb24cc4e985028e"/><file name="Eps.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Giropay.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Ideal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Invoice.phtml" hash="fb0b83766a4648d2f23418e90f8c4e3d"/><file name="Paypal.phtml" hash="27d6943b314016b4f314df94431e2605"/><file name="Prepayment.phtml" hash="7dd82810154ab3fa9da6cc5865a80c3a"/><file name="Sepa.phtml" hash="844c5175f3e8549581017dd3113a044d"/></dir></dir></dir><dir name="sales"><dir name="order"><dir name="view"><file name="info.phtml" hash="4d2485bb1ce07a3affccb9b96fcb0373"/><dir name="tab"><file name="info.phtml" hash="6e5fe4f3db258755e9e2bcaf0be5ab74"/><file name="transactionoverview.phtml" hash="f1d65fdb3134dbb0ab386b037fa092a9"/></dir></dir></dir></dir><dir name="transaction"><dir name="overview"><dir name="view"><file name="form.phtml" hash="cf4281cb1b4ab597b8df0da13995f584"/></dir></dir><dir name="view"><file name="form.phtml" hash="f7563df0ecb2e757c692feb531719a95"/></dir></dir><dir name="widget"><dir name="view"><file name="container.phtml" hash="0d9f98d4d35927b9407f2531841327a4"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="2a05f1042e71f20a141745685c5a5e4d"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="97c7dd8a44620234b53a4299d8f6275e"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="55583752a8d9a49877290182b154d4ff"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="504759518587b834d18d3160bb135766"/><file name="Paypal.phtml" hash="19fb1cd5b42b7af02098df5c995bb7c0"/><file name="Prepayment.phtml" hash="5062509344972a5dd78a07ff8f4bd817"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir><dir name="pdf"><file name="Banktransfer.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Cc.phtml" hash="7054b56fdf9694049fb24cc4e985028e"/><file name="Eps.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Giropay.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Ideal.phtml" hash="fabf389f502a5b54dcd9bde35656b296"/><file name="Invoice.phtml" hash="fb0b83766a4648d2f23418e90f8c4e3d"/><file name="Paypal.phtml" hash="59a2b556006c488e06d46ee11a031a1b"/><file name="Prepayment.phtml" hash="7dd82810154ab3fa9da6cc5865a80c3a"/><file name="Sepa.phtml" hash="844c5175f3e8549581017dd3113a044d"/></dir></dir></dir><dir name="sales"><dir name="recurring"><dir name="profile"><file name="view.phtml" hash="dedae5e61bf16782952a770d25889a55"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="default"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="d19cba61050d5388b5024eba22aca304"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="5d6dd3e0e571ddb571c7f9fc0f83e1ac"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="2c5ca34e9672079d17b0e3937ce40a4f"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="504759518587b834d18d3160bb135766"/><file name="Paypal.phtml" hash="19fb1cd5b42b7af02098df5c995bb7c0"/><file name="Prepayment.phtml" hash="5062509344972a5dd78a07ff8f4bd817"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="rwd"><dir name="default"><dir name="layout"><file name="novalnet.xml" hash="c3450eab6dda7bd4007d56147a3dad70"/></dir><dir name="template"><dir name="novalnet"><dir><dir name="payment"><dir name="method"><dir name="form"><file name="Banktransfer.phtml" hash="73a1a1441e5605048b842cdf6058784d"/><file name="Cc.phtml" hash="30d1c867ca2eb70b16d7408433dab37e"/><file name="Cciframe.phtml" hash="cf49522ec7479dc2bd78757a3201cd26"/><file name="Eps.phtml" hash="13e2d40c9918e79db8f796b6de6e2fee"/><file name="Giropay.phtml" hash="465bf70b4d56f22ce7c40b19dc503474"/><file name="Ideal.phtml" hash="07475d5b533f8e34e32cd30351ea089e"/><file name="Invoice.phtml" hash="5d6dd3e0e571ddb571c7f9fc0f83e1ac"/><file name="Paypal.phtml" hash="5a0e859b9180cb45a0dd8c550afa1e4e"/><file name="Prepayment.phtml" hash="67d18168c59d5fb4d2993aca5703dd2d"/><file name="Sepa.phtml" hash="2c5ca34e9672079d17b0e3937ce40a4f"/></dir><dir name="info"><file name="Banktransfer.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Cc.phtml" hash="d01de0cbb1ad4147130aa8129a91a3ff"/><file name="Eps.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Giropay.phtml" hash="7a56946c37e1d565518d84a95857d850"/><file name="Ideal.phtml" hash="5e8590247ce9fafa34770f24b1b17e16"/><file name="Invoice.phtml" hash="504759518587b834d18d3160bb135766"/><file name="Paypal.phtml" hash="19fb1cd5b42b7af02098df5c995bb7c0"/><file name="Prepayment.phtml" hash="5062509344972a5dd78a07ff8f4bd817"/><file name="Sepa.phtml" hash="0a6638342e188704ce37aa3207349642"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Novalnet_Payment.xml" hash="29d2dcb3ce9637da0d1a608772e88d8b"/></dir></target><target name="magelocale"><dir name="de_DE"><dir name="template"><dir name="email"><dir name="novalnet"><file name="novalnet_callback_email.html" hash="83f425ef8306d744fe37fd3a4bcb2f91"/></dir></dir></dir><file name="Novalnet_Payment.csv" hash="784358123ddc592a72b93af073e8d726"/></dir><dir name="en_US"><dir name="template"><dir name="email"><dir name="novalnet"><file name="novalnet_callback_email.html" hash="83f425ef8306d744fe37fd3a4bcb2f91"/></dir></dir></dir><file name="Novalnet_Payment.csv" hash="87aabeb92849d751a16289d7a6c98b80"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="novalnet"><file name="amex.png" hash="eba8a73ec679d171cb95a8e97ae7751c"/><file name="banktransfer.png" hash="e2bf8f3ddb71ed7b72ba83b60a979a5c"/><file name="cartasi.png" hash="84fefb3d2951736d4d7bf4bd03c54d85"/><file name="eps.png" hash="f8385180c7bd61ab177c883d3be3bb80"/><file name="giropay.png" hash="e3483d16bc59ff8b4875e56ed8dc9134"/><file name="ideal.png" hash="1a34e7dfc1bf6aa01327f38bc89d5b87"/><file name="invoice.png" hash="efd780bc0534bfe0bb1fa41774047a8f"/><file name="maestro.png" hash="ab385b3321f7e1a5a3c184922fc9809e"/><file name="mastercard.png" hash="b1d57e40941ba8bf5af315268d24e1a7"/><file name="novalnet-loading-icon.gif" hash="a930c6d9a8470b5e31449a5683deb419"/><file name="paypal.png" hash="5ecff46ae20d4b1e6ffc5fba3e967668"/><file name="prepayment.png" hash="66f537fd62760ec1e90490b5b0085fd9"/><file name="sepa.png" hash="699fb8a970bd5ab2c4e50895c67ba861"/><file name="visacard.png" hash="7d2daec51fb0e39e9fda8564ec9b0569"/></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="novalnet"><file name="novalnetJquery.js" hash="895323ed2f7258af4fae2c738c8aea49"/><file name="novalnetsepa.js" hash="7867a5a17258625e606d9f0ae893f7fb"/></dir></dir><dir name="."><file name="callback_novalnet2magento.php" hash="b84f2adabfb0cc2ed16bba56f682699c"/></dir></target></contents>
23
  <compatible/>
24
  <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
25
  </package>
skin/frontend/base/default/images/novalnet/logo.png DELETED
Binary file