Advertisement
svfedorof

Untitled

Dec 19th, 2014
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.44 KB | None | 0 0
  1. <form accept-charset="UTF-8" action="https://madmimi.com/signups/subscribe/128338" id="mad_mimi_signup_form" method="post" target="_blank">
  2. <div style="margin:0;padding:0;display:inline">
  3. <input name="utf8" type="hidden" value="✓"/>
  4. </div>
  5. <div class="mimi_field required">
  6. <label for="signup_name">Name*</label>
  7. <br/>
  8. <input id="signup_name" name="signup[name]" type="text" data-required-field="This field is required"/>
  9. </div>
  10. <div class="mimi_field required">
  11. <label for="signup_email">Email*</label>
  12. <br/>
  13. <input id="signup_email" name="signup[email]" type="text" data-required-field="This field is required" placeholder="you@example.com"/>
  14. </div>
  15. <div class="mimi_field">
  16. <input type="submit" class="submit" value="Subscribe" id="webform_submit_button" data-default-text="Subscribe" data-submitting-text="Sending..." data-invalid-text="↑ You forgot some required fields" data-choose-list="↑ Choose a list" data-thanks="Thank you!">
  17. </input>
  18. </div>
  19. </form>
  20. <script type="text/javascript">
  21. (function(global) {
  22. function serialize(form){if(!form||form.nodeName!=="FORM"){return }var i,j,q=[];for(i=form.elements.length-1;i>=0;i=i-1){if(form.elements[i].name===""){continue}switch(form.elements[i].nodeName){case"INPUT":switch(form.elements[i].type){case"text":case"hidden":case"password":case"button":case"reset":case"submit":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"checkbox":case"radio":if(form.elements[i].checked){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value))}break;case"file":break}break;case"TEXTAREA":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"SELECT":switch(form.elements[i].type){case"select-one":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"select-multiple":for(j=form.elements[i].options.length-1;j>=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case"BUTTON":switch(form.elements[i].type){case"reset":case"submit":case"button":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break}break}}return q.join("&")};
  23.  
  24.  
  25. function extend(destination, source) {
  26. for (var prop in source) {
  27. destination[prop] = source[prop];
  28. }
  29. }
  30.  
  31. if(!Mimi) var Mimi = {};
  32. if(!Mimi.Signups) Mimi.Signups = {};
  33.  
  34. Mimi.Signups.EmbedValidation = function() {
  35. this.initialize();
  36.  
  37. if(document.addEventListener) {
  38. this.form.addEventListener('submit', this.onFormSubmit.bind(this));
  39. } else {
  40. this.form.attachEvent('onsubmit', this.onFormSubmit.bind(this));
  41. }
  42. };
  43.  
  44. extend(Mimi.Signups.EmbedValidation.prototype, {
  45. initialize: function() {
  46. this.form = document.getElementById('mad_mimi_signup_form');
  47. this.submit = document.getElementById('webform_submit_button');
  48. this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
  49. },
  50.  
  51. onFormSubmit: function(e) {
  52. e.preventDefault();
  53.  
  54. this.validate();
  55. if(this.isValid) {
  56. this.submitForm();
  57. } else {
  58. this.revalidateOnChange();
  59. }
  60. },
  61.  
  62. validate: function() {
  63. this.isValid = true;
  64. this.emailValidation();
  65. this.fieldAndListValidation();
  66. this.updateFormAfterValidation();
  67. },
  68.  
  69. emailValidation: function() {
  70. var email = document.getElementById('signup_email'),
  71. validEmail = /.+@.+\..+/;
  72.  
  73. if(!validEmail.test(email.value)) {
  74. this.textFieldError(email);
  75. this.isValid = false;
  76. } else {
  77. this.removeTextFieldError(email);
  78. }
  79. },
  80.  
  81. fieldAndListValidation: function() {
  82. var fields = this.form.querySelectorAll('.mimi_field.required');
  83.  
  84. for(var i = 0; i < fields.length; ++i) {
  85. var field = fields[i],
  86. type = this.fieldType(field);
  87. if(type == 'checkboxes' || type == 'radio_buttons') {
  88. this.checkboxAndRadioValidation(field);
  89. } else {
  90. this.textAndDropdownValidation(field, type);
  91. }
  92. }
  93. },
  94.  
  95. fieldType: function(field) {
  96. var type = field.querySelectorAll('.field_type');
  97.  
  98. if(type.length > 0) {
  99. return type[0].getAttribute('data-field-type');
  100. } else if(field.className.indexOf('checkgroup') >= 0) {
  101. return 'checkboxes';
  102. } else {
  103. return 'text_field';
  104. }
  105. },
  106.  
  107. checkboxAndRadioValidation: function(field) {
  108. var inputs = field.getElementsByTagName('input'),
  109. selected = false;
  110.  
  111. for(var i = 0; i < inputs.length; ++i) {
  112. var input = inputs[i];
  113. if((input.type == 'checkbox' || input.type == 'radio') && input.checked) selected = true;
  114. }
  115.  
  116. if(selected) {
  117. field.className = field.className.replace(/ invalid/g, '');
  118. } else {
  119. if(field.className.indexOf('invalid') == -1) field.className += ' invalid';
  120. this.isValid = false;
  121. }
  122. },
  123.  
  124. textAndDropdownValidation: function(field, type) {
  125. var inputs = field.getElementsByTagName('input');
  126.  
  127. for(var i = 0; i < inputs.length; ++i) {
  128. var input = inputs[i];
  129. if(input.name.indexOf('signup') >= 0) {
  130. if(type == 'text_field') {
  131. this.textValidation(input);
  132. } else {
  133. this.dropdownValidation(field, input);
  134. }
  135. }
  136. }
  137. this.htmlEmbedDropdownValidation(field);
  138. },
  139.  
  140. textValidation: function(input) {
  141. if(input.id == 'signup_email') return;
  142.  
  143. var val = input.value;
  144. if(val == '') {
  145. this.textFieldError(input);
  146. this.isValid = false;
  147. } else {
  148. this.removeTextFieldError(input)
  149. }
  150. },
  151.  
  152. dropdownValidation: function(field, input) {
  153. var val = input.value;
  154. if(val == '') {
  155. if(field.className.indexOf('invalid') == -1) field.className += ' invalid';
  156. this.onSelectCallback(input);
  157. this.isValid = false;
  158. } else {
  159. field.className = field.className.replace(/ invalid/g, '');
  160. }
  161. },
  162.  
  163. htmlEmbedDropdownValidation: function(field) {
  164. var dropdowns = field.querySelectorAll('.mimi_html_dropdown');
  165.  
  166. for(var i = 0; i < dropdowns.length; ++i) {
  167. var dropdown = dropdowns[i],
  168. val = dropdown.value;
  169. if(val == '') {
  170. if(field.className.indexOf('invalid') == -1) field.className += ' invalid';
  171. this.isValid = false;
  172. dropdown.onchange = this.validate.bind(this);
  173. } else {
  174. field.className = field.className.replace(/ invalid/g, '');
  175. }
  176. }
  177. },
  178.  
  179. textFieldError: function(input) {
  180. input.className = 'required invalid';
  181. input.placeholder = input.getAttribute('data-required-field');
  182. },
  183.  
  184. removeTextFieldError: function(input) {
  185. input.className = 'required';
  186. input.placeholder = '';
  187. },
  188.  
  189. onSelectCallback: function(input) {
  190. if(typeof Widget == 'undefined' ||
  191. Widget.BasicDropdown == undefined) return;
  192.  
  193. var dropdownEl = input.parentNode,
  194. instances = Widget.BasicDropdown.instances;
  195.  
  196. for(var i = 0; i < instances.length; ++i) {
  197. var instance = instances[i];
  198. if(instance.wrapperEl == dropdownEl) {
  199. instance.onSelect = this.validate.bind(this);
  200. }
  201. }
  202. },
  203.  
  204. updateFormAfterValidation: function() {
  205. this.form.className = this.setFormClassName();
  206. this.submit.value = this.submitButtonText();
  207. this.submit.disabled = !this.isValid;
  208. this.submit.className = this.isValid ? 'submit' : 'disabled';
  209. },
  210.  
  211. setFormClassName: function() {
  212. var name = this.form.className;
  213.  
  214. if(this.isValid) {
  215. return name.replace(/\s?mimi_invalid/, '');
  216. } else {
  217. if(name.indexOf('mimi_invalid') == -1) {
  218. return name += ' mimi_invalid';
  219. } else {
  220. return name;
  221. }
  222. }
  223. },
  224.  
  225. submitButtonText: function() {
  226. var invalidFields = document.querySelectorAll('.invalid'),
  227. text;
  228.  
  229. if(this.isValid || invalidFields == undefined) {
  230. text = this.submit.getAttribute('data-default-text');
  231. } else {
  232. if(invalidFields.length > 1 || invalidFields[0].className.indexOf('checkgroup') == -1) {
  233. text = this.submit.getAttribute('data-invalid-text');
  234. } else {
  235. text = this.submit.getAttribute('data-choose-list');
  236. }
  237. }
  238. return text;
  239. },
  240.  
  241. submitForm: function() {
  242. this.formSubmitting();
  243.  
  244. var _this = this;
  245. window[this.callbackName] = function(response) {
  246. delete window[this.callbackName];
  247. document.body.removeChild(script);
  248. _this.onSubmitCallback(response);
  249. };
  250.  
  251. var script = document.createElement('script');
  252. script.src = this.formUrl('json');
  253. document.body.appendChild(script);
  254. },
  255.  
  256. formUrl: function(format) {
  257. var action = this.form.action,
  258. divider = action.indexOf('?') >= 0 ? '&' : '?';
  259.  
  260. if(format == 'json') action += '.json';
  261.  
  262. return action + divider + 'callback=' + this.callbackName + '&' + serialize(this.form);
  263. },
  264.  
  265. formSubmitting: function() {
  266. this.form.className += ' mimi_submitting';
  267. this.submit.value = this.submit.getAttribute('data-submitting-text');
  268. this.submit.disabled = true;
  269. this.submit.className = 'disabled';
  270. },
  271.  
  272. onSubmitCallback: function(response) {
  273. if(response.success) {
  274. this.onSubmitSuccess(response.result);
  275. } else {
  276. top.location.href = this.formUrl('html');
  277. }
  278. },
  279.  
  280. onSubmitSuccess: function(result) {
  281. if(result.has_redirect) {
  282. top.location.href = result.redirect;
  283. } else if(result.single_opt_in || result.confirmation_html == null) {
  284. this.disableForm();
  285. this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));
  286. } else {
  287. this.showConfirmationText(result.confirmation_html);
  288. }
  289. },
  290.  
  291. showConfirmationText: function(html) {
  292. var fields = this.form.querySelectorAll('.mimi_field');
  293.  
  294. for(var i = 0; i < fields.length; ++i) {
  295. fields[i].style['display'] = 'none';
  296. }
  297.  
  298. (this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;
  299. },
  300.  
  301. disableForm: function() {
  302. var elements = this.form.elements;
  303. for(var i = 0; i < elements.length; ++i) {
  304. elements[i].disabled = true;
  305. }
  306. },
  307.  
  308. updateSubmitButtonText: function(text) {
  309. this.submit.value = text;
  310. },
  311.  
  312. revalidateOnChange: function() {
  313. var fields = this.form.querySelectorAll(".mimi_field.required");
  314.  
  315. for(var i = 0; i < fields.length; ++i) {
  316. var inputs = fields[i].getElementsByTagName('input');
  317. for(var j = 0; j < inputs.length; ++j) {
  318. inputs[j].onchange = this.validate.bind(this);
  319. }
  320. }
  321. }
  322. });
  323.  
  324. if (document.addEventListener) {
  325. document.addEventListener("DOMContentLoaded",
  326. new Mimi.Signups.EmbedValidation);
  327. }
  328. else {
  329. window.attachEvent('onload', function() {
  330. new Mimi.Signups.EmbedValidation();
  331. });
  332. }
  333. })(this);
  334. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement