Created
January 26, 2017 22:25
-
-
Save mofizul21/5eea4cd5eb93c13ce9220d39916155f2 to your computer and use it in GitHub Desktop.
PHP Contact Form
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Jquery Validation using jqBootstrapValidation | |
example is taken from jqBootstrapValidation docs | |
*/ | |
$(function() { | |
$("input,textarea").jqBootstrapValidation( | |
{ | |
preventSubmit: true, | |
submitError: function($form, event, errors) { | |
// something to have when submit produces an error ? | |
// Not decided if I need it yet | |
}, | |
submitSuccess: function($form, event) { | |
event.preventDefault(); // prevent default submit behaviour | |
// get values from FORM | |
var name = $("input#name").val(); | |
var email = $("input#email").val(); | |
var message = $("textarea#message").val(); | |
var firstName = name; // For Success/Failure Message | |
// Check for white space in name for Success/Fail message | |
if (firstName.indexOf(' ') >= 0) { | |
firstName = name.split(' ').slice(0, -1).join(' '); | |
} | |
$.ajax({ | |
url: "./bin/contact_me.php", | |
type: "POST", | |
data: {name: name, email: email, message: message}, | |
cache: false, | |
success: function() { | |
// Success message | |
$('#success').html("<div class='alert alert-success'>"); | |
$('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>×") | |
.append( "</button>"); | |
$('#success > .alert-success') | |
.append("<strong>Your message has been sent. </strong>"); | |
$('#success > .alert-success') | |
.append('</div>'); | |
//clear all fields | |
$('#contactForm').trigger("reset"); | |
}, | |
error: function() { | |
// Fail message | |
$('#success').html("<div class='alert alert-danger'>"); | |
$('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>×") | |
.append( "</button>"); | |
$('#success > .alert-danger').append("<strong>Sorry "+firstName+" it seems that my mail server is not responding...</strong> Could you please email me directly to <a href='mailto:mofizul21@gmail.com?Subject=Message_Me from themepack.net'>mofizul21@gmail.com</a> ? Sorry for the inconvenience!"); | |
$('#success > .alert-danger').append('</div>'); | |
//clear all fields | |
$('#contactForm').trigger("reset"); | |
}, | |
}) | |
}, | |
filter: function() { | |
return $(this).is(":visible"); | |
}, | |
}); | |
$("a[data-toggle=\"tab\"]").click(function(e) { | |
e.preventDefault(); | |
$(this).tab("show"); | |
}); | |
}); | |
/*When clicking on Full hide fail/success boxes */ | |
$('#name').focus(function() { | |
$('#success').html(''); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// check if fields passed are empty | |
if(empty($_POST['name']) || | |
empty($_POST['email']) || | |
empty($_POST['message']) || | |
!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)) | |
{ | |
echo "No arguments Provided!"; | |
return false; | |
} | |
$name = $_POST['name']; | |
$email_address = $_POST['email']; | |
$message = $_POST['message']; | |
// create email body and send it | |
$to = 'mofizul21@gmail.com'; // put your email | |
$email_subject = "Contact form submitted by: $name"; | |
$email_body = "You have received a new message. \n\n". | |
" Here are the details:\n \nName: $name \n ". | |
"Email: $email_address\n Message \n $message"; | |
$headers = "From: mofizul21@gmail.com\n"; | |
$headers .= "Reply-To: $email_address"; | |
mail($to,$email_subject,$email_body,$headers); | |
return true; | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="eng"> | |
<head> | |
<title>Contact form for your site by Anatoly Spektor</title> | |
<!-- Bootstrap CSS --> | |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"> | |
</head> | |
<body> | |
<br /> | |
<!-- a row has to be in a container --> | |
<div class="container"> | |
<!-- Contacts --> | |
<div id="contacts"> | |
<div class="row"> | |
<!-- Alignment --> | |
<div class="col-lg-8 col-lg-offset-2"> | |
<!-- Form itself --> | |
<form name="sentMessage" id="contactForm" novalidate> | |
<legend class="text-center">Send a message</legend> | |
<div class="row control-group"> | |
<div class="form-group col-xs-12 floating-label-form-group controls"> | |
<label>Name</label> | |
<input type="text" class="form-control" placeholder="Name" id="name" required data-validation-required-message="Please enter your name."> | |
<p class="help-block text-danger"></p> | |
</div> | |
</div> | |
<div class="row control-group"> | |
<div class="form-group col-xs-12 floating-label-form-group controls"> | |
<label>Email Address</label> | |
<input type="email" class="form-control" placeholder="Email Address" id="email" required data-validation-required-message="Please enter your email address."> | |
<p class="help-block text-danger"></p> | |
</div> | |
</div> | |
<div class="row control-group"> | |
<div class="form-group col-xs-12 floating-label-form-group controls"> | |
<label>Message</label> | |
<textarea rows="5" class="form-control" placeholder="Message" id="message" required data-validation-required-message="Please enter a message."></textarea> | |
<p class="help-block text-danger"></p> | |
</div> | |
</div> | |
<div id="success"> </div> <!-- For success/fail messages --> | |
<button type="submit" class="btn btn-primary pull-right">Send</button><br /> | |
</form> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- JS FILES --> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> | |
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script> | |
<script src="./js/jqBootstrapValidation.js"></script> | |
<script src="./js/contact_me.js"></script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* jqBootstrapValidation | |
* A plugin for automating validation on Twitter Bootstrap formatted forms. | |
* | |
* v1.3.6 | |
* | |
* License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file | |
* | |
* http://ReactiveRaven.github.com/jqBootstrapValidation/ | |
*/ | |
(function( $ ){ | |
var createdElements = []; | |
var defaults = { | |
options: { | |
prependExistingHelpBlock: false, | |
sniffHtml: true, // sniff for 'required', 'maxlength', etc | |
preventSubmit: true, // stop the form submit event from firing if validation fails | |
submitError: false, // function called if there is an error when trying to submit | |
submitSuccess: false, // function called just before a successful submit event is sent to the server | |
semanticallyStrict: false, // set to true to tidy up generated HTML output | |
autoAdd: { | |
helpBlocks: true | |
}, | |
filter: function () { | |
// return $(this).is(":visible"); // only validate elements you can see | |
return true; // validate everything | |
} | |
}, | |
methods: { | |
init : function( options ) { | |
var settings = $.extend(true, {}, defaults); | |
settings.options = $.extend(true, settings.options, options); | |
var $siblingElements = this; | |
var uniqueForms = $.unique( | |
$siblingElements.map( function () { | |
return $(this).parents("form")[0]; | |
}).toArray() | |
); | |
$(uniqueForms).bind("submit", function (e) { | |
var $form = $(this); | |
var warningsFound = 0; | |
var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter); | |
$inputs.trigger("submit.validation").trigger("validationLostFocus.validation"); | |
$inputs.each(function (i, el) { | |
var $this = $(el), | |
$controlGroup = $this.parents(".control-group").first(); | |
if ( | |
$controlGroup.hasClass("warning") | |
) { | |
$controlGroup.removeClass("warning").addClass("error"); | |
warningsFound++; | |
} | |
}); | |
$inputs.trigger("validationLostFocus.validation"); | |
if (warningsFound) { | |
if (settings.options.preventSubmit) { | |
e.preventDefault(); | |
} | |
$form.addClass("error"); | |
if ($.isFunction(settings.options.submitError)) { | |
settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true)); | |
} | |
} else { | |
$form.removeClass("error"); | |
if ($.isFunction(settings.options.submitSuccess)) { | |
settings.options.submitSuccess($form, e); | |
} | |
} | |
}); | |
return this.each(function(){ | |
// Get references to everything we're interested in | |
var $this = $(this), | |
$controlGroup = $this.parents(".control-group").first(), | |
$helpBlock = $controlGroup.find(".help-block").first(), | |
$form = $this.parents("form").first(), | |
validatorNames = []; | |
// create message container if not exists | |
if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) { | |
$helpBlock = $('<div class="help-block" />'); | |
$controlGroup.find('.controls').append($helpBlock); | |
createdElements.push($helpBlock[0]); | |
} | |
// ============================================================= | |
// SNIFF HTML FOR VALIDATORS | |
// ============================================================= | |
// *snort sniff snuffle* | |
if (settings.options.sniffHtml) { | |
var message = ""; | |
// --------------------------------------------------------- | |
// PATTERN | |
// --------------------------------------------------------- | |
if ($this.attr("pattern") !== undefined) { | |
message = "Not in the expected format<!-- data-validation-pattern-message to override -->"; | |
if ($this.data("validationPatternMessage")) { | |
message = $this.data("validationPatternMessage"); | |
} | |
$this.data("validationPatternMessage", message); | |
$this.data("validationPatternRegex", $this.attr("pattern")); | |
} | |
// --------------------------------------------------------- | |
// MAX | |
// --------------------------------------------------------- | |
if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { | |
var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); | |
message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->"; | |
if ($this.data("validationMaxMessage")) { | |
message = $this.data("validationMaxMessage"); | |
} | |
$this.data("validationMaxMessage", message); | |
$this.data("validationMaxMax", max); | |
} | |
// --------------------------------------------------------- | |
// MIN | |
// --------------------------------------------------------- | |
if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { | |
var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); | |
message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->"; | |
if ($this.data("validationMinMessage")) { | |
message = $this.data("validationMinMessage"); | |
} | |
$this.data("validationMinMessage", message); | |
$this.data("validationMinMin", min); | |
} | |
// --------------------------------------------------------- | |
// MAXLENGTH | |
// --------------------------------------------------------- | |
if ($this.attr("maxlength") !== undefined) { | |
message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->"; | |
if ($this.data("validationMaxlengthMessage")) { | |
message = $this.data("validationMaxlengthMessage"); | |
} | |
$this.data("validationMaxlengthMessage", message); | |
$this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); | |
} | |
// --------------------------------------------------------- | |
// MINLENGTH | |
// --------------------------------------------------------- | |
if ($this.attr("minlength") !== undefined) { | |
message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->"; | |
if ($this.data("validationMinlengthMessage")) { | |
message = $this.data("validationMinlengthMessage"); | |
} | |
$this.data("validationMinlengthMessage", message); | |
$this.data("validationMinlengthMinlength", $this.attr("minlength")); | |
} | |
// --------------------------------------------------------- | |
// REQUIRED | |
// --------------------------------------------------------- | |
if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { | |
message = settings.builtInValidators.required.message; | |
if ($this.data("validationRequiredMessage")) { | |
message = $this.data("validationRequiredMessage"); | |
} | |
$this.data("validationRequiredMessage", message); | |
} | |
// --------------------------------------------------------- | |
// NUMBER | |
// --------------------------------------------------------- | |
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") { | |
message = settings.builtInValidators.number.message; | |
if ($this.data("validationNumberMessage")) { | |
message = $this.data("validationNumberMessage"); | |
} | |
$this.data("validationNumberMessage", message); | |
} | |
// --------------------------------------------------------- | |
// --------------------------------------------------------- | |
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") { | |
message = "Not a valid email address<!-- data-validator-validemail-message to override -->"; | |
if ($this.data("validationValidemailMessage")) { | |
message = $this.data("validationValidemailMessage"); | |
} else if ($this.data("validationEmailMessage")) { | |
message = $this.data("validationEmailMessage"); | |
} | |
$this.data("validationValidemailMessage", message); | |
} | |
// --------------------------------------------------------- | |
// MINCHECKED | |
// --------------------------------------------------------- | |
if ($this.attr("minchecked") !== undefined) { | |
message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->"; | |
if ($this.data("validationMincheckedMessage")) { | |
message = $this.data("validationMincheckedMessage"); | |
} | |
$this.data("validationMincheckedMessage", message); | |
$this.data("validationMincheckedMinchecked", $this.attr("minchecked")); | |
} | |
// --------------------------------------------------------- | |
// MAXCHECKED | |
// --------------------------------------------------------- | |
if ($this.attr("maxchecked") !== undefined) { | |
message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->"; | |
if ($this.data("validationMaxcheckedMessage")) { | |
message = $this.data("validationMaxcheckedMessage"); | |
} | |
$this.data("validationMaxcheckedMessage", message); | |
$this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked")); | |
} | |
} | |
// ============================================================= | |
// COLLECT VALIDATOR NAMES | |
// ============================================================= | |
// Get named validators | |
if ($this.data("validation") !== undefined) { | |
validatorNames = $this.data("validation").split(","); | |
} | |
// Get extra ones defined on the element's data attributes | |
$.each($this.data(), function (i, el) { | |
var parts = i.replace(/([A-Z])/g, ",$1").split(","); | |
if (parts[0] === "validation" && parts[1]) { | |
validatorNames.push(parts[1]); | |
} | |
}); | |
// ============================================================= | |
// NORMALISE VALIDATOR NAMES | |
// ============================================================= | |
var validatorNamesToInspect = validatorNames; | |
var newValidatorNamesToInspect = []; | |
do // repeatedly expand 'shortcut' validators into their real validators | |
{ | |
// Uppercase only the first letter of each name | |
$.each(validatorNames, function (i, el) { | |
validatorNames[i] = formatValidatorName(el); | |
}); | |
// Remove duplicate validator names | |
validatorNames = $.unique(validatorNames); | |
// Pull out the new validator names from each shortcut | |
newValidatorNamesToInspect = []; | |
$.each(validatorNamesToInspect, function(i, el) { | |
if ($this.data("validation" + el + "Shortcut") !== undefined) { | |
// Are these custom validators? | |
// Pull them out! | |
$.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) { | |
newValidatorNamesToInspect.push(el2); | |
}); | |
} else if (settings.builtInValidators[el.toLowerCase()]) { | |
// Is this a recognised built-in? | |
// Pull it out! | |
var validator = settings.builtInValidators[el.toLowerCase()]; | |
if (validator.type.toLowerCase() === "shortcut") { | |
$.each(validator.shortcut.split(","), function (i, el) { | |
el = formatValidatorName(el); | |
newValidatorNamesToInspect.push(el); | |
validatorNames.push(el); | |
}); | |
} | |
} | |
}); | |
validatorNamesToInspect = newValidatorNamesToInspect; | |
} while (validatorNamesToInspect.length > 0) | |
// ============================================================= | |
// SET UP VALIDATOR ARRAYS | |
// ============================================================= | |
var validators = {}; | |
$.each(validatorNames, function (i, el) { | |
// Set up the 'override' message | |
var message = $this.data("validation" + el + "Message"); | |
var hasOverrideMessage = (message !== undefined); | |
var foundValidator = false; | |
message = | |
( | |
message | |
? message | |
: "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->" | |
) | |
; | |
$.each( | |
settings.validatorTypes, | |
function (validatorType, validatorTemplate) { | |
if (validators[validatorType] === undefined) { | |
validators[validatorType] = []; | |
} | |
if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) { | |
validators[validatorType].push( | |
$.extend( | |
true, | |
{ | |
name: formatValidatorName(validatorTemplate.name), | |
message: message | |
}, | |
validatorTemplate.init($this, el) | |
) | |
); | |
foundValidator = true; | |
} | |
} | |
); | |
if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) { | |
var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]); | |
if (hasOverrideMessage) { | |
validator.message = message; | |
} | |
var validatorType = validator.type.toLowerCase(); | |
if (validatorType === "shortcut") { | |
foundValidator = true; | |
} else { | |
$.each( | |
settings.validatorTypes, | |
function (validatorTemplateType, validatorTemplate) { | |
if (validators[validatorTemplateType] === undefined) { | |
validators[validatorTemplateType] = []; | |
} | |
if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) { | |
$this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]); | |
validators[validatorType].push( | |
$.extend( | |
validator, | |
validatorTemplate.init($this, el) | |
) | |
); | |
foundValidator = true; | |
} | |
} | |
); | |
} | |
} | |
if (! foundValidator) { | |
$.error("Cannot find validation info for '" + el + "'"); | |
} | |
}); | |
// ============================================================= | |
// STORE FALLBACK VALUES | |
// ============================================================= | |
$helpBlock.data( | |
"original-contents", | |
( | |
$helpBlock.data("original-contents") | |
? $helpBlock.data("original-contents") | |
: $helpBlock.html() | |
) | |
); | |
$helpBlock.data( | |
"original-role", | |
( | |
$helpBlock.data("original-role") | |
? $helpBlock.data("original-role") | |
: $helpBlock.attr("role") | |
) | |
); | |
$controlGroup.data( | |
"original-classes", | |
( | |
$controlGroup.data("original-clases") | |
? $controlGroup.data("original-classes") | |
: $controlGroup.attr("class") | |
) | |
); | |
$this.data( | |
"original-aria-invalid", | |
( | |
$this.data("original-aria-invalid") | |
? $this.data("original-aria-invalid") | |
: $this.attr("aria-invalid") | |
) | |
); | |
// ============================================================= | |
// VALIDATION | |
// ============================================================= | |
$this.bind( | |
"validation.validation", | |
function (event, params) { | |
var value = getValue($this); | |
// Get a list of the errors to apply | |
var errorsFound = []; | |
$.each(validators, function (validatorType, validatorTypeArray) { | |
if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) { | |
$.each(validatorTypeArray, function (i, validator) { | |
if (settings.validatorTypes[validatorType].validate($this, value, validator)) { | |
errorsFound.push(validator.message); | |
} | |
}); | |
} | |
}); | |
return errorsFound; | |
} | |
); | |
$this.bind( | |
"getValidators.validation", | |
function () { | |
return validators; | |
} | |
); | |
// ============================================================= | |
// WATCH FOR CHANGES | |
// ============================================================= | |
$this.bind( | |
"submit.validation", | |
function () { | |
return $this.triggerHandler("change.validation", {submitting: true}); | |
} | |
); | |
$this.bind( | |
[ | |
"keyup", | |
"focus", | |
"blur", | |
"click", | |
"keydown", | |
"keypress", | |
"change" | |
].join(".validation ") + ".validation", | |
function (e, params) { | |
var value = getValue($this); | |
var errorsFound = []; | |
$controlGroup.find("input,textarea,select").each(function (i, el) { | |
var oldCount = errorsFound.length; | |
$.each($(el).triggerHandler("validation.validation", params), function (j, message) { | |
errorsFound.push(message); | |
}); | |
if (errorsFound.length > oldCount) { | |
$(el).attr("aria-invalid", "true"); | |
} else { | |
var original = $this.data("original-aria-invalid"); | |
$(el).attr("aria-invalid", (original !== undefined ? original : false)); | |
} | |
}); | |
$form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation"); | |
errorsFound = $.unique(errorsFound.sort()); | |
// Were there any errors? | |
if (errorsFound.length) { | |
// Better flag it up as a warning. | |
$controlGroup.removeClass("success error").addClass("warning"); | |
// How many errors did we find? | |
if (settings.options.semanticallyStrict && errorsFound.length === 1) { | |
// Only one? Being strict? Just output it. | |
$helpBlock.html(errorsFound[0] + | |
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); | |
} else { | |
// Multiple? Being sloppy? Glue them together into an UL. | |
$helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" + | |
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); | |
} | |
} else { | |
$controlGroup.removeClass("warning error success"); | |
if (value.length > 0) { | |
$controlGroup.addClass("success"); | |
} | |
$helpBlock.html($helpBlock.data("original-contents")); | |
} | |
if (e.type === "blur") { | |
$controlGroup.removeClass("success"); | |
} | |
} | |
); | |
$this.bind("validationLostFocus.validation", function () { | |
$controlGroup.removeClass("success"); | |
}); | |
}); | |
}, | |
destroy : function( ) { | |
return this.each( | |
function() { | |
var | |
$this = $(this), | |
$controlGroup = $this.parents(".control-group").first(), | |
$helpBlock = $controlGroup.find(".help-block").first(); | |
// remove our events | |
$this.unbind('.validation'); // events are namespaced. | |
// reset help text | |
$helpBlock.html($helpBlock.data("original-contents")); | |
// reset classes | |
$controlGroup.attr("class", $controlGroup.data("original-classes")); | |
// reset aria | |
$this.attr("aria-invalid", $this.data("original-aria-invalid")); | |
// reset role | |
$helpBlock.attr("role", $this.data("original-role")); | |
// remove all elements we created | |
if (createdElements.indexOf($helpBlock[0]) > -1) { | |
$helpBlock.remove(); | |
} | |
} | |
); | |
}, | |
collectErrors : function(includeEmpty) { | |
var errorMessages = {}; | |
this.each(function (i, el) { | |
var $el = $(el); | |
var name = $el.attr("name"); | |
var errors = $el.triggerHandler("validation.validation", {includeEmpty: true}); | |
errorMessages[name] = $.extend(true, errors, errorMessages[name]); | |
}); | |
$.each(errorMessages, function (i, el) { | |
if (el.length === 0) { | |
delete errorMessages[i]; | |
} | |
}); | |
return errorMessages; | |
}, | |
hasErrors: function() { | |
var errorMessages = []; | |
this.each(function (i, el) { | |
errorMessages = errorMessages.concat( | |
$(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : [] | |
); | |
}); | |
return (errorMessages.length > 0); | |
}, | |
override : function (newDefaults) { | |
defaults = $.extend(true, defaults, newDefaults); | |
} | |
}, | |
validatorTypes: { | |
callback: { | |
name: "callback", | |
init: function ($this, name) { | |
return { | |
validatorName: name, | |
callback: $this.data("validation" + name + "Callback"), | |
lastValue: $this.val(), | |
lastValid: true, | |
lastFinished: true | |
}; | |
}, | |
validate: function ($this, value, validator) { | |
if (validator.lastValue === value && validator.lastFinished) { | |
return !validator.lastValid; | |
} | |
if (validator.lastFinished === true) | |
{ | |
validator.lastValue = value; | |
validator.lastValid = true; | |
validator.lastFinished = false; | |
var rrjqbvValidator = validator; | |
var rrjqbvThis = $this; | |
executeFunctionByName( | |
validator.callback, | |
window, | |
$this, | |
value, | |
function (data) { | |
if (rrjqbvValidator.lastValue === data.value) { | |
rrjqbvValidator.lastValid = data.valid; | |
if (data.message) { | |
rrjqbvValidator.message = data.message; | |
} | |
rrjqbvValidator.lastFinished = true; | |
rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message); | |
// Timeout is set to avoid problems with the events being considered 'already fired' | |
setTimeout(function () { | |
rrjqbvThis.trigger("change.validation"); | |
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst | |
} | |
} | |
); | |
} | |
return false; | |
} | |
}, | |
ajax: { | |
name: "ajax", | |
init: function ($this, name) { | |
return { | |
validatorName: name, | |
url: $this.data("validation" + name + "Ajax"), | |
lastValue: $this.val(), | |
lastValid: true, | |
lastFinished: true | |
}; | |
}, | |
validate: function ($this, value, validator) { | |
if (""+validator.lastValue === ""+value && validator.lastFinished === true) { | |
return validator.lastValid === false; | |
} | |
if (validator.lastFinished === true) | |
{ | |
validator.lastValue = value; | |
validator.lastValid = true; | |
validator.lastFinished = false; | |
$.ajax({ | |
url: validator.url, | |
data: "value=" + value + "&field=" + $this.attr("name"), | |
dataType: "json", | |
success: function (data) { | |
if (""+validator.lastValue === ""+data.value) { | |
validator.lastValid = !!(data.valid); | |
if (data.message) { | |
validator.message = data.message; | |
} | |
validator.lastFinished = true; | |
$this.data("validation" + validator.validatorName + "Message", validator.message); | |
// Timeout is set to avoid problems with the events being considered 'already fired' | |
setTimeout(function () { | |
$this.trigger("change.validation"); | |
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst | |
} | |
}, | |
failure: function () { | |
validator.lastValid = true; | |
validator.message = "ajax call failed"; | |
validator.lastFinished = true; | |
$this.data("validation" + validator.validatorName + "Message", validator.message); | |
// Timeout is set to avoid problems with the events being considered 'already fired' | |
setTimeout(function () { | |
$this.trigger("change.validation"); | |
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst | |
} | |
}); | |
} | |
return false; | |
} | |
}, | |
regex: { | |
name: "regex", | |
init: function ($this, name) { | |
return {regex: regexFromString($this.data("validation" + name + "Regex"))}; | |
}, | |
validate: function ($this, value, validator) { | |
return (!validator.regex.test(value) && ! validator.negative) | |
|| (validator.regex.test(value) && validator.negative); | |
} | |
}, | |
required: { | |
name: "required", | |
init: function ($this, name) { | |
return {}; | |
}, | |
validate: function ($this, value, validator) { | |
return !!(value.length === 0 && ! validator.negative) | |
|| !!(value.length > 0 && validator.negative); | |
}, | |
blockSubmit: true | |
}, | |
match: { | |
name: "match", | |
init: function ($this, name) { | |
var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first(); | |
element.bind("validation.validation", function () { | |
$this.trigger("change.validation", {submitting: true}); | |
}); | |
return {"element": element}; | |
}, | |
validate: function ($this, value, validator) { | |
return (value !== validator.element.val() && ! validator.negative) | |
|| (value === validator.element.val() && validator.negative); | |
}, | |
blockSubmit: true | |
}, | |
max: { | |
name: "max", | |
init: function ($this, name) { | |
return {max: $this.data("validation" + name + "Max")}; | |
}, | |
validate: function ($this, value, validator) { | |
return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative) | |
|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative); | |
} | |
}, | |
min: { | |
name: "min", | |
init: function ($this, name) { | |
return {min: $this.data("validation" + name + "Min")}; | |
}, | |
validate: function ($this, value, validator) { | |
return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative) | |
|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative); | |
} | |
}, | |
maxlength: { | |
name: "maxlength", | |
init: function ($this, name) { | |
return {maxlength: $this.data("validation" + name + "Maxlength")}; | |
}, | |
validate: function ($this, value, validator) { | |
return ((value.length > validator.maxlength) && ! validator.negative) | |
|| ((value.length <= validator.maxlength) && validator.negative); | |
} | |
}, | |
minlength: { | |
name: "minlength", | |
init: function ($this, name) { | |
return {minlength: $this.data("validation" + name + "Minlength")}; | |
}, | |
validate: function ($this, value, validator) { | |
return ((value.length < validator.minlength) && ! validator.negative) | |
|| ((value.length >= validator.minlength) && validator.negative); | |
} | |
}, | |
maxchecked: { | |
name: "maxchecked", | |
init: function ($this, name) { | |
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); | |
elements.bind("click.validation", function () { | |
$this.trigger("change.validation", {includeEmpty: true}); | |
}); | |
return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements}; | |
}, | |
validate: function ($this, value, validator) { | |
return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative) | |
|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative); | |
}, | |
blockSubmit: true | |
}, | |
minchecked: { | |
name: "minchecked", | |
init: function ($this, name) { | |
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); | |
elements.bind("click.validation", function () { | |
$this.trigger("change.validation", {includeEmpty: true}); | |
}); | |
return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements}; | |
}, | |
validate: function ($this, value, validator) { | |
return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative) | |
|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative); | |
}, | |
blockSubmit: true | |
} | |
}, | |
builtInValidators: { | |
email: { | |
name: "Email", | |
type: "shortcut", | |
shortcut: "validemail" | |
}, | |
validemail: { | |
name: "Validemail", | |
type: "regex", | |
regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}", | |
message: "Not a valid email address<!-- data-validator-validemail-message to override -->" | |
}, | |
passwordagain: { | |
name: "Passwordagain", | |
type: "match", | |
match: "password", | |
message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->" | |
}, | |
positive: { | |
name: "Positive", | |
type: "shortcut", | |
shortcut: "number,positivenumber" | |
}, | |
negative: { | |
name: "Negative", | |
type: "shortcut", | |
shortcut: "number,negativenumber" | |
}, | |
number: { | |
name: "Number", | |
type: "regex", | |
regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?", | |
message: "Must be a number<!-- data-validator-number-message to override -->" | |
}, | |
integer: { | |
name: "Integer", | |
type: "regex", | |
regex: "[+-]?\\\d+", | |
message: "No decimal places allowed<!-- data-validator-integer-message to override -->" | |
}, | |
positivenumber: { | |
name: "Positivenumber", | |
type: "min", | |
min: 0, | |
message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->" | |
}, | |
negativenumber: { | |
name: "Negativenumber", | |
type: "max", | |
max: 0, | |
message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->" | |
}, | |
required: { | |
name: "Required", | |
type: "required", | |
message: "This is required<!-- data-validator-required-message to override -->" | |
}, | |
checkone: { | |
name: "Checkone", | |
type: "minchecked", | |
minchecked: 1, | |
message: "Check at least one option<!-- data-validation-checkone-message to override -->" | |
} | |
} | |
}; | |
var formatValidatorName = function (name) { | |
return name | |
.toLowerCase() | |
.replace( | |
/(^|\s)([a-z])/g , | |
function(m,p1,p2) { | |
return p1+p2.toUpperCase(); | |
} | |
) | |
; | |
}; | |
var getValue = function ($this) { | |
// Extract the value we're talking about | |
var value = $this.val(); | |
var type = $this.attr("type"); | |
if (type === "checkbox") { | |
value = ($this.is(":checked") ? value : ""); | |
} | |
if (type === "radio") { | |
value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : ""); | |
} | |
return value; | |
}; | |
function regexFromString(inputstring) { | |
return new RegExp("^" + inputstring + "$"); | |
} | |
/** | |
* Thanks to Jason Bunting via StackOverflow.com | |
* | |
* http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910 | |
* Short link: http://tinyurl.com/executeFunctionByName | |
**/ | |
function executeFunctionByName(functionName, context /*, args*/) { | |
var args = Array.prototype.slice.call(arguments).splice(2); | |
var namespaces = functionName.split("."); | |
var func = namespaces.pop(); | |
for(var i = 0; i < namespaces.length; i++) { | |
context = context[namespaces[i]]; | |
} | |
return context[func].apply(this, args); | |
} | |
$.fn.jqBootstrapValidation = function( method ) { | |
if ( defaults.methods[method] ) { | |
return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); | |
} else if ( typeof method === 'object' || ! method ) { | |
return defaults.methods.init.apply( this, arguments ); | |
} else { | |
$.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' ); | |
return null; | |
} | |
}; | |
$.jqBootstrapValidation = function (options) { | |
$(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments); | |
}; | |
})( jQuery ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment