diff --git a/clientside_validation.admin.inc b/clientside_validation.admin.inc
index 43ad2f3..b979e05 100644
--- a/clientside_validation.admin.inc
+++ b/clientside_validation.admin.inc
@@ -328,6 +328,56 @@ function clientside_validation_admin_settings() {
'#title' => t("Enter form IDs below"),
'#description' => t('You can specify form IDs (one per line) of forms that should or should not be validated.'),
);
+ if (module_exists('xregexp_api')) {
+ $lib = xregexp_api_libraries_detect('xregexp');
+ if ($lib && $lib['installed']) {
+ //XRegExp settings
+ $form['clientside_validation_xregxp'] = array(
+ '#type' => 'fieldset',
+ '#collapsible' => TRUE,
+ '#collapsed' => FALSE,
+ '#title' => t('XRegExp for Pattern matching'),
+ '#description' => t("Javascript doesn't support regular expressions for
+ pattern matching the way PHP does. With the XRegExp library most PHP
+ expressions(pregex) become also available in Javascript. So you might
+ want to use that instead of AJAX calls."),
+ );
+
+ $form['clientside_validation_xregxp']['clientside_validation_usexregxp'] = array(
+ '#prefix' => '
',
+ '#title' => t('Use XRegExp'),
+ '#description' => t('Check to use XRegExp for PCRE.'),
+ '#type' => 'checkbox',
+ '#default_value' => variable_get('clientside_validation_usexregxp', 0),
+ );
+ $options = array('' => t('default'));
+ foreach ($lib['variants'] as $name => $variant) {
+ if (!isset($variant['error']) || !$variant['error']) {
+ $options[$name] = $name;
+ }
+ }
+ $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant'] = array(
+ '#title' => t('XRegExp variant'),
+ '#description' => t('Choose which variant of the library you want to use.'),
+ '#type' => 'select',
+ '#options' => $options,
+ '#default_value' => variable_get('clientside_validation_xregxp_variant', ''),
+ );
+ if (version_compare($lib['version'], '2', '>=')) {
+ $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant']['#description'] .= '
' .
+ t('!warning: You are using version 2.x or higher of the XRegExp library.
+ For best compatibility (including some !fapi rules) you should enable
+ the backcompat.js plugin on the !settingspage',
+ array(
+ '!warning' => 'Warning',
+ '!fapi' => l(t('FAPI Validation'), 'http://drupal.org/project/fapi_validation'),
+ '!settingspage' => l(t('XRegExp API Settings page'), 'admin/config/system/xregexp'),
+ )
+ );
+ }
+ }
+ }
+
return system_settings_form($form);
-}
\ No newline at end of file
+}
diff --git a/clientside_validation.js b/clientside_validation.js
index c04c95d..126c9c7 100644
--- a/clientside_validation.js
+++ b/clientside_validation.js
@@ -445,7 +445,7 @@ Drupal.clientsideValidation.prototype.bindRules = function(formid){
}
Drupal.clientsideValidation.prototype.addExtraRules = function(){
-
+ var self = this;
jQuery.validator.addMethod("numberDE", function(value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
});
@@ -494,15 +494,16 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){
}
return true;
});
-
- jQuery.validator.addMethod("regexMatchPCRE", function(value, element, param) {
+
+ // Default regular expression support
+ var ajaxPCREfn = function(value, element, param) {
var result = false;
jQuery.ajax({
'url': Drupal.settings.basePath + 'clientside_validation/ajax',
'type': "POST",
'data': {
'value': value,
- 'param': JSON.stringify(param)
+ 'param': param
},
'dataType': 'json',
'async': false,
@@ -510,15 +511,61 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){
result = res;
}
});
- if (result['result'] === false) {
- if (result['message'].length) {
+ if (result.result === false) {
+ if (result.message.length) {
jQuery.extend(jQuery.validator.messages, {
- "regexMatchPCRE": result['message']
+ "regexMatchPCRE": result.message
});
}
}
- return result['result'];
- }, jQuery.format('The value does not match the expected format.'));
+ return result.result;
+ };
+
+ // Regular expression support using XRegExp
+ var xregexPCREfn = function(value, element, param) {
+ if (window.XRegExp && XRegExp.version ) {
+ try {
+ var result = true;
+ for (var i = 0; i < param.expressions.length; i++) {
+ var reg = param.expressions[i];
+ var delim = reg.lastIndexOf(reg[0]);
+ // Only allow supported modifiers
+ var modraw = reg.substr(delim + 1) || '';
+ var mod = '';
+ if (mod !== '') {
+ for (var l = 0; l < 6; l++) {
+ if (modraw.indexOf('gimnsx'[l]) !== -1) {
+ mod += 'gimnsx'[l];
+ }
+ }
+ }
+ reg = reg.substring(1, delim);
+ if (!(new XRegExp(reg, mod).test(value))) {
+ result = false;
+ if (param.messages[i].length) {
+ jQuery.extend(jQuery.validator.messages, {
+ "regexMatchPCRE": param.messages[i]
+ });
+ }
+ }
+ }
+ return result;
+ }
+ catch (e) {
+ return ajaxPCREfn(value, element, param);
+ }
+ }
+ else {
+ return ajaxPCREfn(value, element, param);
+ }
+ };
+ // Decide which one to use
+ if (self.data.general.usexregxp) {
+ jQuery.validator.addMethod("regexMatchPCRE", xregexPCREfn, jQuery.format('The value does not match the expected format.'));
+ }
+ else {
+ jQuery.validator.addMethod("regexMatchPCRE", ajaxPCREfn, jQuery.format('The value does not match the expected format.'));
+ }
// Unique values
jQuery.validator.addMethod("notEqualTo", function(value, element, param) {
diff --git a/clientside_validation.module b/clientside_validation.module
index adab367..d8e2f9a 100644
--- a/clientside_validation.module
+++ b/clientside_validation.module
@@ -301,6 +301,7 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) {
$form_settings_added[] = str_replace('-', '_', $form_id);
}
+
if (!$general_settings_added) {
$settings['clientsideValidation']['general'] = array(
"errorClass" => "error",
@@ -314,10 +315,36 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) {
"validateOnSubmit" => variable_get('clientside_validation_validate_onsubmit', 1),
"errorElement" => variable_get('clientside_validation_error_element', 'label'),
);
+ // add xregxp if choosen and found.
+ if (variable_get('clientside_validation_usexregxp', 0) != 0 && module_exists('xregexp_api')) {
+ $settings['clientsideValidation']['general']['usexregxp'] = clientside_validation_add_xregexp();
+ }
+ else {
+ $settings['clientsideValidation']['general']['usexregxp'] = 0;
+ }
+
$general_settings_added = TRUE;
}
+
+}
+
+/*
+ * adds xregexp and optional unicode js lib
+ */
+function clientside_validation_add_xregexp() {
+ $variant = variable_get('clientside_validation_xregxp_variant', '');
+ $lib = FALSE;
+ if (empty($variant)) {
+ $lib = xregexp_api_libraries_load('xregexp');
+ }
+ else {
+ $lib = xregexp_api_libraries_load('xregexp', $variant);
+ }
+ return ($lib && (!isset($lib['error']) || !$lib['error'])) ? 1 : 0;
}
+
+
/**
* Set validation rule for required fields.
*/