jekyll-theme-voiladt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +308 -0
  4. data/_layouts/default.html +153 -0
  5. data/_layouts/home.html +222 -0
  6. data/_sass/_contact.scss +49 -0
  7. data/_sass/_footer.scss +43 -0
  8. data/_sass/_global.scss +98 -0
  9. data/_sass/_masthead.scss +50 -0
  10. data/_sass/_mixins.scss +22 -0
  11. data/_sass/_navbar.scss +73 -0
  12. data/_sass/_portfolio.scss +144 -0
  13. data/_sass/_services.scss +5 -0
  14. data/_sass/_team.scss +18 -0
  15. data/_sass/_timeline.scss +178 -0
  16. data/_sass/_variables.scss +17 -0
  17. data/assets/css/agency.min.scss +21 -0
  18. data/assets/img/about/1.jpg +0 -0
  19. data/assets/img/about/2.jpg +0 -0
  20. data/assets/img/about/3.jpg +0 -0
  21. data/assets/img/about/4.jpg +0 -0
  22. data/assets/img/header-bg.jpg +0 -0
  23. data/assets/img/logos/creative-market.jpg +0 -0
  24. data/assets/img/logos/designmodo.jpg +0 -0
  25. data/assets/img/logos/envato.jpg +0 -0
  26. data/assets/img/logos/themeforest.jpg +0 -0
  27. data/assets/img/map-image.png +0 -0
  28. data/assets/img/portfolio/01-full.jpg +0 -0
  29. data/assets/img/portfolio/01-thumbnail.jpg +0 -0
  30. data/assets/img/portfolio/02-full.jpg +0 -0
  31. data/assets/img/portfolio/02-thumbnail.jpg +0 -0
  32. data/assets/img/portfolio/03-full.jpg +0 -0
  33. data/assets/img/portfolio/03-thumbnail.jpg +0 -0
  34. data/assets/img/portfolio/04-full.jpg +0 -0
  35. data/assets/img/portfolio/04-thumbnail.jpg +0 -0
  36. data/assets/img/portfolio/05-full.jpg +0 -0
  37. data/assets/img/portfolio/05-thumbnail.jpg +0 -0
  38. data/assets/img/portfolio/06-full.jpg +0 -0
  39. data/assets/img/portfolio/06-thumbnail.jpg +0 -0
  40. data/assets/img/team/1.jpg +0 -0
  41. data/assets/img/team/2.jpg +0 -0
  42. data/assets/img/team/3.jpg +0 -0
  43. data/assets/js/agency.js +50 -0
  44. data/assets/js/agency.min.js +6 -0
  45. data/assets/js/contact_me.js +77 -0
  46. data/assets/js/contact_me.min.js +8 -0
  47. data/assets/js/jqBootstrapValidation.js +937 -0
  48. data/assets/js/jqBootstrapValidation.min.js +6 -0
  49. data/assets/vendor/bootstrap/css/bootstrap.css +8981 -0
  50. data/assets/vendor/bootstrap/css/bootstrap.css.map +1 -0
  51. data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
  52. data/assets/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  53. data/assets/vendor/bootstrap/js/bootstrap.bundle.js +6444 -0
  54. data/assets/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
  55. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  56. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  57. data/assets/vendor/bootstrap/js/bootstrap.js +3927 -0
  58. data/assets/vendor/bootstrap/js/bootstrap.js.map +1 -0
  59. data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
  60. data/assets/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
  61. data/assets/vendor/font-awesome/css/font-awesome.css +2337 -0
  62. data/assets/vendor/font-awesome/css/font-awesome.css.map +7 -0
  63. data/assets/vendor/font-awesome/css/font-awesome.min.css +4 -0
  64. data/assets/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  65. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  66. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  67. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  68. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  69. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  70. data/assets/vendor/font-awesome/less/animated.less +34 -0
  71. data/assets/vendor/font-awesome/less/bordered-pulled.less +25 -0
  72. data/assets/vendor/font-awesome/less/core.less +12 -0
  73. data/assets/vendor/font-awesome/less/fixed-width.less +6 -0
  74. data/assets/vendor/font-awesome/less/font-awesome.less +18 -0
  75. data/assets/vendor/font-awesome/less/icons.less +789 -0
  76. data/assets/vendor/font-awesome/less/larger.less +13 -0
  77. data/assets/vendor/font-awesome/less/list.less +19 -0
  78. data/assets/vendor/font-awesome/less/mixins.less +60 -0
  79. data/assets/vendor/font-awesome/less/path.less +15 -0
  80. data/assets/vendor/font-awesome/less/rotated-flipped.less +20 -0
  81. data/assets/vendor/font-awesome/less/screen-reader.less +5 -0
  82. data/assets/vendor/font-awesome/less/stacked.less +20 -0
  83. data/assets/vendor/font-awesome/less/variables.less +800 -0
  84. data/assets/vendor/font-awesome/scss/_animated.scss +34 -0
  85. data/assets/vendor/font-awesome/scss/_bordered-pulled.scss +25 -0
  86. data/assets/vendor/font-awesome/scss/_core.scss +12 -0
  87. data/assets/vendor/font-awesome/scss/_fixed-width.scss +6 -0
  88. data/assets/vendor/font-awesome/scss/_icons.scss +789 -0
  89. data/assets/vendor/font-awesome/scss/_larger.scss +13 -0
  90. data/assets/vendor/font-awesome/scss/_list.scss +19 -0
  91. data/assets/vendor/font-awesome/scss/_mixins.scss +60 -0
  92. data/assets/vendor/font-awesome/scss/_path.scss +15 -0
  93. data/assets/vendor/font-awesome/scss/_rotated-flipped.scss +20 -0
  94. data/assets/vendor/font-awesome/scss/_screen-reader.scss +5 -0
  95. data/assets/vendor/font-awesome/scss/_stacked.scss +20 -0
  96. data/assets/vendor/font-awesome/scss/_variables.scss +800 -0
  97. data/assets/vendor/font-awesome/scss/font-awesome.scss +18 -0
  98. data/assets/vendor/jquery-easing/jquery.easing.compatibility.js +59 -0
  99. data/assets/vendor/jquery-easing/jquery.easing.js +166 -0
  100. data/assets/vendor/jquery-easing/jquery.easing.min.js +1 -0
  101. data/assets/vendor/jquery/jquery.js +10364 -0
  102. data/assets/vendor/jquery/jquery.min.js +2 -0
  103. data/assets/vendor/jquery/jquery.min.map +1 -0
  104. data/assets/vendor/jquery/jquery.slim.js +8269 -0
  105. data/assets/vendor/jquery/jquery.slim.min.js +2 -0
  106. data/assets/vendor/jquery/jquery.slim.min.map +1 -0
  107. metadata +191 -0
@@ -0,0 +1,21 @@
1
+ ---
2
+ ---
3
+ /*!
4
+ * Start Bootstrap - Agency v4.1.1 (https://startbootstrap.com/template-overviews/agency)
5
+ * Copyright 2013-2018 Start Bootstrap
6
+ * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-agency/blob/master/LICENSE)
7
+ */
8
+ // Core variables and mixins
9
+ @import "_variables.scss";
10
+ @import "_mixins.scss";
11
+ // Global CSS
12
+ @import "_global.scss";
13
+ // Components
14
+ @import "_navbar.scss";
15
+ @import "_masthead.scss";
16
+ @import "_services.scss";
17
+ @import "_portfolio.scss";
18
+ @import "_timeline.scss";
19
+ @import "_team.scss";
20
+ @import "_contact.scss";
21
+ @import "_footer.scss";
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,50 @@
1
+ (function($) {
2
+ "use strict"; // Start of use strict
3
+
4
+ // Smooth scrolling using jQuery easing
5
+ $('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function() {
6
+ if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
7
+ var target = $(this.hash);
8
+ target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
9
+ if (target.length) {
10
+ $('html, body').animate({
11
+ scrollTop: (target.offset().top - 54)
12
+ }, 1000, "easeInOutExpo");
13
+ return false;
14
+ }
15
+ }
16
+ });
17
+
18
+ // Closes responsive menu when a scroll trigger link is clicked
19
+ $('.js-scroll-trigger').click(function() {
20
+ $('.navbar-collapse').collapse('hide');
21
+ });
22
+
23
+ // Activate scrollspy to add active class to navbar items on scroll
24
+ $('body').scrollspy({
25
+ target: '#mainNav',
26
+ offset: 56
27
+ });
28
+
29
+ // Collapse Navbar
30
+ var navbarCollapse = function() {
31
+ if ($("#mainNav").offset().top > 100) {
32
+ $("#mainNav").addClass("navbar-shrink");
33
+ } else {
34
+ $("#mainNav").removeClass("navbar-shrink");
35
+ }
36
+ };
37
+ // Collapse now if page is not at top
38
+ navbarCollapse();
39
+ // Collapse the navbar when page is scrolled
40
+ $(window).scroll(navbarCollapse);
41
+
42
+ // Hide navbar when modals trigger
43
+ $('.portfolio-modal').on('show.bs.modal', function(e) {
44
+ $(".navbar").addClass("d-none");
45
+ })
46
+ $('.portfolio-modal').on('hidden.bs.modal', function(e) {
47
+ $(".navbar").removeClass("d-none");
48
+ })
49
+
50
+ })(jQuery); // End of use strict
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Start Bootstrap - Agency v4.1.1 (https://startbootstrap.com/template-overviews/agency)
3
+ * Copyright 2013-2018 Start Bootstrap
4
+ * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-agency/blob/master/LICENSE)
5
+ */
6
+ !function(a){"use strict";a('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function(){if(location.pathname.replace(/^\//,"")==this.pathname.replace(/^\//,"")&&location.hostname==this.hostname){var o=a(this.hash);if((o=o.length?o:a("[name="+this.hash.slice(1)+"]")).length)return a("html, body").animate({scrollTop:o.offset().top-54},1e3,"easeInOutExpo"),!1}}),a(".js-scroll-trigger").click(function(){a(".navbar-collapse").collapse("hide")}),a("body").scrollspy({target:"#mainNav",offset:56});var o=function(){a("#mainNav").offset().top>100?a("#mainNav").addClass("navbar-shrink"):a("#mainNav").removeClass("navbar-shrink")};o(),a(window).scroll(o),a(".portfolio-modal").on("show.bs.modal",function(o){a(".navbar").addClass("d-none")}),a(".portfolio-modal").on("hidden.bs.modal",function(o){a(".navbar").removeClass("d-none")})}(jQuery);
@@ -0,0 +1,77 @@
1
+ ---
2
+ ---
3
+ $(function() {
4
+
5
+ $("#contactForm input,#contactForm textarea").jqBootstrapValidation({
6
+ preventSubmit: true,
7
+ submitError: function($form, event, errors) {
8
+ // additional error messages or events
9
+ },
10
+ submitSuccess: function($form, event) {
11
+ event.preventDefault(); // prevent default submit behaviour
12
+ // get values from FORM
13
+ var name = $("input#name").val();
14
+ var email = $("input#email").val();
15
+ var phone = $("input#phone").val();
16
+ var message = $("textarea#message").val();
17
+ var firstName = name; // For Success/Failure Message
18
+ // Check for white space in name for Success/Fail message
19
+ if (firstName.indexOf(' ') >= 0) {
20
+ firstName = name.split(' ').slice(0, -1).join(' ');
21
+ }
22
+ $this = $("#sendMessageButton");
23
+ $this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages
24
+ $.ajax({
25
+ url: "{{ site.data.home.contact.js-url }}",
26
+ type: "POST",
27
+ data: {
28
+ name: name,
29
+ phone: phone,
30
+ email: email,
31
+ message: message
32
+ },
33
+ cache: false,
34
+ success: function() {
35
+ // Success message
36
+ $('#success').html("<div class='alert alert-success'>");
37
+ $('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
38
+ .append("</button>");
39
+ $('#success > .alert-success')
40
+ .append("<strong>{{ site.data.home.contact.js-success }}</strong>");
41
+ $('#success > .alert-success')
42
+ .append('</div>');
43
+ //clear all fields
44
+ $('#contactForm').trigger("reset");
45
+ },
46
+ error: function() {
47
+ // Fail message
48
+ $('#success').html("<div class='alert alert-danger'>");
49
+ $('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
50
+ .append("</button>");
51
+ $('#success > .alert-danger').append($("<strong>").text("{{ site.data.home.contact.js-error }}"));
52
+ $('#success > .alert-danger').append('</div>');
53
+ //clear all fields
54
+ $('#contactForm').trigger("reset");
55
+ },
56
+ complete: function() {
57
+ setTimeout(function() {
58
+ $this.prop("disabled", false); // Re-enable submit button when AJAX call is complete
59
+ }, 1000);
60
+ }
61
+ });
62
+ },
63
+ filter: function() {
64
+ return $(this).is(":visible");
65
+ },
66
+ });
67
+
68
+ $("a[data-toggle=\"tab\"]").click(function(e) {
69
+ e.preventDefault();
70
+ $(this).tab("show");
71
+ });
72
+ });
73
+
74
+ /*When clicking on Full hide fail/success boxes */
75
+ $('#name').focus(function() {
76
+ $('#success').html('');
77
+ });
@@ -0,0 +1,8 @@
1
+ ---
2
+ ---
3
+ /*!
4
+ * Start Bootstrap - Agency v4.1.1 (https://startbootstrap.com/template-overviews/agency)
5
+ * Copyright 2013-2018 Start Bootstrap
6
+ * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-agency/blob/master/LICENSE)
7
+ */
8
+ $(function(){$("#contactForm input,#contactForm textarea").jqBootstrapValidation({preventSubmit:!0,submitError:function(t,e,s){},submitSuccess:function(t,e){e.preventDefault();var s=$("input#name").val(),a=$("input#email").val(),n=$("input#phone").val(),c=$("textarea#message").val(),i=s;i.indexOf(" ")>=0&&(i=s.split(" ").slice(0,-1).join(" ")),$this=$("#sendMessageButton"),$this.prop("disabled",!0),$.ajax({url:"{{ site.data.home.contact.js-url }}",type:"POST",data:{name:s,phone:n,email:a,message:c},cache:!1,success:function(){$("#success").html("<div class='alert alert-success'>"),$("#success > .alert-success").html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;").append("</button>"),$("#success > .alert-success").append("<strong>{{ site.data.home.contact.js-success }}</strong>"),$("#success > .alert-success").append("</div>"),$("#contactForm").trigger("reset")},error:function(){$("#success").html("<div class='alert alert-danger'>"),$("#success > .alert-danger").html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;").append("</button>"),$("#success > .alert-danger").append($("<strong>").text("{{ site.data.home.contact.js-error-min }}")),$("#success > .alert-danger").append("</div>"),$("#contactForm").trigger("reset")},complete:function(){setTimeout(function(){$this.prop("disabled",!1)},1e3)}})},filter:function(){return $(this).is(":visible")}}),$('a[data-toggle="tab"]').click(function(t){t.preventDefault(),$(this).tab("show")})}),$("#name").focus(function(){$("#success").html("")});
@@ -0,0 +1,937 @@
1
+ /* jqBootstrapValidation
2
+ * A plugin for automating validation on Twitter Bootstrap formatted forms.
3
+ *
4
+ * v1.3.6
5
+ *
6
+ * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
7
+ *
8
+ * http://ReactiveRaven.github.com/jqBootstrapValidation/
9
+ */
10
+
11
+ (function($) {
12
+
13
+ var createdElements = [];
14
+
15
+ var defaults = {
16
+ options: {
17
+ prependExistingHelpBlock: false,
18
+ sniffHtml: true, // sniff for 'required', 'maxlength', etc
19
+ preventSubmit: true, // stop the form submit event from firing if validation fails
20
+ submitError: false, // function called if there is an error when trying to submit
21
+ submitSuccess: false, // function called just before a successful submit event is sent to the server
22
+ semanticallyStrict: false, // set to true to tidy up generated HTML output
23
+ autoAdd: {
24
+ helpBlocks: true
25
+ },
26
+ filter: function() {
27
+ // return $(this).is(":visible"); // only validate elements you can see
28
+ return true; // validate everything
29
+ }
30
+ },
31
+ methods: {
32
+ init: function(options) {
33
+
34
+ var settings = $.extend(true, {}, defaults);
35
+
36
+ settings.options = $.extend(true, settings.options, options);
37
+
38
+ var $siblingElements = this;
39
+
40
+ var uniqueForms = $.unique(
41
+ $siblingElements.map(function() {
42
+ return $(this).parents("form")[0];
43
+ }).toArray()
44
+ );
45
+
46
+ $(uniqueForms).bind("submit", function(e) {
47
+ var $form = $(this);
48
+ var warningsFound = 0;
49
+ var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
50
+ $inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
51
+
52
+ $inputs.each(function(i, el) {
53
+ var $this = $(el),
54
+ $controlGroup = $this.parents(".form-group").first();
55
+ if (
56
+ $controlGroup.hasClass("warning")
57
+ ) {
58
+ $controlGroup.removeClass("warning").addClass("error");
59
+ warningsFound++;
60
+ }
61
+ });
62
+
63
+ $inputs.trigger("validationLostFocus.validation");
64
+
65
+ if (warningsFound) {
66
+ if (settings.options.preventSubmit) {
67
+ e.preventDefault();
68
+ }
69
+ $form.addClass("error");
70
+ if ($.isFunction(settings.options.submitError)) {
71
+ settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
72
+ }
73
+ } else {
74
+ $form.removeClass("error");
75
+ if ($.isFunction(settings.options.submitSuccess)) {
76
+ settings.options.submitSuccess($form, e);
77
+ }
78
+ }
79
+ });
80
+
81
+ return this.each(function() {
82
+
83
+ // Get references to everything we're interested in
84
+ var $this = $(this),
85
+ $controlGroup = $this.parents(".form-group").first(),
86
+ $helpBlock = $controlGroup.find(".help-block").first(),
87
+ $form = $this.parents("form").first(),
88
+ validatorNames = [];
89
+
90
+ // create message container if not exists
91
+ if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
92
+ $helpBlock = $('<div class="help-block" />');
93
+ $controlGroup.find('.controls').append($helpBlock);
94
+ createdElements.push($helpBlock[0]);
95
+ }
96
+
97
+ // =============================================================
98
+ // SNIFF HTML FOR VALIDATORS
99
+ // =============================================================
100
+
101
+ // *snort sniff snuffle*
102
+
103
+ if (settings.options.sniffHtml) {
104
+ var message = "";
105
+ // ---------------------------------------------------------
106
+ // PATTERN
107
+ // ---------------------------------------------------------
108
+ if ($this.attr("pattern") !== undefined) {
109
+ message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
110
+ if ($this.data("validationPatternMessage")) {
111
+ message = $this.data("validationPatternMessage");
112
+ }
113
+ $this.data("validationPatternMessage", message);
114
+ $this.data("validationPatternRegex", $this.attr("pattern"));
115
+ }
116
+ // ---------------------------------------------------------
117
+ // MAX
118
+ // ---------------------------------------------------------
119
+ if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
120
+ var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
121
+ message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
122
+ if ($this.data("validationMaxMessage")) {
123
+ message = $this.data("validationMaxMessage");
124
+ }
125
+ $this.data("validationMaxMessage", message);
126
+ $this.data("validationMaxMax", max);
127
+ }
128
+ // ---------------------------------------------------------
129
+ // MIN
130
+ // ---------------------------------------------------------
131
+ if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
132
+ var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
133
+ message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
134
+ if ($this.data("validationMinMessage")) {
135
+ message = $this.data("validationMinMessage");
136
+ }
137
+ $this.data("validationMinMessage", message);
138
+ $this.data("validationMinMin", min);
139
+ }
140
+ // ---------------------------------------------------------
141
+ // MAXLENGTH
142
+ // ---------------------------------------------------------
143
+ if ($this.attr("maxlength") !== undefined) {
144
+ message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
145
+ if ($this.data("validationMaxlengthMessage")) {
146
+ message = $this.data("validationMaxlengthMessage");
147
+ }
148
+ $this.data("validationMaxlengthMessage", message);
149
+ $this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
150
+ }
151
+ // ---------------------------------------------------------
152
+ // MINLENGTH
153
+ // ---------------------------------------------------------
154
+ if ($this.attr("minlength") !== undefined) {
155
+ message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
156
+ if ($this.data("validationMinlengthMessage")) {
157
+ message = $this.data("validationMinlengthMessage");
158
+ }
159
+ $this.data("validationMinlengthMessage", message);
160
+ $this.data("validationMinlengthMinlength", $this.attr("minlength"));
161
+ }
162
+ // ---------------------------------------------------------
163
+ // REQUIRED
164
+ // ---------------------------------------------------------
165
+ if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
166
+ message = settings.builtInValidators.required.message;
167
+ if ($this.data("validationRequiredMessage")) {
168
+ message = $this.data("validationRequiredMessage");
169
+ }
170
+ $this.data("validationRequiredMessage", message);
171
+ }
172
+ // ---------------------------------------------------------
173
+ // NUMBER
174
+ // ---------------------------------------------------------
175
+ if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
176
+ message = settings.builtInValidators.number.message;
177
+ if ($this.data("validationNumberMessage")) {
178
+ message = $this.data("validationNumberMessage");
179
+ }
180
+ $this.data("validationNumberMessage", message);
181
+ }
182
+ // ---------------------------------------------------------
183
+ // EMAIL
184
+ // ---------------------------------------------------------
185
+ if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
186
+ message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
187
+ if ($this.data("validationValidemailMessage")) {
188
+ message = $this.data("validationValidemailMessage");
189
+ } else if ($this.data("validationEmailMessage")) {
190
+ message = $this.data("validationEmailMessage");
191
+ }
192
+ $this.data("validationValidemailMessage", message);
193
+ }
194
+ // ---------------------------------------------------------
195
+ // MINCHECKED
196
+ // ---------------------------------------------------------
197
+ if ($this.attr("minchecked") !== undefined) {
198
+ message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
199
+ if ($this.data("validationMincheckedMessage")) {
200
+ message = $this.data("validationMincheckedMessage");
201
+ }
202
+ $this.data("validationMincheckedMessage", message);
203
+ $this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
204
+ }
205
+ // ---------------------------------------------------------
206
+ // MAXCHECKED
207
+ // ---------------------------------------------------------
208
+ if ($this.attr("maxchecked") !== undefined) {
209
+ message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
210
+ if ($this.data("validationMaxcheckedMessage")) {
211
+ message = $this.data("validationMaxcheckedMessage");
212
+ }
213
+ $this.data("validationMaxcheckedMessage", message);
214
+ $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
215
+ }
216
+ }
217
+
218
+ // =============================================================
219
+ // COLLECT VALIDATOR NAMES
220
+ // =============================================================
221
+
222
+ // Get named validators
223
+ if ($this.data("validation") !== undefined) {
224
+ validatorNames = $this.data("validation").split(",");
225
+ }
226
+
227
+ // Get extra ones defined on the element's data attributes
228
+ $.each($this.data(), function(i, el) {
229
+ var parts = i.replace(/([A-Z])/g, ",$1").split(",");
230
+ if (parts[0] === "validation" && parts[1]) {
231
+ validatorNames.push(parts[1]);
232
+ }
233
+ });
234
+
235
+ // =============================================================
236
+ // NORMALISE VALIDATOR NAMES
237
+ // =============================================================
238
+
239
+ var validatorNamesToInspect = validatorNames;
240
+ var newValidatorNamesToInspect = [];
241
+
242
+ do // repeatedly expand 'shortcut' validators into their real validators
243
+ {
244
+ // Uppercase only the first letter of each name
245
+ $.each(validatorNames, function(i, el) {
246
+ validatorNames[i] = formatValidatorName(el);
247
+ });
248
+
249
+ // Remove duplicate validator names
250
+ validatorNames = $.unique(validatorNames);
251
+
252
+ // Pull out the new validator names from each shortcut
253
+ newValidatorNamesToInspect = [];
254
+ $.each(validatorNamesToInspect, function(i, el) {
255
+ if ($this.data("validation" + el + "Shortcut") !== undefined) {
256
+ // Are these custom validators?
257
+ // Pull them out!
258
+ $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
259
+ newValidatorNamesToInspect.push(el2);
260
+ });
261
+ } else if (settings.builtInValidators[el.toLowerCase()]) {
262
+ // Is this a recognised built-in?
263
+ // Pull it out!
264
+ var validator = settings.builtInValidators[el.toLowerCase()];
265
+ if (validator.type.toLowerCase() === "shortcut") {
266
+ $.each(validator.shortcut.split(","), function(i, el) {
267
+ el = formatValidatorName(el);
268
+ newValidatorNamesToInspect.push(el);
269
+ validatorNames.push(el);
270
+ });
271
+ }
272
+ }
273
+ });
274
+
275
+ validatorNamesToInspect = newValidatorNamesToInspect;
276
+
277
+ } while (validatorNamesToInspect.length > 0)
278
+
279
+ // =============================================================
280
+ // SET UP VALIDATOR ARRAYS
281
+ // =============================================================
282
+
283
+ var validators = {};
284
+
285
+ $.each(validatorNames, function(i, el) {
286
+ // Set up the 'override' message
287
+ var message = $this.data("validation" + el + "Message");
288
+ var hasOverrideMessage = (message !== undefined);
289
+ var foundValidator = false;
290
+ message =
291
+ (
292
+ message ?
293
+ message :
294
+ "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
295
+ );
296
+
297
+ $.each(
298
+ settings.validatorTypes,
299
+ function(validatorType, validatorTemplate) {
300
+ if (validators[validatorType] === undefined) {
301
+ validators[validatorType] = [];
302
+ }
303
+ if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
304
+ validators[validatorType].push(
305
+ $.extend(
306
+ true, {
307
+ name: formatValidatorName(validatorTemplate.name),
308
+ message: message
309
+ },
310
+ validatorTemplate.init($this, el)
311
+ )
312
+ );
313
+ foundValidator = true;
314
+ }
315
+ }
316
+ );
317
+
318
+ if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
319
+
320
+ var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
321
+ if (hasOverrideMessage) {
322
+ validator.message = message;
323
+ }
324
+ var validatorType = validator.type.toLowerCase();
325
+
326
+ if (validatorType === "shortcut") {
327
+ foundValidator = true;
328
+ } else {
329
+ $.each(
330
+ settings.validatorTypes,
331
+ function(validatorTemplateType, validatorTemplate) {
332
+ if (validators[validatorTemplateType] === undefined) {
333
+ validators[validatorTemplateType] = [];
334
+ }
335
+ if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
336
+ $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
337
+ validators[validatorType].push(
338
+ $.extend(
339
+ validator,
340
+ validatorTemplate.init($this, el)
341
+ )
342
+ );
343
+ foundValidator = true;
344
+ }
345
+ }
346
+ );
347
+ }
348
+ }
349
+
350
+ if (!foundValidator) {
351
+ $.error("Cannot find validation info for '" + el + "'");
352
+ }
353
+ });
354
+
355
+ // =============================================================
356
+ // STORE FALLBACK VALUES
357
+ // =============================================================
358
+
359
+ $helpBlock.data(
360
+ "original-contents",
361
+ (
362
+ $helpBlock.data("original-contents") ?
363
+ $helpBlock.data("original-contents") :
364
+ $helpBlock.html()
365
+ )
366
+ );
367
+
368
+ $helpBlock.data(
369
+ "original-role",
370
+ (
371
+ $helpBlock.data("original-role") ?
372
+ $helpBlock.data("original-role") :
373
+ $helpBlock.attr("role")
374
+ )
375
+ );
376
+
377
+ $controlGroup.data(
378
+ "original-classes",
379
+ (
380
+ $controlGroup.data("original-clases") ?
381
+ $controlGroup.data("original-classes") :
382
+ $controlGroup.attr("class")
383
+ )
384
+ );
385
+
386
+ $this.data(
387
+ "original-aria-invalid",
388
+ (
389
+ $this.data("original-aria-invalid") ?
390
+ $this.data("original-aria-invalid") :
391
+ $this.attr("aria-invalid")
392
+ )
393
+ );
394
+
395
+ // =============================================================
396
+ // VALIDATION
397
+ // =============================================================
398
+
399
+ $this.bind(
400
+ "validation.validation",
401
+ function(event, params) {
402
+
403
+ var value = getValue($this);
404
+
405
+ // Get a list of the errors to apply
406
+ var errorsFound = [];
407
+
408
+ $.each(validators, function(validatorType, validatorTypeArray) {
409
+ if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
410
+ $.each(validatorTypeArray, function(i, validator) {
411
+ if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
412
+ errorsFound.push(validator.message);
413
+ }
414
+ });
415
+ }
416
+ });
417
+
418
+ return errorsFound;
419
+ }
420
+ );
421
+
422
+ $this.bind(
423
+ "getValidators.validation",
424
+ function() {
425
+ return validators;
426
+ }
427
+ );
428
+
429
+ // =============================================================
430
+ // WATCH FOR CHANGES
431
+ // =============================================================
432
+ $this.bind(
433
+ "submit.validation",
434
+ function() {
435
+ return $this.triggerHandler("change.validation", {
436
+ submitting: true
437
+ });
438
+ }
439
+ );
440
+ $this.bind(
441
+ [
442
+ "keyup",
443
+ "focus",
444
+ "blur",
445
+ "click",
446
+ "keydown",
447
+ "keypress",
448
+ "change"
449
+ ].join(".validation ") + ".validation",
450
+ function(e, params) {
451
+
452
+ var value = getValue($this);
453
+
454
+ var errorsFound = [];
455
+
456
+ $controlGroup.find("input,textarea,select").each(function(i, el) {
457
+ var oldCount = errorsFound.length;
458
+ $.each($(el).triggerHandler("validation.validation", params), function(j, message) {
459
+ errorsFound.push(message);
460
+ });
461
+ if (errorsFound.length > oldCount) {
462
+ $(el).attr("aria-invalid", "true");
463
+ } else {
464
+ var original = $this.data("original-aria-invalid");
465
+ $(el).attr("aria-invalid", (original !== undefined ? original : false));
466
+ }
467
+ });
468
+
469
+ $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
470
+
471
+ errorsFound = $.unique(errorsFound.sort());
472
+
473
+ // Were there any errors?
474
+ if (errorsFound.length) {
475
+ // Better flag it up as a warning.
476
+ $controlGroup.removeClass("success error").addClass("warning");
477
+
478
+ // How many errors did we find?
479
+ if (settings.options.semanticallyStrict && errorsFound.length === 1) {
480
+ // Only one? Being strict? Just output it.
481
+ $helpBlock.html(errorsFound[0] +
482
+ (settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : ""));
483
+ } else {
484
+ // Multiple? Being sloppy? Glue them together into an UL.
485
+ $helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
486
+ (settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : ""));
487
+ }
488
+ } else {
489
+ $controlGroup.removeClass("warning error success");
490
+ if (value.length > 0) {
491
+ $controlGroup.addClass("success");
492
+ }
493
+ $helpBlock.html($helpBlock.data("original-contents"));
494
+ }
495
+
496
+ if (e.type === "blur") {
497
+ $controlGroup.removeClass("success");
498
+ }
499
+ }
500
+ );
501
+ $this.bind("validationLostFocus.validation", function() {
502
+ $controlGroup.removeClass("success");
503
+ });
504
+ });
505
+ },
506
+ destroy: function() {
507
+
508
+ return this.each(
509
+ function() {
510
+
511
+ var
512
+ $this = $(this),
513
+ $controlGroup = $this.parents(".form-group").first(),
514
+ $helpBlock = $controlGroup.find(".help-block").first();
515
+
516
+ // remove our events
517
+ $this.unbind('.validation'); // events are namespaced.
518
+ // reset help text
519
+ $helpBlock.html($helpBlock.data("original-contents"));
520
+ // reset classes
521
+ $controlGroup.attr("class", $controlGroup.data("original-classes"));
522
+ // reset aria
523
+ $this.attr("aria-invalid", $this.data("original-aria-invalid"));
524
+ // reset role
525
+ $helpBlock.attr("role", $this.data("original-role"));
526
+ // remove all elements we created
527
+ if (createdElements.indexOf($helpBlock[0]) > -1) {
528
+ $helpBlock.remove();
529
+ }
530
+
531
+ }
532
+ );
533
+
534
+ },
535
+ collectErrors: function(includeEmpty) {
536
+
537
+ var errorMessages = {};
538
+ this.each(function(i, el) {
539
+ var $el = $(el);
540
+ var name = $el.attr("name");
541
+ var errors = $el.triggerHandler("validation.validation", {
542
+ includeEmpty: true
543
+ });
544
+ errorMessages[name] = $.extend(true, errors, errorMessages[name]);
545
+ });
546
+
547
+ $.each(errorMessages, function(i, el) {
548
+ if (el.length === 0) {
549
+ delete errorMessages[i];
550
+ }
551
+ });
552
+
553
+ return errorMessages;
554
+
555
+ },
556
+ hasErrors: function() {
557
+
558
+ var errorMessages = [];
559
+
560
+ this.each(function(i, el) {
561
+ errorMessages = errorMessages.concat(
562
+ $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {
563
+ submitting: true
564
+ }) : []
565
+ );
566
+ });
567
+
568
+ return (errorMessages.length > 0);
569
+ },
570
+ override: function(newDefaults) {
571
+ defaults = $.extend(true, defaults, newDefaults);
572
+ }
573
+ },
574
+ validatorTypes: {
575
+ callback: {
576
+ name: "callback",
577
+ init: function($this, name) {
578
+ return {
579
+ validatorName: name,
580
+ callback: $this.data("validation" + name + "Callback"),
581
+ lastValue: $this.val(),
582
+ lastValid: true,
583
+ lastFinished: true
584
+ };
585
+ },
586
+ validate: function($this, value, validator) {
587
+ if (validator.lastValue === value && validator.lastFinished) {
588
+ return !validator.lastValid;
589
+ }
590
+
591
+ if (validator.lastFinished === true) {
592
+ validator.lastValue = value;
593
+ validator.lastValid = true;
594
+ validator.lastFinished = false;
595
+
596
+ var rrjqbvValidator = validator;
597
+ var rrjqbvThis = $this;
598
+ executeFunctionByName(
599
+ validator.callback,
600
+ window,
601
+ $this,
602
+ value,
603
+ function(data) {
604
+ if (rrjqbvValidator.lastValue === data.value) {
605
+ rrjqbvValidator.lastValid = data.valid;
606
+ if (data.message) {
607
+ rrjqbvValidator.message = data.message;
608
+ }
609
+ rrjqbvValidator.lastFinished = true;
610
+ rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
611
+ // Timeout is set to avoid problems with the events being considered 'already fired'
612
+ setTimeout(function() {
613
+ rrjqbvThis.trigger("change.validation");
614
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
615
+ }
616
+ }
617
+ );
618
+ }
619
+
620
+ return false;
621
+
622
+ }
623
+ },
624
+ ajax: {
625
+ name: "ajax",
626
+ init: function($this, name) {
627
+ return {
628
+ validatorName: name,
629
+ url: $this.data("validation" + name + "Ajax"),
630
+ lastValue: $this.val(),
631
+ lastValid: true,
632
+ lastFinished: true
633
+ };
634
+ },
635
+ validate: function($this, value, validator) {
636
+ if ("" + validator.lastValue === "" + value && validator.lastFinished === true) {
637
+ return validator.lastValid === false;
638
+ }
639
+
640
+ if (validator.lastFinished === true) {
641
+ validator.lastValue = value;
642
+ validator.lastValid = true;
643
+ validator.lastFinished = false;
644
+ $.ajax({
645
+ url: validator.url,
646
+ data: "value=" + value + "&field=" + $this.attr("name"),
647
+ dataType: "json",
648
+ success: function(data) {
649
+ if ("" + validator.lastValue === "" + data.value) {
650
+ validator.lastValid = !!(data.valid);
651
+ if (data.message) {
652
+ validator.message = data.message;
653
+ }
654
+ validator.lastFinished = true;
655
+ $this.data("validation" + validator.validatorName + "Message", validator.message);
656
+ // Timeout is set to avoid problems with the events being considered 'already fired'
657
+ setTimeout(function() {
658
+ $this.trigger("change.validation");
659
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
660
+ }
661
+ },
662
+ failure: function() {
663
+ validator.lastValid = true;
664
+ validator.message = "ajax call failed";
665
+ validator.lastFinished = true;
666
+ $this.data("validation" + validator.validatorName + "Message", validator.message);
667
+ // Timeout is set to avoid problems with the events being considered 'already fired'
668
+ setTimeout(function() {
669
+ $this.trigger("change.validation");
670
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
671
+ }
672
+ });
673
+ }
674
+
675
+ return false;
676
+
677
+ }
678
+ },
679
+ regex: {
680
+ name: "regex",
681
+ init: function($this, name) {
682
+ return {
683
+ regex: regexFromString($this.data("validation" + name + "Regex"))
684
+ };
685
+ },
686
+ validate: function($this, value, validator) {
687
+ return (!validator.regex.test(value) && !validator.negative) ||
688
+ (validator.regex.test(value) && validator.negative);
689
+ }
690
+ },
691
+ required: {
692
+ name: "required",
693
+ init: function($this, name) {
694
+ return {};
695
+ },
696
+ validate: function($this, value, validator) {
697
+ return !!(value.length === 0 && !validator.negative) ||
698
+ !!(value.length > 0 && validator.negative);
699
+ },
700
+ blockSubmit: true
701
+ },
702
+ match: {
703
+ name: "match",
704
+ init: function($this, name) {
705
+ var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
706
+ element.bind("validation.validation", function() {
707
+ $this.trigger("change.validation", {
708
+ submitting: true
709
+ });
710
+ });
711
+ return {
712
+ "element": element
713
+ };
714
+ },
715
+ validate: function($this, value, validator) {
716
+ return (value !== validator.element.val() && !validator.negative) ||
717
+ (value === validator.element.val() && validator.negative);
718
+ },
719
+ blockSubmit: true
720
+ },
721
+ max: {
722
+ name: "max",
723
+ init: function($this, name) {
724
+ return {
725
+ max: $this.data("validation" + name + "Max")
726
+ };
727
+ },
728
+ validate: function($this, value, validator) {
729
+ return (parseFloat(value, 10) > parseFloat(validator.max, 10) && !validator.negative) ||
730
+ (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
731
+ }
732
+ },
733
+ min: {
734
+ name: "min",
735
+ init: function($this, name) {
736
+ return {
737
+ min: $this.data("validation" + name + "Min")
738
+ };
739
+ },
740
+ validate: function($this, value, validator) {
741
+ return (parseFloat(value) < parseFloat(validator.min) && !validator.negative) ||
742
+ (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
743
+ }
744
+ },
745
+ maxlength: {
746
+ name: "maxlength",
747
+ init: function($this, name) {
748
+ return {
749
+ maxlength: $this.data("validation" + name + "Maxlength")
750
+ };
751
+ },
752
+ validate: function($this, value, validator) {
753
+ return ((value.length > validator.maxlength) && !validator.negative) ||
754
+ ((value.length <= validator.maxlength) && validator.negative);
755
+ }
756
+ },
757
+ minlength: {
758
+ name: "minlength",
759
+ init: function($this, name) {
760
+ return {
761
+ minlength: $this.data("validation" + name + "Minlength")
762
+ };
763
+ },
764
+ validate: function($this, value, validator) {
765
+ return ((value.length < validator.minlength) && !validator.negative) ||
766
+ ((value.length >= validator.minlength) && validator.negative);
767
+ }
768
+ },
769
+ maxchecked: {
770
+ name: "maxchecked",
771
+ init: function($this, name) {
772
+ var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
773
+ elements.bind("click.validation", function() {
774
+ $this.trigger("change.validation", {
775
+ includeEmpty: true
776
+ });
777
+ });
778
+ return {
779
+ maxchecked: $this.data("validation" + name + "Maxchecked"),
780
+ elements: elements
781
+ };
782
+ },
783
+ validate: function($this, value, validator) {
784
+ return (validator.elements.filter(":checked").length > validator.maxchecked && !validator.negative) ||
785
+ (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
786
+ },
787
+ blockSubmit: true
788
+ },
789
+ minchecked: {
790
+ name: "minchecked",
791
+ init: function($this, name) {
792
+ var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
793
+ elements.bind("click.validation", function() {
794
+ $this.trigger("change.validation", {
795
+ includeEmpty: true
796
+ });
797
+ });
798
+ return {
799
+ minchecked: $this.data("validation" + name + "Minchecked"),
800
+ elements: elements
801
+ };
802
+ },
803
+ validate: function($this, value, validator) {
804
+ return (validator.elements.filter(":checked").length < validator.minchecked && !validator.negative) ||
805
+ (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
806
+ },
807
+ blockSubmit: true
808
+ }
809
+ },
810
+ builtInValidators: {
811
+ email: {
812
+ name: "Email",
813
+ type: "shortcut",
814
+ shortcut: "validemail"
815
+ },
816
+ validemail: {
817
+ name: "Validemail",
818
+ type: "regex",
819
+ regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
820
+ message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
821
+ },
822
+ passwordagain: {
823
+ name: "Passwordagain",
824
+ type: "match",
825
+ match: "password",
826
+ message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
827
+ },
828
+ positive: {
829
+ name: "Positive",
830
+ type: "shortcut",
831
+ shortcut: "number,positivenumber"
832
+ },
833
+ negative: {
834
+ name: "Negative",
835
+ type: "shortcut",
836
+ shortcut: "number,negativenumber"
837
+ },
838
+ number: {
839
+ name: "Number",
840
+ type: "regex",
841
+ regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
842
+ message: "Must be a number<!-- data-validator-number-message to override -->"
843
+ },
844
+ integer: {
845
+ name: "Integer",
846
+ type: "regex",
847
+ regex: "[+-]?\\\d+",
848
+ message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
849
+ },
850
+ positivenumber: {
851
+ name: "Positivenumber",
852
+ type: "min",
853
+ min: 0,
854
+ message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
855
+ },
856
+ negativenumber: {
857
+ name: "Negativenumber",
858
+ type: "max",
859
+ max: 0,
860
+ message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
861
+ },
862
+ required: {
863
+ name: "Required",
864
+ type: "required",
865
+ message: "This is required<!-- data-validator-required-message to override -->"
866
+ },
867
+ checkone: {
868
+ name: "Checkone",
869
+ type: "minchecked",
870
+ minchecked: 1,
871
+ message: "Check at least one option<!-- data-validation-checkone-message to override -->"
872
+ }
873
+ }
874
+ };
875
+
876
+ var formatValidatorName = function(name) {
877
+ return name
878
+ .toLowerCase()
879
+ .replace(
880
+ /(^|\s)([a-z])/g,
881
+ function(m, p1, p2) {
882
+ return p1 + p2.toUpperCase();
883
+ }
884
+ );
885
+ };
886
+
887
+ var getValue = function($this) {
888
+ // Extract the value we're talking about
889
+ var value = $this.val();
890
+ var type = $this.attr("type");
891
+ if (type === "checkbox") {
892
+ value = ($this.is(":checked") ? value : "");
893
+ }
894
+ if (type === "radio") {
895
+ value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
896
+ }
897
+ return value;
898
+ };
899
+
900
+ function regexFromString(inputstring) {
901
+ return new RegExp("^" + inputstring + "$");
902
+ }
903
+
904
+ /**
905
+ * Thanks to Jason Bunting via StackOverflow.com
906
+ *
907
+ * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
908
+ * Short link: http://tinyurl.com/executeFunctionByName
909
+ **/
910
+ function executeFunctionByName(functionName, context /*, args*/ ) {
911
+ var args = Array.prototype.slice.call(arguments).splice(2);
912
+ var namespaces = functionName.split(".");
913
+ var func = namespaces.pop();
914
+ for (var i = 0; i < namespaces.length; i++) {
915
+ context = context[namespaces[i]];
916
+ }
917
+ return context[func].apply(this, args);
918
+ }
919
+
920
+ $.fn.jqBootstrapValidation = function(method) {
921
+
922
+ if (defaults.methods[method]) {
923
+ return defaults.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
924
+ } else if (typeof method === 'object' || !method) {
925
+ return defaults.methods.init.apply(this, arguments);
926
+ } else {
927
+ $.error('Method ' + method + ' does not exist on jQuery.jqBootstrapValidation');
928
+ return null;
929
+ }
930
+
931
+ };
932
+
933
+ $.jqBootstrapValidation = function(options) {
934
+ $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this, arguments);
935
+ };
936
+
937
+ })(jQuery);