mirror of
https://github.com/silverstripe/silverstripe-comments
synced 2024-10-22 11:05:49 +02:00
Merge pull request #115 from tractorcow/pulls/2.0/nested-comments
API Nested comments feature (final)
This commit is contained in:
commit
614da962ce
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.sass-cache
|
@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
Deprecation::notification_version('2.0', 'comments');
|
Deprecation::notification_version('2.0', 'comments');
|
||||||
|
|
||||||
define('COMMENTS_DIR', ltrim(Director::makeRelative(realpath(__DIR__)), DIRECTORY_SEPARATOR));
|
define('COMMENTS_DIR', basename(__DIR__));
|
||||||
|
define('COMMENTS_THIRDPARTY', COMMENTS_DIR . DIRECTORY_SEPARATOR . 'thirdparty');
|
||||||
|
@ -13,10 +13,27 @@ class CommentingController extends Controller {
|
|||||||
'approve',
|
'approve',
|
||||||
'rss',
|
'rss',
|
||||||
'CommentsForm',
|
'CommentsForm',
|
||||||
|
'reply',
|
||||||
'doPostComment',
|
'doPostComment',
|
||||||
'doPreviewComment'
|
'doPreviewComment'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
private static $url_handlers = array(
|
||||||
|
'reply/$ParentCommentID//$ID/$OtherID' => 'reply',
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fields required for this form
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @config
|
||||||
|
*/
|
||||||
|
private static $required_fields = array(
|
||||||
|
'Name',
|
||||||
|
'Email',
|
||||||
|
'Comment'
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class this commenting form is for
|
* Base class this commenting form is for
|
||||||
*
|
*
|
||||||
@ -289,6 +306,47 @@ class CommentingController extends Controller {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a reply form for a specified comment
|
||||||
|
*
|
||||||
|
* @param Comment $comment
|
||||||
|
*/
|
||||||
|
public function ReplyForm($comment) {
|
||||||
|
// Enables multiple forms with different names to use the same handler
|
||||||
|
$form = $this->CommentsForm();
|
||||||
|
$form->setName('ReplyForm_'.$comment->ID);
|
||||||
|
$form->addExtraClass('reply-form');
|
||||||
|
|
||||||
|
// Load parent into reply form
|
||||||
|
$form->loadDataFrom(array(
|
||||||
|
'ParentCommentID' => $comment->ID
|
||||||
|
));
|
||||||
|
|
||||||
|
// Customise action
|
||||||
|
$form->setFormAction($this->Link('reply', $comment->ID));
|
||||||
|
|
||||||
|
$this->extend('updateReplyForm', $form);
|
||||||
|
return $form;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request handler for reply form.
|
||||||
|
* This method will disambiguate multiple reply forms in the same method
|
||||||
|
*
|
||||||
|
* @param SS_HTTPRequest $request
|
||||||
|
*/
|
||||||
|
public function reply(SS_HTTPRequest $request) {
|
||||||
|
// Extract parent comment from reply and build this way
|
||||||
|
if($parentID = $request->param('ParentCommentID')) {
|
||||||
|
$comment = DataObject::get_by_id('Comment', $parentID, true);
|
||||||
|
if($comment) {
|
||||||
|
return $this->ReplyForm($comment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->httpError(404);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Post a comment form
|
* Post a comment form
|
||||||
*
|
*
|
||||||
@ -297,26 +355,42 @@ class CommentingController extends Controller {
|
|||||||
public function CommentsForm() {
|
public function CommentsForm() {
|
||||||
$usePreview = $this->getOption('use_preview');
|
$usePreview = $this->getOption('use_preview');
|
||||||
|
|
||||||
|
$nameRequired = _t('CommentInterface.YOURNAME_MESSAGE_REQUIRED', 'Please enter your name');
|
||||||
|
$emailRequired = _t('CommentInterface.EMAILADDRESS_MESSAGE_REQUIRED', 'Please enter your email address');
|
||||||
|
$emailInvalid = _t('CommentInterface.EMAILADDRESS_MESSAGE_EMAIL', 'Please enter a valid email address');
|
||||||
|
$urlInvalid = _t('CommentInterface.COMMENT_MESSAGE_URL', 'Please enter a valid URL');
|
||||||
|
$commentRequired = _t('CommentInterface.COMMENT_MESSAGE_REQUIRED', 'Please enter your comment');
|
||||||
|
|
||||||
$fields = new FieldList(
|
$fields = new FieldList(
|
||||||
$dataFields = new CompositeField(
|
$dataFields = new CompositeField(
|
||||||
TextField::create("Name", _t('CommentInterface.YOURNAME', 'Your name'))
|
// Name
|
||||||
->setCustomValidationMessage(_t('CommentInterface.YOURNAME_MESSAGE_REQUIRED', 'Please enter your name'))
|
TextField::create("Name", _t('CommentInterface.YOURNAME', 'Your name'))
|
||||||
->setAttribute('data-message-required', _t('CommentInterface.YOURNAME_MESSAGE_REQUIRED', 'Please enter your name')),
|
->setCustomValidationMessage($nameRequired)
|
||||||
|
->setAttribute('data-msg-required', $nameRequired),
|
||||||
|
|
||||||
EmailField::create("Email", _t('CommentingController.EMAILADDRESS', "Your email address (will not be published)"))
|
// Email
|
||||||
->setCustomValidationMessage(_t('CommentInterface.EMAILADDRESS_MESSAGE_REQUIRED', 'Please enter your email address'))
|
EmailField::create(
|
||||||
->setAttribute('data-message-required', _t('CommentInterface.EMAILADDRESS_MESSAGE_REQUIRED', 'Please enter your email address'))
|
"Email",
|
||||||
->setAttribute('data-message-email', _t('CommentInterface.EMAILADDRESS_MESSAGE_EMAIL', 'Please enter a valid email address')),
|
_t('CommentingController.EMAILADDRESS', "Your email address (will not be published)")
|
||||||
|
)
|
||||||
|
->setCustomValidationMessage($emailRequired)
|
||||||
|
->setAttribute('data-msg-required', $emailRequired)
|
||||||
|
->setAttribute('data-msg-email', $emailInvalid)
|
||||||
|
->setAttribute('data-rule-email', true),
|
||||||
|
|
||||||
TextField::create("URL", _t('CommentingController.WEBSITEURL', "Your website URL"))
|
// Url
|
||||||
->setAttribute('data-message-url', _t('CommentInterface.COMMENT_MESSAGE_URL', 'Please enter a valid URL')),
|
TextField::create("URL", _t('CommentingController.WEBSITEURL', "Your website URL"))
|
||||||
|
->setAttribute('data-msg-url', $urlInvalid)
|
||||||
|
->setAttribute('data-rule-url', true),
|
||||||
|
|
||||||
TextareaField::create("Comment", _t('CommentingController.COMMENTS', "Comments"))
|
// Comment
|
||||||
->setCustomValidationMessage(_t('CommentInterface.COMMENT_MESSAGE_REQUIRED', 'Please enter your comment'))
|
TextareaField::create("Comment", _t('CommentingController.COMMENTS', "Comments"))
|
||||||
->setAttribute('data-message-required', _t('CommentInterface.COMMENT_MESSAGE_REQUIRED', 'Please enter your comment'))
|
->setCustomValidationMessage($commentRequired)
|
||||||
|
->setAttribute('data-msg-required', $commentRequired)
|
||||||
),
|
),
|
||||||
HiddenField::create("ParentID"),
|
HiddenField::create("ParentID"),
|
||||||
HiddenField::create("ReturnURL"),
|
HiddenField::create("ReturnURL"),
|
||||||
|
HiddenField::create("ParentCommentID"),
|
||||||
HiddenField::create("BaseClass")
|
HiddenField::create("BaseClass")
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -345,11 +419,7 @@ class CommentingController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// required fields for server side
|
// required fields for server side
|
||||||
$required = new RequiredFields(array(
|
$required = new RequiredFields($this->config()->required_fields);
|
||||||
'Name',
|
|
||||||
'Email',
|
|
||||||
'Comment'
|
|
||||||
));
|
|
||||||
|
|
||||||
// create the comment form
|
// create the comment form
|
||||||
$form = new Form($this, 'CommentsForm', $fields, $actions, $required);
|
$form = new Form($this, 'CommentsForm', $fields, $actions, $required);
|
||||||
@ -397,8 +467,8 @@ class CommentingController extends Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($member) {
|
if(!empty($member)) {
|
||||||
$form->loadDataFrom($member);
|
$form->loadDataFrom($member);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hook to allow further extensions to alter the comments form
|
// hook to allow further extensions to alter the comments form
|
||||||
|
@ -19,6 +19,8 @@ class CommentsExtension extends DataExtension {
|
|||||||
* gravatar_default: Theme for 'not found' gravatar {@see http://gravatar.com/site/implement/images}
|
* gravatar_default: Theme for 'not found' gravatar {@see http://gravatar.com/site/implement/images}
|
||||||
* gravatar_rating: Gravatar rating (same as the standard default)
|
* gravatar_rating: Gravatar rating (same as the standard default)
|
||||||
* show_comments_when_disabled: Show older comments when commenting has been disabled.
|
* show_comments_when_disabled: Show older comments when commenting has been disabled.
|
||||||
|
* order_comments_by: Default sort order.
|
||||||
|
* order_replies_by: Sort order for replies.
|
||||||
* comments_holder_id: ID for the comments holder
|
* comments_holder_id: ID for the comments holder
|
||||||
* comment_permalink_prefix: ID prefix for each comment
|
* comment_permalink_prefix: ID prefix for each comment
|
||||||
* require_moderation: Require moderation for all comments
|
* require_moderation: Require moderation for all comments
|
||||||
@ -27,6 +29,8 @@ class CommentsExtension extends DataExtension {
|
|||||||
* frontend_spam: Display spam comments in the frontend, if the user can moderate them.
|
* frontend_spam: Display spam comments in the frontend, if the user can moderate them.
|
||||||
* html_allowed: Allow for sanitized HTML in comments
|
* html_allowed: Allow for sanitized HTML in comments
|
||||||
* use_preview: Preview formatted comment (when allowing HTML)
|
* use_preview: Preview formatted comment (when allowing HTML)
|
||||||
|
* nested_comments: Enable nested comments
|
||||||
|
* nested_depth: Max depth of nested comments in levels (where root is 1 depth) 0 means no limit.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*
|
*
|
||||||
@ -45,6 +49,7 @@ class CommentsExtension extends DataExtension {
|
|||||||
'gravatar_rating' => 'g',
|
'gravatar_rating' => 'g',
|
||||||
'show_comments_when_disabled' => false,
|
'show_comments_when_disabled' => false,
|
||||||
'order_comments_by' => '"Created" DESC',
|
'order_comments_by' => '"Created" DESC',
|
||||||
|
'order_replies_by' => false,
|
||||||
'comments_per_page' => 10,
|
'comments_per_page' => 10,
|
||||||
'comments_holder_id' => 'comments-holder',
|
'comments_holder_id' => 'comments-holder',
|
||||||
'comment_permalink_prefix' => 'comment-',
|
'comment_permalink_prefix' => 'comment-',
|
||||||
@ -56,6 +61,8 @@ class CommentsExtension extends DataExtension {
|
|||||||
'html_allowed' => false,
|
'html_allowed' => false,
|
||||||
'html_allowed_elements' => array('a', 'img', 'i', 'b'),
|
'html_allowed_elements' => array('a', 'img', 'i', 'b'),
|
||||||
'use_preview' => false,
|
'use_preview' => false,
|
||||||
|
'nested_comments' => false,
|
||||||
|
'nested_depth' => 2,
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -141,24 +148,6 @@ class CommentsExtension extends DataExtension {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the RelationList of all comments against this object. Can be used as a data source
|
|
||||||
* for a gridfield with write access.
|
|
||||||
*
|
|
||||||
* @return CommentList
|
|
||||||
*/
|
|
||||||
public function AllComments() {
|
|
||||||
$comments = CommentList::create($this->ownerBaseClass)->forForeignID($this->owner->ID);
|
|
||||||
$this->owner->extend('updateAllComments', $comments);
|
|
||||||
return $comments;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getComments() {
|
|
||||||
// TODO: find out why this is being triggered when combined with blog
|
|
||||||
// Deprecation::notice('2.0', 'Use PagedComments to get paged comments');
|
|
||||||
return $this->PagedComments();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get comment moderation rules for this parent
|
* Get comment moderation rules for this parent
|
||||||
*
|
*
|
||||||
@ -194,16 +183,27 @@ class CommentsExtension extends DataExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the root level comments, with spam and unmoderated items excluded, for use in the frontend
|
* Returns the RelationList of all comments against this object. Can be used as a data source
|
||||||
|
* for a gridfield with write access.
|
||||||
*
|
*
|
||||||
* @return CommentList
|
* @return CommentList
|
||||||
*/
|
*/
|
||||||
public function Comments() {
|
public function AllComments() {
|
||||||
// Get all non-spam comments
|
|
||||||
$order = $this->owner->getCommentsOption('order_comments_by');
|
$order = $this->owner->getCommentsOption('order_comments_by');
|
||||||
$list = $this
|
$comments = CommentList::create($this->ownerBaseClass)
|
||||||
->AllComments()
|
->forForeignID($this->owner->ID)
|
||||||
->sort($order);
|
->sort($order);
|
||||||
|
$this->owner->extend('updateAllComments', $comments);
|
||||||
|
return $comments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all comments against this object, with with spam and unmoderated items excluded, for use in the frontend
|
||||||
|
*
|
||||||
|
* @return CommentList
|
||||||
|
*/
|
||||||
|
public function AllVisibleComments() {
|
||||||
|
$list = $this->AllComments();
|
||||||
|
|
||||||
// Filter spam comments for non-administrators if configured
|
// Filter spam comments for non-administrators if configured
|
||||||
$showSpam = $this->owner->getCommentsOption('frontend_spam') && $this->owner->canModerateComments();
|
$showSpam = $this->owner->getCommentsOption('frontend_spam') && $this->owner->canModerateComments();
|
||||||
@ -218,6 +218,23 @@ class CommentsExtension extends DataExtension {
|
|||||||
$list = $list->filter('Moderated', 1);
|
$list = $list->filter('Moderated', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->owner->extend('updateAllVisibleComments', $list);
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the root level comments, with spam and unmoderated items excluded, for use in the frontend
|
||||||
|
*
|
||||||
|
* @return CommentList
|
||||||
|
*/
|
||||||
|
public function Comments() {
|
||||||
|
$list = $this->AllVisibleComments();
|
||||||
|
|
||||||
|
// If nesting comments, only show root level
|
||||||
|
if($this->owner->getCommentsOption('nested_comments')) {
|
||||||
|
$list = $list->filter('ParentCommentID', 0);
|
||||||
|
}
|
||||||
|
|
||||||
$this->owner->extend('updateComments', $list);
|
$this->owner->extend('updateComments', $list);
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
@ -384,8 +401,9 @@ class CommentsExtension extends DataExtension {
|
|||||||
$enabled = $this->getCommentsEnabled();
|
$enabled = $this->getCommentsEnabled();
|
||||||
if($enabled && $this->owner->getCommentsOption('include_js')) {
|
if($enabled && $this->owner->getCommentsOption('include_js')) {
|
||||||
Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.js');
|
Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.js');
|
||||||
|
Requirements::javascript(THIRDPARTY_DIR . '/jquery-entwine/dist/jquery.entwine-dist.js');
|
||||||
Requirements::javascript(THIRDPARTY_DIR . '/jquery-validate/lib/jquery.form.js');
|
Requirements::javascript(THIRDPARTY_DIR . '/jquery-validate/lib/jquery.form.js');
|
||||||
Requirements::javascript(THIRDPARTY_DIR . '/jquery-validate/jquery.validate.pack.js');
|
Requirements::javascript(COMMENTS_THIRDPARTY . '/jquery-validate/jquery.validate.min.js');
|
||||||
Requirements::javascript('comments/javascript/CommentsInterface.js');
|
Requirements::javascript('comments/javascript/CommentsInterface.js');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,13 +13,15 @@
|
|||||||
* @property integer $ParentID ID of the parent page / dataobject
|
* @property integer $ParentID ID of the parent page / dataobject
|
||||||
* @property boolean $AllowHtml If true, treat $Comment as HTML instead of plain text
|
* @property boolean $AllowHtml If true, treat $Comment as HTML instead of plain text
|
||||||
* @property string $SecretToken Secret admin token required to provide moderation links between sessions
|
* @property string $SecretToken Secret admin token required to provide moderation links between sessions
|
||||||
|
* @property integer $Depth Depth of this comment in the nested chain
|
||||||
*
|
*
|
||||||
* @method HasManyList ChildComments() List of child comments
|
* @method HasManyList ChildComments() List of child comments
|
||||||
* @method Member Author() Member object who created this comment
|
* @method Member Author() Member object who created this comment
|
||||||
*
|
* @method Comment ParentComment() Parent comment this is a reply to
|
||||||
* @package comments
|
* @package comments
|
||||||
*/
|
*/
|
||||||
class Comment extends DataObject {
|
class Comment extends DataObject {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
@ -34,10 +36,16 @@ class Comment extends DataObject {
|
|||||||
'ParentID' => 'Int',
|
'ParentID' => 'Int',
|
||||||
'AllowHtml' => 'Boolean',
|
'AllowHtml' => 'Boolean',
|
||||||
'SecretToken' => 'Varchar(255)',
|
'SecretToken' => 'Varchar(255)',
|
||||||
|
'Depth' => 'Int',
|
||||||
);
|
);
|
||||||
|
|
||||||
private static $has_one = array(
|
private static $has_one = array(
|
||||||
'Author' => 'Member',
|
"Author" => "Member",
|
||||||
|
"ParentComment" => "Comment",
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $has_many = array(
|
||||||
|
"ChildComments" => "Comment"
|
||||||
);
|
);
|
||||||
|
|
||||||
private static $default_sort = '"Created" DESC';
|
private static $default_sort = '"Created" DESC';
|
||||||
@ -71,12 +79,16 @@ class Comment extends DataObject {
|
|||||||
private static $summary_fields = array(
|
private static $summary_fields = array(
|
||||||
'Name' => 'Submitted By',
|
'Name' => 'Submitted By',
|
||||||
'Email' => 'Email',
|
'Email' => 'Email',
|
||||||
'Comment' => 'Comment',
|
'Comment.LimitWordCount' => 'Comment',
|
||||||
'Created' => 'Date Posted',
|
'Created' => 'Date Posted',
|
||||||
'ParentTitle' => 'Post',
|
'ParentTitle' => 'Post',
|
||||||
'IsSpam' => 'Is Spam',
|
'IsSpam' => 'Is Spam',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
private static $field_labels = array(
|
||||||
|
'Author' => 'Author Member',
|
||||||
|
);
|
||||||
|
|
||||||
public function onBeforeWrite() {
|
public function onBeforeWrite() {
|
||||||
parent::onBeforeWrite();
|
parent::onBeforeWrite();
|
||||||
|
|
||||||
@ -84,6 +96,18 @@ class Comment extends DataObject {
|
|||||||
if($this->AllowHtml) {
|
if($this->AllowHtml) {
|
||||||
$this->Comment = $this->purifyHtml($this->Comment);
|
$this->Comment = $this->purifyHtml($this->Comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check comment depth
|
||||||
|
$this->updateDepth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onBeforeDelete() {
|
||||||
|
parent::onBeforeDelete();
|
||||||
|
|
||||||
|
// Delete all children
|
||||||
|
foreach($this->ChildComments() as $comment) {
|
||||||
|
$comment->delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,7 +248,7 @@ class Comment extends DataObject {
|
|||||||
public function castingHelper($field) {
|
public function castingHelper($field) {
|
||||||
// Safely escape the comment
|
// Safely escape the comment
|
||||||
if($field === 'EscapedComment') {
|
if($field === 'EscapedComment') {
|
||||||
return $this->AllowHtml ? 'HTMLText' : 'Varchar';
|
return $this->AllowHtml ? 'HTMLText' : 'Text';
|
||||||
}
|
}
|
||||||
return parent::castingHelper($field);
|
return parent::castingHelper($field);
|
||||||
}
|
}
|
||||||
@ -474,6 +498,7 @@ class Comment extends DataObject {
|
|||||||
$this->write();
|
$this->write();
|
||||||
$this->extend('afterMarkUnapproved');
|
$this->extend('afterMarkUnapproved');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@ -506,14 +531,46 @@ class Comment extends DataObject {
|
|||||||
* Modify the default fields shown to the user
|
* Modify the default fields shown to the user
|
||||||
*/
|
*/
|
||||||
public function getCMSFields() {
|
public function getCMSFields() {
|
||||||
$fields = parent::getCMSFields();
|
$commentField = $this->AllowHtml ? 'HtmlEditorField' : 'TextareaField';
|
||||||
|
$fields = new FieldList(
|
||||||
|
$this
|
||||||
|
->obj('Created')
|
||||||
|
->scaffoldFormField($this->fieldLabel('Created'))
|
||||||
|
->performReadonlyTransformation(),
|
||||||
|
TextField::create('Name', $this->fieldLabel('AuthorName')),
|
||||||
|
$commentField::create('Comment', $this->fieldLabel('Comment')),
|
||||||
|
EmailField::create('Email', $this->fieldLabel('Email')),
|
||||||
|
TextField::create('URL', $this->fieldLabel('URL')),
|
||||||
|
FieldGroup::create(array(
|
||||||
|
CheckboxField::create('Moderated', $this->fieldLabel('Moderated')),
|
||||||
|
CheckboxField::create('IsSpam', $this->fieldLabel('IsSpam')),
|
||||||
|
))
|
||||||
|
->setTitle('Options')
|
||||||
|
->setDescription(_t(
|
||||||
|
'Comment.OPTION_DESCRIPTION',
|
||||||
|
'Unmoderated and spam comments will not be displayed until approved'
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
$hidden = array('ParentID', 'AuthorID', 'BaseClass', 'AllowHtml', 'SecretToken');
|
// Show member name if given
|
||||||
|
if(($author = $this->Author()) && $author->exists()) {
|
||||||
foreach($hidden as $private) {
|
$fields->insertAfter(
|
||||||
$fields->removeByName($private);
|
TextField::create('AuthorMember', $this->fieldLabel('Author'), $author->Title)
|
||||||
|
->performReadonlyTransformation(),
|
||||||
|
'Name'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Show parent comment details
|
||||||
|
if(($parent = $this->ParentComment()) && $parent->exists()) {
|
||||||
|
$fields->insertAfter(
|
||||||
|
TextField::create('ParentCommentDescription', $this->fieldLabel('ParentComment'), $parent->Title)
|
||||||
|
->performReadonlyTransformation(),
|
||||||
|
'Created'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->extend('updateCMSFields', $fields);
|
||||||
return $fields;
|
return $fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,8 +615,135 @@ class Comment extends DataObject {
|
|||||||
|
|
||||||
return $gravatar;
|
return $gravatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if replies are enabled for this instance
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getRepliesEnabled() {
|
||||||
|
// Check reply option
|
||||||
|
if(!$this->getOption('nested_comments')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if depth is limited
|
||||||
|
$maxLevel = $this->getOption('nested_depth');
|
||||||
|
return !$maxLevel || $this->Depth < $maxLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of all replies
|
||||||
|
*
|
||||||
|
* @return SS_List
|
||||||
|
*/
|
||||||
|
public function AllReplies() {
|
||||||
|
// No replies if disabled
|
||||||
|
if(!$this->getRepliesEnabled()) {
|
||||||
|
return new ArrayList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all non-spam comments
|
||||||
|
$order = $this->getOption('order_replies_by')
|
||||||
|
?: $this->getOption('order_comments_by');
|
||||||
|
$list = $this
|
||||||
|
->ChildComments()
|
||||||
|
->sort($order);
|
||||||
|
|
||||||
|
$this->extend('updateAllReplies', $list);
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of replies, with spam and unmoderated items excluded, for use in the frontend
|
||||||
|
*
|
||||||
|
* @return SS_List
|
||||||
|
*/
|
||||||
|
public function Replies() {
|
||||||
|
// No replies if disabled
|
||||||
|
if(!$this->getRepliesEnabled()) {
|
||||||
|
return new ArrayList();
|
||||||
|
}
|
||||||
|
$list = $this->AllReplies();
|
||||||
|
|
||||||
|
// Filter spam comments for non-administrators if configured
|
||||||
|
$parent = $this->getParent();
|
||||||
|
$showSpam = $this->getOption('frontend_spam') && $parent && $parent->canModerateComments();
|
||||||
|
if(!$showSpam) {
|
||||||
|
$list = $list->filter('IsSpam', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter un-moderated comments for non-administrators if moderation is enabled
|
||||||
|
$showUnmoderated = $parent && (
|
||||||
|
($parent->ModerationRequired === 'None')
|
||||||
|
|| ($this->getOption('frontend_moderation') && $parent->canModerateComments())
|
||||||
|
);
|
||||||
|
if (!$showUnmoderated) {
|
||||||
|
$list = $list->filter('Moderated', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->extend('updateReplies', $list);
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of replies paged, with spam and unmoderated items excluded, for use in the frontend
|
||||||
|
*
|
||||||
|
* @return PaginatedList
|
||||||
|
*/
|
||||||
|
public function PagedReplies() {
|
||||||
|
$list = $this->Replies();
|
||||||
|
|
||||||
|
// Add pagination
|
||||||
|
$list = new PaginatedList($list, Controller::curr()->getRequest());
|
||||||
|
$list->setPaginationGetVar('repliesstart'.$this->ID);
|
||||||
|
$list->setPageLength($this->getOption('comments_per_page'));
|
||||||
|
|
||||||
|
$this->extend('updatePagedReplies', $list);
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a reply form for this comment
|
||||||
|
*
|
||||||
|
* @return Form
|
||||||
|
*/
|
||||||
|
public function ReplyForm() {
|
||||||
|
// Ensure replies are enabled
|
||||||
|
if(!$this->getRepliesEnabled()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check parent is available
|
||||||
|
$parent = $this->getParent();
|
||||||
|
if(!$parent || !$parent->exists()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build reply controller
|
||||||
|
$controller = CommentingController::create();
|
||||||
|
$controller->setOwnerRecord($parent);
|
||||||
|
$controller->setBaseClass($parent->ClassName);
|
||||||
|
$controller->setOwnerController(Controller::curr());
|
||||||
|
|
||||||
|
return $controller->ReplyForm($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh of this comment in the hierarchy
|
||||||
|
*/
|
||||||
|
public function updateDepth() {
|
||||||
|
$parent = $this->ParentComment();
|
||||||
|
if($parent && $parent->exists()) {
|
||||||
|
$parent->updateDepth();
|
||||||
|
$this->Depth = $parent->Depth + 1;
|
||||||
|
} else {
|
||||||
|
$this->Depth = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the ability to generate cryptographically secure tokens for comment moderation
|
* Provides the ability to generate cryptographically secure tokens for comment moderation
|
||||||
*/
|
*/
|
23
config.rb
Normal file
23
config.rb
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Require any additional compass plugins here.
|
||||||
|
|
||||||
|
# Set this to the root of your project when deployed:
|
||||||
|
http_path = "/"
|
||||||
|
css_dir = "css"
|
||||||
|
sass_dir = "scss"
|
||||||
|
javascripts_dir = "javascript"
|
||||||
|
|
||||||
|
# You can select your preferred output style here (can be overridden via the command line):
|
||||||
|
# output_style = :expanded or :nested or :compact or :compressed
|
||||||
|
|
||||||
|
# To enable relative paths to assets via compass helper functions. Uncomment:
|
||||||
|
relative_assets = true
|
||||||
|
|
||||||
|
# To disable debugging comments that display the original location of your selectors. Uncomment:
|
||||||
|
line_comments = true
|
||||||
|
|
||||||
|
|
||||||
|
# If you prefer the indented syntax, you might want to regenerate this
|
||||||
|
# project again passing --syntax sass, or you can uncomment this:
|
||||||
|
# preferred_syntax = :sass
|
||||||
|
# and then run:
|
||||||
|
# sass-convert -R --from scss --to sass scss scss && rm -rf sass && mv scss sass
|
173
css/comments.css
Normal file
173
css/comments.css
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/* line 12, ../scss/comments.scss */
|
||||||
|
#comments-holder {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
/* line 15, ../scss/comments.scss */
|
||||||
|
#comments-holder h2 {
|
||||||
|
margin: 30px 0 10px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
/* line 21, ../scss/comments.scss */
|
||||||
|
#comments-holder h3 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
/* line 25, ../scss/comments.scss */
|
||||||
|
#comments-holder .field {
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
/* line 29, ../scss/comments.scss */
|
||||||
|
#comments-holder .num,
|
||||||
|
#comments-holder .author {
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
/* line 34, ../scss/comments.scss */
|
||||||
|
#comments-holder .num {
|
||||||
|
color: #999;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
/* line 39, ../scss/comments.scss */
|
||||||
|
#comments-holder .num-total {
|
||||||
|
line-height: 40px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
/* line 44, ../scss/comments.scss */
|
||||||
|
#comments-holder .comments-list {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
/* line 49, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment {
|
||||||
|
clear: both;
|
||||||
|
list-style-type: none;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 20px 0 10px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
/* line 57, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.author-comment:after {
|
||||||
|
content: 'Author';
|
||||||
|
float: right;
|
||||||
|
position: absolute;
|
||||||
|
top: 1.5em;
|
||||||
|
right: 0;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #00acee;
|
||||||
|
}
|
||||||
|
/* line 68, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.author-comment .comment-text {
|
||||||
|
border: 1px solid #00acee;
|
||||||
|
}
|
||||||
|
/* line 75, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.spam .comment-text {
|
||||||
|
border: 1px dashed #f48b33;
|
||||||
|
}
|
||||||
|
/* line 80, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .comment-text {
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
box-shadow: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 15% 0 20px;
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
white-space: pre-line;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
/* line 91, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .comment-text p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
/* line 96, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .date {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
/* line 99, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .date:before {
|
||||||
|
content: '\0000a0\0000a0\0000a0\0000a0';
|
||||||
|
}
|
||||||
|
/* line 104, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.unmoderated {
|
||||||
|
border: 2px dashed gray;
|
||||||
|
margin: 2em 0 4em;
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
/* line 109, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.unmoderated .comment-moderation {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
/* line 114, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .info {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
/* line 118, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment.spam .comment {
|
||||||
|
border: 1px dashed #f48b33;
|
||||||
|
color: #f48b33;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 2.5em 1em 1em;
|
||||||
|
}
|
||||||
|
/* line 125, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .comment-replies-container {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 10px;
|
||||||
|
border-left: 1px dashed #999;
|
||||||
|
}
|
||||||
|
/* line 130, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .comment-replies-container .comment-reply-form-holder {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
/* line 133, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment .comment-replies-container .comment-replies-holder {
|
||||||
|
padding: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
/* line 140, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment-moderation {
|
||||||
|
float: right;
|
||||||
|
margin: 1em 0 2em;
|
||||||
|
}
|
||||||
|
/* line 144, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment-moderation .heading {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
/* line 149, ../scss/comments.scss */
|
||||||
|
#comments-holder .action-links {
|
||||||
|
margin: 20px 0 10px;
|
||||||
|
}
|
||||||
|
/* line 152, ../scss/comments.scss */
|
||||||
|
#comments-holder .action-links li {
|
||||||
|
display: inline;
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 20px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
/* line 158, ../scss/comments.scss */
|
||||||
|
#comments-holder .action-links li:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
/* line 162, ../scss/comments.scss */
|
||||||
|
#comments-holder .action-links li.comment-reply-action {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
/* line 168, ../scss/comments.scss */
|
||||||
|
#comments-holder .comment-count {
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
/* line 173, ../scss/comments.scss */
|
||||||
|
#comments-holder .commenting-area {
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
/* line 176, ../scss/comments.scss */
|
||||||
|
#comments-holder .commenting-area label.left {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
/* line 181, ../scss/comments.scss */
|
||||||
|
#comments-holder .commenting-rss-feed {
|
||||||
|
margin-top: 4em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
/* line 186, ../scss/comments.scss */
|
||||||
|
#comments-holder .no-comments-yet {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
@ -2,115 +2,142 @@
|
|||||||
* @package comments
|
* @package comments
|
||||||
*/
|
*/
|
||||||
(function($) {
|
(function($) {
|
||||||
$(document).ready(function () {
|
$.entwine( "ss.comments", function($) {
|
||||||
|
|
||||||
var container = $('.comments-holder-container'),
|
|
||||||
commentsHolder = $('.comments-holder'),
|
|
||||||
commentsList = $('.comments-list', commentsHolder),
|
|
||||||
pagination = $('.comments-pagination'),
|
|
||||||
noCommentsYet = $('.no-comments-yet', commentsHolder),
|
|
||||||
form = $('form', container),
|
|
||||||
previewEl = form.find('#PreviewComment');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init
|
* Enable form validation
|
||||||
*/
|
*/
|
||||||
previewEl.hide();
|
$('.comments-holder-container form').entwine({
|
||||||
$(':submit[name=action_doPreviewComment]').show();
|
onmatch: function() {
|
||||||
|
|
||||||
|
// @todo Reinstate preview-comment functionality
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate
|
* Validate
|
||||||
*/
|
*/
|
||||||
form.validate({
|
$(this).validate({
|
||||||
invalidHandler : function(form, validator){
|
|
||||||
$('html, body').animate({
|
/**
|
||||||
scrollTop: $(validator.errorList[0].element).offset().top - 30
|
* Ignore hidden elements in this form
|
||||||
}, 200);
|
*/
|
||||||
|
ignore: ':hidden',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use default 'required' for error labels
|
||||||
|
*/
|
||||||
|
errorClass: "required",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use span instead of labels
|
||||||
|
*/
|
||||||
|
errorElement: "span",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On error, scroll to the invalid element
|
||||||
|
*/
|
||||||
|
invalidHandler : function(form, validator){
|
||||||
|
$('html, body').animate({
|
||||||
|
scrollTop: $(validator.errorList[0].element).offset().top - 30
|
||||||
|
}, 200);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure any new error message has the correct class and placement
|
||||||
|
*/
|
||||||
|
errorPlacement: function(error, element) {
|
||||||
|
error
|
||||||
|
.addClass('message')
|
||||||
|
.insertAfter(element);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this._super();
|
||||||
},
|
},
|
||||||
showErrors: function(errorMap, errorList) {
|
onunmatch: function() {
|
||||||
this.defaultShowErrors();
|
this._super();
|
||||||
// hack to add the extra classes we need to the validation message elements
|
}
|
||||||
form.find('span.error').addClass('message required');
|
});
|
||||||
},
|
|
||||||
|
/**
|
||||||
errorElement: "span",
|
* Comment reply form
|
||||||
errorClass: "error",
|
*/
|
||||||
ignore: '.hidden',
|
$( ".comment-replies-container .comment-reply-form-holder" ).entwine({
|
||||||
rules: {
|
onmatch: function() {
|
||||||
Name : {
|
// If and only if this is not the currently selected form, hide it on page load
|
||||||
required : true
|
var selectedHash = window.document.location.hash.substr(1),
|
||||||
},
|
form = $(this).children('.reply-form');
|
||||||
Email : {
|
if( !selectedHash || selectedHash !== form.prop( 'id' ) ) {
|
||||||
required : true,
|
this.hide();
|
||||||
email : true
|
|
||||||
},
|
|
||||||
Comment: {
|
|
||||||
required : true
|
|
||||||
},
|
|
||||||
URL: {
|
|
||||||
url : true
|
|
||||||
}
|
}
|
||||||
|
this._super();
|
||||||
},
|
},
|
||||||
messages: {
|
onunmatch: function() {
|
||||||
Name : {
|
this._super();
|
||||||
required : form.find('[name="Name"]').data('message-required')
|
}
|
||||||
},
|
});
|
||||||
Email : {
|
|
||||||
required : form.find('[name="Email"]').data('message-required'),
|
/**
|
||||||
email : form.find('[name="Email"]').data('message-email')
|
* Toggle on/off reply form
|
||||||
},
|
*/
|
||||||
Comment: {
|
$( ".comment-reply-link" ).entwine({
|
||||||
required : form.find('[name="Comment"]').data('message-required')
|
onclick: function( e ) {
|
||||||
},
|
var allForms = $( ".comment-reply-form-holder" ),
|
||||||
URL: {
|
formID = $( this ).prop('href').replace(/^[^#]*#/, '#'),
|
||||||
url : form.find('[name="Comment"]').data('message-url')
|
form = $(formID).closest('.comment-reply-form-holder');
|
||||||
|
|
||||||
|
// Prevent focus
|
||||||
|
e.preventDefault();
|
||||||
|
if(form.is(':visible')) {
|
||||||
|
allForms.slideUp();
|
||||||
|
} else {
|
||||||
|
allForms.not(form).slideUp();
|
||||||
|
form.slideDown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
form.submit(function (e) {
|
|
||||||
// trigger validation
|
|
||||||
if(!form.validate().valid()) return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preview comment by fetching it from the server via ajax.
|
* Preview comment by fetching it from the server via ajax.
|
||||||
*/
|
*/
|
||||||
|
/* @todo Migrate to work with nested comments
|
||||||
$(':submit[name=action_doPreviewComment]', form).click(function(e) {
|
$(':submit[name=action_doPreviewComment]', form).click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
if(!form.validate().valid()) {
|
if(!form.validate().valid()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
previewEl.show().addClass('loading').find('.middleColumn').html(' ');
|
previewEl.show().addClass('loading').find('.middleColumn').html(' ');
|
||||||
|
|
||||||
form.ajaxSubmit({
|
form.ajaxSubmit({
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
var responseEl = $(response);
|
var responseEl = $(response);
|
||||||
if(responseEl.is('form')) {
|
if(responseEl.is('form')) {
|
||||||
// Validation failed, renders form instead of single comment
|
// Validation failed, renders form instead of single comment
|
||||||
form.find(".data-fields").replaceWith(responseEl.find(".data-fields"));
|
form.find(".data-fields").replaceWith(responseEl.find(".data-fields"));
|
||||||
} else {
|
} else {
|
||||||
// Default behaviour
|
// Default behaviour
|
||||||
previewEl.removeClass('loading').find('.middleColumn').html(responseEl);
|
previewEl.removeClass('loading').find('.middleColumn').html(responseEl);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data: {'action_doPreviewComment': 1}
|
data: {'action_doPreviewComment': 1}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hide outdated preview on form changes
|
* Hide outdated preview on form changes
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
$(':input', form).on('change keydown', function() {
|
$(':input', form).on('change keydown', function() {
|
||||||
previewEl.removeClass('loading').hide();
|
previewEl.removeClass('loading').hide();
|
||||||
});
|
});*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clicking one of the metalinks performs the operation via ajax
|
* Clicking one of the metalinks performs the operation via ajax
|
||||||
* this inclues the spam and approve links
|
* this inclues the spam and approve links
|
||||||
*/
|
*/
|
||||||
|
/* @todo Migrate to work with nested comments
|
||||||
commentsList.on('click', '.action-links a', function(e) {
|
commentsList.on('click', '.action-links a', function(e) {
|
||||||
var link = $(this);
|
var link = $(this);
|
||||||
var comment = link.parents('.comment:first');
|
var comment = link.parents('.comment:first');
|
||||||
@ -149,11 +176,12 @@
|
|||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ajax pagination
|
* Ajax pagination
|
||||||
*/
|
*/
|
||||||
|
/* @todo Migrate to work with nested comments
|
||||||
pagination.find('a').on('click', function(){
|
pagination.find('a').on('click', function(){
|
||||||
commentsList.addClass('loading');
|
commentsList.addClass('loading');
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@ -165,14 +193,16 @@
|
|||||||
pagination.hide().html(html.find('.comments-pagination:first').html()).fadeIn();
|
pagination.hide().html(html.find('.comments-pagination:first').html()).fadeIn();
|
||||||
commentsList.removeClass('loading');
|
commentsList.removeClass('loading');
|
||||||
$('html, body').animate({
|
$('html, body').animate({
|
||||||
scrollTop: commentsList.offset().top - 30
|
scrollTop: commentsList.offset().top - 30
|
||||||
}, 200);
|
}, 200);
|
||||||
},
|
},
|
||||||
failure: function(html) {
|
failure: function(html) {
|
||||||
alert('Error loading comments');
|
alert('Error loading comments');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
});
|
});*/
|
||||||
});
|
});
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|
||||||
|
|
||||||
|
190
scss/comments.scss
Normal file
190
scss/comments.scss
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
// Colours
|
||||||
|
$blue: #00acee !default;
|
||||||
|
$blueDark: #0064cd !default;
|
||||||
|
$green: #46a546 !default;
|
||||||
|
$redLight: #DB4A39 !default;
|
||||||
|
$red: #9d261d !default;
|
||||||
|
$yellow: #ffc40d !default;
|
||||||
|
$orange: #f48b33 !default;
|
||||||
|
$pink: #c3325f !default;
|
||||||
|
$purple: #7a43b6 !default;
|
||||||
|
|
||||||
|
#comments-holder {
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin: 30px 0 10px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.num,
|
||||||
|
.author {
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.num {
|
||||||
|
color: #999;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.num-total {
|
||||||
|
line-height: 40px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comments-list {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A published comment
|
||||||
|
.comment {
|
||||||
|
clear:both;
|
||||||
|
list-style-type: none;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 20px 0 10px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&.author-comment {
|
||||||
|
&:after {
|
||||||
|
content: 'Author';
|
||||||
|
float: right;
|
||||||
|
position: absolute;
|
||||||
|
top: 1.5em;
|
||||||
|
right: 0;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: $blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-text {
|
||||||
|
border: 1px solid $blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
&.spam {
|
||||||
|
.comment-text {
|
||||||
|
border: 1px dashed $orange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-text {
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
box-shadow: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 15% 0 20px;
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
white-space: pre-line;
|
||||||
|
word-wrap: break-word;
|
||||||
|
|
||||||
|
p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: '\0000a0\0000a0\0000a0\0000a0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.unmoderated {
|
||||||
|
border: 2px dashed gray;
|
||||||
|
margin: 2em 0 4em;
|
||||||
|
padding: 2em;
|
||||||
|
|
||||||
|
.comment-moderation {
|
||||||
|
margin-bottom: 0; // Remove the margin to compensate for unmoderated comment padding.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.spam .comment{
|
||||||
|
border: 1px dashed $orange;
|
||||||
|
color: $orange;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 2.5em 1em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-replies-container {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 10px;
|
||||||
|
border-left: 1px dashed #999;
|
||||||
|
|
||||||
|
.comment-reply-form-holder {
|
||||||
|
padding: 0 10px; // Prevent clipping issues on slideUp/Down
|
||||||
|
}
|
||||||
|
.comment-replies-holder {
|
||||||
|
padding: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Admin actions
|
||||||
|
.comment-moderation {
|
||||||
|
float: right;
|
||||||
|
margin: 1em 0 2em;
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-links {
|
||||||
|
margin: 20px 0 10px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 20px;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.comment-reply-action {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-count {
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The comment form
|
||||||
|
.commenting-area {
|
||||||
|
margin-top: 50px;
|
||||||
|
|
||||||
|
label.left{
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.commenting-rss-feed {
|
||||||
|
margin-top: 4em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-comments-yet {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
23
templates/CommentReplies.ss
Normal file
23
templates/CommentReplies.ss
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<% if $RepliesEnabled %>
|
||||||
|
<div class="comment-replies-container">
|
||||||
|
|
||||||
|
<div class="comment-reply-form-holder">
|
||||||
|
$ReplyForm
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="comment-replies-holder">
|
||||||
|
<% if $Replies %>
|
||||||
|
<ul class="comments-list level-{$Depth}">
|
||||||
|
<% loop $Replies %>
|
||||||
|
<li class="comment $EvenOdd<% if FirstLast %> $FirstLast <% end_if %> $SpamClass">
|
||||||
|
<% include CommentsInterface_singlecomment %>
|
||||||
|
</li>
|
||||||
|
<% end_loop %>
|
||||||
|
</ul>
|
||||||
|
<% with $Replies %>
|
||||||
|
<% include ReplyPagination %>
|
||||||
|
<% end_with %>
|
||||||
|
<% end_if %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end_if %>
|
@ -1,3 +1,5 @@
|
|||||||
|
<% require themedCSS('comments', 'comments') %>
|
||||||
|
|
||||||
<% if $CommentsEnabled %>
|
<% if $CommentsEnabled %>
|
||||||
<div id="$CommentHolderID" class="comments-holder-container">
|
<div id="$CommentHolderID" class="comments-holder-container">
|
||||||
<h4><% _t('CommentsInterface_ss.POSTCOM','Post your comment') %></h4>
|
<h4><% _t('CommentsInterface_ss.POSTCOM','Post your comment') %></h4>
|
||||||
@ -21,7 +23,7 @@
|
|||||||
|
|
||||||
<div class="comments-holder">
|
<div class="comments-holder">
|
||||||
<% if $PagedComments %>
|
<% if $PagedComments %>
|
||||||
<ul class="comments-list">
|
<ul class="comments-list root-level">
|
||||||
<% loop $PagedComments %>
|
<% loop $PagedComments %>
|
||||||
<li class="comment $EvenOdd<% if FirstLast %> $FirstLast <% end_if %> $SpamClass">
|
<li class="comment $EvenOdd<% if FirstLast %> $FirstLast <% end_if %> $SpamClass">
|
||||||
<% include CommentsInterface_singlecomment %>
|
<% include CommentsInterface_singlecomment %>
|
||||||
|
@ -1,18 +1,23 @@
|
|||||||
<div class="comment" id="<% if $isPreview %>comment-preview<% else %>$Permalink<% end_if %>">
|
<% if not $isPreview %>
|
||||||
<% if $Gravatar %><img class="gravatar" src="$Gravatar" alt="Gravatar for $Name" title="Gravatar for $Name" /><% end_if %>
|
|
||||||
$EscapedComment
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<% if not isPreview %>
|
|
||||||
<p class="info">
|
<p class="info">
|
||||||
<% if $URL %>
|
<% if $URL %>
|
||||||
<% _t('CommentsInterface_singlecomment_ss.PBY','Posted by') %> <a href="$URL.URL" rel="nofollow">$AuthorName.XML</a>, $Created.Nice ($Created.Ago)
|
<a class="author" href="$URL.URL" rel="nofollow">$AuthorName.XML</a>
|
||||||
<% else %>
|
<% else %>
|
||||||
<% _t('CommentsInterface_singlecomment_ss.PBY','Posted by') %> $AuthorName.XML, $Created.Nice ($Created.Ago)
|
<span class="author">$AuthorName.XML</span>
|
||||||
|
<% end_if %>
|
||||||
|
<span class="date">$Created.Nice ($Created.Ago)</span>
|
||||||
|
<% if $Gravatar %>
|
||||||
|
<img class="gravatar" src="$Gravatar.ATT" alt="Gravatar for $Name.ATT" title="Gravatar for $Name.ATT" />
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
</p>
|
</p>
|
||||||
|
<% end_if %>
|
||||||
|
|
||||||
<% if $ApproveLink || $SpamLink || $HamLink || $DeleteLink %>
|
<div class="comment-text" id="<% if $isPreview %>comment-preview<% else %>$Permalink<% end_if %>">
|
||||||
|
<p>$EscapedComment</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% if not $isPreview %>
|
||||||
|
<% if $ApproveLink || $SpamLink || $HamLink || $DeleteLink || $RepliesEnabled %>
|
||||||
<ul class="action-links">
|
<ul class="action-links">
|
||||||
<% if $ApproveLink %>
|
<% if $ApproveLink %>
|
||||||
<li><a href="$ApproveLink.ATT" class="approve"><% _t('CommentsInterface_singlecomment_ss.APPROVE', 'approve this comment') %></a></li>
|
<li><a href="$ApproveLink.ATT" class="approve"><% _t('CommentsInterface_singlecomment_ss.APPROVE', 'approve this comment') %></a></li>
|
||||||
@ -24,8 +29,15 @@
|
|||||||
<li><a href="$HamLink.ATT" class="ham"><% _t('CommentsInterface_singlecomment_ss.ISNTSPAM','this comment is not spam') %></a></li>
|
<li><a href="$HamLink.ATT" class="ham"><% _t('CommentsInterface_singlecomment_ss.ISNTSPAM','this comment is not spam') %></a></li>
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
<% if $DeleteLink %>
|
<% if $DeleteLink %>
|
||||||
<li class="last"><a href="$DeleteLink.ATT" class="delete"><% _t('CommentsInterface_singlecomment_ss.REMCOM','remove this comment') %></a></li>
|
<li><a href="$DeleteLink.ATT" class="delete"><% _t('CommentsInterface_singlecomment_ss.REMCOM','remove this comment') %></a></li>
|
||||||
|
<% end_if %>
|
||||||
|
<% if $RepliesEnabled %>
|
||||||
|
<li class="comment-reply-action">
|
||||||
|
<a class="comment-reply-link" href="#{$ReplyForm.FormName}">Reply to $AuthorName.XML</a>
|
||||||
|
</li>
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
</ul>
|
</ul>
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
|
|
||||||
|
<% include CommentReplies %>
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
|
1
templates/Includes/ReplyPagination.ss
Normal file
1
templates/Includes/ReplyPagination.ss
Normal file
@ -0,0 +1 @@
|
|||||||
|
<% include CommentPagination %>
|
114
tests/CommentingControllerTest.php
Normal file
114
tests/CommentingControllerTest.php
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package comments
|
||||||
|
* @subpackage tests
|
||||||
|
*/
|
||||||
|
class CommentingControllerTest extends FunctionalTest {
|
||||||
|
|
||||||
|
public static $fixture_file = 'CommentsTest.yml';
|
||||||
|
|
||||||
|
protected $extraDataObjects = array(
|
||||||
|
'CommentableItem'
|
||||||
|
);
|
||||||
|
|
||||||
|
protected $securityEnabled;
|
||||||
|
|
||||||
|
public function tearDown() {
|
||||||
|
if($this->securityEnabled) {
|
||||||
|
SecurityToken::enable();
|
||||||
|
} else {
|
||||||
|
SecurityToken::disable();
|
||||||
|
}
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->securityEnabled = SecurityToken::is_enabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRSS() {
|
||||||
|
$item = $this->objFromFixture('CommentableItem', 'first');
|
||||||
|
|
||||||
|
// comments sitewide
|
||||||
|
$response = $this->get('CommentingController/rss');
|
||||||
|
$this->assertEquals(10, substr_count($response->getBody(), "<item>"), "10 approved, non spam comments on page 1");
|
||||||
|
|
||||||
|
$response = $this->get('CommentingController/rss?start=10');
|
||||||
|
$this->assertEquals(4, substr_count($response->getBody(), "<item>"), "3 approved, non spam comments on page 2");
|
||||||
|
|
||||||
|
// all comments on a type
|
||||||
|
$response = $this->get('CommentingController/rss/CommentableItem');
|
||||||
|
$this->assertEquals(10, substr_count($response->getBody(), "<item>"));
|
||||||
|
|
||||||
|
$response = $this->get('CommentingController/rss/CommentableItem?start=10');
|
||||||
|
$this->assertEquals(4, substr_count($response->getBody(), "<item>"), "3 approved, non spam comments on page 2");
|
||||||
|
|
||||||
|
// specific page
|
||||||
|
$response = $this->get('CommentingController/rss/CommentableItem/'.$item->ID);
|
||||||
|
$this->assertEquals(1, substr_count($response->getBody(), "<item>"));
|
||||||
|
$this->assertContains('<dc:creator>FA</dc:creator>', $response->getBody());
|
||||||
|
|
||||||
|
// test accessing comments on a type that doesn't exist
|
||||||
|
$response = $this->get('CommentingController/rss/Fake');
|
||||||
|
$this->assertEquals(404, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCommentsForm() {
|
||||||
|
SecurityToken::disable();
|
||||||
|
$this->autoFollowRedirection = false;
|
||||||
|
$parent = $this->objFromFixture('CommentableItem', 'first');
|
||||||
|
|
||||||
|
// Test posting to base comment
|
||||||
|
$response = $this->post('CommentingController/CommentsForm',
|
||||||
|
array(
|
||||||
|
'Name' => 'Poster',
|
||||||
|
'Email' => 'guy@test.com',
|
||||||
|
'Comment' => 'My Comment',
|
||||||
|
'ParentID' => $parent->ID,
|
||||||
|
'BaseClass' => 'CommentableItem',
|
||||||
|
'action_doPostComment' => 'Post'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$this->assertEquals(302, $response->getStatusCode());
|
||||||
|
$this->assertStringStartsWith('CommentableItem_Controller#comment-', $response->getHeader('Location'));
|
||||||
|
$this->assertDOSEquals(
|
||||||
|
array(array(
|
||||||
|
'Name' => 'Poster',
|
||||||
|
'Email' => 'guy@test.com',
|
||||||
|
'Comment' => 'My Comment',
|
||||||
|
'ParentID' => $parent->ID,
|
||||||
|
'BaseClass' => 'CommentableItem',
|
||||||
|
)),
|
||||||
|
Comment::get()->filter('Email', 'guy@test.com')
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test posting to parent comment
|
||||||
|
$parentComment = $this->objFromFixture('Comment', 'firstComA');
|
||||||
|
$this->assertEquals(0, $parentComment->ChildComments()->count());
|
||||||
|
|
||||||
|
$response = $this->post(
|
||||||
|
'CommentingController/reply/'.$parentComment->ID,
|
||||||
|
array(
|
||||||
|
'Name' => 'Test Author',
|
||||||
|
'Email' => 'test@test.com',
|
||||||
|
'Comment' => 'Making a reply to firstComA',
|
||||||
|
'ParentID' => $parent->ID,
|
||||||
|
'BaseClass' => 'CommentableItem',
|
||||||
|
'ParentCommentID' => $parentComment->ID,
|
||||||
|
'action_doPostComment' => 'Post'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$this->assertEquals(302, $response->getStatusCode());
|
||||||
|
$this->assertStringStartsWith('CommentableItem_Controller#comment-', $response->getHeader('Location'));
|
||||||
|
$this->assertDOSEquals(array(array(
|
||||||
|
'Name' => 'Test Author',
|
||||||
|
'Email' => 'test@test.com',
|
||||||
|
'Comment' => 'Making a reply to firstComA',
|
||||||
|
'ParentID' => $parent->ID,
|
||||||
|
'BaseClass' => 'CommentableItem',
|
||||||
|
'ParentCommentID' => $parentComment->ID
|
||||||
|
)), $parentComment->ChildComments());
|
||||||
|
}
|
||||||
|
}
|
@ -1,59 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @package comments
|
|
||||||
* @subpackage tests
|
|
||||||
*/
|
|
||||||
class CommentingControllerTests extends FunctionalTest {
|
|
||||||
|
|
||||||
public static $fixture_file = 'comments/tests/CommentsTest.yml';
|
|
||||||
|
|
||||||
protected $extraDataObjects = array(
|
|
||||||
'CommentableItem'
|
|
||||||
);
|
|
||||||
|
|
||||||
public function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
Commenting::add('CommentableItem');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRSS() {
|
|
||||||
$item = $this->objFromFixture('CommentableItem', 'first');
|
|
||||||
|
|
||||||
// comments sitewide
|
|
||||||
$response = $this->get('CommentingController/rss');
|
|
||||||
$this->assertEquals(10, substr_count($response->getBody(), "<item>"), "10 approved, non spam comments on page 1");
|
|
||||||
|
|
||||||
$response = $this->get('CommentingController/rss?start=10');
|
|
||||||
$this->assertEquals(4, substr_count($response->getBody(), "<item>"), "3 approved, non spam comments on page 2");
|
|
||||||
|
|
||||||
// all comments on a type
|
|
||||||
$response = $this->get('CommentingController/rss/CommentableItem');
|
|
||||||
$this->assertEquals(10, substr_count($response->getBody(), "<item>"));
|
|
||||||
|
|
||||||
$response = $this->get('CommentingController/rss/CommentableItem?start=10');
|
|
||||||
$this->assertEquals(4, substr_count($response->getBody(), "<item>"), "3 approved, non spam comments on page 2");
|
|
||||||
|
|
||||||
// specific page
|
|
||||||
$response = $this->get('CommentingController/rss/CommentableItem/'.$item->ID);
|
|
||||||
$this->assertEquals(1, substr_count($response->getBody(), "<item>"));
|
|
||||||
$this->assertContains('<dc:creator>FA</dc:creator>', $response->getBody());
|
|
||||||
|
|
||||||
// test accessing comments on a type that doesn't exist
|
|
||||||
$response = $this->get('CommentingController/rss/Fake');
|
|
||||||
$this->assertEquals(404, $response->getStatusCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRSSSecuredCommentsForm() {
|
|
||||||
$this->markTestIncomplete("Not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCommentsForm() {
|
|
||||||
$this->markTestIncomplete("Not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testDoCommentsForm() {
|
|
||||||
$this->markTestIncomplete("Not implemented");
|
|
||||||
}
|
|
||||||
}
|
|
940
thirdparty/jquery-validate/additional-methods.js
vendored
Normal file
940
thirdparty/jquery-validate/additional-methods.js
vendored
Normal file
@ -0,0 +1,940 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery Validation Plugin v1.13.1
|
||||||
|
*
|
||||||
|
* http://jqueryvalidation.org/
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Jörn Zaefferer
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "./jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
function stripHtml(value) {
|
||||||
|
// remove html tags and space chars
|
||||||
|
return value.replace(/<.[^<>]*?>/g, " ").replace(/ | /gi, " ")
|
||||||
|
// remove punctuation
|
||||||
|
.replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
$.validator.addMethod("maxWords", function(value, element, params) {
|
||||||
|
return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length <= params;
|
||||||
|
}, $.validator.format("Please enter {0} words or less."));
|
||||||
|
|
||||||
|
$.validator.addMethod("minWords", function(value, element, params) {
|
||||||
|
return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params;
|
||||||
|
}, $.validator.format("Please enter at least {0} words."));
|
||||||
|
|
||||||
|
$.validator.addMethod("rangeWords", function(value, element, params) {
|
||||||
|
var valueStripped = stripHtml(value),
|
||||||
|
regex = /\b\w+\b/g;
|
||||||
|
return this.optional(element) || valueStripped.match(regex).length >= params[0] && valueStripped.match(regex).length <= params[1];
|
||||||
|
}, $.validator.format("Please enter between {0} and {1} words."));
|
||||||
|
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Accept a value from a file input based on a required mimetype
|
||||||
|
$.validator.addMethod("accept", function(value, element, param) {
|
||||||
|
// Split mime on commas in case we have multiple types we can accept
|
||||||
|
var typeParam = typeof param === "string" ? param.replace(/\s/g, "").replace(/,/g, "|") : "image/*",
|
||||||
|
optionalValue = this.optional(element),
|
||||||
|
i, file;
|
||||||
|
|
||||||
|
// Element is optional
|
||||||
|
if (optionalValue) {
|
||||||
|
return optionalValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(element).attr("type") === "file") {
|
||||||
|
// If we are using a wildcard, make it regex friendly
|
||||||
|
typeParam = typeParam.replace(/\*/g, ".*");
|
||||||
|
|
||||||
|
// Check if the element has a FileList before checking each file
|
||||||
|
if (element.files && element.files.length) {
|
||||||
|
for (i = 0; i < element.files.length; i++) {
|
||||||
|
file = element.files[i];
|
||||||
|
|
||||||
|
// Grab the mimetype from the loaded file, verify it matches
|
||||||
|
if (!file.type.match(new RegExp( ".?(" + typeParam + ")$", "i"))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Either return true because we've validated each file, or because the
|
||||||
|
// browser does not support element.files and the FileList feature
|
||||||
|
return true;
|
||||||
|
}, $.validator.format("Please enter a value with a valid mimetype."));
|
||||||
|
|
||||||
|
$.validator.addMethod("alphanumeric", function(value, element) {
|
||||||
|
return this.optional(element) || /^\w+$/i.test(value);
|
||||||
|
}, "Letters, numbers, and underscores only please");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dutch bank account numbers (not 'giro' numbers) have 9 digits
|
||||||
|
* and pass the '11 check'.
|
||||||
|
* We accept the notation with spaces, as that is common.
|
||||||
|
* acceptable: 123456789 or 12 34 56 789
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("bankaccountNL", function(value, element) {
|
||||||
|
if (this.optional(element)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(value))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// now '11 check'
|
||||||
|
var account = value.replace(/ /g, ""), // remove spaces
|
||||||
|
sum = 0,
|
||||||
|
len = account.length,
|
||||||
|
pos, factor, digit;
|
||||||
|
for ( pos = 0; pos < len; pos++ ) {
|
||||||
|
factor = len - pos;
|
||||||
|
digit = account.substring(pos, pos + 1);
|
||||||
|
sum = sum + factor * digit;
|
||||||
|
}
|
||||||
|
return sum % 11 === 0;
|
||||||
|
}, "Please specify a valid bank account number");
|
||||||
|
|
||||||
|
$.validator.addMethod("bankorgiroaccountNL", function(value, element) {
|
||||||
|
return this.optional(element) ||
|
||||||
|
($.validator.methods.bankaccountNL.call(this, value, element)) ||
|
||||||
|
($.validator.methods.giroaccountNL.call(this, value, element));
|
||||||
|
}, "Please specify a valid bank or giro account number");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
|
||||||
|
*
|
||||||
|
* BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
|
||||||
|
*
|
||||||
|
* BIC definition in detail:
|
||||||
|
* - First 4 characters - bank code (only letters)
|
||||||
|
* - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
|
||||||
|
* - Next 2 characters - location code (letters and digits)
|
||||||
|
* a. shall not start with '0' or '1'
|
||||||
|
* b. second character must be a letter ('O' is not allowed) or one of the following digits ('0' for test (therefore not allowed), '1' for passive participant and '2' for active participant)
|
||||||
|
* - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("bic", function(value, element) {
|
||||||
|
return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value );
|
||||||
|
}, "Please specify a valid BIC code");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
|
||||||
|
* Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
|
||||||
|
*/
|
||||||
|
$.validator.addMethod( "cifES", function( value ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var num = [],
|
||||||
|
controlDigit, sum, i, count, tmp, secondDigit;
|
||||||
|
|
||||||
|
value = value.toUpperCase();
|
||||||
|
|
||||||
|
// Quick format test
|
||||||
|
if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; i < 9; i++ ) {
|
||||||
|
num[ i ] = parseInt( value.charAt( i ), 10 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Algorithm for checking CIF codes
|
||||||
|
sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
|
||||||
|
for ( count = 1; count < 8; count += 2 ) {
|
||||||
|
tmp = ( 2 * num[ count ] ).toString();
|
||||||
|
secondDigit = tmp.charAt( 1 );
|
||||||
|
|
||||||
|
sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The first (position 1) is a letter following the following criteria:
|
||||||
|
* A. Corporations
|
||||||
|
* B. LLCs
|
||||||
|
* C. General partnerships
|
||||||
|
* D. Companies limited partnerships
|
||||||
|
* E. Communities of goods
|
||||||
|
* F. Cooperative Societies
|
||||||
|
* G. Associations
|
||||||
|
* H. Communities of homeowners in horizontal property regime
|
||||||
|
* J. Civil Societies
|
||||||
|
* K. Old format
|
||||||
|
* L. Old format
|
||||||
|
* M. Old format
|
||||||
|
* N. Nonresident entities
|
||||||
|
* P. Local authorities
|
||||||
|
* Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
|
||||||
|
* R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
|
||||||
|
* S. Organs of State Administration and regions
|
||||||
|
* V. Agrarian Transformation
|
||||||
|
* W. Permanent establishments of non-resident in Spain
|
||||||
|
*/
|
||||||
|
if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
|
||||||
|
sum += "";
|
||||||
|
controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
|
||||||
|
value += controlDigit;
|
||||||
|
return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}, "Please specify a valid CIF number." );
|
||||||
|
|
||||||
|
/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
|
||||||
|
* Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("creditcardtypes", function(value, element, param) {
|
||||||
|
if (/[^0-9\-]+/.test(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = value.replace(/\D/g, "");
|
||||||
|
|
||||||
|
var validTypes = 0x0000;
|
||||||
|
|
||||||
|
if (param.mastercard) {
|
||||||
|
validTypes |= 0x0001;
|
||||||
|
}
|
||||||
|
if (param.visa) {
|
||||||
|
validTypes |= 0x0002;
|
||||||
|
}
|
||||||
|
if (param.amex) {
|
||||||
|
validTypes |= 0x0004;
|
||||||
|
}
|
||||||
|
if (param.dinersclub) {
|
||||||
|
validTypes |= 0x0008;
|
||||||
|
}
|
||||||
|
if (param.enroute) {
|
||||||
|
validTypes |= 0x0010;
|
||||||
|
}
|
||||||
|
if (param.discover) {
|
||||||
|
validTypes |= 0x0020;
|
||||||
|
}
|
||||||
|
if (param.jcb) {
|
||||||
|
validTypes |= 0x0040;
|
||||||
|
}
|
||||||
|
if (param.unknown) {
|
||||||
|
validTypes |= 0x0080;
|
||||||
|
}
|
||||||
|
if (param.all) {
|
||||||
|
validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
|
||||||
|
return value.length === 16;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
|
||||||
|
return value.length === 16;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
|
||||||
|
return value.length === 15;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
|
||||||
|
return value.length === 14;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
|
||||||
|
return value.length === 15;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
|
||||||
|
return value.length === 16;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
|
||||||
|
return value.length === 16;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
|
||||||
|
return value.length === 15;
|
||||||
|
}
|
||||||
|
if (validTypes & 0x0080) { //unknown
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}, "Please enter a valid credit card number.");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates currencies with any given symbols by @jameslouiz
|
||||||
|
* Symbols can be optional or required. Symbols required by default
|
||||||
|
*
|
||||||
|
* Usage examples:
|
||||||
|
* currency: ["£", false] - Use false for soft currency validation
|
||||||
|
* currency: ["$", false]
|
||||||
|
* currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc
|
||||||
|
*
|
||||||
|
* <input class="currencyInput" name="currencyInput">
|
||||||
|
*
|
||||||
|
* Soft symbol checking
|
||||||
|
* currencyInput: {
|
||||||
|
* currency: ["$", false]
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Strict symbol checking (default)
|
||||||
|
* currencyInput: {
|
||||||
|
* currency: "$"
|
||||||
|
* //OR
|
||||||
|
* currency: ["$", true]
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Multiple Symbols
|
||||||
|
* currencyInput: {
|
||||||
|
* currency: "$,£,¢"
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("currency", function(value, element, param) {
|
||||||
|
var isParamString = typeof param === "string",
|
||||||
|
symbol = isParamString ? param : param[0],
|
||||||
|
soft = isParamString ? true : param[1],
|
||||||
|
regex;
|
||||||
|
|
||||||
|
symbol = symbol.replace(/,/g, "");
|
||||||
|
symbol = soft ? symbol + "]" : symbol + "]?";
|
||||||
|
regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
|
||||||
|
regex = new RegExp(regex);
|
||||||
|
return this.optional(element) || regex.test(value);
|
||||||
|
|
||||||
|
}, "Please specify a valid currency");
|
||||||
|
|
||||||
|
$.validator.addMethod("dateFA", function(value, element) {
|
||||||
|
return this.optional(element) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(value);
|
||||||
|
}, "Please enter a correct date");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
|
||||||
|
*
|
||||||
|
* @example $.validator.methods.date("01/01/1900")
|
||||||
|
* @result true
|
||||||
|
*
|
||||||
|
* @example $.validator.methods.date("01/13/1990")
|
||||||
|
* @result false
|
||||||
|
*
|
||||||
|
* @example $.validator.methods.date("01.01.1900")
|
||||||
|
* @result false
|
||||||
|
*
|
||||||
|
* @example <input name="pippo" class="{dateITA:true}" />
|
||||||
|
* @desc Declares an optional input element whose value must be a valid date.
|
||||||
|
*
|
||||||
|
* @name $.validator.methods.dateITA
|
||||||
|
* @type Boolean
|
||||||
|
* @cat Plugins/Validate/Methods
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("dateITA", function(value, element) {
|
||||||
|
var check = false,
|
||||||
|
re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
|
||||||
|
adata, gg, mm, aaaa, xdata;
|
||||||
|
if ( re.test(value)) {
|
||||||
|
adata = value.split("/");
|
||||||
|
gg = parseInt(adata[0], 10);
|
||||||
|
mm = parseInt(adata[1], 10);
|
||||||
|
aaaa = parseInt(adata[2], 10);
|
||||||
|
xdata = new Date(Date.UTC(aaaa, mm - 1, gg, 12, 0, 0, 0));
|
||||||
|
if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
|
||||||
|
check = true;
|
||||||
|
} else {
|
||||||
|
check = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
check = false;
|
||||||
|
}
|
||||||
|
return this.optional(element) || check;
|
||||||
|
}, "Please enter a correct date");
|
||||||
|
|
||||||
|
$.validator.addMethod("dateNL", function(value, element) {
|
||||||
|
return this.optional(element) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(value);
|
||||||
|
}, "Please enter a correct date");
|
||||||
|
|
||||||
|
// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
|
||||||
|
$.validator.addMethod("extension", function(value, element, param) {
|
||||||
|
param = typeof param === "string" ? param.replace(/,/g, "|") : "png|jpe?g|gif";
|
||||||
|
return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
|
||||||
|
}, $.validator.format("Please enter a value with a valid extension."));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dutch giro account numbers (not bank numbers) have max 7 digits
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("giroaccountNL", function(value, element) {
|
||||||
|
return this.optional(element) || /^[0-9]{1,7}$/.test(value);
|
||||||
|
}, "Please specify a valid giro account number");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IBAN is the international bank account number.
|
||||||
|
* It has a country - specific format, that is checked here too
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("iban", function(value, element) {
|
||||||
|
// some quick simple tests to prevent needless work
|
||||||
|
if (this.optional(element)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove spaces and to upper case
|
||||||
|
var iban = value.replace(/ /g, "").toUpperCase(),
|
||||||
|
ibancheckdigits = "",
|
||||||
|
leadingZeroes = true,
|
||||||
|
cRest = "",
|
||||||
|
cOperator = "",
|
||||||
|
countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
|
||||||
|
|
||||||
|
if (!(/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(iban))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check the country code and find the country specific format
|
||||||
|
countrycode = iban.substring(0, 2);
|
||||||
|
bbancountrypatterns = {
|
||||||
|
"AL": "\\d{8}[\\dA-Z]{16}",
|
||||||
|
"AD": "\\d{8}[\\dA-Z]{12}",
|
||||||
|
"AT": "\\d{16}",
|
||||||
|
"AZ": "[\\dA-Z]{4}\\d{20}",
|
||||||
|
"BE": "\\d{12}",
|
||||||
|
"BH": "[A-Z]{4}[\\dA-Z]{14}",
|
||||||
|
"BA": "\\d{16}",
|
||||||
|
"BR": "\\d{23}[A-Z][\\dA-Z]",
|
||||||
|
"BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
|
||||||
|
"CR": "\\d{17}",
|
||||||
|
"HR": "\\d{17}",
|
||||||
|
"CY": "\\d{8}[\\dA-Z]{16}",
|
||||||
|
"CZ": "\\d{20}",
|
||||||
|
"DK": "\\d{14}",
|
||||||
|
"DO": "[A-Z]{4}\\d{20}",
|
||||||
|
"EE": "\\d{16}",
|
||||||
|
"FO": "\\d{14}",
|
||||||
|
"FI": "\\d{14}",
|
||||||
|
"FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
|
||||||
|
"GE": "[\\dA-Z]{2}\\d{16}",
|
||||||
|
"DE": "\\d{18}",
|
||||||
|
"GI": "[A-Z]{4}[\\dA-Z]{15}",
|
||||||
|
"GR": "\\d{7}[\\dA-Z]{16}",
|
||||||
|
"GL": "\\d{14}",
|
||||||
|
"GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
|
||||||
|
"HU": "\\d{24}",
|
||||||
|
"IS": "\\d{22}",
|
||||||
|
"IE": "[\\dA-Z]{4}\\d{14}",
|
||||||
|
"IL": "\\d{19}",
|
||||||
|
"IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
|
||||||
|
"KZ": "\\d{3}[\\dA-Z]{13}",
|
||||||
|
"KW": "[A-Z]{4}[\\dA-Z]{22}",
|
||||||
|
"LV": "[A-Z]{4}[\\dA-Z]{13}",
|
||||||
|
"LB": "\\d{4}[\\dA-Z]{20}",
|
||||||
|
"LI": "\\d{5}[\\dA-Z]{12}",
|
||||||
|
"LT": "\\d{16}",
|
||||||
|
"LU": "\\d{3}[\\dA-Z]{13}",
|
||||||
|
"MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
|
||||||
|
"MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
|
||||||
|
"MR": "\\d{23}",
|
||||||
|
"MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
|
||||||
|
"MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
|
||||||
|
"MD": "[\\dA-Z]{2}\\d{18}",
|
||||||
|
"ME": "\\d{18}",
|
||||||
|
"NL": "[A-Z]{4}\\d{10}",
|
||||||
|
"NO": "\\d{11}",
|
||||||
|
"PK": "[\\dA-Z]{4}\\d{16}",
|
||||||
|
"PS": "[\\dA-Z]{4}\\d{21}",
|
||||||
|
"PL": "\\d{24}",
|
||||||
|
"PT": "\\d{21}",
|
||||||
|
"RO": "[A-Z]{4}[\\dA-Z]{16}",
|
||||||
|
"SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
|
||||||
|
"SA": "\\d{2}[\\dA-Z]{18}",
|
||||||
|
"RS": "\\d{18}",
|
||||||
|
"SK": "\\d{20}",
|
||||||
|
"SI": "\\d{15}",
|
||||||
|
"ES": "\\d{20}",
|
||||||
|
"SE": "\\d{20}",
|
||||||
|
"CH": "\\d{5}[\\dA-Z]{12}",
|
||||||
|
"TN": "\\d{20}",
|
||||||
|
"TR": "\\d{5}[\\dA-Z]{17}",
|
||||||
|
"AE": "\\d{3}\\d{16}",
|
||||||
|
"GB": "[A-Z]{4}\\d{14}",
|
||||||
|
"VG": "[\\dA-Z]{4}\\d{16}"
|
||||||
|
};
|
||||||
|
|
||||||
|
bbanpattern = bbancountrypatterns[countrycode];
|
||||||
|
// As new countries will start using IBAN in the
|
||||||
|
// future, we only check if the countrycode is known.
|
||||||
|
// This prevents false negatives, while almost all
|
||||||
|
// false positives introduced by this, will be caught
|
||||||
|
// by the checksum validation below anyway.
|
||||||
|
// Strict checking should return FALSE for unknown
|
||||||
|
// countries.
|
||||||
|
if (typeof bbanpattern !== "undefined") {
|
||||||
|
ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
|
||||||
|
if (!(ibanregexp.test(iban))) {
|
||||||
|
return false; // invalid country specific format
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check the checksum, first convert to digits
|
||||||
|
ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);
|
||||||
|
for (i = 0; i < ibancheck.length; i++) {
|
||||||
|
charAt = ibancheck.charAt(i);
|
||||||
|
if (charAt !== "0") {
|
||||||
|
leadingZeroes = false;
|
||||||
|
}
|
||||||
|
if (!leadingZeroes) {
|
||||||
|
ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the result of: ibancheckdigits % 97
|
||||||
|
for (p = 0; p < ibancheckdigits.length; p++) {
|
||||||
|
cChar = ibancheckdigits.charAt(p);
|
||||||
|
cOperator = "" + cRest + "" + cChar;
|
||||||
|
cRest = cOperator % 97;
|
||||||
|
}
|
||||||
|
return cRest === 1;
|
||||||
|
}, "Please specify a valid IBAN");
|
||||||
|
|
||||||
|
$.validator.addMethod("integer", function(value, element) {
|
||||||
|
return this.optional(element) || /^-?\d+$/.test(value);
|
||||||
|
}, "A positive or negative non-decimal number please");
|
||||||
|
|
||||||
|
$.validator.addMethod("ipv4", function(value, element) {
|
||||||
|
return this.optional(element) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value);
|
||||||
|
}, "Please enter a valid IP v4 address.");
|
||||||
|
|
||||||
|
$.validator.addMethod("ipv6", function(value, element) {
|
||||||
|
return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
|
||||||
|
}, "Please enter a valid IP v6 address.");
|
||||||
|
|
||||||
|
$.validator.addMethod("lettersonly", function(value, element) {
|
||||||
|
return this.optional(element) || /^[a-z]+$/i.test(value);
|
||||||
|
}, "Letters only please");
|
||||||
|
|
||||||
|
$.validator.addMethod("letterswithbasicpunc", function(value, element) {
|
||||||
|
return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
|
||||||
|
}, "Letters or punctuation only please");
|
||||||
|
|
||||||
|
$.validator.addMethod("mobileNL", function(value, element) {
|
||||||
|
return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
|
||||||
|
}, "Please specify a valid mobile number");
|
||||||
|
|
||||||
|
/* For UK phone functions, do the following server side processing:
|
||||||
|
* Compare original input with this RegEx pattern:
|
||||||
|
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||||
|
* Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
|
||||||
|
* Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
|
||||||
|
* A number of very detailed GB telephone number RegEx patterns can also be found at:
|
||||||
|
* http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("mobileUK", function(phone_number, element) {
|
||||||
|
phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
|
||||||
|
return this.optional(element) || phone_number.length > 9 &&
|
||||||
|
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/);
|
||||||
|
}, "Please specify a valid mobile number");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
|
||||||
|
*/
|
||||||
|
$.validator.addMethod( "nieES", function( value ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
value = value.toUpperCase();
|
||||||
|
|
||||||
|
// Basic format test
|
||||||
|
if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test NIE
|
||||||
|
//T
|
||||||
|
if ( /^[T]{1}/.test( value ) ) {
|
||||||
|
return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//XYZ
|
||||||
|
if ( /^[XYZ]{1}/.test( value ) ) {
|
||||||
|
return (
|
||||||
|
value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
|
||||||
|
value.replace( "X", "0" )
|
||||||
|
.replace( "Y", "1" )
|
||||||
|
.replace( "Z", "2" )
|
||||||
|
.substring( 0, 8 ) % 23
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}, "Please specify a valid NIE number." );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
|
||||||
|
*/
|
||||||
|
$.validator.addMethod( "nifES", function( value ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
value = value.toUpperCase();
|
||||||
|
|
||||||
|
// Basic format test
|
||||||
|
if ( !value.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)") ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test NIF
|
||||||
|
if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
|
||||||
|
return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
|
||||||
|
}
|
||||||
|
// Test specials NIF (starts with K, L or M)
|
||||||
|
if ( /^[KLM]{1}/.test( value ) ) {
|
||||||
|
return ( value[ 8 ] === String.fromCharCode( 64 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}, "Please specify a valid NIF number." );
|
||||||
|
|
||||||
|
$.validator.addMethod("nowhitespace", function(value, element) {
|
||||||
|
return this.optional(element) || /^\S+$/i.test(value);
|
||||||
|
}, "No white space please");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the field value matches the given format RegExp
|
||||||
|
*
|
||||||
|
* @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/)
|
||||||
|
* @result true
|
||||||
|
*
|
||||||
|
* @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/)
|
||||||
|
* @result false
|
||||||
|
*
|
||||||
|
* @name $.validator.methods.pattern
|
||||||
|
* @type Boolean
|
||||||
|
* @cat Plugins/Validate/Methods
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("pattern", function(value, element, param) {
|
||||||
|
if (this.optional(element)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeof param === "string") {
|
||||||
|
param = new RegExp("^(?:" + param + ")$");
|
||||||
|
}
|
||||||
|
return param.test(value);
|
||||||
|
}, "Invalid format.");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dutch phone numbers have 10 digits (or 11 and start with +31).
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("phoneNL", function(value, element) {
|
||||||
|
return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
|
||||||
|
}, "Please specify a valid phone number.");
|
||||||
|
|
||||||
|
/* For UK phone functions, do the following server side processing:
|
||||||
|
* Compare original input with this RegEx pattern:
|
||||||
|
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||||
|
* Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
|
||||||
|
* Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
|
||||||
|
* A number of very detailed GB telephone number RegEx patterns can also be found at:
|
||||||
|
* http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("phoneUK", function(phone_number, element) {
|
||||||
|
phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
|
||||||
|
return this.optional(element) || phone_number.length > 9 &&
|
||||||
|
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/);
|
||||||
|
}, "Please specify a valid phone number");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* matches US phone number format
|
||||||
|
*
|
||||||
|
* where the area code may not start with 1 and the prefix may not start with 1
|
||||||
|
* allows '-' or ' ' as a separator and allows parens around area code
|
||||||
|
* some people may want to put a '1' in front of their number
|
||||||
|
*
|
||||||
|
* 1(212)-999-2345 or
|
||||||
|
* 212 999 2344 or
|
||||||
|
* 212-999-0983
|
||||||
|
*
|
||||||
|
* but not
|
||||||
|
* 111-123-5434
|
||||||
|
* and not
|
||||||
|
* 212 123 4567
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("phoneUS", function(phone_number, element) {
|
||||||
|
phone_number = phone_number.replace(/\s+/g, "");
|
||||||
|
return this.optional(element) || phone_number.length > 9 &&
|
||||||
|
phone_number.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/);
|
||||||
|
}, "Please specify a valid phone number");
|
||||||
|
|
||||||
|
/* For UK phone functions, do the following server side processing:
|
||||||
|
* Compare original input with this RegEx pattern:
|
||||||
|
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||||
|
* Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
|
||||||
|
* Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
|
||||||
|
* A number of very detailed GB telephone number RegEx patterns can also be found at:
|
||||||
|
* http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
|
||||||
|
*/
|
||||||
|
//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
|
||||||
|
$.validator.addMethod("phonesUK", function(phone_number, element) {
|
||||||
|
phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
|
||||||
|
return this.optional(element) || phone_number.length > 9 &&
|
||||||
|
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/);
|
||||||
|
}, "Please specify a valid uk phone number");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches a valid Canadian Postal Code
|
||||||
|
*
|
||||||
|
* @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element )
|
||||||
|
* @result true
|
||||||
|
*
|
||||||
|
* @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element )
|
||||||
|
* @result false
|
||||||
|
*
|
||||||
|
* @name jQuery.validator.methods.postalCodeCA
|
||||||
|
* @type Boolean
|
||||||
|
* @cat Plugins/Validate/Methods
|
||||||
|
*/
|
||||||
|
$.validator.addMethod( "postalCodeCA", function( value, element ) {
|
||||||
|
return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test( value );
|
||||||
|
}, "Please specify a valid postal code" );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Valida CEPs do brasileiros:
|
||||||
|
*
|
||||||
|
* Formatos aceitos:
|
||||||
|
* 99999-999
|
||||||
|
* 99.999-999
|
||||||
|
* 99999999
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("postalcodeBR", function(cep_value, element) {
|
||||||
|
return this.optional(element) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
|
||||||
|
}, "Informe um CEP válido.");
|
||||||
|
|
||||||
|
/* Matches Italian postcode (CAP) */
|
||||||
|
$.validator.addMethod("postalcodeIT", function(value, element) {
|
||||||
|
return this.optional(element) || /^\d{5}$/.test(value);
|
||||||
|
}, "Please specify a valid postal code");
|
||||||
|
|
||||||
|
$.validator.addMethod("postalcodeNL", function(value, element) {
|
||||||
|
return this.optional(element) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(value);
|
||||||
|
}, "Please specify a valid postal code");
|
||||||
|
|
||||||
|
// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
|
||||||
|
$.validator.addMethod("postcodeUK", function(value, element) {
|
||||||
|
return this.optional(element) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(value);
|
||||||
|
}, "Please specify a valid UK postcode");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lets you say "at least X inputs that match selector Y must be filled."
|
||||||
|
*
|
||||||
|
* The end result is that neither of these inputs:
|
||||||
|
*
|
||||||
|
* <input class="productinfo" name="partnumber">
|
||||||
|
* <input class="productinfo" name="description">
|
||||||
|
*
|
||||||
|
* ...will validate unless at least one of them is filled.
|
||||||
|
*
|
||||||
|
* partnumber: {require_from_group: [1,".productinfo"]},
|
||||||
|
* description: {require_from_group: [1,".productinfo"]}
|
||||||
|
*
|
||||||
|
* options[0]: number of fields that must be filled in the group
|
||||||
|
* options[1]: CSS selector that defines the group of conditionally required fields
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("require_from_group", function(value, element, options) {
|
||||||
|
var $fields = $(options[1], element.form),
|
||||||
|
$fieldsFirst = $fields.eq(0),
|
||||||
|
validator = $fieldsFirst.data("valid_req_grp") ? $fieldsFirst.data("valid_req_grp") : $.extend({}, this),
|
||||||
|
isValid = $fields.filter(function() {
|
||||||
|
return validator.elementValue(this);
|
||||||
|
}).length >= options[0];
|
||||||
|
|
||||||
|
// Store the cloned validator for future validation
|
||||||
|
$fieldsFirst.data("valid_req_grp", validator);
|
||||||
|
|
||||||
|
// If element isn't being validated, run each require_from_group field's validation rules
|
||||||
|
if (!$(element).data("being_validated")) {
|
||||||
|
$fields.data("being_validated", true);
|
||||||
|
$fields.each(function() {
|
||||||
|
validator.element(this);
|
||||||
|
});
|
||||||
|
$fields.data("being_validated", false);
|
||||||
|
}
|
||||||
|
return isValid;
|
||||||
|
}, $.validator.format("Please fill at least {0} of these fields."));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lets you say "either at least X inputs that match selector Y must be filled,
|
||||||
|
* OR they must all be skipped (left blank)."
|
||||||
|
*
|
||||||
|
* The end result, is that none of these inputs:
|
||||||
|
*
|
||||||
|
* <input class="productinfo" name="partnumber">
|
||||||
|
* <input class="productinfo" name="description">
|
||||||
|
* <input class="productinfo" name="color">
|
||||||
|
*
|
||||||
|
* ...will validate unless either at least two of them are filled,
|
||||||
|
* OR none of them are.
|
||||||
|
*
|
||||||
|
* partnumber: {skip_or_fill_minimum: [2,".productinfo"]},
|
||||||
|
* description: {skip_or_fill_minimum: [2,".productinfo"]},
|
||||||
|
* color: {skip_or_fill_minimum: [2,".productinfo"]}
|
||||||
|
*
|
||||||
|
* options[0]: number of fields that must be filled in the group
|
||||||
|
* options[1]: CSS selector that defines the group of conditionally required fields
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
|
||||||
|
var $fields = $(options[1], element.form),
|
||||||
|
$fieldsFirst = $fields.eq(0),
|
||||||
|
validator = $fieldsFirst.data("valid_skip") ? $fieldsFirst.data("valid_skip") : $.extend({}, this),
|
||||||
|
numberFilled = $fields.filter(function() {
|
||||||
|
return validator.elementValue(this);
|
||||||
|
}).length,
|
||||||
|
isValid = numberFilled === 0 || numberFilled >= options[0];
|
||||||
|
|
||||||
|
// Store the cloned validator for future validation
|
||||||
|
$fieldsFirst.data("valid_skip", validator);
|
||||||
|
|
||||||
|
// If element isn't being validated, run each skip_or_fill_minimum field's validation rules
|
||||||
|
if (!$(element).data("being_validated")) {
|
||||||
|
$fields.data("being_validated", true);
|
||||||
|
$fields.each(function() {
|
||||||
|
validator.element(this);
|
||||||
|
});
|
||||||
|
$fields.data("being_validated", false);
|
||||||
|
}
|
||||||
|
return isValid;
|
||||||
|
}, $.validator.format("Please either skip these fields or fill at least {0} of them."));
|
||||||
|
|
||||||
|
/* Validates US States and/or Territories by @jdforsythe
|
||||||
|
* Can be case insensitive or require capitalization - default is case insensitive
|
||||||
|
* Can include US Territories or not - default does not
|
||||||
|
* Can include US Military postal abbreviations (AA, AE, AP) - default does not
|
||||||
|
*
|
||||||
|
* Note: "States" always includes DC (District of Colombia)
|
||||||
|
*
|
||||||
|
* Usage examples:
|
||||||
|
*
|
||||||
|
* This is the default - case insensitive, no territories, no military zones
|
||||||
|
* stateInput: {
|
||||||
|
* caseSensitive: false,
|
||||||
|
* includeTerritories: false,
|
||||||
|
* includeMilitary: false
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Only allow capital letters, no territories, no military zones
|
||||||
|
* stateInput: {
|
||||||
|
* caseSensitive: false
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Case insensitive, include territories but not military zones
|
||||||
|
* stateInput: {
|
||||||
|
* includeTerritories: true
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Only allow capital letters, include territories and military zones
|
||||||
|
* stateInput: {
|
||||||
|
* caseSensitive: true,
|
||||||
|
* includeTerritories: true,
|
||||||
|
* includeMilitary: true
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
jQuery.validator.addMethod("stateUS", function(value, element, options) {
|
||||||
|
var isDefault = typeof options === "undefined",
|
||||||
|
caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
|
||||||
|
includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
|
||||||
|
includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
|
||||||
|
regex;
|
||||||
|
|
||||||
|
if (!includeTerritories && !includeMilitary) {
|
||||||
|
regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
|
||||||
|
} else if (includeTerritories && includeMilitary) {
|
||||||
|
regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
|
||||||
|
} else if (includeTerritories) {
|
||||||
|
regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
|
||||||
|
} else {
|
||||||
|
regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
|
||||||
|
}
|
||||||
|
|
||||||
|
regex = caseSensitive ? new RegExp(regex) : new RegExp(regex, "i");
|
||||||
|
return this.optional(element) || regex.test(value);
|
||||||
|
},
|
||||||
|
"Please specify a valid state");
|
||||||
|
|
||||||
|
// TODO check if value starts with <, otherwise don't try stripping anything
|
||||||
|
$.validator.addMethod("strippedminlength", function(value, element, param) {
|
||||||
|
return $(value).text().length >= param;
|
||||||
|
}, $.validator.format("Please enter at least {0} characters"));
|
||||||
|
|
||||||
|
$.validator.addMethod("time", function(value, element) {
|
||||||
|
return this.optional(element) || /^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(value);
|
||||||
|
}, "Please enter a valid time, between 00:00 and 23:59");
|
||||||
|
|
||||||
|
$.validator.addMethod("time12h", function(value, element) {
|
||||||
|
return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(value);
|
||||||
|
}, "Please enter a valid time in 12-hour am/pm format");
|
||||||
|
|
||||||
|
// same as url, but TLD is optional
|
||||||
|
$.validator.addMethod("url2", function(value, element) {
|
||||||
|
return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
|
||||||
|
}, $.validator.messages.url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true, if the value is a valid vehicle identification number (VIN).
|
||||||
|
*
|
||||||
|
* Works with all kind of text inputs.
|
||||||
|
*
|
||||||
|
* @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
|
||||||
|
* @desc Declares a required input element whose value must be a valid vehicle identification number.
|
||||||
|
*
|
||||||
|
* @name $.validator.methods.vinUS
|
||||||
|
* @type Boolean
|
||||||
|
* @cat Plugins/Validate/Methods
|
||||||
|
*/
|
||||||
|
$.validator.addMethod("vinUS", function(v) {
|
||||||
|
if (v.length !== 17) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ],
|
||||||
|
VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],
|
||||||
|
FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],
|
||||||
|
rs = 0,
|
||||||
|
i, n, d, f, cd, cdv;
|
||||||
|
|
||||||
|
for (i = 0; i < 17; i++) {
|
||||||
|
f = FL[i];
|
||||||
|
d = v.slice(i, i + 1);
|
||||||
|
if (i === 8) {
|
||||||
|
cdv = d;
|
||||||
|
}
|
||||||
|
if (!isNaN(d)) {
|
||||||
|
d *= f;
|
||||||
|
} else {
|
||||||
|
for (n = 0; n < LL.length; n++) {
|
||||||
|
if (d.toUpperCase() === LL[n]) {
|
||||||
|
d = VL[n];
|
||||||
|
d *= f;
|
||||||
|
if (isNaN(cdv) && n === 8) {
|
||||||
|
cdv = LL[n];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rs += d;
|
||||||
|
}
|
||||||
|
cd = rs % 11;
|
||||||
|
if (cd === 10) {
|
||||||
|
cd = "X";
|
||||||
|
}
|
||||||
|
if (cd === cdv) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}, "The specified vehicle identification number (VIN) is invalid.");
|
||||||
|
|
||||||
|
$.validator.addMethod("zipcodeUS", function(value, element) {
|
||||||
|
return this.optional(element) || /^\d{5}(-\d{4})?$/.test(value);
|
||||||
|
}, "The specified US ZIP Code is invalid");
|
||||||
|
|
||||||
|
$.validator.addMethod("ziprange", function(value, element) {
|
||||||
|
return this.optional(element) || /^90[2-5]\d\{2\}-\d{4}$/.test(value);
|
||||||
|
}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx");
|
||||||
|
|
||||||
|
}));
|
4
thirdparty/jquery-validate/additional-methods.min.js
vendored
Normal file
4
thirdparty/jquery-validate/additional-methods.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
|
||||||
|
* http://jqueryvalidation.org/
|
||||||
|
* Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
|
||||||
|
!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g="string"==typeof d?d.replace(/\s/g,"").replace(/,/g,"|"):"image/*",h=this.optional(c);if(h)return h;if("file"===a(c).attr("type")&&(g=g.replace(/\*/g,".*"),c.files&&c.files.length))for(e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(new RegExp(".?("+g+")$","i")))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;h>c;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a)},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";var b,c,d,e,f,g,h=[];if(a=a.toUpperCase(),!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)"))return!1;for(d=0;9>d;d++)h[d]=parseInt(a.charAt(d),10);for(c=h[2]+h[4]+h[6],e=1;8>e;e+=2)f=(2*h[e]).toString(),g=f.charAt(1),c+=parseInt(f.charAt(0),10)+(""===g?0:parseInt(g,10));return/^[ABCDEFGHJNPQRSUVW]{1}/.test(a)?(c+="",b=10-parseInt(c.charAt(c.length-1),10),a+=b,h[8].toString()===String.fromCharCode(64+b)||h[8].toString()===a.charAt(a.length-1)):!1},"Please specify a valid CIF number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:128&d?!0:!1},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=e?!0:c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},"Please enter a correct date"),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(f,e-1,d,12,0,0,0),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d?!0:!1):h=!1,this.optional(b)||h},"Please enter a correct date"),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},"Please enter a correct date"),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp(".("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="";if(!/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(l))return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):/^[XYZ]{1}/.test(a)?a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23):!1:!1},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):/^[KLM]{1}/.test(a)?a[8]===String.fromCharCode(64):!1:!1},"Please specify a valid NIF number."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return this.optional(b)?!0:("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),jQuery.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=e||"undefined"==typeof c.caseSensitive?!1:c.caseSensitive,g=e||"undefined"==typeof c.includeTerritories?!1:c.includeTerritories,h=e||"undefined"==typeof c.includeMilitary?!1:c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;17>b;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g?!0:!1},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx")});
|
1365
thirdparty/jquery-validate/jquery.validate.js
vendored
Normal file
1365
thirdparty/jquery-validate/jquery.validate.js
vendored
Normal file
@ -0,0 +1,1365 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery Validation Plugin v1.13.1
|
||||||
|
*
|
||||||
|
* http://jqueryvalidation.org/
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Jörn Zaefferer
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
$.extend($.fn, {
|
||||||
|
// http://jqueryvalidation.org/validate/
|
||||||
|
validate: function( options ) {
|
||||||
|
|
||||||
|
// if nothing is selected, return nothing; can't chain anyway
|
||||||
|
if ( !this.length ) {
|
||||||
|
if ( options && options.debug && window.console ) {
|
||||||
|
console.warn( "Nothing selected, can't validate, returning nothing." );
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if a validator for this form was already created
|
||||||
|
var validator = $.data( this[ 0 ], "validator" );
|
||||||
|
if ( validator ) {
|
||||||
|
return validator;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add novalidate tag if HTML5.
|
||||||
|
this.attr( "novalidate", "novalidate" );
|
||||||
|
|
||||||
|
validator = new $.validator( options, this[ 0 ] );
|
||||||
|
$.data( this[ 0 ], "validator", validator );
|
||||||
|
|
||||||
|
if ( validator.settings.onsubmit ) {
|
||||||
|
|
||||||
|
this.validateDelegate( ":submit", "click", function( event ) {
|
||||||
|
if ( validator.settings.submitHandler ) {
|
||||||
|
validator.submitButton = event.target;
|
||||||
|
}
|
||||||
|
// allow suppressing validation by adding a cancel class to the submit button
|
||||||
|
if ( $( event.target ).hasClass( "cancel" ) ) {
|
||||||
|
validator.cancelSubmit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
|
||||||
|
if ( $( event.target ).attr( "formnovalidate" ) !== undefined ) {
|
||||||
|
validator.cancelSubmit = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// validate the form on submit
|
||||||
|
this.submit( function( event ) {
|
||||||
|
if ( validator.settings.debug ) {
|
||||||
|
// prevent form submit to be able to see console output
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
function handle() {
|
||||||
|
var hidden, result;
|
||||||
|
if ( validator.settings.submitHandler ) {
|
||||||
|
if ( validator.submitButton ) {
|
||||||
|
// insert a hidden input as a replacement for the missing submit button
|
||||||
|
hidden = $( "<input type='hidden'/>" )
|
||||||
|
.attr( "name", validator.submitButton.name )
|
||||||
|
.val( $( validator.submitButton ).val() )
|
||||||
|
.appendTo( validator.currentForm );
|
||||||
|
}
|
||||||
|
result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
|
||||||
|
if ( validator.submitButton ) {
|
||||||
|
// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
|
||||||
|
hidden.remove();
|
||||||
|
}
|
||||||
|
if ( result !== undefined ) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent submit for invalid forms or custom submit handlers
|
||||||
|
if ( validator.cancelSubmit ) {
|
||||||
|
validator.cancelSubmit = false;
|
||||||
|
return handle();
|
||||||
|
}
|
||||||
|
if ( validator.form() ) {
|
||||||
|
if ( validator.pendingRequest ) {
|
||||||
|
validator.formSubmitted = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return handle();
|
||||||
|
} else {
|
||||||
|
validator.focusInvalid();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return validator;
|
||||||
|
},
|
||||||
|
// http://jqueryvalidation.org/valid/
|
||||||
|
valid: function() {
|
||||||
|
var valid, validator;
|
||||||
|
|
||||||
|
if ( $( this[ 0 ] ).is( "form" ) ) {
|
||||||
|
valid = this.validate().form();
|
||||||
|
} else {
|
||||||
|
valid = true;
|
||||||
|
validator = $( this[ 0 ].form ).validate();
|
||||||
|
this.each( function() {
|
||||||
|
valid = validator.element( this ) && valid;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
|
},
|
||||||
|
// attributes: space separated list of attributes to retrieve and remove
|
||||||
|
removeAttrs: function( attributes ) {
|
||||||
|
var result = {},
|
||||||
|
$element = this;
|
||||||
|
$.each( attributes.split( /\s/ ), function( index, value ) {
|
||||||
|
result[ value ] = $element.attr( value );
|
||||||
|
$element.removeAttr( value );
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
// http://jqueryvalidation.org/rules/
|
||||||
|
rules: function( command, argument ) {
|
||||||
|
var element = this[ 0 ],
|
||||||
|
settings, staticRules, existingRules, data, param, filtered;
|
||||||
|
|
||||||
|
if ( command ) {
|
||||||
|
settings = $.data( element.form, "validator" ).settings;
|
||||||
|
staticRules = settings.rules;
|
||||||
|
existingRules = $.validator.staticRules( element );
|
||||||
|
switch ( command ) {
|
||||||
|
case "add":
|
||||||
|
$.extend( existingRules, $.validator.normalizeRule( argument ) );
|
||||||
|
// remove messages from rules, but allow them to be set separately
|
||||||
|
delete existingRules.messages;
|
||||||
|
staticRules[ element.name ] = existingRules;
|
||||||
|
if ( argument.messages ) {
|
||||||
|
settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "remove":
|
||||||
|
if ( !argument ) {
|
||||||
|
delete staticRules[ element.name ];
|
||||||
|
return existingRules;
|
||||||
|
}
|
||||||
|
filtered = {};
|
||||||
|
$.each( argument.split( /\s/ ), function( index, method ) {
|
||||||
|
filtered[ method ] = existingRules[ method ];
|
||||||
|
delete existingRules[ method ];
|
||||||
|
if ( method === "required" ) {
|
||||||
|
$( element ).removeAttr( "aria-required" );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data = $.validator.normalizeRules(
|
||||||
|
$.extend(
|
||||||
|
{},
|
||||||
|
$.validator.classRules( element ),
|
||||||
|
$.validator.attributeRules( element ),
|
||||||
|
$.validator.dataRules( element ),
|
||||||
|
$.validator.staticRules( element )
|
||||||
|
), element );
|
||||||
|
|
||||||
|
// make sure required is at front
|
||||||
|
if ( data.required ) {
|
||||||
|
param = data.required;
|
||||||
|
delete data.required;
|
||||||
|
data = $.extend( { required: param }, data );
|
||||||
|
$( element ).attr( "aria-required", "true" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure remote is at back
|
||||||
|
if ( data.remote ) {
|
||||||
|
param = data.remote;
|
||||||
|
delete data.remote;
|
||||||
|
data = $.extend( data, { remote: param });
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Custom selectors
|
||||||
|
$.extend( $.expr[ ":" ], {
|
||||||
|
// http://jqueryvalidation.org/blank-selector/
|
||||||
|
blank: function( a ) {
|
||||||
|
return !$.trim( "" + $( a ).val() );
|
||||||
|
},
|
||||||
|
// http://jqueryvalidation.org/filled-selector/
|
||||||
|
filled: function( a ) {
|
||||||
|
return !!$.trim( "" + $( a ).val() );
|
||||||
|
},
|
||||||
|
// http://jqueryvalidation.org/unchecked-selector/
|
||||||
|
unchecked: function( a ) {
|
||||||
|
return !$( a ).prop( "checked" );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// constructor for validator
|
||||||
|
$.validator = function( options, form ) {
|
||||||
|
this.settings = $.extend( true, {}, $.validator.defaults, options );
|
||||||
|
this.currentForm = form;
|
||||||
|
this.init();
|
||||||
|
};
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/jQuery.validator.format/
|
||||||
|
$.validator.format = function( source, params ) {
|
||||||
|
if ( arguments.length === 1 ) {
|
||||||
|
return function() {
|
||||||
|
var args = $.makeArray( arguments );
|
||||||
|
args.unshift( source );
|
||||||
|
return $.validator.format.apply( this, args );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if ( arguments.length > 2 && params.constructor !== Array ) {
|
||||||
|
params = $.makeArray( arguments ).slice( 1 );
|
||||||
|
}
|
||||||
|
if ( params.constructor !== Array ) {
|
||||||
|
params = [ params ];
|
||||||
|
}
|
||||||
|
$.each( params, function( i, n ) {
|
||||||
|
source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
|
||||||
|
return n;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return source;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.extend( $.validator, {
|
||||||
|
|
||||||
|
defaults: {
|
||||||
|
messages: {},
|
||||||
|
groups: {},
|
||||||
|
rules: {},
|
||||||
|
errorClass: "error",
|
||||||
|
validClass: "valid",
|
||||||
|
errorElement: "label",
|
||||||
|
focusCleanup: false,
|
||||||
|
focusInvalid: true,
|
||||||
|
errorContainer: $( [] ),
|
||||||
|
errorLabelContainer: $( [] ),
|
||||||
|
onsubmit: true,
|
||||||
|
ignore: ":hidden",
|
||||||
|
ignoreTitle: false,
|
||||||
|
onfocusin: function( element ) {
|
||||||
|
this.lastActive = element;
|
||||||
|
|
||||||
|
// Hide error label and remove error class on focus if enabled
|
||||||
|
if ( this.settings.focusCleanup ) {
|
||||||
|
if ( this.settings.unhighlight ) {
|
||||||
|
this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
|
||||||
|
}
|
||||||
|
this.hideThese( this.errorsFor( element ) );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onfocusout: function( element ) {
|
||||||
|
if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
|
||||||
|
this.element( element );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onkeyup: function( element, event ) {
|
||||||
|
if ( event.which === 9 && this.elementValue( element ) === "" ) {
|
||||||
|
return;
|
||||||
|
} else if ( element.name in this.submitted || element === this.lastElement ) {
|
||||||
|
this.element( element );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onclick: function( element ) {
|
||||||
|
// click on selects, radiobuttons and checkboxes
|
||||||
|
if ( element.name in this.submitted ) {
|
||||||
|
this.element( element );
|
||||||
|
|
||||||
|
// or option elements, check parent select in that case
|
||||||
|
} else if ( element.parentNode.name in this.submitted ) {
|
||||||
|
this.element( element.parentNode );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
highlight: function( element, errorClass, validClass ) {
|
||||||
|
if ( element.type === "radio" ) {
|
||||||
|
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
|
||||||
|
} else {
|
||||||
|
$( element ).addClass( errorClass ).removeClass( validClass );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
unhighlight: function( element, errorClass, validClass ) {
|
||||||
|
if ( element.type === "radio" ) {
|
||||||
|
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
|
||||||
|
} else {
|
||||||
|
$( element ).removeClass( errorClass ).addClass( validClass );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/jQuery.validator.setDefaults/
|
||||||
|
setDefaults: function( settings ) {
|
||||||
|
$.extend( $.validator.defaults, settings );
|
||||||
|
},
|
||||||
|
|
||||||
|
messages: {
|
||||||
|
required: "This field is required.",
|
||||||
|
remote: "Please fix this field.",
|
||||||
|
email: "Please enter a valid email address.",
|
||||||
|
url: "Please enter a valid URL.",
|
||||||
|
date: "Please enter a valid date.",
|
||||||
|
dateISO: "Please enter a valid date ( ISO ).",
|
||||||
|
number: "Please enter a valid number.",
|
||||||
|
digits: "Please enter only digits.",
|
||||||
|
creditcard: "Please enter a valid credit card number.",
|
||||||
|
equalTo: "Please enter the same value again.",
|
||||||
|
maxlength: $.validator.format( "Please enter no more than {0} characters." ),
|
||||||
|
minlength: $.validator.format( "Please enter at least {0} characters." ),
|
||||||
|
rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
|
||||||
|
range: $.validator.format( "Please enter a value between {0} and {1}." ),
|
||||||
|
max: $.validator.format( "Please enter a value less than or equal to {0}." ),
|
||||||
|
min: $.validator.format( "Please enter a value greater than or equal to {0}." )
|
||||||
|
},
|
||||||
|
|
||||||
|
autoCreateRanges: false,
|
||||||
|
|
||||||
|
prototype: {
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
this.labelContainer = $( this.settings.errorLabelContainer );
|
||||||
|
this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
|
||||||
|
this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
|
||||||
|
this.submitted = {};
|
||||||
|
this.valueCache = {};
|
||||||
|
this.pendingRequest = 0;
|
||||||
|
this.pending = {};
|
||||||
|
this.invalid = {};
|
||||||
|
this.reset();
|
||||||
|
|
||||||
|
var groups = ( this.groups = {} ),
|
||||||
|
rules;
|
||||||
|
$.each( this.settings.groups, function( key, value ) {
|
||||||
|
if ( typeof value === "string" ) {
|
||||||
|
value = value.split( /\s/ );
|
||||||
|
}
|
||||||
|
$.each( value, function( index, name ) {
|
||||||
|
groups[ name ] = key;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
rules = this.settings.rules;
|
||||||
|
$.each( rules, function( key, value ) {
|
||||||
|
rules[ key ] = $.validator.normalizeRule( value );
|
||||||
|
});
|
||||||
|
|
||||||
|
function delegate( event ) {
|
||||||
|
var validator = $.data( this[ 0 ].form, "validator" ),
|
||||||
|
eventType = "on" + event.type.replace( /^validate/, "" ),
|
||||||
|
settings = validator.settings;
|
||||||
|
if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
|
||||||
|
settings[ eventType ].call( validator, this[ 0 ], event );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$( this.currentForm )
|
||||||
|
.validateDelegate( ":text, [type='password'], [type='file'], select, textarea, " +
|
||||||
|
"[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
|
||||||
|
"[type='email'], [type='datetime'], [type='date'], [type='month'], " +
|
||||||
|
"[type='week'], [type='time'], [type='datetime-local'], " +
|
||||||
|
"[type='range'], [type='color'], [type='radio'], [type='checkbox']",
|
||||||
|
"focusin focusout keyup", delegate)
|
||||||
|
// Support: Chrome, oldIE
|
||||||
|
// "select" is provided as event.target when clicking a option
|
||||||
|
.validateDelegate("select, option, [type='radio'], [type='checkbox']", "click", delegate);
|
||||||
|
|
||||||
|
if ( this.settings.invalidHandler ) {
|
||||||
|
$( this.currentForm ).bind( "invalid-form.validate", this.settings.invalidHandler );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add aria-required to any Static/Data/Class required fields before first validation
|
||||||
|
// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
|
||||||
|
$( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/Validator.form/
|
||||||
|
form: function() {
|
||||||
|
this.checkForm();
|
||||||
|
$.extend( this.submitted, this.errorMap );
|
||||||
|
this.invalid = $.extend({}, this.errorMap );
|
||||||
|
if ( !this.valid() ) {
|
||||||
|
$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
|
||||||
|
}
|
||||||
|
this.showErrors();
|
||||||
|
return this.valid();
|
||||||
|
},
|
||||||
|
|
||||||
|
checkForm: function() {
|
||||||
|
this.prepareForm();
|
||||||
|
for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
|
||||||
|
this.check( elements[ i ] );
|
||||||
|
}
|
||||||
|
return this.valid();
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/Validator.element/
|
||||||
|
element: function( element ) {
|
||||||
|
var cleanElement = this.clean( element ),
|
||||||
|
checkElement = this.validationTargetFor( cleanElement ),
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
this.lastElement = checkElement;
|
||||||
|
|
||||||
|
if ( checkElement === undefined ) {
|
||||||
|
delete this.invalid[ cleanElement.name ];
|
||||||
|
} else {
|
||||||
|
this.prepareElement( checkElement );
|
||||||
|
this.currentElements = $( checkElement );
|
||||||
|
|
||||||
|
result = this.check( checkElement ) !== false;
|
||||||
|
if ( result ) {
|
||||||
|
delete this.invalid[ checkElement.name ];
|
||||||
|
} else {
|
||||||
|
this.invalid[ checkElement.name ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add aria-invalid status for screen readers
|
||||||
|
$( element ).attr( "aria-invalid", !result );
|
||||||
|
|
||||||
|
if ( !this.numberOfInvalids() ) {
|
||||||
|
// Hide error containers on last error
|
||||||
|
this.toHide = this.toHide.add( this.containers );
|
||||||
|
}
|
||||||
|
this.showErrors();
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/Validator.showErrors/
|
||||||
|
showErrors: function( errors ) {
|
||||||
|
if ( errors ) {
|
||||||
|
// add items to error list and map
|
||||||
|
$.extend( this.errorMap, errors );
|
||||||
|
this.errorList = [];
|
||||||
|
for ( var name in errors ) {
|
||||||
|
this.errorList.push({
|
||||||
|
message: errors[ name ],
|
||||||
|
element: this.findByName( name )[ 0 ]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// remove items from success list
|
||||||
|
this.successList = $.grep( this.successList, function( element ) {
|
||||||
|
return !( element.name in errors );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if ( this.settings.showErrors ) {
|
||||||
|
this.settings.showErrors.call( this, this.errorMap, this.errorList );
|
||||||
|
} else {
|
||||||
|
this.defaultShowErrors();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/Validator.resetForm/
|
||||||
|
resetForm: function() {
|
||||||
|
if ( $.fn.resetForm ) {
|
||||||
|
$( this.currentForm ).resetForm();
|
||||||
|
}
|
||||||
|
this.submitted = {};
|
||||||
|
this.lastElement = null;
|
||||||
|
this.prepareForm();
|
||||||
|
this.hideErrors();
|
||||||
|
this.elements()
|
||||||
|
.removeClass( this.settings.errorClass )
|
||||||
|
.removeData( "previousValue" )
|
||||||
|
.removeAttr( "aria-invalid" );
|
||||||
|
},
|
||||||
|
|
||||||
|
numberOfInvalids: function() {
|
||||||
|
return this.objectLength( this.invalid );
|
||||||
|
},
|
||||||
|
|
||||||
|
objectLength: function( obj ) {
|
||||||
|
/* jshint unused: false */
|
||||||
|
var count = 0,
|
||||||
|
i;
|
||||||
|
for ( i in obj ) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
hideErrors: function() {
|
||||||
|
this.hideThese( this.toHide );
|
||||||
|
},
|
||||||
|
|
||||||
|
hideThese: function( errors ) {
|
||||||
|
errors.not( this.containers ).text( "" );
|
||||||
|
this.addWrapper( errors ).hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
valid: function() {
|
||||||
|
return this.size() === 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
size: function() {
|
||||||
|
return this.errorList.length;
|
||||||
|
},
|
||||||
|
|
||||||
|
focusInvalid: function() {
|
||||||
|
if ( this.settings.focusInvalid ) {
|
||||||
|
try {
|
||||||
|
$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
|
||||||
|
.filter( ":visible" )
|
||||||
|
.focus()
|
||||||
|
// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
|
||||||
|
.trigger( "focusin" );
|
||||||
|
} catch ( e ) {
|
||||||
|
// ignore IE throwing errors when focusing hidden elements
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
findLastActive: function() {
|
||||||
|
var lastActive = this.lastActive;
|
||||||
|
return lastActive && $.grep( this.errorList, function( n ) {
|
||||||
|
return n.element.name === lastActive.name;
|
||||||
|
}).length === 1 && lastActive;
|
||||||
|
},
|
||||||
|
|
||||||
|
elements: function() {
|
||||||
|
var validator = this,
|
||||||
|
rulesCache = {};
|
||||||
|
|
||||||
|
// select all valid inputs inside the form (no submit or reset buttons)
|
||||||
|
return $( this.currentForm )
|
||||||
|
.find( "input, select, textarea" )
|
||||||
|
.not( ":submit, :reset, :image, [disabled], [readonly]" )
|
||||||
|
.not( this.settings.ignore )
|
||||||
|
.filter( function() {
|
||||||
|
if ( !this.name && validator.settings.debug && window.console ) {
|
||||||
|
console.error( "%o has no name assigned", this );
|
||||||
|
}
|
||||||
|
|
||||||
|
// select only the first element for each name, and only those with rules specified
|
||||||
|
if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
rulesCache[ this.name ] = true;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
clean: function( selector ) {
|
||||||
|
return $( selector )[ 0 ];
|
||||||
|
},
|
||||||
|
|
||||||
|
errors: function() {
|
||||||
|
var errorClass = this.settings.errorClass.split( " " ).join( "." );
|
||||||
|
return $( this.settings.errorElement + "." + errorClass, this.errorContext );
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function() {
|
||||||
|
this.successList = [];
|
||||||
|
this.errorList = [];
|
||||||
|
this.errorMap = {};
|
||||||
|
this.toShow = $( [] );
|
||||||
|
this.toHide = $( [] );
|
||||||
|
this.currentElements = $( [] );
|
||||||
|
},
|
||||||
|
|
||||||
|
prepareForm: function() {
|
||||||
|
this.reset();
|
||||||
|
this.toHide = this.errors().add( this.containers );
|
||||||
|
},
|
||||||
|
|
||||||
|
prepareElement: function( element ) {
|
||||||
|
this.reset();
|
||||||
|
this.toHide = this.errorsFor( element );
|
||||||
|
},
|
||||||
|
|
||||||
|
elementValue: function( element ) {
|
||||||
|
var val,
|
||||||
|
$element = $( element ),
|
||||||
|
type = element.type;
|
||||||
|
|
||||||
|
if ( type === "radio" || type === "checkbox" ) {
|
||||||
|
return $( "input[name='" + element.name + "']:checked" ).val();
|
||||||
|
} else if ( type === "number" && typeof element.validity !== "undefined" ) {
|
||||||
|
return element.validity.badInput ? false : $element.val();
|
||||||
|
}
|
||||||
|
|
||||||
|
val = $element.val();
|
||||||
|
if ( typeof val === "string" ) {
|
||||||
|
return val.replace(/\r/g, "" );
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
},
|
||||||
|
|
||||||
|
check: function( element ) {
|
||||||
|
element = this.validationTargetFor( this.clean( element ) );
|
||||||
|
|
||||||
|
var rules = $( element ).rules(),
|
||||||
|
rulesCount = $.map( rules, function( n, i ) {
|
||||||
|
return i;
|
||||||
|
}).length,
|
||||||
|
dependencyMismatch = false,
|
||||||
|
val = this.elementValue( element ),
|
||||||
|
result, method, rule;
|
||||||
|
|
||||||
|
for ( method in rules ) {
|
||||||
|
rule = { method: method, parameters: rules[ method ] };
|
||||||
|
try {
|
||||||
|
|
||||||
|
result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
|
||||||
|
|
||||||
|
// if a method indicates that the field is optional and therefore valid,
|
||||||
|
// don't mark it as valid when there are no other rules
|
||||||
|
if ( result === "dependency-mismatch" && rulesCount === 1 ) {
|
||||||
|
dependencyMismatch = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
dependencyMismatch = false;
|
||||||
|
|
||||||
|
if ( result === "pending" ) {
|
||||||
|
this.toHide = this.toHide.not( this.errorsFor( element ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !result ) {
|
||||||
|
this.formatAndAdd( element, rule );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch ( e ) {
|
||||||
|
if ( this.settings.debug && window.console ) {
|
||||||
|
console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( dependencyMismatch ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( this.objectLength( rules ) ) {
|
||||||
|
this.successList.push( element );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// return the custom message for the given element and validation method
|
||||||
|
// specified in the element's HTML5 data attribute
|
||||||
|
// return the generic message if present and no method specific message is present
|
||||||
|
customDataMessage: function( element, method ) {
|
||||||
|
return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
|
||||||
|
method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
|
||||||
|
},
|
||||||
|
|
||||||
|
// return the custom message for the given element name and validation method
|
||||||
|
customMessage: function( name, method ) {
|
||||||
|
var m = this.settings.messages[ name ];
|
||||||
|
return m && ( m.constructor === String ? m : m[ method ]);
|
||||||
|
},
|
||||||
|
|
||||||
|
// return the first defined argument, allowing empty strings
|
||||||
|
findDefined: function() {
|
||||||
|
for ( var i = 0; i < arguments.length; i++) {
|
||||||
|
if ( arguments[ i ] !== undefined ) {
|
||||||
|
return arguments[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
|
||||||
|
defaultMessage: function( element, method ) {
|
||||||
|
return this.findDefined(
|
||||||
|
this.customMessage( element.name, method ),
|
||||||
|
this.customDataMessage( element, method ),
|
||||||
|
// title is never undefined, so handle empty string as undefined
|
||||||
|
!this.settings.ignoreTitle && element.title || undefined,
|
||||||
|
$.validator.messages[ method ],
|
||||||
|
"<strong>Warning: No message defined for " + element.name + "</strong>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
formatAndAdd: function( element, rule ) {
|
||||||
|
var message = this.defaultMessage( element, rule.method ),
|
||||||
|
theregex = /\$?\{(\d+)\}/g;
|
||||||
|
if ( typeof message === "function" ) {
|
||||||
|
message = message.call( this, rule.parameters, element );
|
||||||
|
} else if ( theregex.test( message ) ) {
|
||||||
|
message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
|
||||||
|
}
|
||||||
|
this.errorList.push({
|
||||||
|
message: message,
|
||||||
|
element: element,
|
||||||
|
method: rule.method
|
||||||
|
});
|
||||||
|
|
||||||
|
this.errorMap[ element.name ] = message;
|
||||||
|
this.submitted[ element.name ] = message;
|
||||||
|
},
|
||||||
|
|
||||||
|
addWrapper: function( toToggle ) {
|
||||||
|
if ( this.settings.wrapper ) {
|
||||||
|
toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
|
||||||
|
}
|
||||||
|
return toToggle;
|
||||||
|
},
|
||||||
|
|
||||||
|
defaultShowErrors: function() {
|
||||||
|
var i, elements, error;
|
||||||
|
for ( i = 0; this.errorList[ i ]; i++ ) {
|
||||||
|
error = this.errorList[ i ];
|
||||||
|
if ( this.settings.highlight ) {
|
||||||
|
this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
|
||||||
|
}
|
||||||
|
this.showLabel( error.element, error.message );
|
||||||
|
}
|
||||||
|
if ( this.errorList.length ) {
|
||||||
|
this.toShow = this.toShow.add( this.containers );
|
||||||
|
}
|
||||||
|
if ( this.settings.success ) {
|
||||||
|
for ( i = 0; this.successList[ i ]; i++ ) {
|
||||||
|
this.showLabel( this.successList[ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( this.settings.unhighlight ) {
|
||||||
|
for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
|
||||||
|
this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.toHide = this.toHide.not( this.toShow );
|
||||||
|
this.hideErrors();
|
||||||
|
this.addWrapper( this.toShow ).show();
|
||||||
|
},
|
||||||
|
|
||||||
|
validElements: function() {
|
||||||
|
return this.currentElements.not( this.invalidElements() );
|
||||||
|
},
|
||||||
|
|
||||||
|
invalidElements: function() {
|
||||||
|
return $( this.errorList ).map(function() {
|
||||||
|
return this.element;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
showLabel: function( element, message ) {
|
||||||
|
var place, group, errorID,
|
||||||
|
error = this.errorsFor( element ),
|
||||||
|
elementID = this.idOrName( element ),
|
||||||
|
describedBy = $( element ).attr( "aria-describedby" );
|
||||||
|
if ( error.length ) {
|
||||||
|
// refresh error/success class
|
||||||
|
error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
|
||||||
|
// replace message on existing label
|
||||||
|
error.html( message );
|
||||||
|
} else {
|
||||||
|
// create error element
|
||||||
|
error = $( "<" + this.settings.errorElement + ">" )
|
||||||
|
.attr( "id", elementID + "-error" )
|
||||||
|
.addClass( this.settings.errorClass )
|
||||||
|
.html( message || "" );
|
||||||
|
|
||||||
|
// Maintain reference to the element to be placed into the DOM
|
||||||
|
place = error;
|
||||||
|
if ( this.settings.wrapper ) {
|
||||||
|
// make sure the element is visible, even in IE
|
||||||
|
// actually showing the wrapped element is handled elsewhere
|
||||||
|
place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
|
||||||
|
}
|
||||||
|
if ( this.labelContainer.length ) {
|
||||||
|
this.labelContainer.append( place );
|
||||||
|
} else if ( this.settings.errorPlacement ) {
|
||||||
|
this.settings.errorPlacement( place, $( element ) );
|
||||||
|
} else {
|
||||||
|
place.insertAfter( element );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link error back to the element
|
||||||
|
if ( error.is( "label" ) ) {
|
||||||
|
// If the error is a label, then associate using 'for'
|
||||||
|
error.attr( "for", elementID );
|
||||||
|
} else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
|
||||||
|
// If the element is not a child of an associated label, then it's necessary
|
||||||
|
// to explicitly apply aria-describedby
|
||||||
|
|
||||||
|
errorID = error.attr( "id" ).replace( /(:|\.|\[|\])/g, "\\$1");
|
||||||
|
// Respect existing non-error aria-describedby
|
||||||
|
if ( !describedBy ) {
|
||||||
|
describedBy = errorID;
|
||||||
|
} else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
|
||||||
|
// Add to end of list if not already present
|
||||||
|
describedBy += " " + errorID;
|
||||||
|
}
|
||||||
|
$( element ).attr( "aria-describedby", describedBy );
|
||||||
|
|
||||||
|
// If this element is grouped, then assign to all elements in the same group
|
||||||
|
group = this.groups[ element.name ];
|
||||||
|
if ( group ) {
|
||||||
|
$.each( this.groups, function( name, testgroup ) {
|
||||||
|
if ( testgroup === group ) {
|
||||||
|
$( "[name='" + name + "']", this.currentForm )
|
||||||
|
.attr( "aria-describedby", error.attr( "id" ) );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !message && this.settings.success ) {
|
||||||
|
error.text( "" );
|
||||||
|
if ( typeof this.settings.success === "string" ) {
|
||||||
|
error.addClass( this.settings.success );
|
||||||
|
} else {
|
||||||
|
this.settings.success( error, element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.toShow = this.toShow.add( error );
|
||||||
|
},
|
||||||
|
|
||||||
|
errorsFor: function( element ) {
|
||||||
|
var name = this.idOrName( element ),
|
||||||
|
describer = $( element ).attr( "aria-describedby" ),
|
||||||
|
selector = "label[for='" + name + "'], label[for='" + name + "'] *";
|
||||||
|
|
||||||
|
// aria-describedby should directly reference the error element
|
||||||
|
if ( describer ) {
|
||||||
|
selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
.errors()
|
||||||
|
.filter( selector );
|
||||||
|
},
|
||||||
|
|
||||||
|
idOrName: function( element ) {
|
||||||
|
return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
|
||||||
|
},
|
||||||
|
|
||||||
|
validationTargetFor: function( element ) {
|
||||||
|
|
||||||
|
// If radio/checkbox, validate first element in group instead
|
||||||
|
if ( this.checkable( element ) ) {
|
||||||
|
element = this.findByName( element.name );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always apply ignore filter
|
||||||
|
return $( element ).not( this.settings.ignore )[ 0 ];
|
||||||
|
},
|
||||||
|
|
||||||
|
checkable: function( element ) {
|
||||||
|
return ( /radio|checkbox/i ).test( element.type );
|
||||||
|
},
|
||||||
|
|
||||||
|
findByName: function( name ) {
|
||||||
|
return $( this.currentForm ).find( "[name='" + name + "']" );
|
||||||
|
},
|
||||||
|
|
||||||
|
getLength: function( value, element ) {
|
||||||
|
switch ( element.nodeName.toLowerCase() ) {
|
||||||
|
case "select":
|
||||||
|
return $( "option:selected", element ).length;
|
||||||
|
case "input":
|
||||||
|
if ( this.checkable( element ) ) {
|
||||||
|
return this.findByName( element.name ).filter( ":checked" ).length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value.length;
|
||||||
|
},
|
||||||
|
|
||||||
|
depend: function( param, element ) {
|
||||||
|
return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
|
||||||
|
},
|
||||||
|
|
||||||
|
dependTypes: {
|
||||||
|
"boolean": function( param ) {
|
||||||
|
return param;
|
||||||
|
},
|
||||||
|
"string": function( param, element ) {
|
||||||
|
return !!$( param, element.form ).length;
|
||||||
|
},
|
||||||
|
"function": function( param, element ) {
|
||||||
|
return param( element );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
optional: function( element ) {
|
||||||
|
var val = this.elementValue( element );
|
||||||
|
return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
|
||||||
|
},
|
||||||
|
|
||||||
|
startRequest: function( element ) {
|
||||||
|
if ( !this.pending[ element.name ] ) {
|
||||||
|
this.pendingRequest++;
|
||||||
|
this.pending[ element.name ] = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
stopRequest: function( element, valid ) {
|
||||||
|
this.pendingRequest--;
|
||||||
|
// sometimes synchronization fails, make sure pendingRequest is never < 0
|
||||||
|
if ( this.pendingRequest < 0 ) {
|
||||||
|
this.pendingRequest = 0;
|
||||||
|
}
|
||||||
|
delete this.pending[ element.name ];
|
||||||
|
if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
|
||||||
|
$( this.currentForm ).submit();
|
||||||
|
this.formSubmitted = false;
|
||||||
|
} else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
|
||||||
|
$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
|
||||||
|
this.formSubmitted = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
previousValue: function( element ) {
|
||||||
|
return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
|
||||||
|
old: null,
|
||||||
|
valid: true,
|
||||||
|
message: this.defaultMessage( element, "remote" )
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
classRuleSettings: {
|
||||||
|
required: { required: true },
|
||||||
|
email: { email: true },
|
||||||
|
url: { url: true },
|
||||||
|
date: { date: true },
|
||||||
|
dateISO: { dateISO: true },
|
||||||
|
number: { number: true },
|
||||||
|
digits: { digits: true },
|
||||||
|
creditcard: { creditcard: true }
|
||||||
|
},
|
||||||
|
|
||||||
|
addClassRules: function( className, rules ) {
|
||||||
|
if ( className.constructor === String ) {
|
||||||
|
this.classRuleSettings[ className ] = rules;
|
||||||
|
} else {
|
||||||
|
$.extend( this.classRuleSettings, className );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
classRules: function( element ) {
|
||||||
|
var rules = {},
|
||||||
|
classes = $( element ).attr( "class" );
|
||||||
|
|
||||||
|
if ( classes ) {
|
||||||
|
$.each( classes.split( " " ), function() {
|
||||||
|
if ( this in $.validator.classRuleSettings ) {
|
||||||
|
$.extend( rules, $.validator.classRuleSettings[ this ]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
|
||||||
|
attributeRules: function( element ) {
|
||||||
|
var rules = {},
|
||||||
|
$element = $( element ),
|
||||||
|
type = element.getAttribute( "type" ),
|
||||||
|
method, value;
|
||||||
|
|
||||||
|
for ( method in $.validator.methods ) {
|
||||||
|
|
||||||
|
// support for <input required> in both html5 and older browsers
|
||||||
|
if ( method === "required" ) {
|
||||||
|
value = element.getAttribute( method );
|
||||||
|
// Some browsers return an empty string for the required attribute
|
||||||
|
// and non-HTML5 browsers might have required="" markup
|
||||||
|
if ( value === "" ) {
|
||||||
|
value = true;
|
||||||
|
}
|
||||||
|
// force non-HTML5 browsers to return bool
|
||||||
|
value = !!value;
|
||||||
|
} else {
|
||||||
|
value = $element.attr( method );
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert the value to a number for number inputs, and for text for backwards compability
|
||||||
|
// allows type="date" and others to be compared as strings
|
||||||
|
if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
|
||||||
|
value = Number( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( value || value === 0 ) {
|
||||||
|
rules[ method ] = value;
|
||||||
|
} else if ( type === method && type !== "range" ) {
|
||||||
|
// exception: the jquery validate 'range' method
|
||||||
|
// does not test for the html5 'range' type
|
||||||
|
rules[ method ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
|
||||||
|
if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
|
||||||
|
delete rules.maxlength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
|
||||||
|
dataRules: function( element ) {
|
||||||
|
var method, value,
|
||||||
|
rules = {}, $element = $( element );
|
||||||
|
for ( method in $.validator.methods ) {
|
||||||
|
value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
rules[ method ] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
|
||||||
|
staticRules: function( element ) {
|
||||||
|
var rules = {},
|
||||||
|
validator = $.data( element.form, "validator" );
|
||||||
|
|
||||||
|
if ( validator.settings.rules ) {
|
||||||
|
rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
|
||||||
|
}
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
|
||||||
|
normalizeRules: function( rules, element ) {
|
||||||
|
// handle dependency check
|
||||||
|
$.each( rules, function( prop, val ) {
|
||||||
|
// ignore rule when param is explicitly false, eg. required:false
|
||||||
|
if ( val === false ) {
|
||||||
|
delete rules[ prop ];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( val.param || val.depends ) {
|
||||||
|
var keepRule = true;
|
||||||
|
switch ( typeof val.depends ) {
|
||||||
|
case "string":
|
||||||
|
keepRule = !!$( val.depends, element.form ).length;
|
||||||
|
break;
|
||||||
|
case "function":
|
||||||
|
keepRule = val.depends.call( element, element );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( keepRule ) {
|
||||||
|
rules[ prop ] = val.param !== undefined ? val.param : true;
|
||||||
|
} else {
|
||||||
|
delete rules[ prop ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// evaluate parameters
|
||||||
|
$.each( rules, function( rule, parameter ) {
|
||||||
|
rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
|
||||||
|
});
|
||||||
|
|
||||||
|
// clean number parameters
|
||||||
|
$.each([ "minlength", "maxlength" ], function() {
|
||||||
|
if ( rules[ this ] ) {
|
||||||
|
rules[ this ] = Number( rules[ this ] );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$.each([ "rangelength", "range" ], function() {
|
||||||
|
var parts;
|
||||||
|
if ( rules[ this ] ) {
|
||||||
|
if ( $.isArray( rules[ this ] ) ) {
|
||||||
|
rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
|
||||||
|
} else if ( typeof rules[ this ] === "string" ) {
|
||||||
|
parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
|
||||||
|
rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if ( $.validator.autoCreateRanges ) {
|
||||||
|
// auto-create ranges
|
||||||
|
if ( rules.min != null && rules.max != null ) {
|
||||||
|
rules.range = [ rules.min, rules.max ];
|
||||||
|
delete rules.min;
|
||||||
|
delete rules.max;
|
||||||
|
}
|
||||||
|
if ( rules.minlength != null && rules.maxlength != null ) {
|
||||||
|
rules.rangelength = [ rules.minlength, rules.maxlength ];
|
||||||
|
delete rules.minlength;
|
||||||
|
delete rules.maxlength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
|
||||||
|
normalizeRule: function( data ) {
|
||||||
|
if ( typeof data === "string" ) {
|
||||||
|
var transformed = {};
|
||||||
|
$.each( data.split( /\s/ ), function() {
|
||||||
|
transformed[ this ] = true;
|
||||||
|
});
|
||||||
|
data = transformed;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/jQuery.validator.addMethod/
|
||||||
|
addMethod: function( name, method, message ) {
|
||||||
|
$.validator.methods[ name ] = method;
|
||||||
|
$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
|
||||||
|
if ( method.length < 3 ) {
|
||||||
|
$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/required-method/
|
||||||
|
required: function( value, element, param ) {
|
||||||
|
// check if dependency is met
|
||||||
|
if ( !this.depend( param, element ) ) {
|
||||||
|
return "dependency-mismatch";
|
||||||
|
}
|
||||||
|
if ( element.nodeName.toLowerCase() === "select" ) {
|
||||||
|
// could be an array for select-multiple or a string, both are fine this way
|
||||||
|
var val = $( element ).val();
|
||||||
|
return val && val.length > 0;
|
||||||
|
}
|
||||||
|
if ( this.checkable( element ) ) {
|
||||||
|
return this.getLength( value, element ) > 0;
|
||||||
|
}
|
||||||
|
return $.trim( value ).length > 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/email-method/
|
||||||
|
email: function( value, element ) {
|
||||||
|
// From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
|
||||||
|
// Retrieved 2014-01-14
|
||||||
|
// If you have a problem with this implementation, report a bug against the above spec
|
||||||
|
// Or use custom methods to implement your own email validation
|
||||||
|
return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/url-method/
|
||||||
|
url: function( value, element ) {
|
||||||
|
// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
|
||||||
|
return this.optional( element ) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/date-method/
|
||||||
|
date: function( value, element ) {
|
||||||
|
return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/dateISO-method/
|
||||||
|
dateISO: function( value, element ) {
|
||||||
|
return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/number-method/
|
||||||
|
number: function( value, element ) {
|
||||||
|
return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/digits-method/
|
||||||
|
digits: function( value, element ) {
|
||||||
|
return this.optional( element ) || /^\d+$/.test( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/creditcard-method/
|
||||||
|
// based on http://en.wikipedia.org/wiki/Luhn/
|
||||||
|
creditcard: function( value, element ) {
|
||||||
|
if ( this.optional( element ) ) {
|
||||||
|
return "dependency-mismatch";
|
||||||
|
}
|
||||||
|
// accept only spaces, digits and dashes
|
||||||
|
if ( /[^0-9 \-]+/.test( value ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var nCheck = 0,
|
||||||
|
nDigit = 0,
|
||||||
|
bEven = false,
|
||||||
|
n, cDigit;
|
||||||
|
|
||||||
|
value = value.replace( /\D/g, "" );
|
||||||
|
|
||||||
|
// Basing min and max length on
|
||||||
|
// http://developer.ean.com/general_info/Valid_Credit_Card_Types
|
||||||
|
if ( value.length < 13 || value.length > 19 ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( n = value.length - 1; n >= 0; n--) {
|
||||||
|
cDigit = value.charAt( n );
|
||||||
|
nDigit = parseInt( cDigit, 10 );
|
||||||
|
if ( bEven ) {
|
||||||
|
if ( ( nDigit *= 2 ) > 9 ) {
|
||||||
|
nDigit -= 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nCheck += nDigit;
|
||||||
|
bEven = !bEven;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( nCheck % 10 ) === 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/minlength-method/
|
||||||
|
minlength: function( value, element, param ) {
|
||||||
|
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
||||||
|
return this.optional( element ) || length >= param;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/maxlength-method/
|
||||||
|
maxlength: function( value, element, param ) {
|
||||||
|
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
||||||
|
return this.optional( element ) || length <= param;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/rangelength-method/
|
||||||
|
rangelength: function( value, element, param ) {
|
||||||
|
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
||||||
|
return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/min-method/
|
||||||
|
min: function( value, element, param ) {
|
||||||
|
return this.optional( element ) || value >= param;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/max-method/
|
||||||
|
max: function( value, element, param ) {
|
||||||
|
return this.optional( element ) || value <= param;
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/range-method/
|
||||||
|
range: function( value, element, param ) {
|
||||||
|
return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/equalTo-method/
|
||||||
|
equalTo: function( value, element, param ) {
|
||||||
|
// bind to the blur event of the target in order to revalidate whenever the target field is updated
|
||||||
|
// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
|
||||||
|
var target = $( param );
|
||||||
|
if ( this.settings.onfocusout ) {
|
||||||
|
target.unbind( ".validate-equalTo" ).bind( "blur.validate-equalTo", function() {
|
||||||
|
$( element ).valid();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return value === target.val();
|
||||||
|
},
|
||||||
|
|
||||||
|
// http://jqueryvalidation.org/remote-method/
|
||||||
|
remote: function( value, element, param ) {
|
||||||
|
if ( this.optional( element ) ) {
|
||||||
|
return "dependency-mismatch";
|
||||||
|
}
|
||||||
|
|
||||||
|
var previous = this.previousValue( element ),
|
||||||
|
validator, data;
|
||||||
|
|
||||||
|
if (!this.settings.messages[ element.name ] ) {
|
||||||
|
this.settings.messages[ element.name ] = {};
|
||||||
|
}
|
||||||
|
previous.originalMessage = this.settings.messages[ element.name ].remote;
|
||||||
|
this.settings.messages[ element.name ].remote = previous.message;
|
||||||
|
|
||||||
|
param = typeof param === "string" && { url: param } || param;
|
||||||
|
|
||||||
|
if ( previous.old === value ) {
|
||||||
|
return previous.valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
previous.old = value;
|
||||||
|
validator = this;
|
||||||
|
this.startRequest( element );
|
||||||
|
data = {};
|
||||||
|
data[ element.name ] = value;
|
||||||
|
$.ajax( $.extend( true, {
|
||||||
|
url: param,
|
||||||
|
mode: "abort",
|
||||||
|
port: "validate" + element.name,
|
||||||
|
dataType: "json",
|
||||||
|
data: data,
|
||||||
|
context: validator.currentForm,
|
||||||
|
success: function( response ) {
|
||||||
|
var valid = response === true || response === "true",
|
||||||
|
errors, message, submitted;
|
||||||
|
|
||||||
|
validator.settings.messages[ element.name ].remote = previous.originalMessage;
|
||||||
|
if ( valid ) {
|
||||||
|
submitted = validator.formSubmitted;
|
||||||
|
validator.prepareElement( element );
|
||||||
|
validator.formSubmitted = submitted;
|
||||||
|
validator.successList.push( element );
|
||||||
|
delete validator.invalid[ element.name ];
|
||||||
|
validator.showErrors();
|
||||||
|
} else {
|
||||||
|
errors = {};
|
||||||
|
message = response || validator.defaultMessage( element, "remote" );
|
||||||
|
errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
|
||||||
|
validator.invalid[ element.name ] = true;
|
||||||
|
validator.showErrors( errors );
|
||||||
|
}
|
||||||
|
previous.valid = valid;
|
||||||
|
validator.stopRequest( element, valid );
|
||||||
|
}
|
||||||
|
}, param ) );
|
||||||
|
return "pending";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$.format = function deprecated() {
|
||||||
|
throw "$.format has been deprecated. Please use $.validator.format instead.";
|
||||||
|
};
|
||||||
|
|
||||||
|
// ajax mode: abort
|
||||||
|
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
|
||||||
|
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
|
||||||
|
|
||||||
|
var pendingRequests = {},
|
||||||
|
ajax;
|
||||||
|
// Use a prefilter if available (1.5+)
|
||||||
|
if ( $.ajaxPrefilter ) {
|
||||||
|
$.ajaxPrefilter(function( settings, _, xhr ) {
|
||||||
|
var port = settings.port;
|
||||||
|
if ( settings.mode === "abort" ) {
|
||||||
|
if ( pendingRequests[port] ) {
|
||||||
|
pendingRequests[port].abort();
|
||||||
|
}
|
||||||
|
pendingRequests[port] = xhr;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Proxy ajax
|
||||||
|
ajax = $.ajax;
|
||||||
|
$.ajax = function( settings ) {
|
||||||
|
var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
|
||||||
|
port = ( "port" in settings ? settings : $.ajaxSettings ).port;
|
||||||
|
if ( mode === "abort" ) {
|
||||||
|
if ( pendingRequests[port] ) {
|
||||||
|
pendingRequests[port].abort();
|
||||||
|
}
|
||||||
|
pendingRequests[port] = ajax.apply(this, arguments);
|
||||||
|
return pendingRequests[port];
|
||||||
|
}
|
||||||
|
return ajax.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
|
||||||
|
// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
|
||||||
|
|
||||||
|
$.extend($.fn, {
|
||||||
|
validateDelegate: function( delegate, type, handler ) {
|
||||||
|
return this.bind(type, function( event ) {
|
||||||
|
var target = $(event.target);
|
||||||
|
if ( target.is(delegate) ) {
|
||||||
|
return handler.apply(target, arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
4
thirdparty/jquery-validate/jquery.validate.min.js
vendored
Normal file
4
thirdparty/jquery-validate/jquery.validate.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
|
||||||
|
* http://jqueryvalidation.org/
|
||||||
|
* Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
|
||||||
|
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.validateDelegate(":submit","click",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(b.target).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(b.target).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.submit(function(b){function d(){var d,e;return c.settings.submitHandler?(c.submitButton&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e?e:!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c;return a(this[0]).is("form")?b=this.validate().form():(b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b})),b},removeAttrs:function(b){var c={},d=this;return a.each(b.split(/\s/),function(a,b){c[b]=d.attr(b),d.removeAttr(b)}),c},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(a,b){(9!==b.which||""!==this.elementValue(a))&&(a.name in this.submitted||a===this.lastElement)&&this.element(a)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!this.is(e.ignore)&&e[d].call(c,this[0],b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']","focusin focusout keyup",b).validateDelegate("select, option, [type='radio'], [type='checkbox']","click",b),this.settings.invalidHandler&&a(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue").removeAttr("aria-invalid")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled], [readonly]").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?a("input[name='"+b.name+"']:checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a];return void 0},defaultMessage:function(b,c){return this.findDefined(this.customMessage(b.name,c),this.customDataMessage(b,c),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c],"<strong>Warning: No message defined for "+b.name+"</strong>")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id").replace(/(:|\.|\[|\])/g,"\\$1"),i?i.match(new RegExp("\\b"+f+"\\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),/min|max/.test(c)&&(null===g||/number|range|text/.test(g))&&(d=Number(d)),d||0===d?e[c]=d:g===c&&"range"!==g&&(e[c]=!0);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b);for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),void 0!==d&&(e[c]=d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:a.trim(b).length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{url:d,mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}}),a.format=function(){throw"$.format has been deprecated. Please use $.validator.format instead."};var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a.extend(a.fn,{validateDelegate:function(b,c,d){return this.bind(c,function(c){var e=a(c.target);return e.is(b)?d.apply(e,arguments):void 0})}})});
|
33
thirdparty/jquery-validate/localization/messages_ar.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ar.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: AR (Arabic; العربية)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "هذا الحقل إلزامي",
|
||||||
|
remote: "يرجى تصحيح هذا الحقل للمتابعة",
|
||||||
|
email: "رجاء إدخال عنوان بريد إلكتروني صحيح",
|
||||||
|
url: "رجاء إدخال عنوان موقع إلكتروني صحيح",
|
||||||
|
date: "رجاء إدخال تاريخ صحيح",
|
||||||
|
dateISO: "رجاء إدخال تاريخ صحيح (ISO)",
|
||||||
|
number: "رجاء إدخال عدد بطريقة صحيحة",
|
||||||
|
digits: "رجاء إدخال أرقام فقط",
|
||||||
|
creditcard: "رجاء إدخال رقم بطاقة ائتمان صحيح",
|
||||||
|
equalTo: "رجاء إدخال نفس القيمة",
|
||||||
|
extension: "رجاء إدخال ملف بامتداد موافق عليه",
|
||||||
|
maxlength: $.validator.format("الحد الأقصى لعدد الحروف هو {0}"),
|
||||||
|
minlength: $.validator.format("الحد الأدنى لعدد الحروف هو {0}"),
|
||||||
|
rangelength: $.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),
|
||||||
|
range: $.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),
|
||||||
|
max: $.validator.format("رجاء إدخال عدد أقل من أو يساوي (0}"),
|
||||||
|
min: $.validator.format("رجاء إدخال عدد أكبر من أو يساوي (0}")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_bg.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_bg.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: BG (Bulgarian; български език)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Полето е задължително.",
|
||||||
|
remote: "Моля, въведете правилната стойност.",
|
||||||
|
email: "Моля, въведете валиден email.",
|
||||||
|
url: "Моля, въведете валидно URL.",
|
||||||
|
date: "Моля, въведете валидна дата.",
|
||||||
|
dateISO: "Моля, въведете валидна дата (ISO).",
|
||||||
|
number: "Моля, въведете валиден номер.",
|
||||||
|
digits: "Моля, въведете само цифри.",
|
||||||
|
creditcard: "Моля, въведете валиден номер на кредитна карта.",
|
||||||
|
equalTo: "Моля, въведете същата стойност отново.",
|
||||||
|
extension: "Моля, въведете стойност с валидно разширение.",
|
||||||
|
maxlength: $.validator.format("Моля, въведете повече от {0} символа."),
|
||||||
|
minlength: $.validator.format("Моля, въведете поне {0} символа."),
|
||||||
|
rangelength: $.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),
|
||||||
|
range: $.validator.format("Моля, въведете стойност между {0} и {1}."),
|
||||||
|
max: $.validator.format("Моля, въведете стойност по-малка или равна на {0}."),
|
||||||
|
min: $.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_bn_BD.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_bn_BD.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: bn_BD (Bengali, Bangladesh)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "এই তথ্যটি আবশ্যক।",
|
||||||
|
remote: "এই তথ্যটি ঠিক করুন।",
|
||||||
|
email: "অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",
|
||||||
|
url: "অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",
|
||||||
|
date: "তারিখ সঠিক নয়।",
|
||||||
|
dateISO: "অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",
|
||||||
|
number: "অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",
|
||||||
|
digits: "এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",
|
||||||
|
creditcard: "অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",
|
||||||
|
equalTo: "একই মান আবার লিখুন।",
|
||||||
|
extension: "সঠিক ধরনের ফাইল আপলোড করুন।",
|
||||||
|
maxlength: $.validator.format("{0}টির বেশি অক্ষর লেখা যাবে না।"),
|
||||||
|
minlength: $.validator.format("{0}টির কম অক্ষর লেখা যাবে না।"),
|
||||||
|
rangelength: $.validator.format("{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।"),
|
||||||
|
range: $.validator.format("{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।"),
|
||||||
|
max: $.validator.format("অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।"),
|
||||||
|
min: $.validator.format("অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ca.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ca.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: CA (Catalan; català)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Aquest camp és obligatori.",
|
||||||
|
remote: "Si us plau, omple aquest camp.",
|
||||||
|
email: "Si us plau, escriu una adreça de correu-e vàlida",
|
||||||
|
url: "Si us plau, escriu una URL vàlida.",
|
||||||
|
date: "Si us plau, escriu una data vàlida.",
|
||||||
|
dateISO: "Si us plau, escriu una data (ISO) vàlida.",
|
||||||
|
number: "Si us plau, escriu un número enter vàlid.",
|
||||||
|
digits: "Si us plau, escriu només dígits.",
|
||||||
|
creditcard: "Si us plau, escriu un número de tarjeta vàlid.",
|
||||||
|
equalTo: "Si us plau, escriu el maateix valor de nou.",
|
||||||
|
extension: "Si us plau, escriu un valor amb una extensió acceptada.",
|
||||||
|
maxlength: $.validator.format("Si us plau, no escriguis més de {0} caracters."),
|
||||||
|
minlength: $.validator.format("Si us plau, no escriguis menys de {0} caracters."),
|
||||||
|
rangelength: $.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),
|
||||||
|
range: $.validator.format("Si us plau, escriu un valor entre {0} i {1}."),
|
||||||
|
max: $.validator.format("Si us plau, escriu un valor menor o igual a {0}."),
|
||||||
|
min: $.validator.format("Si us plau, escriu un valor major o igual a {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_cs.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_cs.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: CS (Czech; čeština, český jazyk)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Tento údaj je povinný.",
|
||||||
|
remote: "Prosím, opravte tento údaj.",
|
||||||
|
email: "Prosím, zadejte platný e-mail.",
|
||||||
|
url: "Prosím, zadejte platné URL.",
|
||||||
|
date: "Prosím, zadejte platné datum.",
|
||||||
|
dateISO: "Prosím, zadejte platné datum (ISO).",
|
||||||
|
number: "Prosím, zadejte číslo.",
|
||||||
|
digits: "Prosím, zadávejte pouze číslice.",
|
||||||
|
creditcard: "Prosím, zadejte číslo kreditní karty.",
|
||||||
|
equalTo: "Prosím, zadejte znovu stejnou hodnotu.",
|
||||||
|
extension: "Prosím, zadejte soubor se správnou příponou.",
|
||||||
|
maxlength: $.validator.format("Prosím, zadejte nejvíce {0} znaků."),
|
||||||
|
minlength: $.validator.format("Prosím, zadejte nejméně {0} znaků."),
|
||||||
|
rangelength: $.validator.format("Prosím, zadejte od {0} do {1} znaků."),
|
||||||
|
range: $.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),
|
||||||
|
max: $.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),
|
||||||
|
min: $.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
30
thirdparty/jquery-validate/localization/messages_da.js
vendored
Normal file
30
thirdparty/jquery-validate/localization/messages_da.js
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: DA (Danish; dansk)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Dette felt er påkrævet.",
|
||||||
|
maxlength: $.validator.format("Indtast højst {0} tegn."),
|
||||||
|
minlength: $.validator.format("Indtast mindst {0} tegn."),
|
||||||
|
rangelength: $.validator.format("Indtast mindst {0} og højst {1} tegn."),
|
||||||
|
email: "Indtast en gyldig email-adresse.",
|
||||||
|
url: "Indtast en gyldig URL.",
|
||||||
|
date: "Indtast en gyldig dato.",
|
||||||
|
number: "Indtast et tal.",
|
||||||
|
digits: "Indtast kun cifre.",
|
||||||
|
equalTo: "Indtast den samme værdi igen.",
|
||||||
|
range: $.validator.format("Angiv en værdi mellem {0} og {1}."),
|
||||||
|
max: $.validator.format("Angiv en værdi der højst er {0}."),
|
||||||
|
min: $.validator.format("Angiv en værdi der mindst er {0}."),
|
||||||
|
creditcard: "Indtast et gyldigt kreditkortnummer."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
30
thirdparty/jquery-validate/localization/messages_de.js
vendored
Normal file
30
thirdparty/jquery-validate/localization/messages_de.js
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: DE (German, Deutsch)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Dieses Feld ist ein Pflichtfeld.",
|
||||||
|
maxlength: $.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),
|
||||||
|
minlength: $.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),
|
||||||
|
rangelength: $.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),
|
||||||
|
email: "Geben Sie bitte eine gültige E-Mail Adresse ein.",
|
||||||
|
url: "Geben Sie bitte eine gültige URL ein.",
|
||||||
|
date: "Bitte geben Sie ein gültiges Datum ein.",
|
||||||
|
number: "Geben Sie bitte eine Nummer ein.",
|
||||||
|
digits: "Geben Sie bitte nur Ziffern ein.",
|
||||||
|
equalTo: "Bitte denselben Wert wiederholen.",
|
||||||
|
range: $.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),
|
||||||
|
max: $.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),
|
||||||
|
min: $.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),
|
||||||
|
creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_el.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_el.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: EL (Greek; ελληνικά)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Αυτό το πεδίο είναι υποχρεωτικό.",
|
||||||
|
remote: "Παρακαλώ διορθώστε αυτό το πεδίο.",
|
||||||
|
email: "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",
|
||||||
|
url: "Παρακαλώ εισάγετε ένα έγκυρο URL.",
|
||||||
|
date: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",
|
||||||
|
dateISO: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",
|
||||||
|
number: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",
|
||||||
|
digits: "Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",
|
||||||
|
creditcard: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",
|
||||||
|
equalTo: "Παρακαλώ εισάγετε την ίδια τιμή ξανά.",
|
||||||
|
extension: "Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",
|
||||||
|
maxlength: $.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),
|
||||||
|
minlength: $.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),
|
||||||
|
rangelength: $.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),
|
||||||
|
range: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),
|
||||||
|
max: $.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),
|
||||||
|
min: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
36
thirdparty/jquery-validate/localization/messages_es.js
vendored
Normal file
36
thirdparty/jquery-validate/localization/messages_es.js
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ES (Spanish; Español)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Este campo es obligatorio.",
|
||||||
|
remote: "Por favor, rellena este campo.",
|
||||||
|
email: "Por favor, escribe una dirección de correo válida.",
|
||||||
|
url: "Por favor, escribe una URL válida.",
|
||||||
|
date: "Por favor, escribe una fecha válida.",
|
||||||
|
dateISO: "Por favor, escribe una fecha (ISO) válida.",
|
||||||
|
number: "Por favor, escribe un número válido.",
|
||||||
|
digits: "Por favor, escribe sólo dígitos.",
|
||||||
|
creditcard: "Por favor, escribe un número de tarjeta válido.",
|
||||||
|
equalTo: "Por favor, escribe el mismo valor de nuevo.",
|
||||||
|
extension: "Por favor, escribe un valor con una extensión aceptada.",
|
||||||
|
maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
|
||||||
|
minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
|
||||||
|
rangelength: $.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),
|
||||||
|
range: $.validator.format("Por favor, escribe un valor entre {0} y {1}."),
|
||||||
|
max: $.validator.format("Por favor, escribe un valor menor o igual a {0}."),
|
||||||
|
min: $.validator.format("Por favor, escribe un valor mayor o igual a {0}."),
|
||||||
|
nifES: "Por favor, escribe un NIF válido.",
|
||||||
|
nieES: "Por favor, escribe un NIE válido.",
|
||||||
|
cifES: "Por favor, escribe un CIF válido."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
37
thirdparty/jquery-validate/localization/messages_es_AR.js
vendored
Normal file
37
thirdparty/jquery-validate/localization/messages_es_AR.js
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ES (Spanish; Español)
|
||||||
|
* Region: AR (Argentina)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Este campo es obligatorio.",
|
||||||
|
remote: "Por favor, completá este campo.",
|
||||||
|
email: "Por favor, escribí una dirección de correo válida.",
|
||||||
|
url: "Por favor, escribí una URL válida.",
|
||||||
|
date: "Por favor, escribí una fecha válida.",
|
||||||
|
dateISO: "Por favor, escribí una fecha (ISO) válida.",
|
||||||
|
number: "Por favor, escribí un número entero válido.",
|
||||||
|
digits: "Por favor, escribí sólo dígitos.",
|
||||||
|
creditcard: "Por favor, escribí un número de tarjeta válido.",
|
||||||
|
equalTo: "Por favor, escribí el mismo valor de nuevo.",
|
||||||
|
extension: "Por favor, escribí un valor con una extensión aceptada.",
|
||||||
|
maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
|
||||||
|
minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
|
||||||
|
rangelength: $.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),
|
||||||
|
range: $.validator.format("Por favor, escribí un valor entre {0} y {1}."),
|
||||||
|
max: $.validator.format("Por favor, escribí un valor menor o igual a {0}."),
|
||||||
|
min: $.validator.format("Por favor, escribí un valor mayor o igual a {0}."),
|
||||||
|
nifES: "Por favor, escribí un NIF válido.",
|
||||||
|
nieES: "Por favor, escribí un NIE válido.",
|
||||||
|
cifES: "Por favor, escribí un CIF válido."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
31
thirdparty/jquery-validate/localization/messages_et.js
vendored
Normal file
31
thirdparty/jquery-validate/localization/messages_et.js
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ET (Estonian; eesti, eesti keel)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "See väli peab olema täidetud.",
|
||||||
|
maxlength: $.validator.format("Palun sisestage vähem kui {0} tähemärki."),
|
||||||
|
minlength: $.validator.format("Palun sisestage vähemalt {0} tähemärki."),
|
||||||
|
rangelength: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),
|
||||||
|
email: "Palun sisestage korrektne e-maili aadress.",
|
||||||
|
url: "Palun sisestage korrektne URL.",
|
||||||
|
date: "Palun sisestage korrektne kuupäev.",
|
||||||
|
dateISO: "Palun sisestage korrektne kuupäev (YYYY-MM-DD).",
|
||||||
|
number: "Palun sisestage korrektne number.",
|
||||||
|
digits: "Palun sisestage ainult numbreid.",
|
||||||
|
equalTo: "Palun sisestage sama väärtus uuesti.",
|
||||||
|
range: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),
|
||||||
|
max: $.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),
|
||||||
|
min: $.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),
|
||||||
|
creditcard: "Palun sisestage korrektne krediitkaardi number."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_eu.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_eu.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: EU (Basque; euskara, euskera)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Eremu hau beharrezkoa da.",
|
||||||
|
remote: "Mesedez, bete eremu hau.",
|
||||||
|
email: "Mesedez, idatzi baliozko posta helbide bat.",
|
||||||
|
url: "Mesedez, idatzi baliozko URL bat.",
|
||||||
|
date: "Mesedez, idatzi baliozko data bat.",
|
||||||
|
dateISO: "Mesedez, idatzi baliozko (ISO) data bat.",
|
||||||
|
number: "Mesedez, idatzi baliozko zenbaki oso bat.",
|
||||||
|
digits: "Mesedez, idatzi digituak soilik.",
|
||||||
|
creditcard: "Mesedez, idatzi baliozko txartel zenbaki bat.",
|
||||||
|
equalTo: "Mesedez, idatzi berdina berriro ere.",
|
||||||
|
extension: "Mesedez, idatzi onartutako luzapena duen balio bat.",
|
||||||
|
maxlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),
|
||||||
|
minlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),
|
||||||
|
rangelength: $.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),
|
||||||
|
range: $.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),
|
||||||
|
max: $.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),
|
||||||
|
min: $.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
36
thirdparty/jquery-validate/localization/messages_fa.js
vendored
Normal file
36
thirdparty/jquery-validate/localization/messages_fa.js
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: FA (Persian; فارسی)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "تکمیل این فیلد اجباری است.",
|
||||||
|
remote: "لطفا این فیلد را تصحیح کنید.",
|
||||||
|
email: ".لطفا یک ایمیل صحیح وارد کنید",
|
||||||
|
url: "لطفا آدرس صحیح وارد کنید.",
|
||||||
|
date: "لطفا یک تاریخ صحیح وارد کنید",
|
||||||
|
dateFA: "لطفا یک تاریخ صحیح وارد کنید",
|
||||||
|
dateISO: "لطفا تاریخ صحیح وارد کنید (ISO).",
|
||||||
|
number: "لطفا عدد صحیح وارد کنید.",
|
||||||
|
digits: "لطفا تنها رقم وارد کنید",
|
||||||
|
creditcard: "لطفا کریدیت کارت صحیح وارد کنید.",
|
||||||
|
equalTo: "لطفا مقدار برابری وارد کنید",
|
||||||
|
extension: "لطفا مقداری وارد کنید که ",
|
||||||
|
maxlength: $.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),
|
||||||
|
minlength: $.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),
|
||||||
|
rangelength: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
|
||||||
|
range: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
|
||||||
|
max: $.validator.format("لطفا مقداری کمتر از {0} حرف وارد کنید."),
|
||||||
|
min: $.validator.format("لطفا مقداری بیشتر از {0} حرف وارد کنید."),
|
||||||
|
minWords: $.validator.format("لطفا حداقل {0} کلمه وارد کنید."),
|
||||||
|
maxWords: $.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
31
thirdparty/jquery-validate/localization/messages_fi.js
vendored
Normal file
31
thirdparty/jquery-validate/localization/messages_fi.js
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: FI (Finnish; suomi, suomen kieli)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Tämä kenttä on pakollinen.",
|
||||||
|
email: "Syötä oikea sähköpostiosoite.",
|
||||||
|
url: "Syötä oikea URL osoite.",
|
||||||
|
date: "Syötä oike päivämäärä.",
|
||||||
|
dateISO: "Syötä oike päivämäärä (VVVV-MM-DD).",
|
||||||
|
number: "Syötä numero.",
|
||||||
|
creditcard: "Syötä voimassa oleva luottokorttinumero.",
|
||||||
|
digits: "Syötä pelkästään numeroita.",
|
||||||
|
equalTo: "Syötä sama arvo uudestaan.",
|
||||||
|
maxlength: $.validator.format("Voit syöttää enintään {0} merkkiä."),
|
||||||
|
minlength: $.validator.format("Vähintään {0} merkkiä."),
|
||||||
|
rangelength: $.validator.format("Syötä vähintään {0} ja enintään {1} merkkiä."),
|
||||||
|
range: $.validator.format("Syötä arvo {0} ja {1} väliltä."),
|
||||||
|
max: $.validator.format("Syötä arvo joka on pienempi tai yhtä suuri kuin {0}."),
|
||||||
|
min: $.validator.format("Syötä arvo joka on yhtä suuri tai suurempi kuin {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
59
thirdparty/jquery-validate/localization/messages_fr.js
vendored
Normal file
59
thirdparty/jquery-validate/localization/messages_fr.js
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: FR (French; français)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Ce champ est obligatoire.",
|
||||||
|
remote: "Veuillez corriger ce champ.",
|
||||||
|
email: "Veuillez fournir une adresse électronique valide.",
|
||||||
|
url: "Veuillez fournir une adresse URL valide.",
|
||||||
|
date: "Veuillez fournir une date valide.",
|
||||||
|
dateISO: "Veuillez fournir une date valide (ISO).",
|
||||||
|
number: "Veuillez fournir un numéro valide.",
|
||||||
|
digits: "Veuillez fournir seulement des chiffres.",
|
||||||
|
creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
|
||||||
|
equalTo: "Veuillez fournir encore la même valeur.",
|
||||||
|
extension: "Veuillez fournir une valeur avec une extension valide.",
|
||||||
|
maxlength: $.validator.format("Veuillez fournir au plus {0} caractères."),
|
||||||
|
minlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
|
||||||
|
rangelength: $.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),
|
||||||
|
range: $.validator.format("Veuillez fournir une valeur entre {0} et {1}."),
|
||||||
|
max: $.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),
|
||||||
|
min: $.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),
|
||||||
|
maxWords: $.validator.format("Veuillez fournir au plus {0} mots."),
|
||||||
|
minWords: $.validator.format("Veuillez fournir au moins {0} mots."),
|
||||||
|
rangeWords: $.validator.format("Veuillez fournir entre {0} et {1} mots."),
|
||||||
|
letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
|
||||||
|
alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
|
||||||
|
lettersonly: "Veuillez fournir seulement des lettres.",
|
||||||
|
nowhitespace: "Veuillez ne pas inscrire d'espaces blancs.",
|
||||||
|
ziprange: "Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",
|
||||||
|
integer: "Veuillez fournir un nombre non décimal qui est positif ou négatif.",
|
||||||
|
vinUS: "Veuillez fournir un numéro d'identification du véhicule (VIN).",
|
||||||
|
dateITA: "Veuillez fournir une date valide.",
|
||||||
|
time: "Veuillez fournir une heure valide entre 00:00 et 23:59.",
|
||||||
|
phoneUS: "Veuillez fournir un numéro de téléphone valide.",
|
||||||
|
phoneUK: "Veuillez fournir un numéro de téléphone valide.",
|
||||||
|
mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
|
||||||
|
strippedminlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
|
||||||
|
email2: "Veuillez fournir une adresse électronique valide.",
|
||||||
|
url2: "Veuillez fournir une adresse URL valide.",
|
||||||
|
creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
|
||||||
|
ipv4: "Veuillez fournir une adresse IP v4 valide.",
|
||||||
|
ipv6: "Veuillez fournir une adresse IP v6 valide.",
|
||||||
|
require_from_group: "Veuillez fournir au moins {0} de ces champs.",
|
||||||
|
nifES: "Veuillez fournir un numéro NIF valide.",
|
||||||
|
nieES: "Veuillez fournir un numéro NIE valide.",
|
||||||
|
cifES: "Veuillez fournir un numéro CIF valide.",
|
||||||
|
postalCodeCA: "Veuillez fournir un code postal valide."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
38
thirdparty/jquery-validate/localization/messages_gl.js
vendored
Normal file
38
thirdparty/jquery-validate/localization/messages_gl.js
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: GL (Galician; Galego)
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Este campo é obrigatorio.",
|
||||||
|
remote: "Por favor, cubre este campo.",
|
||||||
|
email: "Por favor, escribe unha dirección de correo válida.",
|
||||||
|
url: "Por favor, escribe unha URL válida.",
|
||||||
|
date: "Por favor, escribe unha data válida.",
|
||||||
|
dateISO: "Por favor, escribe unha data (ISO) válida.",
|
||||||
|
number: "Por favor, escribe un número válido.",
|
||||||
|
digits: "Por favor, escribe só díxitos.",
|
||||||
|
creditcard: "Por favor, escribe un número de tarxeta válido.",
|
||||||
|
equalTo: "Por favor, escribe o mesmo valor de novo.",
|
||||||
|
extension: "Por favor, escribe un valor cunha extensión aceptada.",
|
||||||
|
maxlength: $.validator.format("Por favor, non escribas máis de {0} caracteres."),
|
||||||
|
minlength: $.validator.format("Por favor, non escribas menos de {0} caracteres."),
|
||||||
|
rangelength: $.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),
|
||||||
|
range: $.validator.format("Por favor, escribe un valor entre {0} e {1}."),
|
||||||
|
max: $.validator.format("Por favor, escribe un valor menor ou igual a {0}."),
|
||||||
|
min: $.validator.format("Por favor, escribe un valor maior ou igual a {0}."),
|
||||||
|
nifES: "Por favor, escribe un NIF válido.",
|
||||||
|
nieES: "Por favor, escribe un NIE válido.",
|
||||||
|
cifES: "Por favor, escribe un CIF válido."
|
||||||
|
});
|
||||||
|
}(jQuery));
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_he.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_he.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: HE (Hebrew; עברית)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "השדה הזה הינו שדה חובה",
|
||||||
|
remote: "נא לתקן שדה זה",
|
||||||
|
email: "נא למלא כתובת דוא\"ל חוקית",
|
||||||
|
url: "נא למלא כתובת אינטרנט חוקית",
|
||||||
|
date: "נא למלא תאריך חוקי",
|
||||||
|
dateISO: "נא למלא תאריך חוקי (ISO)",
|
||||||
|
number: "נא למלא מספר",
|
||||||
|
digits: "נא למלא רק מספרים",
|
||||||
|
creditcard: "נא למלא מספר כרטיס אשראי חוקי",
|
||||||
|
equalTo: "נא למלא את אותו ערך שוב",
|
||||||
|
extension: "נא למלא ערך עם סיומת חוקית",
|
||||||
|
maxlength: $.validator.format(".נא לא למלא יותר מ- {0} תווים"),
|
||||||
|
minlength: $.validator.format("נא למלא לפחות {0} תווים"),
|
||||||
|
rangelength: $.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),
|
||||||
|
range: $.validator.format("נא למלא ערך בין {0} ל- {1}"),
|
||||||
|
max: $.validator.format("נא למלא ערך קטן או שווה ל- {0}"),
|
||||||
|
min: $.validator.format("נא למלא ערך גדול או שווה ל- {0}")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_hr.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_hr.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: HR (Croatia; hrvatski jezik)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Ovo polje je obavezno.",
|
||||||
|
remote: "Ovo polje treba popraviti.",
|
||||||
|
email: "Unesite ispravnu e-mail adresu.",
|
||||||
|
url: "Unesite ispravan URL.",
|
||||||
|
date: "Unesite ispravan datum.",
|
||||||
|
dateISO: "Unesite ispravan datum (ISO).",
|
||||||
|
number: "Unesite ispravan broj.",
|
||||||
|
digits: "Unesite samo brojeve.",
|
||||||
|
creditcard: "Unesite ispravan broj kreditne kartice.",
|
||||||
|
equalTo: "Unesite ponovo istu vrijednost.",
|
||||||
|
extension: "Unesite vrijednost sa ispravnom ekstenzijom.",
|
||||||
|
maxlength: $.validator.format("Maksimalni broj znakova je {0} ."),
|
||||||
|
minlength: $.validator.format("Minimalni broj znakova je {0} ."),
|
||||||
|
rangelength: $.validator.format("Unesite vrijednost između {0} i {1} znakova."),
|
||||||
|
range: $.validator.format("Unesite vrijednost između {0} i {1}."),
|
||||||
|
max: $.validator.format("Unesite vrijednost manju ili jednaku {0}."),
|
||||||
|
min: $.validator.format("Unesite vrijednost veću ili jednaku {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
32
thirdparty/jquery-validate/localization/messages_hu.js
vendored
Normal file
32
thirdparty/jquery-validate/localization/messages_hu.js
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: HU (Hungarian; Magyar)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Kötelező megadni.",
|
||||||
|
maxlength: $.validator.format("Legfeljebb {0} karakter hosszú legyen."),
|
||||||
|
minlength: $.validator.format("Legalább {0} karakter hosszú legyen."),
|
||||||
|
rangelength: $.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),
|
||||||
|
email: "Érvényes e-mail címnek kell lennie.",
|
||||||
|
url: "Érvényes URL-nek kell lennie.",
|
||||||
|
date: "Dátumnak kell lennie.",
|
||||||
|
number: "Számnak kell lennie.",
|
||||||
|
digits: "Csak számjegyek lehetnek.",
|
||||||
|
equalTo: "Meg kell egyeznie a két értéknek.",
|
||||||
|
range: $.validator.format("{0} és {1} közé kell esnie."),
|
||||||
|
max: $.validator.format("Nem lehet nagyobb, mint {0}."),
|
||||||
|
min: $.validator.format("Nem lehet kisebb, mint {0}."),
|
||||||
|
creditcard: "Érvényes hitelkártyaszámnak kell lennie.",
|
||||||
|
remote: "Kérem javítsa ki ezt a mezőt.",
|
||||||
|
dateISO: "Kérem írjon be egy érvényes dátumot (ISO)."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_hy_AM.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_hy_AM.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: HY_AM (Armenian; հայերեն լեզու)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Պարտադիր լրացման դաշտ",
|
||||||
|
remote: "Ներմուծեք ճիշտ արժեքը",
|
||||||
|
email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",
|
||||||
|
url: "Ներմուծեք վավեր URL",
|
||||||
|
date: "Ներմուծեք վավեր ամսաթիվ",
|
||||||
|
dateISO: "Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",
|
||||||
|
number: "Ներմուծեք թիվ",
|
||||||
|
digits: "Ներմուծեք միայն թվեր",
|
||||||
|
creditcard: "Ներմուծեք ճիշտ բանկային քարտի համար",
|
||||||
|
equalTo: "Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",
|
||||||
|
extension: "Ընտրեք ճիշտ ընդլանումով ֆայլ",
|
||||||
|
maxlength: $.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),
|
||||||
|
minlength: $.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),
|
||||||
|
rangelength: $.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),
|
||||||
|
range: $.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),
|
||||||
|
max: $.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),
|
||||||
|
min: $.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
32
thirdparty/jquery-validate/localization/messages_id.js
vendored
Normal file
32
thirdparty/jquery-validate/localization/messages_id.js
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ID (Indonesia; Indonesian)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Kolom ini diperlukan.",
|
||||||
|
remote: "Harap benarkan kolom ini.",
|
||||||
|
email: "Silakan masukkan format email yang benar.",
|
||||||
|
url: "Silakan masukkan format URL yang benar.",
|
||||||
|
date: "Silakan masukkan format tanggal yang benar.",
|
||||||
|
dateISO: "Silakan masukkan format tanggal(ISO) yang benar.",
|
||||||
|
number: "Silakan masukkan angka yang benar.",
|
||||||
|
digits: "Harap masukan angka saja.",
|
||||||
|
creditcard: "Harap masukkan format kartu kredit yang benar.",
|
||||||
|
equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.",
|
||||||
|
maxlength: $.validator.format("Input dibatasi hanya {0} karakter."),
|
||||||
|
minlength: $.validator.format("Input tidak kurang dari {0} karakter."),
|
||||||
|
rangelength: $.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),
|
||||||
|
range: $.validator.format("Harap masukkan nilai antara {0} dan {1}."),
|
||||||
|
max: $.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),
|
||||||
|
min: $.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
31
thirdparty/jquery-validate/localization/messages_is.js
vendored
Normal file
31
thirdparty/jquery-validate/localization/messages_is.js
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: IS (Icelandic; íslenska)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Þessi reitur er nauðsynlegur.",
|
||||||
|
remote: "Lagaðu þennan reit.",
|
||||||
|
maxlength: $.validator.format("Sláðu inn mest {0} stafi."),
|
||||||
|
minlength: $.validator.format("Sláðu inn minnst {0} stafi."),
|
||||||
|
rangelength: $.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),
|
||||||
|
email: "Sláðu inn gilt netfang.",
|
||||||
|
url: "Sláðu inn gilda vefslóð.",
|
||||||
|
date: "Sláðu inn gilda dagsetningu.",
|
||||||
|
number: "Sláðu inn tölu.",
|
||||||
|
digits: "Sláðu inn tölustafi eingöngu.",
|
||||||
|
equalTo: "Sláðu sama gildi inn aftur.",
|
||||||
|
range: $.validator.format("Sláðu inn gildi milli {0} og {1}."),
|
||||||
|
max: $.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),
|
||||||
|
min: $.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),
|
||||||
|
creditcard: "Sláðu inn gilt greiðslukortanúmer."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
36
thirdparty/jquery-validate/localization/messages_it.js
vendored
Normal file
36
thirdparty/jquery-validate/localization/messages_it.js
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: IT (Italian; Italiano)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Campo obbligatorio.",
|
||||||
|
remote: "Controlla questo campo.",
|
||||||
|
email: "Inserisci un indirizzo email valido.",
|
||||||
|
url: "Inserisci un indirizzo web valido.",
|
||||||
|
date: "Inserisci una data valida.",
|
||||||
|
dateISO: "Inserisci una data valida (ISO).",
|
||||||
|
number: "Inserisci un numero valido.",
|
||||||
|
digits: "Inserisci solo numeri.",
|
||||||
|
creditcard: "Inserisci un numero di carta di credito valido.",
|
||||||
|
equalTo: "Il valore non corrisponde.",
|
||||||
|
extension: "Inserisci un valore con un'estensione valida.",
|
||||||
|
maxlength: $.validator.format("Non inserire più di {0} caratteri."),
|
||||||
|
minlength: $.validator.format("Inserisci almeno {0} caratteri."),
|
||||||
|
rangelength: $.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri."),
|
||||||
|
range: $.validator.format("Inserisci un valore compreso tra {0} e {1}."),
|
||||||
|
max: $.validator.format("Inserisci un valore minore o uguale a {0}."),
|
||||||
|
min: $.validator.format("Inserisci un valore maggiore o uguale a {0}."),
|
||||||
|
nifES: "Inserisci un NIF valido.",
|
||||||
|
nieES: "Inserisci un NIE valido.",
|
||||||
|
cifES: "Inserisci un CIF valido."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ja.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ja.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: JA (Japanese; 日本語)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "このフィールドは必須です。",
|
||||||
|
remote: "このフィールドを修正してください。",
|
||||||
|
email: "有効なEメールアドレスを入力してください。",
|
||||||
|
url: "有効なURLを入力してください。",
|
||||||
|
date: "有効な日付を入力してください。",
|
||||||
|
dateISO: "有効な日付(ISO)を入力してください。",
|
||||||
|
number: "有効な数字を入力してください。",
|
||||||
|
digits: "数字のみを入力してください。",
|
||||||
|
creditcard: "有効なクレジットカード番号を入力してください。",
|
||||||
|
equalTo: "同じ値をもう一度入力してください。",
|
||||||
|
extension: "有効な拡張子を含む値を入力してください。",
|
||||||
|
maxlength: $.validator.format("{0} 文字以内で入力してください。"),
|
||||||
|
minlength: $.validator.format("{0} 文字以上で入力してください。"),
|
||||||
|
rangelength: $.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),
|
||||||
|
range: $.validator.format("{0} から {1} までの値を入力してください。"),
|
||||||
|
max: $.validator.format("{0} 以下の値を入力してください。"),
|
||||||
|
min: $.validator.format("{0} 以上の値を入力してください。")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ka.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ka.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: KA (Georgian; ქართული)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "ამ ველის შევსება აუცილებელია.",
|
||||||
|
remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",
|
||||||
|
email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
|
||||||
|
url: "გთხოვთ მიუთითოთ კორექტული URL.",
|
||||||
|
date: "გთხოვთ მიუთითოთ კორექტული თარიღი.",
|
||||||
|
dateISO: "გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",
|
||||||
|
number: "გთხოვთ მიუთითოთ ციფრი.",
|
||||||
|
digits: "გთხოვთ მიუთითოთ მხოლოდ ციფრები.",
|
||||||
|
creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",
|
||||||
|
equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",
|
||||||
|
extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",
|
||||||
|
maxlength: $.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),
|
||||||
|
minlength: $.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),
|
||||||
|
rangelength: $.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),
|
||||||
|
range: $.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),
|
||||||
|
max: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),
|
||||||
|
min: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_kk.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_kk.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: KK (Kazakh; қазақ тілі)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Бұл өрісті міндетті түрде толтырыңыз.",
|
||||||
|
remote: "Дұрыс мағына енгізуіңізді сұраймыз.",
|
||||||
|
email: "Нақты электронды поштаңызды енгізуіңізді сұраймыз.",
|
||||||
|
url: "Нақты URL-ды енгізуіңізді сұраймыз.",
|
||||||
|
date: "Нақты URL-ды енгізуіңізді сұраймыз.",
|
||||||
|
dateISO: "Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",
|
||||||
|
number: "Күнді енгізуіңізді сұраймыз.",
|
||||||
|
digits: "Тек қана сандарды енгізуіңізді сұраймыз.",
|
||||||
|
creditcard: "Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",
|
||||||
|
equalTo: "Осы мәнді қайта енгізуіңізді сұраймыз.",
|
||||||
|
extension: "Файлдың кеңейтуін дұрыс таңдаңыз.",
|
||||||
|
maxlength: $.validator.format("Ұзындығы {0} символдан көр болмасын."),
|
||||||
|
minlength: $.validator.format("Ұзындығы {0} символдан аз болмасын."),
|
||||||
|
rangelength: $.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),
|
||||||
|
range: $.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),
|
||||||
|
max: $.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),
|
||||||
|
min: $.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ko.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ko.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: KO (Korean; 한국어)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "필수 항목입니다.",
|
||||||
|
remote: "항목을 수정하세요.",
|
||||||
|
email: "유효하지 않은 E-Mail주소입니다.",
|
||||||
|
url: "유효하지 않은 URL입니다.",
|
||||||
|
date: "올바른 날짜를 입력하세요.",
|
||||||
|
dateISO: "올바른 날짜(ISO)를 입력하세요.",
|
||||||
|
number: "유효한 숫자가 아닙니다.",
|
||||||
|
digits: "숫자만 입력 가능합니다.",
|
||||||
|
creditcard: "신용카드 번호가 바르지 않습니다.",
|
||||||
|
equalTo: "같은 값을 다시 입력하세요.",
|
||||||
|
extension: "올바른 확장자가 아닙니다.",
|
||||||
|
maxlength: $.validator.format("{0}자를 넘을 수 없습니다. "),
|
||||||
|
minlength: $.validator.format("{0}자 이상 입력하세요."),
|
||||||
|
rangelength: $.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),
|
||||||
|
range: $.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),
|
||||||
|
max: $.validator.format("{0} 이하의 값을 입력하세요."),
|
||||||
|
min: $.validator.format("{0} 이상의 값을 입력하세요.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_lt.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_lt.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: LT (Lithuanian; lietuvių kalba)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Šis laukas yra privalomas.",
|
||||||
|
remote: "Prašau pataisyti šį lauką.",
|
||||||
|
email: "Prašau įvesti teisingą elektroninio pašto adresą.",
|
||||||
|
url: "Prašau įvesti teisingą URL.",
|
||||||
|
date: "Prašau įvesti teisingą datą.",
|
||||||
|
dateISO: "Prašau įvesti teisingą datą (ISO).",
|
||||||
|
number: "Prašau įvesti teisingą skaičių.",
|
||||||
|
digits: "Prašau naudoti tik skaitmenis.",
|
||||||
|
creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.",
|
||||||
|
equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.",
|
||||||
|
extension: "Prašau įvesti reikšmę su teisingu plėtiniu.",
|
||||||
|
maxlength: $.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),
|
||||||
|
minlength: $.validator.format("Prašau įvesti bent {0} simbolius."),
|
||||||
|
rangelength: $.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),
|
||||||
|
range: $.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),
|
||||||
|
max: $.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),
|
||||||
|
min: $.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_lv.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_lv.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: LV (Latvian; latviešu valoda)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Šis lauks ir obligāts.",
|
||||||
|
remote: "Lūdzu, pārbaudiet šo lauku.",
|
||||||
|
email: "Lūdzu, ievadiet derīgu e-pasta adresi.",
|
||||||
|
url: "Lūdzu, ievadiet derīgu URL adresi.",
|
||||||
|
date: "Lūdzu, ievadiet derīgu datumu.",
|
||||||
|
dateISO: "Lūdzu, ievadiet derīgu datumu (ISO).",
|
||||||
|
number: "Lūdzu, ievadiet derīgu numuru.",
|
||||||
|
digits: "Lūdzu, ievadiet tikai ciparus.",
|
||||||
|
creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.",
|
||||||
|
equalTo: "Lūdzu, ievadiet to pašu vēlreiz.",
|
||||||
|
extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",
|
||||||
|
maxlength: $.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),
|
||||||
|
minlength: $.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),
|
||||||
|
rangelength: $.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),
|
||||||
|
range: $.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),
|
||||||
|
max: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),
|
||||||
|
min: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_my.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_my.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: MY (Malay; Melayu)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Medan ini diperlukan.",
|
||||||
|
remote: "Sila betulkan medan ini.",
|
||||||
|
email: "Sila masukkan alamat emel yang betul.",
|
||||||
|
url: "Sila masukkan URL yang betul.",
|
||||||
|
date: "Sila masukkan tarikh yang betul.",
|
||||||
|
dateISO: "Sila masukkan tarikh(ISO) yang betul.",
|
||||||
|
number: "Sila masukkan nombor yang betul.",
|
||||||
|
digits: "Sila masukkan nilai digit sahaja.",
|
||||||
|
creditcard: "Sila masukkan nombor kredit kad yang betul.",
|
||||||
|
equalTo: "Sila masukkan nilai yang sama semula.",
|
||||||
|
extension: "Sila masukkan nilai yang telah diterima.",
|
||||||
|
maxlength: $.validator.format("Sila masukkan nilai tidak lebih dari {0} aksara."),
|
||||||
|
minlength: $.validator.format("Sila masukkan nilai sekurang-kurangnya {0} aksara."),
|
||||||
|
rangelength: $.validator.format("Sila masukkan panjang nilai antara {0} dan {1} aksara."),
|
||||||
|
range: $.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),
|
||||||
|
max: $.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),
|
||||||
|
min: $.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
43
thirdparty/jquery-validate/localization/messages_nl.js
vendored
Normal file
43
thirdparty/jquery-validate/localization/messages_nl.js
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: NL (Dutch; Nederlands, Vlaams)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Dit is een verplicht veld.",
|
||||||
|
remote: "Controleer dit veld.",
|
||||||
|
email: "Vul hier een geldig e-mailadres in.",
|
||||||
|
url: "Vul hier een geldige URL in.",
|
||||||
|
date: "Vul hier een geldige datum in.",
|
||||||
|
dateISO: "Vul hier een geldige datum in (ISO-formaat).",
|
||||||
|
number: "Vul hier een geldig getal in.",
|
||||||
|
digits: "Vul hier alleen getallen in.",
|
||||||
|
creditcard: "Vul hier een geldig creditcardnummer in.",
|
||||||
|
equalTo: "Vul hier dezelfde waarde in.",
|
||||||
|
extension: "Vul hier een waarde in met een geldige extensie.",
|
||||||
|
maxlength: $.validator.format("Vul hier maximaal {0} tekens in."),
|
||||||
|
minlength: $.validator.format("Vul hier minimaal {0} tekens in."),
|
||||||
|
rangelength: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),
|
||||||
|
range: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),
|
||||||
|
max: $.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),
|
||||||
|
min: $.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),
|
||||||
|
|
||||||
|
// for validations in additional-methods.js
|
||||||
|
iban: "Vul hier een geldig IBAN in.",
|
||||||
|
dateNL: "Vul hier een geldige datum in.",
|
||||||
|
phoneNL: "Vul hier een geldig Nederlands telefoonnummer in.",
|
||||||
|
mobileNL: "Vul hier een geldig Nederlands mobiel telefoonnummer in.",
|
||||||
|
postalcodeNL: "Vul hier een geldige postcode in.",
|
||||||
|
bankaccountNL: "Vul hier een geldig bankrekeningnummer in.",
|
||||||
|
giroaccountNL: "Vul hier een geldig gironummer in.",
|
||||||
|
bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_no.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_no.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: NO (Norwegian; Norsk)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Dette feltet er obligatorisk.",
|
||||||
|
maxlength: $.validator.format("Maksimalt {0} tegn."),
|
||||||
|
minlength: $.validator.format("Minimum {0} tegn."),
|
||||||
|
rangelength: $.validator.format("Angi minimum {0} og maksimum {1} tegn."),
|
||||||
|
email: "Oppgi en gyldig epostadresse.",
|
||||||
|
url: "Angi en gyldig URL.",
|
||||||
|
date: "Angi en gyldig dato.",
|
||||||
|
dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",
|
||||||
|
dateSE: "Angi en gyldig dato.",
|
||||||
|
number: "Angi et gyldig nummer.",
|
||||||
|
numberSE: "Angi et gyldig nummer.",
|
||||||
|
digits: "Skriv kun tall.",
|
||||||
|
equalTo: "Skriv samme verdi igjen.",
|
||||||
|
range: $.validator.format("Angi en verdi mellom {0} og {1}."),
|
||||||
|
max: $.validator.format("Angi en verdi som er mindre eller lik {0}."),
|
||||||
|
min: $.validator.format("Angi en verdi som er større eller lik {0}."),
|
||||||
|
creditcard: "Angi et gyldig kredittkortnummer."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_pl.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_pl.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: PL (Polish; język polski, polszczyzna)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "To pole jest wymagane.",
|
||||||
|
remote: "Proszę o wypełnienie tego pola.",
|
||||||
|
email: "Proszę o podanie prawidłowego adresu email.",
|
||||||
|
url: "Proszę o podanie prawidłowego URL.",
|
||||||
|
date: "Proszę o podanie prawidłowej daty.",
|
||||||
|
dateISO: "Proszę o podanie prawidłowej daty (ISO).",
|
||||||
|
number: "Proszę o podanie prawidłowej liczby.",
|
||||||
|
digits: "Proszę o podanie samych cyfr.",
|
||||||
|
creditcard: "Proszę o podanie prawidłowej karty kredytowej.",
|
||||||
|
equalTo: "Proszę o podanie tej samej wartości ponownie.",
|
||||||
|
extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.",
|
||||||
|
maxlength: $.validator.format("Proszę o podanie nie więcej niż {0} znaków."),
|
||||||
|
minlength: $.validator.format("Proszę o podanie przynajmniej {0} znaków."),
|
||||||
|
rangelength: $.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),
|
||||||
|
range: $.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),
|
||||||
|
max: $.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),
|
||||||
|
min: $.validator.format("Proszę o podanie wartości większej bądź równej {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
38
thirdparty/jquery-validate/localization/messages_pt_BR.js
vendored
Normal file
38
thirdparty/jquery-validate/localization/messages_pt_BR.js
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: PT (Portuguese; português)
|
||||||
|
* Region: BR (Brazil)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Este campo é requerido.",
|
||||||
|
remote: "Por favor, corrija este campo.",
|
||||||
|
email: "Por favor, forneça um endereço de email válido.",
|
||||||
|
url: "Por favor, forneça uma URL válida.",
|
||||||
|
date: "Por favor, forneça uma data válida.",
|
||||||
|
dateISO: "Por favor, forneça uma data válida (ISO).",
|
||||||
|
number: "Por favor, forneça um número válido.",
|
||||||
|
digits: "Por favor, forneça somente dígitos.",
|
||||||
|
creditcard: "Por favor, forneça um cartão de crédito válido.",
|
||||||
|
equalTo: "Por favor, forneça o mesmo valor novamente.",
|
||||||
|
extension: "Por favor, forneça um valor com uma extensão válida.",
|
||||||
|
maxlength: $.validator.format("Por favor, forneça não mais que {0} caracteres."),
|
||||||
|
minlength: $.validator.format("Por favor, forneça ao menos {0} caracteres."),
|
||||||
|
rangelength: $.validator.format("Por favor, forneça um valor entre {0} e {1} caracteres de comprimento."),
|
||||||
|
range: $.validator.format("Por favor, forneça um valor entre {0} e {1}."),
|
||||||
|
max: $.validator.format("Por favor, forneça um valor menor ou igual a {0}."),
|
||||||
|
min: $.validator.format("Por favor, forneça um valor maior ou igual a {0}."),
|
||||||
|
nifES: "Por favor, forneça um NIF válido.",
|
||||||
|
nieES: "Por favor, forneça um NIE válido.",
|
||||||
|
cifEE: "Por favor, forneça um CIF válido.",
|
||||||
|
postalcodeBR: "Por favor, forneça um CEP válido."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
37
thirdparty/jquery-validate/localization/messages_pt_PT.js
vendored
Normal file
37
thirdparty/jquery-validate/localization/messages_pt_PT.js
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: PT (Portuguese; português)
|
||||||
|
* Region: PT (Portugal)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Campo de preenchimento obrigatório.",
|
||||||
|
remote: "Por favor, corrija este campo.",
|
||||||
|
email: "Por favor, introduza um endereço eletrónico válido.",
|
||||||
|
url: "Por favor, introduza um URL válido.",
|
||||||
|
date: "Por favor, introduza uma data válida.",
|
||||||
|
dateISO: "Por favor, introduza uma data válida (ISO).",
|
||||||
|
number: "Por favor, introduza um número válido.",
|
||||||
|
digits: "Por favor, introduza apenas dígitos.",
|
||||||
|
creditcard: "Por favor, introduza um número de cartão de crédito válido.",
|
||||||
|
equalTo: "Por favor, introduza de novo o mesmo valor.",
|
||||||
|
extension: "Por favor, introduza um ficheiro com uma extensão válida.",
|
||||||
|
maxlength: $.validator.format("Por favor, não introduza mais do que {0} caracteres."),
|
||||||
|
minlength: $.validator.format("Por favor, introduza pelo menos {0} caracteres."),
|
||||||
|
rangelength: $.validator.format("Por favor, introduza entre {0} e {1} caracteres."),
|
||||||
|
range: $.validator.format("Por favor, introduza um valor entre {0} e {1}."),
|
||||||
|
max: $.validator.format("Por favor, introduza um valor menor ou igual a {0}."),
|
||||||
|
min: $.validator.format("Por favor, introduza um valor maior ou igual a {0}."),
|
||||||
|
nifES: "Por favor, introduza um NIF válido.",
|
||||||
|
nieES: "Por favor, introduza um NIE válido.",
|
||||||
|
cifES: "Por favor, introduza um CIF válido."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ro.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ro.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: RO (Romanian, limba română)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Acest câmp este obligatoriu.",
|
||||||
|
remote: "Te rugăm să completezi acest câmp.",
|
||||||
|
email: "Te rugăm să introduci o adresă de email validă",
|
||||||
|
url: "Te rugăm sa introduci o adresă URL validă.",
|
||||||
|
date: "Te rugăm să introduci o dată corectă.",
|
||||||
|
dateISO: "Te rugăm să introduci o dată (ISO) corectă.",
|
||||||
|
number: "Te rugăm să introduci un număr întreg valid.",
|
||||||
|
digits: "Te rugăm să introduci doar cifre.",
|
||||||
|
creditcard: "Te rugăm să introduci un numar de carte de credit valid.",
|
||||||
|
equalTo: "Te rugăm să reintroduci valoarea.",
|
||||||
|
extension: "Te rugăm să introduci o valoare cu o extensie validă.",
|
||||||
|
maxlength: $.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),
|
||||||
|
minlength: $.validator.format("Te rugăm să introduci cel puțin {0} caractere."),
|
||||||
|
rangelength: $.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),
|
||||||
|
range: $.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),
|
||||||
|
max: $.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),
|
||||||
|
min: $.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_ru.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_ru.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: RU (Russian; русский язык)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Это поле необходимо заполнить.",
|
||||||
|
remote: "Пожалуйста, введите правильное значение.",
|
||||||
|
email: "Пожалуйста, введите корректный адрес электронной почты.",
|
||||||
|
url: "Пожалуйста, введите корректный URL.",
|
||||||
|
date: "Пожалуйста, введите корректную дату.",
|
||||||
|
dateISO: "Пожалуйста, введите корректную дату в формате ISO.",
|
||||||
|
number: "Пожалуйста, введите число.",
|
||||||
|
digits: "Пожалуйста, вводите только цифры.",
|
||||||
|
creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
|
||||||
|
equalTo: "Пожалуйста, введите такое же значение ещё раз.",
|
||||||
|
extension: "Пожалуйста, выберите файл с правильным расширением.",
|
||||||
|
maxlength: $.validator.format("Пожалуйста, введите не больше {0} символов."),
|
||||||
|
minlength: $.validator.format("Пожалуйста, введите не меньше {0} символов."),
|
||||||
|
rangelength: $.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),
|
||||||
|
range: $.validator.format("Пожалуйста, введите число от {0} до {1}."),
|
||||||
|
max: $.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),
|
||||||
|
min: $.validator.format("Пожалуйста, введите число, большее или равное {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_si.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_si.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: SI (Slovenian)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "To polje je obvezno.",
|
||||||
|
remote: "Vpis v tem polju ni v pravi obliki.",
|
||||||
|
email: "Prosimo, vnesite pravi email naslov.",
|
||||||
|
url: "Prosimo, vnesite pravi URL.",
|
||||||
|
date: "Prosimo, vnesite pravi datum.",
|
||||||
|
dateISO: "Prosimo, vnesite pravi datum (ISO).",
|
||||||
|
number: "Prosimo, vnesite pravo številko.",
|
||||||
|
digits: "Prosimo, vnesite samo številke.",
|
||||||
|
creditcard: "Prosimo, vnesite pravo številko kreditne kartice.",
|
||||||
|
equalTo: "Prosimo, ponovno vnesite enako vsebino.",
|
||||||
|
extension: "Prosimo, vnesite vsebino z pravo končnico.",
|
||||||
|
maxlength: $.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),
|
||||||
|
minlength: $.validator.format("Prosimo, vnesite vsaj {0} znakov."),
|
||||||
|
rangelength: $.validator.format("Prosimo, vnesite od {0} do {1} znakov."),
|
||||||
|
range: $.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),
|
||||||
|
max: $.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),
|
||||||
|
min: $.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
30
thirdparty/jquery-validate/localization/messages_sk.js
vendored
Normal file
30
thirdparty/jquery-validate/localization/messages_sk.js
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: SK (Slovak; slovenčina, slovenský jazyk)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Povinné zadať.",
|
||||||
|
maxlength: $.validator.format("Maximálne {0} znakov."),
|
||||||
|
minlength: $.validator.format("Minimálne {0} znakov."),
|
||||||
|
rangelength: $.validator.format("Minimálne {0} a Maximálne {1} znakov."),
|
||||||
|
email: "E-mailová adresa musí byť platná.",
|
||||||
|
url: "URL musí byť platný.",
|
||||||
|
date: "Musí byť dátum.",
|
||||||
|
number: "Musí byť číslo.",
|
||||||
|
digits: "Môže obsahovať iba číslice.",
|
||||||
|
equalTo: "Dva hodnoty sa musia rovnať.",
|
||||||
|
range: $.validator.format("Musí byť medzi {0} a {1}."),
|
||||||
|
max: $.validator.format("Nemôže byť viac ako{0}."),
|
||||||
|
min: $.validator.format("Nemôže byť menej ako{0}."),
|
||||||
|
creditcard: "Číslo platobnej karty musí byť platné."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_sl.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_sl.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Language: SL (Slovenian; slovenski jezik)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "To polje je obvezno.",
|
||||||
|
remote: "Prosimo popravite to polje.",
|
||||||
|
email: "Prosimo vnesite veljaven email naslov.",
|
||||||
|
url: "Prosimo vnesite veljaven URL naslov.",
|
||||||
|
date: "Prosimo vnesite veljaven datum.",
|
||||||
|
dateISO: "Prosimo vnesite veljaven ISO datum.",
|
||||||
|
number: "Prosimo vnesite veljavno število.",
|
||||||
|
digits: "Prosimo vnesite samo števila.",
|
||||||
|
creditcard: "Prosimo vnesite veljavno številko kreditne kartice.",
|
||||||
|
equalTo: "Prosimo ponovno vnesite vrednost.",
|
||||||
|
extension: "Prosimo vnesite vrednost z veljavno končnico.",
|
||||||
|
maxlength: $.validator.format("Prosimo vnesite največ {0} znakov."),
|
||||||
|
minlength: $.validator.format("Prosimo vnesite najmanj {0} znakov."),
|
||||||
|
rangelength: $.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),
|
||||||
|
range: $.validator.format("Prosimo vnesite vrednost med {0} in {1}."),
|
||||||
|
max: $.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),
|
||||||
|
min: $.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_sr.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_sr.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: SR (Serbian; српски језик)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Поље је обавезно.",
|
||||||
|
remote: "Средите ово поље.",
|
||||||
|
email: "Унесите исправну и-мејл адресу.",
|
||||||
|
url: "Унесите исправан URL.",
|
||||||
|
date: "Унесите исправан датум.",
|
||||||
|
dateISO: "Унесите исправан датум (ISO).",
|
||||||
|
number: "Унесите исправан број.",
|
||||||
|
digits: "Унесите само цифе.",
|
||||||
|
creditcard: "Унесите исправан број кредитне картице.",
|
||||||
|
equalTo: "Унесите исту вредност поново.",
|
||||||
|
extension: "Унесите вредност са одговарајућом екстензијом.",
|
||||||
|
maxlength: $.validator.format("Унесите мање од {0} карактера."),
|
||||||
|
minlength: $.validator.format("Унесите барем {0} карактера."),
|
||||||
|
rangelength: $.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),
|
||||||
|
range: $.validator.format("Унесите вредност између {0} и {1}."),
|
||||||
|
max: $.validator.format("Унесите вредност мању или једнаку {0}."),
|
||||||
|
min: $.validator.format("Унесите вредност већу или једнаку {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_sr_lat.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_sr_lat.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Polje je obavezno.",
|
||||||
|
remote: "Sredite ovo polje.",
|
||||||
|
email: "Unesite ispravnu i-mejl adresu",
|
||||||
|
url: "Unesite ispravan URL.",
|
||||||
|
date: "Unesite ispravan datum.",
|
||||||
|
dateISO: "Unesite ispravan datum (ISO).",
|
||||||
|
number: "Unesite ispravan broj.",
|
||||||
|
digits: "Unesite samo cife.",
|
||||||
|
creditcard: "Unesite ispravan broj kreditne kartice.",
|
||||||
|
equalTo: "Unesite istu vrednost ponovo.",
|
||||||
|
extension: "Unesite vrednost sa odgovarajućom ekstenzijom.",
|
||||||
|
maxlength: $.validator.format("Unesite manje od {0} karaktera."),
|
||||||
|
minlength: $.validator.format("Unesite barem {0} karaktera."),
|
||||||
|
rangelength: $.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),
|
||||||
|
range: $.validator.format("Unesite vrednost između {0} i {1}."),
|
||||||
|
max: $.validator.format("Unesite vrednost manju ili jednaku {0}."),
|
||||||
|
min: $.validator.format("Unesite vrednost veću ili jednaku {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
31
thirdparty/jquery-validate/localization/messages_sv.js
vendored
Normal file
31
thirdparty/jquery-validate/localization/messages_sv.js
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: SV (Swedish; Svenska)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Detta fält är obligatoriskt.",
|
||||||
|
maxlength: $.validator.format("Du får ange högst {0} tecken."),
|
||||||
|
minlength: $.validator.format("Du måste ange minst {0} tecken."),
|
||||||
|
rangelength: $.validator.format("Ange minst {0} och max {1} tecken."),
|
||||||
|
email: "Ange en korrekt e-postadress.",
|
||||||
|
url: "Ange en korrekt URL.",
|
||||||
|
date: "Ange ett korrekt datum.",
|
||||||
|
dateISO: "Ange ett korrekt datum (ÅÅÅÅ-MM-DD).",
|
||||||
|
number: "Ange ett korrekt nummer.",
|
||||||
|
digits: "Ange endast siffror.",
|
||||||
|
equalTo: "Ange samma värde igen.",
|
||||||
|
range: $.validator.format("Ange ett värde mellan {0} och {1}."),
|
||||||
|
max: $.validator.format("Ange ett värde som är mindre eller lika med {0}."),
|
||||||
|
min: $.validator.format("Ange ett värde som är större eller lika med {0}."),
|
||||||
|
creditcard: "Ange ett korrekt kreditkortsnummer."
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_th.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_th.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: TH (Thai; ไทย)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "โปรดระบุ",
|
||||||
|
remote: "โปรดแก้ไขให้ถูกต้อง",
|
||||||
|
email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",
|
||||||
|
url: "โปรดระบุ URL ที่ถูกต้อง",
|
||||||
|
date: "โปรดระบุวันที่ ที่ถูกต้อง",
|
||||||
|
dateISO: "โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",
|
||||||
|
number: "โปรดระบุทศนิยมที่ถูกต้อง",
|
||||||
|
digits: "โปรดระบุจำนวนเต็มที่ถูกต้อง",
|
||||||
|
creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",
|
||||||
|
equalTo: "โปรดระบุค่าเดิมอีกครั้ง",
|
||||||
|
extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",
|
||||||
|
maxlength: $.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),
|
||||||
|
minlength: $.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),
|
||||||
|
rangelength: $.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),
|
||||||
|
range: $.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),
|
||||||
|
max: $.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),
|
||||||
|
min: $.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_tj.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_tj.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: TJ (Tajikistan; Забони тоҷикӣ)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Ворид кардани ин филд маҷбури аст.",
|
||||||
|
remote: "Илтимос, маълумоти саҳеҳ ворид кунед.",
|
||||||
|
email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.",
|
||||||
|
url: "Илтимос, URL адреси саҳеҳ ворид кунед.",
|
||||||
|
date: "Илтимос, таърихи саҳеҳ ворид кунед.",
|
||||||
|
dateISO: "Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",
|
||||||
|
number: "Илтимос, рақамҳои саҳеҳ ворид кунед.",
|
||||||
|
digits: "Илтимос, танҳо рақам ворид кунед.",
|
||||||
|
creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.",
|
||||||
|
equalTo: "Илтимос, миқдори баробар ворид кунед.",
|
||||||
|
extension: "Илтимос, қофияи файлро дуруст интихоб кунед",
|
||||||
|
maxlength: $.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),
|
||||||
|
minlength: $.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),
|
||||||
|
rangelength: $.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),
|
||||||
|
range: $.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),
|
||||||
|
max: $.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),
|
||||||
|
min: $.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_tr.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_tr.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: TR (Turkish; Türkçe)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Bu alanın doldurulması zorunludur.",
|
||||||
|
remote: "Lütfen bu alanı düzeltin.",
|
||||||
|
email: "Lütfen geçerli bir e-posta adresi giriniz.",
|
||||||
|
url: "Lütfen geçerli bir web adresi (URL) giriniz.",
|
||||||
|
date: "Lütfen geçerli bir tarih giriniz.",
|
||||||
|
dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında)",
|
||||||
|
number: "Lütfen geçerli bir sayı giriniz.",
|
||||||
|
digits: "Lütfen sadece sayısal karakterler giriniz.",
|
||||||
|
creditcard: "Lütfen geçerli bir kredi kartı giriniz.",
|
||||||
|
equalTo: "Lütfen aynı değeri tekrar giriniz.",
|
||||||
|
extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.",
|
||||||
|
maxlength: $.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),
|
||||||
|
minlength: $.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),
|
||||||
|
rangelength: $.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),
|
||||||
|
range: $.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),
|
||||||
|
max: $.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),
|
||||||
|
min: $.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_uk.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_uk.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: UK (Ukrainian; українська мова)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Це поле необхідно заповнити.",
|
||||||
|
remote: "Будь ласка, введіть правильне значення.",
|
||||||
|
email: "Будь ласка, введіть коректну адресу електронної пошти.",
|
||||||
|
url: "Будь ласка, введіть коректний URL.",
|
||||||
|
date: "Будь ласка, введіть коректну дату.",
|
||||||
|
dateISO: "Будь ласка, введіть коректну дату у форматі ISO.",
|
||||||
|
number: "Будь ласка, введіть число.",
|
||||||
|
digits: "Вводите потрібно лише цифри.",
|
||||||
|
creditcard: "Будь ласка, введіть правильний номер кредитної карти.",
|
||||||
|
equalTo: "Будь ласка, введіть таке ж значення ще раз.",
|
||||||
|
extension: "Будь ласка, виберіть файл з правильним розширенням.",
|
||||||
|
maxlength: $.validator.format("Будь ласка, введіть не більше {0} символів."),
|
||||||
|
minlength: $.validator.format("Будь ласка, введіть не менше {0} символів."),
|
||||||
|
rangelength: $.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),
|
||||||
|
range: $.validator.format("Будь ласка, введіть число від {0} до {1}."),
|
||||||
|
max: $.validator.format("Будь ласка, введіть число, менше або рівно {0}."),
|
||||||
|
min: $.validator.format("Будь ласка, введіть число, більше або рівно {0}.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_vi.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_vi.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: VI (Vietnamese; Tiếng Việt)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "Hãy nhập.",
|
||||||
|
remote: "Hãy sửa cho đúng.",
|
||||||
|
email: "Hãy nhập email.",
|
||||||
|
url: "Hãy nhập URL.",
|
||||||
|
date: "Hãy nhập ngày.",
|
||||||
|
dateISO: "Hãy nhập ngày (ISO).",
|
||||||
|
number: "Hãy nhập số.",
|
||||||
|
digits: "Hãy nhập chữ số.",
|
||||||
|
creditcard: "Hãy nhập số thẻ tín dụng.",
|
||||||
|
equalTo: "Hãy nhập thêm lần nữa.",
|
||||||
|
extension: "Phần mở rộng không đúng.",
|
||||||
|
maxlength: $.validator.format("Hãy nhập từ {0} kí tự trở xuống."),
|
||||||
|
minlength: $.validator.format("Hãy nhập từ {0} kí tự trở lên."),
|
||||||
|
rangelength: $.validator.format("Hãy nhập từ {0} đến {1} kí tự."),
|
||||||
|
range: $.validator.format("Hãy nhập từ {0} đến {1}."),
|
||||||
|
max: $.validator.format("Hãy nhập từ {0} trở xuống."),
|
||||||
|
min: $.validator.format("Hãy nhập từ {1} trở lên.")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
33
thirdparty/jquery-validate/localization/messages_zh.js
vendored
Normal file
33
thirdparty/jquery-validate/localization/messages_zh.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "必须填写",
|
||||||
|
remote: "请修正此栏位",
|
||||||
|
email: "请输入有效的电子邮件",
|
||||||
|
url: "请输入有效的网址",
|
||||||
|
date: "请输入有效的日期",
|
||||||
|
dateISO: "请输入有效的日期 (YYYY-MM-DD)",
|
||||||
|
number: "请输入正确的数字",
|
||||||
|
digits: "只可输入数字",
|
||||||
|
creditcard: "请输入有效的信用卡号码",
|
||||||
|
equalTo: "你的输入不相同",
|
||||||
|
extension: "请输入有效的后缀",
|
||||||
|
maxlength: $.validator.format("最多 {0} 个字"),
|
||||||
|
minlength: $.validator.format("最少 {0} 个字"),
|
||||||
|
rangelength: $.validator.format("请输入长度为 {0} 至 {1} 之間的字串"),
|
||||||
|
range: $.validator.format("请输入 {0} 至 {1} 之间的数值"),
|
||||||
|
max: $.validator.format("请输入不大于 {0} 的数值"),
|
||||||
|
min: $.validator.format("请输入不小于 {0} 的数值")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
34
thirdparty/jquery-validate/localization/messages_zh_TW.js
vendored
Normal file
34
thirdparty/jquery-validate/localization/messages_zh_TW.js
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translated default messages for the jQuery validation plugin.
|
||||||
|
* Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語)
|
||||||
|
* Region: TW (Taiwan)
|
||||||
|
*/
|
||||||
|
$.extend($.validator.messages, {
|
||||||
|
required: "必須填寫",
|
||||||
|
remote: "請修正此欄位",
|
||||||
|
email: "請輸入有效的電子郵件",
|
||||||
|
url: "請輸入有效的網址",
|
||||||
|
date: "請輸入有效的日期",
|
||||||
|
dateISO: "請輸入有效的日期 (YYYY-MM-DD)",
|
||||||
|
number: "請輸入正確的數值",
|
||||||
|
digits: "只可輸入數字",
|
||||||
|
creditcard: "請輸入有效的信用卡號碼",
|
||||||
|
equalTo: "請重複輸入一次",
|
||||||
|
extension: "請輸入有效的後綴",
|
||||||
|
maxlength: $.validator.format("最多 {0} 個字"),
|
||||||
|
minlength: $.validator.format("最少 {0} 個字"),
|
||||||
|
rangelength: $.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),
|
||||||
|
range: $.validator.format("請輸入 {0} 至 {1} 之間的數值"),
|
||||||
|
max: $.validator.format("請輸入不大於 {0} 的數值"),
|
||||||
|
min: $.validator.format("請輸入不小於 {0} 的數值")
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
22
thirdparty/jquery-validate/localization/methods_de.js
vendored
Normal file
22
thirdparty/jquery-validate/localization/methods_de.js
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localized default methods for the jQuery validation plugin.
|
||||||
|
* Locale: DE
|
||||||
|
*/
|
||||||
|
$.extend($.validator.methods, {
|
||||||
|
date: function(value, element) {
|
||||||
|
return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
|
||||||
|
},
|
||||||
|
number: function(value, element) {
|
||||||
|
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
22
thirdparty/jquery-validate/localization/methods_es_CL.js
vendored
Normal file
22
thirdparty/jquery-validate/localization/methods_es_CL.js
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localized default methods for the jQuery validation plugin.
|
||||||
|
* Locale: ES_CL
|
||||||
|
*/
|
||||||
|
$.extend($.validator.methods, {
|
||||||
|
date: function(value, element) {
|
||||||
|
return this.optional(element) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(value);
|
||||||
|
},
|
||||||
|
number: function(value, element) {
|
||||||
|
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
22
thirdparty/jquery-validate/localization/methods_fi.js
vendored
Normal file
22
thirdparty/jquery-validate/localization/methods_fi.js
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localized default methods for the jQuery validation plugin.
|
||||||
|
* Locale: FI
|
||||||
|
*/
|
||||||
|
$.extend($.validator.methods, {
|
||||||
|
date: function(value, element) {
|
||||||
|
return this.optional(element) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test(value);
|
||||||
|
},
|
||||||
|
number: function(value, element) {
|
||||||
|
return this.optional(element) || /^-?(?:\d+)(?:,\d+)?$/.test(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
19
thirdparty/jquery-validate/localization/methods_nl.js
vendored
Normal file
19
thirdparty/jquery-validate/localization/methods_nl.js
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localized default methods for the jQuery validation plugin.
|
||||||
|
* Locale: NL
|
||||||
|
*/
|
||||||
|
$.extend($.validator.methods, {
|
||||||
|
date: function(value, element) {
|
||||||
|
return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
19
thirdparty/jquery-validate/localization/methods_pt.js
vendored
Normal file
19
thirdparty/jquery-validate/localization/methods_pt.js
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
(function( factory ) {
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( ["jquery", "../jquery.validate"], factory );
|
||||||
|
} else {
|
||||||
|
factory( jQuery );
|
||||||
|
}
|
||||||
|
}(function( $ ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localized default methods for the jQuery validation plugin.
|
||||||
|
* Locale: PT_BR
|
||||||
|
*/
|
||||||
|
$.extend($.validator.methods, {
|
||||||
|
date: function(value, element) {
|
||||||
|
return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}));
|
Loading…
Reference in New Issue
Block a user