/skin/frontend/ultimo/default/onestepcheckout/js/sagePaySuite_Checkout.js

https://gitlab.com/Tung/magento · JavaScript · 993 lines · 834 code · 139 blank · 20 comment · 285 complexity · 0546a4213dd836fb40710d5c6977d5c0 MD5 · raw file

  1. notifyThreedError = function(msg){
  2. Control.Window.windows.each(function(w){
  3. if(w.container.visible()){
  4. w.close();
  5. }
  6. });
  7. // if((typeof checkout.accordion == 'object')){
  8. // checkout.accordion.openSection('opc-payment');
  9. // }
  10. alert(msg);
  11. var loading_osc = $$('div#onestepcheckout-place-order-loading');
  12. if(loading_osc.length){
  13. $('onestepcheckout-button-place-order').removeClassName('place-order-loader').addClassName('btn-checkout');
  14. $('onestepcheckout-button-place-order').removeAttribute('disabled');
  15. loading_osc.invoke('hide');
  16. already_placing_order = false;
  17. }
  18. }
  19. restoreOscLoad = function(){
  20. //Hide loading indicator on OSC//
  21. var loading_osc = $$('div.onestepcheckout-place-order-loading');
  22. if(loading_osc.length){
  23. $('onestepcheckout-place-order').removeClassName('grey').addClassName('orange');
  24. $('onestepcheckout-place-order').removeAttribute('disabled');
  25. loading_osc.invoke('hide');
  26. already_placing_order = false;
  27. }else{
  28. var loading_osc = $$('div#onestepcheckout-place-order-loading');
  29. if(loading_osc.length){
  30. $('onestepcheckout-button-place-order').removeClassName('place-order-loader').addClassName('btn-checkout');
  31. $('onestepcheckout-button-place-order').removeAttribute('disabled');
  32. loading_osc.invoke('hide');
  33. already_placing_order = false;
  34. }
  35. }
  36. }
  37. if(typeof EbizmartsSagePaySuite == 'undefined') {
  38. var EbizmartsSagePaySuite = {};
  39. }
  40. EbizmartsSagePaySuite.Checkout = Class.create();
  41. EbizmartsSagePaySuite.Checkout.prototype = {
  42. initialize: function(config){
  43. this.config = config;
  44. this.servercode = 'sagepayserver';
  45. this.directcode = 'sagepaydirectpro';
  46. this.paypalcode = 'sagepaypaypal';
  47. this.formcode = 'sagepayform';
  48. this.code = '';
  49. this.oldUrl = '';
  50. if(this.getConfig('review')){
  51. this.oldUrl = this.getConfig('review').saveUrl;
  52. this.getConfig('review').saveUrl = SuiteConfig.getConfig('global', 'sgps_saveorder_url');
  53. this.getConfig('review').onSave = this.reviewSave.bindAsEventListener(this);
  54. }else if(this.getConfig('osc')){
  55. Event.stopObserving($('onestepcheckout-form'));
  56. $('onestepcheckout-form')._submit = $('onestepcheckout-form').submit;
  57. $('onestepcheckout-form').submit = function(){ this.reviewSave(); }.bind(this);
  58. }else if(this.getConfig('magestore')){
  59. Event.stopObserving($('one-step-checkout-form'));
  60. $('one-step-checkout-form')._submit = $('one-step-checkout-form').submit;
  61. $('one-step-checkout-form').submit = function(){ this.reviewSave(); }.bind(this);
  62. }else if(this.getConfig('msform')){
  63. this.getConfig('msform').observe('submit', function(evmsc){Event.stop(evmsc);this.reviewSave(evmsc);}.bind(this));
  64. }
  65. var blFormMAC = $('multishipping-billing-form');
  66. if(blFormMAC){
  67. blFormMAC.observe('submit', function(_event_){ Event.stop(_event_); this.setPaymentMethod(); }.bind(this));
  68. }
  69. var paymentSubmit = this.getPaymentSubmit();
  70. if(paymentSubmit) {
  71. if(this.getCurrentCheckoutStep() == 'opc-review'){//Magento 1.5.x+
  72. this.setPaymentMethod(true);
  73. }else{
  74. paymentSubmit.observe('click', this.setPaymentMethod.bindAsEventListener(this));
  75. }
  76. }
  77. },
  78. evalTransport: function(transport){
  79. try { response = eval('('+transport.responseText+')') } catch(e) { response = {} }
  80. return response;
  81. },
  82. getConfig: function(instance){
  83. return (this.config[instance] != 'undefined' ? this.config[instance] : false);
  84. },
  85. getCurrentCheckoutStep: function(){
  86. return this.getConfig('checkout').accordion.currentSection;
  87. },
  88. getPaymentSubmit: function(){
  89. var elements = $$("#opc-payment [onclick]");
  90. for(var i=0; i<elements.length; i++) {
  91. // IE problems with readAttribute/getAttribute returning invalid results
  92. var attrubutes = [elements[i].readAttribute('onclick'), elements[i].getAttribute('onclick')];
  93. for(var j=0; j<attrubutes.length; j++) {
  94. if(Object.isString(attrubutes[j]) && -1 !== attrubutes[j].search(/payment\.save/)) {
  95. return elements[i];
  96. }
  97. }
  98. }
  99. return false;
  100. },
  101. getShippingMethodSubmit: function(){
  102. var elements = $$("#opc-shipping_method [onclick]");
  103. for(var i=0; i<elements.length; i++) {
  104. var attrubutes = [elements[i].readAttribute('onclick'), elements[i].getAttribute('onclick')];
  105. for(var j=0; j<attrubutes.length; j++) {
  106. if(Object.isString(attrubutes[j]) && -1 !== attrubutes[j].search(/shippingMethod\.save/)) {
  107. return elements[i];
  108. }
  109. }
  110. }
  111. return false;
  112. },
  113. getPaymentMethod: function(){
  114. var form = null;
  115. if($('multishipping-billing-form')){
  116. form = $('multishipping-billing-form');
  117. }else if(this.getConfig('osc')){
  118. form = this.getConfig('oscFrm');
  119. }else if(this.getConfig('magestore')){
  120. form = this.getConfig('magestoreFrm');
  121. }else if((typeof this.getConfig('payment')) != 'undefined'){
  122. form = $(this.getConfig('payment').form);
  123. }
  124. if(form === null){
  125. return this.code;
  126. }
  127. var checkedPayment = null
  128. form.getInputs('radio', 'payment[method]').each(function(el){
  129. if(el.checked){
  130. checkedPayment = el.value;
  131. throw $break;
  132. }
  133. });
  134. if(checkedPayment != null){
  135. return checkedPayment;
  136. }
  137. return this.code;
  138. },
  139. isFormPaymentMethod: function(){
  140. return (this.getPaymentMethod() === this.formcode);
  141. },
  142. isServerPaymentMethod: function(){
  143. return (this.getPaymentMethod() === this.servercode || ($('suite_ms_payment_method') && $('suite_ms_payment_method').getValue()==this.servercode));
  144. },
  145. isDirectPaymentMethod: function(){
  146. return (this.getPaymentMethod() === this.directcode);
  147. },
  148. isSagePay: function(){
  149. var isSagePay = false;
  150. if( (this.getPaymentMethod() === this.formcode) || (this.getPaymentMethod() === this.directcode) ||
  151. (this.getPaymentMethod() === this.servercode) || (this.getPaymentMethod() === this.paypalcode) ) {
  152. isSagePay = true;
  153. }
  154. return isSagePay;
  155. },
  156. growlError: function(msg){
  157. alert(msg);
  158. return;
  159. try{
  160. var ng = new k.Growler({location:"tc"});
  161. ng.error(msg, {life:10});
  162. }catch(grwlerror){
  163. alert(msg);
  164. }
  165. },
  166. growlWarn: function(msg){
  167. alert(msg);
  168. return;
  169. try{
  170. var ng = new k.Growler({location:"tc"});
  171. ng.warn(msg, {life:10});
  172. }catch(grwlerror){
  173. alert(msg);
  174. }
  175. },
  176. isDirectTokenTransaction: function(){
  177. var tokenRadios = $$('div#payment_form_sagepaydirectpro ul.tokensage li.tokencard-radio input');
  178. if(tokenRadios.length){
  179. if(tokenRadios[0].disabled === false){
  180. return true;
  181. }
  182. }
  183. return false;
  184. },
  185. isServerTokenTransaction: function(){
  186. var tokenRadios = $$('div#payment_form_sagepayserver ul.tokensage li.tokencard-radio input');
  187. if(tokenRadios.length){
  188. if(tokenRadios[0].disabled === false){
  189. return true;
  190. }
  191. }
  192. return false;
  193. },
  194. getServerSecuredImage: function(){
  195. return new Element('img', {'src':SuiteConfig.getConfig('server', 'secured_by_image'), 'style':'margin-bottom:5px'});
  196. },
  197. setShippingMethod: function(){
  198. try{
  199. if($('sagepaydirectpro_cc_type')){
  200. $('sagepaydirectpro_cc_type').selectedIndex = 0;
  201. }
  202. }catch(ser){
  203. alert(ser);
  204. }
  205. },
  206. setPaymentMethod: function(modcompat){
  207. if(this.getConfig('review')){
  208. if(!this.isSagePay()) {
  209. this.getConfig('review').saveUrl = this.oldUrl;
  210. }
  211. else{
  212. this.getConfig('review').saveUrl = SuiteConfig.getConfig('global', 'sgps_saveorder_url');
  213. }
  214. }
  215. // Remove Server InCheckout iFrame if exists
  216. if($('sagepaysuite-server-incheckout-iframe')){
  217. $('checkout-review-submit').show();
  218. $('sagepaysuite-server-incheckout-iframe').remove();
  219. }
  220. if(this.isServerPaymentMethod()){
  221. if( parseInt(SuiteConfig.getConfig('global','token_enabled')) === 1 && ($('remembertoken-sagepayserver').checked === true) ){
  222. $('sagepayserver-dummy-link').writeAttribute('href', SuiteConfig.getConfig('server','new_token_url'));
  223. if(this.isServerTokenTransaction()){
  224. if($('multishipping-billing-form')){
  225. $('multishipping-billing-form').submit();
  226. }
  227. return;
  228. }
  229. var lcontwmt = new Element('div',{className: 'lcontainer'});
  230. var heit = parseInt(SuiteConfig.getConfig('server','token_iframe_height'))+80;
  231. lcontwmt.setStyle({'height':heit.toString() + 'px'});
  232. var wmt = new Control.Modal('sagepayserver-dummy-link',{
  233. className: 'modal',
  234. iframe: true,
  235. closeOnClick: false,
  236. insertRemoteContentAt: lcontwmt,
  237. height: SuiteConfig.getConfig('server','token_iframe_height'),
  238. width: SuiteConfig.getConfig('server','token_iframe_width'),
  239. fade: true,
  240. afterClose: function(){
  241. this.getTokensHtml();
  242. }.bind(this)
  243. })
  244. wmt.container.insert(lcontwmt);
  245. wmt.container.down().insert(this.getServerSecuredImage());
  246. wmt.container.setStyle({'height':heit.toString() + 'px'});
  247. wmt.open();
  248. if(this.getConfig('checkout') && (modcompat == undefined)){
  249. this.getConfig('checkout').accordion.openSection('opc-payment');
  250. }
  251. return;
  252. }
  253. }else if(this.isDirectPaymentMethod() && parseInt(SuiteConfig.getConfig('global','token_enabled')) === 1 && ($('remembertoken-sagepaydirectpro').checked === true)){
  254. if(this.isDirectTokenTransaction()){
  255. return;
  256. }
  257. try{
  258. if(new Validation(this.getConfig('payment').form).validate() === false){
  259. return;
  260. }
  261. }catch(one){}
  262. if(this.getConfig('osc')){
  263. var valOsc = new VarienForm('onestepcheckout-form').validator.validate();
  264. if(!valOsc){
  265. return;
  266. }
  267. }else if(this.getConfig('magestore')){
  268. var valOsc = new VarienForm('one-step-checkout-form').validator.validate();
  269. if(!valOsc){
  270. return;
  271. }
  272. }
  273. var pmntForm = (this.getConfig('osc') ? this.getConfig('oscFrm') : $('co-payment-form'));
  274. if(this.getConfig('magestore')){
  275. pmntForm = this.getConfig('magestoreFrm');
  276. }
  277. new Ajax.Request(SuiteConfig.getConfig('direct','sgps_registerdtoken_url'),{
  278. method:"post",
  279. parameters: Form.serialize(pmntForm),
  280. onSuccess:function(f){
  281. try{
  282. this.getTokensHtml();
  283. var d=f.responseText.evalJSON();
  284. if(d.response_status=="INVALID"||d.response_status=="MALFORMED"||d.response_status=="ERROR"||d.response_status=="FAIL"){
  285. if(this.getConfig('checkout')){
  286. this.getConfig('checkout').accordion.openSection('opc-payment');
  287. }
  288. this.growlWarn("An error ocurred with Sage Pay Direct:\n" + d.response_status_detail.toString());
  289. if(this.getConfig('osc')){
  290. $('onestepcheckout-place-order').removeClassName('grey').addClassName('orange');
  291. $$('div.onestepcheckout-place-order-loading').invoke('remove');
  292. return;
  293. }else if(this.getConfig('magestore')){
  294. $('onestepcheckout-button-place-order').addClassName('btn-checkout');
  295. $('onestepcheckout-button-place-order').removeClassName('place-order-loader');
  296. }
  297. }else if(d.response_status == 'threed'){
  298. $('sagepaydirectpro-dummy-link').writeAttribute('href', d.url);
  299. }
  300. if(this.getConfig('osc')){
  301. this.reviewSave({'tokenSuccess':true});
  302. return;
  303. }else if(this.getConfig('magestore')){
  304. this.reviewSave({'tokenSuccess':true});
  305. return;
  306. }
  307. }catch(alfaEr){
  308. if(this.getConfig('checkout')){
  309. this.getConfig('checkout').accordion.openSection('opc-payment');
  310. }
  311. this.growlError(f.responseText.toString());
  312. }
  313. }.bind(this)
  314. });
  315. }
  316. },
  317. getTokensHtml: function(){
  318. new Ajax.Updater(('tokencards-payment-' + this.getPaymentMethod()), SuiteConfig.getConfig('global', 'html_paymentmethods_url'), {
  319. parameters: { payment_method: this.getPaymentMethod() },
  320. onComplete:function(){
  321. if($$('a.addnew').length > 1){
  322. $$('a.addnew').each(function(el){
  323. if(!el.visible()){
  324. el.remove();
  325. }
  326. })
  327. }
  328. toggleNewCard(2);
  329. if($('onestepcheckout-form') && this.isServerPaymentMethod()){
  330. toggleNewCard(1);
  331. var tokens = $$('div#payment_form_sagepayserver ul li.tokencard-radio input');
  332. if(tokens.length){
  333. tokens.each(function(radiob){
  334. radiob.disabled = true;
  335. radiob.removeAttribute('checked');
  336. });
  337. tokens.first().writeAttribute('checked', 'checked');
  338. tokens.first().disabled = false;
  339. $('onestepcheckout-form').submit();
  340. }else{
  341. this.resetOscLoading();
  342. }
  343. }
  344. }.bind(this)
  345. });
  346. },
  347. resetOscLoading: function(){
  348. restoreOscLoad();
  349. },
  350. reviewSave: function(transport){
  351. if((typeof transport) == 'undefined'){
  352. var transport = {};
  353. }
  354. //OSC\\
  355. if((typeof transport.responseText) == 'undefined' && ($('onestepcheckout-form')||$('one-step-checkout-form'))){
  356. if(!this.isSagePay()){
  357. if(this.getConfig('osc')){
  358. $('onestepcheckout-form')._submit();
  359. }else if(this.getConfig('magestore')){
  360. $('one-step-checkout-form')._submit();
  361. }
  362. return;
  363. }
  364. if(this.getConfig('osc')){
  365. if(this.isFormPaymentMethod()){
  366. new Ajax.Request(SuiteConfig.getConfig('global', 'sgps_saveorder_url'),{
  367. method:"post",
  368. parameters: Form.serialize($('onestepcheckout-form')),
  369. onSuccess:function(f){
  370. var d = f.responseText.evalJSON();
  371. if(d.response_status == 'ERROR'){
  372. alert(d.response_status_detail);
  373. this.resetOscLoading();
  374. return;
  375. }
  376. setLocation(SuiteConfig.getConfig('form','url'));
  377. }
  378. });
  379. return;
  380. }
  381. }else if(this.getConfig('magestore')){
  382. if(this.isFormPaymentMethod()){
  383. disable_payment();
  384. new Ajax.Request(SuiteConfig.getConfig('global', 'sgps_saveorder_url'),{
  385. method:"post",
  386. parameters: Form.serialize($('one-step-checkout-form')),
  387. onSuccess:function(f){
  388. var d = f.responseText.evalJSON();
  389. if(d.response_status == 'ERROR'){
  390. alert(d.response_status_detail);
  391. this.resetOscLoading();
  392. return;
  393. }
  394. setLocation(SuiteConfig.getConfig('form','url'));
  395. }
  396. });
  397. return;
  398. }
  399. }
  400. if((this.isDirectPaymentMethod() || this.isServerPaymentMethod()) && parseInt(SuiteConfig.getConfig('global','token_enabled')) === 1){
  401. if((typeof transport.tokenSuccess) == 'undefined'){
  402. this.setPaymentMethod();
  403. if(!this.isDirectTokenTransaction() && !this.isServerTokenTransaction() && (($('remembertoken-sagepaydirectpro') && $('remembertoken-sagepaydirectpro').checked === true) || ($('remembertoken-sagepayserver') && $('remembertoken-sagepayserver').checked === true))){
  404. return;
  405. }
  406. }
  407. }
  408. if(this.getConfig('osc')){
  409. if(parseInt($$('div.onestepcheckout-place-order-loading').length) || (typeof transport.tokenSuccess != 'undefined' && true === transport.tokenSuccess)){
  410. if(Ajax.activeRequestCount > 1 && (typeof transport.tokenSuccess) == 'undefined'){
  411. return;
  412. }
  413. var slPayM = this.getPaymentMethod();
  414. if(slPayM == this.servercode || slPayM == this.directcode){
  415. new Ajax.Request(SuiteConfig.getConfig('global', 'sgps_saveorder_url'),{
  416. method:"post",
  417. parameters: Form.serialize($('onestepcheckout-form')),
  418. onSuccess:function(f){
  419. this.reviewSave(f);
  420. transport.element().removeClassName('grey').addClassName('orange');
  421. $$('div.onestepcheckout-place-order-loading').invoke('hide');
  422. }.bind(this)
  423. });
  424. return;
  425. }else{
  426. $('onestepcheckout-form')._submit();
  427. return;
  428. }
  429. }else{
  430. return;
  431. }
  432. }else if(this.getConfig('magestore')){
  433. if(parseInt($$('div#onestepcheckout-place-order-loading').length) || (typeof transport.tokenSuccess != 'undefined' && true === transport.tokenSuccess)){
  434. if(Ajax.activeRequestCount > 1 && (typeof transport.tokenSuccess) == 'undefined'){
  435. return;
  436. }
  437. var slPayM = this.getPaymentMethod();
  438. if(slPayM == this.servercode || slPayM == this.directcode){
  439. disable_payment();
  440. new Ajax.Request(SuiteConfig.getConfig('global', 'sgps_saveorder_url'),{
  441. method:"post",
  442. parameters: Form.serialize($('one-step-checkout-form')),
  443. onSuccess:function(f){
  444. this.reviewSave(f);
  445. transport.element().removeClassName('place-order-loader').addClassName('btn-checkout');
  446. $$('div#onestepcheckout-place-order-loading').invoke('hide');
  447. }.bind(this)
  448. });
  449. return;
  450. }else{
  451. $('one-step-checkout-form')._submit();
  452. return;
  453. }
  454. }else{
  455. return;
  456. }
  457. }
  458. //OSC\\
  459. }else if((typeof transport.responseText) == 'undefined' && this.getConfig('msform')){
  460. var ps = $H({'payment[method]': 'sagepayserver'});
  461. if($('sagepay_server_token_cc_id')){
  462. ps.set('payment[sagepay_token_cc_id]', $('sagepay_server_token_cc_id').getValue());
  463. }
  464. new Ajax.Request(SuiteConfig.getConfig('global', 'sgps_saveorder_url'),{
  465. method:"post",
  466. parameters: ps,
  467. onSuccess:function(f){
  468. this.reviewSave(f);
  469. }.bind(this)
  470. });
  471. return;
  472. }else{
  473. try{
  474. var response = this.evalTransport(transport);
  475. }catch(notv){
  476. suiteLogError(notv);
  477. }
  478. }
  479. if((typeof response.response_status != 'undefined') && response.response_status != 'OK' && response.response_status != 'threed' && response.response_status != 'paypal_redirect'){
  480. this.resetOscLoading();
  481. this.growlWarn("An error ocurred with Sage Pay:\n" + response.response_status_detail.toString());
  482. return;
  483. }
  484. if(response.response_status == 'paypal_redirect'){
  485. setLocation(response.redirect);
  486. return;
  487. }
  488. if(this.getConfig('osc') && response.success && response.response_status == 'OK' && (typeof response.next_url == 'undefined')){
  489. setLocation(SuiteConfig.getConfig('global','onepage_success_url'));
  490. return;
  491. }else if(this.getConfig('magestore') && response.success && response.response_status == 'OK' && (typeof response.next_url == 'undefined')){
  492. setLocation(SuiteConfig.getConfig('global','onepage_success_url'));
  493. return;
  494. }
  495. if(!response.redirect || !response.success) {
  496. this.getConfig('review').nextStep(transport);
  497. return;
  498. }
  499. if(this.isServerPaymentMethod()){
  500. $('sagepayserver-dummy-link').writeAttribute('href', response.redirect);
  501. var rbButtons = $('review-buttons-container');
  502. var lcont = new Element('div',{className: 'lcontainer'});
  503. var heit = parseInt(SuiteConfig.getConfig('server','iframe_height'));
  504. if(Prototype.Browser.IE){
  505. heit = heit-65;
  506. }
  507. var wtype = SuiteConfig.getConfig('server','payment_iframe_position').toString();
  508. if(wtype == 'modal'){
  509. var wm = new Control.Modal('sagepayserver-dummy-link',{
  510. className: 'modal',
  511. iframe: true,
  512. closeOnClick: false,
  513. insertRemoteContentAt: lcont,
  514. height: SuiteConfig.getConfig('server','iframe_height'),
  515. width: SuiteConfig.getConfig('server','iframe_width'),
  516. fade: true,
  517. afterOpen: function(){
  518. if(rbButtons){
  519. rbButtons.addClassName('disabled');
  520. }
  521. },
  522. afterClose: function(){
  523. if(rbButtons){
  524. rbButtons.removeClassName('disabled');
  525. }
  526. }
  527. });
  528. wm.container.insert(lcont);
  529. wm.container.down().setStyle({'height':heit.toString() + 'px'});
  530. wm.container.down().insert(this.getServerSecuredImage());
  531. wm.open();
  532. }else if(wtype == 'incheckout'){
  533. var iframeId = 'sagepaysuite-server-incheckout-iframe';
  534. var paymentIframe = new Element('iframe', {'src': response.redirect, 'id': iframeId});
  535. if(this.getConfig('osc')){
  536. var placeBtn = $('onestepcheckout-place-order');
  537. placeBtn.hide();
  538. $('onestepcheckout-form').insert( { after:paymentIframe } );
  539. $(iframeId).scrollTo();
  540. }else if(this.getConfig('magestore')){
  541. var placeBtn = $('onestepcheckout-button-place-order');
  542. placeBtn.hide();
  543. $('one-step-checkout-form').insert( { after:paymentIframe } );
  544. $(iframeId).scrollTo();
  545. }else{
  546. if( (typeof $('checkout-review-submit')) == 'undefined' ){
  547. var btnsHtml = $$('div.content.button-set').first();
  548. }else{
  549. var btnsHtml = $('checkout-review-submit');
  550. }
  551. btnsHtml.hide();
  552. btnsHtml.insert( { after:paymentIframe } );
  553. }
  554. }
  555. }else if(this.isDirectPaymentMethod() && (typeof response.response_status != 'undefined') && response.response_status == 'threed'){
  556. $('sagepaydirectpro-dummy-link').writeAttribute('href', response.redirect);
  557. var lcontdtd = new Element('div',{className: 'lcontainer'});
  558. var dtd = new Control.Modal('sagepaydirectpro-dummy-link',{
  559. className: 'modal sagepaymodal',
  560. closeOnClick: false,
  561. insertRemoteContentAt: lcontdtd,
  562. iframe: true,
  563. height: SuiteConfig.getConfig('direct','threed_iframe_height'),
  564. width: SuiteConfig.getConfig('direct','threed_iframe_width'),
  565. fade: true,
  566. afterOpen: function(){
  567. if(true === Prototype.Browser.IE){
  568. var ie_version = parseFloat(navigator.appVersion.split("MSIE")[1]);
  569. if(ie_version<8){
  570. return;
  571. }
  572. }
  573. try{
  574. var daiv = this.container;
  575. if($$('.sagepaymodal').length > 1){
  576. $$('.sagepaymodal').each(function(elem){
  577. if(elem.visible()){
  578. daiv = elem;
  579. throw $break;
  580. }
  581. });
  582. }
  583. daiv.down().down('iframe').insert({before:new Element('div', {'id':'sage-pay-direct-ddada','style':'background:#FFF'}).update(
  584. SuiteConfig.getConfig('direct','threed_after').toString() + SuiteConfig.getConfig('direct','threed_before').toString())});
  585. }catch(er){}
  586. if(false === Prototype.Browser.IE){
  587. daiv.down().down('iframe').setStyle({'height':(parseInt(daiv.down().getHeight())-60)+'px'});
  588. daiv.setStyle({'height':(parseInt(daiv.down().getHeight())+57)+'px'});
  589. }else{
  590. daiv.down().down('iframe').setStyle({'height':(parseInt(daiv.down().getHeight())+116)+'px'});
  591. }
  592. },
  593. afterClose: function(){
  594. if($('sage-pay-direct-ddada')){
  595. $('sage-pay-direct-ddada').remove();
  596. }
  597. $('sagepaydirectpro-dummy-link').writeAttribute('href', '');
  598. }
  599. });
  600. dtd.container.insert(lcontdtd);
  601. dtd.open();
  602. }else if(this.isDirectPaymentMethod()){
  603. new Ajax.Request(SuiteConfig.getConfig('direct','sgps_registertrn_url'),{
  604. onSuccess:function(f){
  605. try{
  606. var d=f.responseText.evalJSON();
  607. if(d.response_status=="INVALID"||d.response_status=="MALFORMED"||d.response_status=="ERROR"||d.response_status=="FAIL"){
  608. this.getConfig('checkout').accordion.openSection('opc-payment');
  609. this.growlWarn("An error ocurred with Sage Pay Direct:\n" + d.response_status_detail.toString());
  610. }else if(d.response_status == 'threed'){
  611. $('sagepaydirectpro-dummy-link').writeAttribute('href', d.url);
  612. }
  613. }catch(alfaEr){
  614. this.growlError(f.responseText.toString());
  615. }
  616. }.bind(this)
  617. });
  618. }
  619. else{
  620. this.getConfig('review').nextStep(transport);
  621. return;
  622. }
  623. }
  624. }
  625. try{
  626. Event.observe(window,"load",function(){
  627. var options = document.getElementsByName('payment[method]');
  628. var checkSagepay = false;
  629. for(var i=0;i<options.length;i++){
  630. if(options[i].id.contains('sagepay')){
  631. checkSagepay = true;
  632. break;
  633. }
  634. }
  635. if(!checkSagepay || checkSagepay==false){
  636. return;
  637. }
  638. $(document.body).insert(new Element('a', { 'id': 'sagepayserver-dummy-link', 'href': '#', 'style':'display:none' }).update('&nbsp;'));
  639. $(document.body).insert(new Element('a', { 'id': 'sagepaydirectpro-dummy-link', 'href': '#', 'style':'display:none' }).update('&nbsp;'));
  640. var msCont = $('suite_ms_payment_method');
  641. if( !msCont && (SuiteConfig.getConfig('global', 'ajax_review') == '2') && ((typeof window.review) != 'undefined') ){
  642. var SageServer = new EbizmartsSagePaySuite.Checkout(
  643. {
  644. 'checkout': window.checkout,
  645. 'review': window.review,
  646. 'payment': window.payment,
  647. 'billing': window.billing,
  648. 'accordion': window.accordion
  649. }
  650. );
  651. }else if(!msCont && ($$('div.shopping-cart-totals').length != 1) && $('onestepcheckout-form')){
  652. var SageServer = new EbizmartsSagePaySuite.Checkout(
  653. {
  654. 'osc': $('onestepcheckout-place-order'),
  655. 'oscFrm': $('onestepcheckout-form')
  656. }
  657. );
  658. }else if($('one-step-checkout-form')){
  659. var SageServer = new EbizmartsSagePaySuite.Checkout(
  660. {
  661. 'magestore': $('onestepcheckout-button-place-order'),
  662. 'magestoreFrm': $('one-step-checkout-form')
  663. }
  664. );
  665. }else if(msCont && (msCont.getValue() == 'sagepayserver')){
  666. var SageServer = new EbizmartsSagePaySuite.Checkout(
  667. {
  668. 'msform': $$('div.multiple-checkout')[0].down(2)
  669. }
  670. );
  671. }
  672. if(parseInt(SuiteConfig.getConfig('global','valid')) === 0){
  673. if(SuiteConfig.getConfig('direct','mode') == "live" || SuiteConfig.getConfig('server','mode') == "live"){
  674. new PeriodicalExecuter(function(){ alert(SuiteConfig.getConfig('global','not_valid_message')); }, 10);
  675. }else{
  676. var invalidG = new k.Growler({location:"bl"}).error('<strong>'+SuiteConfig.getConfig('global','not_valid_message')+'</strong>', {life:14400});
  677. }
  678. }
  679. })
  680. }catch(er){ suiteLogError(er); }
  681. addValidationClass = function(obj){
  682. if(obj.hasClassName('validation-passed')){
  683. obj.removeClassName('validation-passed');
  684. }
  685. obj.addClassName('validate-issue-number');
  686. }
  687. paypalClean = function(reverse){
  688. var ccTypeContainer = $('sagepaydirectpro_cc_type');
  689. var sf = 'div#payment_form_sagepaydirectpro';
  690. var sfls = $$(sf+' input, '+sf+' select, '+sf+' radio, '+sf+' checkbox');
  691. if(reverse){
  692. //sfls.invoke('enable');
  693. //Just hide items wose parent is visible, these prevents enabling hiden token card elements
  694. sfls.each(function(item){
  695. if(item.up().visible() === true){
  696. item.enable();
  697. }
  698. });
  699. sfls.invoke('show');
  700. $$(sf+' label, '+sf+' a[class!="addnew"]').invoke('show');
  701. //ccTypeContainer.show();
  702. //ccTypeContainer.disabled = false;
  703. ccTypeContainer.addClassName('validate-ccsgpdp-type-select');
  704. }else{
  705. sfls.invoke('disable');
  706. sfls.invoke('hide');
  707. $$(sf+' label, '+sf+' a').invoke('hide');
  708. ccTypeContainer.show();
  709. ccTypeContainer.disabled = false;
  710. ccTypeContainer.removeClassName('validate-ccsgpdp-type-select');
  711. }
  712. }
  713. changecsvclass = function(obj) {
  714. var ccTypeContainer = $('sagepaydirectpro_cc_type');
  715. var ccCVNContainer = $('sagepaydirectpro_cc_cid');
  716. fillSagePayTestData();
  717. if(ccTypeContainer.value == 'PAYPAL'){//PayPal MARK integration
  718. paypalClean(false);
  719. }else{
  720. paypalClean(true);
  721. }
  722. if(ccTypeContainer)
  723. {
  724. if(ccTypeContainer.value == 'LASER' && ccCVNContainer.hasClassName('required-entry'))
  725. {
  726. if(ccCVNContainer) {
  727. ccCVNContainer.removeClassName('required-entry');
  728. }
  729. }
  730. if(ccTypeContainer.value != 'LASER' && !ccCVNContainer.hasClassName('required-entry'))
  731. {
  732. if(ccCVNContainer) {
  733. ccCVNContainer.addClassName('required-entry');
  734. }
  735. }
  736. }
  737. }
  738. Validation.addAllThese([
  739. ['validate-ccsgpdp-number', 'Please enter a valid credit card number.', function(v, elm) {
  740. // remove non-numerics
  741. try{
  742. var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
  743. if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
  744. && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
  745. if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
  746. return true;
  747. } else {
  748. return false;
  749. }
  750. }
  751. if (ccTypeContainer.value == 'OT' || ccTypeContainer.value == 'UKE' || ccTypeContainer.value == 'DELTA' || ccTypeContainer.value == 'MAESTRO' || ccTypeContainer.value == 'SOLO' || ccTypeContainer.value == 'SWITCH' || ccTypeContainer.value == 'LASER' || ccTypeContainer.value == 'JCB' || ccTypeContainer.value == 'DC') {
  752. return true;
  753. }
  754. return validateCreditCard(v);
  755. }catch(_error){return true;}
  756. }],
  757. ['validate-ccsgpdp-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
  758. try{
  759. var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
  760. var ccCVNContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_cid');
  761. if(ccTypeContainer)
  762. {
  763. if(ccTypeContainer.value == 'LASER' && ccCVNContainer.hasClassName('required-entry'))
  764. {
  765. if(ccCVNContainer) {
  766. ccCVNContainer.removeClassName('required-entry');
  767. }
  768. }
  769. if(ccTypeContainer.value != 'LASER' && !ccCVNContainer.hasClassName('required-entry'))
  770. {
  771. if(ccCVNContainer) {
  772. ccCVNContainer.addClassName('required-entry');
  773. }
  774. }
  775. }
  776. else
  777. {
  778. return true;
  779. }
  780. if (!ccTypeContainer && ccTypeContainer.value != 'LASER') {
  781. return true;
  782. }
  783. var ccType = ccTypeContainer.value;
  784. switch (ccType) {
  785. case 'VISA' :
  786. case 'MC' :
  787. re = new RegExp('^[0-9]{3}$');
  788. break;
  789. //case 'AMEX' :
  790. // re = new RegExp('^[0-9]{4}$');
  791. // break;
  792. case 'MAESTRO':
  793. case 'SOLO':
  794. case 'SWITCH':
  795. re = new RegExp('^([0-9]{1}|^[0-9]{2}|^[0-9]{3})?$');
  796. break;
  797. default:
  798. re = new RegExp('^([0-9]{3}|[0-9]{4})?$');
  799. break;
  800. }
  801. if (v.match(re) || ccType == 'LASER') {
  802. return true;
  803. }
  804. return false;
  805. }catch(_error){return true;}
  806. }],
  807. ['validate-ccsgpdp-type', 'Credit card number doesn\'t match credit card type', function(v, elm) {
  808. try{
  809. // remove credit card number delimiters such as "-" and space
  810. elm.value = removeDelimiters(elm.value);
  811. v = removeDelimiters(v);
  812. var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
  813. if (!ccTypeContainer) {
  814. return true;
  815. }
  816. var ccType = ccTypeContainer.value;
  817. // Other card type or switch or solo card
  818. if (ccType == 'OT' || ccType == 'UKE' || ccType == 'DELTA' || ccType == 'MAESTRO' || ccType == 'SOLO' || ccType == 'SWITCH' || ccType == 'LASER' || ccType == 'JCB' || ccType == 'DC') {
  819. return true;
  820. }
  821. // Credit card type detecting regexp
  822. var ccTypeRegExp = {
  823. 'VISA': new RegExp('^4[0-9]{12}([0-9]{3})?$'),
  824. 'MC': new RegExp('^5[1-5][0-9]{14}$'),
  825. 'AMEX': new RegExp('^3[47][0-9]{13}$')
  826. };
  827. // Matched credit card type
  828. var ccMatchedType = '';
  829. $H(ccTypeRegExp).each(function (pair) {
  830. if (v.match(pair.value)) {
  831. ccMatchedType = pair.key;
  832. throw $break;
  833. }
  834. });
  835. if(ccMatchedType != ccType) {
  836. return false;
  837. }
  838. return true;
  839. }catch(_error){return true;}
  840. }],
  841. ['validate-ccsgpdp-type-select', 'Card type doesn\'t match credit card number', function(v, elm) {
  842. try{var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
  843. return Validation.get('validate-ccsgpdp-type').test(ccNumberContainer.value, ccNumberContainer);
  844. }catch(_error){return true;}
  845. }],
  846. ['validate-issue-number', 'Issue Number must have at least two characters', function(v, elm) {
  847. try{
  848. if(v.length > 0 && !(v.match(new RegExp('^([0-9]{1}|[0-9]{2})$')))){
  849. return false;
  850. }
  851. return true;
  852. }catch(_error){return true;}
  853. }]
  854. ]);