adyen-skinbuilder 0.2.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. data/.gitignore +3 -4
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.md +22 -0
  4. data/Gemfile.lock +51 -7
  5. data/LICENSE +3 -3
  6. data/README.markdown +83 -24
  7. data/Rakefile +6 -0
  8. data/adyen-skinbuilder.gemspec +12 -11
  9. data/bin/adyen-skinbuilder +28 -3
  10. data/lib/adyen-skinbuilder.rb +1 -4
  11. data/lib/adyen-skinbuilder/helper/adyen.rb +29 -0
  12. data/lib/adyen-skinbuilder/helper/render.rb +32 -0
  13. data/lib/adyen-skinbuilder/server.rb +112 -58
  14. data/lib/adyen-skinbuilder/server/views/_adyen_form.html.erb +37 -0
  15. data/{adyen/main_content.html → lib/adyen-skinbuilder/server/views/_adyen_payment_fields.html.erb} +534 -530
  16. data/lib/adyen-skinbuilder/server/views/css/reset.css +306 -0
  17. data/lib/adyen-skinbuilder/server/views/img/icons/error.png +0 -0
  18. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK1.png +0 -0
  19. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK10.png +0 -0
  20. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK2.png +0 -0
  21. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK3.png +0 -0
  22. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK4.png +0 -0
  23. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK5.png +0 -0
  24. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK6.png +0 -0
  25. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK7.png +0 -0
  26. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK8.png +0 -0
  27. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK9.png +0 -0
  28. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKCANCELLED.png +0 -0
  29. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKPENDING.png +0 -0
  30. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKREFUSED.png +0 -0
  31. data/lib/adyen-skinbuilder/server/views/img/pm/amex_small.png +0 -0
  32. data/lib/adyen-skinbuilder/server/views/img/pm/card.png +0 -0
  33. data/lib/adyen-skinbuilder/server/views/img/pm/ideal.png +0 -0
  34. data/lib/adyen-skinbuilder/server/views/img/pm/mc_small.png +0 -0
  35. data/lib/adyen-skinbuilder/server/views/img/pm/unknown_small.png +0 -0
  36. data/lib/adyen-skinbuilder/server/views/img/pm/vias_small.png +0 -0
  37. data/lib/adyen-skinbuilder/server/views/img/pm/visa.png +0 -0
  38. data/lib/adyen-skinbuilder/server/views/img/pm/visa_small.png +0 -0
  39. data/lib/adyen-skinbuilder/server/views/index.html.erb +118 -0
  40. data/lib/adyen-skinbuilder/server/views/js/default.js +385 -0
  41. data/lib/adyen-skinbuilder/server/views/layout.html.erb +33 -0
  42. data/lib/adyen-skinbuilder/server/views/skeleton.html +56 -0
  43. data/lib/adyen-skinbuilder/server/views/skin.html.erb +18 -0
  44. data/lib/adyen-skinbuilder/version.rb +1 -1
  45. data/lib/hash.rb +15 -0
  46. data/spec/fixtures/example.zip +0 -0
  47. data/spec/fixtures/skins/DV3tf95f/inc/order_data.txt +1 -0
  48. data/spec/fixtures/skins/JH0815/css/screen.css +262 -0
  49. data/spec/fixtures/skins/JH0815/skin.html.erb +13 -0
  50. data/spec/lib/adyen-skinbuilder/server_spec.rb +166 -38
  51. data/spec/spec_helper.rb +2 -2
  52. metadata +109 -31
  53. data/adyen/skeleton.html +0 -70
  54. data/lib/adyen-skinbuilder/launcher.rb +0 -40
  55. data/lib/adyen-skinbuilder/railtie.rb +0 -9
  56. data/lib/adyen-skinbuilder/tasks/skin.rake +0 -65
@@ -0,0 +1,385 @@
1
+
2
+ function wopen(obj, w, h) {
3
+ if(!w) { w = 800; }
4
+ if(!h) { h = 600; }
5
+ winoptions="height="+h+",width="+w+",,"+
6
+ ",menubar=no,resizable=yes,scrollbars=yes,status=no,titlebar=no,toolbar=no";
7
+ win=window.open("","info",winoptions);
8
+ win.location.href=obj.href;
9
+ if (parseInt(navigator.appVersion) >= 4) { win.window.focus(); }
10
+ return false;
11
+ }
12
+
13
+
14
+ function wclose() {
15
+ var ua = navigator.userAgent.toLowerCase();
16
+ if((/msie/.test(ua)) && !(/opera/.test(ua)) && (/win/.test(ua))) {
17
+ window.opener='X';
18
+ }
19
+ window.close();
20
+ return false;
21
+ }
22
+
23
+
24
+
25
+ function preventEnterSubmit() {
26
+
27
+ var inputs = document.getElementsByTagName('input');
28
+ for (var i=0; i<inputs.length; i++) {
29
+
30
+ if(inputs[i].type != "text" && inputs[i].type != "password") continue;
31
+
32
+ if(inputs[i].onkeypress) continue;
33
+
34
+ inputs[i].onkeypress = function (e) {
35
+ var keycode;
36
+ if (window.event) keycode = window.event.keyCode;
37
+ else if (e) keycode = e.which;
38
+ else return true;
39
+
40
+ if (keycode == 13) {
41
+ return false;
42
+ } else {
43
+ return true;
44
+ }
45
+ }
46
+ }
47
+ }
48
+
49
+
50
+ function addOnLoad(initFunction) {
51
+ if ( typeof window.addEventListener != "undefined" ) {
52
+ window.addEventListener( "load", initFunction, false );
53
+ } else if ( typeof window.attachEvent != "undefined" ) {
54
+ window.attachEvent( "onload", initFunction );
55
+ } else {
56
+ if ( window.onload != null ) {
57
+ var oldOnload = window.onload;
58
+ window.onload = function ( e ) {
59
+ oldOnload( e );
60
+ initFunction();
61
+ };
62
+ } else {
63
+ window.onload = initFunction;
64
+ }
65
+ }
66
+ }
67
+
68
+
69
+
70
+ function prepareForBack() {
71
+ formValidate = function(f,g) {
72
+ return true;
73
+ }
74
+ return true;
75
+ }
76
+
77
+
78
+
79
+
80
+ function formValidate(form, group) {
81
+
82
+ if (!confirmMessage(form)) return false;
83
+
84
+ if(! (notNull(requiredFields) && notNull(requiredFields[group]) && notNull(errorMessages) && notNull(errorMessages[group]) && notNull(form))) return true;
85
+
86
+ var errors = checkRequiredFields(group);
87
+
88
+ if (errors.length == 0) return submitOnlyOnce(form);
89
+
90
+ clearErrors(requiredFields[group]);
91
+ try {
92
+ if (notNull(serverValidationFields)) {
93
+ clearErrors(serverValidationFields);
94
+ }
95
+ } catch (err) {}
96
+ markErrorFields(errors);
97
+ setErrorMessages(errors, group);
98
+ return false;
99
+ }
100
+
101
+ function checkRequiredFields(group) {
102
+
103
+ var errors = new Array();
104
+
105
+ if(! (notNull(requiredFields) && notNull(requiredFields[group]) && notNull(errorMessages) && notNull(errorMessages[group]))) {
106
+ return errors;
107
+ }
108
+
109
+ for(var i = 0; i < requiredFields[group].length; ++i) {
110
+ el = document.getElementById(requiredFields[group][i]);
111
+ if(! validateElement(el)) {
112
+ errors.push(requiredFields[group][i]);
113
+ }
114
+
115
+ if(notNull(validationFunctions) && notNull(validationFunctions[group]) && notNull(validationFunctions[group][requiredFields[group][i]])) {
116
+ if(! validationFunctions[group][requiredFields[group][i]](el)) {
117
+ errors.push(requiredFields[group][i]);
118
+ }
119
+ }
120
+ }
121
+ return errors;
122
+ }
123
+
124
+ function validateElement(el) {
125
+ if (!notNull(el)) return true;
126
+
127
+ if (el.type == "text" || el.type == "hidden" || el.type == "password") {
128
+ if (trim(el.value) == "") {
129
+ return false;
130
+ }
131
+ } else if (el.type == "radio") {
132
+ var itemchecked = false;
133
+ var elems = document.getElementsByTagName("input");
134
+ for(var j = 0; j < elems.length; ++j) {
135
+ if(elems[j].type == "radio" && elems[j].name == el.name) {
136
+ if(elems[j].checked && trim(elems[j].value) != "") {
137
+ itemchecked = true;
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ if(!itemchecked) {
143
+ return false;
144
+ }
145
+ } else if (el.type == "checkbox") {
146
+ var itemchecked = false;
147
+ var elems = document.getElementsByTagName("input");
148
+ for(var j = 0; j < elems.length; ++j) {
149
+ if(elems[j].type == "checkbox" && elems[j].name == el.name) {
150
+ if(elems[j].checked) {
151
+ itemchecked = true;
152
+ break;
153
+ }
154
+ }
155
+ }
156
+ if(!itemchecked) {
157
+ return false;
158
+ }
159
+ } else if (el.type == "textarea") {
160
+ if (trim(el.value) == "") {
161
+ return false;
162
+ }
163
+ } else if (el.type == "select-one") {
164
+ if (el.selectedIndex == 0) {
165
+ return false;
166
+ }
167
+ } else if (el.type=="select-multiple") {
168
+ var optionselected = false;
169
+ for(var j=0;j<el.options.length; ++j) {
170
+ if (el.options[j].selected) {
171
+ optionselected = true;
172
+ break;
173
+ }
174
+ }
175
+ if (!optionselected) {
176
+ return false;
177
+ }
178
+ }
179
+ return true;
180
+ }
181
+
182
+
183
+ function markErrorFields(errors) {
184
+ if(errors.length == 0) return;
185
+ for(var i = 0; i < errors.length; ++i) {
186
+ el = document.getElementById(errors[i]);
187
+ if(! notNull(el)) continue;
188
+ if(el.type == "hidden") continue;
189
+ if (el.parentNode.nodeName == "DIV") {
190
+ el.parentNode.className = "errorDiv";
191
+ }
192
+ el.className = "errorField";
193
+ }
194
+
195
+ }
196
+
197
+ function setOkMessages(messages) {
198
+ if ( notNull(document.getElementById("okFrameMessages"))) {
199
+ var messageHTML = "";
200
+ for(var i = 0; i < messages.length; ++i) {
201
+ messageHTML += messages[i];
202
+ messageHTML += "<br />";
203
+ }
204
+ document.getElementById("okFrameMessages").innerHTML = "<span class='green'>" + messageHTML + "</span>";
205
+ showElement("okFrame");
206
+ showElement("okFrameMessages");
207
+ }
208
+ }
209
+
210
+ function setErrorMessages(errors,group) {
211
+ if ( notNull(document.getElementById("errorFrameValidationErrors"))) {
212
+ var messageHTML = "";
213
+ if(errors.length > 3) {
214
+ messageHTML = errorMessages[group]["generic"];
215
+ } else {
216
+ for(var i = 0; i < errors.length; ++i) {
217
+ messageHTML += errorMessages[group][errors[i]];
218
+ messageHTML += "<br />";
219
+ }
220
+ }
221
+ document.getElementById("errorFrameValidationErrors").innerHTML = "<span class='red'>" + messageHTML + "</span>";
222
+ showElement("errorFrame");
223
+ showElement("errorFrameValidationErrors");
224
+ }
225
+ hideElement("okFrame");
226
+ }
227
+
228
+
229
+ function clearErrors(fields, dontHideErrorFrame) {
230
+ for(var i = 0; i < fields.length; ++i) {
231
+ obj = document.getElementById(fields[i]);
232
+
233
+ if(! notNull(obj)) continue;
234
+
235
+ if (obj.parentNode.nodeName == "DIV") {
236
+ obj.parentNode.className = "fieldDiv";
237
+ }
238
+ obj.className = "inputField";
239
+ }
240
+ if(! dontHideErrorFrame) {
241
+ hideElement("errorFrameValidationErrors");
242
+ if(! notNull(document.getElementById("errorFrameCustomFieldErrors"))) {
243
+ hideElement("errorFrame");
244
+ }
245
+ }
246
+ hideElement("okFrame");
247
+ }
248
+
249
+ function showElement(elId) {
250
+ if (notNull(document.getElementById(elId))) {
251
+ document.getElementById(elId).style.display = 'block';
252
+ }
253
+ return false;
254
+ }
255
+ function hideElement(elId) {
256
+ if (notNull(document.getElementById(elId))) {
257
+ document.getElementById(elId).style.display = 'none';
258
+ }
259
+ return false;
260
+ }
261
+ function toggleElement(elId) {
262
+ if (notNull(document.getElementById(elId))) {
263
+ if(document.getElementById(elId).style.display == 'block') {
264
+ document.getElementById(elId).style.display = 'none';
265
+ } else {
266
+ document.getElementById(elId).style.display = 'block';
267
+ }
268
+ }
269
+ return false;
270
+ }
271
+
272
+ function notNull(objToTest) {
273
+ if (null == objToTest) {
274
+ return false;
275
+ }
276
+ if ("undefined" == typeof(objToTest) ) {
277
+ return false;
278
+ }
279
+ return true;
280
+ }
281
+
282
+
283
+ function trim(s){ return rtrim(ltrim(s)); }
284
+
285
+ function ltrim(s){
286
+ var w = " \n\t\f";
287
+ // remove all beginning white space
288
+ while( w.indexOf(s.charAt(0)) != -1 && s.length != 0 ) s = s.substring(1);
289
+ return s;
290
+ }
291
+
292
+ function rtrim(s){
293
+ var w = " \n\t\f";
294
+ // remove all ending white space
295
+ while( w.indexOf(s.charAt(s.length-1)) != -1 && s.length != 0 ) s = s.substring(0, s.length-1);
296
+ return s;
297
+ }
298
+
299
+ function digitsOnly(s){
300
+ var w = "0123456789";
301
+ var r = "";
302
+ for(var i=0; i<s.length; i++) {
303
+ if(w.indexOf(s.charAt(i)) != -1) {
304
+ r += s.charAt(i);
305
+ }
306
+ }
307
+ return r;
308
+ }
309
+
310
+ function removeLeadingZeros(s) {
311
+ while( s.charAt(0) == "0" && s.length != 0 ) s = s.substring(1);
312
+ return s;
313
+ }
314
+
315
+ function submitOnlyOnce(f) {
316
+
317
+ if(typeof(maySubmitOnlyOnce) == "undefined") {
318
+ return true;
319
+ } else if (maySubmitOnlyOnce == false){
320
+ return true;
321
+ }
322
+
323
+ for (i=1; i<f.elements.length; i++) {
324
+ if (f.elements[i].type == 'submit' || f.elements[i].type == 'button') {
325
+ f.elements[i].disabled = true;
326
+ }
327
+ }
328
+ f.submit();
329
+ submitOnlyOnce = function (f) {
330
+ return false;
331
+ };
332
+ var errors = new Array();
333
+ errors.push("submitonce");
334
+ setErrorMessages(errors,"default");
335
+ hideElement("errorFrameCustomFieldErrors");
336
+
337
+ return false;
338
+ }
339
+
340
+ function confirmMessage(f) {
341
+
342
+ if(typeof(confirmOnSubmit) == "undefined") {
343
+ return true;
344
+ }
345
+ if (confirm(errorMessages["confirm"])) {
346
+ return true;
347
+ }
348
+ return false;
349
+ }
350
+
351
+ // vX library (Ajax, Extend, GetElement, Animation)
352
+ var _=_?_:{}
353
+ _.X=function(u,f,d,x){x=new(window.ActiveXObject?ActiveXObject:XMLHttpRequest)('Microsoft.XMLHTTP');x.open(d?'POST':'GET',u,1);d?x.setRequestHeader('Content-type','application/x-www-form-urlencoded'):0;x.onreadystatechange=function(){x.readyState>3&&f?f(x.responseText,x):0};x.send(d)}
354
+ _.E=function(e,t,f,r){if(e.attachEvent?(r?e.detachEvent('on'+t,e[t+f]):!0):(r?e.removeEventListener(t,f,!1):e.addEventListener(t,f,!1))){e['e'+t+f]=f;e[t+f]=function(){e['e'+t+f](window.event)};e.attachEvent('on'+t,e[t+f])}}
355
+ _.G=function(e){return e.style?e:document.getElementById(e)}
356
+ _.A=function(v,n,c,u,y){if(u===undefined){var u=new Object();u.value=0};u.value?0:u.value=0;return y.value=setInterval(function(){c(u.value/v);++u.value>v?clearInterval(y.value):0},n)}
357
+ _.F=function(d,h,f,i){d=d=='in';_.A(f?f:15,i?i:50,function(a){a=(d?0:1)+(d?1:-1)*a;h.style.opacity=a;h.style.filter='alpha(opacity='+100*a+')'})}
358
+ _.S=function(d,h,f,i,w,t,c){d=d=='in';_.A(f?f:15,i?i:50,function(a){a=(d?0:1)+(d?1:-1)*a;h.style.width=parseInt(a*w)+"px";},c,t);}
359
+ _.Q=function(f){var o=new Object();var r=new Array();
360
+ for(var i=0;i < f.elements.length;i++){
361
+ try {l=f.elements[i];n=l.name;
362
+ if(n=='')continue;
363
+ switch(l.type.split('-')[0]){
364
+ case "select":
365
+ for(var s=0;s < l.options.length;s++){
366
+ if(l.options[s].selected){
367
+ if(typeof(o[n])=='undefined')o[n]=new Array();
368
+ o[n][o[n].length]=encodeURIComponent(l.options[s].value);}}break;
369
+ case "radio":
370
+ if(l.checked){
371
+ if(typeof(o[n])=='undefined')o[n]=new Array();
372
+ o[n][o[n].length]=encodeURIComponent(l.value);}break;
373
+ case "checkbox":
374
+ if(l.checked){
375
+ if(typeof(o[n])=='undefined')o[n] = new Array();
376
+ o[n][o[n].length]=encodeURIComponent(l.value);}break;
377
+ case "submit":
378
+ break;
379
+ default:
380
+ if(typeof(o[n])=='undefined')o[n] = new Array();
381
+ o[n][o[n].length]=encodeURIComponent(l.value);break;
382
+ }
383
+ }catch(e){}
384
+ } for(x in o){r[r.length]=x+'='+o[x].join(',');}return r.join('&');
385
+ }
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Page Title</title>
5
+
6
+ <link rel="stylesheet" media="screen" type="text/css" href="/hpp/css/reset.css" />
7
+
8
+ <link rel="stylesheet" media="screen" type="text/css" href="/sf/<%= @skin_code %>/css/screen.css" />
9
+ <link rel="stylesheet" media="print" type="text/css" href="/sf/<%= @skin_code %>/css/print.css" />
10
+
11
+ <script type="text/javascript" src="/hpp/js/default.js"></script>
12
+ <script type="text/javascript" src="/sf/<%= @skin_code %>/js/custom.js"></script>
13
+ <!--[if lt IE 7]>
14
+ <link rel="stylesheet" type="text/css" href="/sf/<%= @skin_code %>/css/screen_ie6.css" />
15
+ <![endif]-->
16
+ </head>
17
+ <body>
18
+ <script type="text/javascript">
19
+ //<![CDATA[
20
+ var clientIPAddress = "127.0.0.1";
21
+ var config = new Array();
22
+ config["pmmanimation"] = 0;
23
+ //]]>
24
+ </script>
25
+
26
+ <!-- ### inc/cheader -->
27
+
28
+ <%= yield %>
29
+
30
+ <!-- ### -->
31
+
32
+ </body>
33
+ </html>
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Page Title</title>
5
+
6
+ <link rel="stylesheet" media="screen" type="text/css" href="/hpp/css/reset.css" />
7
+ <link rel="stylesheet" media="screen" type="text/css" href="/sf/$skinCode/css/screen.css" />
8
+ <link rel="stylesheet" media="print" type="text/css" href="/sf/$skinCode/css/print.css" />
9
+
10
+ <script type="text/javascript" src="/hpp/js/default.js"></script>
11
+ <script type="text/javascript" src="/sf/$skinCode/js/custom.js"></script>
12
+ <!--[if lt IE 7]>
13
+ <link rel="stylesheet" type="text/css" href="/sf/$skinCode/css/screen_ie6.css" />
14
+ <![endif]-->
15
+ </head>
16
+ <body>
17
+ <!-- ### inc/cheader_[locale]5.txt or inc/cheader.txt (fallback) ### -->
18
+ <form id="pageform" action="" method="post" onsubmit="return formValidate(this);">
19
+ <script type="text/javascript">
20
+ //<![CDATA[
21
+ if (notNull(document.getElementById('pageform'))) {
22
+ document.getElementById('pageform').setAttribute("autocomplete","off");
23
+ }
24
+ //]]>
25
+ </script>
26
+ <div id="content">
27
+ <div id="pmcontent">
28
+ <!-- ### inc/pmheader_[locale].txt or in/pmheader.txt (fallback) ### -->
29
+ <div class="padDiv1"></div>
30
+
31
+ <!-- ==================== -->
32
+ <!-- Adyen Main Content -->
33
+ <!-- ==================== -->
34
+
35
+ <div class="padDiv2"></div>
36
+ <!-- ### inc/pmfooter_[locale].txt or inc/pmfooter.txt (fallback) ### -->
37
+ <!-- ### inc/customfields_[locale].txt or inc/customfields.txt (fallback) ### -->
38
+ </div>
39
+ </div>
40
+ <div id="foot">
41
+ <div id="footc">
42
+ <div id="nextstep">
43
+ <div id="nextstepc">Next Step Text</div>
44
+ </div>
45
+ <div id="footerb1div">
46
+ <input onclick="" type="submit" id="mainSubmit" value="continue" class="footerB nextB" />
47
+ </div>
48
+ <div id="footerb2div">
49
+ <input onclick="" type="button" id="mainBack" value="previous" class="footerB backB" />
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </form>
54
+ <!-- ### inc/cfooter_[locale].txt or inc/cfooter.txt (fallback) ### -->
55
+ </body>
56
+ </html>