jz-theme-clean-blog 1.0.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 (75) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +141 -0
  4. data/_includes/footer.html +35 -0
  5. data/_includes/head.html +24 -0
  6. data/_includes/navbar.html +28 -0
  7. data/_includes/scripts.html +84 -0
  8. data/_layouts/default.html +19 -0
  9. data/_layouts/home.html +65 -0
  10. data/_layouts/page.html +34 -0
  11. data/_layouts/post.html +52 -0
  12. data/_sass/styles.scss +2 -0
  13. data/assets/main.scss +5 -0
  14. data/assets/scripts.js +3 -0
  15. data/assets/vendor/bootstrap/css/bootstrap-grid.css +1912 -0
  16. data/assets/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
  17. data/assets/vendor/bootstrap/css/bootstrap-reboot.css +330 -0
  18. data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css +8 -0
  19. data/assets/vendor/bootstrap/css/bootstrap.css +8981 -0
  20. data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
  21. data/assets/vendor/bootstrap/js/bootstrap.bundle.js +6444 -0
  22. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  23. data/assets/vendor/bootstrap/js/bootstrap.js +3927 -0
  24. data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
  25. data/assets/vendor/font-awesome/css/font-awesome.css +2337 -0
  26. data/assets/vendor/font-awesome/css/font-awesome.min.css +4 -0
  27. data/assets/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  28. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  29. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  30. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  31. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  32. data/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  33. data/assets/vendor/font-awesome/less/animated.less +34 -0
  34. data/assets/vendor/font-awesome/less/bordered-pulled.less +25 -0
  35. data/assets/vendor/font-awesome/less/core.less +12 -0
  36. data/assets/vendor/font-awesome/less/fixed-width.less +6 -0
  37. data/assets/vendor/font-awesome/less/font-awesome.less +18 -0
  38. data/assets/vendor/font-awesome/less/icons.less +789 -0
  39. data/assets/vendor/font-awesome/less/larger.less +13 -0
  40. data/assets/vendor/font-awesome/less/list.less +19 -0
  41. data/assets/vendor/font-awesome/less/mixins.less +60 -0
  42. data/assets/vendor/font-awesome/less/path.less +15 -0
  43. data/assets/vendor/font-awesome/less/rotated-flipped.less +20 -0
  44. data/assets/vendor/font-awesome/less/screen-reader.less +5 -0
  45. data/assets/vendor/font-awesome/less/stacked.less +20 -0
  46. data/assets/vendor/font-awesome/less/variables.less +800 -0
  47. data/assets/vendor/font-awesome/scss/_animated.scss +34 -0
  48. data/assets/vendor/font-awesome/scss/_bordered-pulled.scss +25 -0
  49. data/assets/vendor/font-awesome/scss/_core.scss +12 -0
  50. data/assets/vendor/font-awesome/scss/_fixed-width.scss +6 -0
  51. data/assets/vendor/font-awesome/scss/_icons.scss +789 -0
  52. data/assets/vendor/font-awesome/scss/_larger.scss +13 -0
  53. data/assets/vendor/font-awesome/scss/_list.scss +19 -0
  54. data/assets/vendor/font-awesome/scss/_mixins.scss +60 -0
  55. data/assets/vendor/font-awesome/scss/_path.scss +15 -0
  56. data/assets/vendor/font-awesome/scss/_rotated-flipped.scss +20 -0
  57. data/assets/vendor/font-awesome/scss/_screen-reader.scss +5 -0
  58. data/assets/vendor/font-awesome/scss/_stacked.scss +20 -0
  59. data/assets/vendor/font-awesome/scss/_variables.scss +800 -0
  60. data/assets/vendor/font-awesome/scss/font-awesome.scss +18 -0
  61. data/assets/vendor/jquery/jquery.js +10364 -0
  62. data/assets/vendor/jquery/jquery.min.js +2 -0
  63. data/assets/vendor/startbootstrap-clean-blog/js/clean-blog.min.js +1 -0
  64. data/assets/vendor/startbootstrap-clean-blog/js/jqBootstrapValidation.js +937 -0
  65. data/assets/vendor/startbootstrap-clean-blog/scss/_bootstrap-overrides.scss +27 -0
  66. data/assets/vendor/startbootstrap-clean-blog/scss/_contact.scss +60 -0
  67. data/assets/vendor/startbootstrap-clean-blog/scss/_footer.scss +13 -0
  68. data/assets/vendor/startbootstrap-clean-blog/scss/_global.scss +77 -0
  69. data/assets/vendor/startbootstrap-clean-blog/scss/_masthead.scss +82 -0
  70. data/assets/vendor/startbootstrap-clean-blog/scss/_mixins.scss +68 -0
  71. data/assets/vendor/startbootstrap-clean-blog/scss/_navbar.scss +100 -0
  72. data/assets/vendor/startbootstrap-clean-blog/scss/_post.scss +42 -0
  73. data/assets/vendor/startbootstrap-clean-blog/scss/_variables.scss +33 -0
  74. data/assets/vendor/startbootstrap-clean-blog/scss/clean-blog.scss +9 -0
  75. metadata +159 -0
@@ -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);