form-wizard.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // 1. horizontal wizard
  2. "use strict";
  3. var currentTab = 0;
  4. showTab(currentTab);
  5. function showTab(n) {
  6. var x = document.getElementsByClassName("tab");
  7. x[n].style.display = "block";
  8. if (n == 0) {
  9. document.getElementById("prevBtn").style.display = "none";
  10. } else {
  11. document.getElementById("prevBtn").style.display = "inline";
  12. }
  13. if (n == x.length - 1) {
  14. // document.getElementById("nextBtn").innerHTML = "Invia";
  15. document.getElementById("nextBtn").innerHTML = "Avanti";
  16. } else {
  17. document.getElementById("nextBtn").innerHTML = "Avanti";
  18. }
  19. fixStepIndicator(n);
  20. }
  21. function nextPrev(n) {
  22. var x = document.getElementsByClassName("tab");
  23. if (n == 1 && !validateForm()) return false;
  24. x[currentTab].style.display = "none";
  25. currentTab = currentTab + n;
  26. if (currentTab >= x.length) {
  27. document.getElementById("regForm").submit();
  28. return false;
  29. }
  30. showTab(currentTab);
  31. }
  32. function validateForm() {
  33. var x,
  34. y,
  35. i,
  36. valid = true;
  37. x = document.getElementsByClassName("tab");
  38. y = x[currentTab].getElementsByTagName("input");
  39. for (i = 0; i < y.length; i++) {
  40. if (y[i].value == "") {
  41. y[i].className += " invalid";
  42. valid = false;
  43. }
  44. }
  45. if (valid) {
  46. document.getElementsByClassName("step")[currentTab].className += " finish";
  47. }
  48. return valid;
  49. }
  50. function fixStepIndicator(n) {
  51. var i,
  52. x = document.getElementsByClassName("step");
  53. for (i = 0; i < x.length; i++) {
  54. x[i].className = x[i].className.replace(" active", "");
  55. }
  56. x[n].className += " active";
  57. }
  58. // 2. Numbering wizard
  59. var form = document.getElementById("msform");
  60. var fieldsets = form.querySelectorAll("form");
  61. var currentStep = 0;
  62. var numSteps = 5;
  63. for (var i = 1; i < fieldsets.length; i++) {
  64. fieldsets[i].style.display = "none";
  65. }
  66. function nextStep() {
  67. document.getElementById("backbtn").disabled = false;
  68. currentStep++;
  69. if (currentStep > numSteps) {
  70. currentStep = 1;
  71. }
  72. var stepper = document.getElementById("stepper1");
  73. var steps = stepper.getElementsByClassName("step");
  74. Array.from(steps).forEach((step, index) => {
  75. let stepNum = index + 1;
  76. let stepLength = steps.length;
  77. if (stepNum === currentStep && currentStep < stepLength) {
  78. addClass(step, "editing");
  79. fieldsets[currentStep].style.display = "flex";
  80. } else {
  81. removeClass(step, "editing");
  82. }
  83. if (stepNum <= currentStep && currentStep < stepLength) {
  84. addClass(step, "done");
  85. addClass(step, "active");
  86. removeClass(step, "editing");
  87. fieldsets[currentStep - 1].style.display = "none";
  88. } else {
  89. removeClass(step, "done");
  90. }
  91. if (currentStep == stepLength - 1) {
  92. document.getElementById("nextbtn").textContent = "Avanti";
  93. }
  94. if (currentStep > stepLength - 1) {
  95. document.getElementById("nextbtn").textContent = "Avanti";
  96. addClass(step, "done");
  97. addClass(step, "active");
  98. removeClass(step, "editing");
  99. document.getElementById("nextbtn").disabled = true;
  100. }
  101. });
  102. }
  103. function backStep() {
  104. currentStep--;
  105. var stepper = document.getElementById("stepper1");
  106. var steps = stepper.getElementsByClassName("step");
  107. let stepLength = steps.length;
  108. document.getElementById("nextbtn").textContent = "Next";
  109. document.getElementById("nextbtn").disabled = false;
  110. if (currentStep < stepLength - 1) {
  111. document.getElementById("backbtn").disabled = false;
  112. fieldsets[currentStep + 1].style.display = "none";
  113. fieldsets[currentStep].style.display = "flex";
  114. removeClass(steps[currentStep], "done");
  115. removeClass(steps[currentStep], "active");
  116. if (currentStep == 0) {
  117. document.getElementById("backbtn").disabled = true;
  118. }
  119. } else {
  120. removeClass(steps[currentStep], "done");
  121. removeClass(steps[currentStep], "active");
  122. }
  123. }
  124. // function prevStep(){
  125. // fieldsets[currentStep].style.display = "none";
  126. // currentStep--;
  127. // fieldsets[currentStep].style.display = "block";
  128. // }
  129. /* get, set class, see https://ultimatecourses.com/blog/javascript-hasclass-addclass-removeclass-toggleclass */
  130. function hasClass(elem, className) {
  131. return new RegExp(" " + className + " ").test(" " + elem.className + " ");
  132. }
  133. function addClass(elem, className) {
  134. if (!hasClass(elem, className)) {
  135. elem.className += " " + className;
  136. }
  137. }
  138. function removeClass(elem, className) {
  139. console.log("elem, className", elem, className);
  140. var newClass = " " + elem.className.replace(/[\t\r\n]/g, " ") + " ";
  141. if (hasClass(elem, className)) {
  142. while (newClass.indexOf(" " + className + " ") >= 0) {
  143. newClass = newClass.replace(" " + className + " ", " ");
  144. }
  145. elem.className = newClass.replace(/^\s+|\s+$/g, "");
  146. }
  147. console.log("elem.className", elem.className);
  148. }